midi controllerを直す

ずっと使ってきたmidi controllerですが、トリガーしなかったり、逆に二度押しになっちゃったり、時々ちゃんと動かないことがあるようでした。

以前からプログラム的にもいまいちなところがあって、いれかえたいと思っていたので、時間のあるときに新しいものと入れ替えてみました。

そうしたら、取りこぼしがなくなっただけでなく、midi送信のタイミングが体感的にも早くなったような。
とりあえず新しいコードは以下。


#define pushVal 0  //for push-on switches.
//#define pushVal 1  //Otherwise,use this for push -off switches.
#define nd 4  //number of digital switches.
#define msg 176  //controll change. note-on:144 note-off:128

const int inPin[nd] = {4,6,8,10};  //input pins for switches.
const int gndPin[nd] = {5,7,9,11};  //input pins' ground.
const int val1[nd] = {70,71,72,73};  //controll No or note No
int val2[nd];  //controll value or velocity

long time[nd];  //the last time each switches was toggled.
const long debounce = 300;  //debounce time. Increase if the output flickers.

void setup(){
  for(int i=0 ; i < nd ; i++ ){
    pinMode(inPin[i] , INPUT);
    digitalWrite(inPin[i] , HIGH);
    pinMode(gndPin[i] , OUTPUT);
    digitalWrite(gndPin[i] , LOW);
    
    time[i] = millis();
    
    val2[i] = readPin(i);
  }  
    Serial.begin(31250);
}
void loop(){
  int reading;
  long now; 
  
  for(int i = 0 ; i < nd ; i++ ){
    reading = readPin(i);
    
    if(reading != val2[i]){
      now = millis();
      
      if(now-time[i] > debounce){
        val2[i] = reading;
        MIDI_TX(msg , val1[i] , val2[i] );
        time[i] = now;
      }
    }
  }
}

int readPin(int i){
  
  return digitalRead(inPin[i])  == pushVal ? 127 : 0 ;
}

void MIDI_TX(int MESSAGE, int VAL1, int VAL2) 
{
  Serial.print(MESSAGE,BYTE);
  Serial.print(VAL1,BYTE);
  Serial.print(VAL2,BYTE);
}

コードここまで。変更したのは
  1. グローバルで設定していた変数をloop( )内で完結するものはローカル変数にする
  2. 同じ手続を関数にまとめる
  3. 複雑な論理式を分割して単純なものにする
  4. 複雑な論理式を条件演算子で書き換える
それぞれ同じ色のところが対応箇所です。
デバッグ環境がないので本当のところはよく分からないのですが、反応が速くなったということであれば3の論理式の単純化が効いているのかなと思います。

条件演算子はarduinoのマニュアルには載ってなかったけど、同じCだし使えるんじゃね?と思ってやってみたら普通に使えました。こっちのほうが直感的なんで。


スイッチを押して左右にこじるような動きをするとたしかにスイッチが入ったり切れたりするのでそこはハードの問題かなと。なにせ安いスイッチなので。

秋葉原にいって良い(=高い)スイッチを買ってきて付け替えました。

一個650円也。一桁違います。クリック感があって押しやすい。

配線が太すぎて、箱を開けたらはんだづけしてる所が三カ所とれた。不良だったんだね。
とりあえず付け直してそっと閉じる。その内、配線し直します。



コメント