2019年09月21日

ESP32にWirelessMidiを実装する

ArduinoにESP32を導入した時に行った試行錯誤の記録。

1)Arduinoに対応するファイルをツールを使って導入した場合、何故かライブラリ内のAzureIoTフォルダがカラッポになる現象が発生する。 この不具合に対応するには手動でコピペを行う必要がある。

2)通信速度を115200bps設定すると、ソフト側から書込が行われるタイミングでESP32のプッシュスイッチを左→右の順番で同時押し、左→右の順番で開放する物理的な儀式を行わなければならない。 通信速度を230400bpsに設定した場合は、自動的に書き込みモードに移行出来た。

3)Wifiは2GHz帯のみ対応。

4)OSXの環境では、チップを認識させるためにデバイスドライバーをインストールする必要がある。

導入時に必要なステップはこのサイトを参照した↓。

https://lastminuteengineers.com/esp32-arduino-ide-tutorial/?fbclid=IwAR0dIrGCIasaY93aAm__FXRWWE3p2vzByHvRklDjG2xchu3Cb2CdIbl9P2w

その後、ほとんど試行錯誤に嵌ることなく通信を行うことが出来ている。

WS002023.JPG

次に、WiFiMidiにトライしてみたが、元ネタのスケッチによってRTPmidiフォーマットの送受信を簡単に行うことが出来た。

https://github.com/gdsports/midi-wifi-demos/blob/master/midi1buttonrtp/midi1buttonrtp.ino?fbclid=IwAR28rVzsWBSgSPHCwIWB-k7Z5OAnBUT1V7T4LMewg4h4aowKt3wehiqeLrk

ローカルサーバーを立ることで、2.4G(ESP32)/5.1G(Macbook)帯の併用が可能。 当初は試験的にシングルスイッチを実装しているだけなので、ここから対応するポートを増やしていく。 フットコントローラーへの実装が必須だが、デバイスを複数用意して並列運用を行うことを計画している。

メカニカルなスイッチ系のハンドリングに関してはこのスケッチを参考にした。

https://github.com/thomasfredericks/Bounce2/blob/master/examples/bounce2buttons/bounce2buttons.ino?fbclid=IwAR0BL6dDg_OHfvqe_BUfqHXw4stOLsau3fBMmw_tAWvJQbjpC_oWVx-AP-0

当然ながら、このシステムはKYMAと併用することになるが、まずはMac側でWiFi通信リンクを設定し、、、

Screen Shot 2019-08-28 at 6.26.41.png

KYMAから出力されるmidiデータの受信状態をArduinoのモニターで確認した。 ESP32側で受信しているのはベースライン。

WS002025.JPG

一方、物理側の準備としてフットコントローラーの回路を組み直すことになったが、念の為ESP32を実装せずにテストを行ったところ、電源の状態が怪しく規定値よりもかなり高めの電圧を出力している。 度重なる電源の故障は異常事態で、バルクで購入したレギュレータが不良品な可能性を疑ってしまう。内装した電池もヤレていて満身創痍な状態なのが辛い。 

ESP32のADCはほぼ正常に動作しているが、ウエイトの値を調整した方が良い感触ではある。 

結局、目標とした期限内にフットコントローラーの右側バンクを完全にリファインできたが、以前製作したものと比較して格段に動作が安定していることに驚かされた。

ESP32の外部に追加した機能はRailToRailなOpAmpのバッファー回路のみ。基板のフットプリントはESP32より一回り大きなサイズ内にまとめることが出来た。

IMG_9367.JPG

信号の並列受信を試したところ、問題なく受信できているようだ。

KYMAのTimelineを検討する作業の過程で、コントロールチェンジナンバーをKYMA側からコントロールするアイデアを思いつく。 KYMA側からスイッチの機能を切り替えられるので、足元がスッキリする。

ライヴ運用といういきなりの実戦投入を行った結果、スイッチの動きが敏感過ぎてコントロールが難しいことが判明、バウンシングの値を調整することにした。

WS002027.JPG

ここで、インターバルを設定して感度の調整を行っている。 初期設定の5msは敏感過ぎた。

これは、データの更新を行っている部分。

WS002028.JPG

ADCからのデータは12bitから7bitにダウンサイズしている。

ダウンサイズ後の7bit幅でもデータがフラつくため、この部分でデータの変化にウエイトを掛けている。

WS002029.JPG

次の部分は、プログラム・チェンジを受けて、CCアドレスを変更するためのスイッチ機構。

今のところ10ch分を用意している。

フットヴォリュームの値をmidiデータとして送出するパート。

WS002030.JPG

バッファーの値を比較して、差異が検知された時のみデータを出力する。

こちらは、プログラム・チェンジにより選択されたパラメーターによって、スイッチの動作特性をオルタネイト/モメンタリーのどちらかに選択した後、出力するパート。 

WS002031.JPG

動作確認は未だ行っていないが、スイッチの出力アドレスを外部からコントロールするための、所謂「便利機能」である。 オルタネイト動作でOn/Offのデータを出力する。

この部分はモメンタリー出力を選択した場合に動作するパート。

WS002032.JPG

実験の結果、ESP32にKYMA側から出力したnnで、フットコントローラー側出力のcc#を切り替える機構をなんとか完成させることが出来た。

Screen Shot 2019-09-05 at 12.20.26.png

KYMA側で出力を行うオブジェクト。 非常に単純な手法だが、便利なツールとなりそう。

69819586_2607184495978659_527101055402508288_o.jpg

フットヴォリュームに関しては、切り替えるとマズイ場合が多いので、プリセットの内容は要検討。

69942474_2607316242632151_6385868791439425536_n.jpg

入力されたnnに対応させて、仕込んだcc#のグループをスイッチングする。

69687416_2607317675965341_8151814233789562880_n.jpg

nnの仕込みはここで行う。

69524162_2607319219298520_8233837294415511552_n.jpg

残念ながら、モメンタリ/オルタネイトの切り替えパターンは固定で、caseの中で予め動作を選択している。 条件分岐でなんとかしようとしたのだが、上手くいかなかった。

cc#を含めて仕込みが必要なので、スイッチの属性変更がフレキシブルである必然はあまり無い。 で、学習機能をもたせる場合はまた話が違ってくるのだが、現状はpgmCngをキッチリ読み込めないという学習機能の実現以前の状態なので焦ることはないだろう。

最終的にフットコントローラーのmidi受けチャンネルを#11に制限した。 出来れば、年内に怪談スイッチの軽量版を作りたいところだが、マイクロコントローラー単位で入力端子を16ポート確保しなければならない。

フットコントローラー左側の結線を完了。

IMG_9373.JPG

まずは、入力バッファーを組まない状態でADの挙動を試す。

IMG_9375.JPG

Windows使用時には出なかった、書き込み時のアラートが気になる。

Screen Shot 2019-09-22 at 1.04.28.png

Screen Shot 2019-09-22 at 1.05.41.png

Screen Shot 2019-09-22 at 1.06.00.png

Screen Shot 2019-09-22 at 1.06.06.png
posted by Yasuski at 15:12| LaVoixski