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. | |
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.
|
inlinenoexcept |
Branch resistance in force on the most recent sample.
|
inlinenoexcept |
Centre frequency the network is tuned to right now.
Tracks the ring amplitude while the sigh is active, which is the whole phenomenon.
|
inlinenoexcept |
|
inlinenoexcept |
|
inlinenoexcept |
|
inlinenoexcept |
Advance one sample. Inputs are voltages at the three injection points.
|
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.
|
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.
|
inlinenoexcept |
|
inlinenoexcept |
|
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.
|
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.
|
inlinenoexcept |
|
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.