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:
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">