見出し画像

ESP32でMIDIを受信してみる

概要

  • ESP32(MicroPython)で、MIDI信号の受信をテストしてみる実験

  • MIDIを受信するには、高速なフォトカプラが必要

  • 以前、Roland EDIROL PCR-30の修理を試みて失敗した時に、部品を回収したフォトカプラをを使ってみることにした

メモ:2023/2月ごろの実験

PC410L(フォトカプラ)

  • PCR-30には、SHARPのPC410L0NIP Seriesというフォトカプラが実装されていた(刻印から察するに)

https://datasheet.octopart.com/PC410L0NIP-Sharp-Microelectronics-datasheet-144799.pdf

PC410L(フォトカプラ)の製造日の確認

  • チップに製造日が刻印されているようだ

  • PNと書かれているので、2002年の11月に製造されたと思われる

  • 工場の表記は「なし」と判断してよいのだろうか、そうならば日本製だ

  • アノードマークの右隣のK印は、何を指しているのだろうか

    • これが、ファクトリ識別子なのだろうか

    • でも一覧にはない、Kだから韓国かもしれない

  • こういうのを見て思考を巡らせるのも、分解の醍醐味のひとつである

https://datasheet.octopart.com/PC410L0NIP-Sharp-Microelectronics-datasheet-144799.pdf
https://datasheet.octopart.com/PC410L0NIP-Sharp-Microelectronics-datasheet-144799.pdf

フォトカプラをDIP化

  • 表面実装ということもあり、はんだを取るのに失敗して、かなり汚くなってしまった

    • 壊れなかったのでよしとしたいが、

    • 部品名が読めなくなってしまったのが致命的(裏に部品名を書くことに、とほほ)

    • 表面実装のはんだを取る勉強になった

  • DIP変換基板に実装しなおして、ブレッドボードでテストしやすくした

    • 細ピンヘッダが手元になかったので通常のピンヘッダをやすりで削るという苦労もあった

    • 変換基板を使うと、ピンレイアウトが変わって混乱するのは誰もが通る道と思われる

DIP化


構成図(回路図)

  • データシートにある抵抗値とまったく同じものがなかったので、微妙に違う値の抵抗を使ったが動作した

  • MIDI OUTする機器は「CASIO GZ-5」を使った

プログラム

  • MicroPythonで実装することにした

import machine
import time

uart2 = machine.UART(2, baudrate=31250)

for i in range(1, 10000):
    b = uart2.read()
    if b is not None:
        print(b)
    time.sleep(0.01)

プログラムの出力結果

  • 鍵盤で、ド、ド#を押して、ドを離したときのログ(コメントを加筆)

    • Pythonでbyte arrayをprint()したときの表記

    • Byte arrayを見やすく表示する実装をするのを怠ってしまったので読みづらい

b'\x9002' -> 0x90 0x30 0x32 Note On (C2 Velocity:0x32)
b'\x1f2'  ->      0x31 0x50 Note On
b'0\x00'  ->      0x30 0x00 Note On (Note Off)
  • 同じステータスのメッセージが連続する場合、後続のステータスバイト(第1バイト目)が省略が可能

  • ラーニングステータスと呼ばれる

  • 2行目、3行目がラーニングステータスが働いているので、2バイトになっている

  • 「CASIO GZ-5」のMIDI OUTは、なんとラーニングステータスを使っている、ノートオフは、ノートオンのベロシティ0を使っている

    • ラーニングステータスを知らないとデータがおかしくみえて焦るので、この実験には不向きであった(実際に焦った)

Byte arrayを16進数の文字列に変換する実装

  • この実装を入れておけばよかった

''.join('{:02x} '.format(a) for a in b'\x9002') # '90 30 32 '

ランニング·ステータス

チャンネル·ボイス·メッセージ及びチャンネル·モード·メッセージにおいては、次のメッセージのステータス·バイトが、前のメッセージのステータス·バイトとチャンネル番号を含めて同一であれば、省略することができる。したがって受信側は、あるステータス·バイトを受信すると、それを記憶しておいて、次の新しいステータス·バイトが来るまで、記憶されたステータス·バイトに所属するメッセージとして、データ·バイトを処理しなければならない。つまり、データ·バイトの数は常に正しい必要がある。

https://amei.or.jp/midistandardcommittee/MIDI1.0.pdf


楽器作りの夢に一歩近づいた、はず


この記事が気に入ったらサポートをしてみませんか?