Pulp 1.88.0
Cross-platform audio plugin framework
Loading...
Searching...
No Matches
pulp::signal::fdn Namespace Reference

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

Typedef Documentation

◆ FracDelay

Enumeration Type Documentation

◆ Mode

enum class pulp::signal::fdn::Mode
strong
Enumerator
room 
hall 
galaxy 
shimmer 
lofi 
count 

◆ Param

enum class pulp::signal::fdn::Param
strong
Enumerator
decay 
size 
predelay 
damp_hi 
damp_lo 
diffusion 
mod 
shimmer 
drive 
bloom 
width 
tank_rate 
count 

◆ Tier

enum class pulp::signal::fdn::Tier
strong
Enumerator
network 
classic 

Function Documentation

◆ apply_width()

void pulp::signal::fdn::apply_width ( double & l,
double & r,
double width )
inline

◆ bloom_authority()

double pulp::signal::fdn::bloom_authority ( double decay_seconds)
inline

◆ damping_state_step()

double pulp::signal::fdn::damping_state_step ( double input,
double coefficient,
double & state )
inline

◆ default_eq_bands()

std::array< EqBand, kNumEqBands > pulp::signal::fdn::default_eq_bands ( )
inline

◆ finite_or_zero()

template<typename T>
T pulp::signal::fdn::finite_or_zero ( T value)
inline

◆ hadamard16()

template<typename T>
void pulp::signal::fdn::hadamard16 ( std::array< T, kNumChannels > & v)
inline

◆ hermite4()

double pulp::signal::fdn::hermite4 ( double y0,
double y1,
double y2,
double y3,
double t )
inline

◆ hermite4_t()

template<typename T>
T pulp::signal::fdn::hermite4_t ( T y0,
T y1,
T y2,
T y3,
T t )
inline

◆ lipschitz_tanh()

double pulp::signal::lipschitz_tanh ( double v)
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.

◆ mod_depth_shrink()

double pulp::signal::fdn::mod_depth_shrink ( double decay_seconds)
inline

◆ mode_config()

const ModeConfig & pulp::signal::fdn::mode_config ( Mode m)
inlineconstexpr

◆ mode_default()

double pulp::signal::fdn::mode_default ( Mode mode,
Param param )
inlineconstexpr

◆ post_hadamard_guard()

template<typename T>
T pulp::signal::fdn::post_hadamard_guard ( T value)
inline

◆ soft_limit() [1/2]

double pulp::signal::fdn::soft_limit ( double x)
inline

◆ soft_limit() [2/2]

float pulp::signal::fdn::soft_limit ( float x)
inline

◆ tanh_rational()

float pulp::signal::fdn::tanh_rational ( float x)
inline

Variable Documentation

◆ kAaCutoffFraction

double pulp::signal::fdn::kAaCutoffFraction = 0.45
inlineconstexpr

◆ kBloomAuthorityMaxSeconds

double pulp::signal::fdn::kBloomAuthorityMaxSeconds = 20.0
inlineconstexpr

◆ kBloomAuthorityMinSeconds

double pulp::signal::fdn::kBloomAuthorityMinSeconds = 1.0
inlineconstexpr

◆ kButterworthQ0

double pulp::signal::fdn::kButterworthQ0 = 0.5412
inlineconstexpr

◆ kButterworthQ1

double pulp::signal::fdn::kButterworthQ1 = 1.3065
inlineconstexpr

◆ kChannelPrimes

std::array<int, kNumChannels> pulp::signal::fdn::kChannelPrimes
inlineconstexpr
Initial value:
= {
2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53}

◆ kControlRateSamples

int pulp::signal::fdn::kControlRateSamples = 32
inlineconstexpr

◆ kDampCurve

double pulp::signal::fdn::kDampCurve = 1.6
inlineconstexpr

◆ kDampHiMaxHz

double pulp::signal::fdn::kDampHiMaxHz = 192000.0
inlineconstexpr

