Skip to content

Commit bfa140f

Browse files
authored
[REFACTOR] Tone stack abstraction (#444)
* Refactor tone stack out * Update XCode project defs * Revert "Update XCode project defs" This reverts commit a974bc5. * Update XCode project defs * Formatting
1 parent 1210e67 commit bfa140f

File tree

12 files changed

+188
-38
lines changed

12 files changed

+188
-38
lines changed

NeuralAmpModeler/NeuralAmpModeler.cpp

Lines changed: 14 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@ EMsgBoxResult _ShowMessageBox(iplug::igraphics::IGraphics* pGraphics, const char
6868
NeuralAmpModeler::NeuralAmpModeler(const InstanceInfo& info)
6969
: Plugin(info, MakeConfig(kNumParams, kNumPresets))
7070
{
71+
_InitToneStack();
7172
nam::activations::Activation::enable_fast_tanh();
7273
GetParam(kInputLevel)->InitGain("Input", 0.0, -20.0, 20.0, 0.1);
7374
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
323324
sample** gateGainOutput =
324325
noiseGateActive ? mNoiseGateGain.Process(mOutputPointers, numChannelsInternal, numFrames) : mOutputPointers;
325326

326-
sample** toneStackOutPointers = gateGainOutput;
327-
if (toneStackActive)
328-
{
329-
sample** bassPointers = mToneBass.Process(gateGainOutput, numChannelsInternal, numFrames);
330-
sample** midPointers = mToneMid.Process(bassPointers, numChannelsInternal, numFrames);
331-
sample** treblePointers = mToneTreble.Process(midPointers, numChannelsInternal, numFrames);
332-
toneStackOutPointers = treblePointers;
333-
}
327+
sample** toneStackOutPointers = (toneStackActive && mToneStack != nullptr) ? mToneStack->Process(gateGainOutput, numChannelsInternal, numFrames)
328+
: gateGainOutput;
334329

335330
sample** irPointers = toneStackOutPointers;
336331
if (mIR != nullptr && GetParam(kIRToggle)->Value())
@@ -361,6 +356,8 @@ void NeuralAmpModeler::ProcessBlock(iplug::sample** inputs, iplug::sample** outp
361356
void NeuralAmpModeler::OnReset()
362357
{
363358
const auto sampleRate = GetSampleRate();
359+
const int maxBlockSize = GetBlockSize();
360+
364361
// Tail is because the HPF DC blocker has a decay.
365362
// 10 cycles should be enough to pass the VST3 tests checking tail behavior.
366363
// I'm ignoring the model & IR, but it's not the end of the world.
@@ -371,6 +368,7 @@ void NeuralAmpModeler::OnReset()
371368
mCheckSampleRateWarning = true;
372369
// If there is a model or IR loaded, they need to be checked for resampling.
373370
_ResetModelAndIR(sampleRate, GetBlockSize());
371+
mToneStack->Reset(sampleRate, maxBlockSize);
374372
}
375373

376374
void NeuralAmpModeler::OnIdle()
@@ -443,36 +441,13 @@ void NeuralAmpModeler::OnParamChange(int paramIdx)
443441
switch (paramIdx)
444442
{
445443
case kToneBass:
446-
{
447-
const double sampleRate = GetSampleRate();
448-
const double bassGainDB = 4.0 * (GetParam(kToneBass)->Value() - 5.0); // +/- 20
449-
const double bassFrequency = 150.0;
450-
const double bassQuality = 0.707;
451-
recursive_linear_filter::BiquadParams bassParams(sampleRate, bassFrequency, bassQuality, bassGainDB);
452-
mToneBass.SetParams(bassParams);
453-
}
454-
444+
mToneStack->SetParam("bass", GetParam(paramIdx)->Value());
455445
break;
456446
case kToneMid:
457-
{
458-
const double sampleRate = GetSampleRate();
459-
const double midGainDB = 3.0 * (GetParam(kToneMid)->Value() - 5.0); // +/- 15
460-
const double midFrequency = 425.0;
461-
// Wider EQ on mid bump up to sound less honky.
462-
const double midQuality = midGainDB < 0.0 ? 1.5 : 0.7;
463-
recursive_linear_filter::BiquadParams midParams(sampleRate, midFrequency, midQuality, midGainDB);
464-
mToneMid.SetParams(midParams);
465-
}
447+
mToneStack->SetParam("middle", GetParam(paramIdx)->Value());
466448
break;
467449
case kToneTreble:
468-
{
469-
const double sampleRate = GetSampleRate();
470-
const double trebleGainDB = 2.0 * (GetParam(kToneTreble)->Value() - 5.0); // +/- 10
471-
const double trebleFrequency = 1800.0;
472-
const double trebleQuality = 0.707;
473-
recursive_linear_filter::BiquadParams trebleParams(sampleRate, trebleFrequency, trebleQuality, trebleGainDB);
474-
mToneTreble.SetParams(trebleParams);
475-
}
450+
mToneStack->SetParam("treble", GetParam(paramIdx)->Value());
476451
break;
477452
default: break;
478453
}
@@ -751,6 +726,11 @@ size_t NeuralAmpModeler::_GetBufferNumFrames() const
751726
return mInputArray[0].size();
752727
}
753728

729+
void NeuralAmpModeler::_InitToneStack()
730+
{
731+
// If you want to customize the tone stack, then put it here!
732+
mToneStack = std::make_unique<dsp::tone_stack::BasicNamToneStack>();
733+
}
754734
void NeuralAmpModeler::_PrepareBuffers(const size_t numChannels, const size_t numFrames)
755735
{
756736
const bool updateChannels = numChannels != _GetBufferNumChannels();

NeuralAmpModeler/NeuralAmpModeler.h

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,12 @@
33
#include "NeuralAmpModelerCore/NAM/dsp.h"
44
#include "AudioDSPTools/dsp/ImpulseResponse.h"
55
#include "AudioDSPTools/dsp/NoiseGate.h"
6-
#include "AudioDSPTools/dsp/RecursiveLinearFilter.h"
76
#include "AudioDSPTools/dsp/dsp.h"
87
#include "AudioDSPTools/dsp/wav.h"
98
#include "AudioDSPTools/dsp/ResamplingContainer/ResamplingContainer.h"
109

10+
#include "ToneStack.h"
11+
1112
#include "IPlug_include_in_plug_hdr.h"
1213
#include "ISender.h"
1314

@@ -238,6 +239,7 @@ class NeuralAmpModeler final : public iplug::Plugin
238239
// Sizes based on mInputArray
239240
size_t _GetBufferNumChannels() const;
240241
size_t _GetBufferNumFrames() const;
242+
void _InitToneStack();
241243
// Apply the normalization for the model output (if possible)
242244
void _NormalizeModelOutput(iplug::sample** buffer, const size_t numChannels, const size_t numFrames);
243245
// Loads a NAM model and stores it to mStagedNAM
@@ -300,9 +302,7 @@ class NeuralAmpModeler final : public iplug::Plugin
300302
std::atomic<bool> mCheckSampleRateWarning = true;
301303

302304
// Tone stack modules
303-
recursive_linear_filter::LowShelf mToneBass;
304-
recursive_linear_filter::Peaking mToneMid;
305-
recursive_linear_filter::HighShelf mToneTreble;
305+
std::unique_ptr<dsp::tone_stack::AbstractToneStack> mToneStack;
306306

307307
// Post-IR filters
308308
recursive_linear_filter::HighPass mHighPass;

NeuralAmpModeler/ToneStack.cpp

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
#include "ToneStack.h"
2+
3+
DSP_SAMPLE** dsp::tone_stack::BasicNamToneStack::Process(DSP_SAMPLE** inputs, const int numChannels,
4+
const int numFrames)
5+
{
6+
DSP_SAMPLE** bassPointers = mToneBass.Process(inputs, numChannels, numFrames);
7+
DSP_SAMPLE** midPointers = mToneMid.Process(bassPointers, numChannels, numFrames);
8+
DSP_SAMPLE** treblePointers = mToneTreble.Process(midPointers, numChannels, numFrames);
9+
return treblePointers;
10+
}
11+
12+
void dsp::tone_stack::BasicNamToneStack::Reset(const double sampleRate, const int maxBlockSize)
13+
{
14+
dsp::tone_stack::AbstractToneStack::Reset(sampleRate, maxBlockSize);
15+
16+
// Refresh the params!
17+
SetParam("bass", mBassVal);
18+
SetParam("middle", mMiddleVal);
19+
SetParam("treble", mTrebleVal);
20+
}
21+
22+
void dsp::tone_stack::BasicNamToneStack::SetParam(const std::string name, const double val)
23+
{
24+
if (name == "bass")
25+
{
26+
// HACK: Store for refresh
27+
mBassVal = val;
28+
const double sampleRate = GetSampleRate();
29+
const double bassGainDB = 4.0 * (val - 5.0); // +/- 20
30+
const double bassFrequency = 150.0;
31+
const double bassQuality = 0.707;
32+
recursive_linear_filter::BiquadParams bassParams(sampleRate, bassFrequency, bassQuality, bassGainDB);
33+
mToneBass.SetParams(bassParams);
34+
}
35+
else if (name == "middle")
36+
{
37+
// HACK: Store for refresh
38+
mMiddleVal = val;
39+
const double sampleRate = GetSampleRate();
40+
const double midGainDB = 3.0 * (val - 5.0); // +/- 15
41+
const double midFrequency = 425.0;
42+
// Wider EQ on mid bump up to sound less honky.
43+
const double midQuality = midGainDB < 0.0 ? 1.5 : 0.7;
44+
recursive_linear_filter::BiquadParams midParams(sampleRate, midFrequency, midQuality, midGainDB);
45+
mToneMid.SetParams(midParams);
46+
}
47+
else if (name == "treble")
48+
{
49+
// HACK: Store for refresh
50+
mTrebleVal = val;
51+
const double sampleRate = GetSampleRate();
52+
const double trebleGainDB = 2.0 * (val - 5.0); // +/- 10
53+
const double trebleFrequency = 1800.0;
54+
const double trebleQuality = 0.707;
55+
recursive_linear_filter::BiquadParams trebleParams(sampleRate, trebleFrequency, trebleQuality, trebleGainDB);
56+
mToneTreble.SetParams(trebleParams);
57+
}
58+
}

NeuralAmpModeler/ToneStack.h

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
#pragma once
2+
3+
#include <string>
4+
#include "AudioDSPTools/dsp/dsp.h"
5+
#include "AudioDSPTools/dsp/RecursiveLinearFilter.h"
6+
7+
namespace dsp
8+
{
9+
namespace tone_stack
10+
{
11+
class AbstractToneStack
12+
{
13+
public:
14+
// Compute in the real-time loop
15+
virtual DSP_SAMPLE** Process(DSP_SAMPLE** inputs, const int numChannels, const int numFrames) = 0;
16+
// Any preparation. Call from Reset() in the plugin
17+
virtual void Reset(const double sampleRate, const int maxBlockSize)
18+
{
19+
mSampleRate = sampleRate;
20+
mMaxBlockSize = maxBlockSize;
21+
};
22+
// Set the various parameters of your tone stack by name.
23+
// Call this during OnParamChange()
24+
virtual void SetParam(const std::string name, const double val) = 0;
25+
26+
protected:
27+
double GetSampleRate() const { return mSampleRate; };
28+
double mSampleRate = 0.0;
29+
int mMaxBlockSize = 0;
30+
};
31+
32+
class BasicNamToneStack : public AbstractToneStack
33+
{
34+
public:
35+
BasicNamToneStack()
36+
{
37+
SetParam("bass", 5.0);
38+
SetParam("middle", 5.0);
39+
SetParam("treble", 5.0);
40+
};
41+
~BasicNamToneStack() = default;
42+
43+
DSP_SAMPLE** Process(DSP_SAMPLE** inputs, const int numChannels, const int numFrames);
44+
virtual void Reset(const double sampleRate, const int maxBlockSize) override;
45+
// :param val: Assumed to be between 0 and 10, 5 is "noon"
46+
void SetParam(const std::string name, const double val);
47+
48+
49+
protected:
50+
recursive_linear_filter::LowShelf mToneBass;
51+
recursive_linear_filter::Peaking mToneMid;
52+
recursive_linear_filter::HighShelf mToneTreble;
53+
54+
// HACK not DRY w knob defs
55+
double mBassVal = 5.0;
56+
double mMiddleVal = 5.0;
57+
double mTrebleVal = 5.0;
58+
};
59+
}; // namespace tone_stack
60+
}; // namespace dsp

NeuralAmpModeler/projects/NeuralAmpModeler-aax.vcxproj

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -429,6 +429,7 @@
429429
<ClCompile Include="..\NeuralAmpModelerCore\NAM\lstm.cpp" />
430430
<ClCompile Include="..\NeuralAmpModelerCore\NAM\util.cpp" />
431431
<ClCompile Include="..\NeuralAmpModelerCore\NAM\wavenet.cpp" />
432+
<ClCompile Include="..\ToneStack.cpp" />
432433
</ItemGroup>
433434
<ItemGroup>
434435
<CustomBuildStep Include="..\..\AAX_SDK\Libs\Release\AAXLibrary.lib">
@@ -534,6 +535,7 @@
534535
<ClInclude Include="..\NeuralAmpModelerCore\NAM\version.h" />
535536
<ClInclude Include="..\NeuralAmpModelerCore\NAM\wavenet.h" />
536537
<ClInclude Include="..\resources\resource.h" />
538+
<ClInclude Include="..\ToneStack.h" />
537539
</ItemGroup>
538540
<ItemGroup>
539541
<ResourceCompile Include="..\resources\main.rc" />

NeuralAmpModeler/projects/NeuralAmpModeler-aax.vcxproj.filters

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,7 @@
9595
<ClCompile Include="..\AudioDSPTools\dsp\wav.cpp">
9696
<Filter>dsp</Filter>
9797
</ClCompile>
98+
<ClCompile Include="..\ToneStack.cpp" />
9899
</ItemGroup>
99100
<ItemGroup>
100101
<ClInclude Include="..\resources\resource.h">
@@ -311,6 +312,7 @@
311312
<ClInclude Include="..\AudioDSPTools\dsp\ResamplingContainer\Dependencies\WDL\wdltypes.h">
312313
<Filter>dsp\ResamplingContainer\Dependencies\WDL</Filter>
313314
</ClInclude>
315+
<ClInclude Include="..\ToneStack.h" />
314316
</ItemGroup>
315317
<ItemGroup>
316318
<Filter Include="resources">

NeuralAmpModeler/projects/NeuralAmpModeler-app.vcxproj

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -342,6 +342,7 @@
342342
<ClInclude Include="..\NeuralAmpModelerCore\NAM\version.h" />
343343
<ClInclude Include="..\NeuralAmpModelerCore\NAM\wavenet.h" />
344344
<ClInclude Include="..\resources\resource.h" />
345+
<ClInclude Include="..\ToneStack.h" />
345346
</ItemGroup>
346347
<ItemGroup>
347348
<ClCompile Include="..\..\iPlug2\Dependencies\IPlug\RTAudio\include\asio.cpp" />
@@ -403,6 +404,7 @@
403404
<ClCompile Include="..\NeuralAmpModelerCore\NAM\lstm.cpp" />
404405
<ClCompile Include="..\NeuralAmpModelerCore\NAM\util.cpp" />
405406
<ClCompile Include="..\NeuralAmpModelerCore\NAM\wavenet.cpp" />
407+
<ClCompile Include="..\ToneStack.cpp" />
406408
</ItemGroup>
407409
<ItemGroup>
408410
<ResourceCompile Include="..\resources\main.rc" />

NeuralAmpModeler/projects/NeuralAmpModeler-app.vcxproj.filters

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,7 @@
113113
<ClCompile Include="..\AudioDSPTools\dsp\wav.cpp">
114114
<Filter>dsp</Filter>
115115
</ClCompile>
116+
<ClCompile Include="..\ToneStack.cpp" />
116117
</ItemGroup>
117118
<ItemGroup>
118119
<ClInclude Include="..\NeuralAmpModeler.h" />
@@ -359,6 +360,7 @@
359360
<ClInclude Include="..\AudioDSPTools\dsp\ResamplingContainer\Dependencies\WDL\wdltypes.h">
360361
<Filter>dsp\ResamplingContainer\Dependencies\WDL</Filter>
361362
</ClInclude>
363+
<ClInclude Include="..\ToneStack.h" />
362364
</ItemGroup>
363365
<ItemGroup>
364366
<Filter Include="resources">

NeuralAmpModeler/projects/NeuralAmpModeler-iOS.xcodeproj/project.pbxproj

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,10 @@
8484
4FE0DEE829A183B700DDBCC8 /* NeuralAmpModelerAU.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4FC6982F293BA47F0076EC33 /* NeuralAmpModelerAU.framework */; };
8585
4FE0DEF029A2E0F100DDBCC8 /* IPlugAUViewController.mm in Sources */ = {isa = PBXBuildFile; fileRef = 4FFF105A20A0E57100D3092F /* IPlugAUViewController.mm */; settings = {COMPILER_FLAGS = "-fobjc-arc"; }; };
8686
91236D811B08F59300734C5E /* NeuralAmpModelerAppExtension.appex in Embed App Extensions */ = {isa = PBXBuildFile; fileRef = 91236D771B08F59300734C5E /* NeuralAmpModelerAppExtension.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; };
87+
AA341E2B2B9E5A650069C260 /* ToneStack.h in Headers */ = {isa = PBXBuildFile; fileRef = AA341E292B9E5A650069C260 /* ToneStack.h */; };
88+
AA341E2C2B9E5A650069C260 /* ToneStack.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AA341E2A2B9E5A650069C260 /* ToneStack.cpp */; };
89+
AA341E2D2B9E5A650069C260 /* ToneStack.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AA341E2A2B9E5A650069C260 /* ToneStack.cpp */; };
90+
AA341E2E2B9E5A650069C260 /* ToneStack.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AA341E2A2B9E5A650069C260 /* ToneStack.cpp */; };
8791
AA7C860B2B43A42F00B5FB3A /* ResamplingContainer.h in Headers */ = {isa = PBXBuildFile; fileRef = AA7C86042B43A42E00B5FB3A /* ResamplingContainer.h */; };
8892
AA7C860C2B43A42F00B5FB3A /* LanczosResampler.h in Headers */ = {isa = PBXBuildFile; fileRef = AA7C86062B43A42E00B5FB3A /* LanczosResampler.h */; };
8993
AA7C860D2B43A42F00B5FB3A /* wdltypes.h in Headers */ = {isa = PBXBuildFile; fileRef = AA7C86082B43A42E00B5FB3A /* wdltypes.h */; };
@@ -341,6 +345,8 @@
341345
4FFF108820A1036200D3092F /* NeuralAmpModeler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = NeuralAmpModeler.h; path = ../NeuralAmpModeler.h; sourceTree = "<group>"; };
342346
91236D0D1B08F42B00734C5E /* NeuralAmpModeler.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = NeuralAmpModeler.app; sourceTree = BUILT_PRODUCTS_DIR; };
343347
91236D771B08F59300734C5E /* NeuralAmpModelerAppExtension.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = NeuralAmpModelerAppExtension.appex; sourceTree = BUILT_PRODUCTS_DIR; };
348+
AA341E292B9E5A650069C260 /* ToneStack.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ToneStack.h; path = ../ToneStack.h; sourceTree = "<group>"; };
349+
AA341E2A2B9E5A650069C260 /* ToneStack.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = ToneStack.cpp; path = ../ToneStack.cpp; sourceTree = "<group>"; };
344350
AA7C86042B43A42E00B5FB3A /* ResamplingContainer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ResamplingContainer.h; sourceTree = "<group>"; };
345351
AA7C86062B43A42E00B5FB3A /* LanczosResampler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LanczosResampler.h; sourceTree = "<group>"; };
346352
AA7C86082B43A42E00B5FB3A /* wdltypes.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = wdltypes.h; sourceTree = "<group>"; };
@@ -753,6 +759,8 @@
753759
4FFF108820A1036200D3092F /* NeuralAmpModeler.h */,
754760
4FFF108720A1036200D3092F /* NeuralAmpModeler.cpp */,
755761
4F9979242A066F960066545C /* NeuralAmpModelerControls.h */,
762+
AA341E2A2B9E5A650069C260 /* ToneStack.cpp */,
763+
AA341E292B9E5A650069C260 /* ToneStack.h */,
756764
4F8D8BD82316701900EFA1FB /* README.md */,
757765
4F8BF48D20A12D2E0081DF0A /* Resources */,
758766
4F67D51620A121F60061FB8E /* Other Sources */,
@@ -824,6 +832,7 @@
824832
4FBDC95E29FFF143004FF203 /* wavenet.h in Headers */,
825833
4FC6983B293BA5020076EC33 /* IPlugAUAudioUnit.h in Headers */,
826834
AA7C860B2B43A42F00B5FB3A /* ResamplingContainer.h in Headers */,
835+
AA341E2B2B9E5A650069C260 /* ToneStack.h in Headers */,
827836
4FBDC95B29FFF143004FF203 /* convnet.h in Headers */,
828837
4FBDC95929FFF143004FF203 /* version.h in Headers */,
829838
AA7C860C2B43A42F00B5FB3A /* LanczosResampler.h in Headers */,
@@ -1052,6 +1061,7 @@
10521061
4FC69840293BA5C40076EC33 /* IPlugPluginBase.cpp in Sources */,
10531062
4FC6984A293BA5F90076EC33 /* IGraphics.cpp in Sources */,
10541063
4FBDC95229FFF143004FF203 /* NoiseGate.cpp in Sources */,
1064+
AA341E2E2B9E5A650069C260 /* ToneStack.cpp in Sources */,
10551065
4FC69841293BA5C40076EC33 /* IPlugAPIBase.cpp in Sources */,
10561066
4FC69842293BA5C50076EC33 /* IPlugProcessor.cpp in Sources */,
10571067
4FC69846293BA5F90076EC33 /* IGraphicsEditorDelegate.cpp in Sources */,
@@ -1071,6 +1081,7 @@
10711081
buildActionMask = 2147483647;
10721082
files = (
10731083
4FDF6D7F2267CEBA0007B686 /* IPlugAUPlayer.mm in Sources */,
1084+
AA341E2C2B9E5A650069C260 /* ToneStack.cpp in Sources */,
10741085
4FDF6D7B2267CE540007B686 /* AppDelegate.m in Sources */,
10751086
4FDF6D772267CE540007B686 /* AppViewController.mm in Sources */,
10761087
4FDF6D792267CE540007B686 /* main.m in Sources */,
@@ -1082,6 +1093,7 @@
10821093
buildActionMask = 2147483647;
10831094
files = (
10841095
4FCBE769293CDFB7005D913D /* IPlugAUViewController.mm in Sources */,
1096+
AA341E2D2B9E5A650069C260 /* ToneStack.cpp in Sources */,
10851097
4F4856842773BD77005BCF8E /* NeuralAmpModelerAUv3Appex.m in Sources */,
10861098
);
10871099
runOnlyForDeploymentPostprocessing = 0;

0 commit comments

Comments
 (0)