1
0

feat: example fm synth

This commit is contained in:
2026-01-11 11:14:36 +01:00
parent 6f90b4d1cf
commit 74df08f854

View File

@ -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;