i had this patch lying around which recreates the original with overlap set to 8 and higher trigger rates using Playbuf, maybe useful to you:
(
var timingInformation = { |numChannels, trig, grainRate|
var arrayOfTrigsAndPhases = numChannels.collect{ |i|
var localTrig = PulseDivider.ar(trig, numChannels, i);
var hasTriggered = PulseCount.ar(localTrig) > 0;
var localPhase = Sweep.ar(localTrig, grainRate * hasTriggered);
[localTrig, localPhase];
};
var trigsAndPhasesArray = arrayOfTrigsAndPhases.flop;
(\trigger : trigsAndPhasesArray[0], \phase: trigsAndPhasesArray[1]);
};
var hanningWindow = { |phase|
(1 - (phase * 2pi).cos) / 2 * (phase < 1);
};
SynthDef(\granular, { |sndBuf|
var numChannels = 8;
var tFreq = \tFreq.kr(10);
var trig = Impulse.ar(tFreq);
var grainRate = tFreq / \overlap.kr(1);
var timings = timingInformation.(numChannels, trig, grainRate);
var grainWindows = hanningWindow.(timings.phase);
var pos = Phasor.ar(
trig: 0,
rate: \posRate.kr(1) * BufRateScale.kr(sndBuf) * SampleDur.ir / BufDur.kr(sndBuf),
start: \posLo.kr(0),
end: \posHi.kr(1)
);
var sig = PlayBuf.ar(
numChannels: 1,
bufnum: sndBuf,
rate: \playBackRate.kr(1),
trigger: timings.trigger,
startPos: pos * BufFrames.kr(sndBuf),
loop: 1
);
sig = sig * grainWindows;
sig = Pan2.ar(sig, \pan.kr(0));
sig = sig.sum;
sig = sig * \amp.kr(-10.dbamp);
sig = LeakDC.ar(sig);
OffsetOut.ar(\out.kr(0), sig);
}).add;
)
b = Buffer.read(s, Platform.resourceDir +/+ "sounds/a11wlk01.wav");
(
Synth(\granular, [
\tFreq, 1000,
\overlap, 8,
\sndBuf, b,
\amp, -25.dbamp
]);
)
(
Synth(\granular, [
\tFreq, 10,
\posRate, 1,
\playBackRate, 1,
\overlap, 0.5,
\sndBuf, b,
\amp, -5.dbamp
]);
)