編集履歴一覧に戻る
akira.keiのアイコン画像

akira.kei が 2026年05月17日20時17分24秒 に編集

初版

タイトルの変更

+

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

タグの変更

+

PICO

+

rp2040

+

MIDI

+

CircuitPyton

記事種類の変更

+

セットアップや使用方法

ライセンスの変更

+

(MIT) The MIT License

本文の変更

+

[<前の記事](https://elchika.com/article/e94a45f5-637e-43be-a34a-e9fd07a0d347/) : [次の記事>]() ## イマドキのPicoなら 以前に[PICでUSB-MIDI変換](https://elchika.com/article/e94a45f5-637e-43be-a34a-e9fd07a0d347/)する記事を書いたが、「Raspberry Pi Pico互換基板やArduinoならライブラリ一発だよw」って聞いていたので試してみた。ユーロラックに組み込んだりする予定だったので、ボードには高くてデカいPicoではなく安くて小さい[Waneshare RP2040-Zero](https://www.waveshare.com/rp2040-zero.htm?srsltid=AfmBOoosQOjO1qXecjCp41RuSrkHXFhNlqjpJdIJycFwySXuxpwrfk5P)の互換品を選んだ。 ![RP2040-Zero](https://camo.elchika.com/19aefe80101d2db67c0fbeb6b95e1d8e88c9c4b2/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f33363031626666382d633530632d343762382d613765362d3531663731393163323336642f30336333316636302d653463612d343330662d396630642d353735313638633730366332/) MicroPythonだとUSBシリアル変換しかサポートしてないらしいので、Circuit Pythonで試してみた。Copilotに騙された(Geminiに相談して発覚)以外はうまくできたようだが、やはりシステムエクスクルーシブは鬼門だったようだ。 ## Copilotぇ 最初に`CircuitPythonでUSB-MIDIをシリアルに、シリアルMIDIをUSBーMIDIに相互に変換するにはどうすればいい?`と聞いたところ、提案してきたスクリプトは以下だった。 ```Python: 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(動かない) ```Python: 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++