Pulp 1.88.0
Cross-platform audio plugin framework
Loading...
Searching...
No Matches
nway_crossfade.hpp
Go to the documentation of this file.
1#pragma once
2
3#include "crossfade.hpp"
4
5#include <algorithm>
6#include <cmath>
7#include <cstddef>
8#include <limits>
9#include <span>
10#include <type_traits>
11
12namespace pulp::signal {
13
17template <typename SampleType>
18inline bool nway_constant_power_gains(SampleType position, std::span<SampleType> gains) noexcept {
19 static_assert(std::is_floating_point_v<SampleType>);
20 static_assert(std::numeric_limits<SampleType>::max_exponent >
21 std::numeric_limits<std::size_t>::digits);
22 if (gains.empty())
23 return false;
24 std::fill(gains.begin(), gains.end(), SampleType{0});
25 if (!std::isfinite(position))
26 position = SampleType{0};
27 if (position <= SampleType{0}) {
28 gains.front() = SampleType{1};
29 return true;
30 }
31 const auto size_exclusive = std::ldexp(SampleType{1}, std::numeric_limits<std::size_t>::digits);
32 if (position >= size_exclusive) {
33 gains.back() = SampleType{1};
34 return true;
35 }
36 const auto lower = static_cast<std::size_t>(position);
37 if (lower >= gains.size() - 1) {
38 gains.back() = SampleType{1};
39 return true;
40 }
41 const auto fraction = position - static_cast<SampleType>(lower);
42 crossfade_gains(fraction, CrossfadeGainLaw::EqualPower, gains[lower], gains[lower + 1]);
43 return true;
44}
45
46} // namespace pulp::signal
The one shared old→new crossfade gain law for the SIGNAL side.
Definition additive_bank.hpp:218
bool nway_constant_power_gains(SampleType position, std::span< SampleType > gains) noexcept
Compute adjacent-path constant-power weights for a position in [0, N-1].
Definition nway_crossfade.hpp:18
@ EqualPower
(cos(u·π/2), sin(u·π/2)) — power sum == 1.
Definition crossfade.hpp:43
void crossfade_gains(T u, CrossfadeGainLaw law, T &old_gain, T &new_gain) noexcept
Old/new blend gains for an ALREADY-SHAPED progress u (the caller applies any smoothstep/clamp first).
Definition crossfade.hpp:61