@openmixer/omx-contract 1.3.0 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -13,6 +13,95 @@ export declare const PAN_RANGE: {
13
13
  readonly unit: "";
14
14
  };
15
15
 
16
+ /**
17
+ * The side of the threshold the band acts on. Above acts when the band is loud, taming a resonance that only rings when pushed; below acts when it is quiet, lifting a band that drops out. The order is the integer the kernel reads: above is 0, below is 1.
18
+ * @see data/kernels/band_dyn.json
19
+ */
20
+ export declare const BAND_DYN_MODES: readonly ["above", "below"];
21
+
22
+ /**
23
+ * Where the band starts to act, in dB of the band's own level and not the strip's. It is the same fact the de-esser's threshold is, so it carries the same travel.
24
+ * @see data/kernels/band_dyn.json
25
+ */
26
+ export declare const BAND_DYN_THRESHOLD_RANGE: {
27
+ readonly min: -60;
28
+ readonly max: 0;
29
+ readonly step: 0.5;
30
+ readonly unit: "dB";
31
+ readonly default: -30;
32
+ readonly defaultFrom: "desk";
33
+ };
34
+
35
+ /**
36
+ * How hard the band is held once it is past its threshold. 2:1 rather than the de-esser's 4:1, because a dynamic band is corrective, not a limiter for a sibilant.
37
+ * @see data/kernels/band_dyn.json
38
+ */
39
+ export declare const BAND_DYN_RATIO_RANGE: {
40
+ readonly min: 1;
41
+ readonly max: 20;
42
+ readonly step: 0.1;
43
+ readonly unit: "";
44
+ readonly default: 2;
45
+ readonly defaultFrom: "desk";
46
+ };
47
+
48
+ /**
49
+ * The most the band may add to its static gain, signed: below zero the deepest cut, above zero the largest boost. The ceiling of +12 keeps static plus dynamic inside the EQ's own travel. Zero makes the band inert without switching it off.
50
+ * @see data/kernels/band_dyn.json
51
+ */
52
+ export declare const BAND_DYN_RANGE_RANGE: {
53
+ readonly min: -24;
54
+ readonly max: 12;
55
+ readonly step: 0.5;
56
+ readonly unit: "dB";
57
+ readonly default: -6;
58
+ readonly defaultFrom: "desk";
59
+ };
60
+
61
+ /**
62
+ * The detector's attack, in ms. The travel stops at the oversampling floor, below which the band would need the compressor's delayed control path.
63
+ * @see data/kernels/band_dyn.json
64
+ */
65
+ export declare const BAND_DYN_ATTACK_RANGE: {
66
+ readonly min: 0.5;
67
+ readonly max: 100;
68
+ readonly step: 0.1;
69
+ readonly unit: "ms";
70
+ readonly default: 5;
71
+ readonly defaultFrom: "desk";
72
+ };
73
+
74
+ /**
75
+ * The detector's release, in ms. 100 ms is long enough not to modulate a 40 Hz band inside four cycles.
76
+ * @see data/kernels/band_dyn.json
77
+ */
78
+ export declare const BAND_DYN_RELEASE_RANGE: {
79
+ readonly min: 5;
80
+ readonly max: 3000;
81
+ readonly step: 1;
82
+ readonly unit: "ms";
83
+ readonly default: 100;
84
+ readonly defaultFrom: "desk";
85
+ };
86
+
87
+ /**
88
+ * The soft knee of the band's gain computer, in dB. One knee for the one band-dynamics word, shared by every stage that runs it, the de-esser included: a second spelling of 6 would be a second place where the reduction starts.
89
+ * @see data/kernels/band_dyn.json
90
+ */
91
+ export declare const BAND_DYN_KNEE_DB: 6;
92
+
93
+ /**
94
+ * How many dynamic bands a channel may hold. A dynamic band is an operator band, so the capacity is the operator's reserve, read and not typed again.
95
+ * @see data/kernels/band_dyn.json
96
+ */
97
+ export declare const BAND_DYN_MAX_BANDS: 9;
98
+
99
+ /**
100
+ * The shortest attack, in ms, at which the compressor's detector does not alias. Below it the compressor engages its 4x control path, which adds 72 samples of latency; a zero-latency band has no such path, so its attack travel stops at this floor.
101
+ * @see data/kernels/band_dyn.json
102
+ */
103
+ export declare const DETECTOR_OVERSAMPLE_AUTO_MS: 0.5;
104
+
16
105
  /**
17
106
  * The chorus's right-leg phase offset, in TURNS of its one oscillator (§2, §3a; the native-FX catalogue's M32 Dimension row). The right leg's voice k reads the LFO at k/N + spread: 0 is both legs one phase (the stage without the field, bit for bit), 0.25 quadrature, 0.5 the Dimension's opposed sweep. A fraction of a cycle carries no engineering symbol, so the unit is ''.
18
107
  * @see data/kernels/chorus.json
@@ -262,16 +351,16 @@ export declare const DEESS_RELEASE_RANGE: {
262
351
  };
263
352
 
264
353
  /**
265
- * The knee, in dB — a CONSTANT of the stage and not a row field (`2026-09-22-native-deesser-stage.md` §4b): a de-esser without a soft knee latches audibly on the first sibilant of a phrase, and no other value of this number is a de-esser anyone would dial. The controller pushes it to the node and this is the same number; a second spelling would be a picture that disagrees with the audio about where the reduction starts.
354
+ * The de-esser's modes, in the order of the integer the kernel reads: split attenuates the detected band only, wideband the whole signal while the sibilance lasts.
266
355
  * @see data/kernels/deesser.json
267
356
  */
