NeuralAmpModelerPlugin

Plugin for Neural Amp Modeler
Log | Files | Refs | Submodules | README | LICENSE

commit bfa140f7bfeda8601119ca28e7b617ed85205397
parent 1210e672a14c87b565864288b59a330b80927ae7
Author: Steven Atkinson <steven@atkinson.mn>
Date:   Sun, 10 Mar 2024 14:40:40 -0700

[REFACTOR] Tone stack abstraction (#444)

* Refactor tone stack out

* Update XCode project defs

* Revert "Update XCode project defs"

This reverts commit a974bc549fefbcd439626ae79efd9f9e7b53093c.

* Update XCode project defs

* Formatting
Diffstat:
MNeuralAmpModeler/NeuralAmpModeler.cpp | 48++++++++++++++----------------------------------
MNeuralAmpModeler/NeuralAmpModeler.h | 8++++----
ANeuralAmpModeler/ToneStack.cpp | 58++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
ANeuralAmpModeler/ToneStack.h | 60++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
MNeuralAmpModeler/projects/NeuralAmpModeler-aax.vcxproj | 2++
MNeuralAmpModeler/projects/NeuralAmpModeler-aax.vcxproj.filters | 2++
MNeuralAmpModeler/projects/NeuralAmpModeler-app.vcxproj | 2++
MNeuralAmpModeler/projects/NeuralAmpModeler-app.vcxproj.filters | 2++
MNeuralAmpModeler/projects/NeuralAmpModeler-iOS.xcodeproj/project.pbxproj | 12++++++++++++
MNeuralAmpModeler/projects/NeuralAmpModeler-macOS.xcodeproj/project.pbxproj | 28++++++++++++++++++++++++++++
MNeuralAmpModeler/projects/NeuralAmpModeler-vst3.vcxproj | 2++
MNeuralAmpModeler/projects/NeuralAmpModeler-vst3.vcxproj.filters | 2++
12 files changed, 188 insertions(+), 38 deletions(-)

diff --git a/NeuralAmpModeler/NeuralAmpModeler.cpp b/NeuralAmpModeler/NeuralAmpModeler.cpp @@ -68,6 +68,7 @@ EMsgBoxResult _ShowMessageBox(iplug::igraphics::IGraphics* pGraphics, const char NeuralAmpModeler::NeuralAmpModeler(const InstanceInfo& info) : Plugin(info, MakeConfig(kNumParams, kNumPresets)) { + _InitToneStack(); nam::activations::Activation::enable_fast_tanh(); GetParam(kInputLevel)->InitGain("Input", 0.0, -20.0, 20.0, 0.1); GetParam(kToneBass)->InitDouble("Bass", 5.0, 0.0, 10.0, 0.1); @@ -323,14 +324,8 @@ void NeuralAmpModeler::ProcessBlock(iplug::sample** inputs, iplug::sample** outp sample** gateGainOutput = noiseGateActive ? mNoiseGateGain.Process(mOutputPointers, numChannelsInternal, numFrames) : mOutputPointers; - sample** toneStackOutPointers = gateGainOutput; - if (toneStackActive) - { - sample** bassPointers = mToneBass.Process(gateGainOutput, numChannelsInternal, numFrames); - sample** midPointers = mToneMid.Process(bassPointers, numChannelsInternal, numFrames); - sample** treblePointers = mToneTreble.Process(midPointers, numChannelsInternal, numFrames); - toneStackOutPointers = treblePointers; - } + sample** toneStackOutPointers = (toneStackActive && mToneStack != nullptr) ? mToneStack->Process(gateGainOutput, numChannelsInternal, numFrames) + : gateGainOutput; sample** irPointers = toneStackOutPointers; if (mIR != nullptr && GetParam(kIRToggle)->Value()) @@ -361,6 +356,8 @@ void NeuralAmpModeler::ProcessBlock(iplug::sample** inputs, iplug::sample** outp void NeuralAmpModeler::OnReset() { const auto sampleRate = GetSampleRate(); + const int maxBlockSize = GetBlockSize(); + // Tail is because the HPF DC blocker has a decay. // 10 cycles should be enough to pass the VST3 tests checking tail behavior. // I'm ignoring the model & IR, but it's not the end of the world. @@ -371,6 +368,7 @@ void NeuralAmpModeler::OnReset() mCheckSampleRateWarning = true; // If there is a model or IR loaded, they need to be checked for resampling. _ResetModelAndIR(sampleRate, GetBlockSize()); + mToneStack->Reset(sampleRate, maxBlockSize); } void NeuralAmpModeler::OnIdle() @@ -443,36 +441,13 @@ void NeuralAmpModeler::OnParamChange(int paramIdx) switch (paramIdx) { case kToneBass: - { - const double sampleRate = GetSampleRate(); - const double bassGainDB = 4.0 * (GetParam(kToneBass)->Value() - 5.0); // +/- 20 - const double bassFrequency = 150.0; - const double bassQuality = 0.707; - recursive_linear_filter::BiquadParams bassParams(sampleRate, bassFrequency, bassQuality, bassGainDB); - mToneBass.SetParams(bassParams); - } - + mToneStack->SetParam("bass", GetParam(paramIdx)->Value()); break; case kToneMid: - { - const double sampleRate = GetSampleRate(); - const double midGainDB = 3.0 * (GetParam(kToneMid)->Value() - 5.0); // +/- 15 - const double midFrequency = 425.0; - // Wider EQ on mid bump up to sound less honky. - const double midQuality = midGainDB < 0.0 ? 1.5 : 0.7; - recursive_linear_filter::BiquadParams midParams(sampleRate, midFrequency, midQuality, midGainDB); - mToneMid.SetParams(midParams); - } + mToneStack->SetParam("middle", GetParam(paramIdx)->Value()); break; case kToneTreble: - { - const double sampleRate = GetSampleRate(); - const double trebleGainDB = 2.0 * (GetParam(kToneTreble)->Value() - 5.0); // +/- 10 - const double trebleFrequency = 1800.0; - const double trebleQuality = 0.707; - recursive_linear_filter::BiquadParams trebleParams(sampleRate, trebleFrequency, trebleQuality, trebleGainDB); - mToneTreble.SetParams(trebleParams); - } + mToneStack->SetParam("treble", GetParam(paramIdx)->Value()); break; default: break; } @@ -751,6 +726,11 @@ size_t NeuralAmpModeler::_GetBufferNumFrames() const return mInputArray[0].size(); } +void NeuralAmpModeler::_InitToneStack() +{ + // If you want to customize the tone stack, then put it here! + mToneStack = std::make_unique<dsp::tone_stack::BasicNamToneStack>(); +} void NeuralAmpModeler::_PrepareBuffers(const size_t numChannels, const size_t numFrames) { const bool updateChannels = numChannels != _GetBufferNumChannels(); diff --git a/NeuralAmpModeler/NeuralAmpModeler.h b/NeuralAmpModeler/NeuralAmpModeler.h @@ -3,11 +3,12 @@ #include "NeuralAmpModelerCore/NAM/dsp.h" #include "AudioDSPTools/dsp/ImpulseResponse.h" #include "AudioDSPTools/dsp/NoiseGate.h" -#include "AudioDSPTools/dsp/RecursiveLinearFilter.h" #include "AudioDSPTools/dsp/dsp.h" #include "AudioDSPTools/dsp/wav.h" #include "AudioDSPTools/dsp/ResamplingContainer/ResamplingContainer.h" +#include "ToneStack.h" + #include "IPlug_include_in_plug_hdr.h" #include "ISender.h" @@ -238,6 +239,7 @@ private: // Sizes based on mInputArray size_t _GetBufferNumChannels() const; size_t _GetBufferNumFrames() const; + void _InitToneStack(); // Apply the normalization for the model output (if possible) void _NormalizeModelOutput(iplug::sample** buffer, const size_t numChannels, const size_t numFrames); // Loads a NAM model and stores it to mStagedNAM @@ -300,9 +302,7 @@ private: std::atomic<bool> mCheckSampleRateWarning = true; // Tone stack modules - recursive_linear_filter::LowShelf mToneBass; - recursive_linear_filter::Peaking mToneMid; - recursive_linear_filter::HighShelf mToneTreble; + std::unique_ptr<dsp::tone_stack::AbstractToneStack> mToneStack; // Post-IR filters recursive_linear_filter::HighPass mHighPass; diff --git a/NeuralAmpModeler/ToneStack.cpp b/NeuralAmpModeler/ToneStack.cpp @@ -0,0 +1,58 @@ +#include "ToneStack.h" + +DSP_SAMPLE** dsp::tone_stack::BasicNamToneStack::Process(DSP_SAMPLE** inputs, const int numChannels, + const int numFrames) +{ + DSP_SAMPLE** bassPointers = mToneBass.Process(inputs, numChannels, numFrames); + DSP_SAMPLE** midPointers = mToneMid.Process(bassPointers, numChannels, numFrames); + DSP_SAMPLE** treblePointers = mToneTreble.Process(midPointers, numChannels, numFrames); + return treblePointers; +} + +void dsp::tone_stack::BasicNamToneStack::Reset(const double sampleRate, const int maxBlockSize) +{ + dsp::tone_stack::AbstractToneStack::Reset(sampleRate, maxBlockSize); + + // Refresh the params! + SetParam("bass", mBassVal); + SetParam("middle", mMiddleVal); + SetParam("treble", mTrebleVal); +} + +void dsp::tone_stack::BasicNamToneStack::SetParam(const std::string name, const double val) +{ + if (name == "bass") + { + // HACK: Store for refresh + mBassVal = val; + const double sampleRate = GetSampleRate(); + const double bassGainDB = 4.0 * (val - 5.0); // +/- 20 + const double bassFrequency = 150.0; + const double bassQuality = 0.707; + recursive_linear_filter::BiquadParams bassParams(sampleRate, bassFrequency, bassQuality, bassGainDB); + mToneBass.SetParams(bassParams); + } + else if (name == "middle") + { + // HACK: Store for refresh + mMiddleVal = val; + const double sampleRate = GetSampleRate(); + const double midGainDB = 3.0 * (val - 5.0); // +/- 15 + const double midFrequency = 425.0; + // Wider EQ on mid bump up to sound less honky. + const double midQuality = midGainDB < 0.0 ? 1.5 : 0.7; + recursive_linear_filter::BiquadParams midParams(sampleRate, midFrequency, midQuality, midGainDB); + mToneMid.SetParams(midParams); + } + else if (name == "treble") + { + // HACK: Store for refresh + mTrebleVal = val; + const double sampleRate = GetSampleRate(); + const double trebleGainDB = 2.0 * (val - 5.0); // +/- 10 + const double trebleFrequency = 1800.0; + const double trebleQuality = 0.707; + recursive_linear_filter::BiquadParams trebleParams(sampleRate, trebleFrequency, trebleQuality, trebleGainDB); + mToneTreble.SetParams(trebleParams); + } +} diff --git a/NeuralAmpModeler/ToneStack.h b/NeuralAmpModeler/ToneStack.h @@ -0,0 +1,60 @@ +#pragma once + +#include <string> +#include "AudioDSPTools/dsp/dsp.h" +#include "AudioDSPTools/dsp/RecursiveLinearFilter.h" + +namespace dsp +{ +namespace tone_stack +{ +class AbstractToneStack +{ +public: + // Compute in the real-time loop + virtual DSP_SAMPLE** Process(DSP_SAMPLE** inputs, const int numChannels, const int numFrames) = 0; + // Any preparation. Call from Reset() in the plugin + virtual void Reset(const double sampleRate, const int maxBlockSize) + { + mSampleRate = sampleRate; + mMaxBlockSize = maxBlockSize; + }; + // Set the various parameters of your tone stack by name. + // Call this during OnParamChange() + virtual void SetParam(const std::string name, const double val) = 0; + +protected: + double GetSampleRate() const { return mSampleRate; }; + double mSampleRate = 0.0; + int mMaxBlockSize = 0; +}; + +class BasicNamToneStack : public AbstractToneStack +{ +public: + BasicNamToneStack() + { + SetParam("bass", 5.0); + SetParam("middle", 5.0); + SetParam("treble", 5.0); + }; + ~BasicNamToneStack() = default; + + DSP_SAMPLE** Process(DSP_SAMPLE** inputs, const int numChannels, const int numFrames); + virtual void Reset(const double sampleRate, const int maxBlockSize) override; + // :param val: Assumed to be between 0 and 10, 5 is "noon" + void SetParam(const std::string name, const double val); + + +protected: + recursive_linear_filter::LowShelf mToneBass; + recursive_linear_filter::Peaking mToneMid; + recursive_linear_filter::HighShelf mToneTreble; + + // HACK not DRY w knob defs + double mBassVal = 5.0; + double mMiddleVal = 5.0; + double mTrebleVal = 5.0; +}; +}; // namespace tone_stack +}; // namespace dsp diff --git a/NeuralAmpModeler/projects/NeuralAmpModeler-aax.vcxproj b/NeuralAmpModeler/projects/NeuralAmpModeler-aax.vcxproj @@ -429,6 +429,7 @@ <ClCompile Include="..\NeuralAmpModelerCore\NAM\lstm.cpp" /> <ClCompile Include="..\NeuralAmpModelerCore\NAM\util.cpp" /> <ClCompile Include="..\NeuralAmpModelerCore\NAM\wavenet.cpp" /> + <ClCompile Include="..\ToneStack.cpp" /> </ItemGroup> <ItemGroup> <CustomBuildStep Include="..\..\AAX_SDK\Libs\Release\AAXLibrary.lib"> @@ -534,6 +535,7 @@ <ClInclude Include="..\NeuralAmpModelerCore\NAM\version.h" /> <ClInclude Include="..\NeuralAmpModelerCore\NAM\wavenet.h" /> <ClInclude Include="..\resources\resource.h" /> + <ClInclude Include="..\ToneStack.h" /> </ItemGroup> <ItemGroup> <ResourceCompile Include="..\resources\main.rc" /> diff --git a/NeuralAmpModeler/projects/NeuralAmpModeler-aax.vcxproj.filters b/NeuralAmpModeler/projects/NeuralAmpModeler-aax.vcxproj.filters @@ -95,6 +95,7 @@ <ClCompile Include="..\AudioDSPTools\dsp\wav.cpp"> <Filter>dsp</Filter> </ClCompile> + <ClCompile Include="..\ToneStack.cpp" /> </ItemGroup> <ItemGroup> <ClInclude Include="..\resources\resource.h"> @@ -311,6 +312,7 @@ <ClInclude Include="..\AudioDSPTools\dsp\ResamplingContainer\Dependencies\WDL\wdltypes.h"> <Filter>dsp\ResamplingContainer\Dependencies\WDL</Filter> </ClInclude> + <ClInclude Include="..\ToneStack.h" /> </ItemGroup> <ItemGroup> <Filter Include="resources"> diff --git a/NeuralAmpModeler/projects/NeuralAmpModeler-app.vcxproj b/NeuralAmpModeler/projects/NeuralAmpModeler-app.vcxproj @@ -342,6 +342,7 @@ <ClInclude Include="..\NeuralAmpModelerCore\NAM\version.h" /> <ClInclude Include="..\NeuralAmpModelerCore\NAM\wavenet.h" /> <ClInclude Include="..\resources\resource.h" /> + <ClInclude Include="..\ToneStack.h" /> </ItemGroup> <ItemGroup> <ClCompile Include="..\..\iPlug2\Dependencies\IPlug\RTAudio\include\asio.cpp" /> @@ -403,6 +404,7 @@ <ClCompile Include="..\NeuralAmpModelerCore\NAM\lstm.cpp" /> <ClCompile Include="..\NeuralAmpModelerCore\NAM\util.cpp" /> <ClCompile Include="..\NeuralAmpModelerCore\NAM\wavenet.cpp" /> + <ClCompile Include="..\ToneStack.cpp" /> </ItemGroup> <ItemGroup> <ResourceCompile Include="..\resources\main.rc" /> diff --git a/NeuralAmpModeler/projects/NeuralAmpModeler-app.vcxproj.filters b/NeuralAmpModeler/projects/NeuralAmpModeler-app.vcxproj.filters @@ -113,6 +113,7 @@ <ClCompile Include="..\AudioDSPTools\dsp\wav.cpp"> <Filter>dsp</Filter> </ClCompile> + <ClCompile Include="..\ToneStack.cpp" /> </ItemGroup> <ItemGroup> <ClInclude Include="..\NeuralAmpModeler.h" /> @@ -359,6 +360,7 @@ <ClInclude Include="..\AudioDSPTools\dsp\ResamplingContainer\Dependencies\WDL\wdltypes.h"> <Filter>dsp\ResamplingContainer\Dependencies\WDL</Filter> </ClInclude> + <ClInclude Include="..\ToneStack.h" /> </ItemGroup> <ItemGroup> <Filter Include="resources"> diff --git a/NeuralAmpModeler/projects/NeuralAmpModeler-iOS.xcodeproj/project.pbxproj b/NeuralAmpModeler/projects/NeuralAmpModeler-iOS.xcodeproj/project.pbxproj @@ -84,6 +84,10 @@ 4FE0DEE829A183B700DDBCC8 /* NeuralAmpModelerAU.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4FC6982F293BA47F0076EC33 /* NeuralAmpModelerAU.framework */; }; 4FE0DEF029A2E0F100DDBCC8 /* IPlugAUViewController.mm in Sources */ = {isa = PBXBuildFile; fileRef = 4FFF105A20A0E57100D3092F /* IPlugAUViewController.mm */; settings = {COMPILER_FLAGS = "-fobjc-arc"; }; }; 91236D811B08F59300734C5E /* NeuralAmpModelerAppExtension.appex in Embed App Extensions */ = {isa = PBXBuildFile; fileRef = 91236D771B08F59300734C5E /* NeuralAmpModelerAppExtension.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; + AA341E2B2B9E5A650069C260 /* ToneStack.h in Headers */ = {isa = PBXBuildFile; fileRef = AA341E292B9E5A650069C260 /* ToneStack.h */; }; + AA341E2C2B9E5A650069C260 /* ToneStack.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AA341E2A2B9E5A650069C260 /* ToneStack.cpp */; }; + AA341E2D2B9E5A650069C260 /* ToneStack.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AA341E2A2B9E5A650069C260 /* ToneStack.cpp */; }; + AA341E2E2B9E5A650069C260 /* ToneStack.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AA341E2A2B9E5A650069C260 /* ToneStack.cpp */; }; AA7C860B2B43A42F00B5FB3A /* ResamplingContainer.h in Headers */ = {isa = PBXBuildFile; fileRef = AA7C86042B43A42E00B5FB3A /* ResamplingContainer.h */; }; AA7C860C2B43A42F00B5FB3A /* LanczosResampler.h in Headers */ = {isa = PBXBuildFile; fileRef = AA7C86062B43A42E00B5FB3A /* LanczosResampler.h */; }; AA7C860D2B43A42F00B5FB3A /* wdltypes.h in Headers */ = {isa = PBXBuildFile; fileRef = AA7C86082B43A42E00B5FB3A /* wdltypes.h */; }; @@ -341,6 +345,8 @@ 4FFF108820A1036200D3092F /* NeuralAmpModeler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = NeuralAmpModeler.h; path = ../NeuralAmpModeler.h; sourceTree = "<group>"; }; 91236D0D1B08F42B00734C5E /* NeuralAmpModeler.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = NeuralAmpModeler.app; sourceTree = BUILT_PRODUCTS_DIR; }; 91236D771B08F59300734C5E /* NeuralAmpModelerAppExtension.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = NeuralAmpModelerAppExtension.appex; sourceTree = BUILT_PRODUCTS_DIR; }; + AA341E292B9E5A650069C260 /* ToneStack.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ToneStack.h; path = ../ToneStack.h; sourceTree = "<group>"; }; + AA341E2A2B9E5A650069C260 /* ToneStack.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = ToneStack.cpp; path = ../ToneStack.cpp; sourceTree = "<group>"; }; AA7C86042B43A42E00B5FB3A /* ResamplingContainer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ResamplingContainer.h; sourceTree = "<group>"; }; AA7C86062B43A42E00B5FB3A /* LanczosResampler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LanczosResampler.h; sourceTree = "<group>"; }; AA7C86082B43A42E00B5FB3A /* wdltypes.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = wdltypes.h; sourceTree = "<group>"; }; @@ -753,6 +759,8 @@ 4FFF108820A1036200D3092F /* NeuralAmpModeler.h */, 4FFF108720A1036200D3092F /* NeuralAmpModeler.cpp */, 4F9979242A066F960066545C /* NeuralAmpModelerControls.h */, + AA341E2A2B9E5A650069C260 /* ToneStack.cpp */, + AA341E292B9E5A650069C260 /* ToneStack.h */, 4F8D8BD82316701900EFA1FB /* README.md */, 4F8BF48D20A12D2E0081DF0A /* Resources */, 4F67D51620A121F60061FB8E /* Other Sources */, @@ -824,6 +832,7 @@ 4FBDC95E29FFF143004FF203 /* wavenet.h in Headers */, 4FC6983B293BA5020076EC33 /* IPlugAUAudioUnit.h in Headers */, AA7C860B2B43A42F00B5FB3A /* ResamplingContainer.h in Headers */, + AA341E2B2B9E5A650069C260 /* ToneStack.h in Headers */, 4FBDC95B29FFF143004FF203 /* convnet.h in Headers */, 4FBDC95929FFF143004FF203 /* version.h in Headers */, AA7C860C2B43A42F00B5FB3A /* LanczosResampler.h in Headers */, @@ -1052,6 +1061,7 @@ 4FC69840293BA5C40076EC33 /* IPlugPluginBase.cpp in Sources */, 4FC6984A293BA5F90076EC33 /* IGraphics.cpp in Sources */, 4FBDC95229FFF143004FF203 /* NoiseGate.cpp in Sources */, + AA341E2E2B9E5A650069C260 /* ToneStack.cpp in Sources */, 4FC69841293BA5C40076EC33 /* IPlugAPIBase.cpp in Sources */, 4FC69842293BA5C50076EC33 /* IPlugProcessor.cpp in Sources */, 4FC69846293BA5F90076EC33 /* IGraphicsEditorDelegate.cpp in Sources */, @@ -1071,6 +1081,7 @@ buildActionMask = 2147483647; files = ( 4FDF6D7F2267CEBA0007B686 /* IPlugAUPlayer.mm in Sources */, + AA341E2C2B9E5A650069C260 /* ToneStack.cpp in Sources */, 4FDF6D7B2267CE540007B686 /* AppDelegate.m in Sources */, 4FDF6D772267CE540007B686 /* AppViewController.mm in Sources */, 4FDF6D792267CE540007B686 /* main.m in Sources */, @@ -1082,6 +1093,7 @@ buildActionMask = 2147483647; files = ( 4FCBE769293CDFB7005D913D /* IPlugAUViewController.mm in Sources */, + AA341E2D2B9E5A650069C260 /* ToneStack.cpp in Sources */, 4F4856842773BD77005BCF8E /* NeuralAmpModelerAUv3Appex.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; diff --git a/NeuralAmpModeler/projects/NeuralAmpModeler-macOS.xcodeproj/project.pbxproj b/NeuralAmpModeler/projects/NeuralAmpModeler-macOS.xcodeproj/project.pbxproj @@ -440,6 +440,18 @@ 4FFBB93020863B0E00DDD0E7 /* fbuffer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4F8158C1205D50EB00393585 /* fbuffer.cpp */; }; 4FFBB93420863B0E00DDD0E7 /* coreiids.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4F8158E0205D50EB00393585 /* coreiids.cpp */; }; 4FFBB93520863B0E00DDD0E7 /* vstnoteexpressiontypes.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4F81588E205D50EB00393585 /* vstnoteexpressiontypes.cpp */; }; + AA341E1D2B9E5A530069C260 /* ToneStack.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AA341E1B2B9E5A530069C260 /* ToneStack.cpp */; }; + AA341E1E2B9E5A530069C260 /* ToneStack.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AA341E1B2B9E5A530069C260 /* ToneStack.cpp */; }; + AA341E1F2B9E5A530069C260 /* ToneStack.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AA341E1B2B9E5A530069C260 /* ToneStack.cpp */; }; + AA341E202B9E5A530069C260 /* ToneStack.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AA341E1B2B9E5A530069C260 /* ToneStack.cpp */; }; + AA341E212B9E5A530069C260 /* ToneStack.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AA341E1B2B9E5A530069C260 /* ToneStack.cpp */; }; + AA341E222B9E5A530069C260 /* ToneStack.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AA341E1B2B9E5A530069C260 /* ToneStack.cpp */; }; + AA341E232B9E5A530069C260 /* ToneStack.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AA341E1B2B9E5A530069C260 /* ToneStack.cpp */; }; + AA341E242B9E5A530069C260 /* ToneStack.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AA341E1B2B9E5A530069C260 /* ToneStack.cpp */; }; + AA341E252B9E5A530069C260 /* ToneStack.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AA341E1B2B9E5A530069C260 /* ToneStack.cpp */; }; + AA341E262B9E5A530069C260 /* ToneStack.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AA341E1B2B9E5A530069C260 /* ToneStack.cpp */; }; + AA341E272B9E5A530069C260 /* ToneStack.h in Headers */ = {isa = PBXBuildFile; fileRef = AA341E1C2B9E5A530069C260 /* ToneStack.h */; }; + AA341E282B9E5A530069C260 /* ToneStack.h in Headers */ = {isa = PBXBuildFile; fileRef = AA341E1C2B9E5A530069C260 /* ToneStack.h */; }; AA355E2D295B688F0061AA3D /* Colors.h in Headers */ = {isa = PBXBuildFile; fileRef = AA355E2C295B688F0061AA3D /* Colors.h */; }; AA355E2E295B688F0061AA3D /* Colors.h in Headers */ = {isa = PBXBuildFile; fileRef = AA355E2C295B688F0061AA3D /* Colors.h */; }; AA7C85F92B439AC000B5FB3A /* ResamplingContainer.h in Headers */ = {isa = PBXBuildFile; fileRef = AA7C85F22B439AC000B5FB3A /* ResamplingContainer.h */; }; @@ -1011,6 +1023,8 @@ 4FFBB94120863E9300DDD0E7 /* IPlugVST3_Parameter.h */ = {isa = PBXFileReference; indentWidth = 2; lastKnownFileType = sourcecode.c.h; name = IPlugVST3_Parameter.h; path = ../../iPlug2/IPlug/VST3/IPlugVST3_Parameter.h; sourceTree = "<group>"; tabWidth = 2; }; 4FFF72B8214BB71400839091 /* main.rc */ = {isa = PBXFileReference; lastKnownFileType = text; name = main.rc; path = ../resources/main.rc; sourceTree = "<group>"; }; 52FBBED30D0CF143001C8B8A /* config.h */ = {isa = PBXFileReference; fileEncoding = 4; indentWidth = 2; lastKnownFileType = sourcecode.c.h; name = config.h; path = ../config.h; sourceTree = "<group>"; tabWidth = 2; usesTabs = 0; }; + AA341E1B2B9E5A530069C260 /* ToneStack.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = ToneStack.cpp; path = ../ToneStack.cpp; sourceTree = "<group>"; }; + AA341E1C2B9E5A530069C260 /* ToneStack.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ToneStack.h; path = ../ToneStack.h; sourceTree = "<group>"; }; AA355E2C295B688F0061AA3D /* Colors.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = Colors.h; path = ../Colors.h; sourceTree = "<group>"; }; AA7C85F22B439AC000B5FB3A /* ResamplingContainer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ResamplingContainer.h; sourceTree = "<group>"; }; AA7C85F42B439AC000B5FB3A /* _LanczosResampler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = _LanczosResampler.h; sourceTree = "<group>"; }; @@ -1102,6 +1116,8 @@ 4F3862EE2014BBEC0009F402 /* NeuralAmpModeler.h */, 4F3862ED2014BBEC0009F402 /* NeuralAmpModeler.cpp */, 4F9979232A066F8B0066545C /* NeuralAmpModelerControls.h */, + AA341E1B2B9E5A530069C260 /* ToneStack.cpp */, + AA341E1C2B9E5A530069C260 /* ToneStack.h */, 4F9313232315CA1100DB2383 /* README.md */, 089C167CFE841241C02AAC07 /* Resources */, 32C88E010371C26100C91783 /* Other Sources */, @@ -2008,6 +2024,7 @@ AA7C85FC2B439AC000B5FB3A /* _LanczosResampler.h in Headers */, 4F2FB17C2A0047430027AB66 /* ImpulseResponse.h in Headers */, 4F2FB17B2A0047430027AB66 /* RecursiveLinearFilter.h in Headers */, + AA341E282B9E5A530069C260 /* ToneStack.h in Headers */, 4F2FB1B12A0047430027AB66 /* activations.h in Headers */, AA7C85FA2B439AC000B5FB3A /* ResamplingContainer.h in Headers */, AA355E2E295B688F0061AA3D /* Colors.h in Headers */, @@ -2043,6 +2060,7 @@ 4FC3F0002086CE5700BD11FA /* stringconvert.h in Headers */, 4F8C10E720BA2796006320CD /* IGraphicsEditorDelegate.h in Headers */, AA7C85F92B439AC000B5FB3A /* ResamplingContainer.h in Headers */, + AA341E272B9E5A530069C260 /* ToneStack.h in Headers */, AA7C86012B439AC000B5FB3A /* heapbuf.h in Headers */, 4FC3EFFA2086CE5700BD11FA /* parameterchanges.h in Headers */, 4F03A5B320A4621100EBDFFB /* IGraphics_include_in_plug_src.h in Headers */, @@ -2600,6 +2618,7 @@ 4F2FB1A72A0047430027AB66 /* lstm.cpp in Sources */, 4F03A5AD20A4621100EBDFFB /* IGraphics.cpp in Sources */, 4F5F344220C0226200487201 /* IPlugPaths.mm in Sources */, + AA341E1E2B9E5A530069C260 /* ToneStack.cpp in Sources */, 4F2FB1B32A0047430027AB66 /* activations.cpp in Sources */, 4F2FB1612A0047430027AB66 /* dsp.cpp in Sources */, 4F2FB19D2A0047430027AB66 /* convnet.cpp in Sources */, @@ -2638,6 +2657,7 @@ 4F2FB1662A0047430027AB66 /* dsp.cpp in Sources */, 4F2FB1AC2A0047430027AB66 /* lstm.cpp in Sources */, 4F2FB1B82A0047430027AB66 /* activations.cpp in Sources */, + AA341E232B9E5A530069C260 /* ToneStack.cpp in Sources */, 4F2FB18D2A0047430027AB66 /* util.cpp in Sources */, 4F2FB16F2A0047430027AB66 /* NoiseGate.cpp in Sources */, 4F4856892773CA76005BCF8E /* NeuralAmpModelerAUv3Appex.m in Sources */, @@ -2659,6 +2679,7 @@ 4F03A5AF20A4621100EBDFFB /* IGraphics.cpp in Sources */, 4F6369E020A464BB0022C370 /* IGraphicsNanoVG_src.m in Sources */, 4F6369EE20A466470022C370 /* IControl.cpp in Sources */, + AA341E202B9E5A530069C260 /* ToneStack.cpp in Sources */, 4F2FB19F2A0047430027AB66 /* convnet.cpp in Sources */, 4F1A528C205D916F00CF2908 /* IPlugAU.cpp in Sources */, 4F2FB1632A0047430027AB66 /* dsp.cpp in Sources */, @@ -2733,6 +2754,7 @@ 4F2FB1BA2A0047430027AB66 /* activations.cpp in Sources */, 4F2FB1712A0047430027AB66 /* NoiseGate.cpp in Sources */, 4F3EE1E2231438D000004786 /* IGraphicsEditorDelegate.cpp in Sources */, + AA341E262B9E5A530069C260 /* ToneStack.cpp in Sources */, 4F3EE1E3231438D000004786 /* swell-gdi.mm in Sources */, 4F2FB1862A0047430027AB66 /* wav.cpp in Sources */, 4F3EE1E4231438D000004786 /* IPlugParameter.cpp in Sources */, @@ -2766,6 +2788,7 @@ 4F78BE2322E7406D00AD537E /* IPlugAUv3.mm in Sources */, 4F78BE2422E7406D00AD537E /* IPlugAUViewController.mm in Sources */, 4F2FB1982A0047430027AB66 /* dsp.cpp in Sources */, + AA341E252B9E5A530069C260 /* ToneStack.cpp in Sources */, 4F78BE2522E7406D00AD537E /* IPlugPluginBase.cpp in Sources */, 4F2FB1C22A0047430027AB66 /* wavenet.cpp in Sources */, 4F2FB1A32A0047430027AB66 /* convnet.cpp in Sources */, @@ -2820,6 +2843,7 @@ 4F81598A205D50EB00393585 /* ustring.cpp in Sources */, 4F2FB1A82A0047430027AB66 /* lstm.cpp in Sources */, 4F7C495C255DDFC400DF7588 /* IPopupMenuControl.cpp in Sources */, + AA341E1F2B9E5A530069C260 /* ToneStack.cpp in Sources */, 4F815980205D50EB00393585 /* fobject.cpp in Sources */, 4F815994205D51F000393585 /* vstparameters.cpp in Sources */, 4F2FB16B2A0047430027AB66 /* NoiseGate.cpp in Sources */, @@ -2874,6 +2898,7 @@ 4F7C4963255DDFC600DF7588 /* ITextEntryControl.cpp in Sources */, 4F3862F32014BBEC0009F402 /* NeuralAmpModeler.cpp in Sources */, 4F2FB1952A0047430027AB66 /* dsp.cpp in Sources */, + AA341E212B9E5A530069C260 /* ToneStack.cpp in Sources */, 4FB600231567CB0A0020189A /* IPlugParameter.cpp in Sources */, 4F2FB1BF2A0047430027AB66 /* wavenet.cpp in Sources */, 4F2FB1A02A0047430027AB66 /* convnet.cpp in Sources */, @@ -2902,6 +2927,7 @@ 4FC3EFF92086CE5700BD11FA /* parameterchanges.cpp in Sources */, 4FC3EFCE2086C35D00BD11FA /* IPlugPluginBase.cpp in Sources */, 4F7C4965255DDFC800DF7588 /* IPopupMenuControl.cpp in Sources */, + AA341E242B9E5A530069C260 /* ToneStack.cpp in Sources */, 4F722021225C1EB100FF0E7C /* commoniids.cpp in Sources */, 4FB1F59620E4B017004157C8 /* IGraphicsMac_view.mm in Sources */, 4F472103209B294400A0A0A8 /* IPlugVST3_Controller.cpp in Sources */, @@ -2956,6 +2982,7 @@ 4F2FB1B22A0047430027AB66 /* activations.cpp in Sources */, 4F2FB1692A0047430027AB66 /* NoiseGate.cpp in Sources */, 4F8C10E020BA2796006320CD /* IGraphicsEditorDelegate.cpp in Sources */, + AA341E1D2B9E5A530069C260 /* ToneStack.cpp in Sources */, 4FF0A83221BE708700B2C9D1 /* swell-gdi.mm in Sources */, 4F2FB17E2A0047430027AB66 /* wav.cpp in Sources */, 4F78D91813B63BA50032E0F3 /* IPlugParameter.cpp in Sources */, @@ -2989,6 +3016,7 @@ 4F2FB1962A0047430027AB66 /* dsp.cpp in Sources */, 4FFBB91520863B0E00DDD0E7 /* timer.cpp in Sources */, 4F2FB1B72A0047430027AB66 /* activations.cpp in Sources */, + AA341E222B9E5A530069C260 /* ToneStack.cpp in Sources */, 4FFBB91720863B0E00DDD0E7 /* funknown.cpp in Sources */, 4FFBB91820863B0E00DDD0E7 /* vstbus.cpp in Sources */, 4FFBB91920863B0E00DDD0E7 /* IPlugPluginBase.cpp in Sources */, diff --git a/NeuralAmpModeler/projects/NeuralAmpModeler-vst3.vcxproj b/NeuralAmpModeler/projects/NeuralAmpModeler-vst3.vcxproj @@ -351,6 +351,7 @@ <ClInclude Include="..\NeuralAmpModelerCore\NAM\version.h" /> <ClInclude Include="..\NeuralAmpModelerCore\NAM\wavenet.h" /> <ClInclude Include="..\resources\resource.h" /> + <ClInclude Include="..\ToneStack.h" /> </ItemGroup> <ItemGroup> <ClCompile Include="..\..\iPlug2\Dependencies\IPlug\VST3_SDK\base\source\baseiids.cpp" /> @@ -431,6 +432,7 @@ <ClCompile Include="..\NeuralAmpModelerCore\NAM\lstm.cpp" /> <ClCompile Include="..\NeuralAmpModelerCore\NAM\util.cpp" /> <ClCompile Include="..\NeuralAmpModelerCore\NAM\wavenet.cpp" /> + <ClCompile Include="..\ToneStack.cpp" /> </ItemGroup> <ItemGroup> <ResourceCompile Include="..\resources\main.rc" /> diff --git a/NeuralAmpModeler/projects/NeuralAmpModeler-vst3.vcxproj.filters b/NeuralAmpModeler/projects/NeuralAmpModeler-vst3.vcxproj.filters @@ -170,6 +170,7 @@ <ClCompile Include="..\AudioDSPTools\dsp\wav.cpp"> <Filter>dsp</Filter> </ClCompile> + <ClCompile Include="..\ToneStack.cpp" /> </ItemGroup> <ItemGroup> <ClInclude Include="../config.h" /> @@ -458,6 +459,7 @@ <ClInclude Include="..\AudioDSPTools\dsp\ResamplingContainer\Dependencies\WDL\wdltypes.h"> <Filter>dsp\ResamplingContainer\Dependencies\WDL</Filter> </ClInclude> + <ClInclude Include="..\ToneStack.h" /> </ItemGroup> <ItemGroup> <Filter Include="resources">