Arduino MicroをUSB-MIDI化

Arduino UnoのUSB-MIDIデバイス化については別ページで書きましたが、ここではArduino MicroをUSB-MIDIデバイス化する方法を記載します。UnoのUSB-MIDI化よりも簡単です。この方法は、Arduino Micro 以外でもこの表に示したArduinoであれば使えるはずです。(全部試したわけではありません。)

Arduinoのライブラリを使います。Arduino をUSB-MIDI化するライブラリは2種類あります。微妙に違う2種類です。

  • MIDIUSB
  • USBMIDI

MIDIUSBのインストール

Arduino IDEのライブラリを「インストール」のメニューから「ライブラリを管理」を選びます。

検索ボックスに、USBと記入しエンターを検索すると、表示されるライブラリの中にMIDIUSBがあります。インストールボタンを押すとライブラリがインストールできます。

その後、「閉じる」ボタンを押します。

ライブラリがインストールできているかどうかは、「ファイル」メニューから「スケッチ例」を選ぶと、その一番下にMIDIUSBのスケッチが入っています。

ここではMIDIUSB_loopを選びます。

USBMIDIのインストール

もう一つのUSBMIDIをインストールするには、上と同様、「インストール」のメニューから「ライブラリを管理」を選びます。検索ボックスに、MIDIと入力して検索します。USBMIDIが表示されますので、インストールは上と同様です。

「ファイル」メニューから「スケッチ例」を選ぶと、その一番下にUSBMIDIのスケッチが入っています。

2つのライブラリをインストールする必要はありません。どちらかで良いのですが、ここでは2つインストールしてみました。結果、フォルダーArduino/librariesの下に2つのフォルダーができています。

MIDIUSB/MIDIUSB_loopを使ってみる

このプログラムはArduinoがMIDIメッセージを受信し、そのまま同じメッセージを送信します。(送り返します。)プログラムを見てみると、プログラムの先頭でMIDIUSB.hがインクルードされています。このヘッダーの中で、MIDI送受信のクラス、MidiUSBのインスタンスが作られていますので、setup()の中では何もやらなくても大丈夫です。

#include "MIDIUSB.h"

MIDIは、構造体midiEventPacket_tでやり取りします。この構造体は、MIDIUSB_Defs.hに定義されています。

typedef struct
{
	uint8_t header;
	uint8_t byte1;
	uint8_t byte2;
	uint8_t byte3;
} midiEventPacket_t;

MidiUSB.read()でMIDIを取り込み、rxに実態が入ります。もし、MIDIを受信していなければ、rx=0 となります。MIDIが受信できれば、MIDIデータをMidiUSB.sendMIDI(rx)で出力します。

void loop() {
  midiEventPacket_t rx;
  do {
    rx = MidiUSB.read();
    if (rx.header != 0) {
      //send back the received MIDI command
      MidiUSB.sendMIDI(rx);
      MidiUSB.flush();
    }
  } while (rx.header != 0);
}

Arduino Microを用意します。USBケーブルでPCとArduino Microがつながっています。MIDIUSB_loopをArduino Microに書き込みます。書き込んだ後にリセットがかかり、Arduino MicroはUSB MIDIデバイスになります。

Chrome でSend And Receive MIDIを開いてみてみると、Input Device, Output DeviceにArduino Microが表示されています。Output MIDIの欄に適当なMIDIメッセージを記入し、Send ボタンを押すと、Inout Monitorの欄にArduino Microから戻ってきたMIDIメッセージが表示されます。