◆ kDampHiMinHz

double pulp::signal::fdn::kDampHiMinHz = 1200.0
inlineconstexpr

◆ kDampingScale

double pulp::signal::fdn::kDampingScale = 1.0
inlineconstexpr

◆ kDampLoMaxHz

double pulp::signal::fdn::kDampLoMaxHz = 500.0
inlineconstexpr

◆ kDampLoMinHz

double pulp::signal::fdn::kDampLoMinHz = 10.0
inlineconstexpr

◆ kDelayExponent

double pulp::signal::fdn::kDelayExponent = 2.0
inlineconstexpr

◆ kDelayMaxSeconds

double pulp::signal::fdn::kDelayMaxSeconds = 0.090
inlineconstexpr

◆ kDelayMinSeconds

double pulp::signal::fdn::kDelayMinSeconds = 0.010
inlineconstexpr

◆ kDiffusionStageShrink

double pulp::signal::fdn::kDiffusionStageShrink = 0.70710678118654752
inlineconstexpr

◆ kDriveMakeupDb

double pulp::signal::fdn::kDriveMakeupDb = 3.0
inlineconstexpr

◆ kDuckAmount

double pulp::signal::fdn::kDuckAmount = 0.3
inlineconstexpr

◆ kDuckFastMs

double pulp::signal::fdn::kDuckFastMs = 3.0
inlineconstexpr

◆ kDuckKnee

double pulp::signal::fdn::kDuckKnee = 1.5
inlineconstexpr

◆ kDuckSlowMs

double pulp::signal::fdn::kDuckSlowMs = 40.0
inlineconstexpr

◆ kEnsembleBaseMs

double pulp::signal::fdn::kEnsembleBaseMs = 5.0
inlineconstexpr

◆ kEnsembleDepthMs

double pulp::signal::fdn::kEnsembleDepthMs = 1.6
inlineconstexpr

◆ kEnsembleRateMaxHz

double pulp::signal::fdn::kEnsembleRateMaxHz = 0.83
inlineconstexpr

◆ kEnsembleRateMinHz

double pulp::signal::fdn::kEnsembleRateMinHz = 0.11
inlineconstexpr

◆ kEnsembleWetMix

double pulp::signal::fdn::kEnsembleWetMix = 0.35
inlineconstexpr

◆ kFlutterDepth

double pulp::signal::fdn::kFlutterDepth = 0.02
inlineconstexpr

◆ kFlutterRateMaxHz

double pulp::signal::fdn::kFlutterRateMaxHz = 0.71
inlineconstexpr

◆ kFlutterRateMinHz

double pulp::signal::fdn::kFlutterRateMinHz = 0.13
inlineconstexpr

◆ kFluxBaseMaxHz

double pulp::signal::fdn::kFluxBaseMaxHz = 6000.0
inlineconstexpr

◆ kFluxBaseMinHz

double pulp::signal::fdn::kFluxBaseMinHz = 300.0
inlineconstexpr

◆ kFluxDefaultDb

double pulp::signal::fdn::kFluxDefaultDb = 0.5
inlineconstexpr

◆ kFluxGlideMs

double pulp::signal::fdn::kFluxGlideMs = 90.0
inlineconstexpr

◆ kFluxIntervalMaxMs

double pulp::signal::fdn::kFluxIntervalMaxMs = 250.0
inlineconstexpr

◆ kFluxIntervalMinMs

double pulp::signal::fdn::kFluxIntervalMinMs = 120.0
inlineconstexpr

◆ kFluxMaxDb

double pulp::signal::fdn::kFluxMaxDb = 3.0
inlineconstexpr

◆ kFluxQ

double pulp::signal::fdn::kFluxQ = 8.0
inlineconstexpr

◆ kFluxSpreadOctaves

double pulp::signal::fdn::kFluxSpreadOctaves = 0.7
inlineconstexpr

