GM音源、SAM2695を次にような接続でPCから鳴らします。 PCのMIDIシーケンサーはMIDIをUSB-MIDIのフォーマットでArduinoへ投げます。 ArduinoはUSB-MIDIデータを受信すると、これをMIDIに変換してUARTでSAM2695に投げます。


例えば、Note OnメッセージはUSB-MIDIのフォーマットでは 09H 90H 40H 7FHの4バイト UARTで送信するMIDIは、90H 40H 7FHと3バイトのメッセージになります。
ArduinoはAliexpressでPro Microを購入しました。 このArduinoを選択した決め手はMIDIUSBのライブラリを使うこができるCPUがATmega32U4であること。 そしてなんといっても送料込みで1100円ほどで購入できます。
USB-MIDIのフォーマットは、MIDIUSBのライラリでは以下の構造体で受信されます。 詳細は、「USB MIDIのmidiEventPacket_t」に記載しました。
#pragma once
#include <stdint.h>
typedef struct
{
uint8_t header;
uint8_t byte1;
uint8_t byte2;
uint8_t byte3;
} midiEventPacket_t;
USB MIDIをUARTに変換するためには、headerの下位4ビットに応じて続く3つのbyteのうち、いくつをUARTに送るかを決めます。 プログラムの例を以下に示します。
// Convert USB-MIDI to UART
#include "MIDIUSB.h"
void setup() {
Serial1.begin(31250);
}
void loop() {
midiEventPacket_t rx;
do {
rx = MidiUSB.read();
if (rx.header != 0) {
//send back the received MIDI command
switch(rx.header&0x0F){
case 0x0:
case 0x1:
break;
case 0x5:
case 0xF:
Serial1.write(rx.byte1);
break;
case 0x2:
case 0x6:
case 0xC:
case 0xD:
Serial1.write(rx.byte1);
Serial1.write(rx.byte2);
break;
case 0x3:
case 0x4:
case 0x7:
case 0x8:
case 0x9:
case 0xA:
case 0xB:
case 0xE:
Serial1.write(rx.byte1);
Serial1.write(rx.byte2);
Serial1.write(rx.byte3);
break;
}
MidiUSB.flush();
}
} while (rx.header != 0);
}