Some hackery to permanently run a synth and control it?

Hello folks!
Hope you're all well.

I have a question for you, maybe it's already discussed somewhere but I didn't find it... If yes, please link me the topic and I'll remove this one!

What I need to do is to create a custom SynthDef in SC (let's say containing, for example, a super-simple SinOsc), launch it in Tidal and let it run permanently.
Then, I would like to control that specific instance in Tidal, patterning, for example, its frequency or its volume.

Please notice that I'm a quite beginner and I can't figure out how to properly formalize the problem in order to code it correctly.
So, does anyone have any hint or suggestions on how to proceed?

Thank you in advance and see ya soon!
Best,
A.

What do you mean by "that specific instance" and "permanently"?
I can't quite tell if you just want to define a SC synth and use it in Tidal (maybe load it at each Tidal boot?), which is fairly standard, or something more exotic.

Ok, I've just realised I didn't explain it clearly. Sorry about my bad English, I'll try to explain it better.
So, as far as I know, Tidal recall a specific instance of a specific Synth a certain amount of times at each cycle.
Let's keep it simple for a while, forgetting about envelopes and stuff, and assuming I have this silly SynthDef correctly placed in the boot file:

SynthDef(\myTry, {
arg out = 0, freq = 440;
var sig;
sig = SinOsc.ar(freq);
OffsetOut.ar(out, sig, sig);
}).add;

Now, if I run this line in Tidal:

d1 $ n "0 1 2" # s "myTry"

..."myTry" is recalled three times each cycle, each time with a different frequency value as specified in the "n" pattern.
Perfect.

Now, let's say I have something more tricky, for example this:

SynthDef(\myTry2, {
arg out = 0;
var sig;
sig = SinOsc.ar(\freq.kr(440, lag: 1));
OffsetOut.ar(out, sig, sig);
}).add;

...And I need first recall "myTry2" only one time and let it run forever (I don't even know if it's actually possible, should be something like "once") and just pass to that specific instance the freq parameter, which will then change with a glissando (lagtime) of 1 second.
In other words, I don't need Tidal to automatically free my synth for each new note, but just passing new parameters to the same instance of that synth.

In SC, to be clear, I can simply do something like this:

a = Synth.new(\myTry2);

...and then evaluating something like this:

a.set(\freq, 580);
a.set(\freq, 880);

...And so on.

Referring to the above example in SC, what I am missing is some kind of "set" command. I was wondering if this can be somehow accomplished in Tidal.

I hope I explained myself better this time!
Thank you so much!
A.

i think i understand. you want to create some kind of drone that you set and forget and then make changes to remotely. one hacky way i can think to do this would be to set an absurdly long slow parameter with a corresponding legato and then control the sounds using all. something like this seems to have a nice, long evolving sound happening...

do
  all (# crush "<2 1 3>")
  all (# lpf (range 5000 20000 $ slow 12 sine))
  all (# voice (range 0 1 $ slow 6 sine))
  d1 $ slow 12 $ n "c" # s "supersaw" # legato 12

edit: use with caution...it takes a long time for the sound to die out! i've mashed hush about a million times and it won't shut up :scream:

I'm surprised that this works, I was always convinced that the parameters of a synth were fixed when you triggered it and stayed the same for all the duration of the event. This opens so many possibilities...

@th4 is right, in general you can't change an effect of an ongoing sound, unless it's a global effect (and therefore changes all sounds in the same 'orbit')

Options are:

  • Waiting until the next version of tidal/superdirt, out soon, which will start to allow continuous changes to effects on ongoing sounds
  • Hack things so that the effect you want to change is a global one
  • don't use superdirt, but making a bespoke OSC responder that does what you want. You will probably want to consult the custom osc page on tidalcycles.org for this, although you could potentially just parse the same OSC format as superdirt.
2 Likes

Exactly, this is the main idea, but what I need to control is a specific parameter in my SC synth and not a global effect (interesting stuff anyway, I'll give it a try!).
As @yaxu pointed out, this isn't possible in superdirt... So I'll go with OSC for now, which feels more familiar to me, but waiting for the next tidal version :heart_eyes:

Thank you!

Hi, for doing things like a continous control I think you can also have and Ndef in SuperDirt (that you can instance manually) that serves as a control signal for another synth (that you trigger with tidal). For example, I have a notch filter defined:

SynthDef("notch", { |out, notchq = 0.8|
    var sig;
    sig = In.ar(out, ~nChannels);
    sig = BRF.ar(sig, Ndef.kr(\mod).exprange(200, 18000), notchq);
    ReplaceOut.ar(out, sig)
}).add;

~dirt.addModule('notch', {|dirtEvent|
    dirtEvent.sendSynth('notch', [\notchq:~notchq , \out:~out ]);
},{ ~notchq.notNil } );

that in combination with a Ndef

Ndef(\mod, {
  | notchf 0.15 |
  var x;
  SinOsc.kr(notchf);
});

I can achieve a continuos sine modulation that doesn't get retriggered. The thing is that (for know) I haven't found a way to .set the params of that Ndef to , for example, vary the modulation of the notch frequency from tidal.