55 lines
1.4 KiB
C++
55 lines
1.4 KiB
C++
#include "Phaser.h"
|
|
|
|
namespace serum
|
|
{
|
|
|
|
void PhaserUnit::prepare (double sampleRate, int)
|
|
{
|
|
sr = sampleRate;
|
|
reset();
|
|
}
|
|
|
|
void PhaserUnit::reset()
|
|
{
|
|
lfoPhase = 0.0;
|
|
for (int i = 0; i < 6; ++i)
|
|
{
|
|
xL[i] = xR[i] = yL[i] = yR[i] = 0.0f;
|
|
}
|
|
}
|
|
|
|
void PhaserUnit::process (float* l, float* r, int numSamples, const float p[4])
|
|
{
|
|
const double rate = 0.05 + p[0] * 2.0;
|
|
const float depth = 0.3f + p[1] * 0.6f;
|
|
const float feedback = p[2] * 0.7f;
|
|
const int stages = juce::jlimit (2, 6, 2 + (int) (p[3] * 4.0f + 0.5f));
|
|
|
|
for (int i = 0; i < numSamples; ++i)
|
|
{
|
|
lfoPhase += 6.28318530717958647692 * rate / sr;
|
|
if (lfoPhase > 6.28318530717958647692) lfoPhase -= 6.28318530717958647692;
|
|
|
|
const float sweep = (float) (0.5 + 0.5 * std::sin (lfoPhase));
|
|
const float a = 0.3f + depth * sweep; // allpass coefficient
|
|
|
|
float outL = l[i] + yL[5] * feedback;
|
|
float outR = r[i] + yR[5] * feedback;
|
|
|
|
for (int s = 0; s < stages; ++s)
|
|
{
|
|
// y = a*x + x_prev - a*y_prev
|
|
const float inL = outL, inR = outR;
|
|
outL = a * inL + xL[s] - a * yL[s];
|
|
outR = a * inR + xR[s] - a * yR[s];
|
|
xL[s] = inL; xR[s] = inR;
|
|
yL[s] = outL; yR[s] = outR;
|
|
}
|
|
|
|
l[i] = outL;
|
|
r[i] = outR;
|
|
}
|
|
}
|
|
|
|
} // namespace serum
|