Change effects parameters without re-triggering a sample/instrument

Dear all, I find it quite hard to achieve in Tidal something that is very easy otherwise: change parameters of some effect (say, delay time, band pass filter frequency) while a (long) sound from a sample or instrument is playing.

For example: Let’s say I want to change the panning (left - right) while playing sitar.

let sample = s "sitar" # end 0.226 -- cut to length of one cycle
d1 $ sample # pan "[0 1]*4"  -- does not work, it's the same as .. # pan 0
d1 $ sample |>| pan "[0 1]*4" -- does pan, but  re-triggers each 1/8

Is there a sound parameter (to be used in a ControlPattern) that says “just keep playing”?

There is one work-around:

d1 $ (chop 8 $ sample) # pan "[0 1]*4"

but it’s fragile: first I needed to find the 0.226 above, and then the number on the left (8) must be a multiple of “2*4” on the right.

Chopping does not work for synths, e.g.,

d1 $ ( chop 8 $ s "superpiano" )  # pan "[0 1]*4"

There’s another work-around that works for some effects (not pan):

  d1 $ s "superpiano"
  d2 $ room "[1 0]*4" # orbit 0  -- this is the piano's orbit

This does not work for bpf.

PS: I’m really missing the feeling of turning the “D.TIME” knob on my (which will change frequency, since it’s playing the previous contents of its store at the current rate). I recently had botched my Supercollider install (plugins not working) so when I started TIdal/SuperDirt I got some non-standard delay (which one?) that seemed to do exactly that…

1 Like

I believe this is a limitation on how Tidal represents sound events. I don’t think it’s possible to modulate a parameter of a running synth from Tidal, because every event on Tidal starts a new Synth node on SuperCollider.

I made this extension as a workaround. It’s kinda messy because it sets parameters to all synths playing on a whole orbit, but it might work for you.


Interesting! Yes, this is the same thing for synths. Does it work for effects? E.g., would it help to “pan the piano” (see my example)?

Is there a high-level descripton of " a (Synth) node" in supercollider? (Yes -

An effect (e.g., delay) is also a node in this sense? Is there a way to look at the “tree of nodes” which I assume is built by tidal, and run by SC?
(Similar to

I understand that the goal of Tidal is modelling patterns, not modular syths. Just curious.

you can query the node tree in sclang with


Thanks! Where’s the code (in Tidal) that builds this tree?

Ah I didn’t know about this extension of yours @munshkr, nice! I guess this is similar to the midi-style model, which is based on a piano with pedals which effect the whole instrument and not a particular note that is playing. Indeed another approach is to use midi for everything, where cc messages can be manipulated independently from note messages.

Fundamentally, the problem is that tidal only sends trigger messages.

However, I did make a semi-working prototype (with classic dirt, not superdirt) that allows d1 $ sound "longsound" # someeffect "0 3 4" to work. So I think it’s possible in principle without resorting to the midi-style approach where everything has to be a global effects…

One problem is that tidal has to have an identifier for each trigger event that is then manipulated:

Another, potentially more difficult problem is with Tidal’s representation of pattern. In Tidal there are different reasons for an event being cut into parts, only one of them being that an event parameter is being mutated. Tidal’s pattern type needs to take account of this, which needs some deep thought…

Also the relationship between the duration of an event and duration of a sound is not clear, especially with samples rather than synthesised notes.

Hi Alex, thanks for linking the SuperDirt issue. Interesting.

Here’s another thing that I would want to do with effects: use one effect in several instances, each with different parameters. E.g.,

  # delay 1 # delayfb 0.95
  # delayt 0.008  -- sort of a phaser 
  # delayt (1/3)   -- echo

that’s not two effects but one, and the last line takes precedence.

When I switch delayt in a pattern, I get a nice effect - the phased signal still seems to be in some buffer initially.

d2 $ s "[bd sn]*2"
    # delayt "<<0.005 0.01> 0.3333>"
    # delay 1 # delayfb 0.95 

NB: this code formatter doesn’t really know what # means …