@openmixer/omx-contract 1.0.0 → 1.2.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.
@@ -2,6 +2,17 @@
2
2
  // Copyright (C) 2026 Pau Aliagas <linuxnow@gmail.com>
3
3
  // GENERATED by `omx-contract render --target ts` from FreeMixer/omx-contract's data/ — do not edit.
4
4
 
5
+ /**
6
+ * The PAN travel — −1 (hard left) … 0 (center) … +1 (hard right). A property of the pan law itself, not of any desk, so it is declared once. Continuous: a pan position has no quantum, and panGains clamps to these bounds.
7
+ * @see data/kernels/balance.json
8
+ */
9
+ export declare const PAN_RANGE: {
10
+ readonly min: -1;
11
+ readonly max: 1;
12
+ readonly step: 0;
13
+ readonly unit: "";
14
+ };
15
+
5
16
  /**
6
17
  * 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 ''.
7
18
  * @see data/kernels/chorus.json
@@ -15,6 +26,58 @@ export declare const CHORUS_SPREAD_RANGE: {
15
26
  readonly defaultFrom: "desk";
16
27
  };
17
28
 
29
+ /**
30
+ * The chorus sweep's speed (§3a). Above ~3 Hz it stops being a chorus and becomes a vibrato.
31
+ * @see data/kernels/chorus.json
32
+ */
33
+ export declare const CHORUS_RATE_RANGE: {
34
+ readonly min: 0.05;
35
+ readonly max: 8;
36
+ readonly step: 0.01;
37
+ readonly unit: "Hz";
38
+ readonly default: 0.6;
39
+ readonly defaultFrom: "desk";
40
+ };
41
+
42
+ /**
43
+ * The chorus's peak-to-peak excursion above its declared 10 ms base (§3a).
44
+ * @see data/kernels/chorus.json
45
+ */
46
+ export declare const CHORUS_DEPTH_RANGE: {
47
+ readonly min: 0;
48
+ readonly max: 12;
49
+ readonly step: 0.1;
50
+ readonly unit: "ms";
51
+ readonly default: 4;
52
+ readonly defaultFrom: "desk";
53
+ };
54
+
55
+ /**
56
+ * The chorus's tap count — one oscillator read at k/N (§3a).
57
+ * @see data/kernels/chorus.json
58
+ */
59
+ export declare const CHORUS_VOICES_RANGE: {
60
+ readonly min: 1;
61
+ readonly max: 4;
62
+ readonly step: 1;
63
+ readonly unit: "";
64
+ readonly default: 3;
65
+ readonly defaultFrom: "desk";
66
+ };
67
+
68
+ /**
69
+ * The chorus's wet/dry, as an instance of DRIVE_MIX_RANGE — the same percent travel, its own come-up value: 35 %, a colour under the dry on a strip (§3a). The REVERB_LOWCUT_RANGE-over- REVERB_CUT_RANGE shape: one travel, one declared default per field that reads it.
70
+ * @see data/kernels/chorus.json
71
+ */
72
+ export declare const CHORUS_MIX_RANGE: {
73
+ readonly min: 0;
74
+ readonly max: 100;
75
+ readonly step: 0.1;
76
+ readonly unit: "%";
77
+ readonly default: 35;
78
+ readonly defaultFrom: "desk";
79
+ };
80
+
18
81
  /**
19
82
  * The legal range of each compressor field (engineering units). The widget clamps drags to these, `normalizeComp` enforces them, the row's codec refuses by them and the travel sheet publishes them. `default`/`defaultFrom` are the come-up values `defaultCompState` seeds a fresh strip with, read BACK from here rather than restated there.
20
83
  * @see data/kernels/comp.json
@@ -95,6 +158,103 @@ export declare const PROGRAM_RELEASE: {
95
158
  };
96
159
  };
97
160
 
161
+ /**
162
+ * The detector band's CENTRE, in Hz. Sibilance lives at 5–10 kHz on most voices; 7 kHz with the default width covers 4 950–9 900 Hz, which is where an "s" and a "t" sit on a close vocal mic. The travel is wider than the come-up on both sides on purpose: a bright female vocal wants the band up near 9 kHz and a chesty male one down at 5, and a surface narrower than the row removes reach the console genuinely has (the same reasoning core's `REVERB_CUT_RANGE` records).
163
+ * @see data/kernels/deesser.json
164
+ */
165
+ export declare const DEESS_FREQ_RANGE: {
166
+ readonly min: 2000;
167
+ readonly max: 16000;
168
+ readonly step: 10;
169
+ readonly unit: "Hz";
170
+ readonly default: 7000;
171
+ readonly defaultFrom: "desk";
172
+ };
173
+
174
+ /**
175
+ * The band's WIDTH, in OCTAVES around the centre: the edges are `f / 2^(w/2)` and `f · 2^(w/2)`, which is what makes the centre the geometric middle at every width. Octaves and not a Q, because a Q is a property of one section and this band is TWO (a highpass and a lowpass, `mix_deesser.h`) — an operator asked to dial a Q would be dialling a number neither filter carries. One octave is the classic de-esser band: wide enough for a sibilant that moves with the vowel, narrow enough that a 1 kHz vowel sits 27.8 dB down the skirt.
176
+ * @see data/kernels/deesser.json
177
+ */
178
+ export declare const DEESS_WIDTH_RANGE: {
179
+ readonly min: 0.25;
180
+ readonly max: 4;
181
+ readonly step: 0.05;
182
+ readonly unit: "oct";
183
+ readonly default: 1;
184
+ readonly defaultFrom: "desk";
185
+ };
186
+
187
+ /**
188
+ * Where reduction starts — the level of the BAND, not of the strip, which is why the come-up is so much lower than the compressor's. A vocal peaking −12 dBFS carries roughly −30 dBFS in a one-octave band at 7 kHz on its sibilants and under −40 on its vowels, so −30 sits between the two and the stage opens on an "s" and stays shut on an "ah".
189
+ * @see data/kernels/deesser.json
190
+ */
191
+ export declare const DEESS_THRESHOLD_RANGE: {
192
+ readonly min: -60;
193
+ readonly max: 0;
194
+ readonly step: 0.5;
195
+ readonly unit: "dB";
196
+ readonly default: -30;
197
+ readonly defaultFrom: "desk";
198
+ };
199
+
200
+ /**
201
+ * How hard the band is held once it is over the threshold. 4:1 is the textbook de-esser ratio: firm on the "s", short of a limiter.
202
+ * @see data/kernels/deesser.json
203
+ */
204
+ export declare const DEESS_RATIO_RANGE: {
205
+ readonly min: 1;
206
+ readonly max: 20;
207
+ readonly step: 0.1;
208
+ readonly unit: "";
209
+ readonly default: 4;
210
+ readonly defaultFrom: "desk";
211
+ };
212
+
213
+ /**
214
+ * The FLOOR on the reduction, in dB and never positive — the deepest cut the stage may reach however loud the sibilant is (`mix_deesser.h`'s clamp, §4c). 12 dB tames a hard sibilant; past that a voice starts to lisp, and a de-esser with NO floor turns a shouted "s" into a hole. The ceiling is 0, which switches the reduction off without switching the stage off — a legitimate thing to want while dialling the band in by ear.
215
+ * @see data/kernels/deesser.json
216
+ */
217
+ export declare const DEESS_RANGE_RANGE: {
218
+ readonly min: -24;
219
+ readonly max: 0;
220
+ readonly step: 0.5;
221
+ readonly unit: "dB";
222
+ readonly default: -12;
223
+ readonly defaultFrom: "desk";
224
+ };
225
+
226
+ /**
227
+ * The detector's ATTACK, in ms. A sibilant's onset is a few milliseconds; 1 ms catches it without the detector chattering on the band's own waveform.
228
+ * @see data/kernels/deesser.json
229
+ */
230
+ export declare const DEESS_ATTACK_RANGE: {
231
+ readonly min: 0.1;
232
+ readonly max: 50;
233
+ readonly step: 0.1;
234
+ readonly unit: "ms";
235
+ readonly default: 1;
236
+ readonly defaultFrom: "desk";
237
+ };
238
+
239
+ /**
240
+ * The detector's RELEASE, in ms. 60 ms is long enough not to modulate inside one "s" and short enough to be open again for the next syllable.
241
+ * @see data/kernels/deesser.json
242
+ */
243
+ export declare const DEESS_RELEASE_RANGE: {
244
+ readonly min: 5;
245
+ readonly max: 500;
246
+ readonly step: 1;
247
+ readonly unit: "ms";
248
+ readonly default: 60;
249
+ readonly defaultFrom: "desk";
250
+ };
251
+
252
+ /**
253
+ * 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.
254
+ * @see data/kernels/deesser.json
255
+ */
256
+ export declare const DEESS_KNEE_DB: 6;
257
+
98
258
  /**
99
259
  * 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.
100
260
  * @see data/kernels/delay.json
@@ -162,6 +322,71 @@ export declare const FX_DELAY_PINGPONG_DEFAULT: false;
162
322
  */
