イマドキのPicoなら
以前にPICでUSB-MIDI変換する記事を書いたが、「Raspberry Pi Pico互換基板やArduinoならライブラリ一発だよw」って聞いていたので試してみた。ユーロラックに組み込んだりする予定だったので、ボードには高くてデカいPicoではなく安くて小さいWaneshare RP2040-Zeroの互換品を選んだ。
MicroPythonだとUSBシリアル変換しかサポートしてないらしいので、Circuit Pythonで試してみた。Copilotに騙された(Geminiに相談して発覚)以外はうまくできたようだが、やはりシステムエクスクルーシブは鬼門だったようだ。
Copilotぇ
最初にCircuitPythonでUSB-MIDIをシリアルに、シリアルMIDIをUSBーMIDIに相互に変換するにはどうすればいい?と聞いたところ、提案してきたスクリプトは以下だった。
import board
import busio
import usb_midi
from adafruit_midi import MIDI
from adafruit_midi.note_on import NoteOn
from adafruit_midi.note_off import NoteOff
from adafruit_midi.control_change import ControlChange
from adafruit_midi.pitch_bend import PitchBend
# --- USB MIDI ---
usb_in = usb_midi.ports[0] # PC → RP2040
usb_out = usb_midi.ports[1] # RP2040 → PC
midi_usb = MIDI(midi_in=usb_in, midi_out=usb_out, in_channel=None)
# --- DIN MIDI (UART 31250bps) ---
uart = busio.UART(board.GP0, board.GP1, baudrate=31250)
midi_uart = MIDI(midi_in=uart, midi_out=uart, in_channel=None)
print("USB ⇄ DIN MIDI converter running")
while True:
# --- USB → DIN ---
msg = midi_usb.receive()
if msg:
midi_uart.send(msg)
# --- DIN → USB ---
msg2 = midi_uart.receive()
if msg2:
midi_usb.send(msg2)
十分短いがもっとシンプルにできるはず、と会話してたら最小構成ならこれでイケるぜ!と提案されたのがこちら。いいぞだいぶ短いw(動かない)
import board, busio, usb_midi
from adafruit_midi import MIDI
u = busio.UART(board.GP0, board.GP1, baudrate=31250)
mu = MIDI(midi_in=usb_midi.ports[0], midi_out=usb_midi.ports[1], in_channel=None)
mt = MIDI(midi_in=u, midi_out=u, in_channel=None)
while True:
m = mu.receive()
if m: mt.send(m)
m = mt.receive()
if m: mu.send(m)
シリアルポートをモニタしてみると何も出ない。「なんも出ないんだけど?」「ピンは間違ってない?」「いやスクリプトにそのまま書いてあるやん」「ポート番号は間違ってない?」「PocketMIDIだと間違いようがないよ」「このテストコード実行してみて」「UnknownEventだってよ」「ランニングステータスでは?」「ちゃんと出力モニタには欠落はないよ」「完全に把握した!これは CircuitPython の USB-MIDI 実装の既知のバグで、特に RP2040 + macOS の組み合わせで発生する。」
嘘つくなよw マニ受けるところだっただろwww
Geminiに相談
もう絶対嘘だろと思ってGoogle Geminiに相談してみた。「添付したcode.pyをR P2040-Zeroで実行してPocketMIDIからNoteOn/OFFを送信すると、「USB MIDI: MIDIUnknownEvent(status=144), USB MIDI: MIDIUnknownEvent(status=128)」と表示されるんだ。どうすりゃいい?」って。
即座に帰ってきた回答がこちら。
そのエラーログ(MIDIUnknownEvent)から、何が起きているかの原因がハッキリわかります!
原因は、adafruit_midi ライブラリに対して「どのMIDIメッセージ(NoteOn や NoteOff など)を解析・パースしてほしいか」を登録(インポート)していないためです。
うん。ありがとうGemini殿。
Copilotも最初は確かにいくつか「余計な」インポートをしていた。これを余計じゃね?と削除させたのは確かに自分だけど、動かねぇじゃねぇか。この後も提案されたインポートが無い(読み込めない)とか色々と無駄の会話を重ねたところでシステムエスクルーシブがまともに通らないことがわかり、結局、実用的なUSB-MIDI変換を用意することは諦めたのだった。
そもそも3.3V系だと外付け回路が複雑になっちゃうからねw
投稿者の人気記事

-
akira.kei
さんが
前の日曜日の20:17
に
編集
をしました。
(メッセージ: 初版)
ログインしてコメントを投稿する