// fm synthesis with 3 operators and as much envelopes ( SynthDef(\padoo_fm, { arg gate = 1, freq = 140, attack = 1, decay = 3, release = 1; var sig, env, mod1, mod2, mod3; // modulators mod1 = SinOsc.kr(freq) * Env([1, 10, freq, 40, 10], [0.1, attack, decay, release]).ar; mod2 = SinOsc.kr(0.5 * freq + mod1); mod3 = (SinOsc.kr(freq * 0.5) + mod2) * decay; // carrier sig = SinOsc.ar([freq, freq * 1.02] + mod3); sig = Splay.ar(sig); sig = sig.round(0.16); // some filter, also tied to amp enveloppe sig = RLPF.ar(sig, Env([100, 200, \ff.kr(4200), 1200, freq], [0, attack, decay, release]).ar, 0.8); sig = HPF.ar(sig, 120); // flangie sig = CombC.ar(sig, 0.1, SinOsc.ar(0.1).linlin(-1, 1, 0.009, 0.015), 0.1); // pack things together with a short delay sig = (sig + CombC.ar(sig, 0.2, LFNoise2.kr(0.05).linlin(-1, 1, 0.04, 0.2), 3)) * 0.2; env = EnvGen.ar(Env.asr(attack, decay, release), gate, doneAction: Done.freeSelf); sig = sig * env; sig = sig * \amp.kr(0.1); sig = Limiter.ar(sig); Out.ar(\out.kr(0), sig); }).add; // example effect chains SynthDef(\fx, { arg in; var sig, fx, releaser; sig = In.ar(in, 2); fx = sig.copy; fx = DelayC.ar(fx, 2, TRand.kr(0.25, \maxRelease.kr(2) * 0.3), 3); fx = GVerb.ar(fx, 200,); fx = LPF.ar(fx, 900); sig = (sig + fx) * 0.5; sig = Limiter.ar(sig * \amp.kr(1)); Out.ar(\out.kr(0), sig); }).add; ) ( var mixer, buf, r_padoo, r_grainoo; var buf = Buffer.readChannel(s, "/home/gator/Production/Samples/2023/space_perc_1.wav", channels: 0); mixer = Mixer(\main); mixer.addTrack(\padoo_fm); mixer[\padoo_fm].appendFX(\fx); mixer.addTrack(\grainoo); mixer[\grainoo].appendFX(\fx, [amp: 0.5]); r_padoo = r { loop { var time, note, deg, mul, attack; time = rrand(5, 12); attack = rrand(0.5, 3).round; deg = [2, 3, 5, 7].choose; mul = [1, 1.5, 2, 3].choose; note = [26, 30, 32, 38, 45].choose.midicps * mul * 2; [time, note, deg, mul, attack].postln; SynthUtils.playChordGated(\padoo_fm, time, (note + ([0, 3, 5] + deg)), [attack: attack], mixer[\padoo_fm].in, mixer[\padoo_fm].groupSynth); time.wait + rrand(1, attack); } }; r_grainoo = r { var amp = 0.25; s.bind( x = Synth(\grainoo, [buf: buf.bufnum, amp: 0.3, out: mixer[\grainoo].in], mixer[\grainoo].groupSynth); ); loop { x.set(\rate, rrand(0.5, 2).midiratio); x.set(\trig_rate, 0.1 * [26, 30, 32, 38, 45].choose.midicps * 2); x.set(\ff, exprand(200, 6000)); x.set(\gdur, rrand(0.1, 1)); x.set(\amp, if(0.7.coin, amp, 0)); rrand(0.1, 0.5).yield; } }; r { } ) Buffer.freeAll;