FM kFrequency: max_deviation_hz needs a keytrack, because no constant is right across a range #65

Open
opened 2026-09-05 23:17:48 +00:00 by bcox · 0 comments
Owner

Patch::Ranges::max_deviation_hz is the full scale of the FM depth lane under
Patch::IndexLaw::kFrequency, and it defaults to 4000.0. That default was chosen
on paper. It has now been checked against a sound -- patches/chowning_horn.h is
the bank's first frequency-law patch -- and the conclusion is that the default
is fine and the parameterization is the problem.

Under this law the index is derived, I = d / fm. With d a constant in hertz
and fm rising with the note, the index falls as 1/fm: across chowning-horn's
declared C2-C5 that is a 16x span by construction. So:

  • At C3 with ratio 1, a musically ordinary index of 5 wants d about 654 Hz --
    16% of a 4000 Hz lane.
  • At C6 the same index wants about 5233 Hz -- 131% of it. The lane runs out.

Lowering 4000 makes the top worse; raising it makes the bottom worse. No constant
is right at both ends.

Why the obvious fixes are wrong. "The bottom of the lane is too coarse" does
not hold: the lane is Q1.30, one LSB is 3.7 uHz, and a timeline pixel is 0.18 of
index at C3. The useful settings are compressed into the bottom of the travel,
not hard to dial. And making the lane logarithmic would turn every authored
deviation ramp into an exponential index ramp -- exactly what a brass attack needs
it not to do, and most of what this law was adopted for.

The actual lever is a keytrack on the deviation: scale d by some power of
fc so the index holds where the author put it, with the exponent as the authored
quantity. Exponent 0 is today's behavior (constant hertz, index falls 16x across
four octaves); exponent 1 is the phase law (constant index); the interesting
instruments live between. That makes the two laws the ends of one continuum rather
than a switch, which is worth deciding before building it.

Not urgent: chowning-horn sounds right across its declared range as it is, and
max_deviation_hz is serialized at patch minor 31, so changing the default is not
free. Filed so the reasoning is not re-derived.

Found while validating the 4000 Hz default on branch fm-followups.

`Patch::Ranges::max_deviation_hz` is the full scale of the FM depth lane under `Patch::IndexLaw::kFrequency`, and it defaults to 4000.0. That default was chosen on paper. It has now been checked against a sound -- `patches/chowning_horn.h` is the bank's first frequency-law patch -- and the conclusion is that **the default is fine and the parameterization is the problem.** Under this law the index is derived, `I = d / fm`. With `d` a constant in hertz and `fm` rising with the note, the index falls as `1/fm`: across chowning-horn's declared C2-C5 that is a 16x span by construction. So: - At C3 with ratio 1, a musically ordinary index of 5 wants `d` about 654 Hz -- 16% of a 4000 Hz lane. - At C6 the same index wants about 5233 Hz -- 131% of it. The lane runs out. Lowering 4000 makes the top worse; raising it makes the bottom worse. No constant is right at both ends. **Why the obvious fixes are wrong.** "The bottom of the lane is too coarse" does not hold: the lane is Q1.30, one LSB is 3.7 uHz, and a timeline pixel is 0.18 of index at C3. The useful settings are compressed into the bottom of the travel, not hard to dial. And making the lane logarithmic would turn every authored deviation ramp into an exponential index ramp -- exactly what a brass attack needs it *not* to do, and most of what this law was adopted for. **The actual lever is a keytrack on the deviation**: scale `d` by some power of `fc` so the index holds where the author put it, with the exponent as the authored quantity. Exponent 0 is today's behavior (constant hertz, index falls 16x across four octaves); exponent 1 is the phase law (constant index); the interesting instruments live between. That makes the two laws the ends of one continuum rather than a switch, which is worth deciding before building it. Not urgent: chowning-horn sounds right across its declared range as it is, and `max_deviation_hz` is serialized at patch minor 31, so changing the default is not free. Filed so the reasoning is not re-derived. Found while validating the 4000 Hz default on branch `fm-followups`.
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#65
No description provided.