◆ kGainCeil

double pulp::signal::fdn::kGainCeil = 0.999
inlineconstexpr

◆ kHealIntervalSamples

int pulp::signal::fdn::kHealIntervalSamples = 32
inlineconstexpr

◆ kHermiteGuard

int pulp::signal::fdn::kHermiteGuard = 8
inlineconstexpr

◆ kLoopDiffusionBaseMs

double pulp::signal::fdn::kLoopDiffusionBaseMs = 7.0
inlineconstexpr

◆ kLoopDiffusionG

double pulp::signal::fdn::kLoopDiffusionG = 0.45
inlineconstexpr

◆ kLoopDiffusionStages

int pulp::signal::fdn::kLoopDiffusionStages = 4
inlineconstexpr

◆ kMaxBlockSamples

int pulp::signal::fdn::kMaxBlockSamples = kControlRateSamples
inlineconstexpr

◆ kMaxDiffusionStages

int pulp::signal::fdn::kMaxDiffusionStages = 8
inlineconstexpr

◆ kMaxTankRate

double pulp::signal::fdn::kMaxTankRate = 96000.0
inlineconstexpr

◆ kModeConfigs

std::array<ModeConfig, kNumModes> pulp::signal::fdn::kModeConfigs
inlineconstexpr
Initial value:
= {{
{"room", 0.8, 0.35, 5, 0.75, 0.30, 0.00, 0.00, 0.50, 0.15, 0.00, 16000.0},
{"hall", 2.8, 0.65, 4, 0.70, 0.35, 0.00, 0.20, 0.40, 0.10, 0.00, 14000.0},
{"galaxy", 12.0, 0.90, 3, 0.60, 0.50, 0.15, 0.70, 0.25, 0.05, 0.10, 12000.0},
{"shimmer", 6.0, 0.70, 4, 0.65, 0.40, 0.60, 0.40, 0.30, 0.10, 0.00, 15000.0},
{"lofi", 1.6, 0.45, 0, 0.55, 0.25, 0.00, 0.00, 0.70, 0.20, 0.35, 7000.0},
}}

◆ kModMaxFraction

double pulp::signal::fdn::kModMaxFraction = 0.0035
inlineconstexpr

◆ kModRateMaxHz

double pulp::signal::fdn::kModRateMaxHz = 1.50
inlineconstexpr

◆ kModRateMinHz

double pulp::signal::fdn::kModRateMinHz = 0.10
inlineconstexpr

◆ kModShrinkFloor

double pulp::signal::fdn::kModShrinkFloor = 0.25
inlineconstexpr

◆ kModShrinkFullSeconds

double pulp::signal::fdn::kModShrinkFullSeconds = 2.0
inlineconstexpr

◆ kModShrinkMinSeconds

double pulp::signal::fdn::kModShrinkMinSeconds = 20.0
inlineconstexpr

◆ kModSineMix

double pulp::signal::fdn::kModSineMix = 0.6
inlineconstexpr

◆ kModWalkMix

double pulp::signal::fdn::kModWalkMix = 0.4
inlineconstexpr

◆ kNumChannels

int pulp::signal::fdn::kNumChannels = 16
inlineconstexpr

◆ kNumEnsembleLfos

int pulp::signal::fdn::kNumEnsembleLfos = 6
inlineconstexpr

◆ kNumEqBands

int pulp::signal::fdn::kNumEqBands = 10
inlineconstexpr

◆ kNumModes

int pulp::signal::fdn::kNumModes = static_cast<int>(Mode::count)
inlineconstexpr

◆ kNumParams

int pulp::signal::fdn::kNumParams = static_cast<int>(Param::count)
inlineconstexpr

◆ kNumShimmerGrains

int pulp::signal::fdn::kNumShimmerGrains = 4
inlineconstexpr

◆ kNumTankRates

int pulp::signal::fdn::kNumTankRates = static_cast<int>(kTankRates.size())
inlineconstexpr

