Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
module Synths; end
Search
あそなす
September 06, 2026
Technology
160
1
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
module Synths; end
https://rhc.connpass.com/event/392503/
あそなす
September 06, 2026
More Decks by あそなす
See All by あそなす
From Live Code to Sound: Building a Ruby Live Coding Engine
asonas
1
240
Generative Sequencer - and thus... onward to PicoRuby
asonas
1
210
How to make the Groovebox
asonas
2
2.5k
RubyKaigi 2025 pre-event
asonas
0
1.3k
Practical The One Person Framework
asonas
1
5.9k
kosendj-sharp-1-report
asonas
0
170
The ScrumMaster's Guide to the Galaxy
asonas
4
1.8k
fukuokarb02
asonas
0
620
Setsuna -counterfeit killer-
asonas
0
240
Other Decks in Technology
See All in Technology
「大丈夫そう?」をObservabilityで確かめる
mrmtsu
0
240
HolmesGPTで始めるSREエージェント入門!プラットフォームの障害調査はAIにお任せ 〜
sanghyuk
0
250
形式手法を使って仕様をコーディングしよう
mikanichinose
0
150
メルカリにおけるAI時代の高速プロトタイピング基盤「Arca」
ryotarai
18
13k
営業オントロジーの作り方と、エージェントからの辿り方 ── ナレッジワークの現場から
kworkdev
PRO
1
210
PQC移行の今 -- IETF からみた現在地
satokan
4
700
あなたの知らないAmazon VPC Route Server/Amazon VPC Route Server you don't know about
masakiokuda
1
180
spanner-autoscalerに学ぶ CRD設計パターン 〜自動化と緊急時対応を両立する Kubernetesコントローラーの作り方〜
tkuchiki
0
210
雪かき部 #7 もう怖くない!SELECT文!
foursue
0
260
いちAWSエンジニアのAI活用を振り返る #devio2026 / devio osaka 2026 kawahara
masahirokawahara
1
290
Oracle Base Database Service 技術詳細
oracle4engineer
PRO
16
120k
猫でもわかるKiro Web
kentapapa
1
160
Featured
See All Featured
brightonSEO & MeasureFest 2025 - Christian Goodrich - Winning strategies for Black Friday CRO & PPC
cargoodrich
3
850
The Invisible Side of Design
smashingmag
301
52k
HTML-Aware ERB: The Path to Reactive Rendering @ RubyCon 2026, Rimini, Italy
marcoroth
5
750
Collaborative Software Design: How to facilitate domain modelling decisions
baasie
1
330
What Being in a Rock Band Can Teach Us About Real World SEO
427marketing
0
1.1k
Applied NLP in the Age of Generative AI
inesmontani
PRO
4
2.5k
Skip the Path - Find Your Career Trail
mkilby
1
240
The Curse of the Amulet
leimatthew05
3
15k
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
38
3k
Optimizing for Happiness
mojombo
378
71k
Dealing with People You Can't Stand - Big Design 2015
cassininazir
367
27k
jQuery: Nuts, Bolts and Bling
dougneiner
66
8.6k
Transcript
follow up module Synths; end asonas
こんにちは〜 ★ say("I am asonas" * 100) ★ a.k.a Yuya
Fujiwara ★ RubyKaigi 2026 ★ From Live Code to Sound: Building a Ruby Live Coding Engine ★ Rubyでライブコーディングの音楽パフォーマンスができる
Rubyで 自由に音を鳴らすことに 執着している
これまでの執着のおさらい
None
None
Recap: How to make the Groovebox ★ asonas/groovebox-ruby ★ Rubyを使ってTUI上で作曲ができる
★ スピーカーに出る直前まではPureRuby ★ 初めてソフトウェアのみで楽器をつくる経験 ★ 試行錯誤の積み重ね ★ ソフトウェアとしての品質はあまり良くない
None
None
Recap: From Live Code to Sound: Building a Ruby Live
Coding Engine ★ asonas/strudel-rb ★ Rubyでまた楽器をつくる ★ 実用性を重視してライブで生演奏ができること ★ goovebox-rubyのコードをベースにStrudelのRuby版をつくる ★ 個人的には満足いく完成度合い
After RubyKaigi 2026
strudel-rbの変更 ★ 本家Strudelの $: 記法をつかえるようにした ★ MITライセンスを付与した
本家Strudel の $: 記法を使えるようにした ★ Rubyにおける $:(だらーころん) は特殊変数 ★ Before/After
★ track(:arp) { do̲something } # こう書いていたものが ★ $:arp { do̲something } # こう書ける(Rubyで) ★ ̲$:arp ように underscore をいれることでミュートもできる
本家Strudel の $: 記法を使えるようにした ★ Strudelとstrudel-rbの大きなシンタックスの違いだった ★ Strudelで動くコードはstrudel-rbでも動く(はず) ★ 当時のデモで演奏したコードは
track から $: に置き換えて動く ★ プリコンパイルみたいな仕組みを用意した ★ lib/strudel/live/dollar̲colon̲preprocessor.rb
Rubyで作曲やライブ コーディングでパフォー マンスもできるように! めでたしめでたし...?
ところで
Rubyで 自由に音を鳴らすことに 執着している
ソフトウェアで 楽器はつくれた 学びも多かった
では、ハードウェアは?
今日のタイトル
module Synths; end
もじゅーる しんせす
モジュラーシンセ
こういうやつ tt h ps://commons.wikimedia.org/wiki/File:Eurorack_synth_patched.jpg
こういうやつの これ↓をつくってみたい tt h ps://commons.wikimedia.org/wiki/File:Eurorack_synth_patched.jpg
これまでの知識と経験 ★ Rubyをつかって音を鳴らす基礎の理解はできた ★ 波形をつくったりフィルターをつくったりタイミングの制御をし たりエフェクターをつくったりMIDIと同期をしたり ★ 曲として仕上がってくるとパラメータの制御やパッチをあてて部分 的に音の変化をさせたくなってくる ★
DTMでいうところの音作りやオートメーション、フィルターの 抜き差し、パラメーターの調整とか
ハードウェアのメリットを享受したい ★ ポテンショメーターやスライド抵抗、ボタンの入力値を受け 取ってそれを音へフィードバックする ★ それってハードウェアのシンセサイザーでは? ★ モジュラーシンセ
試行錯誤をしまくりだが 省略 無限に話したいので機会を見つけたい
v1.1
Basic Osc v1.1 ★ 「基本のオシレーター」と呼んでいる ★ MIDI、モノラル出力、ポテンショメーター*4 ★ Seeed Studio
XIAO RP2040 ★ PCM5102A
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
None
↑シーケンサー(いいやつ) ←ドラムマシン 今回は簡単な デモなのでキックだけ シンセサイザー↑ ポットを取り付けて いなくてもうごく
↑シーケンサー(いいやつ) ←ドラムマシン DEMO シンセサイザー↑ 今回は簡単な デモなのでキックだけ ポットを取り付けて いなくてもうごく
Basic Osc v1.1 ★ 素朴なつくりの割にいい感じ に動く ★ 毎回ビルドして転送している とテンポが悪い →
★ たのしい ★ もっとよくしたいぞ!
試行錯誤をしまくりだが 省略2 無限に話したいので機会を見つけたい2
v5.x(実機は制作中)
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とかも仲間
Daisy Seed 3 ★ フィルターやエフェクトをリアルタイ ムにやるにはRP2040/RP2350の処理 能力が不足 ★ そこで、PicoRubyによる制御とリア ルタイムDSPを分離し、音声処理のタ
イミングを安定させる
どうやってRP2350とSeed3を通信するか ★ マイコン同士はUARTで通信をする ★ Seed3には外部フラッシュメモリ(QSPI)があり比較的大きな データをおける ★ 自作の中間表現(仮称Graph IR)を定義した ★
UART経由で中間表現のバイナリを転送する ★ バイナリを介してSeed3のネイティブDSPで音を再生できる
Graph IR (Intermediate Representation) ★ 楽器の構造を作るためのNodeとEdgeの関係を定義する ★ NodeとEdgeで信号の流れを表すのでGraphと呼んでいる ★ 絶賛開発中なので名前は変わるかも
★ 仕様とかもまだ全然変わる ★ 場: github.com/asonas/partch ★ push してないファイル多数...
データの構造 今の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 ※ 一部の必須パラメーターを省略
大まかなフロー ★ RP2350でRubyのコードをバイナリに変換して graph.install! や graph.apply! を呼ぶとUART経由でSeed3側に転送される ★ Seed3側で送られてきたバイナリの検証をして保存 ★
検証に失敗したら直前のバイナリで再生を続ける ★ 検証結果をRP2350向けに返す
None
←RP2350 (PicoRuby) Daisy Seed 3 ↑
←RP2350 (PicoRuby) DEMO Daisy Seed 3 ↑
所感 ★ Ruby側は楽器の構造、Seed3側はリアルタイムDSPに責務を分けられ たのはおもしろいとは思う ★ 一般的(とは?)な楽器の開発のフロー(とは?)からは外れてい る?みんな(だれ?)も似たようなことをしているのだろうか?その 謎を解き明かすために我は電子楽器の製造の聖地、静岡県浜松市へ... ★ 少なくとも任意のプログラミング言語から楽器の構造を組み立てたい
という発想でハードウェアをつくることは稀ではないか(要研究)
将来的な展望 ★ Graph IRの仕様を詰めていくことで表現できることを増やす ★ 基板のバリエーションを増やす ★ オーディオの入力、映像の入力、様々なセンサなど ★ irbでコードを送りつけて音が変わる体験、不思議な気持ちになる
のでみんなにも経験してほしい ★ ので、形になってきたらキットや実装済み基板として頒布したい
None
詳しい人向けFAQ Q: Seed3だけでよくない? はい
詳しい人向けFAQ Q: Seed3だけでよくない? ★ RP2350とSeed3の2マイコンにすることで複雑になる ★ 今回のプロジェクトは音をつくる体験を提供することを目的にして いる ★ Agentic
Codingでつくれるとしても、まずは自分が読めるコー ドから音をつくることで学ぶ必要がある ★ 学んで自分の知識と経験にすることで次の未知の領域へ進める (と信じてる)
詳しい人向けFAQ Q: Seed3だけでよくない? ★ ちなみに回路上RP2350とSeed3は独立している ★ RP2350がなくともSeed3は音を発せられる ★ 【完全に理解したら】RP2350を介さずに直接Seed3にファー ムウェアを書いて音を鳴らすこともできる