Stochastic Synthesis Examples

Dear all,

Is there a topic dedicated to this technique with practical implementations in SuperCollider? I know there is a large bulk with plugins and methods to create this but are there any examples that actually show how the techniques behind and most importantly they “sound good”. For example, there is the Chaotic generators topic in help file so I am looking a “how to” special into the stochastic technique. For one thing, there is this (https://composerprogrammer.com/research/stochasticsynthesis.pdf) and Sergio Luque’s (Stochastic Composition and Synthesis, 16/17/18.12.2011, Barcelona | SuperCollider) work which is a good start but I am just curious if there is more apropos to the classes in SuperCollider and their practical applications around that show how to use them efficiently, that is, besides each one’s help file.

Cheers

K.

hey,

i recently have extracted some DemandEnvGen examples from the synthesis part of this github repo maybe they are of interest to you:

(
{|sdm=1, mod=0.005, from=9, to=12, min=0.1, max=0.3, amp=1|
	var sd = SampleDur.ir * sdm, hpf=40, mf=1.0;
	HPF.ar(
		DemandEnvGen.ar(
			Dseq([min, min.neg, [max.neg, max]], inf),
			sd * Dseq([Lag.kr(from), Lag.kr(to), Dbrown(from, to, to, from.neg,from)], inf)
		).fold2(SinOsc.ar(mod)) * mf * amp,
		hpf)
}.play;
)

(
{|sdm=1, repeats=32, from=8, to=30, min=0.1, max=0.9, amp=1.0|
		var sd = SampleDur.ir * sdm, mf=0.2;

		DemandEnvGen.ar(
			Dseq([
				Dseq([0, 0.5], repeats),
				Dseq([-0.2, 0.8], repeats/2),
				Dseq([-1.0, 1.0], Dwhite(repeats/32, repeats)),
				Dseq([-0.8, 0.1], repeats/16)
			], inf),
			Dseq([
				Dwhite(from, to, [repeats, repeats*0.5]),
				Dwhite(from/1.5, to/1.5, [repeats, repeats*2]),
				Dbrown(from/10, to/10, from/20, [repeats, repeats*0.25])
			], inf) * sd
		) * mf * amp;
}.play;
)

(
{|step=2, start=1, from=2, to=5, sdm=0.2, min=0.1, max=0.9, amp=1.0, brownStep=0.01|
	var iter = 2;
	var sd = SampleDur.ir * [sdm,sdm*1.1], mf=0.08;
	var levels = ({ Dseries(rrand(min.neg,max.neg), rrand(min,max), from*rrand(from,to)) } ! iter) ++
	({ Dbrown(rrand(min.neg,max.neg), rrand(min,max), brownStep, to*2) } ! iter);
	var times = { Dseries(rrand(start,start*2), rrand(step,step*2), rrand(from*5,to*4)) } ! (iter*2);

	DemandEnvGen.ar(
		Dseq(levels, inf),
		Dseq(times, inf) * sd
	) * mf * amp
}.play;
)

(
{|sdm=1, repeats=4, from=5, to=18, mod=60, amp=1.0|
	var length = 30;
	var sd = SampleDur.ir * sdm, mf=0.3;

	DemandEnvGen.ar(
		Dseq([Dseries(-1.0, [0.04,0.09], 30)], inf),
		Dseq([
			Dwhite(from, to, repeats),
			Dwhite(from/1.5, to*3, repeats)
		], inf) * sd
	).clip(SinOsc.ar(mod)) * mf * amp;
}.play;
)

(
{|sdm=0.15,modFreq=10, modFrom=5, modTo=25, amp=1.0|
		var sd = SampleDur.ir * sdm, mf =0.4;
		var size=5;
		var from=1;
		var to=25;

		HPF.ar(DemandEnvGen.ar(
			Dseq([1, [-1, 0.5]], inf),
			Dseq(Array.rand(size,from,to), inf) * sd
		).atan(SinOsc.ar(LFNoise0.ar(modFreq).range(modFrom, modTo))),40) * mf * amp;
	}.play;
)


(
{|sdm=0.15,modFreq=10, modFrom=5, modTo=25, fmfreq=100, fmhi=4000, amp=1.0, mf = 0.25|
	var size=5;
	var from= 20;
	var to=25;
	var sd = SampleDur.ir * sdm;
	var first = [1, [-1, 1.0]];
	var second = Array.rand(size,from,to);
	var seq = Dseq(second, inf);
	var snd = DemandEnvGen.ar(Dseq(first, inf), seq * sd
	).atan(SinOsc.ar(LFNoise0.ar(modFreq).range(modFrom, modTo))) * 0.5;

	var trig = Impulse.kr(10);
	var freq = Demand.kr(trig, 0, seq);
	var buena = Stepper.kr(trig, 0, 0, 10, 1);

	snd = snd + PMOsc.ar(LFCub.kr([freq, freq/2], 0, fmfreq * 0.2, fmfreq), fmhi, 0.5) * mf;
	snd = snd + (DemandEnvGen.ar(Dwhite(-0.9,0.9,1),seq * sd * 10 * 0.1));
	HPF.ar(snd, 40, amp)
}.play;
)

(
{|filtSpeed=10, filtCenter=200, sdm=1, modFreq=0.01, filtBw=3, amp=1.0, lpf=2500|
	var size=3;
	var from=1;
	var to=25;
	var a = 9;
	var b = 5;
	var min=0.1;
	var max=0.3;
	var sd = SampleDur.ir * sdm;
	var snd = DemandEnvGen.ar(
		Dseq([min, min.neg, [max.neg, max]], inf),
		Dwhite(sd * a, sd * b),
	).wrap2(SinOsc.ar([modFreq, modFreq * 1.1])) * 0.2;
	snd = SoftClipAmp8.ar(snd,10) * amp;
	HPF.ar(BBandStop.ar(snd, Lag.ar(LFNoise1.ar( [filtSpeed,filtSpeed*2] ).range(filtCenter * 0.2, filtCenter * 2), 0.05), filtBw));
}.play;
)
3 Likes

Thanks for this, tried to find some help about the library but only code, is there some information about interacting/controlling attributes of this.

Rehashing this topic since I posted it, I would be grateful for some feedback for the specs below.

Spec.add(\sdm, [1, 10]);
Spec.add(\dev, [1, 10]);
Spec.add(\mod, [0.1, 10.0]);
Spec.add(\from, [1, 9.0]);
Spec.add(\step, [0.1, 4.0]);
Spec.add(\to, [9.0, 12.0]);
Spec.add(\min, [0.01, 1.0]);
Spec.add(\max, [1, 2.0]);
Spec.add(\repeats, [1, 30]);
Spec.add(\modFrom, [1, 5]);
Spec.add(\modTo, [5, 25]);
Spec.add(\modFreq, [10, 100]);
Spec.add(\filtBw, [4, 8]);
Spec.add(\mf, [0.1, 1.0]);
Spec.add(\brownStep, [0.01, 1.0]);
Spec.add(\fmfreq, [10, 100]);
Spec.add(\filtCenter, [10, 200]);
Spec.add(\filtSpeed, [0.1, 10]);
Spec.add(\start, [0.1, 1.0]);
Spec.add(\fmhi, [100, 6000]);
Spec.add(\lpf, [20, 2500]);

I have a sketch of Sergio Luque’s extension to Xenakis’s Gendy, which concatenates different Gendy streams. It’s in C++ but not ready yet. There are some excess parameters to deal with to fit into an SC3 plugin, but if someone wants to try working on it, DM me.

I think I’ll make it a console jack app controlled by OSC for now.

1 Like

hey, im not really sure what kind of feedback you have in mind. You are free to set the ranges of your specs as you like.

I was wondering if the sounds I am getting are the most optimized given their specs above. If there is something that doesn’t look great for modulating the parameter with these specs.

i think you can just find out by trying different param ranges and see if you like the results

1 Like