Pulsar Synthesis TZeroXBufRd


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?