PV_NoiseSynthP return only bins that are unstable
PV_PartialSynthP return only bins that are stable
PV_NoiseSynthP and PV_PartialSynthP base these decisions on whether or not phase data across numFrames is within a given threshold
PV_NoiseSynthP(buffer, threshold, numFrames, initflag)
PV_PartialSynthP(buffer, threshold, numFrames, initflag)
buffer - the FFT buffer
threshold - a phase value (in radians) with which to allow values to pass through or be zeroed out
numFrames - the number of FFT frames needed to make the above decision
initflag - if 0, all bins are zeroed out while the initial is calculated, if 1, all bins pass through.
Examples:
{SinOsc.ar(440, 0, 0.5) + PinkNoise.ar(0.4)}.play; // a sample sig
SynthDef(\partialsynth, {arg fftbuf;
var in, chain, out;
in = SinOsc.ar(440, 0, 0.5) + PinkNoise.ar(0.4);
chain = FFT(fftbuf, in);
// resynhtesize according to MouseX if 0, only sound with VERY stable changes of phase
// will be returned. If pi, everything will be returned (+ or - pi)
chain = PV_PartialSynthP(chain, MouseX.kr(0, pi));
out = IFFT(chain);
Out.ar(0, out.dup);
}).load(s);
s.boot;
// the fft buf
s.sendMsg(\b_alloc, 0, 2048);
// start the synth
s.sendMsg(\s_new, \partialsynth, z = s.nextNodeID, 0, 1, \fftbuf, 0);
// free it
s.sendMsg(\n_free, z);
s.sendMsg(\b_free, 0);
SynthDef(\noisesynth, {arg fftbuf;
var in, chain, out;
in = SinOsc.ar(440, 0, 0.5) + PinkNoise.ar(0.4);
chain = FFT(fftbuf, in);
// resynhtesize according to MouseX if 0, every thing will be returned... as the value
// increases, bins with VERY stable change of phase are zeroed out, until everything is
// at +-pi
chain = PV_NoiseSynthP(chain, MouseX.kr(0, pi));
out = IFFT(chain);
Out.ar(0, out.dup);
}).load(s);
s.boot;
// the fft buf
s.sendMsg(\b_alloc, 0, 2048);
// start the synth
s.sendMsg(\s_new, \noisesynth, z = s.nextNodeID, 0, 1, \fftbuf, 0);
// free it
s.sendMsg(\n_free, z);
s.sendMsg(\b_free, 0);
s.quit