///////////////////////////////////////////////////
// Sigmund: sinusoidal analysis & pitch tracking //
// //
// by Miller Puckette //
// //
///////////////////////////////////////////////////
// Options:
// npts (int): number of points used in analysis.
// Must be a power of 2, at least 128. The
// minimum frequency that can be tracked is
// about 2 * samplerate / npts
// default: 1024
//
// npeak (int): maximum number of sinusoidal peaks
// to look for. The computation time is
// quadratic in the number of peaks actually
// found (this number only sets an upper
// limit). Use it to balance CPU time with
// quality of results.
//
// maxfreq (float): maximum frequency of sinusoidal
// peaks to look for. This can be useful in
// situations where background nose creates
// high-frequency, spurious peaks...
//
// minpower (float): minimum dB level to
// report a pitch. Signals quieter than this
// will be assumed to be crosstalk and ignored.
// default: 50
//
// freq() (read-only): get reported frequency of
// input signal
//
// env() (read-only): get reported RMS value (in dB)
// of input signal
//
// peak (int): report freq of nth sinusoundal peak
// sorting depends on parameter "dotracks"
//
// amp (int): report amplitude of nth sinusoundal peak
// sorting depends on parameter "dotracks"
//
// tracks (0/1): toggle whether peak and amp are
// sorted in order of amplitude or organized into
// tracks
//
// clear(): clear buffers and reset
//
// param1, param2, param3 (float): mysterious settings...
// must connect to blackhole to perform DSP
TriOsc foo => Sigmund siggy => blackhole;
4096 => siggy.npts;
20 => siggy.npeak;
1000 => siggy.maxfreq;
25 => siggy.minpower;
while (true)
{
Math.random2f(5,300) => foo.freq;
Math.random2f(0,1) => foo.gain;
second => now;
<<< "Real frequency:",foo.freq(),"real gain:",foo.gain(),"Sigmund found this:",siggy.freq(), "power:", siggy.env() >>>;
}