This commit is contained in:
Chris Johnson 2018-10-07 21:11:25 -04:00
parent 5d51c52e34
commit 4be92c81e7
44 changed files with 14203 additions and 0 deletions

View file

@ -0,0 +1,287 @@
/* ========================================
* DubSub - DubSub.h
* Copyright (c) 2016 airwindows, All rights reserved
* ======================================== */
#ifndef __DubSub_H
#include "DubSub.h"
#endif
AudioEffect* createEffectInstance(audioMasterCallback audioMaster) {return new DubSub(audioMaster);}
DubSub::DubSub(audioMasterCallback audioMaster) :
AudioEffectX(audioMaster, kNumPrograms, kNumParameters)
{
A = 0.9;
B = 0.5;
C = 0.74;
D = 1.0;
E = 0.95;
F = 0.5;
G = 0.2;
H = 0.2;
I = 0.5;
J = 1.0;
WasNegativeL = false;
SubOctaveL = false;
WasNegativeR = false;
SubOctaveR = false;
flip = false;
bflip = 0;
iirDriveSampleAL = 0.0;
iirDriveSampleBL = 0.0;
iirDriveSampleCL = 0.0;
iirDriveSampleDL = 0.0;
iirDriveSampleEL = 0.0;
iirDriveSampleFL = 0.0;
iirDriveSampleAR = 0.0;
iirDriveSampleBR = 0.0;
iirDriveSampleCR = 0.0;
iirDriveSampleDR = 0.0;
iirDriveSampleER = 0.0;
iirDriveSampleFR = 0.0;
iirHeadBumpAL = 0.0;
iirHeadBumpBL = 0.0;
iirHeadBumpCL = 0.0;
iirHeadBumpAR = 0.0;
iirHeadBumpBR = 0.0;
iirHeadBumpCR = 0.0;
iirSubBumpAL = 0.0;
iirSubBumpBL = 0.0;
iirSubBumpCL = 0.0;
iirSubBumpAR = 0.0;
iirSubBumpBR = 0.0;
iirSubBumpCR = 0.0;
lastHeadBumpL = 0.0;
lastSubBumpL = 0.0;
lastHeadBumpR = 0.0;
lastSubBumpR = 0.0;
iirSampleAL = 0.0;
iirSampleBL = 0.0;
iirSampleCL = 0.0;
iirSampleDL = 0.0;
iirSampleEL = 0.0;
iirSampleFL = 0.0;
iirSampleGL = 0.0;
iirSampleHL = 0.0;
iirSampleIL = 0.0;
iirSampleJL = 0.0;
iirSampleKL = 0.0;
iirSampleLL = 0.0;
iirSampleML = 0.0;
iirSampleNL = 0.0;
iirSampleOL = 0.0;
iirSamplePL = 0.0;
iirSampleQL = 0.0;
iirSampleRL = 0.0;
iirSampleSL = 0.0;
iirSampleTL = 0.0;
iirSampleUL = 0.0;
iirSampleVL = 0.0;
iirSampleWL = 0.0;
iirSampleXL = 0.0;
iirSampleYL = 0.0;
iirSampleZL = 0.0;
iirSampleAR = 0.0;
iirSampleBR = 0.0;
iirSampleCR = 0.0;
iirSampleDR = 0.0;
iirSampleER = 0.0;
iirSampleFR = 0.0;
iirSampleGR = 0.0;
iirSampleHR = 0.0;
iirSampleIR = 0.0;
iirSampleJR = 0.0;
iirSampleKR = 0.0;
iirSampleLR = 0.0;
iirSampleMR = 0.0;
iirSampleNR = 0.0;
iirSampleOR = 0.0;
iirSamplePR = 0.0;
iirSampleQR = 0.0;
iirSampleRR = 0.0;
iirSampleSR = 0.0;
iirSampleTR = 0.0;
iirSampleUR = 0.0;
iirSampleVR = 0.0;
iirSampleWR = 0.0;
iirSampleXR = 0.0;
iirSampleYR = 0.0;
iirSampleZR = 0.0;
oscGateL = 1.0;
oscGateR = 1.0;
fpNShapeL = 0.0;
fpNShapeR = 0.0;
//this is reset: values being initialized only once. Startup values, whatever they are.
_canDo.insert("plugAsChannelInsert"); // plug-in can be used as a channel insert effect.
_canDo.insert("plugAsSend"); // plug-in can be used as a send effect.
_canDo.insert("x2in2out");
setNumInputs(kNumInputs);
setNumOutputs(kNumOutputs);
setUniqueID(kUniqueId);
canProcessReplacing(); // supports output replacing
canDoubleReplacing(); // supports double precision processing
programsAreChunks(true);
vst_strncpy (_programName, "Default", kVstMaxProgNameLen); // default program name
}
DubSub::~DubSub() {}
VstInt32 DubSub::getVendorVersion () {return 1000;}
void DubSub::setProgramName(char *name) {vst_strncpy (_programName, name, kVstMaxProgNameLen);}
void DubSub::getProgramName(char *name) {vst_strncpy (name, _programName, kVstMaxProgNameLen);}
//airwindows likes to ignore this stuff. Make your own programs, and make a different plugin rather than
//trying to do versioning and preventing people from using older versions. Maybe they like the old one!
static float pinParameter(float data)
{
if (data < 0.0f) return 0.0f;
if (data > 1.0f) return 1.0f;
return data;
}
VstInt32 DubSub::getChunk (void** data, bool isPreset)
{
float *chunkData = (float *)calloc(kNumParameters, sizeof(float));
chunkData[0] = A;
chunkData[1] = B;
chunkData[2] = C;
chunkData[3] = D;
chunkData[4] = E;
chunkData[5] = F;
chunkData[6] = G;
chunkData[7] = H;
chunkData[8] = I;
chunkData[9] = J;
/* Note: The way this is set up, it will break if you manage to save settings on an Intel
machine and load them on a PPC Mac. However, it's fine if you stick to the machine you
started with. */
*data = chunkData;
return kNumParameters * sizeof(float);
}
VstInt32 DubSub::setChunk (void* data, VstInt32 byteSize, bool isPreset)
{
float *chunkData = (float *)data;
A = pinParameter(chunkData[0]);
B = pinParameter(chunkData[1]);
C = pinParameter(chunkData[2]);
D = pinParameter(chunkData[3]);
E = pinParameter(chunkData[4]);
F = pinParameter(chunkData[5]);
G = pinParameter(chunkData[6]);
H = pinParameter(chunkData[7]);
I = pinParameter(chunkData[8]);
J = pinParameter(chunkData[9]);
/* We're ignoring byteSize as we found it to be a filthy liar */
/* calculate any other fields you need here - you could copy in
code from setParameter() here. */
return 0;
}
void DubSub::setParameter(VstInt32 index, float value) {
switch (index) {
case kParamA: A = value; break;
case kParamB: B = value; break;
case kParamC: C = value; break;
case kParamD: D = value; break;
case kParamE: E = value; break;
case kParamF: F = value; break;
case kParamG: G = value; break;
case kParamH: H = value; break;
case kParamI: I = value; break;
case kParamJ: J = value; break;
default: throw; // unknown parameter, shouldn't happen!
}
}
float DubSub::getParameter(VstInt32 index) {
switch (index) {
case kParamA: return A; break;
case kParamB: return B; break;
case kParamC: return C; break;
case kParamD: return D; break;
case kParamE: return E; break;
case kParamF: return F; break;
case kParamG: return G; break;
case kParamH: return H; break;
case kParamI: return I; break;
case kParamJ: return J; break;
default: break; // unknown parameter, shouldn't happen!
} return 0.0; //we only need to update the relevant name, this is simple to manage
}
void DubSub::getParameterName(VstInt32 index, char *text) {
switch (index) {
case kParamA: vst_strncpy (text, "TGrind", kVstMaxParamStrLen); break;
case kParamB: vst_strncpy (text, "Grd/Out", kVstMaxParamStrLen); break;
case kParamC: vst_strncpy (text, "XOver", kVstMaxParamStrLen); break;
case kParamD: vst_strncpy (text, "BsDrive", kVstMaxParamStrLen); break;
case kParamE: vst_strncpy (text, "BsVoice", kVstMaxParamStrLen); break;
case kParamF: vst_strncpy (text, "BassOut", kVstMaxParamStrLen); break;
case kParamG: vst_strncpy (text, "SbDrive", kVstMaxParamStrLen); break;
case kParamH: vst_strncpy (text, "SbVoice", kVstMaxParamStrLen); break;
case kParamI: vst_strncpy (text, "SubOut", kVstMaxParamStrLen); break;
case kParamJ: vst_strncpy (text, "Dry/Wet", kVstMaxParamStrLen); break;
default: break; // unknown parameter, shouldn't happen!
} //this is our labels for displaying in the VST host
}
void DubSub::getParameterDisplay(VstInt32 index, char *text) {
switch (index) {
case kParamA: float2string (A, text, kVstMaxParamStrLen); break;
case kParamB: float2string ((B*2.0)-1.0, text, kVstMaxParamStrLen); break;
case kParamC: float2string (C, text, kVstMaxParamStrLen); break;
case kParamD: float2string (D, text, kVstMaxParamStrLen); break;
case kParamE: float2string (E, text, kVstMaxParamStrLen); break;
case kParamF: float2string ((F*2.0)-1.0, text, kVstMaxParamStrLen); break;
case kParamG: float2string (G, text, kVstMaxParamStrLen); break;
case kParamH: float2string (H, text, kVstMaxParamStrLen); break;
case kParamI: float2string ((I*2.0)-1.0, text, kVstMaxParamStrLen); break;
case kParamJ: float2string (J, text, kVstMaxParamStrLen); break;
default: break; // unknown parameter, shouldn't happen!
} //this displays the values and handles 'popups' where it's discrete choices
}
void DubSub::getParameterLabel(VstInt32 index, char *text) {
switch (index) {
case kParamA: vst_strncpy (text, "", kVstMaxParamStrLen); break;
case kParamB: vst_strncpy (text, "", kVstMaxParamStrLen); break;
case kParamC: vst_strncpy (text, "", kVstMaxParamStrLen); break;
case kParamD: vst_strncpy (text, "", kVstMaxParamStrLen); break;
case kParamE: vst_strncpy (text, "", kVstMaxParamStrLen); break;
case kParamF: vst_strncpy (text, "", kVstMaxParamStrLen); break;
case kParamG: vst_strncpy (text, "", kVstMaxParamStrLen); break;
case kParamH: vst_strncpy (text, "", kVstMaxParamStrLen); break;
case kParamI: vst_strncpy (text, "", kVstMaxParamStrLen); break;
case kParamJ: vst_strncpy (text, "", kVstMaxParamStrLen); break;
default: break; // unknown parameter, shouldn't happen!
}
}
VstInt32 DubSub::canDo(char *text)
{ return (_canDo.find(text) == _canDo.end()) ? -1: 1; } // 1 = yes, -1 = no, 0 = don't know
bool DubSub::getEffectName(char* name) {
vst_strncpy(name, "DubSub", kVstMaxProductStrLen); return true;
}
VstPlugCategory DubSub::getPlugCategory() {return kPlugCategEffect;}
bool DubSub::getProductString(char* text) {
vst_strncpy (text, "airwindows DubSub", kVstMaxProductStrLen); return true;
}
bool DubSub::getVendorString(char* text) {
vst_strncpy (text, "airwindows", kVstMaxVendorStrLen); return true;
}

