/* ============================================================================== This file is part of the JUCE library. Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. By using JUCE, you agree to the terms of both the JUCE 7 End-User License Agreement and JUCE Privacy Policy. End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see www.gnu.org/licenses). JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE DISCLAIMED. ============================================================================== */ namespace juce { namespace dsp { /** A simple noise gate with standard threshold, ratio, attack time and release time controls. Can be used as an expander if the ratio is low. @tags{DSP} */ template class NoiseGate { public: //============================================================================== /** Constructor. */ NoiseGate(); //============================================================================== /** Sets the threshold in dB of the noise-gate.*/ void setThreshold (SampleType newThreshold); /** Sets the ratio of the noise-gate (must be higher or equal to 1).*/ void setRatio (SampleType newRatio); /** Sets the attack time in milliseconds of the noise-gate.*/ void setAttack (SampleType newAttack); /** Sets the release time in milliseconds of the noise-gate.*/ void setRelease (SampleType newRelease); //============================================================================== /** Initialises the processor. */ void prepare (const ProcessSpec& spec); /** Resets the internal state variables of the processor. */ void reset(); //============================================================================== /** Processes the input and output samples supplied in the processing context. */ template void process (const ProcessContext& context) noexcept { const auto& inputBlock = context.getInputBlock(); auto& outputBlock = context.getOutputBlock(); const auto numChannels = outputBlock.getNumChannels(); const auto numSamples = outputBlock.getNumSamples(); jassert (inputBlock.getNumChannels() == numChannels); jassert (inputBlock.getNumSamples() == numSamples); if (context.isBypassed) { outputBlock.copyFrom (inputBlock); return; } for (size_t channel = 0; channel < numChannels; ++channel) { auto* inputSamples = inputBlock .getChannelPointer (channel); auto* outputSamples = outputBlock.getChannelPointer (channel); for (size_t i = 0; i < numSamples; ++i) outputSamples[i] = processSample ((int) channel, inputSamples[i]); } } /** Performs the processing operation on a single sample at a time. */ SampleType processSample (int channel, SampleType inputValue); private: //============================================================================== void update(); //============================================================================== SampleType threshold, thresholdInverse, currentRatio; BallisticsFilter envelopeFilter, RMSFilter; double sampleRate = 44100.0; SampleType thresholddB = -100, ratio = 10.0, attackTime = 1.0, releaseTime = 100.0; }; } // namespace dsp } // namespace juce