@openmixer/omx-contract 1.0.0 → 1.1.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.
@@ -95,6 +95,103 @@ export declare const PROGRAM_RELEASE: {
95
95
  };
96
96
  };
97
97
 
98
+ /**
99
+ * 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).
100
+ * @see data/kernels/deesser.json
101
+ */
102
+ export declare const DEESS_FREQ_RANGE: {
103
+ readonly min: 2000;
104
+ readonly max: 16000;
105
+ readonly step: 10;
106
+ readonly unit: "Hz";
107
+ readonly default: 7000;
108
+ readonly defaultFrom: "desk";
109
+ };
110
+
111
+ /**
112
+ * 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.
113
+ * @see data/kernels/deesser.json
114
+ */
115
+ export declare const DEESS_WIDTH_RANGE: {
116
+ readonly min: 0.25;
117
+ readonly max: 4;
118
+ readonly step: 0.05;
119
+ readonly unit: "oct";
120
+ readonly default: 1;
121
+ readonly defaultFrom: "desk";
122
+ };
123
+
124
+ /**
125
+ * 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".
126
+ * @see data/kernels/deesser.json
127
+ */
128
+ export declare const DEESS_THRESHOLD_RANGE: {
129
+ readonly min: -60;
130
+ readonly max: 0;
131
+ readonly step: 0.5;
132
+ readonly unit: "dB";
133
+ readonly default: -30;
134
+ readonly defaultFrom: "desk";
135
+ };
136
+
137
+ /**
138
+ * 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.
139
+ * @see data/kernels/deesser.json
140
+ */
141
+ export declare const DEESS_RATIO_RANGE: {
142
+ readonly min: 1;
143
+ readonly max: 20;
144
+ readonly step: 0.1;
145
+ readonly unit: "";
146
+ readonly default: 4;
147
+ readonly defaultFrom: "desk";
148
+ };
149
+
150
+ /**
151
+ * 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.
152
+ * @see data/kernels/deesser.json
153
+ */
154
+ export declare const DEESS_RANGE_RANGE: {
155
+ readonly min: -24;
156
+ readonly max: 0;
157
+ readonly step: 0.5;
158
+ readonly unit: "dB";
159
+ readonly default: -12;
160
+ readonly defaultFrom: "desk";
161
+ };
162
+
163
+ /**
164
+ * 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.
165
+ * @see data/kernels/deesser.json
166
+ */
167
+ export declare const DEESS_ATTACK_RANGE: {
168
+ readonly min: 0.1;
169
+ readonly max: 50;
170
+ readonly step: 0.1;
171
+ readonly unit: "ms";
172
+ readonly default: 1;
173
+ readonly defaultFrom: "desk";
174
+ };
175
+
176
+ /**
177
+ * 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.
178
+ * @see data/kernels/deesser.json
179
+ */
180
+ export declare const DEESS_RELEASE_RANGE: {
181
+ readonly min: 5;
182
+ readonly max: 500;
183
+ readonly step: 1;
184
+ readonly unit: "ms";
185
+ readonly default: 60;
186
+ readonly defaultFrom: "desk";
187
+ };
188
+
189
+ /**
190
+ * 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.
191
+ * @see data/kernels/deesser.json
192
+ */
193
+ export declare const DEESS_KNEE_DB: 6;
194
+
98
195
  /**
99
196
  * 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
197
  * @see data/kernels/delay.json
@@ -180,6 +277,58 @@ export declare const ISO_THIRD_OCTAVE_CENTRES_HZ: readonly [20, 25, 31.5, 40, 50
180
277
  */
181
278
  export declare const GEQ_BANDS: 31;
182
279
 
