From 15a780c55ac852bfb14556e5687e05facea77127 Mon Sep 17 00:00:00 2001 From: Dave Benham Date: Wed, 27 Nov 2024 23:14:50 -0500 Subject: [PATCH] Add option to disable DPW anti-aliasing --- doc/QuadVCPolarizer.png | Bin 17765 -> 17888 bytes src/Oscillator.cpp | 27 +++++++++++++++++++-------- src/VCOUnit.cpp | 19 +++++++++++++++++-- 3 files changed, 36 insertions(+), 10 deletions(-) diff --git a/doc/QuadVCPolarizer.png b/doc/QuadVCPolarizer.png index f07d1c02fbb2345eb952c79ee38b5017f79d357c..59e1c5942526370ac6ed36a035f3b6c792ac393c 100644 GIT binary patch delta 13907 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 diff --git a/src/Oscillator.cpp b/src/Oscillator.cpp index 329c8af..2d2f211 100644 --- a/src/Oscillator.cpp +++ b/src/Oscillator.cpp @@ -180,6 +180,7 @@ struct Oscillator : VenomModule { }; bool clampLevel = true; + bool disableDPW = false; bool disableOver[INPUTS_LEN]{}; bool unity5[5]{}; bool bipolar[5]{}; @@ -320,10 +321,12 @@ struct Oscillator : VenomModule { return -(((-0.540347 * t2 + 2.53566) * t2 - 5.16651) * t2 + 3.14159) * t; } - void setMode() { + void setMode(bool aliasSuppressOnly = false) { currentMode = static_cast(params[MODE_PARAM].getValue()); mode = currentMode>5 ? 1 : currentMode>2 ? 0 : currentMode; - aliasSuppress = !mode; + aliasSuppress = !mode && !disableDPW; + if (aliasSuppressOnly) + return; if (!paramExtensions[OVER_PARAM].locked) params[OVER_PARAM].setValue(modeDefaultOver[mode]); paramQuantities[OVER_PARAM]->defaultValue = modeDefaultOver[mode]; @@ -1017,6 +1020,7 @@ struct Oscillator : VenomModule { json_object_set_new(rootJ, "linDCCouple", json_boolean(linDCCouple)); json_object_set_new(rootJ, "overParam", json_integer(params[OVER_PARAM].getValue())); json_object_set_new(rootJ, "clampLevel", json_boolean(clampLevel)); + json_object_set_new(rootJ, "disableDPW", json_boolean(disableDPW)); return rootJ; } @@ -1060,16 +1064,14 @@ struct Oscillator : VenomModule { if ((val = json_object_get(rootJ, "linDCCouple"))) { linDCCouple = json_boolean_value(val); } + val = json_object_get(rootJ, "disableDPW"); + disableDPW = val ? json_boolean_value(val) : true; setMode(); if ((val = json_object_get(rootJ, "overParam"))) { params[OVER_PARAM].setValue(json_integer_value(val)); } - if ((val = json_object_get(rootJ, "clampLevel"))) { - clampLevel = json_boolean_value(val); - } - else { - clampLevel = false; - } + val = json_object_get(rootJ, "clampLevel"); + clampLevel = val ? json_boolean_value(val) : false; } }; @@ -1307,6 +1309,15 @@ struct OscillatorWidget : VenomWidget { Oscillator* module = dynamic_cast(this->module); menu->addChild(new MenuSeparator); menu->addChild(createBoolPtrMenuItem("Limit levels to 100%", "", &module->clampLevel)); + menu->addChild(createBoolMenuItem("Disable DPW anti-alias", "", + [=]() { + return module->disableDPW; + }, + [=](bool val) { + module->disableDPW = val; + module->setMode(true); + } + )); VenomWidget::appendContextMenu(menu); } diff --git a/src/VCOUnit.cpp b/src/VCOUnit.cpp index 86b99d8..874b0ec 100644 --- a/src/VCOUnit.cpp +++ b/src/VCOUnit.cpp @@ -70,6 +70,7 @@ struct VCOUnit : VenomModule { float shpScale = 0.2f; bool softSync = false; bool alternate = false; + bool disableDPW = false; bool aliasSuppress = false; using float_4 = simd::float_4; int oversample = -1; @@ -192,10 +193,12 @@ struct VCOUnit : VenomModule { return -(((-0.540347 * t2 + 2.53566) * t2 - 5.16651) * t2 + 3.14159) * t; } - void setMode() { + void setMode(bool aliasSuppressOnly = false) { currentMode = static_cast(params[MODE_PARAM].getValue()); mode = currentMode>5 ? 1 : currentMode>2 ? 0 : currentMode; - aliasSuppress = !mode; + aliasSuppress = !(mode || disableDPW); + if (aliasSuppressOnly) + return; if (!paramExtensions[OVER_PARAM].locked) params[OVER_PARAM].setValue(modeDefaultOver[mode]); paramQuantities[OVER_PARAM]->defaultValue = modeDefaultOver[mode]; @@ -668,6 +671,7 @@ struct VCOUnit : VenomModule { json_object_set_new(rootJ, "linDCCouple", json_boolean(linDCCouple)); json_object_set_new(rootJ, "overParam", json_integer(params[OVER_PARAM].getValue())); json_object_set_new(rootJ, "clampLevel", json_boolean(clampLevel)); + json_object_set_new(rootJ, "disableDPW", json_boolean(disableDPW)); json_object_set_new(rootJ, "shapeModeParam", json_integer(params[SHAPE_MODE_PARAM].getValue())); return rootJ; } @@ -691,6 +695,8 @@ struct VCOUnit : VenomModule { if ((val = json_object_get(rootJ, "linDCCouple"))) { linDCCouple = json_boolean_value(val); } + val = json_object_get(rootJ, "disableDPW"); + disableDPW = val ? json_boolean_value(val) : true; setMode(); if ((val = json_object_get(rootJ, "overParam"))) { params[OVER_PARAM].setValue(json_integer_value(val)); @@ -898,6 +904,15 @@ struct VCOUnitWidget : VenomWidget { VCOUnit* module = dynamic_cast(this->module); menu->addChild(new MenuSeparator); menu->addChild(createBoolPtrMenuItem("Limit level to 100%", "", &module->clampLevel)); + menu->addChild(createBoolMenuItem("Disable DPW anti-alias", "", + [=]() { + return module->disableDPW; + }, + [=](bool val) { + module->disableDPW = val; + module->setMode(true); + } + )); VenomWidget::appendContextMenu(menu); }