Files

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