View file

@ -0,0 +1,179 @@
/* ========================================
* DubSub - DubSub.h
* Created 8/12/11 by SPIAdmin
* Copyright (c) 2011 __MyCompanyName__, All rights reserved
* ======================================== */
#ifndef __DubSub_H
#define __DubSub_H
#ifndef __audioeffect__
#include "audioeffectx.h"
#endif
#include <set>
#include <string>
#include <math.h>
enum {
kParamA = 0,
kParamB = 1,
kParamC = 2,
kParamD = 3,
kParamE = 4,
kParamF = 5,
kParamG = 6,
kParamH = 7,
kParamI = 8,
kParamJ = 9,
kNumParameters = 10
}; //
const int kNumPrograms = 0;
const int kNumInputs = 2;
const int kNumOutputs = 2;
const unsigned long kUniqueId = 'dbsb'; //Change this to what the AU identity is!
class DubSub :
public AudioEffectX
{
public:
DubSub(audioMasterCallback audioMaster);
~DubSub();
virtual bool getEffectName(char* name); // The plug-in name
virtual VstPlugCategory getPlugCategory(); // The general category for the plug-in
virtual bool getProductString(char* text); // This is a unique plug-in string provided by Steinberg
virtual bool getVendorString(char* text); // Vendor info
virtual VstInt32 getVendorVersion(); // Version number
virtual void processReplacing (float** inputs, float** outputs, VstInt32 sampleFrames);
virtual void processDoubleReplacing (double** inputs, double** outputs, VstInt32 sampleFrames);
virtual void getProgramName(char *name); // read the name from the host
virtual void setProgramName(char *name); // changes the name of the preset displayed in the host
virtual VstInt32 getChunk (void** data, bool isPreset);
virtual VstInt32 setChunk (void* data, VstInt32 byteSize, bool isPreset);
virtual float getParameter(VstInt32 index); // get the parameter value at the specified index
virtual void setParameter(VstInt32 index, float value); // set the parameter at index to value
virtual void getParameterLabel(VstInt32 index, char *text); // label for the parameter (eg dB)
virtual void getParameterName(VstInt32 index, char *text); // name of the parameter
virtual void getParameterDisplay(VstInt32 index, char *text); // text description of the current value
virtual VstInt32 canDo(char *text);
private:
char _programName[kVstMaxProgNameLen + 1];
std::set< std::string > _canDo;
private:
double iirDriveSampleAL;
double iirDriveSampleBL;
double iirDriveSampleCL;
double iirDriveSampleDL;
double iirDriveSampleEL;
double iirDriveSampleFL;
double iirDriveSampleAR;
double iirDriveSampleBR;
double iirDriveSampleCR;
double iirDriveSampleDR;
double iirDriveSampleER;
double iirDriveSampleFR;
bool flip; //drive things
int bflip;
bool WasNegativeL;
bool SubOctaveL;
bool WasNegativeR;
bool SubOctaveR;
double iirHeadBumpAL;
double iirHeadBumpBL;
double iirHeadBumpCL;
double iirHeadBumpAR;
double iirHeadBumpBR;
double iirHeadBumpCR;
double iirSubBumpAL;
double iirSubBumpBL;
double iirSubBumpCL;
double iirSubBumpAR;
double iirSubBumpBR;
double iirSubBumpCR;
double lastHeadBumpL;
double lastSubBumpL;
double lastHeadBumpR;
double lastSubBumpR;
double iirSampleAL;
double iirSampleBL;
double iirSampleCL;
double iirSampleDL;
double iirSampleEL;
double iirSampleFL;
double iirSampleGL;
double iirSampleHL;
double iirSampleIL;
double iirSampleJL;
double iirSampleKL;
double iirSampleLL;
double iirSampleML;
double iirSampleNL;
double iirSampleOL;
double iirSamplePL;
double iirSampleQL;
double iirSampleRL;
double iirSampleSL;
double iirSampleTL;
double iirSampleUL;
double iirSampleVL;
double iirSampleWL;
double iirSampleXL;
double iirSampleYL;
double iirSampleZL;
double iirSampleAR;
double iirSampleBR;
double iirSampleCR;
double iirSampleDR;
double iirSampleER;
double iirSampleFR;
double iirSampleGR;
double iirSampleHR;
double iirSampleIR;
double iirSampleJR;
double iirSampleKR;
double iirSampleLR;
double iirSampleMR;
double iirSampleNR;
double iirSampleOR;
double iirSamplePR;
double iirSampleQR;
double iirSampleRR;
double iirSampleSR;
double iirSampleTR;
double iirSampleUR;
double iirSampleVR;
double iirSampleWR;
double iirSampleXR;
double iirSampleYR;
double iirSampleZR;
double oscGateL;
double oscGateR;
long double fpNShapeL;
long double fpNShapeR;
//default stuff
float A;
float B;
float C;
float D;
float E;
float F;
float G;
float H;
float I;
float J;
};
#endif

