akira.keiのアイコン画像
akira.kei 2026年05月17日作成 © MIT
セットアップや使用方法 セットアップや使用方法 閲覧数 75
akira.kei 2026年05月17日作成 © MIT セットアップや使用方法 セットアップや使用方法 閲覧数 75

RP2040-ZeroをCircuitPythonで(その1):USB-MIDI変換

<前の記事 : 次の記事>

イマドキのPicoなら

以前にPICでUSB-MIDI変換する記事を書いたが、「Raspberry Pi Pico互換基板やArduinoならライブラリ一発だよw」って聞いていたので試してみた。ユーロラックに組み込んだりする予定だったので、ボードには高くてデカいPicoではなく安くて小さいWaneshare RP2040-Zeroの互換品を選んだ。

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のアイコン画像
機械系エンジニアだが電子工作を趣味としている。週末はひとりバーベキュー。
  • akira.kei さんが 前の日曜日の20:17 に 編集 をしました。 (メッセージ: 初版)
ログインしてコメントを投稿する