268
- export declare const DEESS_KNEE_DB: 6;
357
+ export declare const DEESS_MODES: readonly ["split", "wideband"];
269
358
 
270
359
  /**
271
- * The de-esser's modes, in the order of the integer the kernel reads: split attenuates the detected band only, wideband the whole signal while the sibilance lasts.
360
+ * The knee, in dB — a CONSTANT of the stage and not a row field (`2026-09-22-native-deesser-stage.md` §4b): a de-esser without a soft knee latches audibly on the first sibilant of a phrase, and no other value of this number is a de-esser anyone would dial. The controller pushes it to the node and this is the same number; a second spelling would be a picture that disagrees with the audio about where the reduction starts.
272
361
  * @see data/kernels/deesser.json
273
362
  */
274
- export declare const DEESS_MODES: readonly ["split", "wideband"];
363
+ export declare const DEESS_KNEE_DB: 6;
275
364
 
276
365
  /**
277
366
  * The FX delay's time travel. `max` is the NATIVE ring's ceiling — the same number as `OMX_FXDELAY_MAX_MS` in `omx_delay.h`, pinned to it by `output-delay-ceiling.test.ts`. Distinct from the per-route ALIGNMENT delay (`OUTPUT_DELAY_RANGE`, 1 s, `OMX_DELAY_MAX_MS`): one is a musical echo with feedback and mix, the other is a pure latency. Two facts, two rings, two ceilings — sharing the word "delay" is why they keep being confused for each other.
@@ -334,12 +423,6 @@ export declare const DELAY_MIX_RANGE: {
334
423
  */
335
424
  export declare const FX_DELAY_PINGPONG_DEFAULT: false;
336
425
 
