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