{
   "name" : "In-between, longing",
   "author" : "jpdrecourt",
   "ancestor_list" : [],
   "description" : "This is the full code of the piece \"In-between, longing\" posted here for reference. For a brief explanation of some of the features of the code, please check my [blog post](http://drecourt.com/writings/the-code-of-in-between-longing/).\r\nYou can also listen to the piece on [Bandcamp](https://jpdrecourt.bandcamp.com/album/in-between-longing-seed-0262).\r\nUnfortunately, the sound files are copyrighted, so I can't share them here. \r\nFeel free to reach out through my [website](http://drecourt.com/about/) if you have any questions.",
   "labels" : [
      "algorithmic composition",
      "voice",
      "electroacoustic"
   ],
   "is_private" : null,
   "id" : "1-5e7",
   "code" : "(\r\ns.options.memSize_(2**18);\r\ns.reboot;\r\ns.waitForBoot {\r\n\tBuffer.freeAll(s);\r\n\tPdef.clear;\r\n\ts.freeAll;\r\n\tq.clear;\r\n\ts.sync;\r\n\tm = ProxySpace.new; // Mixer\r\n\t// Dictionaries\r\n\tv = (); // Variables\r\n\tf = (); // Functions\r\n\tp = (); // Patterns\r\n\tb = (); // Busses\r\n\tc = (); // Buffers\r\n\tg = (); // Groups\r\n\ti = (); // Synth (instruments)\r\n\tt = TempoClock.default;\r\n\ts.sync;\r\n\t// Various setup\r\n\tv[\\seed] = 262; // Random seed\r\n\tv[\\debug] = false; // Debugging messages\r\n\tv[\\mixerOn] = false; // Visual mixer\r\n\tv[\\record] = true; // Recording the output\r\n\t// Piece version\r\n\tthisThread.randSeed = v[\\seed];\r\n\t// Tempo variation\r\n\tt.tempo = 1;\r\n\tt.sched(0, {|beat| t.tempo = (60 + (12*sin((beat/200)*(2*pi))))/60; 1;});\r\n\tv[\\partDur] = 41;\r\n\t// Silence management\r\n\tv[\\silenceProb] = 0.2;\r\n\t////////////////////////////////////////////////////////////\r\n\t// SynthDefs\r\n\t//// Routing synth\r\n\tSynthDef(\\route2, {|in = 0, out = 0|\r\n\t\tOut.ar(out, In.ar(in, 2));\r\n\t}).add;\r\n\t//// Playing mono buffer\r\n\tSynthDef(\\bufRdPan, {|out = 0, bufnum = 0, pan = 0.0, amp = 1.0, start = 0.0, end = 1.0, fade = 0.001, rate = 1.0|\r\n\t\tvar sig, bStart, bEnd, env;\r\n\t\tbStart = start*BufFrames.ir(bufnum);\r\n\t\tbEnd = end*BufFrames.ir(bufnum);\r\n\t\tsig = BufRd.ar(1, bufnum, Phasor.ar(0, BufRateScale.ir(bufnum)*rate, bStart, bEnd, bStart), 0.0);\r\n\t\tenv = Env([0.0, 1.0, 1.0, 0.0], [fade, (BufDur.ir(bufnum)*(end - start)/rate) - (2.0*fade), fade]).ar(Done.freeSelf);\r\n\t\tenv = env*amp;\r\n\t\tsig = Pan2.ar(sig, pan);\r\n\t\tOut.ar(out, sig*env);\r\n\t}).add;\r\n\t//// Playing a mono buffer with a loop in the middle\r\n\tSynthDef(\\bufRdPanInnerLoop,  {|out = 0, bufnum = 0, pan = 0.0, amp = 1.0, lStart = 0.5, lWidth = 0.05, nLoop = 12|\r\n\t\tvar sig, envGen;\r\n\t\tenvGen = EnvGen.ar(\r\n\t\t\tEnv([0, lStart, lStart + lWidth, lStart, lStart + lWidth, 1]*BufFrames.ir(bufnum), [lStart, lWidth, lWidth, lWidth, 1 - lStart - lWidth]*BufDur.ir(bufnum),\r\n\t\t\t\treleaseNode: 4,\r\n\t\t\t\tloopNode: 2,\r\n\t\t\t\tcurve: 0\r\n\t\t\t),\r\n\t\t\tgate: Trig.ar(1, (lStart + (((2 * nLoop) + 1) * lWidth))*BufDur.ir(bufnum)),\r\n\t\t\tdoneAction: Done.freeSelf\r\n\t\t);\r\n\t\tsig = BufRd.ar(1, bufnum, envGen, 0);\r\n\t\tOut.ar(out, Pan2.ar(sig, pan, amp));\r\n\t}).add;\r\n\t//// Playing an expanding or contracting loop\r\n\tSynthDef(\\bufRdPanExpandLoop, {|out = 0, bufnum = 0, pan = 0.0 ,amp = 1.0, len = 2.0, sus = 1.0,  t_trig = 1, dir = 1, minWidth = 0.2, initPos = 0.2|\r\n\t\tvar sig, startPos, endPos, phase, fade, env;\r\n\t\tfade = (len - sus)/2.0;\r\n\t\tstartPos = Env(\r\n\t\t\tlevels: [(1 + dir), (1 + dir), (1 - dir)] / 2.0 * (initPos * (1 - (minWidth/2.0))),\r\n\t\t\ttimes: [fade, sus]\r\n\t\t).kr() * BufFrames.kr(bufnum);\r\n\t\tendPos = Env(\r\n\t\t\tlevels: ([(1 + dir), (1 + dir), (1 - dir)] / 2.0 * ((initPos * (1 + (minWidth/2.0)))- 1)) + 1,\r\n\t\t\ttimes: [fade, sus]\r\n\t\t).kr() * BufFrames.kr(bufnum);\r\n\t\tphase = Phasor.ar(0, BufRateScale.kr(bufnum), startPos, endPos);\r\n\t\tenv = Env(\r\n\t\t\tlevels: [0, 1, 1, 0],\r\n\t\t\ttimes: [fade, sus, fade],\r\n\t\t\tcurve: \\sin\r\n\t\t).kr(Done.freeSelf);\r\n\t\tsig = BufRd.ar(1, bufnum, phase)*env*amp;\r\n\t\tsig = Median.ar(7, sig);\r\n\t\tsig = Pan2.ar(sig, pan);\r\n\t\tOut.ar(out, sig);\r\n\t}).add;\r\n\t// FX generator\r\n\tf[\\makeFx] = {|name, func|\r\n\t\tSynthDef(name, {|out = 0, amp = 1.0, wet = 1.0|\r\n\t\t\tvar sig = In.ar(out, 2);\r\n\t\t\tsig = ((1 - wet)*sig) + (wet*SynthDef.wrap(func, prependArgs: [sig]));\r\n\t\t\tReplaceOut.ar(out, sig*amp);\r\n\t\t}).add;\r\n\t};\r\n\tf[\\makeFx].(\\companderFx, {|sig, thresh = 0.1, slope = 0.5, clamp = 0.02, relax = 0.4|\r\n\t\tsig = CompanderD.ar(sig, sig,\r\n\t\t\tthresh: thresh,\r\n\t\t\tslopeAbove: slope,\r\n\t\t\tclampTime: clamp,\r\n\t\t\trelaxTime: relax\r\n\t\t);\r\n\t\tsig\r\n\t});\r\n\t//// Masterchain FX\r\n\tf[\\makeFx].(\\masterChainFx, {|sig, thresh = 0.1, slope = 0.5, clamp = 0.02, relax = 0.4, hpfFreq = 50, gainDb = 0|\r\n\t\tsig = HPF.ar(sig, hpfFreq);\r\n\t\tsig = CompanderD.ar(sig, sig,\r\n\t\t\tthresh: thresh,\r\n\t\t\tslopeAbove: slope,\r\n\t\t\tclampTime: clamp,\r\n\t\t\trelaxTime: relax\r\n\t\t);\r\n\t\tsig = sig*gainDb.dbamp;\r\n\t\tsig = Limiter.ar(sig, -0.7.dbamp, 0.006);\r\n\t\tsig\r\n\t});\r\n\t//// EQ FX, hardcoded, easier but naughty ;)\r\n\tf[\\makeFx].(\\eqFx, {|sig|\r\n\t\tsig = BPeakEQ.ar(sig, freq: 2300, rq:1/1.1, db: 0.5);\r\n\t\tsig = BHiShelf.ar(sig, freq: 7910, db: 1.6, rs: 1.0);\r\n\t\tsig\r\n\t});\r\n\t//// Haas FX\r\n\tf[\\makeFx].(\\haasFx, {|sig, delay = 0.020, gate = 1|\r\n\t\tEnv([1, 1, 0], [0.1, 0.1], \\lin, 1).kr(gate: gate, doneAction: Done.freeSelf);\r\n\t\tsig[1] = DelayN.ar(sig[1], 0.1, delay);\r\n\t\tsig\r\n\t});\r\n\t//// Distorsion\r\n\tf[\\makeFx].(\\softclipFx, {|sig, preAmp = 1.0, postAmp = 1.0|\r\n\t\tvar oldSig = sig;\r\n\t\tsig = (sig * preAmp).softclip;\r\n\t\tsig = Balance.ar(sig, oldSig);\r\n\t\tsig * postAmp;\r\n\t});\r\n\t//// LFO panning with triangular wave\r\n\tf[\\makeFx].(\\triPanner, {|sig ,freq = 1.0, iphase = 0.0, lo = -1.0, hi = 1.0|\r\n\t\tsig = Balance2.ar(sig[0], sig[1], LFTri.kr(freq, iphase).range(lo, hi));\r\n\t\tsig\r\n\t});\r\n\t// Dust trigger for stutter\r\n\tSynthDef(\\varyDust, {|out = 0, trigLow = 0.2, trigHigh = 0.6, trigChangeF = 0.5|\r\n\t\tvar trig = Dust.kr(LFNoise0.kr(trigChangeF).range(trigLow, trigHigh));\r\n\t\tOut.kr(out, trig);\r\n\t}).add;\r\n\t// Invert the phase of one channel Fx\r\n\tf[\\makeFx].(\\chPhaseInvertFx , {|sig|\r\n\t\tvar sigLPF = LPF.ar(sig, 300);\r\n\t\tsig = sig - sigLPF;\r\n\t\tsig[1] = 0 - sig[1];\r\n\t\tsig = sig + ((sigLPF[0] + sigLPF[1])/2);\r\n\t});\r\n\t// Wavetable reader with bell type sound\r\n\tSynthDef(\\wavetableBell, {|out = 0, freq = 200, t_trig = 1, firstBufnum, lastBufnum, release = 0.5, amp = 0.8, pan = 0, attack = 0.01, rq = 1.0, curve = -4|\r\n\t\tvar env, sig, theBuf;\r\n\t\tenv = Env.perc(attackTime: attack, releaseTime: release, curve: curve).kr(gate: t_trig);\r\n\t\ttheBuf = Env([0, 0.9999], [release + attack]).kr(gate:t_trig).linlin(0, 1, firstBufnum, lastBufnum);\r\n\t\tsig = VOsc.ar(theBuf, freq);\r\n\t\tsig = BPF.ar(sig, freq, rq, 1/rq.sqrt);\r\n\t\tOut.ar(out, Pan2.ar(sig, pan, amp*env));\r\n\t\tEnv([1, 1], [release + attack]*1.2).kr(gate: t_trig, doneAction: Done.freeSelf);\r\n\t}\r\n\t).add;\r\n\t// Bad radio Fx\r\n\tf[\\makeFx].(\\badRadioFx, {|sig, freq = 1100, staticWet = 0.4, noise = 0.05, rq = 0.6|\r\n\t\tvar hum, dustNoise, staticNoise, humFreq, numHarms, dcSig;\r\n\t\t// Radio static (inspired by http://sccode.org/1-4Wu)\r\n\t\tnumHarms = 7;\r\n\t\thumFreq = 100;\r\n\t\thum = Array.fill(numHarms, {|i| SinOsc.ar( (i+1) * humFreq, 0, 1/numHarms)});\r\n\t\thum = hum.sum;\r\n\t\tdustNoise = Dust2.ar(LFNoise1.ar(0.5).range(1000,15000)); // Dust or Dust2 ?\r\n\t\tstaticNoise = hum * dustNoise * LFNoise1.ar(1).range(0.8, 1.2);\r\n\t\t// Add DC parasites\r\n\t\tdcSig = Dust2.ar(LFNoise1.ar(5).exprange(500, 2000))*noise*Env([0, 1, 0], [0, 3], \\exp, releaseNode: 1).kr(gate: Trig.kr(DetectSilence.kr(A2K.kr(sig[0]), -30.dbamp), 0.001));\r\n\t\t// Add the static noise (Convolution)\r\n\t\tsig = SelectX.ar(staticWet, [sig, Convolution.ar(sig + dcSig, staticNoise)]);\r\n\t\t// Speaker effect\r\n\t\tsig = BPF.ar(sig, freq, rq, 1/(rq.sqrt));\r\n\t\tsig = (sig*2).distort*0.5;\r\n\t\tsig\r\n\t});\r\n\t// Random delay on the right channel Fx\r\n\tf[\\makeFx].(\\rndDelayRightFx, {|sig, changeFreq = 0.5|\r\n\t\tvar time, lastTime, delayedTime, slope;\r\n\t\ttime = LFNoise0.kr(changeFreq, 2.5, 2.5);\r\n\t\tlastTime = LastValue.kr(time);\r\n\t\tdelayedTime = DelayN.kr(time, 0.03, 0.03);\r\n\t\tsig[1] = SelectX.ar(EnvGen.kr(Env([0, 0, 0, 1], [0.02, 0.02, 0.02], \\sine), Changed.kr(time)),\r\n\t\t\t[DelayN.ar(sig[1], 5, lastTime),\r\n\t\t\t\tDelayN.ar(sig[1], 5, delayedTime)]);\r\n\t\tsig\r\n\t});\r\n\t// Switch left and right channel randomly Fx\r\n\tf[\\makeFx].(\\switchLRFx, {|sig, switchFreq = 0.1|\r\n\t\tsig = SelectX.ar(Lag3.kr(LFClipNoise.kr(switchFreq)).linlin(-1, 1, 0, 1), [[sig[0], sig[1]], [sig[1], sig[0]]]);\r\n\t\tsig\r\n\t});\r\n\t// Stutter Fx\r\n\tf[\\makeFx].(\\stutterFx, {|sig, bufLen = 20, trigIn, maxLen = 0.25|\r\n\t\tvar rBuf, start, stop, trig, phase, stutterDur, d;\r\n\t\t// Create the buffer\r\n\t\trBuf = LocalBuf(s.sampleRate*bufLen, 2).clear;\r\n\t\t// Record the incoming sound\r\n\t\tBufWr.ar(sig, rBuf, Phasor.ar(1, BufRateScale.ir(rBuf), 0.0, BufFrames.ir(rBuf)));\r\n\t\t// Trigger the buffer repetition\r\n\t\ttrig = In.kr(trigIn);\r\n\t\td = Dwhite(0.0, 1.0);\r\n\t\t// Extract from the buffer\r\n\t\tstart = Demand.kr(trig, 0, d);\r\n\t\tstop = (start + ((Demand.kr(trig, 0, d))*maxLen)).min(1.0);\r\n\t\tstutterDur = BufDur.ir(rBuf)*(stop - start);\r\n\t\t// Read the buffer\r\n\t\tphase = Env(\r\n\t\t\tlevels: [0, start*BufFrames.ir(rBuf), stop*BufFrames.ir(rBuf)],\r\n\t\t\ttimes: [0, stutterDur]).ar(gate: trig);\r\n\t\tsig = BufRd.ar(2, rBuf, phase);\r\n\t\tsig = sig*Env([0, 0, 1, 1, 0], [0, 0.001, inf, 0.001], releaseNode: 3).kr(gate: Trig.kr(trig, stutterDur));\r\n\t\t// Scramble\r\n\t\tsig = SelectX.ar(Env([1, 1, 0], [inf, 0.1], releaseNode: 1).kr(gate: Trig.kr(trig, LFNoise0.kr(0.1).range(0.0, 2.0))),\r\n\t\t\t[sig, DelayC.ar(sig, 1.0, LFNoise0.ar(8).range(0.0, 1.0))]);\r\n\t\tsig\r\n\t});\r\n\t// Convolution reverb with mono IR, and Haas delay to give a sense of space\r\n\tf[\\makeFx].(\\convRevFx8192, {|sig, irSpectrum, mul, haas|\r\n\t\t// Convolution reverb with mono\r\n\t\tsig = PartConv.ar(sig, 8192, irSpectrum, mul);\r\n\t\tsig[1] = DelayN.ar(sig[1], haas, haas);\r\n\t\tsig\r\n\t});\r\n\t// Changing Echo Fx\r\n\tf[\\makeFx].(\\changingEchoFx, {|sig, send = 0.4, slope = 1.0, time = 10, decay = 5.0, gate = 1|\r\n\t\tvar mul;\r\n\t\tmul = (Line.kr(0, send, time)*slope) + ((1 - slope)/2*send);\r\n\t\tsig = AllpassN.ar(sig*mul, 0.2, 0.2, decay, 1.0, sig);\r\n\t\tsig = sig*Env([1, 1, 0], [1, decay*1.5], \\lin, 1).kr(gate: gate, doneAction: Done.freeSelf);\r\n\t\tsig\r\n\t});\r\n\t// Band Pass filter Fx\r\n\tf[\\makeFx].(\\bpfFx, {|sig, gate = 1, freq = 850, rq = 2|\r\n\t\tsig = BPF.ar(sig, freq, rq, 1/rq.sqrt);\r\n\t\tsig = sig*Env([1, 1, 0], [1, 4], \\lin, 1).kr(gate: gate, doneAction: Done.freeSelf);\r\n\t\tsig\r\n\t});\r\n\ts.sync;\r\n\t// High pass filter Fx\r\n\tf[\\makeFx].(\\hpfFx, {|sig, gate = 1, freq = 1000|\r\n\t\tsig = HPF.ar(sig, freq);\r\n\t\tsig = sig*Env([1, 1, 0], [1, 4], \\lin, 1).kr(gate: gate, doneAction: Done.freeSelf);\r\n\t\tsig\r\n\t});\r\n\t// Guts Fx\r\n\tf[\\makeFx].(\\gutsFx, {|sig, freq = 150, rq = 0.1|\r\n\t\tsig = Mix.ar(Array.fill(7, {|i| CombL.ar(sig, 0.2, LFNoise1.kr(0.1*((LFTri.kr(0.01, 0, 4.9, 5)*i) + 1), 0.08, 0.1)/((i + 1)), 2)*0.5 }));\r\n\t\t4.do({ sig = AllpassN.ar(sig, 0.1, [LFNoise1.kr(0.1.rand, 0.04, 0.05), LFNoise1.kr(0.1.rand, 0.04, 0.05)], 5) });\r\n\t\tsig = BPF.ar(sig, freq, rq);\r\n\t\tsig\r\n\t});\r\n\t// MultiDelay Fx\r\n\tf[\\makeFx].(\\multiDelayFx, {|sig, combDelay = 1.7, allpassDelay = 2.5, decayTime = 5.0|\r\n\t\tvar n, harm, amps, ring;\r\n\t\tsig = CombN.ar(AllpassN.ar(sig, allpassDelay, allpassDelay, decayTime, ), combDelay, combDelay, decayTime);\r\n\t\tsig\r\n\t});\r\n\t// Wash Reverb Fx\r\n\tf[\\makeFx].(\\washReverbFx, { |sig, gate = 1.0|\r\n\t\t// From 17_Delays_reverbs\r\n\t\tvar z, y;\r\n\t\tz = DelayN.ar(HPF.ar(sig, 300), 0.1);\r\n\t\t// 7 length modulated comb delays in parallel :\r\n\t\ty = Mix.ar(Array.fill(7,{ CombL.ar(z, 0.1, LFNoise1.kr(0.1.rand, 0.04, 0.05), 15) }));\r\n\t\t// two parallel chains of 4 allpass delays (8 total) :\r\n\t\t4.do({ y = AllpassN.ar(y, 0.050, [0.050.rand, 0.050.rand], 1) });\r\n\t\tsig = y;\r\n\t\tsig\r\n\t});\r\n\t// High shelf FX\r\n\tf[\\makeFx].(\\highShelfFx, {|sig, freq = 1200, rs = 1.0, db = 0.0|\r\n\t\tsig = BHiShelf.ar(sig, freq, rs, db);\r\n\t\tsig\r\n\t});\r\n\t// Phaser\r\n\tf[\\makeFx].(\\phaserFx, {|sig, delay = 0.2, decay = 1.0|\r\n\t\tvar theDelay = delay + SinOsc.kr([4, 5], [0, pi/2], 0.05*delay);\r\n\t\tsig = AllpassN(sig, delay, delay, decay) - sig;\r\n\t\tsig\r\n\t});\r\n\t// Theta wave distortion\r\n\tf[\\makeFx].(\\thetaDistortFx, {|sig, freq = 6.0, preAmp = 0.5|\r\n\t\tvar oldSig, control = SinOsc.ar(freq, 0.0, preAmp);\r\n\t\toldSig = sig;\r\n\t\tsig = Compander.ar(sig, control, 0.9, 1.0, 0.0, 0.001, 0.001);\r\n\t\tsig = Balance.ar(sig, oldSig);\r\n\t\tsig\r\n\t});\r\n\t// Simple envelope out on bus\r\n\tSynthDef(\\simpleEnv, {|out = 0, startVal = 0.0, endVal = 1.0, dur = 10.0, curve = \\sin|\r\n\t\tOut.kr(out, Env([startVal, endVal], [dur], curve).kr(Done.freeSelf));\r\n\t}).add;\r\n\t// Setup a convolution reverb\r\n\tf[\\convSetup] = {|ir, channel, amp, synth = \\convRevFx8192|\r\n\t\tSynth(synth, [\\out, b[channel],\r\n\t\t\t\\irSpectrum, c[\\IR][ir][\\buffer],\r\n\t\t\t\\mul, c[\\IR][ir][\\mul],\r\n\t\t\t\\haas, c[\\IR][ir][\\haas],\r\n\t\t\t\\amp, amp\r\n\t\t], g[channel], \\addToTail)\r\n\t};\r\n\t// Mouse XY router\r\n\tSynthDef(\\mouseXY, {|outX, minX =0, maxX = 1, warpX = 0, outY, minY = 0, maxY = 0, warpY = 0|\r\n\t\tOut.kr(outX, Poll(MouseButton.kr, MouseX.kr(minX, maxX, warpX)));\r\n\t\tOut.kr(outY, Poll(MouseButton.kr, MouseY.kr(minY, maxY, warpY)));\r\n\t}).add;\r\n\tb[\\mouseX] = Bus.control(s, 1);\r\n\tb[\\mouseY] = Bus.control(s, 1);\r\n\t////////////////////////////////////////////////////////////\r\n\t////// cKey: Key for a channel (adds extra zero for channels 0-9)\r\n\tf[\\cKey] = {|i|\r\n\t\t(\"c\" ++ i.asString.padLeft(2, \"0\")).asSymbol\r\n\t};\r\n\t////////////////////////////////////////////////////////////\r\n\t// Basic mixer\r\n\t// Convention:\r\n\t// Send effects: m[\\c00] to m[\\c09] (max 9)\r\n\t// Channels: m[\\c10] to m[\\c99] (max 90)\r\n\tv[\\nChannels] = 15;\r\n\tv[\\nSends] = 4;\r\n\tb[\\master] = 0;\r\n\tb[\\send] = ();\r\n\ts.sync;\r\n\t// Channels\r\n\tv[\\nChannels].do { |i|\r\n\t\tvar ch = f[\\cKey].(i + 10);\r\n\t\tvar chWrapper = (ch ++ \"Wrap\").asSymbol;\r\n\t\tb[ch] = Bus.audio(s, 2);\r\n\t\tb[chWrapper] = Bus.audio(s, 2);\r\n\t\tg[chWrapper] = Group.new;\r\n\t\t// Send the bus to the master bus\r\n\t\tSynth.tail(g[chWrapper], \\route2, [\\in, b[chWrapper], \\out, b[\\master]]);\r\n\t\ts.sync;\r\n\t\tm[ch].play(out: b[chWrapper], numChannels: 2, group: g[chWrapper], addAction: \\addToHead);\r\n\t\t// Create the channel and play on its private bus\r\n\t\t// Group where to insert the instrument\r\n\t\tm[ch].source_({|pan = 0.0, width = 1.0|\r\n\t\t\tvar thewidth = width.min(1 - pan.abs);\r\n\t\t\tvar sig = In.ar(b[ch], 2);\r\n\t\t\tSplay.ar(sig, thewidth, 1, pan);\r\n\t\t});\r\n\t\ts.sync;\r\n\t\tg[ch] = Group.new(g[chWrapper], \\addToHead);\r\n\t};\r\n\tSpec.add(\\width, ControlSpec(0.0, 1.0, default: 1.0));\r\n\t// Sends\r\n\tv[\\nSends].do { |i|\r\n\t\tvar snd = f[\\cKey].(i);\r\n\t\tvar sndWrapper = (snd ++ \"Fx\").asSymbol;\r\n\t\tb[snd] = Bus.audio(s, 2);\r\n\t\tg[sndWrapper] = Group.new;\r\n\t\t// Send the bus to the master bus\r\n\t\tSynth.tail(g[sndWrapper], \\route2, [\\in, b[snd], \\out, b[\\master]]);\r\n\t\t// Group where the FX should be inserted\r\n\t\tg[snd] = Group.new(g[sndWrapper], \\addToHead);\r\n\t\ts.sync;\r\n\t\t// Create the channel and play it before the FX group\r\n\t\tm[snd].play(b[snd], 2, group: g[sndWrapper], addAction: \\addToHead);\r\n\t\ts.sync;\r\n\t\t// Capture each channel post fader\r\n\t\tv[\\nChannels].do { |j|\r\n\t\t\tvar ch = f[\\cKey].(j + 10);\r\n\t\t\tvar chWrapper = (ch ++ \"Wrap\").asSymbol;\r\n\t\t\tvar mix = (\\mix ++ (j + 10)).asSymbol;\r\n\t\t\tm[snd][j + 10] = \\mix -> {In.ar(b[chWrapper], 2)};\r\n\t\t\tm[snd].set(mix, 0.0);\r\n\t\t\t// Adds a proper slider for the ProxyMixer\r\n\t\t\tSpec.add(mix, ControlSpec(0, 6.dbamp, \\amp, 0, 1.0));\r\n\t\t};\r\n\t};\r\n\tSpec.add(\\amp, ControlSpec(0, 6.dbamp, \\amp, 0, 1.0));\r\n\t// Master chain\r\n\ts.sync;\r\n\ti[\\masterChain] = ();\r\n\ti[\\masterChain][\\compLim] = Synth.tail(s, \\masterChainFx, [\\out, b[\\master], \\thresh, 0.075, \\gainDb, 12.5]);\r\n\ti[\\masterChain][\\eq] = Synth.before(i[\\masterChain][\\compLim], \\eqFx, [\\out, b[\\master]]);\r\n\t// Visual mixer\r\n\ts.sync;\r\n\tv[\\mixerOn].if {\r\n\t\tv[\\mixer] = ProxyMixer(m);\r\n\t\tProxyMeter.addMixer(v[\\mixer]);\r\n\t\tCmdPeriod.doOnce({\r\n\t\t\tv[\\mixer].close\r\n\t\t});\r\n\t};\r\n\t////////////////////////////////////////////////////////////\r\n\t// Variables and functions init\r\n\t//// Paths\r\n\tv[\\path] = ();\r\n\tif(thisProcess.platform.name == \\windows,\r\n\t\t{v[\\path][\\root] = PathName.new(thisProcess.nowExecutingPath).parentPath},\r\n\t\t{v[\\path][\\root] = PathName.new(\"~\").fullPath}\r\n\t);\r\n\tv[\\path][\\data] = v[\\path][\\root] +/+ \"Data Files\";\r\n\tv[\\path][\\IR] = v[\\path][\\data] +/+ \"IR\";\r\n\tv[\\path][\\IRData] = v[\\path][\\IR] +/+ \"IRData.txt\";\r\n\tv[\\path][\\groupSequence] = v[\\path][\\data] +/+ \"8_groups_sequence.txt\";\r\n\tv[\\path][\\media] = v[\\path][\\root] +/+ \"Media Files\";\r\n\t//// Load IRs\r\n\tc[\\IR] = ();\r\n\tTabFileReader.read(v[\\path][\\IRData], true).do {|row|\r\n\t\tvar name = row[0].asSymbol;\r\n\t\tc[\\IR][name] = ();\r\n\t\tc[\\IR][name][\\buffer] = Buffer.read(s, v[\\path][\\IR] +/+ row[1]);\r\n\t\tc[\\IR][name][\\fftSize] = row[2].asInteger;\r\n\t\tc[\\IR][name][\\mul] = row[3].asFloat;\r\n\t\tc[\\IR][name][\\haas] = row[4].asFloat;\r\n\t};\r\n\t//// Soundfiles list\r\n\tv[\\soundFiles] = ();\r\n\tPathName(v[\\path][\\media]).folders.do { |folder|\r\n\t\t(folder.folderName.asSymbol === \\story).if {\r\n\t\t\t// Story file list update later\r\n\t\t\tv[\\soundFiles][\\story] = ();\r\n\t\t}\r\n\t\t{\r\n\t\t\t// Other folders treated as one\r\n\t\t\tv[\\soundFiles][folder.folderName.asSymbol] = SoundFile.collect(\r\n\t\t\t\tfolder.fullPath +/+ \"*.flac\");\r\n\t\t}\r\n\t};\r\n\t//// Remember Wavetable\r\n\tv[\\soundFiles][\\rememberWT] = ();\r\n\tPathName(v[\\path][\\media] +/+ \\remember).folders.do { |folder|\r\n\t\tv[\\soundFiles][\\rememberWT][folder.folderName.asSymbol] = SoundFile.collect(\r\n\t\t\tfolder.fullPath +/+ \"*.wavetable\");\r\n\t};\r\n\t//// Garbage collection\r\n\tv[\\garbageDelta] = 20;\r\n\t//// Recording\r\n\tv[\\record].if {\r\n\t\ts.record(v[\\path][\\root] +/+ 'Recordings' +/+ 'In_Between-Longing-' ++ v[\\seed].asString.padLeft(4, \"0\") ++ \".aif\", b[\\master], 2, duration:70*60);\r\n\t};\r\n\t//// Functions\r\n\t////// rndBufs : Select randomly (with repetition) a given number of files\r\n\t////// in the soundFileList (created with SoundFile.collect) and create buffers\r\n\t////// Returns the buffers\r\n\tf[\\rndBufs] = { |soundFileList, nFiles = 1|\r\n\t\tvar bufferArray, isLoaded;\r\n\t\tisLoaded = Array.fill(nFiles, false);\r\n\t\tbufferArray = Array.fill(nFiles, {|i|\r\n\t\t\tvar buffer;\r\n\t\t\tbuffer = Buffer.read(s, soundFileList.choose.path, action: {isLoaded[i] = true});\r\n\t\t});\r\n\t\tbufferArray\r\n\t};\r\n\t////// bufInfo : Returns a string with the buffer number and the file name w/o path\r\n\tf[\\bufInfo] = {|b|\r\n\t\t\"\" ++ b.bufnum ++ \" -> \" ++ PathName(b.path).fileName\r\n\t};\r\n\t//////toGarbage: Schedules a buffer for freeing\r\n\tf[\\toGarbage] = {|buffer, delta = (v[\\garbageDelta])|\r\n\t\t// postln(\"Scheduling for freeing: \" ++ f[\\bufInfo].(buffer));\r\n\t\tAppClock.sched(delta, {\r\n\t\t\t// postln(\"Freeing: \" ++ f[\\bufInfo].(buffer));\r\n\t\t\tbuffer.free;\r\n\t\t});\r\n\t};\r\n\t////// bufDur: Returns the buffer duration or zero (useful if the buffer is late)\r\n\tf[\\bufDur] = {|buf|\r\n\t\tvar bufDur = 0;\r\n\t\ttry {bufDur = buf.duration};\r\n\t\tbufDur\r\n\t};\r\n\t////// Trace the buffer number\r\n\tf[\\bufDebug] = {|pattern|\r\n\t\tPchain(Pbind(\\callback, {postln(try {\"Playing: \" ++ f[\\bufInfo].(~bufnum)}{postln(~instrument)})}), pattern)\r\n\t};\r\n\t////// Resetting a part using the f[\\partReset] function\r\n\tf[\\resetPart] = {|part, delta|\r\n\t\tTempoClock.sched(delta,{\r\n\t\t\tf[(part ++ \\Reset).asSymbol].();\r\n\t\t\tnil\r\n\t\t});\r\n\t};\r\n\ts.sync;\r\n\t////////////////////////////////////////////////////////////\r\n\t// MasterChain effects\r\n\t//// Theta distorsion\r\n\ti[\\masterChain][\\thetaDistort] = Synth.before(i[\\masterChain][\\compLim],\\thetaDistortFx, [\\out, b[\\master]]);\r\n\tb[\\masterThetaFreq] = Bus.control(s, 1).value_(4.0);\r\n\tb[\\masterThetaPreAmp] = Bus.control(s, 1).value_(0.0);\r\n\ti[\\masterChain][\\thetaDistort].map(\\freq, b[\\masterThetaFreq]);\r\n\ti[\\masterChain][\\thetaDistort].map(\\preAmp, b[\\masterThetaPreAmp]);\r\n\t////////////////////////////////////////////////////////////\r\n\t// Send effects\r\n\t//// c00: Stutter radio\r\n\ti[\\c00] = ();\r\n\tb[\\varyDust] = Bus.control(s);\r\n\ti[\\c00][\\varyDust] = Synth(\\varyDust, [\\out, b[\\varyDust], \\trigHigh, 0.55], g[\\c00]);\r\n\ti[\\c00][\\stutterFx] = Synth(\\stutterFx, [\\trigIn, b[\\varyDust], \\out, b[\\c00]], g[\\c00], \\addToTail);\r\n\ti[\\c00][\\badRadioFx] = Synth(\\badRadioFx, [\\out, b[\\c00], \\amp, 3.dbamp], g[\\c00], \\addToTail);\r\n\t//// c01: Convolution reverb 1\r\n\tb[\\c01Amp] = Bus.control(s, 1).value_(1.0);\r\n\t//// c02: Convolution reverb 2\r\n\tb[\\c02Amp] = Bus.control(s, 1).value_(0.0);\r\n\t//// c03: Wash reverb\r\n\ti[\\c03] = ();\r\n\ti[\\c03][\\washReverb] = Synth(\\washReverbFx, [\\out, b[\\c03], \\amp, 1.0], g[\\c03]);\r\n\t////////////////////////////////////////////////////////////\r\n\t// Story\r\n\tc[\\story] = ();\r\n\tv[\\storyRhythms] = [\r\n\t\tPseq([5, 4, 2, 1, 4, 6], inf)*Pwhite(0.9, 1.1),\r\n\t\tPn(Pgeom(1, 1.23, 7)*2),\r\n\t\tPn(Pgeom(4, 0.9, 7)*1.5)\r\n\t];\r\n\t//// Story effects\r\n\ti[\\c10] = ();\r\n\ti[\\c10][\\rndDelayRight] = Synth(\\rndDelayRightFx, [\\out, b[\\c10], \\wet, 1, \\amp, 1], g[\\c10], \\addToTail);\r\n\ti[\\c10][\\switchLR] = Synth(\\switchLRFx, [\\out, b[\\c10], \\amp, 1.0], g[\\c10], \\addToTail);\r\n\t//// Story data\r\n\tv[\\storyGroups] = Array.with(\r\n\t\tnil,\r\n\t\t[\\Corridor, \\Walls, \\Creating, \\Brightday, \\Inbetween, \\Stable], // G1\r\n\t\t[\\Six, \\Talked, \\Hair, \\Eyes, \\Boys], // G2\r\n\t\t[\\Moment, \\Walking, \\Side, \\Was, \\Other], // G3\r\n\t\t[\\Alone, \\Close, \\Friend, \\Name, \\Knew], // G4\r\n\t\t[\\Following, \\Ahead, \\Sure, \\Facing, \\Longing], // G5\r\n\t\t[\\Smocks, \\Painted, \\Bricks, \\Brise, \\Casting], // G6\r\n\t\t[\\Roofs, \\Stone, \\Tarmac, \\Intimacy], // G7\r\n\t\t[\\Incredible, \\Wanting, \\Someone, \\Away, \\Stay, \\Anywhere, \\Lost] // G8\r\n\t);\r\n\t//// Initialize patterns\r\n\tv[\\storyGroups].do {|group, iGroup|\r\n\t\tgroup.notNil.if {\r\n\t\t\tv[\\storyGroups][iGroup].do{|item, iItem|\r\n\t\t\t\t// Creates the patterns with an empty buffer array\r\n\t\t\t\t// The array will be filled at initialisation\r\n\t\t\t\tc[\\story][item.asSymbol] = [];\r\n\t\t\t\tv[\\soundFiles][\\story][item] = SoundFile.collect(v[\\path][\\media] +/+ \"story\" +/+ \"G\" ++ iGroup ++ \"-\" ++ item ++ \"-*.flac\");\r\n\t\t\t\tp[(\\story ++ item).asSymbol] = Pbind(\r\n\t\t\t\t\t\\instrument, \\bufRdPan,\r\n\t\t\t\t\t\\bufnum, Pfuncn {c[\\story][item].choose},\r\n\t\t\t\t\t\\amp, 0.4,\r\n\t\t\t\t);\r\n\t\t\t};\r\n\t\t};\r\n\t};\r\n\t//// FSM for each group\r\n\tp[\\storyG1] = Pfsm([\r\n\t\t#[0, 2, 4, 5],\r\n\t\tp[(\\story ++ v[\\storyGroups][1][0]).asSymbol], #[1, 2, 3, 4, 5],\r\n\t\tp[(\\story ++ v[\\storyGroups][1][1]).asSymbol], #[2, 4,5],\r\n\t\tp[(\\story ++ v[\\storyGroups][1][2]).asSymbol], #[1, 3],\r\n\t\tp[(\\story ++ v[\\storyGroups][1][3]).asSymbol], #[0, 1, 2],\r\n\t\tp[(\\story ++ v[\\storyGroups][1][4]).asSymbol], #[0, 1, 2, 5],\r\n\t\tp[(\\story ++ v[\\storyGroups][1][5]).asSymbol], #[0, 2, 4],\r\n\t\tnil, nil\r\n\t]);\r\n\tp[\\storyG2] = Pfsm([\r\n\t\t#[0, 1],\r\n\t\tp[(\\story ++ v[\\storyGroups][2][0]).asSymbol], #[1, 4],\r\n\t\tp[(\\story ++ v[\\storyGroups][2][1]).asSymbol], #[0, 2, 3, 4],\r\n\t\tp[(\\story ++ v[\\storyGroups][2][2]).asSymbol], #[3, 4],\r\n\t\tp[(\\story ++ v[\\storyGroups][2][3]).asSymbol], #[2, 4],\r\n\t\tp[(\\story ++ v[\\storyGroups][2][4]).asSymbol], #[0, 1, 2, 3],\r\n\t\tnil, nil\r\n\t]);\r\n\tp[\\storyG3] = Pfsm([\r\n\t\t#[0, 1],\r\n\t\tp[(\\story ++ v[\\storyGroups][3][0]).asSymbol], #[1, 2, 3],\r\n\t\tp[(\\story ++ v[\\storyGroups][3][1]).asSymbol], #[0, 2, 3],\r\n\t\tp[(\\story ++ v[\\storyGroups][3][2]).asSymbol], #[0, 1, 3, 4],\r\n\t\tp[(\\story ++ v[\\storyGroups][3][3]).asSymbol], #[2, 4],\r\n\t\tp[(\\story ++ v[\\storyGroups][3][4]).asSymbol], #[0, 1, 3],\r\n\t\tnil, nil\r\n\t]);\r\n\tp[\\storyG4] = Pfsm([\r\n\t\t#[0, 1, 3, 4],\r\n\t\tp[(\\story ++ v[\\storyGroups][4][0]).asSymbol], #[1, 3, 4],\r\n\t\tp[(\\story ++ v[\\storyGroups][4][1]).asSymbol], #[2, 3, 4],\r\n\t\tp[(\\story ++ v[\\storyGroups][4][2]).asSymbol], #[1, 3, 4],\r\n\t\tp[(\\story ++ v[\\storyGroups][4][3]).asSymbol], #[0, 1, 2, 4],\r\n\t\tp[(\\story ++ v[\\storyGroups][4][4]).asSymbol], #[1, 3],\r\n\t\tnil, nil\r\n\t]);\r\n\tp[\\storyG5] = Pfsm([\r\n\t\t#[0, 1, 2, 3, 4],\r\n\t\tp[(\\story ++ v[\\storyGroups][5][0]).asSymbol], #[1, 2, 3, 4],\r\n\t\tp[(\\story ++ v[\\storyGroups][5][1]).asSymbol], #[0, 2, 3, 4],\r\n\t\tp[(\\story ++ v[\\storyGroups][5][2]).asSymbol], #[0, 1, 3, 4],\r\n\t\tp[(\\story ++ v[\\storyGroups][5][3]).asSymbol], #[0, 1, 2, 4],\r\n\t\tp[(\\story ++ v[\\storyGroups][5][4]).asSymbol], #[0, 1, 2, 3],\r\n\t\tnil, nil\r\n\t]);\r\n\tp[\\storyG6] = Pfsm([\r\n\t\t#[0, 1, 2],\r\n\t\tp[(\\story ++ v[\\storyGroups][6][0]).asSymbol], #[1, 2, 4],\r\n\t\tp[(\\story ++ v[\\storyGroups][6][1]).asSymbol], #[0, 2],\r\n\t\tp[(\\story ++ v[\\storyGroups][6][2]).asSymbol], #[1, 3, 4],\r\n\t\tp[(\\story ++ v[\\storyGroups][6][3]).asSymbol], #[1, 2, 4],\r\n\t\tp[(\\story ++ v[\\storyGroups][6][4]).asSymbol], #[0, 1, 2, 3],\r\n\t\tnil, nil\r\n\t]);\r\n\tp[\\storyG7] = Pfsm([\r\n\t\t#[0, 1, 2, 3],\r\n\t\tp[(\\story ++ v[\\storyGroups][7][0]).asSymbol], #[1, 2, 3],\r\n\t\tp[(\\story ++ v[\\storyGroups][7][1]).asSymbol], #[0, 2, 3],\r\n\t\tp[(\\story ++ v[\\storyGroups][7][2]).asSymbol], #[0, 1, 3],\r\n\t\tp[(\\story ++ v[\\storyGroups][7][3]).asSymbol], #[0, 1, 2],\r\n\t\tnil, nil\r\n\t]);\r\n\tp[\\storyG8] = Pfsm([\r\n\t\t#[0, 1, 2, 3, 6],\r\n\t\tp[(\\story ++ v[\\storyGroups][8][0]).asSymbol], #[1, 2, 4, 5, 6],\r\n\t\tp[(\\story ++ v[\\storyGroups][8][1]).asSymbol], #[0, 2, 3, 4, 5, 6],\r\n\t\tp[(\\story ++ v[\\storyGroups][8][2]).asSymbol], #[0, 1, 3, 4, 6],\r\n\t\tp[(\\story ++ v[\\storyGroups][8][3]).asSymbol], #[0, 1, 2, 4, 6],\r\n\t\tp[(\\story ++ v[\\storyGroups][8][4]).asSymbol], #[0, 5, 6],\r\n\t\tp[(\\story ++ v[\\storyGroups][8][5]).asSymbol], #[0, 3, 4, 6],\r\n\t\tp[(\\story ++ v[\\storyGroups][8][6]).asSymbol], #[0],\r\n\t\tnil, nil\r\n\t]);\r\n\t//// Load group sequence and start at a random place\r\n\tv[\\groupSequence] = File.readAllString(v[\\path][\\groupSequence]);\r\n\tv[\\iGroup] = v[\\groupSequence].size.rand;\r\n\tf[\\storyReset] = {\r\n\t\t// Clean old buffers\r\n\t\tv[\\storyGroups][v[\\groupSequence][v[\\iGroup]].digit].do {|item|\r\n\t\t\tc[\\story][item].do {|buf|\r\n\t\t\t\tf[\\toGarbage].(buf);\r\n\t\t\t};\r\n\t\t};\r\n\t\t// Choose the rhythm\r\n\t\tv[\\storyRhythm] = v[\\storyRhythms].choose;\r\n\t\t// Change the frequencies\r\n\t\ti[\\c10][\\rndDelayRight].set(\\changeFreq, 0.8.rand);\r\n\t\ti[\\c10][\\switchLR].set(\\switchFreq, 0.8.rand);\r\n\t\t// Prepare new buffers\r\n\t\tv[\\iGroup] = (v[\\iGroup] + 1)% v[\\groupSequence].size;\r\n\t\tv[\\storyGroups][v[\\groupSequence][v[\\iGroup]].digit].do {|item|\r\n\t\t\tc[\\story][item] = f[\\rndBufs].(v[\\soundFiles][\\story][item], 3)\r\n\t\t};\r\n\t\t// Return nothing\r\n\t\tnil\r\n\t};\r\n\t//// First initialisation\r\n\tf[\\storyReset].();\r\n\t//// Init story pattern\r\n\tp[\\storyTold] = Plazy {\r\n\t\tp[(\\storyG ++ v[\\groupSequence][v[\\iGroup]]).asSymbol] <> Pbind(\\delta, v[\\storyRhythm]);\r\n\t};\r\n\t//// Story pattern\r\n\tp[\\story] = p[\\storyTold];\r\n\tp[\\story] = (p[\\story] <> (group: g[\\c10], out: b[\\c10]));\r\n\tv[\\debug].if {p[\\story] = f[\\bufDebug].(p[\\story])};\r\n\t////////////////////////////////////////////////////////////\r\n\t// Ands\r\n\t//// Ands variations\r\n\tv[\\andsPanVars] = Array.with(\r\n\t\t(Pgeom(1, 0.95) - 1) * Pseq([-1, 1], inf), // Expanding\r\n\t\tPgeom(1, 0.95) * Pseq([-1, 1], inf), // Concentrating\r\n\t);\r\n\tv[\\shortAndsVars] = Array.with (\r\n\t\t{\r\n\t\t\t// Expand/Contract\r\n\t\t\tPseq([\r\n\t\t\t\tEvent.silent(4.0),\r\n\t\t\t\tPbind(\r\n\t\t\t\t\t\\instrument, \\bufRdPan,\r\n\t\t\t\t\t\\bufnum, Pseq([Pfuncn {c[\\ands][\\short].choose}], {20 + 20.rand}),\r\n\t\t\t\t\t\\delta, Pfunc {0.1.rand},\r\n\t\t\t\t\t\\rate, Pseq([\r\n\t\t\t\t\t\tPn(1, 10),\r\n\t\t\t\t\t\t25 - Pgeom(15, 0,9)\r\n\t\t\t\t\t]),\r\n\t\t\t\t\t\\pan, Plazy {v[\\andsPan]},\r\n\t\t\t\t\t\\amp, Pseq([Pn(0.4, 10), Pn(0.2)]),\r\n\t\t)], inf)},{\r\n\t\t\t// Bursts\r\n\t\t\tvar pat;\r\n\t\t\tpat = Pbind(\r\n\t\t\t\t\\instrument, \\bufRdPan,\r\n\t\t\t\t\\bufnum, Pstutter(4, Pfunc {c[\\ands][\\short].choose}),\r\n\t\t\t\t\\delta, Pseq([1, 0.1, 0.5, Pfuncn {(4.0 + 4.0.rand)}], inf),\r\n\t\t\t\t\\amp, Pseq([0.2, 0.25, 0.32, 0.4], inf),\r\n\t\t\t\t\\pan, Pn(Pstutter(4, Pwhite(-1.0, 1.0, 1)) * Pgeom(1, 0.5, 4))\r\n\t\t\t);\r\n\t\t\tpat = Ptpar([0.0, pat, {4.0.rand}, pat]);\r\n\t\t\tpat}\r\n\t);\r\n\t//// Ands Init\r\n\tc[\\ands] = ();\r\n\tf[\\andsReset] = {\r\n\t\t// Clean old buffers\r\n\t\tc[\\ands].do {|bufs|\r\n\t\t\tbufs.do {|buf|\r\n\t\t\t\tf[\\toGarbage].(buf);\r\n\t\t\t};\r\n\t\t};\r\n\t\t// Variations\r\n\t\tv[\\andsPan] = v[\\andsPanVars].choose;\r\n\t\tv[\\shortAnds] = v[\\shortAndsVars].choose;\r\n\t\t// Select new buffers\r\n\t\tc[\\ands][\\long] = f[\\rndBufs].(v[\\soundFiles][\\andLong], 1);\r\n\t\tc[\\ands][\\short] = f[\\rndBufs].(v[\\soundFiles][\\andVowel], 5);\r\n\t\t// Return nothing\r\n\t\tnil\r\n\t};\r\n\tf[\\andsReset].();\r\n\t//// Ands Patterns\r\n\tp[\\longAnds] = Pbind(\r\n\t\t\\instrument, \\bufRdPanInnerLoop,\r\n\t\t\\bufnum, Pfunc {c[\\ands][\\long].choose},\r\n\t\t\\delta, 6,\r\n\t\t\\nLoop, Pstutter(inf, Pfuncn {2 + 7.rand}),\r\n\t\t\\lWidth, Pstutter(inf, Pfuncn {0.2.rand + 0.01}),\r\n\t\t\\lStart, Pstutter(inf, Pfuncn {0.5.rand + 0.1}),\r\n\t\t\\amp, 0.4,\r\n\t);\r\n\tp[\\shortAnds] = Plazy ({v[\\shortAnds].()});\r\n\tp[\\ands] = Ppar([p[\\longAnds], p[\\shortAnds]]);\r\n\tp[\\ands] = p[\\ands] <> (group: g[\\c11], out: b[\\c11]);\r\n\tv[\\debug].if {p[\\ands] = f[\\bufDebug].(p[\\ands])};\r\n\t////////////////////////////////////////////////////////////\r\n\t// Colours\r\n\t//// Colours init\r\n\tc[\\colours] = ();\r\n\ti[\\colours] = ();\r\n\ti[\\colours][\\triPanner] = Synth(\\triPanner,\r\n\t\t[\\freq, 0.1, \\amp, 1.0, \\out, b[\\c12]], g[\\c12]);\r\n\tf[\\coloursReset] = {\r\n\t\t// Clean old buffers\r\n\t\tc[\\colours].do {|bufs|\r\n\t\t\tbufs.do {|buf|\r\n\t\t\t\tf[\\toGarbage].(buf);\r\n\t\t\t};\r\n\t\t};\r\n\t\t// Variants\r\n\t\tv[\\shadowsLen] = 10 + 10.0.rand;\r\n\t\ti[\\colours][\\triPanner].set(\\freq, 1/rrand(5.0, 20.0));\r\n\t\tv[\\nReds] = rrand(5, 10);\r\n\t\tv[\\nBW] = 3 + 5.rand;\r\n\t\tv[\\shadowsDelta] = 7.0 + 2.0.rand;\r\n\t\tv[\\shadowsExpand] = 1.0 + 0.1.rand2;\r\n\t\t// Select new buffers\r\n\t\t[\\black, \\red, \\white, \\shadows,\r\n\t\t\t\\brightWhisper, \\darkWhisper, \\shadeWhisper].do { |item|\r\n\t\t\tc[\\colours][item] = f[\\rndBufs].(v[\\soundFiles][item], 3);\r\n\t\t};\r\n\t\t// Return nothing\r\n\t\tnil\r\n\t};\r\n\tf[\\coloursReset].();\r\n\t//// Colours patterns\r\n\t////// Whispered spirals\r\n\tp[\\coloursWhisperedSpirals] = Pbind(\r\n\t\t\\instrument, \\bufRdPanExpandLoop,\r\n\t\t\\len, Pfunc {v[\\shadowsLen] + 2.5.rand2},\r\n\t\t\\sus, Pkey(\\len)/2,\r\n\t\t\\amp, 0.1,\r\n\t\t\\initPos, 0.4,\r\n\t\t\\minWidth, 0.4,\r\n\t\t\\bufnum, Prand([\r\n\t\t\tPfuncn {c[\\colours][\\brightWhisper].choose},\r\n\t\t\tPfuncn {c[\\colours][\\darkWhisper].choose},\r\n\t\t\tPfuncn {c[\\colours][\\shadeWhisper].choose},\r\n\t\t], inf),\r\n\t\t\\dir, Pgeom(1, -1, inf),\r\n\t\t\\delta, (Pkey(\\sus) + Pkey(\\len))/2,\r\n\t);\r\n\tp[\\coloursWhisperedSpirals] = p[\\coloursWhisperedSpirals] <> (group: g[\\c12], out: b[\\c12]);\r\n\t////// BWR\r\n\tp[\\coloursBWR] = Pseq([Event.silent(1.0),\r\n\t\tPbind(\\instrument, \\bufRdPan,\r\n\t\t\t\\bufnum, Pfin({v[\\nBW]}, Prand([\r\n\t\t\t\tPfuncn({c[\\colours][\\black].choose}),\r\n\t\t\t\tPfuncn({c[\\colours][\\white].choose}),], inf)),\r\n\t\t\t\\pan, Pfunc {1.0.rand2},\r\n\t\t\t\\delta, Pfunc {2 + 2.0.rand},\r\n\t\t\t\\amp, 0.4,\r\n\t\t),\r\n\t\tPbind(\\instrument, \\bufRdPan,\r\n\t\t\t\\bufnum, Pfunc({c[\\colours][\\red].choose}),\r\n\t\t\t\\panValue, Pstutter({v[\\nReds]}, Pfunc({1.0.rand2})),\r\n\t\t\t\\pan, Pcollect({|item| item + 0.1.rand2}, Pkey(\\panValue)),\r\n\t\t\t\\delta, Pn(Pfuncn({0.1.rand}), {v[\\nReds]}),\r\n\t\t\t\\amp, 0.25,\r\n\t\t),\r\n\t\tEvent.silent(3.0)\r\n\t], inf);\r\n\tp[\\coloursBWR] = p[\\coloursBWR] <> (group: g[\\c13], out: b[\\c13]);\r\n\t////// Shadows\r\n\ti[\\colours][\\haas] = Synth(\\haasFx, [\\amp, 1.0, out: b[\\c14]], g[\\c14]);\r\n\tp[\\coloursShadows] = Pseq([Plazy {Event.silent(v[\\shadowsDelta])},\r\n\t\tPbind(\r\n\t\t\t\\instrument, \\bufRdPan,\r\n\t\t\t\\bufnum, Pfunc {c[\\colours][\\shadows].choose},\r\n\t\t\t\\delta, Pfunc {v[\\shadowsDelta]},\r\n\t\t\t\\amp, 0.45,\r\n\t\t\t\\action, Pn(Plazy {\r\n\t\t\t\tv[\\shadowsDelta] = v[\\shadowsDelta]*v[\\shadowsExpand];\r\n\t\t}))\r\n\t]);\r\n\tp[\\coloursShadows] = p[\\coloursShadows] <> (group: g[\\c14], out: b[\\c14]);\r\n\t////// Colours together\r\n\tp[\\colours] = Ppar([\r\n\t\tp[\\coloursBWR],\r\n\t\tp[\\coloursShadows],\r\n\t\tp[\\coloursWhisperedSpirals],\r\n\t]);\r\n\tv[\\debug].if {p[\\colours] = f[\\bufDebug].(p[\\colours])};\r\n\t////////////////////////////////////////////////////////////\r\n\t// Intimacy\r\n\t//// Intimacy init\r\n\tc[\\intimacy] = ();\r\n\tf[\\intimacyReset] = {\r\n\t\t// Clean old buffers\r\n\t\tc[\\intimacy].do {|bufs|\r\n\t\t\tbufs.do {|buf|\r\n\t\t\t\tf[\\toGarbage].(buf);\r\n\t\t\t};\r\n\t\t};\r\n\t\t// Select new buffers\r\n\t\t[\\intimacy, \\close].do { |item|\r\n\t\t\tc[\\intimacy][item] = f[\\rndBufs].(v[\\soundFiles][item], 3);\r\n\t\t};\r\n\t\t// Return nothing\r\n\t\tnil\r\n\t};\r\n\tf[\\intimacyReset].();\r\n\t//// Intimacy patterns\r\n\tp[\\closeWiden] = Pbind(\r\n\t\t\\instrument, \\bufRdPan,\r\n\t\t\\bufnum, Pfunc {c[\\intimacy][\\close].choose},\r\n\t\t\\start, Pseg([0, 0, 0], [6, 2]),\r\n\t\t\\end, Pseg([0.1, 1, 1], [6, 2]),\r\n\t\t\\pan, Pseg([1, 0, 0], [6, 2])*Pseq([1, -1], inf),\r\n\t\t\\delta, (Pkey(\\end) - Pkey(\\start))*1.2,\r\n\t\t\\amp, 0.4,\r\n\t);\r\n\tp[\\closeWiden] = Pfxb(p[\\closeWiden], \\changingEchoFx,\r\n\t\t\\slope, -1.0, \\time, 12, \\send, 0.6, \\amp, 1.0\r\n\t);\r\n\tp[\\closeNarrow] = Pbind(\r\n\t\t\\instrument, \\bufRdPan,\r\n\t\t\\bufnum, Pfunc {c[\\intimacy][\\close].choose},\r\n\t\t\\start, Pseg([0, 0.2, 0.2], [6, 5]),\r\n\t\t\\end, Pseg([1, 0.5, 0.3], [6, 5]),\r\n\t\t\\pan, Pseg([0, 1, 1], [6, 5])*Pseq([1, -1], inf),\r\n\t\t\\delta, (Pkey(\\end) - Pkey(\\start))*1.1,\r\n\t\t\\amp, 0.4\r\n\t);\r\n\tp[\\closeNarrow] = Pfxb(p[\\closeNarrow], \\changingEchoFx,\r\n\t\t\\slope, -1.0, \\time, 12, \\send, 0.6, \\amp, 1.0\r\n\t);\r\n\tp[\\oneIntimacy] = Pbind(\r\n\t\t\\instrument, \\bufRdPan,\r\n\t\t\\bufnum, Pfuncn {c[\\intimacy][\\intimacy].choose},\r\n\t\t\\delta, 1.5,\r\n\t\t\\amp, 0.8\r\n\t);\r\n\tp[\\oneIntimacy] = Pfxb(p[\\oneIntimacy], \\bpfFx, \\amp, 1.5, \\rq, 1, \\freq, 900);\r\n\tp[\\intimacy] = Pseq([Prand([p[\\closeWiden], p[\\closeNarrow]]),\r\n\t\tPlazy {Event.silent(3.0.rand)},\r\n\t\tp[\\oneIntimacy],\r\n\t\tPlazy {Event.silent(5.0.rand)}], inf);\r\n\tp[\\intimacy] = p[\\intimacy] <> (group: g[\\c15], out: b[\\c15]);\r\n\tv[\\debug].if {p[\\intimacy] = f[\\bufDebug].(p[\\intimacy])};\r\n\t////////////////////////////////////////////////////////////\r\n\t// Incredible\r\n\t//// Incredible Init\r\n\tc[\\incredible] = ();\r\n\tv[\\partIncredibleVars] = Array.with(\r\n\t\tPn(Pbind(\r\n\t\t\t\\instrument, \\bufRdPan,\r\n\t\t\t\\bufnum, Pfuncn {c[\\incredible][\\incredible].choose},\r\n\t\t\t\\start, Pfuncn {0.7.rand},\r\n\t\t\t\\end, Pcollect({|item| rrand(item + 0.1, 1.0)}, Pkey(\\start)),\r\n\t\t\t\\fade, 0.01,\r\n\t\t\t\\delta, Pfuncn {0.4.rand},\r\n\t\t\t\\pan, Pfuncn {1.0.rand2},\r\n\t\t\t\\amp, Pfuncn {rrand(0.2, 0.5)},\r\n\t\t), {rrand(20, 30)}),\r\n\t\tPpar(Pseq([\r\n\t\t\tPlazy {Event.silent(4.0.rand)},\r\n\t\t\tPbind(\r\n\t\t\t\t\\instrument, \\bufRdPan,\r\n\t\t\t\t\\bufnum, Pstutter(inf, Pfuncn {c[\\incredible][\\incredible].choose}),\r\n\t\t\t\t\\start, Pseries(0, 0.01, 90),\r\n\t\t\t\t\\end, Pkey(\\start) + 0.1,\r\n\t\t\t\t\\pan, Pgeom(0.1, -1.024, 90),\r\n\t\t\t\t// \\pan, Pwhite(-1.0, 1.0),\r\n\t\t\t\t\\delta, Pgeom({0.2 + 0.1.rand}, 0.98),\r\n\t\t\t\t\\amp, Prand([\r\n\t\t\t\t\t0.0,\r\n\t\t\t\t\t0.6], inf),\r\n\t\t\t\t\\fade, 0.0005,\r\n\t\t\t\t\\rate, Pgeom(1, 1.0007, inf)\r\n\t\t)])!4);\r\n\t);\r\n\tf[\\incredibleReset] = {\r\n\t\t// Clean old buffers\r\n\t\tc[\\incredible].do {|bufs|\r\n\t\t\tbufs.do {|buf|\r\n\t\t\t\tf[\\toGarbage].(buf);\r\n\t\t\t};\r\n\t\t};\r\n\t\t// Select variant\r\n\t\tv[\\partIncredible] = v[\\partIncredibleVars].choose;\r\n\t\t// Select new buffers\r\n\t\t[\\incredible].do { |item|\r\n\t\t\tc[\\incredible][item] = f[\\rndBufs].(v[\\soundFiles][item], 3);\r\n\t\t};\r\n\t\t// Return nothing\r\n\t\tnil\r\n\t};\r\n\tf[\\incredibleReset].();\r\n\t//// Incredible patterns\r\n\tp[\\partIncredible] = Pfxb(Plazy {v[\\partIncredible]}, \\hpfFx, \\freq, 165, \\amp, 1.0);\r\n\tp[\\oneIncredible] = Pseq([Event.silent(1.0),\r\n\t\tPbind(\r\n\t\t\t\\instrument, \\bufRdPan,\r\n\t\t\t\\bufnum, Pfuncn {c[\\incredible][\\incredible].choose},\r\n\t\t\t\\delta, 1,\r\n\t\t\t\\amp, 0.70,\r\n\t\t)\r\n\t]);\r\n\tp[\\oneIncredible] = Pfxb(p[\\oneIncredible], \\haasFx, \\delay, {rrand(0.01, 0.025)}, \\amp, 1.0);\r\n\tp[\\incredible] = Pseq([p[\\oneIncredible],\r\n\t\tPlazy {Event.silent(3.0.rand)},\r\n\t\tp[\\partIncredible],\r\n\t\tPlazy {Event.silent(5.0.rand)}], inf);\r\n\tp[\\incredible] = p[\\incredible] <> (group: g[\\c16], out: b[\\c16]);\r\n\tv[\\debug].if {p[\\incredible] = f[\\bufDebug].(p[\\incredible])};\r\n\t////////////////////////////////////////////////////////////\r\n\t// I remember\r\n\t//// Remember Init\r\n\tc[\\remember] = ();\r\n\tf[\\rememberReset] = {\r\n\t\t// Clean old buffers\r\n\t\tc[\\remember].do {|bufs|\r\n\t\t\tbufs.do {|buf|\r\n\t\t\t\tf[\\toGarbage].(buf);\r\n\t\t\t};\r\n\t\t};\r\n\t\t// Change the scrambling and the number of repetitions\r\n\t\tv[\\rememberSpliceLen] = rrand(0.08, 0.12);\r\n\t\tv[\\startSeq] = (0, v[\\rememberSpliceLen]..1).scramble.stutter(1 + 3.rand);\r\n\t\t// Select new buffers\r\n\t\t[\\remember].do { |item|\r\n\t\t\tc[\\remember][item] = f[\\rndBufs].(v[\\soundFiles][item], 1);\r\n\t\t};\r\n\t\t// Return nothing\r\n\t\tnil\r\n\t};\r\n\tf[\\rememberReset].();\r\n\ts.sync;\r\n\t//// Chasing effect\r\n\ti[\\remember] = ();\r\n\ti[\\remember][\\multiDelay] = Synth(\\multiDelayFx, [\\out, b[\\c17], \\wet, 0.3, \\amp,1.5], g[\\c17]);\r\n\t// Pan goes left to right and back to centre\r\n\tv[\\pan] = Array.series((v[\\startSeq].size*0.5).floor, -1, (1/(v[\\startSeq].size*0.5).floor)*2) ++ Array.series((v[\\startSeq].size*0.5).ceil, 1, -1/(v[\\startSeq].size*0.5).ceil);\r\n\t//// Remember parameters\r\n\tp[\\leftFaster] = Pbind(\r\n\t\t\\instrument, \\bufRdPan,\r\n\t\t\\bufnum, Pfunc {c[\\remember][\\remember].choose},\r\n\t\t\\start, Pseq(v[\\startSeq]),\r\n\t\t\\end, Pkey(\\start) + v[\\rememberSpliceLen],\r\n\t\t\\amp, 0.4,\r\n\t\t\\delta, 0.4 * 2 * v[\\rememberSpliceLen] * Pgeom(3, 0.96),\r\n\t\t\\pan, Pseq(v[\\pan])\r\n\t);\r\n\tp[\\leftSlower] = Pbindf(p[\\leftFaster], \\delta, 0.4 * v[\\rememberSpliceLen] * Pgeom(0.4, 1.08));\r\n\tp[\\rightSlower] = Pbindf(p[\\leftSlower], \\pan, 0 - Pseq(v[\\pan]));\r\n\tp[\\rightFaster]= Pbindf(p[\\leftFaster], \\pan, 0 - Pseq(v[\\pan]));\r\n\tp[\\remember] = Pseq([\r\n\t\tPseq([\r\n\t\t\tPlazy {Event.silent(3.0.rand)},\r\n\t\t\tPrand([p[\\leftSlower], p[\\rightSlower], p[\\leftFaster], p[\\rightFaster]])\r\n\t\t], 2),\r\n\t\tPlazy {Event.silent(3.0.rand)}\r\n\t], inf);\r\n\tp[\\remember] = p[\\remember] <> (group: g[\\c17], out: b[\\c17]);\r\n\tv[\\debug].if {p[\\remember] = f[\\bufDebug].(p[\\remember])};\r\n\t////////////////////////////////////////////////////////////\r\n\t// Silence\r\n\tp[\\silence] = Event.silent(inf);\r\n\t////////////////////////////////////////////////////////////\r\n\t// Clarity\r\n\t//// Clarity init\r\n\tv[\\octaScale] = Scale.new(#[0, 2, 3, 5, 6, 8, 9, 11], name: \"octatonic\");\r\n\tf[\\shepardDegrees] = {|x| ((((0, 9..63) + x)%72) - 32).sort};\r\n\tc[\\clarity] = [];\r\n\tf[\\clarityReset] = {\r\n\t\t// Clean old buffers\r\n\t\tc[\\clarity].do {|buf|\r\n\t\t\tf[\\toGarbage].(buf);\r\n\t\t};\r\n\t\t// Load a set of wavetables\r\n\t\tv[\\rememberWTs] = v[\\soundFiles][\\rememberWT].choose;\r\n\t\tc[\\clarity] = Buffer.allocConsecutive(v[\\rememberWTs].size, s, 2048, 1,\r\n\t\t\t{|buf, i|\r\n\t\t\t\tbuf.readMsg(v[\\rememberWTs][i].path);\r\n\t\t});\r\n\t\t// Return nothing\r\n\t\tnil\r\n\t};\r\n\t//// First clarity init\r\n\tf[\\clarityReset].();\r\n\t//// Clarity pattern\r\n\ti[\\clarity] = ();\r\n\ti[\\clarity][\\phaser] = Synth(\\phaserFx, [\\out, b[\\c18], \\delay, 0.01, \\decay, 0.3, \\amp, 1.0], g[\\c18], \\addToTail);\r\n\ti[\\clarity][\\hpf] = Synth(\\hpfFx, [\\out, b[\\c18], \\amp, 1.0, \\freq, 110], g[\\c18], \\addToTail);\r\n\tp[\\clarity] = Pbind(\r\n\t\t\\instrument, \\wavetableBell,\r\n\t\t\\scale, v[\\octaScale],\r\n\t\t\\degree, Pcollect(f[\\shepardDegrees], Pseq((0..71).rotate(72.rand), inf)),\r\n\t\t\\attack, v[\\partDur]/5*Pwhite(1.0, 1.3),\r\n\t\t\\release, v[\\partDur]/3*Pwhite(1.0, 1.3),\r\n\t\t\\firstBufnum, c[\\clarity].first.bufnum + 1,\r\n\t\t\\lastBufnum, c[\\clarity].last.bufnum - 1,\r\n\t\t\\delta, (3*v[\\partDur]/7)*Prand([1, 2, 5], inf),\r\n\t\t\\pan, 0,\r\n\t\t\\amp, 0.1/([4, 3, 2, 1, 2, 3, 4, 5]**2),\r\n\t\t\\rq, 1,\r\n\t);\r\n\tp[\\clarity] = p[\\clarity] <> (group: g[\\c18], out: b[\\c18]);\r\n\tv[\\debug].if {p[\\clarity] = p[\\clarity].trace(\\firstBufnum, prefix: \"Clarity: \")};\r\n\t////////////////////////////////////////////////////////////\r\n\t// Consonants\r\n\tc[\\consonants] = ();\r\n\ti[\\consonants] = ();\r\n\tf[\\consonantsReset] = {\r\n\t\t// Clean old buffers\r\n\t\tc[\\consonants].do {|bufs|\r\n\t\t\tbufs.do {|buf|\r\n\t\t\t\tf[\\toGarbage].(buf);\r\n\t\t\t};\r\n\t\t};\r\n\t\t// Select new buffers\r\n\t\t[\\aggg, \\ffff, \\kkkk, \\shhh, \\ssss, \\tttt].do { |item|\r\n\t\t\tc[\\consonants][item] = f[\\rndBufs].(v[\\soundFiles][item], 3);\r\n\t\t};\r\n\t\t// Return nothing\r\n\t\tnil\r\n\t};\r\n\tf[\\consonantsReset].();\r\n\tp[\\consonantsTypes] = ();\r\n\tp[\\consonantsTypes][\\repeatPan] = Pfin({7 + 11.rand}, Pbind(\r\n\t\t\\instrument, \\bufRdPan,\r\n\t\t\\bufnum, Pfunc {c[\\consonants][\\aggg].choose},\r\n\t\t\\delta, Pfunc {0.4.rand},\r\n\t\t\\amp, Pfunc {0.3 + 0.3.rand},\r\n\t\t\\pan, Pfunc {1.0.rand2}\r\n\t));\r\n\tv[\\insectPan] = Pbrown(-1.0, 1.0).asStream;\r\n\tp[\\consonantsTypes][\\insect] = Pfxb(Pfin({19 + 17.rand}, Pbind(\r\n\t\t\\instrument, \\bufRdPan,\r\n\t\t\\bufnum, Pfunc {(c[\\consonants][\\ffff] ++ c[\\consonants][\\ssss]).choose},\r\n\t\t\\delta, Pfunc {0.15.rand},\r\n\t\t\\amp, 0.25,\r\n\t\t\\pan, Pfunc {v[\\insectPan].next},\r\n\t)), \\hpfFx, \\freq, 1500, \\amp, 1.0);\r\n\tp[\\consonantsTypes][\\pour] = Pfxb(Pfin({(25 + 10.rand)}, Pbind(\r\n\t\t\\instrument, \\bufRdPan,\r\n\t\t\\bufnum, Pfunc {(c[\\consonants][\\kkkk] ++ c[\\consonants][\\tttt]).choose},\r\n\t\t\\delta, Pgeom(0.035, 1.07),\r\n\t\t\\pan, Pstutter(inf, Pwhite(-0.5, 0.5, 1)) + Pwhite(-0.05, 0.05),\r\n\t\t\\amp, 0.5,\r\n\t\t\\rate, Pgeom(1.05, 0.997),\r\n\t)), \\hpfFx, \\freq, 1500, \\amp, 1.0);\r\n\tp[\\consonantsTypes][\\shhh] = Pfxb(Pbind(\r\n\t\t\\instrument, \\bufRdPan,\r\n\t\t\\bufnum, Pfuncn({c[\\consonants][\\shhh].choose}, 5),\r\n\t\t\\delta, Pwhite(1.3, 1.7),\r\n\t\t\\amp, Prand([0, 0.3, 0.4], 5),\r\n\t\t\\pan, Prand([Pseries(-0.5, 0.19, 5), Pseries(0.5, -0.19, 5)]),\r\n\t\t\\fade, 0.01,\r\n\t), \\bpfFx, \\freq, 2100, \\amp, 1.0);\r\n\tp[\\consonants] = Plazy {\r\n\t\tPseq([\r\n\t\t\tPlazy {Event.silent(rrand(10.0, 20.0))},\r\n\t\t\tp[\\consonantsTypes].choose,\r\n\t\t]);\r\n\t};\r\n\tp[\\consonants] = p[\\consonants] <> (group: g[\\c22], out: b[\\c22]);\r\n\tv[\\debug].if {p[\\consonants] = f[\\bufDebug].(p[\\consonants])};\r\n\t////////////////////////////////////////////////////////////\r\n\t// Waves and breath layer\r\n\t//// Waves init\r\n\tc[\\waves] = ();\r\n\tf[\\wavesReset] = {\r\n\t\t// Clean old buffers\r\n\t\tc[\\waves].do {|bufs|\r\n\t\t\tbufs.do {|buf|\r\n\t\t\t\tf[\\toGarbage].(buf);\r\n\t\t\t};\r\n\t\t};\r\n\t\t// Select new buffers\r\n\t\t[\\wave, \\inhale, \\exhale].do { |item|\r\n\t\t\tc[\\waves][item] = f[\\rndBufs].(v[\\soundFiles][item], 3);\r\n\t\t};\r\n\t\t// Return nothing\r\n\t\tnil\r\n\t};\r\n\tf[\\wavesReset].();\r\n\ti[\\waves] = ();\r\n\ti[\\waves][\\guts] = Synth(\\gutsFx, [\\out, b[\\c23],\r\n\t\t\\freq, 140,\r\n\t\t\\rq, 0.30,\r\n\t\t\\amp, 2.0,\r\n\t\t\\wet, 0.98,\r\n\t], g[\\c23], \\addToTail);\r\n\t//// Wave patterns\r\n\tp[\\waves] = Pbind(\r\n\t\t\\instrument, \\bufRdPan,\r\n\t\t\\bufnum, Pfuncn {c[\\waves][\\wave].choose},\r\n\t\t\\pan, Pwhite(-0.5, 0.5),\r\n\t\t\\delta, Pwhite(4.0, 6.0),\r\n\t\t\\amp, Pwhite(0.2, 0.3),\r\n\t\t\\rate, Pwhite(0.8, 1.2),\r\n\t);\r\n\tp[\\waves] = Pseq([Pn(p[\\waves], 5), Plazy {Event.silent(rrand(10.0, 30.0))}]);\r\n\tp[\\waves] = p[\\waves] <> (group: g[\\c23], out: b[\\c23]);\r\n\tv[\\debug].if {p[\\waves] = f[\\bufDebug].(p[\\waves])};\r\n\t//// Breath pattern\r\n\ti[\\breath] = ();\r\n\ti[\\breath][\\softclip] = Synth(\\softclipFx, [\\out, b[\\c24], \\preAmp, 90], g[\\c24]);\r\n\ti[\\breath][\\highShelf] = Synth(\\highShelfFx, [\\out, b[\\c24], \\freq, 2400, \\rs, 1.0, \\db, -4.0], g[\\c24], \\addToTail);\r\n\ti[\\breath][\\chPhaseInvert] = Synth(\\chPhaseInvertFx, [\\out, b[\\c24]], g[\\c24], \\addToTail);\r\n\tv[\\breathInhaleTime] = Pbrown(2.0, 6.0).asStream;\r\n\tv[\\breathExhaleTime] = Pbrown(5.0, 7.0).asStream;\r\n\tp[\\breathInhale] = Pbind(\r\n\t\t\\instrument, \\bufRdPan,\r\n\t\t\\bufnum, Pfuncn {c[\\waves][\\inhale].choose},\r\n\t\t\\amp, 0.7,\r\n\t\t\\delta, Pwrand([Pfuncn {v[\\breathInhaleTime].next},\r\n\t\t\tPwhite(2.0, 5.0, 1)], [10, 1].normalizeSum),\r\n\t\t\\rate, Pwhite(0.8, 1.2),\r\n\t);\r\n\tp[\\breathExhale] = Pbind(\r\n\t\t\\instrument, \\bufRdPan,\r\n\t\t\\bufnum, Pfuncn {c[\\waves][\\exhale].choose},\r\n\t\t\\amp, 0.7,\r\n\t\t\\delta, Pfuncn {v[\\breathExhaleTime].next},\r\n\t\t\\rate, Pwhite(0.8, 1.2),\r\n\t);\r\n\tp[\\breaths] = Pseq([p[\\breathInhale], p[\\breathExhale]], 6);\r\n\tp[\\breaths] = p[\\breaths] <> (group: g[\\c24], out: b[\\c24]);\r\n\tv[\\debug].if {p[\\breaths] = f[\\bufDebug].(p[\\breaths])};\r\n\t////////////////////////////////////////////////////////////\r\n\t// Mixing\r\n\t//// Fx\r\n\t////// c00: Bad radio\r\n\tm[\\c00].set(\r\n\t\t'mix10', 1.0,\r\n\t\t'mix11', 1.0,\r\n\t\t'mix12', 1.0,\r\n\t\t'mix13', 1.0,\r\n\t\t'mix14', 1.0,\r\n\t\t'mix15', 1.0,\r\n\t\t'mix16', 1.0,\r\n\t\t'mix17', 1.0,\r\n\t);\r\n\t////// c01: Reverb 1\r\n\tm[\\c01].set(\r\n\t\t'mix10', 0.10,\r\n\t\t'mix11', 0.06,\r\n\t\t'mix12', 0.12,\r\n\t\t'mix13', 0.06,\r\n\t\t'mix14', 0.06,\r\n\t\t'mix15', 0.06,\r\n\t\t'mix16', 0.06,\r\n\t\t'mix17', 0.06,\r\n\t\t'mix18', 0.06,\r\n\t\t'mix22', 0.10,\r\n\t\t'mix23', 0.15,\r\n\t\t'mix24', 0.15,\r\n\t);\r\n\t////// c02: Reverb 2\r\n\tm[\\c02].set(\r\n\t\t'mix10', 0.10,\r\n\t\t'mix11', 0.06,\r\n\t\t'mix12', 0.12,\r\n\t\t'mix13', 0.06,\r\n\t\t'mix14', 0.06,\r\n\t\t'mix15', 0.06,\r\n\t\t'mix16', 0.06,\r\n\t\t'mix17', 0.06,\r\n\t\t'mix18', 0.06,\r\n\t\t'mix22', 0.10,\r\n\t\t'mix23', 0.15,\r\n\t\t'mix24', 0.15,\r\n\t);\r\n\t////// c03: Wash reverb\r\n\tm[\\c03].set(\r\n\t\t'mix18', 0.68\r\n\t);\r\n\t//// Channels\r\n\t////// c10: Story\r\n\tm[\\c10].set('width', 0.4);\r\n\tm[\\c10].vol = 0.86;\r\n\t////// c11: Ands\r\n\tm[\\c11].vol = 0.53;\r\n\t////// c12: Colours Whispered spirals\r\n\tm[\\c12].vol = 0.65;\r\n\t////// c13: Colours BWR\r\n\tm[\\c13].vol = 0.86;\r\n\t////// c14: Colours Shadows\r\n\tm[\\c14].vol = 0.75;\r\n\t////// c15: Intimacy\r\n\tm[\\c15].vol = 0.79;\r\n\t////// c16: Incredible\r\n\tm[\\c16].vol = 0.47;\r\n\t////// c17: Remember\r\n\tm[\\c17].vol = 0.58;\r\n\t////// c18: Clarity\r\n\tm[\\c18].vol = 0.025;\r\n\tm[\\c18].set('pan', -0.13);\r\n\t////// c22: Consonants\r\n\tm[\\c22].vol = 0.14;\r\n\t////// c23: Waves\r\n\tm[\\c23].vol = 0.24;\r\n\t////// c24: Breath\r\n\tm[\\c24].vol = 0.09;\r\n\tm[\\c24].set('pan', -0.11);\r\n\ts.sync;\r\n\t////////////////////////////////////////////////////////////\r\n\t// Flavours\r\n\t//// Different reverbs\r\n\tv[\\reverbChange] = 61;\r\n\t///// Reverb change\r\n\tp[\\switchReverb] = Pbind(\r\n\t\t\\amp, Rest(),\r\n\t\t\\ir, Pseq([\\UEMT, \\Tower, \\Tight, \\Arundel, \\Underwater, \\Demon].rotate(6.rand), inf),\r\n\t\t\\target, Pseq([\\c01, \\c02], inf),\r\n\t\t\\delta, Pseq([Pfuncn {v[\\reverbChange]/2}, Pfunc {v[\\reverbChange]}]),\r\n\t\t\\callback, {\r\n\t\t\t// postln(\"Reverb \" ++ ~ir ++ \" to \" ++ ~target);\r\n\t\t\ti[~target].free;\r\n\t\t\ti[~target] = f[\\convSetup].(~ir, ~target, 0.0);\r\n\t\t\ti[~target].map(\\amp, b[(~target ++ \\Amp).asSymbol]);\r\n\t\t},\r\n\t);\r\n\t////// Reverb 1\r\n\tp[\\c01] = Pbind(\r\n\t\t\\instrument, \\simpleEnv,\r\n\t\t\\out, b[\\c01Amp],\r\n\t\t\\startVal, Pseq([1, 0], inf),\r\n\t\t\\endVal, Pseq([0, 1], inf),\r\n\t\t\\delta, Pfunc {v[\\reverbChange]},\r\n\t);\r\n\t////// Reverb 2\r\n\tp[\\c02] = Pbind(\r\n\t\t\\instrument, \\simpleEnv,\r\n\t\t\\out, b[\\c02Amp],\r\n\t\t\\startVal, Pseq([0, 1], inf),\r\n\t\t\\endVal, Pseq([1, 0], inf),\r\n\t\t\\delta, Pfunc {v[\\reverbChange]},\r\n\t);\r\n\t////// Pattern\r\n\tPtpar([\r\n\t\t0.0, p[\\switchReverb],\r\n\t\tv[\\reverbChange], p[\\c01],\r\n\t\tv[\\reverbChange], p[\\c02],\r\n\t]).play;\r\n\t//// Theta wave distortion\r\n\t{\r\n\t\tvar env, trig;\r\n\t\ttrig = Impulse.kr(LFNoise0.kr(0.1).range(1/73, 1/67), 1.0.rand);\r\n\t\tenv = Env([0, 1, 1, 0], [3, 0.01, 5], \\sine, releaseNode: 2).kr(gate: Trig.kr(trig, dur: LFNoise0.kr(0.1).range(3, 10)));\r\n\t\tOut.kr(b[\\masterThetaFreq], LFNoise1.kr(1).range(3, 7));\r\n\t\tOut.kr(b[\\masterThetaPreAmp], 0.5 + (1.6*env));\r\n\t}.play;\r\n\t////////////////////////////////////////////////////////////\r\n\t// Orchestration\r\n\tv[\\debug].if {\"Starting\".postln};\r\n\t// Consonants\r\n\tPseq([p[\\consonants], Pfuncn {f[\\consonantsReset].(); 1}], inf).play;\r\n\t// Waves\r\n\tPseq([p[\\waves], Pfuncn {f[\\wavesReset].(); 1}], inf).play;\r\n\t// Breath\r\n\tPseq([p[\\breaths], Pfuncn {f[\\breathsReset].(); 1}], inf).play;\r\n\t// Clarity\r\n\tp[\\clarity].play;\r\n\t// Sequence\r\n\tv[\\resetPart] = nil;\r\n\tp[\\sequence] = Pbind(\r\n\t\t\\amp, Rest(),\r\n\t\t\\delta, v[\\partDur],\r\n\t\t\\part,  Prout({\r\n\t\t\tvar parts = [[\\story], [\\ands, \\incredible, \\remember, \\colours, \\intimacy].rotate(5.rand)];\r\n\t\t\tloop {\r\n\t\t\t\tparts[0][0].yield;\r\n\t\t\t\tparts[0] = parts[0].rotate;\r\n\t\t\t\tparts = parts.rotate;\r\n\t\t\t\tv[\\silenceProb].coin.if {\r\n\t\t\t\t\t\\silence.yield}\r\n\t\t\t}\r\n\t\t}),\r\n\t\t\\callback, {\r\n\t\t\tv[\\debug].if {~part.postln};\r\n\t\t\t(v[\\resetPart].notNil).if {\r\n\t\t\t\tf[\\resetPart].(v[\\resetPart], v[\\partDur]/2);\r\n\t\t\t};\r\n\t\t\tv[\\resetPart] = ~part;\r\n\t\t\tv[\\debug].if {(\"Tempo: \" ++ t.tempo).postln};\r\n\t\t\tPfindur({v[\\partDur]}, Pseq([Event.silent(2), p[~part]])).play;\r\n\t\t}\r\n\t);\r\n\tp[\\sequence].play(quant: #[0, 0, 0.5]);\r\n});"
}
