Raspberry Pi PicoでMIDIを読む
手軽なマイコンであるRaspberry Pi Pico WでMIDI入力を読む実験。
マイクロコントローラRaspberry Pi Pico WでMIDI入力を読む実験をしてみました。これ単体では特に役に立ちませんが、将来的にはエフェクターに仕込んでMIDI対応にしたり、MIDI対応のプログラマブルスイッチャーに発展させる第一歩になります。
使用したもの
- Raspberry Pi Pico W(無印のPicoでも可)
- フォトカプラ H11L1M
- セラミックコンデンサ 0.1uF
- 抵抗 2.2kΩ, 220Ω
- シリコンダイオード 1N4148
- 5ピンDIN端子
回路
回路図はこちらです。

MIDIケーブルからの信号をフォトカプラに入力し、フォトカプラからの出力をRaspberry Pi PicoのGPIO1に繋ぎます。電源はUSBからの供給なので省略しています。他の部品の役割は、
- 220Ω フォトカプラの内部LED用電流制限
- 1N4148 フォトカプラのLEDを逆電圧から保護
- セラミックコンデンサ 電源デカップリング
- 2.2kΩ プルアップ抵抗
です。フォトカプラはエフェクターではコンプに使われることが多いですが、MIDI入力ではグラウンドループ防止のために機器同士を絶縁するために使われています。
この回路を組むときの注意点はDIN端子の4番と5番が逆になりやすいことです。私も逆に接続してしまって悩みました。2番端子はMIDIケーブルのシールドにつながりますが、GNDには送信側のみで接続するため今回は未接続で大丈夫です。(高周波ノイズ対策などで受信側でもGNDに落としたい場合は、0.1uF程度のコンデンサを通して接続するそうです)

コード
Pi Picoに書き込むプログラムはこちらです。AIに生成してもらいました。UARTをMIDI用に設定し、入力があったらそれをprintするというシンプルなものです。あくまで受信できているかの確認用なので、変化の早いCCを送ると表示が間に合わなくなったりします。
from machine import UART, Pin
from time import sleep_ms
uart = UART(
0,
baudrate=31250,
bits=8,
parity=None,
stop=1,
rx=Pin(1),
rxbuf=256,
)
print("UART0 RX test")
print("RX pin: GP1")
print("Waiting for MIDI data...")
while True:
if uart.any():
data = uart.read()
if data:
hex_data = " ".join(f"{byte:02X}" for byte in data)
print("RX:", hex_data)
sleep_ms(1)書き込み・テスト
ThonnyでPico Wにコードを書き込み、他の機器からMIDIを送ってみます。今回はBOSSのFC50を使います。以前ハードオフで2000円くらいで手に入れました。DAWのコントロールに使えるかなと思って買ったのですが、送れるMIDIメッセージがPCのみ(外部スイッチ・ペダルはCCも可)だったので仕舞い込んでいたものです。

ちゃんと送られてきたメッセージが表示されました。C0 00というのはProgram Change, MIDIチャンネル0, 値0という意味です。
FC50のEXP端子にペダルを接続して、今度はCCを送ってみます。

一行に複数回メッセージが入ってしまっていたりしますが、メッセージ自体は受け取れました。こちらは先頭のBがControl Changeの意味で次の数字がチャンネル、07はCCナンバー、最後の二桁が値です。
Raspberry Pi Pico WとフォトカプラH11L1Mを使ってMIDI入力を読んでみました。これを発展させていけばMIDIコントロールのスイッチャーや、MIDIプリセット機能付きのエフェクターに繋がりそうです。
五反田音波技研所長R