◆ kOscReanchorSamples

int pulp::signal::fdn::kOscReanchorSamples = 4096
inlineconstexpr

◆ kParamSpecs

std::array<ParamSpec, kNumParams> pulp::signal::fdn::kParamSpecs
inlineconstexpr
Initial value:
= {{
{"decay", 0.1, 60.0, 2.5, false},
{"size", 0.0, 1.0, 0.5, false},
{"predelay", 0.0, 250.0, 10.0, false},
{"damp_hi", 0.0, 1.0, 0.4, false},
{"damp_lo", 0.0, 1.0, 0.1, false},
{"diffusion", 0.0, 1.0, 0.7, false},
{"mod", 0.0, 1.0, 0.35, false},
{"shimmer", 0.0, 1.0, 0.0, false},
{"drive", 0.0, 1.0, 0.0, false},
{"bloom", 0.0, 1.0, 0.0, false},
{"width", 0.0, 1.0, 1.0, false},
{"tank_rate", 0.0, 7.0, 1.0, true},
}}

◆ kPostHadamardCeil

double pulp::signal::fdn::kPostHadamardCeil = 4.0
inlineconstexpr

◆ kPreDiffusionBaseMs

double pulp::signal::fdn::kPreDiffusionBaseMs = 12.0
inlineconstexpr

◆ kPreDiffusionG

double pulp::signal::fdn::kPreDiffusionG = 0.70
inlineconstexpr

◆ kPreDiffusionStages

int pulp::signal::fdn::kPreDiffusionStages = 4
inlineconstexpr

◆ kRateMakeupDb

std::array<double, 8> pulp::signal::fdn::kRateMakeupDb
inlineconstexpr
Initial value:
= {
2.01, 1.42, 0.92, 0.35, 0.06, 0.00, 0.21, 0.26}

◆ kRingStaggerSamples

std::size_t pulp::signal::fdn::kRingStaggerSamples = 37 * 16
inlineconstexpr

◆ kSanityCeil

double pulp::signal::fdn::kSanityCeil = 10.0
inlineconstexpr

◆ kShimmerGrainMaxMs

double pulp::signal::fdn::kShimmerGrainMaxMs = 60.0
inlineconstexpr

◆ kShimmerGrainMinMs

double pulp::signal::fdn::kShimmerGrainMinMs = 40.0
inlineconstexpr

◆ kShimmerMaxWeight

double pulp::signal::fdn::kShimmerMaxWeight = 0.6
inlineconstexpr

◆ kShimmerToneHz

double pulp::signal::fdn::kShimmerToneHz = 8000.0
inlineconstexpr

◆ kSizeScaleMax

double pulp::signal::fdn::kSizeScaleMax = 5.0 / 3.0
inlineconstexpr

◆ kSizeScaleMin

double pulp::signal::fdn::kSizeScaleMin = 0.5
inlineconstexpr

◆ kSmoothingMs

double pulp::signal::fdn::kSmoothingMs = 5.0
inlineconstexpr

◆ kTankInputLpFraction

double pulp::signal::fdn::kTankInputLpFraction = 0.42
inlineconstexpr

◆ kTankInputLpThresholdHz

double pulp::signal::fdn::kTankInputLpThresholdHz = 18000.0
inlineconstexpr

◆ kTankRates

std::array<double, 8> pulp::signal::fdn::kTankRates
inlineconstexpr
Initial value:
= {
16000.0, 20000.0, 24000.0, 32000.0, 44100.0, 48000.0, 64000.0, 96000.0}

◆ kWalkReversion

double pulp::signal::fdn::kWalkReversion = 0.004
inlineconstexpr

◆ kWalkStep

double pulp::signal::fdn::kWalkStep = 0.09
inlineconstexpr

◆ kWetLimiterHeadroom

double pulp::signal::fdn::kWetLimiterHeadroom = 2.0
inlineconstexpr