Using Tidal to control modular synths with CV

Generally, you can have completely continuous synths with superdirt, but you need to write up the functions that set them in ~dirt.soundLibrary.addSynth(...). Check the hacks folder, there should be examples, you can make an Ndef for instance, that runs continually.

Also, there is continuous control of a single, very long event (not sure where in tidalcycles this is documented).

Sorry that I haven't followed this whole thread.


These both sound like great improvements, I haven't heard of Ndef until now. It's cool to see more activity on this!

Thanks @julian, I'm getting closer using your advice.

I set up an Ndef in SC that outputs a continuous level:

Ndef(\cvDef, { | freq = 440, lag=0.01 |
	var lagFreq =, lagTime: lag); log2(lagFreq/440), -1, 9, 0, 1);

The params to LinLin are calibrated for my external oscillator's 1v/oct range. Outputting 0-1 from this Ndef results in a 0-10v signal through my ES-9 audio interface.

Then I'm able to control it through this synth:

~dirt.soundLibrary.addSynth(\cv, (play: {
	Ndef(\cvDef).wakeUp; // make sure the Ndef runs
	Ndef(\cvDef).set(\freq, ~freq);

And in tidal:

d1 $ n "a6 a5" # s "cv" 


Screen Shot 2023-01-18 at 7.24.12 PM

It's nice also that I can get true portamento that can also be patterned, via the Lag ugen.

The part I'm hung up on is routing the Ndef's output buffer to the dirt synth somehow so it's not just always playing. However, this is just a nice-to-have since the CV will be gated by a signal on a separate channel. I may look into writing a module to emit Ndef(\cvDef).start and .stop commands.

I tried using the playInside functionality but couldn't get it to work. See How to add a synth with `dirt.soundLibrary.addSynth` and playInside.


You want the pitch to hold, otherwise you’ll get pitch jumps during release phases of envelopes, so you’re probably closer to done than you think.

1 Like

Yes, pretty close.

I packaged it up into a pair of cv and gate synths for each orbit. I posted the latest code in a new thread so I don’t take over this one with talk of Ndefs.

But now I have a new problem. Jitter!

See: Sending continuous CV and Gate signals to a modular synth - #3 by colevscode

Hi! Great discussion happening here :slight_smile: I haven’t tried any of these solutions, ‘cause the results i get with a MIDI module (Sol) plus a Slew Limiter (Contour 1) are being enough for me to control my modular with Tidal. The legato option works pretty well in this setup, most of the time i declare a clock on an orbit and output notes on another:

d1 $ stack [
    s "sol" $ n "~!7 1" 
        # midichan "3" -- reset
        # legato 0.5,
    s "sol" $ n "1!8" 
        # midichan "4" -- main clock
        # legato 0.5 
d2 $ note "c a f e" # s "sol" # midichan "0 1"

Hope you find this useful. I’ve already hearted this thread to keep a pin for myself and try the continuous voltages from SC too!

I always ran into weird timing issues (extra notes / jitter) using midi, but perhaps a dedicated midi device would fix that. I've only tried it with the midi converter on the 0-coast.

the only thing i’ve experienced with my setup were some clicks, kind of like a gate happening twice, but this was solved by adjusting the amp envelope on the synth and using a short legato. The Sol module is also very versatile, running CircuitPython one can customize it to one’s needs. But yeah, MIDI is not always the best way to go, having SC outputting signals or Pure Data sending audio (which i love) may be in other cases preferable.