{
   "code" : "( // synth\r\nSynthDef(\\envio, {| out=0, freq=80, dur=1, atk=0.1, amp=0.8, curve= #[2,-3], blend=0.1, from=1, to=0, rot=0, rot_freq=0.5 |\r\n\tvar ha = Harmonics((3,5..13).choose.debug('sub freq size'));\r\n\tvar i = 6.exprand(26).asInteger.debug('oscillators');\r\n\tvar sig = Pan2.ar(\r\n\t\tEnvGen.ar(\r\n\t\t\tEnv(\r\n\t\t\t\t[0] ++ SinOsc.kr(\r\n\t\t\t\t\tNamedControl.kr(\\in_freq, Array.exprand(i-2,0.1,10)),\r\n\t\t\t\t\tNamedControl.kr(\\in_phase, Array.rand(i-2,0,pi)),\r\n\t\t\t\t\tNamedControl.kr(\\in_mul, Array.rand(i-2,0,1)),\r\n\t\t\t\t\tNamedControl.kr(\\in_add, 0!(i-2)),\r\n\t\t\t\t) ++ [0],\r\n\t\t\t\tNamedControl.kr(\\in_step, Array.exprand(i-1, 0.1,1.0).normalizeSum),\r\n\t\t\t\t\\sin\r\n\t\t\t).circle,\r\n\t\t\ttimeScale: freq.reciprocal\r\n\t\t\t* NamedControl.kr(\\sub_freq, ha.formant(ha.size - 1 / 2, ha.size).pow(1.exprand(2))).reciprocal,\r\n\t\t\tlevelScale: AmpCompA.kr(NamedControl.kr(\\sub_freq) * freq)\r\n\t\t\t* NamedControl.kr(\\sub_amp, ha.formant(ha.size - 1 / 2, ha.size).pow(1.0.exprand(3)).normalizeSum) // * Line.kr()\r\n\t\t),\r\n\t\tNamedControl.kr(\\sub_pan, Array.interpolation(ha.size,-1,1))\r\n\t\t* Line.kr(from,to,dur)\r\n\t).sum * EnvGen.kr(Env.perc(atk, dur-atk, amp, curve).blend(Env.sine(dur), blend), doneAction:2);\r\n\tsig = Rotate2.ar(sig[0],sig[1],rot*LFSaw.kr(rot_freq));\r\n\tOut.ar(out, LPF.ar(HPF.ar(sig,20),2e4));\r\n}).add.play\r\n)\r\n\r\n( // randomized usage\r\nvar lib = SynthDescLib.global,\r\nsize = lib.at(\\envio).controls.detect({|i| i.name == \\in_step }).numChannels,\r\nha = Harmonics(lib.at(\\envio).controls.detect({|i| i.name == \\sub_freq }).numChannels),\r\nkind = [0,1,2].choose.debug('kind');\r\nSynth(\\envio,[\r\n\tfreq:(40 * (pi/2).pow((0.25,0.5..8)).choose).debug('base freq'),\r\n\tdur:5.rrand(20.1).debug('dur'), rot:[0,1,0.1.exprand(0.9)].choose, rot_freq:0.1.exprand(10),\r\n\tcurve:[-2.rrand(2.0),-2.rrand(2.0)], from:[0,1].choose, to:[0,1].choose, \r\n\tsub_freq: [\r\n\t\tha.geom((1.05,1.06..1.3).choose.perform(0.5.coin.if({\\reciprocal},{\\value}))), // up or down\r\n\t\tha.formant(ha.size - 1 / 2, ha.size).pow(1.0.exprand(3)).pow([1,-1].choose), // up or down \r\n\t\tha.formant(ha.size - 1 / 2, ha.size).pow(1.0.exprand(3)).clump(ha.size + 1 / 2).pow([1,-1]).flatten // up and down\r\n\t][kind].debug('sub freq scale'),\r\n\tsub_amp: [ha.decay].addAll(ha.formant(ha.size - 1 / 2, ha.size).pow(1.0.exprand(3))!2).at(kind).normalizeSum.debug('sub freq amp'),\r\n\tsub_pan:[ha.decay - 1 * [1,-1]].addAll(Array.interpolation(ha.size,-1,1)!2).at(kind),\r\n\tin_step:Array.exprand(size-1,0.05,0.3).normalizeSum,\r\n\tin_freq:Array.exprand(size, [0.1,0.5].choose, [1,5,20].choose),\r\n\tin_mul:Array.rand(size,0.1,0.3), \r\n\t//in_mull:0!size\r\n\t//in_add:Array.rand(size,-1.0,1)\r\n])\r\n)\r\n\r\n\r\n( // noise pattern usage or supernova server performance test )\r\nvar lib = SynthDescLib.global,\r\nsize = lib.at(\\envio).controls.detect({|i| i.name == \\in_freq }).numChannels,\r\nha = Harmonics(lib.at(\\envio).controls.detect({|i| i.name == \\sub_freq }).numChannels);\r\nPparGroup(Pbind(*[\r\n\tinstrument:\\envio,\r\n\tin_freq:Ptuple({Pseq({Array.exprand(size, 1, 2)}!4,inf)}!2),\r\n\tin_mul:Ptuple({Pseq({Array.exprand(size, 0.1, 1)}!4,inf)}!2),\r\n\tin_step:Ptuple({Pseq({Array.exprand(size-1,0.05,0.3.rrand(1)).normalizeSum}!4,inf)}!2),\r\n\tsub_freq: Ptuple({Pseq([\r\n\t\tha.geom((1.05,1.06..1.3).choose.perform(0.5.coin.if({\\reciprocal},{\\value}))), // up or down\r\n\t\tha.formant(ha.size - 1 / 2, ha.size).pow(1.0.exprand(3)).pow([1,-1].choose), // up or down \r\n\t\tha.formant(ha.size - 1 / 2, ha.size).pow(1.0.exprand(3)).clump(ha.size + 1 / 2).pow([1,-1]).flatten // up and down\r\n\t],inf)}!2),\r\n\tsub_amp: Ptuple({Pseq([ha.decay].addAll(ha.formant(ha.size - 1 / 2, ha.size).pow(1.0.exprand(3))!2).collect({\r\n\t\t|i| i.normalizeSum\r\n\t}),inf)}!2),\r\n\tsub_pan: Ptuple({Pseq([ha.decay - 1 * [1,-1]].addAll(Array.interpolation(ha.size,-1,1)!2), inf)}!2),\r\n\tnote:Ptuple([\r\n\t\tPseq(Array.rand(2.rrand(8),0,11), inf),\r\n\t\tPseq(Array.rand(4.rrand(8),12,35), inf)\r\n\t]),\r\n\toctave:Ptuple(Pseq((3..7).sputter.scramble.mirror2,inf)!2),\r\n\tdelta:Prand([1/4,1,2,4,8].stutter.sputter.wrapExtend(16).scramble,inf),\r\n\t//delta:Pseq([4,8],inf),\r\n\t//delta:2,\r\n\tdur:Pfunc({ |e| e.delta * thisThread.clock.beatDur * 1.exprand(3) }),\r\n\tscale:Scale.choose,\r\n\t//curve:Ptuple(Pbrown(-2,2)!2),\r\n\tamp:Pseq([[0.4,0.4]],inf) * Pseq(Array.rand(16,0,1)/2+Array.rand(16,0.25,0.5),inf),\r\n\trot:Ptuple(Pstutter(Pwhite(1,8), Prand([0,1],inf))!2),\r\n\trot_freq:Ptuple(Pstutter(Pwhite(1,8), Pwhite(0.1,4))!2),\r\n\tblend:Ptuple(Pbrown(0.1,0.9)!2),\r\n\tfrom:Ptuple(Pstutter(Pwhite(1,8), Pwhite(0,1.0))!2),\r\n\tto:Ptuple(Pstutter(Pwhite(1,8), Pwhite(0,1.0))!2),\r\n\tcurve:Ptuple(Ptuple(Pbrown(-2,2,0.3)!2)!2)\r\n])).play(TempoClock(1));\r\n)",
   "id" : "1-4Qw",
   "is_private" : null,
   "labels" : [
      "noise",
      "experimental",
      "synth"
   ],
   "description" : "synthdef based on morphing cycled envelope",
   "ancestor_list" : [
      "1-4Q8"
   ],
   "author" : "vividsnow",
   "name" : "envio"
}
