diff --git a/src/sfizz/Wavetables.cpp b/src/sfizz/Wavetables.cpp index 2a668a13..c8cba91c 100644 --- a/src/sfizz/Wavetables.cpp +++ b/src/sfizz/Wavetables.cpp @@ -36,6 +36,14 @@ void WavetableOscillator::setPhase(float phase) _phase = phase; } +static float incrementAndWrap(float phase, float inc) +{ + phase += inc; + phase -= static_cast(phase); + phase += phase < 0.0f; // in case of negative frequencies + return phase; +} + template void WavetableOscillator::processSingle(float frequency, float detuneRatio, float* output, unsigned nframes) { @@ -52,8 +60,7 @@ void WavetableOscillator::processSingle(float frequency, float detuneRatio, floa float frac = position - index; output[i] = interpolate(&table[index], frac); - phase += phaseInc; - phase -= static_cast(phase); + phase = incrementAndWrap(phase, phaseInc); } _phase = phase; @@ -78,8 +85,7 @@ void WavetableOscillator::processModulatedSingle(const float* frequencies, const float frac = position - index; output[i] = interpolate(&table[index], frac); - phase += phaseInc; - phase -= static_cast(phase); + phase = incrementAndWrap(phase, phaseInc); } _phase = phase; @@ -103,8 +109,7 @@ void WavetableOscillator::processDual(float frequency, float detuneRatio, float* (1 - dt.delta) * interpolate(&dt.table1[index], frac) + dt.delta * interpolate(&dt.table2[index], frac); - phase += phaseInc; - phase -= static_cast(phase); + phase = incrementAndWrap(phase, phaseInc); } _phase = phase; @@ -132,8 +137,7 @@ void WavetableOscillator::processModulatedDual(const float* frequencies, const f (1 - dt.delta) * interpolate(&dt.table1[index], frac) + dt.delta * interpolate(&dt.table2[index], frac); - phase += phaseInc; - phase -= static_cast(phase); + phase = incrementAndWrap(phase, phaseInc); } _phase = phase;