音楽のための関数型プログラミング言語mimiumにおける多段階計算の活用
https://fortee.jp/2026fp-matsuri/proposal/7327e938-850d-40b3-b6f5-dd3b5447523c
https://speakerdeck.com/tomoyanonymous/yin-le-notamenoguan-shu-xing-puroguraminguyan-yu-mimiumniokeruduo-duan-jie-ji-suan-nohuo-yong
mimium: Minimal Musical medIUM
汎用言語の上に最小限の音楽向け機能を実装した関、数型プログラミング言語
WASM を介した JIT コンパイルによるネイティブ実行
Rust へのトランスパイル
ブラウザ上で動作
なぜ DSL を作るのか?
既存の汎用言語ではダメ
汎用言語のライブラリとして音声処理をするのは簡単ではない
実行中コードのホットスワップをしたい(∵ライブコーディング)
汎用言語だが音声処理を第一目標としたものを作る
既存言語: SuperCoilider, ChucK, Faust
目標: もっと普通の言語っぽく
JS, Rust に近い構文
Unit Generator を特別扱いしない: 信号専用のプリミティブ型を持たない
第一級関数として実現できる
最小限のステートフルなプリミティブ演算(ディレイ、フィードバック)があれば、単なる関数になる
Faust が証明済み
関数なので合成可能
基本的に GC なし
方針: λ計算をベースにしつつ、Faust と同等の記述ができる関数型言語
単純型付きλ計算の拡張
機能
単極フィルタ(積分器)
毎サンプル異なる値を返すが、その列は決定的
BiQuad フィルタ
フィードバックディレイ
サイン波オシレータ
高階関数によるプロセッサへのメタ操作
e.g. SuperSaw
型付きマクロ
多段階計算
マクロを言語内で型安全に書くための体系
Lisp の quasiquote / unquote の型付き版
これを元にλ計算を拡張
mimium
ステージ 0: マクロ(コンパイル時)
ステージ1: 実行時(信号処理)
マクロの実行
型チェック後、クォート式は ASR を組み立てる操作の呼び出し列に変換される
変換後はクォートを含まない単なるプログラム
言語では、AST 操作を VM の組み込みプリミティブとして追加するだけ
マクロは実行時と同じレジスタマシン VM で普通のプログラムとして走る
メリット
型チェック・推論が展開の前に完了
コンパイル時計算はさまざまな方向へ拡張可能
e.g. テキストパースするプログラムをコンパイル時に実行
言語の上にさらに別の DSL を埋め込める(mini-notation)
パーサコンビネータ自体が minimum で書かれている
ライブコーディング
実行中にコードを編集して、保存すると音が更新される
既存のランタイムを変更するのではない
ソースコードをゼロからコンパイルし、状態変数(フィードバックやディレイ、リバーブの残響)を可能な限りコピーしながら VM を入れ替える
静的ライブコーディング
相対移動ポインタ(RMP)モデルで実現
静的ライブコーディングのメリット
エディタとの連携なしに、テキストソースの比較だけで完結
パッチ適用の瞬間までオーディオスレッドをブロックしない
ブロック時間はコードの構造的な差分にのみ依存
ランタイム実装の単純さを保てる
ユーザはランタイムの状態ではなく、今書かれているアルゴリズムに注力できる
#mimium