mirror of
https://github.com/airwindows/airwindows.git
synced 2026-05-15 14:16:00 -06:00
198 lines
7.7 KiB
C++
Executable file
198 lines
7.7 KiB
C++
Executable file
/* ========================================
|
|
* Discontapeity - Discontapeity.h
|
|
* Copyright (c) airwindows, Airwindows uses the MIT license
|
|
* ======================================== */
|
|
|
|
#ifndef __Discontapeity_H
|
|
#include "Discontapeity.h"
|
|
#endif
|
|
|
|
void Discontapeity::processReplacing(float **inputs, float **outputs, VstInt32 sampleFrames)
|
|
{
|
|
float* in1 = inputs[0];
|
|
float* in2 = inputs[1];
|
|
float* out1 = outputs[0];
|
|
float* out2 = outputs[1];
|
|
|
|
VstInt32 inFramesToProcess = sampleFrames; //vst doesn't give us this as a separate variable so we'll make it
|
|
double overallscale = 1.0;
|
|
overallscale /= 44100.0;
|
|
overallscale *= getSampleRate();
|
|
|
|
double moreDiscontinuity = fmax(pow(A*0.42,3.0)*overallscale,0.00001);
|
|
double moreTapeHack = (A*1.4152481)+1.2;
|
|
|
|
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;
|
|
|
|
//begin Discontinuity section
|
|
inputSampleL *= moreDiscontinuity;
|
|
dBaL[dBaXL] = inputSampleL; dBaPosL *= 0.5; dBaPosL += fabs((inputSampleL*((inputSampleL*0.25)-0.5))*0.5);
|
|
dBaPosL = fmin(dBaPosL,1.0);
|
|
int dBdly = floor(dBaPosL*dscBuf);
|
|
double dBi = (dBaPosL*dscBuf)-dBdly;
|
|
inputSampleL = dBaL[dBaXL-dBdly +((dBaXL-dBdly < 0)?dscBuf:0)]*(1.0-dBi);
|
|
dBdly++; inputSampleL += dBaL[dBaXL-dBdly +((dBaXL-dBdly < 0)?dscBuf:0)]*dBi;
|
|
dBaXL++; if (dBaXL < 0 || dBaXL >= dscBuf) dBaXL = 0;
|
|
inputSampleL /= moreDiscontinuity;
|
|
//end Discontinuity section, begin TapeHack section
|
|
inputSampleL = fmax(fmin(inputSampleL*moreTapeHack,2.305929007734908),-2.305929007734908);
|
|
double addtwo = inputSampleL * inputSampleL;
|
|
double empower = inputSampleL * addtwo; // inputSampleL to the third power
|
|
inputSampleL -= (empower / 6.0);
|
|
empower *= addtwo; // to the fifth power
|
|
inputSampleL += (empower / 69.0);
|
|
empower *= addtwo; //seventh
|
|
inputSampleL -= (empower / 2530.08);
|
|
empower *= addtwo; //ninth
|
|
inputSampleL += (empower / 224985.6);
|
|
empower *= addtwo; //eleventh
|
|
inputSampleL -= (empower / 9979200.0f);
|
|
//this is a degenerate form of a Taylor Series to approximate sin()
|
|
inputSampleL *= 0.9239;
|
|
//end TapeHack section
|
|
|
|
//begin Discontinuity section
|
|
inputSampleR *= moreDiscontinuity;
|
|
dBaR[dBaXR] = inputSampleR; dBaPosR *= 0.5; dBaPosR += fabs((inputSampleR*((inputSampleR*0.25)-0.5))*0.5);
|
|
dBaPosR = fmin(dBaPosR,1.0);
|
|
dBdly = floor(dBaPosR*dscBuf);
|
|
dBi = (dBaPosR*dscBuf)-dBdly;
|
|
inputSampleR = dBaR[dBaXR-dBdly +((dBaXR-dBdly < 0)?dscBuf:0)]*(1.0-dBi);
|
|
dBdly++; inputSampleR += dBaR[dBaXR-dBdly +((dBaXR-dBdly < 0)?dscBuf:0)]*dBi;
|
|
dBaXR++; if (dBaXR < 0 || dBaXR >= dscBuf) dBaXR = 0;
|
|
inputSampleR /= moreDiscontinuity;
|
|
//end Discontinuity section, begin TapeHack section
|
|
inputSampleR = fmax(fmin(inputSampleR*moreTapeHack,2.305929007734908),-2.305929007734908);
|
|
addtwo = inputSampleR * inputSampleR;
|
|
empower = inputSampleR * addtwo; // inputSampleR to the third power
|
|
inputSampleR -= (empower / 6.0);
|
|
empower *= addtwo; // to the fifth power
|
|
inputSampleR += (empower / 69.0);
|
|
empower *= addtwo; //seventh
|
|
inputSampleR -= (empower / 2530.08);
|
|
empower *= addtwo; //ninth
|
|
inputSampleR += (empower / 224985.6);
|
|
empower *= addtwo; //eleventh
|
|
inputSampleR -= (empower / 9979200.0f);
|
|
//this is a degenerate form of a Taylor Series to approximate sin()
|
|
inputSampleR *= 0.9239;
|
|
//end TapeHack section
|
|
|
|
//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 Discontapeity::processDoubleReplacing(double **inputs, double **outputs, VstInt32 sampleFrames)
|
|
{
|
|
double* in1 = inputs[0];
|
|
double* in2 = inputs[1];
|
|
double* out1 = outputs[0];
|
|
double* out2 = outputs[1];
|
|
|
|
VstInt32 inFramesToProcess = sampleFrames; //vst doesn't give us this as a separate variable so we'll make it
|
|
double overallscale = 1.0;
|
|
overallscale /= 44100.0;
|
|
overallscale *= getSampleRate();
|
|
|
|
double moreDiscontinuity = fmax(pow(A*0.42,3.0)*overallscale,0.00001);
|
|
double moreTapeHack = (A*1.4152481)+1.2;
|
|
|
|
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;
|
|
|
|
//begin Discontinuity section
|
|
inputSampleL *= moreDiscontinuity;
|
|
dBaL[dBaXL] = inputSampleL; dBaPosL *= 0.5; dBaPosL += fabs((inputSampleL*((inputSampleL*0.25)-0.5))*0.5);
|
|
dBaPosL = fmin(dBaPosL,1.0);
|
|
int dBdly = floor(dBaPosL*dscBuf);
|
|
double dBi = (dBaPosL*dscBuf)-dBdly;
|
|
inputSampleL = dBaL[dBaXL-dBdly +((dBaXL-dBdly < 0)?dscBuf:0)]*(1.0-dBi);
|
|
dBdly++; inputSampleL += dBaL[dBaXL-dBdly +((dBaXL-dBdly < 0)?dscBuf:0)]*dBi;
|
|
dBaXL++; if (dBaXL < 0 || dBaXL >= dscBuf) dBaXL = 0;
|
|
inputSampleL /= moreDiscontinuity;
|
|
//end Discontinuity section, begin TapeHack section
|
|
inputSampleL = fmax(fmin(inputSampleL*moreTapeHack,2.305929007734908),-2.305929007734908);
|
|
double addtwo = inputSampleL * inputSampleL;
|
|
double empower = inputSampleL * addtwo; // inputSampleL to the third power
|
|
inputSampleL -= (empower / 6.0);
|
|
empower *= addtwo; // to the fifth power
|
|
inputSampleL += (empower / 69.0);
|
|
empower *= addtwo; //seventh
|
|
inputSampleL -= (empower / 2530.08);
|
|
empower *= addtwo; //ninth
|
|
inputSampleL += (empower / 224985.6);
|
|
empower *= addtwo; //eleventh
|
|
inputSampleL -= (empower / 9979200.0f);
|
|
//this is a degenerate form of a Taylor Series to approximate sin()
|
|
inputSampleL *= 0.9239;
|
|
//end TapeHack section
|
|
|
|
//begin Discontinuity section
|
|
inputSampleR *= moreDiscontinuity;
|
|
dBaR[dBaXR] = inputSampleR; dBaPosR *= 0.5; dBaPosR += fabs((inputSampleR*((inputSampleR*0.25)-0.5))*0.5);
|
|
dBaPosR = fmin(dBaPosR,1.0);
|
|
dBdly = floor(dBaPosR*dscBuf);
|
|
dBi = (dBaPosR*dscBuf)-dBdly;
|
|
inputSampleR = dBaR[dBaXR-dBdly +((dBaXR-dBdly < 0)?dscBuf:0)]*(1.0-dBi);
|
|
dBdly++; inputSampleR += dBaR[dBaXR-dBdly +((dBaXR-dBdly < 0)?dscBuf:0)]*dBi;
|
|
dBaXR++; if (dBaXR < 0 || dBaXR >= dscBuf) dBaXR = 0;
|
|
inputSampleR /= moreDiscontinuity;
|
|
//end Discontinuity section, begin TapeHack section
|
|
inputSampleR = fmax(fmin(inputSampleR*moreTapeHack,2.305929007734908),-2.305929007734908);
|
|
addtwo = inputSampleR * inputSampleR;
|
|
empower = inputSampleR * addtwo; // inputSampleR to the third power
|
|
inputSampleR -= (empower / 6.0);
|
|
empower *= addtwo; // to the fifth power
|
|
inputSampleR += (empower / 69.0);
|
|
empower *= addtwo; //seventh
|
|
inputSampleR -= (empower / 2530.08);
|
|
empower *= addtwo; //ninth
|
|
inputSampleR += (empower / 224985.6);
|
|
empower *= addtwo; //eleventh
|
|
inputSampleR -= (empower / 9979200.0f);
|
|
//this is a degenerate form of a Taylor Series to approximate sin()
|
|
inputSampleR *= 0.9239;
|
|
//end TapeHack section
|
|
|
|
//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++;
|
|
}
|
|
}
|