(
SynthDef("genChaos", { |out=0, freq=100, chaosRate=0.2, amp=0.1|
var sig = Gendy3.ar(
ampdist: LFNoise2.kr(chaosRate).range(0.1, 0.9),
durdist: chaosRate,
adparam: SinOsc.kr(0.21).range(0.1, 0.9),
minfreq: freq,
maxfreq: freq * 1.5,
ampscale: 0.02,
durscale: 0.02,
initCPs: 12,
knum: 11
).sum;
Out.ar(out, sig * amp);
}).add;
)
(
SynthDef("genFilter", { |in, out=0, amp=1|
var sig = In.ar(in, 2);
sig = RLPF.ar(
LeakDC.ar(sig),
freq: LFNoise2.kr(0.12).exprange(200, 4800).lag(0.3),
rq: LFNoise1.kr(0.15).range(0.002, 0.3)
);
Out.ar(out, sig * amp);
}).add;
)
(
SynthDef("genDistort", { |in, out=0, drive=4, wet=0.3|
var sig = In.ar(in, 2);
var clean = (sig * drive).tanh;
var distorted = clean.distort;
Out.ar(out, (clean + (distorted * wet)).softclip);
}).add;
)
(
SynthDef("genSpace", { |in, out=0, spread=1, amp=1|
var sig = In.ar(in, 2);
sig = NHHall.ar(sig, 1.0, modDepth: 0.2) * 0.5;
sig = SplayAz.ar(2, sig, spread: spread, center: LFNoise2.kr(0.1).range(-1,1));
Out.ar(out, sig * amp);
}).add;
)
(
SynthDef("genMaster", { |in, out=0, gate=1, amp=0.3|
var sig = In.ar(in, 2);
sig = HPF.ar(sig, 40);
sig = LPF.ar(sig, XLine.kr(40, 18000, 20));
sig = Limiter.ar(sig, -3.dbamp);
sig = sig * EnvGen.kr(Env.asr(4, 1, 8, \sin), gate, doneAction: 2);
Out.ar(out, sig * amp);
}).add;
)
// Create a group for ordered processing
~fxGroup = Group.new;
// Allocate audio buses (adjust number of channels as needed)
~chaosBus = Bus.audio(s, 2);
~filterBus = Bus.audio(s, 2);
~distortBus = Bus.audio(s, 2);
~spaceBus = Bus.audio(s, 2);
// Instantiate synths in processing order
~chaos = Synth("genChaos", [\out, ~chaosBus, \freq, 100, \amp, 0.2], ~fxGroup);
~filter = Synth.after(~chaos, "genFilter", [\in, ~chaosBus, \out, ~filterBus], ~fxGroup);
~distort = Synth.after(~filter, "genDistort", [\in, ~filterBus, \out, ~distortBus, \drive, 3], ~fxGroup);
~space = Synth.after(~distort, "genSpace", [\in, ~distortBus, \out, ~spaceBus, \spread, 0.7], ~fxGroup);
~master = Synth.after(~space, "genMaster", [\in, ~spaceBus, \amp, 0.3], ~fxGroup);
// To release gracefully
~master.set(\gate, 0);
~chaos.set(\chaosRate, 0); // Freeze modulation