From 6b233d8d0ef5059e6b349f5f843d13780da4d7ff Mon Sep 17 00:00:00 2001 From: marmal95 Date: Thu, 12 Sep 2024 17:40:45 +0200 Subject: [PATCH 1/3] Make NAM disablable - bypass dry signal --- NeuralAmpModeler/NeuralAmpModeler.cpp | 47 ++++++++++++++++++--- NeuralAmpModeler/NeuralAmpModeler.h | 4 ++ NeuralAmpModeler/NeuralAmpModelerControls.h | 27 +++++++++++- 3 files changed, 72 insertions(+), 6 deletions(-) diff --git a/NeuralAmpModeler/NeuralAmpModeler.cpp b/NeuralAmpModeler/NeuralAmpModeler.cpp index 768951d3..2609afb9 100644 --- a/NeuralAmpModeler/NeuralAmpModeler.cpp +++ b/NeuralAmpModeler/NeuralAmpModeler.cpp @@ -201,7 +201,7 @@ NeuralAmpModeler::NeuralAmpModeler(const InstanceInfo& info) pGraphics->AttachBackground(BACKGROUND_FN); pGraphics->AttachControl(new IBitmapControl(b, linesBitmap)); - pGraphics->AttachControl(new IVLabelControl(titleArea, "NEURAL AMP MODELER", titleStyle)); + pGraphics->AttachControl(new NAMTitleToggleControl(titleArea, kNamToggle, titleStyle.valueText)); pGraphics->AttachControl(new ISVGControl(modelIconArea, modelIconSVG)); #ifdef NAM_PICK_DIRECTORY @@ -256,7 +256,12 @@ NeuralAmpModeler::NeuralAmpModeler(const InstanceInfo& info) pControl->SetMouseOverWhenDisabled(true); }); - pGraphics->GetControlWithTag(kCtrlTagOutNorm)->SetMouseEventsWhenDisabled(false); + pGraphics->GetControlWithParamIdx(kOutNorm)->SetMouseEventsWhenDisabled(false); + pGraphics->GetControlWithParamIdx(kNoiseGateActive)->SetMouseEventsWhenDisabled(false); + pGraphics->GetControlWithParamIdx(kEQActive)->SetMouseEventsWhenDisabled(false); + pGraphics->GetControlWithParamIdx(kIRToggle)->SetMouseEventsWhenDisabled(false); + + pGraphics->GetControlWithParamIdx(kNamToggle)->SetValueFromUserInput(1); // enabled by default }; } @@ -273,6 +278,13 @@ void NeuralAmpModeler::ProcessBlock(iplug::sample** inputs, iplug::sample** outp const size_t numFrames = (size_t)nFrames; const double sampleRate = GetSampleRate(); + if (const bool namActive = GetParam(kNamToggle)->Value(); !namActive) + { + _ProcessOutput(inputs, outputs, numFrames, numChannelsInternal, numChannelsExternalOut); + _UpdateMeters(inputs, outputs, numFrames, numChannelsInternal, numChannelsExternalOut); + return; + } + // Disable floating point denormals std::fenv_t fe_state; std::feholdexcept(&fe_state); @@ -376,7 +388,10 @@ void NeuralAmpModeler::OnIdle() if (mNewModelLoadedInDSP) { if (auto* pGraphics = GetUI()) - pGraphics->GetControlWithTag(kCtrlTagOutNorm)->SetDisabled(!mModel->HasLoudness()); + { + pGraphics->GetControlWithTag(kCtrlTagOutNorm) + ->SetDisabled(!mModel->HasLoudness() || !GetParam(kNamToggle)->Value()); + } mNewModelLoadedInDSP = false; } @@ -471,7 +486,8 @@ void NeuralAmpModeler::OnParamChangeUI(int paramIdx, EParamSource source) case kEQActive: pGraphics->ForControlInGroup("EQ_KNOBS", [active](IControl* pControl) { pControl->SetDisabled(!active); }); break; - case kIRToggle: pGraphics->GetControlWithTag(kCtrlTagIRFileBrowser)->SetDisabled(!active); + case kIRToggle: pGraphics->GetControlWithTag(kCtrlTagIRFileBrowser)->SetDisabled(!active); break; + case kNamToggle: _SetDisabledForAllControl(!active); break; default: break; } } @@ -790,7 +806,8 @@ void NeuralAmpModeler::_ProcessInput(iplug::sample** inputs, const size_t nFrame void NeuralAmpModeler::_ProcessOutput(iplug::sample** inputs, iplug::sample** outputs, const size_t nFrames, const size_t nChansIn, const size_t nChansOut) { - const double gain = pow(10.0, GetParam(kOutputLevel)->Value() / 20.0); + const bool namActive = GetParam(kNamToggle)->Value(); + const double gain = namActive ? pow(10.0, GetParam(kOutputLevel)->Value() / 20.0) : 1; // Assume _PrepareBuffers() was already called if (nChansIn != 1) throw std::runtime_error("Plugin is supposed to process in mono."); @@ -900,3 +917,23 @@ void NeuralAmpModeler::_UpdateMeters(sample** inputPointer, sample** outputPoint mInputSender.ProcessBlock(inputPointer, (int)nFrames, kCtrlTagInputMeter, nChansHack); mOutputSender.ProcessBlock(outputPointer, (int)nFrames, kCtrlTagOutputMeter, nChansHack); } + +void NeuralAmpModeler::_SetDisabledForAllControl(const bool disabled) +{ + if (const auto ui = GetUI(); ui != nullptr) + { + ui->GetControlWithParamIdx(kEQActive)->SetDisabled(disabled); + ui->GetControlWithParamIdx(kOutNorm)->SetDisabled(disabled); + + ui->GetControlWithTag(kCtrlTagModelFileBrowser)->SetDisabled(disabled); + ui->GetControlWithTag(kCtrlTagIRFileBrowser)->SetDisabled(disabled); + + ui->GetControlWithParamIdx(kNoiseGateActive)->SetDisabled(disabled); + ui->GetControlWithParamIdx(kNoiseGateThreshold)->SetDisabled(disabled); + ui->GetControlWithParamIdx(kInputLevel)->SetDisabled(disabled); + ui->GetControlWithParamIdx(kOutputLevel)->SetDisabled(disabled); + ui->GetControlWithParamIdx(kIRToggle)->SetDisabled(disabled); + + ui->ForControlInGroup("EQ_KNOBS", [disabled](auto* ctrl) { ctrl->SetDisabled(disabled); }); + } +} \ No newline at end of file diff --git a/NeuralAmpModeler/NeuralAmpModeler.h b/NeuralAmpModeler/NeuralAmpModeler.h index 31c66985..ca2f7ce5 100644 --- a/NeuralAmpModeler/NeuralAmpModeler.h +++ b/NeuralAmpModeler/NeuralAmpModeler.h @@ -37,6 +37,7 @@ enum EParams kToneTreble, kOutputLevel, // The rest is fine though. + kNamToggle, kNoiseGateActive, kEQActive, kOutNorm, @@ -243,6 +244,9 @@ class NeuralAmpModeler final : public iplug::Plugin void _UpdateMeters(iplug::sample** inputPointer, iplug::sample** outputPointer, const size_t nFrames, const size_t nChansIn, const size_t nChansOut); + // Toggles Disabled flag for all controls + void _SetDisabledForAllControl(const bool disabled); + // Member data // Input arrays to NAM diff --git a/NeuralAmpModeler/NeuralAmpModelerControls.h b/NeuralAmpModeler/NeuralAmpModelerControls.h index ee5c3c28..8889b74e 100644 --- a/NeuralAmpModeler/NeuralAmpModelerControls.h +++ b/NeuralAmpModeler/NeuralAmpModelerControls.h @@ -293,7 +293,9 @@ class NAMFileBrowserControl : public IDirBrowseControlBase auto clearFileFunc = [&](IControl* pCaller) { pCaller->GetDelegate()->SendArbitraryMsgFromUI(mClearMsgTag); mFileNameControl->SetLabelAndTooltip(mDefaultLabelStr.Get()); - pCaller->GetUI()->GetControlWithTag(kCtrlTagOutNorm)->SetDisabled(false); + + const bool namActive = pCaller->GetUI()->GetControlWithParamIdx(kNamToggle)->GetValue(); + pCaller->GetUI()->GetControlWithTag(kCtrlTagOutNorm)->SetDisabled(!namActive); }; auto chooseFileFunc = [&, loadFileFunc](IControl* pCaller) { @@ -558,3 +560,26 @@ class NAMAboutBoxControl : public IContainerBase int mAnimationTime = 200; bool mWillHide = false; }; + +class NAMTitleToggleControl : public ITextToggleControl +{ +public: + NAMTitleToggleControl(const IRECT& bounds, int paramIdx, const IText& text) + : ITextToggleControl(bounds, paramIdx, "NEURAL AMP MODELER", "NEURAL AMP MODELER", text) + { + } + + void Draw(IGraphics& g) override + { + if (GetValue()) + { + SetText(mText.WithFGColor(COLOR_WHITE)); + } + else + { + SetText(mText.WithFGColor(COLOR_BLACK)); + } + + ITextToggleControl::Draw(g); + } +}; \ No newline at end of file From 80fa9decbcb49a63c89bf8e27e06d8c3686c63a0 Mon Sep 17 00:00:00 2001 From: marmal95 Date: Sun, 22 Sep 2024 12:24:48 +0200 Subject: [PATCH 2/3] Review remarks fixed --- NeuralAmpModeler/NeuralAmpModeler.cpp | 26 +++++++++++++++++--------- NeuralAmpModeler/NeuralAmpModeler.h | 4 +++- 2 files changed, 20 insertions(+), 10 deletions(-) diff --git a/NeuralAmpModeler/NeuralAmpModeler.cpp b/NeuralAmpModeler/NeuralAmpModeler.cpp index 2609afb9..cb8343d1 100644 --- a/NeuralAmpModeler/NeuralAmpModeler.cpp +++ b/NeuralAmpModeler/NeuralAmpModeler.cpp @@ -80,6 +80,7 @@ NeuralAmpModeler::NeuralAmpModeler(const InstanceInfo& info) GetParam(kEQActive)->InitBool("ToneStack", true); GetParam(kOutNorm)->InitBool("OutNorm", true); GetParam(kIRToggle)->InitBool("IRToggle", true); + GetParam(kNamToggle)->InitBool("NAMToggle", namActive); mNoiseGateTrigger.AddListener(&mNoiseGateGain); @@ -260,8 +261,6 @@ NeuralAmpModeler::NeuralAmpModeler(const InstanceInfo& info) pGraphics->GetControlWithParamIdx(kNoiseGateActive)->SetMouseEventsWhenDisabled(false); pGraphics->GetControlWithParamIdx(kEQActive)->SetMouseEventsWhenDisabled(false); pGraphics->GetControlWithParamIdx(kIRToggle)->SetMouseEventsWhenDisabled(false); - - pGraphics->GetControlWithParamIdx(kNamToggle)->SetValueFromUserInput(1); // enabled by default }; } @@ -278,7 +277,7 @@ void NeuralAmpModeler::ProcessBlock(iplug::sample** inputs, iplug::sample** outp const size_t numFrames = (size_t)nFrames; const double sampleRate = GetSampleRate(); - if (const bool namActive = GetParam(kNamToggle)->Value(); !namActive) + if (!namActive) { _ProcessOutput(inputs, outputs, numFrames, numChannelsInternal, numChannelsExternalOut); _UpdateMeters(inputs, outputs, numFrames, numChannelsInternal, numChannelsExternalOut); @@ -425,7 +424,17 @@ int NeuralAmpModeler::UnserializeState(const IByteChunk& chunk, int startPos) const char* kExpectedHeader = "###NeuralAmpModeler###"; if (strcmp(header.Get(), kExpectedHeader) == 0) { - pos = _UnserializeStateCurrent(chunk, pos); + WDL_String version; + pos = chunk.GetStr(version, pos); + + if (strcmp(version.Get(), "0.7.10") == 0) + { + pos = _UnserializeStateLegacy_0_7_9(chunk, pos); + } + else + { + pos = _UnserializeStateCurrent(chunk, pos); + } } else { @@ -470,6 +479,7 @@ void NeuralAmpModeler::OnParamChange(int paramIdx) case kToneBass: mToneStack->SetParam("bass", GetParam(paramIdx)->Value()); break; case kToneMid: mToneStack->SetParam("middle", GetParam(paramIdx)->Value()); break; case kToneTreble: mToneStack->SetParam("treble", GetParam(paramIdx)->Value()); break; + case kNamToggle: namActive = GetParam(paramIdx)->Value(); break; default: break; } } @@ -806,7 +816,6 @@ void NeuralAmpModeler::_ProcessInput(iplug::sample** inputs, const size_t nFrame void NeuralAmpModeler::_ProcessOutput(iplug::sample** inputs, iplug::sample** outputs, const size_t nFrames, const size_t nChansIn, const size_t nChansOut) { - const bool namActive = GetParam(kNamToggle)->Value(); const double gain = namActive ? pow(10.0, GetParam(kOutputLevel)->Value() / 20.0) : 1; // Assume _PrepareBuffers() was already called if (nChansIn != 1) @@ -825,8 +834,6 @@ void NeuralAmpModeler::_ProcessOutput(iplug::sample** inputs, iplug::sample** ou int NeuralAmpModeler::_UnserializeStateCurrent(const IByteChunk& chunk, int pos) { - WDL_String version; - pos = chunk.GetStr(version, pos); // Post-v0.7.9 legacy loading here once needed: // ... @@ -929,11 +936,12 @@ void NeuralAmpModeler::_SetDisabledForAllControl(const bool disabled) ui->GetControlWithTag(kCtrlTagIRFileBrowser)->SetDisabled(disabled); ui->GetControlWithParamIdx(kNoiseGateActive)->SetDisabled(disabled); - ui->GetControlWithParamIdx(kNoiseGateThreshold)->SetDisabled(disabled); + ui->GetControlWithParamIdx(kNoiseGateThreshold)->SetDisabled(disabled || !GetParam(kNoiseGateActive)->Value()); ui->GetControlWithParamIdx(kInputLevel)->SetDisabled(disabled); ui->GetControlWithParamIdx(kOutputLevel)->SetDisabled(disabled); ui->GetControlWithParamIdx(kIRToggle)->SetDisabled(disabled); - ui->ForControlInGroup("EQ_KNOBS", [disabled](auto* ctrl) { ctrl->SetDisabled(disabled); }); + ui->ForControlInGroup( + "EQ_KNOBS", [disabled, this](auto* ctrl) { ctrl->SetDisabled(disabled || !GetParam(kEQActive)->Value()); }); } } \ No newline at end of file diff --git a/NeuralAmpModeler/NeuralAmpModeler.h b/NeuralAmpModeler/NeuralAmpModeler.h index ca2f7ce5..6ae1ce18 100644 --- a/NeuralAmpModeler/NeuralAmpModeler.h +++ b/NeuralAmpModeler/NeuralAmpModeler.h @@ -37,11 +37,11 @@ enum EParams kToneTreble, kOutputLevel, // The rest is fine though. - kNamToggle, kNoiseGateActive, kEQActive, kOutNorm, kIRToggle, + kNamToggle, kNumParams }; @@ -290,4 +290,6 @@ class NeuralAmpModeler final : public iplug::Plugin std::unordered_map mNAMParams = {{"Input", 0.0}, {"Output", 0.0}}; NAMSender mInputSender, mOutputSender; + + bool namActive{true}; }; From 1ad68ff2672266ec9690d2c460614d37003e5d45 Mon Sep 17 00:00:00 2001 From: marmal95 Date: Tue, 24 Sep 2024 15:16:06 +0200 Subject: [PATCH 3/3] Review fixes - 2nd part --- NeuralAmpModeler/NeuralAmpModeler.cpp | 8 ++++---- NeuralAmpModeler/NeuralAmpModeler.h | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/NeuralAmpModeler/NeuralAmpModeler.cpp b/NeuralAmpModeler/NeuralAmpModeler.cpp index b4d88afb..9acc1a8f 100644 --- a/NeuralAmpModeler/NeuralAmpModeler.cpp +++ b/NeuralAmpModeler/NeuralAmpModeler.cpp @@ -80,7 +80,7 @@ NeuralAmpModeler::NeuralAmpModeler(const InstanceInfo& info) GetParam(kEQActive)->InitBool("ToneStack", true); GetParam(kOutNorm)->InitBool("OutNorm", true); GetParam(kIRToggle)->InitBool("IRToggle", true); - GetParam(kNamToggle)->InitBool("NAMToggle", namActive); + GetParam(kNamToggle)->InitBool("NAMToggle", mNamActive); mNoiseGateTrigger.AddListener(&mNoiseGateGain); @@ -277,7 +277,7 @@ void NeuralAmpModeler::ProcessBlock(iplug::sample** inputs, iplug::sample** outp const size_t numFrames = (size_t)nFrames; const double sampleRate = GetSampleRate(); - if (!namActive) + if (!mNamActive) { _ProcessOutput(inputs, outputs, numFrames, numChannelsInternal, numChannelsExternalOut); _UpdateMeters(inputs, outputs, numFrames, numChannelsInternal, numChannelsExternalOut); @@ -479,7 +479,7 @@ void NeuralAmpModeler::OnParamChange(int paramIdx) case kToneBass: mToneStack->SetParam("bass", GetParam(paramIdx)->Value()); break; case kToneMid: mToneStack->SetParam("middle", GetParam(paramIdx)->Value()); break; case kToneTreble: mToneStack->SetParam("treble", GetParam(paramIdx)->Value()); break; - case kNamToggle: namActive = GetParam(paramIdx)->Value(); break; + case kNamToggle: mNamActive = GetParam(paramIdx)->Value(); break; default: break; } } @@ -816,7 +816,7 @@ void NeuralAmpModeler::_ProcessInput(iplug::sample** inputs, const size_t nFrame void NeuralAmpModeler::_ProcessOutput(iplug::sample** inputs, iplug::sample** outputs, const size_t nFrames, const size_t nChansIn, const size_t nChansOut) { - const double gain = namActive ? pow(10.0, GetParam(kOutputLevel)->Value() / 20.0) : 1; + const double gain = mNamActive ? pow(10.0, GetParam(kOutputLevel)->Value() / 20.0) : 1; // Assume _PrepareBuffers() was already called if (nChansIn != 1) throw std::runtime_error("Plugin is supposed to process in mono."); diff --git a/NeuralAmpModeler/NeuralAmpModeler.h b/NeuralAmpModeler/NeuralAmpModeler.h index e49a0311..46b52c03 100644 --- a/NeuralAmpModeler/NeuralAmpModeler.h +++ b/NeuralAmpModeler/NeuralAmpModeler.h @@ -291,5 +291,5 @@ class NeuralAmpModeler final : public iplug::Plugin NAMSender mInputSender, mOutputSender; - bool namActive{true}; + bool mNamActive{true}; };