167template <
typename SampleType>
176 constexpr double pi = 3.14159265358979323846;
177 const double nyquist_limit = 0.49 * sample_rate;
178 const double fc = std::clamp(cutoff_hz, 1.0, nyquist_limit);
179 const double safe_q = std::max(q, 1.0e-3);
180 const double g = std::tan(pi * fc / sample_rate);
181 const double k = 1.0 / safe_q;
182 const double a1 = 1.0 / (1.0 + g * (g + k));
183 g_ =
static_cast<SampleType
>(g);
184 k_ =
static_cast<SampleType
>(k);
185 a1_ =
static_cast<SampleType
>(a1);
186 a2_ =
static_cast<SampleType
>(g * a1);
187 a3_ =
static_cast<SampleType
>(g * g * a1);
191 const SampleType
v3 = input - ic2_;
192 const SampleType
v1 = a1_ * ic1_ + a2_ *
v3;
193 const SampleType
v2 = ic2_ + a2_ * ic1_ + a3_ *
v3;
198 return {input - k_ *
v1 -
v2,
v2};
202 ic1_ = SampleType{0};
203 ic2_ = SampleType{0};
207 SampleType g_ = SampleType{0};
208 SampleType k_ = SampleType{1};
209 SampleType a1_ = SampleType{1};
210 SampleType a2_ = SampleType{0};
211 SampleType a3_ = SampleType{0};
212 SampleType ic1_ = SampleType{0};
213 SampleType ic2_ = SampleType{0};
227template <
typename SampleType =
float>
240 {
"Brit-12 ceramic", 75.0, 0.50, 200.0, 1900.0, 0.50},
241 {
"Amer-12 ceramic", 95.0, 0.60, 150.0, 2200.0, 0.50},
242 {
"Alnico-12", 85.0, 0.45, 170.0, 2000.0, 0.48},
243 {
"Brit-10", 100.0, 0.55, 90.0, 2600.0, 0.42},
244 {
"Bass-15", 45.0, 0.35, 300.0, 1200.0, 0.60},
482 const auto smoothing =
static_cast<SampleType
>(
kSmoothingMs / 1000.0);
483 const auto fs =
static_cast<SampleType
>(sample_rate_);
484 drive_lin_.set_ramp_time(smoothing, fs);
485 out_trim_lin_.set_ramp_time(smoothing, fs);
486 treble_hz_.set_ramp_time(smoothing, fs);
487 q_smoothed_.set_ramp_time(smoothing, fs);
488 presence_db_.set_ramp_time(smoothing, fs);
489 proximity_db_.set_ramp_time(smoothing, fs);
490 offaxis_hz_.set_ramp_time(smoothing, fs);
491 inductance_lp_.prepare(fs);
492 offaxis_lp_.prepare(fs);
493 dipole_hp_.prepare(fs);
495 constexpr double two_pi = 6.283185307179586476925286766559;
496 dc_.set_pole(
static_cast<SampleType
>(
497 std::clamp(1.0 - two_pi *
kDcBlockerHz / sample_rate_, 0.0, 0.99999)));
500 treble_hz_.set_immediate(
static_cast<SampleType
>(treble_hz_target_));
501 q_smoothed_.set_immediate(
static_cast<SampleType
>(
resonance_q()));
505 control_counter_ = 0;
506 update_coefficients();
521 if (!std::isfinite(litres))
return;
526 if (!std::isfinite(semitones))
return;
533 if (!std::isfinite(q))
return;
538 if (!std::isfinite(percent))
return;
539 breakup_amount_ = std::clamp(percent, 0.0, 100.0) / 100.0;
542 if (!std::isfinite(hz))
return;
544 treble_hz_.set_target(
static_cast<SampleType
>(treble_hz_target_));
547 if (!std::isfinite(db))
return;
552 if (!std::isfinite(percent))
return;
553 compression_amount_ = std::clamp(percent, 0.0, 100.0) / 100.0;
556 if (!std::isfinite(cm))
return;
561 if (!std::isfinite(percent))
return;
562 mic_position_ = std::clamp(percent, 0.0, 100.0) / 100.0;
566 if (!std::isfinite(degrees))
return;
571 if (!std::isfinite(percent))
return;
572 diffraction_amount_ = std::clamp(percent, 0.0, 100.0) / 100.0;
575 if (!std::isfinite(db))
return;
583 if (!std::isfinite(
static_cast<double>(input))) {
585 return SampleType{0};
587 if (control_counter_ == 0) update_coefficients();
590 const SampleType drive = drive_lin_.next();
591 const SampleType trim = out_trim_lin_.next();
595 const auto taps = resonance_.tick(dc_.process(input) * drive);
598 const SampleType x_norm = taps.lowpass * excursion_scale_;
599 const SampleType g_bl = SampleType{1} / (SampleType{1} + beta_ * x_norm * x_norm);
604 const SampleType magnitude = std::abs(x_norm);
605 if (magnitude > excursion_peak_) excursion_peak_ = magnitude;
607 SampleType s = taps.highpass * g_bl;
610 s = baffle_.process(s);
611 s = ripple_[0].process(s);
612 s = ripple_[1].process(s);
614 s = dipole_hp_.process_highpass(s);
615 s = dipole_notch_.process(s);
617 s = proximity_.process(s);
618 s = air_loss_.process(s);
619 s = presence_.process(s);
620 s = offaxis_lp_.process_lowpass(s);
621 const SampleType output = s * trim;
622 if (!std::isfinite(
static_cast<double>(output))) {
624 return SampleType{0};
629 void process(
const SampleType* in, SampleType* out,
int n) {
638 inductance_lp_.reset();
640 for (
auto& mode : breakup_) mode.reset();
645 dipole_notch_.reset();
650 excursion_ = SampleType{0};
651 excursion_peak_ = SampleType{0};
653 control_counter_ = 0;
679 return base * std::pow(2.0, resonance_trim_ / 12.0);
684 if (q_override_ > 0.0)
return q_override_;
693 const double inner = 1.0 - 1.0 / (4.0 * q * q);
694 if (inner <= 0.0)
return 0.0;
702 const double inner = 1.0 - 1.0 / (2.0 * q * q);
725 constexpr double deg_to_rad = 3.14159265358979323846 / 180.0;
726 const double reduction =
kOffAxisFactor * std::sin(mic_axis_deg_ * deg_to_rad);
755 constexpr double pi = 3.14159265358979323846;
756 const double w = 2.0 * pi * hz / sample_rate_;
757 const std::complex<double> z_inv = std::polar(1.0, -w);
761 const double fc =
static_cast<double>(inductance_lp_.cutoff());
762 const double wa = 2.0 * sample_rate_ * std::tan(pi * fc / sample_rate_);
763 const double g = wa / (2.0 * sample_rate_ + wa);
764 const std::complex<double> lp =
765 g * (1.0 + z_inv) / (1.0 - (1.0 - 2.0 * g) * z_inv);
768 const auto c = semi_shelf_.coefficients();
769 const std::complex<double> z2 = z_inv * z_inv;
770 const std::complex<double> shelf =
771 (
static_cast<double>(
c.b0) +
static_cast<double>(
c.b1) * z_inv +
772 static_cast<double>(
c.b2) * z2) /
773 (1.0 +
static_cast<double>(
c.a1) * z_inv +
static_cast<double>(
c.a2) * z2);
775 const double s =
static_cast<double>(semi_);
786 double excursion()
const {
return static_cast<double>(excursion_); }
801 SampleType inductance(SampleType x) {
802 const SampleType rolled = inductance_lp_.process_lowpass(x);
803 const SampleType shelved = semi_shelf_.
process(x);
804 return (SampleType{1} - semi_) * rolled + semi_ * shelved;
807 void retarget_smoothed() {
808 q_smoothed_.set_target(
static_cast<SampleType
>(
resonance_q()));
816 void update_coefficients() {
817 const auto fs =
static_cast<SampleType
>(sample_rate_);
821 const double q =
static_cast<double>(q_smoothed_.current());
822 const double treble =
static_cast<double>(treble_hz_.current());
823 const double presence =
static_cast<double>(presence_db_.current());
824 const double proximity =
static_cast<double>(proximity_db_.current());
825 const double offaxis =
static_cast<double>(offaxis_hz_.current());
835 const double peak =
static_cast<double>(excursion_peak_);
837 excursion_peak_ = SampleType{0};
838 resonance_.set_coefficients(fc_dynamic_, q, sample_rate_);
840 beta_ =
static_cast<SampleType
>(
bl_beta());
843 inductance_lp_.set_cutoff(
static_cast<SampleType
>(treble));
844 semi_ =
static_cast<SampleType
>(semi_inductance_);
845 semi_shelf_.set_coefficients(Biquad::Type::high_shelf,
static_cast<SampleType
>(treble),
851 breakup_[
i].set_coefficients(
853 static_cast<SampleType
>(mode.q), fs,
854 static_cast<SampleType
>(mode.gain_db * breakup_amount_));
857 baffle_.set_coefficients(Biquad::Type::high_shelf,
859 static_cast<SampleType
>(
kBaffleStepDb * diffraction_amount_));
861 ripple_[0].set_coefficients(Biquad::Type::peaking,
static_cast<SampleType
>(ripple1),
863 static_cast<SampleType
>(
kRipple1Db * diffraction_amount_));
864 ripple_[1].set_coefficients(Biquad::Type::peaking,
static_cast<SampleType
>(2.0 * ripple1),
866 static_cast<SampleType
>(
kRipple2Db * diffraction_amount_));
868 dipole_hp_.set_cutoff(
static_cast<SampleType
>(
dipole_hz()));
869 dipole_notch_.set_coefficients(
874 proximity_.set_coefficients(Biquad::Type::low_shelf,
876 static_cast<SampleType
>(proximity));
877 air_loss_.set_coefficients(Biquad::Type::high_shelf,
880 presence_.set_coefficients(Biquad::Type::high_shelf,
882 static_cast<SampleType
>(presence));
883 offaxis_lp_.set_cutoff(
static_cast<SampleType
>(offaxis));
889 static constexpr SampleType kShelfQ =
static_cast<SampleType
>(0.70710678118654752440);
891 using Biquad = BiquadT<SampleType>;
894 double sample_rate_ = 48000.0;
895 int archetype_index_ = 0;
898 double resonance_trim_ = 0.0;
899 double q_override_ = 0.0;
907 double mic_axis_deg_ = 0.0;
909 double out_trim_db_ = 0.0;
912 SmoothedValue<SampleType> drive_lin_{SampleType{1}};
913 SmoothedValue<SampleType> out_trim_lin_{SampleType{1}};
915 SmoothedValue<SampleType> q_smoothed_{SampleType{1}};
916 SmoothedValue<SampleType> presence_db_{SampleType{0}};
917 SmoothedValue<SampleType> proximity_db_{SampleType{0}};
918 SmoothedValue<SampleType> offaxis_hz_{
static_cast<SampleType
>(
kOffAxisOnAxisHz)};
921 DcBlocker<SampleType> dc_;
922 detail::DualTapResonatorT<SampleType> resonance_;
923 TptFilterT<SampleType> inductance_lp_;
928 TptFilterT<SampleType> dipole_hp_;
929 Biquad dipole_notch_;
933 TptFilterT<SampleType> offaxis_lp_;
935 SampleType beta_ = SampleType{0};
938 SampleType excursion_ = SampleType{0};
939 SampleType excursion_peak_ = SampleType{0};
940 double fc_dynamic_ = 0.0;
941 int control_counter_ = 0;
SampleType process(SampleType input)
Definition biquad.hpp:211
Physics-based speaker + cabinet + microphone emulator.
Definition speaker_cabinet.hpp:228
static constexpr double kOffAxisFactorMax
Definition speaker_cabinet.hpp:369
SampleType process(SampleType input)
Definition speaker_cabinet.hpp:582
static constexpr double kCmsStiffeningMax
Definition speaker_cabinet.hpp:315
static constexpr double kProximityGainKMin
Definition speaker_cabinet.hpp:329
static constexpr double kDipoleNotchDbMin
Definition speaker_cabinet.hpp:406
static constexpr double kProximityReferenceCm
Definition speaker_cabinet.hpp:331
static constexpr double kDipoleNotchDbMax
Definition speaker_cabinet.hpp:407
static constexpr double kProximityGainK
Definition speaker_cabinet.hpp:328
static constexpr double kSmoothingMs
Definition speaker_cabinet.hpp:427
static constexpr double kSmoothingMsMin
Definition speaker_cabinet.hpp:428
static constexpr double kQResonanceMax
Definition speaker_cabinet.hpp:269
static constexpr double kRipple1Q
Definition speaker_cabinet.hpp:384
double air_loss_db() const
Air/distance HF trim, in dB (negative), scaling with distance.
Definition speaker_cabinet.hpp:743
static constexpr double kBlFalloffMax
Definition speaker_cabinet.hpp:309
static constexpr double kConeBreakupAmountDefault
Definition speaker_cabinet.hpp:272
void set_cone_breakup_amount(double percent)
Definition speaker_cabinet.hpp:537
void set_box_volume_l(double litres)
Definition speaker_cabinet.hpp:520
static constexpr double kCmsStiffeningMin
Definition speaker_cabinet.hpp:314
static constexpr double kOffAxisOnAxisHzMin
Definition speaker_cabinet.hpp:365
double ripple_hz() const
First edge-diffraction ripple c / (2 * d_edge).
Definition speaker_cabinet.hpp:713
static constexpr double kDipoleNotchRatioMin
Definition speaker_cabinet.hpp:400
static constexpr double kWorstCaseGain
Definition speaker_cabinet.hpp:441
static constexpr double kResonanceTrimSemitonesMax
Definition speaker_cabinet.hpp:264
void set_resonance_trim_semitones(double semitones)
Definition speaker_cabinet.hpp:525
static constexpr double kEdgeDistanceMMax
Definition speaker_cabinet.hpp:383
static constexpr double kOutputTrimDbMin
Definition speaker_cabinet.hpp:410
static constexpr double kMicDistanceCmDefault
Definition speaker_cabinet.hpp:318
static constexpr double kBreakupGainDbMax
Definition speaker_cabinet.hpp:475
double dynamic_fc_hz() const
The resonance cutoff currently in force, including Cms stiffening.
Definition speaker_cabinet.hpp:789
void set_driver_archetype(int index)
Definition speaker_cabinet.hpp:512
static constexpr double kMicDistanceCmMax
Definition speaker_cabinet.hpp:320
static constexpr double kEdgeDistanceM
Definition speaker_cabinet.hpp:381
static constexpr double kRippleQMax
Definition speaker_cabinet.hpp:389
static constexpr double kDipoleNotchRatio
Definition speaker_cabinet.hpp:399
static constexpr double kDcBlockerHzMin
Definition speaker_cabinet.hpp:423
void set_mic_position_pct(double percent)
Definition speaker_cabinet.hpp:560
static constexpr double kMicAxisDegMax
Definition speaker_cabinet.hpp:371
static constexpr double kDipoleNotchRatioMax
Definition speaker_cabinet.hpp:401
static constexpr double kDriveDbMin
Definition speaker_cabinet.hpp:292
static constexpr double kDipoleNotchQ
Definition speaker_cabinet.hpp:402
static constexpr double kProximityReferenceCmMin
Definition speaker_cabinet.hpp:332
static constexpr double kTrebleRolloffHzMax
Definition speaker_cabinet.hpp:277
static constexpr double kExcursionReferenceMax
Definition speaker_cabinet.hpp:303
static constexpr double kSmoothingMsMax
Definition speaker_cabinet.hpp:429
static constexpr int kControlBlock
Definition speaker_cabinet.hpp:434
static constexpr double kPresenceCornerHz
Definition speaker_cabinet.hpp:357
double resonance_peak_db() const
Peak magnitude of the second-order high-pass at the resonance, in dB: Q / sqrt(1 - 1/(4 Q^2)).
Definition speaker_cabinet.hpp:691
void set_box_type(SpeakerBoxType type)
Definition speaker_cabinet.hpp:516
static constexpr double kSemiInductanceShelfDb
Definition speaker_cabinet.hpp:286
double excursion() const
Normalized excursion produced by the most recent sample.
Definition speaker_cabinet.hpp:786
static constexpr double kCompressionAmountDefault
Definition speaker_cabinet.hpp:296
static constexpr double kDipoleNotchQMax
Definition speaker_cabinet.hpp:404
static constexpr double kRippleQMin
Definition speaker_cabinet.hpp:388
double dipole_hz() const
Open-back dipole corner c / (2 * D).
Definition speaker_cabinet.hpp:716
static constexpr double kPresenceCornerHzMax
Definition speaker_cabinet.hpp:359
static constexpr double kResonanceTrimSemitonesMin
Definition speaker_cabinet.hpp:263
static constexpr double kPresenceCapDb
Definition speaker_cabinet.hpp:353
double breakup_mode_hz(int index) const
Centre of breakup mode index, anchored on the archetype.
Definition speaker_cabinet.hpp:719
static constexpr double kRippleDbMax
Definition speaker_cabinet.hpp:390
static constexpr double kBoxVolumeLMax
Definition speaker_cabinet.hpp:260
static constexpr double kOffAxisFactorMin
Definition speaker_cabinet.hpp:368
static const BreakupMode & breakup_mode(int index)
[design parameter] shape.
Definition speaker_cabinet.hpp:462
static constexpr double kProximityCeilingDbMin
Definition speaker_cabinet.hpp:335
static constexpr double kTrebleRolloffHzMin
Definition speaker_cabinet.hpp:276
static constexpr double kProximityCornerHzMax
Definition speaker_cabinet.hpp:339
void set_diffraction_amount(double percent)
Definition speaker_cabinet.hpp:570
static constexpr double kSemiInductanceMin
Definition speaker_cabinet.hpp:284
static constexpr double kProximityCornerHz
Definition speaker_cabinet.hpp:337
static constexpr double kDiffractionAmountDefault
Definition speaker_cabinet.hpp:391
double resonance_fc_hz() const
Box resonance fc = fs * sqrt(1 + alpha), shifted by the voicing trim.
Definition speaker_cabinet.hpp:676
double cms_gamma() const
Cms(x) stiffening coefficient gamma actually in force.
Definition speaker_cabinet.hpp:783
static constexpr double kBlFalloffMin
Definition speaker_cabinet.hpp:308
static constexpr double kExcursionReference
Definition speaker_cabinet.hpp:301
static constexpr double kPresenceDbMax
Definition speaker_cabinet.hpp:355
static constexpr double kProximityReferenceCmMax
Definition speaker_cabinet.hpp:333
static constexpr double kAirLossCornerHzMax
Definition speaker_cabinet.hpp:348
static constexpr double kPresenceCornerHzMin
Definition speaker_cabinet.hpp:358
static constexpr double kSemiInductanceShelfDbMin
Definition speaker_cabinet.hpp:287
static constexpr double kSemiInductanceShelfDbMax
Definition speaker_cabinet.hpp:288
static constexpr double kSpeedOfSoundMs
Definition speaker_cabinet.hpp:255
static constexpr double kEdgeDistanceMMin
Definition speaker_cabinet.hpp:382
static constexpr double kDcBlockerHzMax
Definition speaker_cabinet.hpp:424
static constexpr double kBaffleStepDb
Definition speaker_cabinet.hpp:376
static constexpr int kControlBlockMax
Definition speaker_cabinet.hpp:436
static constexpr double kPresenceEdgeDb
Definition speaker_cabinet.hpp:354
static constexpr double kDriveDbDefault
Definition speaker_cabinet.hpp:291
SpeakerBoxType box_type() const
Definition speaker_cabinet.hpp:792
static constexpr double kSemiInductanceMax
Definition speaker_cabinet.hpp:285
void set_mic_distance_cm(double cm)
Definition speaker_cabinet.hpp:555
static constexpr double kOffAxisFactor
Definition speaker_cabinet.hpp:367
static constexpr double kBlFalloff
Definition speaker_cabinet.hpp:307
static constexpr double kDcBlockerHz
Definition speaker_cabinet.hpp:422
static constexpr double kMicDistanceCmMin
Definition speaker_cabinet.hpp:319
static constexpr double kAirLossDbPerCm
Definition speaker_cabinet.hpp:343
double resonance_peak_hz() const
Frequency of that peak: fc / sqrt(1 - 1/(2 Q^2)).
Definition speaker_cabinet.hpp:700
static constexpr double kRipple2Q
Definition speaker_cabinet.hpp:386
static constexpr double kOffAxisOnAxisHz
Definition speaker_cabinet.hpp:364
void prepare(double sample_rate)
Recompute every corner coefficient for a new sample rate. No allocation.
Definition speaker_cabinet.hpp:480
static constexpr double kRipple1Db
Definition speaker_cabinet.hpp:385
static constexpr int kControlBlockMin
Definition speaker_cabinet.hpp:435
static constexpr double kOffAxisOnAxisHzMax
Definition speaker_cabinet.hpp:366
double presence_shelf_db() const
Cap-to-cone traverse shelf, lerped bright-to-dark.
Definition speaker_cabinet.hpp:738
void set_drive_db(double db)
Definition speaker_cabinet.hpp:546
static constexpr double kOutputTrimDbMax
Definition speaker_cabinet.hpp:411
double proximity_gain_db() const
Proximity shelf gain, boost-only by construction and clamped at the ceiling: k_prox * (1/d - 1/d_ref)...
Definition speaker_cabinet.hpp:732
static constexpr double kCmsStiffening
Definition speaker_cabinet.hpp:313
static constexpr double kProximityGainKMax
Definition speaker_cabinet.hpp:330
static constexpr double kAirLossCornerHz
Definition speaker_cabinet.hpp:346
double compliance_ratio() const
Compliance ratio alpha = Vas / Vb.
Definition speaker_cabinet.hpp:670
static constexpr double kDipoleNotchQMin
Definition speaker_cabinet.hpp:403
void set_q_resonance(double q)
Override the computed box Qtc.
Definition speaker_cabinet.hpp:532
int archetype_index() const
Definition speaker_cabinet.hpp:791
static constexpr double kDipolePathM
Definition speaker_cabinet.hpp:396
static constexpr double kBoxVolumeLMin
Definition speaker_cabinet.hpp:259
void set_treble_rolloff_hz(double hz)
Definition speaker_cabinet.hpp:541
static constexpr double kDriveDbMax
Definition speaker_cabinet.hpp:293
static constexpr double kMicAxisDegMin
Definition speaker_cabinet.hpp:370
double bl_beta() const
BL(x) falloff coefficient beta actually in force.
Definition speaker_cabinet.hpp:780
static constexpr double kQResonanceMin
Definition speaker_cabinet.hpp:268
static constexpr double kBreakupQMin
Definition speaker_cabinet.hpp:473
double sample_rate() const
Definition speaker_cabinet.hpp:793
static constexpr double kExcursionReferenceMin
Definition speaker_cabinet.hpp:302
static constexpr double kPresenceDbMin
Definition speaker_cabinet.hpp:356
void process(const SampleType *in, SampleType *out, int n)
Definition speaker_cabinet.hpp:629
static constexpr double kProximityCornerHzMin
Definition speaker_cabinet.hpp:338
static constexpr double kBoxVolumeLDefault
Definition speaker_cabinet.hpp:258
static constexpr double kAirLossDbPerCmMin
Definition speaker_cabinet.hpp:344
static constexpr double kDipolePathMMin
Definition speaker_cabinet.hpp:397
double inductance_magnitude_db(double hz) const
Exact magnitude of the voice-coil inductance stage ALONE, in dB, from the coefficients currently in f...
Definition speaker_cabinet.hpp:754
int latency_samples() const
The chain is a cascade of minimum-phase filters with no block buffering and no oversampler,...
Definition speaker_cabinet.hpp:658
static constexpr double kMicPositionPctDefault
Definition speaker_cabinet.hpp:360
static constexpr double kProximityCeilingDb
Definition speaker_cabinet.hpp:334
static constexpr double kBreakupRatioMin
Definition speaker_cabinet.hpp:471
void set_mic_axis_deg(double degrees)
Definition speaker_cabinet.hpp:565
static constexpr double kProximityCeilingDbMax
Definition speaker_cabinet.hpp:336
static constexpr double kTrebleRolloffHzDefault
Definition speaker_cabinet.hpp:275
double baffle_step_hz() const
Baffle-step transition c / (pi * W).
Definition speaker_cabinet.hpp:708
double worst_case_gain() const
Sum of per-stage peak magnitudes across the parameter space.
Definition speaker_cabinet.hpp:662
void set_compression_amount(double percent)
Definition speaker_cabinet.hpp:551
static constexpr double kAirLossDbPerCmMax
Definition speaker_cabinet.hpp:345
static constexpr double kSemiInductanceDefault
Definition speaker_cabinet.hpp:283
double resonance_q() const
Box Qtc = Qts * sqrt(1 + alpha), unless overridden.
Definition speaker_cabinet.hpp:683
static constexpr double kRipple2Db
Definition speaker_cabinet.hpp:387
static constexpr double kDipoleNotchDb
Definition speaker_cabinet.hpp:405
static constexpr double kBreakupQMax
Definition speaker_cabinet.hpp:474
static constexpr double kAirLossCornerHzMin
Definition speaker_cabinet.hpp:347
double offaxis_corner_hz() const
Off-axis corner f_on * (1 - k_ax * sin(angle)).
Definition speaker_cabinet.hpp:724
static constexpr int kBreakupModeCount
Definition speaker_cabinet.hpp:445
static constexpr double kDipolePathMMax
Definition speaker_cabinet.hpp:398
void set_output_trim_db(double db)
Definition speaker_cabinet.hpp:574
static constexpr double kBreakupRatioMax
Definition speaker_cabinet.hpp:472
void reset()
Zero every filter and excursion state.
Definition speaker_cabinet.hpp:635
static constexpr int kArchetypeCount
Definition speaker_cabinet.hpp:232
static const SpeakerDriverArchetype & archetype(int index)
[design parameter] table; see SpeakerDriverArchetype and the model scope above.
Definition speaker_cabinet.hpp:237
Dual-tap TPT state-variable resonator (Zavalishin topology, identical to SvfT) returning the highpass...
Definition speaker_cabinet.hpp:168
void set_coefficients(double cutoff_hz, double q, double sample_rate)
Definition speaker_cabinet.hpp:175
Taps tick(SampleType input)
Definition speaker_cabinet.hpp:190
void reset()
Definition speaker_cabinet.hpp:201
Round-2 effect-wave vocabulary.
Definition analysis_frontends.hpp:50
T linear_to_db(T linear)
Linear gain → amplitude dB, floored at kDbFloorAmplitude so silence maps to a finite −200 dB rather t...
Definition units.hpp:79
T db_to_linear(T db)
Amplitude dB → linear gain. 0 dB → 1, −6.0206 dB → 0.5.
Definition units.hpp:71
Definition additive_bank.hpp:218
@ peak
Sample peak. Literal, fastest-responding.
Definition feedforward_compressor.hpp:119
SpeakerModelT< float > SpeakerModel
Definition speaker_cabinet.hpp:944
@ c
Definition spectrum_trace.hpp:35
SpeakerModelT< double > SpeakerModel64
Definition speaker_cabinet.hpp:945
SpeakerBoxType
Cabinet topology.
Definition speaker_cabinet.hpp:136
@ sealed
Definition speaker_cabinet.hpp:136
@ open_back
Definition speaker_cabinet.hpp:136
@ v2
Medium vibrato.
Definition scanner_vibrato.hpp:24
@ v3
Full vibrato.
Definition scanner_vibrato.hpp:25
@ v1
Shallow vibrato — scanner output only.
Definition scanner_vibrato.hpp:23
T snap_to_zero(T x)
Returns 0 if |x| < snap_threshold, else x.
Definition denormal.hpp:45
@ i
Definition formant_filter_bank.hpp:20
@ q
Definition input_events.hpp:41
One driver's published-form Thiele-Small set plus the two geometry figures the cabinet and breakup st...
Definition speaker_cabinet.hpp:145
double f_breakup_hz
anchor frequency of the dimensionless mode shape
Definition speaker_cabinet.hpp:150
const char * name
Definition speaker_cabinet.hpp:146
double baffle_width_m
sets the baffle-step transition
Definition speaker_cabinet.hpp:151
double fs_hz
free-air resonance
Definition speaker_cabinet.hpp:147
double vas_litres
equivalent suspension compliance volume
Definition speaker_cabinet.hpp:149
double qts
total Q at fs
Definition speaker_cabinet.hpp:148
One DIMENSIONLESS breakup mode: a ratio to the archetype's anchor frequency plus a Q and a gain.
Definition speaker_cabinet.hpp:452
double q
Definition speaker_cabinet.hpp:454
double gain_db
Definition speaker_cabinet.hpp:455
double ratio
Definition speaker_cabinet.hpp:453
Definition speaker_cabinet.hpp:170
SampleType lowpass
Definition speaker_cabinet.hpp:172
SampleType highpass
Definition speaker_cabinet.hpp:171
First-order topology-preserving transform (TPT) filter.
The real-unit vocabulary shared by every DSP block in the catalog.