( name: 'granular_sampler_stereo', func: { | freq, gate | var bufL = \bufL.kr; var bufR= \bufR.kr; var trigger = gate; var bufFrames = BufFrames.kr(bufL); var grainTriggerFreq = \grainTriggerFreq.kr(5); var positionRamp = Phasor.ar( trigger, rate: BufRateScale.kr(bufL) * \rate.kr(1), start: bufFrames * \sampleStart.kr(0), end: bufFrames * \sampleEnd.kr(1), ) * \direction.kr(1); var envelope = EnvGen.kr( Env([0, 1, 1, 0], [0, BufDur.kr(bufL) - 0.01, 0]), trigger ); GrainBuf.ar( numChannels: 1, trigger: Impulse.ar(grainTriggerFreq), dur: \density.kr(2) / grainTriggerFreq, sndbuf: [bufL,bufR], rate: \grainRate.kr(1), pos: positionRamp / bufFrames , interp: 2, envbufnum: -1, ) * envelope; }, specs:( density: [0.1, 10.0, \lin ,0.1, 2], direction: [-1, 1, \lin, 1, 1], grainRate: [0.1, 2, \lin, 0.1, 1], grainTriggerFreq: [0.1, 200, \lin, 0.1, 20], pan: [-1.0, 1.0, \lin, 0.1, 0], rate: [0.1, 2, \lin, 0.01, 1], sampleStart: [0.0, 1.0, \lin, 0.001, 0.0], sampleEnd: [1.0, 0.0, \lin, 0.001, 1], ), useEnv: false, defaults:( attack: 0.01, release: 0.1, curve: 1 ), )