//make a SynthDef for a short slice of sound extracted from a buffer starting at chosen position
(
SynthDef(\shortsample,{arg buffer, dur=0.05, pos = 0.0, amp= 0.5, pan= 0.0;
var env, source;
source = PlayBuf.ar(1,buffer,startPos:pos*BufFrames.ir(buffer));
env = EnvGen.ar(Env([0,1,1,0],[0.01,dur,0.01]),doneAction:2);
Out.ar(0,Pan2.ar(env*source*amp,pan))
}).add
)
//need a sound file to grab bits of sound from
b = Buffer.read(s,Platform.resourceDir +/+"sounds/a11wlk01.wav");
//test the SynthDef:
Synth(\shortsample, [\buffer,b,\pos,0.5,\dur,0.05])
//schedule Synths over time, increase duration with count
(
{
10.do{arg count;
Synth(\shortsample, [\buffer,b,\pos,0.5,\dur,0.1*count]);
0.05.wait;
}
}.fork
)
//another example, with random selection of durations, and envelope control of starting pos
(
var grainspacing = 0.05;
var env = Env([0,1,0.3,1.0],[2.0,2.5,0.5]); //use a language side envelope to vary position
{
100.do{arg count;
var time = count*grainspacing;
Synth(\shortsample, [\buffer,b,\pos,env.at(time),\dur,rrand(0.01,0.05)]);
grainspacing.wait;
}
}.fork
)
//load another buffer
c = Buffer.read(s,Platform.resourceDir +/+"sounds/SinedPink.aiff");
//granular cross fade; as increase density of grains from one, reduce from another (done in a basic probabilistic way here). Doesn't sound great with these two sounds, but could certainly be improved by exploring other sources and mixing strategies
(
var grainspacing = 0.05;
var mixprobability = Env([0.0,1.0,0.0],[3.0,2.0]); //use a language side envelope to vary position
{
100.do{arg count;
var time = count*grainspacing;
Synth(\shortsample, [\buffer,if(mixprobability.at(time).coin,c,b),\pos,time*0.1,\dur,grainspacing*4.0,\amp, 0.25]);
grainspacing.wait;
}
}.fork
)