Arduino USBMIDIライブラリ

USB-MIDIはUSBケーブルでパソコンとArduinoを接続すると、ArduinoがMIDIデバイスとして扱うための規格です。 USBの規格団体USB-IFで1999年に規格化されています。 仕様書がUSB MIDI Devices 1.0からダウンロードできます。

ちなみに2020年に、新しいバージョンがリリースされています。 USB Class Definition for MIDI Devices v2.0 しかし、こちらに対応したデバイスやライブラリは今日現在無いようです。

Arduino IDEのライブラリマネージャで、MIDIUSBで検索をすると、3つのライブラリが見つかります。 一つはMIDIUSB、もう一つはUSB-MIDI、もう一つはUSBMIDIです。(とても紛らわしいです。)

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

MIDIUSB

MIDIUSBはarduino.LCCが提供する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で動作するデバイスのみがここで動作します)。

従って、MIDIUSBをより便利に使うためのライブラリです。

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

こちらのライブラリでは、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が開発しているライブラリです。

ライブラリのReadme.mdにMIDIUSBとの違いが書かれています。

Arduino には MIDIUSB と呼ばれる同様のライブラリがあり、USBMIDI と比較的同じ時期に開発されました。 最大の違いは、MIDIUSBライブラリが新しいいインターフェイスを備えたAPIを導入したのに対し、 こちらのUSBMIDIライブラリは Stream 基本クラスを継承して実装することで Serial オブジェクトと同じ使い慣れたインターフェイスを 公開していることです。 したがって、MIDI の既存のプログラムは、シリアル通信TX/RX UART ピンを使用して DIN-5 ポート経由で MIDI データを送受信するためにシリアルを使用しています。 こちらのUSBMIDIライブラリはシリアルの代わりに USBMIDIオブジェクトを使用するだけでまったく同じコードを適合させることができます。

すなわち、これまでに作ったシリアル通信で書かれたプログラムをそのまま使えます、ということがメリットと言えます。 さらに、利用できるマイコンの範囲が広がっています。

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);