From 3cd56b4697d27c43b48ff3bb8ecfc12576219c28 Mon Sep 17 00:00:00 2001 From: Jean Pierre Cimalando Date: Mon, 22 Jun 2020 06:39:06 +0200 Subject: [PATCH] Support interpolation to nearest --- src/sfizz/Interpolators.h | 2 ++ src/sfizz/Interpolators.hpp | 13 +++++++++++++ src/sfizz/Wavetables.cpp | 10 ++++++---- 3 files changed, 21 insertions(+), 4 deletions(-) diff --git a/src/sfizz/Interpolators.h b/src/sfizz/Interpolators.h index f784eefd..c4fdbbd9 100644 --- a/src/sfizz/Interpolators.h +++ b/src/sfizz/Interpolators.h @@ -9,6 +9,8 @@ namespace sfz { enum InterpolatorModel : int { + // a nearest interpolator + kInterpolatorNearest, // a linear interpolator kInterpolatorLinear, // a Hermite 3rd order interpolator diff --git a/src/sfizz/Interpolators.hpp b/src/sfizz/Interpolators.hpp index 1f462578..5c302900 100644 --- a/src/sfizz/Interpolators.hpp +++ b/src/sfizz/Interpolators.hpp @@ -19,6 +19,19 @@ inline R interpolate(const R* values, R coeff) return Interpolator::process(values, coeff); } +//------------------------------------------------------------------------------ +// Nearest + +template +class Interpolator +{ +public: + static inline R process(const R* values, R coeff) + { + return values[coeff > static_cast(0.5)]; + } +}; + //------------------------------------------------------------------------------ // Linear diff --git a/src/sfizz/Wavetables.cpp b/src/sfizz/Wavetables.cpp index 929735a1..e294cfee 100644 --- a/src/sfizz/Wavetables.cpp +++ b/src/sfizz/Wavetables.cpp @@ -144,8 +144,9 @@ void WavetableOscillator::process(float frequency, float detuneRatio, float* out int quality = clamp(_quality, 0, 3); switch (quality) { - case 0: // supposed to be nearest according to book - // fall through + case 0: + processSingle(frequency, detuneRatio, output, nframes); + break; case 1: processSingle(frequency, detuneRatio, output, nframes); break; @@ -163,8 +164,9 @@ void WavetableOscillator::processModulated(const float* frequencies, float detun int quality = clamp(_quality, 0, 3); switch (quality) { - case 0: // supposed to be nearest according to book - // fall through + case 0: + processModulatedSingle(frequencies, detuneRatio, output, nframes); + break; case 1: processModulatedSingle(frequencies, detuneRatio, output, nframes); break;