( name: 'granular_looper', func: { | buf | var frames = BufFrames.kr(buf); var tFreq = \trgFreq.kr(100); var trg = Impulse.ar(tFreq); var overlap = \overlap.kr(2); var resetPos = \resetPos.kr(0); var resetTrig = Changed.kr(resetPos, 1); var pos = Phasor.ar( trig: resetTrig, rate: BufRateScale.kr(buf) * \direction.kr(1), start: \start.kr(0), end: \end.kr(1.0) * frames, resetPos: resetPos ); GrainBuf.ar( numChannels:2, trigger: trg, dur: overlap / tFreq, sndbuf: buf, rate: BufRateScale.kr(buf) * \rate.kr(1), pos: pos / frames, interp: 2, pan: \pan.kr(0), envbufnum: -1, ); }, limitDuration: true, specs:( rate: [-10,0, 10.0], pan: [-1.0, 1.0] ) )