AnalogTapeModel

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

commit e14e0b33166bf80ce6755adf8259924be336d762
parent e7338a4215cfe75cde3e7b1f1889e0a343c395df
Author: jatinchowdhury18 <jatinchowdhury18@users.noreply.github.com>
Date:   Mon,  4 May 2020 15:55:41 -0700

Clean up CPU optimizations that weren't helping, slight adjustment to chew algorithm

Diffstat:
MPlugin/Source/PluginProcessor.cpp | 19++-----------------
MPlugin/Source/PluginProcessor.h | 3---
MPlugin/Source/Processors/Chew/Dropout.h | 31+++----------------------------
MPlugin/Source/gui.xml | 2--
4 files changed, 5 insertions(+), 50 deletions(-)

diff --git a/Plugin/Source/PluginProcessor.cpp b/Plugin/Source/PluginProcessor.cpp @@ -29,10 +29,7 @@ ChowtapeModelAudioProcessor::ChowtapeModelAudioProcessor() flutter (vts) { for (int ch = 0; ch < 2; ++ch) - { lossFilter[ch].reset (new LossFilter (vts)); - lossFilterCheap[ch].reset (new LossFilter (vts, 32)); - } scope = magicState.addPlotSource ("scope", std::make_unique<foleys::MagicOscilloscope>()); } @@ -48,7 +45,6 @@ AudioProcessorValueTreeState::ParameterLayout ChowtapeModelAudioProcessor::creat params.push_back (std::make_unique<AudioParameterFloat> ("ingain", "Input Gain [dB]", -30.0f, 6.0f, 0.0f)); params.push_back (std::make_unique<AudioParameterFloat> ("outgain", "Output Gain [dB]", -30.0f, 30.0f, 0.0f)); params.push_back (std::make_unique<AudioParameterFloat> ("drywet", "Dry/Wet", 0.0f, 100.0f, 100.0f)); - params.push_back (std::make_unique<AudioParameterBool> ("lowCPU", "Low CPU", false)); HysteresisProcessor::createParameterLayout (params); LossFilter::createParameterLayout (params); @@ -130,10 +126,7 @@ void ChowtapeModelAudioProcessor::prepareToPlay (double sampleRate, int samplesP chewer.prepare (sampleRate); for (int ch = 0; ch < 2; ++ch) - { lossFilter[ch]->prepare ((float) sampleRate, samplesPerBlock); - lossFilterCheap[ch]->prepare ((float) sampleRate, samplesPerBlock); - } flutter.prepareToPlay (sampleRate, samplesPerBlock); outGain.prepareToPlay (sampleRate, samplesPerBlock); @@ -192,16 +185,8 @@ void ChowtapeModelAudioProcessor::processBlock (AudioBuffer<float>& buffer, Midi flutter.processBlock (buffer, midiMessages); - if ((bool) *vts.getRawParameterValue ("lowCPU")) - { - for (int ch = 0; ch < buffer.getNumChannels(); ++ch) - lossFilterCheap[ch]->processBlock (buffer.getWritePointer (ch), buffer.getNumSamples()); - } - else - { - for (int ch = 0; ch < buffer.getNumChannels(); ++ch) - lossFilter[ch]->processBlock (buffer.getWritePointer (ch), buffer.getNumSamples()); - } + for (int ch = 0; ch < buffer.getNumChannels(); ++ch) + lossFilter[ch]->processBlock (buffer.getWritePointer (ch), buffer.getNumSamples()); dryWet.processBlock (dryBuffer, buffer); outGain.processBlock (buffer, midiMessages); diff --git a/Plugin/Source/PluginProcessor.h b/Plugin/Source/PluginProcessor.h @@ -72,10 +72,7 @@ private: HysteresisProcessor hysteresis; DegradeProcessor degrade; ChewProcessor chewer; - std::unique_ptr<LossFilter> lossFilter[2]; - std::unique_ptr<LossFilter> lossFilterCheap[2]; - Flutter flutter; DryWetProcessor dryWet; GainProcessor outGain; diff --git a/Plugin/Source/Processors/Chew/Dropout.h b/Plugin/Source/Processors/Chew/Dropout.h @@ -24,10 +24,10 @@ public: { for (int ch = 0; ch < 2; ++ch) { - mixSmooth[ch].reset (sr, 0.02); + mixSmooth[ch].reset (sr, 0.01); mixSmooth[ch].setCurrentAndTargetValue (mixSmooth[ch].getTargetValue()); - powerSmooth[ch].reset (sr, 0.01); + powerSmooth[ch].reset (sr, 0.005); powerSmooth[ch].setCurrentAndTargetValue (powerSmooth[ch].getTargetValue()); } } @@ -56,32 +56,7 @@ public: else if (x < 0.0f) sign = -1.0f; - return fastPow (abs (x), powerSmooth[ch].getNextValue()) * sign; - } - - inline double fastPow(double a, double b) - { - // calculate approximation with fraction of the exponent - int e = (int) b; - union { - double d; - int x[2]; - } u = { a }; - u.x[1] = (int)((b - e) * (u.x[1] - 1072632447) + 1072632447); - u.x[0] = 0; - - // exponentiation by squaring with the exponent's integer part - // double r = u.d makes everything much slower, not sure why - double r = 1.0; - while (e) { - if (e & 1) { - r *= a; - } - a *= a; - e >>= 1; - } - - return r * u.d; + return pow (abs (x), powerSmooth[ch].getNextValue()) * sign; } private: diff --git a/Plugin/Source/gui.xml b/Plugin/Source/gui.xml @@ -60,8 +60,6 @@ slider-textbox="textbox-below" lookAndFeel="LookAndFeel_V4" padding="0"/> <Slider caption="Speed [ips]" parameter="speed" slider-type="linear-horizontal" slider-textbox="textbox-below" padding="0"/> - <TextButton text="Low CPU" parameter="lowCPU" button-on-color="FF175CCE" - max-height="40"/> </View> <View tab-caption="Degr." padding="0" flex-direction="column"> <Label text="Degrade" justification="centred" font-size="18" max-height="40"/>