// Vowel Recognizer and CPU Heater // by PRC, March 2008 BPF b[14]; Gain g[14]; OnePole p[14]; ["200Hz","252Hz","317Hz","400Hz","504Hz","634Hz", "800Hz","1kHz","1.27kHz","1.6kHz","2kHz","2.54kHz", "3.2kHz","4kHz"] @=> string names[]; ["Ahh","Ehh","Eee","Ohh","Ooo","..."] @=> string vnames[]; MAUI_View myWinder; myWinder.size(350.0,650.0); MAUI_Slider disp[14]; MAUI_Button train[6]; MAUI_LED which[6]; MAUI_Button exit; exit.name("Exit"); exit.position(270.0,570.0); myWinder.addElement(exit); MAUI_Button emit; emit.name("Emit"); emit.position(270.0,500.0); myWinder.addElement(emit); float states[6][14]; [0.29,0.48,0.45,0.59,0.75,0.99,0.95,0.74,0.58,0.38,0.31,0.23,0.16,0.10] @=> states[0]; [0.23,0.41,0.41,0.60,0.80,0.62,0.39,0.24,0.18,0.27,0.28,0.19,0.12,0.06] @=> states[1]; [0.32,0.60,0.41,0.27,0.14,0.07,0.04,0.03,0.03,0.05,0.13,0.14,0.23,0.15] @=> states[2]; [0.48,0.73,0.72,0.96,0.84,0.67,0.53,0.42,0.24,0.15,0.11,0.07,0.05,0.03] @=> states[3]; [0.56,0.86,0.78,0.95,0.64,0.45,0.35,0.22,0.14,0.09,0.06,0.04,0.03,0.02] @=> states[4]; [0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00] @=> states[5]; 8.0 => adc.gain; for (0 => int i;i < 14;1 +=> i) { adc => b[i] => g[i] => p[i] => blackhole; // b[i] => dac; // pass-thru for testing b[i] => g[i]; // make a 3 => g[i].op; // squarer 0.9995 => p[i].pole; // then smoothing 4.0 => b[i].Q; 200.0*Math.pow(1.2599,i) => b[i].freq; <<< b[i].freq() >>>; disp[i].position(0.0,45.0*i); disp[i].range(0.0,1.0); disp[i].precision(1); disp[i].name(names[i]); myWinder.addElement(disp[i]); } for (0 => int j;j < 6;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]); } myWinder.name("Vowel Recognizer"); myWinder.display(); float bestdist,dist,temp; int best; float logp[14]; 1 => int running; while (running) { 0.100 :: second => now; for (0 => int 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 => int j;j < 6;1 +=> j) { if (train[j].state()==1) { for (0 => int i;i < 14;1 +=> i) { logp[i] => states[j][i]; } <<< vnames[j], " trained" >>>; } else { 0.0 => dist; for (0 => int 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; if (emit.state()==1) { for (0 => int j;j < 6;1 +=> j) { <<< states[j][0], states[j][1], states[j][2], states[j][3], states[j][4], states[j][5], states[j][6], states[j][7], states[j][8], states[j][9], states[j][10], states[j][11], states[j][12], states[j][13] >>>; } } } myWinder.destroy();