Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Multi-stage Computation and Live Internal State...

Avatar for Tomoya Matsuura Tomoya Matsuura
October 06, 2025
10

Multi-stage Computation and Live Internal State Updating of Signal Processing on mimium

Avatar for Tomoya Matsuura

Tomoya Matsuura

October 06, 2025
Tweet

More Decks by Tomoya Matsuura

Transcript

  1. λmmm base on a simply typed, call by value lambda

    calculus e ::= x x ∈ vp [value] | λx.e [lambda] | let x = e1 in e2 [let] | fix x.e [fixpoint] | e1 e2 [app] | if (ec ) et else ee [if ] | delay n e1 e2 n ∈ ℕ [delay] | feed x.e [feed] | ... τp ::= R [real] | N [nat] τ ::= τp | τ → τ [function] 7BMVFT 5FSNT vp ::= r r ∈ ℝ | n n ∈ ℕ v ::= vp | cls(λx.e, E) 5ZQFT
  2. ͜Ε·Ͱ fn cascade(n,gen){ let g = gen() if (n>0){ let

    c = cascade(n - 1.0 ,gen) let multiplier = 1.0-(1.0/(n*2.0)) |rate| { rate + g(rate/2.0)* 0.5 * rate * multiplier |> c } }else{ |rate| g(rate) } } let myosc = cascade(20, | | osc); fn dsp(){ let f = 200 let r = f |> myosc (r,r) } άϩʔόϧ؀ڥͰॳظԽ͠ͳ͍ͱ ຖαϯϓϧঢ়ଶ͕Ϧηοτ͞Εͯ͠·͏
  3. ଟஈ֊ܭࢉͰͷίʔυ #stage(macro) fn 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)} } } #stage(main) fn dsp(){ let f = 200 let r = f |> cascade!(20,`osc) (r,r) } cascadeؔ਺͸ίϯύΠϧ࣌ʹ࣮ߦ͞Εɺ ίʔυΛຒΊࠐΉͷͰঢ়ଶ͸Ҿ͖ܧ͕ΕΔ
  4. State = Feed(tsize) |Mem(tsize) |Delay(time_max) |FnCall([State]) 1αϯϓϧσΟϨΠ 1αϯϓϧલͷܭࢉ݁Ռ σΟϨΠ ඇΫϩʔδϟͳ


    ؔ਺ݺͼग़͠ ద੾ʹϚΫϩʢଟஈ֊ܭࢉʣͰ৴߸ॲཧΛهड़͢Δͱɺ
 ৴߸ॲཧʹඞཁͳϝϞϦͷσʔλ͸໦ߏ଄Ͱ੩తʹܾఆͰ͖Δ
  5. FnCall(dsp) FnCall(osc) FnCall(osc2) Feed( fl oat) Feed( fl oat) FnCall(dsp)

    FnCall(osc) Feed( fl oat) Delay(4000) FnCall(fbdelay) Feed( fl oat) fn dsp(){ osc(440) + osc2(220) } fn dsp(){ osc(440) |> fbdelay(_, 1000) }
  6. FnCall(dsp) FnCall(osc) FnCall(osc2) Feed( fl oat) Feed( fl oat) FnCall(dsp)

    FnCall(osc) Feed( fl oat) Delay(4000) FnCall(fbdelay) Feed( fl oat) fn dsp(){ osc(440) + osc2(220) } ໦ಉ࢜ͷࠩ෼ΛͱͬͯɺมԽͯ͠ͳ͍෦෼͸಺෦ঢ়ଶΛίϐʔͯ͠Ҿ͖ܧ͛Δ fn dsp(){ osc(440) |> fbdelay(_, 1000) }
  7. ಺෦ঢ়ଶͷϥΠϒߋ৽ #stage(macro) fn 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)} } } #stage(main) fn dsp(){ let f = 200 let r = f |> cascade!(20,`osc) (r,r) } ͜͜ͷίϯύΠϧ࣌ఆ਺Λߋ৽ͯ͠ ࠶ධՁͯ͠΋ɺਖ਼͘͠Ҿ͖ܧ͕ΕΔ