Arduino USB MIDIライブラリ

2024/8/31

USB MIDIに対応したデバイスをPCに接続すると、PCはデバイスをMIDIデバイスとして認識します。 PCとデバイス間でMIDIメッセージをやりとりすることができるようになります。 USB MIDIはUSBの規格団体USB-IFで1999年に規格化されています。 仕様書がUSB MIDI Devices 1.0からダウンロードできます。

2020年に、USB MIDIの新しいバージョンがリリースされています。 ドキュメントはUSB Class Definition for MIDI Devices v2.0です。 MIDI2.0 に対応した製品は今日現在、Roland A-88MKIIYamaha MONTAGE Mがあります。 しかし、MIDI2.0に対応したArduino用のライブラリは今日現在無いと思われます。

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

Arduino IDE 2.3.2では以下のバージョンが見つかりました。(August 31 2024)

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

1) MIDIUSB

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

MIDIのメッセージは、構造体midiEventPacket_tで扱います。midiEventPacket_tはこちらのページを参照して下さい。

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

MIDIの送受信は上記のようなシンプルな関数を持っています。 ソースコードはこちらのGithubで公開されています。

2) USB-MIDI

USB-MIDIはUSBとMIDIの間に"-"が入っています。このライブラリはMIDIUSBをより便利に使うためのライブラリです。 ソースコードはこちらのGithubで公開されています。

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

Arduino IDE 2.3.2では以下のバージョンが見つかりました。(August 31 2024)

こちらのライブラリでは、MIDIイベントにそれぞれにコールバック関数を設定することができます。 以下はNote On, Note Offのイベントにコールバック関数を設定しています。 コールバック関数の種類、使い方はUSB-MIDIサンプルスケッチ、AllEvents.inoのsetup()を参照すると良いでしょう。

void setup()
{
	Serial.begin(115200);
	while (!Serial);

	// Listen for MIDI messages on channel 1
	MIDI.begin(1);

	MIDI.setHandleNoteOn(OnNoteOn);			//0x90
	MIDI.setHandleNoteOff(OnNoteOff);		//0x80
	MIDI.setHandleAfterTouchPoly(OnAfterTouchPoly);	//0xA0
	MIDI.setHandleControlChange(OnControlChange);	//0xB0
	MIDI.setHandleProgramChange(OnProgramChange);	//0xC0
	MIDI.setHandleAfterTouchChannel(OnAfterTouchChannel);	//0xD0
	MIDI.setHandlePitchBend(OnPitchBend);			//0xE0
	MIDI.setHandleSystemExclusive(OnSystemExclusive);	//0xF0
	MIDI.setHandleTimeCodeQuarterFrame(OnTimeCodeQuarterFrame);//0xF1
	MIDI.setHandleSongPosition(OnSongPosition);	//0xF2
	MIDI.setHandleSongSelect(OnSongSelect);		//0xF3
	MIDI.setHandleTuneRequest(OnTuneRequest);	//0xF4
	MIDI.setHandleClock(OnClock);			//0xF8
	MIDI.setHandleStart(OnStart);			//0xFA
	MIDI.setHandleContinue(OnContinue);		//0xFB
	MIDI.setHandleStop(OnStop);			//0xFC
	MIDI.setHandleActiveSensing(OnActiveSensing);	//0xFE
	MIDI.setHandleSystemReset(OnSystemReset);	//0xFF
}

それぞれのMIDIメッセージにコールバック関数を設定できるので、 MIDIを受信した際、それぞれのメッセージが何であるか(Parse:パース)のプリグラムを自分で書く必要がありません。 詳細は、ライブラリフォルダ Arduino\libraries\MIDI_Library\src\MIDI.hに記載があります。

3) USBMIDI

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

このライブラリは、V-USBライブラリ を使用してサポートされます。USBMIDIをインストールするとV-USBライブラリが自動的にインストールされます。

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

Arduino MIDIの既存のプログラムは、シリアル通信TX/RX UART ピンを使用して DIN-5 ポート経由で MIDI データを送受信するためにシリアルを使用しています。 こちらのUSBMIDIライブラリはシリアルの代わりに USBMIDIオブジェクトを使用するだけでまったく同じコードを適合させることができます。

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

MIDIUSBはMIDIメッセージを1バイトごとに扱います。 詳細はこちらを参照して下さい。

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

// Print interface.
virtual size_t write(uint8_t c);