SC vs Modular Synths (Eurorack)


#43

yup! just rejigged my suitcase / workflow.

feeling inspired :raised_hands:


#44

Hi all,

Just thought I would chime in here - I take a lot of inspiration from modular and analog synthesis for my pieces in SC. It helps me to map out the synthdefs by thinking of analog routing…

See link below for (modest) example.

https://sites.google.com/view/documenta-scott-simon/evolution/supercollider-notes-2019/modulation_1

Scott


#45

the sophistication of the supercollider pattern library can be leveraged to sequence control voltages pretty neatly:


#46

I think this is an interesting discussion. It is inspiring to think of how much is actually possible to do with SuperCollider.

Like other users have stated, analog modular synthesizers are known for producing a warmer, fuller sound. At the same time, according to experts in the field of physical modelling it is possible to reproduce these sounds within the digital domain.

I think that the software synthesizer Tassman from Applied Acoustics, now sadly deprecated, was an interesting example of this. It is also worth noting, that Tassman bears a lot of resemblance with the synthesizer Modalys, which is featured in the Computer Music Tutorial (under the name MOSAIC) and is developed by IRCAM.

If you follow the link below, you can read a Q&A with one of the creators of that software. I was asking myself the same question as you did, and this interview shed some light on the subject.
Applied Acoustics Tech Talk

Kind regards,
Tim


#47

hi @capogreco ,
what kind of “messages” do you send to the es-8 from supercollider ?

do you have a small example script ?
thanks !


#48

so far I’ve been outputting CV using these synths:

SynthDef (\trigger) {
	arg out = 0;
	var env = Env.step (1.asArray, SampleDur.ir.asArray);
	env = EnvGen.ar (env, doneAction: 2);
	Out.ar (out, env);
}.add;

SynthDef (\static_value) {
	arg out = 0, volts = 0, lag_time = 1, lag_on = 0;
	var sig, lag_sig;
	sig = Lag.kr (volts * 0.097, 0);
	sig = K2A.ar (sig);
	lag_sig = Lag3.ar (sig, lag_time);
	sig = SelectX.ar (lag_on, [ sig, lag_sig ]);
	Out.ar (out, sig);
}.add;

SynthDef (\ramp) {
	arg out = 0, start_value = 0, end_value = 1, time = 1, curve = 0;
	var env = Env.new ([ start_value, end_value ], time, curve);
	env = EnvGen.ar (env, doneAction: 2);
	Out.ar (out, env);
}.add;

the example I posted above used this code for sequencing:

