{
   "ancestor_list" : [],
   "description" : "Some sketches with wavetable synthesis patterns developed in connection with SuperCollider Tutorial 23 on YouTube: https://youtu.be/8EK9sq_9gFI",
   "author" : "eli.fieldsteel",
   "name" : "Wavetable Synthesis Patterns",
   "is_private" : null,
   "id" : "1-5bF",
   "code" : "(\r\n//cleanup\r\nPdef.all.do(_.clear);\r\nPbindef.all.do(_.clear);\r\n~wt_buf.do(_.free);\r\nt.stop;\r\nServerTree.remove(~add_reverb);\r\n\r\n//initialization\r\ns = Server.local;\r\nt = TempoClock.new(90/60).permanent_(true);\r\ns.newBusAllocators;\r\n~rbus = Bus.audio(s,2);\r\n\r\ns.waitForBoot({\r\n\r\n\t//10 wavetables with increasing complexity\r\n\t~wt_sig = 10.collect({\r\n\t\targ i;\r\n\r\n\t\t//random number of envelope segments\r\n\t\tvar numSegs = i.linexp(0,9,4,40).round;\r\n\r\n\t\tEnv(\r\n\t\t\t//env always begins and ends with zero\r\n\t\t\t//inner points are random from -1.0 to 1.0\r\n\t\t\t[0]++({1.0.rand}.dup(numSegs-1) * [1,-1]).scramble++[0],\r\n\r\n\t\t\t//greater segment duration variety in higher-index wavetables\r\n\t\t\t{exprand(1,i.linexp(0,9,1,50))}.dup(numSegs),\r\n\r\n\t\t\t//low-index wavetables tend to be sinusoidal\r\n\t\t\t//high index wavetables tend to have sharp angles and corners\r\n\t\t\t{[\\sine,0,exprand(1,20) * [1,-1].choose].wchoose([9-i,3,i].normalizeSum)}.dup(numSegs)\r\n\t\t).asSignal(1024);\r\n\t});\r\n\r\n\t//load into 10 buffers in wavetable format\r\n\t~wt_buf = Buffer.allocConsecutive(10, s, 2048, 1, {\r\n\t\targ buf, index;\r\n\t\tbuf.setnMsg(0, ~wt_sig[index].asWavetable);\r\n\t});\r\n\r\n\tSynthDef(\\osc, {\r\n\t\targ buf=0, freq=200, detune=0.2,\r\n\t\tamp=0.2, pan=0, out=0, rout=0, rsend=(-20),\r\n\t\tatk=0.01, sus=1, rel=0.01, c0=1, c1=(-1);\r\n\t\tvar sig, env, detuneCtrl;\r\n\t\tenv = EnvGen.ar(\r\n\t\t\tEnv([0,1,1,0],[atk,sus,rel],[c0,0,c1]),\r\n\t\t\tdoneAction:2\r\n\t\t);\r\n\r\n\t\t//array of eight Oscs with uniquely detune frequencies\r\n\t\t//and unique initial phase offsets\r\n\t\tdetuneCtrl = LFNoise1.kr(0.1!8).bipolar(detune).midiratio;\r\n\t\tsig = Osc.ar(buf, freq * detuneCtrl, {Rand(0,2pi)}!8);\r\n\r\n\t\tsig = Splay.ar(sig); //spread 8 signals over stereo field\r\n\t\tsig = LeakDC.ar(sig); //remove DC bias\r\n\t\tsig = Balance2.ar(sig[0], sig[1], pan, amp); //L/R balance (pan)\r\n\t\tsig = sig * env;\r\n\t\tOut.ar(out, sig);\r\n\t\tOut.ar(rout, sig * rsend.dbamp); //\"post-fader\" send to reverb\r\n\t}).add;\r\n\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\t//instantiate reverb and re-instantiate when cmd-period is pressed\r\n\t~add_reverb = {Synth(\\reverb, [\\in, ~rbus])};\r\n\tServerTree.add(~add_reverb);\r\n\ts.freeAll;\r\n\r\n\ts.sync;\r\n\r\n\t//background pad using simple wavetables\r\n\tPbindef(\\pad,\r\n\t\t\\instrument, \\osc,\r\n\t\t\\dur, Pwrand([1,4,6,9,12],[0.35,0.25,0.2,0.15,0.05],inf),\r\n\t\t\\atk, Pexprand(3,6),\r\n\t\t\\sus, 0,\r\n\t\t\\rel, Pexprand(5,10),\r\n\t\t\\c0, Pexprand(1,2),\r\n\t\t\\c1, Pexprand(1,2).neg,\r\n\t\t\\detune, Pfunc({rrand(0.15,0.4)}!3),\r\n\t\t\\buf, Prand(~wt_buf[0..3], inf),\r\n\t\t\\scale, Scale.minorPentatonic,\r\n\t\t\\degree, Pfunc({\r\n\t\t\t(-12,-10..12).scramble[0..rrand(1,3)]\r\n\t\t}),\r\n\t\t\\amp, Pexprand(0.05,0.07),\r\n\t\t\\pan, Pwhite(-0.4,0.4),\r\n\t\t\\out, 0,\r\n\t\t\\rout, ~rbus,\r\n\t\t\\rsend, -10,\r\n\t).play;\r\n\r\n\t//arpeggiated bass pulse using mid/high complexity wavetables\r\n\tPbindef(\\pulse,\r\n\t\t\\instrument, \\osc,\r\n\t\t\\dur, Pseq([\r\n\t\t\tPstutter(24,Pseq([1/4],1)),\r\n\t\t\tPrand([1,2,4,6,12],1)\r\n\t\t],inf),\r\n\t\t\\atk, 0.001,\r\n\t\t\\sus, 0,\r\n\t\t\\rel, Pexprand(0.4,1),\r\n\t\t\\c0, 0,\r\n\t\t\\c1, Pwhite(5,10).neg,\r\n\t\t\\detune, 0.3,\r\n\t\t\\buf, Prand(~wt_buf[4..9], inf),\r\n\t\t\\scale, Scale.minorPentatonic,\r\n\t\t\\degree, Pseq([Prand([-15,-10,-5],24), Pseq([\\],1)],inf)\r\n\t\t+ Pstutter(25,Pwrand([0,2,-1],[0.78,0.1,0.12],inf)),\r\n\t\t\\amp, Pseq([Pgeom(0.45,-1.dbamp,25)],inf),\r\n\t\t\\pan, Pwhite(0.01,0.3) * Pseq([1,-1],inf),\r\n\t\t\\out, 0,\r\n\t\t\\rout, ~rbus,\r\n\t\t\\rsend, -10,\r\n\t).play(t, quant:1);\r\n\r\n\t//minimal melody using simple wavetables\r\n\tPbindef(\\melody,\r\n\t\t\\instrument, \\osc,\r\n\t\t\\dur, Prand([\r\n\t\t\tPseq([Prand([12,16,20]),2,1.5,0.5],1),\r\n\t\t\tPseq([Prand([12,16,20]),1.5,1,1.5],1),\r\n\t\t],inf),\r\n\t\t\\atk, 0.01,\r\n\t\t\\sus, 0.3,\r\n\t\t\\rel, 1.5,\r\n\t\t\\c0, -2,\r\n\t\t\\c1, -2,\r\n\t\t\\detune, Pexprand(0.18,0.25),\r\n\t\t\\buf, Pwrand([\r\n\t\t\tPseq([~wt_buf[0]],4),\r\n\t\t\tPseq([~wt_buf[1]],4),\r\n\t\t\tPseq([~wt_buf[2]],4),\r\n\t\t],[9,3,1].normalizeSum,inf),\r\n\t\t\\midinote, Pxrand([\r\n\t\t\tPseq([\\,67,60,Prand([58,70,\\])],1),\r\n\t\t\tPseq([\\,67,58,Prand([57,63,\\])],1),\r\n\t\t\tPseq([\\,70,72,Prand([65,79,\\])],1)\r\n\t\t],inf),\r\n\t\t\\amp, Pseq([0,0.18,0.24,0.28],inf),\r\n\t\t\\out, 0,\r\n\t\t\\rout, ~rbus,\r\n\t\t\\rsend, -6,\r\n\t).play(t, quant:1);\r\n\r\n\t//infinite sequence of various finite rhythmic patterns\r\n\t//all very short envelopes\r\n\tPdef(\\rhythms,\r\n\t\tPwrand([\r\n\t\t\tPbind(\r\n\t\t\t\t\\instrument, \\osc,\r\n\t\t\t\t\\dur,Pseq([1/8],4),\r\n\t\t\t\t\\freq, Pstutter(4, Prand([\r\n\t\t\t\t\tPexprand(10000,20000,1),\r\n\t\t\t\t\tPexprand(100,200,1),\r\n\t\t\t\t\tPexprand(1,2,1)\r\n\t\t\t\t],inf)),\r\n\t\t\t\t\\detune, 100,\r\n\t\t\t\t\\buf, Pstutter(4, Prand(~wt_buf[5..9],inf)),\r\n\t\t\t\t\\atk, 0,\r\n\t\t\t\t\\sus, 0,\r\n\t\t\t\t\\rel, Pstutter(2, Pexprand(0.01,0.06)),\r\n\t\t\t\t\\c1, exprand(8,20).neg,\r\n\t\t\t\t\\amp, Pgeom(0.9, -6.dbamp, 4) * Pstutter(4,Pexprand(0.3,1)),\r\n\t\t\t\t\\pan, Pwhite(-0.6,0.6),\r\n\t\t\t\t\\out, 0,\r\n\t\t\t\t\\rout, ~rbus,\r\n\t\t\t\t\\rsend, Pwhite(-30,-15),\r\n\t\t\t),\r\n\r\n\t\t\tPbind(\r\n\t\t\t\t\\instrument, \\osc,\r\n\t\t\t\t\\dur, Pseq([1/4],2),\r\n\t\t\t\t\\freq, Pstutter(2, Pexprand(1,200)),\r\n\t\t\t\t\\detune, Pstutter(2, Pexprand(1,100)),\r\n\t\t\t\t\\buf, Pstutter(2, Prand(~wt_buf[8..9],inf)),\r\n\t\t\t\t\\atk, 0,\r\n\t\t\t\t\\sus, 0,\r\n\t\t\t\t\\rel, Pstutter(2, Pexprand(0.01,0.2)),\r\n\t\t\t\t\\c1, -10,\r\n\t\t\t\t\\amp, Pgeom(0.4, -3.dbamp, 2)  * Pexprand(0.4,1),\r\n\t\t\t\t\\out, 0,\r\n\t\t\t\t\\rout, ~rbus,\r\n\t\t\t\t\\rsend, Pwhite(-30,-15),\r\n\t\t\t),\r\n\r\n\t\t\tPbind(\r\n\t\t\t\t\\instrument, \\osc,\r\n\t\t\t\t\\dur, Pseq([1/2,1/4,1/4],1),\r\n\t\t\t\t\\freq, Pstutter(6, Pexprand(1000,2000)),\r\n\t\t\t\t\\detune, 100,\r\n\t\t\t\t\\buf, Pstutter(6, Prand(~wt_buf[2..5],inf)),\r\n\t\t\t\t\\atk, 0,\r\n\t\t\t\t\\sus, Pseq([1/3,0,0],1),\r\n\t\t\t\t\\rel, Pseq([0,Pexprand(0.01,0.3,2)],1),\r\n\t\t\t\t\\c1, -12,\r\n\t\t\t\t\\amp, Pseq([0.1,0.5,0.3],1),\r\n\t\t\t\t\\out, 0,\r\n\t\t\t\t\\rout, ~rbus,\r\n\t\t\t\t\\rsend, Pwhite(-30,-18),\r\n\t\t\t),\r\n\r\n\t\t\tPbind(\r\n\t\t\t\t\\instrument, \\osc,\r\n\t\t\t\t\\dur, Pseq([1/4,1/2,1/4],1),\r\n\t\t\t\t\\freq, Pstutter(6, Pexprand(1000,2000)),\r\n\t\t\t\t\\detune, 100,\r\n\t\t\t\t\\buf, Pstutter(6, Prand(~wt_buf[2..5],inf)),\r\n\t\t\t\t\\atk, 0,\r\n\t\t\t\t\\sus, Pseq([0,1/3,0],1),\r\n\t\t\t\t\\rel, Pseq([Pexprand(0.01,0.3,1),0,Pexprand(0.01,0.3,1)],1),\r\n\t\t\t\t\\c1, -12,\r\n\t\t\t\t\\amp, Pseq([0.5,0.1,0.4],1),\r\n\t\t\t\t\\out, 0,\r\n\t\t\t\t\\rout, ~rbus,\r\n\t\t\t\t\\rsend, Pwhite(-30,-18),\r\n\t\t\t),\r\n\r\n\t\t\tPbind(\r\n\t\t\t\t\\instrument, \\osc,\r\n\t\t\t\t\\dur, Pseq([1/6],6),\r\n\t\t\t\t\\freq, Pstutter(6, Pexprand(1,200)),\r\n\t\t\t\t\\detune, Pstutter(6, Pexprand(1,100)),\r\n\t\t\t\t\\buf, Pstutter(6, Prand(~wt_buf[8..9],inf)),\r\n\t\t\t\t\\atk, 0,\r\n\t\t\t\t\\sus, 0,\r\n\t\t\t\t\\rel, Pstutter(6, Pexprand(0.01,0.1)),\r\n\t\t\t\t\\c1, -10,\r\n\t\t\t\t\\amp, Pgeom(0.7, -4.dbamp, 6)  * Pexprand(0.4,1),\r\n\t\t\t\t\\out, 0,\r\n\t\t\t\t\\rout, ~rbus,\r\n\t\t\t\t\\rsend, Pwhite(-30,-18),\r\n\t\t\t),\r\n\r\n\t\t\tPbind(\r\n\t\t\t\t\\instrument, \\osc,\r\n\t\t\t\t\\dur, Prand([\r\n\t\t\t\t\tPseq([1/2],2),\r\n\t\t\t\t\tPseq([1],2),\r\n\t\t\t\t\tPseq([1,1/2,1/2],1),\r\n\t\t\t\t\tPseq([2],1),\r\n\t\t\t\t],1),\r\n\t\t\t\t\\freq, Pstutter(2, Pexprand(1,200)),\r\n\t\t\t\t\\detune, Pstutter(2, Pexprand(1,100)),\r\n\t\t\t\t\\buf, Pstutter(2, Prand(~wt_buf[8..9],inf)),\r\n\t\t\t\t\\atk, 0,\r\n\t\t\t\t\\sus, 0,\r\n\t\t\t\t\\rel, Pstutter(2, Pexprand(0.01,0.2)),\r\n\t\t\t\t\\c1, -10,\r\n\t\t\t\t\\amp, 0.5,\r\n\t\t\t\t\\out, 0,\r\n\t\t\t\t\\rout, ~rbus,\r\n\t\t\t\t\\rsend, Pwhite(-20,-10),\r\n\t\t\t),\r\n\r\n\t\t\tPbind(\r\n\t\t\t\t\\instrument, \\osc,\r\n\t\t\t\t\\dur, Prand([\r\n\t\t\t\t\tPseq([1/16],16),\r\n\t\t\t\t\tPseq([1/16],8)\r\n\t\t\t\t],1),\r\n\t\t\t\t\\freq, Pstutter(16,Pexprand(1000,20000,inf)),\r\n\t\t\t\t\\detune, 0,\r\n\t\t\t\t\\buf, Pstutter(16, Prand(~wt_buf[0..9],inf)),\r\n\t\t\t\t\\atk, 0,\r\n\t\t\t\t\\sus, 0,\r\n\t\t\t\t\\rel, Pexprand(0.02,0.04),\r\n\t\t\t\t\\c1, -4,\r\n\t\t\t\t\\amp, 0.13,\r\n\t\t\t\t\\pan, Pseq([1,-1],inf),\r\n\t\t\t\t\\out, 0,\r\n\t\t\t\t\\rout, ~rbus,\r\n\t\t\t\t\\rsend, -30,\r\n\t\t\t)\r\n\t\t],\r\n\t\t[40,18,3,3,15,25,5].normalizeSum, inf)\r\n\t).play(t,quant:1);\r\n});\r\n)\r\n\r\n//view wavetables\r\n~wt_sig.reverseDo(_.plot);\r\n\r\n(\r\n//can stop individually or all at once\r\nPdef(\\rhythms).stop;\r\nPbindef(\\melody).stop;\r\nPbindef(\\pad).stop;\r\nPbindef(\\pulse).stop;\r\n)",
   "labels" : [
      "rhythmic",
      "patterns",
      "endless",
      "dark",
      "synthesis",
      "pentatonic",
      "sequence",
      "minor",
      "wavetable",
      "wavetable synthesis",
      "futuristic",
      "dystopian"
   ]
}
