Upgrade to Pro — share decks privately, control downloads, hide ads and more …

ruby.wasm で作る MIDI コントローラー

Sponsored · Your Podcast. Everywhere. Effortlessly. Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.

ruby.wasm で作る MIDI コントローラー

松江Ruby会議12 にて発表した ruby.wasm と Web MIDI API を活用して作成した自作シーケンサー専用の MIDI コントローラーの紹介。

Avatar for nagachika

nagachika

June 12, 2026

More Decks by nagachika

Other Decks in Technology

Transcript

  1. QVSJ fi FETZOUIͷ֨ࢠਤΤσΟλ w جԻ ֨ࢠͷதԝ ͔Β9࣠ Y ɺ:࣠ Y

    Y Y ͷप೾਺ൺ ֨ࢠͷҐஔͰԻߴ͕ܾ·Δ w 1"%ܕͷίϯτϩʔϥʔͰೖྗ͍ͨ͠ Y Y
  2. .*%* .VTJDBM*OTUSVNFOU%JHJUBM*OUFSGBDF w ָثͷʮԋ૗σʔλʯΛػثؒͰ௨৴͢ΔͨΊͷن֨ w ʮԋ૗σʔλʯ㲈ʮԻߴʯʮൃԻͷ௕͞ʯʮԻͷڧ͞ʯFUDʜ w ʮԋ૗σʔλʯ㱠ʮԻ੠σʔλʯԻͦͷ΋ͷͰ͸ͳ͍ w CZUF

    CJUT ͷόΠφϦσʔλΛෳ਺ ଟ͘͸ͭ ·ͱΊͨ΋ͷΛ .*%*ϝοηʔδͱݺͿ w ୅දతʹ͸ʮεςʔλενϟϯωϧʯʮϊʔτ൪߸ʯʮϕϩγςΟʯ ͷͭΛૹ৴͢Δ
  3. 8FC.*%*"1*ར༻ͷϋʔυϧ w ϢʔβʔΞΫγϣϯ ΫϦοΫ ʹ൓Ԡ͢ΔΠϕϯτத͔͠ॳظԽͰ͖ͳ͍ w Ϣʔβʔͷ֬ೝμΠΞϩάͰͷೝՄ͕ඞਢ ϚΠΫ΍Χϝϥͱಉ༷  w

    ޡͬͯڋ൱͢ΔͱϦηοτ͢Δͷ͕ࠔ೉ "OESPJE൛$ISPNFͰ͸αΠτຖ ೝՄϦετʹ.*%*͕ग़ݱ͠ͳ͍ͨΊ௚ۙͷαΠτ৘ใશ࡟আ͕ඞཁ  w 5-4઀ଓ͕ඞਢ ΋͘͠͸DISPNFTFUUJOHT͔Βྫ֎ొ࿥  w 64#έʔϒϧ઀ଓ࣌ʹຖճ༻్Λࢦఆ͢Δඞཁ͕͋Δ
  4. ແઢ઀ଓରԠ w 8FC#MVFUPPUI"1* #MVFUPPUI.*%* w ϞόΠϧ୺຤ଆͰೝࣝͤ͞Δ͜ͱ͕Ͱ͖ͣஅ೦ w 8FC4PDLFU .*%**"$υϥΠό w

    1SPT.*%*ͷ࢖͑ͳ͍J04 J1BE Ͱ΋࢖͑Δ w $POT8FC.*%*"1*Λ࢖ͬͯͳ͍ʜʜ ίϯτϩʔϥʔଆ͸
  5. 8FC$PNQPOFOUTԽ w ͜Μͳײ͡Ͱ8FC$PNQPOFOUϞδϡʔϧΛఆٛ module WebComponent module ClassMethods def register(tag_name) ruby_class_name

    = name js_code = <<~JS (() => { class RubyComponent extends HTMLElement { connectedCallback() { const id = App.eval(` inst = #{ruby_class_name}.new id = WebComponent::WC_REGISTRY.size WebComponent::WC_REGISTRY[id] = inst inst.connected_callback(this_elem) `).toJS(); this.__rubyId = id; } } customElements.define('#{tag_name}', RubyComponent); })(); JS JS.eval(js_code) end end end
  6. 8FC$PNQPOFOUTԽ w 8FC$PNQPOFOUΛJODMVEFͯ͠ίϯϙʔωϯτΫϥεΛఆٛ class PadGrid include WebComponent def connected_callback(js_element) @element

    = js_element render_grid attach_events end def render_grid doc = JS.global[:document] @grid = doc.call(:createElement, "div") @grid[:className] = "grid" VIEW_YS.reverse_each do |y| VIEW_XS.each do |x| btn = doc.call(:createElement, "button") btn[:dataset][:x] = x btn[:dataset][:y] = y btn[:textContent] = note.to_s @grid.call(:appendChild, btn) end end @shadow.call(:appendChild, @grid) end