以前、Arduino UNOと@morecat_labさん作「mocoLUFA」を使ってMIDIコンを作る方法を紹介しましたが、何人かの方に、Microでも使える?
と聞かれたので、Microを使ったやり方も紹介したいと思います。
MicroやLeonardoだとrkistner/arcoreを使うと楽
Arduino MicroやArduino Leonardoは、ATmega32U4が1つだけ搭載されたマイコンボードです。これらのボードは、Arduio UNOとは仕組みが違うので、同じ方法ではMIDIデバイスにできません。
そこで今回は、rkistner/arcoreを使ってMIDI機能を使えるようにしてみましょう。
インストールは簡単
私が試せる環境がMacしかなく申し訳ありません。Windowsでも同じように出来るはずです。
今、例のArduino戦争のお陰で、Arduino IDEは2カ所からリリースされているという状況ですが、Arduino IDE 1.6.3を使うことにします。
arcoreのダウンロードとフォルダ構成の変更
まず、rkistner/arcoreをダウンロードします。
すると、いろいろファイルが出てきます。
この中から、hardware
フォルダをarcore
などにrenameしてください。
インストール先
renameしたarcore
フォルダを下記フォルダ配下に移動してください。
Arduino.app/Contents/Java/hardware/
Macの場合、インストールされた Arduino.appを「パッケージの内容を表示」で開くと下の階層にアクセスできます。
これでインストール完了。
簡単ですね!
使い方。
それでは、使ってみましょう。
インストール後、Arduino IDEを再起動すると、ボードメニューに、Arduino AVR Boards (arcore)
という項目が追加されます。
使ってるボードに合わせ、Arduino Micro (arcore)
やArduino Leonardo (arcore)
など選んでください。
その後、スケッチを書き込むとUSB-MIDI機能が追加されます!
ただし。
Arduino UNO Rev.3+MIDI.h+mocoLUFAを使った方法より、低レベルなAPIしかありません。
USB-MIDIの4byteのパケットを送受信できるようになるだけです。
というわけで、使いたい機能をある程度自分で作りながらスケッチを書く必要があります。
とはいえ、そんなに難しくはありません。
githubのサンプルを見ればだいたいわかります。
たとえば、ボタンを押したらNoteOnを送る、というスケッチは下記のような感じでOKです。
(ボタンは9番ピンに繋いでください)
void noteOn(byte channel, byte pitch, byte velocity) {
MIDIEvent noteOn = {0x09, 0x90 | channel, pitch, velocity};
MIDIUSB.write(noteOn);
}
int obutton;
void setup() {
pinMode(9,INPUT);
}
void loop() {
int button = digitalRead(9);
if((obutton != button)&&(button == HIGH)){
noteOn(0, 60, 100);
MIDIUSB.flush();
}
delay(100);
}
Androidで使おうとするとキーボードでなくなるんだけど、どーすんだ!?
2015.12.5 追記
今日ハマり一瞬焦りましたので解決方法を。
arcore/avr/cores/arcore/USBDesc.h
を開いて、下記をコメントアウトしてください。
#define HID_ENABLED
コメントアウト後、もう一度Arduino IDEを再起動してスケッチをビルド→書き込みすると治ります。(キーボードとして認識されなくなり、単なるMIDIデバイスになる)
まとめ
rkistner/arcoreを使えば、Arduino MicroやLeonardoで簡単にMIDIデバイスがつくれるので、やってみよう!
MIDIは楽しいよ!