Jet and lip voices never go quiet on release; the ring backstop frees them minutes late #74

Open
opened 2026-09-08 14:34:40 +00:00 by bcox · 0 comments
Owner

Both wind valves self-sustain at zero pressure: the jet's force law carries no pressure-amplitude term (pressure only sets the delay length), and kLip's slope at the origin is unbounded, so a released voice keeps a nonzero drive and quiet_run_ never starts. The factory jet/lip patches route breath onto kLevel to silence the output, but the voice itself is freed only by the lap-counted ring backstop (kRingBackstopLaps = 16384 laps x line length): about 31 s at the flute's key 72, about 8 minutes at the low-flue's floor of key 24 -- all at full per-sample render cost, inaudible the whole time.

Voice stealing covers correctness, but polyphony and CPU budgets should not carry silent zombie voices for minutes. Same class as #58 (hi-hat never retires while the pedal is held).

Two fix directions, either sufficient:

  • a pressure-amplitude term in the jet's force (physically honest anyway -- jet velocity sets both transit time and strength; noted in dsp/waveguide.h's jet comments), with the same question asked of the lip's opening;
  • gate the valve drives on the breath envelope's end, so release genuinely stops the excitation.

Context: waveguide engine merged at 5bef851 (WVGD, minor 37). The backstop's mechanism and the measured hold times are documented at the constant's definition in dsp/waveguide_layer.h.

Both wind valves self-sustain at zero pressure: the jet's force law carries no pressure-amplitude term (pressure only sets the delay length), and `kLip`'s slope at the origin is unbounded, so a released voice keeps a nonzero drive and `quiet_run_` never starts. The factory jet/lip patches route breath onto `kLevel` to silence the *output*, but the voice itself is freed only by the lap-counted ring backstop (`kRingBackstopLaps = 16384` laps x line length): about 31 s at the flute's key 72, about 8 minutes at the low-flue's floor of key 24 -- all at full per-sample render cost, inaudible the whole time. Voice stealing covers correctness, but polyphony and CPU budgets should not carry silent zombie voices for minutes. Same class as #58 (hi-hat never retires while the pedal is held). Two fix directions, either sufficient: - a pressure-amplitude term in the jet's force (physically honest anyway -- jet velocity sets both transit time and strength; noted in `dsp/waveguide.h`'s jet comments), with the same question asked of the lip's opening; - gate the valve drives on the breath envelope's end, so release genuinely stops the excitation. Context: waveguide engine merged at 5bef851 (WVGD, minor 37). The backstop's mechanism and the measured hold times are documented at the constant's definition in `dsp/waveguide_layer.h`.
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
bcox/tymbal#74
No description provided.