adc => ZeroX z => FullRect f => OnePole p => blackhole; // basic patch -1.0 => p.a1; // This is dangerous, 1.0 => p.b0; // but we know what we're doing 100.0 => float lowest; // Lower limit on our pitch estimate 500.0 => float highest; // Upper limit on our pitch estimate 0.0 => float myZeroes; // This holds the last zero crossing count SinOsc s => dac; spork ~ ZC(0.040); float freq; while (1) { 0.04 :: second => now; // hang out myZeroes/0.04/2 => freq; // frequency=#zero pairs per window (we hope) <<< "Frequency = ", freq >>>; if (freq>lowest && freq s.freq; // control our 1.0 => s.gain; // tracking oscillator } else 0.0 => s.gain; // or mute it } fun void ZC(float howoften) { howoften*44100 - 1 => float wait; while (1) { wait :: samp => now; // hang out counting p.last() => myZeroes; // save count 0.0 => p.a1; // Clear 0.0 => p.b0; // our 1 :: samp => now; // counter -1.0 => p.a1; // Start counting 1.0 => p.b0; // again } }