// Vowel Recognizer and CPU Heater // by Perry R. Cook, March 2008, // improved April 2012 // further hacked Jan 2014 BPF b[14]; Gain g[14]; Gain g2[14]; OnePole p[14]; ["200Hz","252Hz","317Hz","400Hz","504Hz","634Hz", "800Hz","1kHz","1.27kHz","1.6kHz","2kHz","2.54kHz", "3.2kHz","4kHz"] @=> string names[]; ["Eee","Ihh","Ehh","Aaa","Ahh", "Aww","Ohh","Ooo","Rrr","Lll", "Mmm","..."] @=> string vnames[]; MAUI_View myWinder; myWinder.size(350.0,640.0); MAUI_Slider disp[14]; MAUI_Button train[12]; MAUI_LED which[12]; MAUI_Button exit; exit.size(80,80); MAUI_Slider vol; vol.position(0,570); vol.range(0.0,20.0); 8.0 => vol.value; myWinder.addElement(vol); exit.name("Exit"); exit.position(270.0,570.0); myWinder.addElement(exit); int i; 200.0 => float basefreq; float states[12][14]; adc => Gain inGain; 1.0 => adc.gain; 8.0 => inGain.gain; for (0=>i;i<14;1+=>i) { inGain => b[i] => g[i] => g2[i] => p[i] => blackhole; // b[i] => dac; b[i] => g2[i]; // hack to get around 3 => g2[i].op; // multi-patch "feature" 0.9995 => p[i].pole; // smoothing 4.0 => b[i].Q; basefreq => b[i].freq; <<< "Band 1 = ", basefreq >>>; 1.2599 * basefreq => basefreq; disp[i].size(270.0,70); disp[i].position(0.0,41.0*i); disp[i].range(0.0,1.0); disp[i].precision(1); disp[i].name(names[i]); myWinder.addElement(disp[i]); } int j; for (0=>j;j<12;1+=>j) { train[j].name(vnames[j]); train[j].size(70.0,60.0); train[j].position(250.0,40.0*j); myWinder.addElement(train[j]); which[j].position(290.0,40.0*j); myWinder.addElement(which[j]); for (0=>i;i<14;1+=>i) Std.rand2f(0.0,1.0) => states[j][i]; } myWinder.name("Is This Absurd or What?!"); myWinder.display(); float bestdist,dist,temp; int best; float logp[14]; 1 => int running; while (running) { 0.100 :: second => now; vol.value() => inGain.gain; for (0=>i;i<14;1+=>i) { 0.5 * (Math.log10(p[i].last() + 0.01) + 2.0) => logp[i]; logp[i] => disp[i].value; } 1000000.0 => bestdist; for (0=>j;j<12;1+=>j) { if (train[j].state()==1) { for (0=>i;i<14;1+=>i) { logp[i] => states[j][i]; } <<< vnames[j], " trained" >>>; } else { 0.0 => dist; for (0=>i;i<14;1+=>i) { logp[i]-states[j][i] => temp; dist + (temp*temp) => dist; } if (dist < bestdist) { dist => bestdist; j => best; } } which[j].unlight(); } which[best].light(); 1 - exit.state() => running; } myWinder.destroy();