HISE Logo Forum
    • Categories
    • Register
    • Login

    Variable Persistence

    Scheduled Pinned Locked Moved Scripting
    29 Posts 4 Posters 6.5k Views
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • d.healeyD
      d.healey
      last edited by

      Excellent!

      Libre Wave - Freedom respecting instruments and effects
      My Patreon - HISE tutorials
      YouTube Channel - Public HISE tutorials

      1 Reply Last reply Reply Quote 0
      • d.healeyD
        d.healey
        last edited by

        I remember getting on with this before but I'm working on a little module now and the persistent storage doesn't seem to be working for me. Would you mind taking a look when you have the time? This module is an articulation switcher that seeks out containers that have a midiMuter with the same name as the container and counts them as articulations which can be muted or unmuted.

        HiseSnippet 2683.3oc6astbaabEFTRH0j1HMIi+Qm9qsb5jP5KTjV4Vkpq0U6xwVwbDk8zY73IcEvRxMBDfC1ERVwidm5iPej7aP64rKtRAJAYSKmKVw1ivhy4re645GHX5E3ayDB+.iJWe+SlvLpbCy9m3IGs0HJ2yn61FU9DSISHM17jITgf4XToxhOBuWkpKYn94MOXSpK0ylktjgwy841rmvGykoq1a8GycceH0gsOebFo+506Z66skuqeHfiEMaaLgZeHcH6GnnXKXZbDmcrvnRayUtWqfC6bvOuQqje1W8ui1czeSzGWda7xdJALrCCBXdxmCpaTwrx+C9oh4NNboePeIENWvpa56bR+Q9G6o25myE7CbY3EcL5CXRu7C8ccvCO96c8jrfATaVF0L1ZD20oWr6TX.VtWpycQsy8ll6xc3Iqm5j+L0MHoZj0cWYg7PdobPtSVH2tPH2o.3YjAcKoQG.BemPWpLOxvnczM39d4PF5I7Db4IYyF9fB2O2rGWZOpX7tPA3EBTuuwaTv2xbmACX1xTvtj4C+WWsQ5qMih7qatkumDthELOpz+2ktRuxhm2ItTkierz6ikd+JtzqpoHTfkderv6sKbbIfWkylJ+4l8sC3Sjo2Aw1WDs5LPm9lFK7W9ylKeqaUibKx9boKaUxFARtcT5Oo+wX8.KfbTmVsg+6mDnjaDJG4GrJYa5QbGx+jQcYmfquMbPWkrR6ka+sKeu1c9NbMnVhOfybld8m.QdOAH9i58jiVgbWxHobhX0kW93iOt0PuvV9ACW1UKjX4gSbu6Jv9y7ZMRN1s1sVtVsAgd1JP1iEH3Bn1TB.f1nYsWWqpbDWzZB0i4RtOAGL.2sE0woGtTi5SxoR86PZC+o4ZY0qkfIaT+HcPBjX.0UvJRDA8HVWudAL3JPNYPXAh8bpaHqwqOs4ZjkWlLldHiHBCXD4HFQIzWIHGgxP3BBk3evOA050pFYFv.vwH9.23P1I2QKcyZUgCa18ZX7d07EfXuDTSIH.nSWKwdCOi8hLT.SFF3Qls8z1A9SM3Xryqnim3xHgBfoasinADAjuC+NXbO1wmIv.ZAkvBIQIpR2fm.B.hq5nfaVWGbkF06qucckC6Q.dijm3ALpEYric7T+YYoDZAo1JQGAg6j0XzLI+BvXu3knJc2VP7GjpE3enRxHHtCgpwXGfwg.eZxwi7ELR2sIbOa2PGlPEdSUCgdlMSozrPM1XYWTfTTq50nVSg5LVxAbuZzVKfMj.ApnB2zyvFttDn3mOzi4fBPDQRnzHjZaWrnp6nRgzRF87HpDfG8rtYONdgak5WyU0sk+3C72z+UYBFhzhtbl3wyT0GCfVer.U67MEo7yzGiBU+Yar0VfhqzNRQ.+87mfwZ1TPG1iQpHmJUaVQ9wwAHQsA9AjFbXiauFgS96oA1VtLugxQvp291MAO6NT6Qjc6tcWcXDaToz0FxXxmHmHcxp5BT9.Ric7FBKzZLUE+1iMj8pFIa4K3u7Nj5MpStMwF9a8l0ah1p6POenciZuUxJzGEGeuuRFmuVT5ZU01p1WLKCLO49POEetSSRxBjWepJwwwIpyEAOVY7Z95TTZP.8DzbQZ1RW2jI8O2f1bmplw6Plx.bWvdU42JtTn2t3tnUqlqtt0jPwnF1IFLUYnzEzWgRLrmUqn9Nfsxkrf4XckrwQlKIiJ0lNA9Sbfg9fpmBMOqcZtLuG2mP8bHXxYhjmMgpy89dcNDlwnJRR12njgHW2O3KUejCM3MyiGXeRABGCgsIOHtjIwX02lKnv3Nm5MIqdl6xyaxbXFOVICj88Pb7TO8nXL0ISGoVQtFQicgfLLr.wtB2giOfEznoJecCDwx.9vgr.nKjM008.p8g5h.k6wAqYvvbRohJlybYigZ+37VGcJFNAcCIXuCfqZ.c.5nNKXVDghs6xFoO3DhCa.MzUVKI0u0gBzoMKHC15g9gPfjh3VUYhppfvLwPaEFdlGdWTvSyjhLsubv.syDtWlag4gA9ttHFhc0YfX5siAJdF5P9xujTnTQC5I+C.ZHxf.bZWGbPPgwtynuxcreRrSkmjxsIdvBVn4kywGGyJW38BbtkL.WUYDcHVOD79mquIajVcvRh0Q3ozQaU3dVwb7QeBRh3.AcqxyP2ZVTzsJhit0rHoa8NyR2BnoaUyZ1D0sp8Zq2Vp5VkfqtUIIqaMWXqCVw5B4qCRfm4xvX2BoZmwnEPZO1ZWLs8Hig+05LT2sJC2cTw4D6cq4J8cqqT96VyMB74cnoT3st7b3sJOIdqbr30YC.Odq4.Qdq2Il7Vu0T40Gh4DYdq2Z175tYklOebs6UMidbOUa77jSu0UModq4Iqdq2AZ8ntmhcWglqSkHVH2dqYStWm.8tRu258B+9nSWAT70nddRxOtxnD7.SSle23Ahms2dp9Jc0vnTz+TRd5zYNEQ4W4bm9tYY8m58mu79y1c58Oy+zvXIi4Wj2trQ8pVyE9+ZqDgoxmBnyAN2LgnGD37xCZ3oBxoLLQbnYFDcqDdh1TfeSDOuUIpMO5J7v1nN5lqq3CW8f.F8v0z0EJ0x0ebUktQrHhYrd2N34aqnEOSHS2XKgcsdzSjIdITzc6NM0ac03FSIxlWTLNABOSX93H3koeThx4wZeINBU.nT6SgztwTANDB6cmevVFjlwH47ghDe3czoup38DGraZ5iwDG.lE7wit9.fGzhPdAfJh62bFVpLxy7d1pUtWjksl5VFA8855wkOcBK5EzEOD4LqLXP1kRKBytppxn.whWpvWlYDcRCiJKEINHpL5ErF8Vzvmexf6fucu7O6ogx6l88WZLsQ9rHiDyUUYmaj9MSPLsMdyCJqMRIM+1ZiOwD6XUf1e7k4+6vWl+M0P4KL6Kgp8wbugQOz9GxWoeu.lqO0oO+myH1+c8MCA2UP9U+Oqq1pMFCSiysWQGi8XSXTID8yAu816QA9gSlVq27.Utx9A.8SvSj8FO0C+RxIyZjsB7EhAvwQYKQ1a0KLXH5qxririf597qAzxfPuGznA+56UoBrjF06Rmn91BN8WwuqUtuZCf5p1WYxS1jOLiowUxWDmQzji093yHjY2N+jpJexud9FSDAuqal7oyD8ckH45hR6md.3hkCWm67mEltk8mF0xdyPoD5UgMr+TSt5g7iV5hG+TfM9ilC3upuLz9Pbxpn.ibk08ewx0B6BBg+gXL1mio063cDzx.VQ2xeaMy9jUuPPBLzgZ9zUt456AzAApXoK8WW+IvraZP9dIWpyWmxe9NuXvexTCWB1Gk7aiIwK969IwmmqCpn0eP8vtGH+Edb9FlpAhDbR+GJntmenDlfuKEdv6WAyQgQs8A5E1rrCbW.6cputMdMBn9LOm1weE6itYmjoyvM6DeSC6XSAmsneW87AUVj4o930PBltvbe2rozBfDCBIX7tg90gLFGIuD54f05SOho6vnwyLYprK2tmO3LwOzSzMr1Uyg92J6wXpcf+OZqmbhgvqoVA7jdp+e0np4t30jNwiJwjN78C7i11X2g6BocEqw8tzZrxkViu9Rqw2bo03auzZ7cWZM99yQCjK1FgR+w5YEFF+e8fXD6B
        

        Libre Wave - Freedom respecting instruments and effects
        My Patreon - HISE tutorials
        YouTube Channel - Public HISE tutorials

        1 Reply Last reply Reply Quote 0
        • Christoph HartC
          Christoph Hart
          last edited by

          I think the problem is that you are storing the initial object in the onInit callback which gets overwritten by any value in the onControl callback of the ScriptPanel.

          A better solution is to use a dedicated variable for the object and think of the panel as "restorer" (not as actual container for data). This script might explain this idea:

          /** The restorer.
          *
          *    This panel will restore the storage object in its control callback. If the value is not an object, it won't do anything but use the given storage variable as value (see the onControl callback)
          */
          const var restorer = Content.addPanel("restorer", 0, 0);
          restorer.set("saveInPreset", true);
          restorer.set("visible", false);
          
          /** The data object. This will be overwritten by the onControl callback of the restorer */
          reg storage = {};
          
          /** Checks if a given variable is an object. */
          inline function isObject(variable)
          {
              return typeof(variable) == "object";
          };
          
          const var Knob = Content.addKnob("Knob", 0, 0);
          
          // Make the knob non persistent for demonstrating purposes
          Knob.set("saveInPreset", false);
          
          
          inline function onKnobControl(component, value)
          {
              // Just use the storage object (ignore the restorer)
              storage.a = value;
          };
          
          Knob.setControlCallback(onKnobControl);
          
          function onNoteOn() {}
          function onNoteOff() {}
          function onController() {}
          function onTimer() {}
          function onControl(number, value)
          {
              if(number == restorer)
              {
                  // Check in the callback if the value is an object
                  // If not, set the value to the storage object
                  
                  if(isObject(value))
                  {
                      // Copy the object from the restorer to the storage variable
                      storage = value;
                      Console.print("Restoring storage");
                      
                      Console.print("The restored knob value is: " + storage.a);
                  }
                  else    
                  {    
                      restorer.setValue(storage);
                      Console.print("Initialising restorer");
                  }
              }
          }
          
          d.healeyD 1 Reply Last reply Reply Quote 0
          • d.healeyD
            d.healey
            last edited by

            Thanks Christoph, I think I get it (again). This is what happens when I stop coding in HISE for a month I forget everything

            Libre Wave - Freedom respecting instruments and effects
            My Patreon - HISE tutorials
            YouTube Channel - Public HISE tutorials

            1 Reply Last reply Reply Quote 0
            • d.healeyD
              d.healey
              last edited by

              What's the advantage of using an inline function for the control callback over putting it in the usual onControl callback?

              Libre Wave - Freedom respecting instruments and effects
              My Patreon - HISE tutorials
              YouTube Channel - Public HISE tutorials

              1 Reply Last reply Reply Quote 0
              • Christoph HartC
                Christoph Hart
                last edited by

                It might be a bit faster with big scripts because it doesn't need to resolve the big switch statement. Also you can assign the functions dynamically but in the end it's just a matter of taste :)

                1 Reply Last reply Reply Quote 1
                • LindonL
                  Lindon @Christoph Hart
                  last edited by

                  @Christoph-Hart So if I :

                  this.panel.set("saveInPreset", false);

                  in your function - do i get to persist a piece of data but NOT store it in any preset?

                  HISE Development for hire.
                  www.channelrobot.com

                  d.healeyD 1 Reply Last reply Reply Quote 0
                  • d.healeyD
                    d.healey @Lindon
                    last edited by

                    @Lindon It's been a long time since I used this since I haven't needed to persist any data that wasn't stored already in another control. What's your specific use case? it will probably turn out there is a more straightforward solution.

                    Libre Wave - Freedom respecting instruments and effects
                    My Patreon - HISE tutorials
                    YouTube Channel - Public HISE tutorials

                    1 Reply Last reply Reply Quote 0
                    • D
                      dxmachina
                      last edited by dxmachina

                      Hi @d-healey @Christoph-Hart ,

                      Reading through these solutions for data persistence and wanted to ask about scale. Would this still be the approach if you were storing 1,000,000 points of data? And before you ask "is it really necessary" let's assume it is. :)

                      Similarly, is there any solution for serialization directly to/from disk to avoid storing that quantity of data in every preset (when such data is shared among multiple presets?

                      Thanks!

                      d.healeyD LindonL 2 Replies Last reply Reply Quote 0
                      • d.healeyD
                        d.healey @dxmachina
                        last edited by

                        @dxmachina said in Variable Persistence:

                        Would this still be the approach if you were storing 1,000,000 points of data?

                        Try it and report back.

                        Libre Wave - Freedom respecting instruments and effects
                        My Patreon - HISE tutorials
                        YouTube Channel - Public HISE tutorials

                        1 Reply Last reply Reply Quote 0
                        • LindonL
                          Lindon @dxmachina
                          last edited by

                          @dxmachina

                          "Similarly, is there any solution for serialization directly to/from disk to avoid storing that quantity of data in every preset (when such data is shared among multiple presets?"

                          Theres the all new saveAsJSON() and loadFromJSON()

                          HISE Development for hire.
                          www.channelrobot.com

                          1 Reply Last reply Reply Quote 0
                          • d.healeyD
                            d.healey @Christoph Hart
                            last edited by d.healey

                            @Christoph-Hart said in Variable Persistence:

                            I think the problem is that you are storing the initial object in the onInit callback which gets overwritten by any value in the onControl callback of the ScriptPanel.

                            A better solution is to use a dedicated variable for the object and think of the panel as "restorer" (not as actual container for data). This script might explain this idea:

                            This script doesn't seem to work as expected. The first time I set the knob to a value and hit compile the console shows the restored value correctly. But, after that the stored value can't be changed.

                            I found a fix, update the panel's value after changing the storage object.

                            inline function onKnobControl(component, value)
                            {
                                // Just use the storage object (ignore the restorer)
                                storage.a = value;
                                restorer.setValue(storage);
                            };
                            

                            Libre Wave - Freedom respecting instruments and effects
                            My Patreon - HISE tutorials
                            YouTube Channel - Public HISE tutorials

                            1 Reply Last reply Reply Quote 0
                            • d.healeyD
                              d.healey
                              last edited by

                              I wrapped it into a namespace with some get/set helper functions.

                              namespace PersistentData
                              {
                                  //The data object. This will be overwritten by the onControl callback of the restorer
                                  reg _persistentData = {};
                               
                                  /*This panel will restore the storage object in its control callback. 
                                  If the value is not an object, it won't do anything but use the given
                                  storage variable as value*/
                                  const var pnlDataRestorer = Content.addPanel("pnlDataRestorer", 0, 0);
                                  pnlDataRestorer.set("saveInPreset", true);
                                  pnlDataRestorer.set("visible", false);
                                  
                                  pnlDataRestorer.setControlCallback(onpnlDataRestorerControl);    
                                  inline function onpnlDataRestorerControl(component, value)
                                  {
                                      // Check if the panel's value is an object
                                      // If not, set the value to the storage object
                                      
                                      if (typeof(value) == "object")
                                          _persistentData = value; //Copy the object from the panel to the storage object
                                      else    
                                          component.setValue(_persistentData); //Initialize the restorer
                                  };
                                  
                                  inline function set(id, value)
                                  {
                                      _persistentData[id] = value;
                                      pnlDataRestorer.setValue(_persistentData);
                                  }
                                  
                                  inline function get(id)
                                  {
                                      return _persistentData[id];
                                  }
                              }
                              

                              Libre Wave - Freedom respecting instruments and effects
                              My Patreon - HISE tutorials
                              YouTube Channel - Public HISE tutorials

                              1 Reply Last reply Reply Quote 1
                              • First post
                                Last post

                              11

                              Online

                              1.7k

                              Users

                              11.9k

                              Topics

                              103.4k

                              Posts