ArduinoとMIDI vol.32014年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 vol.22014年10月25日

ArduinoでMIDIコントローラーを作成する。(プロトタイプ)

SainSmart UNO R3がうまく動作したので目的のMIDIコントローラーの作製に入ります。ATmega328Pはアナログポートが6ポートしかありませんので74HC4051や74HC4052などLOGIC ANALOG MULTIPLEXERSを利用してアナログポート数を拡張する必要があります。今回は9個のVRを接続します。

  • MIDI出力で接続:
    Arduinoのシリアル出力を使用します。Arduino MIDI Libraryを使用してスケッチを作成します。
  • USB MIDI:
    LUFAでbootloaderを書き換えてUSB MIDI化します。

Arduinoで作成したMIDIコントローラーがUSB MIDI機器として認識してくれれば市販のDAWソフトのフィジカルコントローラーとして利用できます。

ArduinoとMIDI vol.12014年10月25日

ArduinoでMIDI【リサーチ】

ArduinoにはMIDIシールドなどMIDIに関連したシールドが販売されています。また、ArduinoクローンメーカーでMIDIに 特化したMIDUINOもあります。ArduinoはMIDIを使用したフィジカルコントローラーを作成するのに大変都合が良く出来ています。 Arduinoを使用した楽器を作ったり、MIDIコントローラ、MIDIシーケンサーやMIDIデータのアナライザーとして作成したり、コネクターや変換器として利用したりとArduinoは結構活躍しています。 最近のMIDI機器はPCでの利用が前提のせいでしょうかUSB MIDIになっています。Arduino UNO R2、R3でもUSBコントローラーに使用されているATmega8U2やATmega16U2はファームウエアを書き換えることで特別な ハードウエアなしでUSB MIDIに変身できます。

MIDIに関するメッセージ仕様はこちらを参照ください。

MIDI KITSではキット販売と一緒にサンプル回路とスケッチが掲載されています。大変参考になります。
その他にSDカードの保存したMIDIファイルを再生するMr. MIDI2プレーヤーがあります。 このプレーヤーはArduinoと同じAVRマイコンを使用しています。このプレーヤーの出力はMIDIですので音源に接続して音を出します。YAMAHAのピアノプレーヤーなどにも出力できます。