Pulp 1.88.0
Cross-platform audio plugin framework
Loading...
Searching...
No Matches
dynamics_core.hpp
Go to the documentation of this file.
1#pragma once
2
108
109#include <algorithm>
110#include <cmath>
111
113
117inline double retain_finite(double candidate, double current) noexcept {
118 return std::isfinite(candidate) ? candidate : current;
119}
120
125inline constexpr double kLevelEpsilon = 1e-12;
126
127// ── Level conversion ──────────────────────────────────────────────────────
128
135inline double amplitude_db(double amplitude, double epsilon) {
136 return 20.0 * std::log10(std::abs(amplitude) + epsilon);
137}
138
146inline double power_db(double mean_square, double epsilon) {
147 return 10.0 * std::log10(mean_square + epsilon);
148}
149
150// ── Ballistics ────────────────────────────────────────────────────────────
151
155inline double one_pole_retain(double tau_seconds, double sample_rate) {
156 if (!(tau_seconds > 0.0) || !(sample_rate > 0.0)) return 0.0;
157 return std::exp(-1.0 / (tau_seconds * sample_rate));
158}
159
160// ── The soft-knee static characteristic (the paper's eq. 4) ───────────────
161
169inline double knee_term_db(double over_db, double knee_db, double slope) {
170 const double t = over_db + knee_db * 0.5;
171 return (slope - 1.0) * t * t / (2.0 * knee_db);
172}
173
193inline double soft_knee_output_db(double input_db, double threshold_db, double knee_db,
194 double ratio) {
195 const double over = input_db - threshold_db;
196 if (2.0 * over < -knee_db) return input_db;
197 if (knee_db > 0.0 && 2.0 * std::abs(over) <= knee_db)
198 return input_db + knee_term_db(over, knee_db, 1.0 / ratio);
199 return threshold_db + over / ratio;
200}
201
208inline double soft_knee_reduction_db(double over_db, double knee_db, double slope) {
209 if (knee_db > 0.0) {
210 if (2.0 * over_db <= -knee_db) return 0.0;
211 if (2.0 * over_db < knee_db) return knee_term_db(over_db, knee_db, slope);
212 } else if (over_db <= 0.0) {
213 return 0.0;
214 }
215 return (slope - 1.0) * over_db;
216}
217
218} // namespace pulp::signal::dynamics
Definition dynamics_core.hpp:112
double soft_knee_output_db(double input_db, double threshold_db, double knee_db, double ratio)
The characteristic in the OUTPUT-LEVEL domain: input dB → output dB.
Definition dynamics_core.hpp:193
double one_pole_retain(double tau_seconds, double sample_rate)
α = exp(−1/(τ·fs)) — the RETAIN coefficient (see the file doc block).
Definition dynamics_core.hpp:155
double knee_term_db(double over_db, double knee_db, double slope)
The knee branch's quadratic term: the dB the characteristic bends away from unity inside the knee,...
Definition dynamics_core.hpp:169
double soft_knee_reduction_db(double over_db, double knee_db, double slope)
The same characteristic in the GAIN-REDUCTION domain: dB over threshold → reduction in dB,...
Definition dynamics_core.hpp:208
double power_db(double mean_square, double epsilon)
A mean square → dB, floored by an addend.
Definition dynamics_core.hpp:146
double retain_finite(double candidate, double current) noexcept
Control setters retain their last valid value when automation supplies a non-finite sample.
Definition dynamics_core.hpp:117
double amplitude_db(double amplitude, double epsilon)
An amplitude → dB, floored by an ADDEND rather than a max().
Definition dynamics_core.hpp:135
constexpr double kLevelEpsilon
Level-conversion floor, guarding log10(0).
Definition dynamics_core.hpp:125
@ ratio
base_frequency_hz * ratio.
Definition fm_operator_engine.hpp:20
@ e
Definition formant_filter_bank.hpp:20