337
- /**
338
- * The bias at `character = +1`, in the SHAPER's own input units — `OMX_DRIVE_BIAS_MAX`. DERIVED, not chosen (§4b). In the saturating limit every knee tends to `sgn`, the output is a rectangular wave of duty `d = ½ + asin(b)/π`, and its `n`th harmonic goes as `sin(nπd)/n` — so `|H2|` is maximal at `d = ¾`, which is `b = sin(π/4) = 1/√2` exactly. Measured too: the H2-maximising bias for a full-scale sine at unity drive is 0.712 (soft), 0.658 (tape), 0.645 (tube), and this one value costs 0.000 / 0.035 / 0.088 dB of H2 against each curve's own optimum. ONE normalised bias for all three knees, not three.
339
- * @see data/kernels/drive.json
340
- */
341
- export declare const DRIVE_BIAS_MAX: 0.7071067811865476;
342
-
343
426
  /**
344
427
  * The PRE-CURVE gain, in dB. 0 dB is unity into the curve, so a stage switched on at its defaults changes almost nothing — which is what an `on` switch should mean. The ceiling is where every curve is saturating hard on any signal a console carries.
345
428
  * @see data/kernels/drive.json
@@ -418,22 +501,10 @@ export declare const DRIVE_CURVES: readonly ["soft", "tape", "tube", "exciter"];
418
501
  export declare const DRIVE_BANDS: readonly ["full", "low", "high", "tilt"];
419
502
 
420
503
  /**
421
- * The maximum number of parametric bands a channel EQ may hold — the operator can add up to this many. Generated into `omx_contract_limits.h` as `OMX_EQ_MAX_BANDS`, which `omx_biquad.h` reads (`output-delay-ceiling.test.ts` reads the header): the native lane allocates exactly this many biquad slots per channel and silently clamps above it, so the model, the wire, and the DSP agree by test, not by memory.
422
- * @see data/kernels/eq.json
423
- */
424
- export declare const EQ_MAX_BANDS: 24;
425
-
426
- /**
427
- * The standard ISO 266 one-third-octave centre frequencies, 20 Hz–20 kHz (31 bands) — the classic 31-band graphic-EQ layout's centres.
428
- * @see data/kernels/eq.json
429
- */
430
- export declare const ISO_THIRD_OCTAVE_CENTRES_HZ: readonly [20, 25, 31.5, 40, 50, 63, 80, 100, 125, 160, 200, 250, 315, 400, 500, 630, 800, 1000, 1250, 1600, 2000, 2500, 3150, 4000, 5000, 6300, 8000, 10000, 12500, 16000, 20000];
431
-
432
- /**
433
- * The graphic EQ's section count: DERIVED from ISO_THIRD_OCTAVE_CENTRES_HZ, never a second literal. Generated into `omx_contract_limits.h` as `OMX_GEQ_BANDS`, which sizes `mix_geq.h`'s section array — its OWN budget, never a claimant on EQ_MAX_BANDS (graphic-eq-31 spec §3, roster ruling 3).
434
- * @see data/kernels/eq.json
504
+ * The bias at `character = +1`, in the SHAPER's own input units — `OMX_DRIVE_BIAS_MAX`. DERIVED, not chosen (§4b). In the saturating limit every knee tends to `sgn`, the output is a rectangular wave of duty `d = ½ + asin(b)/π`, and its `n`th harmonic goes as `sin(nπd)/n` — so `|H2|` is maximal at `d = ¾`, which is `b = sin(π/4) = 1/√2` exactly. Measured too: the H2-maximising bias for a full-scale sine at unity drive is 0.712 (soft), 0.658 (tape), 0.645 (tube), and this one value costs 0.000 / 0.035 / 0.088 dB of H2 against each curve's own optimum. ONE normalised bias for all three knees, not three.
505
+ * @see data/kernels/drive.json
435
506
  */
436
- export declare const GEQ_BANDS: 31;
507
+ export declare const DRIVE_BIAS_MAX: 0.7071067811865476;
437
508
 
438
509
  /**
439
510
  * The frequency band a parametric band can be dragged across.
@@ -501,12 +572,6 @@ export declare const LPF_FREQ_RANGE: {
501
572
  readonly unit: "Hz";
502
573
  };
503
574
 
504
- /**
505
- * The band slots kept for the operator's own hand: the reserve the feedback suppressor and the ring correction may never eat into. Nine is the working set a live EQ actually holds. The budget OPERATOR_EQ_BANDS_RESERVE + FBS_DEFAULT_MAX_AUTO_BANDS + HRP_DEFAULT_MAX_AUTO_BANDS (9 + 6 + 8 = 23) must fit EQ_MAX_BANDS, and `omx-contract validate` refuses data where it does not.
506
- * @see data/kernels/eq.json
507
- */
508
- export declare const OPERATOR_EQ_BANDS_RESERVE: 9;
509
-
510
575
  /**
511
576
  * The generic EQ band shapes, in the order a picker offers them and in the order of the integer a plugin host sees on a band type port. The id is the name; the position is the value. A bell is the shape a band added by the operator starts as.
512
577
  * @see data/kernels/eq.json
@@ -519,6 +584,30 @@ export declare const EQ_BAND_TYPES: readonly ["bell", "lowShelf", "highShelf", "
519
584
  */
