Making an FX chain

Hi everyone!
I’m making an effect chain, nothing complex, however I see a few options and I would like to know what would you do / other approaches:

  1. Synths:
  • pros: I can move synths around freely, looks like the most efficient option overall
  • cons: I have to manage synths, busses and groups myself. + reimplement some preset system
  1. Ndefs/NodeProxies:
  • pros: I don’t need to care about busses, groups and routing. Can use ProxyPreset for presets.
  • cons: if I need multiple chains, duplicating ndefs has always made me sad because it creates multiple temporary synthdefs. ProxyPreset is ok, but I have to anyway coordinate multiple preset objects, which feels not so far from reimplementing a preset system. I need to implement a system also for recording on/off state of each fx.
  1. ProxyChain:
  • pros: the chain is a single object, which can be easily presetted, and stores on/off states.
  • cons: can’t keep any parameter out of the preset system, which doesn’t respect some multichannel controls I have for some fxs… and moving fxs around seems not to be possible without destroying the old ones and create new ones (which creates a new def also)

I love to think that this is the price for not having “mainstream” strategies even for what I consider largely mainstream application. I respect it and embrace it, but would also like to find a solution that is as reusable as possible for this!

1 Like

I trust James’ ddwMixerChannel for all my routing needs. Thanks, James! It offers you a virtual mixer with arbitrary number of channels; you can send sound from one channel to others just like in a real mixing console, pregain, postsend, master volume, usw. – the metaphor never breaks down, it’s easy to remember what’s going where, and you don’t have to worry about the actual innards, which I imagine are not trivial. Plus there’s a gui that actually looks like a mixer (though I seldom use it after figuring out the setup I want, I’m just now realizing).

I heartily recommend it to anyone who has no ambitions to do all the wiring and soldering and adding-to-head and adding-to-tail themselves (not sure that’s you, which is why I hesitated when you asked a similar question a while back)


1 Like

And thanks for the hat tip! MixerChannel is some 15 years old (meaning, at this point, very stable) and I use it for the same reason: node ordering and audio bus allocation problems pretty much go away.

MixerChannel would be relevant for option 1 – it gives you buses and groups, and leaves it up to you to order the effect nodes as you like:

m = MixerChannel(\name, s, 2, 2);

~effect1 = m.playfx(...);
~effect2 = m.playfx(...);
~effect3 = m.playfx(...);

~effect1.moveAfter(~effect2);  // etc.

It would be theoretically possible to have one channel per effect and order them by setting each channel’s outbus:

m = MixerChannel(\eq, s, 2, 2);
n = MixerChannel(\comp, s, 2, 2);
o = MixerChannel(\reverb, s, 2, 2);

m.outbus = n;
n.outbus = o;

But MixerChannel doesn’t allow circular chains, so reordering could get tricky. Worst case, you would have to break the existing connections before rebuilding. But it might work, because outbus_ implicitly breaks the old connection. I haven’t tested that case.


1 Like

I’d give you my thoughts in more detail, but what you’re trying to achieve is not very clear to me.

Basically, if you want “long running” FX then setting up buses outside of the events/patterns themselves is desirable (with or without helpers like ddwMixerChannel). To the contrary, if you want effects that only last little and/or are selectively applied, Pfx/Pfxb, PbindFx, Pproto etc. are probably more suitable. (I personally think of the latter kind of FX more like “note expression” in Cubase 6 (VST 3.5), but with even fewer limitations.)

You’re right, I’m not specifying what I’m doing in detail… and here detail can change quite many things. My current application is a long running fx chain, like a guitar pedalboard. Then I don’t know exactly how this will expand, and in which direction… but at least for now patterns are not involved. I think pattern options would deserve their own thread :slight_smile:

What I’m doing for now is using ProxyChain with ProxyChainPreset, since I actually have only one chain, and the most crucial feature I need is to save/load/store presets.
I had to modify ProxyChainPreset to remember fx order and exclude some of the proxies’ parameters, but it was minimal and I’m thinking about proposing it upstream, at least the exceptedKeys feature (since there is already exceptedSlots).

I also decided to give myself a break with looking for an as optimal as possible solution, and moved on with the project a bit :slight_smile: Thanks everyone for your contributions, and of course other approaches are always welcome.