diff --git a/modules/juce_dsp/widgets/juce_Chorus.cpp b/modules/juce_dsp/widgets/juce_Chorus.cpp index c2711c552a..5be5d8237c 100644 --- a/modules/juce_dsp/widgets/juce_Chorus.cpp +++ b/modules/juce_dsp/widgets/juce_Chorus.cpp @@ -50,7 +50,7 @@ void Chorus::setRate (SampleType newRateHz) template void Chorus::setDepth (SampleType newDepth) { - jassert (isPositiveAndNotGreaterThan (newDepth, static_cast (1.0))); + jassert (isPositiveAndNotGreaterThan (newDepth, maxDepth)); depth = newDepth; update(); @@ -59,9 +59,9 @@ void Chorus::setDepth (SampleType newDepth) template void Chorus::setCentreDelay (SampleType newDelayMs) { - jassert (isPositiveAndBelow (newDelayMs, static_cast (100.0))); + jassert (isPositiveAndBelow (newDelayMs, maxCentreDelayMs)); - centreDelay = jlimit (static_cast (1.0), static_cast (100.0), newDelayMs); + centreDelay = jlimit (static_cast (1.0), maxCentreDelayMs, newDelayMs); } template @@ -91,6 +91,9 @@ void Chorus::prepare (const ProcessSpec& spec) sampleRate = spec.sampleRate; + const auto maxPossibleDelay = std::ceil ((maximumDelayModulation * maxDepth * oscVolumeMultiplier + maxCentreDelayMs) + * sampleRate / 1000.0); + delay = DelayLine{ static_cast (maxPossibleDelay) }; delay.prepare (spec); dryWet.prepare (spec); @@ -123,7 +126,7 @@ template void Chorus::update() { osc.setFrequency (rate); - oscVolume.setTargetValue (depth * (SampleType) 0.5); + oscVolume.setTargetValue (depth * oscVolumeMultiplier); dryWet.setWetMixProportion (mix); for (auto& vol : feedbackVolume) diff --git a/modules/juce_dsp/widgets/juce_Chorus.h b/modules/juce_dsp/widgets/juce_Chorus.h index 273b1ee0d9..387850d36b 100644 --- a/modules/juce_dsp/widgets/juce_Chorus.h +++ b/modules/juce_dsp/widgets/juce_Chorus.h @@ -148,7 +148,7 @@ private: //============================================================================== Oscillator osc; - DelayLine delay { 5000 }; + DelayLine delay; SmoothedValue oscVolume; std::vector> feedbackVolume { 2 }; DryWetMixer dryWet; @@ -157,7 +157,12 @@ private: double sampleRate = 44100.0; SampleType rate = 1.0, depth = 0.25, feedback = 0.0, mix = 0.5, - centreDelay = 7.0, maximumDelayModulation = 20.0; + centreDelay = 7.0; + + static constexpr SampleType maxDepth = 1.0, + maxCentreDelayMs = 100.0, + oscVolumeMultiplier = 0.5, + maximumDelayModulation = 20.0; }; } // namespace dsp