hey,
when using GrainBuf, Playbuf, BufRd etc. and single cycle waveforms you can bind the rate argument to the fundamental frequency and multiplying with a factor will introduce a formant shift. after investigating the source code of the nuPG. its done the same way there.
tFreq = \tFreq.kr(440);
sig = GrainBuf.ar(
numChannels: 2,
trigger: Impulse.ar(tFreq),
dur: \overlap.kr(1) / tFreq,
sndbuf: sndBuf,
rate: tFreq * \formRatio.kr(2) * BufFrames.ir(sndBuf) * SampleDur.ir,
pos: 0,
interp: 4,
pan: 0,
envbufnum: envBuf,
maxGrains: 2048
);
a.) After looking at the TZeroXBufRd
Helpfile Ex. 8: Pulsar synthesis with envelopes, variable number of source and envelope half wavesets of miSCellaneous_lib once again i was wondering if it is also necessary here to declare:
rate = tFreq * \formRatio.kr(2) * BufFrames.kr(sndBuf) * SampleDur.ir
or if this is automatically done for you and you can just use rate = \formRatio.kr(2);
b.) in the nuPG you can use channel masking:
//channel masking
channelMask = Demand.ar(trig, 0, Dseq([Dser([-1], chanMask),
Dser([1], chanMask), Dser([0], centerMask)], inf)).lag(0.001);
pan = pan + micro_panMult + meso_panMult + channelMask;
pan = pan + panMod;
TZeroXBufRd
doesnt have a pan argument how would you go about introducing channel masking here? I know its possible using Pan2.ar
on the resulting signal, but ive already multichannel expanded via the BufMix
argument to stereo. Is this equal to the example Ex. 9: Layers of pulsar streams using gates?
thanks