HISE Logo Forum
    • Categories
    • Register
    • Login

    How to Change Order of the Stacked Effects

    Scheduled Pinned Locked Moved General Questions
    26 Posts 11 Posters 3.0k 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.
    • NatanN
      Natan @DabDab
      last edited by

      @DabDab So Make 2 Chains.

      Delay > Reverb
      Reverb > Delay

      Simply Bypass / First One Using A Button, And Enable Second Chain.
      Also To Make It More User Friendly, Just Move The Graphics Around By Adding Some X,Y Positioning.

      Kinda Cheating, But It Works 👋

      DabDabD 1 Reply Last reply Reply Quote 1
      • Christoph HartC
        Christoph Hart @ustk
        last edited by

        @ustk said in How to Change Order of the Stacked Effects:

        Scriptnode has nothing to do with this, it's more a modular DSP environment.

        Actually it is a bit more convenient to implement a dynamic signal chain that can be scripted using scriptnode.

        // Create a DSP Network
        const var dsp = Engine.createDspNetwork("dsp") ;
        
        // Create a list of all effects that you want to assign
        const var fx = [dsp.get("reverb"), dsp.get("delay")];
        
        // Create the ID list for the slots 
        // (they are just simple containers but it helps avoiding
        // fiddling with the indexes)
        const var slots = ["slot1", "slot2"];
        
        
        // This function will take an array with slot indexes
        // and move them into the slots defined above
        inline function setOrder(order)
        {
            local i = 0;
            
            for(i = 0; i < order.length; i++)
            {   
                local idx = order[i];
                fx[i].setParent(slots[idx], 0);
            }
        }
        
        
        // Use -1 to remove the effect (not assign it to anything)
        setOrder([-1, -1]);
        
        setOrder([0, -1]);
        
        setOrder([1, 0]);
        

        Now all you need to do is to implement a dragging UI using script panels and then call setOrder with the updated index array (this is rather a tedious task but you would have to implement it anyway).

        ? OrvillainO 2 Replies Last reply Reply Quote 7
        • DabDabD
          DabDab @Natan
          last edited by

          @Natan I like the idea... I have a lower knowledge of HISE. So I need your help. I will post the project tomorrow along with your idea. I need some corrections.

          Bollywood Music Producer and Trance Producer.

          1 Reply Last reply Reply Quote 0
          • DabDabD
            DabDab @MikeB
            last edited by

            @MikeB Yup.. :)

            Bollywood Music Producer and Trance Producer.

            1 Reply Last reply Reply Quote 0
            • UD AUDIOU
              UD AUDIO
              last edited by UD AUDIO

              Drag&drop swapping for comboboxes would be insane :D
              (FL Studio mixer does work similar to this)
              99 problems but f-x ain't one!

              1 Reply Last reply Reply Quote 0
              • DabDabD
                DabDab
                last edited by

                Hi, @ustk @ulrik @Natan @MikeB
                How can I change FX Order stack from Interface and via DSP.

                HiseSnippet 955.3oc4W8zabSDEebxNzraJnVTkfi6wToRk2lT.INraR1rvpl+XkMT5sxD6miGE6YL1iaYEh67UH23iBR7Qnm3FRHwY9F.uw1q83F2nvJHUH7I+98duwu+7adyXmDoKjlJSHVcOYdLPrtMc1bgJX2.FWPlNlX8dzCXoJHoeAzNyiYoofGwxZ0OWCX0sCI+4OFtCKjIbgZHB4oRtKrOOhqpQcF8DdX3DlGbBOxv5sFM0UJ1UFJyv3YUpMIl4dN6L3Pl1rUnDq2YOOtRlLSwTPJZyNRu4yBjuTTX+S4o7SCAsv.xLbgJfI6FvC8bVjqoDhUGm5Le0hL+dzC3d7J75JvcxUzu1CyZf0JMCoNMBoAuoPZhLzSu.ugvyxH75TDd2kNyMgGqp0nis0oSEXywmgkcyvpvVh0OQ2UhFHTOLhcNLIAEpbXiGaa+f9aYae+OyOS3p3RQeo3PoBNRrw868c8516660+0U462pN8mIQFFBIspV2oStJG2PjEcJj7f9ufElAUFhoey565Wu5qaQVaXnTLUvUGECkx0c.sthrdgVaRUxZBUmiln4oVKlUCc4FLorqfu8kSGyTLcOuDCsKFRTbc1ZMFdAtApfAzkNFROWIiwsPWhdfjToWVHS0j4p2hVp.K2MnHZdfHkqlatE9uAc1tU57f1x1qY3dWpCW4Fzd7tRKwKV092NdKGN7tz878AWUcv1gN4Y2.SBLGTsdQrbKjGDxlmGEqU79fFQRNjlVtO3aL28CGUo3X9YAFZt2nI.3cJNs0viQat4qFt.2zgbE6KeoC9Amj.eS057CuZzWvuDJY7nC3eas3uN7DHJVhGy31f4s5UMaev0e1N4XYlhKN6.lJQ+coGlEMCORwEvlmP.g3hSsVQuIrP1VKqChYfvKW3OwmRkCzxVkJGrPoICYsE6NyOlCJlK2agTyNyIAIPZPcc72FdTlJNSYhbLDBrTvrfssRg8fZi94gOQ.Kr3Gu3he4+tUuasn54DfIMtkp3Tsbo9SdVyxmlWkABWjuWUclOpB8Q0nWTwnKw9Ze+eeXCd3+fTt1Nut0IbueYh81ej7am175zYLUVhtnjWOtcsbyNcIrt.YLs+q.01QxLgxr93j.MuHJN+Vlpdcra9l8GPqyh+mzwuI9FQL2D4ycKtjkterVNBl2h7+SnK9CKnb+Aj7qRh9QsenMIBuC+ycc0Gb+QX8ocedzR3ylKgOasD973kvmOdI74SVBe9zqzG8uOsclRFUv+Q.m8xuzqk0dBFxjy2JP9K..R92xC
                

                Bollywood Music Producer and Trance Producer.

                1 Reply Last reply Reply Quote 0
                • Tania GhoshT
                  Tania Ghosh
                  last edited by Tania Ghosh

                  Hi....Snippet is not openning

                  Tania Ghosh

                  1 Reply Last reply Reply Quote 0
                  • DabDabD
                    DabDab
                    last edited by

                    @Natan @ustk @MikeB @ I have done FX Slot Reorder via comboBox and FXSlot . Now my problem is You to change order Of Panel?

                    FXOrder.jpg
                    I can understand dynamically it is impossible to make stunning Animated Things, like Serum/Vital does. Till now can anybody tell me how to change order of panel? Something virtual to make End user believe . I hope this will be my only solution for now.
                    I hope HISE developer @Christoph-Hart will implement this features in future.

                    Bollywood Music Producer and Trance Producer.

                    ustkU 1 Reply Last reply Reply Quote 0
                    • ustkU
                      ustk @DabDab
                      last edited by ustk

                      @DabDab Well, if you use comboboxes, this means an effect type can be select multiple times unless you added some safety. So moving panel isn't the solution, because this is more apparently related to effect selection than effect reordering... This would mean all panels have to exist prior to being called. If you have 5 effect types with 3 slots, this is 15 panels... imagine if you have more effects and/or slots...

                      Dynamic reordering is absolutely doable, but this requires some learnings on how to manipulate panels (or child panels). And this is not combobox friendly as they don't suggest re-ording by nature, but straight selection.
                      If you don't want to reorder but just call the good panel (like your screenshot suggests), then instead of creating 15 panels like mentioned above, a panel factory would be much better. But again, this requires some learning about panels and how to make a factory, as well as child panels. because child panels can be dynamic, not straight panels from a factory (they can be created but not deleted like child panels)

                      Seeing all of this it's hard to tell you how because it depends on the behaviour that you want and the skill level. In any case, you'll need to learn a lot about panel manipulation and/or how to make a factory using child panels, as no easy or ready solution will come to you (at least none I can think of to replace 15 or more panels, which is absolutely not a good start). I strongly advise you to learn everything about panel recipes in the doc, this will keep you busy for a while:

                      404 Not Found

                      favicon

                      (docs.hise.audio)

                      go step by step, create one child panel using a button first, then a combobox for two children, and add difficulty step by step.

                      It is not necessary to think effects like a list though. Each of the 3 panels above can have its own list of 1 panel ;)
                      Just make a child factory per effect type, and call it when and where you need it. I must say I've never done it this way for effects reordering.

                      Hise made me an F5 dude, browser just suffers...

                      LindonL DabDabD 2 Replies Last reply Reply Quote 1
                      • LindonL
                        Lindon @ustk
                        last edited by Lindon

                        @ustk said in How to Change Order of the Stacked Effects:

                        (at least none I can think of to replace 15 or more panels, which is absolutely not a good start).

                        Why? It works like a dream for me...as you can see in the example I posted 5 slots with 7 FX in each = 35 panels, works fine, no CPU or graphics overload....

                        HISE Development for hire.
                        www.channelrobot.com

                        ustkU 1 Reply Last reply Reply Quote 0
                        • ustkU
                          ustk @Lindon
                          last edited by

                          @Lindon For two reasons:
                          It's good you don't have graphic overloads because I had some in the first tests I've made long ago. So I would be afraid to get glitchy graphics on some user smaller systems...
                          But the main reason (if the graphic load is ok) is the maintenance and the UI list growing exponentially, requiring huge component declarations.
                          I don't say it doesn't work or it is bad, but I prefer dynamic stuff with only one panel and some factory. The only issue with child panels is the impossibility of inserting something else than a panel. So knobs have to be panels too...

                          Hise made me an F5 dude, browser just suffers...

                          1 Reply Last reply Reply Quote 0
                          • DabDabD
                            DabDab @ustk
                            last edited by

                            @ustk Ok... Thank you :)

                            Bollywood Music Producer and Trance Producer.

                            1 Reply Last reply Reply Quote 0
                            • ?
                              A Former User @Christoph Hart
                              last edited by

                              @Christoph-Hart This is really interesting!! I think I'll try this one! But what I don't quite get yet is the dsp.get("reverb") for example. So the reverb is a container in your DspNetwork? Or wrapped ones?

                              1 Reply Last reply Reply Quote 0
                              • OrvillainO
                                Orvillain @Christoph Hart
                                last edited by

                                @Christoph-Hart said in How to Change Order of the Stacked Effects:

                                @ustk said in How to Change Order of the Stacked Effects:

                                Scriptnode has nothing to do with this, it's more a modular DSP environment.

                                Actually it is a bit more convenient to implement a dynamic signal chain that can be scripted using scriptnode.

                                // Create a DSP Network
                                const var dsp = Engine.createDspNetwork("dsp") ;
                                
                                // Create a list of all effects that you want to assign
                                const var fx = [dsp.get("reverb"), dsp.get("delay")];
                                
                                // Create the ID list for the slots 
                                // (they are just simple containers but it helps avoiding
                                // fiddling with the indexes)
                                const var slots = ["slot1", "slot2"];
                                
                                
                                // This function will take an array with slot indexes
                                // and move them into the slots defined above
                                inline function setOrder(order)
                                {
                                    local i = 0;
                                    
                                    for(i = 0; i < order.length; i++)
                                    {   
                                        local idx = order[i];
                                        fx[i].setParent(slots[idx], 0);
                                    }
                                }
                                
                                
                                // Use -1 to remove the effect (not assign it to anything)
                                setOrder([-1, -1]);
                                
                                setOrder([0, -1]);
                                
                                setOrder([1, 0]);
                                

                                Now all you need to do is to implement a dragging UI using script panels and then call setOrder with the updated index array (this is rather a tedious task but you would have to implement it anyway).

                                Hey Chris, is this the right approach in 2025?

                                I was thinking I'd add slotFX instances, and then write a callback to update each slot with the specified network name. But which is better or more future proof?

                                Musician - Instrument Designer - Sonic Architect - Creative Product Owner
                                Crafting sound at every level. From strings to signal paths, samples to systems.

                                HISEnbergH 1 Reply Last reply Reply Quote 0
                                • HISEnbergH
                                  HISEnberg @Orvillain
                                  last edited by

                                  @Orvillain Yup you are on the right track. I find it best to follow the Module order (which networks are placed in which Hardcoded Master FX) and update your UI components from there, but you can do it either way.

                                  I made a template about this a few months ago:

                                  Link Preview Image
                                  Modular FX Template - changing Fx order with drag and drop panels

                                  Alright this is probably the least frustrating way to set this up to share on the forum. I realize the effects won't be shared either unless they are in Scri...

                                  favicon

                                  Forum (forum.hise.audio)

                                  OrvillainO 1 Reply Last reply Reply Quote 1
                                  • OrvillainO
                                    Orvillain @HISEnberg
                                    last edited by Orvillain

                                    @HISEnberg Nice one! I'll take a looksie. I'm not really bothered about dragging and dropping right now. Just the raw mechanics of switching the effect order across a bunch of SlotFX entries.

                                    Musician - Instrument Designer - Sonic Architect - Creative Product Owner
                                    Crafting sound at every level. From strings to signal paths, samples to systems.

                                    HISEnbergH Christoph HartC 2 Replies Last reply Reply Quote 0
                                    • HISEnbergH
                                      HISEnberg @Orvillain
                                      last edited by

                                      @Orvillain Understandable. You can replace that whole "drag n drop" system with simple comboboxes.

                                      The code is pretty verbose but I tried to keep it modular enough to follow the different functions. I recommend putting it through an AI and directing it to just remove the drag and drop panels so you can study the SlotFX API.

                                      As a side note, it isn't ready yet but I know Christoph is working on a DynamicContainer Component which will allow you to attach/detach the UI components to the module, so eventually this whole system will be a lot cleaner.

                                      On the audio/module side it is quite clean to switch networks in the HardcodedMasterFx. For that reason I really recommend starting from the Engine.addModuleStateToUserPreset and building your UI accordingly.

                                      Hope my ranting is clear here!

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

                                        @Orvillain actually with the (not finished) addition of the dynamic container system which will be the goto solution for dynamic FX racks (once it leaves the experimental stage) you can leave the effects in the same slot modules and just tell them to be rendered in a different order.

                                        The connection and API with the UI will change at some point, but there is also a new API call that's completely undocumented (because it's part of this new system which is not 100% ready yet), but since 2025 is not over yet, I would suggest this as an option:

                                        HiseSnippet 1581.3oc4Y8zaaTDEe23rkFWnpEJzJwkUUbHEBodsSSCpBrShsSsvI1xq6ePUUlw6N1dU2clkcmMfKhybjy8FeM3i.23i.HjPpbhuAva1cs2YcLINl7mphOX44Myad+l2+mwM8nFXeepmjb11CcwRxuoh9PBav1CPVDoZkkjurxtHeF1SMhzVCcQ99XSIY4L6vIHuzhRge9qhagrQDCbBIIoGRsLv0sbrXITaV5ysrsqhLwssbDV8ZkpYPIaSsoA.dxnjSxEY7LTe7dH9xVPQ59H+ARxenBt6Zn6lecyB423N4JT.kK2FZFcQ4t6FcWO2F4WG00nqFdsbRxWnhoEi5oyPLrOroaQMGpOf90jHA7PKeqt1X9.MIcPxQjk1dfksYyQJGeIIYklIppLQppqorqko0X5IprqDNgZBGhJM4ENLHocLfjr.jVLBRWUQ2vyxkkLCGOWRoFArf8PfsQDJQqUZgueAksovJHrUcPOCW0CFLlikWOWtUTgut08xlErO9L08QdpQNEgmY0OUMzmY09XVHJCGs7ME8atYZtaUoQqxUZ0oYi5eQmpOF1gdHae78DVhd8Fs6zZy81oBL6S.HT3ovVb6aC79vJs1R8i+L0l2eS8Js3+Rey1On0lsazRMq.vV0GypzqG1fENrgmI1a4ID8JBBZkP4nshZ9mdqHYMMI.Chf.rf+aBiKoUTyMRXoDQhjOgDV9vSFWX8BHFLKJQkR1ixvMHKeqrea1kx9cYUmbpd8l5bbuEOpsMHzoMMOr16vXbYRfSWr2Jfg1N.Odgfab5XiKLawFFQNuBKjRpQrXMbwwiqRsM4977eevHIoXue3WOnVYDCwCthoAqyE6wr3vQtLdeHcVTn1RJkw9OiQcgDZGHNDx.PMCrQrzoE3ILim.zGohE4waDeK1PwDpSlqXw+c8QNA8wQbZmQ3dUklVLiASGuKLE7BZsSa7Fm48sTDb9CA6hJUe77llM2gmlMyAk+EUzsoLPhQEHi.iJmlVZPj4zHW+RQf3xJ5VNt13V38wdcCgx6mBJcRMuHtZQoN5VOeTs2e7Eu3kEKibbsH8iIUpPgeu3ivr5.y1IK6mKV1a3DzdYwGYYxFHRnpGF+bL34HHgep3Il1PpEMfAXcWDyy5afZy6E3nCMMXfAGBBAaCath7B7.6nw43i4Nn5XhY3f+F9DOoFerb7jZil7LQFGGOq7mAdVuwnTaMGf7wwn38RghNilRDMf89qBvDigZIYCFVZL07ITeQopXrYWnutXZeYud+Qwc4ZXgzdYNEaQZp45d6nSr5oTxYsolr6HQ7UiPrhR8pMhqf.+RcL90NZPlbfhhFibQGaYRV5EKwaHuVR+7k9gROBsOtG0yI1qX7lVG2GDuHk1XGWJz1mgX0.cGJkM.hgR2l+0JUmRcqPPfxwTbSBMAPKGPuMo1FXaaSia9wlN1yI7Ss9DpGNpMFQ5aG3ynNiN.gWdPmgcCKtK+Dk0WaU3SuOh+8mrM7UgFmLikN4ZuegYz28cBcJFa84tGuh2YQDhG6Dddh3+OVIovYWkjKoniXAdbyeHNtQJbzIYxTWKMhJOIbb2C67a+IuYjMcnADVpTFd3zOBA3CR8YSR6rufx0URNEpm+s7+Zna90G4gwSxG9hCgJ92UYTRe0cvDr2AqSl143Wl0Wsxcle0pFFL.Bs8PDeWpOVKUwLriUaJA6mh5DbjepbjhZYLKfjdqiHkZUbUQUPUnIVmeDw7hDahHo1LXbpcJUGZ+Zwnp25X3ja1v2.TLgQwhQlA193vKFnIxXB47hjuOxybx1GlLncF6uJ8crEV+Thluv4vi5c3217r6sDl+KDOk6hdk36hVg.WMjBThZptLtGJvlMhZ53vcoDp6.JwJkUuEFRezuONkyzTOPaxXHwlAuVoVXaLzBYBoOnTcKBF4IbSziqt3DpdvMThfqJO4g54hc6D4cexLSu6yIBFOGdqmYO5CxG9psU75JPd47pglR0yGa4qKMc3fL7ncLhd5ZdP+ECo.maR3eL0RJ6xGqpIE9b1hJSGnjQGCiza0AXL+7xXg4kw0lWFuy7x35yKi2cdYbiilQdE8MCXTmnXCnMmlUhdh.4wuOgbFo+A.NMM8a
                                        

                                        Relevant code:

                                        const var MasterChain = Synth.getChildSynth("Master Chain");
                                        
                                        const var REORDER_POLY_FX = false;
                                        const var SLOT_RANGE = [0, 3];
                                        
                                        // REVERB -> PHASER -> SATURATOR 
                                        MasterChain.setEffectChainOrder(REORDER_POLY_FX, SLOT_RANGE, [0, 1, 2]);
                                        
                                        // PHASER -> SATURATOR -> REVERB
                                        //MasterChain.setEffectChainOrder(REORDER_POLY_FX, SLOT_RANGE, [1, 2, 0]);
                                        
                                        // SATURATOR -> PHASER -> REVERB
                                        //MasterChain.setEffectChainOrder(REORDER_POLY_FX, SLOT_RANGE, [2, 1, 0]);
                                        

                                        This will also show the current processing order in the module tree like this:

                                        47410819-e4c8-4fa5-8bd9-7a944bb2e531-image.png

                                        HISEnbergH 1 Reply Last reply Reply Quote 4
                                        • HISEnbergH
                                          HISEnberg @Christoph Hart
                                          last edited by

                                          It's.... so much less code 🤤

                                          meme.gif

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

                                            @HISEnberg yup and the drag container will create and update the index array automatically but that part is not ready yet…

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

                                            25

                                            Online

                                            2.0k

                                            Users

                                            12.6k

                                            Topics

                                            109.5k

                                            Posts