MIDI 2.0デバイスを試作

MIDI 2.0 on Linuxのページ を見ながら、MIDI2.0に対応したデバイスをRaspberry Pi Zero 2W(以下Zero2Wと略します)上に構築してみます。 Zero2Wを選択した理由はUbuntuが動作すること、OTGモードでUSB-MIDIのデバイス としてPCから認識できるように設定できることにあります。

Raspberry Pi Zero 2Wの設定

OSとしては、Ubuntu Server 24.10 (64bit)をインストールしました。



> uname -a
Linux Inspiron 6.8.0-50-generic #51~22.04.1-Ubuntu SMP PREEMPT_DYNAMIC
Thu Nov 21 12:03:03 UTC 2 x86_64 x86_64 x86_64 GNU/Linux

さらに、「Raspberry Piの初期設定」のページ にも書きましたが、それに加えていくつかのPackageをインスツールしています。別途記載したいと思いますが、ALSAのバージョンを 更新するための準備です。

> sudo apt install net-tools
> sudo apt install gcc g++ make cmake
> sudo apt install libi2c-dev git-core
> sudo apt install libasound2 libasound-dev
> sudo apt install alsa-utils pmidi
> sudo apt install pkgconf bzip2 automake
> sudo apt install libncurses5-dev libncursesw5-dev
> sudo apt install ncurses-term libgtk2.0-dev

以下の設定はSuper Userになっていた方が楽なので設定します。

> sudo passwd root
[sudo] password for user: xxxxxxxx
New password: yyyyyyyy
Retype new password: yyyyyyyy
> su
Password: yyyyyyyy
MIDI2 USB Gadget Function Driver

MIDI2 USB Gadget Function Driver の項目を見ながらMIDI2.0デバイスの設定します。

  1. ガジェットを実行するシステムで、libcompositeモジュールをロードします。 Search Labs | AIによると、「libcomposite は、Linux カーネルの USB Gadget 機能の 1 つで、複数の機能を組み合わせて提供する複合デバイスとして動作する方法」 とのこと。
    > modprobe libcomposite
    
  2. これによりconfigfs スペース (通常、最近の OS では/sys/kernel/config ) の下にusb_gadgetサブディレクトリが作成されます。 次に、ガジェット インスタンスを作成し、そこに構成を追加します。取り敢えず書いてある通りに設定します。 (注)USB-MIDI2.0のディスクリプタを設定します。
    > cd /sys/kernel/config
    > mkdir usb_gadget/g1
        
    > cd usb_gadget/g1
    > mkdir configs/c.1
    > mkdir functions/midi2.usb0
        
    > chmod 666 idProduct
    > chmod 666 idVendor
    > echo 0x0004 > idProduct
    > echo 0x17b3 > idVendor
    
    > mkdir strings/0x409
    
    > chmod 666 strings/0x409/manufacturer
    > chmod 666 strings/0x409/product
    > chmod 666 strings/0x409/serialnumber
    > echo "ACME Enterprises" > strings/0x409/manufacturer
    > echo "ACMESynth" > strings/0x409/product
    > echo "ABCD12345" > strings/0x409/serialnumber
        
    > mkdir configs/c.1/strings/0x409
    
    > chmod 666 configs/c.1/strings/0x409/configuration
    > chmod 666 configs/c.1/MaxPower
    > echo "Monosynth" > configs/c.1/strings/0x409/configuration
    > echo 120 > configs/c.1/MaxPower
  3. この時点で、サブディレクトリep.0が存在するはずです。 これが UMP エンドポイントの構成です。エンドポイント情報は次のように入力できます。
    > chmod 666 functions/midi2.usb0/iface_name 
    > chmod 666 functions/midi2.usb0/ep.0/ep_name 
    > chmod 666 functions/midi2.usb0/ep.0/product_id 
    > echo "ACMESynth" > functions/midi2.usb0/iface_name
    > echo "ACMESynth" > functions/midi2.usb0/ep.0/ep_name
    > echo "ABCD12345" > functions/midi2.usb0/ep.0/product_id
    
    > chmod 666 functions/midi2.usb0/ep.0/family 
    > chmod 666 functions/midi2.usb0/ep.0/model
    > chmod 666 functions/midi2.usb0/ep.0/manufacturer
    > chmod 666 functions/midi2.usb0/ep.0/sw_revision
    > echo 0x0123 > functions/midi2.usb0/ep.0/familyz
    > echo 0x4567 > functions/midi2.usb0/ep.0/model
    > echo 0x123456 > functions/midi2.usb0/ep.0/manufacturer
    > echo 0x12345678 > functions/midi2.usb0/ep.0/sw_revision
  4. デフォルトの MIDI プロトコルは 1 または 2 に設定できます (注)MIDI 2.0プロトコルを使いたいので2に設定します。
    > chmod 666 functions/midi2.usb0/ep.0/protocol 
    > echo 2 > functions/midi2.usb0/ep.0/protocol
  5. また、この Endpoint サブディレクトリの下にサブディレクトリblock.0があります。 ここでファンクションブロック情報を定義します
    > chmod 666 functions/midi2.usb0/ep.0/block.0/name 
    > chmod 666 functions/midi2.usb0/ep.0/block.0/first_group 
    > chmod 666 functions/midi2.usb0/ep.0/block.0/num_groups 
    > echo "Monosynth" > functions/midi2.usb0/ep.0/block.0/name
    > echo 0 > functions/midi2.usb0/ep.0/block.0/first_group
    > echo 1 > functions/midi2.usb0/ep.0/block.0/num_groups
  6. Configurationをリンクして有効にします。
    > ln -s functions/midi2.usb0 configs/c.1
  7. 次のディレクトリのリストを取り、UDCインスタンスを見つけます。
    > ls /sys/class/udc
    3f980000.usb
  8. UDCファイルにインスタンス名を設定します。
    > chmod 666 UDC
    > echo 3f980000.usb > UDC
  9. MIDI 2.0 ガジェット デバイスが有効になり、ガジェット ホストは f_midi2ドライバーによって UMP rawmidi デバイスを含む新しいサウンド カード インスタンスを作成します。以下のコマンドで確認できます。
    > cat /proc/asound/cards
    ....
    1 [Gadget         ]: f_midi2 - MIDI 2.0 Gadget
                      MIDI 2.0 Gadget

MACでデバイスを確認

MACにZero2Wを接続してデバイスがMIDI2.0デバイスとして認識できるかをチェックします、 MACのUSBポートと、Raspberry Pi Zero 2WのUSBポートを接続します。



私の場合、PWR INのUSBケーブルを抜いてUSBポートに接続しました。 そのため、上で設定した構成が消えてしまいましたので、立ち上がった後でもう一度上の構成設定を行います。 シェルスクリプトを書いておくと良いと思います。

Audio MIDI設定を開きます。



「表示」メニューから「MIDIスタジオを表示」を選択します。



下のようなアイコンが見えると思います。上で設定した”ACMESynth"という名前のProductと、 "Monosynth" というポートと並んで、MIDI2.0というポートが設置されていることが確認できます。



MIDI2.0プロトコルを送受信するテストは以降に行いたいと思います。