30template <
typename SampleType>
33 auto oscFunction = [] (SampleType x) {
return std::sin (x); };
34 osc.initialise (oscFunction);
36 for (
auto n = 0; n < numStages; ++n)
39 filters[n]->setType (FirstOrderTPTFilterType::allpass);
42 dryWet.setMixingRule (DryWetMixingRule::linear);
45template <
typename SampleType>
48 jassert (isPositiveAndBelow (newRateHz,
static_cast<SampleType
> (100.0)));
54template <
typename SampleType>
57 jassert (isPositiveAndNotGreaterThan (newDepth,
static_cast<SampleType
> (1.0)));
63template <
typename SampleType>
66 jassert (isPositiveAndBelow (newCentreHz,
static_cast<SampleType
> (sampleRate * 0.5)));
68 centreFrequency = newCentreHz;
69 normCentreFrequency = mapFromLog10 (centreFrequency,
static_cast<SampleType
> (20.0),
static_cast<SampleType
> (jmin (20000.0, 0.49 * sampleRate)));
72template <
typename SampleType>
75 jassert (newFeedback >=
static_cast<SampleType
> (-1.0) && newFeedback <=
static_cast<SampleType
> (1.0));
77 feedback = newFeedback;
81template <
typename SampleType>
84 jassert (isPositiveAndNotGreaterThan (newMix,
static_cast<SampleType
> (1.0)));
91template <
typename SampleType>
99 for (
auto n = 0; n < numStages; ++n)
102 dryWet.prepare (spec);
106 auto specDown = spec;
107 specDown.
sampleRate /= (double) maxUpdateCounter;
108 specDown.maximumBlockSize = specDown.maximumBlockSize / (uint32) maxUpdateCounter + 1;
110 osc.prepare (specDown);
111 bufferFrequency.setSize (1, (
int) specDown.maximumBlockSize,
false,
false,
true);
117template <
typename SampleType>
120 std::fill (lastOutput.begin(), lastOutput.end(),
static_cast<SampleType
> (0));
122 for (
auto n = 0; n < numStages; ++n)
128 oscVolume.reset (sampleRate / (
double) maxUpdateCounter, 0.05);
130 for (
auto& vol : feedbackVolume)
131 vol.reset (sampleRate, 0.05);
136template <
typename SampleType>
137void Phaser<SampleType>::update()
139 osc.setFrequency (rate);
140 oscVolume.setTargetValue (depth * (SampleType) 0.5);
141 dryWet.setWetMixProportion (mix);
143 for (
auto& vol : feedbackVolume)
144 vol.setTargetValue (feedback);
148template class Phaser<float>;
149template class Phaser<double>;
void prepare(const ProcessSpec &spec)
void setDepth(SampleType newDepth)
void setFeedback(SampleType newFeedback)
void setMix(SampleType newMix)
void setRate(SampleType newRateHz)
void setCentreFrequency(SampleType newCentreHz)