{
   "name" : "303 emulation",
   "author" : "chriskiefer",
   "ancestor_list" : [],
   "description" : "This code does tb303 emulation, with analogue style sequencing.",
   "labels" : [
      "analogue",
      "acid",
      "303"
   ],
   "code" : "( \r\nSynthDef(\\impulseSync, {\r\n\t|rate=1, bpm=135, barLengthInBeats=4, resetLength=1|\r\n\tvar reso = 96;\r\n\tvar clockFreqFull = bpm / 60 / barLengthInBeats * rate;\r\n\tvar clockFreq = clockFreqFull / resetLength;\r\n\tvar impSubDivs = Impulse.ar(clockFreqFull * barLengthInBeats * reso, 0);\r\n\tvar imp = PulseDivider.ar(impSubDivs, (barLengthInBeats * reso * resetLength).floor, barLengthInBeats * reso);\r\n\tvar clockPos = Phasor.ar(imp, clockFreqFull / SampleRate.ir, 0, 1, 0); \tvar barCounter = PulseCount.ar(imp);\r\n\tOut.ar(30, barCounter);\r\n\tOut.ar(31, imp);\r\n\tOut.ar(32, clockPos);\r\n\tOut.ar(33, impSubDivs);\r\n}).store;\r\n\r\n~pulsePattern = {\r\n\t|pat|\r\n\tvar clock, seq;\r\n\tclock = In.ar(33,1);\t\r\n\tseq = {Dseq(pat,inf)};\r\n\tDemand.ar(clock, In.ar(31,1), seq) * clock;\r\n};\r\n\r\n~every = {\r\n\t|x|\r\n\t~pulsePattern.([1] ++ (0!(x-1)));\r\n};\r\n\r\n~seq = {|pulse, pattern, barreset=1, noreset=0| \r\n\tvar isBarZero = InRange.ar(In.ar(30) % barreset,0,0.99999);\r\n\tDemand.ar(pulse, In.ar(31) * isBarZero * (1-noreset), {Dseq(pattern, inf)})\r\n};\r\n\r\n\r\n~imp = Synth.before(1, \\impulseSync);\r\n{\r\n\tvar w, p4, nt, ds,fr, lagfr, fenv, et,ac, acInt,gt;\r\n\tvar wv=0.1; //0-1, mix between saw and pulse\r\n\tvar ampComp, cutoff, accMod=1;\r\n\tnt = ~every.(24);\r\n\tPoll.ar(nt, nt, \\tr);\r\n\tfr = ~seq.(nt, [100,100,400,200,100,100,800,050] *0.5); //freq\r\n\tet = ~seq.(nt, [001,001,001,001,001,001,000,001]) * nt; //env trig \r\n\tac = ~seq.(nt, [001,000,000,001,000,000,001,000]) * nt; //accent\r\n\tgt = ~seq.(nt, [001,001,001,001,001,001,000,001]); //gate\r\n\tlagfr = LagUD.ar(fr,0.39, 0.09);\r\n\tlagfr = lagfr * LFDNoise3.ar(0.3,0.0156,1);\r\n\tw = DPW4Saw.ar(lagfr, 0.5 + (wv ** 4 * 550)).softclip;\r\n\tampComp = (1.05-wv) ** 6 + 1;\r\n\tw = w * 0.9* ampComp * LFDNoise3.ar(0.5,0.04,1);\r\n\tacInt = LPF.ar(ac*12, 1);\r\n\tfenv = Decay2.ar(et*0.16 + (acInt * 0.02 * accMod) , 0.01, 0.12)  * LFDNoise3.ar(0.2,0.003,1);\r\n\tcutoff = MouseX.kr(20,10000,1);\r\n\tw = RLPFD.ar(w, cutoff + (15000-cutoff * fenv), 0.6 + (acInt * 1.2 * accMod), 0.5) * 2;\r\n\tw = LeakDC.ar(w, 0.995);\r\n\tw = w + (HPF.ar(w,400,10).softclip * 0.04);\r\n\tw = w * Lag.ar(gt, 0.001);\r\n\tOut.ar(0,w.dup);\r\n\tw.poll;\r\n}.play;\r\n\r\n)",
   "is_private" : null,
   "id" : "1-4Wz"
}
