From 8f69c9e00223d18cf8c9836b92752c0bd9908ce0 Mon Sep 17 00:00:00 2001 From: Andrew Belt Date: Fri, 5 Nov 2021 01:49:21 -0400 Subject: [PATCH] Add disabled octave interpolation to WT VCO. --- src/WTVCO.cpp | 25 ++++++++++++++++++------- 1 file changed, 18 insertions(+), 7 deletions(-) diff --git a/src/WTVCO.cpp b/src/WTVCO.cpp index ab008be..6c8576a 100644 --- a/src/WTVCO.cpp +++ b/src/WTVCO.cpp @@ -114,18 +114,29 @@ struct WTVCO : Module { size_t pos0 = std::trunc(pos); size_t pos1 = pos0 + 1; // Get octave index - // TODO Interpolate octaves - size_t octave0 = clamp((int) std::trunc(octave), 0, (int) wavetable.octaves - 1); + float octaveF = octave - std::trunc(octave); + size_t octave0 = std::trunc(octave); + octave0 = std::min(octave0, wavetable.octaves - 1); + size_t octave1 = octave0 + 1; + // Linearly interpolate wave index - float out0 = crossfade(wavetable.interpolatedAt(octave0, pos0, index0), wavetable.interpolatedAt(octave0, pos0, index1), indexF); + float out = crossfade(wavetable.interpolatedAt(octave0, pos0, index0), wavetable.interpolatedAt(octave0, pos0, index1), indexF); + // Interpolate octave + // if (octaveF > 0.f && octave1 < wavetable.octaves) { + // float out1 = crossfade(wavetable.interpolatedAt(octave1, pos0, index0), wavetable.interpolatedAt(octave1, pos0, index1), indexF); + // out = crossfade(out, out1, octaveF); + // } // Linearly interpolate position if needed if (posF > 0.f) { float out1 = crossfade(wavetable.interpolatedAt(octave0, pos1, index0), wavetable.interpolatedAt(octave0, pos1, index1), indexF); - return crossfade(out0, out1, posF); - } - else { - return out0; + // Interpolate octave + // if (octaveF > 0.f && octave1 < wavetable.octaves) { + // float out2 = crossfade(wavetable.interpolatedAt(octave1, pos1, index0), wavetable.interpolatedAt(octave1, pos1, index1), indexF); + // out1 = crossfade(out1, out2, octaveF); + // } + out = crossfade(out, out1, posF); } + return out; } void process(const ProcessArgs& args) override {