diff options
Diffstat (limited to 'plugins/ZaMultiComp/ZaMultiCompPlugin.cpp')
-rw-r--r-- | plugins/ZaMultiComp/ZaMultiCompPlugin.cpp | 58 |
1 files changed, 37 insertions, 21 deletions
diff --git a/plugins/ZaMultiComp/ZaMultiCompPlugin.cpp b/plugins/ZaMultiComp/ZaMultiCompPlugin.cpp index a9bea86..be6d6bd 100644 --- a/plugins/ZaMultiComp/ZaMultiCompPlugin.cpp +++ b/plugins/ZaMultiComp/ZaMultiCompPlugin.cpp @@ -694,22 +694,30 @@ void ZaMultiCompPlugin::initState(unsigned int, String&, String&) void ZaMultiCompPlugin::activate() { - int i; + int i, j; for (i = 0; i < MAX_COMP; i++) old_yl[i]=old_y1[i]=old_yg[i]=0.f; old_ll=old_l1=0.f; for (i = 0; i < MAX_FILT; i++) { - simper[0][i].k = 0.f; - simper[0][i].g = 0.f; - simper[0][i].s[0] = 0.f; - simper[0][i].s[1] = 0.f; - - simper[1][i].k = 0.f; - simper[1][i].g = 0.f; - simper[1][i].s[0] = 0.f; - simper[1][i].s[1] = 0.f; + for (j = 0; j < 2; j++) { + simper[0][i][j].k = 0.f; + simper[0][i][j].g = 0.f; + simper[0][i][j].m0 = 0.f; + simper[0][i][j].m1 = 0.f; + simper[0][i][j].m2 = 0.f; + simper[0][i][j].s[0] = 0.f; + simper[0][i][j].s[1] = 0.f; + + simper[1][i][j].k = 0.f; + simper[1][i][j].g = 0.f; + simper[1][i][j].m0 = 0.f; + simper[1][i][j].m1 = 0.f; + simper[1][i][j].m2 = 0.f; + simper[1][i][j].s[0] = 0.f; + simper[1][i][j].s[1] = 0.f; + } } max = 0.f; pos[0] = 0; @@ -725,14 +733,16 @@ void ZaMultiCompPlugin::activate() * https://cytomic.com/files/dsp/SvfInputMixing.pdf */ -void ZaMultiCompPlugin::linear_svf_set_xover(struct linear_svf *self, float sample_rate, float cutoff, float resonance) +void ZaMultiCompPlugin::linear_svf_set_xover(struct linear_svf *self, float sample_rate, float cutoff, float resonance, bool hp) { double w; - self->k = 2. - 2. * resonance; w = M_PI * cutoff / sample_rate; self->g = tan(w); - + self->k = 1. / resonance; + self->m0 = hp ? 0. : 1.; + self->m1 = 0.; + self->m2 = hp ? 1. : 0.; } void ZaMultiCompPlugin::linear_svf_reset(struct linear_svf *self) @@ -740,7 +750,7 @@ void ZaMultiCompPlugin::linear_svf_reset(struct linear_svf *self) self->s[0] = self->s[1] = 0.f; } -float ZaMultiCompPlugin::run_linear_svf_xover(struct linear_svf *self, float in, float mixlow, float mixhigh) +float ZaMultiCompPlugin::run_linear_svf_xover(struct linear_svf *self, float in) { double v[3]; double g = self->g; @@ -748,9 +758,9 @@ float ZaMultiCompPlugin::run_linear_svf_xover(struct linear_svf *self, float in, 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); @@ -765,14 +775,20 @@ void ZaMultiCompPlugin::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, false); + linear_svf_set_xover(&simper[1][i][0], srate, f, 0.7071068, true); + linear_svf_set_xover(&simper[0][i][1], srate, f, 0.7071068, false); + linear_svf_set_xover(&simper[1][i][1], srate, f, 0.7071068, true); } void ZaMultiCompPlugin::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; + lo = run_linear_svf_xover(&simper[0][i][0], in); + *outlo = run_linear_svf_xover(&simper[0][i][1], lo); + + hi = run_linear_svf_xover(&simper[1][i][0], in); + *outhi = run_linear_svf_xover(&simper[1][i][1], hi); } void ZaMultiCompPlugin::run_comp(int k, float in, float *out) |