LMMS
Loading...
Searching...
No Matches
juce_Phaser.cpp
Go to the documentation of this file.
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
27{
28namespace dsp
29{
30
31//==============================================================================
32template <typename SampleType>
34{
35 auto oscFunction = [] (SampleType x) { return std::sin (x); };
36 osc.initialise (oscFunction);
37
38 for (auto n = 0; n < numStages; ++n)
39 {
42 }
43
44 dryWet.setMixingRule (DryWetMixingRule::linear);
45}
46
47template <typename SampleType>
48void Phaser<SampleType>::setRate (SampleType newRateHz)
49{
50 jassert (isPositiveAndBelow (newRateHz, static_cast<SampleType> (100.0)));
51
52 rate = newRateHz;
53 update();
54}
55
56template <typename SampleType>
57void Phaser<SampleType>::setDepth (SampleType newDepth)
58{
59 jassert (isPositiveAndNotGreaterThan (newDepth, static_cast<SampleType> (1.0)));
60
61 depth = newDepth;
62 update();
63}
64
65template <typename SampleType>
66void Phaser<SampleType>::setCentreFrequency (SampleType newCentreHz)
67{
68 jassert (isPositiveAndBelow (newCentreHz, static_cast<SampleType> (sampleRate * 0.5)));
69
70 centreFrequency = newCentreHz;
71 normCentreFrequency = mapFromLog10 (centreFrequency, static_cast<SampleType> (20.0), static_cast<SampleType> (jmin (20000.0, 0.49 * sampleRate)));
72}
73
74template <typename SampleType>
75void Phaser<SampleType>::setFeedback (SampleType newFeedback)
76{
77 jassert (newFeedback >= static_cast<SampleType> (-1.0) && newFeedback <= static_cast<SampleType> (1.0));
78
79 feedback = newFeedback;
80 update();
81}
82
83template <typename SampleType>
84void Phaser<SampleType>::setMix (SampleType newMix)
85{
86 jassert (isPositiveAndNotGreaterThan (newMix, static_cast<SampleType> (1.0)));
87
88 mix = newMix;
89 update();
90}
91
92//==============================================================================
93template <typename SampleType>
95{
96 jassert (spec.sampleRate > 0);
97 jassert (spec.numChannels > 0);
98
100
101 for (auto n = 0; n < numStages; ++n)
102 filters[n]->prepare (spec);
103
104 dryWet.prepare (spec);
105 feedbackVolume.resize (spec.numChannels);
106 lastOutput.resize (spec.numChannels);
107
108 auto specDown = spec;
109 specDown.sampleRate /= (double) maxUpdateCounter;
110 specDown.maximumBlockSize = specDown.maximumBlockSize / (uint32) maxUpdateCounter + 1;
111
112 osc.prepare (specDown);
113 bufferFrequency.setSize (1, (int) specDown.maximumBlockSize, false, false, true);
114
115 update();
116 reset();
117}
118
119template <typename SampleType>
121{
122 std::fill (lastOutput.begin(), lastOutput.end(), static_cast<SampleType> (0));
123
124 for (auto n = 0; n < numStages; ++n)
125 filters[n]->reset();
126
127 osc.reset();
128 dryWet.reset();
129
130 oscVolume.reset (sampleRate / (double) maxUpdateCounter, 0.05);
131
132 for (auto& vol : feedbackVolume)
133 vol.reset (sampleRate, 0.05);
134
135 updateCounter = 0;
136}
137
138template <typename SampleType>
140{
141 osc.setFrequency (rate);
142 oscVolume.setTargetValue (depth * (SampleType) 0.5);
143 dryWet.setWetMixProportion (mix);
144
145 for (auto& vol : feedbackVolume)
146 vol.setTargetValue (feedback);
147}
148
149//==============================================================================
150template class Phaser<float>;
151template class Phaser<double>;
152
153} // namespace dsp
154} // namespace juce
Phaser(const int &insertion_, float *efxoutl_, float *efxoutr_, unsigned int srate, int bufsize)
Definition Phaser.cpp:42
Definition juce_FirstOrderTPTFilter.h:56
Definition juce_Phaser.h:43
void reset()
Definition juce_Phaser.cpp:120
DryWetMixer< SampleType > dryWet
Definition juce_Phaser.h:191
static constexpr int numStages
Definition juce_Phaser.h:202
void prepare(const ProcessSpec &spec)
Definition juce_Phaser.cpp:94
static constexpr int maxUpdateCounter
Definition juce_Phaser.h:198
std::vector< SampleType > lastOutput
Definition juce_Phaser.h:192
double sampleRate
Definition juce_Phaser.h:195
AudioBuffer< SampleType > bufferFrequency
Definition juce_Phaser.h:193
SampleType depth
Definition juce_Phaser.h:200
SmoothedValue< SampleType, ValueSmoothingTypes::Linear > oscVolume
Definition juce_Phaser.h:189
SampleType feedback
Definition juce_Phaser.h:200
void setCentreFrequency(SampleType newCentreHz)
Definition juce_Phaser.cpp:66
SampleType mix
Definition juce_Phaser.h:200
Oscillator< SampleType > osc
Definition juce_Phaser.h:187
void setFeedback(SampleType newFeedback)
Definition juce_Phaser.cpp:75
std::vector< SmoothedValue< SampleType, ValueSmoothingTypes::Linear > > feedbackVolume
Definition juce_Phaser.h:190
void setRate(SampleType newRateHz)
Definition juce_Phaser.cpp:48
SampleType centreFrequency
Definition juce_Phaser.h:201
int updateCounter
Definition juce_Phaser.h:197
void setMix(SampleType newMix)
Definition juce_Phaser.cpp:84
void setDepth(SampleType newDepth)
Definition juce_Phaser.cpp:57
SampleType rate
Definition juce_Phaser.h:200
void update()
Definition juce_Phaser.cpp:139
OwnedArray< FirstOrderTPTFilter< SampleType > > filters
Definition juce_Phaser.h:188
SampleType normCentreFrequency
Definition juce_Phaser.h:194
unsigned x[BMAX+1]
Definition inflate.c:1586
#define jassert(expression)
Definition juce_AudioBlock.h:29
@ allpass
Definition juce_FirstOrderTPTFilter.h:35
@ linear
Definition juce_DryWetMixer.h:33
Definition carla_juce.cpp:31
constexpr Type jmin(Type a, Type b)
Definition juce_MathsFunctions.h:106
unsigned int uint32
Definition juce_MathsFunctions.h:45
bool isPositiveAndNotGreaterThan(Type1 valueToTest, Type2 upperLimit) noexcept
Definition juce_MathsFunctions.h:298
bool isPositiveAndBelow(Type1 valueToTest, Type2 upperLimit) noexcept
Definition juce_MathsFunctions.h:279
Type mapFromLog10(Type valueInLogRange, Type logRangeMin, Type logRangeMax)
Definition juce_MathsFunctions.h:166
Definition juce_ProcessContext.h:38
uint32 numChannels
Definition juce_ProcessContext.h:46
double sampleRate
Definition juce_ProcessContext.h:40
int n
Definition crypt.c:458