Pulp 1.88.0
Cross-platform audio plugin framework
Loading...
Searching...
No Matches
tables.hpp
Go to the documentation of this file.
1#pragma once
2
3// Calibration tables for the multi-character delay.
4//
5// This file is the module's tuning surface. Every value that was CHOSEN rather
6// than derived sits here as a named constant on a knot table, so retuning the
7// module by ear — or replacing a table wholesale with values measured from a
8// real machine — is a data edit that touches no DSP logic. Nothing in this
9// file is transcribed from another framework's source or from unpublished
10// measurements; the mechanisms are from the open literature (see the module
11// header for the concept-to-citation map) and the numbers are our own starting
12// points.
13//
14// Values that are NOT design parameters — published physical or mathematical
15// constants — are marked as such inline and are not knot tables: they are facts
16// (chip stage counts, the 50 µs emphasis time constant, Butterworth pole Qs,
17// γ-Fe2O3 material constants, Dattorro's published diffuser network) and moving
18// them would make the model wrong rather than differently tuned.
19
21
22#include <array>
23#include <cstddef>
24#include <cstdint>
25
27
28// ── Engine-wide ───────────────────────────────────────────────────────────
29
32inline constexpr double kMaxDelayMs = 2000.0;
33inline constexpr double kTimeOffsetMin = 0.5;
34inline constexpr double kTimeOffsetMax = 1.5;
36
40inline constexpr int kControlInterval = 32;
41
44inline constexpr double kParamGlideS = 0.005;
45
49inline constexpr double kUnsaturatedFeedbackMax = 0.98;
50
54inline constexpr double kSaturatedFeedbackMax = 1.1;
55
58inline constexpr double kModRateMinHz = 0.05;
59inline constexpr double kModRateMaxHz = 10.0;
60inline constexpr double kModMaxDepth = 0.05;
61
70inline constexpr double kLoopToneHpMinHz = 20.0;
71inline constexpr double kLoopToneHpMaxHz = 2000.0;
72inline constexpr double kLoopToneLpMinHz = 200.0;
73inline constexpr double kLoopToneLpMaxHz = 20000.0;
76inline constexpr double kLoopToneNyquistFraction = 0.45;
82inline constexpr double kLoopToneResMin = 0.5;
83inline constexpr double kLoopToneResMax = 2.0;
84
88inline constexpr double kStereoDecorr = 0.95;
89
92inline constexpr std::uint32_t kPrngSeed = 74207u;
93
94// ── Delay-time slew, per character ────────────────────────────────────────
95// The character's transport inertia, in milliseconds. Every character reads
96// through a slewed continuous time, so a time change produces the physically
97// correct pitch glide; there is deliberately no crossfade-jump path anywhere.
98// [all design parameters]
99inline constexpr double kTimeSlewCleanMs = 15.0; // 5–30, de-zipper only
100inline constexpr double kTimeSlewVintageMs = 50.0; // 30–80, clock glide
101inline constexpr double kTimeSlewTapeMs = 250.0; // 150–400, motor/capstan lag
102inline constexpr double kTimeSlewBbdMs = 80.0; // 50–150, clock glide
103inline constexpr double kTimeSlewDiffusionMs = 15.0; // 5–30, de-zipper only
104
105// ── Clean Modern ──────────────────────────────────────────────────────────
106// [all design parameters]
107inline constexpr std::array<double, 3> kCleanAxis = {0.0, 0.5, 1.0};
108inline constexpr std::array<double, 3> kCleanLoopLpHz = {20000.0, 12000.0, 6000.0};
109inline constexpr std::array<double, 3> kCleanLoopHpHz = {20.0, 20.0, 120.0};
110
116inline constexpr double kLoopLpBypassHz = 20000.0;
117
118// ── Vintage Digital ───────────────────────────────────────────────────────
119// No open paper documents the early-80s rack units this character evokes; the
120// MECHANISMS are the published general ones (band-limited clocked conversion,
121// pre/de-emphasis around a quantizer, low-bit PCM artifacts — Välimäki et al.
122// 2008), but every value below is a design parameter.
123inline constexpr std::array<double, 4> kVintageAxis = {0.0, 0.33, 0.67, 1.0};
124inline constexpr std::array<double, 4> kVintageInternalRateHz = {32000.0, 24000.0, 16000.0,
125 8000.0};
126inline constexpr std::array<double, 4> kVintageBits = {14.0, 12.0, 12.0, 10.0};
127
129inline constexpr double kVintageAntiAliasFraction = 0.45;
130
134inline constexpr double kVintageEmphasisHz = 3183.0;
135inline constexpr double kVintageEmphasisDb = 9.0;
136
137// ── Tape (standard tier) ──────────────────────────────────────────────────
138// [all design parameters unless noted]
139inline constexpr std::array<double, 4> kTapeAxis = {0.0, 0.33, 0.67, 1.0};
140inline constexpr std::array<double, 4> kTapeDrive = {1.5, 2.5, 4.0, 6.0};
141inline constexpr std::array<double, 4> kTapeBias = {0.0, 0.10, 0.20, 0.30};
142inline constexpr std::array<double, 4> kTapeWowDepthMs = {0.0, 0.15, 0.5, 1.2};
143inline constexpr std::array<double, 4> kTapeFlutterDepthMs = {0.0, 0.05, 0.15, 0.4};
144inline constexpr std::array<double, 4> kTapeLossLpHz = {12000.0, 9000.0, 6000.0, 3500.0};
145inline constexpr std::array<double, 4> kTapeBumpDb = {1.5, 2.0, 3.0, 4.0};
146
152inline constexpr std::array<double, 4> kTapePhysicalFeedbackCompensation = {
153 0.3739533963, 0.3530347705, 0.3146425708, 0.2804254864};
154
158inline constexpr double kTapeEmphasisDb = 3.0; // 0–6
159inline constexpr double kTapeEmphasisHz = 1600.0; // 1–3 kHz
160
163inline constexpr double kTapeBumpHz = 60.0;
164inline constexpr double kTapeBumpQ = 1.5;
165
168inline constexpr double kTapeDcBlockHz = 15.0;
169
173inline constexpr double kWowRateHz = 1.0;
174inline constexpr double kWowOuTheta = 1.5; // s^-1 mean-reversion
175inline constexpr double kWowOuSigma = 0.6; // innovation scale
176inline constexpr double kWowOuNoiseLpHz = 10.0; // pre-filter on the innovation
177
181inline constexpr double kFlutterBaseHz = 8.0;
182inline constexpr std::array<double, 3> kFlutterAmplitudes = {1.0, 0.5, 0.25};
183inline constexpr std::array<double, 3> kFlutterPhases = {0.0, 0.33, 0.71}; // cycles
184
187inline constexpr double kFlutterPhaseRight = 0.41;
188
189// ── BBD ───────────────────────────────────────────────────────────────────
190inline constexpr std::array<double, 3> kBbdAxis = {0.0, 0.5, 1.0};
191
195inline constexpr std::array<double, 3> kBbdStages = {4096.0, 2048.0, 1024.0};
196
197inline constexpr std::array<double, 3> kBbdDrive = {0.10, 0.30, 0.50};
198inline constexpr std::array<double, 3> kBbdJitterAmount = {0.0, 0.3, 0.6};
199inline constexpr std::array<double, 3> kBbdFlutterDepth = {0.0, 0.005, 0.015};
200
202inline constexpr std::size_t kBbdMaxStages = 4096;
203
206inline constexpr int kBbdOversample = 16;
207
211inline constexpr double kBbdBandwidthDivisor = 3.0;
212inline constexpr double kBbdBandwidthMinHz = 300.0;
213inline constexpr double kBbdBandwidthMaxHz = 10000.0;
218inline constexpr double kBbdFilterCutoffScale = 2.1;
219
222inline constexpr double kBbdCompanderTauMs = 10.0;
223inline constexpr double kBbdCompanderFloor = 0.01;
224
227inline constexpr double kBbdCompanderDriveScale = 0.3;
228
230inline constexpr double kBbdDriveGainSpan = 9.0; // drive 0..1 → gain 1..10
231inline constexpr double kBbdShape = 0.25; // 0–0.5
232
234inline constexpr double kBbdJitterMax = 5e-4;
235inline constexpr double kBbdJitterSmoothness = 0.5;
236
238inline constexpr double kBbdFlutterRateBaseHz = 0.3;
239inline constexpr double kBbdFlutterRateSpanHz = 1.2;
240
241// ── Diffusion ─────────────────────────────────────────────────────────────
242// The base network is Dattorro's PUBLISHED input diffuser (Effect Design Part
243// 1, Table 1): 142/107/379/277 samples at his 29.8 kHz reference rate, given
244// here in milliseconds, with his published coefficients. Only the scalings are
245// design parameters.
246inline constexpr std::array<double, 4> kDiffusionStageMs = {4.7651, 3.5906, 12.7181,
247 9.2953};
248inline constexpr std::array<double, 4> kDiffusionStageGain = {0.75, 0.75, 0.625, 0.625};
249
250inline constexpr std::array<double, 3> kDiffusionAxis = {0.0, 0.5, 1.0};
251inline constexpr std::array<double, 3> kDiffusionSizeScale = {0.5, 1.0, 1.7};
252inline constexpr std::array<double, 3> kDiffusionGainScale = {0.7, 1.0, 1.12};
253
256inline constexpr double kDiffusionGainMax = 0.85;
257
260inline constexpr double kDiffusionModDepthSamples = 2.0;
261inline constexpr std::array<double, 2> kDiffusionModRatesHz = {0.40, 0.53};
262
264inline constexpr double kDiffusionLoopHpHz = 20.0;
265inline constexpr double kDiffusionLoopLpHz = 9000.0;
266
267// ── Diffusion tank ────────────────────────────────────────────────────────
268// The input diffuser above smears a transient, but on its own it cannot make a
269// reverb: it has no recirculation of its own, so between the delay's repeats
270// there is silence and the character reads as a smeared slap rather than a
271// cloud. The tank is Dattorro's figure-of-eight (Effect Design Part 1, Fig. 2)
272// — two branches, each an allpass, a delay, a damping lowpass, a second
273// allpass and a second delay, cross-coupled through a decay coefficient — so
274// energy circulates on its OWN short time constants and fills the gaps.
275//
276// It blooms with character_amount and is exactly ZERO at amount 0, which keeps
277// the pure-diffuser configuration a magnitude-flat allpass (the null-test
278// baseline the character is specified against).
279inline constexpr std::array<double, 3> kDiffusionTankAxis = {0.0, 0.5, 1.0};
280
283inline constexpr std::array<double, 2> kDiffusionTankDelayAMs = {30.51, 44.79};
284inline constexpr std::array<double, 2> kDiffusionTankDelayBMs = {37.13, 53.27};
286inline constexpr std::array<double, 2> kDiffusionTankApAMs = {22.58, 60.48};
287inline constexpr std::array<double, 2> kDiffusionTankApBMs = {30.24, 89.24};
288inline constexpr double kDiffusionTankApGain1 = 0.70;
289inline constexpr double kDiffusionTankApGain2 = 0.50;
290
295inline constexpr std::array<double, 3> kDiffusionTankSizeScale = {0.6, 1.0, 1.6};
296inline constexpr std::array<double, 3> kDiffusionTankDecay = {0.0, 0.62, 0.80};
297
301inline constexpr std::array<double, 3> kDiffusionTankMix = {0.0, 0.55, 0.85};
302
305inline constexpr std::array<double, 3> kDiffusionTankDampHz = {12000.0, 7000.0, 4200.0};
306
311inline constexpr std::array<double, 3> kDiffusionTankModDepth = {0.0, 14.0, 42.0};
312inline constexpr std::array<double, 2> kDiffusionTankModRatesHz = {0.83, 1.27};
315inline constexpr std::array<double, 2> kDiffusionTankTapFraction = {0.37, 0.71};
316
322inline constexpr double kDiffusionTankLowGuardHz = 90.0;
326inline constexpr double kDiffusionTankDelaySlewMs = 5.0;
327
328// ── Reverse ───────────────────────────────────────────────────────────────
331inline constexpr int kReverseFadeSamples = 96;
332
350inline constexpr double kReverseLineMs = 30.0;
351
352// ── Ducking ───────────────────────────────────────────────────────────────
353// [all design parameters]
354inline constexpr double kDuckAttackS = 0.005; // 1–20 ms
355inline constexpr double kDuckReleaseS = 0.250; // 50–1000 ms
356inline constexpr double kDuckThreshold = 0.1; // ≈ −20 dBFS
357
358// ── Physical tape tier ────────────────────────────────────────────────────
359
364inline constexpr double kJaSaturationMagnetization = 3.5e5; // M_s
365inline constexpr double kJaAnhystereticShape = 2.2e4; // a
366inline constexpr double kJaPinning = 2.7e4; // k
367inline constexpr double kJaReversibility = 0.2; // c, published 0.1–0.3
368inline constexpr double kJaInterdomainCoupling = 1.6e-3; // α
369
373inline constexpr int kJaMaxIterations = 8;
374inline constexpr double kJaConvergenceThreshold = 6e-8;
375
378inline constexpr double kJaLangevinClamp = 30.0;
381inline constexpr double kJaSilenceThreshold = 1e-7;
382
387inline constexpr std::size_t kHysteresisHalfBandTaps = kHouseHalfBandTaps;
389
391inline constexpr double kJaMakeupToleranceDb = 1.0;
392
398inline constexpr std::size_t kLossFirOrder48k = 96;
403inline constexpr int kLossIirFitPoints = 64;
404
421inline constexpr std::size_t kSpacingPoleSections = 3;
422inline constexpr std::size_t kSpacingShelfSections = 8;
423inline constexpr std::size_t kThicknessPoleSections = 1;
424inline constexpr std::size_t kThicknessShelfSections = 2;
425
426inline constexpr std::size_t kLossPoleSections =
428inline constexpr std::size_t kLossShelfSections =
430
432inline constexpr std::size_t kLossSearchDimension =
434
453inline constexpr std::array<double, kSpacingPoleSections> kSpacingShapePoleX = {
454 0.1736328177, 0.5872051207, 0.7066518389};
455inline constexpr std::array<double, kSpacingShelfSections> kSpacingShapeShelfX = {
456 0.0379101878, 0.8617586156, 1.195357912, 0.546821599,
457 1.874319242, 1.250559327, 1.349688739, 0.5618309026};
458inline constexpr std::array<double, kSpacingShelfSections> kSpacingShapeShelfDb = {
459 -4.870968905, -22.02414799, -32.23365298, -35.9700058,
460 -20.85639305, -35.24359399, -23.08806288, -40.0};
461inline constexpr std::array<double, kThicknessPoleSections> kThicknessShapePoleX = {
462 0.2127135512};
463inline constexpr std::array<double, kThicknessShelfSections> kThicknessShapeShelfX = {
464 0.03067430198, 0.1724152232};
465inline constexpr std::array<double, kThicknessShelfSections> kThicknessShapeShelfDb = {
466 -1.705785229, -0.6809460063};
467
471inline constexpr double kLossShapeMinX = 1e-3;
472inline constexpr double kLossShapeMaxX = 4.0;
473
481inline constexpr int kLossIirFitIterations = 4000;
482inline constexpr int kLossIirFitRestarts = 3;
483inline constexpr int kLossIirFitStarts = 16;
484
486inline constexpr double kLossShelfMinDb = -40.0;
500inline constexpr double kLossBankCrossfadeS = 0.030;
501
505inline constexpr double kTapeCoatingThicknessM = 12e-6;
506inline constexpr double kTapeHeadGapM = 3e-6;
507
509inline constexpr std::array<double, 5> kTapeSpeedsIps = {1.875, 3.75, 7.5, 15.0, 30.0};
510
513inline constexpr std::array<double, 5> kHeadBumpIps = {1.875, 3.75, 7.5, 15.0, 30.0};
514inline constexpr std::array<double, 5> kHeadBumpHz = {35.0, 45.0, 60.0, 80.0, 105.0};
515
518inline constexpr std::array<double, 3> kAgeAxis = {0.0, 0.5, 1.0};
519inline constexpr std::array<double, 3> kAgeSpacingUm = {5.0, 12.0, 25.0};
520inline constexpr std::array<double, 3> kAgeHissDbfs = {-120.0, -78.0, -60.0};
521inline constexpr std::array<double, 3> kAgeChewDepth = {0.0, 0.2, 0.6};
522inline constexpr std::array<double, 3> kAgeDegrade = {0.0, 0.2, 0.5};
523
526inline constexpr double kHissLpHz = 4000.0;
527
530inline constexpr double kChewCleanScaleS = 1.5;
531inline constexpr double kChewDegradedScaleS = 0.4;
532inline constexpr double kChewVariance = 1.5;
533inline constexpr double kChewTransitionS = 0.008;
534inline constexpr double kChewPower = 2.0;
535inline constexpr double kChewLpHz = 3000.0;
536
539inline constexpr double kDegradeMinLpHz = 500.0;
540inline constexpr double kDegradeGainDipDb = -1.5;
541inline constexpr int kDegradeUpdateSamples = 1024;
542
543} // namespace pulp::signal::chardelay
Definition bbd.hpp:36
constexpr std::array< double, 4 > kTapePhysicalFeedbackCompensation
Physical-loop compensation at each age knot.
Definition tables.hpp:152
constexpr std::size_t kLossFirOrder48k
Wallace playback loss (Wallace 1951; physical ranges from Bertram 1994) is split across two realizati...
Definition tables.hpp:398
constexpr int kDegradeUpdateSamples
Definition tables.hpp:541
constexpr int kLossIirFitPoints
The smooth spacing × thickness tilt goes to a fitted IIR cascade: how many log-spaced points the leas...
Definition tables.hpp:403
constexpr std::size_t kSpacingPoleSections
Sections in each fitted cascade.
Definition tables.hpp:421
constexpr double kTapeEmphasisDb
Record/playback EQ bracketing the saturator: boost HF into saturation, cut it after,...
Definition tables.hpp:158
constexpr double kTimeSlewCleanMs
Definition tables.hpp:99
constexpr double kTimeOffsetMax
Definition tables.hpp:34
constexpr std::array< double, 4 > kDiffusionStageGain
Definition tables.hpp:248
constexpr int kJaMaxIterations
Newton-Raphson budget.
Definition tables.hpp:373
constexpr double kBbdBandwidthMinHz
Definition tables.hpp:212
constexpr std::array< double, 3 > kDiffusionTankAxis
Definition tables.hpp:279
constexpr double kLoopToneNyquistFraction
Keep the TPT prewarp strictly below Nyquist.
Definition tables.hpp:76
constexpr std::array< double, 3 > kDiffusionGainScale
Definition tables.hpp:252
constexpr std::array< double, 5 > kHeadBumpIps
Head-bump center against speed.
Definition tables.hpp:513
constexpr std::array< double, kSpacingShelfSections > kSpacingShapeShelfX
Definition tables.hpp:455
constexpr std::array< double, 3 > kDiffusionTankModDepth
Tank modulation — this is what makes the cloud granular rather than static.
Definition tables.hpp:311
constexpr std::array< double, 4 > kTapeBias
Definition tables.hpp:141
constexpr std::array< double, 3 > kFlutterAmplitudes
Definition tables.hpp:182
constexpr std::array< double, 3 > kDiffusionTankSizeScale
Tank size scaler and recirculation decay by character amount.
Definition tables.hpp:295
constexpr double kBbdShape
Definition tables.hpp:231
constexpr double kHissLpHz
Hiss: white noise through a 1-pole lowpass, injected AFTER the delay line so it accumulates per repea...
Definition tables.hpp:526
constexpr double kJaPinning
Definition tables.hpp:366
constexpr double kJaSilenceThreshold
Below this |H| and |dH/dt|, magnetization is snapped to 0 so a silent loop cannot hold a frozen DC ma...
Definition tables.hpp:381
constexpr std::array< double, 4 > kTapeBumpDb
Definition tables.hpp:145
constexpr double kVintageEmphasisDb
Definition tables.hpp:135
constexpr std::array< double, 3 > kBbdDrive
Definition tables.hpp:197
constexpr double kDiffusionGainMax
Stability / metallicity guard.
Definition tables.hpp:256
constexpr double kTapeHeadGapM
Definition tables.hpp:506
constexpr double kBbdCompanderTauMs
Compander: hardware τ is set by an external capacitor, so real units vary.
Definition tables.hpp:222
constexpr double kModRateMaxHz
Definition tables.hpp:59
constexpr std::array< double, 5 > kTapeSpeedsIps
The IEC/NAB standard tape-speed set, in inches per second (published).
Definition tables.hpp:509
constexpr std::size_t kThicknessShelfSections
Definition tables.hpp:424
constexpr double kVintageEmphasisHz
3183 Hz is the 50 µs time constant — the published CD/FM-era emphasis standard (IEC 60908),...
Definition tables.hpp:134
constexpr double kDuckReleaseS
Definition tables.hpp:355
constexpr std::array< double, 2 > kDiffusionTankTapFraction
Extra scattered taps read at their own modulated offsets, as a fraction of the branch delay.
Definition tables.hpp:315
constexpr double kBbdFilterCutoffScale
The clock law names the complete wet path's audible -3 dB edge.
Definition tables.hpp:218
constexpr std::array< double, 4 > kTapeLossLpHz
Definition tables.hpp:144
constexpr std::array< double, 3 > kBbdFlutterDepth
Definition tables.hpp:199
constexpr double kTimeOffsetMin
Definition tables.hpp:33
constexpr double kChewVariance
Definition tables.hpp:532
constexpr double kLoopToneHpMaxHz
Definition tables.hpp:71
constexpr std::array< double, 3 > kDiffusionTankMix
How much of the character's output is the tank rather than the bare diffuser.
Definition tables.hpp:301
constexpr std::array< double, 4 > kDiffusionStageMs
Definition tables.hpp:246
constexpr std::array< double, 3 > kAgeDegrade
Definition tables.hpp:522
constexpr int kControlInterval
Coefficient recomputation and stochastic-walk stepping cadence, in samples.
Definition tables.hpp:40
constexpr double kWowOuSigma
Definition tables.hpp:175
constexpr double kDiffusionTankDelaySlewMs
Live character automation moves tank taps toward their new positions over a short continuous glide in...
Definition tables.hpp:326
constexpr std::array< double, 3 > kAgeAxis
Age macro.
Definition tables.hpp:518
constexpr double kFlutterPhaseRight
Right-channel flutter phase offset, in cycles.
Definition tables.hpp:187
constexpr double kChewCleanScaleS
Chew — an intermittent dropout modeled as a two-state machine.
Definition tables.hpp:530
constexpr std::array< double, 3 > kBbdJitterAmount
Definition tables.hpp:198
constexpr std::array< double, 3 > kFlutterPhases
Definition tables.hpp:183
constexpr double kLoopToneHpMinHz
User-facing in-loop tone stage.
Definition tables.hpp:70
constexpr std::array< double, kSpacingPoleSections > kSpacingShapePoleX
THE FITTED SHAPES, as shipped.
Definition tables.hpp:453
constexpr std::array< double, 3 > kBbdAxis
Definition tables.hpp:190
constexpr int kLossIirFitStarts
Definition tables.hpp:483
constexpr double kLoopToneResMin
Resonance range for both loop-tone filters.
Definition tables.hpp:82
constexpr double kReverseLineMs
Delay the CLOCK-DOMAIN characters' own line runs at while reverse is engaged, in milliseconds.
Definition tables.hpp:350
constexpr double kLoopToneLpMinHz
Definition tables.hpp:72
constexpr double kTimeSlewBbdMs
Definition tables.hpp:102
constexpr double kStereoDecorr
Right-channel depth scaler for every shared-LFO modulation.
Definition tables.hpp:88
constexpr double kJaInterdomainCoupling
Definition tables.hpp:368
constexpr std::array< double, 2 > kDiffusionTankApAMs
The two decay-diffuser allpasses per branch. [design parameters].
Definition tables.hpp:286
constexpr double kModRateMinHz
Generic modulation LFO: log rate map and maximum depth as a fraction of delay time.
Definition tables.hpp:58
constexpr std::array< double, 3 > kAgeChewDepth
Definition tables.hpp:521
constexpr double kTapeDcBlockHz
In-loop DC blocker.
Definition tables.hpp:168
constexpr double kDiffusionLoopHpHz
Diffusion loop filters. [LP is a design parameter].
Definition tables.hpp:264
constexpr double kWowOuNoiseLpHz
Definition tables.hpp:176
constexpr double kTimeSlewVintageMs
Definition tables.hpp:100
constexpr std::array< double, 3 > kDiffusionTankDampHz
In-tank damping.
Definition tables.hpp:305
constexpr std::size_t kLossPoleSections
Definition tables.hpp:426
constexpr double kWowOuTheta
Definition tables.hpp:174
constexpr std::array< double, 2 > kDiffusionTankApBMs
Definition tables.hpp:287
constexpr double kDuckThreshold
Definition tables.hpp:356
constexpr double kMaxDelayMs
Maximum left-channel base delay and stereo-offset bounds.
Definition tables.hpp:32
constexpr std::array< double, 4 > kVintageInternalRateHz
Definition tables.hpp:124
constexpr double kHysteresisHalfBandStopbandDb
Definition tables.hpp:388
constexpr double kTimeSlewTapeMs
Definition tables.hpp:101
constexpr double kDiffusionTankApGain1
Definition tables.hpp:288
constexpr double kBbdCompanderFloor
Definition tables.hpp:223
constexpr std::array< double, 3 > kCleanAxis
Definition tables.hpp:107
constexpr double kBbdBandwidthDivisor
Bandwidth law: the usable passband must sit well below the clock's Nyquist (the published aliasing co...
Definition tables.hpp:211
constexpr double kTapeBumpQ
Definition tables.hpp:164
constexpr std::uint32_t kPrngSeed
PRNG seed.
Definition tables.hpp:92
constexpr double kDiffusionLoopLpHz
Definition tables.hpp:265
constexpr double kTapeEmphasisHz
Definition tables.hpp:159
constexpr double kLoopLpBypassHz
A loop lowpass at or above this cutoff is BYPASSED rather than run.
Definition tables.hpp:116
constexpr double kLossBankCrossfadeS
NOTE: there are no age knots and no interpolation along the age axis.
Definition tables.hpp:500
constexpr std::array< double, 4 > kTapeDrive
Definition tables.hpp:140
constexpr std::array< double, kThicknessShelfSections > kThicknessShapeShelfDb
Definition tables.hpp:465
constexpr double kBbdFlutterRateBaseHz
BBD flutter rate map, Hz.
Definition tables.hpp:238
constexpr std::array< double, 2 > kDiffusionTankDelayBMs
Definition tables.hpp:284
constexpr double kTapeCoatingThicknessM
Fixed tape geometry, in metres.
Definition tables.hpp:505
constexpr double kDiffusionTankApGain2
Definition tables.hpp:289
constexpr double kVintageAntiAliasFraction
Anti-alias / reconstruction cutoff as a fraction of the internal rate.
Definition tables.hpp:129
constexpr std::array< double, 2 > kDiffusionTankModRatesHz
Definition tables.hpp:312
constexpr std::array< double, kThicknessPoleSections > kThicknessShapePoleX
Definition tables.hpp:461
constexpr double kJaLangevinClamp
Langevin argument clamp — keeps coth() and its derivative in the range where the rational approximati...
Definition tables.hpp:378
constexpr std::array< double, 3 > kDiffusionSizeScale
Definition tables.hpp:251
constexpr std::size_t kThicknessPoleSections
Definition tables.hpp:423
constexpr int kBbdOversample
Internal oversampling of the clocked core.
Definition tables.hpp:206
constexpr double kDuckAttackS
Definition tables.hpp:354
constexpr std::array< double, 3 > kAgeSpacingUm
Definition tables.hpp:519
constexpr std::array< double, 3 > kCleanLoopHpHz
Definition tables.hpp:109
constexpr double kChewLpHz
Definition tables.hpp:535
constexpr std::array< double, 4 > kVintageAxis
Definition tables.hpp:123
constexpr std::array< double, 3 > kBbdStages
PUBLISHED chip stage counts (Panasonic MN3005 / MN3008 / MN3007 datasheets), not design parameters: t...
Definition tables.hpp:195
constexpr std::array< double, kSpacingShelfSections > kSpacingShapeShelfDb
Definition tables.hpp:458
constexpr double kLoopToneResMax
Definition tables.hpp:83
constexpr double kSaturatedFeedbackMax
Feedback ceiling for the saturating characters.
Definition tables.hpp:54
constexpr std::array< double, 2 > kDiffusionModRatesHz
Definition tables.hpp:261
constexpr std::array< double, 4 > kTapeWowDepthMs
Definition tables.hpp:142
constexpr double kJaReversibility
Definition tables.hpp:367
constexpr double kBbdJitterSmoothness
Definition tables.hpp:235
constexpr std::array< double, 3 > kDiffusionAxis
Definition tables.hpp:250
constexpr std::array< double, kThicknessShelfSections > kThicknessShapeShelfX
Definition tables.hpp:463
constexpr double kLoopToneLpMaxHz
Definition tables.hpp:73
constexpr double kBbdJitterMax
Clock jitter, as a fraction of the clock period. [1e-4–2e-3].
Definition tables.hpp:234
constexpr std::array< double, 3 > kAgeHissDbfs
Definition tables.hpp:520
constexpr double kDegradeGainDipDb
Definition tables.hpp:540
constexpr int kLossIirFitRestarts
Definition tables.hpp:482
constexpr double kDegradeMinLpHz
Degrade — continuous wear.
Definition tables.hpp:539
constexpr double kJaAnhystereticShape
Definition tables.hpp:365
constexpr std::array< double, 4 > kTapeAxis
Definition tables.hpp:139
constexpr double kParamGlideS
De-zipper glide for scalar params (feedback, crossfeed, duck, freeze, and the character table's per-s...
Definition tables.hpp:44
constexpr double kChewPower
Definition tables.hpp:534
constexpr double kBbdBandwidthMaxHz
Definition tables.hpp:213
constexpr double kLossShapeMinX
Normalized-frequency range each shape is fitted over, and how many log-spaced points.
Definition tables.hpp:471
constexpr double kLossShapeMaxX
Definition tables.hpp:472
constexpr std::size_t kLossSearchDimension
Search dimension of ONE shape fit (the larger of the two).
Definition tables.hpp:432
constexpr double kJaConvergenceThreshold
Definition tables.hpp:374
constexpr double kJaSaturationMagnetization
PUBLISHED γ-Fe2O3 material constants (Jiles, Thoelke & Devine 1992, reproduced in Chowdhury 2019).
Definition tables.hpp:364
constexpr std::size_t kHysteresisHalfBandTaps
Hysteresis oversampling factor and half-band design.
Definition tables.hpp:387
constexpr double kFlutterBaseHz
Flutter: published band 5–100 Hz.
Definition tables.hpp:181
constexpr std::array< double, 4 > kTapeFlutterDepthMs
Definition tables.hpp:143
constexpr double kUnsaturatedFeedbackMax
Feedback ceiling for the characters with NO in-loop saturator.
Definition tables.hpp:49
constexpr double kChewDegradedScaleS
Definition tables.hpp:531
constexpr std::size_t kSpacingShelfSections
Definition tables.hpp:422
constexpr double kDiffusionTankLowGuardHz
In-tank low cut.
Definition tables.hpp:322
constexpr int kReverseFadeSamples
Raised-cosine splice fade at each end of a reversed segment, in samples.
Definition tables.hpp:331
constexpr double kModMaxDepth
Definition tables.hpp:60
constexpr double kBbdCompanderDriveScale
The compander holds loop level near the rail, so the waveshaper's drive is backed off when it runs be...
Definition tables.hpp:227
constexpr double kDiffusionModDepthSamples
Anti-metallic modulation of stages 1 and 3 (Dattorro modulates his diffusers).
Definition tables.hpp:260
constexpr std::array< double, 3 > kDiffusionTankDecay
Definition tables.hpp:296
constexpr double kWowRateHz
Wow: periodic + stochastic.
Definition tables.hpp:173
constexpr std::array< double, 4 > kVintageBits
Definition tables.hpp:126
constexpr std::array< double, 5 > kHeadBumpHz
Definition tables.hpp:514
constexpr std::size_t kBbdMaxStages
Largest stage count any table knot may request; sizes the bucket buffer.
Definition tables.hpp:202
constexpr double kBbdDriveGainSpan
Asymmetric soft clip: gain map and DC offset for even-harmonic content.
Definition tables.hpp:230
constexpr double kTapeBumpHz
Loss stand-in head bump (the physical tier replaces this with a speed-dependent center; see kHeadBump...
Definition tables.hpp:163
constexpr std::array< double, 3 > kCleanLoopLpHz
Definition tables.hpp:108
constexpr double kMaxAddressableDelayMs
Definition tables.hpp:35
constexpr double kChewTransitionS
Definition tables.hpp:533
constexpr double kBbdFlutterRateSpanHz
Definition tables.hpp:239
constexpr std::size_t kLossShelfSections
Definition tables.hpp:428
constexpr double kJaMakeupToleranceDb
Makeup-gain tolerance around unity small-signal gain, in dB.
Definition tables.hpp:391
constexpr int kLossIirFitIterations
Simplex iterations per start, restarts per start, and how many starts.
Definition tables.hpp:481
constexpr double kLossShelfMinDb
Deepest cut any one shelf may ask for.
Definition tables.hpp:486
constexpr std::array< double, 2 > kDiffusionTankDelayAMs
Branch delays in ms, mutually prime-ish so their comb nulls never align.
Definition tables.hpp:283
constexpr double kTimeSlewDiffusionMs
Definition tables.hpp:103
constexpr double kHouseHalfBandStopbandDb
Definition oversampling_fir.hpp:22
constexpr std::size_t kHouseHalfBandTaps
Pulp's low-latency linear-phase half-band design.
Definition oversampling_fir.hpp:21
@ e
Definition formant_filter_bank.hpp:20
Linear-phase 2x FIR stage used by the realtime oversampler.