View file

@ -0,0 +1,835 @@
/* ========================================
* DubSub - DubSub.h
* Copyright (c) 2016 airwindows, All rights reserved
* ======================================== */
#ifndef __DubSub_H
#include "DubSub.h"
#endif
void DubSub::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();
double driveone = pow(A*3.0,2);
double driveoutput = (B*2.0)-1.0;
double iirAmount = ((C*0.33)+0.1)/overallscale;
double ataLowpassL;
double ataLowpassR;
double randyL;
double invrandyL;
double randyR;
double invrandyR;
double HeadBumpL = 0.0;
double HeadBumpR = 0.0;
double BassGain = D * 0.1;
double HeadBumpFreq = ((E*0.1)+0.0001)/overallscale;
double iirBmount = HeadBumpFreq/44.1;
double altBmount = 1.0 - iirBmount;
double BassOutGain = (F*2.0)-1.0;
double SubBumpL = 0.0;
double SubBumpR = 0.0;
double SubGain = G * 0.1;
double SubBumpFreq = ((H*0.1)+0.0001)/overallscale;
double iirCmount = SubBumpFreq/44.1;
double altCmount = 1.0 - iirCmount;
double SubOutGain = (I*2.0)-1.0;
double clampL = 0.0;
double clampR = 0.0;
double out;
double fuzz = 0.111;
double wet = J;
double dry = 1.0-wet;
double glitch = 0.60;
double tempSampleL;
double tempSampleR;
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 aDubSub. We want a 'air' hiss
long double drySampleL = inputSampleL;
long double drySampleR = inputSampleR;
// here's the plan.
// Grind Boost
// Grind Output Level
// Bass Split Freq
// Bass Drive
// Bass Voicing
// Bass Output Level
// Sub Oct Drive
// Sub Voicing
// Sub Output Level
// Dry/Wet
oscGateL += fabs(inputSampleL * 10.0);
oscGateL -= 0.001;
if (oscGateL > 1.0) oscGateL = 1.0;
if (oscGateL < 0) oscGateL = 0;
oscGateR += fabs(inputSampleR * 10.0);
oscGateR -= 0.001;
if (oscGateR > 1.0) oscGateR = 1.0;
if (oscGateR < 0) oscGateR = 0;
//got a value that only goes down low when there's silence or near silence on input
clampL = 1.0-oscGateL;
clampL *= 0.00001;
clampR = 1.0-oscGateR;
clampR *= 0.00001;
//set up the thing to choke off oscillations- belt and suspenders affair
if (flip)
{
tempSampleL = inputSampleL;
iirDriveSampleAL = (iirDriveSampleAL * (1 - iirAmount)) + (inputSampleL * iirAmount);
inputSampleL -= iirDriveSampleAL;
iirDriveSampleCL = (iirDriveSampleCL * (1 - iirAmount)) + (inputSampleL * iirAmount);
inputSampleL -= iirDriveSampleCL;
iirDriveSampleEL = (iirDriveSampleEL * (1 - iirAmount)) + (inputSampleL * iirAmount);
inputSampleL -= iirDriveSampleEL;
ataLowpassL = tempSampleL - inputSampleL;
tempSampleR = inputSampleR;
iirDriveSampleAR = (iirDriveSampleAR * (1 - iirAmount)) + (inputSampleR * iirAmount);
inputSampleR -= iirDriveSampleAR;
iirDriveSampleCR = (iirDriveSampleCR * (1 - iirAmount)) + (inputSampleR * iirAmount);
inputSampleR -= iirDriveSampleCR;
iirDriveSampleER = (iirDriveSampleER * (1 - iirAmount)) + (inputSampleR * iirAmount);
inputSampleR -= iirDriveSampleER;
ataLowpassR = tempSampleR - inputSampleR;
}
else
{
tempSampleL = inputSampleL;
iirDriveSampleBL = (iirDriveSampleBL * (1 - iirAmount)) + (inputSampleL * iirAmount);
inputSampleL -= iirDriveSampleBL;
iirDriveSampleDL = (iirDriveSampleDL * (1 - iirAmount)) + (inputSampleL * iirAmount);
inputSampleL -= iirDriveSampleDL;
iirDriveSampleFL = (iirDriveSampleFL * (1 - iirAmount)) + (inputSampleL * iirAmount);
inputSampleL -= iirDriveSampleFL;
ataLowpassL = tempSampleL - inputSampleL;
tempSampleR = inputSampleR;
iirDriveSampleBR = (iirDriveSampleBR * (1 - iirAmount)) + (inputSampleR * iirAmount);
inputSampleR -= iirDriveSampleBR;
iirDriveSampleDR = (iirDriveSampleDR * (1 - iirAmount)) + (inputSampleR * iirAmount);
inputSampleR -= iirDriveSampleDR;
iirDriveSampleFR = (iirDriveSampleFR * (1 - iirAmount)) + (inputSampleR * iirAmount);
inputSampleR -= iirDriveSampleFR;
ataLowpassR = tempSampleR - inputSampleR;
}
//highpass section
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;}
out = driveone;
while (out > glitch)
{
out -= glitch;
inputSampleL -= (inputSampleL * (fabs(inputSampleL) * glitch) * (fabs(inputSampleL) * glitch) );
inputSampleR -= (inputSampleR * (fabs(inputSampleR) * glitch) * (fabs(inputSampleR) * glitch) );
inputSampleL *= (1.0+glitch);
inputSampleR *= (1.0+glitch);
}
//that's taken care of the really high gain stuff
inputSampleL -= (inputSampleL * (fabs(inputSampleL) * out) * (fabs(inputSampleL) * out) );
inputSampleR -= (inputSampleR * (fabs(inputSampleR) * out) * (fabs(inputSampleR) * out) );
inputSampleL *= (1.0+out);
inputSampleR *= (1.0+out);
if (ataLowpassL > 0)
{if (WasNegativeL){SubOctaveL = !SubOctaveL;} WasNegativeL = false;}
else {WasNegativeL = true;}
if (ataLowpassR > 0)
{if (WasNegativeR){SubOctaveR = !SubOctaveR;} WasNegativeR = false;}
else {WasNegativeR = true;}
//set up polarities for sub-bass version
randyL = (rand()/(double)RAND_MAX)*fuzz; //0 to 1 the noise, may not be needed
invrandyL = (1.0-randyL);
randyL /= 2.0;
randyR = (rand()/(double)RAND_MAX)*fuzz; //0 to 1 the noise, may not be needed
invrandyR = (1.0-randyR);
randyR /= 2.0;
//set up the noise
iirSampleAL = (iirSampleAL * altBmount) + (ataLowpassL * iirBmount); ataLowpassL -= iirSampleAL;
iirSampleBL = (iirSampleBL * altBmount) + (ataLowpassL * iirBmount); ataLowpassL -= iirSampleBL;
iirSampleCL = (iirSampleCL * altBmount) + (ataLowpassL * iirBmount); ataLowpassL -= iirSampleCL;
iirSampleDL = (iirSampleDL * altBmount) + (ataLowpassL * iirBmount); ataLowpassL -= iirSampleDL;
iirSampleEL = (iirSampleEL * altBmount) + (ataLowpassL * iirBmount); ataLowpassL -= iirSampleEL;
iirSampleFL = (iirSampleFL * altBmount) + (ataLowpassL * iirBmount); ataLowpassL -= iirSampleFL;
iirSampleGL = (iirSampleGL * altBmount) + (ataLowpassL * iirBmount); ataLowpassL -= iirSampleGL;
iirSampleHL = (iirSampleHL * altBmount) + (ataLowpassL * iirBmount); ataLowpassL -= iirSampleHL;
iirSampleIL = (iirSampleIL * altBmount) + (ataLowpassL * iirBmount); ataLowpassL -= iirSampleIL;
iirSampleJL = (iirSampleJL * altBmount) + (ataLowpassL * iirBmount); ataLowpassL -= iirSampleJL;
iirSampleKL = (iirSampleKL * altBmount) + (ataLowpassL * iirBmount); ataLowpassL -= iirSampleKL;
iirSampleLL = (iirSampleLL * altBmount) + (ataLowpassL * iirBmount); ataLowpassL -= iirSampleLL;
iirSampleML = (iirSampleML * altBmount) + (ataLowpassL * iirBmount); ataLowpassL -= iirSampleML;
iirSampleNL = (iirSampleNL * altBmount) + (ataLowpassL * iirBmount); ataLowpassL -= iirSampleNL;
iirSampleOL = (iirSampleOL * altBmount) + (ataLowpassL * iirBmount); ataLowpassL -= iirSampleOL;
iirSamplePL = (iirSamplePL * altBmount) + (ataLowpassL * iirBmount); ataLowpassL -= iirSamplePL;
iirSampleQL = (iirSampleQL * altBmount) + (ataLowpassL * iirBmount); ataLowpassL -= iirSampleQL;
iirSampleRL = (iirSampleRL * altBmount) + (ataLowpassL * iirBmount); ataLowpassL -= iirSampleRL;
iirSampleSL = (iirSampleSL * altBmount) + (ataLowpassL * iirBmount); ataLowpassL -= iirSampleSL;
iirSampleTL = (iirSampleTL * altBmount) + (ataLowpassL * iirBmount); ataLowpassL -= iirSampleTL;
iirSampleUL = (iirSampleUL * altBmount) + (ataLowpassL * iirBmount); ataLowpassL -= iirSampleUL;
iirSampleVL = (iirSampleVL * altBmount) + (ataLowpassL * iirBmount); ataLowpassL -= iirSampleVL;
iirSampleAR = (iirSampleAR * altBmount) + (ataLowpassR * iirBmount); ataLowpassR -= iirSampleAR;
iirSampleBR = (iirSampleBR * altBmount) + (ataLowpassR * iirBmount); ataLowpassR -= iirSampleBR;
iirSampleCR = (iirSampleCR * altBmount) + (ataLowpassR * iirBmount); ataLowpassR -= iirSampleCR;
iirSampleDR = (iirSampleDR * altBmount) + (ataLowpassR * iirBmount); ataLowpassR -= iirSampleDR;
iirSampleER = (iirSampleER * altBmount) + (ataLowpassR * iirBmount); ataLowpassR -= iirSampleER;
iirSampleFR = (iirSampleFR * altBmount) + (ataLowpassR * iirBmount); ataLowpassR -= iirSampleFR;
iirSampleGR = (iirSampleGR * altBmount) + (ataLowpassR * iirBmount); ataLowpassR -= iirSampleGR;
iirSampleHR = (iirSampleHR * altBmount) + (ataLowpassR * iirBmount); ataLowpassR -= iirSampleHR;
iirSampleIR = (iirSampleIR * altBmount) + (ataLowpassR * iirBmount); ataLowpassR -= iirSampleIR;
iirSampleJR = (iirSampleJR * altBmount) + (ataLowpassR * iirBmount); ataLowpassR -= iirSampleJR;
iirSampleKR = (iirSampleKR * altBmount) + (ataLowpassR * iirBmount); ataLowpassR -= iirSampleKR;
iirSampleLR = (iirSampleLR * altBmount) + (ataLowpassR * iirBmount); ataLowpassR -= iirSampleLR;
iirSampleMR = (iirSampleMR * altBmount) + (ataLowpassR * iirBmount); ataLowpassR -= iirSampleMR;
iirSampleNR = (iirSampleNR * altBmount) + (ataLowpassR * iirBmount); ataLowpassR -= iirSampleNR;
iirSampleOR = (iirSampleOR * altBmount) + (ataLowpassR * iirBmount); ataLowpassR -= iirSampleOR;
iirSamplePR = (iirSamplePR * altBmount) + (ataLowpassR * iirBmount); ataLowpassR -= iirSamplePR;
iirSampleQR = (iirSampleQR * altBmount) + (ataLowpassR * iirBmount); ataLowpassR -= iirSampleQR;
iirSampleRR = (iirSampleRR * altBmount) + (ataLowpassR * iirBmount); ataLowpassR -= iirSampleRR;
iirSampleSR = (iirSampleSR * altBmount) + (ataLowpassR * iirBmount); ataLowpassR -= iirSampleSR;
iirSampleTR = (iirSampleTR * altBmount) + (ataLowpassR * iirBmount); ataLowpassR -= iirSampleTR;
iirSampleUR = (iirSampleUR * altBmount) + (ataLowpassR * iirBmount); ataLowpassR -= iirSampleUR;
iirSampleVR = (iirSampleVR * altBmount) + (ataLowpassR * iirBmount); ataLowpassR -= iirSampleVR;
switch (bflip)
{
case 1:
iirHeadBumpAL += (ataLowpassL * BassGain);
iirHeadBumpAL -= (iirHeadBumpAL * iirHeadBumpAL * iirHeadBumpAL * HeadBumpFreq);
iirHeadBumpAL = (invrandyL * iirHeadBumpAL) + (randyL * iirHeadBumpBL) + (randyL * iirHeadBumpCL);
if (iirHeadBumpAL > 0) iirHeadBumpAL -= clampL;
if (iirHeadBumpAL < 0) iirHeadBumpAL += clampL;
HeadBumpL = iirHeadBumpAL;
iirHeadBumpAR += (ataLowpassR * BassGain);
iirHeadBumpAR -= (iirHeadBumpAR * iirHeadBumpAR * iirHeadBumpAR * HeadBumpFreq);
iirHeadBumpAR = (invrandyR * iirHeadBumpAR) + (randyR * iirHeadBumpBR) + (randyR * iirHeadBumpCR);
if (iirHeadBumpAR > 0) iirHeadBumpAR -= clampR;
if (iirHeadBumpAR < 0) iirHeadBumpAR += clampR;
HeadBumpR = iirHeadBumpAR;
break;
case 2:
iirHeadBumpBL += (ataLowpassL * BassGain);
iirHeadBumpBL -= (iirHeadBumpBL * iirHeadBumpBL * iirHeadBumpBL * HeadBumpFreq);
iirHeadBumpBL = (randyL * iirHeadBumpAL) + (invrandyL * iirHeadBumpBL) + (randyL * iirHeadBumpCL);
if (iirHeadBumpBL > 0) iirHeadBumpBL -= clampL;
if (iirHeadBumpBL < 0) iirHeadBumpBL += clampL;
HeadBumpL = iirHeadBumpBL;
iirHeadBumpBR += (ataLowpassR * BassGain);
iirHeadBumpBR -= (iirHeadBumpBR * iirHeadBumpBR * iirHeadBumpBR * HeadBumpFreq);
iirHeadBumpBR = (randyR * iirHeadBumpAR) + (invrandyR * iirHeadBumpBR) + (randyR * iirHeadBumpCR);
if (iirHeadBumpBR > 0) iirHeadBumpBR -= clampR;
if (iirHeadBumpBR < 0) iirHeadBumpBR += clampR;
HeadBumpR = iirHeadBumpBR;
break;
case 3:
iirHeadBumpCL += (ataLowpassL * BassGain);
iirHeadBumpCL -= (iirHeadBumpCL * iirHeadBumpCL * iirHeadBumpCL * HeadBumpFreq);
iirHeadBumpCL = (randyL * iirHeadBumpAL) + (randyL * iirHeadBumpBL) + (invrandyL * iirHeadBumpCL);
if (iirHeadBumpCL > 0) iirHeadBumpCL -= clampL;
if (iirHeadBumpCL < 0) iirHeadBumpCL += clampL;
HeadBumpL = iirHeadBumpCL;
iirHeadBumpCR += (ataLowpassR * BassGain);
iirHeadBumpCR -= (iirHeadBumpCR * iirHeadBumpCR * iirHeadBumpCR * HeadBumpFreq);
iirHeadBumpCR = (randyR * iirHeadBumpAR) + (randyR * iirHeadBumpBR) + (invrandyR * iirHeadBumpCR);
if (iirHeadBumpCR > 0) iirHeadBumpCR -= clampR;
if (iirHeadBumpCR < 0) iirHeadBumpCR += clampR;
HeadBumpR = iirHeadBumpCR;
break;
}
iirSampleWL = (iirSampleWL * altBmount) + (HeadBumpL * iirBmount); HeadBumpL -= iirSampleWL;
iirSampleXL = (iirSampleXL * altBmount) + (HeadBumpL * iirBmount); HeadBumpL -= iirSampleXL;
iirSampleWR = (iirSampleWR * altBmount) + (HeadBumpR * iirBmount); HeadBumpR -= iirSampleWR;
iirSampleXR = (iirSampleXR * altBmount) + (HeadBumpR * iirBmount); HeadBumpR -= iirSampleXR;
SubBumpL = HeadBumpL;
iirSampleYL = (iirSampleYL * altCmount) + (SubBumpL * iirCmount); SubBumpL -= iirSampleYL;
SubBumpR = HeadBumpR;
iirSampleYR = (iirSampleYR * altCmount) + (SubBumpR * iirCmount); SubBumpR -= iirSampleYR;
SubBumpL = fabs(SubBumpL);
if (SubOctaveL == false) {SubBumpL = -SubBumpL;}
SubBumpR = fabs(SubBumpR);
if (SubOctaveR == false) {SubBumpR = -SubBumpR;}
switch (bflip)
{
case 1:
iirSubBumpAL += (SubBumpL * SubGain);
iirSubBumpAL -= (iirSubBumpAL * iirSubBumpAL * iirSubBumpAL * SubBumpFreq);
iirSubBumpAL = (invrandyL * iirSubBumpAL) + (randyL * iirSubBumpBL) + (randyL * iirSubBumpCL);
if (iirSubBumpAL > 0) iirSubBumpAL -= clampL;
if (iirSubBumpAL < 0) iirSubBumpAL += clampL;
SubBumpL = iirSubBumpAL;
iirSubBumpAR += (SubBumpR * SubGain);
iirSubBumpAR -= (iirSubBumpAR * iirSubBumpAR * iirSubBumpAR * SubBumpFreq);
iirSubBumpAR = (invrandyR * iirSubBumpAR) + (randyR * iirSubBumpBR) + (randyR * iirSubBumpCR);
if (iirSubBumpAR > 0) iirSubBumpAR -= clampR;
if (iirSubBumpAR < 0) iirSubBumpAR += clampR;
SubBumpR = iirSubBumpAR;
break;
case 2:
iirSubBumpBL += (SubBumpL * SubGain);
iirSubBumpBL -= (iirSubBumpBL * iirSubBumpBL * iirSubBumpBL * SubBumpFreq);
iirSubBumpBL = (randyL * iirSubBumpAL) + (invrandyL * iirSubBumpBL) + (randyL * iirSubBumpCL);
if (iirSubBumpBL > 0) iirSubBumpBL -= clampL;
if (iirSubBumpBL < 0) iirSubBumpBL += clampL;
SubBumpL = iirSubBumpBL;
iirSubBumpBR += (SubBumpR * SubGain);
iirSubBumpBR -= (iirSubBumpBR * iirSubBumpBR * iirSubBumpBR * SubBumpFreq);
iirSubBumpBR = (randyR * iirSubBumpAR) + (invrandyR * iirSubBumpBR) + (randyR * iirSubBumpCR);
if (iirSubBumpBR > 0) iirSubBumpBR -= clampR;
if (iirSubBumpBR < 0) iirSubBumpBR += clampR;
SubBumpR = iirSubBumpBR;
break;
case 3:
iirSubBumpCL += (SubBumpL * SubGain);
iirSubBumpCL -= (iirSubBumpCL * iirSubBumpCL * iirSubBumpCL * SubBumpFreq);
iirSubBumpCL = (randyL * iirSubBumpAL) + (randyL * iirSubBumpBL) + (invrandyL * iirSubBumpCL);
if (iirSubBumpCL > 0) iirSubBumpCL -= clampL;
if (iirSubBumpCL < 0) iirSubBumpCL += clampL;
SubBumpL = iirSubBumpCL;
iirSubBumpCR += (SubBumpR * SubGain);
iirSubBumpCR -= (iirSubBumpCR * iirSubBumpCR * iirSubBumpCR * SubBumpFreq);
iirSubBumpCR = (randyR * iirSubBumpAR) + (randyR * iirSubBumpBR) + (invrandyR * iirSubBumpCR);
if (iirSubBumpCR > 0) iirSubBumpCR -= clampR;
if (iirSubBumpCR < 0) iirSubBumpCR += clampR;
SubBumpR = iirSubBumpCR;
break;
}
iirSampleZL = (iirSampleZL * altCmount) + (SubBumpL * iirCmount); SubBumpL -= iirSampleZL;
iirSampleZR = (iirSampleZR * altCmount) + (SubBumpR * iirCmount); SubBumpR -= iirSampleZR;
inputSampleL *= driveoutput; //start with the drive section then add lows and subs
inputSampleR *= driveoutput; //start with the drive section then add lows and subs
inputSampleL += ((HeadBumpL + lastHeadBumpL) * BassOutGain);
inputSampleL += ((SubBumpL + lastSubBumpL) * SubOutGain);
inputSampleR += ((HeadBumpR + lastHeadBumpR) * BassOutGain);
inputSampleR += ((SubBumpR + lastSubBumpR) * SubOutGain);
lastHeadBumpL = HeadBumpL;
lastSubBumpL = SubBumpL;
lastHeadBumpR = HeadBumpR;
lastSubBumpR = SubBumpR;
if (wet !=1.0) {
inputSampleL = (inputSampleL * wet) + (drySampleL * dry);
inputSampleR = (inputSampleR * wet) + (drySampleR * dry);
}
//Dry/Wet control, defaults to the last slider
flip = !flip;
bflip++;
if (bflip < 1 || bflip > 3) bflip = 1;
//noise shaping to 32-bit floating point
float fpTemp = inputSampleL;
fpNShapeL += (inputSampleL-fpTemp);
inputSampleL += fpNShapeL;
//if this confuses you look at the wordlength for fpTemp :)
fpTemp = inputSampleR;
fpNShapeR += (inputSampleR-fpTemp);
inputSampleR += fpNShapeR;
//for deeper space and warmth, we try a non-oscillating noise shaping
//that is kind of ruthless: it will forever retain the rounding errors
//except we'll dial it back a hair at the end of every buffer processed
//end noise shaping on 32 bit output
*out1 = inputSampleL;
*out2 = inputSampleR;
*in1++;
*in2++;
*out1++;
*out2++;
}
fpNShapeL *= 0.999999;
fpNShapeR *= 0.999999;
//we will just delicately dial back the FP noise shaping, not even every sample
//this is a good place to put subtle 'no runaway' calculations, though bear in mind
//that it will be called more often when you use shorter sample buffers in the DAW.
//So, very low latency operation will call these calculations more often.
}
void DubSub::processDoubleReplacing(double **inputs, double **outputs, VstInt32 sampleFrames)
{
double* in1 = inputs[0];
double* in2 = inputs[1];
double* out1 = outputs[0];
double* out2 = outputs[1];
double overallscale = 1.0;
overallscale /= 44100.0;
overallscale *= getSampleRate();
double driveone = pow(A*3.0,2);
double driveoutput = pow(B,2);
double iirAmount = ((C*0.33)+0.1)/overallscale;
double ataLowpassL;
double ataLowpassR;
double randyL;
double invrandyL;
double randyR;
double invrandyR;
double HeadBumpL = 0.0;
double HeadBumpR = 0.0;
double BassGain = D * 0.1;
double HeadBumpFreq = ((E*0.1)+0.0001)/overallscale;
double iirBmount = HeadBumpFreq/44.1;
double altBmount = 1.0 - iirBmount;
double BassOutGain = pow(F,2) * 0.5;
double SubBumpL = 0.0;
double SubBumpR = 0.0;
double SubGain = G * 0.1;
double SubBumpFreq = ((H*0.1)+0.0001)/overallscale;
double iirCmount = SubBumpFreq/44.1;
double altCmount = 1.0 - iirCmount;
double SubOutGain = pow(I,2) * 0.45;
double clampL = 0.0;
double clampR = 0.0;
double out;
double fuzz = 0.111;
double wet = J;
double dry = 1.0-wet;
double glitch = 0.60;
double tempSampleL;
double tempSampleR;
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 aDubSub. We want a 'air' hiss
double drySampleL = inputSampleL;
double drySampleR = inputSampleR;
// here's the plan.
// Grind Boost
// Grind Output Level
// Bass Split Freq
// Bass Drive
// Bass Voicing
// Bass Output Level
// Sub Oct Drive
// Sub Voicing
// Sub Output Level
// Dry/Wet
oscGateL += fabs(inputSampleL * 10.0);
oscGateL -= 0.001;
if (oscGateL > 1.0) oscGateL = 1.0;
if (oscGateL < 0) oscGateL = 0;
oscGateR += fabs(inputSampleR * 10.0);
oscGateR -= 0.001;
if (oscGateR > 1.0) oscGateR = 1.0;
if (oscGateR < 0) oscGateR = 0;
//got a value that only goes down low when there's silence or near silence on input
clampL = 1.0-oscGateL;
clampL *= 0.00001;
clampR = 1.0-oscGateR;
clampR *= 0.00001;
//set up the thing to choke off oscillations- belt and suspenders affair
if (flip)
{
tempSampleL = inputSampleL;
iirDriveSampleAL = (iirDriveSampleAL * (1 - iirAmount)) + (inputSampleL * iirAmount);
inputSampleL -= iirDriveSampleAL;
iirDriveSampleCL = (iirDriveSampleCL * (1 - iirAmount)) + (inputSampleL * iirAmount);
inputSampleL -= iirDriveSampleCL;
iirDriveSampleEL = (iirDriveSampleEL * (1 - iirAmount)) + (inputSampleL * iirAmount);
inputSampleL -= iirDriveSampleEL;
ataLowpassL = tempSampleL - inputSampleL;
tempSampleR = inputSampleR;
iirDriveSampleAR = (iirDriveSampleAR * (1 - iirAmount)) + (inputSampleR * iirAmount);
inputSampleR -= iirDriveSampleAR;
iirDriveSampleCR = (iirDriveSampleCR * (1 - iirAmount)) + (inputSampleR * iirAmount);
inputSampleR -= iirDriveSampleCR;
iirDriveSampleER = (iirDriveSampleER * (1 - iirAmount)) + (inputSampleR * iirAmount);
inputSampleR -= iirDriveSampleER;
ataLowpassR = tempSampleR - inputSampleR;
}
else
{
tempSampleL = inputSampleL;
iirDriveSampleBL = (iirDriveSampleBL * (1 - iirAmount)) + (inputSampleL * iirAmount);
inputSampleL -= iirDriveSampleBL;
iirDriveSampleDL = (iirDriveSampleDL * (1 - iirAmount)) + (inputSampleL * iirAmount);
inputSampleL -= iirDriveSampleDL;
iirDriveSampleFL = (iirDriveSampleFL * (1 - iirAmount)) + (inputSampleL * iirAmount);
inputSampleL -= iirDriveSampleFL;
ataLowpassL = tempSampleL - inputSampleL;
tempSampleR = inputSampleR;
iirDriveSampleBR = (iirDriveSampleBR * (1 - iirAmount)) + (inputSampleR * iirAmount);
inputSampleR -= iirDriveSampleBR;
iirDriveSampleDR = (iirDriveSampleDR * (1 - iirAmount)) + (inputSampleR * iirAmount);
inputSampleR -= iirDriveSampleDR;
iirDriveSampleFR = (iirDriveSampleFR * (1 - iirAmount)) + (inputSampleR * iirAmount);
inputSampleR -= iirDriveSampleFR;
ataLowpassR = tempSampleR - inputSampleR;
}
//highpass section
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;}
out = driveone;
while (out > glitch)
{
out -= glitch;
inputSampleL -= (inputSampleL * (fabs(inputSampleL) * glitch) * (fabs(inputSampleL) * glitch) );
inputSampleR -= (inputSampleR * (fabs(inputSampleR) * glitch) * (fabs(inputSampleR) * glitch) );
inputSampleL *= (1.0+glitch);
inputSampleR *= (1.0+glitch);
}
//that's taken care of the really high gain stuff
inputSampleL -= (inputSampleL * (fabs(inputSampleL) * out) * (fabs(inputSampleL) * out) );
inputSampleR -= (inputSampleR * (fabs(inputSampleR) * out) * (fabs(inputSampleR) * out) );
inputSampleL *= (1.0+out);
inputSampleR *= (1.0+out);
if (ataLowpassL > 0)
{if (WasNegativeL){SubOctaveL = !SubOctaveL;} WasNegativeL = false;}
else {WasNegativeL = true;}
if (ataLowpassR > 0)
{if (WasNegativeR){SubOctaveR = !SubOctaveR;} WasNegativeR = false;}
else {WasNegativeR = true;}
//set up polarities for sub-bass version
randyL = (rand()/(double)RAND_MAX)*fuzz; //0 to 1 the noise, may not be needed
invrandyL = (1.0-randyL);
randyL /= 2.0;
randyR = (rand()/(double)RAND_MAX)*fuzz; //0 to 1 the noise, may not be needed
invrandyR = (1.0-randyR);
randyR /= 2.0;
//set up the noise
iirSampleAL = (iirSampleAL * altBmount) + (ataLowpassL * iirBmount); ataLowpassL -= iirSampleAL;
iirSampleBL = (iirSampleBL * altBmount) + (ataLowpassL * iirBmount); ataLowpassL -= iirSampleBL;
iirSampleCL = (iirSampleCL * altBmount) + (ataLowpassL * iirBmount); ataLowpassL -= iirSampleCL;
iirSampleDL = (iirSampleDL * altBmount) + (ataLowpassL * iirBmount); ataLowpassL -= iirSampleDL;
iirSampleEL = (iirSampleEL * altBmount) + (ataLowpassL * iirBmount); ataLowpassL -= iirSampleEL;
iirSampleFL = (iirSampleFL * altBmount) + (ataLowpassL * iirBmount); ataLowpassL -= iirSampleFL;
iirSampleGL = (iirSampleGL * altBmount) + (ataLowpassL * iirBmount); ataLowpassL -= iirSampleGL;
iirSampleHL = (iirSampleHL * altBmount) + (ataLowpassL * iirBmount); ataLowpassL -= iirSampleHL;
iirSampleIL = (iirSampleIL * altBmount) + (ataLowpassL * iirBmount); ataLowpassL -= iirSampleIL;
iirSampleJL = (iirSampleJL * altBmount) + (ataLowpassL * iirBmount); ataLowpassL -= iirSampleJL;
iirSampleKL = (iirSampleKL * altBmount) + (ataLowpassL * iirBmount); ataLowpassL -= iirSampleKL;
iirSampleLL = (iirSampleLL * altBmount) + (ataLowpassL * iirBmount); ataLowpassL -= iirSampleLL;
iirSampleML = (iirSampleML * altBmount) + (ataLowpassL * iirBmount); ataLowpassL -= iirSampleML;
iirSampleNL = (iirSampleNL * altBmount) + (ataLowpassL * iirBmount); ataLowpassL -= iirSampleNL;
iirSampleOL = (iirSampleOL * altBmount) + (ataLowpassL * iirBmount); ataLowpassL -= iirSampleOL;
iirSamplePL = (iirSamplePL * altBmount) + (ataLowpassL * iirBmount); ataLowpassL -= iirSamplePL;
iirSampleQL = (iirSampleQL * altBmount) + (ataLowpassL * iirBmount); ataLowpassL -= iirSampleQL;
iirSampleRL = (iirSampleRL * altBmount) + (ataLowpassL * iirBmount); ataLowpassL -= iirSampleRL;
iirSampleSL = (iirSampleSL * altBmount) + (ataLowpassL * iirBmount); ataLowpassL -= iirSampleSL;
iirSampleTL = (iirSampleTL * altBmount) + (ataLowpassL * iirBmount); ataLowpassL -= iirSampleTL;
iirSampleUL = (iirSampleUL * altBmount) + (ataLowpassL * iirBmount); ataLowpassL -= iirSampleUL;
iirSampleVL = (iirSampleVL * altBmount) + (ataLowpassL * iirBmount); ataLowpassL -= iirSampleVL;
iirSampleAR = (iirSampleAR * altBmount) + (ataLowpassR * iirBmount); ataLowpassR -= iirSampleAR;
iirSampleBR = (iirSampleBR * altBmount) + (ataLowpassR * iirBmount); ataLowpassR -= iirSampleBR;
iirSampleCR = (iirSampleCR * altBmount) + (ataLowpassR * iirBmount); ataLowpassR -= iirSampleCR;
iirSampleDR = (iirSampleDR * altBmount) + (ataLowpassR * iirBmount); ataLowpassR -= iirSampleDR;
iirSampleER = (iirSampleER * altBmount) + (ataLowpassR * iirBmount); ataLowpassR -= iirSampleER;
iirSampleFR = (iirSampleFR * altBmount) + (ataLowpassR * iirBmount); ataLowpassR -= iirSampleFR;
iirSampleGR = (iirSampleGR * altBmount) + (ataLowpassR * iirBmount); ataLowpassR -= iirSampleGR;
iirSampleHR = (iirSampleHR * altBmount) + (ataLowpassR * iirBmount); ataLowpassR -= iirSampleHR;
iirSampleIR = (iirSampleIR * altBmount) + (ataLowpassR * iirBmount); ataLowpassR -= iirSampleIR;
iirSampleJR = (iirSampleJR * altBmount) + (ataLowpassR * iirBmount); ataLowpassR -= iirSampleJR;
iirSampleKR = (iirSampleKR * altBmount) + (ataLowpassR * iirBmount); ataLowpassR -= iirSampleKR;
iirSampleLR = (iirSampleLR * altBmount) + (ataLowpassR * iirBmount); ataLowpassR -= iirSampleLR;
iirSampleMR = (iirSampleMR * altBmount) + (ataLowpassR * iirBmount); ataLowpassR -= iirSampleMR;
iirSampleNR = (iirSampleNR * altBmount) + (ataLowpassR * iirBmount); ataLowpassR -= iirSampleNR;
iirSampleOR = (iirSampleOR * altBmount) + (ataLowpassR * iirBmount); ataLowpassR -= iirSampleOR;
iirSamplePR = (iirSamplePR * altBmount) + (ataLowpassR * iirBmount); ataLowpassR -= iirSamplePR;
iirSampleQR = (iirSampleQR * altBmount) + (ataLowpassR * iirBmount); ataLowpassR -= iirSampleQR;
iirSampleRR = (iirSampleRR * altBmount) + (ataLowpassR * iirBmount); ataLowpassR -= iirSampleRR;
iirSampleSR = (iirSampleSR * altBmount) + (ataLowpassR * iirBmount); ataLowpassR -= iirSampleSR;
iirSampleTR = (iirSampleTR * altBmount) + (ataLowpassR * iirBmount); ataLowpassR -= iirSampleTR;
iirSampleUR = (iirSampleUR * altBmount) + (ataLowpassR * iirBmount); ataLowpassR -= iirSampleUR;
iirSampleVR = (iirSampleVR * altBmount) + (ataLowpassR * iirBmount); ataLowpassR -= iirSampleVR;
switch (bflip)
{
case 1:
iirHeadBumpAL += (ataLowpassL * BassGain);
iirHeadBumpAL -= (iirHeadBumpAL * iirHeadBumpAL * iirHeadBumpAL * HeadBumpFreq);
iirHeadBumpAL = (invrandyL * iirHeadBumpAL) + (randyL * iirHeadBumpBL) + (randyL * iirHeadBumpCL);
if (iirHeadBumpAL > 0) iirHeadBumpAL -= clampL;
if (iirHeadBumpAL < 0) iirHeadBumpAL += clampL;
HeadBumpL = iirHeadBumpAL;
iirHeadBumpAR += (ataLowpassR * BassGain);
iirHeadBumpAR -= (iirHeadBumpAR * iirHeadBumpAR * iirHeadBumpAR * HeadBumpFreq);
iirHeadBumpAR = (invrandyR * iirHeadBumpAR) + (randyR * iirHeadBumpBR) + (randyR * iirHeadBumpCR);
if (iirHeadBumpAR > 0) iirHeadBumpAR -= clampR;
if (iirHeadBumpAR < 0) iirHeadBumpAR += clampR;
HeadBumpR = iirHeadBumpAR;
break;
case 2:
iirHeadBumpBL += (ataLowpassL * BassGain);
iirHeadBumpBL -= (iirHeadBumpBL * iirHeadBumpBL * iirHeadBumpBL * HeadBumpFreq);
iirHeadBumpBL = (randyL * iirHeadBumpAL) + (invrandyL * iirHeadBumpBL) + (randyL * iirHeadBumpCL);
if (iirHeadBumpBL > 0) iirHeadBumpBL -= clampL;
if (iirHeadBumpBL < 0) iirHeadBumpBL += clampL;
HeadBumpL = iirHeadBumpBL;
iirHeadBumpBR += (ataLowpassR * BassGain);
iirHeadBumpBR -= (iirHeadBumpBR * iirHeadBumpBR * iirHeadBumpBR * HeadBumpFreq);
iirHeadBumpBR = (randyR * iirHeadBumpAR) + (invrandyR * iirHeadBumpBR) + (randyR * iirHeadBumpCR);
if (iirHeadBumpBR > 0) iirHeadBumpBR -= clampR;
if (iirHeadBumpBR < 0) iirHeadBumpBR += clampR;
HeadBumpR = iirHeadBumpBR;
break;
case 3:
iirHeadBumpCL += (ataLowpassL * BassGain);
iirHeadBumpCL -= (iirHeadBumpCL * iirHeadBumpCL * iirHeadBumpCL * HeadBumpFreq);
iirHeadBumpCL = (randyL * iirHeadBumpAL) + (randyL * iirHeadBumpBL) + (invrandyL * iirHeadBumpCL);
if (iirHeadBumpCL > 0) iirHeadBumpCL -= clampL;
if (iirHeadBumpCL < 0) iirHeadBumpCL += clampL;
HeadBumpL = iirHeadBumpCL;
iirHeadBumpCR += (ataLowpassR * BassGain);
iirHeadBumpCR -= (iirHeadBumpCR * iirHeadBumpCR * iirHeadBumpCR * HeadBumpFreq);
iirHeadBumpCR = (randyR * iirHeadBumpAR) + (randyR * iirHeadBumpBR) + (invrandyR * iirHeadBumpCR);
if (iirHeadBumpCR > 0) iirHeadBumpCR -= clampR;
if (iirHeadBumpCR < 0) iirHeadBumpCR += clampR;
HeadBumpR = iirHeadBumpCR;
break;
}
iirSampleWL = (iirSampleWL * altBmount) + (HeadBumpL * iirBmount); HeadBumpL -= iirSampleWL;
iirSampleXL = (iirSampleXL * altBmount) + (HeadBumpL * iirBmount); HeadBumpL -= iirSampleXL;
iirSampleWR = (iirSampleWR * altBmount) + (HeadBumpR * iirBmount); HeadBumpR -= iirSampleWR;
iirSampleXR = (iirSampleXR * altBmount) + (HeadBumpR * iirBmount); HeadBumpR -= iirSampleXR;
SubBumpL = HeadBumpL;
iirSampleYL = (iirSampleYL * altCmount) + (SubBumpL * iirCmount); SubBumpL -= iirSampleYL;
SubBumpR = HeadBumpR;
iirSampleYR = (iirSampleYR * altCmount) + (SubBumpR * iirCmount); SubBumpR -= iirSampleYR;
SubBumpL = fabs(SubBumpL);
if (SubOctaveL == false) {SubBumpL = -SubBumpL;}
SubBumpR = fabs(SubBumpR);
if (SubOctaveR == false) {SubBumpR = -SubBumpR;}
switch (bflip)
{
case 1:
iirSubBumpAL += (SubBumpL * SubGain);
iirSubBumpAL -= (iirSubBumpAL * iirSubBumpAL * iirSubBumpAL * SubBumpFreq);
iirSubBumpAL = (invrandyL * iirSubBumpAL) + (randyL * iirSubBumpBL) + (randyL * iirSubBumpCL);
if (iirSubBumpAL > 0) iirSubBumpAL -= clampL;
if (iirSubBumpAL < 0) iirSubBumpAL += clampL;
SubBumpL = iirSubBumpAL;
iirSubBumpAR += (SubBumpR * SubGain);
iirSubBumpAR -= (iirSubBumpAR * iirSubBumpAR * iirSubBumpAR * SubBumpFreq);
iirSubBumpAR = (invrandyR * iirSubBumpAR) + (randyR * iirSubBumpBR) + (randyR * iirSubBumpCR);
if (iirSubBumpAR > 0) iirSubBumpAR -= clampR;
if (iirSubBumpAR < 0) iirSubBumpAR += clampR;
SubBumpR = iirSubBumpAR;
break;
case 2:
iirSubBumpBL += (SubBumpL * SubGain);
iirSubBumpBL -= (iirSubBumpBL * iirSubBumpBL * iirSubBumpBL * SubBumpFreq);
iirSubBumpBL = (randyL * iirSubBumpAL) + (invrandyL * iirSubBumpBL) + (randyL * iirSubBumpCL);
if (iirSubBumpBL > 0) iirSubBumpBL -= clampL;
if (iirSubBumpBL < 0) iirSubBumpBL += clampL;
SubBumpL = iirSubBumpBL;
iirSubBumpBR += (SubBumpR * SubGain);
iirSubBumpBR -= (iirSubBumpBR * iirSubBumpBR * iirSubBumpBR * SubBumpFreq);
iirSubBumpBR = (randyR * iirSubBumpAR) + (invrandyR * iirSubBumpBR) + (randyR * iirSubBumpCR);
if (iirSubBumpBR > 0) iirSubBumpBR -= clampR;
if (iirSubBumpBR < 0) iirSubBumpBR += clampR;
SubBumpR = iirSubBumpBR;
break;
case 3:
iirSubBumpCL += (SubBumpL * SubGain);
iirSubBumpCL -= (iirSubBumpCL * iirSubBumpCL * iirSubBumpCL * SubBumpFreq);
iirSubBumpCL = (randyL * iirSubBumpAL) + (randyL * iirSubBumpBL) + (invrandyL * iirSubBumpCL);
if (iirSubBumpCL > 0) iirSubBumpCL -= clampL;
if (iirSubBumpCL < 0) iirSubBumpCL += clampL;
SubBumpL = iirSubBumpCL;
iirSubBumpCR += (SubBumpR * SubGain);
iirSubBumpCR -= (iirSubBumpCR * iirSubBumpCR * iirSubBumpCR * SubBumpFreq);
iirSubBumpCR = (randyR * iirSubBumpAR) + (randyR * iirSubBumpBR) + (invrandyR * iirSubBumpCR);
if (iirSubBumpCR > 0) iirSubBumpCR -= clampR;
if (iirSubBumpCR < 0) iirSubBumpCR += clampR;
SubBumpR = iirSubBumpCR;
break;
}
iirSampleZL = (iirSampleZL * altCmount) + (SubBumpL * iirCmount); SubBumpL -= iirSampleZL;
iirSampleZR = (iirSampleZR * altCmount) + (SubBumpR * iirCmount); SubBumpR -= iirSampleZR;
inputSampleL *= driveoutput; //start with the drive section then add lows and subs
inputSampleR *= driveoutput; //start with the drive section then add lows and subs
inputSampleL += ((HeadBumpL + lastHeadBumpL) * BassOutGain);
inputSampleL += ((SubBumpL + lastSubBumpL) * SubOutGain);
inputSampleR += ((HeadBumpR + lastHeadBumpR) * BassOutGain);
inputSampleR += ((SubBumpR + lastSubBumpR) * SubOutGain);
lastHeadBumpL = HeadBumpL;
lastSubBumpL = SubBumpL;
lastHeadBumpR = HeadBumpR;
lastSubBumpR = SubBumpR;
if (wet !=1.0) {
inputSampleL = (inputSampleL * wet) + (drySampleL * dry);
inputSampleR = (inputSampleR * wet) + (drySampleR * dry);
}
//Dry/Wet control, defaults to the last slider
flip = !flip;
bflip++;
if (bflip < 1 || bflip > 3) bflip = 1;
//noise shaping to 64-bit floating point
double fpTemp = inputSampleL;
fpNShapeL += (inputSampleL-fpTemp);
inputSampleL += fpNShapeL;
//if this confuses you look at the wordlength for fpTemp :)
fpTemp = inputSampleR;
fpNShapeR += (inputSampleR-fpTemp);
inputSampleR += fpNShapeR;
//for deeper space and warmth, we try a non-oscillating noise shaping
//that is kind of ruthless: it will forever retain the rounding errors
//except we'll dial it back a hair at the end of every buffer processed
//end noise shaping on 64 bit output
*out1 = inputSampleL;
*out2 = inputSampleR;
*in1++;
*in2++;
*out1++;
*out2++;
}
fpNShapeL *= 0.999999;
fpNShapeR *= 0.999999;
//we will just delicately dial back the FP noise shaping, not even every sample
//this is a good place to put subtle 'no runaway' calculations, though bear in mind
//that it will be called more often when you use shorter sample buffers in the DAW.
//So, very low latency operation will call these calculations more often.
}