multiplicativeRamp behaves like linearRamp

This commit is contained in:
Paul Ferrand 2020-03-31 00:18:09 +02:00
parent 12cb0b5b43
commit 5412593da9
3 changed files with 5 additions and 5 deletions

View file

@ -566,8 +566,8 @@ namespace _internals {
template <class T> template <class T>
inline void snippetRampMultiplicative(T*& output, T& value, T step) inline void snippetRampMultiplicative(T*& output, T& value, T step)
{ {
value *= step;
*output++ = value; *output++ = value;
value *= step;
} }
} }

View file

@ -487,7 +487,7 @@ float sfz::multiplicativeRamp<float, true>(absl::Span<float> output, float value
while (unaligned(out) && out < lastAligned) while (unaligned(out) && out < lastAligned)
_internals::snippetRampMultiplicative<float>(out, value, step); _internals::snippetRampMultiplicative<float>(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); auto mmStep = _mm_set_ps(step * step * step * step, step * step * step, step * step, step);
while (out < lastAligned) { while (out < lastAligned) {
@ -497,7 +497,7 @@ float sfz::multiplicativeRamp<float, true>(absl::Span<float> output, float value
out += TypeAlignment; out += TypeAlignment;
} }
value = _mm_cvtss_f32(mmValue); value = _mm_cvtss_f32(mmValue) * step;
while (out < output.end()) while (out < output.end())
_internals::snippetRampMultiplicative<float>(out, value, step); _internals::snippetRampMultiplicative<float>(out, value, step);
return value; return value;

View file

@ -539,7 +539,7 @@ TEST_CASE("[Helpers] Multiplicative Ramp")
const float start { 1.0f }; const float start { 1.0f };
const float v { fillValue }; const float v { fillValue };
std::array<float, 6> output; std::array<float, 6> output;
std::array<float, 6> expected { v, v * v, v * v * v, v * v * v * v, v * v * v * v * v, v * v * v * v * v * v }; std::array<float, 6> expected { start, start * v, start * v * v, start * v * v * v, start * v * v * v * v, start * v * v * v * v * v };
sfz::multiplicativeRamp<float, false>(absl::MakeSpan(output), start, v); sfz::multiplicativeRamp<float, false>(absl::MakeSpan(output), start, v);
REQUIRE(approxEqual<float>(output, expected)); REQUIRE(approxEqual<float>(output, expected));
} }
@ -549,7 +549,7 @@ TEST_CASE("[Helpers] Multiplicative Ramp (SIMD)")
const float start { 1.0f }; const float start { 1.0f };
const float v { fillValue }; const float v { fillValue };
std::array<float, 6> output; std::array<float, 6> output;
std::array<float, 6> expected { v, v * v, v * v * v, v * v * v * v, v * v * v * v * v, v * v * v * v * v * v }; std::array<float, 6> expected { start, start * v, start * v * v, start * v * v * v, start * v * v * v * v, start * v * v * v * v * v };
sfz::multiplicativeRamp<float, true>(absl::MakeSpan(output), start, v); sfz::multiplicativeRamp<float, true>(absl::MakeSpan(output), start, v);
REQUIRE(approxEqual<float>(output, expected)); REQUIRE(approxEqual<float>(output, expected));
} }