Frequency instead of phase

The welch window created by EnvGen is actually a half-sine window:

if you take the derivative of the half sine window which is a half cosine window and add ((grainFreq / overlap) * SampleDur.ir) to fmod, PM and FM are pretty much identical:

(
{
	var tFreq = 100;
	var trig = Impulse.ar(tFreq);
	var grainFreq = 400;
	var overlap = \overlap.kr(3).clip(0, grainFreq / tFreq);

	var phase = Sweep.ar(trig, grainFreq);
	var windowPhase = phase / overlap;
	var rectWindow = windowPhase < 1;

	var fmod = cos(windowPhase * pi) + ((grainFreq / overlap) * SampleDur.ir);
	var fm_phase = Sweep.ar(trig, grainFreq * (1 + (fmod * \index.kr(1))));

	var pmod = sin(windowPhase * pi);
	var pm_phase = phase + ((pmod * overlap) / pi);

	var pm_sig = sin(pm_phase * 2pi);
	var fm_sig = sin(fm_phase * 2pi);

	[pm_sig * rectWindow, fm_sig * rectWindow];

}.plot(0.01);
)

(1 - phase) ** 3 is quite similiar for overlap == 1. If you increase overlap and exchange (1 - phase) ** 3 with (overlap - phase) ** 3 the index grows exponentially if you change overlap, with the half cosine window for FM or the half sine window for PM the index grows linearly when you change overlap.

(
{
	var tFreq = 100;
	var trig = Impulse.ar(tFreq);
	var grainFreq = 400;
	var phase = Sweep.ar(trig, grainFreq);
	var overlap = \overlap.kr(2).clip(0, grainFreq / tFreq);

	var windowPhase = phase / overlap;
	var rectWindow = windowPhase < 1;

	var pulsaretPhase = (overlap - phase) ** 3;
	
	var sig = sin(pulsaretPhase * 2pi);
	
	[pulsaretPhase * rectWindow, sig * rectWindow];

}.plot(0.01);
)

rgaighi