Classes (extension) | Libraries > JoshUGens | UGens > FFT

PV_BufRd : PV_ChainUGen : WidthFirstUGen : UGen : AbstractFunction : Object

Plays FFT data from a memory buffer
Source: JoshPV.sc


PV_BufRd will play back FFT data stored to a buffer with PV_RecordBuf.

WARNING: Resynth of a FFTs with large window sizes may cause CPU spikes.

PV_RecordBuf stores FFT data to a buffer for use by a number of PV UGens.

Class Methods

PV_BufRd.new(buffer, playbuf, point: 1)



The FFT buffer to fill data into


The buffer to read frames of FFT data fram.


A value between 0.0 and 1.0. 0.0 is the beginning of the file, 1.0 the end. Values greater then 1.0 or less then 0.0 are wrapped into this range.

Inherited class methods

Instance Methods

Inherited instance methods


// anazlyze a soundfile and store its data to a buffer

s = Server.local;

var sf;
// path to a sound file here
p = Platform.resourceDir +/+ "sounds/a11wlk01.wav";
// the frame size for the analysis - experiment with other sizes (powers of 2)
f = 1024;
// the hop size
h = 0.25;
// get some info about the file
sf = SoundFile.new( p );
// allocate memory to store FFT data to... SimpleNumber.calcPVRecSize(frameSize, hop) will return
// the appropriate number of samples needed for the buffer
y = Buffer.alloc(s, sf.duration.calcPVRecSize(f, h));
// allocate the soundfile you want to analyze
z = Buffer.read(s, p);

// this does the analysis and saves it to buffer 1... frees itself when done
SynthDef("pvrec", { arg recBuf=1, soundBufnum=2;
    var in, chain, bufnum;
    bufnum = LocalBuf.new(1024);
    Line.kr(1, 1, BufDur.kr(soundBufnum), doneAction: 2);
    in = PlayBuf.ar(1, soundBufnum, BufRateScale.kr(soundBufnum), loop: 0);
    // note the window type and overlaps... this is important for resynth parameters
    chain = FFT(bufnum, in, 0.25, 1);
    chain = PV_RecordBuf(chain, recBuf, 0, 1, 0, 0.25, 1);
    // no ouput ... simply save the analysis to recBuf
a = Synth("pvrec", [\recBuf, y, \soundBufnum, z]);

// you can save your 'analysis' file to disk! I suggest using float32 for the format
// These can be read back in using Buffer.read

y.write(p++".scpv", "wav", "float32");

// play your analysis back ... see the playback UGens listed above for more examples.
SynthDef("pvplay", { arg out=0, recBuf=1;
    var in, chain, bufnum;
    bufnum = LocalBuf.new(1024);
    chain = PV_BufRd(bufnum, recBuf, MouseX.kr(0.0, 1.0));
    Out.ar(out, IFFT(chain, 1).dup);
b = Synth("pvplay", [\out, 0, \bufnum, x, \recBuf, y]);

// stop the synth