From 9783e393da99b15530a67569386554b5d4b0c04f Mon Sep 17 00:00:00 2001 From: Paul Fd Date: Sun, 9 Feb 2020 23:38:50 +0100 Subject: [PATCH] Added a width snippet that uses the pan LUT --- src/sfizz/SIMDHelpers.h | 40 +++++++++++++++++++++++++++++++--------- 1 file changed, 31 insertions(+), 9 deletions(-) diff --git a/src/sfizz/SIMDHelpers.h b/src/sfizz/SIMDHelpers.h index 0fada489..fea1404e 100644 --- a/src/sfizz/SIMDHelpers.h +++ b/src/sfizz/SIMDHelpers.h @@ -742,21 +742,30 @@ namespace _internals { return pan; }(); + template + inline T panLookup(T pan) + { + // reduce range, round to nearest + int index = static_cast(T{0.5} + pan * (panSize - 1)); + return panData[index]; + } + template inline void snippetPan(const T*& pan, T*& left, T*& right) { T p = ((*pan++) + T{1.0}) * T{0.5}; p = clamp(p, 0, 1); + *left++ *= panLookup(p); + *right++ *= panLookup(1 - p); + } - auto lookUp = [](T pan) -> T - { - // reduce range, round to nearest - int index = static_cast(T{0.5} + pan * (panSize - 1)); - return panData[index]; - }; - - *left++ *= lookUp(p); - *right++ *= lookUp(1 - p); + template + inline void snippetWidth(const T*& pan, T*& mid, T*& side) + { + T p = std::abs(*pan); + p = clamp(p, 0, 1); + *mid++ *= panLookup(p); + *side++ *= *pan++ > 0 ? panLookup(1 - p) : -panLookup(1 - p); } } @@ -787,6 +796,19 @@ void pan(absl::Span panEnvelope, absl::Span leftBuffer, absl::Span void pan(absl::Span panEnvelope, absl::Span leftBuffer, absl::Span rightBuffer) noexcept; +template +void width(absl::Span widthEnvelope, absl::Span midBuffer, absl::Span sideBuffer) noexcept +{ + ASSERT(midBuffer.size() >= widthEnvelope.size()); + ASSERT(sideBuffer.size() >= widthEnvelope.size()); + auto* width = widthEnvelope.begin(); + auto* mid = midBuffer.begin(); + auto* side = sideBuffer.begin(); + auto* sentinel = width + min(widthEnvelope.size(), midBuffer.size(), sideBuffer.size()); + while (width < sentinel) + _internals::snippetWidth(width, mid, side); +} + /** * @brief Computes the mean of a span *