PV_MagBuffer Store FFT data in another buffer for other use
PV_FreqBuffer
PV_MagBuffer(buffer, databuffer)
PV_FreqBuffer(buffer, databuffer)
databuffer - a buffer of (fft buffer size / 2) for storing freq or mag data in
Examples:
// stores the Mag values from an FFT analysis into a buffer to be used outside the FFT process
(
SynthDef(\magbufferana, {arg fftbuf, sndbuf, magbuf, freqbuf;
var in, chain;
in = PlayBuf.ar(1, sndbuf, BufRateScale.kr(sndbuf), loop: 1);
chain = FFT(fftbuf, in);
chain = PV_MagBuffer(chain, magbuf);
chain = PV_FreqBuffer(chain, freqbuf);
IFFT(chain);
}).load(s);
SynthDef(\magbuffersynth, {arg gate = 1, magbuf, freqbuf, fftframes, scale = 1;
var pars, src, out, trig, env;
env = EnvGen.kr(Env([0, 1, 0], [1, 1], \sin, 1), gate, doneAction: 2);
// we'll grab 50 random partials
pars = Array.fill(50, {IRand.new(5, fftframes)});
// use PinkNoise as a filter src
src = PinkNoise.ar(0.5);
// Index the freq and mag buffers to control a filter bank
out = (BPF.ar(src, Index.kr(freqbuf, pars), 0.001) * Index.kr(magbuf, pars)).sum * scale;
Out.ar(0, out * env);
}).load(s);
)
s.boot;
// allocate the fft buf, sndbuf, and mag and freq bufs
(
s.sendBundle(0.1, [\b_alloc, 0, 1024], [\b_allocRead, 1, "sounds/a11wlk01.wav"], [\b_alloc, 2, 512],
[\b_alloc, 3, 512]);
)
// start the analuysis
(
s.sendMsg(\s_new, \magbufferana, z = s.nextNodeID, 0, 1, \fftbuf, 0, \sndbuf, 1,
\magbuf, 2, \freqbuf, 3);
)
(
// there is a strange buildup of energy when a note starts... so, start the synthesis a bit later
s.sendMsg(\s_new, \magbuffersynth, y = s.nextNodeID, 1, 1, \magbuf, 2, \freqbuf, 3,
\fftframes, 512);
)
( // kill the current note, start a new one (with different pars)
s.sendMsg(\n_set, y, \gate, 0);
s.sendMsg(\s_new, \magbuffersynth, y = s.nextNodeID, 1, 1, \magbuf, 2, \freqbuf, 3,
\fftframes, 512)
)
// free the synthesis synth
s.sendMsg(\n_set, y, \gate, 0)
// free the analysis
s.sendMsg(\n_free, z);
// free the buffers
4.do{arg i; s.sendMsg(\b_free, i)};
s.quit