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-88MKIIと Yamaha 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)
似たような名前のライブラリですが、それぞれの特色を記載します。
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で公開されています。
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に記載があります。
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);