diff --git a/content/多段階計算と増分関数型リアクティブプログラミングによる信号処理のライブコーディング.md b/content/多段階計算と増分関数型リアクティブプログラミングによる信号処理のライブコーディング.md index 55c39a78..f5cf50c3 100644 --- a/content/多段階計算と増分関数型リアクティブプログラミングによる信号処理のライブコーディング.md +++ b/content/多段階計算と増分関数型リアクティブプログラミングによる信号処理のライブコーディング.md @@ -126,20 +126,20 @@ mimiumでは、多段階計算の体系を直感的に扱えるように2つの ### 多段階計算によるメタ操作の実例 ```rust -... -fn osc(){ - ... -} + fn additive(n,gen){ let g = gen() if (n>1){ - let c = additive(n - 1.0 ,gen) - |rate| c(rate) + g(rate)/n + let next = additive(n-1 ,gen) + |rate| next(rate) + g(rate*n)/n }else{ |rate| g(rate) } } - +... +fn osc(){ + ... +} let myosc = additive(5, | | osc); fn dsp(){ let f = 200 @@ -149,6 +149,16 @@ fn dsp(){ ``` ```rust +#stage(macro) +fn additive(n,gen){ + if (n>1){ + let n_lifted = lift_f(n) + let next = additive(n-1 ,gen) + `|rate| ($next)(rate) + ($gen)(rate*$n_lifted) / $n_lifted + }else{ + `|rate| ($gen)(rate) + } +} #stage(main) let PI = 3.14159265359 fn phasor_shift (freq,phase_shift){ @@ -160,20 +170,9 @@ fn sinwave = (freq,phase){ fn osc = (freq){ sinwave(freq,0.0) * 0.5 } -#stage(macro) -fn additive(n,gen:`(float)->float)->`(float)->float{ - if (n>1){ - let multiplier = lift_f(n) - let next = additive(n - 1.0 ,gen) - `|rate|{ ($gen)(rate*$multiplier) / $multiplier + ($next)(rate)} - }else{ - `|rate| ($gen)(rate) - } -} -#stage(main) fn dsp(){ - let f = 1000 - let r = f |> additive!(10,`osc) |> Probe!("test") + let f = 200 + let r = f |> additive!(5,`osc) (r,r) } ``` @@ -184,8 +183,9 @@ fn dsp(){ ${ let additive = |n,gen|{ if (n>1){ - let divider = lift_f(n) - `|rate| ($gen)(rate) / $divider + $additive(n - 1.0 ,gen) + let n_lifted = lift_f(n) + let next = additive(n-1 ,gen) + `|rate| ($next)(rate) + ($gen)(rate*$n_lifted) / $n_lifted }else{ `|rate| ($gen)(rate) } @@ -203,6 +203,19 @@ fn dsp(){ } } ``` + +```rust +// after macro expansion +let osc = | | { + ... + } +let dsp = | |{ + let f = 200 + let r = f |> |f| osc(f*5)/5 + osc(f*4)/4 + ... osc(f) + (r,r) +} +``` + ## コールツリーの解析 ```rust