/* ============================================================================== This file is part of the JUCE library. Copyright (c) 2020 - 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 6 End-User License Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). End User License Agreement: www.juce.com/juce-6-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 { //============================================================================== template Compressor::Compressor() { update(); } //============================================================================== template void Compressor::setThreshold (SampleType newThreshold) { thresholddB = newThreshold; update(); } template void Compressor::setRatio (SampleType newRatio) { jassert (newRatio >= static_cast (1.0)); ratio = newRatio; update(); } template void Compressor::setAttack (SampleType newAttack) { attackTime = newAttack; update(); } template void Compressor::setRelease (SampleType newRelease) { releaseTime = newRelease; update(); } //============================================================================== template void Compressor::prepare (const ProcessSpec& spec) { jassert (spec.sampleRate > 0); jassert (spec.numChannels > 0); sampleRate = spec.sampleRate; envelopeFilter.prepare (spec); update(); reset(); } template void Compressor::reset() { envelopeFilter.reset(); } //============================================================================== template SampleType Compressor::processSample (int channel, SampleType inputValue) { // Ballistics filter with peak rectifier auto env = envelopeFilter.processSample (channel, inputValue); // VCA auto gain = (env < threshold) ? static_cast (1.0) : std::pow (env * thresholdInverse, ratioInverse - static_cast (1.0)); // Output return gain * inputValue; } template void Compressor::update() { threshold = Decibels::decibelsToGain (thresholddB, static_cast (-200.0)); thresholdInverse = static_cast (1.0) / threshold; ratioInverse = static_cast (1.0) / ratio; envelopeFilter.setAttackTime (attackTime); envelopeFilter.setReleaseTime (releaseTime); } //============================================================================== template class Compressor; template class Compressor; } // namespace dsp } // namespace juce