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