Arduino USBMIDIライブラリ

Arduino IDEのライブラリマネージャで、MIDIUSBで検索をすると、3つのライブラリが見つかります。

似たような名前のライブラリですが、それぞれの特色を記載します。

MIDIUSB

MIDIUSBはarduino.ccが提供するatmega32u4またはARMボード用のライブラリです。USBの一般的なArduinoでは一般的なライブラリPluggableUSBをベースに作られています。

MIDIの受信 MidiUSB.read()
MIDIの送信 MidiUSB.send(midiEventPacket_t event)

上記のようなシンプルな関数を持っています。こちらのGithubで公開されています。

USB-MIDI

USB-MIDIはUSBとMIDIの間に"-"が入っています。こちらのGithubで公開されています。

このライブラリは、FortySevenEffects Arduino MIDIライブラリのトランスポート層を使っています。また、基盤となるArduino MIDIUSBライブラリ(上述しています)を使用します。(従って、MIDIUSBで動作するデバイスのみがここで動作します)。

ライブラリをインストールしようとすると、以下のように2つのライブラリ(MIDI LibraryとUSBMIDI)をインストールするように促されます。

こちらのライブラリでは、MIDIイベントにそれぞれにコールバック関数を設定することができます。

void setHandleNoteOn(NoteOnCallback fptr)
void setHandleNoteOff(NoteOffCallback fptr)
etc.

詳細は、Arduino\libraries\MIDI_Library\src\MIDI.hに記載があります。このコールバック関数があるおかげで、MIDIを受信した際、それぞれのメッセージが何であるかを自分のプログラムで判断する必要がありません。
また、USB MIDIだけでなくSerial MIDIに対しても同様の設定が可能です。

USBMIDI

USBMIDIこちらのGithubで公開されています。arduino.cc のページはこちらです。 BlokasLabが開発しているライブラリです。

PluggableUSBライブラリをサポートするデバイスで使えます。 その他のAVR8デバイスは、V-USBライブラリを使用してサポートされます。バージョン1.1.2以降、Digisparkボードが追加されました。

V-USBはこのライブラリをインストールすると、自動的にライブラリに追加されます。AVR8が搭載されたボードを使用する際には、こちらのライブラリがつかるはずです。(未確認)です。ATmega328pで使用するにはハードウェアの追加が必要です。MIDIUSBよりも対応するArduinoボード範囲は広くなります。こちらのページを参照して下さい。関数は以下のように、MIDI受信、MIDI送信が準備されています。

// Stream interface.
virtual int available();
virtual int read();
virtual int peek();
virtual void flush();

// Print interface.
virtual size_t write(uint8_t c);
*
Arduino NanoにUSBMIDIを搭載

ATmega328p搭載のArduino Nanoに回路を追加し、USBMIDIを使えるようにします。回路図は次の通りです。USBのコネクタを追加し、Nanoに接続します。

usbconfig.hをハードウェアに合わせて修正します。usbconfig.hは、Arduinoのスケッチを保存しているディレクトリ、私の場合はDocuments\Arduino\libraries\USBMIDI\srcにあります。メモ帳で開いて以下の3つの行を確認します。もち違った値が記載されていたら修正して下さい。

/* ---------------------------- Hardware Config ---------------------------- */

#ifndef USB_CFG_IOPORTNAME
#define USB_CFG_IOPORTNAME      D
#endif
/* This is the port where the USB bus is connected. When you configure it to
 * "B", the registers PORTB, PINB and DDRB will be used.
これは、USBバスが接続されているポートです。
「B」に設定すると、レジスタPORTB、PINB、DDRBが使用されます。
 */
#ifndef USB_CFG_DMINUS_BIT
#define USB_CFG_DMINUS_BIT      3
#endif
/* This is the bit number in USB_CFG_IOPORT where the USB D- line is connected.
 * This may be any bit in the port.
これは、USB D-ラインが接続されているUSB_CFG_IOPORTのビット番号です。
これは、ポートの任意のビットである可能性があります。
 */
#ifndef USB_CFG_DPLUS_BIT
#define USB_CFG_DPLUS_BIT       2
#endif
/* This is the bit number in USB_CFG_IOPORT where the USB D+ line is connected.
 * This may be any bit in the port. Please note that D+ must also be connected
 * to interrupt pin INT0! [You can also use other interrupts, see section
 * "Optional MCU Description" below, or you can connect D- to the interrupt, as
 * it is required if you use the USB_COUNT_SOF feature. If you use D- for the
 * interrupt, the USB interrupt will also be triggered at Start-Of-Frame
 * markers every millisecond.]
これは、USB D +ラインが接続されているUSB_CFG_IOPORTのビット番号です。 
これは、ポートの任意のビットである可能性があります。 
D +も割り込みピンINT0に接続する必要があることに注意してください!
 [他の割り込みを使用することもできます。
以下の「オプションのMCUの説明」のセクションを参照してください。
または、USB_COUNT_SOF機能を使用する場合に必要なため、D-を割り込みに接続できます。
割り込みにD-を使用すると、USB割り込みもミリ秒ごとにフレーム開始マーカーで
トリガーされます。
 */