{
   "name" : "FM Patterns",
   "author" : "eli.fieldsteel",
   "ancestor_list" : [],
   "description" : "Pattern-based frequency modulation synthesis sketches developed in connection with SuperCollider Tutorial 22 on YouTube: https://youtu.be/dLMSR2Kjq6Y",
   "labels" : [
      "rhythmic",
      "fm",
      "patterns",
      "endless",
      "synthesis",
      "pentatonic",
      "frequency modulation",
      "sequence",
      "minor"
   ],
   "is_private" : null,
   "id" : "1-5bA",
   "code" : "(\r\n//init/cleanup\r\ns.newBusAllocators;\r\n~vbus = Bus.audio(s, 2);\r\ns.freeAll;\r\n~players.do(_.stop);\r\n\r\ns.waitForBoot({\r\n\r\n\t//fm synth\r\n\tSynthDef(\\fm, {\r\n\t\targ freq=500, mRatio=1, cRatio=1,\r\n\t\tindex=1, iScale=5, cAtk=4, cRel=(-4),\r\n\t\tamp=0.2, atk=0.01, rel=3, pan=0,\r\n\t\tout=0, fx=0, fxsend=(-25);\r\n\t\tvar car, mod, env, iEnv;\r\n\t\t\r\n\t\t//index of modulation\r\n\t\tiEnv = EnvGen.kr(\r\n\t\t\tEnv(\r\n\t\t\t\t[index, index*iScale, index],\r\n\t\t\t\t[atk, rel],\r\n\t\t\t\t[cAtk, cRel]\r\n\t\t\t)\r\n\t\t);\r\n\t\t\r\n\t\t//amplitude envelope\r\n\t\tenv = EnvGen.kr(Env.perc(atk,rel,curve:[cAtk,cRel]),doneAction:2);\r\n\t\t\r\n\t\t//modulator/carrier\r\n\t\tmod = SinOsc.ar(freq * mRatio, mul:freq * mRatio * iEnv);\r\n\t\tcar = SinOsc.ar(freq * cRatio + mod) * env * amp;\r\n\t\t\r\n\t\tcar = Pan2.ar(car, pan);\r\n\r\n\t\t//direct out/reverb send\r\n\t\tOut.ar(out, car);\r\n\t\tOut.ar(fx, car * fxsend.dbamp);\r\n\t}).add;\r\n\r\n\t//reverb\r\n\tSynthDef(\\reverb, {\r\n\t\targ in=0, out=0, dec=4, lpf=1500;\r\n\t\tvar sig;\r\n\t\tsig = In.ar(in, 2).sum;\r\n\t\tsig = DelayN.ar(sig, 0.03, 0.03);\r\n\t\tsig = CombN.ar(sig, 0.1, {Rand(0.01,0.099)}!32, dec);\r\n\t\tsig = SplayAz.ar(2, sig);\r\n\t\tsig = LPF.ar(sig, lpf);\r\n\t\t5.do{sig = AllpassN.ar(sig, 0.1, {Rand(0.01,0.099)}!2, 3)};\r\n\t\tsig = LPF.ar(sig, lpf);\r\n\t\tsig = LeakDC.ar(sig);\r\n\t\tOut.ar(out, sig);\r\n\t}).add;\r\n\r\n\ts.sync;\r\n\r\n\tSynth(\\reverb, [\\in, ~vbus]);\r\n\r\n\ts.sync;\r\n\r\n\t//array of sequencers\r\n\t~players = [\r\n\r\n\t\t//bass\r\n\t\tPbind(\r\n\t\t\t\\instrument, \\fm,\r\n\t\t\t\\dur, 1/6,\r\n\t\t\t\\midinote, Pseq([\r\n\t\t\t\tPseq([[28,40]],32),\r\n\t\t\t\tPseq([[24,36]],24), Pseq([[33,45]],8),\r\n\t\t\t],inf) + Pwrand([0,12],[0.9,0.1],inf),\r\n\t\t\t\\mRatio, 2,\r\n\t\t\t\\index, 1.5,\r\n\t\t\t\\iScale, Pseq([3,2.5,2,1],inf),\r\n\t\t\t\\atk, 0,\r\n\t\t\t\\rel, Pexprand(0.2,0.4,inf),\r\n\t\t\t\\amp, Pseq([Pgeom(0.28,-3.dbamp,4)],inf),\r\n\t\t\t\\pan, Pseq([-0.25,0.25],inf),\r\n\t\t\t\\out, 0,\r\n\t\t\t\\fx, ~vbus,\r\n\t\t\t\\fxsend, -20,\r\n\t\t).play,\r\n\r\n\t\t//lead\r\n\t\tPbind(\r\n\t\t\t\\instrument, \\fm,\r\n\t\t\t\\dur, 1/6,\r\n\t\t\t\\midinote, Pseq([Pfin(64, Pseq([64,67,69,71,74,76],inf))],inf),\r\n\t\t\t\\mRatio, Pwrand([0.5,1.5,2,3],[1,3,6,25].normalizeSum, inf),\r\n\t\t\t\\index, Pexprand(2,2.5),\r\n\t\t\t\\iScale, Pseq([Pgeom(1.2,1.2,6)],inf),\r\n\t\t\t\\atk, Pwrand([0,Pexprand(0.02,0.1,1)],[0.99,0.01],inf),\r\n\t\t\t\\rel, Pseq(Array.interpolation(64,0.03,0.25).mirror2,inf),\r\n\t\t\t\\cAtk, 1,\r\n\t\t\t\\cRel, Pseq(Array.interpolation(64,-4,3).mirror2,inf),\r\n\t\t\t\\amp, Pseq([Pfin(64, Pseq([Pgeom(0.13,-3.dbamp,6)],inf))],inf),\r\n\t\t\t\\pan, Pseq(Array.interpolation(64,0,1).lincurve(0,1,0,1,8),inf) * Pseq([1,-1],inf),\r\n\t\t\t\\out, 0,\r\n\t\t\t\\fx, ~vbus,\r\n\t\t\t\\fxsend, -15,\r\n\t\t).play,\r\n\r\n\t\t//pad\r\n\t\tPbind(\r\n\t\t\t\\instrument, \\fm,\r\n\t\t\t\\dur, 1/6 * 32,\r\n\t\t\t\\midinote, Pseq([\r\n\t\t\t\t[40,52,57,59,62],\r\n\t\t\t\t[40,55,57,59,64],\r\n\t\t\t\t[40,52,57,59,62],\r\n\t\t\t\t[33,45,57,59,64],\r\n\t\t\t],inf),\r\n\t\t\t\\mRatio, 1,\r\n\t\t\t\\index, 1.5,\r\n\t\t\t\\iScale, Pseq([2,4],inf),\r\n\t\t\t\\atk, 1/6 * 16,\r\n\t\t\t\\rel, 1/6 * 24,\r\n\t\t\t\\cAtk, 0,\r\n\t\t\t\\cRel, 0,\r\n\t\t\t\\amp, 0.027,\r\n\t\t\t\\out, 0,\r\n\t\t\t\\fx, ~vbus,\r\n\t\t\t\\fxsend, -10,\r\n\t\t).play,\r\n\r\n\t\t//snare\r\n\t\tPbind(\r\n\t\t\t\\instrument, \\fm,\r\n\t\t\t\\dur, 1/6,\r\n\t\t\t\\freq, Pseq([\r\n\t\t\t\t\\,\\,\\,\\,1,\\,\\,\\,\r\n\t\t\t\t\\,\\,\\,\\,1,\\,\\,\\,\r\n\t\t\t\t\\,\\,\\,\\,1,\\,\\,\\,\r\n\t\t\t\t\\,\\,\\,\\,1,\\,\\,1,\r\n\t\t\t\t\\,\\,\\,\\,1,\\,\\,\\,\r\n\t\t\t\t\\,\\,\\,\\,1,\\,\\,\\,\r\n\t\t\t\t\\,\\,\\,\\,1,\\,\\,\\,\r\n\t\t\t\t\\,\\,\\,\\,1,1,1,1,\r\n\t\t\t],inf) * 411,\r\n\t\t\t\\cRatio, 45.9,\r\n\t\t\t\\mRatio, 1.5,\r\n\t\t\t\\index, 100,\r\n\t\t\t\\iScale, 1,\r\n\t\t\t\\atk, 0,\r\n\t\t\t\\rel, 0.1,\r\n\t\t\t\\cRel, -8,\r\n\t\t\t\\amp, Pseq([0.18,0.04,0.18,0.1],inf),\r\n\t\t\t\\pan, 0,\r\n\t\t\t\\out, 0,\r\n\t\t\t\\fx, ~vbus,\r\n\t\t\t\\fxsend, -12,\r\n\t\t).play,\r\n\r\n\t\t//kick\r\n\t\tPbind(\r\n\t\t\t\\instrument, \\fm,\r\n\t\t\t\\dur, 1/6,\r\n\t\t\t\\freq, 25,\r\n\t\t\t\\mRatio, 0.4,\r\n\t\t\t\\index, 2,\r\n\t\t\t\\iScale, 8,\r\n\t\t\t\\atk, 0,\r\n\t\t\t\\rel, 0.08,\r\n\t\t\t\\amp, Pseq([Pgeom(0.8,-2.dbamp,8)],inf),\r\n\t\t\t\\pan, Pseq([0.3,-0.3],inf),\r\n\t\t\t\\out, 0,\r\n\t\t\t\\fx, ~vbus,\r\n\t\t\t\\fxsend, -16,\r\n\t\t).play\r\n\t];\r\n});\r\n)\r\n\r\n//stop\r\n~players.do(_.stop);"
}
