# Creating effects chains or audio buses

**URL:** <https://uzu.lurk.org/t/creating-effects-chains-or-audio-buses/3707>\
**Category:** TidalCycles\
**Tags:** questions\
**Created:** [12 December 2021 17:39 UTC](https://uzu.lurk.org/t/creating-effects-chains-or-audio-buses/3707 "2021-12-12T17:39:04Z")\
**Posts on this page:** 18\
**Page:** 1

<div class="post-metadata">

**Author:** ![lushprojects](https://uzu.lurk.org/user_avatar/uzu.lurk.org/lushprojects/32/2029_2.png) [@lushprojects](https://uzu.lurk.org/u/lushprojects)\
**Post date:** [12 December 2021 17:39 UTC](https://uzu.lurk.org/t/creating-effects-chains-or-audio-buses/3707/1 "2021-12-12T17:39:04Z")

</div>

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

```haskell
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:

```haskell
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.

---

<div class="post-metadata">

**Author:** ![cleary](https://uzu.lurk.org/user_avatar/uzu.lurk.org/cleary/32/177_2.png) [@cleary](https://uzu.lurk.org/u/cleary)\
**Post date:** [13 December 2021 09:16 UTC](https://uzu.lurk.org/t/creating-effects-chains-or-audio-buses/3707/2 "2021-12-13T09:16:05Z")

</div>

You almost had it 😉

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

```haskell
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)

---

<div class="post-metadata">

**Author:** ![Jeff\_Brown](https://uzu.lurk.org/user_avatar/uzu.lurk.org/jeff_brown/32/2033_2.png) [@Jeff\_Brown](https://uzu.lurk.org/u/Jeff_Brown)\
**Post date:** [13 December 2021 14:24 UTC](https://uzu.lurk.org/t/creating-effects-chains-or-audio-buses/3707/3 "2021-12-13T14:24:41Z")

</div>

> [@cleary](#):
>
> ```haskell
> d1 $ n "c e g" # s "supervibe"
> # crushbus 1 (segment 128 $ smooth "3 6")
> 
> ```

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:

```haskell
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")

```

---

<div class="post-metadata">

**Author:** ![lushprojects](https://uzu.lurk.org/user_avatar/uzu.lurk.org/lushprojects/32/2029_2.png) [@lushprojects](https://uzu.lurk.org/u/lushprojects)\
**Post date:** [13 December 2021 19:27 UTC](https://uzu.lurk.org/t/creating-effects-chains-or-audio-buses/3707/4 "2021-12-13T19:27:13Z")

</div>

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.

```haskell
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.

---

<div class="post-metadata">

**Author:** ![cleary](https://uzu.lurk.org/user_avatar/uzu.lurk.org/cleary/32/177_2.png) [@cleary](https://uzu.lurk.org/u/cleary)\
**Post date:** [13 December 2021 19:41 UTC](https://uzu.lurk.org/t/creating-effects-chains-or-audio-buses/3707/5 "2021-12-13T19:41:05Z")

</div>

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

```haskell
-- 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))

```

> [@Jeff\_Brown](#):
>
> That's exciting! Can you send more than one voice into the same bus?

Do you mean:

```haskell
-- 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

```

---

<div class="post-metadata">

**Author:** ![lushprojects](https://uzu.lurk.org/user_avatar/uzu.lurk.org/lushprojects/32/2029_2.png) [@lushprojects](https://uzu.lurk.org/u/lushprojects)\
**Post date:** [13 December 2021 19:55 UTC](https://uzu.lurk.org/t/creating-effects-chains-or-audio-buses/3707/6 "2021-12-13T19:55:09Z")

</div>

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):

```haskell
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?):

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

```

---

<div class="post-metadata">

**Author:** ![cleary](https://uzu.lurk.org/user_avatar/uzu.lurk.org/cleary/32/177_2.png) [@cleary](https://uzu.lurk.org/u/cleary)\
**Post date:** [13 December 2021 19:57 UTC](https://uzu.lurk.org/t/creating-effects-chains-or-audio-buses/3707/7 "2021-12-13T19:57:15Z")

</div>

`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

---

<div class="post-metadata">

**Author:** ![lushprojects](https://uzu.lurk.org/user_avatar/uzu.lurk.org/lushprojects/32/2029_2.png) [@lushprojects](https://uzu.lurk.org/u/lushprojects)\
**Post date:** [13 December 2021 19:59 UTC](https://uzu.lurk.org/t/creating-effects-chains-or-audio-buses/3707/8 "2021-12-13T19:59:48Z")

</div>

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

---

<div class="post-metadata">

**Author:** ![Jeff\_Brown](https://uzu.lurk.org/user_avatar/uzu.lurk.org/jeff_brown/32/2033_2.png) [@Jeff\_Brown](https://uzu.lurk.org/u/Jeff_Brown)\
**Post date:** [14 December 2021 15:18 UTC](https://uzu.lurk.org/t/creating-effects-chains-or-audio-buses/3707/9 "2021-12-14T15:18:58Z")

</div>

> [@cleary](#):
>
> Making me have to go learn things

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

---

<div class="post-metadata">

**Author:** ![cleary](https://uzu.lurk.org/user_avatar/uzu.lurk.org/cleary/32/177_2.png) [@cleary](https://uzu.lurk.org/u/cleary)\
**Post date:** [14 December 2021 23:18 UTC](https://uzu.lurk.org/t/creating-effects-chains-or-audio-buses/3707/10 "2021-12-14T23:18:39Z")

</div>

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"** 😛

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

```haskell
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](https://club.tidalcycles.org/t/tidal-1-7-control-busses-midi-control-input/2934)

---

<div class="post-metadata">

**Author:** ![Hypostatic](https://uzu.lurk.org/user_avatar/uzu.lurk.org/hypostatic/32/2011_2.png) [@Hypostatic](https://uzu.lurk.org/u/Hypostatic)\
**Post date:** [19 December 2021 01:30 UTC](https://uzu.lurk.org/t/creating-effects-chains-or-audio-buses/3707/11 "2021-12-19T01:30:18Z")

</div>

There are some hacks for a similar workflow at [SuperDirt/hacks at master · musikinformatik/SuperDirt · GitHub](https://github.com/musikinformatik/SuperDirt/tree/master/hacks)

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:

```haskell
(
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:

```haskell
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.

---

<div class="post-metadata">

**Author:** ![cleary](https://uzu.lurk.org/user_avatar/uzu.lurk.org/cleary/32/177_2.png) [@cleary](https://uzu.lurk.org/u/cleary)\
**Post date:** [21 November 2022 22:12 UTC](https://uzu.lurk.org/t/creating-effects-chains-or-audio-buses/3707/12 "2022-11-21T22:12:31Z")

</div>

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

[https://tidalcycles.org/docs/reference/control\_busses](https://tidalcycles.org/docs/reference/control_busses)

---

<div class="post-metadata">

**Author:** ![Hypostatic](https://uzu.lurk.org/user_avatar/uzu.lurk.org/hypostatic/32/2011_2.png) [@Hypostatic](https://uzu.lurk.org/u/Hypostatic)\
**Post date:** [5 March 2023 16:20 UTC](https://uzu.lurk.org/t/creating-effects-chains-or-audio-buses/3707/13 "2023-03-05T16:20:57Z")

</div>

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.

---

<div class="post-metadata">

**Author:** ![jwaldmann](https://uzu.lurk.org/letter_avatar_proxy/v4/letter/j/977dab/32.png) [@jwaldmann](https://uzu.lurk.org/u/jwaldmann)\
**Post date:** [5 March 2023 19:41 UTC](https://uzu.lurk.org/t/creating-effects-chains-or-audio-buses/3707/14 "2023-03-05T19:41:25Z")

</div>

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.

---

<div class="post-metadata">

**Author:** ![cleary](https://uzu.lurk.org/user_avatar/uzu.lurk.org/cleary/32/177_2.png) [@cleary](https://uzu.lurk.org/u/cleary)\
**Post date:** [6 March 2023 01:09 UTC](https://uzu.lurk.org/t/creating-effects-chains-or-audio-buses/3707/15 "2023-03-06T01:09:45Z")

</div>

Documentation patch proposals are always welcome 🙂

---

<div class="post-metadata">

**Author:** ![Hypostatic](https://uzu.lurk.org/user_avatar/uzu.lurk.org/hypostatic/32/2011_2.png) [@Hypostatic](https://uzu.lurk.org/u/Hypostatic)\
**Post date:** [7 March 2023 01:15 UTC](https://uzu.lurk.org/t/creating-effects-chains-or-audio-buses/3707/16 "2023-03-07T01:15:16Z")

</div>

> 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.

---

<div class="post-metadata">

**Author:** ![Hypostatic](https://uzu.lurk.org/user_avatar/uzu.lurk.org/hypostatic/32/2011_2.png) [@Hypostatic](https://uzu.lurk.org/u/Hypostatic)\
**Post date:** [7 March 2023 23:37 UTC](https://uzu.lurk.org/t/creating-effects-chains-or-audio-buses/3707/17 "2023-03-07T23:37:18Z")

</div>

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](https://github.com/musikinformatik/SuperDirt/tree/master/hacks) 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.

---

<div class="post-metadata">

**Author:** ![Hypostatic](https://uzu.lurk.org/user_avatar/uzu.lurk.org/hypostatic/32/2011_2.png) [@Hypostatic](https://uzu.lurk.org/u/Hypostatic)\
**Post date:** [7 March 2023 23:58 UTC](https://uzu.lurk.org/t/creating-effects-chains-or-audio-buses/3707/18 "2023-03-07T23:58:08Z")

</div>

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.
