2012年4月22日

Arduino + GarageBand (MIDIキーボードもどき)

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク

久しぶりの投稿にして久しぶりのArduinoネタ。

ボタンを押すとドレミファソラシドが鳴るというもので、やっていることは至って簡単。
どのタクトスイッチが押されてるか判定してSerial.printで吐き出し、Mac側でSerial MIDI Converterなるソフトを使ってIAC DriverにMIDI信号を渡し、GarageBandで読み取る。
Arduino → Serial MIDI Converter → IAC Driver → GarageBandというフロー。

ブレッドボード上のタクトスイッチはプルダウン、抵抗は1KΩを入れてある。
チャタリング除去はソフトウェア側にお任せ。(Bounceライブラリを使用)
#include <Bounce.h>

byte pins[8] = {13,12,11,10,9,8,7,6};
byte pitch[8] = {60,62,64,65,67,69,71,72};
int status[8] = {0};

Bounce button[] = {Bounce(pins[0],20),
                   Bounce(pins[1],20),
                   Bounce(pins[2],20),
                   Bounce(pins[3],20),
                   Bounce(pins[4],20),
                   Bounce(pins[5],20),
                   Bounce(pins[6],20),
                   Bounce(pins[7],20)};

void setup() {
  for (int i=0; i< 8; i++) {
    pinMode(pins[i], INPUT);
  }
  Serial.begin(57600); 
}

void loop(){
  for (int i=0; i< 8; i++) {
    button[i].update ();
    
    if ((button[i].read() == HIGH)&&(status[i] == 0)) {
      MIDI_TX(144,pitch[i],127);
      status[i] = 1;
    }if ((button[i].read() == LOW)&&(status[i] == 1)) {
      MIDI_TX(128,pitch[i],127);
      status[i] = 0;
    }if ((button[i].read() == HIGH)&&(status[i] == 1)) {

    }if ((button[i].read() == LOW)&&(status[i] == 0)) {
    
    }
  }
}

void MIDI_TX(unsigned char MESSAGE, unsigned char PITCH, unsigned char VELOCITY) 
{
  Serial.print(MESSAGE);
  Serial.print(PITCH);
  Serial.print(VELOCITY);
}
という感じ。
#相変わらずエレガントさに欠けるなぁ...

MIDIのメッセージについては、144がCh1のNote ONで128がCh1のNote OFFである。
144-128=16で分かるとおり、16チャンネル扱えることが分かる。
ピッチは鍵盤中央のドを60として半音ごとに1増減という仕様。

実際に音を鳴らしてみたり。(黒鍵はブレッドボード上に未実装なので白鍵だけ)

※画面録画です。(手元は上の写真を見てご想像ください)

あとは、このタクトスイッチを踏んでも大丈夫な別の素子に変えて階段に仕掛ける予定。
元ネタはフォルクスワーゲンのピアノ階段という動画。
前々から真似してみたかったので、今年の学園祭で学校に同様の物を仕掛けようかと画策中。

問題はArduino UNO(328)だと入力が足りないこと。
アナログをデジタルに回しても20本しかないので、1オクターブとちょっとしか対応出来ない。
Mega(2560)を使う or UNO(328)を多段にするなど考え中...
追記
シフトレジスタ(PISO)の74HC165を使って入力を増やす方法を教えてもらいました。
時間がある時に試してみます。
本家(ピアノ階段)で使ってる踏んだ時に感知する方法が気になる...
フィルムタイプの圧力センサは高いので代替できる手段を調査中。

追記
階段用スイッチの仕組みを考えました。 → お手製パネルスイッチ

追記2
GarageBand階段、完成しました。 → Arduinoでピアノ階段 with GarageBand