TL;DR

  • mimium は汎用言語の上に最小限の音楽向け機能を載せた関数型プログラミング言語で、ラムダ計算を拡張して作られている。
  • 多段階計算で、型安全なマクロをコンパイル時に実行できる。
  • ソースを毎回ゼロからコンパイルし、状態を引き継いで VM を入れ替える静的なライブコーディングを実現している。

内容

mimium とは

mimium(Minimal Musical medIUM)は、汎用言語の上に最小限の音楽向け機能を実装した関数型プログラミング言語である。WebAssembly を介した JIT コンパイルでネイティブに実行でき、Rust へのトランスパイルもでき、ブラウザ上でも動く。

なぜ言語を作るのか

汎用言語のライブラリとして音声処理を書くのは簡単ではない。また、ライブコーディングのために、実行中のコードをホットスワップしたい。そこで、汎用言語でありながら音声処理を第一の目標とした言語を作る。既存の言語には SuperCollider、ChucK、Faust がある。

mimium の目標はもっと普通の言語らしくすることである。構文は JavaScript や Rust に近い。Unit Generator を特別扱いせず、信号専用のプリミティブ型を持たない。ディレイやフィードバックといった最小限のステートフルなプリミティブ演算があれば、Unit Generator は単なる第一級関数として表せることを Faust が証明しており、関数なので合成もできる。GC も基本的にない。方針は単純型付きラムダ計算をベースにしつつ、Faust と同等の記述ができる関数型言語である。

機能

単極フィルタ(積分器)、BiQuad フィルタ、フィードバックディレイ、サイン波オシレータを書ける。単極フィルタは毎サンプル異なる値を返すが、その列は決定的である。高階関数を使ってプロセッサをメタに操作することもでき、SuperSaw が例として示された。

多段階計算による型付きマクロ

多段階計算はマクロを言語の中で型安全に書くための体系で、Lisp の quasiquote / unquote の型付き版にあたる。mimium はこれを元にラムダ計算を拡張しており、ステージ 0 がマクロ(コンパイル時)、ステージ 1 が実行時(信号処理)である。

型チェックの後、クォート式は AST を組み立てる操作の呼び出し列に変換される。変換後はクォートを含まない単なるプログラムになる。言語側では AST の操作を VM の組み込みプリミティブとして追加するだけでよく、マクロは実行時と同じレジスタマシンの VM で普通のプログラムとして動く。

型チェックと型推論は展開の前に終わる。コンパイル時の計算はさまざまな方向に広げられ、たとえばテキストをパースするプログラムをコンパイル時に実行できる。これで言語の上にさらに別の DSL(mini-notation)を埋め込める。そのパーサコンビネータ自体も mimium で書かれている。

ライブコーディング

実行中にコードを編集して保存すると、音が更新される。既存のランタイムを書き換えるのではなく、ソースコードをゼロからコンパイルし、状態変数(フィードバックやディレイ、リバーブの残響)をできるだけコピーしながら VM を入れ替える。これを静的ライブコーディングと呼び、相対移動ポインタ(RMP)モデルで実現している。

静的ライブコーディングには次の利点がある。

  • エディタと連携しなくても、テキストのソースを比べるだけで完結する
  • パッチを適用する瞬間までオーディオスレッドをブロックしない。ブロックする時間はコードの構造的な差分だけで決まる
  • ランタイムの実装を単純に保てる
  • ユーザはランタイムの状態ではなく今書いているアルゴリズムに集中できる

キーワード

関連