# The SupeDirtMixer v1.0 is out now!

**URL:** https://uzu.lurk.org/t/the-supedirtmixer-v1-0-is-out-now/4861
**Category:** Announcements
**Created:** [10 September 2023 16:02 UTC](https://uzu.lurk.org/t/the-supedirtmixer-v1-0-is-out-now/4861 "2023-09-10T16:02:01Z")
**Posts on this page:** 20
**Page:** 1

<div class="post-metadata">

### Author: ![mrreason](https://uzu.lurk.org/user_avatar/uzu.lurk.org/mrreason/32/3203_2.png) [@mrreason](https://uzu.lurk.org/u/mrreason)
#### Post date: [10 September 2023 16:02 UTC](https://uzu.lurk.org/t/the-supedirtmixer-v1-0-is-out-now/4861/1 "2023-09-10T16:02:01Z")

</div>

I created this mixer UI for **SuperDirt**. My primary goal in developing this mixer was to eliminate the need for using a DAW like Ableton during my live coding sessions. Previously, I had been using Ableton solely for mixing in a live setup, so I wanted to streamline the process.

This mixer makes tonal depth, maintaining clean frequency separation, and creating a rich stereo panorama possible, all of which are easily accessible within SuperDirt. In essence, this mixer replaces the default values of the orbits defaultParentEvents. As a result, it empowers users to adjust parameters like gain, allowing values to range from 0 to 1.5 instead of being limited to 1.0. These modified defaultParentEvent values persist until they are overwritten on the TidalCycles side.

> **[GitHub - thgrund/SuperDirtMixer: Mixer for SuperDirt to provide mixing...](https://github.com/thgrund/SuperDirtMixer)**
>
> Mixer for SuperDirt to provide mixing presets for TidalCycles. This includes level indicators, gain, pan, reverb and eq settings for every orbit (indiviually). - GitHub - thgrund/SuperDirtMixer: Mi...

 ![mixer](https://club.tidalcycles.org/uploads/default/original/2X/e/ef5ad52a6f6380c23d85ef2e93f3b3cf591ee486.png)

---

<div class="post-metadata">

### Author: ![geikha](https://uzu.lurk.org/user_avatar/uzu.lurk.org/geikha/32/2701_2.png) [@geikha](https://uzu.lurk.org/u/geikha)
#### Post date: [10 September 2023 23:12 UTC](https://uzu.lurk.org/t/the-supedirtmixer-v1-0-is-out-now/4861/2 "2023-09-10T23:12:50Z")

</div>

WHAAAAAAAAAAAT !!!! omg this is amazing !!!

---

<div class="post-metadata">

### Author: ![loopology](https://uzu.lurk.org/user_avatar/uzu.lurk.org/loopology/32/60_2.png) [@loopology](https://uzu.lurk.org/u/loopology)
#### Post date: [11 September 2023 05:08 UTC](https://uzu.lurk.org/t/the-supedirtmixer-v1-0-is-out-now/4861/3 "2023-09-11T05:08:50Z")

</div>

![image](https://club.tidalcycles.org/uploads/default/original/2X/8/812eb28d72e3b3c66ea70e96c725c07315f1d732.jpeg)

---

<div class="post-metadata">

### Author: ![CJunit](https://uzu.lurk.org/user_avatar/uzu.lurk.org/cjunit/32/1716_2.png) [@CJunit](https://uzu.lurk.org/u/CJunit)
#### Post date: [11 September 2023 07:00 UTC](https://uzu.lurk.org/t/the-supedirtmixer-v1-0-is-out-now/4861/4 "2023-09-11T07:00:01Z")

</div>

Nice work! When I can make some more Tidal time soon I need to check this out.

---

<div class="post-metadata">

### Author: ![mrreason](https://uzu.lurk.org/user_avatar/uzu.lurk.org/mrreason/32/3203_2.png) [@mrreason](https://uzu.lurk.org/u/mrreason)
#### Post date: [11 September 2023 07:03 UTC](https://uzu.lurk.org/t/the-supedirtmixer-v1-0-is-out-now/4861/5 "2023-09-11T07:03:39Z")

</div>

Daaaamn this meme gave me some chills and then I needed to laugh. Is this already retro? 😃  
Now we may be 1 louder xD

---

<div class="post-metadata">

### Author: ![glitchpop](https://uzu.lurk.org/user_avatar/uzu.lurk.org/glitchpop/32/2673_2.png) [@glitchpop](https://uzu.lurk.org/u/glitchpop)
#### Post date: [14 September 2023 04:50 UTC](https://uzu.lurk.org/t/the-supedirtmixer-v1-0-is-out-now/4861/6 "2023-09-14T04:50:52Z")

</div>

This is very cool, thanks for releasing it. Any chance the gui is mappable to something like Nanokontrol?

---

<div class="post-metadata">

### Author: ![mrreason](https://uzu.lurk.org/user_avatar/uzu.lurk.org/mrreason/32/3203_2.png) [@mrreason](https://uzu.lurk.org/u/mrreason)
#### Post date: [15 September 2023 08:37 UTC](https://uzu.lurk.org/t/the-supedirtmixer-v1-0-is-out-now/4861/7 "2023-09-15T08:37:06Z")

</div>

Originally I only planned to make the presets changeable with OSC, but this feature is quite similar to make the values for `gain`, `pan` and `reverb` adjustable as well. It wasn't a big deal, so with the latest version these parts of the ui are mappable now.

```haskell
(
     // Currently the ose listener only listens to the SuperDirt default port 57120
     var superDirtOSC = NetAddr.new("127.0.0.1", 57120);

     // You can change the preset an
     superDirtOSC.sendMsg("/SuperDirtMixer/loadPreset", "Default.csv");

     // You can change the gain, pan and reverb values with OSC
     // The first value is the orbit number and the second value is the new value that will be set in the orbit defaultParentEvent
     superDirtOSC.sendMsg("/SuperDirtMixer/gain", 0, 1.4);
     superDirtOSC.sendMsg("/SuperDirtMixer/pan", 0, 0.7);
     superDirtOSC.sendMsg("/SuperDirtMixer/reverb", 0, 0.4);
)

```

And to set mute and solo you can do it the standard way (something like this):

```haskell
tidalNetAddr = NetAddr.new("127.0.0.1", 6010);

tidalNetAddr.sendMsg("/mute", orbitIndex );
tidalNetAddr.sendMsg("/unmute", orbitIndex );

tidalNetAddr.sendMsg("/solo", orbitIndex );
tidalNetAddr.sendMsg("/unsolo", orbitIndex );)

```

But how to map a MIDI controller to this I recommend the official documentation: [OSC | Tidal Cycles](https://tidalcycles.org/docs/configuration/MIDIOSC/osc/#playback-controllers)

---

<div class="post-metadata">

### Author: ![loopier](https://uzu.lurk.org/user_avatar/uzu.lurk.org/loopier/32/1152_2.png) [@loopier](https://uzu.lurk.org/u/loopier)
#### Post date: [15 September 2023 08:37 UTC](https://uzu.lurk.org/t/the-supedirtmixer-v1-0-is-out-now/4861/8 "2023-09-15T08:37:18Z")

</div>

I installed it using `Quarks.install("https://github.com/thgrund/SuperDirtMixer")`.

I was going to try it before putting it in the `startup.scd`, by running this code (had to increase memory because otherwise it would not start the server):

```haskell
(
s.options.numBuffers = 16 * s.options.numBuffers;
s.options.memSize = 32 * s.options.memSize;
s.options.maxNodes = 32 * s.options.maxNodes;
s.waitForBoot {
	~dirt = SuperDirt(2, s);
	~dirt.start(57120, 0 ! 14);
	// More SuperDirt ...

	// Initialize the SuperDirtMixer
	~mixer = SuperDirtMixer(~dirt, 6010);

	// You can adjust parameters before you use the ui
	~mixer.orbitLabels = ["d1 - Lead", "d2 - Bass", "d3 - Key", "d4 - Pad"];
	~mixer.enableMasterPeakRMS(0)
}
)

```

When running:

```haskell
~mixer.gui

```

I get the following error:

```haskell
ERROR: Message 'synth' not understood.
Perhaps you misspelled 'switch', or meant to call 'synth' on another receiver?
RECEIVER:
Instance of GlobalDirtEffect { (0x55f58d7e24a8, gc=18, fmt=00, flg=00, set=03)
  instance variables [7]
    name : Symbol 'dirt_global_eq'
    paramNames : instance of Array (0x55f58cb582f8, size=1, set=2)
    numChannels : Integer 2
    state : instance of Event (0x55f58d7e3478, size=5, set=3)
    alwaysRun : false
    synth : instance of Synth (0x55f58a5c9a78, size=6, set=3)
    defName : nil
}
ARGS:
CALL STACK:
	DoesNotUnderstandError:reportError
		arg this = <instance of DoesNotUnderstandError>
	Nil:handleError
		arg this = nil
		arg error = <instance of DoesNotUnderstandError>
	Thread:handleError
		arg this = <instance of Thread>
		arg error = <instance of DoesNotUnderstandError>
	Object:throw
		arg this = <instance of DoesNotUnderstandError>
	Object:doesNotUnderstand
		arg this = <instance of GlobalDirtEffect>
		arg selector = 'synth'
		arg args = [*0]
	SuperDirtMixer:gui
		arg this = <instance of SuperDirtMixer>
		var window = nil
		var v = nil
		var composite = <instance of CompositeView>
		var freqScope = <instance of FreqScopeView>
		var orbitUIElements = nil
		var masterFunc = nil
		var meterResp = nil
		var masterOutResp = nil
		var equiView = nil
		var setEQuiValues = nil
		var activeOrbit = <instance of DirtOrbit>
		var presetFile = 'Default.csv'
		var orbitLevelIndicators = [*0]
		var panKnobs = [*0]
		var panNumBoxs = [*0]
		var gainSliders = [*0]
		var gainNumBoxs = [*0]
		var reverbKnobs = [*0]
		var eqButtons = <instance of List>
		var orbitMixerViews = [*0]
		var setOrbitEQValues = nil
		var leftMasterIndicator = <instance of LevelIndicator>
		var rightMasterIndicator = <instance of LevelIndicator>
	Interpreter:interpretPrintCmdLine
		arg this = <instance of Interpreter>
		var res = nil
		var func = <instance of Function>
		var code = "~mixer.gui"
		var doc = <instance of ScelDocument>
		var ideClass = nil
	Process:interpretPrintCmdLine
		arg this = <instance of Main>
^^ ERROR: Message 'synth' not understood.
Perhaps you misspelled 'switch', or meant to call 'synth' on another receiver?
RECEIVER: GlobalDirtEffect('dirt_global_eq', ['reverbWet'])

```

Am I missing something?

---

<div class="post-metadata">

### Author: ![mrreason](https://uzu.lurk.org/user_avatar/uzu.lurk.org/mrreason/32/3203_2.png) [@mrreason](https://uzu.lurk.org/u/mrreason)
#### Post date: [15 September 2023 08:46 UTC](https://uzu.lurk.org/t/the-supedirtmixer-v1-0-is-out-now/4861/9 "2023-09-15T08:46:12Z")

</div>

Hey @loopier! Thanks for trying out the SuperDirtMixer!  
When everything works fine, then you should receive these three messages:

```haskell
---- initialize SuperDirtMixer ----
loading synthdefs in /Users/mrreason/Development/SuperCollider/SuperDirtMixer/classes/../synths/synth.scd
SuperDirtMixer was successfully initialized

```

I assume you do not see the `loading synthdefs` line in your console?

And what happens if you try to execute the `SynthDef` definition in the `synths` folder manually?

Or so to say, are you able to run these line of codes?

```haskell
(
var numChannels = ~dirt.numChannels;

SynthDef("dirt_global_eq2", { |out, dryBus, gate = 1, reverbWet|
		var sound;
		var in = In.ar(dryBus, ~dirt.numChannels);
		//ReplaceOut.ar(dryBus, in * (1 - gobalCutoffDry));

		// Dry/Wet
		// TODO: disable if no value was received
		sound = in.equi;
		DirtPause.ar(sound, graceTime:4);

		ReplaceOut.ar(dryBus, (in * (1 - reverbWet)) + (sound * reverbWet ));

	}, [\ir]).add;

)

```

---

<div class="post-metadata">

### Author: ![loopier](https://uzu.lurk.org/user_avatar/uzu.lurk.org/loopier/32/1152_2.png) [@loopier](https://uzu.lurk.org/u/loopier)
#### Post date: [15 September 2023 10:39 UTC](https://uzu.lurk.org/t/the-supedirtmixer-v1-0-is-out-now/4861/10 "2023-09-15T10:39:47Z")

</div>

> [@mrreason](#):
>
> When everything works fine, then you should receive these three messages:
> 
> ```haskell
> ---- initialize SuperDirtMixer ----
> loading synthdefs in /Users/mrreason/Development/SuperCollider/SuperDirtMixer/classes/../synths/synth.scd
> SuperDirtMixer was successfully initialized
> 
> ```
> 
> I assume you do not see the `loading synthdefs` line in your console?

I do get a similar line to this (I'm on Linux):

```haskell
---- initialize SuperDirtMixer ----
loading synthdefs in /home/r/.local/share/SuperCollider/downloaded-quarks/SuperDirtMixer/classes/../synths/synth.scd
SuperDirtMixer was successfully initialized

```

> [@mrreason](#):
>
> Or so to say, are you able to run these line of codes?

The code runs fine, but I keep getting the same error when I evaluate `~mixer.gui`.

---

<div class="post-metadata">

### Author: ![mrreason](https://uzu.lurk.org/user_avatar/uzu.lurk.org/mrreason/32/3203_2.png) [@mrreason](https://uzu.lurk.org/u/mrreason)
#### Post date: [15 September 2023 11:41 UTC](https://uzu.lurk.org/t/the-supedirtmixer-v1-0-is-out-now/4861/11 "2023-09-15T11:41:43Z")

</div>

I might have an idea. So what do you get after booting the server and initializate the SuperDirtMixer, when you evaluate this line:

```haskell
~dirt.orbits[0].globalEffects[0].synth

```

---

<div class="post-metadata">

### Author: ![loopier](https://uzu.lurk.org/user_avatar/uzu.lurk.org/loopier/32/1152_2.png) [@loopier](https://uzu.lurk.org/u/loopier)
#### Post date: [15 September 2023 12:56 UTC](https://uzu.lurk.org/t/the-supedirtmixer-v1-0-is-out-now/4861/12 "2023-09-15T12:56:14Z")

</div>

Same thing:

```haskell
ERROR: Message 'synth' not understood.
Perhaps you misspelled 'switch', or meant to call 'synth' on another receiver?
RECEIVER:
Instance of GlobalDirtEffect { (0x55b223135458, gc=08, fmt=00, flg=00, set=03)
  instance variables [7]
    name : Symbol 'dirt_global_eq'
    paramNames : instance of Array (0x55b2257c0218, size=1, set=2)
    numChannels : Integer 2
    state : instance of Event (0x55b224cb7218, size=5, set=3)
    alwaysRun : false
    synth : instance of Synth (0x55b22313e608, size=6, set=3)
    defName : nil
}
ARGS:
CALL STACK:
	DoesNotUnderstandError:reportError
		arg this = <instance of DoesNotUnderstandError>
	Nil:handleError
		arg this = nil
		arg error = <instance of DoesNotUnderstandError>
	Thread:handleError
		arg this = <instance of Thread>
		arg error = <instance of DoesNotUnderstandError>
	Object:throw
		arg this = <instance of DoesNotUnderstandError>
	Object:doesNotUnderstand
		arg this = <instance of GlobalDirtEffect>
		arg selector = 'synth'
		arg args = [*0]
	Interpreter:interpretPrintCmdLine
		arg this = <instance of Interpreter>
		var res = nil
		var func = <instance of Function>
		var code = "~dirt.orbits[0].globalEffect..."
		var doc = <instance of ScelDocument>
		var ideClass = nil
	Process:interpretPrintCmdLine
		arg this = <instance of Main>
^^ ERROR: Message 'synth' not understood.
Perhaps you misspelled 'switch', or meant to call 'synth' on another receiver?
RECEIVER: GlobalDirtEffect('dirt_global_eq', ['reverbWet'])

```

---

<div class="post-metadata">

### Author: ![mrreason](https://uzu.lurk.org/user_avatar/uzu.lurk.org/mrreason/32/3203_2.png) [@mrreason](https://uzu.lurk.org/u/mrreason)
#### Post date: [15 September 2023 13:34 UTC](https://uzu.lurk.org/t/the-supedirtmixer-v1-0-is-out-now/4861/13 "2023-09-15T13:34:22Z")

</div>

And what do you receive when you evaluate this @loopier :

```haskell
~dirt.orbits[0].globalEffects

```

---

<div class="post-metadata">

### Author: ![mrreason](https://uzu.lurk.org/user_avatar/uzu.lurk.org/mrreason/32/3203_2.png) [@mrreason](https://uzu.lurk.org/u/mrreason)
#### Post date: [15 September 2023 19:55 UTC](https://uzu.lurk.org/t/the-supedirtmixer-v1-0-is-out-now/4861/14 "2023-09-15T19:55:43Z")

</div>

@loopier stupid me...I added one minor change to SuperDirt and then forgot it. The mixer ui is not usable without doing this change in SuperDirt:

> <https://github.com/musikinformatik/SuperDirt/pull/295/files>
>
> To use the equalizer in the SuperDirtMixer, it's needed to access the \`synth\` va…riable of the \`GlobalDirtEffect\` from outside.

I created a pull request, but you can change this in your SuperDirt quark files on your computer.

---

<div class="post-metadata">

### Author: ![loopier](https://uzu.lurk.org/user_avatar/uzu.lurk.org/loopier/32/1152_2.png) [@loopier](https://uzu.lurk.org/u/loopier)
#### Post date: [16 September 2023 07:33 UTC](https://uzu.lurk.org/t/the-supedirtmixer-v1-0-is-out-now/4861/15 "2023-09-16T07:33:57Z")

</div>

Ah, that worked. Thanks!

---

<div class="post-metadata">

### Author: ![mrreason](https://uzu.lurk.org/user_avatar/uzu.lurk.org/mrreason/32/3203_2.png) [@mrreason](https://uzu.lurk.org/u/mrreason)
#### Post date: [16 September 2023 07:43 UTC](https://uzu.lurk.org/t/the-supedirtmixer-v1-0-is-out-now/4861/16 "2023-09-16T07:43:14Z")

</div>

Glad to hear that! Happy mixing 🙂

---

<div class="post-metadata">

### Author: ![julian](https://uzu.lurk.org/user_avatar/uzu.lurk.org/julian/32/1398_2.png) [@julian](https://uzu.lurk.org/u/julian)
#### Post date: [16 September 2023 15:59 UTC](https://uzu.lurk.org/t/the-supedirtmixer-v1-0-is-out-now/4861/17 "2023-09-16T15:59:38Z")

</div>

This is very nice.

As you have asked for comments:

- there is a convenient library for JSON that allows you to ave and load dictionaries, maybe that is useful for saving presets? [GitHub - musikinformatik/JSONlib: A JSON de- and encoder for SuperCollider](https://github.com/musikinformatik/JSONlib)
- the EQui is in the dependency list, but I think it isn't automatically installed – you may give it a try by replacing it with the full URL (I've never tried it, but could work).
- you are iterating over all orbits to set the default environment – there is a convenient method to do this: `~dirt.set(name, value, name, value ...)`. Or, if you have a list of key value pairs: `~dirt.set(*pairs)`.

---

<div class="post-metadata">

### Author: ![mrreason](https://uzu.lurk.org/user_avatar/uzu.lurk.org/mrreason/32/3203_2.png) [@mrreason](https://uzu.lurk.org/u/mrreason)
#### Post date: [17 September 2023 10:07 UTC](https://uzu.lurk.org/t/the-supedirtmixer-v1-0-is-out-now/4861/18 "2023-09-17T10:07:33Z")

</div>

Thank you very much for your post!

And thanks for the comments! I was not aware of the `JSONlib` quark and it looks really promising. This would make it a lot easier to create presets and make them scalable. And it would help me to fix the `defaultParentEvent` related DRY pattern issues that I have. I mean in the end I could just save the complete `defaultParentEvent` as a preset in JSON for each orbit. And the decoding of this would be really simple and straight forward.

For EQui it is not in my dependency list:  
 ![image](https://club.tidalcycles.org/uploads/default/original/2X/b/b8fdcab147a7ff3001ecc8c7bc90b06787ddcec1.png)  
But I will give it a try with the git url. This is provided by the SuperCollider documentation so I assume this should work (as you mentioned): [Using Quarks | SuperCollider 3.12.2 Help](https://doc.sccode.org/Guides/UsingQuarks.html)

And I love the set shorthand! Something that I will definitely checkout.

---

<div class="post-metadata">

### Author: ![julian](https://uzu.lurk.org/user_avatar/uzu.lurk.org/julian/32/1398_2.png) [@julian](https://uzu.lurk.org/u/julian)
#### Post date: [17 September 2023 11:40 UTC](https://uzu.lurk.org/t/the-supedirtmixer-v1-0-is-out-now/4861/19 "2023-09-17T11:40:30Z")

</div>

> [@mrreason](#):
>
> I mean in the end I could just save the complete `defaultParentEvent` as a preset in JSON for each orbit.

You may run into troubles because there are functions and Buses in the `defaultParentEvent` that can't be written to json. One could separate these out using a dictionary with a parent (with all "private" stuff in the parent).

---

<div class="post-metadata">

### Author: ![julian](https://uzu.lurk.org/user_avatar/uzu.lurk.org/julian/32/1398_2.png) [@julian](https://uzu.lurk.org/u/julian)
#### Post date: [17 September 2023 11:41 UTC](https://uzu.lurk.org/t/the-supedirtmixer-v1-0-is-out-now/4861/20 "2023-09-17T11:41:47Z")

</div>

> [@mrreason](#):
>
> For EQui it is not in my dependency list:

It is in the quark's dependency list:

> <https://github.com/thgrund/SuperDirtMixer/blob/main/SuperDirtMixer.quark>

Actually, there is also `TidalVST`, which may not be necessary?

[Next page](https://uzu.lurk.org/t/the-supedirtmixer-v1-0-is-out-now/4861.md?page=2)
