diff options
Diffstat (limited to 'plugins/MacVST/MV/source/MVProc.cpp')
-rwxr-xr-x | plugins/MacVST/MV/source/MVProc.cpp | 1600 |
1 files changed, 1600 insertions, 0 deletions
diff --git a/plugins/MacVST/MV/source/MVProc.cpp b/plugins/MacVST/MV/source/MVProc.cpp new file mode 100755 index 0000000..00082b4 --- /dev/null +++ b/plugins/MacVST/MV/source/MVProc.cpp @@ -0,0 +1,1600 @@ +/* ======================================== + * MV - MV.h + * Copyright (c) 2016 airwindows, All rights reserved + * ======================================== */ + +#ifndef __MV_H +#include "MV.h" +#endif + +void MV::processReplacing(float **inputs, float **outputs, VstInt32 sampleFrames) +{ + float* in1 = inputs[0]; + float* in2 = inputs[1]; + float* out1 = outputs[0]; + float* out2 = outputs[1]; + + int allpasstemp; + double avgtemp; + int stage = A * 27.0; + int damp = (1.0-B) * stage; + double feedbacklevel = C; + if (feedbacklevel <= 0.0625) feedbacklevel = 0.0; + if (feedbacklevel > 0.0625 && feedbacklevel <= 0.125) feedbacklevel = 0.0625; //-24db + if (feedbacklevel > 0.125 && feedbacklevel <= 0.25) feedbacklevel = 0.125; //-18db + if (feedbacklevel > 0.25 && feedbacklevel <= 0.5) feedbacklevel = 0.25; //-12db + if (feedbacklevel > 0.5 && feedbacklevel <= 0.99) feedbacklevel = 0.5; //-6db + if (feedbacklevel > 0.99) feedbacklevel = 1.0; + //we're forcing even the feedback level to be Midiverb-ized + double gain = D; + double wet = E; + + while (--sampleFrames >= 0) + { + long double inputSampleL = *in1; + long double inputSampleR = *in2; + + static int noisesourceL = 0; + static int noisesourceR = 850010; + int residue; + double applyresidue; + + noisesourceL = noisesourceL % 1700021; noisesourceL++; + residue = noisesourceL * noisesourceL; + residue = residue % 170003; residue *= residue; + residue = residue % 17011; residue *= residue; + residue = residue % 1709; residue *= residue; + residue = residue % 173; residue *= residue; + residue = residue % 17; + applyresidue = residue; + applyresidue *= 0.00000001; + applyresidue *= 0.00000001; + inputSampleL += applyresidue; + if (inputSampleL<1.2e-38 && -inputSampleL<1.2e-38) { + inputSampleL -= applyresidue; + } + + noisesourceR = noisesourceR % 1700021; noisesourceR++; + residue = noisesourceR * noisesourceR; + residue = residue % 170003; residue *= residue; + residue = residue % 17011; residue *= residue; + residue = residue % 1709; residue *= residue; + residue = residue % 173; residue *= residue; + residue = residue % 17; + applyresidue = residue; + applyresidue *= 0.00000001; + applyresidue *= 0.00000001; + inputSampleR += applyresidue; + if (inputSampleR<1.2e-38 && -inputSampleR<1.2e-38) { + inputSampleR -= applyresidue; + } + //for live air, we always apply the dither noise. Then, if our result is + //effectively digital black, we'll subtract it again. We want a 'air' hiss + double drySampleL = inputSampleL; + double drySampleR = inputSampleR; + + inputSampleL += feedbackL; + inputSampleR += feedbackR; + + inputSampleL = sin(inputSampleL); + inputSampleR = sin(inputSampleR); + + switch (stage){ + case 27: + case 26: + allpasstemp = alpA - 1; + if (allpasstemp < 0 || allpasstemp > delayA) {allpasstemp = delayA;} + inputSampleL -= aAL[allpasstemp]*0.5; + aAL[alpA] = inputSampleL; + inputSampleL *= 0.5; + + inputSampleR -= aAR[allpasstemp]*0.5; + aAR[alpA] = inputSampleR; + inputSampleR *= 0.5; + + alpA--; if (alpA < 0 || alpA > delayA) {alpA = delayA;} + inputSampleL += (aAL[alpA]); + inputSampleR += (aAR[alpA]); + if (damp > 26) { + avgtemp = inputSampleL; + inputSampleL += avgAL; + inputSampleL *= 0.5; + avgAL = avgtemp; + + avgtemp = inputSampleR; + inputSampleR += avgAR; + inputSampleR *= 0.5; + avgAR = avgtemp; + } + //allpass filter A + case 25: + allpasstemp = alpB - 1; + if (allpasstemp < 0 || allpasstemp > delayB) {allpasstemp = delayB;} + inputSampleL -= aBL[allpasstemp]*0.5; + aBL[alpB] = inputSampleL; + inputSampleL *= 0.5; + + inputSampleR -= aBR[allpasstemp]*0.5; + aBR[alpB] = inputSampleR; + inputSampleR *= 0.5; + + alpB--; if (alpB < 0 || alpB > delayB) {alpB = delayB;} + inputSampleL += (aBL[alpB]); + inputSampleR += (aBR[alpB]); + if (damp > 25) { + avgtemp = inputSampleL; + inputSampleL += avgBL; + inputSampleL *= 0.5; + avgBL = avgtemp; + + avgtemp = inputSampleR; + inputSampleR += avgBR; + inputSampleR *= 0.5; + avgBR = avgtemp; + } + //allpass filter B + case 24: + allpasstemp = alpC - 1; + if (allpasstemp < 0 || allpasstemp > delayC) {allpasstemp = delayC;} + inputSampleL -= aCL[allpasstemp]*0.5; + aCL[alpC] = inputSampleL; + inputSampleL *= 0.5; + + inputSampleR -= aCR[allpasstemp]*0.5; + aCR[alpC] = inputSampleR; + inputSampleR *= 0.5; + + alpC--; if (alpC < 0 || alpC > delayC) {alpC = delayC;} + inputSampleL += (aCL[alpC]); + inputSampleR += (aCR[alpC]); + if (damp > 24) { + avgtemp = inputSampleL; + inputSampleL += avgCL; + inputSampleL *= 0.5; + avgCL = avgtemp; + + avgtemp = inputSampleR; + inputSampleR += avgCR; + inputSampleR *= 0.5; + avgCR = avgtemp; + } + //allpass filter C + case 23: + allpasstemp = alpD - 1; + if (allpasstemp < 0 || allpasstemp > delayD) {allpasstemp = delayD;} + inputSampleL -= aDL[allpasstemp]*0.5; + aDL[alpD] = inputSampleL; + inputSampleL *= 0.5; + + inputSampleR -= aDR[allpasstemp]*0.5; + aDR[alpD] = inputSampleR; + inputSampleR *= 0.5; + + alpD--; if (alpD < 0 || alpD > delayD) {alpD = delayD;} + inputSampleL += (aDL[alpD]); + inputSampleR += (aDR[alpD]); + if (damp > 23) { + avgtemp = inputSampleL; + inputSampleL += avgDL; + inputSampleL *= 0.5; + avgDL = avgtemp; + + avgtemp = inputSampleR; + inputSampleR += avgDR; + inputSampleR *= 0.5; + avgDR = avgtemp; + } + //allpass filter D + case 22: + allpasstemp = alpE - 1; + if (allpasstemp < 0 || allpasstemp > delayE) {allpasstemp = delayE;} + inputSampleL -= aEL[allpasstemp]*0.5; + aEL[alpE] = inputSampleL; + inputSampleL *= 0.5; + + inputSampleR -= aER[allpasstemp]*0.5; + aER[alpE] = inputSampleR; + inputSampleR *= 0.5; + + alpE--; if (alpE < 0 || alpE > delayE) {alpE = delayE;} + inputSampleL += (aEL[alpE]); + inputSampleR += (aER[alpE]); + if (damp > 22) { + avgtemp = inputSampleL; + inputSampleL += avgEL; + inputSampleL *= 0.5; + avgEL = avgtemp; + + avgtemp = inputSampleR; + inputSampleR += avgER; + inputSampleR *= 0.5; + avgER = avgtemp; + } + //allpass filter E + case 21: + allpasstemp = alpF - 1; + if (allpasstemp < 0 || allpasstemp > delayF) {allpasstemp = delayF;} + inputSampleL -= aFL[allpasstemp]*0.5; + aFL[alpF] = inputSampleL; + inputSampleL *= 0.5; + + inputSampleR -= aFR[allpasstemp]*0.5; + aFR[alpF] = inputSampleR; + inputSampleR *= 0.5; + + alpF--; if (alpF < 0 || alpF > delayF) {alpF = delayF;} + inputSampleL += (aFL[alpF]); + inputSampleR += (aFR[alpF]); + if (damp > 21) { + avgtemp = inputSampleL; + inputSampleL += avgFL; + inputSampleL *= 0.5; + avgFL = avgtemp; + + avgtemp = inputSampleR; + inputSampleR += avgFR; + inputSampleR *= 0.5; + avgFR = avgtemp; + } + //allpass filter F + case 20: + allpasstemp = alpG - 1; + if (allpasstemp < 0 || allpasstemp > delayG) {allpasstemp = delayG;} + inputSampleL -= aGL[allpasstemp]*0.5; + aGL[alpG] = inputSampleL; + inputSampleL *= 0.5; + + inputSampleR -= aGR[allpasstemp]*0.5; + aGR[alpG] = inputSampleR; + inputSampleR *= 0.5; + + alpG--; if (alpG < 0 || alpG > delayG) {alpG = delayG;} + inputSampleL += (aGL[alpG]); + inputSampleR += (aGR[alpG]); + if (damp > 20) { + avgtemp = inputSampleL; + inputSampleL += avgGL; + inputSampleL *= 0.5; + avgGL = avgtemp; + + avgtemp = inputSampleR; + inputSampleR += avgGR; + inputSampleR *= 0.5; + avgGR = avgtemp; + } + //allpass filter G + case 19: + allpasstemp = alpH - 1; + if (allpasstemp < 0 || allpasstemp > delayH) {allpasstemp = delayH;} + inputSampleL -= aHL[allpasstemp]*0.5; + aHL[alpH] = inputSampleL; + inputSampleL *= 0.5; + + inputSampleR -= aHR[allpasstemp]*0.5; + aHR[alpH] = inputSampleR; + inputSampleR *= 0.5; + + alpH--; if (alpH < 0 || alpH > delayH) {alpH = delayH;} + inputSampleL += (aHL[alpH]); + inputSampleR += (aHR[alpH]); + if (damp > 19) { + avgtemp = inputSampleL; + inputSampleL += avgHL; + inputSampleL *= 0.5; + avgHL = avgtemp; + + avgtemp = inputSampleR; + inputSampleR += avgHR; + inputSampleR *= 0.5; + avgHR = avgtemp; + } + //allpass filter H + case 18: + allpasstemp = alpI - 1; + if (allpasstemp < 0 || allpasstemp > delayI) {allpasstemp = delayI;} + inputSampleL -= aIL[allpasstemp]*0.5; + aIL[alpI] = inputSampleL; + inputSampleL *= 0.5; + + inputSampleR -= aIR[allpasstemp]*0.5; + aIR[alpI] = inputSampleR; + inputSampleR *= 0.5; + + alpI--; if (alpI < 0 || alpI > delayI) {alpI = delayI;} + inputSampleL += (aIL[alpI]); + inputSampleR += (aIR[alpI]); + if (damp > 18) { + avgtemp = inputSampleL; + inputSampleL += avgIL; + inputSampleL *= 0.5; + avgIL = avgtemp; + + avgtemp = inputSampleR; + inputSampleR += avgIR; + inputSampleR *= 0.5; + avgIR = avgtemp; + } + //allpass filter I + case 17: + allpasstemp = alpJ - 1; + if (allpasstemp < 0 || allpasstemp > delayJ) {allpasstemp = delayJ;} + inputSampleL -= aJL[allpasstemp]*0.5; + aJL[alpJ] = inputSampleL; + inputSampleL *= 0.5; + + inputSampleR -= aJR[allpasstemp]*0.5; + aJR[alpJ] = inputSampleR; + inputSampleR *= 0.5; + + alpJ--; if (alpJ < 0 || alpJ > delayJ) {alpJ = delayJ;} + inputSampleL += (aJL[alpJ]); + inputSampleR += (aJR[alpJ]); + if (damp > 17) { + avgtemp = inputSampleL; + inputSampleL += avgJL; + inputSampleL *= 0.5; + avgJL = avgtemp; + + avgtemp = inputSampleR; + inputSampleR += avgJR; + inputSampleR *= 0.5; + avgJR = avgtemp; + } + //allpass filter J + case 16: + allpasstemp = alpK - 1; + if (allpasstemp < 0 || allpasstemp > delayK) {allpasstemp = delayK;} + inputSampleL -= aKL[allpasstemp]*0.5; + aKL[alpK] = inputSampleL; + inputSampleL *= 0.5; + + inputSampleR -= aKR[allpasstemp]*0.5; + aKR[alpK] = inputSampleR; + inputSampleR *= 0.5; + + alpK--; if (alpK < 0 || alpK > delayK) {alpK = delayK;} + inputSampleL += (aKL[alpK]); + inputSampleR += (aKR[alpK]); + if (damp > 16) { + avgtemp = inputSampleL; + inputSampleL += avgKL; + inputSampleL *= 0.5; + avgKL = avgtemp; + + avgtemp = inputSampleR; + inputSampleR += avgKR; + inputSampleR *= 0.5; + avgKR = avgtemp; + } + //allpass filter K + case 15: + allpasstemp = alpL - 1; + if (allpasstemp < 0 || allpasstemp > delayL) {allpasstemp = delayL;} + inputSampleL -= aLL[allpasstemp]*0.5; + aLL[alpL] = inputSampleL; + inputSampleL *= 0.5; + + inputSampleR -= aLR[allpasstemp]*0.5; + aLR[alpL] = inputSampleR; + inputSampleR *= 0.5; + + alpL--; if (alpL < 0 || alpL > delayL) {alpL = delayL;} + inputSampleL += (aLL[alpL]); + inputSampleR += (aLR[alpL]); + if (damp > 15) { + avgtemp = inputSampleL; + inputSampleL += avgLL; + inputSampleL *= 0.5; + avgLL = avgtemp; + + avgtemp = inputSampleR; + inputSampleR += avgLR; + inputSampleR *= 0.5; + avgLR = avgtemp; + } + //allpass filter L + case 14: + allpasstemp = alpM - 1; + if (allpasstemp < 0 || allpasstemp > delayM) {allpasstemp = delayM;} + inputSampleL -= aML[allpasstemp]*0.5; + aML[alpM] = inputSampleL; + inputSampleL *= 0.5; + + inputSampleR -= aMR[allpasstemp]*0.5; + aMR[alpM] = inputSampleR; + inputSampleR *= 0.5; + + alpM--; if (alpM < 0 || alpM > delayM) {alpM = delayM;} + inputSampleL += (aML[alpM]); + inputSampleR += (aMR[alpM]); + if (damp > 14) { + avgtemp = inputSampleL; + inputSampleL += avgML; + inputSampleL *= 0.5; + avgML = avgtemp; + + avgtemp = inputSampleR; + inputSampleR += avgMR; + inputSampleR *= 0.5; + avgMR = avgtemp; + } + //allpass filter M + case 13: + allpasstemp = alpN - 1; + if (allpasstemp < 0 || allpasstemp > delayN) {allpasstemp = delayN;} + inputSampleL -= aNL[allpasstemp]*0.5; + aNL[alpN] = inputSampleL; + inputSampleL *= 0.5; + + inputSampleR -= aNR[allpasstemp]*0.5; + aNR[alpN] = inputSampleR; + inputSampleR *= 0.5; + + alpN--; if (alpN < 0 || alpN > delayN) {alpN = delayN;} + inputSampleL += (aNL[alpN]); + inputSampleR += (aNR[alpN]); + if (damp > 13) { + avgtemp = inputSampleL; + inputSampleL += avgNL; + inputSampleL *= 0.5; + avgNL = avgtemp; + + avgtemp = inputSampleR; + inputSampleR += avgNR; + inputSampleR *= 0.5; + avgNR = avgtemp; + } + //allpass filter N + case 12: + allpasstemp = alpO - 1; + if (allpasstemp < 0 || allpasstemp > delayO) {allpasstemp = delayO;} + inputSampleL -= aOL[allpasstemp]*0.5; + aOL[alpO] = inputSampleL; + inputSampleL *= 0.5; + + inputSampleR -= aOR[allpasstemp]*0.5; + aOR[alpO] = inputSampleR; + inputSampleR *= 0.5; + + alpO--; if (alpO < 0 || alpO > delayO) {alpO = delayO;} + inputSampleL += (aOL[alpO]); + inputSampleR += (aOR[alpO]); + if (damp > 12) { + avgtemp = inputSampleL; + inputSampleL += avgOL; + inputSampleL *= 0.5; + avgOL = avgtemp; + + avgtemp = inputSampleR; + inputSampleR += avgOR; + inputSampleR *= 0.5; + avgOR = avgtemp; + } + //allpass filter O + case 11: + allpasstemp = alpP - 1; + if (allpasstemp < 0 || allpasstemp > delayP) {allpasstemp = delayP;} + inputSampleL -= aPL[allpasstemp]*0.5; + aPL[alpP] = inputSampleL; + inputSampleL *= 0.5; + + inputSampleR -= aPR[allpasstemp]*0.5; + aPR[alpP] = inputSampleR; + inputSampleR *= 0.5; + + alpP--; if (alpP < 0 || alpP > delayP) {alpP = delayP;} + inputSampleL += (aPL[alpP]); + inputSampleR += (aPR[alpP]); + if (damp > 11) { + avgtemp = inputSampleL; + inputSampleL += avgPL; + inputSampleL *= 0.5; + avgPL = avgtemp; + + avgtemp = inputSampleR; + inputSampleR += avgPR; + inputSampleR *= 0.5; + avgPR = avgtemp; + } + //allpass filter P + case 10: + allpasstemp = alpQ - 1; + if (allpasstemp < 0 || allpasstemp > delayQ) {allpasstemp = delayQ;} + inputSampleL -= aQL[allpasstemp]*0.5; + aQL[alpQ] = inputSampleL; + inputSampleL *= 0.5; + + inputSampleR -= aQR[allpasstemp]*0.5; + aQR[alpQ] = inputSampleR; + inputSampleR *= 0.5; + + alpQ--; if (alpQ < 0 || alpQ > delayQ) {alpQ = delayQ;} + inputSampleL += (aQL[alpQ]); + inputSampleR += (aQR[alpQ]); + if (damp > 10) { + avgtemp = inputSampleL; + inputSampleL += avgQL; + inputSampleL *= 0.5; + avgQL = avgtemp; + + avgtemp = inputSampleR; + inputSampleR += avgQR; + inputSampleR *= 0.5; + avgQR = avgtemp; + } + //allpass filter Q + case 9: + allpasstemp = alpR - 1; + if (allpasstemp < 0 || allpasstemp > delayR) {allpasstemp = delayR;} + inputSampleL -= aRL[allpasstemp]*0.5; + aRL[alpR] = inputSampleL; + inputSampleL *= 0.5; + + inputSampleR -= aRR[allpasstemp]*0.5; + aRR[alpR] = inputSampleR; + inputSampleR *= 0.5; + + alpR--; if (alpR < 0 || alpR > delayR) {alpR = delayR;} + inputSampleL += (aRL[alpR]); + inputSampleR += (aRR[alpR]); + if (damp > 9) { + avgtemp = inputSampleL; + inputSampleL += avgRL; + inputSampleL *= 0.5; + avgRL = avgtemp; + + avgtemp = inputSampleR; + inputSampleR += avgRR; + inputSampleR *= 0.5; + avgRR = avgtemp; + } + //allpass filter R + case 8: + allpasstemp = alpS - 1; + if (allpasstemp < 0 || allpasstemp > delayS) {allpasstemp = delayS;} + inputSampleL -= aSL[allpasstemp]*0.5; + aSL[alpS] = inputSampleL; + inputSampleL *= 0.5; + + inputSampleR -= aSR[allpasstemp]*0.5; + aSR[alpS] = inputSampleR; + inputSampleR *= 0.5; + + alpS--; if (alpS < 0 || alpS > delayS) {alpS = delayS;} + inputSampleL += (aSL[alpS]); + inputSampleR += (aSR[alpS]); + if (damp > 8) { + avgtemp = inputSampleL; + inputSampleL += avgSL; + inputSampleL *= 0.5; + avgSL = avgtemp; + + avgtemp = inputSampleR; + inputSampleR += avgSR; + inputSampleR *= 0.5; + avgSR = avgtemp; + } + //allpass filter S + case 7: + allpasstemp = alpT - 1; + if (allpasstemp < 0 || allpasstemp > delayT) {allpasstemp = delayT;} + inputSampleL -= aTL[allpasstemp]*0.5; + aTL[alpT] = inputSampleL; + inputSampleL *= 0.5; + + inputSampleR -= aTR[allpasstemp]*0.5; + aTR[alpT] = inputSampleR; + inputSampleR *= 0.5; + + alpT--; if (alpT < 0 || alpT > delayT) {alpT = delayT;} + inputSampleL += (aTL[alpT]); + inputSampleR += (aTR[alpT]); + if (damp > 7) { + avgtemp = inputSampleL; + inputSampleL += avgTL; + inputSampleL *= 0.5; + avgTL = avgtemp; + + avgtemp = inputSampleR; + inputSampleR += avgTR; + inputSampleR *= 0.5; + avgTR = avgtemp; + } + //allpass filter T + case 6: + allpasstemp = alpU - 1; + if (allpasstemp < 0 || allpasstemp > delayU) {allpasstemp = delayU;} + inputSampleL -= aUL[allpasstemp]*0.5; + aUL[alpU] = inputSampleL; + inputSampleL *= 0.5; + + inputSampleR -= aUR[allpasstemp]*0.5; + aUR[alpU] = inputSampleR; + inputSampleR *= 0.5; + + alpU--; if (alpU < 0 || alpU > delayU) {alpU = delayU;} + inputSampleL += (aUL[alpU]); + inputSampleR += (aUR[alpU]); + if (damp > 6) { + avgtemp = inputSampleL; + inputSampleL += avgUL; + inputSampleL *= 0.5; + avgUL = avgtemp; + + avgtemp = inputSampleR; + inputSampleR += avgUR; + inputSampleR *= 0.5; + avgUR = avgtemp; + } + //allpass filter U + case 5: + allpasstemp = alpV - 1; + if (allpasstemp < 0 || allpasstemp > delayV) {allpasstemp = delayV;} + inputSampleL -= aVL[allpasstemp]*0.5; + aVL[alpV] = inputSampleL; + inputSampleL *= 0.5; + + inputSampleR -= aVR[allpasstemp]*0.5; + aVR[alpV] = inputSampleR; + inputSampleR *= 0.5; + + alpV--; if (alpV < 0 || alpV > delayV) {alpV = delayV;} + inputSampleL += (aVL[alpV]); + inputSampleR += (aVR[alpV]); + if (damp > 5) { + avgtemp = inputSampleL; + inputSampleL += avgVL; + inputSampleL *= 0.5; + avgVL = avgtemp; + + avgtemp = inputSampleR; + inputSampleR += avgVR; + inputSampleR *= 0.5; + avgVR = avgtemp; + } + //allpass filter V + case 4: + allpasstemp = alpW - 1; + if (allpasstemp < 0 || allpasstemp > delayW) {allpasstemp = delayW;} + inputSampleL -= aWL[allpasstemp]*0.5; + aWL[alpW] = inputSampleL; + inputSampleL *= 0.5; + + inputSampleR -= aWR[allpasstemp]*0.5; + aWR[alpW] = inputSampleR; + inputSampleR *= 0.5; + + alpW--; if (alpW < 0 || alpW > delayW) {alpW = delayW;} + inputSampleL += (aWL[alpW]); + inputSampleR += (aWR[alpW]); + if (damp > 4) { + avgtemp = inputSampleL; + inputSampleL += avgWL; + inputSampleL *= 0.5; + avgWL = avgtemp; + + avgtemp = inputSampleR; + inputSampleR += avgWR; + inputSampleR *= 0.5; + avgWR = avgtemp; + } + //allpass filter W + case 3: + allpasstemp = alpX - 1; + if (allpasstemp < 0 || allpasstemp > delayX) {allpasstemp = delayX;} + inputSampleL -= aXL[allpasstemp]*0.5; + aXL[alpX] = inputSampleL; + inputSampleL *= 0.5; + + inputSampleR -= aXR[allpasstemp]*0.5; + aXR[alpX] = inputSampleR; + inputSampleR *= 0.5; + + alpX--; if (alpX < 0 || alpX > delayX) {alpX = delayX;} + inputSampleL += (aXL[alpX]); + inputSampleR += (aXR[alpX]); + if (damp > 3) { + avgtemp = inputSampleL; + inputSampleL += avgXL; + inputSampleL *= 0.5; + avgXL = avgtemp; + + avgtemp = inputSampleR; + inputSampleR += avgXR; + inputSampleR *= 0.5; + avgXR = avgtemp; + } + //allpass filter X + case 2: + allpasstemp = alpY - 1; + if (allpasstemp < 0 || allpasstemp > delayY) {allpasstemp = delayY;} + inputSampleL -= aYL[allpasstemp]*0.5; + aYL[alpY] = inputSampleL; + inputSampleL *= 0.5; + + inputSampleR -= aYR[allpasstemp]*0.5; + aYR[alpY] = inputSampleR; + inputSampleR *= 0.5; + + alpY--; if (alpY < 0 || alpY > delayY) {alpY = delayY;} + inputSampleL += (aYL[alpY]); + inputSampleR += (aYR[alpY]); + if (damp > 2) { + avgtemp = inputSampleL; + inputSampleL += avgYL; + inputSampleL *= 0.5; + avgYL = avgtemp; + + avgtemp = inputSampleR; + inputSampleR += avgYR; + inputSampleR *= 0.5; + avgYR = avgtemp; + } + //allpass filter Y + case 1: + allpasstemp = alpZ - 1; + if (allpasstemp < 0 || allpasstemp > delayZ) {allpasstemp = delayZ;} + inputSampleL -= aZL[allpasstemp]*0.5; + aZL[alpZ] = inputSampleL; + inputSampleL *= 0.5; + + inputSampleR -= aZR[allpasstemp]*0.5; + aZR[alpZ] = inputSampleR; + inputSampleR *= 0.5; + + alpZ--; if (alpZ < 0 || alpZ > delayZ) {alpZ = delayZ;} + inputSampleL += (aZL[alpZ]); + inputSampleR += (aZR[alpZ]); + if (damp > 1) { + avgtemp = inputSampleL; + inputSampleL += avgZL; + inputSampleL *= 0.5; + avgZL = avgtemp; + + avgtemp = inputSampleR; + inputSampleR += avgZR; + inputSampleR *= 0.5; + avgZR = avgtemp; + } + //allpass filter Z + } + + feedbackL = inputSampleL * feedbacklevel; + feedbackR = inputSampleR * feedbacklevel; + + if (gain != 1.0) { + inputSampleL *= gain; + inputSampleR *= gain; + } + //we can pad with the gain to tame distortyness from the PurestConsole code + + if (inputSampleL > 1.0) inputSampleL = 1.0; + if (inputSampleL < -1.0) inputSampleL = -1.0; + 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! + + inputSampleL = asin(inputSampleL); + inputSampleR = asin(inputSampleR); + + + if (wet !=1.0) { + inputSampleL = (inputSampleL * wet) + (drySampleL * (1.0-wet)); + inputSampleR = (inputSampleR * wet) + (drySampleR * (1.0-wet)); + } + //Dry/Wet control, defaults to the last slider + + //begin 32 bit stereo floating point dither + int expon; frexpf((float)inputSampleL, &expon); + fpd ^= fpd << 13; fpd ^= fpd >> 17; fpd ^= fpd << 5; + inputSampleL += static_cast<int32_t>(fpd) * 5.960464655174751e-36L * pow(2,expon+62); + frexpf((float)inputSampleR, &expon); + fpd ^= fpd << 13; fpd ^= fpd >> 17; fpd ^= fpd << 5; + inputSampleR += static_cast<int32_t>(fpd) * 5.960464655174751e-36L * pow(2,expon+62); + //end 32 bit stereo floating point dither + + *out1 = inputSampleL; + *out2 = inputSampleR; + + *in1++; + *in2++; + *out1++; + *out2++; + } +} + +void MV::processDoubleReplacing(double **inputs, double **outputs, VstInt32 sampleFrames) +{ + double* in1 = inputs[0]; + double* in2 = inputs[1]; + double* out1 = outputs[0]; + double* out2 = outputs[1]; + + int allpasstemp; + double avgtemp; + int stage = A * 27.0; + int damp = (1.0-B) * stage; + double feedbacklevel = C; + if (feedbacklevel <= 0.0625) feedbacklevel = 0.0; + if (feedbacklevel > 0.0625 && feedbacklevel <= 0.125) feedbacklevel = 0.0625; //-24db + if (feedbacklevel > 0.125 && feedbacklevel <= 0.25) feedbacklevel = 0.125; //-18db + if (feedbacklevel > 0.25 && feedbacklevel <= 0.5) feedbacklevel = 0.25; //-12db + if (feedbacklevel > 0.5 && feedbacklevel <= 0.99) feedbacklevel = 0.5; //-6db + if (feedbacklevel > 0.99) feedbacklevel = 1.0; + //we're forcing even the feedback level to be Midiverb-ized + double gain = D; + double wet = E; + + while (--sampleFrames >= 0) + { + long double inputSampleL = *in1; + long double inputSampleR = *in2; + + static int noisesourceL = 0; + static int noisesourceR = 850010; + int residue; + double applyresidue; + + noisesourceL = noisesourceL % 1700021; noisesourceL++; + residue = noisesourceL * noisesourceL; + residue = residue % 170003; residue *= residue; + residue = residue % 17011; residue *= residue; + residue = residue % 1709; residue *= residue; + residue = residue % 173; residue *= residue; + residue = residue % 17; + applyresidue = residue; + applyresidue *= 0.00000001; + applyresidue *= 0.00000001; + inputSampleL += applyresidue; + if (inputSampleL<1.2e-38 && -inputSampleL<1.2e-38) { + inputSampleL -= applyresidue; + } + + noisesourceR = noisesourceR % 1700021; noisesourceR++; + residue = noisesourceR * noisesourceR; + residue = residue % 170003; residue *= residue; + residue = residue % 17011; residue *= residue; + residue = residue % 1709; residue *= residue; + residue = residue % 173; residue *= residue; + residue = residue % 17; + applyresidue = residue; + applyresidue *= 0.00000001; + applyresidue *= 0.00000001; + inputSampleR += applyresidue; + if (inputSampleR<1.2e-38 && -inputSampleR<1.2e-38) { + inputSampleR -= applyresidue; + } + //for live air, we always apply the dither noise. Then, if our result is + //effectively digital black, we'll subtract it again. We want a 'air' hiss + double drySampleL = inputSampleL; + double drySampleR = inputSampleR; + + inputSampleL += feedbackL; + inputSampleR += feedbackR; + + inputSampleL = sin(inputSampleL); + inputSampleR = sin(inputSampleR); + + switch (stage){ + case 27: + case 26: + allpasstemp = alpA - 1; + if (allpasstemp < 0 || allpasstemp > delayA) {allpasstemp = delayA;} + inputSampleL -= aAL[allpasstemp]*0.5; + aAL[alpA] = inputSampleL; + inputSampleL *= 0.5; + + inputSampleR -= aAR[allpasstemp]*0.5; + aAR[alpA] = inputSampleR; + inputSampleR *= 0.5; + + alpA--; if (alpA < 0 || alpA > delayA) {alpA = delayA;} + inputSampleL += (aAL[alpA]); + inputSampleR += (aAR[alpA]); + if (damp > 26) { + avgtemp = inputSampleL; + inputSampleL += avgAL; + inputSampleL *= 0.5; + avgAL = avgtemp; + + avgtemp = inputSampleR; + inputSampleR += avgAR; + inputSampleR *= 0.5; + avgAR = avgtemp; + } + //allpass filter A + case 25: + allpasstemp = alpB - 1; + if (allpasstemp < 0 || allpasstemp > delayB) {allpasstemp = delayB;} + inputSampleL -= aBL[allpasstemp]*0.5; + aBL[alpB] = inputSampleL; + inputSampleL *= 0.5; + + inputSampleR -= aBR[allpasstemp]*0.5; + aBR[alpB] = inputSampleR; + inputSampleR *= 0.5; + + alpB--; if (alpB < 0 || alpB > delayB) {alpB = delayB;} + inputSampleL += (aBL[alpB]); + inputSampleR += (aBR[alpB]); + if (damp > 25) { + avgtemp = inputSampleL; + inputSampleL += avgBL; + inputSampleL *= 0.5; + avgBL = avgtemp; + + avgtemp = inputSampleR; + inputSampleR += avgBR; + inputSampleR *= 0.5; + avgBR = avgtemp; + } + //allpass filter B + case 24: + allpasstemp = alpC - 1; + if (allpasstemp < 0 || allpasstemp > delayC) {allpasstemp = delayC;} + inputSampleL -= aCL[allpasstemp]*0.5; + aCL[alpC] = inputSampleL; + inputSampleL *= 0.5; + + inputSampleR -= aCR[allpasstemp]*0.5; + aCR[alpC] = inputSampleR; + inputSampleR *= 0.5; + + alpC--; if (alpC < 0 || alpC > delayC) {alpC = delayC;} + inputSampleL += (aCL[alpC]); + inputSampleR += (aCR[alpC]); + if (damp > 24) { + avgtemp = inputSampleL; + inputSampleL += avgCL; + inputSampleL *= 0.5; + avgCL = avgtemp; + + avgtemp = inputSampleR; + inputSampleR += avgCR; + inputSampleR *= 0.5; + avgCR = avgtemp; + } + //allpass filter C + case 23: + allpasstemp = alpD - 1; + if (allpasstemp < 0 || allpasstemp > delayD) {allpasstemp = delayD;} + inputSampleL -= aDL[allpasstemp]*0.5; + aDL[alpD] = inputSampleL; + inputSampleL *= 0.5; + + inputSampleR -= aDR[allpasstemp]*0.5; + aDR[alpD] = inputSampleR; + inputSampleR *= 0.5; + + alpD--; if (alpD < 0 || alpD > delayD) {alpD = delayD;} + inputSampleL += (aDL[alpD]); + inputSampleR += (aDR[alpD]); + if (damp > 23) { + avgtemp = inputSampleL; + inputSampleL += avgDL; + inputSampleL *= 0.5; + avgDL = avgtemp; + + avgtemp = inputSampleR; + inputSampleR += avgDR; + inputSampleR *= 0.5; + avgDR = avgtemp; + } + //allpass filter D + case 22: + allpasstemp = alpE - 1; + if (allpasstemp < 0 || allpasstemp > delayE) {allpasstemp = delayE;} + inputSampleL -= aEL[allpasstemp]*0.5; + aEL[alpE] = inputSampleL; + inputSampleL *= 0.5; + + inputSampleR -= aER[allpasstemp]*0.5; + aER[alpE] = inputSampleR; + inputSampleR *= 0.5; + + alpE--; if (alpE < 0 || alpE > delayE) {alpE = delayE;} + inputSampleL += (aEL[alpE]); + inputSampleR += (aER[alpE]); + if (damp > 22) { + avgtemp = inputSampleL; + inputSampleL += avgEL; + inputSampleL *= 0.5; + avgEL = avgtemp; + + avgtemp = inputSampleR; + inputSampleR += avgER; + inputSampleR *= 0.5; + avgER = avgtemp; + } + //allpass filter E + case 21: + allpasstemp = alpF - 1; + if (allpasstemp < 0 || allpasstemp > delayF) {allpasstemp = delayF;} + inputSampleL -= aFL[allpasstemp]*0.5; + aFL[alpF] = inputSampleL; + inputSampleL *= 0.5; + + inputSampleR -= aFR[allpasstemp]*0.5; + aFR[alpF] = inputSampleR; + inputSampleR *= 0.5; + + alpF--; if (alpF < 0 || alpF > delayF) {alpF = delayF;} + inputSampleL += (aFL[alpF]); + inputSampleR += (aFR[alpF]); + if (damp > 21) { + avgtemp = inputSampleL; + inputSampleL += avgFL; + inputSampleL *= 0.5; + avgFL = avgtemp; + + avgtemp = inputSampleR; + inputSampleR += avgFR; + inputSampleR *= 0.5; + avgFR = avgtemp; + } + //allpass filter F + case 20: + allpasstemp = alpG - 1; + if (allpasstemp < 0 || allpasstemp > delayG) {allpasstemp = delayG;} + inputSampleL -= aGL[allpasstemp]*0.5; + aGL[alpG] = inputSampleL; + inputSampleL *= 0.5; + + inputSampleR -= aGR[allpasstemp]*0.5; + aGR[alpG] = inputSampleR; + inputSampleR *= 0.5; + + alpG--; if (alpG < 0 || alpG > delayG) {alpG = delayG;} + inputSampleL += (aGL[alpG]); + inputSampleR += (aGR[alpG]); + if (damp > 20) { + avgtemp = inputSampleL; + inputSampleL += avgGL; + inputSampleL *= 0.5; + avgGL = avgtemp; + + avgtemp = inputSampleR; + inputSampleR += avgGR; + inputSampleR *= 0.5; + avgGR = avgtemp; + } + //allpass filter G + case 19: + allpasstemp = alpH - 1; + if (allpasstemp < 0 || allpasstemp > delayH) {allpasstemp = delayH;} + inputSampleL -= aHL[allpasstemp]*0.5; + aHL[alpH] = inputSampleL; + inputSampleL *= 0.5; + + inputSampleR -= aHR[allpasstemp]*0.5; + aHR[alpH] = inputSampleR; + inputSampleR *= 0.5; + + alpH--; if (alpH < 0 || alpH > delayH) {alpH = delayH;} + inputSampleL += (aHL[alpH]); + inputSampleR += (aHR[alpH]); + if (damp > 19) { + avgtemp = inputSampleL; + inputSampleL += avgHL; + inputSampleL *= 0.5; + avgHL = avgtemp; + + avgtemp = inputSampleR; + inputSampleR += avgHR; + inputSampleR *= 0.5; + avgHR = avgtemp; + } + //allpass filter H + case 18: + allpasstemp = alpI - 1; + if (allpasstemp < 0 || allpasstemp > delayI) {allpasstemp = delayI;} + inputSampleL -= aIL[allpasstemp]*0.5; + aIL[alpI] = inputSampleL; + inputSampleL *= 0.5; + + inputSampleR -= aIR[allpasstemp]*0.5; + aIR[alpI] = inputSampleR; + inputSampleR *= 0.5; + + alpI--; if (alpI < 0 || alpI > delayI) {alpI = delayI;} + inputSampleL += (aIL[alpI]); + inputSampleR += (aIR[alpI]); + if (damp > 18) { + avgtemp = inputSampleL; + inputSampleL += avgIL; + inputSampleL *= 0.5; + avgIL = avgtemp; + + avgtemp = inputSampleR; + inputSampleR += avgIR; + inputSampleR *= 0.5; + avgIR = avgtemp; + } + //allpass filter I + case 17: + allpasstemp = alpJ - 1; + if (allpasstemp < 0 || allpasstemp > delayJ) {allpasstemp = delayJ;} + inputSampleL -= aJL[allpasstemp]*0.5; + aJL[alpJ] = inputSampleL; + inputSampleL *= 0.5; + + inputSampleR -= aJR[allpasstemp]*0.5; + aJR[alpJ] = inputSampleR; + inputSampleR *= 0.5; + + alpJ--; if (alpJ < 0 || alpJ > delayJ) {alpJ = delayJ;} + inputSampleL += (aJL[alpJ]); + inputSampleR += (aJR[alpJ]); + if (damp > 17) { + avgtemp = inputSampleL; + inputSampleL += avgJL; + inputSampleL *= 0.5; + avgJL = avgtemp; + + avgtemp = inputSampleR; + inputSampleR += avgJR; + inputSampleR *= 0.5; + avgJR = avgtemp; + } + //allpass filter J + case 16: + allpasstemp = alpK - 1; + if (allpasstemp < 0 || allpasstemp > delayK) {allpasstemp = delayK;} + inputSampleL -= aKL[allpasstemp]*0.5; + aKL[alpK] = inputSampleL; + inputSampleL *= 0.5; + + inputSampleR -= aKR[allpasstemp]*0.5; + aKR[alpK] = inputSampleR; + inputSampleR *= 0.5; + + alpK--; if (alpK < 0 || alpK > delayK) {alpK = delayK;} + inputSampleL += (aKL[alpK]); + inputSampleR += (aKR[alpK]); + if (damp > 16) { + avgtemp = inputSampleL; + inputSampleL += avgKL; + inputSampleL *= 0.5; + avgKL = avgtemp; + + avgtemp = inputSampleR; + inputSampleR += avgKR; + inputSampleR *= 0.5; + avgKR = avgtemp; + } + //allpass filter K + case 15: + allpasstemp = alpL - 1; + if (allpasstemp < 0 || allpasstemp > delayL) {allpasstemp = delayL;} + inputSampleL -= aLL[allpasstemp]*0.5; + aLL[alpL] = inputSampleL; + inputSampleL *= 0.5; + + inputSampleR -= aLR[allpasstemp]*0.5; + aLR[alpL] = inputSampleR; + inputSampleR *= 0.5; + + alpL--; if (alpL < 0 || alpL > delayL) {alpL = delayL;} + inputSampleL += (aLL[alpL]); + inputSampleR += (aLR[alpL]); + if (damp > 15) { + avgtemp = inputSampleL; + inputSampleL += avgLL; + inputSampleL *= 0.5; + avgLL = avgtemp; + + avgtemp = inputSampleR; + inputSampleR += avgLR; + inputSampleR *= 0.5; + avgLR = avgtemp; + } + //allpass filter L + case 14: + allpasstemp = alpM - 1; + if (allpasstemp < 0 || allpasstemp > delayM) {allpasstemp = delayM;} + inputSampleL -= aML[allpasstemp]*0.5; + aML[alpM] = inputSampleL; + inputSampleL *= 0.5; + + inputSampleR -= aMR[allpasstemp]*0.5; + aMR[alpM] = inputSampleR; + inputSampleR *= 0.5; + + alpM--; if (alpM < 0 || alpM > delayM) {alpM = delayM;} + inputSampleL += (aML[alpM]); + inputSampleR += (aMR[alpM]); + if (damp > 14) { + avgtemp = inputSampleL; + inputSampleL += avgML; + inputSampleL *= 0.5; + avgML = avgtemp; + + avgtemp = inputSampleR; + inputSampleR += avgMR; + inputSampleR *= 0.5; + avgMR = avgtemp; + } + //allpass filter M + case 13: + allpasstemp = alpN - 1; + if (allpasstemp < 0 || allpasstemp > delayN) {allpasstemp = delayN;} + inputSampleL -= aNL[allpasstemp]*0.5; + aNL[alpN] = inputSampleL; + inputSampleL *= 0.5; + + inputSampleR -= aNR[allpasstemp]*0.5; + aNR[alpN] = inputSampleR; + inputSampleR *= 0.5; + + alpN--; if (alpN < 0 || alpN > delayN) {alpN = delayN;} + inputSampleL += (aNL[alpN]); + inputSampleR += (aNR[alpN]); + if (damp > 13) { + avgtemp = inputSampleL; + inputSampleL += avgNL; + inputSampleL *= 0.5; + avgNL = avgtemp; + + avgtemp = inputSampleR; + inputSampleR += avgNR; + inputSampleR *= 0.5; + avgNR = avgtemp; + } + //allpass filter N + case 12: + allpasstemp = alpO - 1; + if (allpasstemp < 0 || allpasstemp > delayO) {allpasstemp = delayO;} + inputSampleL -= aOL[allpasstemp]*0.5; + aOL[alpO] = inputSampleL; + inputSampleL *= 0.5; + + inputSampleR -= aOR[allpasstemp]*0.5; + aOR[alpO] = inputSampleR; + inputSampleR *= 0.5; + + alpO--; if (alpO < 0 || alpO > delayO) {alpO = delayO;} + inputSampleL += (aOL[alpO]); + inputSampleR += (aOR[alpO]); + if (damp > 12) { + avgtemp = inputSampleL; + inputSampleL += avgOL; + inputSampleL *= 0.5; + avgOL = avgtemp; + + avgtemp = inputSampleR; + inputSampleR += avgOR; + inputSampleR *= 0.5; + avgOR = avgtemp; + } + //allpass filter O + case 11: + allpasstemp = alpP - 1; + if (allpasstemp < 0 || allpasstemp > delayP) {allpasstemp = delayP;} + inputSampleL -= aPL[allpasstemp]*0.5; + aPL[alpP] = inputSampleL; + inputSampleL *= 0.5; + + inputSampleR -= aPR[allpasstemp]*0.5; + aPR[alpP] = inputSampleR; + inputSampleR *= 0.5; + + alpP--; if (alpP < 0 || alpP > delayP) {alpP = delayP;} + inputSampleL += (aPL[alpP]); + inputSampleR += (aPR[alpP]); + if (damp > 11) { + avgtemp = inputSampleL; + inputSampleL += avgPL; + inputSampleL *= 0.5; + avgPL = avgtemp; + + avgtemp = inputSampleR; + inputSampleR += avgPR; + inputSampleR *= 0.5; + avgPR = avgtemp; + } + //allpass filter P + case 10: + allpasstemp = alpQ - 1; + if (allpasstemp < 0 || allpasstemp > delayQ) {allpasstemp = delayQ;} + inputSampleL -= aQL[allpasstemp]*0.5; + aQL[alpQ] = inputSampleL; + inputSampleL *= 0.5; + + inputSampleR -= aQR[allpasstemp]*0.5; + aQR[alpQ] = inputSampleR; + inputSampleR *= 0.5; + + alpQ--; if (alpQ < 0 || alpQ > delayQ) {alpQ = delayQ;} + inputSampleL += (aQL[alpQ]); + inputSampleR += (aQR[alpQ]); + if (damp > 10) { + avgtemp = inputSampleL; + inputSampleL += avgQL; + inputSampleL *= 0.5; + avgQL = avgtemp; + + avgtemp = inputSampleR; + inputSampleR += avgQR; + inputSampleR *= 0.5; + avgQR = avgtemp; + } + //allpass filter Q + case 9: + allpasstemp = alpR - 1; + if (allpasstemp < 0 || allpasstemp > delayR) {allpasstemp = delayR;} + inputSampleL -= aRL[allpasstemp]*0.5; + aRL[alpR] = inputSampleL; + inputSampleL *= 0.5; + + inputSampleR -= aRR[allpasstemp]*0.5; + aRR[alpR] = inputSampleR; + inputSampleR *= 0.5; + + alpR--; if (alpR < 0 || alpR > delayR) {alpR = delayR;} + inputSampleL += (aRL[alpR]); + inputSampleR += (aRR[alpR]); + if (damp > 9) { + avgtemp = inputSampleL; + inputSampleL += avgRL; + inputSampleL *= 0.5; + avgRL = avgtemp; + + avgtemp = inputSampleR; + inputSampleR += avgRR; + inputSampleR *= 0.5; + avgRR = avgtemp; + } + //allpass filter R + case 8: + allpasstemp = alpS - 1; + if (allpasstemp < 0 || allpasstemp > delayS) {allpasstemp = delayS;} + inputSampleL -= aSL[allpasstemp]*0.5; + aSL[alpS] = inputSampleL; + inputSampleL *= 0.5; + + inputSampleR -= aSR[allpasstemp]*0.5; + aSR[alpS] = inputSampleR; + inputSampleR *= 0.5; + + alpS--; if (alpS < 0 || alpS > delayS) {alpS = delayS;} + inputSampleL += (aSL[alpS]); + inputSampleR += (aSR[alpS]); + if (damp > 8) { + avgtemp = inputSampleL; + inputSampleL += avgSL; + inputSampleL *= 0.5; + avgSL = avgtemp; + + avgtemp = inputSampleR; + inputSampleR += avgSR; + inputSampleR *= 0.5; + avgSR = avgtemp; + } + //allpass filter S + case 7: + allpasstemp = alpT - 1; + if (allpasstemp < 0 || allpasstemp > delayT) {allpasstemp = delayT;} + inputSampleL -= aTL[allpasstemp]*0.5; + aTL[alpT] = inputSampleL; + inputSampleL *= 0.5; + + inputSampleR -= aTR[allpasstemp]*0.5; + aTR[alpT] = inputSampleR; + inputSampleR *= 0.5; + + alpT--; if (alpT < 0 || alpT > delayT) {alpT = delayT;} + inputSampleL += (aTL[alpT]); + inputSampleR += (aTR[alpT]); + if (damp > 7) { + avgtemp = inputSampleL; + inputSampleL += avgTL; + inputSampleL *= 0.5; + avgTL = avgtemp; + + avgtemp = inputSampleR; + inputSampleR += avgTR; + inputSampleR *= 0.5; + avgTR = avgtemp; + } + //allpass filter T + case 6: + allpasstemp = alpU - 1; + if (allpasstemp < 0 || allpasstemp > delayU) {allpasstemp = delayU;} + inputSampleL -= aUL[allpasstemp]*0.5; + aUL[alpU] = inputSampleL; + inputSampleL *= 0.5; + + inputSampleR -= aUR[allpasstemp]*0.5; + aUR[alpU] = inputSampleR; + inputSampleR *= 0.5; + + alpU--; if (alpU < 0 || alpU > delayU) {alpU = delayU;} + inputSampleL += (aUL[alpU]); + inputSampleR += (aUR[alpU]); + if (damp > 6) { + avgtemp = inputSampleL; + inputSampleL += avgUL; + inputSampleL *= 0.5; + avgUL = avgtemp; + + avgtemp = inputSampleR; + inputSampleR += avgUR; + inputSampleR *= 0.5; + avgUR = avgtemp; + } + //allpass filter U + case 5: + allpasstemp = alpV - 1; + if (allpasstemp < 0 || allpasstemp > delayV) {allpasstemp = delayV;} + inputSampleL -= aVL[allpasstemp]*0.5; + aVL[alpV] = inputSampleL; + inputSampleL *= 0.5; + + inputSampleR -= aVR[allpasstemp]*0.5; + aVR[alpV] = inputSampleR; + inputSampleR *= 0.5; + + alpV--; if (alpV < 0 || alpV > delayV) {alpV = delayV;} + inputSampleL += (aVL[alpV]); + inputSampleR += (aVR[alpV]); + if (damp > 5) { + avgtemp = inputSampleL; + inputSampleL += avgVL; + inputSampleL *= 0.5; + avgVL = avgtemp; + + avgtemp = inputSampleR; + inputSampleR += avgVR; + inputSampleR *= 0.5; + avgVR = avgtemp; + } + //allpass filter V + case 4: + allpasstemp = alpW - 1; + if (allpasstemp < 0 || allpasstemp > delayW) {allpasstemp = delayW;} + inputSampleL -= aWL[allpasstemp]*0.5; + aWL[alpW] = inputSampleL; + inputSampleL *= 0.5; + + inputSampleR -= aWR[allpasstemp]*0.5; + aWR[alpW] = inputSampleR; + inputSampleR *= 0.5; + + alpW--; if (alpW < 0 || alpW > delayW) {alpW = delayW;} + inputSampleL += (aWL[alpW]); + inputSampleR += (aWR[alpW]); + if (damp > 4) { + avgtemp = inputSampleL; + inputSampleL += avgWL; + inputSampleL *= 0.5; + avgWL = avgtemp; + + avgtemp = inputSampleR; + inputSampleR += avgWR; + inputSampleR *= 0.5; + avgWR = avgtemp; + } + //allpass filter W + case 3: + allpasstemp = alpX - 1; + if (allpasstemp < 0 || allpasstemp > delayX) {allpasstemp = delayX;} + inputSampleL -= aXL[allpasstemp]*0.5; + aXL[alpX] = inputSampleL; + inputSampleL *= 0.5; + + inputSampleR -= aXR[allpasstemp]*0.5; + aXR[alpX] = inputSampleR; + inputSampleR *= 0.5; + + alpX--; if (alpX < 0 || alpX > delayX) {alpX = delayX;} + inputSampleL += (aXL[alpX]); + inputSampleR += (aXR[alpX]); + if (damp > 3) { + avgtemp = inputSampleL; + inputSampleL += avgXL; + inputSampleL *= 0.5; + avgXL = avgtemp; + + avgtemp = inputSampleR; + inputSampleR += avgXR; + inputSampleR *= 0.5; + avgXR = avgtemp; + } + //allpass filter X + case 2: + allpasstemp = alpY - 1; + if (allpasstemp < 0 || allpasstemp > delayY) {allpasstemp = delayY;} + inputSampleL -= aYL[allpasstemp]*0.5; + aYL[alpY] = inputSampleL; + inputSampleL *= 0.5; + + inputSampleR -= aYR[allpasstemp]*0.5; + aYR[alpY] = inputSampleR; + inputSampleR *= 0.5; + + alpY--; if (alpY < 0 || alpY > delayY) {alpY = delayY;} + inputSampleL += (aYL[alpY]); + inputSampleR += (aYR[alpY]); + if (damp > 2) { + avgtemp = inputSampleL; + inputSampleL += avgYL; + inputSampleL *= 0.5; + avgYL = avgtemp; + + avgtemp = inputSampleR; + inputSampleR += avgYR; + inputSampleR *= 0.5; + avgYR = avgtemp; + } + //allpass filter Y + case 1: + allpasstemp = alpZ - 1; + if (allpasstemp < 0 || allpasstemp > delayZ) {allpasstemp = delayZ;} + inputSampleL -= aZL[allpasstemp]*0.5; + aZL[alpZ] = inputSampleL; + inputSampleL *= 0.5; + + inputSampleR -= aZR[allpasstemp]*0.5; + aZR[alpZ] = inputSampleR; + inputSampleR *= 0.5; + + alpZ--; if (alpZ < 0 || alpZ > delayZ) {alpZ = delayZ;} + inputSampleL += (aZL[alpZ]); + inputSampleR += (aZR[alpZ]); + if (damp > 1) { + avgtemp = inputSampleL; + inputSampleL += avgZL; + inputSampleL *= 0.5; + avgZL = avgtemp; + + avgtemp = inputSampleR; + inputSampleR += avgZR; + inputSampleR *= 0.5; + avgZR = avgtemp; + } + //allpass filter Z + } + + feedbackL = inputSampleL * feedbacklevel; + feedbackR = inputSampleR * feedbacklevel; + + if (gain != 1.0) { + inputSampleL *= gain; + inputSampleR *= gain; + } + //we can pad with the gain to tame distortyness from the PurestConsole code + + if (inputSampleL > 1.0) inputSampleL = 1.0; + if (inputSampleL < -1.0) inputSampleL = -1.0; + 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! + + inputSampleL = asin(inputSampleL); + inputSampleR = asin(inputSampleR); + + + if (wet !=1.0) { + inputSampleL = (inputSampleL * wet) + (drySampleL * (1.0-wet)); + inputSampleR = (inputSampleR * wet) + (drySampleR * (1.0-wet)); + } + //Dry/Wet control, defaults to the last slider + + //begin 64 bit stereo floating point dither + int expon; frexp((double)inputSampleL, &expon); + fpd ^= fpd << 13; fpd ^= fpd >> 17; fpd ^= fpd << 5; + inputSampleL += static_cast<int32_t>(fpd) * 1.110223024625156e-44L * pow(2,expon+62); + frexp((double)inputSampleR, &expon); + fpd ^= fpd << 13; fpd ^= fpd >> 17; fpd ^= fpd << 5; + inputSampleR += static_cast<int32_t>(fpd) * 1.110223024625156e-44L * pow(2,expon+62); + //end 64 bit stereo floating point dither + + *out1 = inputSampleL; + *out2 = inputSampleR; + + *in1++; + *in2++; + *out1++; + *out2++; + } +} |