airwindows/plugins/MacSignedVST/BezEQ3/source/BezEQ3Proc.cpp
Christopher Johnson 2335148573 BezEQ3
2026-05-09 20:09:00 -04:00

258 lines
11 KiB
C++
Executable file

/* ========================================
* BezEQ3 - BezEQ3.h
* Copyright (c) airwindows, Airwindows uses the MIT license
* ======================================== */
#ifndef __BezEQ3_H
#include "BezEQ3.h"
#endif
void BezEQ3::processReplacing(float **inputs, float **outputs, VstInt32 sampleFrames)
{
float* in1 = inputs[0];
float* in2 = inputs[1];
float* out1 = outputs[0];
float* out2 = outputs[1];
double overallscale = 1.0;
overallscale /= 44100.0;
overallscale *= getSampleRate();
//begin BezEQ3 control setup
double highGain = (pow(A+0.5,3.0)+3.0)*0.25;
double hmidGain = (pow(B+0.5,3.0)+3.0)*0.25;
double lmidGain = (pow(C+0.5,3.0)+3.0)*0.25;
double bassGain = (pow(D+0.5,3.0)+3.0)*0.25;
double trebleRef = (1.0-pow(1.0-E,2.0))-0.5;
double highmidRef = F-0.5;
double lowmidRef = G-0.5;
double bassRef = pow(H,2.0)-0.5;
double HMderez = pow(0.75 + ((trebleRef+trebleRef+trebleRef+highmidRef)*0.125),1.618) /overallscale;
double LMderez = pow(0.25 + ((lowmidRef+bassRef+bassRef+bassRef)*0.125),1.618) /overallscale;
double Mderez = pow((HMderez*0.5)+(LMderez*0.5)+((highmidRef+lowmidRef)*0.125),1.618) /overallscale;
int stepped = 999999; if (HMderez > 0.000001) stepped = (int)(1.0/HMderez);
HMderez = 1.0 / stepped;
double HMtrim = 1.0-(HMderez*((double)stepped/(stepped+1.0)));
stepped = 999999; if (Mderez > 0.000001) stepped = (int)(1.0/Mderez);
Mderez = 1.0 / stepped;
double Mtrim = 1.0-(Mderez*((double)stepped/(stepped+1.0)));
stepped = 999999; if (LMderez > 0.000001) stepped = (int)(1.0/LMderez);
LMderez = 1.0 / stepped;
double LMtrim = 1.0-(LMderez*((double)stepped/(stepped+1.0)));
//end BezEQ3 control setup
while (--sampleFrames >= 0)
{
double inputSampleL = *in1;
double inputSampleR = *in2;
if (fabs(inputSampleL)<1.18e-23) inputSampleL = fpdL * 1.18e-17;
if (fabs(inputSampleR)<1.18e-23) inputSampleR = fpdR * 1.18e-17;
//begin BezEQ3
for (int p = 0; p < 3; p++) {
double highL = inputSampleL;
double highR = inputSampleR;
bezEQ[bez_HMcycle][p] += HMderez;
bezEQ[bez_HMAL][p] += (highL * HMderez);
bezEQ[bez_HMAR][p] += (highR * HMderez);
if (bezEQ[bez_HMcycle][p] > 1.0) {
bezEQ[bez_HMDL][p] = bezEQ[bez_HMCL][p]; bezEQ[bez_HMCL][p] = bezEQ[bez_HMBL][p];
bezEQ[bez_HMBL][p] = bezEQ[bez_HMAL][p]*(0.5-(HMderez*0.082));
bezEQ[bez_HMAL][p] = 0.0; bezEQ[bez_HMcycle][p] = 0.0;
bezEQ[bez_HMDR][p] = bezEQ[bez_HMCR][p]; bezEQ[bez_HMCR][p] = bezEQ[bez_HMBR][p];
bezEQ[bez_HMBR][p] = bezEQ[bez_HMAR][p]*(0.5-(HMderez*0.082));
bezEQ[bez_HMAR][p] = 0.0; bezEQ[bez_HMcycle][p] = 0.0;
}
double X = bezEQ[bez_HMcycle][p]*HMtrim;
double hmidL = bezEQ[bez_HMCL][p]+(bezEQ[bez_HMDL][p]*(1.0-X)*(1.0-X));
hmidL += (bezEQ[bez_HMCL][p]*2.0*(1.0-X)*X)+(bezEQ[bez_HMBL][p]*X*X);
highL -= hmidL; //final high and hmid
double hmidR = bezEQ[bez_HMCR][p]+(bezEQ[bez_HMDR][p]*(1.0-X)*(1.0-X));
hmidR += (bezEQ[bez_HMCR][p]*2.0*(1.0-X)*X)+(bezEQ[bez_HMBR][p]*X*X);
highR -= hmidR; //final high and hmid
bezEQ[bez_Mcycle][p] += Mderez;
bezEQ[bez_MAL][p] += (hmidL * Mderez);
bezEQ[bez_MAR][p] += (hmidR * Mderez);
if (bezEQ[bez_Mcycle][p] > 1.0) {
bezEQ[bez_MDL][p] = bezEQ[bez_MCL][p]; bezEQ[bez_MCL][p] = bezEQ[bez_MBL][p];
bezEQ[bez_MBL][p] = bezEQ[bez_MAL][p]*(0.5-(Mderez*0.082));
bezEQ[bez_MAL][p] = 0.0; bezEQ[bez_Mcycle][p] = 0.0;
bezEQ[bez_MDR][p] = bezEQ[bez_MCR][p]; bezEQ[bez_MCR][p] = bezEQ[bez_MBR][p];
bezEQ[bez_MBR][p] = bezEQ[bez_MAR][p]*(0.5-(Mderez*0.082));
bezEQ[bez_MAR][p] = 0.0; bezEQ[bez_Mcycle][p] = 0.0;
}
X = bezEQ[bez_Mcycle][p]*Mtrim;
double lmidL = bezEQ[bez_MCL][p]+(bezEQ[bez_MDL][p]*(1.0-X)*(1.0-X));
lmidL += (bezEQ[bez_MCL][p]*2.0*(1.0-X)*X)+(bezEQ[bez_MBL][p]*X*X);
hmidL -= lmidL; //final hmid and lmid
double lmidR = bezEQ[bez_MCR][p]+(bezEQ[bez_MDR][p]*(1.0-X)*(1.0-X));
lmidR += (bezEQ[bez_MCR][p]*2.0*(1.0-X)*X)+(bezEQ[bez_MBR][p]*X*X);
hmidR -= lmidR; //final hmid and lmid
bezEQ[bez_LMcycle][p] += LMderez;
bezEQ[bez_LMAL][p] += (lmidL * LMderez);
bezEQ[bez_LMAR][p] += (lmidR * LMderez);
if (bezEQ[bez_LMcycle][p] > 1.0) {
bezEQ[bez_LMDL][p] = bezEQ[bez_LMCL][p]; bezEQ[bez_LMCL][p] = bezEQ[bez_LMBL][p];
bezEQ[bez_LMBL][p] = bezEQ[bez_LMAL][p]*(0.5-(LMderez*0.082));
bezEQ[bez_LMAL][p] = 0.0; bezEQ[bez_LMcycle][p] = 0.0;
bezEQ[bez_LMDR][p] = bezEQ[bez_LMCR][p]; bezEQ[bez_LMCR][p] = bezEQ[bez_LMBR][p];
bezEQ[bez_LMBR][p] = bezEQ[bez_LMAR][p]*(0.5-(LMderez*0.082));
bezEQ[bez_LMAR][p] = 0.0; bezEQ[bez_LMcycle][p] = 0.0;
}
X = bezEQ[bez_LMcycle][p]*LMtrim;
double bassL = bezEQ[bez_LMCL][p]+(bezEQ[bez_LMDL][p]*(1.0-X)*(1.0-X));
bassL += (bezEQ[bez_LMCL][p]*2.0*(1.0-X)*X)+(bezEQ[bez_LMBL][p]*X*X);
lmidL -= bassL; //final lmid and bass
double bassR = bezEQ[bez_LMCR][p]+(bezEQ[bez_LMDR][p]*(1.0-X)*(1.0-X));
bassR += (bezEQ[bez_LMCR][p]*2.0*(1.0-X)*X)+(bezEQ[bez_LMBR][p]*X*X);
lmidR -= bassR; //final lmid and bass
inputSampleL = (highL*highGain)+(hmidL*hmidGain)+(lmidL*lmidGain)+(bassL*bassGain);
inputSampleR = (highR*highGain)+(hmidR*hmidGain)+(lmidR*lmidGain)+(bassR*bassGain);
}
//end BezEQ3
//begin 32 bit stereo floating point dither
int expon; frexpf((float)inputSampleL, &expon);
fpdL ^= fpdL << 13; fpdL ^= fpdL >> 17; fpdL ^= fpdL << 5;
inputSampleL += ((double(fpdL)-uint32_t(0x7fffffff)) * 3.553e-44l * pow(2,expon+62));
frexpf((float)inputSampleR, &expon);
fpdR ^= fpdR << 13; fpdR ^= fpdR >> 17; fpdR ^= fpdR << 5;
if (fpdL-fpdR < 1073741824 || fpdR-fpdL < 1073741824) {
fpdR ^= fpdR << 13; fpdR ^= fpdR >> 17; fpdR ^= fpdR << 5;}
inputSampleR += ((double(fpdR)-uint32_t(0x7fffffff)) * 3.553e-44l * pow(2,expon+62));
//end 32 bit stereo floating point dither
*out1 = inputSampleL;
*out2 = inputSampleR;
in1++;
in2++;
out1++;
out2++;
}
}
void BezEQ3::processDoubleReplacing(double **inputs, double **outputs, VstInt32 sampleFrames)
{
double* in1 = inputs[0];
double* in2 = inputs[1];
double* out1 = outputs[0];
double* out2 = outputs[1];
double overallscale = 1.0;
overallscale /= 44100.0;
overallscale *= getSampleRate();
//begin BezEQ3 control setup
double highGain = (pow(A+0.5,3.0)+3.0)*0.25;
double hmidGain = (pow(B+0.5,3.0)+3.0)*0.25;
double lmidGain = (pow(C+0.5,3.0)+3.0)*0.25;
double bassGain = (pow(D+0.5,3.0)+3.0)*0.25;
double trebleRef = (1.0-pow(1.0-E,2.0))-0.5;
double highmidRef = F-0.5;
double lowmidRef = G-0.5;
double bassRef = pow(H,2.0)-0.5;
double HMderez = pow(0.75 + ((trebleRef+trebleRef+trebleRef+highmidRef)*0.125),1.618) /overallscale;
double LMderez = pow(0.25 + ((lowmidRef+bassRef+bassRef+bassRef)*0.125),1.618) /overallscale;
double Mderez = pow((HMderez*0.5)+(LMderez*0.5)+((highmidRef+lowmidRef)*0.125),1.618) /overallscale;
int stepped = 999999; if (HMderez > 0.000001) stepped = (int)(1.0/HMderez);
HMderez = 1.0 / stepped;
double HMtrim = 1.0-(HMderez*((double)stepped/(stepped+1.0)));
stepped = 999999; if (Mderez > 0.000001) stepped = (int)(1.0/Mderez);
Mderez = 1.0 / stepped;
double Mtrim = 1.0-(Mderez*((double)stepped/(stepped+1.0)));
stepped = 999999; if (LMderez > 0.000001) stepped = (int)(1.0/LMderez);
LMderez = 1.0 / stepped;
double LMtrim = 1.0-(LMderez*((double)stepped/(stepped+1.0)));
//end BezEQ3 control setup
while (--sampleFrames >= 0)
{
double inputSampleL = *in1;
double inputSampleR = *in2;
if (fabs(inputSampleL)<1.18e-23) inputSampleL = fpdL * 1.18e-17;
if (fabs(inputSampleR)<1.18e-23) inputSampleR = fpdR * 1.18e-17;
//begin BezEQ3
for (int p = 0; p < 3; p++) {
double highL = inputSampleL;
double highR = inputSampleR;
bezEQ[bez_HMcycle][p] += HMderez;
bezEQ[bez_HMAL][p] += (highL * HMderez);
bezEQ[bez_HMAR][p] += (highR * HMderez);
if (bezEQ[bez_HMcycle][p] > 1.0) {
bezEQ[bez_HMDL][p] = bezEQ[bez_HMCL][p]; bezEQ[bez_HMCL][p] = bezEQ[bez_HMBL][p];
bezEQ[bez_HMBL][p] = bezEQ[bez_HMAL][p]*(0.5-(HMderez*0.082));
bezEQ[bez_HMAL][p] = 0.0; bezEQ[bez_HMcycle][p] = 0.0;
bezEQ[bez_HMDR][p] = bezEQ[bez_HMCR][p]; bezEQ[bez_HMCR][p] = bezEQ[bez_HMBR][p];
bezEQ[bez_HMBR][p] = bezEQ[bez_HMAR][p]*(0.5-(HMderez*0.082));
bezEQ[bez_HMAR][p] = 0.0; bezEQ[bez_HMcycle][p] = 0.0;
}
double X = bezEQ[bez_HMcycle][p]*HMtrim;
double hmidL = bezEQ[bez_HMCL][p]+(bezEQ[bez_HMDL][p]*(1.0-X)*(1.0-X));
hmidL += (bezEQ[bez_HMCL][p]*2.0*(1.0-X)*X)+(bezEQ[bez_HMBL][p]*X*X);
highL -= hmidL; //final high and hmid
double hmidR = bezEQ[bez_HMCR][p]+(bezEQ[bez_HMDR][p]*(1.0-X)*(1.0-X));
hmidR += (bezEQ[bez_HMCR][p]*2.0*(1.0-X)*X)+(bezEQ[bez_HMBR][p]*X*X);
highR -= hmidR; //final high and hmid
bezEQ[bez_Mcycle][p] += Mderez;
bezEQ[bez_MAL][p] += (hmidL * Mderez);
bezEQ[bez_MAR][p] += (hmidR * Mderez);
if (bezEQ[bez_Mcycle][p] > 1.0) {
bezEQ[bez_MDL][p] = bezEQ[bez_MCL][p]; bezEQ[bez_MCL][p] = bezEQ[bez_MBL][p];
bezEQ[bez_MBL][p] = bezEQ[bez_MAL][p]*(0.5-(Mderez*0.082));
bezEQ[bez_MAL][p] = 0.0; bezEQ[bez_Mcycle][p] = 0.0;
bezEQ[bez_MDR][p] = bezEQ[bez_MCR][p]; bezEQ[bez_MCR][p] = bezEQ[bez_MBR][p];
bezEQ[bez_MBR][p] = bezEQ[bez_MAR][p]*(0.5-(Mderez*0.082));
bezEQ[bez_MAR][p] = 0.0; bezEQ[bez_Mcycle][p] = 0.0;
}
X = bezEQ[bez_Mcycle][p]*Mtrim;
double lmidL = bezEQ[bez_MCL][p]+(bezEQ[bez_MDL][p]*(1.0-X)*(1.0-X));
lmidL += (bezEQ[bez_MCL][p]*2.0*(1.0-X)*X)+(bezEQ[bez_MBL][p]*X*X);
hmidL -= lmidL; //final hmid and lmid
double lmidR = bezEQ[bez_MCR][p]+(bezEQ[bez_MDR][p]*(1.0-X)*(1.0-X));
lmidR += (bezEQ[bez_MCR][p]*2.0*(1.0-X)*X)+(bezEQ[bez_MBR][p]*X*X);
hmidR -= lmidR; //final hmid and lmid
bezEQ[bez_LMcycle][p] += LMderez;
bezEQ[bez_LMAL][p] += (lmidL * LMderez);
bezEQ[bez_LMAR][p] += (lmidR * LMderez);
if (bezEQ[bez_LMcycle][p] > 1.0) {
bezEQ[bez_LMDL][p] = bezEQ[bez_LMCL][p]; bezEQ[bez_LMCL][p] = bezEQ[bez_LMBL][p];
bezEQ[bez_LMBL][p] = bezEQ[bez_LMAL][p]*(0.5-(LMderez*0.082));
bezEQ[bez_LMAL][p] = 0.0; bezEQ[bez_LMcycle][p] = 0.0;
bezEQ[bez_LMDR][p] = bezEQ[bez_LMCR][p]; bezEQ[bez_LMCR][p] = bezEQ[bez_LMBR][p];
bezEQ[bez_LMBR][p] = bezEQ[bez_LMAR][p]*(0.5-(LMderez*0.082));
bezEQ[bez_LMAR][p] = 0.0; bezEQ[bez_LMcycle][p] = 0.0;
}
X = bezEQ[bez_LMcycle][p]*LMtrim;
double bassL = bezEQ[bez_LMCL][p]+(bezEQ[bez_LMDL][p]*(1.0-X)*(1.0-X));
bassL += (bezEQ[bez_LMCL][p]*2.0*(1.0-X)*X)+(bezEQ[bez_LMBL][p]*X*X);
lmidL -= bassL; //final lmid and bass
double bassR = bezEQ[bez_LMCR][p]+(bezEQ[bez_LMDR][p]*(1.0-X)*(1.0-X));
bassR += (bezEQ[bez_LMCR][p]*2.0*(1.0-X)*X)+(bezEQ[bez_LMBR][p]*X*X);
lmidR -= bassR; //final lmid and bass
inputSampleL = (highL*highGain)+(hmidL*hmidGain)+(lmidL*lmidGain)+(bassL*bassGain);
inputSampleR = (highR*highGain)+(hmidR*hmidGain)+(lmidR*lmidGain)+(bassR*bassGain);
}
//end BezEQ3
//begin 64 bit stereo floating point dither
//int expon; frexp((double)inputSampleL, &expon);
fpdL ^= fpdL << 13; fpdL ^= fpdL >> 17; fpdL ^= fpdL << 5;
//inputSampleL += ((double(fpdL)-uint32_t(0x7fffffff)) * 3.553e-44l * pow(2,expon+62));
//frexp((double)inputSampleR, &expon);
fpdR ^= fpdR << 13; fpdR ^= fpdR >> 17; fpdR ^= fpdR << 5;
if (fpdL-fpdR < 1073741824 || fpdR-fpdL < 1073741824) {
fpdR ^= fpdR << 13; fpdR ^= fpdR >> 17; fpdR ^= fpdR << 5;}
//inputSampleR += ((double(fpdR)-uint32_t(0x7fffffff)) * 3.553e-44l * pow(2,expon+62));
//end 64 bit stereo floating point dither
*out1 = inputSampleL;
*out2 = inputSampleR;
in1++;
in2++;
out1++;
out2++;
}
}