mirror of
https://github.com/airwindows/airwindows.git
synced 2026-05-21 06:46:21 -06:00
DubSub
This commit is contained in:
parent
5d51c52e34
commit
4be92c81e7
44 changed files with 14203 additions and 0 deletions
287
plugins/MacVST/DubSub/source/DubSub.cpp
Executable file
287
plugins/MacVST/DubSub/source/DubSub.cpp
Executable 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;
|
||||
}
|
||||
179
plugins/MacVST/DubSub/source/DubSub.h
Executable file
179
plugins/MacVST/DubSub/source/DubSub.h
Executable 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
|
||||
835
plugins/MacVST/DubSub/source/DubSubProc.cpp
Executable file
835
plugins/MacVST/DubSub/source/DubSubProc.cpp
Executable 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.
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue