( SynthDef(\granulator, { arg out = 0, bufnum = ~smpBuffers.ar(0), grainDur=0.2, grainFreq=140, amp=0.8, gate = 1, attackTime = 0.1, susLevel = 1.0, releaseTime = 1.0, spread = 1, pan = 0, seed = 1924, id=0; var snd, env; RandID.ir(id); RandSeed.ir(1, seed); spread = spread * abs(abs(pan)-1); env = Linen.kr(gate, attackTime, susLevel, releaseTime); snd = GrainBuf.ar(numChannels: 1, trigger: Impulse.kr(grainFreq * LFNoise0.kr(grainFreq).range(0.5,1.5)), dur: grainDur, sndbuf: bufnum, rate: [0.2,0.3,0.4,0.5], pos:LFTri.ar(0.0001, iphase:[IRand(0,1),IRand(0,1),IRand(0,1),IRand(0,1)]).range(0,1), interp: 4, maxGrains: 1024, pan: [ LFNoise1.kr(0.1).range(-1,1), LFNoise1.kr(0.1).range(-1,1), LFNoise1.kr(0.1).range(-1,1), LFNoise1.kr(0.1).range(-1,1) ] ); snd = Splay.ar(snd, spread:spread, level:amp, center: pan); snd = snd * env; Out.ar(out, snd); }).add; );