163
323
  export declare const DRIVE_BIAS_MAX: 0.7071067811865476;
164
324
 
325
+ /**
326
+ * 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.
327
+ * @see data/kernels/drive.json
328
+ */
329
+ export declare const DRIVE_AMOUNT_RANGE: {
330
+ readonly min: 0;
331
+ readonly max: 36;
332
+ readonly step: 0.1;
333
+ readonly unit: "dB";
334
+ readonly default: 0;
335
+ readonly defaultFrom: "desk";
336
+ };
337
+
338
+ /**
339
+ * The EVEN/ODD harmonic balance. −1 is pure odd (the curve itself), +1 is pure even, 0 an equal blend — the kernel splits its own distortion residue into an odd and an even half and fades between them, so the two ends are exact rather than approximate (`mix_drive.h`, measured: H2 at −317 dBc at −1, H3 at −118 dBc at +1). Unitless, and signed by construction. NOT NORMALIZED_RANGE: this is a BALANCE with a meaningful centre, and a 0..1 travel would put its centre at 0.5 and its neutral nowhere.
340
+ * @see data/kernels/drive.json
341
+ */
342
+ export declare const DRIVE_CHARACTER_RANGE: {
343
+ readonly min: -1;
344
+ readonly max: 1;
345
+ readonly step: 0.01;
346
+ readonly unit: "";
347
+ readonly default: 0;
348
+ readonly defaultFrom: "desk";
349
+ };
350
+
351
+ /**
352
+ * The band split / tilt corner, in Hz. ONE travel for all three band modes, because the C imposes one constraint on all of them: it is the corner of a single biquad, and the split's other half is `x − LP(x)`. The full audio band, not the channel filters' narrower HPF/LPF pair — the same reasoning REVERB_CUT_RANGE records: a surface narrower than the row removes reach the console genuinely has.
353
+ * @see data/kernels/drive.json
354
+ */
355
+ export declare const DRIVE_BAND_FREQ_RANGE: {
356
+ readonly min: 20;
357
+ readonly max: 20000;
358
+ readonly step: 1;
359
+ readonly unit: "Hz";
360
+ readonly default: 2000;
361
+ readonly defaultFrom: "desk";
362
+ };
363
+
364
+ /**
365
+ * The wet/dry, as a PERCENT — the unit a drive control is read in on every desk that has one. Deliberately not NORMALIZED_RANGE (which is unitless 0..1): a mix a surface must label "0.35" when the operator thinks in "35 %" is a control whose declaration is fighting its reader. The kernel divides by 100 where it resolves the atom, in one place. The come-up is 100 %, not the reverb's modest 30: a saturator's insert use is IN the path. The `exciter` curve seeds itself lower (DRIVE_EXCITER_SEED), because that is a property of the TOPOLOGY and not of the travel.
366
+ * @see data/kernels/drive.json
367
+ */
368
+ export declare const DRIVE_MIX_RANGE: {
369
+ readonly min: 0;
370
+ readonly max: 100;
371
+ readonly step: 0.1;
372
+ readonly unit: "%";
373
+ readonly default: 100;
374
+ readonly defaultFrom: "desk";
375
+ };
376
+
377
+ /**
378
+ * The POST-stage make-up, in dB. Symmetric enough either way that an operator can null the stage in and out against the bypass, which is how a colour stage is actually judged.
379
+ * @see data/kernels/drive.json
380
+ */
381
+ export declare const DRIVE_TRIM_RANGE: {
382
+ readonly min: -24;
383
+ readonly max: 12;
384
+ readonly step: 0.1;
385
+ readonly unit: "dB";
386
+ readonly default: 0;
387
+ readonly defaultFrom: "desk";
388
+ };
389
+
165
390
  /**
166
391
  * 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.
167
392
  * @see data/kernels/eq.json
@@ -180,6 +405,124 @@ export declare const ISO_THIRD_OCTAVE_CENTRES_HZ: readonly [20, 25, 31.5, 40, 50
180
405
  */
181
406
  export declare const GEQ_BANDS: 31;
182
407
 
