Reverse engineering VosimOsc

I think a more general form for synchronous granular synthesis in the VOSIM style is pulsar synthesis with the difference that you can pick an arbitrary carrier and an arbitrary window function. The main point here is that the grain duration is binded to the grain frequency (in standard granular synthesis thats not the case), so it gets shorter for higher grain frequencies. You could either compensate for that with a multiplication of the window rate or multiply the pulsaret phase by a number of cycles param. But for really clean formant synthesis nothing beats the single sideband PM or modFM approach IMO which i have explained in detail here:

single sideband PM

(
var raisedCos = { |phase, index|
	var cosine = cos(phase * 2pi);
	exp(index.abs * (cosine - 1));
};

{
	var rate = 110;
	var modRatio = 2.5;
	var index = SinOsc.ar(0.3).linlin(-1, 1, 0, 30);

	var modPhase = Phasor.ar(DC.ar(0), rate * modRatio * SampleDur.ir);
	var mod = sin(modPhase * 2pi);
	var raisedCosWindow = raisedCos.(modPhase, index);

	var carrPhase = Phasor.ar(DC.ar(0), rate * SampleDur.ir);
	var carr = sin(carrPhase * 2pi + (mod * index));

	var sig = carr * raisedCosWindow;

	sig = LeakDC.ar(sig);

	sig!2 * 0.1;

}.play;
)

s.freqscope;

mod FM

(
var crossfade_formants = { |phase, harm|
	var harm_even = harm.round(2);
	var harm_odd = ((harm + 1).round(2) - 1);
	var sig_even = cos(phase * 2pi * harm_even);
	var sig_odd = cos(phase * 2pi * harm_odd);
	XFade2.ar(sig_even, sig_odd, harm.fold(0, 1) * 2 - 1);
};

var raisedCos = { |phase, index|
	var cosine = cos(phase * 2pi);
	exp(index.abs * (cosine - 1));
};

{
	var freq, phase, harmonic, raisedCosWindow, formants, sig;

	freq = \freq.kr(440);
	phase = Phasor.ar(DC.ar(0), freq * SampleDur.ir);

	harmonic = MouseX.kr(1, 10);

	raisedCosWindow = raisedCos.(phase, \index.kr(4));
	formants = crossfade_formants.(phase, harmonic);

	sig = formants * raisedCosWindow;

	sig = LeakDC.ar(sig);

	sig!2 * 0.1;

}.play;
)

s.freqscope;

Vector Phase Shaping

(
var vps = { |freq, width, harm|

	var harm_even = harm.round(2);
	var harm_odd = ((harm + 1).round(2) - 1);

	var phase = Phasor.ar(DC.ar(0), freq * SampleDur.ir, width.neg, 1 - width);

	var phasor_even = phase.bilin(0, width.neg, 1 - width, harm_even, 0, 1);
	var phasor_odd = phase.bilin(0, width.neg, 1 - width, harm_odd, 0, 1);

	var sig_even = cos(phasor_even + 0.5 * 2pi);
	var sig_odd = cos(phasor_odd + 0.5 * 2pi);

	var sig = XFade2.ar(sig_even, sig_odd, harm.fold(0, 1) * 2 - 1);
	LeakDC.ar(sig);
};

{
	var freq = 55;
	var width = MouseX.kr(0.01, 0.99);
	var harm = MouseY.kr(1.0, 10.0);
	var sig = vps.(freq, width, harm);
	sig !2 * 0.1;
}.play;
)

s.freqscope;