Added a width snippet that uses the pan LUT
This commit is contained in:
parent
992d20782f
commit
9783e393da
1 changed files with 31 additions and 9 deletions
|
|
@ -742,21 +742,30 @@ namespace _internals {
|
||||||
return pan;
|
return pan;
|
||||||
}();
|
}();
|
||||||
|
|
||||||
|
template <class T>
|
||||||
|
inline T panLookup(T pan)
|
||||||
|
{
|
||||||
|
// reduce range, round to nearest
|
||||||
|
int index = static_cast<int>(T{0.5} + pan * (panSize - 1));
|
||||||
|
return panData[index];
|
||||||
|
}
|
||||||
|
|
||||||
template <class T>
|
template <class T>
|
||||||
inline void snippetPan(const T*& pan, T*& left, T*& right)
|
inline void snippetPan(const T*& pan, T*& left, T*& right)
|
||||||
{
|
{
|
||||||
T p = ((*pan++) + T{1.0}) * T{0.5};
|
T p = ((*pan++) + T{1.0}) * T{0.5};
|
||||||
p = clamp<T>(p, 0, 1);
|
p = clamp<T>(p, 0, 1);
|
||||||
|
*left++ *= panLookup(p);
|
||||||
|
*right++ *= panLookup(1 - p);
|
||||||
|
}
|
||||||
|
|
||||||
auto lookUp = [](T pan) -> T
|
template <class T>
|
||||||
{
|
inline void snippetWidth(const T*& pan, T*& mid, T*& side)
|
||||||
// reduce range, round to nearest
|
{
|
||||||
int index = static_cast<int>(T{0.5} + pan * (panSize - 1));
|
T p = std::abs(*pan);
|
||||||
return panData[index];
|
p = clamp<T>(p, 0, 1);
|
||||||
};
|
*mid++ *= panLookup(p);
|
||||||
|
*side++ *= *pan++ > 0 ? panLookup(1 - p) : -panLookup(1 - p);
|
||||||
*left++ *= lookUp(p);
|
|
||||||
*right++ *= lookUp(1 - p);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -787,6 +796,19 @@ void pan(absl::Span<const T> panEnvelope, absl::Span<T> leftBuffer, absl::Span<T
|
||||||
template <>
|
template <>
|
||||||
void pan<float, true>(absl::Span<const float> panEnvelope, absl::Span<float> leftBuffer, absl::Span<float> rightBuffer) noexcept;
|
void pan<float, true>(absl::Span<const float> panEnvelope, absl::Span<float> leftBuffer, absl::Span<float> rightBuffer) noexcept;
|
||||||
|
|
||||||
|
template <class T, bool SIMD = SIMDConfig::pan>
|
||||||
|
void width(absl::Span<const T> widthEnvelope, absl::Span<T> midBuffer, absl::Span<T> 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
|
* @brief Computes the mean of a span
|
||||||
*
|
*
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue