diff options
author | airwindows <jinx6568@sover.net> | 2018-04-07 14:59:26 -0400 |
---|---|---|
committer | airwindows <jinx6568@sover.net> | 2018-04-07 14:59:26 -0400 |
commit | 31a2f1a4e8f1c4aa7d4b7c36dd32ec5d0298b91b (patch) | |
tree | 03ac402bf0c7e988cfc4c10b7b86ad6d846170fb /plugins/LinuxVST/src | |
parent | 14e001ba28240d6a88045aea801ee8e38c6a235c (diff) | |
download | airwindows-lv2-port-31a2f1a4e8f1c4aa7d4b7c36dd32ec5d0298b91b.tar.gz airwindows-lv2-port-31a2f1a4e8f1c4aa7d4b7c36dd32ec5d0298b91b.tar.bz2 airwindows-lv2-port-31a2f1a4e8f1c4aa7d4b7c36dd32ec5d0298b91b.zip |
Slew Variations
Diffstat (limited to 'plugins/LinuxVST/src')
-rwxr-xr-x | plugins/LinuxVST/src/Slew/Slew.cpp | 184 | ||||
-rwxr-xr-x | plugins/LinuxVST/src/Slew/Slew.h | 79 | ||||
-rwxr-xr-x | plugins/LinuxVST/src/Slew/SlewProc.cpp | 188 | ||||
-rwxr-xr-x | plugins/LinuxVST/src/Slew2/Slew2.cpp | 138 | ||||
-rwxr-xr-x | plugins/LinuxVST/src/Slew2/Slew2.h | 95 | ||||
-rwxr-xr-x | plugins/LinuxVST/src/Slew2/Slew2Proc.cpp | 299 | ||||
-rwxr-xr-x | plugins/LinuxVST/src/SlewOnly/SlewOnly.cpp | 67 | ||||
-rwxr-xr-x | plugins/LinuxVST/src/SlewOnly/SlewOnly.h | 56 | ||||
-rwxr-xr-x | plugins/LinuxVST/src/SlewOnly/SlewOnlyProc.cpp | 159 |
9 files changed, 1265 insertions, 0 deletions
diff --git a/plugins/LinuxVST/src/Slew/Slew.cpp b/plugins/LinuxVST/src/Slew/Slew.cpp new file mode 100755 index 0000000..bba9875 --- /dev/null +++ b/plugins/LinuxVST/src/Slew/Slew.cpp @@ -0,0 +1,184 @@ +/* ======================================== + * Slew - Slew.h + * Created 8/12/11 by SPIAdmin + * Copyright (c) 2011 __MyCompanyName__, All rights reserved + * ======================================== */ + +#ifndef __Slew_H +#include "Slew.h" +#endif + +AudioEffect* createEffectInstance(audioMasterCallback audioMaster) +{ + return new Slew(audioMaster); +} + +Slew::Slew(audioMasterCallback audioMaster) : + AudioEffectX(audioMaster, kNumPrograms, kNumParameters) +{ + lastSampleL = 0.0; + lastSampleR = 0.0; + +// TODO: uncomment canDo entries according to your plugin's capabilities +// _canDo.insert("sendVstEvents"); // plug-in will send Vst events to Host. +// _canDo.insert("sendVstMidiEvent"); // plug-in will send MIDI events to Host. +// _canDo.insert("sendVstTimeInfo"); // unknown +// _canDo.insert("receiveVstEvents"); // plug-in can receive Vst events from Host. +// _canDo.insert("receiveVstMidiEvent"); // plug-in can receive MIDI events from Host. +// _canDo.insert("receiveVstTimeInfo"); // plug-in can receive Time info from Host. +// _canDo.insert("offline"); // plug-in supports offline functions (#offlineNotify, #offlinePrepare, #offlineRun). + _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("mixDryWet"); // dry/wet mix control +// _canDo.insert("noRealTime"); // no real-time processing +// _canDo.insert("multipass"); // unknown +// _canDo.insert("metapass"); // unknown +// _canDo.insert("x1in1out"); +// _canDo.insert("x1in2out"); +// _canDo.insert("x2in1out"); + _canDo.insert("x2in2out"); +// _canDo.insert("x2in4out"); +// _canDo.insert("x4in2out"); +// _canDo.insert("x4in4out"); +// _canDo.insert("x4in8out"); // 4:2 matrix to surround bus +// _canDo.insert("x8in4out"); // surround bus to 4:2 matrix +// _canDo.insert("x8in8out"); +// _canDo.insert("midiProgramNames"); // plug-in supports function #getMidiProgramName(). +// _canDo.insert("conformsToWindowRules"); // mac: doesn't mess with grafport. +// _canDo.insert("bypass"); // plug-in supports function #setBypass(). + + + // these configuration values are established in the header + 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 +} + +Slew::~Slew() +{ +} + +VstInt32 Slew::getVendorVersion () +{ + // TODO: return version number + return 1000; +} + +void Slew::setProgramName(char *name) { + vst_strncpy (_programName, name, kVstMaxProgNameLen); +} + +void Slew::getProgramName(char *name) { + vst_strncpy (name, _programName, kVstMaxProgNameLen); +} + +static float pinParameter(float data) +{ + if (data < 0.0f) return 0.0f; + if (data > 1.0f) return 1.0f; + return data; +} + +VstInt32 Slew::getChunk (void** data, bool isPreset) +{ + float *chunkData = (float *)calloc(kNumParameters, sizeof(float)); + chunkData[0] = gain; + /* 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 Slew::setChunk (void* data, VstInt32 byteSize, bool isPreset) +{ + float *chunkData = (float *)data; + gain = pinParameter(chunkData[0]); + /* 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 Slew::setParameter(VstInt32 index, float value) { + switch (index) { + case kSlewParam: + gain = value; + break; + default: // unknown parameter, shouldn't happen! + throw; + } +} + +float Slew::getParameter(VstInt32 index) { + switch (index) { + case kSlewParam: + return gain; + break; + default: // unknown parameter, shouldn't happen! + break; + } + return 0.0; +} + +void Slew::getParameterName(VstInt32 index, char *text) { + switch (index) { + case kSlewParam: + vst_strncpy (text, "Clamping", kVstMaxParamStrLen); + break; + default: // unknown parameter, shouldn't happen! + break; + } +} + +void Slew::getParameterDisplay(VstInt32 index, char *text) { + switch (index) { + case kSlewParam: + float2string (gain, text, kVstMaxParamStrLen); + break; + default: // unknown parameter, shouldn't happen! + break; + } +} + +void Slew::getParameterLabel(VstInt32 index, char *text) { + switch (index) { + case kSlewParam: + vst_strncpy (text, "", kVstMaxParamStrLen); + break; + default: // unknown parameter, shouldn't happen! + break; + } +} + +VstInt32 Slew::canDo(char *text) +{ + // 1 = yes, -1 = no, 0 = don't know + return (_canDo.find(text) == _canDo.end()) ? 0 : 1; +} + +bool Slew::getEffectName(char* name) { + vst_strncpy(name, "Slew", kVstMaxProductStrLen); + return true; +} + +VstPlugCategory Slew::getPlugCategory() { + return kPlugCategEffect; +} + +bool Slew::getProductString(char* text) { + vst_strncpy (text, "Slew", kVstMaxProductStrLen); + return true; +} + +bool Slew::getVendorString(char* text) { + vst_strncpy (text, "airwindows", kVstMaxVendorStrLen); + return true; +} diff --git a/plugins/LinuxVST/src/Slew/Slew.h b/plugins/LinuxVST/src/Slew/Slew.h new file mode 100755 index 0000000..29d0916 --- /dev/null +++ b/plugins/LinuxVST/src/Slew/Slew.h @@ -0,0 +1,79 @@ +/* ======================================== + * Slew - Slew.h + * Created 8/12/11 by SPIAdmin + * Copyright (c) 2011 __MyCompanyName__, All rights reserved + * ======================================== */ + +#ifndef __Slew_H +#define __Slew_H + +#ifndef __audioeffect__ +#include "audioeffectx.h" +#endif + +#include <set> +#include <string> +#include <math.h> + +// TODO: Change kFirstParameter to your first parameter and add any additional parameters. +enum { + kSlewParam = 0, + kNumParameters = 1 +}; + +// TODO: Add other macros or preprocessor defines here + +// TODO: Change to reflect your plugin +const int kNumPrograms = 0; +const int kNumInputs = 2; +const int kNumOutputs = 2; +const unsigned long kUniqueId = 'slew'; //Change this to what the AU identity is! + +class Slew : + public AudioEffectX +{ +public: + Slew(audioMasterCallback audioMaster); + ~Slew(); + + // Configuration + 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 + // when the plug-in is registered with them. + + virtual bool getVendorString(char* text); // Vendor info + virtual VstInt32 getVendorVersion(); // Version number + + // Processing + virtual void processReplacing (float** inputs, float** outputs, VstInt32 sampleFrames); + virtual void processDoubleReplacing (double** inputs, double** outputs, VstInt32 sampleFrames); + + // Programs and parameters + virtual VstInt32 getChunk (void** data, bool isPreset); + virtual VstInt32 setChunk (void* data, VstInt32 byteSize, bool isPreset); + + 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 + + // parameter values are all 0.0f to 1.0f + 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 + + // Capabilities + virtual VstInt32 canDo(char *text); +private: + char _programName[kVstMaxProgNameLen + 1]; + std::set< std::string > _canDo; + + float gain; + double lastSampleL; + double lastSampleR; +}; + +#endif diff --git a/plugins/LinuxVST/src/Slew/SlewProc.cpp b/plugins/LinuxVST/src/Slew/SlewProc.cpp new file mode 100755 index 0000000..5618bb7 --- /dev/null +++ b/plugins/LinuxVST/src/Slew/SlewProc.cpp @@ -0,0 +1,188 @@ +/* ======================================== + * Slew - Slew.h + * Created 8/12/11 by SPIAdmin + * Copyright (c) 2011 __MyCompanyName__, All rights reserved + * ======================================== */ + +#ifndef __Slew_H +#include "Slew.h" +#endif + +void Slew::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 inputSampleL; + double inputSampleR; + double outputSampleL; + double outputSampleR; + + double clamp; + double threshold = pow((1-gain),4)/overallscale; + + + + while (--sampleFrames >= 0) + { + inputSampleL = *in1; + inputSampleR = *in2; + if (inputSampleL<1.2e-38 && -inputSampleL<1.2e-38) { + static int noisesource = 0; + //this declares a variable before anything else is compiled. It won't keep assigning + //it to 0 for every sample, it's as if the declaration doesn't exist in this context, + //but it lets me add this denormalization fix in a single place rather than updating + //it in three different locations. The variable isn't thread-safe but this is only + //a random seed and we can share it with whatever. + noisesource = noisesource % 1700021; noisesource++; + int residue = noisesource * noisesource; + residue = residue % 170003; residue *= residue; + residue = residue % 17011; residue *= residue; + residue = residue % 1709; residue *= residue; + residue = residue % 173; residue *= residue; + residue = residue % 17; + double applyresidue = residue; + applyresidue *= 0.00000001; + applyresidue *= 0.00000001; + inputSampleL = applyresidue; + } + if (inputSampleR<1.2e-38 && -inputSampleR<1.2e-38) { + static int noisesource = 0; + noisesource = noisesource % 1700021; noisesource++; + int residue = noisesource * noisesource; + residue = residue % 170003; residue *= residue; + residue = residue % 17011; residue *= residue; + residue = residue % 1709; residue *= residue; + residue = residue % 173; residue *= residue; + residue = residue % 17; + double applyresidue = residue; + applyresidue *= 0.00000001; + applyresidue *= 0.00000001; + inputSampleR = applyresidue; + //this denormalization routine produces a white noise at -300 dB which the noise + //shaping will interact with to produce a bipolar output, but the noise is actually + //all positive. That should stop any variables from going denormal, and the routine + //only kicks in if digital black is input. As a final touch, if you save to 24-bit + //the silence will return to being digital black again. + } + + clamp = inputSampleL - lastSampleL; + outputSampleL = inputSampleL; + if (clamp > threshold) + outputSampleL = lastSampleL + threshold; + if (-clamp > threshold) + outputSampleL = lastSampleL - threshold; + lastSampleL = outputSampleL; + + clamp = inputSampleR - lastSampleR; + outputSampleR = inputSampleR; + if (clamp > threshold) + outputSampleR = lastSampleR + threshold; + if (-clamp > threshold) + outputSampleR = lastSampleR - threshold; + lastSampleR = outputSampleR; + + *out1 = outputSampleL; + *out2 = outputSampleR; + + *in1++; + *in2++; + *out1++; + *out2++; + } +} + +void Slew::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 inputSampleL; + double inputSampleR; + double outputSampleL; + double outputSampleR; + + double clamp; + double threshold = pow((1-gain),4)/overallscale; + + + while (--sampleFrames >= 0) + { + inputSampleL = *in1; + inputSampleR = *in2; + if (inputSampleL<1.2e-38 && -inputSampleL<1.2e-38) { + static int noisesource = 0; + //this declares a variable before anything else is compiled. It won't keep assigning + //it to 0 for every sample, it's as if the declaration doesn't exist in this context, + //but it lets me add this denormalization fix in a single place rather than updating + //it in three different locations. The variable isn't thread-safe but this is only + //a random seed and we can share it with whatever. + noisesource = noisesource % 1700021; noisesource++; + int residue = noisesource * noisesource; + residue = residue % 170003; residue *= residue; + residue = residue % 17011; residue *= residue; + residue = residue % 1709; residue *= residue; + residue = residue % 173; residue *= residue; + residue = residue % 17; + double applyresidue = residue; + applyresidue *= 0.00000001; + applyresidue *= 0.00000001; + inputSampleL = applyresidue; + } + if (inputSampleR<1.2e-38 && -inputSampleR<1.2e-38) { + static int noisesource = 0; + noisesource = noisesource % 1700021; noisesource++; + int residue = noisesource * noisesource; + residue = residue % 170003; residue *= residue; + residue = residue % 17011; residue *= residue; + residue = residue % 1709; residue *= residue; + residue = residue % 173; residue *= residue; + residue = residue % 17; + double applyresidue = residue; + applyresidue *= 0.00000001; + applyresidue *= 0.00000001; + inputSampleR = applyresidue; + //this denormalization routine produces a white noise at -300 dB which the noise + //shaping will interact with to produce a bipolar output, but the noise is actually + //all positive. That should stop any variables from going denormal, and the routine + //only kicks in if digital black is input. As a final touch, if you save to 24-bit + //the silence will return to being digital black again. + } + + clamp = inputSampleL - lastSampleL; + outputSampleL = inputSampleL; + if (clamp > threshold) + outputSampleL = lastSampleL + threshold; + if (-clamp > threshold) + outputSampleL = lastSampleL - threshold; + lastSampleL = outputSampleL; + + clamp = inputSampleR - lastSampleR; + outputSampleR = inputSampleR; + if (clamp > threshold) + outputSampleR = lastSampleR + threshold; + if (-clamp > threshold) + outputSampleR = lastSampleR - threshold; + lastSampleR = outputSampleR; + + *out1 = outputSampleL; + *out2 = outputSampleR; + + *in1++; + *in2++; + *out1++; + *out2++; + } +}
\ No newline at end of file diff --git a/plugins/LinuxVST/src/Slew2/Slew2.cpp b/plugins/LinuxVST/src/Slew2/Slew2.cpp new file mode 100755 index 0000000..99d6314 --- /dev/null +++ b/plugins/LinuxVST/src/Slew2/Slew2.cpp @@ -0,0 +1,138 @@ +/* ======================================== + * Slew2 - Slew2.h + * Copyright (c) 2016 airwindows, All rights reserved + * ======================================== */ + +#ifndef __Slew2_H +#include "Slew2.h" +#endif + +AudioEffect* createEffectInstance(audioMasterCallback audioMaster) {return new Slew2(audioMaster);} + +Slew2::Slew2(audioMasterCallback audioMaster) : + AudioEffectX(audioMaster, kNumPrograms, kNumParameters) +{ + A = 0.0; + + LataLast3Sample = LataLast2Sample = LataLast1Sample = 0.0; + LataHalfwaySample = LataHalfDrySample = LataHalfDiffSample = 0.0; + LataA = LataB = LataC = LataDrySample = LataDiffSample = LataPrevDiffSample = 0.0; + LataUpsampleHighTweak = 0.0414213562373095048801688; //more adds treble to upsampling + LataDecay = 0.915965594177219015; //Catalan's constant, more adds focus and clarity + lastSampleL = 0.0; + + RataLast3Sample = RataLast2Sample = RataLast1Sample = 0.0; + RataHalfwaySample = RataHalfDrySample = RataHalfDiffSample = 0.0; + RataA = RataB = RataC = RataDrySample = RataDiffSample = RataPrevDiffSample = 0.0; + RataUpsampleHighTweak = 0.0414213562373095048801688; //more adds treble to upsampling + RataDecay = 0.915965594177219015; //CRatalan's constant, more adds focus and clarity + LataFlip = false; //end reset of antialias parameters + RataFlip = false; //end reset of antialias parameters + lastSampleR = 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 +} + +Slew2::~Slew2() {} +VstInt32 Slew2::getVendorVersion () {return 1000;} +void Slew2::setProgramName(char *name) {vst_strncpy (_programName, name, kVstMaxProgNameLen);} +void Slew2::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 Slew2::getChunk (void** data, bool isPreset) +{ + float *chunkData = (float *)calloc(kNumParameters, sizeof(float)); + chunkData[0] = A; + /* 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 Slew2::setChunk (void* data, VstInt32 byteSize, bool isPreset) +{ + float *chunkData = (float *)data; + A = pinParameter(chunkData[0]); + /* 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 Slew2::setParameter(VstInt32 index, float value) { + switch (index) { + case kParamA: A = value; break; + default: throw; // unknown parameter, shouldn't happen! + } + //we can also set other defaults here, and do calculations that only have to happen + //once when parameters actually change. Here is the 'popup' setting its (global) values. + //variables can also be set in the processreplacing loop, and there they'll be set every buffersize + //here they're set when a parameter's actually changed, which should be less frequent, but + //you must use global variables in the Slew2.h file to do it. +} + +float Slew2::getParameter(VstInt32 index) { + switch (index) { + case kParamA: return A; 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 Slew2::getParameterName(VstInt32 index, char *text) { + switch (index) { + case kParamA: vst_strncpy (text, "Clamping", kVstMaxParamStrLen); break; + default: break; // unknown parameter, shouldn't happen! + } //this is our labels for displaying in the VST host +} + +void Slew2::getParameterDisplay(VstInt32 index, char *text) { + switch (index) { + case kParamA: float2string (A, text, kVstMaxParamStrLen); break; + default: break; // unknown parameter, shouldn't happen! + } //this displays the values and handles 'popups' where it's discrete choices +} + +void Slew2::getParameterLabel(VstInt32 index, char *text) { + switch (index) { + case kParamA: vst_strncpy (text, " ", kVstMaxParamStrLen); break; + default: break; // unknown parameter, shouldn't happen! + } +} + +VstInt32 Slew2::canDo(char *text) +{ return (_canDo.find(text) == _canDo.end()) ? -1: 1; } // 1 = yes, -1 = no, 0 = don't know + +bool Slew2::getEffectName(char* name) { + vst_strncpy(name, "Slew2", kVstMaxProductStrLen); return true; +} + +VstPlugCategory Slew2::getPlugCategory() {return kPlugCategEffect;} + +bool Slew2::getProductString(char* text) { + vst_strncpy (text, "airwindows Slew2", kVstMaxProductStrLen); return true; +} + +bool Slew2::getVendorString(char* text) { + vst_strncpy (text, "airwindows", kVstMaxVendorStrLen); return true; +} diff --git a/plugins/LinuxVST/src/Slew2/Slew2.h b/plugins/LinuxVST/src/Slew2/Slew2.h new file mode 100755 index 0000000..c57161f --- /dev/null +++ b/plugins/LinuxVST/src/Slew2/Slew2.h @@ -0,0 +1,95 @@ +/* ======================================== + * Slew2 - Slew2.h + * Created 8/12/11 by SPIAdmin + * Copyright (c) 2011 __MyCompanyName__, All rights reserved + * ======================================== */ + +#ifndef __Slew2_H +#define __Slew2_H + +#ifndef __audioeffect__ +#include "audioeffectx.h" +#endif + +#include <set> +#include <string> +#include <math.h> + +enum { + kParamA = 0, + kNumParameters = 1 +}; // + +const int kNumPrograms = 0; +const int kNumInputs = 2; +const int kNumOutputs = 2; +const unsigned long kUniqueId = 'slw2'; //Change this to what the AU identity is! + +class Slew2 : + public AudioEffectX +{ +public: + Slew2(audioMasterCallback audioMaster); + ~Slew2(); + 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; + + double LataLast3Sample; + double LataLast2Sample; + double LataLast1Sample; + double LataHalfwaySample; + double LataHalfDrySample; + double LataHalfDiffSample; + double LataA; + double LataB; + double LataC; + double LataDecay; + double LataUpsampleHighTweak; + double LataDrySample; + double LataDiffSample; + double LataPrevDiffSample; + + double RataLast3Sample; + double RataLast2Sample; + double RataLast1Sample; + double RataHalfwaySample; + double RataHalfDrySample; + double RataHalfDiffSample; + double RataA; + double RataB; + double RataC; + double RataDecay; + double RataUpsampleHighTweak; + double RataDrySample; + double RataDiffSample; + double RataPrevDiffSample; + + bool LataFlip; //end defining of antialiasing variables + bool RataFlip; //end defining of antialiasing variables + + double lastSampleL; + double lastSampleR; + + float A; + +}; + +#endif diff --git a/plugins/LinuxVST/src/Slew2/Slew2Proc.cpp b/plugins/LinuxVST/src/Slew2/Slew2Proc.cpp new file mode 100755 index 0000000..07b1bb9 --- /dev/null +++ b/plugins/LinuxVST/src/Slew2/Slew2Proc.cpp @@ -0,0 +1,299 @@ +/* ======================================== + * Slew2 - Slew2.h + * Copyright (c) 2016 airwindows, All rights reserved + * ======================================== */ + +#ifndef __Slew2_H +#include "Slew2.h" +#endif + +void Slew2::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 = 2.0; + overallscale /= 44100.0; + overallscale *= getSampleRate(); + double clamp; + double threshold = pow((1-A),4)/overallscale; + double inputSampleL; + double inputSampleR; + + while (--sampleFrames >= 0) + { + inputSampleL = *in1; + inputSampleR = *in2; + if (inputSampleL<1.2e-38 && -inputSampleL<1.2e-38) { + static int noisesource = 0; + //this declares a variable before anything else is compiled. It won't keep assigning + //it to 0 for every sample, it's as if the declaration doesn't exist in this context, + //but it lets me add this denormalization fix in a single place rather than updating + //it in three different locations. The variable isn't thread-safe but this is only + //a random seed and we can share it with whatever. + noisesource = noisesource % 1700021; noisesource++; + int residue = noisesource * noisesource; + residue = residue % 170003; residue *= residue; + residue = residue % 17011; residue *= residue; + residue = residue % 1709; residue *= residue; + residue = residue % 173; residue *= residue; + residue = residue % 17; + double applyresidue = residue; + applyresidue *= 0.00000001; + applyresidue *= 0.00000001; + inputSampleL = applyresidue; + } + if (inputSampleR<1.2e-38 && -inputSampleR<1.2e-38) { + static int noisesource = 0; + noisesource = noisesource % 1700021; noisesource++; + int residue = noisesource * noisesource; + residue = residue % 170003; residue *= residue; + residue = residue % 17011; residue *= residue; + residue = residue % 1709; residue *= residue; + residue = residue % 173; residue *= residue; + residue = residue % 17; + double applyresidue = residue; + applyresidue *= 0.00000001; + applyresidue *= 0.00000001; + inputSampleR = applyresidue; + //this denormalization routine produces a white noise at -300 dB which the noise + //shaping will interact with to produce a bipolar output, but the noise is actually + //all positive. That should stop any variables from going denormal, and the routine + //only kicks in if digital black is input. As a final touch, if you save to 24-bit + //the silence will return to being digital black again. + } + + LataDrySample = inputSampleL; + RataDrySample = inputSampleR; + + LataHalfDrySample = LataHalfwaySample = (inputSampleL + LataLast1Sample + ((-LataLast2Sample + LataLast3Sample) * LataUpsampleHighTweak)) / 2.0; + LataLast3Sample = LataLast2Sample; LataLast2Sample = LataLast1Sample; LataLast1Sample = inputSampleL; + //setting up oversampled special antialiasing + //begin first half- change inputSample -> LataHalfwaySample, LataDrySample -> LataHalfDrySample + clamp = LataHalfwaySample - LataHalfDrySample; + if (clamp > threshold) + LataHalfwaySample = lastSampleL + threshold; + if (-clamp > threshold) + LataHalfwaySample = lastSampleL - threshold; + lastSampleL = LataHalfwaySample; + //end first half + //begin antialiasing section for halfway sample + LataC = LataHalfwaySample - LataHalfDrySample; + if (LataFlip) {LataA *= LataDecay; LataB *= LataDecay; LataA += LataC; LataB -= LataC; LataC = LataA;} + else {LataB *= LataDecay; LataA *= LataDecay; LataB += LataC; LataA -= LataC; LataC = LataB;} + LataHalfDiffSample = (LataC * LataDecay); LataFlip = !LataFlip; + //end antialiasing section for halfway sample + //begin second half- inputSample and LataDrySample handled separately here + clamp = inputSampleL - lastSampleL; + if (clamp > threshold) + inputSampleL = lastSampleL + threshold; + if (-clamp > threshold) + inputSampleL = lastSampleL - threshold; + lastSampleL = inputSampleL; + //end second half + //begin antialiasing section for input sample + LataC = inputSampleL - LataDrySample; + if (LataFlip) {LataA *= LataDecay; LataB *= LataDecay; LataA += LataC; LataB -= LataC; LataC = LataA;} + else {LataB *= LataDecay; LataA *= LataDecay; LataB += LataC; LataA -= LataC; LataC = LataB;} + LataDiffSample = (LataC * LataDecay); LataFlip = !LataFlip; + //end antialiasing section for input sample + inputSampleL = LataDrySample; inputSampleL += ((LataDiffSample + LataHalfDiffSample + LataPrevDiffSample) / 0.734); + LataPrevDiffSample = LataDiffSample / 2.0; + //apply processing as difference to non-oversampled raw input + + + + + RataHalfDrySample = RataHalfwaySample = (inputSampleR + RataLast1Sample + ((-RataLast2Sample + RataLast3Sample) * RataUpsampleHighTweak)) / 2.0; + RataLast3Sample = RataLast2Sample; RataLast2Sample = RataLast1Sample; RataLast1Sample = inputSampleR; + //setting up oversampled special antialiasing + //begin first half- change inputSample -> RataHalfwaySample, RataDrySample -> RataHalfDrySample + clamp = RataHalfwaySample - RataHalfDrySample; + if (clamp > threshold) + RataHalfwaySample = lastSampleR + threshold; + if (-clamp > threshold) + RataHalfwaySample = lastSampleR - threshold; + lastSampleR = RataHalfwaySample; + //end first half + //begin antialiasing section for halfway sample + RataC = RataHalfwaySample - RataHalfDrySample; + if (RataFlip) {RataA *= RataDecay; RataB *= RataDecay; RataA += RataC; RataB -= RataC; RataC = RataA;} + else {RataB *= RataDecay; RataA *= RataDecay; RataB += RataC; RataA -= RataC; RataC = RataB;} + RataHalfDiffSample = (RataC * RataDecay); RataFlip = !RataFlip; + //end antialiasing section for halfway sample + //begin second half- inputSample and RataDrySample handled separately here + clamp = inputSampleR - lastSampleR; + if (clamp > threshold) + inputSampleR = lastSampleR + threshold; + if (-clamp > threshold) + inputSampleR = lastSampleR - threshold; + lastSampleR = inputSampleR; + //end second half + //begin antialiasing section for input sample + RataC = inputSampleR - RataDrySample; + if (RataFlip) {RataA *= RataDecay; RataB *= RataDecay; RataA += RataC; RataB -= RataC; RataC = RataA;} + else {RataB *= RataDecay; RataA *= RataDecay; RataB += RataC; RataA -= RataC; RataC = RataB;} + RataDiffSample = (RataC * RataDecay); RataFlip = !RataFlip; + //end antialiasing section for input sample + inputSampleR = RataDrySample; inputSampleR += ((RataDiffSample + RataHalfDiffSample + RataPrevDiffSample) / 0.734); + RataPrevDiffSample = RataDiffSample / 2.0; + //apply processing as difference to non-oversampled raw input + + + + + *out1 = inputSampleL; + *out2 = inputSampleR; + + *in1++; + *in2++; + *out1++; + *out2++; + } +} + +void Slew2::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 = 2.0; + overallscale /= 44100.0; + overallscale *= getSampleRate(); + double clamp; + double threshold = pow((1-A),4)/overallscale; + double inputSampleL; + double inputSampleR; + + while (--sampleFrames >= 0) + { + inputSampleL = *in1; + inputSampleR = *in2; + if (inputSampleL<1.2e-38 && -inputSampleL<1.2e-38) { + static int noisesource = 0; + //this declares a variable before anything else is compiled. It won't keep assigning + //it to 0 for every sample, it's as if the declaration doesn't exist in this context, + //but it lets me add this denormalization fix in a single place rather than updating + //it in three different locations. The variable isn't thread-safe but this is only + //a random seed and we can share it with whatever. + noisesource = noisesource % 1700021; noisesource++; + int residue = noisesource * noisesource; + residue = residue % 170003; residue *= residue; + residue = residue % 17011; residue *= residue; + residue = residue % 1709; residue *= residue; + residue = residue % 173; residue *= residue; + residue = residue % 17; + double applyresidue = residue; + applyresidue *= 0.00000001; + applyresidue *= 0.00000001; + inputSampleL = applyresidue; + } + if (inputSampleR<1.2e-38 && -inputSampleR<1.2e-38) { + static int noisesource = 0; + noisesource = noisesource % 1700021; noisesource++; + int residue = noisesource * noisesource; + residue = residue % 170003; residue *= residue; + residue = residue % 17011; residue *= residue; + residue = residue % 1709; residue *= residue; + residue = residue % 173; residue *= residue; + residue = residue % 17; + double applyresidue = residue; + applyresidue *= 0.00000001; + applyresidue *= 0.00000001; + inputSampleR = applyresidue; + //this denormalization routine produces a white noise at -300 dB which the noise + //shaping will interact with to produce a bipolar output, but the noise is actually + //all positive. That should stop any variables from going denormal, and the routine + //only kicks in if digital black is input. As a final touch, if you save to 24-bit + //the silence will return to being digital black again. + } + + LataDrySample = inputSampleL; + RataDrySample = inputSampleR; + + LataHalfDrySample = LataHalfwaySample = (inputSampleL + LataLast1Sample + ((-LataLast2Sample + LataLast3Sample) * LataUpsampleHighTweak)) / 2.0; + LataLast3Sample = LataLast2Sample; LataLast2Sample = LataLast1Sample; LataLast1Sample = inputSampleL; + //setting up oversampled special antialiasing + //begin first half- change inputSample -> LataHalfwaySample, LataDrySample -> LataHalfDrySample + clamp = LataHalfwaySample - LataHalfDrySample; + if (clamp > threshold) + LataHalfwaySample = lastSampleL + threshold; + if (-clamp > threshold) + LataHalfwaySample = lastSampleL - threshold; + lastSampleL = LataHalfwaySample; + //end first half + //begin antialiasing section for halfway sample + LataC = LataHalfwaySample - LataHalfDrySample; + if (LataFlip) {LataA *= LataDecay; LataB *= LataDecay; LataA += LataC; LataB -= LataC; LataC = LataA;} + else {LataB *= LataDecay; LataA *= LataDecay; LataB += LataC; LataA -= LataC; LataC = LataB;} + LataHalfDiffSample = (LataC * LataDecay); LataFlip = !LataFlip; + //end antialiasing section for halfway sample + //begin second half- inputSample and LataDrySample handled separately here + clamp = inputSampleL - lastSampleL; + if (clamp > threshold) + inputSampleL = lastSampleL + threshold; + if (-clamp > threshold) + inputSampleL = lastSampleL - threshold; + lastSampleL = inputSampleL; + //end second half + //begin antialiasing section for input sample + LataC = inputSampleL - LataDrySample; + if (LataFlip) {LataA *= LataDecay; LataB *= LataDecay; LataA += LataC; LataB -= LataC; LataC = LataA;} + else {LataB *= LataDecay; LataA *= LataDecay; LataB += LataC; LataA -= LataC; LataC = LataB;} + LataDiffSample = (LataC * LataDecay); LataFlip = !LataFlip; + //end antialiasing section for input sample + inputSampleL = LataDrySample; inputSampleL += ((LataDiffSample + LataHalfDiffSample + LataPrevDiffSample) / 0.734); + LataPrevDiffSample = LataDiffSample / 2.0; + //apply processing as difference to non-oversampled raw input + + + + + RataHalfDrySample = RataHalfwaySample = (inputSampleR + RataLast1Sample + ((-RataLast2Sample + RataLast3Sample) * RataUpsampleHighTweak)) / 2.0; + RataLast3Sample = RataLast2Sample; RataLast2Sample = RataLast1Sample; RataLast1Sample = inputSampleR; + //setting up oversampled special antialiasing + //begin first half- change inputSample -> RataHalfwaySample, RataDrySample -> RataHalfDrySample + clamp = RataHalfwaySample - RataHalfDrySample; + if (clamp > threshold) + RataHalfwaySample = lastSampleR + threshold; + if (-clamp > threshold) + RataHalfwaySample = lastSampleR - threshold; + lastSampleR = RataHalfwaySample; + //end first half + //begin antialiasing section for halfway sample + RataC = RataHalfwaySample - RataHalfDrySample; + if (RataFlip) {RataA *= RataDecay; RataB *= RataDecay; RataA += RataC; RataB -= RataC; RataC = RataA;} + else {RataB *= RataDecay; RataA *= RataDecay; RataB += RataC; RataA -= RataC; RataC = RataB;} + RataHalfDiffSample = (RataC * RataDecay); RataFlip = !RataFlip; + //end antialiasing section for halfway sample + //begin second half- inputSample and RataDrySample handled separately here + clamp = inputSampleR - lastSampleR; + if (clamp > threshold) + inputSampleR = lastSampleR + threshold; + if (-clamp > threshold) + inputSampleR = lastSampleR - threshold; + lastSampleR = inputSampleR; + //end second half + //begin antialiasing section for input sample + RataC = inputSampleR - RataDrySample; + if (RataFlip) {RataA *= RataDecay; RataB *= RataDecay; RataA += RataC; RataB -= RataC; RataC = RataA;} + else {RataB *= RataDecay; RataA *= RataDecay; RataB += RataC; RataA -= RataC; RataC = RataB;} + RataDiffSample = (RataC * RataDecay); RataFlip = !RataFlip; + //end antialiasing section for input sample + inputSampleR = RataDrySample; inputSampleR += ((RataDiffSample + RataHalfDiffSample + RataPrevDiffSample) / 0.734); + RataPrevDiffSample = RataDiffSample / 2.0; + //apply processing as difference to non-oversampled raw input + + *out1 = inputSampleL; + *out2 = inputSampleR; + + *in1++; + *in2++; + *out1++; + *out2++; + } +}
\ No newline at end of file diff --git a/plugins/LinuxVST/src/SlewOnly/SlewOnly.cpp b/plugins/LinuxVST/src/SlewOnly/SlewOnly.cpp new file mode 100755 index 0000000..0d9350b --- /dev/null +++ b/plugins/LinuxVST/src/SlewOnly/SlewOnly.cpp @@ -0,0 +1,67 @@ +/* ======================================== + * SlewOnly - SlewOnly.h + * Copyright (c) 2016 airwindows, All rights reserved + * ======================================== */ + +#ifndef __SlewOnly_H +#include "SlewOnly.h" +#endif + +AudioEffect* createEffectInstance(audioMasterCallback audioMaster) {return new SlewOnly(audioMaster);} + +SlewOnly::SlewOnly(audioMasterCallback audioMaster) : + AudioEffectX(audioMaster, kNumPrograms, kNumParameters) +{ + lastSampleL = 0.0; + lastSampleR = 0.0; + + _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 + vst_strncpy (_programName, "Default", kVstMaxProgNameLen); // default program name +} + +SlewOnly::~SlewOnly() {} +VstInt32 SlewOnly::getVendorVersion () {return 1000;} +void SlewOnly::setProgramName(char *name) {vst_strncpy (_programName, name, kVstMaxProgNameLen);} +void SlewOnly::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! + +void SlewOnly::setParameter(VstInt32 index, float value) { +} + +float SlewOnly::getParameter(VstInt32 index) { + return 0.0; //we only need to update the relevant name, this is simple to manage +} + +void SlewOnly::getParameterName(VstInt32 index, char *text) { +} + +void SlewOnly::getParameterDisplay(VstInt32 index, char *text) { +} + +void SlewOnly::getParameterLabel(VstInt32 index, char *text) { +} + +VstInt32 SlewOnly::canDo(char *text) +{ return (_canDo.find(text) == _canDo.end()) ? -1: 1; } // 1 = yes, -1 = no, 0 = don't know + +bool SlewOnly::getEffectName(char* name) { + vst_strncpy(name, "SlewOnly", kVstMaxProductStrLen); return true; +} + +VstPlugCategory SlewOnly::getPlugCategory() {return kPlugCategEffect;} + +bool SlewOnly::getProductString(char* text) { + vst_strncpy (text, "airwindows SlewOnly", kVstMaxProductStrLen); return true; +} + +bool SlewOnly::getVendorString(char* text) { + vst_strncpy (text, "airwindows", kVstMaxVendorStrLen); return true; +} diff --git a/plugins/LinuxVST/src/SlewOnly/SlewOnly.h b/plugins/LinuxVST/src/SlewOnly/SlewOnly.h new file mode 100755 index 0000000..0c2d666 --- /dev/null +++ b/plugins/LinuxVST/src/SlewOnly/SlewOnly.h @@ -0,0 +1,56 @@ +/* ======================================== + * SlewOnly - SlewOnly.h + * Created 8/12/11 by SPIAdmin + * Copyright (c) 2011 __MyCompanyName__, All rights reserved + * ======================================== */ + +#ifndef __SlewOnly_H +#define __SlewOnly_H + +#ifndef __audioeffect__ +#include "audioeffectx.h" +#endif + +#include <set> +#include <string> +#include <math.h> + +enum { + kNumParameters = 0 +}; // + +const int kNumPrograms = 0; +const int kNumInputs = 2; +const int kNumOutputs = 2; +const unsigned long kUniqueId = 'slon'; //Change this to what the AU identity is! + +class SlewOnly : + public AudioEffectX +{ +public: + SlewOnly(audioMasterCallback audioMaster); + ~SlewOnly(); + 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 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; + + double lastSampleL; + double lastSampleR; +}; + +#endif diff --git a/plugins/LinuxVST/src/SlewOnly/SlewOnlyProc.cpp b/plugins/LinuxVST/src/SlewOnly/SlewOnlyProc.cpp new file mode 100755 index 0000000..5fc12c3 --- /dev/null +++ b/plugins/LinuxVST/src/SlewOnly/SlewOnlyProc.cpp @@ -0,0 +1,159 @@ +/* ======================================== + * SlewOnly - SlewOnly.h + * Copyright (c) 2016 airwindows, All rights reserved + * ======================================== */ + +#ifndef __SlewOnly_H +#include "SlewOnly.h" +#endif + +void SlewOnly::processReplacing(float **inputs, float **outputs, VstInt32 sampleFrames) +{ + float* in1 = inputs[0]; + float* in2 = inputs[1]; + float* out1 = outputs[0]; + float* out2 = outputs[1]; + + long double inputSampleL; + long double inputSampleR; + long double outputSampleL; + long double outputSampleR; + double trim = 2.302585092994045684017991; //natural logarithm of 10 + + while (--sampleFrames >= 0) + { + inputSampleL = *in1; + inputSampleR = *in2; + if (inputSampleL<1.2e-38 && -inputSampleL<1.2e-38) { + static int noisesource = 0; + //this declares a variable before anything else is compiled. It won't keep assigning + //it to 0 for every sample, it's as if the declaration doesn't exist in this context, + //but it lets me add this denormalization fix in a single place rather than updating + //it in three different locations. The variable isn't thread-safe but this is only + //a random seed and we can share it with whatever. + noisesource = noisesource % 1700021; noisesource++; + int residue = noisesource * noisesource; + residue = residue % 170003; residue *= residue; + residue = residue % 17011; residue *= residue; + residue = residue % 1709; residue *= residue; + residue = residue % 173; residue *= residue; + residue = residue % 17; + double applyresidue = residue; + applyresidue *= 0.00000001; + applyresidue *= 0.00000001; + inputSampleL = applyresidue; + } + if (inputSampleR<1.2e-38 && -inputSampleR<1.2e-38) { + static int noisesource = 0; + noisesource = noisesource % 1700021; noisesource++; + int residue = noisesource * noisesource; + residue = residue % 170003; residue *= residue; + residue = residue % 17011; residue *= residue; + residue = residue % 1709; residue *= residue; + residue = residue % 173; residue *= residue; + residue = residue % 17; + double applyresidue = residue; + applyresidue *= 0.00000001; + applyresidue *= 0.00000001; + inputSampleR = applyresidue; + //this denormalization routine produces a white noise at -300 dB which the noise + //shaping will interact with to produce a bipolar output, but the noise is actually + //all positive. That should stop any variables from going denormal, and the routine + //only kicks in if digital black is input. As a final touch, if you save to 24-bit + //the silence will return to being digital black again. + } + + outputSampleL = (inputSampleL - lastSampleL)*trim; + outputSampleR = (inputSampleR - lastSampleR)*trim; + lastSampleL = inputSampleL; + lastSampleR = inputSampleR; + if (outputSampleL > 1.0) outputSampleL = 1.0; + if (outputSampleR > 1.0) outputSampleR = 1.0; + if (outputSampleL < -1.0) outputSampleL = -1.0; + if (outputSampleR < -1.0) outputSampleR = -1.0; + + *out1 = outputSampleL; + *out2 = outputSampleR; + + *in1++; + *in2++; + *out1++; + *out2++; + } +} + +void SlewOnly::processDoubleReplacing(double **inputs, double **outputs, VstInt32 sampleFrames) +{ + double* in1 = inputs[0]; + double* in2 = inputs[1]; + double* out1 = outputs[0]; + double* out2 = outputs[1]; + + long double inputSampleL; + long double inputSampleR; + long double outputSampleL; + long double outputSampleR; + double trim = 2.302585092994045684017991; //natural logarithm of 10 + + while (--sampleFrames >= 0) + { + inputSampleL = *in1; + inputSampleR = *in2; + if (inputSampleL<1.2e-38 && -inputSampleL<1.2e-38) { + static int noisesource = 0; + //this declares a variable before anything else is compiled. It won't keep assigning + //it to 0 for every sample, it's as if the declaration doesn't exist in this context, + //but it lets me add this denormalization fix in a single place rather than updating + //it in three different locations. The variable isn't thread-safe but this is only + //a random seed and we can share it with whatever. + noisesource = noisesource % 1700021; noisesource++; + int residue = noisesource * noisesource; + residue = residue % 170003; residue *= residue; + residue = residue % 17011; residue *= residue; + residue = residue % 1709; residue *= residue; + residue = residue % 173; residue *= residue; + residue = residue % 17; + double applyresidue = residue; + applyresidue *= 0.00000001; + applyresidue *= 0.00000001; + inputSampleL = applyresidue; + } + if (inputSampleR<1.2e-38 && -inputSampleR<1.2e-38) { + static int noisesource = 0; + noisesource = noisesource % 1700021; noisesource++; + int residue = noisesource * noisesource; + residue = residue % 170003; residue *= residue; + residue = residue % 17011; residue *= residue; + residue = residue % 1709; residue *= residue; + residue = residue % 173; residue *= residue; + residue = residue % 17; + double applyresidue = residue; + applyresidue *= 0.00000001; + applyresidue *= 0.00000001; + inputSampleR = applyresidue; + //this denormalization routine produces a white noise at -300 dB which the noise + //shaping will interact with to produce a bipolar output, but the noise is actually + //all positive. That should stop any variables from going denormal, and the routine + //only kicks in if digital black is input. As a final touch, if you save to 24-bit + //the silence will return to being digital black again. + } + + + outputSampleL = (inputSampleL - lastSampleL)*trim; + outputSampleR = (inputSampleR - lastSampleR)*trim; + lastSampleL = inputSampleL; + lastSampleR = inputSampleR; + if (outputSampleL > 1.0) outputSampleL = 1.0; + if (outputSampleR > 1.0) outputSampleR = 1.0; + if (outputSampleL < -1.0) outputSampleL = -1.0; + if (outputSampleR < -1.0) outputSampleR = -1.0; + + *out1 = outputSampleL; + *out2 = outputSampleR; + + *in1++; + *in2++; + *out1++; + *out2++; + } +}
\ No newline at end of file |