HISE Logo Forum
    • Categories
    • Register
    • Login

    Broadcaster attachment design pattern

    Scheduled Pinned Locked Moved General Questions
    25 Posts 3 Posters 263 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 @Orvillain
      last edited by

      @Orvillain Engine1AHDSRControl These are referring to AHDSR envelopes?

      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 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

                            27

                            Online

                            1.8k

                            Users

                            12.1k

                            Topics

                            105.6k

                            Posts