The « enable » primitive was somewhat experimental and is not officially supported.
The plan is to rebuilt it starting for a more primitive design based on the « on demand » specification : https://github.com/orlarey/faust-ondemand-spec/blob/newmaster/spec.pdf Stéphane > Le 11 févr. 2022 à 19:09, Jean-Louis Paquelin <jean-lo...@paquelin.net> a > écrit : > > Hi there, > > I was diving in the Faust mailing lists when I stumbled upon an example using > the enable() function: > gen(N) = > par(i, N, os.osc(200*(i+1)) : enable(hslider("oscillators",0,0,N,1) : int > : >(i))) :> _ <: _,_; > process = gen(5); > > I wasn't able to find the documentation of enable() and I'm not entirely sure > of what it does but I took a look at the C++ code produced. > > virtual void compute(int count, FAUSTFLOAT** RESTRICT inputs, FAUSTFLOAT** > RESTRICT outputs) { > FAUSTFLOAT* output0 = outputs[0]; > FAUSTFLOAT* output1 = outputs[1]; > int iSlow0 = int(float(fHslider0)); > float fSlow1 = float((iSlow0 > 0)); > int iSlow2 = (fSlow1 != 0.0f); This test seems to be the enable condition in > the 1st branch of the par iteration > float fTemp0 = fTempPerm0; > float fSlow3 = float((iSlow0 > 1)); This test seems to be the enable > condition in the 2nd branch of the par > int iSlow4 = (fSlow3 != 0.0f); > float fTemp1 = fTempPerm1; > for (int i0 = 0; (i0 < count); i0 = (i0 + 1)) { > if (iSlow2) { > This code isn't executed when iSlow2 is false avoiding unnecessary > computation relative to the oscillator > fRec1[0] = (fConst1 + (fRec1[1] - std::floor((fConst1 + fRec1[1])))); > fConst1 equals 200 which is the frequency of the first oscillator > fTemp0 = (fSlow1 * ftbl0mydspSIG0[int((65536.0f * fRec1[0]))]); > } > if (iSlow4) { > And here the same for the second enable condition > fRec2[0] = (fConst2 + (fRec2[1] - std::floor((fConst2 + fRec2[1])))); > fConst2 equals 400 > fTemp1 = (fSlow3 * ftbl0mydspSIG0[int((65536.0f * fRec2[0]))]); > } > float fTemp2 = (fTemp0 + fTemp1); > output0[i0] = FAUSTFLOAT(fTemp2); > output1[i0] = FAUSTFLOAT(fTemp2); > Not sure what the 2 following ifs do (buffer swapping?) > if (iSlow2) { > fRec1[1] = fRec1[0]; > } > if (iSlow4) { > fRec2[1] = fRec2[0]; > } > } > fTempPerm0 = fTemp0; > fTempPerm1 = fTemp1; > } > > So the enable() function (I should say primitive btw) seems to avoid > unnecessary computation when it is disabled. > > Am I right? > > Best regards, > > jlp > _______________________________________________ > Faudiostream-users mailing list > Faudiostream-users@lists.sourceforge.net > https://lists.sourceforge.net/lists/listinfo/faudiostream-users _______________________________________________ Faudiostream-users mailing list Faudiostream-users@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/faudiostream-users