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

The TR-808 bass drum's bridged-T network: one second-order system with three inputs (pulse shaper, feedback buffer, retrigger pulse) and two outputs (Vbt, the sound; Vcomm, the node that drives Q43's leakage). More...

#include <bridged_t_resonator.hpp>

Classes

struct  Output

Public Member Functions

void set_components (const BridgedTComponents &c) noexcept
const BridgedTComponents & components () const noexcept
void set_leakage (const Q43Leakage &l) noexcept
const Q43Leakage & leakage () const noexcept
void set_sigh_enabled (bool enabled) noexcept
 Cut the R161 leakage path, which is the pitch sigh's only mechanism.
bool sigh_enabled () const noexcept
void set_rail_voltage (double v) noexcept
 Supply rail, which the op-amp saturates against.
void prepare (double sample_rate) noexcept
void reset () noexcept
 Clear the ring.
void set_attack_shunt (bool active) noexcept
 Ground Q43's collector, shorting out R165.
Output process (double v_plus, double v_fb, double v_rp) noexcept
 Advance one sample. Inputs are voltages at the three injection points.
void snap_denormals () noexcept
 Snap a settled ring to exact zero so a silent voice cannot park denormals in the recursion.
double branch_resistance () const noexcept
 Branch resistance in force on the most recent sample.
double center_frequency_hz () const noexcept
 Centre frequency the network is tuned to right now.

Detailed Description

The TR-808 bass drum's bridged-T network: one second-order system with three inputs (pulse shaper, feedback buffer, retrigger pulse) and two outputs (Vbt, the sound; Vcomm, the node that drives Q43's leakage).

Realized as a single trapezoidally-integrated two-state core whose states are the physical capacitor voltages, NOT as the six transfer functions the superposition analysis produces. The six share one characteristic polynomial – they are one system's output rows, not six filters – and the distinction is load-bearing rather than stylistic:

R_eff is recomputed every sample, at the ring frequency itself, from the ring's own amplitude. Swapping the coefficients of a Direct-Form realization mid-ring reinterprets state whose meaning depends on those coefficients, which perturbs the stored energy; at deep decay settings the network's dissipation is only ~3% per cycle, so that numerical pumping wins and the drum latches into a limit cycle at the rails – audibly, a note that never stops and sits at the wrong pitch. A capacitor voltage is a continuous physical quantity, so a parameter change between samples preserves it exactly and the loop decays at its linear rate under the same modulation.

Direct-Form realizations remain correct for this circuit's fixed-coefficient blocks (pulse shaper, feedback buffer, retrigger filter, output stage) – the hazard is per-sample modulation, not the topology as such.

The caller drives the three inputs and reads both outputs; the shift logic (Q43 leakage -> R_e) lives inside, since Vcomm never leaves the network in the circuit either.

RT contract: prepare() clears state, all state is fixed-size, and process() neither allocates nor locks.

Member Function Documentation

◆ branch_resistance()

double pulp::signal::BridgedTResonator::branch_resistance ( ) const
inlinenoexcept

Branch resistance in force on the most recent sample.

◆ center_frequency_hz()

double pulp::signal::BridgedTResonator::center_frequency_hz ( ) const
inlinenoexcept

Centre frequency the network is tuned to right now.

Tracks the ring amplitude while the sigh is active, which is the whole phenomenon.

◆ components()

const BridgedTComponents & pulp::signal::BridgedTResonator::components ( ) const
inlinenoexcept

◆ leakage()

const Q43Leakage & pulp::signal::BridgedTResonator::leakage ( ) const
inlinenoexcept

◆ prepare()

void pulp::signal::BridgedTResonator::prepare ( double sample_rate)
inlinenoexcept

◆ process()

Output pulp::signal::BridgedTResonator::process ( double v_plus,
double v_fb,
double v_rp )
inlinenoexcept

Advance one sample. Inputs are voltages at the three injection points.

◆ reset()

void pulp::signal::BridgedTResonator::reset ( )
inlinenoexcept

Clear the ring.

Note the deliberate absence of any call to this from a trigger path: a trigger is an additive excitation into a resonator that is still ringing, and resetting here is exactly the machine-gun effect this model exists to avoid.

◆ set_attack_shunt()

void pulp::signal::BridgedTResonator::set_attack_shunt ( bool active)
inlinenoexcept

Ground Q43's collector, shorting out R165.

The envelope generator holds this for a few ms after each trigger, which lifts the centre frequency by over an octave. This is an attack-timbre mechanism and is a separate circuit from the sigh – the two are routinely conflated.

◆ set_components()

void pulp::signal::BridgedTResonator::set_components ( const BridgedTComponents & c)
inlinenoexcept

◆ set_leakage()

void pulp::signal::BridgedTResonator::set_leakage ( const Q43Leakage & l)
inlinenoexcept

◆ set_rail_voltage()

void pulp::signal::BridgedTResonator::set_rail_voltage ( double v)
inlinenoexcept

Supply rail, which the op-amp saturates against.

Modelling the op-amp itself as linear is the paper's choice and is not a shortcut: the 808's character comes from its architecture, not from device nonlinearity. The clip is a bounded-output backstop, not a tone stage.

◆ set_sigh_enabled()

void pulp::signal::BridgedTResonator::set_sigh_enabled ( bool enabled)
inlinenoexcept

Cut the R161 leakage path, which is the pitch sigh's only mechanism.

The paper lists disconnecting it as an architecture-level bend; it is also the control that proves the sigh is emergent rather than scripted.

◆ sigh_enabled()

bool pulp::signal::BridgedTResonator::sigh_enabled ( ) const
inlinenoexcept

◆ snap_denormals()

void pulp::signal::BridgedTResonator::snap_denormals ( )
inlinenoexcept

Snap a settled ring to exact zero so a silent voice cannot park denormals in the recursion.

Call at block boundaries, never per sample: the states carry the ring, and the threshold is far below any audible tail but is still a lie if applied often enough to matter.


The documentation for this class was generated from the following file: