aboutsummaryrefslogtreecommitdiffstats
path: root/plugins/MacVST/Gringer/source/GringerProc.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/MacVST/Gringer/source/GringerProc.cpp')
-rwxr-xr-xplugins/MacVST/Gringer/source/GringerProc.cpp238
1 files changed, 238 insertions, 0 deletions
diff --git a/plugins/MacVST/Gringer/source/GringerProc.cpp b/plugins/MacVST/Gringer/source/GringerProc.cpp
new file mode 100755
index 0000000..2a40f38
--- /dev/null
+++ b/plugins/MacVST/Gringer/source/GringerProc.cpp
@@ -0,0 +1,238 @@
+/* ========================================
+ * Gringer - Gringer.h
+ * Copyright (c) 2016 airwindows, All rights reserved
+ * ======================================== */
+
+#ifndef __Gringer_H
+#include "Gringer.h"
+#endif
+
+void Gringer::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();
+
+ inbandL[0] = 0.025/overallscale;
+ outbandL[0] = 0.025/overallscale;
+ inbandL[1] = 0.001;
+ outbandL[1] = 0.001;
+ inbandR[0] = 0.025/overallscale;
+ outbandR[0] = 0.025/overallscale;
+ inbandR[1] = 0.001;
+ outbandR[1] = 0.001;
+ //hardwired for wide bandpass around the rectification
+
+ double K = tan(M_PI * inbandL[0]);
+ double norm = 1.0 / (1.0 + K / inbandL[1] + K * K);
+ inbandL[2] = K / inbandL[1] * norm;
+ inbandL[4] = -inbandL[2];
+ inbandL[5] = 2.0 * (K * K - 1.0) * norm;
+ inbandL[6] = (1.0 - K / inbandL[1] + K * K) * norm;
+
+ K = tan(M_PI * outbandL[0]);
+ norm = 1.0 / (1.0 + K / outbandL[1] + K * K);
+ outbandL[2] = K / outbandL[1] * norm;
+ outbandL[4] = -outbandL[2];
+ outbandL[5] = 2.0 * (K * K - 1.0) * norm;
+ outbandL[6] = (1.0 - K / outbandL[1] + K * K) * norm;
+
+ K = tan(M_PI * inbandR[0]);
+ norm = 1.0 / (1.0 + K / inbandR[1] + K * K);
+ inbandR[2] = K / inbandR[1] * norm;
+ inbandR[4] = -inbandR[2];
+ inbandR[5] = 2.0 * (K * K - 1.0) * norm;
+ inbandR[6] = (1.0 - K / inbandR[1] + K * K) * norm;
+
+ K = tan(M_PI * outbandR[0]);
+ norm = 1.0 / (1.0 + K / outbandR[1] + K * K);
+ outbandR[2] = K / outbandR[1] * norm;
+ outbandR[4] = -outbandR[2];
+ outbandR[5] = 2.0 * (K * K - 1.0) * norm;
+ outbandR[6] = (1.0 - K / outbandR[1] + K * K) * norm;
+
+ 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;
+
+ inputSampleL = sin(inputSampleL);
+ inputSampleR = sin(inputSampleR);
+ //encode Console5: good cleanness
+
+ long double tempSample = (inputSampleL * inbandL[2]) + inbandL[7];
+ inbandL[7] = -(tempSample * inbandL[5]) + inbandL[8];
+ inbandL[8] = (inputSampleL * inbandL[4]) - (tempSample * inbandL[6]);
+ inputSampleL = fabs(tempSample);
+ //this is all you gotta do to make the Green Ringer fullwave rectification effect
+ //the rest is about making it work within a DAW context w. filtering and such
+
+ tempSample = (inputSampleR * inbandR[2]) + inbandR[7];
+ inbandR[7] = -(tempSample * inbandR[5]) + inbandR[8];
+ inbandR[8] = (inputSampleR * inbandR[4]) - (tempSample * inbandR[6]);
+ inputSampleR = fabs(tempSample);
+ //this is all you gotta do to make the Green Ringer fullwave rectification effect
+ //the rest is about making it work within a DAW context w. filtering and such
+
+ tempSample = (inputSampleL * outbandL[2]) + outbandL[7];
+ outbandL[7] = -(tempSample * outbandL[5]) + outbandL[8];
+ outbandL[8] = (inputSampleL * outbandL[4]) - (tempSample * outbandL[6]);
+ inputSampleL = tempSample;
+
+ tempSample = (inputSampleR * outbandR[2]) + outbandR[7];
+ outbandR[7] = -(tempSample * outbandR[5]) + outbandR[8];
+ outbandR[8] = (inputSampleR * outbandR[4]) - (tempSample * outbandR[6]);
+ inputSampleR = tempSample;
+
+ if (inputSampleL > 1.0) inputSampleL = 1.0;
+ if (inputSampleL < -1.0) inputSampleL = -1.0;
+ //without this, you can get a NaN condition where it spits out DC offset at full blast!
+ inputSampleL = asin(inputSampleL);
+ //amplitude aspect
+
+ if (inputSampleR > 1.0) inputSampleR = 1.0;
+ if (inputSampleR < -1.0) inputSampleR = -1.0;
+ //without this, you can get a NaN condition where it spits out DC offset at full blast!
+ inputSampleR = asin(inputSampleR);
+ //amplitude aspect
+
+ //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 Gringer::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();
+
+ inbandL[0] = 0.025/overallscale;
+ outbandL[0] = 0.025/overallscale;
+ inbandL[1] = 0.001;
+ outbandL[1] = 0.001;
+ inbandR[0] = 0.025/overallscale;
+ outbandR[0] = 0.025/overallscale;
+ inbandR[1] = 0.001;
+ outbandR[1] = 0.001;
+ //hardwired for wide bandpass around the rectification
+
+ double K = tan(M_PI * inbandL[0]);
+ double norm = 1.0 / (1.0 + K / inbandL[1] + K * K);
+ inbandL[2] = K / inbandL[1] * norm;
+ inbandL[4] = -inbandL[2];
+ inbandL[5] = 2.0 * (K * K - 1.0) * norm;
+ inbandL[6] = (1.0 - K / inbandL[1] + K * K) * norm;
+
+ K = tan(M_PI * outbandL[0]);
+ norm = 1.0 / (1.0 + K / outbandL[1] + K * K);
+ outbandL[2] = K / outbandL[1] * norm;
+ outbandL[4] = -outbandL[2];
+ outbandL[5] = 2.0 * (K * K - 1.0) * norm;
+ outbandL[6] = (1.0 - K / outbandL[1] + K * K) * norm;
+
+ K = tan(M_PI * inbandR[0]);
+ norm = 1.0 / (1.0 + K / inbandR[1] + K * K);
+ inbandR[2] = K / inbandR[1] * norm;
+ inbandR[4] = -inbandR[2];
+ inbandR[5] = 2.0 * (K * K - 1.0) * norm;
+ inbandR[6] = (1.0 - K / inbandR[1] + K * K) * norm;
+
+ K = tan(M_PI * outbandR[0]);
+ norm = 1.0 / (1.0 + K / outbandR[1] + K * K);
+ outbandR[2] = K / outbandR[1] * norm;
+ outbandR[4] = -outbandR[2];
+ outbandR[5] = 2.0 * (K * K - 1.0) * norm;
+ outbandR[6] = (1.0 - K / outbandR[1] + K * K) * norm;
+
+ 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;
+
+ inputSampleL = sin(inputSampleL);
+ inputSampleR = sin(inputSampleR);
+ //encode Console5: good cleanness
+
+ long double tempSample = (inputSampleL * inbandL[2]) + inbandL[7];
+ inbandL[7] = -(tempSample * inbandL[5]) + inbandL[8];
+ inbandL[8] = (inputSampleL * inbandL[4]) - (tempSample * inbandL[6]);
+ inputSampleL = fabs(tempSample);
+ //this is all you gotta do to make the Green Ringer fullwave rectification effect
+ //the rest is about making it work within a DAW context w. filtering and such
+
+ tempSample = (inputSampleR * inbandR[2]) + inbandR[7];
+ inbandR[7] = -(tempSample * inbandR[5]) + inbandR[8];
+ inbandR[8] = (inputSampleR * inbandR[4]) - (tempSample * inbandR[6]);
+ inputSampleR = fabs(tempSample);
+ //this is all you gotta do to make the Green Ringer fullwave rectification effect
+ //the rest is about making it work within a DAW context w. filtering and such
+
+ tempSample = (inputSampleL * outbandL[2]) + outbandL[7];
+ outbandL[7] = -(tempSample * outbandL[5]) + outbandL[8];
+ outbandL[8] = (inputSampleL * outbandL[4]) - (tempSample * outbandL[6]);
+ inputSampleL = tempSample;
+
+ tempSample = (inputSampleR * outbandR[2]) + outbandR[7];
+ outbandR[7] = -(tempSample * outbandR[5]) + outbandR[8];
+ outbandR[8] = (inputSampleR * outbandR[4]) - (tempSample * outbandR[6]);
+ inputSampleR = tempSample;
+
+ if (inputSampleL > 1.0) inputSampleL = 1.0;
+ if (inputSampleL < -1.0) inputSampleL = -1.0;
+ //without this, you can get a NaN condition where it spits out DC offset at full blast!
+ inputSampleL = asin(inputSampleL);
+ //amplitude aspect
+
+ if (inputSampleR > 1.0) inputSampleR = 1.0;
+ if (inputSampleR < -1.0) inputSampleR = -1.0;
+ //without this, you can get a NaN condition where it spits out DC offset at full blast!
+ inputSampleR = asin(inputSampleR);
+ //amplitude aspect
+
+ //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++;
+ }
+}