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;
|
||||
}();
|
||||
|
||||
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>
|
||||
inline void snippetPan(const T*& pan, T*& left, T*& right)
|
||||
{
|
||||
T p = ((*pan++) + T{1.0}) * T{0.5};
|
||||
p = clamp<T>(p, 0, 1);
|
||||
*left++ *= panLookup(p);
|
||||
*right++ *= panLookup(1 - p);
|
||||
}
|
||||
|
||||
auto lookUp = [](T pan) -> T
|
||||
{
|
||||
// reduce range, round to nearest
|
||||
int index = static_cast<int>(T{0.5} + pan * (panSize - 1));
|
||||
return panData[index];
|
||||
};
|
||||
|
||||
*left++ *= lookUp(p);
|
||||
*right++ *= lookUp(1 - p);
|
||||
template <class T>
|
||||
inline void snippetWidth(const T*& pan, T*& mid, T*& side)
|
||||
{
|
||||
T p = std::abs(*pan);
|
||||
p = clamp<T>(p, 0, 1);
|
||||
*mid++ *= panLookup(p);
|
||||
*side++ *= *pan++ > 0 ? panLookup(1 - p) : -panLookup(1 - p);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -787,6 +796,19 @@ void pan(absl::Span<const T> panEnvelope, absl::Span<T> leftBuffer, absl::Span<T
|
|||
template <>
|
||||
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
|
||||
*
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue