(
SynthDef(\voiceEvolving, {
	arg out=0, bufnum, amp=0.5, windowSize=1024;
	var in, chain, sig;
	var smearAmt, shiftAmt, wipeTrig;

	in = PlayBuf.ar(1, bufnum, BufRateScale.kr(bufnum), loop: 1);

	// FFT processing
	chain = FFT(LocalBuf(windowSize), in);

	// Slowly changing modulation sources
	smearAmt = LFNoise1.kr(0.1).range(5, 50);         // how smeared the spectrum is
	shiftAmt = LFNoise1.kr(0.07).range(-30, 30);      // shifting bins in pitch space
	wipeTrig = Dust.kr(0.3);                          // occasional spectral dropouts

	// PV mutations
	chain = PV_MagSmear(chain, smearAmt);
	chain = PV_BinShift(chain, shiftAmt);
	chain = PV_RandWipe(chain, wipeTrig);

	sig = IFFT(chain) * amp;

	// Optional: gentle filtering
	sig = LPF.ar(sig, 1000);

	Out.ar(out, sig.dup);
}).add;
)

Synth(\voiceEvolving, [\bufnum, b, \amp, 0.4]);