520
585
  export declare const FILTER_SLOPES: readonly [12, 24];
521
586
 
587
+ /**
588
+ * The maximum number of parametric bands a channel EQ may hold — the operator can add up to this many. Generated into `omx_contract_limits.h` as `OMX_EQ_MAX_BANDS`, which `omx_biquad.h` reads (`output-delay-ceiling.test.ts` reads the header): the native lane allocates exactly this many biquad slots per channel and silently clamps above it, so the model, the wire, and the DSP agree by test, not by memory.
589
+ * @see data/kernels/eq.json
590
+ */
591
+ export declare const EQ_MAX_BANDS: 24;
592
+
593
+ /**
594
+ * The standard ISO 266 one-third-octave centre frequencies, 20 Hz–20 kHz (31 bands) — the classic 31-band graphic-EQ layout's centres.
595
+ * @see data/kernels/eq.json
596
+ */
597
+ export declare const ISO_THIRD_OCTAVE_CENTRES_HZ: readonly [20, 25, 31.5, 40, 50, 63, 80, 100, 125, 160, 200, 250, 315, 400, 500, 630, 800, 1000, 1250, 1600, 2000, 2500, 3150, 4000, 5000, 6300, 8000, 10000, 12500, 16000, 20000];
598
+
599
+ /**
600
+ * The graphic EQ's section count: DERIVED from ISO_THIRD_OCTAVE_CENTRES_HZ, never a second literal. Generated into `omx_contract_limits.h` as `OMX_GEQ_BANDS`, which sizes `mix_geq.h`'s section array — its OWN budget, never a claimant on EQ_MAX_BANDS (graphic-eq-31 spec §3, roster ruling 3).
601
+ * @see data/kernels/eq.json
602
+ */
603
+ export declare const GEQ_BANDS: 31;
604
+
605
+ /**
606
+ * The band slots kept for the operator's own hand: the reserve the feedback suppressor and the ring correction may never eat into. Nine is the working set a live EQ actually holds. The budget OPERATOR_EQ_BANDS_RESERVE + FBS_DEFAULT_MAX_AUTO_BANDS + HRP_DEFAULT_MAX_AUTO_BANDS (9 + 6 + 8 = 23) must fit EQ_MAX_BANDS, and `omx-contract validate` refuses data where it does not.
607
+ * @see data/kernels/eq.json
608
+ */
609
+ export declare const OPERATOR_EQ_BANDS_RESERVE: 9;
610
+
522
611
  /**
523
612
  * How many bands each strip type's EQ starts with (`default`) and may hold (`max`). `channel` is the console's channel strip: it starts with four and the operator adds bands up to EQ_MAX_BANDS (a band added takes the frequency it is added at, so no default is declared for it). `strip` is the omx-strip plugin's EQ and `eq8`, `eq16` and `eq32` the omx-eq plugins, whose bands are fixed. A default may never exceed its maximum, and the default centres of any count come from the one default rule, whatever the strip.
524
613
  * @see data/kernels/eq.json
@@ -772,6 +861,12 @@ export declare const FLANGER_BASE_MS: 0.5;
772
861
  */
773
862
  export declare const FLANGER_MAX_MS: 6;
774
863
 
