@openmixer/omx-contract 2.11.0 → 2.12.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.
- package/README.md +2 -2
- package/bin/omx-contract.mjs +1 -1
- package/data/hosting.json +93 -0
- package/data/kernels/chorus.json +5 -5
- package/data/kernels/comp.json +2 -2
- package/data/kernels/deesser.json +1 -1
- package/data/kernels/delay.json +1 -1
- package/data/kernels/drive.json +3 -3
- package/data/kernels/eq.json +1 -1
- package/data/kernels/fbs.json +5 -5
- package/data/kernels/flanger.json +4 -4
- package/data/kernels/geq.json +4 -4
- package/data/kernels/hrp.json +5 -5
- package/data/kernels/mixmatrix.json +1 -1
- package/data/kernels/phaser.json +7 -7
- package/data/kernels/pitch.json +12 -3
- package/data/kernels/rotary.json +1 -1
- package/data/kernels/transient.json +5 -5
- package/data/primitives.json +1 -1
- package/dist/ts/omx-contract.d.ts +124 -46
- package/dist/ts/omx-contract.js +127 -49
- package/include/omxcontract/clap_host_limits.h +66 -0
- package/include/omxcontract/omx_contract_limits.h +20 -0
- package/lib/data.mjs +3 -1
- package/lib/fmt.mjs +3 -2
- package/lib/semver.mjs +11 -3
- package/lib/validate.mjs +21 -1
- package/package.json +1 -1
- package/render/c/clap-host-limits.mjs +78 -0
- package/render/c.mjs +10 -5
- package/render/ts.mjs +1 -1
- package/schema/omx-contract.schema.json +38 -4
- package/share/omx-contract/omx-contract.json +149 -50
|
@@ -2,6 +2,75 @@
|
|
|
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 numbers a hosted plugin's stage limits itself to: the warm-up before it is published, the blocks of non-finite output that strike it, the level its output is clamped at, the parameter queue and the events one block delivers, the polls and timeouts of the hand-over between threads, the ports the core accepts and the caps on a plugin's state, log and parameter count. These are the stage's safety numbers, not an operator's travel.
|
|
7
|
+
* @see data/hosting.json
|
|
8
|
+
*/
|
|
9
|
+
export declare const HOSTED_STAGE_LIMITS: {
|
|
10
|
+
readonly warmupBlocks: 64;
|
|
11
|
+
readonly warmupLevelDbfs: -6;
|
|
12
|
+
readonly nonFiniteStrikes: 3;
|
|
13
|
+
readonly clampDbfs: 24;
|
|
14
|
+
readonly paramQueueDepth: 256;
|
|
15
|
+
readonly eventsPerBlock: 64;
|
|
16
|
+
readonly unpublishPollUs: 100;
|
|
17
|
+
readonly unpublishTimeoutUs: 2000000;
|
|
18
|
+
readonly workerPollUs: 1000;
|
|
19
|
+
readonly workerRingBytes: 16384;
|
|
20
|
+
readonly notesPerBlock: 256;
|
|
21
|
+
readonly mainPortChannels: 2;
|
|
22
|
+
readonly auxOutputs: 8;
|
|
23
|
+
readonly auxInputs: 8;
|
|
24
|
+
readonly stateMaxBytes: 1048576;
|
|
25
|
+
readonly logBytes: 256;
|
|
26
|
+
readonly rolePollUs: 1000;
|
|
27
|
+
readonly roleTimeoutUs: 200000;
|
|
28
|
+
readonly paramCountMax: 2048;
|
|
29
|
+
readonly latencyHoldMs: 250;
|
|
30
|
+
};
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* The refusals the CLAP core returns, by the hosting code a verdict names them by. A code is never reworded.
|
|
34
|
+
* @see data/hosting.json
|
|
35
|
+
*/
|
|
36
|
+
export declare const HOSTING_CODES: {
|
|
37
|
+
readonly headlessFailed: {
|
|
38
|
+
readonly code: "hosting.clap.headless-failed";
|
|
39
|
+
};
|
|
40
|
+
readonly notAudioEffect: {
|
|
41
|
+
readonly code: "hosting.clap.not-audio-effect";
|
|
42
|
+
readonly doc: "the plugin is not an audio effect";
|
|
43
|
+
};
|
|
44
|
+
readonly noteInput: {
|
|
45
|
+
readonly code: "hosting.clap.note-input";
|
|
46
|
+
readonly doc: "the plugin declares a note input the configuration refuses";
|
|
47
|
+
};
|
|
48
|
+
readonly noAudioInput: {
|
|
49
|
+
readonly code: "hosting.topology.no-audio-input";
|
|
50
|
+
readonly doc: "the plugin has no audio input";
|
|
51
|
+
};
|
|
52
|
+
readonly noAudioOutput: {
|
|
53
|
+
readonly code: "hosting.topology.no-audio-output";
|
|
54
|
+
readonly doc: "the plugin has no audio output";
|
|
55
|
+
};
|
|
56
|
+
readonly widerThanStrip: {
|
|
57
|
+
readonly code: "hosting.topology.wider-than-strip";
|
|
58
|
+
readonly doc: "the plugin is wider than the strip";
|
|
59
|
+
};
|
|
60
|
+
readonly extraInputs: {
|
|
61
|
+
readonly code: "hosting.topology.extra-inputs-fed-silence";
|
|
62
|
+
readonly doc: "the plugin has extra inputs, fed silence";
|
|
63
|
+
};
|
|
64
|
+
readonly crashedLive: {
|
|
65
|
+
readonly code: "hosting.stability.crashed-live-on-this-rig";
|
|
66
|
+
readonly doc: "the plugin crashed live on this rig";
|
|
67
|
+
};
|
|
68
|
+
readonly outputNonFinite: {
|
|
69
|
+
readonly code: "hosting.output.non-finite";
|
|
70
|
+
readonly doc: "the plugin produced non-finite output";
|
|
71
|
+
};
|
|
72
|
+
};
|
|
73
|
+
|
|
5
74
|
/**
|
|
6
75
|
* 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
76
|
* @see data/kernels/balance.json
|
|
@@ -103,7 +172,7 @@ export declare const BAND_DYN_MAX_BANDS: 9;
|
|
|
103
172
|
export declare const DETECTOR_OVERSAMPLE_AUTO_MS: 0.5;
|
|
104
173
|
|
|
105
174
|
/**
|
|
106
|
-
* The chorus's right-leg phase offset, in TURNS of its one oscillator
|
|
175
|
+
* The chorus's right-leg phase offset, in TURNS of its one oscillator. 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 ''.
|
|
107
176
|
* @see data/kernels/chorus.json
|
|
108
177
|
*/
|
|
109
178
|
export declare const CHORUS_SPREAD_RANGE: {
|
|
@@ -116,7 +185,7 @@ export declare const CHORUS_SPREAD_RANGE: {
|
|
|
116
185
|
};
|
|
117
186
|
|
|
118
187
|
/**
|
|
119
|
-
* The chorus sweep's speed
|
|
188
|
+
* The chorus sweep's speed. Above ~3 Hz it stops being a chorus and becomes a vibrato.
|
|
120
189
|
* @see data/kernels/chorus.json
|
|
121
190
|
*/
|
|
122
191
|
export declare const CHORUS_RATE_RANGE: {
|
|
@@ -129,7 +198,7 @@ export declare const CHORUS_RATE_RANGE: {
|
|
|
129
198
|
};
|
|
130
199
|
|
|
131
200
|
/**
|
|
132
|
-
* The chorus's peak-to-peak excursion above its declared 10 ms base
|
|
201
|
+
* The chorus's peak-to-peak excursion above its declared 10 ms base.
|
|
133
202
|
* @see data/kernels/chorus.json
|
|
134
203
|
*/
|
|
135
204
|
export declare const CHORUS_DEPTH_RANGE: {
|
|
@@ -142,7 +211,7 @@ export declare const CHORUS_DEPTH_RANGE: {
|
|
|
142
211
|
};
|
|
143
212
|
|
|
144
213
|
/**
|
|
145
|
-
* The chorus's tap count — one oscillator read at k/N
|
|
214
|
+
* The chorus's tap count — one oscillator read at k/N.
|
|
146
215
|
* @see data/kernels/chorus.json
|
|
147
216
|
*/
|
|
148
217
|
export declare const CHORUS_VOICES_RANGE: {
|
|
@@ -155,7 +224,7 @@ export declare const CHORUS_VOICES_RANGE: {
|
|
|
155
224
|
};
|
|
156
225
|
|
|
157
226
|
/**
|
|
158
|
-
* 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
|
|
227
|
+
* 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. The REVERB_LOWCUT_RANGE-over- REVERB_CUT_RANGE shape: one travel, one declared default per field that reads it.
|
|
159
228
|
* @see data/kernels/chorus.json
|
|
160
229
|
*/
|
|
161
230
|
export declare const CHORUS_MIX_RANGE: {
|
|
@@ -255,13 +324,13 @@ export declare const COMP_KINDS: readonly ["comp", "limiter"];
|
|
|
255
324
|
export declare const DETECTOR_OVERSAMPLINGS: readonly ["auto", "off", "4x"];
|
|
256
325
|
|
|
257
326
|
/**
|
|
258
|
-
* Where the compressor's detector listens: `feedforward` hears the slot's input (or its key), `feedback` hears the slot's own pre-make-up output DYN_FB_LOOP_DELAY_SAMPLES late, through one envelope stage, and a keyed slot stays feed-forward (omx-dsp's OMX_DYN_TOPOLOGY_FEEDFORWARD 0 and _FEEDBACK 1, in that order; the set is named for its control, so C spells them OMX_DETECTOR_TOPOLOGY_*). The console's comp row carries it (`detectorTopology
|
|
327
|
+
* Where the compressor's detector listens: `feedforward` hears the slot's input (or its key), `feedback` hears the slot's own pre-make-up output DYN_FB_LOOP_DELAY_SAMPLES late, through one envelope stage, and a keyed slot stays feed-forward (omx-dsp's OMX_DYN_TOPOLOGY_FEEDFORWARD 0 and _FEEDBACK 1, in that order; the set is named for its control, so C spells them OMX_DETECTOR_TOPOLOGY_*). The console's comp row carries it (`detectorTopology`) and comes up `feedforward`, so a zeroed atom is the compressor every slot runs.
|
|
259
328
|
* @see data/kernels/comp.json
|
|
260
329
|
*/
|
|
261
330
|
export declare const DETECTOR_TOPOLOGY: readonly ["feedforward", "feedback"];
|
|
262
331
|
|
|
263
332
|
/**
|
|
264
|
-
* The program-dependent release's model constants — the LA-2A's opto cell as DATA
|
|
333
|
+
* The program-dependent release's model constants — the LA-2A's opto cell as DATA. `chargeMs`/`dischargeMs` are the word's memory constants, shared by every profile; each profile's `fastMs`, `slowMinMs`, `slowMaxMs` and `share` fit the unit's published two-stage recovery. Not operator controls: generated into `omx_contract_limits.h` as `OMX_PROGRAM_RELEASE_*`, which libomxdsp's `omx_env_program_release` reads.
|
|
265
334
|
* @see data/kernels/comp.json
|
|
266
335
|
*/
|
|
267
336
|
export declare const PROGRAM_RELEASE: {
|
|
@@ -336,7 +405,7 @@ export declare const DEESS_RATIO_RANGE: {
|
|
|
336
405
|
};
|
|
337
406
|
|
|
338
407
|
/**
|
|
339
|
-
* 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
|
|
408
|
+
* 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). 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.
|
|
340
409
|
* @see data/kernels/deesser.json
|
|
341
410
|
*/
|
|
342
411
|
export declare const DEESS_RANGE_RANGE: {
|
|
@@ -448,7 +517,7 @@ export declare const DELAY_MIX_RANGE: {
|
|
|
448
517
|
export declare const DELAY_PINGPONGS: readonly ["off", "on"];
|
|
449
518
|
|
|
450
519
|
/**
|
|
451
|
-
* The FX delay's PING-PONG come-up value — a toggle, so it has no travel, only this. Declared here rather than as a literal in the console's delay default state (which now reads it) so the DPF plugin generator (omx-plugins
|
|
520
|
+
* The FX delay's PING-PONG come-up value — a toggle, so it has no travel, only this. Declared here rather than as a literal in the console's delay default state (which now reads it) so the DPF plugin generator (omx-plugins) reads the same fact the desk seeds a fresh strip with.
|
|
452
521
|
* @see data/kernels/delay.json
|
|
453
522
|
*/
|
|
454
523
|
export declare const FX_DELAY_PINGPONG_DEFAULT: false;
|
|
@@ -531,13 +600,13 @@ export declare const DRIVE_CURVES: readonly ["soft", "tape", "tube", "exciter"];
|
|
|
531
600
|
export declare const DRIVE_BANDS: readonly ["full", "low", "high", "tilt"];
|
|
532
601
|
|
|
533
602
|
/**
|
|
534
|
-
* The drive's AUTO-GAIN switch: on, the stage measures its own level change and matches it out (`omx_drive.h`'s `struct omx_drive.auto_gain
|
|
603
|
+
* The drive's AUTO-GAIN switch: on, the stage measures its own level change and matches it out (`omx_drive.h`'s `struct omx_drive.auto_gain`), so turning the drive up adds colour rather than loudness. A field of the console's drive row (`DriveState.autoGain`), on at come-up there and in omx-dsp's drive face.
|
|
535
604
|
* @see data/kernels/drive.json
|
|
536
605
|
*/
|
|
537
606
|
export declare const DRIVE_AUTO_GAINS: readonly ["off", "on"];
|
|
538
607
|
|
|
539
608
|
/**
|
|
540
|
-
* The drive's STEREO LINK switch: on, ONE auto-gain path is driven by both legs' summed energy, so the image cannot shift under the level match; off, each leg matches its own (`omx_drive.h`'s `struct omx_drive.stereo_link
|
|
609
|
+
* The drive's STEREO LINK switch: on, ONE auto-gain path is driven by both legs' summed energy, so the image cannot shift under the level match; off, each leg matches its own (`omx_drive.h`'s `struct omx_drive.stereo_link`). A field of the console's drive row (`DriveState.stereoLink`), on at come-up there and in omx-dsp's drive face.
|
|
541
610
|
* @see data/kernels/drive.json
|
|
542
611
|
*/
|
|
543
612
|
export declare const DRIVE_STEREO_LINKS: readonly ["off", "on"];
|
|
@@ -555,7 +624,7 @@ export declare const DRIVE_HF_ROLLOFFS: readonly ["off", "12000", "16000"];
|
|
|
555
624
|
export declare const DRIVE_OVERSAMPLES: readonly [1, 2, 4];
|
|
556
625
|
|
|
557
626
|
/**
|
|
558
|
-
* The bias at `character = +1`, in the SHAPER's own input units — `OMX_DRIVE_BIAS_MAX`. DERIVED, not chosen
|
|
627
|
+
* The bias at `character = +1`, in the SHAPER's own input units — `OMX_DRIVE_BIAS_MAX`. DERIVED, not chosen. 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.
|
|
559
628
|
* @see data/kernels/drive.json
|
|
560
629
|
*/
|
|
561
630
|
export declare const DRIVE_BIAS_MAX: 0.7071067811865476;
|
|
@@ -669,7 +738,7 @@ export declare const EQ_MAX_BANDS: 24;
|
|
|
669
738
|
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];
|
|
670
739
|
|
|
671
740
|
/**
|
|
672
|
-
* 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 (
|
|
741
|
+
* 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 (roster ruling 3).
|
|
673
742
|
* @see data/kernels/eq.json
|
|
674
743
|
*/
|
|
675
744
|
export declare const GEQ_BANDS: 31;
|
|
@@ -804,7 +873,7 @@ export declare const GROWTH_WINDOW_FRAMES: 5;
|
|
|
804
873
|
export declare const DEEP_PLATEAU_FRAMES: 20;
|
|
805
874
|
|
|
806
875
|
/**
|
|
807
|
-
* Minimum least-squares slope, in dB PER FRAME, over GROWTH_WINDOW_FRAMES for a bin to count as "running away" rather than merely holding level. Set with real margin on BOTH sides — comfortably above measurement jitter on a held tone or a quiet/broadband mix (well under 0.2 dB/frame in practice) and comfortably below a genuine feedback ramp, which climbs several dB across a handful of ~20 ms hops as it heads toward clipping.
|
|
876
|
+
* Minimum least-squares slope, in dB PER FRAME, over GROWTH_WINDOW_FRAMES for a bin to count as "running away" rather than merely holding level. Set with real margin on BOTH sides — comfortably above measurement jitter on a held tone or a quiet/broadband mix (well under 0.2 dB/frame in practice) and comfortably below a genuine feedback ramp, which climbs several dB across a handful of ~20 ms hops as it heads toward clipping. The acceptance bar is "arming must never burst-alarm on non-growing content", so this errs conservative (under-fire a marginal ramp) rather than tight (risk a false alarm) — the ramp gate (`omx_fbs_is_growing`) also requires the window's end to sit above its start, a cheap belt-and-braces check against a fit dragged positive by one mid-window wobble.
|
|
808
877
|
* @see data/kernels/fbs.json
|
|
809
878
|
*/
|
|
810
879
|
export declare const GROWTH_MIN_DB_PER_FRAME: 0.8;
|
|
@@ -816,19 +885,19 @@ export declare const GROWTH_MIN_DB_PER_FRAME: 0.8;
|
|
|
816
885
|
export declare const GROWTH_MAX_DIP_DB: 0.5;
|
|
817
886
|
|
|
818
887
|
/**
|
|
819
|
-
* Minimum END-TO-END rise (dB) across the window. The live-music corpus
|
|
888
|
+
* Minimum END-TO-END rise (dB) across the window. The live-music corpus showed sustained melody notes drifting up ~4–5 dB over a window without ever being feedback; a loop past unity gains several dB per hop and clears 6 dB in a window trivially. Below this the tone is holding level, not running away.
|
|
820
889
|
* @see data/kernels/fbs.json
|
|
821
890
|
*/
|
|
822
891
|
export declare const GROWTH_MIN_TOTAL_RISE_DB: 6;
|
|
823
892
|
|
|
824
893
|
/**
|
|
825
|
-
* Cap on the share of the window's total rise a SINGLE frame may carry. Feedback is exponential in amplitude ⇒ linear in dB ⇒ its rise is distributed roughly evenly across the window; a musical attack / re-articulation puts almost the whole rise in one hop (the exact shape behind every one of
|
|
894
|
+
* Cap on the share of the window's total rise a SINGLE frame may carry. Feedback is exponential in amplitude ⇒ linear in dB ⇒ its rise is distributed roughly evenly across the window; a musical attack / re-articulation puts almost the whole rise in one hop (the exact shape behind every one of the 72 live false positives of the live-music corpus). One half is generous to real ramps (an even N-frame ramp puts 1/(N−1) per hop) and fatal to steps. A side effect worth knowing: a 2-sample window can never pass (one hop IS the whole rise), so confirmation always rests on at least three frames of actual ramp evidence.
|
|
826
895
|
* @see data/kernels/fbs.json
|
|
827
896
|
*/
|
|
828
897
|
export declare const GROWTH_MAX_SINGLE_FRAME_SHARE: 0.5;
|
|
829
898
|
|
|
830
899
|
/**
|
|
831
|
-
* How many CONSECUTIVE frames the ramp gate (`omx_fbs_is_growing`) must hold before a bin confirms — the time-domain tiebreak for the one shape a single window cannot judge
|
|
900
|
+
* How many CONSECUTIVE frames the ramp gate (`omx_fbs_is_growing`) must hold before a bin confirms — the time-domain tiebreak for the one shape a single window cannot judge: a smooth musical crescendo. Within one window a +6 dB swell (live corpus: a C6 at 1 049 Hz, `[-53.7, -51.4, -50.4, -48, -47.3]`) is indistinguishable from slow feedback — the difference is only visible on the NEXT hop, where a crescendo peaks and plateaus (the window's rise collapses) while feedback keeps climbing. Requiring the gate to hold twice in a row costs a clean ramp nothing — its gate is already true while persistence is still arming — and blocks the swell that peaks the very frame it would have confirmed.
|
|
832
901
|
* @see data/kernels/fbs.json
|
|
833
902
|
*/
|
|
834
903
|
export declare const GROWTH_CONFIRM_FRAMES: 2;
|
|
@@ -852,7 +921,7 @@ export declare const DEFAULT_THRESHOLDS: {
|
|
|
852
921
|
};
|
|
853
922
|
|
|
854
923
|
/**
|
|
855
|
-
* THE NOTCH DEPTH LAW: the deepest cut any machine planter may propose from one reading, in dB. A number, not a literal at the call site, because two planters now lean on it. FBS derives a candidate's depth from the peak-to-average ratio around its bin and stops here; Room Analysis derives a mode's depth from its height above the median curve and is held to the SAME ceiling (the room-analysis design
|
|
924
|
+
* THE NOTCH DEPTH LAW: the deepest cut any machine planter may propose from one reading, in dB. A number, not a literal at the call site, because two planters now lean on it. FBS derives a candidate's depth from the peak-to-average ratio around its bin and stops here; Room Analysis derives a mode's depth from its height above the median curve and is held to the SAME ceiling (the room-analysis design — "never more than the FBS notch depth law"). Written twice as `18` those two bounds would be equal by coincidence and could drift apart in silence. It is a CEILING ON THE PROPOSAL, not the final gain: a band that lands as a rampable BELL is bounded again by `EQ_GAIN_RANGE`, which is tighter. A planter must honour both and REPORT when either bit, never quietly deliver a shallower cut than it was asked for.
|
|
856
925
|
* @see data/kernels/fbs.json
|
|
857
926
|
*/
|
|
858
927
|
export declare const FBS_MAX_NOTCH_DEPTH_DB: 18;
|
|
@@ -870,7 +939,7 @@ export declare const FBS_DEFAULT_NOTCH_Q: 116;
|
|
|
870
939
|
export declare const FBS_DEFAULT_MAX_AUTO_BANDS: 6;
|
|
871
940
|
|
|
872
941
|
/**
|
|
873
|
-
* The flanger's jet sweep
|
|
942
|
+
* The flanger's jet sweep.
|
|
874
943
|
* @see data/kernels/flanger.json
|
|
875
944
|
*/
|
|
876
945
|
export declare const FLANGER_RATE_RANGE: {
|
|
@@ -883,7 +952,7 @@ export declare const FLANGER_RATE_RANGE: {
|
|
|
883
952
|
};
|
|
884
953
|
|
|
885
954
|
/**
|
|
886
|
-
* The flanger's peak-to-peak excursion above its declared 0.5 ms base
|
|
955
|
+
* The flanger's peak-to-peak excursion above its declared 0.5 ms base.
|
|
887
956
|
* @see data/kernels/flanger.json
|
|
888
957
|
*/
|
|
889
958
|
export declare const FLANGER_DEPTH_RANGE: {
|
|
@@ -896,7 +965,7 @@ export declare const FLANGER_DEPTH_RANGE: {
|
|
|
896
965
|
};
|
|
897
966
|
|
|
898
967
|
/**
|
|
899
|
-
* The flanger's SIGNED resonance
|
|
968
|
+
* The flanger's SIGNED resonance. 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.
|
|
900
969
|
* @see data/kernels/flanger.json
|
|
901
970
|
*/
|
|
902
971
|
export declare const FLANGER_FEEDBACK_RANGE: {
|
|
@@ -909,7 +978,7 @@ export declare const FLANGER_FEEDBACK_RANGE: {
|
|
|
909
978
|
};
|
|
910
979
|
|
|
911
980
|
/**
|
|
912
|
-
* The flanger's wet/dry, as an instance of DRIVE_MIX_RANGE: 50 %, equal dry and wet, where the comb is deepest
|
|
981
|
+
* The flanger's wet/dry, as an instance of DRIVE_MIX_RANGE: 50 %, equal dry and wet, where the comb is deepest.
|
|
913
982
|
* @see data/kernels/flanger.json
|
|
914
983
|
*/
|
|
915
984
|
export declare const FLANGER_MIX_RANGE: {
|
|
@@ -1050,7 +1119,7 @@ export declare const GENERATOR_KINDS: readonly ["oscillator", "white", "pink"];
|
|
|
1050
1119
|
export declare const WAVEFORMS: readonly ["sine", "square", "saw", "triangle"];
|
|
1051
1120
|
|
|
1052
1121
|
/**
|
|
1053
|
-
* 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
|
|
1122
|
+
* 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.
|
|
1054
1123
|
* @see data/kernels/geq.json
|
|
1055
1124
|
*/
|
|
1056
1125
|
export declare const GEQ_BAND_RANGE: {
|
|
@@ -1063,19 +1132,19 @@ export declare const GEQ_BAND_RANGE: {
|
|
|
1063
1132
|
};
|
|
1064
1133
|
|
|
1065
1134
|
/**
|
|
1066
|
-
* 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
|
|
1135
|
+
* 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.
|
|
1067
1136
|
* @see data/kernels/geq.json
|
|
1068
1137
|
*/
|
|
1069
1138
|
export declare const GEQ_BAND_Q: 4.3;
|
|
1070
1139
|
|
|
1071
1140
|
/**
|
|
1072
|
-
* The prototype gain the `true` solve's first interaction matrix is evaluated at
|
|
1141
|
+
* The prototype gain the `true` solve's first interaction matrix is evaluated at: the middle of the travel's magnitude, where a matched-Z section's dB response per dB of gain is closest to its average.
|
|
1073
1142
|
* @see data/kernels/geq.json
|
|
1074
1143
|
*/
|
|
1075
1144
|
export declare const GEQ_PROTO_DB: 12;
|
|
1076
1145
|
|
|
1077
1146
|
/**
|
|
1078
|
-
* The ceiling on a section gain the `true` solve may ask for
|
|
1147
|
+
* The ceiling on a section gain the `true` solve may ask for: 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.
|
|
1079
1148
|
* @see data/kernels/geq.json
|
|
1080
1149
|
*/
|
|
1081
1150
|
export declare const GEQ_DESIGN_GAIN_MAX_DB: 30;
|
|
@@ -1112,31 +1181,31 @@ export declare const HRP_MAX_VOICES: 8;
|
|
|
1112
1181
|
export declare const HRP_BAND_Q: 5;
|
|
1113
1182
|
|
|
1114
1183
|
/**
|
|
1115
|
-
* How far a partial must stand above its LEARNED BASELINE before HRP calls it a resonance (increment 8
|
|
1184
|
+
* How far a partial must stand above its LEARNED BASELINE before HRP calls it a resonance (increment 8: `deviation = measured − baseline[note][harmonic]`). A partial level tells you nothing on its own; what marks a resonance is a partial louder than THIS instrument normally measures at THIS note. Three decibels is the same order as the feedback detector's peak-to-neighbour gate and for the same reason: below it, an ordinary performance's variation — a bow dug in, a verse sung harder — would be flattened, and flattening expression is not correcting a room. (Before the learned model existed this same threshold gated the placeholder neighbour rule; the number and its reasoning carried over.)
|
|
1116
1185
|
* @see data/kernels/hrp.json
|
|
1117
1186
|
*/
|
|
1118
1187
|
export declare const HRP_EXCESS_THRESHOLD_DB: 3;
|
|
1119
1188
|
|
|
1120
1189
|
/**
|
|
1121
|
-
* How far ONE reconcile pass may move an HRP band's gain, in dB —
|
|
1190
|
+
* How far ONE reconcile pass may move an HRP band's gain, in dB — the gain smoothing, done at the control level because the native cascade applies pushed coefficients verbatim and the design forbids interpolating there. An unbounded gain step is a waveform discontinuity — the click heard when a correction entered or left at full depth (found live, 2026-08-20, the evening increment 9 raised the enter/leave rate). Bounded, a correction ENTERS by deepening from silence and LEAVES by walking to exactly 0 dB — the provable parked identity (`eqBandIsIdentity`) — from which removal is bit-identical. Two decibels per pass at the corrector's 10 Hz cadence walks the full HRP_MAX_CUT_DB travel in ~300 ms: the same order as the tracker's stability hold and FBS's lift steps, while each individual move stays below audibility on a Q-5 bell.
|
|
1122
1191
|
* @see data/kernels/hrp.json
|
|
1123
1192
|
*/
|
|
1124
1193
|
export declare const HRP_GAIN_STEP_DB: 2;
|
|
1125
1194
|
|
|
1126
1195
|
/**
|
|
1127
|
-
* How close two correction candidates must sit, in cents, to count as the SAME spectral region
|
|
1196
|
+
* How close two correction candidates must sit, in cents, to count as the SAME spectral region: within it, the stronger candidate is selected and the weaker discarded rather than two near-identical filters being planted. One semitone, and the number follows from HRP_BAND_Q: a Q-5 bell's −3 dB half-width is ~170 cents, so two cuts a semitone apart overlap over most of their travel — the second one deepens the first far more than it shapes anything of its own. The design makes the threshold configurable and tested: declared once here, a parameter everywhere below.
|
|
1128
1197
|
* @see data/kernels/hrp.json
|
|
1129
1198
|
*/
|
|
1130
1199
|
export declare const HRP_COLLISION_CENTS: 100;
|
|
1131
1200
|
|
|
1132
1201
|
/**
|
|
1133
|
-
* The ATTRIBUTION window
|
|
1202
|
+
* The ATTRIBUTION window: two partials closer than this are one spectral event as far as the desk can tell — the same ±1 bin `omx_hrp_bin_peak` reads over, expressed musically so it holds across the range. A different law from HRP_COLLISION_CENTS (the SELECTION window, which stays above it): this one is the analyser's resolution, that one the corrector's. Generated into `omx_contract_limits.h` as `OMX_HRP_ATTRIBUTION_CENTS`; `hrp_attribute.h` reads it.
|
|
1134
1203
|
* @see data/kernels/hrp.json
|
|
1135
1204
|
*/
|
|
1136
1205
|
export declare const HRP_ATTRIBUTION_CENTS: 60;
|
|
1137
1206
|
|
|
1138
1207
|
/**
|
|
1139
|
-
* How many bands HRP may plant on ONE channel — its half of the machine budget, and the number that makes the budget FORECASTABLE rather than emergent. Without it the count is whatever the material happens to provoke: the placement law is sparse, so a clean note plants two bands and a resonant room plants nine, and nobody can answer "will this fit?" until it does not. With FBS senior
|
|
1208
|
+
* How many bands HRP may plant on ONE channel — its half of the machine budget, and the number that makes the budget FORECASTABLE rather than emergent. Without it the count is whatever the material happens to provoke: the placement law is sparse, so a clean note plants two bands and a resonant room plants nine, and nobody can answer "will this fit?" until it does not. With FBS senior that discovery would happen at showtime, to the junior planter, silently. Declared instead, the whole sum is arithmetic an operator can read before a note is played: operator bands + FBS maxAutoBands + HRP maxAutoBands <= EQ_MAX_BANDS EIGHT — ONE CORRECTION PER VOICE at full polyphony (operator sizing, 2026-09-01). The detector's ceiling is HRP_MAX_VOICES voices, a guitar's six strings and a piano/string voicing's eight, and a budget below the voice count would decide by arithmetic which of the notes actually sounding may be corrected — a limit nobody could read off the desk. Scarcity is handled where it belongs instead: the candidates from every voice meet in ONE globally ranked list and the head of it is what gets planted. It is NOT a claim to seniority, and it is larger than FBS's six. Seniority is the ALLOCATION ORDER — `HrpPlanter` takes only `EQ_MAX_BANDS − others.length`, the remainder after the operator and every other machine — so a bigger junior default cannot reach a senior slot; it only means HRP asks for more of what is left. the engine's conformance test asserts both halves. The per-channel DEFAULT; the row's travel is HRP_AUTO_BANDS_RANGE, so a channel that needs more can have more, as an explicit decision with a visible cost.
|
|
1140
1209
|
* @see data/kernels/hrp.json
|
|
1141
1210
|
*/
|
|
1142
1211
|
export declare const HRP_DEFAULT_MAX_AUTO_BANDS: 8;
|
|
@@ -1173,13 +1242,13 @@ export declare const LIMITER_LIMITS: {
|
|
|
1173
1242
|
};
|
|
1174
1243
|
|
|
1175
1244
|
/**
|
|
1176
|
-
* The input cap a summing bus can be sized to — **the engine's declared input ceiling**, read from
|
|
1245
|
+
* The input cap a summing bus can be sized to — **the engine's declared input ceiling**, read from the engine's declarations rather than re-typed here. A gig with more than this many inputs needs more than one engine node; below it a bus is sized to `min(N, BUS_INPUT_CAP)`. It was a literal 64 until 2026-09-15, said to mirror the engine's `MAX_BUS_INPUTS` — and it did, but that 64 was the PipeWire builtin mixer's single-tier fan-in (8 × 8), never the engine's bound: the native node has allocated `OMX_MAX_STRIPS` (128) strips all along. Two literals agreeing by hand is how the console came to refuse a 96-channel desk it could carry. the engine's conformance test holds this to the C header; the console allocation design carries the ruling and the measured cost of width.
|
|
1177
1246
|
* @see data/kernels/mixmatrix.json
|
|
1178
1247
|
*/
|
|
1179
1248
|
export declare const BUS_INPUT_CAP: 128;
|
|
1180
1249
|
|
|
1181
1250
|
/**
|
|
1182
|
-
* The phaser's sweep speed
|
|
1251
|
+
* The phaser's sweep speed. `omx_lfo_inc` freezes at Nyquist; this travel stays far below.
|
|
1183
1252
|
* @see data/kernels/phaser.json
|
|
1184
1253
|
*/
|
|
1185
1254
|
export declare const PHASER_RATE_RANGE: {
|
|
@@ -1192,7 +1261,7 @@ export declare const PHASER_RATE_RANGE: {
|
|
|
1192
1261
|
};
|
|
1193
1262
|
|
|
1194
1263
|
/**
|
|
1195
|
-
* The phaser's lowest centre frequency; the sweep runs upward from it
|
|
1264
|
+
* The phaser's lowest centre frequency; the sweep runs upward from it.
|
|
1196
1265
|
* @see data/kernels/phaser.json
|
|
1197
1266
|
*/
|
|
1198
1267
|
export declare const PHASER_BASE_RANGE: {
|
|
@@ -1205,7 +1274,7 @@ export declare const PHASER_BASE_RANGE: {
|
|
|
1205
1274
|
};
|
|
1206
1275
|
|
|
1207
1276
|
/**
|
|
1208
|
-
* The sweep's span above `base`, in octaves; 0 is a static phaser at `base
|
|
1277
|
+
* The sweep's span above `base`, in octaves; 0 is a static phaser at `base`.
|
|
1209
1278
|
* @see data/kernels/phaser.json
|
|
1210
1279
|
*/
|
|
1211
1280
|
export declare const PHASER_DEPTH_RANGE: {
|
|
@@ -1218,7 +1287,7 @@ export declare const PHASER_DEPTH_RANGE: {
|
|
|
1218
1287
|
};
|
|
1219
1288
|
|
|
1220
1289
|
/**
|
|
1221
|
-
* The phaser's section count per leg — EVEN, 2 … 12 (
|
|
1290
|
+
* The phaser's section count per leg — EVEN, 2 … 12 (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.
|
|
1222
1291
|
* @see data/kernels/phaser.json
|
|
1223
1292
|
*/
|
|
1224
1293
|
export declare const PHASER_STAGES_RANGE: {
|
|
@@ -1231,7 +1300,7 @@ export declare const PHASER_STAGES_RANGE: {
|
|
|
1231
1300
|
};
|
|
1232
1301
|
|
|
1233
1302
|
/**
|
|
1234
|
-
* The phaser's SIGNED resonance
|
|
1303
|
+
* The phaser's SIGNED resonance. ±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.
|
|
1235
1304
|
* @see data/kernels/phaser.json
|
|
1236
1305
|
*/
|
|
1237
1306
|
export declare const PHASER_FEEDBACK_RANGE: {
|
|
@@ -1244,7 +1313,7 @@ export declare const PHASER_FEEDBACK_RANGE: {
|
|
|
1244
1313
|
};
|
|
1245
1314
|
|
|
1246
1315
|
/**
|
|
1247
|
-
* The phaser's wet/dry, as an instance of DRIVE_MIX_RANGE: 50 %, where the notch is complete
|
|
1316
|
+
* The phaser's wet/dry, as an instance of DRIVE_MIX_RANGE: 50 %, where the notch is complete.
|
|
1248
1317
|
* @see data/kernels/phaser.json
|
|
1249
1318
|
*/
|
|
1250
1319
|
export declare const PHASER_MIX_RANGE: {
|
|
@@ -1257,7 +1326,7 @@ export declare const PHASER_MIX_RANGE: {
|
|
|
1257
1326
|
};
|
|
1258
1327
|
|
|
1259
1328
|
/**
|
|
1260
|
-
* The phaser's continuous travels by row field — the ONE map its control bounds and its row travels both read
|
|
1329
|
+
* The phaser's continuous travels by row field — the ONE map its control bounds and its row travels both read. `stages` is not here: it moves through PHASER_STAGE_COUNTS.
|
|
1261
1330
|
* @see data/kernels/phaser.json
|
|
1262
1331
|
*/
|
|
1263
1332
|
export declare const PHASER_TRAVELS: {
|
|
@@ -1323,17 +1392,26 @@ export declare const PITCH_LIMITS: {
|
|
|
1323
1392
|
readonly semitones: {
|
|
1324
1393
|
readonly min: -12;
|
|
1325
1394
|
readonly max: 12;
|
|
1395
|
+
readonly step: 1;
|
|
1396
|
+
readonly unit: "st";
|
|
1326
1397
|
readonly default: 0;
|
|
1398
|
+
readonly defaultFrom: "desk";
|
|
1327
1399
|
};
|
|
1328
1400
|
readonly cents: {
|
|
1329
1401
|
readonly min: -50;
|
|
1330
1402
|
readonly max: 50;
|
|
1403
|
+
readonly step: 1;
|
|
1404
|
+
readonly unit: "cents";
|
|
1331
1405
|
readonly default: 0;
|
|
1406
|
+
readonly defaultFrom: "desk";
|
|
1332
1407
|
};
|
|
1333
1408
|
readonly mix: {
|
|
1334
1409
|
readonly min: 0;
|
|
1335
1410
|
readonly max: 100;
|
|
1411
|
+
readonly step: 0.1;
|
|
1412
|
+
readonly unit: "%";
|
|
1336
1413
|
readonly default: 100;
|
|
1414
|
+
readonly defaultFrom: "desk";
|
|
1337
1415
|
};
|
|
1338
1416
|
};
|
|
1339
1417
|
|
|
@@ -1597,7 +1675,7 @@ export declare const ROTARY_BALANCE_RANGE: {
|
|
|
1597
1675
|
};
|
|
1598
1676
|
|
|
1599
1677
|
/**
|
|
1600
|
-
* 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
|
|
1678
|
+
* 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.
|
|
1601
1679
|
* @see data/kernels/rotary.json
|
|
1602
1680
|
*/
|
|
1603
1681
|
export declare const ROTARY_MIX_RANGE: {
|
|
@@ -1787,7 +1865,7 @@ export declare const SRC_ROLLOFF: 0.92;
|
|
|
1787
1865
|
export declare const SRC_MAX_L: 1024;
|
|
1788
1866
|
|
|
1789
1867
|
/**
|
|
1790
|
-
* The legal range of each transient-designer field (engineering units)
|
|
1868
|
+
* The legal range of each transient-designer field (engineering units). Every kind comes up flat: no per-kind default differs. the engine's limits generator emits each as `OMX_TRANSIENT_<FIELD>_{MIN,MAX,DEFAULT}` for `mix_transient.h`'s resolve; the row publishes them on OPTIONS when it lands.
|
|
1791
1869
|
* @see data/kernels/transient.json
|
|
1792
1870
|
*/
|
|
1793
1871
|
export declare const TRANSIENT_LIMITS: {
|
|
@@ -1834,25 +1912,25 @@ export declare const TRANSIENT_LIMITS: {
|
|
|
1834
1912
|
};
|
|
1835
1913
|
|
|
1836
1914
|
/**
|
|
1837
|
-
* The fast follower's attack, ms: exactly the dynamics detector's no-oversampling line
|
|
1915
|
+
* The fast follower's attack, ms: exactly the dynamics detector's no-oversampling line.
|
|
1838
1916
|
* @see data/kernels/transient.json
|
|
1839
1917
|
*/
|
|
1840
1918
|
export declare const TRANSIENT_FAST_ATTACK_MS: 0.5;
|
|
1841
1919
|
|
|
1842
1920
|
/**
|
|
1843
|
-
* The fast follower's release, ms: one 50 Hz cycle held, a 180 bpm sixteenth forgotten
|
|
1921
|
+
* The fast follower's release, ms: one 50 Hz cycle held, a 180 bpm sixteenth forgotten.
|
|
1844
1922
|
* @see data/kernels/transient.json
|
|
1845
1923
|
*/
|
|
1846
1924
|
export declare const TRANSIENT_FAST_RELEASE_MS: 20;
|
|
1847
1925
|
|
|
1848
1926
|
/**
|
|
1849
|
-
* The contrast, dB, at which a knob reaches its full value
|
|
1927
|
+
* The contrast, dB, at which a knob reaches its full value.
|
|
1850
1928
|
* @see data/kernels/transient.json
|
|
1851
1929
|
*/
|
|
1852
1930
|
export declare const TRANSIENT_REF_DB: 6;
|
|
1853
1931
|
|
|
1854
1932
|
/**
|
|
1855
|
-
* The detector floor, linear (−100 dBFS): below it both envelopes read the floor and the stage is unity
|
|
1933
|
+
* The detector floor, linear (−100 dBFS): below it both envelopes read the floor and the stage is unity.
|
|
1856
1934
|
* @see data/kernels/transient.json
|
|
1857
1935
|
*/
|
|
1858
1936
|
export declare const TRANSIENT_FLOOR_LIN: 0.00001;
|
|
@@ -1986,7 +2064,7 @@ export declare const XOVER_LIMITS: {
|
|
|
1986
2064
|
};
|
|
1987
2065
|
|
|
1988
2066
|
/**
|
|
1989
|
-
* The order the chorus and flanger construct their lines with (four taps
|
|
2067
|
+
* The order the chorus and flanger construct their lines with (four taps).
|
|
1990
2068
|
* @see data/primitives.json
|
|
1991
2069
|
*/
|
|
1992
2070
|
export declare const FDELAY_MOD_READ_ORDER: 3;
|