以下の内容はhttps://retrospective.hatenadiary.com/entry/20251109/1762614156より取得しました。


#rubyworld #mrubygirls 光と音をプレイした #picoruby デモの工夫メモ

2025.rubyworld-conf.org

mrubygirls.connpass.com

ということで色物(原義通り)をしました。

www2.ntj.jac.go.jp

音の出し方

PicoRubyでUnit MIDIシンセサイザーを制御しています。

picoruby-recipes/src_components/R2P2-ESP32/storage/home/app.rb at irq_rwc · bash0C7/picoruby-recipes · GitHub

md_uart = UART.new(unit: :ESP32_UART1, baudrate: 31250, txd_pin: 23, rxd_pin: 33)

(中略)

      md_uart.write((0x99).chr + cmd_byte.chr + (0x7F).chr)

Unit MIDIにシリアルで書き込んでるわけですね。

光の出し方。

使っているLEDはこちら。これを2並列。

GROVE - WS2813搭載防水RGB LEDテープ1m(60LED)www.switch-science.com

このM5Stack USB TypeC2Grove外部電源供給ユニットでタコ足+USB-C経由で補助電源供給してます。

M5Stack USB TypeC2Grove外部電源供給ユニットwww.switch-science.com

PC側の責務

このDJコントローラーをUSBでMacに繋いでいます。MacOS上はMIDI機器として認識されています。

  • Pioneer DJ

こちらのスクリプトから GitHub - arirusso/unimidi: Realtime MIDI IO for Rubyで何がどう操作されたかを読み取っています。

github.com

そして、読み取った操作の情報は、1byteの固定長情報としてPicoRuby側にシリアル通で書き込んでいます。なぜ1byteかというと、複数バイトだとどこまで読んだかの制御を意識する必要があるからです。1バイトだと極めてシンプルで、 while pc_uart.bytes_available > 0 を繰り返すのみ。byte単位で処理できるようにはなってるからです。ありがたい。

色の制御

本家の方でも対応が入りましたが、ws2812のmrbgemに手元でメソッドを追加して、HSBで扱えるようにしています。ランタイムか処理系かライブラリかをまたいで手元で管理・改修して、統合的に「装置」としてビルドできるのが面白いところです。

picoruby-recipes/src_components/R2P2-ESP32/components/picoruby-esp32/picoruby/mrbgems/picoruby-ws2812/mrblib/ws2812.rb at irq_rwc · bash0C7/picoruby-recipes · GitHub

HSBは色相、彩度、明度で色を扱うもので、加速度センサーで彩度と明度をコントロールしています。

https://github.com/bash0C7/picoruby-recipes/blob/irq_rwc/src_components/R2P2-ESP32/storage/home/app.rb#L81-L82

色相をずらすという処理もやりやすいのもいいですね。最初HSBを知った時は慣れ親しんだRGBと全然違って面食らいましたが、ようやくこの使いやすさがわかりました。

PicoRuby側のコードの分量

仕組みとして、実行時にパースして、そこから動き出します。コード量が大きいとパース時点でout of memoryになるので、コード総量は常に意識しています。ATOM-MATRIX利用ではおおまか150行を超えると厳しいので、可読性と保守性を考えつつどこまで小さくできるかを常に模索しています。

また動き出したあともぼんやりしてるとあれやこれやでメモリを食い潰すので省メモリ性は意識して作っています。とくにarrayの大きさや操作にまつわるところには気をつけています。たとえばarrayをimmutableかつfluent Interfaceでな感じでやりたいところではありますが、その分メモリを多く食うわけなので、破壊的な変更を加える、メソッド呼びだしを分断するなどの対処をしています。

メモリの確保

CONFIG_ESP_MAIN_TASK_STACK_SIZEはR2P2-ESP32のデフォルト値から変更しています。とはいえ何をどの程度にすればいいのかの鼻がきくわけではないので、ぜんぜん試行錯誤です。




以上の内容はhttps://retrospective.hatenadiary.com/entry/20251109/1762614156より取得しました。
このページはhttp://font.textar.tv/のウェブフォントを使用してます

不具合報告/要望等はこちらへお願いします。
モバイルやる夫Viewer Ver0.14