From 4802727cad56551b64f1d9b85026817d336a79a5 Mon Sep 17 00:00:00 2001 From: falkTX Date: Sat, 13 Nov 2021 21:53:40 +0000 Subject: [PATCH] Remove snake oil "quality" mode Signed-off-by: falkTX --- src/capacitor.cpp | 108 +--------------------------- src/capacitor_stereo.cpp | 110 ++--------------------------- src/chorus.cpp | 112 ++--------------------------- src/console.cpp | 81 +++------------------ src/console_mm.cpp | 86 ++--------------------- src/distance.cpp | 110 ++--------------------------- src/golem.cpp | 74 ++------------------ src/holt.cpp | 147 +++++---------------------------------- src/hombre.cpp | 108 +--------------------------- src/interstage.cpp | 93 ++----------------------- src/monitoring.cpp | 10 +-- src/mv.cpp | 136 +----------------------------------- src/plugin.cpp | 81 --------------------- src/rasp.cpp | 78 ++------------------- src/reseq.cpp | 87 +---------------------- src/tape.cpp | 101 +-------------------------- src/tremolo.cpp | 109 ++--------------------------- src/vibrato.cpp | 85 +--------------------- 18 files changed, 88 insertions(+), 1628 deletions(-) diff --git a/src/capacitor.cpp b/src/capacitor.cpp index 958f73f..8cdf9e6 100644 --- a/src/capacitor.cpp +++ b/src/capacitor.cpp @@ -16,10 +16,6 @@ See ./LICENSE.md for all licenses #include "plugin.hpp" -// quality options -#define ECO 0 -#define HIGH 1 - struct Capacitor : Module { enum ParamIds { LOWPASS_PARAM, @@ -43,7 +39,6 @@ struct Capacitor : Module { // module variables const double gainCut = 0.03125; const double gainBoost = 32.0; - int quality; // control parameters float lowpassParam; @@ -69,7 +64,7 @@ struct Capacitor : Module { double lastLowpass[16]; double lastHighpass[16]; int count[16]; - long double fpNShape[16]; + double fpNShape[16]; // other double overallscale; @@ -80,7 +75,6 @@ struct Capacitor : Module { configParam(LOWPASS_PARAM, 0.f, 1.f, 1.f, "Lowpass"); configParam(HIGHPASS_PARAM, 0.f, 1.f, 0.f, "Highpass"); - quality = loadQuality(); onReset(); } @@ -121,24 +115,6 @@ struct Capacitor : Module { overallscale *= sampleRate; } - json_t* dataToJson() override - { - json_t* rootJ = json_object(); - - // quality - json_object_set_new(rootJ, "quality", json_integer(quality)); - - return rootJ; - } - - void dataFromJson(json_t* rootJ) override - { - // quality - json_t* qualityJ = json_object_get(rootJ, "quality"); - if (qualityJ) - quality = json_integer_value(qualityJ); - } - void process(const ProcessArgs& args) override { if (outputs[OUT_OUTPUT].isConnected()) { @@ -155,7 +131,7 @@ struct Capacitor : Module { double highpassSpeed; double invLowpass; double invHighpass; - long double inputSample; + double inputSample; // for each poly channel for (int i = 0, numChannels = std::max(1, inputs[IN_INPUT].getChannels()); i < numChannels; ++i) { @@ -175,33 +151,6 @@ struct Capacitor : Module { // pad gain inputSample *= gainCut; - if (quality == HIGH) { - if (inputSample < 1.2e-38 && -inputSample < 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; - inputSample = applyresidue; - } - } - lowpassAmount[i] = (((lowpassAmount[i] * lowpassSpeed) + lowpassChase[i]) / (lowpassSpeed + 1.0)); invLowpass = 1.0 - lowpassAmount[i]; highpassAmount[i] = (((highpassAmount[i] * highpassSpeed) + highpassChase[i]) / (highpassSpeed + 1.0)); @@ -299,16 +248,6 @@ struct Capacitor : Module { break; } - //stereo 32 bit dither, made small and tidy. - if (quality == HIGH) { - int expon; - frexpf((float)inputSample, &expon); - long double dither = (rand() / (RAND_MAX * 7.737125245533627e+25)) * pow(2, expon + 62); - inputSample += (dither - fpNShape[i]); - fpNShape[i] = dither; - //end 32 bit dither - } - // bring gain back up inputSample *= gainBoost; @@ -321,47 +260,6 @@ struct Capacitor : Module { }; struct CapacitorWidget : ModuleWidget { - - // quality item - struct QualityItem : MenuItem { - Capacitor* module; - int quality; - - void onAction(const event::Action& e) override - { - module->quality = quality; - } - - void step() override - { - rightText = (module->quality == quality) ? "✔" : ""; - } - }; - - void appendContextMenu(Menu* menu) override - { - Capacitor* module = dynamic_cast(this->module); - assert(module); - - menu->addChild(new MenuSeparator()); // separator - - MenuLabel* qualityLabel = new MenuLabel(); // menu label - qualityLabel->text = "Quality"; - menu->addChild(qualityLabel); - - QualityItem* low = new QualityItem(); // low quality - low->text = "Eco"; - low->module = module; - low->quality = 0; - menu->addChild(low); - - QualityItem* high = new QualityItem(); // high quality - high->text = "High"; - high->module = module; - high->quality = 1; - menu->addChild(high); - } - CapacitorWidget(Capacitor* module) { setModule(module); @@ -385,4 +283,4 @@ struct CapacitorWidget : ModuleWidget { } }; -Model* modelCapacitor = createModel("capacitor"); \ No newline at end of file +Model* modelCapacitor = createModel("capacitor"); diff --git a/src/capacitor_stereo.cpp b/src/capacitor_stereo.cpp index 5743023..5b35415 100644 --- a/src/capacitor_stereo.cpp +++ b/src/capacitor_stereo.cpp @@ -16,10 +16,6 @@ See ./LICENSE.md for all licenses #include "plugin.hpp" -// quality options -#define ECO 0 -#define HIGH 1 - struct Capacitor_stereo : Module { enum ParamIds { LOWPASS_L_PARAM, @@ -54,7 +50,6 @@ struct Capacitor_stereo : Module { const double gainCut = 0.03125; const double gainBoost = 32.0; bool isLinked; - bool quality; float lastLowpassParam; float lastHighpassParam; @@ -87,7 +82,7 @@ struct Capacitor_stereo : Module { double lastHighpass; double lastWet; int count; - long double fpNShape; + double fpNShape; } stateL[16], stateR[16]; // other @@ -104,7 +99,6 @@ struct Capacitor_stereo : Module { configParam(LINK_PARAM, 0.f, 1.f, 1.f, "Link"); isLinked = true; - quality = loadQuality(); onReset(); } @@ -150,24 +144,6 @@ struct Capacitor_stereo : Module { } } - json_t* dataToJson() override - { - json_t* rootJ = json_object(); - - // quality - json_object_set_new(rootJ, "quality", json_integer(quality)); - - return rootJ; - } - - void dataFromJson(json_t* rootJ) override - { - // quality - json_t* qualityJ = json_object_get(rootJ, "quality"); - if (qualityJ) - quality = json_integer_value(qualityJ); - } - void processChannel(stateVars v[], Param& lowpass, Param& highpass, Param& drywet, Input& lowpassCv, Input& highpassCv, Input& drywetCv, Input& input, Output& output) { // params @@ -190,8 +166,8 @@ struct Capacitor_stereo : Module { double invHighpass; double dry; - long double inputSample; - long double drySample; + double inputSample; + double drySample; // for each poly channel for (int i = 0, numChannels = std::max(1, input.getChannels()); i < numChannels; ++i) { @@ -214,33 +190,6 @@ struct Capacitor_stereo : Module { // pad gain inputSample *= gainCut; - if (quality == HIGH) { - if (inputSample < 1.2e-38 && -inputSample < 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; - inputSample = applyresidue; - } - } - drySample = inputSample; v[i].lowpassAmount = (((v[i].lowpassAmount * lowpassSpeed) + v[i].lowpassChase) / (lowpassSpeed + 1.0)); @@ -344,16 +293,6 @@ struct Capacitor_stereo : Module { inputSample = (drySample * dry) + (inputSample * v[i].wet); - if (quality == HIGH) { - //stereo 32 bit dither, made small and tidy. - int expon; - frexpf((float)inputSample, &expon); - long double dither = (rand() / (RAND_MAX * 7.737125245533627e+25)) * pow(2, expon + 62); - inputSample += (dither - v[i].fpNShape); - v[i].fpNShape = dither; - //end 32 bit dither - } - // bring gain back up inputSample *= gainBoost; @@ -397,47 +336,6 @@ struct Capacitor_stereo : Module { }; struct Capacitor_stereoWidget : ModuleWidget { - - // quality item - struct QualityItem : MenuItem { - Capacitor_stereo* module; - int quality; - - void onAction(const event::Action& e) override - { - module->quality = quality; - } - - void step() override - { - rightText = (module->quality == quality) ? "✔" : ""; - } - }; - - void appendContextMenu(Menu* menu) override - { - Capacitor_stereo* module = dynamic_cast(this->module); - assert(module); - - menu->addChild(new MenuSeparator()); // separator - - MenuLabel* qualityLabel = new MenuLabel(); // menu label - qualityLabel->text = "Quality"; - menu->addChild(qualityLabel); - - QualityItem* low = new QualityItem(); // low quality - low->text = "Eco"; - low->module = module; - low->quality = 0; - menu->addChild(low); - - QualityItem* high = new QualityItem(); // high quality - high->text = "High"; - high->module = module; - high->quality = 1; - menu->addChild(high); - } - Capacitor_stereoWidget(Capacitor_stereo* module) { setModule(module); @@ -477,4 +375,4 @@ struct Capacitor_stereoWidget : ModuleWidget { } }; -Model* modelCapacitor_stereo = createModel("capacitor_stereo"); \ No newline at end of file +Model* modelCapacitor_stereo = createModel("capacitor_stereo"); diff --git a/src/chorus.cpp b/src/chorus.cpp index 7a78157..af7e362 100644 --- a/src/chorus.cpp +++ b/src/chorus.cpp @@ -15,10 +15,6 @@ See ./LICENSE.md for all licenses #include "plugin.hpp" -// quality options -#define ECO 0 -#define HIGH 1 - struct Chorus : Module { enum ParamIds { SPEED_PARAM, @@ -47,7 +43,6 @@ struct Chorus : Module { // module variables const double gainCut = 0.03125; const double gainBoost = 32.0; - int quality; bool isEnsemble; // control parameters @@ -72,8 +67,8 @@ struct Chorus : Module { double airFactorR[16]; bool fpFlipL[16]; bool fpFlipR[16]; - long double fpNShapeL[16]; - long double fpNShapeR[16]; + double fpNShapeL[16]; + double fpNShapeR[16]; // other double overallscale; @@ -86,7 +81,6 @@ struct Chorus : Module { configParam(DRYWET_PARAM, 0.f, 1.f, 1.f, "Dry/Wet"); configParam(ENSEMBLE_PARAM, 0.f, 1.f, 0.f, "Ensemble"); - quality = loadQuality(); isEnsemble = false; onReset(); } @@ -127,25 +121,7 @@ struct Chorus : Module { overallscale *= sampleRate; } - json_t* dataToJson() override - { - json_t* rootJ = json_object(); - - // quality - json_object_set_new(rootJ, "quality", json_integer(quality)); - - return rootJ; - } - - void dataFromJson(json_t* rootJ) override - { - // quality - json_t* qualityJ = json_object_get(rootJ, "quality"); - if (qualityJ) - quality = json_integer_value(qualityJ); - } - - void processChannel(Input& input, Output& output, double sweep[], int gcount[], double airPrev[], double airEven[], double airOdd[], double airFactor[], bool fpFlip[], long double fpNShape[]) + void processChannel(Input& input, Output& output, double sweep[], int gcount[], double airPrev[], double airEven[], double airOdd[], double airFactor[], bool fpFlip[], double fpNShape[]) { if (output.isConnected()) { @@ -188,7 +164,7 @@ struct Chorus : Module { //this is a double buffer so we will be splitting it in two double drySample; - long double inputSample; + double inputSample; speed *= overallscale; @@ -204,33 +180,6 @@ struct Chorus : Module { // pad gain inputSample *= gainCut; - if (quality == HIGH) { - if (inputSample < 1.2e-38 && -inputSample < 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; - inputSample = applyresidue; - } - } - drySample = inputSample; airFactor[i] = airPrev[i] - inputSample; @@ -314,16 +263,6 @@ struct Chorus : Module { } fpFlip[i] = !fpFlip[i]; - if (quality == HIGH) { - //stereo 32 bit dither, made small and tidy. - int expon; - frexpf((float)inputSample, &expon); - long double dither = (rand() / (RAND_MAX * 7.737125245533627e+25)) * pow(2, expon + 62); - inputSample += (dither - fpNShape[i]); - fpNShape[i] = dither; - //end 32 bit dither - } - // bring gain back up inputSample *= gainBoost; @@ -347,47 +286,6 @@ struct Chorus : Module { }; struct ChorusWidget : ModuleWidget { - - // quality item - struct QualityItem : MenuItem { - Chorus* module; - int quality; - - void onAction(const event::Action& e) override - { - module->quality = quality; - } - - void step() override - { - rightText = (module->quality == quality) ? "✔" : ""; - } - }; - - void appendContextMenu(Menu* menu) override - { - Chorus* module = dynamic_cast(this->module); - assert(module); - - menu->addChild(new MenuSeparator()); // separator - - MenuLabel* qualityLabel = new MenuLabel(); // menu label - qualityLabel->text = "Quality"; - menu->addChild(qualityLabel); - - QualityItem* low = new QualityItem(); // low quality - low->text = "Eco"; - low->module = module; - low->quality = 0; - menu->addChild(low); - - QualityItem* high = new QualityItem(); // high quality - high->text = "High"; - high->module = module; - high->quality = 1; - menu->addChild(high); - } - ChorusWidget(Chorus* module) { setModule(module); @@ -422,4 +320,4 @@ struct ChorusWidget : ModuleWidget { } }; -Model* modelChorus = createModel("chorus"); \ No newline at end of file +Model* modelChorus = createModel("chorus"); diff --git a/src/console.cpp b/src/console.cpp index 2ee7454..2a89817 100644 --- a/src/console.cpp +++ b/src/console.cpp @@ -18,10 +18,6 @@ See ./LICENSE.md for all licenses #include "plugin.hpp" -// quality options -#define ECO 0 -#define HIGH 1 - // console types #define CONSOLE_6 0 #define PUREST_CONSOLE 1 @@ -50,7 +46,6 @@ struct Console : Module { // module variables const double gainCut = 0.1; const double gainBoost = 10.0; - bool quality; int consoleType; dsp::VuMeter2 vuMeters[9]; dsp::ClockDivider lightDivider; @@ -63,7 +58,6 @@ struct Console : Module { { config(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS, NUM_LIGHTS); - quality = loadQuality(); consoleType = loadConsoleType(); lightDivider.setDivision(512); onReset(); @@ -80,9 +74,6 @@ struct Console : Module { { json_t* rootJ = json_object(); - // quality - json_object_set_new(rootJ, "quality", json_integer(quality)); - // consoleType json_object_set_new(rootJ, "consoleType", json_integer(consoleType)); @@ -91,18 +82,13 @@ struct Console : Module { void dataFromJson(json_t* rootJ) override { - // quality - json_t* qualityJ = json_object_get(rootJ, "quality"); - if (qualityJ) - quality = json_integer_value(qualityJ); - // consoleType json_t* consoleTypeJ = json_object_get(rootJ, "consoleType"); if (consoleTypeJ) consoleType = json_integer_value(consoleTypeJ); } - long double encode(long double inputSample, int consoleType = 0) + double encode(double inputSample, int consoleType = 0) { switch (consoleType) { case PUREST_CONSOLE: // PurestConsoleChannel @@ -125,7 +111,7 @@ struct Console : Module { return inputSample; } - long double decode(long double inputSample, int consoleType = 0) + double decode(double inputSample, int consoleType = 0) { switch (consoleType) { case PUREST_CONSOLE: // PurestConsoleBuss @@ -148,7 +134,7 @@ struct Console : Module { return inputSample; } - float consoleChannel(Input& input, long double mix[], int numChannels) + float consoleChannel(Input& input, double mix[], int numChannels) { if (input.isConnected()) { float sum = 0.0f; @@ -159,7 +145,7 @@ struct Console : Module { for (int i = 0; i < numChannels; i++) { - long double inputSample = inputSamples[i]; + double inputSample = inputSamples[i]; // inputSample *= rescale(drive, 0, 1, 0.5, 2); @@ -169,11 +155,6 @@ struct Console : Module { // pad gain, will be boosted in consoleBuss() inputSample *= gainCut; - if (quality == HIGH) { - if (fabs(inputSample) < 1.18e-37) - inputSample = fpd[i] * 1.18e-37; - } - // encode inputSample = encode(inputSample, consoleType); @@ -185,27 +166,17 @@ struct Console : Module { return 0.0f; } - void consoleBuss(Output& output, long double mix[], int maxChannels) + void consoleBuss(Output& output, double mix[], int maxChannels) { if (output.isConnected()) { float out[16] = {}; for (int i = 0; i < maxChannels; i++) { - long double inputSample = mix[i]; + double inputSample = mix[i]; // decode inputSample = decode(inputSample, consoleType); - if (quality == HIGH) { - //begin 32 bit stereo floating point dither - int expon; - frexpf((float)inputSample, &expon); - fpd[i] ^= fpd[i] << 13; - fpd[i] ^= fpd[i] >> 17; - fpd[i] ^= fpd[i] << 5; - inputSample += ((double(fpd[i]) - uint32_t(0x7fffffff)) * 5.5e-36l * pow(2, expon + 62)); - } - // bring gain back up inputSample *= gainBoost; @@ -220,8 +191,8 @@ struct Console : Module { void process(const ProcessArgs& args) override { if (outputs[OUT_L_OUTPUT].isConnected() || outputs[OUT_R_OUTPUT].isConnected()) { - long double mixL[16] = {}; - long double mixR[16] = {}; + double mixL[16] = {}; + double mixR[16] = {}; float sumL = 0.0; float sumR = 0.0; int numChannelsL = 1; @@ -257,22 +228,6 @@ struct ConsoleWidget : ModuleWidget { SvgPanel* darkPanel; - // quality item - struct QualityItem : MenuItem { - Console* module; - int quality; - - void onAction(const event::Action& e) override - { - module->quality = quality; - } - - void step() override - { - rightText = (module->quality == quality) ? "✔" : ""; - } - }; - // console type item struct ConsoleTypeItem : MenuItem { Console* module; @@ -345,24 +300,6 @@ struct ConsoleWidget : ModuleWidget { menu->addChild(new MenuSeparator()); // separator - MenuLabel* qualityLabel = new MenuLabel(); // menu label - qualityLabel->text = "Quality"; - menu->addChild(qualityLabel); - - QualityItem* low = new QualityItem(); // low quality - low->text = "Eco"; - low->module = module; - low->quality = ECO; - menu->addChild(low); - - QualityItem* high = new QualityItem(); // high quality - high->text = "High"; - high->module = module; - high->quality = HIGH; - menu->addChild(high); - - menu->addChild(new MenuSeparator()); // separator - MenuLabel* consoleTypeLabel = new MenuLabel(); // menu label consoleTypeLabel->text = "Type"; menu->addChild(consoleTypeLabel); @@ -434,4 +371,4 @@ struct ConsoleWidget : ModuleWidget { } }; -Model* modelConsole = createModel("console"); \ No newline at end of file +Model* modelConsole = createModel("console"); diff --git a/src/console_mm.cpp b/src/console_mm.cpp index 3229320..f85c176 100644 --- a/src/console_mm.cpp +++ b/src/console_mm.cpp @@ -21,10 +21,6 @@ See ./LICENSE.md for all licenses #include "plugin.hpp" -// quality options -#define ECO 0 -#define HIGH 1 - // console types #define CONSOLE_6 0 #define PUREST_CONSOLE 1 @@ -56,7 +52,6 @@ struct Console_mm : Module { // module variables const double gainCut = 0.1; const double gainBoost = 10.0; - bool quality; int consoleType; int directOutMode; @@ -68,7 +63,6 @@ struct Console_mm : Module { config(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS, NUM_LIGHTS); configParam(LEVEL_PARAM, -1.f, 1.f, 0.f, "Drive", "%", 0.f, 100.f); - quality = loadQuality(); consoleType = loadConsoleType(); directOutMode = loadDirectOutMode(); onReset(); @@ -85,9 +79,6 @@ struct Console_mm : Module { { json_t* rootJ = json_object(); - // quality - json_object_set_new(rootJ, "quality", json_integer(quality)); - // directOutMode json_object_set_new(rootJ, "directOutMode", json_integer(directOutMode)); @@ -99,11 +90,6 @@ struct Console_mm : Module { void dataFromJson(json_t* rootJ) override { - // quality - json_t* qualityJ = json_object_get(rootJ, "quality"); - if (qualityJ) - quality = json_integer_value(qualityJ); - // directOutMode json_t* directOutModeJ = json_object_get(rootJ, "directOutMode"); if (directOutModeJ) @@ -115,7 +101,7 @@ struct Console_mm : Module { consoleType = json_integer_value(consoleTypeJ); } - long double encode(long double inputSample, int consoleType = 0) + double encode(double inputSample, int consoleType = 0) { switch (consoleType) { case PUREST_CONSOLE: // PurestConsoleChannel @@ -137,7 +123,7 @@ struct Console_mm : Module { return inputSample; } - long double decode(long double inputSample, int consoleType = 0) + double decode(double inputSample, int consoleType = 0) { switch (consoleType) { case PUREST_CONSOLE: // PurestConsoleBuss @@ -167,8 +153,8 @@ struct Console_mm : Module { void process(const ProcessArgs& args) override { - long double directOutSum[] = { 0.0, 0.0, 0.0 }; - long double stereoOutSum[] = { 0.0, 0.0 }; + double directOutSum[] = { 0.0, 0.0, 0.0 }; + double stereoOutSum[] = { 0.0, 0.0 }; // for each input for (int x = 0; x < 3; x++) { @@ -182,7 +168,7 @@ struct Console_mm : Module { for (int i = 0; i < std::max(1, numChannels); i++) { // get input - long double inputSample = inputs[IN_INPUTS + x].getPolyVoltage(i); + double inputSample = inputs[IN_INPUTS + x].getPolyVoltage(i); if (directOutMode == UNPROCESSED) { // send the input directly to the respective output @@ -201,11 +187,6 @@ struct Console_mm : Module { inputSample *= gainCut; } - if (quality == HIGH) { - if (fabs(inputSample) < 1.18e-37) - inputSample = fpd[i] * 1.18e-37; - } - // encode inputSample = encode(inputSample, consoleType); @@ -229,16 +210,6 @@ struct Console_mm : Module { // decode directOutSum[i] = decode(directOutSum[i], consoleType); - if (quality == HIGH) { - // 32 bit floating point dither - int expon; - frexpf((float)directOutSum[i], &expon); - fpd[i] ^= fpd[i] << 13; - fpd[i] ^= fpd[i] >> 17; - fpd[i] ^= fpd[i] << 5; - directOutSum[i] += ((double(fpd[i]) - uint32_t(0x7fffffff)) * 5.5e-36l * pow(2, expon + 62)); - } - // bring gain back up + rough compensation for summing if (params[LEVEL_PARAM].getValue() > 0.0) { directOutSum[i] *= gainBoost / (params[LEVEL_PARAM].getValue() + 1) * 0.5; @@ -262,16 +233,6 @@ struct Console_mm : Module { // decode stereoOutSum[i] = decode(stereoOutSum[i], consoleType); - if (quality == HIGH) { - // 32 bit floating point dither - int expon; - frexpf((float)stereoOutSum[i], &expon); - fpd[i] ^= fpd[i] << 13; - fpd[i] ^= fpd[i] >> 17; - fpd[i] ^= fpd[i] << 5; - stereoOutSum[i] += ((double(fpd[i]) - uint32_t(0x7fffffff)) * 5.5e-36l * pow(2, expon + 62)); - } - // bring gain back up if (params[LEVEL_PARAM].getValue() > 0.0) { stereoOutSum[i] *= gainBoost / (params[LEVEL_PARAM].getValue() + 1); @@ -289,23 +250,6 @@ struct Console_mm : Module { }; struct Console_mmWidget : ModuleWidget { - - // quality item - struct QualityItem : MenuItem { - Console_mm* module; - int quality; - - void onAction(const event::Action& e) override - { - module->quality = quality; - } - - void step() override - { - rightText = (module->quality == quality) ? "✔" : ""; - } - }; - // console type item struct ConsoleTypeItem : MenuItem { Console_mm* module; @@ -345,24 +289,6 @@ struct Console_mmWidget : ModuleWidget { menu->addChild(new MenuSeparator()); // separator - MenuLabel* qualityLabel = new MenuLabel(); // menu label - qualityLabel->text = "Quality"; - menu->addChild(qualityLabel); - - QualityItem* low = new QualityItem(); // low quality - low->text = "Eco"; - low->module = module; - low->quality = 0; - menu->addChild(low); - - QualityItem* high = new QualityItem(); // high quality - high->text = "High"; - high->module = module; - high->quality = 1; - menu->addChild(high); - - menu->addChild(new MenuSeparator()); // separator - MenuLabel* consoleTypeLabel = new MenuLabel(); // menu label consoleTypeLabel->text = "Console Type"; menu->addChild(consoleTypeLabel); @@ -426,4 +352,4 @@ struct Console_mmWidget : ModuleWidget { } }; -Model* modelConsole_mm = createModel("console_mm"); \ No newline at end of file +Model* modelConsole_mm = createModel("console_mm"); diff --git a/src/distance.cpp b/src/distance.cpp index 8a6fadf..5884597 100644 --- a/src/distance.cpp +++ b/src/distance.cpp @@ -15,10 +15,6 @@ See ./LICENSE.md for all licenses #include "plugin.hpp" -// quality options -#define ECO 0 -#define HIGH 1 - struct Distance : Module { enum ParamIds { DISTANCE_PARAM, @@ -42,7 +38,6 @@ struct Distance : Module { // module variables const double gainCut = 0.03125; const double gainBoost = 32.0; - int quality; // control parameters float distanceParam; @@ -55,7 +50,7 @@ struct Distance : Module { double thirdresult[16]; double prevresult[16]; double last[16]; - long double fpNShape[16]; + double fpNShape[16]; // other variables, which do not need to be updated every cycle double overallscale; @@ -74,7 +69,6 @@ struct Distance : Module { configParam(DISTANCE_PARAM, 0.f, 1.f, 0.f, "Distance"); configParam(DRYWET_PARAM, 0.f, 1.f, 1.f, "Dry/Wet"); - quality = loadQuality(); onReset(); } @@ -106,24 +100,6 @@ struct Distance : Module { overallscale *= sampleRate; } - json_t* dataToJson() override - { - json_t* rootJ = json_object(); - - // quality - json_object_set_new(rootJ, "quality", json_integer(quality)); - - return rootJ; - } - - void dataFromJson(json_t* rootJ) override - { - // quality - json_t* qualityJ = json_object_get(rootJ, "quality"); - if (qualityJ) - quality = json_integer_value(qualityJ); - } - void process(const ProcessArgs& args) override { if (outputs[OUT_OUTPUT].isConnected()) { @@ -157,8 +133,8 @@ struct Distance : Module { double postfilter; double bridgerectifier; - long double inputSample; - long double drySample; + double inputSample; + double drySample; // number of polyphonic channels int numChannels = std::max(1, inputs[IN_INPUT].getChannels()); @@ -172,33 +148,6 @@ struct Distance : Module { // pad gain inputSample *= gainCut; - if (quality == HIGH) { - if (inputSample < 1.2e-38 && -inputSample < 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; - inputSample = applyresidue; - } - } - drySample = inputSample; inputSample *= softslew; @@ -227,16 +176,6 @@ struct Distance : Module { inputSample = (drySample * dry) + (inputSample * wet); } - if (quality == HIGH) { - //stereo 32 bit dither, made small and tidy. - int expon; - frexpf((float)inputSample, &expon); - long double dither = (rand() / (RAND_MAX * 7.737125245533627e+25)) * pow(2, expon + 62); - inputSample += (dither - fpNShape[i]); - fpNShape[i] = dither; - //end 32 bit dither - } - // bring gain back up inputSample *= gainBoost; @@ -249,47 +188,6 @@ struct Distance : Module { }; struct DistanceWidget : ModuleWidget { - - // quality item - struct QualityItem : MenuItem { - Distance* module; - int quality; - - void onAction(const event::Action& e) override - { - module->quality = quality; - } - - void step() override - { - rightText = (module->quality == quality) ? "✔" : ""; - } - }; - - void appendContextMenu(Menu* menu) override - { - Distance* module = dynamic_cast(this->module); - assert(module); - - menu->addChild(new MenuSeparator()); // separator - - MenuLabel* qualityLabel = new MenuLabel(); // menu label - qualityLabel->text = "Quality"; - menu->addChild(qualityLabel); - - QualityItem* low = new QualityItem(); // low quality - low->text = "Eco"; - low->module = module; - low->quality = 0; - menu->addChild(low); - - QualityItem* high = new QualityItem(); // high quality - high->text = "High"; - high->module = module; - high->quality = 1; - menu->addChild(high); - } - DistanceWidget(Distance* module) { setModule(module); @@ -309,4 +207,4 @@ struct DistanceWidget : ModuleWidget { } }; -Model* modelDistance = createModel("distance"); \ No newline at end of file +Model* modelDistance = createModel("distance"); diff --git a/src/golem.cpp b/src/golem.cpp index 20e76ca..14d73bf 100644 --- a/src/golem.cpp +++ b/src/golem.cpp @@ -1,9 +1,5 @@ #include "plugin.hpp" -// quality options -#define ECO 0 -#define HIGH 1 - // delay modes #define DI 0 #define MIC 1 @@ -46,7 +42,6 @@ struct Golem : Module { // module variables const double gainCut = 0.1; const double gainBoost = 10.0; - int quality; int delayMode; int balanceTrimRange; int offsetTrimRange; @@ -59,7 +54,7 @@ struct Golem : Module { // state variables rwlib::GolemBCN golem; - long double fpNShape; + double fpNShape; Golem() { @@ -70,7 +65,6 @@ struct Golem : Module { configParam(OFFSET_TRIM_PARAM, -1.f, 1.f, 0.f, "Offset CV"); configParam(PHASE_PARAM, 0.f, 2.f, 0.f, "Phase"); - quality = ECO; delayMode = DI; balanceTrimRange = BIPOLAR; offsetTrimRange = BIPOLAR; @@ -92,9 +86,6 @@ struct Golem : Module { { json_t* rootJ = json_object(); - // quality - json_object_set_new(rootJ, "quality", json_integer(quality)); - // delay mode json_object_set_new(rootJ, "delayMode", json_integer(delayMode)); @@ -112,11 +103,6 @@ struct Golem : Module { void dataFromJson(json_t* rootJ) override { - // quality - json_t* qualityJ = json_object_get(rootJ, "quality"); - if (qualityJ) - quality = json_integer_value(qualityJ); - // delay mode json_t* delayModeJ = json_object_get(rootJ, "delayMode"); if (delayModeJ) @@ -165,29 +151,15 @@ struct Golem : Module { } // get input - long double inputSampleA = inputs[IN_A_INPUT].getVoltage(); - long double inputSampleB = inputs[IN_B_INPUT].getVoltage(); + double inputSampleA = inputs[IN_A_INPUT].getVoltage(); + double inputSampleB = inputs[IN_B_INPUT].getVoltage(); // pad gain inputSampleA *= gainCut; inputSampleB *= gainCut; - if (quality == HIGH) { - inputSampleA = rwlib::denormalize(inputSampleA); - inputSampleB = rwlib::denormalize(inputSampleB); - } - // work the magic - long double outputSample = golem.process(inputSampleA, inputSampleB, balanceParam, offsetParam, phaseParam, offsetScaling); - - if (quality == HIGH) { - //stereo 32 bit dither, made small and tidy. - int expon; - frexpf((float)outputSample, &expon); - long double dither = (rand() / (RAND_MAX * 7.737125245533627e+25)) * pow(2, expon + 62); - outputSample += (dither - fpNShape); - fpNShape = dither; - } + double outputSample = golem.process(inputSampleA, inputSampleB, balanceParam, offsetParam, phaseParam, offsetScaling); // bring levels back up outputSample *= gainBoost; @@ -199,38 +171,6 @@ struct Golem : Module { }; struct GolemWidget : ModuleWidget { - - // quality item - struct QualityItem : MenuItem { - struct QualitySubItem : MenuItem { - Golem* module; - int quality; - - void onAction(const event::Action& e) override - { - module->quality = quality; - } - }; - - Golem* module; - Menu* createChildMenu() override - { - Menu* menu = new Menu; - - QualitySubItem* eco = createMenuItem("Eco", CHECKMARK(module->quality == ECO)); - eco->module = this->module; - eco->quality = ECO; - menu->addChild(eco); - - QualitySubItem* high = createMenuItem("High", CHECKMARK(module->quality == HIGH)); - high->module = this->module; - high->quality = HIGH; - menu->addChild(high); - - return menu; - } - }; - struct DelayModeItem : MenuItem { struct DelayModeSubItem : MenuItem { Golem* module; @@ -358,10 +298,6 @@ struct GolemWidget : ModuleWidget { settingsLabel->text = "Settings"; menu->addChild(settingsLabel); - QualityItem* qualityItem = createMenuItem("Quality", RIGHT_ARROW); - qualityItem->module = module; - menu->addChild(qualityItem); - DelayModeItem* delayModeItem = createMenuItem("Delay Mode", RIGHT_ARROW); delayModeItem->module = module; menu->addChild(delayModeItem); @@ -413,4 +349,4 @@ struct GolemWidget : ModuleWidget { } }; -Model* modelGolem = createModel("golem"); \ No newline at end of file +Model* modelGolem = createModel("golem"); diff --git a/src/holt.cpp b/src/holt.cpp index 5ef6b1c..ed85b42 100644 --- a/src/holt.cpp +++ b/src/holt.cpp @@ -24,22 +24,18 @@ See ./LICENSE.md for all licenses #include "plugin.hpp" -// quality options -#define ECO 0 -#define HIGH 1 - /* Engine (the audio plugin code, single channel) ======================================================================================== */ struct HoltEngine { - long double previousSampleA; - long double previousTrendA; - long double previousSampleB; - long double previousTrendB; - long double previousSampleC; - long double previousTrendC; - long double previousSampleD; - long double previousTrendD; + double previousSampleA; + double previousTrendA; + double previousSampleB; + double previousTrendB; + double previousSampleC; + double previousTrendC; + double previousSampleD; + double previousTrendD; double alpha; double beta; @@ -63,7 +59,7 @@ struct HoltEngine { lastResonanceParam = 0.0f; } - long double process(long double inputSample, float frequencyParam = 1.0, float resonanceParam = 0.0, float polesParam = 1.0, float outputParam = 1.0, float drywetParam = 1.0) + double process(double inputSample, float frequencyParam = 1.0, float resonanceParam = 0.0, float polesParam = 1.0, float outputParam = 1.0, float drywetParam = 1.0) { if ((frequencyParam != lastFrequencyParam) || (resonanceParam != lastResonanceParam)) { alpha = pow(frequencyParam, 4) + 0.00001; @@ -81,8 +77,8 @@ struct HoltEngine { lastResonanceParam = resonanceParam; } - long double trend; - long double forecast; //defining these here because we're copying the routine four times + double trend; + double forecast; //defining these here because we're copying the routine four times //four-stage wet/dry control using progressive stages that bypass when not engaged double aWet = 1.0; @@ -113,7 +109,7 @@ struct HoltEngine { double gain = outputParam; double wet = drywetParam; - long double drySample = inputSample; + double drySample = inputSample; if (aWet > 0.0) { trend = (beta * (inputSample - previousSampleA) + ((0.999 - beta) * previousTrendA)); @@ -170,45 +166,11 @@ struct HoltEngine { } }; -/* Dither Noise -======================================================================================== */ -inline long double ditherNoise(long double in) -{ - //for live air, we always apply the dither noise. Then, if our result is - //effectively digital black, we'll subtract it again. We want a 'air' hiss - - static int noisesource = 0; - int residue; - double applyresidue; - - noisesource = noisesource % 1700021; - noisesource++; - 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; - applyresidue = residue; - applyresidue *= 0.00000001; - applyresidue *= 0.00000001; - in += applyresidue; - if (in < 1.2e-38 && -in < 1.2e-38) { - in -= applyresidue; - } - - return in; -} - /* Mojo (for output saturation) ======================================================================================== */ -inline long double mojo(long double in) +inline double mojo(double in) { - long double mojo = pow(fabs(in), 0.25); + double mojo = pow(fabs(in), 0.25); if (mojo > 0.0) { in = (sin(in * mojo * M_PI * 0.5) / mojo) * 0.987654321; in *= 0.65; // dial back a bit to keep levels roughly the same @@ -243,7 +205,6 @@ struct Holt : Module { // module variables const double gainCut = 0.03125; const double gainBoost = 32.0; - int quality; HoltEngine holt[16]; // control parameter @@ -253,7 +214,7 @@ struct Holt : Module { // other double overallscale; - long double fpNShape; + double fpNShape; Holt() { @@ -261,8 +222,6 @@ struct Holt : Module { configParam(FREQUENCY_PARAM, 0.f, 1.f, 1.f, "Frequency"); configParam(RESONANCE_PARAM, 0.f, 1.f, 0.f, "Resonance"); configParam(POLES_PARAM, 0.f, 1.f, 1.f, "Poles"); - - quality = loadQuality(); } void onSampleRateChange() override @@ -286,24 +245,6 @@ struct Holt : Module { updateParams(); } - json_t* dataToJson() override - { - json_t* rootJ = json_object(); - - // quality - json_object_set_new(rootJ, "quality", json_integer(quality)); - - return rootJ; - } - - void dataFromJson(json_t* rootJ) override - { - // quality - json_t* qualityJ = json_object_get(rootJ, "quality"); - if (qualityJ) - quality = json_integer_value(qualityJ); - } - void updateParams() { frequencyParam = params[FREQUENCY_PARAM].getValue(); @@ -323,7 +264,7 @@ struct Holt : Module { { updateParams(); - long double in; + double in; // for each poly channel for (int i = 0, numChannels = std::max(1, inputs[IN_INPUT].getChannels()); i < numChannels; ++i) { @@ -331,25 +272,12 @@ struct Holt : Module { // input in = inputs[IN_INPUT].getPolyVoltage(i) * gainCut; - if (quality == HIGH) { - in = ditherNoise(in); - } - // holt in = holt[i].process(in, frequencyParam, resonanceParam, polesParam); // mojo for swallowing excessive resonance in = mojo(in); - if (quality == HIGH) { - //stereo 32 bit dither, made small and tidy. - int expon; - frexpf((float)in, &expon); - long double dither = (rand() / (RAND_MAX * 7.737125245533627e+25)) * pow(2, expon + 62); - in += (dither - fpNShape); - fpNShape = dither; - } - // output outputs[OUT_OUTPUT].setChannels(numChannels); outputs[OUT_OUTPUT].setVoltage(in * gainBoost, i); @@ -360,47 +288,6 @@ struct Holt : Module { /* Widget ======================================================================================== */ struct HoltWidget : ModuleWidget { - - // quality item - struct QualityItem : MenuItem { - Holt* module; - int quality; - - void onAction(const event::Action& e) override - { - module->quality = quality; - } - - void step() override - { - rightText = (module->quality == quality) ? "✔" : ""; - } - }; - - void appendContextMenu(Menu* menu) override - { - Holt* module = dynamic_cast(this->module); - assert(module); - - menu->addChild(new MenuSeparator()); // separator - - MenuLabel* qualityLabel = new MenuLabel(); // menu label - qualityLabel->text = "Quality"; - menu->addChild(qualityLabel); - - QualityItem* low = new QualityItem(); // low quality - low->text = "Eco"; - low->module = module; - low->quality = 0; - menu->addChild(low); - - QualityItem* high = new QualityItem(); // high quality - high->text = "High"; - high->module = module; - high->quality = 1; - menu->addChild(high); - } - HoltWidget(Holt* module) { setModule(module); @@ -428,4 +315,4 @@ struct HoltWidget : ModuleWidget { } }; -Model* modelHolt = createModel("holt"); \ No newline at end of file +Model* modelHolt = createModel("holt"); diff --git a/src/hombre.cpp b/src/hombre.cpp index 0a231b4..19bd79c 100644 --- a/src/hombre.cpp +++ b/src/hombre.cpp @@ -15,10 +15,6 @@ See ./LICENSE.md for all licenses #include "plugin.hpp" -// quality options -#define ECO 0 -#define HIGH 1 - struct Hombre : Module { enum ParamIds { VOICING_PARAM, @@ -42,7 +38,6 @@ struct Hombre : Module { // module variables const double gainCut = 0.03125; const double gainBoost = 32.0; - int quality; // control parameters float voicingParam; @@ -52,7 +47,7 @@ struct Hombre : Module { double p[16][4001]; double slide[16]; int gcount[16]; - long double fpNShape[16]; + double fpNShape[16]; // other variables, which do not need to be updated every cycle double overallscale; @@ -68,7 +63,6 @@ struct Hombre : Module { configParam(VOICING_PARAM, 0.f, 1.f, 0.5f, "Voicing"); configParam(INTENSITY_PARAM, 0.f, 1.f, 0.5f, "Intensity"); - quality = loadQuality(); onReset(); } @@ -98,24 +92,6 @@ struct Hombre : Module { widthB = (int)(7.0 * overallscale); //max 364 at 44.1, 792 at 96K } - json_t* dataToJson() override - { - json_t* rootJ = json_object(); - - // quality - json_object_set_new(rootJ, "quality", json_integer(quality)); - - return rootJ; - } - - void dataFromJson(json_t* rootJ) override - { - // quality - json_t* qualityJ = json_object_get(rootJ, "quality"); - if (qualityJ) - quality = json_integer_value(qualityJ); - } - void process(const ProcessArgs& args) override { if (outputs[OUT_OUTPUT].isConnected()) { @@ -136,7 +112,7 @@ struct Hombre : Module { double offsetB; double total; int count; - long double inputSample; + double inputSample; double drySample; // input @@ -151,33 +127,6 @@ struct Hombre : Module { // pad gain inputSample *= gainCut; - if (quality == HIGH) { - if (inputSample < 1.2e-38 && -inputSample < 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; - inputSample = applyresidue; - } - } - drySample = inputSample; slide[i] = (slide[i] * 0.9997) + (target * 0.0003); @@ -221,16 +170,6 @@ struct Hombre : Module { inputSample = (inputSample * wet) + (drySample * dry); } - if (quality == HIGH) { - //stereo 32 bit dither, made small and tidy. - int expon; - frexpf((float)inputSample, &expon); - long double dither = (rand() / (RAND_MAX * 7.737125245533627e+25)) * pow(2, expon + 62); - inputSample += (dither - fpNShape[i]); - fpNShape[i] = dither; - //end 32 bit dither - } - // bring gain back up inputSample *= gainBoost; @@ -243,47 +182,6 @@ struct Hombre : Module { }; struct HombreWidget : ModuleWidget { - - // quality item - struct QualityItem : MenuItem { - Hombre* module; - int quality; - - void onAction(const event::Action& e) override - { - module->quality = quality; - } - - void step() override - { - rightText = (module->quality == quality) ? "✔" : ""; - } - }; - - void appendContextMenu(Menu* menu) override - { - Hombre* module = dynamic_cast(this->module); - assert(module); - - menu->addChild(new MenuSeparator()); // separator - - MenuLabel* qualityLabel = new MenuLabel(); // menu label - qualityLabel->text = "Quality"; - menu->addChild(qualityLabel); - - QualityItem* low = new QualityItem(); // low quality - low->text = "Eco"; - low->module = module; - low->quality = 0; - menu->addChild(low); - - QualityItem* high = new QualityItem(); // high quality - high->text = "High"; - high->module = module; - high->quality = 1; - menu->addChild(high); - } - HombreWidget(Hombre* module) { setModule(module); @@ -307,4 +205,4 @@ struct HombreWidget : ModuleWidget { } }; -Model* modelHombre = createModel("hombre"); \ No newline at end of file +Model* modelHombre = createModel("hombre"); diff --git a/src/interstage.cpp b/src/interstage.cpp index a88b1ab..9d60c62 100644 --- a/src/interstage.cpp +++ b/src/interstage.cpp @@ -13,10 +13,6 @@ See ./LICENSE.md for all licenses #include "plugin.hpp" -// quality options -#define ECO 0 -#define HIGH 1 - struct Interstage : Module { enum ParamIds { NUM_PARAMS @@ -38,7 +34,6 @@ struct Interstage : Module { // module variables const double gainCut = 0.03125; const double gainBoost = 32.0; - int quality; // state variables (as arrays in order to handle up to 16 polyphonic channels) double iirSampleAL[16]; @@ -47,7 +42,7 @@ struct Interstage : Module { double iirSampleDL[16]; double iirSampleEL[16]; double iirSampleFL[16]; - long double lastSampleL[16]; + double lastSampleL[16]; bool flipL[16]; uint32_t fpdL[16]; double iirSampleAR[16]; @@ -56,7 +51,7 @@ struct Interstage : Module { double iirSampleDR[16]; double iirSampleER[16]; double iirSampleFR[16]; - long double lastSampleR[16]; + double lastSampleR[16]; bool flipR[16]; uint32_t fpdR[16]; @@ -72,7 +67,6 @@ struct Interstage : Module { { config(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS, NUM_LIGHTS); - quality = loadQuality(); onReset(); } @@ -102,30 +96,12 @@ struct Interstage : Module { iirAmount = 0.00295 / overallscale; } - json_t* dataToJson() override - { - json_t* rootJ = json_object(); - - // quality - json_object_set_new(rootJ, "quality", json_integer(quality)); - - return rootJ; - } - - void dataFromJson(json_t* rootJ) override - { - // quality - json_t* qualityJ = json_object_get(rootJ, "quality"); - if (qualityJ) - quality = json_integer_value(qualityJ); - } - - void processChannel(Input& input, Output& output, double iirSampleA[], double iirSampleB[], double iirSampleC[], double iirSampleD[], double iirSampleE[], double iirSampleF[], long double lastSample[], bool flip[], uint32_t fpd[]) + void processChannel(Input& input, Output& output, double iirSampleA[], double iirSampleB[], double iirSampleC[], double iirSampleD[], double iirSampleE[], double iirSampleF[], double lastSample[], bool flip[], uint32_t fpd[]) { if (output.isConnected()) { - long double inputSample; - long double drySample; + double inputSample; + double drySample; // number of polyphonic channels int numChannels = std::max(1, input.getChannels()); @@ -139,11 +115,6 @@ struct Interstage : Module { // pad gain inputSample *= gainCut; - if (quality == HIGH) { - if (fabs(inputSample) < 1.18e-37) - inputSample = fpd[i] * 1.18e-37; - } - drySample = inputSample; inputSample = (inputSample + lastSample[i]) * 0.5; //start the lowpassing with an average @@ -185,17 +156,6 @@ struct Interstage : Module { lastSample[i] = inputSample; - if (quality == HIGH) { - //begin 32 bit stereo floating point dither - int expon; - frexpf((float)inputSample, &expon); - fpd[i] ^= fpd[i] << 13; - fpd[i] ^= fpd[i] >> 17; - fpd[i] ^= fpd[i] << 5; - inputSample += ((double(fpd[i]) - uint32_t(0x7fffffff)) * 5.5e-36l * pow(2, expon + 62)); - //end 32 bit stereo floating point dither - } - // bring gain back up inputSample *= gainBoost; @@ -214,47 +174,6 @@ struct Interstage : Module { }; struct InterstageWidget : ModuleWidget { - - // quality item - struct QualityItem : MenuItem { - Interstage* module; - int quality; - - void onAction(const event::Action& e) override - { - module->quality = quality; - } - - void step() override - { - rightText = (module->quality == quality) ? "✔" : ""; - } - }; - - void appendContextMenu(Menu* menu) override - { - Interstage* module = dynamic_cast(this->module); - assert(module); - - menu->addChild(new MenuSeparator()); // separator - - MenuLabel* qualityLabel = new MenuLabel(); // menu label - qualityLabel->text = "Quality"; - menu->addChild(qualityLabel); - - QualityItem* low = new QualityItem(); // low quality - low->text = "Eco"; - low->module = module; - low->quality = 0; - menu->addChild(low); - - QualityItem* high = new QualityItem(); // high quality - high->text = "High"; - high->module = module; - high->quality = 1; - menu->addChild(high); - } - InterstageWidget(Interstage* module) { setModule(module); @@ -271,4 +190,4 @@ struct InterstageWidget : ModuleWidget { } }; -Model* modelInterstage = createModel("interstage"); \ No newline at end of file +Model* modelInterstage = createModel("interstage"); diff --git a/src/monitoring.cpp b/src/monitoring.cpp index cc3d980..7bda8b3 100644 --- a/src/monitoring.cpp +++ b/src/monitoring.cpp @@ -157,16 +157,16 @@ struct Monitoring : Module { } // get input - long double inputSampleL = inputs[IN_L_INPUT].getVoltage(); - long double inputSampleR = inputs[IN_R_INPUT].getVoltage(); + double inputSampleL = inputs[IN_L_INPUT].getVoltage(); + double inputSampleR = inputs[IN_R_INPUT].getVoltage(); // pad gain inputSampleL /= gainFactor; inputSampleR /= gainFactor; // prepare mid and side - long double mid = inputSampleL + inputSampleR; - long double side = inputSampleL - inputSampleR; + double mid = inputSampleL + inputSampleR; + double side = inputSampleL - inputSampleR; // processing modes switch (processingMode) { @@ -279,4 +279,4 @@ struct MonitoringWidget : ModuleWidget { } }; -Model* modelMonitoring = createModel("monitoring"); \ No newline at end of file +Model* modelMonitoring = createModel("monitoring"); diff --git a/src/mv.cpp b/src/mv.cpp index bb0eaba..ad2c018 100644 --- a/src/mv.cpp +++ b/src/mv.cpp @@ -14,10 +14,6 @@ See ./LICENSE.md for all licenses #include "plugin.hpp" -// quality options -#define ECO 0 -#define HIGH 1 - struct Mv : Module { enum ParamIds { DEPTH_PARAM, @@ -51,7 +47,6 @@ struct Mv : Module { // module variables const double gainCut = 0.03125; const double gainBoost = 32.0; - int quality; // control parameters float depthParam; @@ -214,7 +209,6 @@ struct Mv : Module { configParam(DRYWET_CV_PARAM, -1.f, 1.f, 0.f, "Dry/Wet CV"); configParam(REGEN_CV_PARAM, -1.f, 1.f, 0.f, "Regeneration CV"); - quality = loadQuality(); onReset(); } @@ -441,24 +435,6 @@ struct Mv : Module { { } - json_t* dataToJson() override - { - json_t* rootJ = json_object(); - - // quality - json_object_set_new(rootJ, "quality", json_integer(quality)); - - return rootJ; - } - - void dataFromJson(json_t* rootJ) override - { - // quality - json_t* qualityJ = json_object_get(rootJ, "quality"); - if (qualityJ) - quality = json_integer_value(qualityJ); - } - void process(const ProcessArgs& args) override { if (outputs[OUT_L_OUTPUT].isConnected() || outputs[OUT_R_OUTPUT].isConnected()) { @@ -502,62 +478,13 @@ struct Mv : Module { double wet = drywetParam; // get inputs - long double inputSampleL = inputs[IN_L_INPUT].getVoltage(); - long double inputSampleR = inputs[IN_R_INPUT].getVoltage(); + double inputSampleL = inputs[IN_L_INPUT].getVoltage(); + double inputSampleR = inputs[IN_R_INPUT].getVoltage(); // pad gain inputSampleL *= gainCut; inputSampleR *= gainCut; - if (quality == HIGH) { - //for live air, we always apply the dither noise. Then, if our result is - //effectively digital black, we'll subtract it again. We want a 'air' hiss - 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; - } - } - double drySampleL = inputSampleL; double drySampleR = inputSampleR; @@ -1403,22 +1330,6 @@ struct Mv : Module { inputSampleL *= gainBoost; inputSampleR *= gainBoost; - if (quality == HIGH) { - //begin 64 bit stereo floating point dither - int expon; - frexp((double)inputSampleL, &expon); - fpd ^= fpd << 13; - fpd ^= fpd >> 17; - fpd ^= fpd << 5; - inputSampleL += static_cast(fpd) * 1.110223024625156e-44L * pow(2, expon + 62); - frexp((double)inputSampleR, &expon); - fpd ^= fpd << 13; - fpd ^= fpd >> 17; - fpd ^= fpd << 5; - inputSampleR += static_cast(fpd) * 1.110223024625156e-44L * pow(2, expon + 62); - //end 64 bit stereo floating point dither - } - outputs[OUT_L_OUTPUT].setVoltage(inputSampleL); outputs[OUT_R_OUTPUT].setVoltage(inputSampleR); } @@ -1426,47 +1337,6 @@ struct Mv : Module { }; struct MvWidget : ModuleWidget { - - // quality item - struct QualityItem : MenuItem { - Mv* module; - int quality; - - void onAction(const event::Action& e) override - { - module->quality = quality; - } - - void step() override - { - rightText = (module->quality == quality) ? "✔" : ""; - } - }; - - void appendContextMenu(Menu* menu) override - { - Mv* module = dynamic_cast(this->module); - assert(module); - - menu->addChild(new MenuSeparator()); // separator - - MenuLabel* qualityLabel = new MenuLabel(); // menu label - qualityLabel->text = "Quality"; - menu->addChild(qualityLabel); - - QualityItem* low = new QualityItem(); // low quality - low->text = "Eco"; - low->module = module; - low->quality = 0; - menu->addChild(low); - - QualityItem* high = new QualityItem(); // high quality - high->text = "High"; - high->module = module; - high->quality = 1; - menu->addChild(high); - } - MvWidget(Mv* module) { setModule(module); @@ -1502,4 +1372,4 @@ struct MvWidget : ModuleWidget { } }; -Model* modelMv = createModel("mv"); \ No newline at end of file +Model* modelMv = createModel("mv"); diff --git a/src/plugin.cpp b/src/plugin.cpp index f5e37c2..9c145a0 100644 --- a/src/plugin.cpp +++ b/src/plugin.cpp @@ -33,87 +33,6 @@ void init(Plugin* p) /* Other stuff */ -/* #quality mode -======================================================================================== */ -void saveQuality(bool quality) -{ - json_t* settingsJ = json_object(); - json_object_set_new(settingsJ, "quality", json_boolean(quality)); - std::string settingsFilename = asset::user("Rackwindows.json"); - FILE* file = fopen(settingsFilename.c_str(), "w"); - if (file) { - json_dumpf(settingsJ, file, JSON_INDENT(2) | JSON_REAL_PRECISION(9)); - fclose(file); - } - json_decref(settingsJ); -} - -bool loadQuality() -{ - bool ret = false; - std::string settingsFilename = asset::user("Rackwindows.json"); - FILE* file = fopen(settingsFilename.c_str(), "r"); - if (!file) { - saveQuality(false); - return ret; - } - json_error_t error; - json_t* settingsJ = json_loadf(file, 0, &error); - if (!settingsJ) { - // invalid setting json file - fclose(file); - saveQuality(false); - return ret; - } - json_t* qualityJ = json_object_get(settingsJ, "quality"); - if (qualityJ) - ret = json_boolean_value(qualityJ); - - fclose(file); - json_decref(settingsJ); - return ret; -} - -void saveHighQualityAsDefault(bool highQualityAsDefault) -{ - json_t* settingsJ = json_object(); - json_object_set_new(settingsJ, "highQualityAsDefault", json_boolean(highQualityAsDefault)); - std::string settingsFilename = asset::user("Rackwindows.json"); - FILE* file = fopen(settingsFilename.c_str(), "w"); - if (file) { - json_dumpf(settingsJ, file, JSON_INDENT(2) | JSON_REAL_PRECISION(9)); - fclose(file); - } - json_decref(settingsJ); -} - -// https://github.com/MarcBoule/Geodesics/blob/master/src/Geodesics.cpp -bool loadHighQualityAsDefault() -{ - bool ret = false; - std::string settingsFilename = asset::user("Rackwindows.json"); - FILE* file = fopen(settingsFilename.c_str(), "r"); - if (!file) { - saveHighQualityAsDefault(false); - return ret; - } - json_error_t error; - json_t* settingsJ = json_loadf(file, 0, &error); - if (!settingsJ) { - // invalid setting json file - fclose(file); - saveHighQualityAsDefault(false); - return ret; - } - json_t* highQualityAsDefaultJ = json_object_get(settingsJ, "highQualityAsDefault"); - if (highQualityAsDefaultJ) - ret = json_boolean_value(highQualityAsDefaultJ); - - fclose(file); - json_decref(settingsJ); - return ret; -} - /* #console type (Console, Console MM) ======================================================================================== */ void saveConsoleType(int consoleType) diff --git a/src/rasp.cpp b/src/rasp.cpp index 12d9e85..f44b699 100644 --- a/src/rasp.cpp +++ b/src/rasp.cpp @@ -17,10 +17,6 @@ See ./LICENSE.md for all licenses #include "plugin.hpp" -// quality options -#define ECO 0 -#define HIGH 1 - // slew types #define SLEW2 0 #define SLEW 1 @@ -53,7 +49,6 @@ struct Rasp : Module { // module variables const double gainCut = 0.1; const double gainBoost = 10.0; - bool quality; int slewType; // control parameters @@ -65,8 +60,8 @@ struct Rasp : Module { rwlib::Slew2 slew2[MAX_POLY_CHANNELS]; rwlib::Slew3 slew3[MAX_POLY_CHANNELS]; rwlib::Acceleration acceleration[MAX_POLY_CHANNELS]; - long double fpNShapeClamp[MAX_POLY_CHANNELS]; - long double fpNShapeLimit[MAX_POLY_CHANNELS]; + double fpNShapeClamp[MAX_POLY_CHANNELS]; + double fpNShapeLimit[MAX_POLY_CHANNELS]; // other double overallscale; @@ -77,7 +72,6 @@ struct Rasp : Module { configParam(CLAMP_PARAM, 0.f, 1.f, 0.f, "Clamp", " %", 0.f, 100.f); configParam(LIMIT_PARAM, 0.f, 1.f, 0.f, "Limit", " %", 0.f, 100.f); - quality = ECO; slewType = SLEW2; onReset(); } @@ -114,9 +108,6 @@ struct Rasp : Module { { json_t* rootJ = json_object(); - // quality - json_object_set_new(rootJ, "quality", json_integer(quality)); - // slew type json_object_set_new(rootJ, "slewType", json_integer(slewType)); @@ -125,11 +116,6 @@ struct Rasp : Module { void dataFromJson(json_t* rootJ) override { - // quality - json_t* qualityJ = json_object_get(rootJ, "quality"); - if (qualityJ) - quality = json_integer_value(qualityJ); - // slew type json_t* slewTypeJ = json_object_get(rootJ, "slewType"); if (slewTypeJ) @@ -147,9 +133,9 @@ struct Rasp : Module { clampParam += inputs[CLAMP_CV_INPUT].getVoltage() / 5; clampParam = clamp(clampParam, 0.f, 1.f); - long double inputSample; - long double clampSample = 0.0; - long double limitSample = 0.0; + double inputSample; + double clampSample = 0.0; + double limitSample = 0.0; // for each poly channel for (int i = 0, numChannels = std::max(1, inputs[IN_INPUT].getChannels()); i < numChannels; ++i) { @@ -160,10 +146,6 @@ struct Rasp : Module { // pad gain inputSample *= gainCut; - if (quality == HIGH) { - inputSample = rwlib::denormalize(inputSample); - } - // work the magic if (outputs[CLAMP_OUTPUT].isConnected()) { if (outputs[LIMIT_OUTPUT].isConnected()) { @@ -209,19 +191,6 @@ struct Rasp : Module { } } - if (quality == HIGH) { - // 32 bit dither, made small and tidy. - int expon; - frexpf((float)clampSample, &expon); - long double dither = (rand() / (RAND_MAX * 7.737125245533627e+25)) * pow(2, expon + 62); - clampSample += (dither - fpNShapeClamp[i]); - fpNShapeClamp[i] = dither; - frexpf((float)limitSample, &expon); - dither = (rand() / (RAND_MAX * 7.737125245533627e+25)) * pow(2, expon + 62); - limitSample += (dither - fpNShapeLimit[i]); - fpNShapeLimit[i] = dither; - } - // bring levels back up clampSample *= gainBoost; limitSample *= gainBoost; @@ -236,23 +205,6 @@ struct Rasp : Module { }; struct RaspWidget : ModuleWidget { - - // quality item - struct QualityItem : MenuItem { - Rasp* module; - int quality; - - void onAction(const event::Action& e) override - { - module->quality = quality; - } - - void step() override - { - rightText = (module->quality == quality) ? "✔" : ""; - } - }; - // slew type item struct SlewTypeItem : MenuItem { Rasp* module; @@ -276,24 +228,6 @@ struct RaspWidget : ModuleWidget { menu->addChild(new MenuSeparator()); // separator - MenuLabel* qualityLabel = new MenuLabel(); // menu label - qualityLabel->text = "Quality"; - menu->addChild(qualityLabel); - - QualityItem* low = new QualityItem(); // low quality - low->text = "Eco"; - low->module = module; - low->quality = 0; - menu->addChild(low); - - QualityItem* high = new QualityItem(); // high quality - high->text = "High"; - high->module = module; - high->quality = 1; - menu->addChild(high); - - menu->addChild(new MenuSeparator()); // separator - MenuLabel* slewLabel = new MenuLabel(); // menu label slewLabel->text = "Clamp Type"; menu->addChild(slewLabel); @@ -341,4 +275,4 @@ struct RaspWidget : ModuleWidget { } }; -Model* modelRasp = createModel("rasp"); \ No newline at end of file +Model* modelRasp = createModel("rasp"); diff --git a/src/reseq.cpp b/src/reseq.cpp index 48b2ff8..ee963c2 100644 --- a/src/reseq.cpp +++ b/src/reseq.cpp @@ -16,10 +16,6 @@ See ./LICENSE.md for all licenses #include "plugin.hpp" -// quality options -#define ECO 0 -#define HIGH 1 - struct Reseq : Module { enum ParamIds { ENUMS(RESO_PARAMS, 4), @@ -42,7 +38,6 @@ struct Reseq : Module { // module variables const double gainFactor = 32.0; - int quality; // control parameters float r1Param; @@ -82,7 +77,6 @@ struct Reseq : Module { } configParam(DRYWET_PARAM, 0.f, 1.f, 1.f, "Dry/Wet"); - quality = loadQuality(); onReset(); } @@ -112,24 +106,6 @@ struct Reseq : Module { overallscale *= sampleRate; } - json_t* dataToJson() override - { - json_t* rootJ = json_object(); - - // quality - json_object_set_new(rootJ, "quality", json_integer(quality)); - - return rootJ; - } - - void dataFromJson(json_t* rootJ) override - { - // quality - json_t* qualityJ = json_object_get(rootJ, "quality"); - if (qualityJ) - quality = json_integer_value(qualityJ); - } - void updateParams() { r1Param = params[RESO_PARAMS + 0].getValue(); @@ -204,7 +180,7 @@ struct Reseq : Module { for (int i = 0; i < numChannels; ++i) { // input - long double inputSample = input.getPolyVoltage(i); + double inputSample = input.getPolyVoltage(i); // pad gain inputSample /= gainFactor; @@ -243,12 +219,7 @@ struct Reseq : Module { } //done updating the kernel for this go-round - if (quality == HIGH) { - if (fabs(inputSample) < 1.18e-43) - inputSample = fpd[i] * 1.18e-43; - } - - long double drySample = inputSample; + double drySample = inputSample; // EQ kernel b[i][59] = b[i][58]; @@ -381,17 +352,6 @@ struct Reseq : Module { inputSample = (inputSample * wet) + (drySample * (1.0 - wet)); } - if (quality == HIGH) { - //begin 64 bit stereo floating point dither - int expon; - frexp((double)inputSample, &expon); - fpd[i] ^= fpd[i] << 13; - fpd[i] ^= fpd[i] >> 17; - fpd[i] ^= fpd[i] << 5; - inputSample += ((double(fpd[i]) - uint32_t(0x7fffffff)) * 1.1e-44l * pow(2, expon + 62)); - //end 64 bit stereo floating point dither - } - // bring gain back up inputSample *= gainFactor; @@ -413,47 +373,6 @@ struct Reseq : Module { }; struct ReseqWidget : ModuleWidget { - - // quality item - struct QualityItem : MenuItem { - Reseq* module; - int quality; - - void onAction(const event::Action& e) override - { - module->quality = quality; - } - - void step() override - { - rightText = (module->quality == quality) ? "✔" : ""; - } - }; - - void appendContextMenu(Menu* menu) override - { - Reseq* module = dynamic_cast(this->module); - assert(module); - - menu->addChild(new MenuSeparator()); // separator - - MenuLabel* qualityLabel = new MenuLabel(); // menu label - qualityLabel->text = "Quality"; - menu->addChild(qualityLabel); - - QualityItem* low = new QualityItem(); // low quality - low->text = "Eco"; - low->module = module; - low->quality = 0; - menu->addChild(low); - - QualityItem* high = new QualityItem(); // high quality - high->text = "High"; - high->module = module; - high->quality = 1; - menu->addChild(high); - } - ReseqWidget(Reseq* module) { setModule(module); @@ -481,4 +400,4 @@ struct ReseqWidget : ModuleWidget { } }; -Model* modelReseq = createModel("reseq"); \ No newline at end of file +Model* modelReseq = createModel("reseq"); diff --git a/src/tape.cpp b/src/tape.cpp index 88134c2..a42c1bb 100644 --- a/src/tape.cpp +++ b/src/tape.cpp @@ -14,10 +14,6 @@ See ./LICENSE.md for all licenses #include "plugin.hpp" -// quality options -#define ECO 0 -#define HIGH 1 - // polyphony #define MAX_POLY_CHANNELS 16 @@ -46,7 +42,6 @@ struct Tape : Module { // module variables const double gainCut = 0.1; const double gainBoost = 10.0; - int quality; // control parameters float slamParam; @@ -67,7 +62,6 @@ struct Tape : Module { configParam(SLAM_PARAM, 0.f, 1.f, 0.5f, "Slam", "%", 0, 100); configParam(BUMP_PARAM, 0.f, 1.f, 0.5f, "Bump", "%", 0, 100); - quality = loadQuality(); onReset(); } @@ -97,24 +91,6 @@ struct Tape : Module { } } - json_t* dataToJson() override - { - json_t* rootJ = json_object(); - - // quality - json_object_set_new(rootJ, "quality", json_integer(quality)); - - return rootJ; - } - - void dataFromJson(json_t* rootJ) override - { - // quality - json_t* qualityJ = json_object_get(rootJ, "quality"); - if (qualityJ) - quality = json_integer_value(qualityJ); - } - void process(const ProcessArgs& args) override { slamParam = params[SLAM_PARAM].getValue(); @@ -136,29 +112,14 @@ struct Tape : Module { for (int i = 0; i < numChannelsL; i++) { // input - long double inputSampleL = inputs[IN_L_INPUT].getPolyVoltage(i); + double inputSampleL = inputs[IN_L_INPUT].getPolyVoltage(i); // pad gain inputSampleL *= gainCut; - if (quality == HIGH) { - if (fabs(inputSampleL) < 1.18e-37) - inputSampleL = fpdL[i] * 1.18e-37; - } - // work the magic inputSampleL = tapeL[i].process(inputSampleL, slamParam, bumpParam, overallscale); - if (quality == HIGH) { - //32 bit stereo floating point dither - int expon; - frexpf((float)inputSampleL, &expon); - fpdL[i] ^= fpdL[i] << 13; - fpdL[i] ^= fpdL[i] >> 17; - fpdL[i] ^= fpdL[i] << 5; - inputSampleL += ((double(fpdL[i]) - uint32_t(0x7fffffff)) * 5.5e-36l * pow(2, expon + 62)); - } - // bring gain back up inputSampleL *= gainBoost; @@ -175,29 +136,14 @@ struct Tape : Module { for (int i = 0; i < numChannelsR; i++) { // input - long double inputSampleR = inputs[IN_R_INPUT].getPolyVoltage(i); + double inputSampleR = inputs[IN_R_INPUT].getPolyVoltage(i); // pad gain inputSampleR *= gainCut; - if (quality == HIGH) { - if (fabs(inputSampleR) < 1.18e-37) - inputSampleR = fpdR[i] * 1.18e-37; - } - // work the magic inputSampleR = tapeR[i].process(inputSampleR, slamParam, bumpParam, overallscale); - if (quality == HIGH) { - //32 bit stereo floating point dither - int expon; - frexpf((float)inputSampleR, &expon); - fpdR[i] ^= fpdR[i] << 13; - fpdR[i] ^= fpdR[i] >> 17; - fpdR[i] ^= fpdR[i] << 5; - inputSampleR += ((double(fpdR[i]) - uint32_t(0x7fffffff)) * 5.5e-36l * pow(2, expon + 62)); - } - // bring gain back up inputSampleR *= gainBoost; @@ -210,47 +156,6 @@ struct Tape : Module { }; struct TapeWidget : ModuleWidget { - - // quality item - struct QualityItem : MenuItem { - Tape* module; - int quality; - - void onAction(const event::Action& e) override - { - module->quality = quality; - } - - void step() override - { - rightText = (module->quality == quality) ? "✔" : ""; - } - }; - - void appendContextMenu(Menu* menu) override - { - Tape* module = dynamic_cast(this->module); - assert(module); - - menu->addChild(new MenuSeparator()); // separator - - MenuLabel* qualityLabel = new MenuLabel(); // menu label - qualityLabel->text = "Quality"; - menu->addChild(qualityLabel); - - QualityItem* low = new QualityItem(); // low quality - low->text = "Eco"; - low->module = module; - low->quality = 0; - menu->addChild(low); - - QualityItem* high = new QualityItem(); // high quality - high->text = "High"; - high->module = module; - high->quality = 1; - menu->addChild(high); - } - TapeWidget(Tape* module) { setModule(module); @@ -277,4 +182,4 @@ struct TapeWidget : ModuleWidget { } }; -Model* modelTape = createModel("tape"); \ No newline at end of file +Model* modelTape = createModel("tape"); diff --git a/src/tremolo.cpp b/src/tremolo.cpp index cefb333..086e61b 100644 --- a/src/tremolo.cpp +++ b/src/tremolo.cpp @@ -15,10 +15,6 @@ See ./LICENSE.md for all licenses #include "plugin.hpp" -// quality options -#define ECO 0 -#define HIGH 1 - struct Tremolo : Module { enum ParamIds { SPEED_PARAM, @@ -44,7 +40,6 @@ struct Tremolo : Module { // module variables const double gainCut = 0.03125; const double gainBoost = 32.0; - int quality; // control parameters float speedParam; @@ -58,7 +53,7 @@ struct Tremolo : Module { double depthAmount[16]; double lastSpeed[16]; double lastDepth[16]; - long double fpNShape[16]; + double fpNShape[16]; // other variables, which do not need to be updated every cycle double overallscale; @@ -76,7 +71,6 @@ struct Tremolo : Module { configParam(SPEED_PARAM, 0.f, 1.f, 0.f, "Speed"); configParam(DEPTH_PARAM, 0.f, 1.f, 0.f, "Depth"); - quality = loadQuality(); onReset(); } @@ -110,24 +104,6 @@ struct Tremolo : Module { overallscale *= sampleRate; } - json_t* dataToJson() override - { - json_t* rootJ = json_object(); - - // quality - json_object_set_new(rootJ, "quality", json_integer(quality)); - - return rootJ; - } - - void dataFromJson(json_t* rootJ) override - { - // quality - json_t* qualityJ = json_object_get(rootJ, "quality"); - if (qualityJ) - quality = json_integer_value(qualityJ); - } - void process(const ProcessArgs& args) override { if (outputs[OUT_OUTPUT].isConnected()) { @@ -150,8 +126,8 @@ struct Tremolo : Module { double out; double bridgerectifier; double offset; - long double inputSample; - long double drySample; + double inputSample; + double drySample; // number of polyphonic channels int numChannels = std::max(1, inputs[IN_INPUT].getChannels()); @@ -177,33 +153,6 @@ struct Tremolo : Module { // pad gain inputSample *= gainCut; - if (quality == HIGH) { - if (inputSample < 1.2e-38 && -inputSample < 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; - inputSample = applyresidue; - } - } - drySample = inputSample; speedAmount[i] = (((speedAmount[i] * speedSpeed) + speedChase[i]) / (speedSpeed + 1.0)); @@ -255,15 +204,6 @@ struct Tremolo : Module { //apply tremolo, apply gain boost to compensate for volume loss inputSample = (drySample * (1 - depth)) + (inputSample * depth); - if (quality == HIGH) { - //stereo 32 bit dither, made small and tidy. - int expon; - frexpf((float)inputSample, &expon); - long double dither = (rand() / (RAND_MAX * 7.737125245533627e+25)) * pow(2, expon + 62); - inputSample += (dither - fpNShape[i]); - fpNShape[i] = dither; - } - // bring gain back up inputSample *= gainBoost; @@ -279,47 +219,6 @@ struct Tremolo : Module { }; struct TremoloWidget : ModuleWidget { - - // quality item - struct QualityItem : MenuItem { - Tremolo* module; - int quality; - - void onAction(const event::Action& e) override - { - module->quality = quality; - } - - void step() override - { - rightText = (module->quality == quality) ? "✔" : ""; - } - }; - - void appendContextMenu(Menu* menu) override - { - Tremolo* module = dynamic_cast(this->module); - assert(module); - - menu->addChild(new MenuSeparator()); // separator - - MenuLabel* qualityLabel = new MenuLabel(); // menu label - qualityLabel->text = "Quality"; - menu->addChild(qualityLabel); - - QualityItem* low = new QualityItem(); // low quality - low->text = "Eco"; - low->module = module; - low->quality = 0; - menu->addChild(low); - - QualityItem* high = new QualityItem(); // high quality - high->text = "High"; - high->module = module; - high->quality = 1; - menu->addChild(high); - } - TremoloWidget(Tremolo* module) { setModule(module); @@ -347,4 +246,4 @@ struct TremoloWidget : ModuleWidget { } }; -Model* modelTremolo = createModel("tremolo"); \ No newline at end of file +Model* modelTremolo = createModel("tremolo"); diff --git a/src/vibrato.cpp b/src/vibrato.cpp index 02f2a8b..8841b2b 100644 --- a/src/vibrato.cpp +++ b/src/vibrato.cpp @@ -15,10 +15,6 @@ See ./LICENSE.md for all licenses #include "plugin.hpp" -// quality options -#define ECO 0 -#define HIGH 1 - struct Vibrato : Module { enum ParamIds { @@ -53,7 +49,6 @@ struct Vibrato : Module { // module variables const double gainCut = 0.03125; const double gainBoost = 32.0; - int quality; dsp::PulseGenerator eocPulse, eocFmPulse; // control parameters @@ -100,7 +95,6 @@ struct Vibrato : Module { configParam(FMDEPTH_PARAM, 0.f, 1.f, 0.f, "FM Depth"); configParam(INVWET_PARAM, 0.f, 1.f, 0.5f, "Inv/Wet"); - quality = loadQuality(); onReset(); } @@ -141,24 +135,6 @@ struct Vibrato : Module { overallscale *= sampleRate; } - json_t* dataToJson() override - { - json_t* rootJ = json_object(); - - // quality - json_object_set_new(rootJ, "quality", json_integer(quality)); - - return rootJ; - } - - void dataFromJson(json_t* rootJ) override - { - // quality - json_t* qualityJ = json_object_get(rootJ, "quality"); - if (qualityJ) - quality = json_integer_value(qualityJ); - } - void process(const ProcessArgs& args) override { if (outputs[OUT_OUTPUT].isConnected() || outputs[EOC_OUTPUT].isConnected() || outputs[EOC_FM_OUTPUT].isConnected()) { @@ -210,16 +186,11 @@ struct Vibrato : Module { for (int i = 0; i < numChannels; i++) { // input - long double inputSample = inputs[IN_INPUT].getPolyVoltage(i); + double inputSample = inputs[IN_INPUT].getPolyVoltage(i); // pad gain inputSample *= gainCut; - if (quality == HIGH) { - if (fabs(inputSample) < 1.18e-37) - inputSample = fpd[i] * 1.18e-37; - } - double drySample = inputSample; airFactor[i] = airPrev[i] - inputSample; @@ -276,17 +247,6 @@ struct Vibrato : Module { inputSample = (inputSample * wet) + (drySample * (1.0 - fabs(wet))); } - if (quality == HIGH) { - //begin 32 bit stereo floating point dither - int expon; - frexpf((float)inputSample, &expon); - fpd[i] ^= fpd[i] << 13; - fpd[i] ^= fpd[i] >> 17; - fpd[i] ^= fpd[i] << 5; - inputSample += ((double(fpd[i]) - uint32_t(0x7fffffff)) * 5.5e-36l * pow(2, expon + 62)); - //end 32 bit stereo floating point dither - } - // bring gain back up inputSample *= gainBoost; @@ -315,47 +275,6 @@ struct Vibrato : Module { }; struct VibratoWidget : ModuleWidget { - - // quality item - struct QualityItem : MenuItem { - Vibrato* module; - int quality; - - void onAction(const event::Action& e) override - { - module->quality = quality; - } - - void step() override - { - rightText = (module->quality == quality) ? "✔" : ""; - } - }; - - void appendContextMenu(Menu* menu) override - { - Vibrato* module = dynamic_cast(this->module); - assert(module); - - menu->addChild(new MenuSeparator()); // separator - - MenuLabel* qualityLabel = new MenuLabel(); // menu label - qualityLabel->text = "Quality"; - menu->addChild(qualityLabel); - - QualityItem* low = new QualityItem(); // low quality - low->text = "Eco"; - low->module = module; - low->quality = 0; - menu->addChild(low); - - QualityItem* high = new QualityItem(); // high quality - high->text = "High"; - high->module = module; - high->quality = 1; - menu->addChild(high); - } - VibratoWidget(Vibrato* module) { setModule(module); @@ -393,4 +312,4 @@ struct VibratoWidget : ModuleWidget { } }; -Model* modelVibrato = createModel("vibrato"); \ No newline at end of file +Model* modelVibrato = createModel("vibrato");