ArduinoとMIDI vol.3
2014-10-25


ArduinoでMIDIコントローラーを作成する。(スケッチ)

Arduino MIDI コントローラーを参考にLOGIC ANALOG MULTIPLEXERSは手持ちのTI 4052を使用したスケッチを書いてみました。 MIDIチャネルの選択にKeypadを使用しています。いくつかの問題はありますが、一応動いています。

MIDI Control Change for SC-88Pro
#include <MIDI.h>
#include <Keypad.h>

MIDI_CREATE_DEFAULT_INSTANCE();

#define LED 13
#define A4052 10
#define B4052 11

const byte ROWS = 4; //four rows
const byte COLS = 4; //four columns
char keys[ROWS][COLS] = {
  {'1','2','3','A'},
  {'4','5','6','B'},
  {'7','8','9','C'},
  {'*','0','#','D'}
};
//connect to the row pinouts of the keypad
byte rowPins[ROWS] = {9, 8, 7, 6};
//connect to the column pinouts of the keypad
byte colPins[COLS] = {5, 4, 3, 2};
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );

int sensor1Pin = 0;
int sensor2Pin = 1;
int volumePin = 2;
int sensorValue;
int midiValue = 0;
int old_midiValue[8];
int old_volValue;

int midiCh = 1;

int r0 = 0;     // 4052 Abit
int r1 = 0;     // 4052 Bbit
int row = 0;
int count = 0;
byte bin[] = {0,1,10,11};    //bin array org

int cc[] = {10,11,91,93,94,64,65,66};   // SC-88Pro Control change
// PAN, EXP, Reverb, Chorus, Dely, Hold1, Portamento, Sostenuto

boolean checkChange(int val1,int val2, int range){
  int l,h;
  l = val2-range;
  h = val2+range;
  if((l > val1)||(h < val1)){
   return true;
  } else {
   return false;
  }
} 

void control(){
    if(count > 3){
      count = 0;
    }
    row = bin[count];
    r0 = row & 0x01;
    r1 = (row>>1) & 0x01;
    digitalWrite(A4052,r0);
    digitalWrite(B4052,r1);
    
    sensorValue = analogRead(volumePin);  // read volume
    midiValue = sensorValue / 8;
    if(checkChange(midiValue, old_volValue, 2)){
       MIDI.sendControlChange(7,midiValue,midiCh);
       old_volValue = midiValue;
    }

    int ccc = count;
    sensorValue = analogRead(sensor1Pin);  //read Y ch
    midiValue = sensorValue / 8;
    if(checkChange(midiValue, old_midiValue[ccc], 2)){
       MIDI.sendControlChange(cc[ccc],midiValue,midiCh);
       old_midiValue[ccc] = midiValue;
    }
    
    ccc = count + 4;
    sensorValue = analogRead(sensor2Pin);  // read X ch
    midiValue = sensorValue / 8;
    if(checkChange(midiValue, old_midiValue[ccc], 2)){
       MIDI.sendControlChange(cc[ccc],midiValue,midiCh);
       old_midiValue[ccc] = midiValue;
    }

    count++;
}

void setup(){
  pinMode(LED, OUTPUT);      //LED13
  pinMode(A4052, OUTPUT);    //4052 Abit
  pinMode(B4052, OUTPUT);    //4052 Bbit

  old_volValue = 0;
  for(int i=0; i>7; ++i){
    old_midiValue[i] = 0;
  }

  MIDI.begin(1);
}

int keybuf = 1;
int keycnt = 0;

void loop(){
  char key = keypad.getKey();
  if(key){
    if (key == '#'){
      midiCh = keybuf;
      keybuf = 1;
      keycnt = 0;
    }else{
      if(keycnt > 0){
        keybuf = keybuf * 10 + atoi(&key);
      }else{
        keybuf = atoi(&key);
      }
      keycnt += 1;
    }
  }

 control();
}

使用したArduino IDEのバージョンは1.0.6です。
ソースプログラム中のカギ括弧にご注意ください。HTMLのタグとの区別ため一部に全角文字を使用しています。Arduino IDEの置換え機能で半角に変換してからコンパルしてください。

作成したMIDIコントローラーはUSB MIDI機器として認識してデバッグにはMIDI-OX というMIDIユーティリティーソフトを使用しています。フィジカルコントローラーとしてはいまいちですがこれからブラシアップしていく予定です。

[Arduino]
[MIDI]

コメント(全0件)


記事を書く
powered by ASAHIネット