シンセサイザーMIDIプレフィックス(taptempo)





ミュージシャンである同僚が、可変抵抗ではなくボタンでテンポを設定するために、シンセサイザーにプレフィックスを付けるように頼みました。



実装には、最も手頃な価格の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; }
      
      







その結果、すべてが機能し、パフォーマンスに参加します。



あなたが希望や提案がある場合-書いてください。



All Articles