Tradeoffs of "New Synth Per Note" vs "Retriggering a Single Synth" approaches

Hi there, I’m quite new to SC but I have an extensive background in software development and a fair bit of experience with DSP.

It seems to me that a lot of the learning material focuses on Pbind for playing notes. From what I can tell, this creates a new synth on the server for each event. I found that there are other methods, such as Pmono, for retriggering a single synth (or you could even use a Control bus to send trigger events similar to a modular synth setup).

It generally seems like Pbind can be overall easier to use in terms of quickly producing some notes (hence why it is used in a lot of the learning materials), but I wasn’t sure if the overhead of creating a new synth on the server for every event can end up causing issues, such as timing issues or resource consumption issues if you have a lot going on. And on the other hand, maybe trying to retrigger a single synth can end up running into other issues.

And overall, just curious to know people’s thoughts on these 2 ways of doing things.

IMO it really depends whether you need polyphonic notes or mono-synth (slurs or slides between notes).

The overhead to create new synths is microscopic. OSC message timestamps are meant to absorb timing jitter, so this is also a non-issue – not sample-accurate but quite solid. If you need polyphony, reusing synth voices requires more complex code on your part, with a cost of debugging time, for basically no gain. It isn’t worth it. (If you need monosynth effects, then of course “new synth” won’t slide, so you have to reuse.)

hjh

1 Like

another approach which is broadly similar to Pmono is to build a synth function using demand rate UGens usually in the {...}.play form… One frustration I have with patterns is the difficulty of continuously modulating Synth parameters to make a completely fluid gesture - with Demand rate UGens you can keep the sequencing inside the Synthdef …

2 Likes

I usually prepare some parameters in advance that will be mapped to control buses – every note maps these parameters – and then those buses can be easily modulated.

With the main SC class library, that can be a bit of a pain, but with ddwVoicer:

v = Voicer(10, \default);
v.mapGlobal(\pan, nil, 0, \bipolar);

p = Pbind(
    \type, \voicer, \voicer, v,
    ...
);

v.globalControls[\pan].automate { LFDNoise3.kr(0.1) };

hjh

1 Like