408
+ /**
409
+ * The frequency band a parametric band can be dragged across.
410
+ * @see data/kernels/eq.json
411
+ */
412
+ export declare const EQ_FREQ_RANGE: {
413
+ readonly min: 20;
414
+ readonly max: 20000;
415
+ readonly step: 10;
416
+ readonly unit: "Hz";
417
+ };
418
+
419
+ /**
420
+ * The parametric-band gain travel, in dB. The ± scalar `clampEqGain` enforces is READ off this (`core/src/eq.ts` derives `EQ_GAIN_LIMIT_DB` from `max`), so the bound is stated once and a surface cannot draw a wider knob than the clamp will honour.
421
+ * @see data/kernels/eq.json
422
+ */
423
+ export declare const EQ_GAIN_RANGE: {
424
+ readonly min: -15;
425
+ readonly max: 15;
426
+ readonly step: 0.5;
427
+ readonly unit: "dB";
428
+ };
429
+
430
+ /**
431
+ * The Q (resonance) extent of a parametric band.
432
+ * @see data/kernels/eq.json
433
+ */
434
+ export declare const EQ_Q_RANGE: {
435
+ readonly min: 0.3;
436
+ readonly max: 8;
437
+ readonly step: 0.1;
438
+ readonly unit: "";
439
+ };
440
+
441
+ /**
442
+ * The Q extent of a NOTCH band. Wider than EQ_Q_RANGE on purpose (#116, operator decision): an ultra-narrow surgical cut is the notch shape's whole point — the FBS ring-out pool plants dbx-AFS-style ring killers at Q ≈ 116 (~1/80 octave), inaudible on program yet fatal to a single ringing frequency. Gain-carrying shapes stay bounded at EQ_Q_RANGE — a Q-116 bell is a resonator, not an EQ move.
443
+ * @see data/kernels/eq.json
444
+ */
445
+ export declare const EQ_NOTCH_Q_RANGE: {
446
+ readonly min: 0.3;
447
+ readonly max: 116;
448
+ readonly step: 1;
449
+ readonly unit: "";
450
+ };
451
+
452
+ /**
453
+ * Where the HPF cutoff can sit (low end); mirrors the drawn low-frequency handle.
454
+ * @see data/kernels/eq.json
455
+ */
456
+ export declare const HPF_FREQ_RANGE: {
457
+ readonly min: 20;
458
+ readonly max: 1000;
459
+ readonly step: 10;
460
+ readonly unit: "Hz";
461
+ };
462
+
463
+ /**
464
+ * Where the LPF cutoff can sit (high end).
465
+ * @see data/kernels/eq.json
466
+ */
467
+ export declare const LPF_FREQ_RANGE: {
468
+ readonly min: 1000;
469
+ readonly max: 20000;
470
+ readonly step: 10;
471
+ readonly unit: "Hz";
472
+ };
473
+
474
+ /**
475
+ * The flanger's jet sweep (§3b).
476
+ * @see data/kernels/flanger.json
477
+ */
478
+ export declare const FLANGER_RATE_RANGE: {
479
+ readonly min: 0.05;
480
+ readonly max: 5;
481
+ readonly step: 0.01;
482
+ readonly unit: "Hz";
483
+ readonly default: 0.25;
484
+ readonly defaultFrom: "desk";
485
+ };
486
+
487
+ /**
488
+ * The flanger's peak-to-peak excursion above its declared 0.5 ms base (§3b).
489
+ * @see data/kernels/flanger.json
490
+ */
491
+ export declare const FLANGER_DEPTH_RANGE: {
492
+ readonly min: 0;
493
+ readonly max: 5;
494
+ readonly step: 0.1;
495
+ readonly unit: "ms";
496
+ readonly default: 2;
497
+ readonly defaultFrom: "desk";
498
+ };
499
+
500
+ /**
501
+ * The flanger's SIGNED resonance (§3b). The ±0.95 clamp is DECLARED here — a PATCH asking for 1.0 is answered by this travel — and the kernel's own clamp is the enforcement half.
502
+ * @see data/kernels/flanger.json
503
+ */
504
+ export declare const FLANGER_FEEDBACK_RANGE: {
505
+ readonly min: -0.95;
506
+ readonly max: 0.95;
507
+ readonly step: 0.01;
508
+ readonly unit: "";
509
+ readonly default: 0.6;
510
+ readonly defaultFrom: "desk";
511
+ };
512
+
513
+ /**
514
+ * The flanger's wet/dry, as an instance of DRIVE_MIX_RANGE: 50 %, equal dry and wet, where the comb is deepest (§3b).
515
+ * @see data/kernels/flanger.json
516
+ */
517
+ export declare const FLANGER_MIX_RANGE: {
518
+ readonly min: 0;
519
+ readonly max: 100;
520
+ readonly step: 0.1;
521
+ readonly unit: "%";
522
+ readonly default: 50;
523
+ readonly defaultFrom: "desk";
524
+ };
525
+
183
526
  /**
184
527
  * 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).
185
528
  * @see data/kernels/gate.json
@@ -259,6 +602,37 @@ export declare const GATE_LIMITS: {
259
602
  };
260
603
  };
261
604
 
605
+ /**
606
+ * 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).
607
+ * @see data/kernels/geq.json
608
+ */
609
+ export declare const GEQ_BAND_RANGE: {
610
+ readonly min: -15;
611
+ readonly max: 15;
612
+ readonly step: 0.5;
613
+ readonly unit: "dB";
614
+ readonly default: 0;
615
+ readonly defaultFrom: "desk";
616
+ };
617
+
618
+ /**
619
+ * The graphic EQ's band Q: the ISO third-octave bandwidth, `2^(1/6)/(2^(1/3) − 1) ≈ 4.318`, to one decimal as the M32 GEQ carries it. Read by the `geq31` preset and the graphic EQ's section design (graphic-eq-31 spec §3).
620
+ * @see data/kernels/geq.json
621
+ */
622
+ export declare const GEQ_BAND_Q: 4.3;
623
+
624
+ /**
625
+ * The prototype gain the `true` solve's first interaction matrix is evaluated at (spec §2, §3): the middle of the travel's magnitude, where a matched-Z section's dB response per dB of gain is closest to its average.
626
+ * @see data/kernels/geq.json
627
+ */
628
+ export declare const GEQ_PROTO_DB: 12;
629
+
630
+ /**
631
+ * The ceiling on a section gain the `true` solve may ask for (spec §3): above the travel's worst case (26.0 dB, the alternating ±15 set) with margin. A solve past it clamps and the row says so (`designClamped`), never silently.
632
+ * @see data/kernels/geq.json
633
+ */
634
+ export declare const GEQ_DESIGN_GAIN_MAX_DB: 30;
635
+
262
636
  /**
263
637
  * 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.
264
638
  * @see data/kernels/limiter.json
@@ -291,55 +665,558 @@ export declare const LIMITER_LIMITS: {
291
665
  };
292
666
 
293
667
  /**
294
- * PITCH_LIMITS, moved from openmixer.
295
- * @see data/kernels/pitch.json
668
+ * The phaser's sweep speed (§3). `omx_lfo_inc` freezes at Nyquist; this travel stays far below.
669
+ * @see data/kernels/phaser.json
296
670
  */
