diff --git a/src/sfizz/SIMDHelpers.h b/src/sfizz/SIMDHelpers.h index 2e217c3a..29e7f2ba 100644 --- a/src/sfizz/SIMDHelpers.h +++ b/src/sfizz/SIMDHelpers.h @@ -538,8 +538,8 @@ namespace _internals { template inline void snippetRampLinear(T*& output, T& value, T step) { - value += step; *output++ = value; + value += step; } } diff --git a/src/sfizz/SIMDSSE.cpp b/src/sfizz/SIMDSSE.cpp index 1b5c466c..d76e5528 100644 --- a/src/sfizz/SIMDSSE.cpp +++ b/src/sfizz/SIMDSSE.cpp @@ -461,7 +461,7 @@ float sfz::linearRamp(absl::Span output, float value, float while (unaligned(out) && out < lastAligned) _internals::snippetRampLinear(out, value, step); - auto mmValue = _mm_set1_ps(value); + auto mmValue = _mm_set1_ps(value - step); auto mmStep = _mm_set_ps(step + step + step + step, step + step + step, step + step, step); while (out < lastAligned) { @@ -471,7 +471,8 @@ float sfz::linearRamp(absl::Span output, float value, float out += TypeAlignment; } - value = _mm_cvtss_f32(mmValue); + value = _mm_cvtss_f32(mmValue) + step; + while (out < output.end()) _internals::snippetRampLinear(out, value, step); return value;