diff --git a/examples/fm_synthesis_env.scd b/examples/fm_synthesis_env.scd new file mode 100644 index 0000000..29c4268 --- /dev/null +++ b/examples/fm_synthesis_env.scd @@ -0,0 +1,88 @@ +// 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; \ No newline at end of file