From 057ced4efb11f0b9cb5a791d614827ce1ee3488b Mon Sep 17 00:00:00 2001 From: Valentine Silvansky Date: Thu, 4 Jun 2026 20:34:19 +0300 Subject: [PATCH] add pre/off/post EQ mode with preset migration --- NeuralAmpModeler/NeuralAmpModeler.cpp | 31 +++++++++---- NeuralAmpModeler/NeuralAmpModeler.h | 9 +++- NeuralAmpModeler/Unserialization.cpp | 44 ++++++++++++++++++- NeuralAmpModeler/config.h | 4 +- .../resources/NeuralAmpModeler-AAX-Info.plist | 6 +-- .../resources/NeuralAmpModeler-AU-Info.plist | 10 ++--- .../NeuralAmpModeler-VST3-Info.plist | 6 +-- .../NeuralAmpModeler-macOS-AUv3-Info.plist | 8 ++-- .../NeuralAmpModeler-macOS-Info.plist | 6 +-- 9 files changed, 93 insertions(+), 31 deletions(-) diff --git a/NeuralAmpModeler/NeuralAmpModeler.cpp b/NeuralAmpModeler/NeuralAmpModeler.cpp index 4a08266ac..41397f172 100644 --- a/NeuralAmpModeler/NeuralAmpModeler.cpp +++ b/NeuralAmpModeler/NeuralAmpModeler.cpp @@ -87,7 +87,7 @@ NeuralAmpModeler::NeuralAmpModeler(const InstanceInfo& info) GetParam(kOutputLevel)->InitGain("Output", 0.0, -40.0, 40.0, 0.1); GetParam(kNoiseGateThreshold)->InitGain("Threshold", -80.0, -100.0, 0.0, 0.1); GetParam(kNoiseGateActive)->InitBool("NoiseGateActive", true); - GetParam(kEQActive)->InitBool("ToneStack", true); + GetParam(kEQMode)->InitEnum("EQ", kEQModePost, {"Pre", "Off", "Post"}); GetParam(kOutputMode)->InitEnum("OutputMode", 1, {"Raw", "Normalized", "Calibrated"}); // TODO DRY w/ control GetParam(kIRToggle)->InitBool("IRToggle", true); GetParam(kCalibrateInput)->InitBool(kCalibrateInputParamName.c_str(), kDefaultCalibrateInput); @@ -266,7 +266,13 @@ NeuralAmpModeler::NeuralAmpModeler(const InstanceInfo& info) kCtrlTagIRFileBrowser); pGraphics->AttachControl( new NAMSwitchControl(ngToggleArea, kNoiseGateActive, "Noise Gate", style, switchHandleBitmap)); - pGraphics->AttachControl(new NAMSwitchControl(eqToggleArea, kEQActive, "EQ", style, switchHandleBitmap)); + // Buttons-only switch (label drawn separately so it aligns with the Noise Gate label) + const auto eqButtonsArea = eqToggleArea.GetReducedFromTop(6.0f).GetReducedFromBottom(24.0f); + pGraphics->AttachControl( + new IVTabSwitchControl(eqButtonsArea, kEQMode, {"Pre", "Off", "Post"}, "", + radioButtonStyle.WithShowLabel(false).WithShowValue(false).WithDrawFrame(false), + EVShape::Rectangle)); + pGraphics->AttachControl(new IVLabelControl(eqToggleArea, "EQ", style.WithDrawFrame(false))); // The knobs pGraphics->AttachControl(new NAMKnobControl(inputKnobArea, kInputLevel, "", style, knobBackgroundBitmap)); @@ -337,7 +343,9 @@ void NeuralAmpModeler::ProcessBlock(iplug::sample** inputs, iplug::sample** outp _ProcessInput(inputs, numFrames, numChannelsExternalIn, numChannelsInternal); _ApplyDSPStaging(); const bool noiseGateActive = GetParam(kNoiseGateActive)->Value(); - const bool toneStackActive = GetParam(kEQActive)->Value(); + const int eqMode = GetParam(kEQMode)->Int(); + const bool toneStackUsable = eqMode != kEQModeOff && mToneStack != nullptr; + const bool eqPre = eqMode == kEQModePre; // Noise gate trigger sample** triggerOutput = mInputPointers; @@ -355,19 +363,23 @@ void NeuralAmpModeler::ProcessBlock(iplug::sample** inputs, iplug::sample** outp triggerOutput = mNoiseGateTrigger.Process(mInputPointers, numChannelsInternal, numFrames); } + // EQ before the model when in pre mode (gate detection stays on the raw input) + sample** modelInput = + (toneStackUsable && eqPre) ? mToneStack->Process(triggerOutput, numChannelsInternal, nFrames) : triggerOutput; + if (mModel != nullptr) { - mModel->process(triggerOutput, mOutputPointers, nFrames); + mModel->process(modelInput, mOutputPointers, nFrames); } else { - _FallbackDSP(triggerOutput, mOutputPointers, numChannelsInternal, numFrames); + _FallbackDSP(modelInput, mOutputPointers, numChannelsInternal, numFrames); } // Apply the noise gate after the NAM sample** gateGainOutput = noiseGateActive ? mNoiseGateGain.Process(mOutputPointers, numChannelsInternal, numFrames) : mOutputPointers; - sample** toneStackOutPointers = (toneStackActive && mToneStack != nullptr) + sample** toneStackOutPointers = (toneStackUsable && !eqPre) ? mToneStack->Process(gateGainOutput, numChannelsInternal, nFrames) : gateGainOutput; @@ -535,9 +547,12 @@ void NeuralAmpModeler::OnParamChangeUI(int paramIdx, EParamSource source) switch (paramIdx) { case kNoiseGateActive: pGraphics->GetControlWithParamIdx(kNoiseGateThreshold)->SetDisabled(!active); break; - case kEQActive: - pGraphics->ForControlInGroup("EQ_KNOBS", [active](IControl* pControl) { pControl->SetDisabled(!active); }); + case kEQMode: + { + const bool eqOn = GetParam(kEQMode)->Int() != kEQModeOff; + pGraphics->ForControlInGroup("EQ_KNOBS", [eqOn](IControl* pControl) { pControl->SetDisabled(!eqOn); }); break; + } case kIRToggle: pGraphics->GetControlWithTag(kCtrlTagIRFileBrowser)->SetDisabled(!active); break; default: break; } diff --git a/NeuralAmpModeler/NeuralAmpModeler.h b/NeuralAmpModeler/NeuralAmpModeler.h index f5dae839d..852a70a39 100644 --- a/NeuralAmpModeler/NeuralAmpModeler.h +++ b/NeuralAmpModeler/NeuralAmpModeler.h @@ -40,7 +40,7 @@ enum EParams kOutputLevel, // The rest is fine though. kNoiseGateActive, - kEQActive, + kEQMode, kIRToggle, // Input calibration kCalibrateInput, @@ -50,6 +50,13 @@ enum EParams kNumParams }; +enum EEQMode +{ + kEQModePre = 0, + kEQModeOff, + kEQModePost +}; + const int numKnobs = 6; enum ECtrlTags diff --git a/NeuralAmpModeler/Unserialization.cpp b/NeuralAmpModeler/Unserialization.cpp index 4dd3491a3..b5f9528ec 100644 --- a/NeuralAmpModeler/Unserialization.cpp +++ b/NeuralAmpModeler/Unserialization.cpp @@ -97,11 +97,47 @@ void _RenameKeys(nlohmann::json& j, std::unordered_map } } +// v0.7.16 + +void _UpdateConfigFrom_0_7_16(nlohmann::json& config) +{ + // Fill me in once something changes! +} + +int _GetConfigFrom_0_7_16(const iplug::IByteChunk& chunk, int startPos, nlohmann::json& config) +{ + std::vector paramNames{"Input", + "Threshold", + "Bass", + "Middle", + "Treble", + "Output", + "NoiseGateActive", + "EQ", + "IRToggle", + "CalibrateInput", + "InputCalibrationLevel", + "OutputMode", + "Slim"}; + + int pos = _UnserializePathsAndExpectedKeys(chunk, startPos, config, paramNames); + _UpdateConfigFrom_0_7_16(config); + return pos; +} + // v0.7.14 void _UpdateConfigFrom_0_7_14(nlohmann::json& config) { - // Fill me in once something changes! + // "ToneStack" (Bool: off/on) became "EQ" (Enum: 0=Pre, 1=Off, 2=Post). + // Legacy "on" was always post-model, so map on->Post, off->Off. + if (config.find("ToneStack") != config.end()) + { + const bool on = config["ToneStack"].get() > 0.5; + config["EQ"] = static_cast(on ? kEQModePost : kEQModeOff); + config.erase("ToneStack"); + } + _UpdateConfigFrom_0_7_16(config); } int _GetConfigFrom_0_7_14(const iplug::IByteChunk& chunk, int startPos, nlohmann::json& config) @@ -277,7 +313,11 @@ int NeuralAmpModeler::_UnserializeStateWithKnownVersion(const iplug::IByteChunk& _Version version(versionStr); // Act accordingly nlohmann::json config; - if (version >= _Version(0, 7, 14)) + if (version >= _Version(0, 7, 16)) + { + pos = _GetConfigFrom_0_7_16(chunk, pos, config); + } + else if (version >= _Version(0, 7, 14)) { pos = _GetConfigFrom_0_7_14(chunk, pos, config); } diff --git a/NeuralAmpModeler/config.h b/NeuralAmpModeler/config.h index e9c77caee..ba3ee6a39 100644 --- a/NeuralAmpModeler/config.h +++ b/NeuralAmpModeler/config.h @@ -1,7 +1,7 @@ #define PLUG_NAME "NeuralAmpModeler" #define PLUG_MFR "Steven Atkinson" -#define PLUG_VERSION_HEX 0x0000070f -#define PLUG_VERSION_STR "0.7.15" +#define PLUG_VERSION_HEX 0x00000710 +#define PLUG_VERSION_STR "0.7.16" #define PLUG_UNIQUE_ID '1YEo' #define PLUG_MFR_ID 'SDAa' #define PLUG_URL_STR "https://github.com/sdatkinson/NeuralAmpModelerPlugin" diff --git a/NeuralAmpModeler/resources/NeuralAmpModeler-AAX-Info.plist b/NeuralAmpModeler/resources/NeuralAmpModeler-AAX-Info.plist index 5b48b6d31..52f51a17e 100755 --- a/NeuralAmpModeler/resources/NeuralAmpModeler-AAX-Info.plist +++ b/NeuralAmpModeler/resources/NeuralAmpModeler-AAX-Info.plist @@ -7,7 +7,7 @@ CFBundleExecutable NeuralAmpModeler CFBundleGetInfoString - NeuralAmpModeler v0.7.15 Copyright 2022 Steven Atkinson + NeuralAmpModeler v0.7.16 Copyright 2022 Steven Atkinson CFBundleIdentifier com.StevenAtkinson.aax.NeuralAmpModeler CFBundleInfoDictionaryVersion @@ -17,11 +17,11 @@ CFBundlePackageType TDMw CFBundleShortVersionString - 0.7.15 + 0.7.16 CFBundleSignature PTul CFBundleVersion - 0.7.15 + 0.7.16 CSResourcesFileMapped LSMinimumSystemVersion diff --git a/NeuralAmpModeler/resources/NeuralAmpModeler-AU-Info.plist b/NeuralAmpModeler/resources/NeuralAmpModeler-AU-Info.plist index a2987c2e6..189adc7a1 100644 --- a/NeuralAmpModeler/resources/NeuralAmpModeler-AU-Info.plist +++ b/NeuralAmpModeler/resources/NeuralAmpModeler-AU-Info.plist @@ -20,17 +20,17 @@ type aufx version - 1807 + 1808 AudioUnit Version - 0x0000070f + 0x00000710 CFBundleDevelopmentRegion English CFBundleExecutable NeuralAmpModeler CFBundleGetInfoString - NeuralAmpModeler v0.7.15 Copyright 2022 Steven Atkinson + NeuralAmpModeler v0.7.16 Copyright 2022 Steven Atkinson CFBundleIdentifier com.StevenAtkinson.audiounit.NeuralAmpModeler CFBundleInfoDictionaryVersion @@ -40,11 +40,11 @@ CFBundlePackageType BNDL CFBundleShortVersionString - 0.7.15 + 0.7.16 CFBundleSignature 1YEo CFBundleVersion - 0.7.15 + 0.7.16 CSResourcesFileMapped LSMinimumSystemVersion diff --git a/NeuralAmpModeler/resources/NeuralAmpModeler-VST3-Info.plist b/NeuralAmpModeler/resources/NeuralAmpModeler-VST3-Info.plist index f580fc409..eaa0f7848 100644 --- a/NeuralAmpModeler/resources/NeuralAmpModeler-VST3-Info.plist +++ b/NeuralAmpModeler/resources/NeuralAmpModeler-VST3-Info.plist @@ -7,7 +7,7 @@ CFBundleExecutable NeuralAmpModeler CFBundleGetInfoString - NeuralAmpModeler v0.7.15 Copyright 2022 Steven Atkinson + NeuralAmpModeler v0.7.16 Copyright 2022 Steven Atkinson CFBundleIdentifier com.StevenAtkinson.vst3.NeuralAmpModeler CFBundleInfoDictionaryVersion @@ -17,11 +17,11 @@ CFBundlePackageType BNDL CFBundleShortVersionString - 0.7.15 + 0.7.16 CFBundleSignature 1YEo CFBundleVersion - 0.7.15 + 0.7.16 CSResourcesFileMapped LSMinimumSystemVersion diff --git a/NeuralAmpModeler/resources/NeuralAmpModeler-macOS-AUv3-Info.plist b/NeuralAmpModeler/resources/NeuralAmpModeler-macOS-AUv3-Info.plist index bbb69cb1c..dab2590d0 100644 --- a/NeuralAmpModeler/resources/NeuralAmpModeler-macOS-AUv3-Info.plist +++ b/NeuralAmpModeler/resources/NeuralAmpModeler-macOS-AUv3-Info.plist @@ -7,7 +7,7 @@ CFBundleExecutable NeuralAmpModeler CFBundleGetInfoString - NeuralAmpModeler v0.7.15 Copyright 2022 Steven Atkinson + NeuralAmpModeler v0.7.16 Copyright 2022 Steven Atkinson CFBundleIdentifier com.StevenAtkinson.app.NeuralAmpModeler.AUv3 CFBundleInfoDictionaryVersion @@ -17,9 +17,9 @@ CFBundlePackageType XPC! CFBundleShortVersionString - 0.7.15 + 0.7.16 CFBundleVersion - 0.7.15 + 0.7.16 LSMinimumSystemVersion 10.12.0 NSExtension @@ -48,7 +48,7 @@ type aufx version - 1807 + 1808 diff --git a/NeuralAmpModeler/resources/NeuralAmpModeler-macOS-Info.plist b/NeuralAmpModeler/resources/NeuralAmpModeler-macOS-Info.plist index 7aa49f077..391774260 100644 --- a/NeuralAmpModeler/resources/NeuralAmpModeler-macOS-Info.plist +++ b/NeuralAmpModeler/resources/NeuralAmpModeler-macOS-Info.plist @@ -7,7 +7,7 @@ CFBundleExecutable NeuralAmpModeler CFBundleGetInfoString - NeuralAmpModeler v0.7.15 Copyright 2022 Steven Atkinson + NeuralAmpModeler v0.7.16 Copyright 2022 Steven Atkinson CFBundleIconFile NeuralAmpModeler.icns CFBundleIdentifier @@ -19,11 +19,11 @@ CFBundlePackageType BNDL CFBundleShortVersionString - 0.7.15 + 0.7.16 CFBundleSignature 1YEo CFBundleVersion - 0.7.15 + 0.7.16 CSResourcesFileMapped LSApplicationCategoryType