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

module Synths; end

module Synths; end

Avatar for あそなす

あそなす

September 06, 2026

More Decks by あそなす

Other Decks in Technology

Transcript

  1. こんにちは〜 ★ say("I am asonas" * 100) ★ a.k.a Yuya

    Fujiwara ★ RubyKaigi 2026 ★ From Live Code to Sound: Building a Ruby Live Coding Engine ★ Rubyでライブコーディングの音楽パフォーマンスができる
  2. Recap: How to make the Groovebox ★ asonas/groovebox-ruby ★ Rubyを使ってTUI上で作曲ができる

    ★ スピーカーに出る直前まではPureRuby ★ 初めてソフトウェアのみで楽器をつくる経験 ★ 試行錯誤の積み重ね ★ ソフトウェアとしての品質はあまり良くない
  3. Recap: From Live Code to Sound: Building a Ruby Live

    Coding Engine ★ asonas/strudel-rb ★ Rubyでまた楽器をつくる ★ 実用性を重視してライブで生演奏ができること ★ goovebox-rubyのコードをベースにStrudelのRuby版をつくる ★ 個人的には満足いく完成度合い
  4. 本家Strudel の $: 記法を使えるようにした ★ Rubyにおける $:(だらーころん) は特殊変数 ★ Before/After

    ★ track(:arp) { do̲something } # こう書いていたものが ★ $:arp { do̲something } # こう書ける(Rubyで) ★ ̲$:arp ように underscore をいれることでミュートもできる
  5. Basic Osc v1.1 ★ XIAO RP2040 -----------------> ★ ちいさくて扱いやすい ★

    patch.rbをPCでmrbcでコンパイル ★ RP2040のmruby/c VMで実行 ★ ★ synth = MidiSynth.new(channel: 4) while true synth.detune_cents = (Pot.read(0) - 2048) * 10 基本的にはC拡張で定義をする synth.harmonic_ratio = 2 + Pot.read(1) * 6 / 4 synth.harmonic_mix = Pot.read(2) / 4095.0 右みたいなコードが動く(簡略板) synth.release_ms = 5 + Pot.read(3) * 1995 / 40 end
  6. Basic Osc v5.x ★ MIDI IN/Thru(CV/Gateにするかも), オーディオ L/R, ポット4つ ★

    Seeed Studio XIAO RP2350 ★ RP2040で遭遇した大量のRubyオブジェクト生成時のメモリ不足を回避 できる ★ Daisy Seed 3 ★ 一般的な音楽のハードウェアで使う基板(円安で1枚4500円ぐらい) ★ Teensy 4.1とかも仲間
  7. データの構造 今のGraph IR graph = Partch.graph do osc = oscillator(:sine,

    frequency_hz: 440) env = adsr(osc, attack: 0.01, release: 0.4) amp = gain(env, level: 0.2) output(amp) end ★ おおざっぱな関係を示してます ★ edge̲startとかでNodeがどこにつながっ ているのかを表現している Node #1 { type: oscillator, parameter_start: 0, parameter_count: 4, edge_start: 0, edge_count: 1 } Node #2 { type: adsr, parameter_start: 4, parameter_count: 5, edge_start: 1, edge_count: 1 } Node #3 { type: gain, parameter_start: 9, parameter_count: 1, edge_start: 2, edge_count: 1 } Node #4 { type: stereo_output, parameter_start: 10, parameter_count: 0, edge_start: 3, edge_count: 0 } バイナリにすると以下みたいな構造 PGRF Header │ ├── Node #1: Oscillator ├── Node #2: ADSR ├── Node #3: Gain ├── Node #4: StereoOutput │ ├── Edge: 1 → 2 ├── Edge: 2 → 3 ├── Edge: 3 → 4 │ ├── Oscillator.waveform = sine ├── Oscillator.frequency_hz = 440.0 ├── Oscillator.level = 1.0 ├── Oscillator.gate = 1.0 ├── ADSR.attack = 0.01 ├── ADSR.release = 0.4 ├── ADSR.gate = 1.0 └── Gain.level = 0.2 ※ 一部の必須パラメーターを省略
  8. 詳しい人向けFAQ Q: Seed3だけでよくない? ★ RP2350とSeed3の2マイコンにすることで複雑になる ★ 今回のプロジェクトは音をつくる体験を提供することを目的にして いる ★ Agentic

    Codingでつくれるとしても、まずは自分が読めるコー ドから音をつくることで学ぶ必要がある ★ 学んで自分の知識と経験にすることで次の未知の領域へ進める (と信じてる)