summaryrefslogtreecommitdiff
path: root/objects/faust
diff options
context:
space:
mode:
authorrekado <rekado@elephly.net>2016-09-06 22:13:03 +0200
committerrekado <rekado@elephly.net>2016-09-06 23:31:22 +0200
commit8a4bca986c57062e96f1e58281b3eff52a856ee6 (patch)
tree11b125b567c212739a6585862628f0565f51ce35 /objects/faust
Initial commit.
Diffstat (limited to 'objects/faust')
-rw-r--r--objects/faust/karplus.axo98
-rw-r--r--objects/faust/moog_vcf.axo205
-rw-r--r--objects/faust/phaser_mono.wip90
-rw-r--r--objects/faust/phaser_mono_float.axo36
-rw-r--r--objects/faust/phaser_mono_float.cpp129
-rw-r--r--objects/faust/phaser_stereo_float.axo70
-rw-r--r--objects/faust/phaser_stereo_float.cpp215
-rw-r--r--objects/faust/phaser_stereo_optimised.axo180
8 files changed, 1023 insertions, 0 deletions
diff --git a/objects/faust/karplus.axo b/objects/faust/karplus.axo
new file mode 100644
index 0000000..60035a6
--- /dev/null
+++ b/objects/faust/karplus.axo
@@ -0,0 +1,98 @@
+<objdefs>
+ <obj.normal id="karplus" uuid="36d552a0297885559841ed95a25ec5e5589bf5c3" sha="39267e0b01468fb54a8799d8114d535c594a007b">
+ <sDescription>Karplus (from Faust)</sDescription>
+ <author>Ricardo Wurmus</author>
+ <license>GPL</license>
+ <helpPatch>filter.axh</helpPatch>
+ <outlets>
+ <frac32buffer.bipolar name="out" description="filter output"/>
+ </outlets>
+ <params>
+ <bool32.mom name="b" noLabel="true"/>
+ <frac32.s.map name="a"/>
+ </params>
+ <displays/>
+ <includes>
+ <include>arm_math.h</include>
+ </includes>
+ <attribs/>
+ <code.declaration><![CDATA[
+ // convert float to fixed point notation
+ // * take absolute value
+ // * multiply with constant to keep precision;
+ // to get a fixed point at x:y we multiply by 2^y,
+ // e.g. for 24:8 (24 significant bits before decimal point)
+ // we multiply f by 2^8 (1<<8).
+ // * truncate and cast to int32_t
+ // * invert bits if negative
+ int32_t floatToFrac32(float f) {
+ // was 1 000 000 000 and then >> 2
+ // now is 2^27 = 134 217 728
+ // 2^32 = 4 294 967 296
+ // 2^29 = 536 870 912 (3:29)
+ int32_t preout = int32_t(((f < 0) ? (-f) : f) * (1<<29));
+ return ((f < 0) ? ~preout : preout);
+ }
+ // convert fixed point to float
+ // * invert bits if sign bit is set (0x08000000, or (1<<27))
+ // * cast int to float
+ // * divide by constant to shift decimal point
+ // * multiply by -1 if sign bit was set
+ float frac32ToFloat(int32_t frac) {
+ bool neg = (((1<<27) & frac) != 0);
+ float res = (float)(neg ? frac : ~frac);
+ res = res / (float(1<<29));
+ return (neg ? (-1 * res) : res);
+ }
+
+ float fslider0;
+ float fVec0[2];
+ float fRec1[2];
+ int iRec2[2];
+ float fslider1;
+ float fslider2;
+ int IOTA;
+ float fVec1[512];
+ float fslider3;
+ float fRec0[3];
+]]></code.declaration>
+ <code.init><![CDATA[
+ fslider0 = 128.0f; // duration or excitation
+ for (int i=0; i<2; i++) fVec0[i] = 0;
+ for (int i=0; i<2; i++) fRec1[i] = 0;
+ for (int i=0; i<2; i++) iRec2[i] = 0;
+ fslider1 = 0.5f; // level
+ fslider2 = 0.01f; // attenuation, was 0.1f
+ IOTA = 0;
+ for (int i=0; i<512; i++) fVec1[i] = 0;
+ fslider3 = 128.0f; // duration or excitation
+ for (int i=0; i<3; i++) fRec0[i] = 0;
+]]></code.init>
+ <code.krate><![CDATA[
+ float fSlow0 = (1.0f / float(fslider0));
+ float fSlow1 = float(param_b);
+ float fSlow2 = (4.656612875245797e-10f * float(fslider1));
+ float fSlow3 = (0.5f * (1.0f - float(fslider2)));
+ int iSlow4 = int((int((float(fslider3) - 1.5f)) & 4095));
+
+ int32_t* output0 = outlet_out;
+ for (int i=0; i<BUFSIZE; i++) {
+ fVec0[0] = fSlow1;
+ fRec1[0] = ((fRec1[1] + ((fSlow1 - fVec0[1]) > 0.0f)) - (fSlow0 * (fRec1[1] > 0.0f)));
+ iRec2[0] = (12345 + (1103515245 * iRec2[1]));
+ fVec1[IOTA&511] = ((fSlow3 * (fRec0[1] + fRec0[2])) + (fSlow2 * (iRec2[0] * (fRec1[0] > 0.0f))));
+ fRec0[0] = fVec1[(IOTA-iSlow4)&511];
+
+arm_float_to_q31(&fRec0[0], &output0[i], 0);
+// output0[i] = floatToFrac32(fRec0[0]);
+
+ // post processing
+ fRec0[2] = fRec0[1]; fRec0[1] = fRec0[0];
+ IOTA = IOTA+1;
+ iRec2[1] = iRec2[0];
+ fRec1[1] = fRec1[0];
+ fVec0[1] = fVec0[0];
+ }
+]]></code.krate>
+ </obj.normal>
+</objdefs>
diff --git a/objects/faust/moog_vcf.axo b/objects/faust/moog_vcf.axo
new file mode 100644
index 0000000..8abb697
--- /dev/null
+++ b/objects/faust/moog_vcf.axo
@@ -0,0 +1,205 @@
+<objdefs>
+ <obj.normal id="moog_vcf" uuid="9329f089dced01ba64f7e22ac77fd78fbec47db9" sha="6b8d84e43d5934e94f32e1d50318f8feede69769">
+ <sDescription>Moog VCF (from Faust)</sDescription>
+ <author>Ricardo Wurmus</author>
+ <license>GPL</license>
+ <helpPatch>filter.axh</helpPatch>
+ <includes>
+ <include>math.h</include>
+ </includes>
+ <inlets>
+ <frac32buffer name="in" description="filter input"/>
+ </inlets>
+ <outlets>
+ <frac32buffer name="out" description="filter output"/>
+ </outlets>
+ <displays/>
+ <attribs/>
+ <code.declaration><![CDATA[
+ // convert float to fixed point notation
+ // * take absolute value
+ // * multiply with constant to keep precision;
+ // to get a fixed point at x:y we multiply by 2^y,
+ // e.g. for 24:8 (24 significant bits before decimal point)
+ // we multiply f by 2^8 (1<<8).
+ // * truncate and cast to int32_t
+ // * invert bits if negative
+ int32_t floatToFrac32(float f) {
+ // was 1 000 000 000 and then >> 2
+ // now is 2^27 = 134 217 728
+ // 2^32 = 4 294 967 296
+ // 2^29 = 536 870 912 (3:29)
+ int32_t preout = int32_t(((f < 0) ? (-f) : f) * (1<<29));
+ return ((f < 0) ? ~preout : preout);
+ }
+ // convert fixed point to float
+ // * invert bits if sign bit is set (0x08000000, or (1<<27))
+ // * cast int to float
+ // * divide by constant to shift decimal point
+ // * multiply by -1 if sign bit was set
+ float frac32ToFloat(int32_t frac) {
+ bool neg = (((1<<27) & frac) != 0);
+ float res = (float)(neg ? frac : ~frac);
+ res = res / (float(1<<29));
+ return (neg ? (-1 * res) : res);
+ }
+
+
+ float fslider0;
+ float fslider1;
+ float fslider2;
+ float fcheckbox0;
+ float fcheckbox1;
+ float fcheckbox2;
+
+ float fRec0[2];
+ float fRec1[2];
+ float fRec2[2];
+ float fRec3[2];
+ float fRec4[2];
+ float fRec5[2];
+ float fRec6[3];
+ float fRec7[3];
+ float fRec8[2];
+ float fRec10[2];
+ float fRec11[2];
+ float fRec13[2];
+ float fRec14[2];
+
+ float fConst1;
+ float fConst2;
+ float fSqrtTwo;
+ inline float faustpower2(float x) {
+ return powf(x,2);
+ }
+ inline float faustpower4(float x) {
+ return powf(x,4);
+ }
+
+ // template <int N> inline float faustpower(float x) { return powf(x,N); }
+ // template <int N> inline double faustpower(double x) { return pow(x,N); }
+ // template <int N> inline int faustpower(int x) { return faustpower<N/2>(x) * faustpower<N-N/2>(x); }
+ // template <> inline int faustpower<0>(int x) { return 1; }
+ // template <> inline int faustpower<1>(int x) { return x; }
+]]></code.declaration>
+ <code.init><![CDATA[
+ fConst1 = ((2 * PI_F) / float(SAMPLERATE));
+ fConst2 = (PI_F / float(SAMPLERATE));
+ fSqrtTwo = 1.4142135623730951f;
+ fcheckbox0 = 0.0;
+ fcheckbox1 = 0.0;
+ fcheckbox2 = 0.0;
+ fslider0 = 25.0f;
+ fslider1 = 0.9f;
+ fslider2 = 5.0f;
+
+ for (int i=0; i<2; i++) fRec0[i] = 0;
+ for (int i=0; i<2; i++) fRec1[i] = 0;
+ for (int i=0; i<2; i++) fRec2[i] = 0;
+ for (int i=0; i<2; i++) fRec3[i] = 0;
+ for (int i=0; i<2; i++) fRec4[i] = 0;
+ for (int i=0; i<2; i++) fRec5[i] = 0;
+ for (int i=0; i<3; i++) fRec6[i] = 0;
+ for (int i=0; i<3; i++) fRec7[i] = 0;
+ for (int i=0; i<2; i++) fRec8[i] = 0;
+ for (int i=0; i<2; i++) fRec10[i] = 0;
+ for (int i=0; i<2; i++) fRec11[i] = 0;
+ for (int i=0; i<2; i++) fRec13[i] = 0;
+ for (int i=0; i<2; i++) fRec14[i] = 0;
+
+]]></code.init>
+ <code.krate><![CDATA[
+ float fSlow0 = (0.4400000000000004f * powf(2.0f,(0.08333333333333333f * (float(fslider0) - 49.0f))));
+ int iSlow1 = int(float(fcheckbox0));
+ float fSlow2 = float(fslider1);
+ float fSlow3 = (0 - (4.0f * fmaxf((float)0, fminf(faustpower4(fSlow2), 0.999999f))));
+ float fSlow4 = fminf(1.412799348810722f, (fSqrtTwo * fSlow2));
+ float fSlow5 = (fSqrtTwo * fSlow4);
+ float fSlow6 = 2 - fSlow5;
+ float fSlow7 = 1 + (fSlow4 * (fSlow4 - fSqrtTwo));
+ float fSlow8 = 2 + fSlow5;
+ float fSlow9 = 1 + (fSlow4 * (fSqrtTwo + fSlow4));
+ float fSlow10 = 2 * fSlow2;
+ float fSlow11 = 2 - fSlow10;
+ float fSlow12 = faustpower2((1.412799348810722f * fSlow2));
+ float fSlow13 = ((1 + fSlow12) - fSlow10);
+ float fSlow14 = (2 + fSlow10);
+ float fSlow15 = (1 + (fSlow10 + fSlow12));
+ int iSlow16 = int(float(fcheckbox1));
+ int iSlow17 = int(float(fcheckbox2));
+ float fSlow18 = (0.001f * powf(10,(0.05f * float(fslider2))));
+ //const int32_t* input0 = inlet_in;
+ int32_t* output0 = outlet_out;
+ for (int i=0; i<BUFSIZE; i++) {
+ fRec1[0] = (fSlow0 + (0.999f * fRec1[1]));
+ float fTemp0 = (fConst1 * fRec1[0]);
+ float fTemp1 = (1.0f - fTemp0);
+ float fTemp2 = frac32ToFloat(inlet_in[i]);
+ float fTemp3 = ((iSlow1)?0:fTemp2);
+ fRec5[0] = ((fSlow3 * fRec0[1]) + (fTemp3 + (fTemp1 * fRec5[1])));
+ fRec4[0] = (fRec5[0] + (fTemp1 * fRec4[1]));
+ fRec3[0] = (fRec4[0] + (fTemp1 * fRec3[1]));
+ fRec2[0] = (fRec3[0] + (fRec2[1] * fTemp1));
+ fRec0[0] = (fRec2[0] * powf(fTemp0,4.0f));
+ float fTemp4 = tanf((fConst2 * fmaxf((float)20, fminf((float)10000, fRec1[0]))));
+ float fTemp5 = (1.0f / fTemp4);
+ float fTemp6 = (fSlow7 + ((fSlow6 + fTemp5) / fTemp4));
+ float fTemp7 = (1.0f / faustpower2(fTemp4));
+ float fTemp8 = (fSlow9 + ((fSlow8 + fTemp5) / fTemp4));
+ fRec7[0] = (fTemp3 - (((fRec7[2] * (fSlow9 + ((fTemp5 - fSlow8) / fTemp4))) + (2 * (fRec7[1] * (fSlow9 - fTemp7)))) / fTemp8));
+ fRec6[0] = (((fRec7[2] + (fRec7[0] + (2.0f * fRec7[1]))) / fTemp8) - (((fRec6[2] * (fSlow7 + ((fTemp5 - fSlow6) / fTemp4))) + (2 * (fRec6[1] * (fSlow7 - fTemp7)))) / fTemp6));
+ float fTemp9 = tanf((fConst2 * fmaxf(fRec1[0], (float)20)));
+ float fTemp10 = (1.0f / fTemp9);
+ float fTemp11 = (fSlow13 + ((fSlow11 + fTemp10) / fTemp9));
+ float fTemp12 = ((fSlow13 + ((fTemp10 - fSlow11) / fTemp9)) / fTemp11);
+ float fTemp13 = (1.0f / faustpower2(fTemp9));
+ float fTemp14 = (fSlow13 - fTemp13);
+ float fTemp15 = fmaxf(-0.9999f, fminf(0.9999f, (2 * (fTemp14 / (fTemp11 * (1 + fTemp12))))));
+ float fTemp16 = (1 - faustpower2(fTemp15));
+ float fTemp17 = fmaxf(-0.9999f, fminf(0.9999f, fTemp12));
+ float fTemp18 = (1 - faustpower2(fTemp17));
+ float fTemp19 = sqrtf(fTemp18);
+ float fTemp20 = (2.0f - (2.0f * (fTemp14 / fTemp11)));
+ float fTemp21 = sqrtf(fmaxf((float)0, fTemp16));
+ float fTemp22 = (fSlow15 + ((fSlow14 + fTemp10) / fTemp9));
+ float fTemp23 = sqrtf(fmaxf((float)0, fTemp18));
+ float fTemp24 = ((fSlow15 + ((fTemp10 - fSlow14) / fTemp9)) / fTemp22);
+ float fTemp25 = (fSlow15 - fTemp13);
+ float fTemp26 = fmaxf(-0.9999f, fminf(0.9999f, (2 * (fTemp25 / (fTemp22 * (1 + fTemp24))))));
+ float fTemp27 = (1 - faustpower2(fTemp26));
+ float fTemp28 = fmaxf(-0.9999f, fminf(0.9999f, fTemp24));
+ float fTemp29 = (1 - faustpower2(fTemp28));
+ float fTemp30 = sqrtf(fTemp29);
+ float fTemp31 = (2.0f - (2.0f * (fTemp25 / fTemp22)));
+ float fTemp32 = sqrtf(fmaxf((float)0, fTemp27));
+ float fTemp33 = sqrtf(fmaxf((float)0, fTemp29));
+ float fTemp34 = ((fRec11[1] * (0 - fTemp28)) + (fTemp3 * fTemp33));
+ fRec13[0] = ((fRec13[1] * (0 - fTemp26)) + (fTemp34 * fTemp32));
+ fRec11[0] = ((fTemp34 * fTemp26) + (fRec13[1] * fTemp32));
+ float fRec12 = fRec13[0];
+ float fTemp35 = ((((fTemp3 * fTemp28) + (fRec11[1] * fTemp33)) + ((fRec11[0] * fTemp31) / fTemp30)) + ((fRec12 * ((1.0f - fTemp24) - (fTemp26 * fTemp31))) / (fTemp30 * sqrtf(fTemp27))));
+ float fTemp36 = ((fRec8[1] * (0 - fTemp17)) + ((fTemp35 * fTemp23) / fTemp22));
+ fRec10[0] = ((fRec10[1] * (0 - fTemp15)) + (fTemp36 * fTemp21));
+ fRec8[0] = ((fTemp36 * fTemp15) + (fRec10[1] * fTemp21));
+ float fRec9 = fRec10[0];
+ fRec14[0] = ((0.999f * fRec14[1]) + fSlow18);
+ float fTemp37 = ((iSlow1)?fTemp2:(fRec14[0] * ((iSlow17)?((iSlow16)?((((((fTemp35 * fTemp17) / fTemp22) + (fRec8[1] * fTemp23)) + ((fRec8[0] * fTemp20) / fTemp19)) + ((fRec9 * ((1.0f - fTemp12) - (fTemp15 * fTemp20))) / (fTemp19 * sqrtf(fTemp16)))) / fTemp11):((fRec6[2] + (fRec6[0] + (2.0f * fRec6[1]))) / fTemp6)):fRec0[0])));
+ output0[i] = floatToFrac32(fTemp37);
+ // post processing
+ fRec14[1] = fRec14[0];
+ fRec8[1] = fRec8[0];
+ fRec10[1] = fRec10[0];
+ fRec11[1] = fRec11[0];
+ fRec13[1] = fRec13[0];
+ fRec6[2] = fRec6[1]; fRec6[1] = fRec6[0];
+ fRec7[2] = fRec7[1]; fRec7[1] = fRec7[0];
+ fRec0[1] = fRec0[0];
+ fRec2[1] = fRec2[0];
+ fRec3[1] = fRec3[0];
+ fRec4[1] = fRec4[0];
+ fRec5[1] = fRec5[0];
+ fRec1[1] = fRec1[0];
+ }
+]]></code.krate>
+ </obj.normal>
+</objdefs>
diff --git a/objects/faust/phaser_mono.wip b/objects/faust/phaser_mono.wip
new file mode 100644
index 0000000..9966c00
--- /dev/null
+++ b/objects/faust/phaser_mono.wip
@@ -0,0 +1,90 @@
+
+ virtual void instanceInit(int samplingFreq) {
+ }
+ virtual void compute (int count, FAUSTFLOAT** input, FAUSTFLOAT** output) {
+ // TODO: find replacements for: expf, cosf, sinf
+ // values must be scaled to fit into the range expected by arm_{cos,sin}_q31
+ // they all take radians!
+ // cosf --> arm_cos_q31
+ // sinf --> arm_sin_q31
+
+ int32_t fSlow0 = param_fcheckbox0 ? 0x00200000 /*"1"*/ : (param_fslider0>>1);
+ int32_t fSlow1 = param_fcheckbox1 ? __QSUB(0, fSlow0) : fSlow0;
+ // TODO: find replacement for expf
+ // e ^ -1 * const1 * pi * slider3
+ // It's a value between 0.72 and 1.0, but for now we pretend it's just the value of fslider3.
+ // float fSlow4 = expf((fConst1 * (0 - (3.141592653589793f * float(fslider3)))));
+ int32_t fSlow4 = param_fslider3;
+ int32_t fSlow5 = __SMMUL(fSlow4, fSlow4);
+ int32_t fSlow6 = __SMMUL(fConst2, param_fslider4);
+ int32_t fSlow7 = arm_cos_q31(fSlow6);
+ int32_t fSlow8 = arm_sin_q31(fSlow6);
+ int32_t fSlow9 = __QSUB(0, fSlow8);
+ int32_t fSlow11 = ___SMMUL(TAU, param_fslider5);
+ int32_t fSlow12 = (__SMMUL(TAU, MAX(param_fslider5, param_fslider6)) - fSlow11) >>1;
+ int32_t fSlow15 = __QSUB(0, fSlow4<<1);
+ int32_t fSlow14 = __SMMUL(fConst1, param_fslider7);
+ int32_t fSlow16 = __SMMUL(fSlow14, param_fslider7);
+ int32_t fSlow17 = __SMMUL(fSlow16, param_fslider7);
+ int32_t fSlow18 = __SMMUL(fSlow17, param_fslider7);
+ int32_t fSlow19 = __QSUB(1, fSlow0);
+
+ int32_t* input0 = input[0];
+ int32_t* input1 = input[1];
+ int32_t* output0 = output[0];
+ int32_t* output1 = output[1];
+
+ for (int i=0; i<BUFSIZE; i++) {
+ iVec0[0] = 1;
+ fRec5[0] = fSlow8 * fRec6[1] + fSlow7 * fRec5[1];
+ fRec6[0] = (1 + ((fSlow7 * fRec6[1]) + (fSlow9 * fRec5[1]))) - iVec0[1];
+
+ {
+ int32_t fTemp0 = input0[i];
+ int32_t fTemp1 = fSlow11 + (fSlow12 * (1 - fRec5[0]));
+ int32_t fTemp2 = fRec4[1] * cosf((fSlow14 * fTemp1));
+ fRec4[0] = __QSUB(0, ((__SMMUL(fSlow15, fTemp2) + __SMMUL(fSlow5, fRec4[2])) - (fTemp0 + __SMMUL(param_fslider1, fRec0[1]))));
+ int32_t fTemp3 = fRec3[1] * cosf((fSlow16 * fTemp1));
+ fRec3[0] = (fSlow15 * (fTemp2 - fTemp3)) + (fRec4[2] + (fSlow5 * (fRec4[0] - fRec3[2])));
+ int32_t fTemp4 = (fRec2[1] * cosf((fSlow17 * fTemp1)));
+ fRec2[0] = (fSlow15 * (fTemp3 - fTemp4)) + (fRec3[2] + (fSlow5 * (fRec3[0] - fRec2[2])));
+ int32_t fTemp5 = fRec1[1] * cosf((fSlow18 * fTemp1));
+ fRec1[0] = (fSlow15 * (fTemp4 - fTemp5)) + (fRec2[2] + (fSlow5 * (fRec2[0] - fRec1[2])));
+ fRec0[0] = (fSlow5 * fRec1[0]) + ((fSlow15 * fTemp5) + fRec1[2]);
+ output0[i] = (fTemp0 * fSlow19) + (fRec0[0] * fSlow1);
+ }
+
+ {
+ int32_t fTemp6 = input1[i];
+ int32_t fTemp7 = fSlow11 + (fSlow12 * (1 - fRec6[0]));
+ int32_t fTemp8 = fRec11[1] * cosf(__SMMUL(fSlow14, fTemp7));
+ fRec11[0] = __QSUB(0, (__SMMUL(fSlow15, fTemp8) + __SMMUL(fSlow5, fRec11[2]) - (fTemp6 + __SMMUL(param_fslider1, fRec7[1]))));
+ int32_t fTemp9 = fRec10[1] * cosf(__SMMUL(fSlow16, fTemp7));
+ fRec10[0] = ((fSlow15 * (fTemp8 - fTemp9)) + (fRec11[2] + (fSlow5 * (fRec11[0] - fRec10[2]))));
+ int32_t fTemp10 = fRec9[1] * cosf(__SMMUL(fSlow17, fTemp7));
+ fRec9[0] = ((fSlow15 * (fTemp9 - fTemp10)) + (fRec10[2] + (fSlow5 * (fRec10[0] - fRec9[2]))));
+ int32_t fTemp11 = fRec8[1] * cosf(__SMMUL(fSlow18, fTemp7));
+ fRec8[0] = ((fSlow15 * (fTemp10 - fTemp11)) + (fRec9[2] + (fSlow5 * (fRec9[0] - fRec8[2]))));
+ fRec7[0] = ((fSlow5 * fRec8[0]) + ((fSlow15 * fTemp11) + fRec8[2]));
+ output1[i] = (fTemp6 * fSlow19) + (fRec7[0] * fSlow1);
+ }
+
+ // post processing
+ fRec7[1] = fRec7[0];
+ fRec8[2] = fRec8[1]; fRec8[1] = fRec8[0];
+ fRec9[2] = fRec9[1]; fRec9[1] = fRec9[0];
+ fRec10[2] = fRec10[1]; fRec10[1] = fRec10[0];
+ fRec11[2] = fRec11[1]; fRec11[1] = fRec11[0];
+ fRec0[1] = fRec0[0];
+ fRec1[2] = fRec1[1]; fRec1[1] = fRec1[0];
+ fRec2[2] = fRec2[1]; fRec2[1] = fRec2[0];
+ fRec3[2] = fRec3[1]; fRec3[1] = fRec3[0];
+ fRec4[2] = fRec4[1]; fRec4[1] = fRec4[0];
+ fRec6[1] = fRec6[0];
+ fRec5[1] = fRec5[0];
+ iVec0[1] = iVec0[0];
+ }
+ }
+};
+
+
diff --git a/objects/faust/phaser_mono_float.axo b/objects/faust/phaser_mono_float.axo
new file mode 100644
index 0000000..f2d990c
--- /dev/null
+++ b/objects/faust/phaser_mono_float.axo
@@ -0,0 +1,36 @@
+<objdefs>
+ <obj.normal id="phaser_mono_float" uuid="d2dad834546ee8864e74efad2a1e9b1d7e26ace8" sha="f3858c3689b98a6a07f4a083d6854e56fe5ba43b">
+ <sDescription>Phaser Mono (from Faust)</sDescription>
+ <author>Ricardo Wurmus</author>
+ <license>GPL</license>
+ <helpPatch/>
+ <inlets>
+ <frac32buffer name="in" description="in"/>
+ </inlets>
+ <outlets>
+ <frac32buffer.bipolar name="out" description="output"/>
+ </outlets>
+ <params>
+ <!-- values are given as: default, min, max, increment? -->
+ <!-- 0.5f, 0.0f, 1e+01f, 0.01f -->
+ <frac32.u.map description="Speed (Hz)" name="speed"/>
+ </params>
+ <displays/>
+ <attribs/>
+ <includes>
+ <include>./phaser_mono_float.cpp</include>
+ </includes>
+ <code.declaration><![CDATA[
+Dsp phaser;
+]]></code.declaration>
+ <code.init><![CDATA[
+ phaser.init(48000);
+ ]]></code.init>
+ <code.krate><![CDATA[
+ phaser.compute(BUFSIZE,
+ &inlet_in,
+ &outlet_out[0],
+ param_speed);
+]]></code.krate>
+ </obj.normal>
+</objdefs>
diff --git a/objects/faust/phaser_mono_float.cpp b/objects/faust/phaser_mono_float.cpp
new file mode 100644
index 0000000..d3cc774
--- /dev/null
+++ b/objects/faust/phaser_mono_float.cpp
@@ -0,0 +1,129 @@
+//-----------------------------------------------------
+// name: "Phaser Mono"
+//
+// Code generated with Faust 0.9.67 (http://faust.grame.fr)
+//-----------------------------------------------------
+/* link with */
+#ifndef FAUSTPOWER
+#define FAUSTPOWER
+#define faustpower4(x) ((x)*(x)*(x)*(x))
+#define faustpower3(x) ((x)*(x)*(x))
+#define faustpower2(x) ((x)*(x))
+#define max(a, b) ((a) > (b) ? (a) : (b))
+#define min(a, b) ((a) < (b) ? (a) : (b))
+#endif
+//----------------------------------------------------------------------------
+// FAUST generated signal processor
+//----------------------------------------------------------------------------
+
+#ifndef FAUSTFLOAT
+#define FAUSTFLOAT float
+#endif
+
+#ifndef FAUSTCLASS
+#define FAUSTCLASS mydsp
+#endif
+
+class Dsp {
+ private:
+ int iVec0[2];
+ int iConst0;
+ float fConst1;
+ float fConst2;
+ FAUSTFLOAT speed; //default: 0.5f; range: 0..10
+ float fConst3;
+ float fRec5[2];
+ float fRec6[2];
+ float fConst4;
+ float fConst5;
+ float fRec4[3];
+ float fConst6;
+ float fRec3[3];
+ float fConst7;
+ float fRec2[3];
+ float fConst8;
+ float fRec1[3];
+ float fRec0[2];
+ public:
+ static void classInit(int samplingFreq) {
+ }
+ virtual void instanceInit(int samplingFreq) {
+ int fSamplingFreq = samplingFreq;
+ for (int i=0; i<2; i++) iVec0[i] = 0;
+ iConst0 = min(192000, max(1, fSamplingFreq));
+ fConst1 = 0.9366460212365959; //expf((0 - (3141.592653589793f / float(iConst0))));
+ fConst2 = faustpower2(fConst1);
+ speed = 0.5f;
+ fConst3 = (6.283185307179586f / float(iConst0));
+ for (int i=0; i<2; i++) fRec5[i] = 0;
+ for (int i=0; i<2; i++) fRec6[i] = 0;
+ fConst4 = (2.0f / float(iConst0));
+ fConst5 = (0 - (2 * fConst1));
+ for (int i=0; i<3; i++) fRec4[i] = 0;
+ fConst6 = (4.0f / float(iConst0));
+ for (int i=0; i<3; i++) fRec3[i] = 0;
+ fConst7 = (8.0f / float(iConst0));
+ for (int i=0; i<3; i++) fRec2[i] = 0;
+ fConst8 = (16.0f / float(iConst0));
+ for (int i=0; i<3; i++) fRec1[i] = 0;
+ for (int i=0; i<2; i++) fRec0[i] = 0;
+ }
+ virtual void init(int samplingFreq) {
+ classInit(samplingFreq);
+ instanceInit(samplingFreq);
+ }
+ // convert fixed point to float
+ // * invert bits if sign bit is set (0x08000000, or (1<<27))
+ // * cast int to float
+ // * divide by constant to shift decimal point
+ // * multiply by -1 if sign bit was set
+ float ConvertFracToFloat(int32_t frac) {
+ bool neg = (((1<<27) & frac) != 0);
+ float res = (float)(neg ? frac : ~frac);
+ res = res / (float(1<<29));
+ return (neg ? (-1 * res) : res);
+ }
+
+ virtual void compute (int count,
+ const int32_t** input,
+ int32_t* output,
+ int32_t speed) {
+ float fSlow0 = 100;
+ float fSlow1 = 0.01f * fSlow0;
+ float fSlow2 = (fConst3 * 10*ConvertFracToFloat(speed));
+ float fSlow3 = cosf(fSlow2);
+ float fSlow4 = sinf(fSlow2);
+ float fSlow5 = (0 - fSlow4);
+ float fSlow6 = (1 - (0.01f * fSlow0));
+ const int32_t* input0 = *input;
+ int32_t* output0 = output;
+ for (int i=0; i<count; i++) {
+ iVec0[0] = 1;
+ float fTemp0 = ConvertFracToFloat(input0[i]);
+ fRec5[0] = ((fSlow4 * fRec6[1]) + (fSlow3 * fRec5[1]));
+ fRec6[0] = ((1 + ((fSlow3 * fRec6[1]) + (fSlow5 * fRec5[1]))) - iVec0[1]);
+ float fTemp1 = (628.3185307179587f + (2199.1148575128555f * (1 - fRec5[0])));
+ float fTemp2 = (fRec4[1] * cosf((fConst4 * fTemp1)));
+ fRec4[0] = (0 - (((fConst5 * fTemp2) + (fConst2 * fRec4[2])) - ((fSlow1 * fTemp0) + (0.5f * fRec0[1]))));
+ float fTemp3 = (fRec3[1] * cosf((fConst6 * fTemp1)));
+ fRec3[0] = ((fConst5 * (fTemp2 - fTemp3)) + (fRec4[2] + (fConst2 * (fRec4[0] - fRec3[2]))));
+ float fTemp4 = (fRec2[1] * cosf((fConst7 * fTemp1)));
+ fRec2[0] = ((fConst5 * (fTemp3 - fTemp4)) + (fRec3[2] + (fConst2 * (fRec3[0] - fRec2[2]))));
+ float fTemp5 = (fRec1[1] * cosf((fConst8 * fTemp1)));
+ fRec1[0] = ((fConst5 * (fTemp4 - fTemp5)) + (fRec2[2] + (fConst2 * (fRec2[0] - fRec1[2]))));
+ fRec0[0] = ((fConst2 * fRec1[0]) + ((fConst5 * fTemp5) + fRec1[2]));
+ output0[i] = ConvertFloatToFrac((fSlow6 * fTemp0) - fRec0[0]) <<7;
+ // post processing
+ fRec0[1] = fRec0[0];
+ fRec1[2] = fRec1[1]; fRec1[1] = fRec1[0];
+ fRec2[2] = fRec2[1]; fRec2[1] = fRec2[0];
+ fRec3[2] = fRec3[1]; fRec3[1] = fRec3[0];
+ fRec4[2] = fRec4[1]; fRec4[1] = fRec4[0];
+ fRec6[1] = fRec6[0];
+ fRec5[1] = fRec5[0];
+ iVec0[1] = iVec0[0];
+ }
+ }
+};
+
+
diff --git a/objects/faust/phaser_stereo_float.axo b/objects/faust/phaser_stereo_float.axo
new file mode 100644
index 0000000..b5632bd
--- /dev/null
+++ b/objects/faust/phaser_stereo_float.axo
@@ -0,0 +1,70 @@
+<objdefs>
+ <obj.normal id="phaser_stereo_float" uuid="c5fac2db26a58c24e984c8fc7ac529193898cad1" sha="2148880b2a099a2582ec29deabcc2fd80cba0195">
+ <sDescription>Phaser Stereo (from Faust)</sDescription>
+ <author>Ricardo Wurmus</author>
+ <license>GPL</license>
+ <helpPatch/>
+ <inlets>
+ <frac32buffer name="in" description="in"/>
+ </inlets>
+ <outlets>
+ <frac32buffer.bipolar name="left" description="left output"/>
+ <frac32buffer.bipolar name="right" description="right output"/>
+ </outlets>
+ <params>
+ <bool32.tgl name="fcheckbox0" description="VibratoMode: direct/vibrato"/>
+ <bool32.tgl name="fcheckbox1" description="linear/invert"/>
+ <!-- values are given as: default, min, max, increment? -->
+ <!-- They all need to be remapped to the -64.0..0..64.0 range -->
+
+ <!-- 1.0f, 0.0f, 1.0f, 0.01f -->
+ <frac32.u.map description="Depth" name="fslider0"/>
+
+ <!-- 0.0f, 0.0f, 1.0f, 0.01f -->
+ <frac32.u.map description="feedback gain" name="fslider1"/>
+
+ <!-- 1e+03f, 1e+01f, 5e+03f, 1.0f -->
+ <frac32.s.map.pitch description="Notch width (Hz)" name="fslider3"/>
+
+ <!-- 0.5f, 0.0f, 1e+01f, 0.01f -->
+ <frac32.u.map description="Speed (Hz)" name="fslider4"/>
+
+ <!-- 1e+02f, 2e+01f, 5e+03f, 1.0f -->
+ <frac32.s.map.pitch description="MinNotch1Freq (Hz)" name="fslider5"/>
+
+ <!-- 8e+02f, 2e+01f, 1e+04f, 1.0f -->
+ <frac32.s.map.pitch description="MaxNotch1Freq (Hz)" name="fslider6"/>
+
+ <!-- 1.5f, 1.1f, 4.0f, 0.01f -->
+ <frac32.u.map description="NotchFreq (Hz)" name="fslider7"/>
+ </params>
+ <displays/>
+ <attribs/>
+ <includes>
+ <include>./phaser_stereo_float.cpp</include>
+ </includes>
+
+ <code.declaration><![CDATA[
+Dsp phaser;
+]]></code.declaration>
+ <code.init><![CDATA[
+
+ phaser.init(48000);
+ ]]></code.init>
+ <code.krate><![CDATA[
+ phaser.compute(BUFSIZE,
+ &inlet_in,
+ &outlet_left[0],
+ &outlet_right[0],
+ param_fcheckbox0,
+ param_fcheckbox1,
+ param_fslider0,
+ param_fslider1,
+ param_fslider3,
+ param_fslider4,
+ param_fslider5,
+ param_fslider6,
+ param_fslider7);
+]]></code.krate>
+ </obj.normal>
+</objdefs>
diff --git a/objects/faust/phaser_stereo_float.cpp b/objects/faust/phaser_stereo_float.cpp
new file mode 100644
index 0000000..9e3e587
--- /dev/null
+++ b/objects/faust/phaser_stereo_float.cpp
@@ -0,0 +1,215 @@
+//-----------------------------------------------------
+// name: "Phaser"
+//
+// Code generated with Faust 0.9.67 (http://faust.grame.fr)
+//-----------------------------------------------------
+/* link with */
+#ifndef FAUSTPOWER
+#define FAUSTPOWER
+#define faustpower4(x) ((x)*(x)*(x)*(x))
+#define faustpower3(x) ((x)*(x)*(x))
+#define faustpower2(x) ((x)*(x))
+#define max(a, b) ((a) > (b) ? (a) : (b))
+#define min(a, b) ((a) < (b) ? (a) : (b))
+#endif
+/************************************************************************
+ ************************************************************************
+ FAUST Architecture File
+ Copyright (C) 2003-2011 GRAME, Centre National de Creation Musicale
+ ---------------------------------------------------------------------
+
+ This is sample code. This file is provided as an example of minimal
+ FAUST architecture file. Redistribution and use in source and binary
+ forms, with or without modification, in part or in full are permitted.
+ In particular you can create a derived work of this FAUST architecture
+ and distribute that work under terms of your choice.
+
+ This sample code is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ ************************************************************************
+ ************************************************************************/
+
+
+/******************************************************************************
+*******************************************************************************
+
+ VECTOR INTRINSICS
+
+*******************************************************************************
+*******************************************************************************/
+
+
+/******************************************************************************
+*******************************************************************************
+
+ ABSTRACT USER INTERFACE
+
+*******************************************************************************
+*******************************************************************************/
+
+//----------------------------------------------------------------------------
+// FAUST generated signal processor
+//----------------------------------------------------------------------------
+
+#ifndef FAUSTFLOAT
+#define FAUSTFLOAT float
+#endif
+
+class Dsp {
+public:
+ int fSamplingFreq;
+ FAUSTFLOAT fslider0;
+ FAUSTFLOAT fcheckbox0;
+ FAUSTFLOAT fcheckbox1;
+ int iVec0[2];
+ FAUSTFLOAT fslider1;
+ FAUSTFLOAT fslider2;
+ FAUSTFLOAT fslider3;
+ int iConst0;
+ float fConst1;
+ FAUSTFLOAT fslider4;
+ float fConst2;
+ float fRec5[2];
+ float fRec6[2];
+ FAUSTFLOAT fslider5;
+ FAUSTFLOAT fslider6;
+ FAUSTFLOAT fslider7;
+ float fRec4[3];
+ float fRec3[3];
+ float fRec2[3];
+ float fRec1[3];
+ float fRec0[2];
+ float fRec11[3];
+ float fRec10[3];
+ float fRec9[3];
+ float fRec8[3];
+ float fRec7[2];
+
+ void instanceInit(int samplingFreq) {
+ fSamplingFreq = samplingFreq;
+ fslider0 = 1.0f;
+ fcheckbox0 = 0.0;
+ fcheckbox1 = 0.0;
+ for (int i=0; i<2; i++) iVec0[i] = 0;
+ fslider1 = 0.0f;
+ fslider2 = 0.0f;
+ fslider3 = 1e+03f;
+ iConst0 = min(192000, max(1, fSamplingFreq));
+ fConst1 = (1.0f / float(iConst0));
+ fslider4 = 0.5f;
+ fConst2 = (6.283185307179586f / float(iConst0));
+ for (int i=0; i<2; i++) fRec5[i] = 0;
+ for (int i=0; i<2; i++) fRec6[i] = 0;
+ fslider5 = 1e+02f;
+ fslider6 = 8e+02f;
+ fslider7 = 1.5f;
+ for (int i=0; i<3; i++) fRec4[i] = 0;
+ for (int i=0; i<3; i++) fRec3[i] = 0;
+ for (int i=0; i<3; i++) fRec2[i] = 0;
+ for (int i=0; i<3; i++) fRec1[i] = 0;
+ for (int i=0; i<2; i++) fRec0[i] = 0;
+ for (int i=0; i<3; i++) fRec11[i] = 0;
+ for (int i=0; i<3; i++) fRec10[i] = 0;
+ for (int i=0; i<3; i++) fRec9[i] = 0;
+ for (int i=0; i<3; i++) fRec8[i] = 0;
+ for (int i=0; i<2; i++) fRec7[i] = 0;
+ }
+ void init(int samplingFreq) {
+ instanceInit(samplingFreq);
+ }
+ // convert fixed point to float
+ // * invert bits if sign bit is set (0x08000000, or (1<<27))
+ // * cast int to float
+ // * divide by constant to shift decimal point
+ // * multiply by -1 if sign bit was set
+ float ConvertFracToFloat(int32_t frac) {
+ bool neg = (((1<<27) & frac) != 0);
+ float res = (float)(neg ? frac : ~frac);
+ res = res / (float(1<<29));
+ return (neg ? (-1 * res) : res);
+ }
+
+ void compute (int count,
+ const int32_t** input,
+ int32_t* left,
+ int32_t* right,
+ int param_fcheckbox0,
+ int param_fcheckbox1,
+ int param_fslider0,
+ int param_fslider1,
+ int param_fslider3,
+ int param_fslider4,
+ int param_fslider5,
+ int param_fslider6,
+ int param_fslider7) {
+ float fSlow0 = (0.5f * ((int(float(param_fcheckbox0)))?2:float(fslider0)));
+ float fSlow1 = ((int(float(param_fcheckbox1)))?(0 - fSlow0):fSlow0);
+ float fSlow2 = float(fslider1);
+ float fSlow3 = 10; //powf(10,(0.05f * float(fslider2)));
+ float fSlow4 = 0.8; //expf((fConst1 * (0 - (3.141592653589793f * float(fslider3)))));
+ float fSlow5 = faustpower2(fSlow4);
+ float fSlow6 = (fConst2 * 10*ConvertFracToFloat(param_fslider4));
+ float fSlow7 = cosf(fSlow6);
+ float fSlow8 = sinf(fSlow6);
+ float fSlow9 = (0 - fSlow8);
+ float fSlow10 = float(fslider5);
+ float fSlow11 = (6.283185307179586f * fSlow10);
+ float fSlow12 = (0.5f * ((6.283185307179586f * max(fSlow10, float(fslider6))) - fSlow11));
+ float fSlow13 = float(fslider7);
+ float fSlow14 = (fConst1 * fSlow13);
+ float fSlow15 = (0 - (2 * fSlow4));
+ float fSlow16 = (fConst1 * faustpower2(fSlow13));
+ float fSlow17 = (fConst1 * faustpower3(fSlow13));
+ float fSlow18 = (fConst1 * faustpower4(fSlow13));
+ float fSlow19 = (1 - fSlow0);
+ const int32_t* input0 = *input;
+ const int32_t* input1 = *input;
+ int32_t* output0 = left;
+ int32_t* output1 = right;
+ for (int i=0; i<count; i++) {
+ iVec0[0] = 1;
+ float fTemp0 = ConvertFracToFloat(input0[i]);
+ fRec5[0] = ((fSlow8 * fRec6[1]) + (fSlow7 * fRec5[1]));
+ fRec6[0] = ((1 + ((fSlow7 * fRec6[1]) + (fSlow9 * fRec5[1]))) - iVec0[1]);
+ float fTemp1 = (fSlow11 + (fSlow12 * (1 - fRec5[0])));
+ float fTemp2 = (fRec4[1] * cosf((fSlow14 * fTemp1)));
+ fRec4[0] = (0 - (((fSlow15 * fTemp2) + (fSlow5 * fRec4[2])) - ((fSlow3 * fTemp0) + (fSlow2 * fRec0[1]))));
+ float fTemp3 = (fRec3[1] * cosf((fSlow16 * fTemp1)));
+ fRec3[0] = ((fSlow15 * (fTemp2 - fTemp3)) + (fRec4[2] + (fSlow5 * (fRec4[0] - fRec3[2]))));
+ float fTemp4 = (fRec2[1] * cosf((fSlow17 * fTemp1)));
+ fRec2[0] = ((fSlow15 * (fTemp3 - fTemp4)) + (fRec3[2] + (fSlow5 * (fRec3[0] - fRec2[2]))));
+ float fTemp5 = (fRec1[1] * cosf((fSlow18 * fTemp1)));
+ fRec1[0] = ((fSlow15 * (fTemp4 - fTemp5)) + (fRec2[2] + (fSlow5 * (fRec2[0] - fRec1[2]))));
+ fRec0[0] = ((fSlow5 * fRec1[0]) + ((fSlow15 * fTemp5) + fRec1[2]));
+ output0[i] = ConvertFloatToFrac((fSlow3 * (fTemp0 * fSlow19)) + (fRec0[0] * fSlow1));
+
+ float fTemp6 = ConvertFracToFloat(input1[i]);
+ float fTemp7 = (fSlow11 + (fSlow12 * (1 - fRec6[0])));
+ float fTemp8 = (fRec11[1] * cosf((fSlow14 * fTemp7)));
+ fRec11[0] = (0 - (((fSlow15 * fTemp8) + (fSlow5 * fRec11[2])) - ((fSlow3 * fTemp6) + (fSlow2 * fRec7[1]))));
+ float fTemp9 = (fRec10[1] * cosf((fSlow16 * fTemp7)));
+ fRec10[0] = ((fSlow15 * (fTemp8 - fTemp9)) + (fRec11[2] + (fSlow5 * (fRec11[0] - fRec10[2]))));
+ float fTemp10 = (fRec9[1] * cosf((fSlow17 * fTemp7)));
+ fRec9[0] = ((fSlow15 * (fTemp9 - fTemp10)) + (fRec10[2] + (fSlow5 * (fRec10[0] - fRec9[2]))));
+ float fTemp11 = (fRec8[1] * cosf((fSlow18 * fTemp7)));
+ fRec8[0] = ((fSlow15 * (fTemp10 - fTemp11)) + (fRec9[2] + (fSlow5 * (fRec9[0] - fRec8[2]))));
+ fRec7[0] = ((fSlow5 * fRec8[0]) + ((fSlow15 * fTemp11) + fRec8[2]));
+ output1[i] = ConvertFloatToFrac((fSlow3 * (fTemp6 * fSlow19)) + (fRec7[0] * fSlow1));
+ // post processing
+ fRec7[1] = fRec7[0];
+ fRec8[2] = fRec8[1]; fRec8[1] = fRec8[0];
+ fRec9[2] = fRec9[1]; fRec9[1] = fRec9[0];
+ fRec10[2] = fRec10[1]; fRec10[1] = fRec10[0];
+ fRec11[2] = fRec11[1]; fRec11[1] = fRec11[0];
+ fRec0[1] = fRec0[0];
+ fRec1[2] = fRec1[1]; fRec1[1] = fRec1[0];
+ fRec2[2] = fRec2[1]; fRec2[1] = fRec2[0];
+ fRec3[2] = fRec3[1]; fRec3[1] = fRec3[0];
+ fRec4[2] = fRec4[1]; fRec4[1] = fRec4[0];
+ fRec6[1] = fRec6[0];
+ fRec5[1] = fRec5[0];
+ iVec0[1] = iVec0[0];
+ }
+ }
+};
diff --git a/objects/faust/phaser_stereo_optimised.axo b/objects/faust/phaser_stereo_optimised.axo
new file mode 100644
index 0000000..c16ac7d
--- /dev/null
+++ b/objects/faust/phaser_stereo_optimised.axo
@@ -0,0 +1,180 @@
+<objdefs>
+ <obj.normal id="phaser_stereo_optimised" uuid="38e0908ef72eddcefe1acb06ecfdeff201ddf1a9" sha="ae1df574629a5ec71ab34078f5084f686f786742">
+ <sDescription>Phaser Stereo (from Faust) hand-optimised</sDescription>
+ <author>Ricardo Wurmus</author>
+ <license>GPL</license>
+ <helpPatch/>
+ <inlets>
+ <frac32buffer name="in" description="in"/>
+ </inlets>
+ <outlets>
+ <frac32buffer.bipolar name="left" description="left output"/>
+ <frac32buffer.bipolar name="right" description="right output"/>
+ </outlets>
+ <params>
+ <bool32.tgl name="fcheckbox0" description="VibratoMode: direct/vibrato"/>
+ <bool32.tgl name="fcheckbox1" description="linear/invert"/>
+ <!-- values are given as: default, min, max, increment? -->
+ <!-- They all need to be remapped to the -64.0..0..64.0 range -->
+
+ <!-- 1.0f, 0.0f, 1.0f, 0.01f -->
+ <frac32.u.map description="Depth" name="fslider0"/>
+
+ <!-- 0.0f, 0.0f, 1.0f, 0.01f -->
+ <frac32.u.map description="feedback gain" name="fslider1"/>
+
+ <!-- 1e+03f, 1e+01f, 5e+03f, 1.0f -->
+ <frac32.s.map.pitch description="Notch width (Hz)" name="fslider3"/>
+
+ <!-- 0.5f, 0.0f, 1e+01f, 0.01f -->
+ <frac32.u.map description="Speed (Hz)" name="fslider4"/>
+
+ <!-- 1e+02f, 2e+01f, 5e+03f, 1.0f -->
+ <frac32.s.map.pitch description="MinNotch1Freq (Hz)" name="fslider5"/>
+
+ <!-- 8e+02f, 2e+01f, 1e+04f, 1.0f -->
+ <frac32.s.map.pitch description="MaxNotch1Freq (Hz)" name="fslider6"/>
+
+ <!-- 1.5f, 1.1f, 4.0f, 0.01f -->
+ <frac32.u.map description="NotchFreq (Hz)" name="fslider7"/>
+ </params>
+ <displays/>
+ <attribs/>
+ <code.declaration><![CDATA[
+ int iVec0[2];
+ int32_t fConst1;
+ int32_t fConst2;
+ int32_t fRec0[2];
+ int32_t fRec1[3];
+ int32_t fRec2[3];
+ int32_t fRec3[3];
+ int32_t fRec4[3];
+ int32_t fRec5[2];
+ int32_t fRec6[2];
+ int32_t fRec7[2];
+ int32_t fRec8[3];
+ int32_t fRec9[3];
+ int32_t fRec10[3];
+ int32_t fRec11[3];
+ // only valid for positive values!
+ #define MAX(a, b) ((a) > (b) ? (a) : (b))
+ #define cosf arm_cos_q31
+ #define intTAU 0x00c90fdb
+ /*"6.283185307179586f"*/
+]]></code.declaration>
+ <code.init><![CDATA[
+ int32_t intPI = 0x006487ed /*"3.141592653589793f"*/;
+
+
+ // SAMPLERATE is 48000
+ fConst1 = 0x0000002c /*"2.0833333333333333e-5"*/; //1.0f / SAMPLERATE;
+ fConst2 = 0x00000113 /*"1.308996938995747e-4"*/; // TAU / SAMPLERATE;
+
+ for (int i=0; i<2; i++) iVec0[i] = 0;
+ for (int i=0; i<2; i++) fRec0[i] = 0;
+ for (int i=0; i<3; i++) fRec1[i] = 0;
+ for (int i=0; i<3; i++) fRec2[i] = 0;
+ for (int i=0; i<3; i++) fRec3[i] = 0;
+ for (int i=0; i<3; i++) fRec4[i] = 0;
+ for (int i=0; i<2; i++) fRec5[i] = 0;
+ for (int i=0; i<2; i++) fRec6[i] = 0;
+ for (int i=0; i<2; i++) fRec7[i] = 0;
+ for (int i=0; i<3; i++) fRec8[i] = 0;
+ for (int i=0; i<3; i++) fRec9[i] = 0;
+ for (int i=0; i<3; i++) fRec10[i] = 0;
+ for (int i=0; i<3; i++) fRec11[i] = 0;
+]]></code.init>
+ <code.krate><![CDATA[
+ // TODO: find replacements for: expf, cosf, sinf
+ // values must be scaled to fit into the range expected by arm_{cos,sin}_q31
+ // they all take radians!
+ // cosf --> arm_cos_q31
+ // sinf --> arm_sin_q31
+
+ int32_t fSlow0 = param_fcheckbox0 ? 0x00200000 /*"1"*/ : (param_fslider0>>1);
+ int32_t fSlow1 = param_fcheckbox1 ? __QSUB(0, fSlow0) : fSlow0;
+ // TODO: find replacement for expf
+ // e ^ -1 * const1 * pi * slider3
+ // It's a value between 0.72 and 1.0, but for now we pretend it's just the value of fslider3.
+ // float fSlow4 = expf((fConst1 * (0 - (3.141592653589793f * float(fslider3)))));
+ int32_t fSlow4 = 0x00200000; //param_fslider3;
+ int32_t fSlow5 = ___SMMUL(fSlow4, fSlow4);
+ int32_t fSlow6 = ___SMMUL(fConst2, param_fslider4);
+ int32_t fSlow7 = arm_cos_q31(fSlow6);
+ int32_t fSlow8 = arm_sin_q31(fSlow6);
+ int32_t fSlow9 = __QSUB(0, fSlow8);
+
+ int32_t minFreq;
+ MTOF(param_fslider5, minFreq);
+ int32_t maxFreq;
+ MTOF(param_fslider6, maxFreq);
+
+ int32_t fSlow11 = ___SMMUL(intTAU, minFreq);
+ int32_t fSlow12 = __QSUB(___SMMUL(intTAU, MAX(minFreq, maxFreq)), fSlow11) >>1;
+ int32_t fSlow15 = __QSUB(0, fSlow4<<1);
+ int32_t fSlow14 = ___SMMUL(fConst1, param_fslider7);
+ int32_t fSlow16 = ___SMMUL(fSlow14, param_fslider7);
+ int32_t fSlow17 = ___SMMUL(fSlow16, param_fslider7);
+ int32_t fSlow18 = ___SMMUL(fSlow17, param_fslider7);
+ int32_t fSlow19 = __QSUB(0x00200000 /*"1.0"*/, fSlow0);
+
+ const int32_t* input0 = inlet_in;
+ const int32_t* input1 = inlet_in;
+ int32_t* output0 = outlet_left;
+ int32_t* output1 = outlet_right;
+
+ for (int i=0; i<BUFSIZE; i++) {
+ iVec0[0] = 0x00200000 /*"1.0"*/;
+ fRec5[0] = ___SMMUL(fSlow8, fRec6[1]) + ___SMMUL(fSlow7, fRec5[1]);
+ fRec6[0] = __QSUB((1 + (___SMMUL(fSlow7, fRec6[1]) + ___SMMUL(fSlow9, fRec5[1]))), iVec0[1]);
+
+ {
+ int32_t fTemp0 = input0[i];
+ int32_t fTemp1 = fSlow11 + ___SMMUL(fSlow12, __QSUB(0x00200000 /*"1.0"*/, fRec5[0]));
+ int32_t fTemp2 = ___SMMUL(fRec4[1], cosf(___SMMUL(fSlow14, fTemp1)));
+ fRec4[0] = __QSUB(0, __QSUB((___SMMUL(fSlow15, fTemp2) + ___SMMUL(fSlow5, fRec4[2])), (fTemp0 + ___SMMUL(param_fslider1, fRec0[1]))));
+ int32_t fTemp3 = ___SMMUL(fRec3[1], cosf(___SMMUL(fSlow16, fTemp1)));
+ fRec3[0] = ___SMMUL(fSlow15, __QSUB(fTemp2, fTemp3)) + (fRec4[2] + ___SMMUL(fSlow5, __QSUB(fRec4[0], fRec3[2])));
+ int32_t fTemp4 = ___SMMUL(fRec2[1], cosf(___SMMUL(fSlow17, fTemp1)));
+ fRec2[0] = ___SMMUL(fSlow15, __QSUB(fTemp3, fTemp4)) + (fRec3[2] + ___SMMUL(fSlow5, __QSUB(fRec3[0], fRec2[2])));
+ int32_t fTemp5 = ___SMMUL(fRec1[1], cosf(___SMMUL(fSlow18, fTemp1)));
+ fRec1[0] = ___SMMUL(fSlow15, __QSUB(fTemp4, fTemp5)) + (fRec2[2] + ___SMMUL(fSlow5, __QSUB(fRec2[0], fRec1[2])));
+ fRec0[0] = ___SMMUL(fSlow5, fRec1[0]) + (___SMMUL(fSlow15, fTemp5) + fRec1[2]);
+ // TODO: add outlet to see if fRec0 is at all correct
+ output0[i] = ___SMMUL(fTemp0, fSlow19) + ___SMMUL(fRec0[0], fSlow1);
+ }
+
+ {
+ int32_t fTemp6 = input1[i];
+ int32_t fTemp7 = fSlow11 + ___SMMUL(fSlow12, __QSUB(0x00200000 /*"1.0"*/, fRec6[0]));
+ int32_t fTemp8 = ___SMMUL(fRec11[1], cosf(___SMMUL(fSlow14, fTemp7)));
+ fRec11[0] = __QSUB(0, (___SMMUL(fSlow15, fTemp8) + ___SMMUL(fSlow5, fRec11[2]) - (fTemp6 + ___SMMUL(param_fslider1, fRec7[1]))));
+ int32_t fTemp9 = ___SMMUL(fRec10[1], cosf(___SMMUL(fSlow16, fTemp7)));
+ fRec10[0] = (___SMMUL(fSlow15, __QSUB(fTemp8, fTemp9)) + (fRec11[2] + ___SMMUL(fSlow5, __QSUB(fRec11[0], fRec10[2]))));
+ int32_t fTemp10 = ___SMMUL(fRec9[1], cosf(___SMMUL(fSlow17, fTemp7)));
+ fRec9[0] = (___SMMUL(fSlow15, __QSUB(fTemp9, fTemp10)) + (fRec10[2] + ___SMMUL(fSlow5, __QSUB(fRec10[0], fRec9[2]))));
+ int32_t fTemp11 = ___SMMUL(fRec8[1], cosf(___SMMUL(fSlow18, fTemp7)));
+ fRec8[0] = (___SMMUL(fSlow15, __QSUB(fTemp10, fTemp11)) + (fRec9[2] + ___SMMUL(fSlow5, __QSUB(fRec9[0], fRec8[2]))));
+ fRec7[0] = (___SMMUL(fSlow5, fRec8[0]) + (___SMMUL(fSlow15, fTemp11) + fRec8[2]));
+ // TODO: add outlet to see if fRec7 is at all correct
+ output1[i] = ___SMMUL(fTemp6, fSlow19) + ___SMMUL(fRec7[0], fSlow1);
+ }
+
+ // post processing
+ fRec7[1] = fRec7[0];
+ fRec8[2] = fRec8[1]; fRec8[1] = fRec8[0];
+ fRec9[2] = fRec9[1]; fRec9[1] = fRec9[0];
+ fRec10[2] = fRec10[1]; fRec10[1] = fRec10[0];
+ fRec11[2] = fRec11[1]; fRec11[1] = fRec11[0];
+ fRec0[1] = fRec0[0];
+ fRec1[2] = fRec1[1]; fRec1[1] = fRec1[0];
+ fRec2[2] = fRec2[1]; fRec2[1] = fRec2[0];
+ fRec3[2] = fRec3[1]; fRec3[1] = fRec3[0];
+ fRec4[2] = fRec4[1]; fRec4[1] = fRec4[0];
+ fRec6[1] = fRec6[0];
+ fRec5[1] = fRec5[0];
+ iVec0[1] = iVec0[0];
+ }
+]]></code.krate>
+ </obj.normal>
+</objdefs>