Along these lines, we could have a more efficient impulse as well. We presently use this all over the place:
process = 1-1'; => for (int i = 0; (i < count); i = (i + 1)) { iVec0[0] = 1; output0[i] = FAUSTFLOAT((1 - iVec0[1])); iVec0[1] = iVec0[0]; } On Fri, Feb 15, 2019 at 3:30 AM Oleg Nesterov <o...@redhat.com> wrote: > > On 02/01, Romain Michon wrote: > > > > We're working on a better solution, > > Yes, it would be nice to have the ability to initialize delay lines. > And reset/re-initialize too, think of goertzel() from analyzers.lib. > > > initState((init)) = R(0,init) > > with{ > > R(n,(initn,init)) = +(initn : ba.impulsify@n) : R(n+1,init); > > R(n,initn) = +(initn : ba.impulsify@n); > > }; > > > > osc(m,k,z,x0,x1) = equation > > with{ > > A = 2 - (k + z)/m; > > B = z/m - 1; > > C = 1/m; > > equation = x > > letrec{ > > 'x = A*(x : initState(x0)) + B*(x' : initState(x1)) + *(C); > > Hmm. I don't understand ... > > Consider osc(m,k,z, 100, 200). At the first "tick" everything looks correct, > > (x : initState(x0)) == 100 > (x' : initState(x1)) == 200 > > but at the 2nd tick (x' : initState(x1)) will be zero, not 100? > > Shouldn't osc() use B*(x' : initState((x1,x0))) instead ? > > ------------------------------------------------------------------------------- > can't resist... this could be trivially implemented in fpp. But since attach() > is broken, zinit() below has some nasty limitations. > > So, > zinit(z) = _ <: +(zinit(z)) with { > zinit = FPP(z{}, x[outputs(z)]) eval int { > init: $z.for(i, v, $x[i + 1] = v); > exec: 0; > }; > }; > > simply initializes the signal's delay line. Now, osc() can be implemented as > > osc(m,k,z,x0,x1) = equation : zinit((x0,x1)) with { > A = 2-(k+z)/m; > B = z/m-1; > C = 1/m; > equation = x letrec { > 'x = A*x + B*x' + *(C); > }; > }; > > Say, > > process = osc(10,3,2, 100,200); > > compiles to > > virtual void instanceConstants(int samplingFreq) { > fSamplingFreq = samplingFreq; > > fRec0[1] = 100; fRec0[2] = 200; > } > > virtual void compute(int count, FAUSTFLOAT** inputs, FAUSTFLOAT** > outputs) { > FAUSTFLOAT* input0 = inputs[0]; > FAUSTFLOAT* output0 = outputs[0]; > for (int i = 0; (i < count); i = (i + 1)) { > fRec0[0] = (((1.5f * fRec0[1]) + (0.100000001f * > float(input0[i]))) - (0.800000012f * fRec0[2])); > output0[i] = FAUSTFLOAT((fRec0[0] + 0)); > fRec0[2] = fRec0[1]; > fRec0[1] = fRec0[0]; > } > } > > as you can see the run-time code is not penalized, zinit() does > > fRec0[1] = 100; fRec0[2] = 200; > > at startup time. > > Oleg. > > > > _______________________________________________ > Faudiostream-users mailing list > Faudiostream-users@lists.sourceforge.net > https://lists.sourceforge.net/lists/listinfo/faudiostream-users -- Julius O. Smith III <j...@ccrma.stanford.edu> Professor of Music and, by courtesy, Electrical Engineering CCRMA, Stanford University http://ccrma.stanford.edu/~jos/ _______________________________________________ Faudiostream-users mailing list Faudiostream-users@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/faudiostream-users