/* ======================================== * Channel4 - Channel4.h * Copyright (c) 2016 airwindows, Airwindows uses the MIT license * ======================================== */ #ifndef __Channel4_H #include "Channel4.h" #endif void Channel4::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(); float fpTemp; double fpOld = 0.618033988749894848204586; //golden ratio! double fpNew = 1.0 - fpOld; const double localiirAmount = iirAmount / overallscale; const double localthreshold = threshold / overallscale; const double density = pow(drive,2); //this doesn't relate to the plugins Density and Drive much double clamp; double bridgerectifier; double inputSampleL; double inputSampleR; while (--sampleFrames >= 0) { inputSampleL = *in1; inputSampleR = *in2; if (fabs(inputSampleL)<1.18e-23) inputSampleL = fpdL * 1.18e-17; if (fabs(inputSampleR)<1.18e-23) inputSampleR = fpdR * 1.18e-17; if (fpFlip) { iirSampleLA = (iirSampleLA * (1 - localiirAmount)) + (inputSampleL * localiirAmount); inputSampleL = inputSampleL - iirSampleLA; iirSampleRA = (iirSampleRA * (1 - localiirAmount)) + (inputSampleR * localiirAmount); inputSampleR = inputSampleR - iirSampleRA; } else { iirSampleLB = (iirSampleLB * (1 - localiirAmount)) + (inputSampleL * localiirAmount); inputSampleL = inputSampleL - iirSampleLB; iirSampleRB = (iirSampleRB * (1 - localiirAmount)) + (inputSampleR * localiirAmount); inputSampleR = inputSampleR - iirSampleRB; } //highpass section bridgerectifier = fabs(inputSampleL)*1.57079633; if (bridgerectifier > 1.57079633) bridgerectifier = 1.0; else bridgerectifier = sin(bridgerectifier); if (inputSampleL > 0) inputSampleL = (inputSampleL*(1-density))+(bridgerectifier*density); else inputSampleL = (inputSampleL*(1-density))-(bridgerectifier*density); bridgerectifier = fabs(inputSampleR)*1.57079633; if (bridgerectifier > 1.57079633) bridgerectifier = 1.0; else bridgerectifier = sin(bridgerectifier); if (inputSampleR > 0) inputSampleR = (inputSampleR*(1-density))+(bridgerectifier*density); else inputSampleR = (inputSampleR*(1-density))-(bridgerectifier*density); //drive section clamp = inputSampleL - lastSampleL; if (clamp > localthreshold) inputSampleL = lastSampleL + localthreshold; if (-clamp > localthreshold) inputSampleL = lastSampleL - localthreshold; lastSampleL = inputSampleL; clamp = inputSampleR - lastSampleR; if (clamp > localthreshold) inputSampleR = lastSampleR + localthreshold; if (-clamp > localthreshold) inputSampleR = lastSampleR - localthreshold; lastSampleR = inputSampleR; //slew section //noise shaping to 32-bit floating point if (fpFlip) { fpTemp = inputSampleL; fpNShapeLA = (fpNShapeLA*fpOld)+((inputSampleL-fpTemp)*fpNew); inputSampleL += fpNShapeLA; fpTemp = inputSampleR; fpNShapeRA = (fpNShapeRA*fpOld)+((inputSampleR-fpTemp)*fpNew); inputSampleR += fpNShapeRA; } else { fpTemp = inputSampleL; fpNShapeLB = (fpNShapeLB*fpOld)+((inputSampleL-fpTemp)*fpNew); inputSampleL += fpNShapeLB; fpTemp = inputSampleR; fpNShapeRB = (fpNShapeRB*fpOld)+((inputSampleR-fpTemp)*fpNew); inputSampleR += fpNShapeRB; } fpFlip = !fpFlip; //end noise shaping on 32 bit output *out1 = inputSampleL; *out2 = inputSampleR; *in1++; *in2++; *out1++; *out2++; } } void Channel4::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 fpTemp; //this is different from singlereplacing double fpOld = 0.618033988749894848204586; //golden ratio! double fpNew = 1.0 - fpOld; const double localiirAmount = iirAmount / overallscale; const double localthreshold = threshold / overallscale; const double density = pow(drive,2); //this doesn't relate to the plugins Density and Drive much double clamp; double bridgerectifier; double inputSampleL; double inputSampleR; while (--sampleFrames >= 0) { inputSampleL = *in1; inputSampleR = *in2; if (fabs(inputSampleL)<1.18e-23) inputSampleL = fpdL * 1.18e-17; if (fabs(inputSampleR)<1.18e-23) inputSampleR = fpdR * 1.18e-17; if (fpFlip) { iirSampleLA = (iirSampleLA * (1 - localiirAmount)) + (inputSampleL * localiirAmount); inputSampleL = inputSampleL - iirSampleLA; iirSampleRA = (iirSampleRA * (1 - localiirAmount)) + (inputSampleR * localiirAmount); inputSampleR = inputSampleR - iirSampleRA; } else { iirSampleLB = (iirSampleLB * (1 - localiirAmount)) + (inputSampleL * localiirAmount); inputSampleL = inputSampleL - iirSampleLB; iirSampleRB = (iirSampleRB * (1 - localiirAmount)) + (inputSampleR * localiirAmount); inputSampleR = inputSampleR - iirSampleRB; } //highpass section bridgerectifier = fabs(inputSampleL)*1.57079633; if (bridgerectifier > 1.57079633) bridgerectifier = 1.0; else bridgerectifier = sin(bridgerectifier); if (inputSampleL > 0) inputSampleL = (inputSampleL*(1-density))+(bridgerectifier*density); else inputSampleL = (inputSampleL*(1-density))-(bridgerectifier*density); bridgerectifier = fabs(inputSampleR)*1.57079633; if (bridgerectifier > 1.57079633) bridgerectifier = 1.0; else bridgerectifier = sin(bridgerectifier); if (inputSampleR > 0) inputSampleR = (inputSampleR*(1-density))+(bridgerectifier*density); else inputSampleR = (inputSampleR*(1-density))-(bridgerectifier*density); //drive section clamp = inputSampleL - lastSampleL; if (clamp > localthreshold) inputSampleL = lastSampleL + localthreshold; if (-clamp > localthreshold) inputSampleL = lastSampleL - localthreshold; lastSampleL = inputSampleL; clamp = inputSampleR - lastSampleR; if (clamp > localthreshold) inputSampleR = lastSampleR + localthreshold; if (-clamp > localthreshold) inputSampleR = lastSampleR - localthreshold; lastSampleR = inputSampleR; //slew section //noise shaping to 64-bit floating point if (fpFlip) { fpTemp = inputSampleL; fpNShapeLA = (fpNShapeLA*fpOld)+((inputSampleL-fpTemp)*fpNew); inputSampleL += fpNShapeLA; fpTemp = inputSampleR; fpNShapeRA = (fpNShapeRA*fpOld)+((inputSampleR-fpTemp)*fpNew); inputSampleR += fpNShapeRA; } else { fpTemp = inputSampleL; fpNShapeLB = (fpNShapeLB*fpOld)+((inputSampleL-fpTemp)*fpNew); inputSampleL += fpNShapeLB; fpTemp = inputSampleR; fpNShapeRB = (fpNShapeRB*fpOld)+((inputSampleR-fpTemp)*fpNew); inputSampleR += fpNShapeRB; } fpFlip = !fpFlip; //end noise shaping on 64 bit output *out1 = inputSampleL; *out2 = inputSampleR; *in1++; *in2++; *out1++; *out2++; } }