見出し画像

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コードジェネレーター

100均で買ったUSB HUBを分解してレーザ加工したアクリルパネルに装着
HUBをUSB HOST Shieldに内部結線
Arduino NANO互換機でMIDI Thru機能を実装
両面ユニバーサル基板1枚で完結
全USBポートは一旦基板から外した後、パネルの前面から挿入後に再度基板にはんだ付けした

構成


  1. Arduino NANO互換機

  2. Mini USB HOST Shield

  3. 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個買って垂直タイプのポートを一つ拝借してすべて垂直になるように取り替えてます。ちょっと残念なお話でした。

この記事が気に入ったらサポートをしてみませんか?