Slide 1

Slide 1 text

SIGPX #11 দӜ஌໵/Matsuura Tomoya / [email protected] mimiumʹ͓͚Δଟஈ֊ܭࢉͱ
 ৴߸ॲཧͷ಺෦ঢ়ଶϥΠϒߋ৽ Multi-stage Computation and Live Internal State Updating of Signal Processing on mimium

Slide 2

Slide 2 text

minimal musical medium / mimi(ࣖ👂)+medium https://github.com/tomoyanonymous/mimium-rs mimium(2020~) https://mimium.org/

Slide 3

Slide 3 text

λ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

Slide 4

Slide 4 text

͜Ε·Ͱ 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) } άϩʔόϧ؀ڥͰॳظԽ͠ͳ͍ͱ ຖαϯϓϧঢ়ଶ͕Ϧηοτ͞Εͯ͠·͏

Slide 5

Slide 5 text

ଟஈ֊ܭࢉͰͷίʔυ #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ؔ਺͸ίϯύΠϧ࣌ʹ࣮ߦ͞Εɺ ίʔυΛຒΊࠐΉͷͰঢ়ଶ͸Ҿ͖ܧ͕ΕΔ

Slide 6

Slide 6 text

ଟஈ֊ܭࢉʁ • ଟஈ֊ܭࢉͱ͸ɺܭࢉΛෳ਺εςʔδʹ෼͚ɺܕγεςϜʹʮ1εςʔδޙͰ ධՁ͞ΕΔ஋ͷܕʢCodeܕʣʯΛಋೖ͢Δ͜ͱͰɺܕ҆શʹLispͷQuote/ SpliceͷΑ͏ͳϚΫϩػೳΛಋೖͰ͖Δମܥ • ৴߸ॲཧʹ͓͍ͯ͸ɺʮ৴߸ॲཧάϥϑΛੜ੒͢Δίʔυʯͷεςʔδ0ͱɺ ʮ࣮ࡍʹϥϯλΠϜͰॲཧ͢Δίʔυʯͷεςʔδ1Ͱ෼͚Δͱ௚ײʹద͢Δ • ϚΫϩ͕ల։͞ΕΔલʹܕ͕෇͘ͷͰ҆શͳͷ͕Α͍ͱ͜Ζ • ٯʹɺܕʹର͢Δϝλૢ࡞ͱ͔͸Ͱ͖ͳ͍ͷ͕ϚΫϩͱͯ͠͸ࢫΈ͕গͳ͍

Slide 7

Slide 7 text

৴߸ॲཧͷ಺༰Λɺ άϩʔόϧ؀ڥධՁͰ͸ͳ͘ ίϯύΠϧ࣌ʹ֬ఆͰ͖Δ ৴߸ॲཧͰ࢖͏಺෦ঢ়ଶͷ ϝϞϦϚοϐϯάΛܾఆతʹͰ͖Δ

Slide 8

Slide 8 text

State = Feed(tsize) |Mem(tsize) |Delay(time_max) |FnCall([State]) 1αϯϓϧσΟϨΠ 1αϯϓϧલͷܭࢉ݁Ռ σΟϨΠ ඇΫϩʔδϟͳ
 ؔ਺ݺͼग़͠ ద੾ʹϚΫϩʢଟஈ֊ܭࢉʣͰ৴߸ॲཧΛهड़͢Δͱɺ
 ৴߸ॲཧʹඞཁͳϝϞϦͷσʔλ͸໦ߏ଄Ͱ੩తʹܾఆͰ͖Δ

Slide 9

Slide 9 text

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) }

Slide 10

Slide 10 text

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) }

Slide 11

Slide 11 text

಺෦ঢ়ଶͷϥΠϒߋ৽ #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) } ͜͜ͷίϯύΠϧ࣌ఆ਺Λߋ৽ͯ͠ ࠶ධՁͯ͠΋ɺਖ਼͘͠Ҿ͖ܧ͕ΕΔ

Slide 12

Slide 12 text

৴߸ॲཧϥΠϒίʔσΟϯά • ͜Ε·Ͱɺ௿Ϩϕϧͳ৴߸ॲཧͷϥΠϒίʔσΟϯάͰ͸಺෦ঢ়ଶ͕Ϧηοτʹ σΟϨΠ΍Ϧόʔϒ్͕தͰ్੾ΕΔͷ͕౰ͨΓલ • ຖճ৴߸ॲཧͷίʔυΛશ෦࠶ίϯύΠϧɺ৽͘͠VMͷΠϯελϯεΛؙ͝ͱ ࠶ੜ੒ͯ͠Δ͚Ͳɺ৴߸ॲཧ్͕੾Εͣʹଓ͚ΒΕΔ • ͔͠΋ɺϚΫϩʹ༩͑ΔίϯύΠϧ࣌ఆ਺Λม͑ͯɺෳࡶͳߏ੒ͷมԽͰ΋ରԠ • ͔ͭɺߏจ໦શͯͷࠩ෼Λ௚઀ൺֱ͠ͳͯ͘΋͍͍ͷͰॲཧ΋γϯϓϧ
 "Incremental Functional Reactive Programming(Reach,2013)"ͷվળ൛