Hi!
I am trying to create a live granular synth. For each grain to be created with GrainBuf, triggered with Dust i want to have random values within given ranges to be generated for different parameters. Right now I can’t really get it to work.
I have 2 problems:
1:
TRand poll output shows always 0.
SynthDef.new(\gran, {
arg dens=20, grainSize=0.1, rate=1,
buf=~granBuf, startTime=0, endTime=44100*5,
ptrBus=~recPtrBus, amp=0.5, out=0;
var sig=0, recPtr=0, playPos, safeLag=0, //safeLag is safe distance of granPtr behind recPtr
bufSizeSamples, bufSampleRate,
trig;
bufSizeSamples = BufFrames.kr(~granBuf);
bufSampleRate = BufSampleRate.kr(~granBuf);
trig = Dust.ar(dens);
safeLag = (grainSize*bufSampleRate*rate);
playPos = TRand.kr(startTime, endTime, trig).poll(10);
recPtr = In.ar(~recPtrBus);
sig = GrainBuf.ar(
numChannels: 1,
trigger: trig,
dur: grainSize,
sndbuf: ~granBuf,
rate: 1,
pos: playPos / bufSizeSamples, //between 0 and 1
interp: 2,
envbufnum: -1,
maxGrains: 512
);
sig = sig * amp;
Out.ar(out, sig);
}).add;
2:
Ideally I would like the random generating parts enclosed in separate code blocks, for making it easier to do more processing, like here. I have tried to do
(
~generatePlayPos = {
arg startTime, endTime, recPtr, safeLag;
var playPos;
playPos = rrand(startTime, endTime);
if( ((recPtr-safeLag) < playPos).and(playPos < recPtr) ) {playPos = (recPtr-safeLag)};//if too close to record pointer, nudge to safeLag
playPos;
}
)
but don’t know how to call it with each trigger from the Gran synthdef. Also upon evaluation from the SynthDef it gives the error: ERROR: Message ‘and’ not understood.
Any help appreciated!