280
+ /**
281
+ * The flanger's jet sweep (§3b).
282
+ * @see data/kernels/flanger.json
283
+ */
284
+ export declare const FLANGER_RATE_RANGE: {
285
+ readonly min: 0.05;
286
+ readonly max: 5;
287
+ readonly step: 0.01;
288
+ readonly unit: "Hz";
289
+ readonly default: 0.25;
290
+ readonly defaultFrom: "desk";
291
+ };
292
+
293
+ /**
294
+ * The flanger's peak-to-peak excursion above its declared 0.5 ms base (§3b).
295
+ * @see data/kernels/flanger.json
296
+ */
297
+ export declare const FLANGER_DEPTH_RANGE: {
298
+ readonly min: 0;
299
+ readonly max: 5;
300
+ readonly step: 0.1;
301
+ readonly unit: "ms";
302
+ readonly default: 2;
303
+ readonly defaultFrom: "desk";
304
+ };
305
+
306
+ /**
307
+ * 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.
308
+ * @see data/kernels/flanger.json
309
+ */
310
+ export declare const FLANGER_FEEDBACK_RANGE: {
311
+ readonly min: -0.95;
312
+ readonly max: 0.95;
313
+ readonly step: 0.01;
314
+ readonly unit: "";
315
+ readonly default: 0.6;
316
+ readonly defaultFrom: "desk";
317
+ };
318
+
319
+ /**
320
+ * The flanger's wet/dry, as an instance of DRIVE_MIX_RANGE: 50 %, equal dry and wet, where the comb is deepest (§3b).
321
+ * @see data/kernels/flanger.json
322
+ */
323
+ export declare const FLANGER_MIX_RANGE: {
324
+ readonly min: 0;
325
+ readonly max: 100;
326
+ readonly step: 0.1;
327
+ readonly unit: "%";
328
+ readonly default: 50;
329
+ readonly defaultFrom: "desk";
330
+ };
331
+
183
332
  /**
184
333
  * 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
334
  * @see data/kernels/gate.json
@@ -259,6 +408,37 @@ export declare const GATE_LIMITS: {
259
408
  };
260
409
  };
261
410
 
411
+ /**
412
+ * 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).
413
+ * @see data/kernels/geq.json
414
+ */
415
+ export declare const GEQ_BAND_RANGE: {
416
+ readonly min: -15;
417
+ readonly max: 15;
418
+ readonly step: 0.5;
419
+ readonly unit: "dB";
420
+ readonly default: 0;
421
+ readonly defaultFrom: "desk";
422
+ };
423
+
424
+ /**
425
+ * 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).
426
+ * @see data/kernels/geq.json
427
+ */
428
+ export declare const GEQ_BAND_Q: 4.3;
429
+
430
+ /**
431
+ * 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.
432
+ * @see data/kernels/geq.json
433
+ */
434
+ export declare const GEQ_PROTO_DB: 12;
435
+
436
+ /**
437
+ * 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.
438
+ * @see data/kernels/geq.json
439
+ */
440
+ export declare const GEQ_DESIGN_GAIN_MAX_DB: 30;
441
+
262
442
  /**
263
443
  * 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
444
  * @see data/kernels/limiter.json
@@ -290,6 +470,137 @@ export declare const LIMITER_LIMITS: {
290
470
  };
291
471
  };
292
472
 
473
+ /**
474
+ * The phaser's sweep speed (§3). `omx_lfo_inc` freezes at Nyquist; this travel stays far below.
475
+ * @see data/kernels/phaser.json
476
+ */
477
+ export declare const PHASER_RATE_RANGE: {
478
+ readonly min: 0.05;
479
+ readonly max: 5;
480
+ readonly step: 0.01;
481
+ readonly unit: "Hz";
482
+ readonly default: 0.5;
483
+ readonly defaultFrom: "desk";
484
+ };
485
+
486
+ /**
487
+ * The phaser's lowest centre frequency; the sweep runs upward from it (§3).
488
+ * @see data/kernels/phaser.json
489
+ */
490
+ export declare const PHASER_BASE_RANGE: {
491
+ readonly min: 50;
492
+ readonly max: 2000;
493
+ readonly step: 1;
494
+ readonly unit: "Hz";
495
+ readonly default: 200;
496
+ readonly defaultFrom: "desk";
497
+ };
498
+
499
+ /**
500
+ * The sweep's span above `base`, in octaves; 0 is a static phaser at `base` (§3).
501
+ * @see data/kernels/phaser.json
502
+ */
503
+ export declare const PHASER_DEPTH_RANGE: {
504
+ readonly min: 0;
505
+ readonly max: 6;
506
+ readonly step: 0.1;
507
+ readonly unit: "oct";
508
+ readonly default: 4;
509
+ readonly defaultFrom: "desk";
510
+ };
511
+
512
+ /**
513
+ * 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.
514
+ * @see data/kernels/phaser.json
515
+ */
516
+ export declare const PHASER_STAGES_RANGE: {
517
+ readonly min: 2;
518
+ readonly max: 12;
519
+ readonly step: 2;
520
+ readonly unit: "";
521
+ readonly default: 6;
522
+ readonly defaultFrom: "desk";
523
+ };
524
+
525
+ /**
526
+ * The member set the `stages` field accepts: PHASER_STAGES_RANGE walked by its step.
527
+ * @see data/kernels/phaser.json
528
+ */
529
+ export declare const PHASER_STAGE_COUNTS: readonly [2, 4, 6, 8, 10, 12];
530
+
531
+ /**
532
+ * 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.
533
+ * @see data/kernels/phaser.json
534
+ */
535
+ export declare const PHASER_FEEDBACK_RANGE: {
536
+ readonly min: -0.9;
537
+ readonly max: 0.9;
538
+ readonly step: 0.01;
539
+ readonly unit: "";
540
+ readonly default: 0.4;
541
+ readonly defaultFrom: "desk";
542
+ };
543
+
544
+ /**
545
+ * The phaser's wet/dry, as an instance of DRIVE_MIX_RANGE: 50 %, where the notch is complete (§3).
546
+ * @see data/kernels/phaser.json
547
+ */
548
+ export declare const PHASER_MIX_RANGE: {
549
+ readonly min: 0;
550
+ readonly max: 100;
551
+ readonly step: 0.1;
552
+ readonly unit: "%";
553
+ readonly default: 50;
554
+ readonly defaultFrom: "desk";
555
+ };
556
+
557
+ /**
558
+ * 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.
559
+ * @see data/kernels/phaser.json
560
+ */
561
+ export declare const PHASER_TRAVELS: {
562
+ readonly rateHz: {
563
+ readonly min: 0.05;
564
+ readonly max: 5;
565
+ readonly step: 0.01;
566
+ readonly unit: "Hz";
567
+ readonly default: 0.5;
568
+ readonly defaultFrom: "desk";
569
+ };
570
+ readonly baseHz: {
571
+ readonly min: 50;
572
+ readonly max: 2000;
573
+ readonly step: 1;
574
+ readonly unit: "Hz";
575
+ readonly default: 200;
576
+ readonly defaultFrom: "desk";
577
+ };
578
+ readonly depthOct: {
579
+ readonly min: 0;
580
+ readonly max: 6;
581
+ readonly step: 0.1;
582
+ readonly unit: "oct";
583
+ readonly default: 4;
584
+ readonly defaultFrom: "desk";
585
+ };
586
+ readonly feedback: {
587
+ readonly min: -0.9;
588
+ readonly max: 0.9;
589
+ readonly step: 0.01;
590
+ readonly unit: "";
591
+ readonly default: 0.4;
592
+ readonly defaultFrom: "desk";
593
+ };
594
+ readonly mix: {
595
+ readonly min: 0;
596
+ readonly max: 100;
597
+ readonly step: 0.1;
598
+ readonly unit: "%";
599
+ readonly default: 50;
600
+ readonly defaultFrom: "desk";
601
+ };
602
+ };
603
+
293
604
  /**
294
605
  * PITCH_LIMITS, moved from openmixer.
295
606
  * @see data/kernels/pitch.json
@@ -335,6 +646,232 @@ export declare const REVERB_PLATE_MOD_DEPTH_RANGE: {
335
646
  readonly defaultFrom: "desk";
336
647
  };
337
648
 
649
+ /**
650
+ * The horn's chorale (slow) rate, Hz.
651
+ * @see data/kernels/rotary.json
652
+ */
653
+ export declare const ROTARY_HORN_SLOW_RANGE: {
654
+ readonly min: 0.1;
655
+ readonly max: 2;
656
+ readonly step: 0.01;
657
+ readonly unit: "Hz";
658
+ readonly default: 0.8;
659
+ readonly defaultFrom: "desk";
660
+ };
661
+
662
+ /**
663
+ * The horn's tremolo (fast) rate, Hz.
664
+ * @see data/kernels/rotary.json
665
+ */
666
+ export declare const ROTARY_HORN_FAST_RANGE: {
667
+ readonly min: 3;
668
+ readonly max: 10;
669
+ readonly step: 0.01;
670
+ readonly unit: "Hz";
671
+ readonly default: 6.8;
672
+ readonly defaultFrom: "desk";
673
+ };
674
+
675
+ /**
676
+ * The drum's chorale (slow) rate, Hz.
677
+ * @see data/kernels/rotary.json
678
+ */
679
+ export declare const ROTARY_DRUM_SLOW_RANGE: {
680
+ readonly min: 0.1;
681
+ readonly max: 2;
682
+ readonly step: 0.01;
683
+ readonly unit: "Hz";
684
+ readonly default: 0.7;
685
+ readonly defaultFrom: "desk";
686
+ };
687
+
688
+ /**
689
+ * The drum's tremolo (fast) rate, Hz.
690
+ * @see data/kernels/rotary.json
691
+ */
692
+ export declare const ROTARY_DRUM_FAST_RANGE: {
693
+ readonly min: 3;
694
+ readonly max: 10;
695
+ readonly step: 0.01;
696
+ readonly unit: "Hz";
697
+ readonly default: 5.9;
698
+ readonly defaultFrom: "desk";
699
+ };
700
+
701
+ /**
702
+ * The scale on every speed-change time constant (`ROTARY_*_ACCEL_MS`/`_DECEL_MS`): 2 is twice as slow.
703
+ * @see data/kernels/rotary.json
704
+ */
705
+ export declare const ROTARY_ACCEL_RANGE: {
706
+ readonly min: 0.25;
707
+ readonly max: 4;
708
+ readonly step: 0.01;
709
+ readonly unit: "x";
710
+ readonly default: 1;
711
+ readonly defaultFrom: "desk";
712
+ };
713
+
714
+ /**
715
+ * The drum/horn balance, percent: −100 drum only, +100 horn only; the law attenuates, never boosts.
716
+ * @see data/kernels/rotary.json
717
+ */
718
+ export declare const ROTARY_BALANCE_RANGE: {
719
+ readonly min: -100;
720
+ readonly max: 100;
721
+ readonly step: 1;
722
+ readonly unit: "%";
723
+ readonly default: 0;
724
+ readonly defaultFrom: "desk";
725
+ };
726
+
727
+ /**
728
+ * 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).
729
+ * @see data/kernels/rotary.json
730
+ */
731
+ export declare const ROTARY_MIX_RANGE: {
732
+ readonly min: 0;
733
+ readonly max: 100;
734
+ readonly step: 0.1;
735
+ readonly unit: "%";
736
+ readonly default: 100;
737
+ readonly defaultFrom: "desk";
738
+ };
739
+
740
+ /**
741
+ * 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).
742
+ * @see data/kernels/rotary.json
743
+ */
744
+ export declare const ROTARY_TRAVELS: {
745
+ readonly hornSlowHz: {
746
+ readonly min: 0.1;
747
+ readonly max: 2;
748
+ readonly step: 0.01;
749
+ readonly unit: "Hz";
750
+ readonly default: 0.8;
751
+ readonly defaultFrom: "desk";
752
+ };
753
+ readonly hornFastHz: {
754
+ readonly min: 3;
755
+ readonly max: 10;
756
+ readonly step: 0.01;
757
+ readonly unit: "Hz";
758
+ readonly default: 6.8;
759
+ readonly defaultFrom: "desk";
760
+ };
761
+ readonly drumSlowHz: {
762
+ readonly min: 0.1;
763
+ readonly max: 2;
764
+ readonly step: 0.01;
765
+ readonly unit: "Hz";
766
+ readonly default: 0.7;
767
+ readonly defaultFrom: "desk";
768
+ };
769
+ readonly drumFastHz: {
770
+ readonly min: 3;
771
+ readonly max: 10;
772
+ readonly step: 0.01;
773
+ readonly unit: "Hz";
774
+ readonly default: 5.9;
775
+ readonly defaultFrom: "desk";
776
+ };
777
+ readonly accel: {
778
+ readonly min: 0.25;
779
+ readonly max: 4;
780
+ readonly step: 0.01;
781
+ readonly unit: "x";
782
+ readonly default: 1;
783
+ readonly defaultFrom: "desk";
784
+ };
785
+ readonly balance: {
786
+ readonly min: -100;
787
+ readonly max: 100;
788
+ readonly step: 1;
789
+ readonly unit: "%";
790
+ readonly default: 0;
791
+ readonly defaultFrom: "desk";
792
+ };
793
+ readonly mix: {
794
+ readonly min: 0;
795
+ readonly max: 100;
796
+ readonly step: 0.1;
797
+ readonly unit: "%";
798
+ readonly default: 100;
799
+ readonly defaultFrom: "desk";
800
+ };
801
+ };
802
+
803
+ /**
804
+ * The complementary split's low-pass corner, Hz: the Leslie 122's passive crossover.
805
+ * @see data/kernels/rotary.json
806
+ */
807
+ export declare const ROTARY_CROSSOVER_HZ: 800;
808
+
809
+ /**
810
+ * The shortest Doppler read, ms — above the order-3 read's one-sample reach at every rate.
811
+ * @see data/kernels/rotary.json
812
+ */
813
+ export declare const ROTARY_BASE_MS: 0.1;
814
+
815
+ /**
816
+ * The horn's Doppler excursion `D_horn`, ms: a 0.15 m radius over 343 m/s.
817
+ * @see data/kernels/rotary.json
818
+ */
819
+ export declare const ROTARY_HORN_DOPPLER_MS: 0.44;
820
+
821
+ /**
822
+ * The drum's Doppler excursion `D_drum`, ms: its baffle turns over a fixed woofer.
823
+ * @see data/kernels/rotary.json
824
+ */
825
+ export declare const ROTARY_DRUM_DOPPLER_MS: 0.29;
826
+
827
+ /**
828
+ * The horn's amplitude swing `m_horn` (a −6 dB directivity dip), a ratio.
829
+ * @see data/kernels/rotary.json
830
+ */
831
+ export declare const ROTARY_HORN_AM: 0.5;
832
+
833
+ /**
834
+ * The drum baffle's amplitude swing `m_drum`, a ratio.
835
+ * @see data/kernels/rotary.json
836
+ */
837
+ export declare const ROTARY_DRUM_AM: 0.3;
838
+
839
+ /**
840
+ * The horn rotor's speed-up time constant, ms (at `accel` 1).
841
+ * @see data/kernels/rotary.json
842
+ */
843
+ export declare const ROTARY_HORN_ACCEL_MS: 330;
844
+
845
+ /**
846
+ * The horn rotor's slow-down time constant, ms (at `accel` 1).
847
+ * @see data/kernels/rotary.json
848
+ */
849
+ export declare const ROTARY_HORN_DECEL_MS: 500;
850
+
851
+ /**
852
+ * The drum rotor's speed-up time constant, ms (at `accel` 1).
853
+ * @see data/kernels/rotary.json
854
+ */
855
+ export declare const ROTARY_DRUM_ACCEL_MS: 1700;
856
+
857
+ /**
858
+ * The drum rotor's slow-down time constant, ms (at `accel` 1).
859
+ * @see data/kernels/rotary.json
860
+ */
861
+ export declare const ROTARY_DRUM_DECEL_MS: 1800;
862
+
863
+ /**
864
+ * Below this rate, Hz, a rotor coasting toward `stop` is snapped to exactly 0.
865
+ * @see data/kernels/rotary.json
866
+ */
867
+ export declare const ROTARY_STOP_EPS: 0.0001;
868
+
869
+ /**
870
+ * One inline ring per rotor per leg, floats — at least the 192 kHz need of the horn's sweep.
871
+ * @see data/kernels/rotary.json
872
+ */
873
+ export declare const ROTARY_RING_FLOATS: 256;
874
+
338
875
  /**
339
876
  * 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
877
  * @see data/kernels/transient.json
@@ -407,56 +944,73 @@ export declare const TRANSIENT_REF_DB: 6;
407
944
  export declare const TRANSIENT_FLOOR_LIN: 0.00001;
408
945
 
409
946
  /**
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
947
+ * The tremolo's LFO rate (the catalogue row's 0.1..20 Hz); 4 Hz is the classic amp tremolo.
948
+ * @see data/kernels/tremolo.json
414
949
  */
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";
950
+ export declare const TREMOLO_RATE_RANGE: {
951
+ readonly min: 0.1;
952
+ readonly max: 20;
953
+ readonly step: 0.01;
954
+ readonly unit: "Hz";
955
+ readonly default: 4;
956
+ readonly defaultFrom: "desk";
957
+ };
958
+
959
+ /**
960
+ * The tremolo's modulation depth: the gain's trough is `1 − mix·depth`.
961
+ * @see data/kernels/tremolo.json
962
+ */
963
+ export declare const TREMOLO_DEPTH_RANGE: {
964
+ readonly min: 0;
965
+ readonly max: 100;
966
+ readonly step: 0.1;
967
+ readonly unit: "%";
968
+ readonly default: 50;
969
+ readonly defaultFrom: "desk";
970
+ };
971
+
972
+ /**
973
+ * 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).
974
+ * @see data/kernels/tremolo.json
975
+ */
976
+ export declare const TREMOLO_MIX_RANGE: {
977
+ readonly min: 0;
978
+ readonly max: 100;
979
+ readonly step: 0.1;
980
+ readonly unit: "%";
981
+ readonly default: 100;
982
+ readonly defaultFrom: "desk";
983
+ };
984
+
985
+ /**
986
+ * 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).
987
+ * @see data/kernels/tremolo.json
988
+ */
989
+ export declare const TREMOLO_TRAVELS: {
990
+ readonly rateHz: {
991
+ readonly min: 0.1;
992
+ readonly max: 20;
993
+ readonly step: 0.01;
994
+ readonly unit: "Hz";
995
+ readonly default: 4;
996
+ readonly defaultFrom: "desk";
997
+ };
998
+ readonly depth: {
445
999
  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";
1000
+ readonly max: 100;
1001
+ readonly step: 0.1;
1002
+ readonly unit: "%";
1003
+ readonly default: 50;
1004
+ readonly defaultFrom: "desk";
1005
+ };
1006
+ readonly mix: {
453
1007
  readonly min: 0;
454
- readonly max: 1;
455
- readonly def: 0;
456
- readonly step: 1;
457
- readonly unit: "";
458
- readonly toggle: true;
459
- }];
1008
+ readonly max: 100;
1009
+ readonly step: 0.1;
1010
+ readonly unit: "%";
1011
+ readonly default: 100;
1012
+ readonly defaultFrom: "desk";
1013
+ };
460
1014
  };
461
1015
 
462
1016
  /**