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

4 Likes

Okay, I missed this but was trying to start working in this way again. This is immense! The help document is excellent @joanq! This opens many doors of possibility. My thinking was pretty much me trying to recreate a DAW sub mix type of environment in which any channel/orbit could have a mix amount to another bus. But I didn't even realize larger issues of pattern structures until I read through the Control Bus docs. I still need to work out exactly how this might work with what I'm after - and maybe with Control Busess is totally unnecessary (paradigm shift).

At the end of the day, I think like pretty much all DAWs. Raw source tracks, with or without their own FX. Then route to FX channels in "Pre" so I can mix by lowering the main fader for the 'instrument' along with how much I send to the FX bus for how much I hear of each.

My initial problem was that you always hear the full original instrument and it can route, but only Post gain. I've done tracks where you don't even hear the original instruments - only the FX buses. I'm not sure yet if Control Bus fits that need or not, but want to check.

1 Like

but control busses do not change audio routing at all?

as I understand, they are a mechanism to send parameter-change events (to synths and effects) that do not re-trigger sounds.

The wording "Control busses let you route an effect via a bus" does not really make that clear.

Documentation patch proposals are always welcome :slight_smile:

Blockquote but control busses do not change audio routing at all?

I think you are correct. The "Control Bus" part isn't the issue. It's the same thing in SuperCollider itself.

I'm thinking probably any routing needs to be done in SuperCollider. It can be done and I've done some before, but was mainly focused on JitLib (live coding sort of stuff). It became a bit unwieldy for me, but is possible. I just haven't tried as much with SuperDirt, and then really you'd still need to have some arguments available to use with Tidal. Probably can be done and added to the hacks.

Honestly, I love what you can do in a few lines of Tidal code compared to what it often takes in SuperCollider (and it's also a bit like apples compared to oranges), yet it always seems to come back to SCLang to do some of the work. I just figured anyone using Tidal for making live music may also want have some routing options beyond just sending output from one orbit to another.

If I can contribute something I'll share it.

My goal:

Make 3 of the best patterns ever with some really cool sound design from TC.

Send two of them to buses/other orbits (maybe with patterned FX).

Limit the source gain but still have pre-gain levels to those buses.

Maybe have those buses send to other buses (however I think SC may block some of that for feedback reasons). Though it is entirely possible in say Abelton.

Currently, as far as I understand it and have done, yes you can route using the --> SC hack code from one orbit to another, but you always hear both, and the gain to the FX bus is currently the gain from the source. If you mute say d1 and it routes to d7 (FX) using the hack which receives it, d7 doesn't get a signal.

Pre and Post sends would be amazing.

However as the 'hack' isn't implemented (and I'm not sure how that works) this is all in SuperCollider realm with SCLang for now.

Make a d1 kick pattern. Use the readorb orbit routing hack. Send (or read that) that to maybe d7 with a ton of reverb and delay. You always hear the original with a new d7 channel with the FX. No way to only hear the FX channel (d7 in this example) as the only output.