Creating effects chains or audio buses

I understand in Tidal you can create a pattern that combines sound sources and effects like this:

d1 $ n "c e g" # s "supervibe" # crush "3 6 8"

But, can you have a source output to something like an audio bus and then apply the effects as a separate pattern? In very rough pseudo code:

d1 $ n "c e g" # s "supervibe" # -to-my-bus-
d2 $ -from-my-bus- # crush "3 6"

I keep finding myself wanting to tweak processing parameters on a sound that is already playing without triggering a new note. which I don't know how to do in Tidal, but is fairly natural in Supercollider and most synths.

Thanks for any advice.

You almost had it :wink:

An undocumented (but soon to be done) feature is "control busses"

d1 $ n "c e g" # s "supervibe"
 # crushbus 1 (segment 128 $ smooth "3 6")

Not all effects work, but most do - eg use ampbus instead of gainbus

The integer after the bus is a bus identifier - you can reuse that in places (I can't remember the syntax)

2 Likes

That's exciting! Can you send more than one voice into the same bus? And how would you control the crushbus from a separate command? I'm imagining:

d1 $ n "c e g" # s "supervibe" # crushbus 1
d2 $ n "e g b" # s "supervibe" # crushbus 1
crushbus 1 (segment 128 $ smooth "3 6")

Thanks @cleary that is very close to what I was thinking of, but my original goal was similar to the case @Jeff_Brown suggested. Set up a sound and then control the bus separately. e.g.

once $ n "c" # s "supermandolin" # sustain 10000 # crushbus 1 ("16")
-- later
crushbus 1 (segment 128 $ smooth "3 6")

Any guidance on how to modify the pattern used on the bus without retriggering the source would be interesting.

@Jeff_Brown @lushprojects Making me have to go learn things... grumble grumble :wink:

-- bus signal receive
d1 $ n "c/4" # s "superchip"
  # crushrecv 1 

-- bus signal send/control
d2 $ crushbus 1 (segment 128 $ range 6 1.1 (slow 4 saw))

Do you mean:

-- bus signal receive
d1 $ n "c/4" # s "superchip"
  # crushrecv 1 

-- bus signal send/control
d2 $ crushbus 1 (segment 128 $ range 6 1.1 (slow 4 saw))

-- another voice using the bus?
d3 $ n "eb(3,8,<0 1>)" # s "superhammond"
 # crushrecv 1
 # legato 0.4
2 Likes

Thanks. Now we're cooking with gas!

This works fine for me (which is pretty much the effect I was after, though I need to see what other buses exist):

once $ n "c" # s "superpiano" # sustain 10000 # crushrecv 1
d2 $ crushbus 1 ("4 3")

But, interestingly, this runs without error but doesn't seem to do anything (minor bug?):

-- Doesn't work ?
once $ crushbus 1 ("16")

crush has an effective range of approx 1.01 (most crushed) to 6 (hardly crushed)

16 would be no crush, so no effect. Try 1.01 instead

Thanks - I thought the crush parameter was bits. This is really helpful.

1 Like

Haha likewise -- now I've got to learn about buses. Thanks! Can you recommend anything?

I'm unsure what you mean by recommend anything? The core of the usage detail is in this thread - if I can recommend anything, "experiment" :stuck_out_tongue:

Some effects you might want to look at (I can't guarantee they all work, I'm not at a machine to verify):

ampbus
djfbus
hcutoffbus/hpfbus
cutoffbus/lpfbus
panbus -- note, this requires values from -1 to 1, as opposed to 0  to 1 like pan
squizbus
crushbus
roombus
sizebus

You can also use these with midi cc input

1 Like

There are some hacks for a similar workflow at SuperDirt/hacks at master · musikinformatik/SuperDirt · GitHub

Now, this is mostly SuperCollider Code, which I am used to because I started with SC a while before Tidal. But this file is a start. It basically allows you to route multiple Tidal orbits to one or more orbits that are FX only.

The only issue that I have with this process is that you always get both the clean sound from say a d1 and the FX orbit which may be d7. There is not currently a DAW like pre or post send mix. However, it can be used to create stems of all your channels, if you record from SuperCollider into a multi-channel WAV, if you set the number of channels to record to what you are doing, then mix them. But doesn't work very well if playing live, as again, there are no controls for the amount of mix. I use Ableton and Bitwig (or used to), which allow you to take one instrument (which would be the equivalent of d1) and route it and others to a bus (say d7) but also not only allow you to say how much of the original gets sent but to also at least mute the source but still hear the FX bus.

As far as I've seen, this is where SC and Tidal add some complication without some really severe coding that seems unwieldy. I'm looking for this as well. But the SC hack works for a start. Just evaluate it and the your FX tidal file and you can route any instrument channel to it.

I just have this open in whatever SC editor and evaluate first:

(
var busses = ~dirt.orbits.collect { |x| x.dryBus };

SynthDef(\readorb, { |out, amp = 1, n = 0, obus = 0 | // number
	var bus, sound;
	bus = Select.kr(n, busses);
	sound = InFeedback.ar(bus, ~dirt.numChannels);
	//sound = CombL.ar(sound, 0.2, 0.03, 1);
	Out.ar(out,
		sound * (amp * 2.5);
	)
}).add;
);

Then something like this for FX in a tidal file I keep separate:

d7 $ s "[readorb:0, readorb:2, readorb:1, readorb:4]"
  # room (cF 0.5 "13") #sz (cF 0.5 "29")
  # gain (cF 0.5 "82")

d7 silence

d8
  $ jux rev
  $ s "[readorb:0, readorb:2, readorb:3]"
  # delay 0.5 # delayfb 0.8 # delayt (sine * 2)
  # crush (cF 1 "19")
  -- # squiz (cF 20 "35")
  # gain (cF 0.5 "83")

d8 silence

Works pretty well, other than the above issue, but you can even use MIDI controller as I have here to control the amount and parameters of the FX.

1 Like

An update for this thread - thanks to @joanq we have a documentation reference now :slight_smile:

https://tidalcycles.org/docs/reference/control_busses

3 Likes