diff options
Diffstat (limited to 'plugins/WinVST/DeBess/DeBessProc.cpp')
-rwxr-xr-x | plugins/WinVST/DeBess/DeBessProc.cpp | 212 |
1 files changed, 212 insertions, 0 deletions
diff --git a/plugins/WinVST/DeBess/DeBessProc.cpp b/plugins/WinVST/DeBess/DeBessProc.cpp new file mode 100755 index 0000000..05d4b56 --- /dev/null +++ b/plugins/WinVST/DeBess/DeBessProc.cpp @@ -0,0 +1,212 @@ +/* ======================================== + * DeBess - DeBess.h + * Copyright (c) 2016 airwindows, All rights reserved + * ======================================== */ + +#ifndef __DeBess_H +#include "DeBess.h" +#endif + +void DeBess::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(); + + double intensity = pow(A,5)*(8192/overallscale); + double sharpness = B*40.0; + if (sharpness < 2) sharpness = 2; + double speed = 0.1 / sharpness; + double depth = 1.0 / (C+0.0001); + double iirAmount = D; + float monitoring = E; + + while (--sampleFrames >= 0) + { + long double inputSampleL = *in1; + long double inputSampleR = *in2; + if (fabs(inputSampleL)<1.18e-37) inputSampleL = fpd * 1.18e-37; + if (fabs(inputSampleR)<1.18e-37) inputSampleR = fpd * 1.18e-37; + + sL[0] = inputSampleL; //set up so both [0] and [1] will be input sample + sR[0] = inputSampleR; //set up so both [0] and [1] will be input sample + //we only use the [1] so this is just where samples come in + for (int x = sharpness; x > 0; x--) { + sL[x] = sL[x-1]; + sR[x] = sR[x-1]; + } //building up a set of slews + + mL[1] = (sL[1]-sL[2])*((sL[1]-sL[2])/1.3); + mR[1] = (sR[1]-sR[2])*((sR[1]-sR[2])/1.3); + for (int x = sharpness-1; x > 1; x--) { + mL[x] = (sL[x]-sL[x+1])*((sL[x-1]-sL[x])/1.3); + mR[x] = (sR[x]-sR[x+1])*((sR[x-1]-sR[x])/1.3); + } //building up a set of slews of slews + + double senseL = fabs(mL[1] - mL[2]) * sharpness * sharpness; + double senseR = fabs(mR[1] - mR[2]) * sharpness * sharpness; + for (int x = sharpness-1; x > 0; x--) { + double multL = fabs(mL[x] - mL[x+1]) * sharpness * sharpness; + if (multL < 1.0) senseL *= multL; + double multR = fabs(mR[x] - mR[x+1]) * sharpness * sharpness; + if (multR < 1.0) senseR *= multR; + } //sense is slews of slews times each other + + senseL = 1.0+(intensity*intensity*senseL); + if (senseL > intensity) {senseL = intensity;} + senseR= 1.0+(intensity*intensity*senseR); + if (senseR > intensity) {senseR = intensity;} + + if (flip) { + iirSampleAL = (iirSampleAL * (1 - iirAmount)) + (inputSampleL * iirAmount); + iirSampleAR = (iirSampleAR * (1 - iirAmount)) + (inputSampleR * iirAmount); + ratioAL = (ratioAL * (1.0-speed))+(senseL * speed); + ratioAR = (ratioAR * (1.0-speed))+(senseR * speed); + if (ratioAL > depth) ratioAL = depth; + if (ratioAR > depth) ratioAR = depth; + if (ratioAL > 1.0) inputSampleL = iirSampleAL+((inputSampleL-iirSampleAL)/ratioAL); + if (ratioAR > 1.0) inputSampleR = iirSampleAR+((inputSampleR-iirSampleAR)/ratioAR); + } + else { + iirSampleBL = (iirSampleBL * (1 - iirAmount)) + (inputSampleL * iirAmount); + iirSampleBR = (iirSampleBR * (1 - iirAmount)) + (inputSampleR * iirAmount); + ratioBL = (ratioBL * (1.0-speed))+(senseL * speed); + ratioBR = (ratioBR * (1.0-speed))+(senseR * speed); + if (ratioBL > depth) ratioBL = depth; + if (ratioBR > depth) ratioBR = depth; + if (ratioAL > 1.0) inputSampleL = iirSampleBL+((inputSampleL-iirSampleBL)/ratioBL); + if (ratioAR > 1.0) inputSampleR = iirSampleBR+((inputSampleR-iirSampleBR)/ratioBR); + } + flip = !flip; + + if (monitoring > 0.49999) { + inputSampleL = *in1 - inputSampleL; + inputSampleR = *in2 - inputSampleR; + } + //sense monitoring + + //begin 32 bit stereo floating point dither + int expon; frexpf((float)inputSampleL, &expon); + fpd ^= fpd << 13; fpd ^= fpd >> 17; fpd ^= fpd << 5; + inputSampleL += ((double(fpd)-uint32_t(0x7fffffff)) * 5.5e-36l * pow(2,expon+62)); + frexpf((float)inputSampleR, &expon); + fpd ^= fpd << 13; fpd ^= fpd >> 17; fpd ^= fpd << 5; + inputSampleR += ((double(fpd)-uint32_t(0x7fffffff)) * 5.5e-36l * pow(2,expon+62)); + //end 32 bit stereo floating point dither + + *out1 = inputSampleL; + *out2 = inputSampleR; + + *in1++; + *in2++; + *out1++; + *out2++; + } +} + +void DeBess::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(); + + double intensity = pow(A,5)*(8192/overallscale); + double sharpness = B*40.0; + if (sharpness < 2) sharpness = 2; + double speed = 0.1 / sharpness; + double depth = 1.0 / (C+0.0001); + double iirAmount = D; + float monitoring = E; + + while (--sampleFrames >= 0) + { + long double inputSampleL = *in1; + long double inputSampleR = *in2; + if (fabs(inputSampleL)<1.18e-43) inputSampleL = fpd * 1.18e-43; + if (fabs(inputSampleR)<1.18e-43) inputSampleR = fpd * 1.18e-43; + + sL[0] = inputSampleL; //set up so both [0] and [1] will be input sample + sR[0] = inputSampleR; //set up so both [0] and [1] will be input sample + //we only use the [1] so this is just where samples come in + for (int x = sharpness; x > 0; x--) { + sL[x] = sL[x-1]; + sR[x] = sR[x-1]; + } //building up a set of slews + + mL[1] = (sL[1]-sL[2])*((sL[1]-sL[2])/1.3); + mR[1] = (sR[1]-sR[2])*((sR[1]-sR[2])/1.3); + for (int x = sharpness-1; x > 1; x--) { + mL[x] = (sL[x]-sL[x+1])*((sL[x-1]-sL[x])/1.3); + mR[x] = (sR[x]-sR[x+1])*((sR[x-1]-sR[x])/1.3); + } //building up a set of slews of slews + + double senseL = fabs(mL[1] - mL[2]) * sharpness * sharpness; + double senseR = fabs(mR[1] - mR[2]) * sharpness * sharpness; + for (int x = sharpness-1; x > 0; x--) { + double multL = fabs(mL[x] - mL[x+1]) * sharpness * sharpness; + if (multL < 1.0) senseL *= multL; + double multR = fabs(mR[x] - mR[x+1]) * sharpness * sharpness; + if (multR < 1.0) senseR *= multR; + } //sense is slews of slews times each other + + senseL = 1.0+(intensity*intensity*senseL); + if (senseL > intensity) {senseL = intensity;} + senseR= 1.0+(intensity*intensity*senseR); + if (senseR > intensity) {senseR = intensity;} + + if (flip) { + iirSampleAL = (iirSampleAL * (1 - iirAmount)) + (inputSampleL * iirAmount); + iirSampleAR = (iirSampleAR * (1 - iirAmount)) + (inputSampleR * iirAmount); + ratioAL = (ratioAL * (1.0-speed))+(senseL * speed); + ratioAR = (ratioAR * (1.0-speed))+(senseR * speed); + if (ratioAL > depth) ratioAL = depth; + if (ratioAR > depth) ratioAR = depth; + if (ratioAL > 1.0) inputSampleL = iirSampleAL+((inputSampleL-iirSampleAL)/ratioAL); + if (ratioAR > 1.0) inputSampleR = iirSampleAR+((inputSampleR-iirSampleAR)/ratioAR); + } + else { + iirSampleBL = (iirSampleBL * (1 - iirAmount)) + (inputSampleL * iirAmount); + iirSampleBR = (iirSampleBR * (1 - iirAmount)) + (inputSampleR * iirAmount); + ratioBL = (ratioBL * (1.0-speed))+(senseL * speed); + ratioBR = (ratioBR * (1.0-speed))+(senseR * speed); + if (ratioBL > depth) ratioBL = depth; + if (ratioBR > depth) ratioBR = depth; + if (ratioAL > 1.0) inputSampleL = iirSampleBL+((inputSampleL-iirSampleBL)/ratioBL); + if (ratioAR > 1.0) inputSampleR = iirSampleBR+((inputSampleR-iirSampleBR)/ratioBR); + } + flip = !flip; + + if (monitoring > 0.49999) { + inputSampleL = *in1 - inputSampleL; + inputSampleR = *in2 - inputSampleR; + } + //sense monitoring + + //begin 64 bit stereo floating point dither + int expon; frexp((double)inputSampleL, &expon); + fpd ^= fpd << 13; fpd ^= fpd >> 17; fpd ^= fpd << 5; + inputSampleL += ((double(fpd)-uint32_t(0x7fffffff)) * 1.1e-44l * pow(2,expon+62)); + frexp((double)inputSampleR, &expon); + fpd ^= fpd << 13; fpd ^= fpd >> 17; fpd ^= fpd << 5; + inputSampleR += ((double(fpd)-uint32_t(0x7fffffff)) * 1.1e-44l * pow(2,expon+62)); + //end 64 bit stereo floating point dither + + *out1 = inputSampleL; + *out2 = inputSampleR; + + *in1++; + *in2++; + *out1++; + *out2++; + } +} |