ミュージシャンである同僚が、可変抵抗ではなくボタンでテンポを設定するために、シンセサイザーにプレフィックスを付けるように頼みました。
実装には、最も手頃な価格のArduinoが選択されました。
MIDIの基本を吸った後、特別なbyte-0xF8がテンポの設定を担当していることがわかりました。 標準では、1秒あたり1ビート、つまり60 bpm(1分あたりのビート)の速度で、1秒あたり24個のこのようなメッセージを受け入れます。
そのため、ボタンを押すのをやめ、ボタンの間隔を空けて、対応する信号を小さな画面に表示する必要があります。
良さそうに聞こえますが、実際には、画面に表示されるものが実際の信号と結合しないことが判明し、変数の1つがFLOATではなくINTであることが判明したため、シンセサイザーへの信号は画面に0.001に表示されていましたが、最も近い整数に丸められました。
変数の種類を修正した結果、素晴らしい結果が得られましたが、ヒューマンファクターは私を失望させました-同僚は希望のペースを正確にタップできませんでした。 したがって、改良が追加されました。後続の各間隔は前の間隔に追加され、2で除算されます(平均化)。
結果は良くなりましたが、プラグは希望する値を中心に判明しました。たとえば、120bpmが必要で、117と124が出てきました。
その結果、最適なアルゴリズムが生まれました。
1から20までの間隔が(ランダムに)記録され、値は各プレスで平均化され(画面上のテンポ変化のダイナミクスが見えるようになります)、オペレーターが1.5秒間クリックしない場合、間隔値の配列がリセットされ、再び開始できます。 1分あたり40ビートの最小リズムを決定するのに1.5秒かかりました。
コード
//6 //Tx1- #include <LiquidCrystal.h>///// LiquidCrystal lcd(12, 11, 5, 4, 3, 2);/// int statButton=0;/// int laststatButton=LOW; unsigned long int lastinHigh=0;/// unsigned long int inHigh=0; unsigned long int clock=0; unsigned long int lastclock=0; int durations[19];/// int count=0; int duration=0; float sum=3000;//// float bps=2;// float mps;/// TapTempo float tic; int count2=0;/// int count3=0; int count4=0; void setup() { Serial.begin(31250);/////////////// //Serial.begin(9600); pinMode(6,INPUT); lcd.begin(16, 2); } void loop() { mps=bps*24 ;// * tic=1000000/mps;// / clock=micros();/// if(clock-lastclock>tic)/// { Serial.write(byte(0xF8));/// lastclock=clock; } if(count2==400)/// { readbut(); count2=0; } count2++; if(count3==2000)// { lcd.clear(); //lcd.setCursor(0, 0); lcd.print(bps*60); count3=0; } count3++; } void readbut()/// { statButton=digitalRead(6); if(statButton==HIGH&&laststatButton==LOW)/// LOW HIGH { inHigh=millis();/// duration=inHigh-lastinHigh;// // Serial.println(duration); if(duration<1500&&duration>100)// { if(count<19)/// { durations[count]=duration; // Serial.println(durations[count]); count++; } }else{ for(int i=0;i<19;i++) { durations[i]=0; } count=0; } } lastinHigh=inHigh; laststatButton=statButton; for(int i=0;i<19;i++)/// { if(durations[i]!=0)// { sum=(sum+durations[i]); // println(durations[i]); count4++ ;// bps=1000.0/(sum/count4);/// / } } count4=0; sum=0; }
その結果、すべてが機能し、パフォーマンスに参加します。
あなたが希望や提案がある場合-書いてください。