The hrp-tagged band set describing one fundamental's correction.
PURE: same inputs, same output. gainsDb[k] is harmonic k + 1, so gainsDb[3] is H4 at
4 × f0Hz — H1 is the fundamental itself, and the zero-based index over a one-based ladder is
the off-by-one this function exists to get right in one place.
Bands come back ID-LESS and in ascending frequency. Ids are the store's to mint: a band
carrying an invented id is unaddressable at /channel/{kind}/{index}/eq/bands/{bandId}
forever.
The shape is always bell, never notch, and that is behavioural rather than cosmetic. A
notch carries no gain, so a 0 dB notch is NOT identity — it is published enabled and its very
narrow response runs on audio. A bell at 0 dB is identity, parks itself (enabled: false) and
is skipped bit-identically by the kernel while keeping its state slot index-aligned, which is
what lets a correction be ramped to nothing and removed without a click.
Every unusable input yields an empty array. Absence is a fact, not a throw: this runs on a
live analysis feed, and a detector with no answer must be able to say so.
The
hrp-tagged band set describing one fundamental's correction.PURE: same inputs, same output.
gainsDb[k]is harmonic k + 1, sogainsDb[3]is H4 at4 × f0Hz— H1 is the fundamental itself, and the zero-based index over a one-based ladder is the off-by-one this function exists to get right in one place.Bands come back ID-LESS and in ascending frequency. Ids are the store's to mint: a band carrying an invented id is unaddressable at
/channel/{kind}/{index}/eq/bands/{bandId}forever.The shape is always
bell, nevernotch, and that is behavioural rather than cosmetic. A notch carries no gain, so a 0 dB notch is NOT identity — it is published enabled and its very narrow response runs on audio. A bell at 0 dB is identity, parks itself (enabled: false) and is skipped bit-identically by the kernel while keeping its state slot index-aligned, which is what lets a correction be ramped to nothing and removed without a click.Every unusable input yields an empty array. Absence is a fact, not a throw: this runs on a live analysis feed, and a detector with no answer must be able to say so.