HISE Logo Forum
    • Categories
    • Register
    • Login

    Broadcaster attachment design pattern

    Scheduled Pinned Locked Moved General Questions
    25 Posts 3 Posters 258 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.
    • OrvillainO
      Orvillain @d.healey
      last edited by Orvillain

      @d-healey said in Broadcaster attachment design pattern:

      @Orvillain Engine1AHDSRControl These are referring to AHDSR envelopes?

      No, it refers to a broadcaster ID created in a previous step.

      I'm not going to post everything I'm doing, but imagine it more like this:

          inline function addEngineLinkedFeatureListeners()
          {
              SharedData.broadcasters["ENGINE-NAME-HERE-FEATUREHERE"].addListener("string", "metadata", function(param, value)
              {
                  BroadcasterCallbacks.controlLinkedFEATUREParameter(ENGINE-NAME-HERE, param, value);
              });
          }
      

      I want to do the above, where the engine name or identifier increments. But I can't do that with a for loop, because it complains about it not liking local variables.

      Engine1AHDSRControl is a broadcaster id. and depending on the number of engines, I automatically create these. So for 3 engines I get:

      Engine1AHDSRControl
      Engine2AHDSRControl
      Engine3AHDSRControl

      And if I change the number of engines, my code will dynamically create the right amount of parameters, the right amount of broadcasters, and the right amount of parameter/component groups, and then it will attach the correct broadcaster to the correct component group.

      Next step is to add the listener to the broadcaster, in a dynamic way.

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

        @Orvillain This error?

        Interface:! Engine3AHDSRControl: BroadcastersBuilder.js (291): Illegal iterator target

        The error is being triggered only for Engine3 so that implies the for loop in general is fine, but there is a more specific issue.

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

        OrvillainO 1 Reply Last reply Reply Quote 0
        • OrvillainO
          Orvillain @d.healey
          last edited by

          @d-healey Yeah, there's some underlying closure thing going on I think.

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

            @Orvillain

            for (engine in engines)
            {
                local capturedEngine = engine;
            
                Globals.broadcasters[engine + "AHDSRControl"].addListener("string", "metadata", function(param, value)
                {
                    BroadcasterCallbacks.controlLinkedAmpEnvParameter(capturedEngine, param, value);
                });
            }
            

            Oh I just realised the issue - the function within your loop doesn't have access to local variables outside of the function. So you'll need to find another structure.

            One workaround is to use a lambda variable, I try to avoid this because I find their use usually indicates a structural issue. But it's a quick and dirty fix.

            function[capturedEngine](param, value)

            Another suggestion is instead of using an array of strings and a for in loop. Just use a for loop that counts from 0 to the number of engines you have. Then you can just declare a NUM_ENGINES constant at the top of your script and use it whenever you need to know the number of engine you have.

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

            OrvillainO 1 Reply Last reply Reply Quote 0
            • OrvillainO
              Orvillain @d.healey
              last edited by

              @d-healey said in Broadcaster attachment design pattern:

              Another suggestion is instead of using an array of strings and a for in loop. Just use a for loop that counts from 0 to the number of engines you have. Then you can just declare a NUM_ENGINES constant at the top of your script and use it whenever you need to know the number of engine you have.

              If I try that, for example (different feature area this time):

              		for (i = 1; i < SharedData.engines.length; i++)
                      {
                          SharedData.broadcasters["Engine" + i + "ModeControl"].addListener("string", "metadata", function(index)
              		{
              			BroadcasterCallbacks.setActiveModeForSlot("Engine" + i, index);
              		});
                      }
              

              Then I get:

              Interface:! BroadcastersBuilder.js (260): Can't reference local variables in nested function body {{SW50ZXJmYWNlfEJyb2FkY2FzdGVyc0J1aWxkZXIuanN8ODQ3MHwyNjB8NTc=}}
              
              
              d.healeyD 1 Reply Last reply Reply Quote 0
              • d.healeyD
                d.healey @Orvillain
                last edited by

                @Orvillain The error is basically saying what I said.

                You can't access a local variable declared outside of the function.

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

                OrvillainO 1 Reply Last reply Reply Quote 0
                • OrvillainO
                  Orvillain @d.healey
                  last edited by

                  @d-healey Indeed, indeed.

                  		for (engine in SharedData.engines)
                          {
                              local capturedEngine = engine;
                              SharedData.broadcasters[capturedEngine + "ModeControl"].addListener("string", "metadata", function[capturedEngine](index)
                  		{
                  			BroadcasterCallbacks.setActiveModeForSlot(capturedEngine, index);
                  		});
                          }
                  

                  This did seem to work however.

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

                    @Orvillain Yep that will do it, it's not the most elegant solution but that's what it's designed for.

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

                    OrvillainO 1 Reply Last reply Reply Quote 1
                    • OrvillainO
                      Orvillain @d.healey
                      last edited by

                      @d-healey More elegant than what I have right now I am thinking!

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

                        @Orvillain Yep it will certainly help reduce that repetition

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

                        OrvillainO 1 Reply Last reply Reply Quote 0
                        • OrvillainO
                          Orvillain @d.healey
                          last edited by

                          @d-healey Yeah, I think I can essentially boil down 11 functions down to 3 functions with this. Pretty cool, cheers!

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

                          19

                          Online

                          1.8k

                          Users

                          12.1k

                          Topics

                          105.6k

                          Posts