Classes | |
| struct | ParamSpec |
| struct | ModeConfig |
| class | AllpassStage |
| class | AllpassCascade |
| class | SanitizedBiquadState |
| class | FracDelayT |
| class | HermiteHistory |
| struct | EqBand |
| class | LoopEq |
| class | FluxBank |
| class | XorShift32 |
| class | MeanRevertingWalk |
| class | PhaseOsc |
| class | QuadratureBank |
| class | DelayModulationBank |
| class | PositionRing |
| class | ButterworthPair |
| class | ButterworthState |
| class | StereoPositionRing |
| struct | StereoSection |
| struct | StereoSectionLanes |
| class | StereoBiquadState |
| class | MultirateBridge |
| class | ShimmerBank |
| class | TransientDucker |
| class | EnsembleChorus |
| struct | TankControls |
| class | FdnTank |
Typedefs | |
| using | FracDelay = FracDelayT<float> |
Enumerations | |
| enum class | Tier { network = 0 , classic } |
| enum class | Param { decay = 0 , size , predelay , damp_hi , damp_lo , diffusion , mod , shimmer , drive , bloom , width , tank_rate , count } |
| enum class | Mode { room = 0 , hall , galaxy , shimmer , lofi , count } |
Functions | |
| constexpr const ModeConfig & | mode_config (Mode m) |
| constexpr double | mode_default (Mode mode, Param param) |
| double | hermite4 (double y0, double y1, double y2, double y3, double t) |
| template<typename T> | |
| T | hermite4_t (T y0, T y1, T y2, T y3, T t) |
| std::array< EqBand, kNumEqBands > | default_eq_bands () |
| double | mod_depth_shrink (double decay_seconds) |
| template<typename T> | |
| T | finite_or_zero (T value) |
| void | apply_width (double &l, double &r, double width) |
| double | soft_limit (double x) |
| float | tanh_rational (float x) |
| float | soft_limit (float x) |
| double | bloom_authority (double decay_seconds) |
| template<typename T> | |
| void | hadamard16 (std::array< T, kNumChannels > &v) |
| template<typename T> | |
| T | post_hadamard_guard (T value) |
| double | damping_state_step (double input, double coefficient, double &state) |
| double | lipschitz_tanh (double v) noexcept |
| A [3/2] Padé tanh that is 1-LIPSCHITZ and bounded — the saturator to reach for inside a feedback loop. | |
Variables | |
| constexpr int | kNumChannels = 16 |
| constexpr int | kMaxDiffusionStages = 8 |
| constexpr int | kNumEqBands = 10 |
| constexpr int | kNumShimmerGrains = 4 |
| constexpr int | kNumEnsembleLfos = 6 |
| constexpr std::array< int, kNumChannels > | kChannelPrimes |
| constexpr std::array< double, 8 > | kTankRates |
| constexpr int | kNumTankRates = static_cast<int>(kTankRates.size()) |
| constexpr double | kMaxTankRate = 96000.0 |
| constexpr std::array< double, 8 > | kRateMakeupDb |
| constexpr double | kDelayMinSeconds = 0.010 |
| constexpr double | kDelayMaxSeconds = 0.090 |
| constexpr double | kSizeScaleMin = 0.5 |
| constexpr double | kSizeScaleMax = 5.0 / 3.0 |
| constexpr double | kDelayExponent = 2.0 |
| constexpr int | kPreDiffusionStages = 4 |
| constexpr int | kLoopDiffusionStages = 4 |
| constexpr double | kPreDiffusionG = 0.70 |
| constexpr double | kLoopDiffusionG = 0.45 |
| constexpr double | kPreDiffusionBaseMs = 12.0 |
| constexpr double | kLoopDiffusionBaseMs = 7.0 |
| constexpr double | kDiffusionStageShrink = 0.70710678118654752 |
| constexpr double | kFlutterDepth = 0.02 |
| constexpr double | kFlutterRateMinHz = 0.13 |
| constexpr double | kFlutterRateMaxHz = 0.71 |
| constexpr double | kModSineMix = 0.6 |
| constexpr double | kModWalkMix = 0.4 |
| constexpr double | kModRateMinHz = 0.10 |
| constexpr double | kModRateMaxHz = 1.50 |
| constexpr double | kModMaxFraction = 0.0035 |
| constexpr double | kModShrinkFullSeconds = 2.0 |
| constexpr double | kModShrinkMinSeconds = 20.0 |
| constexpr double | kModShrinkFloor = 0.25 |
| constexpr double | kWalkReversion = 0.004 |
| constexpr double | kWalkStep = 0.09 |
| constexpr double | kDampingScale = 1.0 |
| constexpr double | kDampHiMinHz = 1200.0 |
| constexpr double | kDampHiMaxHz = 192000.0 |
| constexpr double | kDampLoMinHz = 10.0 |
| constexpr double | kDampLoMaxHz = 500.0 |
| constexpr double | kDampCurve = 1.6 |
| constexpr double | kFluxMaxDb = 3.0 |
| constexpr double | kFluxDefaultDb = 0.5 |
| constexpr double | kFluxBaseMinHz = 300.0 |
| constexpr double | kFluxBaseMaxHz = 6000.0 |
| constexpr double | kFluxSpreadOctaves = 0.7 |
| constexpr double | kFluxIntervalMinMs = 120.0 |
| constexpr double | kFluxIntervalMaxMs = 250.0 |
| constexpr double | kFluxGlideMs = 90.0 |
| constexpr double | kFluxQ = 8.0 |
| constexpr double | kShimmerGrainMinMs = 40.0 |
| constexpr double | kShimmerGrainMaxMs = 60.0 |
| constexpr double | kShimmerToneHz = 8000.0 |
| constexpr double | kShimmerMaxWeight = 0.6 |
| constexpr double | kGainCeil = 0.999 |
| constexpr double | kBloomAuthorityMinSeconds = 1.0 |
| constexpr double | kBloomAuthorityMaxSeconds = 20.0 |
| constexpr double | kDuckFastMs = 3.0 |
| constexpr double | kDuckSlowMs = 40.0 |
| constexpr double | kDuckAmount = 0.3 |
| constexpr double | kDuckKnee = 1.5 |
| constexpr double | kEnsembleBaseMs = 5.0 |
| constexpr double | kEnsembleDepthMs = 1.6 |
| constexpr double | kEnsembleRateMinHz = 0.11 |
| constexpr double | kEnsembleRateMaxHz = 0.83 |
| constexpr double | kEnsembleWetMix = 0.35 |
| constexpr double | kDriveMakeupDb = 3.0 |
| constexpr double | kWetLimiterHeadroom = 2.0 |
| constexpr double | kButterworthQ0 = 0.5412 |
| constexpr double | kButterworthQ1 = 1.3065 |
| constexpr double | kAaCutoffFraction = 0.45 |
| constexpr int | kHermiteGuard = 8 |
| constexpr double | kTankInputLpThresholdHz = 18000.0 |
| constexpr double | kTankInputLpFraction = 0.42 |
| constexpr double | kPostHadamardCeil = 4.0 |
| constexpr double | kSanityCeil = 10.0 |
| constexpr double | kSmoothingMs = 5.0 |
| constexpr int | kControlRateSamples = 32 |
| constexpr int | kMaxBlockSamples = kControlRateSamples |
| constexpr int | kHealIntervalSamples = 32 |
| constexpr std::size_t | kRingStaggerSamples = 37 * 16 |
| constexpr int | kOscReanchorSamples = 4096 |
| constexpr int | kNumParams = static_cast<int>(Param::count) |
| constexpr std::array< ParamSpec, kNumParams > | kParamSpecs |
| constexpr int | kNumModes = static_cast<int>(Mode::count) |
| constexpr std::array< ModeConfig, kNumModes > | kModeConfigs |
| using pulp::signal::fdn::FracDelay = FracDelayT<float> |
|
strong |
|
strong |
|
strong |
|
inline |
|
inline |
|
inline |
|
inline |
|
inline |
|
inline |
|
inline |
|
inline |
|
inlinenoexcept |
A [3/2] Padé tanh that is 1-LIPSCHITZ and bounded — the saturator to reach for inside a feedback loop.
This is a different curve from FastMath::tanh, not a cheaper one, and the difference is the whole reason it exists. FastMath::tanh chases fidelity to std::tanh; this one is chosen for a property. Its derivative is (x^2-9)^2 / (9(3+x^2)^2), which is exactly 1 at the origin and strictly below 1 everywhere else, so it can never amplify — and the clamp at the point where the curve reaches unity (f(3) = 1 exactly) makes it bounded as well, without breaking that slope bound.
Inside a recursion those two properties are load-bearing. A saturator with small-signal gain above 1 (tanh(k*x) for k > 1 is the usual way to get one) silently raises the loop gain with it, which turns a decay-time control into a stability question; an unbounded one lets a self-oscillating loop settle only by growing more slowly than it decays. Two modules derived this same curve independently for those reasons — the character delay's dub feedback and the FDN reverb's in-loop drive — so it is defined once, here.
|
inline |
|
inlineconstexpr |
|
inline |
|
inline |
|
inline |
|
inline |
|
inlineconstexpr |
|
inlineconstexpr |
|
inlineconstexpr |
|
inlineconstexpr |
|
inlineconstexpr |
|
inlineconstexpr |
|
inlineconstexpr |
|
inlineconstexpr |
|
inlineconstexpr |
|
inlineconstexpr |
|
inlineconstexpr |
|
inlineconstexpr |
|
inlineconstexpr |
|
inlineconstexpr |
|
inlineconstexpr |
|
inlineconstexpr |
|
inlineconstexpr |
|
inlineconstexpr |
|
inlineconstexpr |
|
inlineconstexpr |
|
inlineconstexpr |
|
inlineconstexpr |
|
inlineconstexpr |
|
inlineconstexpr |
|
inlineconstexpr |
|
inlineconstexpr |
|
inlineconstexpr |
|
inlineconstexpr |
|
inlineconstexpr |
|
inlineconstexpr |
|
inlineconstexpr |
|
inlineconstexpr |
|
inlineconstexpr |
|
inlineconstexpr |
|
inlineconstexpr |
|
inlineconstexpr |
|
inlineconstexpr |
|
inlineconstexpr |
|
inlineconstexpr |
|
inlineconstexpr |
|
inlineconstexpr |
|
inlineconstexpr |
|
inlineconstexpr |
|
inlineconstexpr |
|
inlineconstexpr |
|
inlineconstexpr |
|
inlineconstexpr |
|
inlineconstexpr |
|
inlineconstexpr |
|
inlineconstexpr |
|
inlineconstexpr |
|
inlineconstexpr |
|
inlineconstexpr |
|
inlineconstexpr |
|
inlineconstexpr |
|
inlineconstexpr |
|
inlineconstexpr |
|
inlineconstexpr |
|
inlineconstexpr |
|
inlineconstexpr |
|
inlineconstexpr |
|
inlineconstexpr |
|
inlineconstexpr |
|
inlineconstexpr |
|
inlineconstexpr |
|
inlineconstexpr |
|
inlineconstexpr |
|
inlineconstexpr |
|
inlineconstexpr |
|
inlineconstexpr |
|
inlineconstexpr |
|
inlineconstexpr |
|
inlineconstexpr |
|
inlineconstexpr |
|
inlineconstexpr |
|
inlineconstexpr |
|
inlineconstexpr |
|
inlineconstexpr |
|
inlineconstexpr |
|
inlineconstexpr |
|
inlineconstexpr |
|
inlineconstexpr |
|
inlineconstexpr |
|
inlineconstexpr |
|
inlineconstexpr |
|
inlineconstexpr |