{
   "author" : "coreyker",
   "name" : "Looping sampler with crossfading",
   "ancestor_list" : [],
   "description" : "Looping sampler with crossfading. Looping point and loop length can be adjusted.\r\n\r\nhttps://soundcloud.com/inlet/sc-160515-234815",
   "labels" : [],
   "code" : "SynthDef(\\simpler, {\r\n\targ buf=0\r\n\t,freq=220\r\n\t,sampleStart=0\r\n\t,loopStart=0\r\n\t,loopLen=1 // between 0 (min) and 1 (max)\r\n\t,fadeTime=0.1\r\n\t,gate=1\r\n\t,attack=0.01\r\n\t,sustain=1\r\n\t,release=1\r\n\t,f0=220;\r\n\r\n\tvar rate = freq / f0;\r\n\tvar sr = rate*BufSampleRate.kr(buf);\r\n\tvar fadeFrames = fadeTime*sr;\r\n\tvar loopEnd = loopLen*(BufFrames.kr(buf) - loopStart) + loopStart;\r\n\tvar loopFrames = loopEnd - loopStart + 1;\r\n\tvar loopTime = (loopFrames - fadeFrames)/sr;\r\n\tvar startUpTime = (loopStart - sampleStart)/sr;\r\n\r\n\tvar trigLoop = TDuty.ar(Dseq([startUpTime + loopTime, Dseq([loopTime], inf)]), gapFirst:1);\r\n\r\n\tvar phaseA = Phasor.ar(trigLoop, rate, sampleStart, inf, loopStart);\r\n\tvar phaseB = Phasor.ar(trigLoop, rate, loopEnd - fadeFrames, inf, loopEnd - fadeFrames);\r\n\r\n\tvar srcA = BufRd.ar(buf.numChannels, buf, phaseA);\r\n\tvar srcB = BufRd.ar(buf.numChannels, buf, phaseB);\r\n\r\n\tvar startLoop = SetResetFF.ar(trigLoop);\r\n\tvar loopPan = Phasor.ar(trigLoop, 2/fadeFrames * rate, -1, inf, -1).clip(-1,1);\r\n\r\n\tvar out = Select.ar(startLoop, [srcA, LinXFade2.ar(srcB, srcA, pan:loopPan)]);\r\n\tvar env = EnvGen.ar(Env.asr(attack, sustain, release, 1), gate, doneAction:2);\r\n\r\n\tOut.ar(0, Splay.ar(out) * env);\r\n}).add;\r\n\r\n// Try it out:\r\n~buf = Buffer.read(s, Platform.resourceDir +/+ 'sounds/a11wlk01.wav');\r\n\r\nPdef(\\p, Pbind(*[\r\n\tinstrument: \\simpler\r\n\t,buf: ~buf\r\n\t,octave: Prand([3,4,5],inf)\r\n\t,degree: Pn(Plazy({Pseq([-4,0,5,7,9,12].scramble.clump(2),2)}))\r\n\t,dur: 0.5\r\n\t,strum: Prand([0, 0.125, 0.25], inf)\r\n\t,strumEndsTogether: false\r\n\t,loopStart: Pwhite(90000, 150000)\r\n\t,sampleStart: Pwhite(50000, 85000)\r\n\t,loopLen: 0.4\r\n\t,fadeTime: 0.15\r\n\t,attack: 0.25\r\n\t,release: 4\r\n])).play;",
   "is_private" : null,
   "id" : "1-51A"
}
