I think there are multiple ways to do this, but they generally involve a bit of Supercollider hacking. One thing that I've tried is something like this:
// get SuperDirt up and running, then
(
b = Bus.control(s);
Ndef(\bass, {|freq=60, drive=1, filter=1, portamento=0.2, wrate=1, amp=0.4|
var freqlag = Lag.kr(freq, portamento);
var sig = Lag.ar(Impulse.ar(freqlag+[0,1], [0,0.01*SinOsc.kr(1)]), [0.1,0.11], 100);
sig = LeakDC.ar(sig);
sig = 0.3*atan(sig*10*drive);
sig = RLPF.ar(sig, ([1300, 1100, 800]*filter+SinOsc.ar(wrate).range(100,500)).clip(20,8000), 0.3, [0.2, 0.3, 0.7]);
sig = Mix.ar(sig);
Out.ar(0,SplayAz.ar(2, sig*amp, 0.5));
}).gui;
~dirt.soundLibrary.addSynth(\sbass, (play: {
Ndef(\bass).set(\freq, ~freq, \amp, ~amp, \filter, ~pitch1);
b.set(1.0);
}));
)
This immediately creates a synth "outside" the usual SuperDirt hierarchy, but you can control a few of the parameters from Tidal by sending messages to the sbass
synth. Putting the gui on the Ndef even gives you some sliders if you want to adjust things that way.
Pros: it's a true monosynth, you can send something like n "c c4 c c4 c c4 ef c c c4 g4 c c g4 ef c" # s "sbass"
from Tidal and you'll get a nice portamento bassline (assuming you put that into the Ndef)
Cons: it's always playing, hush
from Tidal does not turn it off, you need to change the amplitude manually or CMD-. to clear the Ndef. Being outside the normal SuperDirt hierarchy also means it does not have access to any of the effects, or really most parameters unless you explicitly include them. Though now that I think about it you could probably pipe the Ndef output into an orbit input so you could at least have global effects.