297
- export declare const PITCH_LIMITS: {
298
- readonly semitones: {
299
- readonly min: -12;
300
- readonly max: 12;
301
- readonly default: 0;
302
- };
303
- readonly cents: {
304
- readonly min: -50;
305
- readonly max: 50;
306
- readonly default: 0;
307
- };
308
- readonly mix: {
309
- readonly min: 0;
310
- readonly max: 100;
311
- readonly default: 100;
312
- };
671
+ export declare const PHASER_RATE_RANGE: {
672
+ readonly min: 0.05;
673
+ readonly max: 5;
674
+ readonly step: 0.01;
675
+ readonly unit: "Hz";
676
+ readonly default: 0.5;
677
+ readonly defaultFrom: "desk";
313
678
  };
314
679
 
315
680
  /**
316
- * PITCH_KERNEL, moved from openmixer.
317
- * @see data/kernels/pitch.json
681
+ * The phaser's lowest centre frequency; the sweep runs upward from it (§3).
682
+ * @see data/kernels/phaser.json
318
683
  */
319
- export declare const PITCH_KERNEL: {
320
- readonly windowMs: 40;
321
- readonly prefilterCeilingHz: 20000;
322
- readonly prefilterQ: 0.7071067811865476;
684
+ export declare const PHASER_BASE_RANGE: {
685
+ readonly min: 50;
686
+ readonly max: 2000;
687
+ readonly step: 1;
688
+ readonly unit: "Hz";
689
+ readonly default: 200;
690
+ readonly defaultFrom: "desk";
323
691
  };
324
692
 
325
693
  /**
326
- * PLATE's tank MODULATION DEPTH, in percent of Dattorro's own excursion (±8 samples at his 29 761 Hz tuning rate, scaled to the live rate the way the tank lengths are). 100 is the depth the plate has always run at, so the come-up is bit-identical to the plate before the field; 0 brings back the unmodulated tank's ring; 400 is the wide, chorused EMT-style swing. The rate stays 1 Hz. Only PLATE reads it (`2026-09-26-native-fx-catalogue.md` §2, Reverb).
327
- * @see data/kernels/reverb.json
694
+ * The sweep's span above `base`, in octaves; 0 is a static phaser at `base` (§3).
695
+ * @see data/kernels/phaser.json
328
696
  */
329
- export declare const REVERB_PLATE_MOD_DEPTH_RANGE: {
697
+ export declare const PHASER_DEPTH_RANGE: {
330
698
  readonly min: 0;
331
- readonly max: 400;
332
- readonly step: 1;
699
+ readonly max: 6;
700
+ readonly step: 0.1;
701
+ readonly unit: "oct";
702
+ readonly default: 4;
703
+ readonly defaultFrom: "desk";
704
+ };
705
+
706
+ /**
707
+ * The phaser's section count per leg — EVEN, 2 … 12 (§2: two sections per notch). Its ends are the kernel's state capacity (`OMX_PHASER_MAX_STAGES` reads `OMX_PHASER_STAGES_RANGE_MAX`); the row moves it through the closed member set PHASER_STAGE_COUNTS, which is derived from it.
708
+ * @see data/kernels/phaser.json
709
+ */
710
+ export declare const PHASER_STAGES_RANGE: {
711
+ readonly min: 2;
712
+ readonly max: 12;
713
+ readonly step: 2;
714
+ readonly unit: "";
715
+ readonly default: 6;
716
+ readonly defaultFrom: "desk";
717
+ };
718
+
719
+ /**
720
+ * The member set the `stages` field accepts: PHASER_STAGES_RANGE walked by its step.
721
+ * @see data/kernels/phaser.json
722
+ */
723
+ export declare const PHASER_STAGE_COUNTS: readonly [2, 4, 6, 8, 10, 12];
724
+
725
+ /**
726
+ * 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.
727
+ * @see data/kernels/phaser.json
728
+ */
729
+ export declare const PHASER_FEEDBACK_RANGE: {
730
+ readonly min: -0.9;
731
+ readonly max: 0.9;
732
+ readonly step: 0.01;
733
+ readonly unit: "";
734
+ readonly default: 0.4;
735
+ readonly defaultFrom: "desk";
736
+ };
737
+
738
+ /**
739
+ * The phaser's wet/dry, as an instance of DRIVE_MIX_RANGE: 50 %, where the notch is complete (§3).
740
+ * @see data/kernels/phaser.json
741
+ */
742
+ export declare const PHASER_MIX_RANGE: {
743
+ readonly min: 0;
744
+ readonly max: 100;
745
+ readonly step: 0.1;
333
746
  readonly unit: "%";
334
- readonly default: 100;
747
+ readonly default: 50;
335
748
  readonly defaultFrom: "desk";
336
749
  };
337
750
 
338
751
  /**
339
- * The legal range of each transient-designer field (engineering units), transient spec §3. Every kind comes up flat: no per-kind default differs. `harness/contract-limits-gen.mjs` emits each as `OMX_TRANSIENT_<FIELD>_{MIN,MAX,DEFAULT}` for `mix_transient.h`'s resolve; the row publishes them on OPTIONS when it lands (issue #921).
340
- * @see data/kernels/transient.json
752
+ * The phaser's continuous travels by row field — the ONE map its control bounds and its row travels both read (§3). `stages` is not here: it moves through PHASER_STAGE_COUNTS.
753
+ * @see data/kernels/phaser.json
341
754
  */
342
- export declare const TRANSIENT_LIMITS: {
755
+ export declare const PHASER_TRAVELS: {
756
+ readonly rateHz: {
757
+ readonly min: 0.05;
758
+ readonly max: 5;
759
+ readonly step: 0.01;
760
+ readonly unit: "Hz";
761
+ readonly default: 0.5;
762
+ readonly defaultFrom: "desk";
763
+ };
764
+ readonly baseHz: {
765
+ readonly min: 50;
766
+ readonly max: 2000;
767
+ readonly step: 1;
768
+ readonly unit: "Hz";
769
+ readonly default: 200;
770
+ readonly defaultFrom: "desk";
771
+ };
772
+ readonly depthOct: {
773
+ readonly min: 0;
774
+ readonly max: 6;
775
+ readonly step: 0.1;
776
+ readonly unit: "oct";
777
+ readonly default: 4;
778
+ readonly defaultFrom: "desk";
779
+ };
780
+ readonly feedback: {
781
+ readonly min: -0.9;
782
+ readonly max: 0.9;
783
+ readonly step: 0.01;
784
+ readonly unit: "";
785
+ readonly default: 0.4;
786
+ readonly defaultFrom: "desk";
787
+ };
788
+ readonly mix: {
789
+ readonly min: 0;
790
+ readonly max: 100;
791
+ readonly step: 0.1;
792
+ readonly unit: "%";
793
+ readonly default: 50;
794
+ readonly defaultFrom: "desk";
795
+ };
796
+ };
797
+
798
+ /**
799
+ * PITCH_LIMITS, moved from openmixer.
800
+ * @see data/kernels/pitch.json
801
+ */
802
+ export declare const PITCH_LIMITS: {
803
+ readonly semitones: {
804
+ readonly min: -12;
805
+ readonly max: 12;
806
+ readonly default: 0;
807
+ };
808
+ readonly cents: {
809
+ readonly min: -50;
810
+ readonly max: 50;
811
+ readonly default: 0;
812
+ };
813
+ readonly mix: {
814
+ readonly min: 0;
815
+ readonly max: 100;
816
+ readonly default: 100;
817
+ };
818
+ };
819
+
820
+ /**
821
+ * PITCH_KERNEL, moved from openmixer.
822
+ * @see data/kernels/pitch.json
823
+ */
824
+ export declare const PITCH_KERNEL: {
825
+ readonly windowMs: 40;
826
+ readonly prefilterCeilingHz: 20000;
827
+ readonly prefilterQ: 0.7071067811865476;
828
+ };
829
+
830
+ /**
831
+ * PLATE's tank MODULATION DEPTH, in percent of Dattorro's own excursion (±8 samples at his 29 761 Hz tuning rate, scaled to the live rate the way the tank lengths are). 100 is the depth the plate has always run at, so the come-up is bit-identical to the plate before the field; 0 brings back the unmodulated tank's ring; 400 is the wide, chorused EMT-style swing. The rate stays 1 Hz. Only PLATE reads it (`2026-09-26-native-fx-catalogue.md` §2, Reverb).
832
+ * @see data/kernels/reverb.json
833
+ */
834
+ export declare const REVERB_PLATE_MOD_DEPTH_RANGE: {
835
+ readonly min: 0;
836
+ readonly max: 400;
837
+ readonly step: 1;
838
+ readonly unit: "%";
839
+ readonly default: 100;
840
+ readonly defaultFrom: "desk";
841
+ };
842
+
843
+ /**
844
+ * The REVERB's wet/dry. An insert keeps the dry signal (0.3); an `fxReturn` is wet-only (1), so the return carries only the effect. Both numbers live HERE and nowhere else: the row's `mix` limit, `ReverbController`'s seed and its fresh state read them through limitForKind.
845
+ * @see data/kernels/reverb.json
846
+ */
847
+ export declare const REVERB_MIX_RANGE: {
848
+ readonly min: 0;
849
+ readonly max: 1;
850
+ readonly step: 0;
851
+ readonly unit: "";
852
+ readonly default: 0.3;
853
+ readonly defaultFrom: "desk";
854
+ readonly byKind: {
855
+ readonly fxReturn: 1;
856
+ };
857
+ };
858
+
859
+ /**
860
+ * The reverb's SIZE/DAMPING/WIDTH — each a NORMALIZED_RANGE instance with its own come-up value, matching `DEFAULT_REVERB_STATE`. Three separate constants rather than one shared default on `NORMALIZED_RANGE`: that range is the bare 0..1 REPRESENTATION, reused by fields across the whole console whose come-up values disagree (a fader position is not a reverb's damping), so a default belongs on the NAMED field, never on the shape it borrows.
861
+ * @see data/kernels/reverb.json
862
+ */
863
+ export declare const REVERB_SIZE_RANGE: {
864
+ readonly min: 0;
865
+ readonly max: 1;
866
+ readonly step: 0;
867
+ readonly unit: "";
868
+ readonly default: 0.7;
869
+ readonly defaultFrom: "desk";
870
+ };
871
+
872
+ /**
873
+ * The reverb's DAMPING — a NORMALIZED_RANGE instance with its own come-up value, matching `DEFAULT_REVERB_STATE`. Declared with SIZE and WIDTH (see REVERB_SIZE_RANGE for why each is a named constant rather than a default on the shared 0..1 shape).
874
+ * @see data/kernels/reverb.json
875
+ */
876
+ export declare const REVERB_DAMPING_RANGE: {
877
+ readonly min: 0;
878
+ readonly max: 1;
879
+ readonly step: 0;
880
+ readonly unit: "";
881
+ readonly default: 0.5;
882
+ readonly defaultFrom: "desk";
883
+ };
884
+
885
+ /**
886
+ * The reverb's stereo WIDTH — a NORMALIZED_RANGE instance with its own come-up value, matching `DEFAULT_REVERB_STATE`. Declared with SIZE and DAMPING (see REVERB_SIZE_RANGE for why each is a named constant rather than a default on the shared 0..1 shape).
887
+ * @see data/kernels/reverb.json
888
+ */
889
+ export declare const REVERB_WIDTH_RANGE: {
890
+ readonly min: 0;
891
+ readonly max: 1;
892
+ readonly step: 0;
893
+ readonly unit: "";
894
+ readonly default: 1;
895
+ readonly defaultFrom: "desk";
896
+ };
897
+
898
+ /**
899
+ * The reverb's PRE-DELAY travel — the gap before the first reflection, in milliseconds. Declared here so the unit crosses with the bounds: a `finiteNumber(0, 100)` codec publishes `unit: ''`, and a surface binding that draws a millisecond control it cannot label. The panel knowing better than the wire is the wrong way round.
900
+ * @see data/kernels/reverb.json
901
+ */
902
+ export declare const REVERB_PREDELAY_RANGE: {
903
+ readonly min: 0;
904
+ readonly max: 100;
905
+ readonly step: 1;
906
+ readonly unit: "ms";
907
+ readonly default: 0;
908
+ readonly defaultFrom: "desk";
909
+ };
910
+
911
+ /**
912
+ * The reverb's LOW cut, as an instance of REVERB_CUT_RANGE — same bounds, its own come-up value. `0` reads as "none" (`mix_reverb.h`), which is also `DEFAULT_REVERB_STATE`'s seed, so a fresh reverb's low cut and its declared default are the same fact stated once. Split from REVERB_CUT_RANGE rather than adding `default` there: the low and high cut share ONE travel (the C imposes one constraint on both) but do NOT share one come-up value, and a `default` on the shared range could only be honest for one of the two fields that read it.
913
+ * @see data/kernels/reverb.json
914
+ */
915
+ export declare const REVERB_LOWCUT_RANGE: {
916
+ readonly min: 0;
917
+ readonly max: 20000;
918
+ readonly step: 10;
919
+ readonly unit: "Hz";
920
+ readonly default: 0;
921
+ readonly defaultFrom: "desk";
922
+ };
923
+
924
+ /**
925
+ * The reverb's HIGH cut, as an instance of REVERB_CUT_RANGE — same bounds, its own come-up value. The top of the travel reads as "open" (`mix_reverb.h`), matching `DEFAULT_REVERB_STATE`'s seed.
926
+ * @see data/kernels/reverb.json
927
+ */
928
+ export declare const REVERB_HIGHCUT_RANGE: {
929
+ readonly min: 0;
930
+ readonly max: 20000;
931
+ readonly step: 10;
932
+ readonly unit: "Hz";
933
+ readonly default: 20000;
934
+ readonly defaultFrom: "desk";
935
+ };
936
+
937
+ /**
938
+ * REVERSE's MIRROR WINDOW — how long a slice of the wet is played backward, in milliseconds (`2026-07-15-native-delay-reverb.md`, Amendment 2026-09-17 §B). A DECLARED travel and never derived from `size`'s RT60: an RT60 of seconds cannot be buffered at 192 kHz, and a window silently clamped to fit is the silent-clamp defect. The ceiling is what `mix_reverb.h`'s pool budgets a ring for (`OMX_REVERB_REVERSE_MAX_MS`), so the console offers exactly the travel the kernel accepts — nothing wider, nothing narrower.
939
+ * @see data/kernels/reverb.json
940
+ */
941
+ export declare const REVERB_REVERSE_RANGE: {
942
+ readonly min: 50;
943
+ readonly max: 500;
944
+ readonly step: 10;
945
+ readonly unit: "ms";
946
+ readonly default: 300;
947
+ readonly defaultFrom: "desk";
948
+ };
949
+
950
+ /**
951
+ * GATED's HOLD — how long the wet stays at full level after the key falls away, in milliseconds. The Phil-Collins tail is cut where the operator puts the cut, so this is the control that decides the effect's length; `size` still decides what is being cut off.
952
+ * @see data/kernels/reverb.json
953
+ */
954
+ export declare const REVERB_HOLD_RANGE: {
955
+ readonly min: 10;
956
+ readonly max: 2000;
957
+ readonly step: 10;
958
+ readonly unit: "ms";
959
+ readonly default: 120;
960
+ readonly defaultFrom: "desk";
961
+ };
962
+
963
+ /**
964
+ * GATED's RELEASE — how long the held wet takes to reach zero, in milliseconds. A straight line down, short by design: a long release is a reverb tail again, which is the thing a gated reverb exists to remove.
965
+ * @see data/kernels/reverb.json
966
+ */
967
+ export declare const REVERB_RELEASE_RANGE: {
968
+ readonly min: 1;
969
+ readonly max: 500;
970
+ readonly step: 1;
971
+ readonly unit: "ms";
972
+ readonly default: 20;
973
+ readonly defaultFrom: "desk";
974
+ };
975
+
976
+ /**
977
+ * GATED's ARM THRESHOLD — the level the reverb's own mono feed must reach to arm the hold, in dBFS. Declared, because the alternative is a hidden onset detector: the kernel compares `|input|` against exactly this number and nothing else.
978
+ * @see data/kernels/reverb.json
979
+ */
980
+ export declare const REVERB_GATE_THRESHOLD_RANGE: {
981
+ readonly min: -80;
982
+ readonly max: 0;
983
+ readonly step: 1;
984
+ readonly unit: "dBFS";
985
+ readonly default: -40;
986
+ readonly defaultFrom: "desk";
987
+ };
988
+
989
+ /**
990
+ * The horn's chorale (slow) rate, Hz.
991
+ * @see data/kernels/rotary.json
992
+ */
993
+ export declare const ROTARY_HORN_SLOW_RANGE: {
994
+ readonly min: 0.1;
995
+ readonly max: 2;
996
+ readonly step: 0.01;
997
+ readonly unit: "Hz";
998
+ readonly default: 0.8;
999
+ readonly defaultFrom: "desk";
1000
+ };
1001
+
1002
+ /**
1003
+ * The horn's tremolo (fast) rate, Hz.
1004
+ * @see data/kernels/rotary.json
1005
+ */
1006
+ export declare const ROTARY_HORN_FAST_RANGE: {
1007
+ readonly min: 3;
1008
+ readonly max: 10;
1009
+ readonly step: 0.01;
1010
+ readonly unit: "Hz";
1011
+ readonly default: 6.8;
1012
+ readonly defaultFrom: "desk";
1013
+ };
1014
+
1015
+ /**
1016
+ * The drum's chorale (slow) rate, Hz.
1017
+ * @see data/kernels/rotary.json
1018
+ */
1019
+ export declare const ROTARY_DRUM_SLOW_RANGE: {
1020
+ readonly min: 0.1;
1021
+ readonly max: 2;
1022
+ readonly step: 0.01;
1023
+ readonly unit: "Hz";
1024
+ readonly default: 0.7;
1025
+ readonly defaultFrom: "desk";
1026
+ };
1027
+
1028
+ /**
1029
+ * The drum's tremolo (fast) rate, Hz.
1030
+ * @see data/kernels/rotary.json
1031
+ */
1032
+ export declare const ROTARY_DRUM_FAST_RANGE: {
1033
+ readonly min: 3;
1034
+ readonly max: 10;
1035
+ readonly step: 0.01;
1036
+ readonly unit: "Hz";
1037
+ readonly default: 5.9;
1038
+ readonly defaultFrom: "desk";
1039
+ };
1040
+
1041
+ /**
1042
+ * The scale on every speed-change time constant (`ROTARY_*_ACCEL_MS`/`_DECEL_MS`): 2 is twice as slow.
1043
+ * @see data/kernels/rotary.json
1044
+ */
1045
+ export declare const ROTARY_ACCEL_RANGE: {
1046
+ readonly min: 0.25;
1047
+ readonly max: 4;
1048
+ readonly step: 0.01;
1049
+ readonly unit: "x";
1050
+ readonly default: 1;
1051
+ readonly defaultFrom: "desk";
1052
+ };
1053
+
1054
+ /**
1055
+ * The drum/horn balance, percent: −100 drum only, +100 horn only; the law attenuates, never boosts.
1056
+ * @see data/kernels/rotary.json
1057
+ */
1058
+ export declare const ROTARY_BALANCE_RANGE: {
1059
+ readonly min: -100;
1060
+ readonly max: 100;
1061
+ readonly step: 1;
1062
+ readonly unit: "%";
1063
+ readonly default: 0;
1064
+ readonly defaultFrom: "desk";
1065
+ };
1066
+
1067
+ /**
1068
+ * The rotary's wet/dry, as an instance of DRIVE_MIX_RANGE: 100 %, because a rotary on an insert IS the sound (it replaces the cabinet) and an `fxReturn` wants it wet too (§3).
1069
+ * @see data/kernels/rotary.json
1070
+ */
1071
+ export declare const ROTARY_MIX_RANGE: {
1072
+ readonly min: 0;
1073
+ readonly max: 100;
1074
+ readonly step: 0.1;
1075
+ readonly unit: "%";
1076
+ readonly default: 100;
1077
+ readonly defaultFrom: "desk";
1078
+ };
1079
+
1080
+ /**
1081
+ * 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).
1082
+ * @see data/kernels/rotary.json
1083
+ */
1084
+ export declare const ROTARY_TRAVELS: {
1085
+ readonly hornSlowHz: {
1086
+ readonly min: 0.1;
1087
+ readonly max: 2;
1088
+ readonly step: 0.01;
1089
+ readonly unit: "Hz";
1090
+ readonly default: 0.8;
1091
+ readonly defaultFrom: "desk";
1092
+ };
1093
+ readonly hornFastHz: {
1094
+ readonly min: 3;
1095
+ readonly max: 10;
1096
+ readonly step: 0.01;
1097
+ readonly unit: "Hz";
1098
+ readonly default: 6.8;
1099
+ readonly defaultFrom: "desk";
1100
+ };
1101
+ readonly drumSlowHz: {
1102
+ readonly min: 0.1;
1103
+ readonly max: 2;
1104
+ readonly step: 0.01;
1105
+ readonly unit: "Hz";
1106
+ readonly default: 0.7;
1107
+ readonly defaultFrom: "desk";
1108
+ };
1109
+ readonly drumFastHz: {
1110
+ readonly min: 3;
1111
+ readonly max: 10;
1112
+ readonly step: 0.01;
1113
+ readonly unit: "Hz";
1114
+ readonly default: 5.9;
1115
+ readonly defaultFrom: "desk";
1116
+ };
1117
+ readonly accel: {
1118
+ readonly min: 0.25;
1119
+ readonly max: 4;
1120
+ readonly step: 0.01;
1121
+ readonly unit: "x";
1122
+ readonly default: 1;
1123
+ readonly defaultFrom: "desk";
1124
+ };
1125
+ readonly balance: {
1126
+ readonly min: -100;
1127
+ readonly max: 100;
1128
+ readonly step: 1;
1129
+ readonly unit: "%";
1130
+ readonly default: 0;
1131
+ readonly defaultFrom: "desk";
1132
+ };
1133
+ readonly mix: {
1134
+ readonly min: 0;
1135
+ readonly max: 100;
1136
+ readonly step: 0.1;
1137
+ readonly unit: "%";
1138
+ readonly default: 100;
1139
+ readonly defaultFrom: "desk";
1140
+ };
1141
+ };
1142
+
1143
+ /**
1144
+ * The complementary split's low-pass corner, Hz: the Leslie 122's passive crossover.
1145
+ * @see data/kernels/rotary.json
1146
+ */
1147
+ export declare const ROTARY_CROSSOVER_HZ: 800;
1148
+
1149
+ /**
1150
+ * The shortest Doppler read, ms — above the order-3 read's one-sample reach at every rate.
1151
+ * @see data/kernels/rotary.json
1152
+ */
1153
+ export declare const ROTARY_BASE_MS: 0.1;
1154
+
1155
+ /**
1156
+ * The horn's Doppler excursion `D_horn`, ms: a 0.15 m radius over 343 m/s.
1157
+ * @see data/kernels/rotary.json
1158
+ */
1159
+ export declare const ROTARY_HORN_DOPPLER_MS: 0.44;
1160
+
1161
+ /**
1162
+ * The drum's Doppler excursion `D_drum`, ms: its baffle turns over a fixed woofer.
1163
+ * @see data/kernels/rotary.json
1164
+ */
1165
+ export declare const ROTARY_DRUM_DOPPLER_MS: 0.29;
1166
+
1167
+ /**
1168
+ * The horn's amplitude swing `m_horn` (a −6 dB directivity dip), a ratio.
1169
+ * @see data/kernels/rotary.json
1170
+ */
1171
+ export declare const ROTARY_HORN_AM: 0.5;
1172
+
1173
+ /**
1174
+ * The drum baffle's amplitude swing `m_drum`, a ratio.
1175
+ * @see data/kernels/rotary.json
1176
+ */
1177
+ export declare const ROTARY_DRUM_AM: 0.3;
1178
+
1179
+ /**
1180
+ * The horn rotor's speed-up time constant, ms (at `accel` 1).
1181
+ * @see data/kernels/rotary.json
1182
+ */
1183
+ export declare const ROTARY_HORN_ACCEL_MS: 330;
1184
+
1185
+ /**
1186
+ * The horn rotor's slow-down time constant, ms (at `accel` 1).
1187
+ * @see data/kernels/rotary.json
1188
+ */
1189
+ export declare const ROTARY_HORN_DECEL_MS: 500;
1190
+
1191
+ /**
1192
+ * The drum rotor's speed-up time constant, ms (at `accel` 1).
1193
+ * @see data/kernels/rotary.json
1194
+ */
1195
+ export declare const ROTARY_DRUM_ACCEL_MS: 1700;
1196
+
1197
+ /**
1198
+ * The drum rotor's slow-down time constant, ms (at `accel` 1).
1199
+ * @see data/kernels/rotary.json
1200
+ */
1201
+ export declare const ROTARY_DRUM_DECEL_MS: 1800;
1202
+
1203
+ /**
1204
+ * Below this rate, Hz, a rotor coasting toward `stop` is snapped to exactly 0.
1205
+ * @see data/kernels/rotary.json
1206
+ */
1207
+ export declare const ROTARY_STOP_EPS: 0.0001;
1208
+
1209
+ /**
1210
+ * One inline ring per rotor per leg, floats — at least the 192 kHz need of the horn's sweep.
1211
+ * @see data/kernels/rotary.json
1212
+ */
1213
+ export declare const ROTARY_RING_FLOATS: 256;
1214
+
1215
+ /**
1216
+ * The legal range of each transient-designer field (engineering units), transient spec §3. Every kind comes up flat: no per-kind default differs. `harness/contract-limits-gen.mjs` emits each as `OMX_TRANSIENT_<FIELD>_{MIN,MAX,DEFAULT}` for `mix_transient.h`'s resolve; the row publishes them on OPTIONS when it lands (issue #921).
1217
+ * @see data/kernels/transient.json
1218
+ */
1219
+ export declare const TRANSIENT_LIMITS: {
343
1220
  readonly attackDb: {
344
1221
  readonly min: -24;
345
1222
  readonly max: 24;
@@ -407,56 +1284,73 @@ export declare const TRANSIENT_REF_DB: 6;
407
1284
  export declare const TRANSIENT_FLOOR_LIN: 0.00001;
408
1285
 
409
1286
  /**
410
- * The delay plugin's parameters, in append-only order: DPF's parameter index is the CLAP param id and the LV2 port order (omx-plugins-dpf §3b). Moved from openmixer's packages/omx-plugins/tools/params-gen.mjs PLUGINS.delay.
411
- *
412
- * Why: mix is per instance on the desk (insert or fxReturn); a plugin racked in a foreign host is an INSERT, so it reads the input kind's default (omx-plugins-dpf §3a).
413
- * @see data/plugins/delay.json
1287
+ * The tremolo's LFO rate (the catalogue row's 0.1..20 Hz); 4 Hz is the classic amp tremolo.
1288
+ * @see data/kernels/tremolo.json
414
1289
  */
415
- export declare const DELAY_PLUGIN: {
416
- readonly plugin: "delay";
417
- readonly header: "omx_delay_params.h";
418
- readonly prefix: "OMX_DELAY";
419
- readonly params: readonly [{
420
- readonly symbol: "timeMs";
421
- readonly min: 0;
422
- readonly max: 2000;
423
- readonly def: 300;
424
- readonly step: 1;
425
- readonly unit: "ms";
426
- readonly toggle: false;
427
- }, {
428
- readonly symbol: "feedback";
429
- readonly min: 0;
430
- readonly max: 0.99;
431
- readonly def: 0.3;
432
- readonly step: 0;
433
- readonly unit: "";
434
- readonly toggle: false;
435
- }, {
436
- readonly symbol: "mix";
437
- readonly min: 0;
438
- readonly max: 1;
439
- readonly def: 0.3;
440
- readonly step: 0;
441
- readonly unit: "";
442
- readonly toggle: false;
443
- }, {
444
- readonly symbol: "tone";
1290
+ export declare const TREMOLO_RATE_RANGE: {
1291
+ readonly min: 0.1;
1292
+ readonly max: 20;
1293
+ readonly step: 0.01;
1294
+ readonly unit: "Hz";
1295
+ readonly default: 4;
1296
+ readonly defaultFrom: "desk";
1297
+ };
1298
+
1299
+ /**
1300
+ * The tremolo's modulation depth: the gain's trough is `1 − mix·depth`.
1301
+ * @see data/kernels/tremolo.json
1302
+ */
1303
+ export declare const TREMOLO_DEPTH_RANGE: {
1304
+ readonly min: 0;
1305
+ readonly max: 100;
1306
+ readonly step: 0.1;
1307
+ readonly unit: "%";
1308
+ readonly default: 50;
1309
+ readonly defaultFrom: "desk";
1310
+ };
1311
+
1312
+ /**
1313
+ * The tremolo's wet/dry, as an instance of DRIVE_MIX_RANGE: 100 %. The kernel folds the wet/dry into its one gain, so a strip tremolo IS the sound (as the rotary's mix 100 % is).
1314
+ * @see data/kernels/tremolo.json
1315
+ */
1316
+ export declare const TREMOLO_MIX_RANGE: {
1317
+ readonly min: 0;
1318
+ readonly max: 100;
1319
+ readonly step: 0.1;
1320
+ readonly unit: "%";
1321
+ readonly default: 100;
1322
+ readonly defaultFrom: "desk";
1323
+ };
1324
+
1325
+ /**
1326
+ * 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).
1327
+ * @see data/kernels/tremolo.json
1328
+ */
1329
+ export declare const TREMOLO_TRAVELS: {
1330
+ readonly rateHz: {
1331
+ readonly min: 0.1;
1332
+ readonly max: 20;
1333
+ readonly step: 0.01;
1334
+ readonly unit: "Hz";
1335
+ readonly default: 4;
1336
+ readonly defaultFrom: "desk";
1337
+ };
1338
+ readonly depth: {
445
1339
  readonly min: 0;
446
- readonly max: 1;
447
- readonly def: 0.3;
448
- readonly step: 0;
449
- readonly unit: "";
450
- readonly toggle: false;
451
- }, {
452
- readonly symbol: "pingpong";
1340
+ readonly max: 100;
1341
+ readonly step: 0.1;
1342
+ readonly unit: "%";
1343
+ readonly default: 50;
1344
+ readonly defaultFrom: "desk";
1345
+ };
1346
+ readonly mix: {
453
1347
  readonly min: 0;
454
- readonly max: 1;
455
- readonly def: 0;
456
- readonly step: 1;
457
- readonly unit: "";
458
- readonly toggle: true;
459
- }];
1348
+ readonly max: 100;
1349
+ readonly step: 0.1;
1350
+ readonly unit: "%";
1351
+ readonly default: 100;
1352
+ readonly defaultFrom: "desk";
1353
+ };
460
1354
  };
461
1355
 
462
1356
  /**
@@ -495,6 +1389,83 @@ export declare const FDELAY_MOD_READ_ORDER: 3;
495
1389
  */
496
1390
  export declare const FDELAY_READ_L1_NORM: 1.25;
497
1391
 
1392
+ /**
1393
+ * The gate's threshold, range, release and ratio as a plugin host draws them: GATE_LIMITS' bounds, units and defaults with no step. The console's row quantises these four to whole steps (1 dB, 10 ms, 1:1), and a travel whose step is 1 or more reads as an integer control; the omx-strip plugin has always offered them continuous, so it reads this table instead. Every number but the step is GATE_LIMITS', held equal by test/continuous-travels.test.mjs. Not rendered to C: no C reader needs a second spelling of the gate's bounds.
1394
+ * @see data/primitives.json
1395
+ */
1396
+ export declare const GATE_CONTINUOUS_TRAVELS: {
1397
+ readonly thresholdDb: {
1398
+ readonly min: -80;
1399
+ readonly max: 0;
1400
+ readonly step: 0;
1401
+ readonly unit: "dB";
1402
+ readonly default: -40;
1403
+ readonly defaultFrom: "desk";
1404
+ };
1405
+ readonly rangeDb: {
1406
+ readonly min: -90;
1407
+ readonly max: 0;
1408
+ readonly step: 0;
1409
+ readonly unit: "dB";
1410
+ readonly default: -90;
1411
+ readonly defaultFrom: "desk";
1412
+ };
1413
+ readonly releaseMs: {
1414
+ readonly min: 0;
1415
+ readonly max: 5000;
1416
+ readonly step: 0;
1417
+ readonly unit: "ms";
1418
+ readonly default: 100;
1419
+ readonly defaultFrom: "desk";
1420
+ };
1421
+ readonly ratio: {
1422
+ readonly min: 1;
1423
+ readonly max: 100;
1424
+ readonly step: 0;
1425
+ readonly unit: "";
1426
+ readonly default: 16;
1427
+ readonly defaultFrom: "desk";
1428
+ };
1429
+ };
1430
+
1431
+ /**
1432
+ * The compressor's threshold and release as a plugin host draws them: COMP_LIMITS' bounds, units and defaults with no step. The console's row quantises them to whole steps (1 dB, 10 ms), and a travel whose step is 1 or more reads as an integer control; the omx-strip plugin has always offered them continuous, so it reads this table instead. Every number but the step is COMP_LIMITS', held equal by test/continuous-travels.test.mjs. Not rendered to C: no C reader needs a second spelling of the compressor's bounds.
1433
+ * @see data/primitives.json
1434
+ */
1435
+ export declare const COMP_CONTINUOUS_TRAVELS: {
1436
+ readonly thresholdDb: {
1437
+ readonly min: -60;
1438
+ readonly max: 0;
1439
+ readonly step: 0;
1440
+ readonly unit: "dB";
1441
+ readonly default: -18;
1442
+ readonly defaultFrom: "desk";
1443
+ };
1444
+ readonly releaseMs: {
1445
+ readonly min: 5;
1446
+ readonly max: 3000;
1447
+ readonly step: 0;
1448
+ readonly unit: "ms";
1449
+ readonly default: 200;
1450
+ readonly defaultFrom: "desk";
1451
+ };
1452
+ };
1453
+
1454
+ /**
1455
+ * The digital input trim as a travel: openmixer's TRIM_RANGE (packages/declarations, -24..+24 dB in 0.1 dB steps, spelled minDb/maxDb/stepDb there and OMX_TRIM_RANGE_*_DB in omx-dsp's header), coming up at 0 dB, the trim a channel has when none is set. The omx-strip plugin's trim reads it. A table with the one field `trimDb`, the name the trim row and the plugin store; not rendered to C, which already spells TRIM_RANGE its own way.
1456
+ * @see data/primitives.json
1457
+ */
1458
+ export declare const TRIM_TRAVELS: {
1459
+ readonly trimDb: {
1460
+ readonly min: -24;
1461
+ readonly max: 24;
1462
+ readonly step: 0.1;
1463
+ readonly unit: "dB";
1464
+ readonly default: 0;
1465
+ readonly defaultFrom: "desk";
1466
+ };
1467
+ };
1468
+
498
1469
  /**
499
1470
  * The standard sample rates (Hz) the desk recognises — the pro-audio superset. One source of truth for the clock controller's `clock.allowed-rates` seed, the force row's validation ceiling and the device-rate probe fallback. What the operator is OFFERED is always the DEVICE's own `supportedRates` (`2026-07-15-clock-rate-honest-force-rate.md`) — this is the ceiling a write is refused by, never a menu.
500
1471
  * @see data/rates.json