Best practices for implementing user-controlled effect racks

I’ve been recently considering creating a multi-fx plugin similar to Guitar Rig, Serum/Massive’s FX rack, Effect Rack by Soundtoys, KiloHearts Snap Heap, etc.

I want to make this project as modular as possible so that in the future I can create new headers for an effect and have them function quickly and simply along with having some template for rendering them.

My main concerns right now are creating a base plugin (excluding UI) that allows for the user to create a chain of effects that pass from one to the next in an order they specifiy. I want them to be able to create as many instances as they want and change the order that the effects are applied as quickly as possible.

I’m almost certain that I’ll need to brush up on some data structures for this project but I would love to know what the best, easiest and most efficient implementations for this style of plugin would be. My mind jumped straight to a LinkedList-like structure since quick insertion times seem logical, any criticisms or better ideas would be absolutely great too!

Thanks a bunch, Seamus!

For audio processing, you can straight up use AudioProcessorGraph by JUCE or TracktionEngine. Everything in there, that concerns your audio related needs. Tracktion is a little more sophisticated, but probably also too much for a straight line of processing. AudioProcessorGraph also has a great demo: AudioPluginHost by JUCE. You need to strip away all the “hosting” part, as you’ll only be “hosting” your own modules, but all the rest is there.

I think this is the wrong way to think about it. Do you think insertions happen regularly? No, they won’t! What happens regularly is rendering audio. This is were you should be optimising.
In general the data structure you choose will almost certainly make absolutely no difference for the insertion/deletion/moving, as those effect racks won’t contain 1000nds of nodes but 10 at max (probably even less?). Also, probably won’t make a lot of difference for the audio thread, because with that kind of complexity, you’d probably be recreating a list on heap when something changes, and hand that change off to the audio thread to process.

With you questions hopefully answered, what exactly is the benefit of creating your own effect rack? Wouldn’t it be easier to supply multiple plugins as all DAWs can do the effect rack for you?

1 Like

Thanks a bunch for mentioning the AudioProcessorGraph, I didn’t even know JUCE had something like that! As for the actual optimisation, your point makes a lot of sense lol, I’m still pretty new to DSA and my brain wants to immediately optimise everything without any priorities :confused:

As for the benefits, it boils down to the following

  • I want to make this plugin as a learning experience (there will be many versions before a final for sure)
  • I have some older projects I feel would work better as a small implementation instead of their own full plugin (think small pedal fx, simple filters, etc.)
  • I plan to implement preset saving and loading so that people can save and share rack presets

Thanks for the help btw! <3