// Octave-band Spectrum Analyzer, Vocoder, and CPU Heater // Originally by PRC, March 2008 // for TeQWire Seminar/concerts, and Hacked much since BPF b[10]; // Analysis Filter Bank Gain g[10]; OnePole p[10]; // Envelope Followers ["20Hz","40Hz","80Hz","160Hz","320Hz", "640Hz","1280Hz","2.5kHz","5kHz","10kHz"] @=> string names[]; BPF b2[10]; // Synthesis Filterbank // side chain to screw up voice adc => FullRect rect => HalfRect rect2 => PitShift pit => Gain screwVoice; adc => ZeroX zx=> rect; Step bias => rect2; -0.3 => bias.next; 1.03 => pit.shift; 0.5 => pit.mix; MAUI_View myWinder; myWinder.size(250.0,600.0); MAUI_Slider disp[10]; MAUI_Button exit; exit.name("Exit"); exit.size(250,60); exit.position(0,510);myWinder.addElement(exit); MAUI_Slider inGain; inGain.name("gain"); inGain.position(0,540); inGain.range(0.0,10.0); inGain.value(1.0); myWinder.addElement(inGain); 1.0 => adc.gain; // global gain adjustment for (0=>int i;i<10;1+=>i) { adc => b[i] => g[i] => p[i] => blackhole; screwVoice => b2[i] => dac; // run screwed up voice into synth filters b[i] => g[i]; // make a 3 => g[i].op; // squarer 0.9995 => p[i].pole; // and smoothing filter 2.0 => b[i].Q => b2[i].Q; 20.0 * Math.pow(2.0,i) => b[i].freq => b2[i].freq; // octave bands disp[i].position(0.0,50.0*i); disp[i].range(0.0,1.0); disp[i].name(names[i]); myWinder.addElement(disp[i]); } myWinder.display(); while (!exit.state()) { 0.02 :: second => now; inGain.value() => adc.gain; for (0=>int i;i<10;1+=>i) { 0.5 * (Math.log10(p[i].last() + 0.01) + 2.0) => disp[i].value; p[i].last() => b2[i].gain; } } myWinder.destroy();