mirror of
https://github.com/airwindows/airwindows.git
synced 2026-05-15 22:01:19 -06:00
1292 lines
44 KiB
C++
Executable file
1292 lines
44 KiB
C++
Executable file
/* ========================================
|
|
* Energy2 - Energy2.h
|
|
* Copyright (c) 2016 airwindows, Airwindows uses the MIT license
|
|
* ======================================== */
|
|
|
|
#ifndef __Energy2_H
|
|
#include "Energy2.h"
|
|
#endif
|
|
|
|
void Energy2::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();
|
|
int cycleEnd = floor(overallscale);
|
|
if (cycleEnd < 1) cycleEnd = 1;
|
|
if (cycleEnd > 4) cycleEnd = 4;
|
|
//this is going to be 2 for 88.1 or 96k, 3 for silly people, 4 for 176 or 192k
|
|
if (cycle > cycleEnd-1) cycle = cycleEnd-1; //sanity check
|
|
|
|
double duoIntensity = -pow((A*2.0)-1.0,3);
|
|
double tripletIntensity = -pow((B*2.0)-1.0,3);
|
|
double quadIntensity = -pow((C*2.0)-1.0,3);
|
|
double quintIntensity = -pow((D*2.0)-1.0,3);
|
|
double sextIntensity = -pow((E*2.0)-1.0,3);
|
|
double septIntensity = -pow((F*2.0)-1.0,3);
|
|
double octIntensity = -pow((G*2.0)-1.0,3);
|
|
double nintIntensity = -pow((H*2.0)-1.0,3);
|
|
double mix = (I*2.0)-1.0;
|
|
//all types of air band are running in parallel, not series
|
|
|
|
while (--sampleFrames >= 0)
|
|
{
|
|
double inputSampleL = *in1;
|
|
double inputSampleR = *in2;
|
|
if (fabs(inputSampleL)<1.18e-23) inputSampleL = fpdL * 1.18e-17;
|
|
if (fabs(inputSampleR)<1.18e-23) inputSampleR = fpdR * 1.18e-17;
|
|
double drySampleL = inputSampleL;
|
|
double drySampleR = inputSampleR;
|
|
|
|
cycle++;
|
|
if (cycle == cycleEnd) { //hit the end point and we do an Energy sample
|
|
double correctionL = 0.0;
|
|
double correctionR = 0.0;
|
|
|
|
if (fabs(duoIntensity) > 0.0001) {
|
|
duoFactorL = PrevAL - inputSampleL;
|
|
duoFactorR = PrevAR - inputSampleR;
|
|
if (flip)
|
|
{
|
|
duoEvenL += duoFactorL; duoOddL -= duoFactorL;
|
|
duoFactorL = duoEvenL * duoIntensity;
|
|
|
|
duoEvenR += duoFactorR; duoOddR -= duoFactorR;
|
|
duoFactorR = duoEvenR * duoIntensity;
|
|
}
|
|
else
|
|
{
|
|
duoOddL += duoFactorL; duoEvenL -= duoFactorL;
|
|
duoFactorL = duoOddL * duoIntensity;
|
|
|
|
duoOddR += duoFactorR; duoEvenR -= duoFactorR;
|
|
duoFactorR = duoOddR * duoIntensity;
|
|
}
|
|
duoOddL = (duoOddL - ((duoOddL - duoEvenL)/256.0)) / 2.0;
|
|
duoEvenL = (duoEvenL - ((duoEvenL - duoOddL)/256.0)) / 2.0;
|
|
correctionL = correctionL + duoFactorL;
|
|
|
|
duoOddR = (duoOddR - ((duoOddR - duoEvenR)/256.0)) / 2.0;
|
|
duoEvenR = (duoEvenR - ((duoEvenR - duoOddR)/256.0)) / 2.0;
|
|
correctionR = correctionR + duoFactorR;
|
|
flip = !flip;
|
|
}//finished duo section
|
|
|
|
|
|
if (fabs(tripletIntensity) > 0.0001) {
|
|
if (countA < 1 || countA > 3) countA = 1;
|
|
switch (countA)
|
|
{
|
|
case 1:
|
|
tripletFactorL = PrevBL - inputSampleL;
|
|
tripletAL += tripletFactorL; tripletCL -= tripletFactorL;
|
|
tripletFactorL = tripletAL * tripletIntensity;
|
|
|
|
tripletFactorR = PrevBR - inputSampleR;
|
|
tripletAR += tripletFactorR; tripletCR -= tripletFactorR;
|
|
tripletFactorR = tripletAR * tripletIntensity;
|
|
break;
|
|
case 2:
|
|
tripletFactorL = PrevBL - inputSampleL;
|
|
tripletBL += tripletFactorL; tripletAL -= tripletFactorL;
|
|
tripletFactorL = tripletBL * tripletIntensity;
|
|
|
|
tripletFactorR = PrevBR - inputSampleR;
|
|
tripletBR += tripletFactorR; tripletAR -= tripletFactorR;
|
|
tripletFactorR = tripletBR * tripletIntensity;
|
|
break;
|
|
case 3:
|
|
tripletFactorL = PrevBL - inputSampleL;
|
|
tripletCL += tripletFactorL; tripletBL -= tripletFactorL;
|
|
tripletFactorL = tripletCL * tripletIntensity;
|
|
|
|
tripletFactorR = PrevBR - inputSampleR;
|
|
tripletCR += tripletFactorR; tripletBR -= tripletFactorR;
|
|
tripletFactorR = tripletCR * tripletIntensity;
|
|
break;
|
|
}
|
|
tripletAL /= 2.0; tripletBL /= 2.0; tripletCL /= 2.0;
|
|
correctionL = correctionL + tripletFactorL;
|
|
|
|
tripletAR /= 2.0; tripletBR /= 2.0; tripletCR /= 2.0;
|
|
correctionR = correctionR + tripletFactorR;
|
|
countA++;
|
|
}//finished triplet section- 15K
|
|
|
|
if (fabs(quadIntensity) > 0.0001) {
|
|
if (countB < 1 || countB > 4) countB = 1;
|
|
switch (countB)
|
|
{
|
|
case 1:
|
|
quadFactorL = PrevCL - inputSampleL;
|
|
quadAL += quadFactorL; quadDL -= quadFactorL;
|
|
quadFactorL = quadAL * quadIntensity;
|
|
|
|
quadFactorR = PrevCR - inputSampleR;
|
|
quadAR += quadFactorR; quadDR -= quadFactorR;
|
|
quadFactorR = quadAR * quadIntensity;
|
|
break;
|
|
case 2:
|
|
quadFactorL = PrevCL - inputSampleL;
|
|
quadBL += quadFactorL; quadAL -= quadFactorL;
|
|
quadFactorL = quadBL * quadIntensity;
|
|
|
|
quadFactorR = PrevCR - inputSampleR;
|
|
quadBR += quadFactorR; quadAR -= quadFactorR;
|
|
quadFactorR = quadBR * quadIntensity;
|
|
break;
|
|
case 3:
|
|
quadFactorL = PrevCL - inputSampleL;
|
|
quadCL += quadFactorL; quadBL -= quadFactorL;
|
|
quadFactorL = quadCL * quadIntensity;
|
|
|
|
quadFactorR = PrevCR - inputSampleR;
|
|
quadCR += quadFactorR; quadBR -= quadFactorR;
|
|
quadFactorR = quadCR * quadIntensity;
|
|
break;
|
|
case 4:
|
|
quadFactorL = PrevCL - inputSampleL;
|
|
quadDL += quadFactorL; quadCL -= quadFactorL;
|
|
quadFactorL = quadDL * quadIntensity;
|
|
|
|
quadFactorR = PrevCR - inputSampleR;
|
|
quadDR += quadFactorR; quadCR -= quadFactorR;
|
|
quadFactorR = quadDR * quadIntensity;
|
|
break;
|
|
}
|
|
quadAL /= 2.0; quadBL /= 2.0; quadCL /= 2.0; quadDL /= 2.0;
|
|
correctionL = correctionL + quadFactorL;
|
|
|
|
quadAR /= 2.0; quadBR /= 2.0; quadCR /= 2.0; quadDR /= 2.0;
|
|
correctionR = correctionR + quadFactorR;
|
|
countB++;
|
|
}//finished quad section- 10K
|
|
|
|
if (fabs(quintIntensity) > 0.0001) {
|
|
if (countC < 1 || countC > 5) countC = 1;
|
|
switch (countC)
|
|
{
|
|
case 1:
|
|
quintFactorL = PrevDL - inputSampleL;
|
|
quintAL += quintFactorL; quintEL -= quintFactorL;
|
|
quintFactorL = quintAL * quintIntensity;
|
|
|
|
quintFactorR = PrevDR - inputSampleR;
|
|
quintAR += quintFactorR; quintER -= quintFactorR;
|
|
quintFactorR = quintAR * quintIntensity;
|
|
break;
|
|
case 2:
|
|
quintFactorL = PrevDL - inputSampleL;
|
|
quintBL += quintFactorL; quintAL -= quintFactorL;
|
|
quintFactorL = quintBL * quintIntensity;
|
|
|
|
quintFactorR = PrevDR - inputSampleR;
|
|
quintBR += quintFactorR; quintAR -= quintFactorR;
|
|
quintFactorR = quintBR * quintIntensity;
|
|
break;
|
|
case 3:
|
|
quintFactorL = PrevDL - inputSampleL;
|
|
quintCL += quintFactorL; quintBL -= quintFactorL;
|
|
quintFactorL = quintCL * quintIntensity;
|
|
|
|
quintFactorR = PrevDR - inputSampleR;
|
|
quintCR += quintFactorR; quintBR -= quintFactorR;
|
|
quintFactorR = quintCR * quintIntensity;
|
|
break;
|
|
case 4:
|
|
quintFactorL = PrevDL - inputSampleL;
|
|
quintDL += quintFactorL; quintCL -= quintFactorL;
|
|
quintFactorL = quintDL * quintIntensity;
|
|
|
|
quintFactorR = PrevDR - inputSampleR;
|
|
quintDR += quintFactorR; quintCR -= quintFactorR;
|
|
quintFactorR = quintDR * quintIntensity;
|
|
break;
|
|
case 5:
|
|
quintFactorL = PrevDL - inputSampleL;
|
|
quintEL += quintFactorL; quintDL -= quintFactorL;
|
|
quintFactorL = quintEL * quintIntensity;
|
|
|
|
quintFactorR = PrevDR - inputSampleR;
|
|
quintER += quintFactorR; quintDR -= quintFactorR;
|
|
quintFactorR = quintER * quintIntensity;
|
|
break;
|
|
}
|
|
quintAL /= 2.0; quintBL /= 2.0; quintCL /= 2.0; quintDL /= 2.0; quintEL /= 2.0;
|
|
correctionL = correctionL + quintFactorL;
|
|
|
|
quintAR /= 2.0; quintBR /= 2.0; quintCR /= 2.0; quintDR /= 2.0; quintER /= 2.0;
|
|
correctionR = correctionR + quintFactorR;
|
|
countC++;
|
|
}//finished quint section- 8K
|
|
|
|
if (fabs(sextIntensity) > 0.0001) {
|
|
if (countD < 1 || countD > 6) countD = 1;
|
|
switch (countD)
|
|
{
|
|
case 1:
|
|
sextFactorL = PrevEL - inputSampleL;
|
|
sextAL += sextFactorL; sextFL -= sextFactorL;
|
|
sextFactorL = sextAL * sextIntensity;
|
|
|
|
sextFactorR = PrevER - inputSampleR;
|
|
sextAR += sextFactorR; sextFR -= sextFactorR;
|
|
sextFactorR = sextAR * sextIntensity;
|
|
break;
|
|
case 2:
|
|
sextFactorL = PrevEL - inputSampleL;
|
|
sextBL += sextFactorL; sextAL -= sextFactorL;
|
|
sextFactorL = sextBL * sextIntensity;
|
|
|
|
sextFactorR = PrevER - inputSampleR;
|
|
sextBR += sextFactorR; sextAR -= sextFactorR;
|
|
sextFactorR = sextBR * sextIntensity;
|
|
break;
|
|
case 3:
|
|
sextFactorL = PrevEL - inputSampleL;
|
|
sextCL += sextFactorL; sextBL -= sextFactorL;
|
|
sextFactorL = sextCL * sextIntensity;
|
|
|
|
sextFactorR = PrevER - inputSampleR;
|
|
sextCR += sextFactorR; sextBR -= sextFactorR;
|
|
sextFactorR = sextCR * sextIntensity;
|
|
break;
|
|
case 4:
|
|
sextFactorL = PrevEL - inputSampleL;
|
|
sextDL += sextFactorL; sextCL -= sextFactorL;
|
|
sextFactorL = sextDL * sextIntensity;
|
|
|
|
sextFactorR = PrevER - inputSampleR;
|
|
sextDR += sextFactorR; sextCR -= sextFactorR;
|
|
sextFactorR = sextDR * sextIntensity;
|
|
break;
|
|
case 5:
|
|
sextFactorL = PrevEL - inputSampleL;
|
|
sextEL += sextFactorL; sextDL -= sextFactorL;
|
|
sextFactorL = sextEL * sextIntensity;
|
|
|
|
sextFactorR = PrevER - inputSampleR;
|
|
sextER += sextFactorR; sextDR -= sextFactorR;
|
|
sextFactorR = sextER * sextIntensity;
|
|
break;
|
|
case 6:
|
|
sextFactorL = PrevEL - inputSampleL;
|
|
sextFL += sextFactorL; sextEL -= sextFactorL;
|
|
sextFactorL = sextFL * sextIntensity;
|
|
|
|
sextFactorR = PrevER - inputSampleR;
|
|
sextFR += sextFactorR; sextER -= sextFactorR;
|
|
sextFactorR = sextFR * sextIntensity;
|
|
break;
|
|
}
|
|
sextAL /= 2.0; sextBL /= 2.0; sextCL /= 2.0;
|
|
sextDL /= 2.0; sextEL /= 2.0; sextFL /= 2.0;
|
|
correctionL = correctionL + sextFactorL;
|
|
|
|
sextAR /= 2.0; sextBR /= 2.0; sextCR /= 2.0;
|
|
sextDR /= 2.0; sextER /= 2.0; sextFR /= 2.0;
|
|
correctionR = correctionR + sextFactorR;
|
|
countD++;
|
|
}//finished sext section- 6K
|
|
|
|
if (fabs(septIntensity) > 0.0001) {
|
|
if (countE < 1 || countE > 7) countE = 1;
|
|
switch (countE)
|
|
{
|
|
case 1:
|
|
septFactorL = PrevFL - inputSampleL;
|
|
septAL += septFactorL; septGL -= septFactorL;
|
|
septFactorL = septAL * septIntensity;
|
|
|
|
septFactorR = PrevFR - inputSampleR;
|
|
septAR += septFactorR; septGR -= septFactorR;
|
|
septFactorR = septAR * septIntensity;
|
|
break;
|
|
case 2:
|
|
septFactorL = PrevFL - inputSampleL;
|
|
septBL += septFactorL; septAL -= septFactorL;
|
|
septFactorL = septBL * septIntensity;
|
|
|
|
septFactorR = PrevFR - inputSampleR;
|
|
septBR += septFactorR; septAR -= septFactorR;
|
|
septFactorR = septBR * septIntensity;
|
|
break;
|
|
case 3:
|
|
septFactorL = PrevFL - inputSampleL;
|
|
septCL += septFactorL; septBL -= septFactorL;
|
|
septFactorL = septCL * septIntensity;
|
|
|
|
septFactorR = PrevFR - inputSampleR;
|
|
septCR += septFactorR; septBR -= septFactorR;
|
|
septFactorR = septCR * septIntensity;
|
|
break;
|
|
case 4:
|
|
septFactorL = PrevFL - inputSampleL;
|
|
septDL += septFactorL; septCL -= septFactorL;
|
|
septFactorL = septDL * septIntensity;
|
|
|
|
septFactorR = PrevFR - inputSampleR;
|
|
septDR += septFactorR; septCR -= septFactorR;
|
|
septFactorR = septDR * septIntensity;
|
|
break;
|
|
case 5:
|
|
septFactorL = PrevFL - inputSampleL;
|
|
septEL += septFactorL; septDL -= septFactorL;
|
|
septFactorL = septEL * septIntensity;
|
|
|
|
septFactorR = PrevFR - inputSampleR;
|
|
septER += septFactorR; septDR -= septFactorR;
|
|
septFactorR = septER * septIntensity;
|
|
break;
|
|
case 6:
|
|
septFactorL = PrevFL - inputSampleL;
|
|
septFL += septFactorL; septEL -= septFactorL;
|
|
septFactorL = septFL * septIntensity;
|
|
|
|
septFactorR = PrevFR - inputSampleR;
|
|
septFR += septFactorR; septER -= septFactorR;
|
|
septFactorR = septFR * septIntensity;
|
|
break;
|
|
case 7:
|
|
septFactorL = PrevFL - inputSampleL;
|
|
septGL += septFactorL; septFL -= septFactorL;
|
|
septFactorL = septGL * septIntensity;
|
|
|
|
septFactorR = PrevFR - inputSampleR;
|
|
septGR += septFactorR; septFR -= septFactorR;
|
|
septFactorR = septGR * septIntensity;
|
|
break;
|
|
}
|
|
septAL /= 2.0; septBL /= 2.0; septCL /= 2.0; septDL /= 2.0;
|
|
septEL /= 2.0; septFL /= 2.0; septGL /= 2.0;
|
|
correctionL = correctionL + septFactorL;
|
|
|
|
septAR /= 2.0; septBR /= 2.0; septCR /= 2.0; septDR /= 2.0;
|
|
septER /= 2.0; septFR /= 2.0; septGR /= 2.0;
|
|
correctionR = correctionR + septFactorR;
|
|
countE++;
|
|
}//finished sept section- 5K
|
|
|
|
if (fabs(octIntensity) > 0.0001) {
|
|
if (countF < 1 || countF > 8) countF = 1;
|
|
switch (countF)
|
|
{
|
|
case 1:
|
|
octFactorL = PrevGL - inputSampleL;
|
|
octAL += octFactorL; octHL -= octFactorL;
|
|
octFactorL = octAL * octIntensity;
|
|
|
|
octFactorR = PrevGR - inputSampleR;
|
|
octAR += octFactorR; octHR -= octFactorR;
|
|
octFactorR = octAR * octIntensity;
|
|
break;
|
|
case 2:
|
|
octFactorL = PrevGL - inputSampleL;
|
|
octBL += octFactorL; octAL -= octFactorL;
|
|
octFactorL = octBL * octIntensity;
|
|
|
|
octFactorR = PrevGR - inputSampleR;
|
|
octBR += octFactorR; octAR -= octFactorR;
|
|
octFactorR = octBR * octIntensity;
|
|
break;
|
|
case 3:
|
|
octFactorL = PrevGL - inputSampleL;
|
|
octCL += octFactorL; octBL -= octFactorL;
|
|
octFactorL = octCL * octIntensity;
|
|
|
|
octFactorR = PrevGR - inputSampleR;
|
|
octCR += octFactorR; octBR -= octFactorR;
|
|
octFactorR = octCR * octIntensity;
|
|
break;
|
|
case 4:
|
|
octFactorL = PrevGL - inputSampleL;
|
|
octDL += octFactorL; octCL -= octFactorL;
|
|
octFactorL = octDL * octIntensity;
|
|
|
|
octFactorR = PrevGR - inputSampleR;
|
|
octDR += octFactorR; octCR -= octFactorR;
|
|
octFactorR = octDR * octIntensity;
|
|
break;
|
|
case 5:
|
|
octFactorL = PrevGL - inputSampleL;
|
|
octEL += octFactorL; octDL -= octFactorL;
|
|
octFactorL = octEL * octIntensity;
|
|
|
|
octFactorR = PrevGR - inputSampleR;
|
|
octER += octFactorR; octDR -= octFactorR;
|
|
octFactorR = octER * octIntensity;
|
|
break;
|
|
case 6:
|
|
octFactorL = PrevGL - inputSampleL;
|
|
octFL += octFactorL; octEL -= octFactorL;
|
|
octFactorL = octFL * octIntensity;
|
|
|
|
octFactorR = PrevGR - inputSampleR;
|
|
octFR += octFactorR; octER -= octFactorR;
|
|
octFactorR = octFR * octIntensity;
|
|
break;
|
|
case 7:
|
|
octFactorL = PrevGL - inputSampleL;
|
|
octGL += octFactorL; octFL -= octFactorL;
|
|
octFactorL = octGL * octIntensity;
|
|
|
|
octFactorR = PrevGR - inputSampleR;
|
|
octGR += octFactorR; octFR -= octFactorR;
|
|
octFactorR = octGR * octIntensity;
|
|
break;
|
|
case 8:
|
|
octFactorL = PrevGL - inputSampleL;
|
|
octHL += octFactorL; octGL -= octFactorL;
|
|
octFactorL = octHL * octIntensity;
|
|
|
|
octFactorR = PrevGR - inputSampleR;
|
|
octHR += octFactorR; octGR -= octFactorR;
|
|
octFactorR = octHR * octIntensity;
|
|
break;
|
|
}
|
|
octAL /= 2.0; octBL /= 2.0; octCL /= 2.0; octDL /= 2.0;
|
|
octEL /= 2.0; octFL /= 2.0; octGL /= 2.0; octHL /= 2.0;
|
|
correctionL = correctionL + octFactorL;
|
|
|
|
octAR /= 2.0; octBR /= 2.0; octCR /= 2.0; octDR /= 2.0;
|
|
octER /= 2.0; octFR /= 2.0; octGR /= 2.0; octHR /= 2.0;
|
|
correctionR = correctionR + octFactorR;
|
|
countF++;
|
|
}//finished oct section- 4K
|
|
|
|
if (fabs(nintIntensity) > 0.0001) {
|
|
if (countG < 1 || countG > 9) countG = 1;
|
|
switch (countG)
|
|
{
|
|
case 1:
|
|
nintFactorL = PrevHL - inputSampleL;
|
|
nintAL += nintFactorL; nintIL -= nintFactorL;
|
|
nintFactorL = nintAL * nintIntensity;
|
|
|
|
nintFactorR = PrevHR - inputSampleR;
|
|
nintAR += nintFactorR; nintIR -= nintFactorR;
|
|
nintFactorR = nintAR * nintIntensity;
|
|
break;
|
|
case 2:
|
|
nintFactorL = PrevHL - inputSampleL;
|
|
nintBL += nintFactorL; nintAL -= nintFactorL;
|
|
nintFactorL = nintBL * nintIntensity;
|
|
|
|
nintFactorR = PrevHR - inputSampleR;
|
|
nintBR += nintFactorR; nintAR -= nintFactorR;
|
|
nintFactorR = nintBR * nintIntensity;
|
|
break;
|
|
case 3:
|
|
nintFactorL = PrevHL - inputSampleL;
|
|
nintCL += nintFactorL; nintBL -= nintFactorL;
|
|
nintFactorL = nintCL * nintIntensity;
|
|
|
|
nintFactorR = PrevHR - inputSampleR;
|
|
nintCR += nintFactorR; nintBR -= nintFactorR;
|
|
nintFactorR = nintCR * nintIntensity;
|
|
break;
|
|
case 4:
|
|
nintFactorL = PrevHL - inputSampleL;
|
|
nintDL += nintFactorL; nintCL -= nintFactorL;
|
|
nintFactorL = nintDL * nintIntensity;
|
|
|
|
nintFactorR = PrevHR - inputSampleR;
|
|
nintDR += nintFactorR; nintCR -= nintFactorR;
|
|
nintFactorR = nintDR * nintIntensity;
|
|
break;
|
|
case 5:
|
|
nintFactorL = PrevHL - inputSampleL;
|
|
nintEL += nintFactorL; nintDL -= nintFactorL;
|
|
nintFactorL = nintEL * nintIntensity;
|
|
|
|
nintFactorR = PrevHR - inputSampleR;
|
|
nintER += nintFactorR; nintDR -= nintFactorR;
|
|
nintFactorR = nintER * nintIntensity;
|
|
break;
|
|
case 6:
|
|
nintFactorL = PrevHL - inputSampleL;
|
|
nintFL += nintFactorL; nintEL -= nintFactorL;
|
|
nintFactorL = nintFL * nintIntensity;
|
|
|
|
nintFactorR = PrevHR - inputSampleR;
|
|
nintFR += nintFactorR; nintER -= nintFactorR;
|
|
nintFactorR = nintFR * nintIntensity;
|
|
break;
|
|
case 7:
|
|
nintFactorL = PrevHL - inputSampleL;
|
|
nintGL += nintFactorL; nintFL -= nintFactorL;
|
|
nintFactorL = nintGL * nintIntensity;
|
|
|
|
nintFactorR = PrevHR - inputSampleR;
|
|
nintGR += nintFactorR; nintFR -= nintFactorR;
|
|
nintFactorR = nintGR * nintIntensity;
|
|
break;
|
|
case 8:
|
|
nintFactorL = PrevHL - inputSampleL;
|
|
nintHL += nintFactorL; nintGL -= nintFactorL;
|
|
nintFactorL = nintHL * nintIntensity;
|
|
|
|
nintFactorR = PrevHR - inputSampleR;
|
|
nintHR += nintFactorR; nintGR -= nintFactorR;
|
|
nintFactorR = nintHR * nintIntensity;
|
|
break;
|
|
case 9:
|
|
nintFactorL = PrevHL - inputSampleL;
|
|
nintIL += nintFactorL; nintHL -= nintFactorL;
|
|
nintFactorL = nintIL * nintIntensity;
|
|
|
|
nintFactorR = PrevHR - inputSampleR;
|
|
nintIR += nintFactorR; nintHR -= nintFactorR;
|
|
nintFactorR = nintIR * nintIntensity;
|
|
break;
|
|
}
|
|
nintAL /= 2.0; nintBL /= 2.0; nintCL /= 2.0; nintDL /= 2.0; nintEL /= 2.0;
|
|
nintFL /= 2.0; nintGL /= 2.0; nintHL /= 2.0; nintIL /= 2.0;
|
|
correctionL = correctionL + nintFactorL;
|
|
|
|
nintAR /= 2.0; nintBR /= 2.0; nintCR /= 2.0; nintDR /= 2.0; nintER /= 2.0;
|
|
nintFR /= 2.0; nintGR /= 2.0; nintHR /= 2.0; nintIR /= 2.0;
|
|
correctionR = correctionR + nintFactorR;
|
|
countG++;
|
|
}//finished nint section- 3K
|
|
|
|
PrevHL = PrevGL; PrevGL = PrevFL; PrevFL = PrevEL; PrevEL = PrevDL;
|
|
PrevDL = PrevCL; PrevCL = PrevBL; PrevBL = PrevAL; PrevAL = inputSampleL;
|
|
|
|
PrevHR = PrevGR; PrevGR = PrevFR; PrevFR = PrevER; PrevER = PrevDR;
|
|
PrevDR = PrevCR; PrevCR = PrevBR; PrevBR = PrevAR; PrevAR = inputSampleR;
|
|
|
|
inputSampleL = correctionL * mix;
|
|
inputSampleR = correctionR * mix;
|
|
|
|
if (cycleEnd == 4) {
|
|
lastRefL[0] = lastRefL[4]; //start from previous last
|
|
lastRefL[2] = (lastRefL[0] + inputSampleL)/2; //half
|
|
lastRefL[1] = (lastRefL[0] + lastRefL[2])/2; //one quarter
|
|
lastRefL[3] = (lastRefL[2] + inputSampleL)/2; //three quarters
|
|
lastRefL[4] = inputSampleL; //full
|
|
lastRefR[0] = lastRefR[4]; //start from previous last
|
|
lastRefR[2] = (lastRefR[0] + inputSampleR)/2; //half
|
|
lastRefR[1] = (lastRefR[0] + lastRefR[2])/2; //one quarter
|
|
lastRefR[3] = (lastRefR[2] + inputSampleR)/2; //three quarters
|
|
lastRefR[4] = inputSampleR; //full
|
|
}
|
|
if (cycleEnd == 3) {
|
|
lastRefL[0] = lastRefL[3]; //start from previous last
|
|
lastRefL[2] = (lastRefL[0]+lastRefL[0]+inputSampleL)/3; //third
|
|
lastRefL[1] = (lastRefL[0]+inputSampleL+inputSampleL)/3; //two thirds
|
|
lastRefL[3] = inputSampleL; //full
|
|
lastRefR[0] = lastRefR[3]; //start from previous last
|
|
lastRefR[2] = (lastRefR[0]+lastRefR[0]+inputSampleR)/3; //third
|
|
lastRefR[1] = (lastRefR[0]+inputSampleR+inputSampleR)/3; //two thirds
|
|
lastRefR[3] = inputSampleR; //full
|
|
}
|
|
if (cycleEnd == 2) {
|
|
lastRefL[0] = lastRefL[2]; //start from previous last
|
|
lastRefL[1] = (lastRefL[0] + inputSampleL)/2; //half
|
|
lastRefL[2] = inputSampleL; //full
|
|
lastRefR[0] = lastRefR[2]; //start from previous last
|
|
lastRefR[1] = (lastRefR[0] + inputSampleR)/2; //half
|
|
lastRefR[2] = inputSampleR; //full
|
|
}
|
|
if (cycleEnd == 1) {
|
|
lastRefL[0] = inputSampleL;
|
|
lastRefR[0] = inputSampleR;
|
|
}
|
|
cycle = 0; //reset
|
|
inputSampleL = lastRefL[cycle];
|
|
inputSampleR = lastRefR[cycle];
|
|
} else {
|
|
inputSampleL = lastRefL[cycle];
|
|
inputSampleR = lastRefR[cycle];
|
|
//we are going through our references now
|
|
}
|
|
switch (cycleEnd) //multi-pole average using lastRef[] variables
|
|
{
|
|
case 4:
|
|
lastRefL[8] = inputSampleL; inputSampleL = (inputSampleL+lastRefL[7])*0.5;
|
|
lastRefL[7] = lastRefL[8]; //continue, do not break
|
|
lastRefR[8] = inputSampleR; inputSampleR = (inputSampleR+lastRefR[7])*0.5;
|
|
lastRefR[7] = lastRefR[8]; //continue, do not break
|
|
case 3:
|
|
lastRefL[8] = inputSampleL; inputSampleL = (inputSampleL+lastRefL[6])*0.5;
|
|
lastRefL[6] = lastRefL[8]; //continue, do not break
|
|
lastRefR[8] = inputSampleR; inputSampleR = (inputSampleR+lastRefR[6])*0.5;
|
|
lastRefR[6] = lastRefR[8]; //continue, do not break
|
|
case 2:
|
|
lastRefL[8] = inputSampleL; inputSampleL = (inputSampleL+lastRefL[5])*0.5;
|
|
lastRefL[5] = lastRefL[8]; //continue, do not break
|
|
lastRefR[8] = inputSampleR; inputSampleR = (inputSampleR+lastRefR[5])*0.5;
|
|
lastRefR[5] = lastRefR[8]; //continue, do not break
|
|
case 1:
|
|
break; //no further averaging
|
|
}
|
|
|
|
inputSampleL += drySampleL;
|
|
inputSampleR += drySampleR;
|
|
|
|
//begin 32 bit stereo floating point dither
|
|
int expon; frexpf((float)inputSampleL, &expon);
|
|
fpdL ^= fpdL << 13; fpdL ^= fpdL >> 17; fpdL ^= fpdL << 5;
|
|
inputSampleL += ((double(fpdL)-uint32_t(0x7fffffff)) * 5.5e-36l * pow(2,expon+62));
|
|
frexpf((float)inputSampleR, &expon);
|
|
fpdR ^= fpdR << 13; fpdR ^= fpdR >> 17; fpdR ^= fpdR << 5;
|
|
inputSampleR += ((double(fpdR)-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 Energy2::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();
|
|
int cycleEnd = floor(overallscale);
|
|
if (cycleEnd < 1) cycleEnd = 1;
|
|
if (cycleEnd > 4) cycleEnd = 4;
|
|
//this is going to be 2 for 88.1 or 96k, 3 for silly people, 4 for 176 or 192k
|
|
if (cycle > cycleEnd-1) cycle = cycleEnd-1; //sanity check
|
|
|
|
double duoIntensity = -pow((A*2.0)-1.0,3);
|
|
double tripletIntensity = -pow((B*2.0)-1.0,3);
|
|
double quadIntensity = -pow((C*2.0)-1.0,3);
|
|
double quintIntensity = -pow((D*2.0)-1.0,3);
|
|
double sextIntensity = -pow((E*2.0)-1.0,3);
|
|
double septIntensity = -pow((F*2.0)-1.0,3);
|
|
double octIntensity = -pow((G*2.0)-1.0,3);
|
|
double nintIntensity = -pow((H*2.0)-1.0,3);
|
|
double mix = (I*2.0)-1.0;
|
|
//all types of air band are running in parallel, not series
|
|
|
|
while (--sampleFrames >= 0)
|
|
{
|
|
double inputSampleL = *in1;
|
|
double inputSampleR = *in2;
|
|
if (fabs(inputSampleL)<1.18e-23) inputSampleL = fpdL * 1.18e-17;
|
|
if (fabs(inputSampleR)<1.18e-23) inputSampleR = fpdR * 1.18e-17;
|
|
double drySampleL = inputSampleL;
|
|
double drySampleR = inputSampleR;
|
|
|
|
cycle++;
|
|
if (cycle == cycleEnd) { //hit the end point and we do an Energy sample
|
|
double correctionL = 0.0;
|
|
double correctionR = 0.0;
|
|
|
|
if (fabs(duoIntensity) > 0.0001) {
|
|
duoFactorL = PrevAL - inputSampleL;
|
|
duoFactorR = PrevAR - inputSampleR;
|
|
if (flip)
|
|
{
|
|
duoEvenL += duoFactorL; duoOddL -= duoFactorL;
|
|
duoFactorL = duoEvenL * duoIntensity;
|
|
|
|
duoEvenR += duoFactorR; duoOddR -= duoFactorR;
|
|
duoFactorR = duoEvenR * duoIntensity;
|
|
}
|
|
else
|
|
{
|
|
duoOddL += duoFactorL; duoEvenL -= duoFactorL;
|
|
duoFactorL = duoOddL * duoIntensity;
|
|
|
|
duoOddR += duoFactorR; duoEvenR -= duoFactorR;
|
|
duoFactorR = duoOddR * duoIntensity;
|
|
}
|
|
duoOddL = (duoOddL - ((duoOddL - duoEvenL)/256.0)) / 2.0;
|
|
duoEvenL = (duoEvenL - ((duoEvenL - duoOddL)/256.0)) / 2.0;
|
|
correctionL = correctionL + duoFactorL;
|
|
|
|
duoOddR = (duoOddR - ((duoOddR - duoEvenR)/256.0)) / 2.0;
|
|
duoEvenR = (duoEvenR - ((duoEvenR - duoOddR)/256.0)) / 2.0;
|
|
correctionR = correctionR + duoFactorR;
|
|
flip = !flip;
|
|
}//finished duo section
|
|
|
|
|
|
if (fabs(tripletIntensity) > 0.0001) {
|
|
if (countA < 1 || countA > 3) countA = 1;
|
|
switch (countA)
|
|
{
|
|
case 1:
|
|
tripletFactorL = PrevBL - inputSampleL;
|
|
tripletAL += tripletFactorL; tripletCL -= tripletFactorL;
|
|
tripletFactorL = tripletAL * tripletIntensity;
|
|
|
|
tripletFactorR = PrevBR - inputSampleR;
|
|
tripletAR += tripletFactorR; tripletCR -= tripletFactorR;
|
|
tripletFactorR = tripletAR * tripletIntensity;
|
|
break;
|
|
case 2:
|
|
tripletFactorL = PrevBL - inputSampleL;
|
|
tripletBL += tripletFactorL; tripletAL -= tripletFactorL;
|
|
tripletFactorL = tripletBL * tripletIntensity;
|
|
|
|
tripletFactorR = PrevBR - inputSampleR;
|
|
tripletBR += tripletFactorR; tripletAR -= tripletFactorR;
|
|
tripletFactorR = tripletBR * tripletIntensity;
|
|
break;
|
|
case 3:
|
|
tripletFactorL = PrevBL - inputSampleL;
|
|
tripletCL += tripletFactorL; tripletBL -= tripletFactorL;
|
|
tripletFactorL = tripletCL * tripletIntensity;
|
|
|
|
tripletFactorR = PrevBR - inputSampleR;
|
|
tripletCR += tripletFactorR; tripletBR -= tripletFactorR;
|
|
tripletFactorR = tripletCR * tripletIntensity;
|
|
break;
|
|
}
|
|
tripletAL /= 2.0; tripletBL /= 2.0; tripletCL /= 2.0;
|
|
correctionL = correctionL + tripletFactorL;
|
|
|
|
tripletAR /= 2.0; tripletBR /= 2.0; tripletCR /= 2.0;
|
|
correctionR = correctionR + tripletFactorR;
|
|
countA++;
|
|
}//finished triplet section- 15K
|
|
|
|
if (fabs(quadIntensity) > 0.0001) {
|
|
if (countB < 1 || countB > 4) countB = 1;
|
|
switch (countB)
|
|
{
|
|
case 1:
|
|
quadFactorL = PrevCL - inputSampleL;
|
|
quadAL += quadFactorL; quadDL -= quadFactorL;
|
|
quadFactorL = quadAL * quadIntensity;
|
|
|
|
quadFactorR = PrevCR - inputSampleR;
|
|
quadAR += quadFactorR; quadDR -= quadFactorR;
|
|
quadFactorR = quadAR * quadIntensity;
|
|
break;
|
|
case 2:
|
|
quadFactorL = PrevCL - inputSampleL;
|
|
quadBL += quadFactorL; quadAL -= quadFactorL;
|
|
quadFactorL = quadBL * quadIntensity;
|
|
|
|
quadFactorR = PrevCR - inputSampleR;
|
|
quadBR += quadFactorR; quadAR -= quadFactorR;
|
|
quadFactorR = quadBR * quadIntensity;
|
|
break;
|
|
case 3:
|
|
quadFactorL = PrevCL - inputSampleL;
|
|
quadCL += quadFactorL; quadBL -= quadFactorL;
|
|
quadFactorL = quadCL * quadIntensity;
|
|
|
|
quadFactorR = PrevCR - inputSampleR;
|
|
quadCR += quadFactorR; quadBR -= quadFactorR;
|
|
quadFactorR = quadCR * quadIntensity;
|
|
break;
|
|
case 4:
|
|
quadFactorL = PrevCL - inputSampleL;
|
|
quadDL += quadFactorL; quadCL -= quadFactorL;
|
|
quadFactorL = quadDL * quadIntensity;
|
|
|
|
quadFactorR = PrevCR - inputSampleR;
|
|
quadDR += quadFactorR; quadCR -= quadFactorR;
|
|
quadFactorR = quadDR * quadIntensity;
|
|
break;
|
|
}
|
|
quadAL /= 2.0; quadBL /= 2.0; quadCL /= 2.0; quadDL /= 2.0;
|
|
correctionL = correctionL + quadFactorL;
|
|
|
|
quadAR /= 2.0; quadBR /= 2.0; quadCR /= 2.0; quadDR /= 2.0;
|
|
correctionR = correctionR + quadFactorR;
|
|
countB++;
|
|
}//finished quad section- 10K
|
|
|
|
if (fabs(quintIntensity) > 0.0001) {
|
|
if (countC < 1 || countC > 5) countC = 1;
|
|
switch (countC)
|
|
{
|
|
case 1:
|
|
quintFactorL = PrevDL - inputSampleL;
|
|
quintAL += quintFactorL; quintEL -= quintFactorL;
|
|
quintFactorL = quintAL * quintIntensity;
|
|
|
|
quintFactorR = PrevDR - inputSampleR;
|
|
quintAR += quintFactorR; quintER -= quintFactorR;
|
|
quintFactorR = quintAR * quintIntensity;
|
|
break;
|
|
case 2:
|
|
quintFactorL = PrevDL - inputSampleL;
|
|
quintBL += quintFactorL; quintAL -= quintFactorL;
|
|
quintFactorL = quintBL * quintIntensity;
|
|
|
|
quintFactorR = PrevDR - inputSampleR;
|
|
quintBR += quintFactorR; quintAR -= quintFactorR;
|
|
quintFactorR = quintBR * quintIntensity;
|
|
break;
|
|
case 3:
|
|
quintFactorL = PrevDL - inputSampleL;
|
|
quintCL += quintFactorL; quintBL -= quintFactorL;
|
|
quintFactorL = quintCL * quintIntensity;
|
|
|
|
quintFactorR = PrevDR - inputSampleR;
|
|
quintCR += quintFactorR; quintBR -= quintFactorR;
|
|
quintFactorR = quintCR * quintIntensity;
|
|
break;
|
|
case 4:
|
|
quintFactorL = PrevDL - inputSampleL;
|
|
quintDL += quintFactorL; quintCL -= quintFactorL;
|
|
quintFactorL = quintDL * quintIntensity;
|
|
|
|
quintFactorR = PrevDR - inputSampleR;
|
|
quintDR += quintFactorR; quintCR -= quintFactorR;
|
|
quintFactorR = quintDR * quintIntensity;
|
|
break;
|
|
case 5:
|
|
quintFactorL = PrevDL - inputSampleL;
|
|
quintEL += quintFactorL; quintDL -= quintFactorL;
|
|
quintFactorL = quintEL * quintIntensity;
|
|
|
|
quintFactorR = PrevDR - inputSampleR;
|
|
quintER += quintFactorR; quintDR -= quintFactorR;
|
|
quintFactorR = quintER * quintIntensity;
|
|
break;
|
|
}
|
|
quintAL /= 2.0; quintBL /= 2.0; quintCL /= 2.0; quintDL /= 2.0; quintEL /= 2.0;
|
|
correctionL = correctionL + quintFactorL;
|
|
|
|
quintAR /= 2.0; quintBR /= 2.0; quintCR /= 2.0; quintDR /= 2.0; quintER /= 2.0;
|
|
correctionR = correctionR + quintFactorR;
|
|
countC++;
|
|
}//finished quint section- 8K
|
|
|
|
if (fabs(sextIntensity) > 0.0001) {
|
|
if (countD < 1 || countD > 6) countD = 1;
|
|
switch (countD)
|
|
{
|
|
case 1:
|
|
sextFactorL = PrevEL - inputSampleL;
|
|
sextAL += sextFactorL; sextFL -= sextFactorL;
|
|
sextFactorL = sextAL * sextIntensity;
|
|
|
|
sextFactorR = PrevER - inputSampleR;
|
|
sextAR += sextFactorR; sextFR -= sextFactorR;
|
|
sextFactorR = sextAR * sextIntensity;
|
|
break;
|
|
case 2:
|
|
sextFactorL = PrevEL - inputSampleL;
|
|
sextBL += sextFactorL; sextAL -= sextFactorL;
|
|
sextFactorL = sextBL * sextIntensity;
|
|
|
|
sextFactorR = PrevER - inputSampleR;
|
|
sextBR += sextFactorR; sextAR -= sextFactorR;
|
|
sextFactorR = sextBR * sextIntensity;
|
|
break;
|
|
case 3:
|
|
sextFactorL = PrevEL - inputSampleL;
|
|
sextCL += sextFactorL; sextBL -= sextFactorL;
|
|
sextFactorL = sextCL * sextIntensity;
|
|
|
|
sextFactorR = PrevER - inputSampleR;
|
|
sextCR += sextFactorR; sextBR -= sextFactorR;
|
|
sextFactorR = sextCR * sextIntensity;
|
|
break;
|
|
case 4:
|
|
sextFactorL = PrevEL - inputSampleL;
|
|
sextDL += sextFactorL; sextCL -= sextFactorL;
|
|
sextFactorL = sextDL * sextIntensity;
|
|
|
|
sextFactorR = PrevER - inputSampleR;
|
|
sextDR += sextFactorR; sextCR -= sextFactorR;
|
|
sextFactorR = sextDR * sextIntensity;
|
|
break;
|
|
case 5:
|
|
sextFactorL = PrevEL - inputSampleL;
|
|
sextEL += sextFactorL; sextDL -= sextFactorL;
|
|
sextFactorL = sextEL * sextIntensity;
|
|
|
|
sextFactorR = PrevER - inputSampleR;
|
|
sextER += sextFactorR; sextDR -= sextFactorR;
|
|
sextFactorR = sextER * sextIntensity;
|
|
break;
|
|
case 6:
|
|
sextFactorL = PrevEL - inputSampleL;
|
|
sextFL += sextFactorL; sextEL -= sextFactorL;
|
|
sextFactorL = sextFL * sextIntensity;
|
|
|
|
sextFactorR = PrevER - inputSampleR;
|
|
sextFR += sextFactorR; sextER -= sextFactorR;
|
|
sextFactorR = sextFR * sextIntensity;
|
|
break;
|
|
}
|
|
sextAL /= 2.0; sextBL /= 2.0; sextCL /= 2.0;
|
|
sextDL /= 2.0; sextEL /= 2.0; sextFL /= 2.0;
|
|
correctionL = correctionL + sextFactorL;
|
|
|
|
sextAR /= 2.0; sextBR /= 2.0; sextCR /= 2.0;
|
|
sextDR /= 2.0; sextER /= 2.0; sextFR /= 2.0;
|
|
correctionR = correctionR + sextFactorR;
|
|
countD++;
|
|
}//finished sext section- 6K
|
|
|
|
if (fabs(septIntensity) > 0.0001) {
|
|
if (countE < 1 || countE > 7) countE = 1;
|
|
switch (countE)
|
|
{
|
|
case 1:
|
|
septFactorL = PrevFL - inputSampleL;
|
|
septAL += septFactorL; septGL -= septFactorL;
|
|
septFactorL = septAL * septIntensity;
|
|
|
|
septFactorR = PrevFR - inputSampleR;
|
|
septAR += septFactorR; septGR -= septFactorR;
|
|
septFactorR = septAR * septIntensity;
|
|
break;
|
|
case 2:
|
|
septFactorL = PrevFL - inputSampleL;
|
|
septBL += septFactorL; septAL -= septFactorL;
|
|
septFactorL = septBL * septIntensity;
|
|
|
|
septFactorR = PrevFR - inputSampleR;
|
|
septBR += septFactorR; septAR -= septFactorR;
|
|
septFactorR = septBR * septIntensity;
|
|
break;
|
|
case 3:
|
|
septFactorL = PrevFL - inputSampleL;
|
|
septCL += septFactorL; septBL -= septFactorL;
|
|
septFactorL = septCL * septIntensity;
|
|
|
|
septFactorR = PrevFR - inputSampleR;
|
|
septCR += septFactorR; septBR -= septFactorR;
|
|
septFactorR = septCR * septIntensity;
|
|
break;
|
|
case 4:
|
|
septFactorL = PrevFL - inputSampleL;
|
|
septDL += septFactorL; septCL -= septFactorL;
|
|
septFactorL = septDL * septIntensity;
|
|
|
|
septFactorR = PrevFR - inputSampleR;
|
|
septDR += septFactorR; septCR -= septFactorR;
|
|
septFactorR = septDR * septIntensity;
|
|
break;
|
|
case 5:
|
|
septFactorL = PrevFL - inputSampleL;
|
|
septEL += septFactorL; septDL -= septFactorL;
|
|
septFactorL = septEL * septIntensity;
|
|
|
|
septFactorR = PrevFR - inputSampleR;
|
|
septER += septFactorR; septDR -= septFactorR;
|
|
septFactorR = septER * septIntensity;
|
|
break;
|
|
case 6:
|
|
septFactorL = PrevFL - inputSampleL;
|
|
septFL += septFactorL; septEL -= septFactorL;
|
|
septFactorL = septFL * septIntensity;
|
|
|
|
septFactorR = PrevFR - inputSampleR;
|
|
septFR += septFactorR; septER -= septFactorR;
|
|
septFactorR = septFR * septIntensity;
|
|
break;
|
|
case 7:
|
|
septFactorL = PrevFL - inputSampleL;
|
|
septGL += septFactorL; septFL -= septFactorL;
|
|
septFactorL = septGL * septIntensity;
|
|
|
|
septFactorR = PrevFR - inputSampleR;
|
|
septGR += septFactorR; septFR -= septFactorR;
|
|
septFactorR = septGR * septIntensity;
|
|
break;
|
|
}
|
|
septAL /= 2.0; septBL /= 2.0; septCL /= 2.0; septDL /= 2.0;
|
|
septEL /= 2.0; septFL /= 2.0; septGL /= 2.0;
|
|
correctionL = correctionL + septFactorL;
|
|
|
|
septAR /= 2.0; septBR /= 2.0; septCR /= 2.0; septDR /= 2.0;
|
|
septER /= 2.0; septFR /= 2.0; septGR /= 2.0;
|
|
correctionR = correctionR + septFactorR;
|
|
countE++;
|
|
}//finished sept section- 5K
|
|
|
|
if (fabs(octIntensity) > 0.0001) {
|
|
if (countF < 1 || countF > 8) countF = 1;
|
|
switch (countF)
|
|
{
|
|
case 1:
|
|
octFactorL = PrevGL - inputSampleL;
|
|
octAL += octFactorL; octHL -= octFactorL;
|
|
octFactorL = octAL * octIntensity;
|
|
|
|
octFactorR = PrevGR - inputSampleR;
|
|
octAR += octFactorR; octHR -= octFactorR;
|
|
octFactorR = octAR * octIntensity;
|
|
break;
|
|
case 2:
|
|
octFactorL = PrevGL - inputSampleL;
|
|
octBL += octFactorL; octAL -= octFactorL;
|
|
octFactorL = octBL * octIntensity;
|
|
|
|
octFactorR = PrevGR - inputSampleR;
|
|
octBR += octFactorR; octAR -= octFactorR;
|
|
octFactorR = octBR * octIntensity;
|
|
break;
|
|
case 3:
|
|
octFactorL = PrevGL - inputSampleL;
|
|
octCL += octFactorL; octBL -= octFactorL;
|
|
octFactorL = octCL * octIntensity;
|
|
|
|
octFactorR = PrevGR - inputSampleR;
|
|
octCR += octFactorR; octBR -= octFactorR;
|
|
octFactorR = octCR * octIntensity;
|
|
break;
|
|
case 4:
|
|
octFactorL = PrevGL - inputSampleL;
|
|
octDL += octFactorL; octCL -= octFactorL;
|
|
octFactorL = octDL * octIntensity;
|
|
|
|
octFactorR = PrevGR - inputSampleR;
|
|
octDR += octFactorR; octCR -= octFactorR;
|
|
octFactorR = octDR * octIntensity;
|
|
break;
|
|
case 5:
|
|
octFactorL = PrevGL - inputSampleL;
|
|
octEL += octFactorL; octDL -= octFactorL;
|
|
octFactorL = octEL * octIntensity;
|
|
|
|
octFactorR = PrevGR - inputSampleR;
|
|
octER += octFactorR; octDR -= octFactorR;
|
|
octFactorR = octER * octIntensity;
|
|
break;
|
|
case 6:
|
|
octFactorL = PrevGL - inputSampleL;
|
|
octFL += octFactorL; octEL -= octFactorL;
|
|
octFactorL = octFL * octIntensity;
|
|
|
|
octFactorR = PrevGR - inputSampleR;
|
|
octFR += octFactorR; octER -= octFactorR;
|
|
octFactorR = octFR * octIntensity;
|
|
break;
|
|
case 7:
|
|
octFactorL = PrevGL - inputSampleL;
|
|
octGL += octFactorL; octFL -= octFactorL;
|
|
octFactorL = octGL * octIntensity;
|
|
|
|
octFactorR = PrevGR - inputSampleR;
|
|
octGR += octFactorR; octFR -= octFactorR;
|
|
octFactorR = octGR * octIntensity;
|
|
break;
|
|
case 8:
|
|
octFactorL = PrevGL - inputSampleL;
|
|
octHL += octFactorL; octGL -= octFactorL;
|
|
octFactorL = octHL * octIntensity;
|
|
|
|
octFactorR = PrevGR - inputSampleR;
|
|
octHR += octFactorR; octGR -= octFactorR;
|
|
octFactorR = octHR * octIntensity;
|
|
break;
|
|
}
|
|
octAL /= 2.0; octBL /= 2.0; octCL /= 2.0; octDL /= 2.0;
|
|
octEL /= 2.0; octFL /= 2.0; octGL /= 2.0; octHL /= 2.0;
|
|
correctionL = correctionL + octFactorL;
|
|
|
|
octAR /= 2.0; octBR /= 2.0; octCR /= 2.0; octDR /= 2.0;
|
|
octER /= 2.0; octFR /= 2.0; octGR /= 2.0; octHR /= 2.0;
|
|
correctionR = correctionR + octFactorR;
|
|
countF++;
|
|
}//finished oct section- 4K
|
|
|
|
if (fabs(nintIntensity) > 0.0001) {
|
|
if (countG < 1 || countG > 9) countG = 1;
|
|
switch (countG)
|
|
{
|
|
case 1:
|
|
nintFactorL = PrevHL - inputSampleL;
|
|
nintAL += nintFactorL; nintIL -= nintFactorL;
|
|
nintFactorL = nintAL * nintIntensity;
|
|
|
|
nintFactorR = PrevHR - inputSampleR;
|
|
nintAR += nintFactorR; nintIR -= nintFactorR;
|
|
nintFactorR = nintAR * nintIntensity;
|
|
break;
|
|
case 2:
|
|
nintFactorL = PrevHL - inputSampleL;
|
|
nintBL += nintFactorL; nintAL -= nintFactorL;
|
|
nintFactorL = nintBL * nintIntensity;
|
|
|
|
nintFactorR = PrevHR - inputSampleR;
|
|
nintBR += nintFactorR; nintAR -= nintFactorR;
|
|
nintFactorR = nintBR * nintIntensity;
|
|
break;
|
|
case 3:
|
|
nintFactorL = PrevHL - inputSampleL;
|
|
nintCL += nintFactorL; nintBL -= nintFactorL;
|
|
nintFactorL = nintCL * nintIntensity;
|
|
|
|
nintFactorR = PrevHR - inputSampleR;
|
|
nintCR += nintFactorR; nintBR -= nintFactorR;
|
|
nintFactorR = nintCR * nintIntensity;
|
|
break;
|
|
case 4:
|
|
nintFactorL = PrevHL - inputSampleL;
|
|
nintDL += nintFactorL; nintCL -= nintFactorL;
|
|
nintFactorL = nintDL * nintIntensity;
|
|
|
|
nintFactorR = PrevHR - inputSampleR;
|
|
nintDR += nintFactorR; nintCR -= nintFactorR;
|
|
nintFactorR = nintDR * nintIntensity;
|
|
break;
|
|
case 5:
|
|
nintFactorL = PrevHL - inputSampleL;
|
|
nintEL += nintFactorL; nintDL -= nintFactorL;
|
|
nintFactorL = nintEL * nintIntensity;
|
|
|
|
nintFactorR = PrevHR - inputSampleR;
|
|
nintER += nintFactorR; nintDR -= nintFactorR;
|
|
nintFactorR = nintER * nintIntensity;
|
|
break;
|
|
case 6:
|
|
nintFactorL = PrevHL - inputSampleL;
|
|
nintFL += nintFactorL; nintEL -= nintFactorL;
|
|
nintFactorL = nintFL * nintIntensity;
|
|
|
|
nintFactorR = PrevHR - inputSampleR;
|
|
nintFR += nintFactorR; nintER -= nintFactorR;
|
|
nintFactorR = nintFR * nintIntensity;
|
|
break;
|
|
case 7:
|
|
nintFactorL = PrevHL - inputSampleL;
|
|
nintGL += nintFactorL; nintFL -= nintFactorL;
|
|
nintFactorL = nintGL * nintIntensity;
|
|
|
|
nintFactorR = PrevHR - inputSampleR;
|
|
nintGR += nintFactorR; nintFR -= nintFactorR;
|
|
nintFactorR = nintGR * nintIntensity;
|
|
break;
|
|
case 8:
|
|
nintFactorL = PrevHL - inputSampleL;
|
|
nintHL += nintFactorL; nintGL -= nintFactorL;
|
|
nintFactorL = nintHL * nintIntensity;
|
|
|
|
nintFactorR = PrevHR - inputSampleR;
|
|
nintHR += nintFactorR; nintGR -= nintFactorR;
|
|
nintFactorR = nintHR * nintIntensity;
|
|
break;
|
|
case 9:
|
|
nintFactorL = PrevHL - inputSampleL;
|
|
nintIL += nintFactorL; nintHL -= nintFactorL;
|
|
nintFactorL = nintIL * nintIntensity;
|
|
|
|
nintFactorR = PrevHR - inputSampleR;
|
|
nintIR += nintFactorR; nintHR -= nintFactorR;
|
|
nintFactorR = nintIR * nintIntensity;
|
|
break;
|
|
}
|
|
nintAL /= 2.0; nintBL /= 2.0; nintCL /= 2.0; nintDL /= 2.0; nintEL /= 2.0;
|
|
nintFL /= 2.0; nintGL /= 2.0; nintHL /= 2.0; nintIL /= 2.0;
|
|
correctionL = correctionL + nintFactorL;
|
|
|
|
nintAR /= 2.0; nintBR /= 2.0; nintCR /= 2.0; nintDR /= 2.0; nintER /= 2.0;
|
|
nintFR /= 2.0; nintGR /= 2.0; nintHR /= 2.0; nintIR /= 2.0;
|
|
correctionR = correctionR + nintFactorR;
|
|
countG++;
|
|
}//finished nint section- 3K
|
|
|
|
PrevHL = PrevGL; PrevGL = PrevFL; PrevFL = PrevEL; PrevEL = PrevDL;
|
|
PrevDL = PrevCL; PrevCL = PrevBL; PrevBL = PrevAL; PrevAL = inputSampleL;
|
|
|
|
PrevHR = PrevGR; PrevGR = PrevFR; PrevFR = PrevER; PrevER = PrevDR;
|
|
PrevDR = PrevCR; PrevCR = PrevBR; PrevBR = PrevAR; PrevAR = inputSampleR;
|
|
|
|
inputSampleL = correctionL * mix;
|
|
inputSampleR = correctionR * mix;
|
|
|
|
if (cycleEnd == 4) {
|
|
lastRefL[0] = lastRefL[4]; //start from previous last
|
|
lastRefL[2] = (lastRefL[0] + inputSampleL)/2; //half
|
|
lastRefL[1] = (lastRefL[0] + lastRefL[2])/2; //one quarter
|
|
lastRefL[3] = (lastRefL[2] + inputSampleL)/2; //three quarters
|
|
lastRefL[4] = inputSampleL; //full
|
|
lastRefR[0] = lastRefR[4]; //start from previous last
|
|
lastRefR[2] = (lastRefR[0] + inputSampleR)/2; //half
|
|
lastRefR[1] = (lastRefR[0] + lastRefR[2])/2; //one quarter
|
|
lastRefR[3] = (lastRefR[2] + inputSampleR)/2; //three quarters
|
|
lastRefR[4] = inputSampleR; //full
|
|
}
|
|
if (cycleEnd == 3) {
|
|
lastRefL[0] = lastRefL[3]; //start from previous last
|
|
lastRefL[2] = (lastRefL[0]+lastRefL[0]+inputSampleL)/3; //third
|
|
lastRefL[1] = (lastRefL[0]+inputSampleL+inputSampleL)/3; //two thirds
|
|
lastRefL[3] = inputSampleL; //full
|
|
lastRefR[0] = lastRefR[3]; //start from previous last
|
|
lastRefR[2] = (lastRefR[0]+lastRefR[0]+inputSampleR)/3; //third
|
|
lastRefR[1] = (lastRefR[0]+inputSampleR+inputSampleR)/3; //two thirds
|
|
lastRefR[3] = inputSampleR; //full
|
|
}
|
|
if (cycleEnd == 2) {
|
|
lastRefL[0] = lastRefL[2]; //start from previous last
|
|
lastRefL[1] = (lastRefL[0] + inputSampleL)/2; //half
|
|
lastRefL[2] = inputSampleL; //full
|
|
lastRefR[0] = lastRefR[2]; //start from previous last
|
|
lastRefR[1] = (lastRefR[0] + inputSampleR)/2; //half
|
|
lastRefR[2] = inputSampleR; //full
|
|
}
|
|
if (cycleEnd == 1) {
|
|
lastRefL[0] = inputSampleL;
|
|
lastRefR[0] = inputSampleR;
|
|
}
|
|
cycle = 0; //reset
|
|
inputSampleL = lastRefL[cycle];
|
|
inputSampleR = lastRefR[cycle];
|
|
} else {
|
|
inputSampleL = lastRefL[cycle];
|
|
inputSampleR = lastRefR[cycle];
|
|
//we are going through our references now
|
|
}
|
|
switch (cycleEnd) //multi-pole average using lastRef[] variables
|
|
{
|
|
case 4:
|
|
lastRefL[8] = inputSampleL; inputSampleL = (inputSampleL+lastRefL[7])*0.5;
|
|
lastRefL[7] = lastRefL[8]; //continue, do not break
|
|
lastRefR[8] = inputSampleR; inputSampleR = (inputSampleR+lastRefR[7])*0.5;
|
|
lastRefR[7] = lastRefR[8]; //continue, do not break
|
|
case 3:
|
|
lastRefL[8] = inputSampleL; inputSampleL = (inputSampleL+lastRefL[6])*0.5;
|
|
lastRefL[6] = lastRefL[8]; //continue, do not break
|
|
lastRefR[8] = inputSampleR; inputSampleR = (inputSampleR+lastRefR[6])*0.5;
|
|
lastRefR[6] = lastRefR[8]; //continue, do not break
|
|
case 2:
|
|
lastRefL[8] = inputSampleL; inputSampleL = (inputSampleL+lastRefL[5])*0.5;
|
|
lastRefL[5] = lastRefL[8]; //continue, do not break
|
|
lastRefR[8] = inputSampleR; inputSampleR = (inputSampleR+lastRefR[5])*0.5;
|
|
lastRefR[5] = lastRefR[8]; //continue, do not break
|
|
case 1:
|
|
break; //no further averaging
|
|
}
|
|
|
|
inputSampleL += drySampleL;
|
|
inputSampleR += drySampleR;
|
|
|
|
//begin 64 bit stereo floating point dither
|
|
//int expon; frexp((double)inputSampleL, &expon);
|
|
fpdL ^= fpdL << 13; fpdL ^= fpdL >> 17; fpdL ^= fpdL << 5;
|
|
//inputSampleL += ((double(fpdL)-uint32_t(0x7fffffff)) * 1.1e-44l * pow(2,expon+62));
|
|
//frexp((double)inputSampleR, &expon);
|
|
fpdR ^= fpdR << 13; fpdR ^= fpdR >> 17; fpdR ^= fpdR << 5;
|
|
//inputSampleR += ((double(fpdR)-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++;
|
|
}
|
|
}
|