#rubyworld #mrubygirls 光と音をプレイした #picoruby デモはこれでさまざまな技術的工夫の上に成り立っているので機を見てご紹介したい pic.twitter.com/XfjYWUw8DI
— bash (@bash0C7) 2025年11月8日
悪い情操教育 #mrubygirls pic.twitter.com/iYCuvnhyCx
— Lチカは情操教育 (@hasumikin) 2025年11月8日
(Teaser) #rubyworld pic.twitter.com/2gZrIBCpun
— Lチカは情操教育 (@hasumikin) 2025年11月7日
#mrubygirls スポンサーLTという名のデモでした
— bash (@bash0C7) 2025年11月8日
音と光を制御するPicoRuby側コードhttps://t.co/ECIaXifkFR
DJコントローラー操作をPicoRubyで解せるデータに変換して流すPC側コードhttps://t.co/Na7uLQIZvs https://t.co/kIGcAKRHl7
ということで色物(原義通り)をしました。
音の出し方
PicoRubyでUnit MIDIのシンセサイザーを制御しています。
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機器として認識されています。
こちらのスクリプトから GitHub - arirusso/unimidi: Realtime MIDI IO for Rubyで何がどう操作されたかを読み取っています。
そして、読み取った操作の情報は、1byteの固定長情報としてPicoRuby側にシリアル通で書き込んでいます。なぜ1byteかというと、複数バイトだとどこまで読んだかの制御を意識する必要があるからです。1バイトだと極めてシンプルで、 while pc_uart.bytes_available > 0 を繰り返すのみ。byte単位で処理できるようにはなってるからです。ありがたい。
色の制御
本家の方でも対応が入りましたが、ws2812のmrbgemに手元でメソッドを追加して、HSBで扱えるようにしています。ランタイムか処理系かライブラリかをまたいで手元で管理・改修して、統合的に「装置」としてビルドできるのが面白いところです。
HSBは色相、彩度、明度で色を扱うもので、加速度センサーで彩度と明度をコントロールしています。
色相をずらすという処理もやりやすいのもいいですね。最初HSBを知った時は慣れ親しんだRGBと全然違って面食らいましたが、ようやくこの使いやすさがわかりました。
PicoRuby側のコードの分量
仕組みとして、実行時にパースして、そこから動き出します。コード量が大きいとパース時点でout of memoryになるので、コード総量は常に意識しています。ATOM-MATRIX利用ではおおまか150行を超えると厳しいので、可読性と保守性を考えつつどこまで小さくできるかを常に模索しています。
また動き出したあともぼんやりしてるとあれやこれやでメモリを食い潰すので省メモリ性は意識して作っています。とくにarrayの大きさや操作にまつわるところには気をつけています。たとえばarrayをimmutableかつfluent Interfaceでな感じでやりたいところではありますが、その分メモリを多く食うわけなので、破壊的な変更を加える、メソッド呼びだしを分断するなどの対処をしています。
メモリの確保
CONFIG_ESP_MAIN_TASK_STACK_SIZEはR2P2-ESP32のデフォルト値から変更しています。とはいえ何をどの程度にすればいいのかの鼻がきくわけではないので、ぜんぜん試行錯誤です。