«FM bell and bass» by grirgz
on 16 Nov'17 01:43 inSynthdefs inspired by FM8
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109
(
SynthDef(\fmbell, { arg out=0, amp=0.1, gate=1, pan=0, freq=200;
var sig;
var sig1, sig2, sig3, sig4, sig5, sig6, sig7, sig8;
freq = freq * EnvGen.kr(Env([1,1.002,0.998,1],[0.1,0.8]), 1);
sig1 = SinOsc.ar(freq * 2.6706 + 0.13) * 2 + 1;
sig2 = SinOsc.ar(freq * 0.9998 * sig1);
sig3 = SinOsc.ar(freq * 2.6629 * sig1 + 2.04);
sig4 = LFCub.ar(freq * 0.9991 * sig1 + 2.14);
sig5 = SinOsc.ar(freq * 2.6656 * sig1 - 2);
sig6 = SinOsc.ar(freq * 1 * sig1 + 1.84);
//sig = sig2 + sig3 + sig4 + sig5 + sig6;
sig = [sig1, sig2, sig3, sig4, sig5, sig6] * DC.ar([0,0.5,0.5, 0.5,0.5,0.5]);
//sig.debug("sig");
//sig = sig /34;
sig = sig * EnvGen.ar(\adsr.kr( Env.adsr(0.01,0,1,2.1,1,-1) ),gate,doneAction:2);
sig = Pan2.ar(sig, pan + [ 0, -0.5, -0.5, 0.5, 0.5, 0], amp).sum;
Out.ar(out, sig);
}).add;
SynthDef(\chorus, { arg out=0, amp=0.1, gate=1, pan=0, freq=200;
var sig;
var in = InFeedback.ar(\inbus.kr(100), 2);
sig = LocalIn.ar(2) * \fb.kr(0.4);
sig = sig + in;
sig = DelayC.ar(sig, \maxdelay.ir(0.2), \delay.kr(0.0001) * ((0..7)/7 - 0.5 * \diff.kr(0.4001) + 1) * ( SinOsc.kr(\modfreq.kr(8.1)) * \modamp.kr(0.48) + 1 )).mean;
//sig = LPF.ar(sig, \dif.kr(7500));
LocalOut.ar(sig);
sig = LPF.ar(sig, \lpf.kr(15000));
sig = HPF.ar(sig, \hpf.kr(50));
sig = SelectX.ar(\mix.kr(0.5), [in, sig]);
sig = sig * EnvGen.ar(\adsr.kr( Env.adsr(0.01,0.1,0.8,0.1) ),gate,doneAction:2);
Out.ar(out, sig);
}).add;
SynthDef(\fmbass, { arg out=0, amp=0.1, gate=1, pan=0, freq=200;
var sig;
var sig1, sig2, sig3, sig4, sig5, sig6, sig7, sig8;
var env1, env2, env3, env4, env5, env6, env7, env8;
freq = freq / 4;
freq = freq * ((0..1)/1 - 0.5 * 0.0007 + 1);
env1 = EnvGen.kr(Env([0,1,0.051,0],[0.001,0.01,0.8], [4,-8]), 1);
env2 = EnvGen.kr(Env([0,1,0.051,0],[0.005,0.5,1.5], [0,-8], releaseNode:2), 1);
env3 = EnvGen.kr(Env([0,1,1,0],[0.01,0.01,0.2], [0,0,-4], releaseNode:2), gate);
env4 = EnvGen.kr(Env([0,1,0],[0.002,2.8], [0,-4]), 1);
env5 = EnvGen.kr(Env([0,1,1,0],[0.001,0.1,0.8], [4,0,-4], releaseNode:2), gate);
env6 = EnvGen.kr(Env([0,1,0],[0.001,3.0], [0,-4]), 1);
//freq = freq * EnvGen.kr(Env([1,1.002,0.998,1],[0.1,0.8]), 1);
sig1 = SinOsc.ar(freq * 11 + 0) * env1;
sig2 = SinOsc.ar(freq * 6 * ( sig1 * 2.5 + 1 )) * env2;
sig3 = SinOsc.ar(freq * 2 * 1 + 0) * env3;
sig4 = SinOsc.ar(freq * 1 * ( sig3 * 2.5 + 1 ) + 0) * env4;
sig5 = SinOsc.ar(freq * 1 * ( sig2 * 2.5 + 1 ) * (sig4 * 2.5 + 1)) * env5;
sig6 = SinOsc.ar(freq * 2) * env6;
//sig = sig2 + sig3 + sig4 + sig5 + sig6;
sig = [sig1, sig2, sig3, sig4, sig5, sig6] * DC.ar([0.0, 0.0, 0.0, 0.0, 0.5, 0.5]);
sig.debug("sig");
sig = sig /2;
sig = sig.flop.sum;
sig = sig * EnvGen.ar(\adsr.kr( Env.adsr(0.001,0,1,0.01, 1,-1) ),gate,doneAction:2);
sig = sig * AmpComp.kr(freq);
sig.debug("sigx");
sig = Pan2.ar(sig, pan + [ 0, 0, 0, 0, 0, 0], amp).sum;
Out.ar(out, sig);
}).add;
~fxbus = ~fxbus ?? { Bus.audio(s,2) };
~t = 135/4/60; TempoClock.default.tempo = ~t;
);
(
Pdef(\fm,
Ppar([
Pbind(
\instrument, \fmbass,
\note, Pseq([
0,5,2,3,1,-12,-5,1,-2,0,1,
],inf),
\legato, Pseq([
4,0,0,0, 0,0,1,1,
],inf)*0.9,
\isRest, Pfunc({ arg ev; ev[\legato] <= 0 }),
\dur, 1/4,
\amp, 0.2,
),
Pbind(
\instrument, \fmbell,
\note, Pseq([
2,9,5,-4,
],inf),
\octave, 4,
\sustain, 0.1,
\dur, 1,
\out, ~fxbus,
\amp, 0.1/2,
),
Pmono(\chorus,
\inbus, ~fxbus,
\delay, Pseq([
0.003,
0.00007,
],inf).stutter(8),
\dur, 1,
\amp, 0.1,
),
])
)).play;
)
reception
Thanks for sharing. An information : in the FM8 example "Bass Guitar ||" the modulation index of the operators are set to 50 ; in your example FmBass the modulation index are set to 2.5 + 1. What is the calculation to get that '?
Thank you.
I tried 0.5 but it doesn't sound the same, I don't understand how the 50 can be translated in SC, so by ear I assumed 50 could mean 2.5 and 100 mean 5. Note that I also forgot the envelopes on the first SynthDef, I left it as an exercise to the reader :p