AnalogTapeModel

Physical modelling signal processing for analog tape recording
Log | Files | Refs | Submodules | README | LICENSE

commit 0b2466f8c24677a0392943f4e8151a0291d2b8c8
parent 2a94da6329d51ed83cacb6a7f485fe2778ad821e
Author: jatinchowdhury18 <jatinchowdhury18@gmail.com>
Date:   Mon,  1 Jun 2020 16:57:30 -0700

Working on fixing clicks (#35)

* Fix clicks in GainProcessor and DegradeProcessor

* Fix clicks on start playback

Co-authored-by: jatinchowdhury18 <jatinchowdhury18@users.noreply.github.com>
Diffstat:
MPlugin/Source/Processors/Degrade/DegradeProcessor.cpp | 24+++++++++++++++++-------
MPlugin/Source/Processors/Degrade/DegradeProcessor.h | 1+
MPlugin/Source/Processors/GainProcessor.h | 2+-
MPlugin/Source/Processors/Loss_Effects/LossFilter.h | 14+++++++++++++-
MPlugin/Source/Processors/Timing_Effects/DelayProcessor.cpp | 4++--
5 files changed, 34 insertions(+), 11 deletions(-)

diff --git a/Plugin/Source/Processors/Degrade/DegradeProcessor.cpp b/Plugin/Source/Processors/Degrade/DegradeProcessor.cpp @@ -14,14 +14,29 @@ void DegradeProcessor::createParameterLayout (std::vector<std::unique_ptr<Ranged params.push_back (std::make_unique<AudioParameterFloat> ("deg_var", "Variance", 0.0f, 1.0f, 0.0f)); } +void DegradeProcessor::cookParams() +{ + float freqHz = 200.0f * powf (20000.0f / 200.0f, 1.0f - *amtParam); + float gainDB = -24.0f * *depthParam; + + for (int ch = 0; ch < 2; ++ch) + { + noiseProc[ch].setGain (0.5f * *depthParam * *amtParam); + filterProc[ch].setFreq (jmin (freqHz + (*varParam * (freqHz / 0.6f) * (random.nextFloat() - 0.5f)), 0.49f * fs)); + } + + gainProc.setGain (Decibels::decibelsToGain (jmin (gainDB + (*varParam * 36.0f * (random.nextFloat() - 0.5f)), 3.0f))); +} + void DegradeProcessor::prepareToPlay (double sampleRate, int samplesPerBlock) { fs = (float) sampleRate; + cookParams(); for (int ch = 0; ch < 2; ++ch) { noiseProc[ch].prepare(); - filterProc[ch].reset ((float) sampleRate); + filterProc[ch].reset ((float) sampleRate, 20); } gainProc.prepareToPlay (sampleRate, samplesPerBlock); @@ -29,18 +44,13 @@ void DegradeProcessor::prepareToPlay (double sampleRate, int samplesPerBlock) void DegradeProcessor::processBlock (AudioBuffer<float>& buffer, MidiBuffer& midi) { - float freqHz = 200.0f * powf (20000.0f / 200.0f, 1.0f - *amtParam); - float gainDB = -24.0f * *depthParam; + cookParams(); for (int ch = 0; ch < buffer.getNumChannels(); ++ch) { - noiseProc[ch].setGain (0.5f * *depthParam * *amtParam); noiseProc[ch].processBlock (buffer.getWritePointer (ch), buffer.getNumSamples()); - - filterProc[ch].setFreq (jmin (freqHz + (*varParam * (freqHz / 0.6f) * (random.nextFloat() - 0.5f)), 0.49f * fs)); filterProc[ch].process (buffer.getWritePointer (ch), buffer.getNumSamples()); } - gainProc.setGain (Decibels::decibelsToGain (jmin (gainDB + (*varParam * 36.0f * (random.nextFloat() - 0.5f)), 3.0f))); gainProc.processBlock (buffer, midi); } diff --git a/Plugin/Source/Processors/Degrade/DegradeProcessor.h b/Plugin/Source/Processors/Degrade/DegradeProcessor.h @@ -12,6 +12,7 @@ public: static void createParameterLayout (std::vector<std::unique_ptr<RangedAudioParameter>>& params); + void cookParams(); void prepareToPlay (double sampleRate, int samplesPerBlock); void processBlock (AudioBuffer<float>& buffer, MidiBuffer& midi); diff --git a/Plugin/Source/Processors/GainProcessor.h b/Plugin/Source/Processors/GainProcessor.h @@ -10,7 +10,7 @@ public: void prepareToPlay (double /*sampleRate*/, int /*maximumExpectedSamplesPerBlock*/) { - oldGain = 0.0f; + oldGain = curGain; } void processBlock (AudioBuffer<float>& buffer, MidiBuffer& /*midiMessages*/) diff --git a/Plugin/Source/Processors/Loss_Effects/LossFilter.h b/Plugin/Source/Processors/Loss_Effects/LossFilter.h @@ -64,6 +64,8 @@ public: prevSpacing = *spacing; prevThickness = *thickness; prevGap = *gap; + + starting = true; } void calcCoefs() @@ -100,7 +102,10 @@ public: { if (*spacing == (float) 1.0e-6 && *thickness == (float) 1.0e-6 && *gap == (float) 1.0e-6 && *spacing == prevSpacing && *thickness == prevThickness && *gap == prevGap) + { + filters[activeFilter]->processBypassed (buffer, numSamples); return; + } if ((*speed != prevSpeed || *spacing != prevSpacing || *thickness != prevThickness || *gap != prevGap) && fadeCount == 0) @@ -121,7 +126,13 @@ public: else filters[! activeFilter]->processBypassed (buffer, numSamples); - filters[activeFilter]->process (buffer, numSamples); + if (! starting) + filters[activeFilter]->process (buffer, numSamples); + else + { + starting = false; + filters[activeFilter]->processBypassed (buffer, numSamples); + } if (fadeCount > 0) { @@ -148,6 +159,7 @@ private: int fadeCount = 0; const int fadeLength = 512; Array<float> fadeBuffer; + bool starting = false; std::atomic<float>* speed = nullptr; std::atomic<float>* spacing = nullptr; diff --git a/Plugin/Source/Processors/Timing_Effects/DelayProcessor.cpp b/Plugin/Source/Processors/Timing_Effects/DelayProcessor.cpp @@ -9,8 +9,8 @@ void DelayProcessor::setReadPtr (int maxLength) void DelayProcessor::setLengthMs (double lengthMs, bool force) { - int newLength = (int) (lengthMs * sampleRate / 1000.0); - newLength = jmin (newLength, bufferSize); + auto newLength = lengthMs * sampleRate / 1000.0; + newLength = jmin (newLength, (double) bufferSize); if (! force) length.setTargetValue ((float) newLength);