feat: example fm synth
This commit is contained in:
88
examples/fm_synthesis_env.scd
Normal file
88
examples/fm_synthesis_env.scd
Normal 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;
|
||||||
Reference in New Issue
Block a user