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;