summaryrefslogtreecommitdiff
path: root/plugins/ZaMultiCompX2/ZaMultiCompX2Plugin.cpp
diff options
context:
space:
mode:
authorDamien Zammit <damien@zamaudio.com>2019-07-07 20:57:25 +1000
committerDamien Zammit <damien@zamaudio.com>2019-07-07 20:57:25 +1000
commit1fa7b123380e8dea288d6f5be3c580c30ff46c65 (patch)
tree1f25a0e3272442ad59ef04c8bd7da99aa349fcd2 /plugins/ZaMultiCompX2/ZaMultiCompX2Plugin.cpp
parentd211bff779cd6dd2d24a8106bea944da4d1bd195 (diff)
Testing SVF with allpass
Diffstat (limited to 'plugins/ZaMultiCompX2/ZaMultiCompX2Plugin.cpp')
-rw-r--r--plugins/ZaMultiCompX2/ZaMultiCompX2Plugin.cpp89
1 files changed, 66 insertions, 23 deletions
diff --git a/plugins/ZaMultiCompX2/ZaMultiCompX2Plugin.cpp b/plugins/ZaMultiCompX2/ZaMultiCompX2Plugin.cpp
index 5227dcc..079cfc6 100644
--- a/plugins/ZaMultiCompX2/ZaMultiCompX2Plugin.cpp
+++ b/plugins/ZaMultiCompX2/ZaMultiCompX2Plugin.cpp
@@ -714,7 +714,7 @@ void ZaMultiCompX2Plugin::setParameterValue(uint32_t index, float value)
void ZaMultiCompX2Plugin::activate()
{
- int i,j;
+ int layer,type,i,j;
for (i = 0; i < MAX_COMP; i++)
for (j = 0; j < 2; j++)
old_yl[j][i]=old_y1[j][i]=old_yg[j][i]=0.f;
@@ -722,12 +722,17 @@ void ZaMultiCompX2Plugin::activate()
for (j = 0; j < 2; j++)
old_ll[j]=old_l1[j]=0.f;
- for (j = 0; j < 2; j++) {
+ for (type = 0; type < 3; type++) {
for (i = 0; i < MAX_FILT; i++) {
- simper[j][i].k = 0.f;
- simper[j][i].g = 0.f;
- simper[j][i].s[0] = 0.f;
- simper[j][i].s[1] = 0.f;
+ for (layer = 0; layer < 2; layer++) {
+ simper[type][i][layer].k = 0.f;
+ simper[type][i][layer].g = 0.f;
+ simper[type][i][layer].m0 = 0.f;
+ simper[type][i][layer].m1 = 0.f;
+ simper[type][i][layer].m2 = 0.f;
+ simper[type][i][layer].s[0] = 0.f;
+ simper[type][i][layer].s[1] = 0.f;
+ }
}
}
maxL = maxR = 0.f;
@@ -744,53 +749,91 @@ void ZaMultiCompX2Plugin::activate()
* https://cytomic.com/files/dsp/SvfInputMixing.pdf
*/
-void ZaMultiCompX2Plugin::linear_svf_set_xover(struct linear_svf *self, float sample_rate, float cutoff, float resonance)
+void ZaMultiCompX2Plugin::linear_svf_set_xover(struct linear_svf *self, float sample_rate, float cutoff, float resonance, int hp)
{
double w;
- self->k = 2. - 2. * resonance;
+ self->k = 1. / resonance;
w = M_PI * cutoff / sample_rate;
self->g = tan(w);
+ switch (hp) {
+ case 0:
+ self->m0 = 1.;
+ self->m1 = 0.;
+ self->m2 = 0.;
+ break;
+ case 1:
+ self->m0 = 0.;
+ self->m1 = 0.;
+ self->m2 = 1.;
+ break;
+ default:
+ case 2:
+ self->m0 = 1.;
+ self->m1 = -self->k;
+ self->m2 = 1.;
+ break;
+ }
}
+
+
void ZaMultiCompX2Plugin::linear_svf_reset(struct linear_svf *self)
{
self->s[0] = self->s[1] = 0.f;
}
-float ZaMultiCompX2Plugin::run_linear_svf_xover(struct linear_svf *self, float in, float mixlow, float mixhigh)
+float ZaMultiCompX2Plugin::run_linear_svf_xover(struct linear_svf *self, float in)
{
- double v[3];
+ double v[2];
double g = self->g;
double k = self->k;
double s0 = self->s[0];
double s1 = self->s[1];
double g2 = g*g;
- double vhigh = in * mixhigh;
- double vband = in * 0.75;
- double vlow = in * mixlow;
+ double vhigh = in * self->m2;
+ double vband = in * self->m1;
+ double vlow = in * self->m0;
- v[0] = in;
- v[1] = -1. / (1. + g2 + g*k) * (-s0 + g*s1 - g*k*s0 + g2*vband + g*vhigh - g*vlow - g2*k*vlow);
- v[2] = -1. / (1. + g2 + g*k) * (-g*s0 - s1 - g*vband + g2*vhigh + g*k*vhigh - g2*vlow);
- self->s[0] = 2. * v[1] - s0;
- self->s[1] = 2. * v[2] - s1;
+ v[0] = -1. / (1. + g2 + g*k) * (-s0 + g*s1 - g*k*s0 + g2*vband + g*vhigh - g*vlow - g2*k*vlow);
+ v[1] = -1. / (1. + g2 + g*k) * (-g*s0 - s1 - g*vband + g2*vhigh + g*k*vhigh - g2*vlow);
+ self->s[0] = 2. * v[0] - s0;
+ self->s[1] = 2. * v[1] - s1;
- return (float)(vhigh + v[2]);
+ return (float)(vhigh + v[1]);
}
void ZaMultiCompX2Plugin::calc_lr4(float f, int i)
{
float srate = getSampleRate();
- linear_svf_set_xover(&simper[0][i], srate, f, 0.25);
- linear_svf_set_xover(&simper[1][i], srate, f, 0.25);
+ linear_svf_set_xover(&simper[0][i][0], srate, f, 0.7071068, 0); // lp layer0
+ linear_svf_set_xover(&simper[0][i][1], srate, f, 0.7071068, 0); // lp layer1
+ linear_svf_set_xover(&simper[1][i][0], srate, f, 0.7071068, 1); // hp layer0
+ linear_svf_set_xover(&simper[1][i][1], srate, f, 0.7071068, 1); // hp layer1
+ linear_svf_set_xover(&simper[2][i][0], srate, f, 0.7071068, 2); // bp layer0
+ linear_svf_set_xover(&simper[2][i][1], srate, f, 0.7071068, 2); // bp layer1
}
void ZaMultiCompX2Plugin::run_lr4(int i, float in, float *outlo, float *outhi)
{
- *outlo = run_linear_svf_xover(&simper[0][i], in, 1., 0.);
- *outhi = run_linear_svf_xover(&simper[1][i], in, 0., 1.);
+ float lo, hi, ap;
+/*
+ lo = run_linear_svf_xover(&simper[0][i][0], in);
+ ap = run_linear_svf_xover(&simper[2][i][0], lo);
+ *outlo = run_linear_svf_xover(&simper[0][i][1], ap);
+
+ hi = run_linear_svf_xover(&simper[1][i][0], in);
+ ap = run_linear_svf_xover(&simper[2][i][1], hi);
+ *outhi = run_linear_svf_xover(&simper[1][i][1], ap);
+*/
+ ap = run_linear_svf_xover(&simper[2][i][0], in);
+ lo = run_linear_svf_xover(&simper[0][i][0], ap);
+ *outlo = run_linear_svf_xover(&simper[0][i][1], lo);
+
+ ap = run_linear_svf_xover(&simper[2][i][1], in);
+ hi = run_linear_svf_xover(&simper[1][i][0], ap);
+ *outhi = run_linear_svf_xover(&simper[1][i][1], hi);
}
void ZaMultiCompX2Plugin::run_comp(int k, float inL, float inR, float *outL, float *outR)