blob: 05d4b56688ecc8728a1862e9f661ed090c740ace (
plain) (
tree)
|
|
/* ========================================
* 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++;
}
}
|