OpenShot Audio Library | OpenShotAudio: juce_Chorus.cpp Source File

OpenShot Audio Library | OpenShotAudio 0.4.0

Loading...
Searching...
No Matches
juce_Chorus.cpp
1/*
2 ==============================================================================
3
4 This file is part of the JUCE library.
5 Copyright (c) 2022 - Raw Material Software Limited
6
7 JUCE is an open source library subject to commercial or open-source
8 licensing.
9
10 By using JUCE, you agree to the terms of both the JUCE 7 End-User License
11 Agreement and JUCE Privacy Policy.
12
13 End User License Agreement: www.juce.com/juce-7-licence
14 Privacy Policy: www.juce.com/juce-privacy-policy
15
16 Or: You may also use this code under the terms of the GPL v3 (see
17 www.gnu.org/licenses).
18
19 JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER
20 EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE
21 DISCLAIMED.
22
23 ==============================================================================
24*/
25
26namespace juce::dsp
27{
28
29//==============================================================================
30template <typename SampleType>
31Chorus<SampleType>::Chorus()
32{
33 auto oscFunction = [] (SampleType x) { return std::sin (x); };
34 osc.initialise (oscFunction);
35
36 dryWet.setMixingRule (DryWetMixingRule::linear);
37}
38
39template <typename SampleType>
40 void Chorus<SampleType>::setRate (SampleType newRateHz)
41{
42 jassert (isPositiveAndBelow (newRateHz, static_cast<SampleType> (100.0)));
43
44 rate = newRateHz;
45 update();
46}
47
48template <typename SampleType>
49 void Chorus<SampleType>::setDepth (SampleType newDepth)
50{
51 jassert (isPositiveAndNotGreaterThan (newDepth, maxDepth));
52
53 depth = newDepth;
54 update();
55}
56
57template <typename SampleType>
58 void Chorus<SampleType>::setCentreDelay (SampleType newDelayMs)
59{
60 jassert (isPositiveAndBelow (newDelayMs, maxCentreDelayMs));
61
62 centreDelay = jlimit (static_cast<SampleType> (1.0), maxCentreDelayMs, newDelayMs);
63}
64
65template <typename SampleType>
66 void Chorus<SampleType>::setFeedback (SampleType newFeedback)
67{
68 jassert (newFeedback >= static_cast<SampleType> (-1.0) && newFeedback <= static_cast<SampleType> (1.0));
69
70 feedback = newFeedback;
71 update();
72}
73
74template <typename SampleType>
75 void Chorus<SampleType>::setMix (SampleType newMix)
76{
77 jassert (isPositiveAndNotGreaterThan (newMix, static_cast<SampleType> (1.0)));
78
79 mix = newMix;
80 update();
81}
82
83//==============================================================================
84template <typename SampleType>
85 void Chorus<SampleType>::prepare (const ProcessSpec& spec)
86{
87 jassert (spec.sampleRate > 0);
88 jassert (spec.numChannels > 0);
89
90 sampleRate = spec.sampleRate;
91
92 const auto maxPossibleDelay = std::ceil ((maximumDelayModulation * maxDepth * oscVolumeMultiplier + maxCentreDelayMs)
93 * sampleRate / 1000.0);
94 delay = DelayLine<SampleType, DelayLineInterpolationTypes::Linear>{ static_cast<int> (maxPossibleDelay) };
95 delay.prepare (spec);
96
97 dryWet.prepare (spec);
98 feedbackVolume.resize (spec.numChannels);
99 lastOutput.resize (spec.numChannels);
100
101 osc.prepare (spec);
102 bufferDelayTimes.setSize (1, (int) spec.maximumBlockSize, false, false, true);
103
104 update();
105 reset();
106}
107
108template <typename SampleType>
109 void Chorus<SampleType>::reset()
110{
111 std::fill (lastOutput.begin(), lastOutput.end(), static_cast<SampleType> (0));
112
113 delay.reset();
114 osc.reset();
115 dryWet.reset();
116
117 oscVolume.reset (sampleRate, 0.05);
118
119 for (auto& vol : feedbackVolume)
120 vol.reset (sampleRate, 0.05);
121}
122
123template <typename SampleType>
124void Chorus<SampleType>::update()
125{
126 osc.setFrequency (rate);
127 oscVolume.setTargetValue (depth * oscVolumeMultiplier);
128 dryWet.setWetMixProportion (mix);
129
130 for (auto& vol : feedbackVolume)
131 vol.setTargetValue (feedback);
132}
133
134//==============================================================================
135template class Chorus<float>;
136template class Chorus<double>;
137
138} // namespace juce::dsp
juce::dsp::Chorus
Definition juce_Chorus.h:46
juce::dsp::Chorus::setFeedback
void setFeedback(SampleType newFeedback)
Definition juce_Chorus.cpp:66
juce::dsp::Chorus::setDepth
void setDepth(SampleType newDepth)
Definition juce_Chorus.cpp:49
juce::dsp::Chorus::prepare
void prepare(const ProcessSpec &spec)
Definition juce_Chorus.cpp:85
juce::dsp::Chorus::setMix
void setMix(SampleType newMix)
Definition juce_Chorus.cpp:75
juce::dsp::Chorus::reset
void reset()
Definition juce_Chorus.cpp:109
juce::dsp::Chorus::Chorus
Chorus()
Definition juce_Chorus.cpp:31
juce::dsp::Chorus::setRate
void setRate(SampleType newRateHz)
Definition juce_Chorus.cpp:40
juce::dsp::Chorus::setCentreDelay
void setCentreDelay(SampleType newDelayMs)
Definition juce_Chorus.cpp:58
juce::dsp::DelayLine
Definition juce_DelayLine.h:93
juce::dsp::DelayLine::prepare
void prepare(const ProcessSpec &spec)
Definition juce_DelayLine.cpp:68
juce::dsp::ProcessSpec
Definition juce_ProcessContext.h:36
juce::dsp::ProcessSpec::numChannels
uint32 numChannels
Definition juce_ProcessContext.h:44
juce::dsp::ProcessSpec::sampleRate
double sampleRate
Definition juce_ProcessContext.h:38
juce::dsp::ProcessSpec::maximumBlockSize
uint32 maximumBlockSize
Definition juce_ProcessContext.h:41