864
+ /**
865
+ * Where the gate listens: its own input (self), or the key it is handed (sidechain), in the order of the integer the key port carries.
866
+ * @see data/kernels/gate.json
867
+ */
868
+ export declare const GATE_KEY_SOURCES: readonly ["self", "sidechain"];
869
+
775
870
  /**
776
871
  * The legal range of each gate field (engineering units). The widget clamps drags to these, `normalizeGate` enforces them, the row's codec refuses by them and the travel sheet publishes them — one source of truth. `rangeDb` reaches GATE_RANGE_FLOOR_DB, shown as "−∞" in readouts (a gate fully closed is silence).
777
872
  * @see data/kernels/gate.json
@@ -851,12 +946,6 @@ export declare const GATE_LIMITS: {
851
946
  };
852
947
  };
853
948
 
854
- /**
855
- * Where the gate listens: its own input (self), or the key it is handed (sidechain), in the order of the integer the key port carries.
856
- * @see data/kernels/gate.json
857
- */
858
- export declare const GATE_KEY_SOURCES: readonly ["self", "sidechain"];
859
-
860
949
  /**
861
950
  * One graphic-EQ fader's travel: EQ_GAIN_RANGE by reference (a graphic fader is an EQ gain), with the come-up value it needs as a row field — flat, 0 dB (graphic-eq-31 spec §3).
862
951
  * @see data/kernels/geq.json
@@ -888,6 +977,19 @@ export declare const GEQ_PROTO_DB: 12;
888
977
  */
889
978
  export declare const GEQ_DESIGN_GAIN_MAX_DB: 30;
890
979
 
980
+ /**
981
+ * How much of the computed correction HRP applies: 0 = analyse only, 1 = the full cut. It comes up at 0.5, half the computed cut.
982
+ * @see data/kernels/hrp.json
983
+ */
984
+ export declare const HRP_AMOUNT_RANGE: {
985
+ readonly min: 0;
986
+ readonly max: 1;
987
+ readonly step: 0;
988
+ readonly unit: "";
989
+ readonly default: 0.5;
990
+ readonly defaultFrom: "desk";
991
+ };
992
+
891
993
  /**
892
994
  * The largest automatic cut HRP may place on one harmonic, as a POSITIVE dB magnitude. Well inside the ±15 dB an operator band may hold (core's `EQ_GAIN_LIMIT_DB`): an automatic correction the operator did not ask for gets far less authority than one they dialled themselves.
893
995
  * @see data/kernels/hrp.json
@@ -936,18 +1038,6 @@ export declare const HRP_ATTRIBUTION_CENTS: 60;
936
1038
  */
937
1039
  export declare const HRP_DEFAULT_MAX_AUTO_BANDS: 8;
938
1040
 
939
- /**
940
- * How much of the computed correction HRP applies: 0 = analyse only, 1 = the full cut. It comes up at 0.5, half the computed cut.
941
- * @see data/kernels/hrp.json
942
- */
943
- export declare const HRP_AMOUNT_RANGE: {
944
- readonly min: 0;
945
- readonly max: 1;
946
- readonly step: 0;
947
- readonly unit: "";
948
- readonly default: 0.5;
949
- };
950
-
951
1041
  /**
952
1042
  * The precision limiter's travels (`2026-09-27-precision-limiter.md` §2), rendered into `omx_contract_limits.h` as `OMX_LIMITER_*` by `harness/contract-limits-gen.mjs`, so `mix_limiter.h` reads them and never restates one (R-094). The ceiling is a TRUE peak in dBFS (the ×4 detector); the look-ahead sets the declared latency; the release is the envelope's time constant on the gain depth.
953
1043
  * @see data/kernels/limiter.json
@@ -1037,12 +1127,6 @@ export declare const PHASER_STAGES_RANGE: {
1037
1127
  readonly defaultFrom: "desk";
1038
1128
  };
1039
1129
 
1040
- /**
1041
- * The member set the `stages` field accepts: PHASER_STAGES_RANGE walked by its step.
1042
- * @see data/kernels/phaser.json
1043
- */
1044
- export declare const PHASER_STAGE_COUNTS: readonly [2, 4, 6, 8, 10, 12];
1045
-
1046
1130
  /**
1047
1131
  * The phaser's SIGNED resonance (§3). ±0.9, tighter than the flanger's ±0.95: the loop runs through a time-varying chain. Declared here (the refusal half); the kernel's clamp is the enforcement half.
1048
1132
  * @see data/kernels/phaser.json
@@ -1116,6 +1200,12 @@ export declare const PHASER_TRAVELS: {
1116
1200
  };
1117
1201
  };
1118
1202
 
1203
+ /**
1204
+ * The member set the `stages` field accepts: PHASER_STAGES_RANGE walked by its step.
1205
+ * @see data/kernels/phaser.json
1206
+ */
1207
+ export declare const PHASER_STAGE_COUNTS: readonly [2, 4, 6, 8, 10, 12];
1208
+
1119
1209
  /**
1120
1210
  * The highest frequency the phaser's all-pass sweep reaches, Hz.
1121
1211
  * @see data/kernels/phaser.json
@@ -1416,6 +1506,12 @@ export declare const ROTARY_MIX_RANGE: {
1416
1506
  readonly defaultFrom: "desk";
1417
1507
  };
1418
1508
 
1509
+ /**
1510
+ * The rotary speaker's speed settings, in the order of the integer the kernel reads: the rotors stopped, at their chorale (slow) rate, or at their tremolo (fast) rate.
1511
+ * @see data/kernels/rotary.json
1512
+ */
1513
+ export declare const ROTARY_SPEEDS: readonly ["stop", "slow", "fast"];
1514
+
1419
1515
  /**
1420
1516
  * The rotary's numeric travels, field → declaration: the ONE map the row's state, its bounds, its OPTIONS and its controller read (`speed` is a member set, ROTARY_SPEEDS, beside it).
1421
1517
  * @see data/kernels/rotary.json
@@ -1551,12 +1647,6 @@ export declare const ROTARY_STOP_EPS: 0.0001;
1551
1647
  */
