BufGrainI granular synthesis with sound sampled in a buffer and user supplied envelopes
*ar(trigger, dur, sndbuf, rate, pos, envbuf1, envbuf2, ifac, interp, mul, add)
trigger - a kr or ar trigger to start a new grain. If ar, grains after the start of the synth are sample accurate.
The following args are polled at grain creation time
dur - size of the grain.
sndbuf - the buffer holding an audio signal
rate - the playback rate of the sampled sound
pos - the playback position for the grain to start with (0 is beginning, 1 is end of file)
envbuf1 - a buffer with a stored signal to be used for the envelope of the grain
envbuf2 - a buffer with a stored signal to be used for the envelope of the grain
ifac - an interpolation factor. interpolates between the two envelopes where 0 is all envbuf1, and 1 is all
envbuf2
interp - the kind of interpolation for the sampled sound in the grain (1 - none, 2 - linear, 4 - cubic)
Examples:
s.boot;
SynthDef(\buf_grain_test, {arg gate = 1, sndbuf, amp = 1, envbuf1, envbuf2;
Out.ar(0,
BufGrainI.ar(Impulse.kr(10), 0.2, sndbuf, MouseX.kr(0.5, 8), PinkNoise.kr.range(0, 1),
envbuf1, envbuf2, MouseY.kr(0, 1), 2,
EnvGen.kr(
Env([0, 1, 0], [1, 1], \sin, 1),
gate,
levelScale: amp,
doneAction: 2)
)
)
}).load(s);
s.sendMsg(\b_allocRead, x = s.bufferAllocator.alloc(1), "sounds/a11wlk01-44_1.aiff");
y = Env([0, 1, 0], [1, 1], \sin).asSignal(1024);
z = Env([0, 1, 0], [1, 1], [10, -10]).asSignal(1024);
s.sendMsg(\b_alloc, b = s.bufferAllocator.alloc(1), 1024, 1, [\b_setn, b, 0, 1024] ++ y)
s.sendMsg(\b_alloc, c = s.bufferAllocator.alloc(1), 1024, 1, [\b_setn, c, 0, 1024] ++ z)
s.sendMsg(\s_new, \buf_grain_test, a=s.nextNodeID, 0, 1, \amp, 0.2, \sndbuf, x, \envbuf1, b,
\envbuf2, c);
s.sendMsg(\n_set, a, \gate, 0);
s.sendMsg(\b_free, b);
s.sendMsg(\b_free, c);
s.sendMsg(\b_free, x);