
QWRT-001 MIDI Thru USB HUB
概要(QWRT 1作目)
USBで複数のMIDIデバイスから制御できたらとネットで探したところ、USBでMIDI Thruができる製品がどこにもなかった。また、ラックにマウントマウントがしたかったので、MIDI Thru機能付きUSB HUBのモジュラーを作成しました。
※参考:関連モジュール、デバイス
・『QWRT-002 MIDI Controller』:MIDIコントローラー
・『QWRT-003 MIDI NSX-1 Panel for eVY1』:MIDI音源
・『QWRT-004 MIDI Chord Generator』:MIDIコードジェネレーター





構成
Arduino NANO互換機
Mini USB HOST Shield
USB HUB
セリア・ダイソーの100円HUB ※下記は、HUBを分解された方のサイト
BOM
※近いうちにアップします。
配線
以下のサイトを参考に、Mini USB HOST ShieldをArduino NANO互換機に配線しました。
プログラム
利用ライブラリ
USB HOST Shield Library
参考:USB HOST Shield LibraryにMIDI機能を追加された作成者の方のサイト ※公開して頂き感謝です。
仕様
入力されたMIDI 信号はすべてのポートに対してMIDI OUTする(MIDI Thru)
追加のHUBは本体を除いて、1台カスケード可能
最大4つのMIDIデバイスを接続することが可能
ただし、上記仕様はプログラムの変更により拡張可能
作成したコード
#include <usbh_midi.h>
#include <usbhub.h>
USB Usb;
USBHub Hub1(&Usb);
USBHub Hub2(&Usb);
USBH_MIDI Midi1(&Usb);
USBH_MIDI Midi2(&Usb);
USBH_MIDI Midi3(&Usb);
USBH_MIDI Midi4(&Usb);
void setup() {
Serial.begin(115200);
if (Usb.Init() == -1) {
while (1); //halt
}//if (Usb.Init() == -1...
delay( 200 );
}
void loop() {
Usb.Task();
if ( Midi1 ) {
MIDI_poll(Midi1);
}
if ( Midi2 ) {
MIDI_poll(Midi2);
}
if ( Midi3 ) {
MIDI_poll(Midi3);
}
if ( Midi4 ) {
MIDI_poll(Midi4);
}
}
void MIDI_poll(USBH_MIDI &Midi)
{
char buf[16];
uint8_t bufMidi[MIDI_EVENT_PACKET_SIZE];
uint16_t rcvd;
if ( Midi1.RecvData( &rcvd, bufMidi ) == 0 ) {
Midi2.SendRawData(rcvd,bufMidi);
Midi3.SendRawData(rcvd,bufMidi);
Midi4.SendRawData(rcvd,bufMidi);
}
if ( Midi2.RecvData( &rcvd, bufMidi ) == 0 ) {
Midi1.SendRawData(rcvd,bufMidi);
Midi3.SendRawData(rcvd,bufMidi);
Midi4.SendRawData(rcvd,bufMidi);
}
if ( Midi3.RecvData( &rcvd, bufMidi ) == 0 ) {
Midi1.SendRawData(rcvd,bufMidi);
Midi2.SendRawData(rcvd,bufMidi);
Midi4.SendRawData(rcvd,bufMidi);
}
if ( Midi4.RecvData( &rcvd, bufMidi ) == 0 ) {
Midi1.SendRawData(rcvd,bufMidi);
Midi2.SendRawData(rcvd,bufMidi);
Midi3.SendRawData(rcvd,bufMidi);
}
}
余談
今回、初めはUSBホストとして利用できるSeeeduino xiao(SAMD)で実装したかったのですが、何度試してもSAMD版 USB HOST Shield LibraryのHUB機能が正常に動作しませんでた。仕方がなくMINI USB HOST Shieldを利用したArduino NANO互換機で実装しています。
あと、よく見ると気づいた方いるかもしれませんが、セリア・ダイソーの100円HUBですが、1ポートだけ水平タイプです。モジュール化にあたりすべて垂直にさせなければならなかったので、2個買って垂直タイプのポートを一つ拝借してすべて垂直になるように取り替えてます。ちょっと残念なお話でした。