{
   "ancestor_list" : [],
   "description" : "port of STK's Rhodey (yamaha DX7-style Fender Rhodes)",
   "name" : "FM Rhodes",
   "author" : "snappizz",
   "id" : "1-522",
   "is_private" : null,
   "code" : "/*\r\nFM Rhodes Synthesizer\r\n\r\nNative SuperCollider port of STK's Rhodey. This should be preferred over the StkInst version because:\r\n\r\n- It uses much less CPU.\r\n- It is easier to modify.\r\n- It doesn't require sc3-plugins or a correct setting of StkGlobals.\r\n- It's beginner-friendly because it uses only basic UGens: SinOsc, EnvGen, Mix, Pan2, Out.\r\n\r\n*/\r\n\r\n(\r\nSynthDef(\\rhodey_sc, {\r\n    |\r\n    // standard meanings\r\n    out = 0, freq = 440, gate = 1, pan = 0, amp = 0.1,\r\n    // all of these range from 0 to 1\r\n    vel = 0.8, modIndex = 0.2, mix = 0.2, lfoSpeed = 0.4, lfoDepth = 0.1\r\n    |\r\n    var env1, env2, env3, env4;\r\n    var osc1, osc2, osc3, osc4, snd;\r\n\r\n    lfoSpeed = lfoSpeed * 12;\r\n\r\n    freq = freq * 2;\r\n\r\n    env1 = EnvGen.ar(Env.adsr(0.001, 1.25, 0.0, 0.04, curve: \\lin));\r\n    env2 = EnvGen.ar(Env.adsr(0.001, 1.00, 0.0, 0.04, curve: \\lin));\r\n    env3 = EnvGen.ar(Env.adsr(0.001, 1.50, 0.0, 0.04, curve: \\lin));\r\n    env4 = EnvGen.ar(Env.adsr(0.001, 1.50, 0.0, 0.04, curve: \\lin));\r\n\r\n    osc4 = SinOsc.ar(freq * 0.5) * 2pi * 2 * 0.535887 * modIndex * env4 * vel;\r\n    osc3 = SinOsc.ar(freq, osc4) * env3 * vel;\r\n    osc2 = SinOsc.ar(freq * 15) * 2pi * 0.108819 * env2 * vel;\r\n    osc1 = SinOsc.ar(freq, osc2) * env1 * vel;\r\n    snd = Mix((osc3 * (1 - mix)) + (osc1 * mix));\r\n    snd = snd * (SinOsc.ar(lfoSpeed) * lfoDepth + 1);\r\n\r\n    // using the doneAction: 2 on the other envs can create clicks (bc of the linear curve maybe?)\r\n    snd = snd * EnvGen.ar(Env.asr(0, 1, 0.1), gate, doneAction: 2);\r\n    snd = Pan2.ar(snd, pan, amp);\r\n\r\n    Out.ar(out, snd);\r\n}).add;\r\n)\r\n\r\n(\r\nPbind(\r\n    \\instrument, \\rhodey_sc,\r\n    \\scale, Scale.mixolydian,\r\n    \\octave, 4,\r\n    \\root, 2,\r\n    \\legato, Pseq([0.9, 0.5, 0.5, 0.9, 0.9, 0.9, 0.9, 0.5, 1, 0.5, 1, 0.6, 0.3], inf),\r\n    \\dur, Pseq([1 + (1/3), 1/3, 1/3, 1/7, 6/7, 5/6, 1/6, 1/2, 2/6, 1/6, 2 + 1/2, 1, 1/2], inf),\r\n    \\degree, Pseq([\r\n        [0, 2, 4], 2, 4, 7, 8, 7, 0, [1, 3, 6], 5, [1, 3, 6], Rest(), [-1, 1, 3], [1, 3, 5],\r\n        [0, 2, 4], 2, 4, 8, 9, 7, 0, [1, 3, 6], 5, [1, 3, 6], Rest(), [-1, 1, 3], [1, 3, 5],\r\n    ], inf),\r\n    \\mix, 0.2,\r\n    \\modIndex, 0.2,\r\n    \\lfoSpeed, 0.5,\r\n    \\lfoDepth, 0.4,\r\n    \\vel, Pgauss(0.8, 0.1, inf),\r\n    \\amp, 0.3\r\n).play(TempoClock(1.5));\r\n)\r\n\r\n\r\n//////////////////////////////////////////////////////////////////\r\n// STK version (for comparison)\r\n\r\n// The following requires sc3-plugins, and a correctly set directory for Stk:\r\n{ StkGlobals.ar(1, 1, \"/home/nathan/src/stk-4.5.1/rawwaves/\") }.play;\r\n\r\n(\r\nSynthDef(\\rhodey_stk, {\r\n    |out = 0, freq = 440, gate = 1, vel = 0.8, amp = 0.1, modIndex = 0.2, mix = 0.2, lfoSpeed = 0.4, lfoDepth = 0.1|\r\n    var snd, env;\r\n    env = EnvGen.kr(Env.asr(0, 1, 0.1), gate, doneAction:2);\r\n    snd = StkInst.ar(Stk.at(\"Rhodey\"), freq, gate, vel, 0.5, [\r\n        // from https://ccrma.stanford.edu/software/stk/classstk_1_1Rhodey.html#details\r\n        2, modIndex * 128,\r\n        4, mix * 128,\r\n        11, lfoSpeed * 128,\r\n        1, lfoDepth * 128,\r\n        128, 128\r\n    ]) * env;\r\n    snd = Pan2.ar(snd, 0, amp);\r\n\r\n    Out.ar(out, snd);\r\n}).add;\r\n)",
   "labels" : [
      "fm",
      "instrument",
      "piano",
      "keyboard",
      "electric piano",
      "rhodes",
      "yamaha",
      "dx7",
      "stk"
   ]
}
