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

Multi-stage Computation and Live Internal State...

Multi-stage Computation and Live Internal State Updating of Signal Processing on mimium, a sound programming language

Avatar for Tomoya Matsuura

Tomoya Matsuura

January 10, 2026
Tweet

More Decks by Tomoya Matsuura

Other Decks in Programming

Transcript

  1. ͓͞Β͍ 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) } ৴߸ॲཧΛશͯmimiumݴޠ্ͰఆٛͰ͖Δ ߴ֊ؔ਺ͱ͔΋࢖͑Δ
  2. λ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 ຖαϯϓϧҟͳΔ݁ՌΛฦ͢ ʢ಺෦ঢ়ଶΛ࣋ͭʹ෭࡞༻Λѻ͏ʣ ͕ɺܾఆతͳ෭࡞༻
  3. ͜Ε·Ͱͷߴ֊ؔ਺ fn additive(n,gen){ let g = gen() if (n>1){ let

    next = additive(n-1 ,gen) |rate| next(rate) + g(rate*n)/n }else{ |rate| g(rate) } } let PI = 3.14159265359 fn phasor (freq){ (self + freq/samplerate)%1.0 } fn sinwave(freq){ phasor(freq)*2.0*PI |> sin } fn osc (freq){ sinwave(freq) * 0.5 } let myosc = additive(5, | | osc); fn dsp(){ let f = 200 let r = f |> myosc (r,r) } ߴ֊ؔ਺͸ඞͣάϩʔόϧ؀ڥͰ ධՁ͔ͯ͠Β࢖Θͳ͚Ε͹͍͚ͳ͍ ʹεέʔϥϒϧͰͳ͍
  4. ଟஈ֊ܭࢉͰͷίʔυ #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 (freq){ (self + freq/samplerate)%1.0 } fn sinwave(freq){ phasor(freq)*2.0*PI |> sin } fn osc (freq){ sinwave(freq) * 0.5 } fn dsp(){ let f = 200 let r = f |> additive!(5,`osc) (r,r) } additiveؔ਺͸ίϯύΠϧ࣌ʹల։͞Εɺ ຒΊࠐ·ΕΔ ίϯύΠϧ࣌ఆ਺ΛϥϯλΠϜʹҠಈ͢Δ ϓϦϛςΟϒؔ਺
  5. λMmmm (Lambda-Multistage-triple-m) e ::= R R ∈ ℝ[number] | λx

    . e [abs] | let x = e1 in e2 [let] | fix x . e [fixpoint] | e e [app] | if (ec ) et else ee [if ] | delay n e1 e2 [delay] | mem(e) [mem] | feed x . e [feed] | ‵(e) [quote] | $(e) [splice] τ ::= R | In n ∈ ℕ | τ → τ | ⟨τ⟩ 7BMVFT 5FSNT v ::= | R R ∈ ℝ[number] | cls(e, E) [closure] | ⟨v⟩ [code] 5ZQFT
  6. #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 (freq){ (self + freq/samplerate)%1.0 } fn sinwave(freq){ phasor(freq)*2.0*PI |> sin } fn osc (freq){ sinwave(freq) * 0.5 } fn dsp(){ let f = 200 let r = f |> additive!(5,`osc) (r,r) } #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 (freq){ (self + freq/samplerate)%1.0 } fn sinwave(freq){ phasor(freq)*2.0*PI |> sin } fn osc (freq){ sinwave(freq) * 0.5 } fn dsp(){ let f = 200 let r = f |> additive!(5,`osc) (r,r) }
  7. ίϯύΠϧաఔ `{ ${ letrec 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) } } `{ let PI = 3.14159265359 let phasor = |freq|{ (self + freq/samplerate)%1.0 } let sinwave= |freq|{ phasor(freq)*2.0*PI |> sin } let osc = |freq|{ sinwave(freq) * 0.5 } let dsp = | |{ let f = 200 let r = f |> ($additive)(5,`osc) (r,r) } } } } γϯλοΫεγϡΨʔల։ޙ
  8. ίϯύΠϧաఔ `{ ${ letrec 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) } } `{ let PI = 3.14159265359 let phasor = |freq|{ (self + freq/samplerate)%1.0 } let sinwave= |freq|{ phasor(freq)*2.0*PI |> sin } let osc = |freq|{ sinwave(freq) * 0.5 } let dsp = | |{ let f = 200 let r = f |> ($additive)(5,`osc) (r,r) } } } } εςʔδ0ධՁελʔτ
  9. ίϯύΠϧաఔ `{ ${ letrec additive = |n,gen|{ if (n>1){ let

    n_lifted = `5 let next = additive(4 ,gen) `|rate| ($next)(rate) + ($gen)(rate*$n_lifted) / $n_lifted }else{ `|rate| ($gen)(rate) } } `{ let PI = 3.14159265359 let phasor = |freq|{ (self + freq/samplerate)%1.0 } let sinwave= |freq|{ phasor(freq)*2.0*PI |> sin } let osc = |freq|{ sinwave(freq) * 0.5 } let dsp = | |{ let f = 200 let r = f |> ($additive)(5,`osc) (r,r) } } } } εςʔδ0ධՁελʔτ
  10. ίϯύΠϧաఔ `{ ${ letrec additive = |n,gen|{ if (n>1){ let

    n_lifted = `5 let next = `|rate|{|r3|{|r2|{|r1|{osc(r1*1)/1}(r2)+osc(r2*2)/2}(r3) +osc(r3*3)/3}(rate)+osc(rate*4)/4} `|rate| ($next)(rate) + ($gen)(rate*$n_lifted) / $n_lifted }else{ `|rate| ($gen)(rate) } } `{ let PI = 3.14159265359 let phasor = |freq|{ (self + freq/samplerate)%1.0 } let sinwave= |freq|{ phasor(freq)*2.0*PI |> sin } let osc = |freq|{ sinwave(freq) * 0.5 } let dsp = | |{ let f = 200 let r = f |> ($additive)(5,`osc) (r,r) } } } εςʔδ0ධՁத
  11. ίϯύΠϧաఔ `{ ${ letrec additive = |n,gen|{ if (n>1){ let

    n_lifted = `5 `|rate| $`|rate|{|r3|{|r2|{|r1|{osc(r1*1)/1}(r2)+osc(r2*2)/2}(r3) +osc(r3*3)/3}(rate)+osc(rate*4)/4)}(rate) + ($`osc)(rate*$`5) / $`5 }else{ `|rate| ($gen)(rate) } } `{ let PI = 3.14159265359 let phasor = |freq|{ (self + freq/samplerate)%1.0 } let sinwave= |freq|{ phasor(freq)*2.0*PI |> sin } let osc = |freq|{ sinwave(freq) * 0.5 } let dsp = | |{ let f = 200 let r = f |> ($additive)(5,`osc) (r,r) } } } } εςʔδ0ධՁத splice($)ͱquote(`)ͷϖΞ͕Ͱ͖ͨΒ ଧͪফ͠
  12. ίϯύΠϧաఔ `{ ${ letrec additive = |n,gen|{ if (n>1){ let

    n_lifted = `5 `|rate|{|rate|{|r3|{|r2|{|r1|{osc(r1*1)/1}(r2)+osc(r2*2)/2}(r3) +osc(r3*3)/3}(rate)+osc(rate*4)/4)}(rate) + (osc)(rate*5) / 5 } }else{ `|rate| ($gen)(rate) } } `{ let PI = 3.14159265359 let phasor = |freq|{ (self + freq/samplerate)%1.0 } let sinwave= |freq|{ phasor(freq)*2.0*PI |> sin } let osc = |freq|{ sinwave(freq) * 0.5 } let dsp = | |{ let f = 200 let r = f |> ($additive)(5,`osc) (r,r) } } } } εςʔδ0ධՁத splice($)ͱquote(`)ͷϖΞ͕Ͱ͖ͨΒ ଧͪফ͠
  13. ίϯύΠϧաఔ `{ ${ letrec additive = |n,gen|{ if (n>1){ let

    n_lifted = `5 `|rate|{osc(rate*1)/1+osc(rate*2)/2+osc(rate*3)/3 +osc(rate*4)/4)+ osc(rate*5)/5 } }else{ `|rate| ($gen)(rate) } } `{ let PI = 3.14159265359 let phasor = |freq|{ (self + freq/samplerate)%1.0 } let sinwave= |freq|{ phasor(freq)*2.0*PI |> sin } let osc = |freq|{ sinwave(freq) * 0.5 } let dsp = | |{ let f = 200 let r = f |> ($additive)(5,`osc) (r,r) } } } } εςʔδ0ධՁத ࣗ༝ม਺ΛΩϟϓνϟ͠ͳ͍ؔ਺ద༻͸ ΠϯϥΠϯల։ͯ͠΋Өڹͳ͠ ʢ͜͜ͷఆࣜԽ͸ո͍͠ʣ
  14. ίϯύΠϧաఔ `{ ${ letrec additive = |n,gen|{ if (n>1){ let

    n_lifted = `5 `|rate|{osc(rate*1)/1+osc(rate*2)/2+osc(rate*3)/3 +osc(rate*4)/4)+ osc(rate*5)/5 } }else{ `|rate| ($gen)(rate) } } `{ let PI = 3.14159265359 let phasor = |freq|{ (self + freq/samplerate)%1.0 } let sinwave= |freq|{ phasor(freq)*2.0*PI |> sin } let osc = |freq|{ sinwave(freq) * 0.5 } let dsp = | |{ let f = 200 let r = f |> $`|rate|osc(rate*1)/1+osc(rate*2)/2+osc(rate*3)/3 +osc(rate*4)/4)+ osc(rate*5)/5 (r,r) } } } εςʔδ0ධՁத splice($)ͱquote(`)ͷϖΞ͕Ͱ͖ͨΒ ଧͪফ͠
  15. ίϯύΠϧաఔ `{ ${ `{ let PI = 3.14159265359 let phasor

    = |freq|{ (self + freq/samplerate)%1.0 } let sinwave= |freq|{ phasor(freq)*2.0*PI |> sin } let osc = |freq|{ sinwave(freq) * 0.5 } let dsp = | |{ let f = 200 let r = f |> |rate|osc(rate*1)/1+osc(rate*2)/2+osc(rate*3)/3 +osc(rate*4)/4)+ osc(rate*5)/5 (r,r) } } } } εςʔδ0ධՁத splice($)ͱquote(`)ͷϖΞ͕Ͱ͖ͨΒ ଧͪফ͠
  16. ίϯύΠϧաఔ `{ let PI = 3.14159265359 let phasor = |freq|{

    (self + freq/samplerate)%1.0 } let sinwave= |freq|{ phasor(freq)*2.0*PI |> sin } let osc = |freq|{ sinwave(freq) * 0.5 } let dsp = | |{ let f = 200 let r = f |> |rate|osc(rate*1)/1+osc(rate*2)/2+osc(rate*3)/3 +osc(rate*4)/4)+ osc(rate*5)/5 (r,r) } } εςʔδ0ධՁ׬ྃ
  17. ͜Ε·Ͱͷߴ֊ؔ਺ fn additive(n,gen){ let g = gen() if (n>1){ let

    next = additive(n-1 ,gen) |rate| next(rate) + g(rate*n)/n }else{ |rate| g(rate) } } let PI = 3.14159265359 fn phasor (freq){ (self + freq/samplerate)%1.0 } fn sinwave(freq){ phasor(freq)*2.0*PI |> sin } fn osc (freq){ sinwave(freq) * 0.5 } let myosc = additive(5, | | osc); fn dsp(){ let f = 200 let r = f |> myosc (r,r) } myoscͷ಺෦ঢ়ଶϝϞϦϨΠΞ΢τ͸ άϩʔόϧ؀ڥධՁ࣌ʹ࣮ߦ࣌ʹܾఆ͞ΕΔ
  18. ଟஈ֊ܭࢉͷ৔߹ let PI = 3.14159265359 let phasor = |freq|{ (self

    + freq/samplerate)%1.0 } let sinwave= |freq|{ phasor(freq)*2.0*PI |> sin } let osc = |freq|{ sinwave(freq) * 0.5 } let dsp = | |{ let f = 200 let r = f |> |rate|osc(rate*1)/1+osc(rate*2)/2+osc(rate*3)/3 +osc(rate*4)/4)+ osc(rate*5)/5 (r,r) } ϝϞϦϨΠΞ΢τ͸ ίϯύΠϧ࣌ʹܾఆՄೳ
  19. State ::= Feed(tsize) |Mem(tsize) |Delay(time_max) |FnCall([State]) 1αϯϓϧσΟϨΠ 1αϯϓϧલͷܭࢉ݁Ռ σΟϨΠ ඇΫϩʔδϟͳ


    ؔ਺ݺͼग़͠ ద੾ʹϚΫϩʢଟஈ֊ܭࢉʣͰ৴߸ॲཧΛهड़͢Δͱɺ
 ৴߸ॲཧʹඞཁͳϝϞϦͷσʔλ͸ίʔϧπϦʔʹجͮ͘໦ߏ଄Ͱ੩తʹܾఆͰ͖Δ ʢݫີʹݴ͏ͱɺϥϯλΠϜͰ࠶ؼΛ࢖͏ࡍʹ͸಺෦ঢ়ଶ෇͖ؔ਺Λݺ͹ͳ͍͜ͱΛอূ͢Δඞཁ͕͋Δʣ
  20. fn phasor(freq){ (self+(1/freq))%1.0 } fn osc(freq){ - phasor(freq) * 2

    * PI |> sin + phasor(freq+(phasor(freq/10))) * 2 * PI |> sin } fn fmosc(freq,rate){ osc(freq + osc(rate)) } fn dsp(){ - fmosc(440,10) + osc(880) + fmosc(1320,10) + fmosc(440,10) + fmosc(1320,10) } ྫ͑͹ɺ͜Μͳࠩ෼Λߟ͑ͯΈΔ
  21. from: ... to: ... size: ... from: ... to: ...

    size: ... from: ... to: ... size: ... from: ... to: ... size: ... dsp dsp fmosc fmosc fmosc fmosc osc osc osc osc osc osc osc osc osc phasor phasor phasor phasor phasor phasor phasor phasor phasor phasor phasor phasor phasor feed feed feed feed feed feed feed feed feed feed feed feed feed Generate Patches Apply Patches Swap VMs Compare State Trees Version 1-a Previous Storage Compiler Thread Audio Thread Upcoming Storage Version 2-b VM1 VM2 ίʔϧπϦʔͷࢠཁૉΛɺ ࠷௕ڞ௨෦෼ྻʢLCSʣΛ࠶ؼతʹ༻͍ͯࠩ෼Λܭࢉ͢Δ ↓ ࢖͍·ΘͤΔ಺෦ঢ়ଶσʔλΛݕग़
  22. from: ... to: ... size: ... from: ... to: ...

    size: ... from: ... to: ... size: ... from: ... to: ... size: ... dsp dsp fmosc fmosc fmosc fmosc osc osc osc osc osc osc osc osc osc phasor phasor phasor phasor phasor phasor phasor phasor phasor phasor phasor phasor phasor feed feed feed feed feed feed feed feed feed feed feed feed feed Generate Patches Apply Patches Swap VMs Compare State Trees Version 1-a Previous Storage Compiler Thread Audio Thread Upcoming Storage Version 2-b VM1 VM2 ৽͍͠ίʔυͰίϯύΠϧͨ͠VMΛؙ͝ͱ
 ೖΕସ͑ͭͭɺඞཁͳ಺෦ঢ়ଶ͸ίϐʔͯ͠࠶ར༻͢Δ!
  23. #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 (freq){ (self + freq/samplerate)%1.0 } fn sinwave(freq){ phasor(freq)*2.0*PI |> sin } fn osc (freq){ sinwave(freq) * 0.5 } fn dsp(){ let f = 200 let r = f |> additive!(5,`osc) (r,r) } ྫ͑͹ɺ͜͜ͷίϯύΠϧ࣌ఆ਺ΛϦΞϧλΠϜͰ ॻ͖׵͑ͯ΋ɺԻΛ్੾Εͤ͞Δ͜ͱͳ͘ܭࢉ͠ଓ͚ΒΕΔ
  24. ܽ఺ • ͋·Γݫີͳࠩ෼ղੳͰ͸ͳ͍ • ྫ͑͹osc1()-osc2()Λosc2()-osc1()ʹεϫοϓͨ͠৔߹಺෦ঢ়ଶ΋
 ೖΕସΘͬͯཉ͍͕͠ɺڞ௨෦෼ྻʹجͮ͘ղੳͷ౎߹্ͲͪΒ͔ยํ͔͠Ҿ͖ܧ͕ Εͳ͍ • ݩʑɺ͍ۙൃ૝ͷݚڀͰ͸͜ΕΛݫີʹղੳ͢ΔͨΊEmacsͷ֦ுͱ࣮ͯ͠૷ͯͨ͠ •

    ͦ΋ͦ΋ϥΠϒίʔσΟϯάͰ͸Ұ౓ʹ୔ࢁߋ৽͢ΔͷͰ͸ͳ͘ɺߴʑͲ͔͜1Օॴͷૠ ೖ/࡟আ/ॻ׵͝ͱʹมߋΛ֬ఆ͢Δ͜ͱ͕΄ͱΜͲͳͷͰݫີͳղੳΛ͢Δҙຯ͕ബ͍ • ͞Βʹଟগෆਖ਼֬ͳঢ়ଶ࣋ͪӽ͕͠ൃੜͯ͠΋ɺௌײ্ͦ͜·Ͱҧ࿨ײ͕Ͱͳ͍