//--
// name: Tracking.ck
// desc: class and process for tracking a peak and amplitutde via FFT
// the Tracking class can be accessed from external shreds
//
// author: Ge Wang + Rebecca Fiebrink
// date: 2007
//--
// public class
public class Tracking
{
static float the_freq;
static float the_gain;
static Event @ the_event;
}
// initialize separately (due to a bug)
new Event @=> Tracking.the_event;
// analysis
adc => PoleZero dcblock => FFT fft => blackhole;
// set to block DC
.99 => dcblock.blockZero;
// set FFT params
2048 => fft.size;
// window
Windowing.hamming( fft.size() ) => fft.window;
// go for it
while( true )
{
// take fft
fft.upchuck() @=> UAnaBlob blob;
// find peak
0 => float max; float where;
for( int i; i < blob.fvals().size()/8; i++ )
{
// compare
if( blob.fvals()[i] > max )
{
// save
blob.fvals()[i] => max;
i => where;
}
}
// set freq
(where / fft.size() * (second / samp)) => Tracking.the_freq;
// set gain
(max / .5) => Tracking.the_gain;
// clamp
if( Tracking.the_gain > 1 )
1 => Tracking.the_gain;
// fire!
Tracking.the_event.broadcast();
// hop
(fft.size()/4)::samp => now;
}