{
   "labels" : [
      "phasemodulation",
      "fm",
      "pm"
   ],
   "id" : "1-5dl",
   "is_private" : null,
   "code" : "(\r\nSynthDef(\\pm4, {\r\n\r\n\tvar numops = 4;\r\n\tvar fb = LocalIn.ar(numops);\r\n\r\n\tvar gate = \\gate.kr(1);\r\n\tvar in_freq = \\freq.ar(261).lag(\\glis.kr(0));\r\n\tvar bend = \\bend.ar(0).midiratio;\r\n\tvar freqbend = in_freq * bend;\r\n\tvar freq = Vibrato.ar(freqbend, \\vrate.kr(6), \\vdepth.kr(0.000));\r\n\tvar detunehz = \\detunehz.kr(0);\r\n\tvar vel = \\vel.kr(1);\r\n\r\n\tvar car = numops.collect({arg i;\r\n\t\tvar num = i+1;\r\n\t\tvar ratio = ('op' ++ num ++ 'ratio').asSymbol;\r\n\t\tvar curve = ('op' ++ num ++ 'curve').asSymbol.kr(0);\r\n\t\tvar atk = ('op' ++ num ++ 'atk').asSymbol.kr(0.01);\r\n\t\tvar dec = ('op' ++ num ++ 'dec').asSymbol.kr(0.01);\r\n\t\tvar suslevel = ('op' ++ num ++ 'suslevel').asSymbol.kr(1);\r\n\t\tvar rel = ('op' ++ num ++ 'rel').asSymbol.kr(1);\r\n\t\tvar env = Env.adsr(\r\n\t\t\tattackTime:atk,\r\n\t\t\tdecayTime:dec,\r\n\t\t\tsustainLevel:suslevel,\r\n\t\t\treleaseTime:rel,\r\n\t\t\tcurve:curve\r\n\t\t).kr(gate:gate);\r\n\t\t\r\n\t\t[freq * ratio.kr(1) + Rand(detunehz.neg, detunehz), env]\r\n\t});\r\n\r\n\tvar mods = numops.collect({arg i;\r\n\t\tvar y = i + 1;\r\n\t\tnumops.collect({arg j;\r\n\t\t\tvar x = j + 1;\r\n\t\t\tvar key = ('m' ++ y ++ '_' ++ x).asSymbol;\r\n\t\t\tkey.kr(0);\r\n\t\t});\r\n\t});\r\n\r\n\tvar sig = numops.collect({arg i;\r\n\t\tvar num = i+1;\r\n\t\tvar freq = car[i][0].clip(20, 20000);\r\n\t\tvar index = mods[i];\r\n\t\tvar mod = (fb * index).sum;\r\n\t\tvar sig = SinOsc.ar(freq, mod.mod(2pi)) * car[i][1];\r\n\t\tvar coef = ('op' ++ num ++ 'coef').asSymbol.kr(0.5).clip(-1, 1);\r\n\t\tsig = OnePole.ar(sig, coef);\r\n\t\tsig;\r\n\t});\r\n\r\n\tsig = LeakDC.ar(sig);\r\n\r\n\tLocalOut.ar(sig);\r\n\r\n\t// set output level\r\n\tsig = sig * numops.collect({arg i;\r\n\t\tvar num = i + 1;\r\n\t\tvar key = ('op' ++ num).asSymbol;\r\n\t\tkey.kr(1);\r\n\t}).normalizeSum;\r\n\r\n\t// set panning\r\n\tsig = numops.collect({arg i;\r\n\t\tvar num = i + 1;\r\n\t\tvar key = ('op' ++ num ++ 'pan').asSymbol;\r\n\t\tPan2.ar(sig[i],\tkey.kr(0),\t1)\r\n\t}).sum;\r\n\r\n\tsig = BLowPass.ar(\r\n\t\tBHiPass.ar(sig,\r\n\t\t\t\\hpf.kr(20).clip(20, 18000),\r\n\t\t\t\\hpfres.kr(0).linlin(0, 1, 1, 0.001)\r\n\t\t),\r\n\t\t\\lpf.kr(20000).clip(20, 20000),\r\n\t\t\\lpfres.kr(0).linlin(0, 1, 1, 0.001)\r\n\t);\r\n\r\n\tsig = sig * AmpCompA.kr(freq) * \\amp.kr(0.1) * vel;\r\n\tsig = sig.softclip;\r\n\tDetectSilence.ar(sig, doneAction:Done.freeSelf);\r\n\r\n\tOut.ar(\\out.kr(0), sig);\r\n\r\n}).add;\r\n)\r\n\r\n(\r\nNdef(\\verb).play;\r\nNdef(\\verb).filter(1, {arg in;\r\n\tvar sig = HPF.ar(in, 220);\r\n\tFreeVerb2.ar(sig[0], sig[1], 1, 0.9, 0.5);\r\n}).set(\\wet1, 0.4);\r\n\r\nPdef(\\pm4, Pbind(\r\n\t\\instrument, \\pm4,\r\n\t\\out, Pfunc({Ndef(\\verb).bus}),\r\n\t\\detunehz, 1,\r\n\t\\vdepth, 0.003,\r\n\t\r\n\t// rhythm\r\n\t\\legato, 0.9,\r\n\t\\dur, 0.25,\r\n\t\\tempo, 1,\r\n\t\r\n\t// melody\r\n\t\\scale, Scale.dorian,\r\n\t\\degree, Pshuf([-1, 0, 2, 4, 6, 7], inf),\r\n\t\\octave, Pbjorklund(5, 8).linlin(0, 1, 3, Pseq([4, 5], inf)),\r\n\t\r\n\t// volume\r\n\t\\amp, 0.3,\r\n\t\\vel, Pseq([1, 0.5, 0.8, 0.7], inf),\r\n\t\r\n\t//////////////////////////////\r\n\t// operator 1\r\n\t\\op1, 1,\r\n\t\\op1ratio, 1,\r\n\t\\op1atk, 0.01,\r\n\t\\op1dec, 0.1,\r\n\t\\op1suslevel, 1,\r\n\t\\op1rel, 2,\r\n\t\\op1curve, -4,\r\n\t// one-pole coefficient\r\n\t\\op1coef, 0.2,\r\n\t\\op1pan, Pwhite(-0.3, 0.3),\r\n\t\r\n\t// operator 2\r\n\t\\op2, 0.3,\r\n\t\\op2ratio, 2,\r\n\t\\op2atk, 0.01,\r\n\t\\op2dec, 0.1,\r\n\t\\op2suslevel, 0.5,\r\n\t\\op2rel, Pkey(\\op1rel) * 0.5,\r\n\t\\op2curve, 2,\r\n\t// one-pole coefficient\r\n\t\\op2coef, 0.3,\r\n\t\\op2pan, Pwhite(-0.3, 0.3),\r\n\t\r\n\t// operator 3\r\n\t\\op3, 0,\r\n\t\\op3ratio, 3,\r\n\t\\op3atk, 0.01,\r\n\t\\op3dec, 0,\r\n\t\\op3suslevel, 0.7,\r\n\t\\op3rel, 2,\r\n\t\\op3curve, 4,\r\n\t// one-pole coefficient\r\n\t\\op3coef, 0.5,\r\n\t\\op3pan, 0,\r\n\t\r\n\t// operator 4\r\n\t\\op4, 0,\r\n\t\\op4ratio, 5,\r\n\t\\op4atk, 0.01,\r\n\t\\op4dec, 0.1,\r\n\t\\op4suslevel, 0.4,\r\n\t\\op4rel, 0.1,\r\n\t\\op4curve, -4,\r\n\t// one-pole coefficient\r\n\t\\op4coef, 0.7,\r\n\t\\op4pan, 0,\r\n\t\r\n\t//////////////////////////////\r\n\t// modulators\r\n\t// 0pi to 2pi seems to be most useful range\r\n\t\\m1_1, 0.01pi, //feedback\r\n\t\\m1_2, 0.2pi,\r\n\t\\m1_3, 0pi,\r\n\t\\m1_4, 0pi,\r\n\t\r\n\t\\m2_1, 0pi,\r\n\t\\m2_2, 0pi, //feedback\r\n\t\\m2_3, 0.2pi,\r\n\t\\m2_4, 0pi,\r\n\t\r\n\t\\m3_1, 0pi,\r\n\t\\m3_2, 0pi,\r\n\t\\m3_3, 0pi, //feedback\r\n\t\\m3_4, 0.3pi,\r\n\t\r\n\t\\m4_1, 1pi,\r\n\t\\m4_2, 0.1pi,\r\n\t\\m4_3, 1pi,\r\n\t\\m4_4, 0.5pi, //feedback\r\n\t\r\n\t\\lpf, 2000,\r\n\t\\hpf, 80\r\n));\r\n\r\nPdef(\\pm4).play;\r\n)",
   "author" : "david_morgan",
   "name" : "4 operator phase modulation synth",
   "ancestor_list" : [],
   "description" : "Note: you can configure more than 4 operators by changing the value of the numops variable."
}
