From 0334d0f7b3eff2a1275617f48f24849caa874a7e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=BE=E6=B5=A6=20=E7=9F=A5=E4=B9=9F=20Matsuura=20Tomoy?= =?UTF-8?q?a?= Date: Mon, 1 Dec 2025 09:18:13 +0900 Subject: [PATCH] [obsidian] vault backup: 2025-12-01 09:18:13[ --- ...ィブプログラミングのによる信号処理のライブコーディング.md | 35 ++++++++++++++++--- 1 file changed, 30 insertions(+), 5 deletions(-) diff --git a/content/多段階計算と増分関数型リアクティブプログラミングのによる信号処理のライブコーディング.md b/content/多段階計算と増分関数型リアクティブプログラミングのによる信号処理のライブコーディング.md index cf2d6a40..51f0ecb8 100644 --- a/content/多段階計算と増分関数型リアクティブプログラミングのによる信号処理のライブコーディング.md +++ b/content/多段階計算と増分関数型リアクティブプログラミングのによる信号処理のライブコーディング.md @@ -60,13 +60,11 @@ mimiumはコードを専用のVMバイトコードへコンパイルし実行す ## 多段階計算 多段階計算は、型付きラムダ計算に対して、計算のステージを複数段階に分割する明示的なシンタックスを導入するものである。Lisp系言語のquote/splice機能[@lisp]のように、部分的に計算したコード片を埋め込むようなものを想定しているが、不正な値が埋め込まれないことを型システムとして保証することが特徴である(逆に、通常マクロに期待される型システムの範囲を超えたメタ操作を行うことは許されない)。実用的な例では、Scala 3でのマクロや、関数型組版処理エンジンSaTysFi[@suwa2024]のように、言語内DSLを型安全にライブラリとして実装することを想定しているものがある。mimiumにおいては、多段階計算はコンパイル時に行う計算(=シグナルグラフのルーティングの決定)と、ランタイム時に行う計算(=実際のオーディオ処理)を区別するのに用いている。 - - ### シンタックスの拡張 図nにmimiumの内部表現Lambda-mmmに多段階計算の体系を加えた新しい内部表現 $\lambda_{Mmmm}$(Multi-stage version of $\lambda_{mmm}$)のシンタックスを定義する。 -型にはCode Type $\langle t\rangle$を加える +型にはCode Type $`t$を加える $$ \begin{align} \tau ::= @@ -74,11 +72,11 @@ $$ |&\quad I_n \quad &n \in \mathbb{N} \\ |&\quad \tau_1 → \tau_2 &\\ |&\quad (\tau_1,\tau_2,...) &\\ - |&\quad \langle \tau \rangle + |&\quad ` \tau \end{align} $$ -式にはクオートとスプライスを加える。mem(e)はシングルサンプルのディレイだが、これは遅延時間のデータを保存する必要がないため通常のディレイと区別して使用される。 +式にはクオート($`e$)とスプライス($\$e$)を加える。これはMetaMLなど代表的な多段階計算言語における$..$と$\textasciitilde e$に対応するものである。mem(e)はシングルサンプルのディレイだが、これは遅延時間のデータを保存する必要がないため通常のディレイと区別して使用される。 $$ \begin{align} e ::= @@ -169,6 +167,33 @@ fn dsp(){ (r,r) } ``` + + +```rust +`{ + ${ + let cascade = |n,gen|{ + if (n>0.0){ + let multiplier = 1.0-(1.0/(n*3)) |> lift_f + `{|rate| rate + ($gen)(rate/3)* 0.5 * rate* $multiplier + |> $cascade(n - 1.0 ,gen) } + }else{ + `{|rate| ($gen)(rate)} + } + } + `{ + let osc = | | { + ... + } + let dsp = | |{ + let f = 200 + let r = f |> cascade!(20,`osc) + (r,r) + } + } + } +} +``` ## コールツリーの解析 ```rust