(
var change_func = {
	var new_note_array, new_lag_array;
	new_note_array = (0..11).euclidify (7, 5).postln.euclidify (5, 5.rand).scramble;
	new_note_array = new_note_array + ([ 12 ] ++ (0!4)).scramble;
	new_lag_array = 2 + 10.rand;
	new_lag_array = Array.euclid (new_lag_array, 1 + new_lag_array.rand.half.floor, new_lag_array.rand).postln;
	Pbindef (\p_3,
		\note_array, new_note_array,
		\lag_on_array, new_lag_array,
	);
	Pbindef (\p_5,
		\on_array, Array.euclid (8, 3, 8.rand),
	);
};

Pbindef (\changer,
	\type, \set,
	\delta, 16,
	\change_func, Pfunc { change_func.value },
);

// bld
Pbindef (\bld).clear;
Pbindef (\bld,
	\delta, 1,
	\volts, Pseq ((-4!16) ++ (0!16), inf) / 12,
);

// chan 0
Pdef (\bld_trig) {
	Pbind (
		\instrument, \trigger,
		\out, 0,
	);
};
Pdef (\chan_0) { Pbindef (\bld_trig) <> Pbindef (\bld) };

// chan 1
Pdef (\bld_cv) {
	Pmono (\static_value,
		\out, 1,
	);
};
Pdef (\chan_1) { Pbindef (\bld_cv) <> Pbindef (\bld) };

// chan 2
Pbindef (\p_2).clear;
Pbindef (\p_2,
	\out, 2,
	\instrument, \ramp,
	\delta, 16,
	\curve, 16,
	\time, Pkey (\delta) * Pfunc { TempoClock.beatDur },
	\start_value, 0,
	\end_value, 1,
);
Pdef (\chan_2) { Pbindef (\p_2) };

// chan 3
Pbindef (\p_3).clear;
Pbindef (\p_3,
	\type, \set,
	\delta, 1 / 3,
	\out, 3,
	\note_array, [ 0, 3, 7, 10 ],
	\volts, Pkey (\note_array).composeBinaryOp (\wrapAt, Pseries ()) / 12,
	\lag_time, Pkey (\delta) * Pfunc { TempoClock.beatDur },
	\lag_on_array, [ 1, 0, 0, 0 ],
	\lag_on, Pkey (\lag_on_array).composeBinaryOp (\wrapAt, Pseries ()),
);
Pdef (\chan_3) { Pmono (\static_value) <> Pbindef (\p_3) };

// chan 4
Pbindef (\p_4).clear;
Pbindef (\p_4,
	\out, 4,
	\instrument, \ramp,
	\delta, 1,
	\start_value, Pwhite (-1.0, 1.0),
	\end_value, Pwhite (-1.0, 1.0),
	\time, Pkey (\delta) * Pfunc { TempoClock.beatDur },
);
Pdef (\chan_4) { Pbindef (\p_4) };

// chan 5
Pbindef (\p_5).clear;
Pbindef (\p_5,
	\out, 5,
	\instrument, \ramp,
	\delta, 1,
	\on_array, Array.euclid (8, 3, 0),
	\ramp_on, Pkey (\on_array).composeBinaryOp (\wrapAt, Pseries ()),
	\start_value, 1 * Pkey (\ramp_on),
	\end_value, 1 * Pkey (\ramp_on),
	\time, Pkey (\delta) * Pfunc { TempoClock.beatDur },
);
Pdef (\chan_5) { Pbindef (\p_5) };

TempoClock.tempo_ (107 / 60);
Pdef (\chan_0).play;
Pdef (\chan_1).play;
Pdef (\chan_2).play;
Pdef (\chan_3).play;
Pdef (\chan_4).play;
Pdef (\chan_5).play;
Pbindef (\changer).play;
)

but if you wanted to run it, you’d also need a few externals:

// http://cgm.cs.mcgill.ca/~godfried/publications/banff.pdf

+ SequenceableCollection {
	*euclid {
		arg length = 12, fill = 7, rotation = 0;
		var obj, euclid_func;
		euclid_func = {
			arg array_1, array_2;
			if (array_1.size > array_2.size) {
				array_2.do { |element, i|
					array_2[i] = array_1.pop ++ element;
				};
			} {
				array_1.do { |element, i|
					array_1[i] = element ++ array_2.pop;
				};
			};
			if (array_1.size > 0) {
				euclid_func.value (array_2, array_1);
			} { array_2.flatten };
		};
		obj = euclid_func.value ([ 1 ]!fill, [ 0 ]!(length - fill)).rotate (rotation);
		^obj
	}

	euclidify { | fill, rotation |
		var euc_array, new_array;
		new_array = [];
		euc_array = Array.euclid (this.size, fill, rotation);
		euc_array.do { | item, i |
			if (item.asBoolean) {
				new_array = new_array.add (this[i]);
			};
		};
		^new_array;
	}
}

#49

Thank you @capogreco,
I will have a deeper look into your code later.

Just one more quick practical question,
how do you make the connection from your laptop to the es-8,
is there an external soundcard in between or is that direct lineout from laptop?
( Sorry, it wasn’t immediately clear in the video )


#50

from the expert sleepers website:

The ES-8 is a USB 2.0 class-compliant audio interface in a Eurorack module, with DC-coupled inputs and outputs that can be used for both CVs and audio.

the module connects via USB-B:


#51

You can also connect it via adat to your audio interface. Works great.

Sam