1552
1648
  export declare const ROTARY_RING_FLOATS: 256;
1553
1649
 
1554
- /**
1555
- * The rotary speaker's speed settings, in the order of the integer the kernel reads: the rotors stopped, at their chorale (slow) rate, or at their tremolo (fast) rate.
1556
- * @see data/kernels/rotary.json
1557
- */
1558
- export declare const ROTARY_SPEEDS: readonly ["stop", "slow", "fast"];
1559
-
1560
1650
  /**
1561
1651
  * The RTA's target bin resolution — generated into `omx_contract_limits.h` as `OMX_RTA_TARGET_BIN_HZ`, which `mix_dsp.h` reads; `rta-window-derivation.test.ts` reads it back from the header.
1562
1652
  * @see data/kernels/rta.json
@@ -1679,6 +1769,12 @@ export declare const TREMOLO_MIX_RANGE: {
1679
1769
  readonly defaultFrom: "desk";
1680
1770
  };
1681
1771
 
1772
+ /**
1773
+ * What the tremolo's one oscillator modulates, in the order of the integer the kernel reads: the level of both legs in phase (tremolo), or the balance law's position with the legs in opposition (pan).
1774
+ * @see data/kernels/tremolo.json
1775
+ */
1776
+ export declare const TREMOLO_MODES: readonly ["tremolo", "pan"];
1777
+
1682
1778
  /**
1683
1779
  * The tremolo's numeric travels, field → declaration: the ONE map the row's state, its bounds, its OPTIONS and its controller read (`mode` is a member set, TREMOLO_MODES, beside it).
1684
1780
  * @see data/kernels/tremolo.json
@@ -1710,12 +1806,6 @@ export declare const TREMOLO_TRAVELS: {
1710
1806
  };
1711
1807
  };
1712
1808
 
1713
- /**
1714
- * What the tremolo's one oscillator modulates, in the order of the integer the kernel reads: the level of both legs in phase (tremolo), or the balance law's position with the legs in opposition (pan).
1715
- * @see data/kernels/tremolo.json
1716
- */
1717
- export declare const TREMOLO_MODES: readonly ["tremolo", "pan"];
1718
-
1719
1809
  /**
1720
1810
  * The Q of a second-order Butterworth section, 1/√2 — maximally flat, the one value every Butterworth biquad in the tree designs at: the LR4 crossover section, the pitch pre-filter and the drive's tilt / band / HF sections, in TS and (as `OMX_BUTTERWORTH_Q`) in C (§7, the scalar door).
1721
1811
  * @see data/primitives.json