@openmixer/omx-contract 2.10.1 → 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 +14 -8
- 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 +136 -48
- package/dist/ts/omx-contract.js +141 -53
- package/include/omxcontract/clap_host_limits.h +66 -0
- package/include/omxcontract/omx_contract_limits.h +34 -4
- package/lib/data.mjs +5 -2
- package/lib/fmt.mjs +3 -2
- package/lib/semver.mjs +24 -7
- package/lib/validate.mjs +32 -1
- package/package.json +1 -1
- package/render/c/clap-host-limits.mjs +78 -0
- package/render/c.mjs +30 -6
- package/render/doors.mjs +1 -1
- package/render/ts.mjs +22 -4
- package/schema/omx-contract.schema.json +48 -6
- package/share/omx-contract/omx-contract.json +159 -54
package/dist/ts/omx-contract.js
CHANGED
|
@@ -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 const HOSTED_STAGE_LIMITS = {
|
|
10
|
+
"warmupBlocks": 64,
|
|
11
|
+
"warmupLevelDbfs": -6,
|
|
12
|
+
"nonFiniteStrikes": 3,
|
|
13
|
+
"clampDbfs": 24,
|
|
14
|
+
"paramQueueDepth": 256,
|
|
15
|
+
"eventsPerBlock": 64,
|
|
16
|
+
"unpublishPollUs": 100,
|
|
17
|
+
"unpublishTimeoutUs": 2000000,
|
|
18
|
+
"workerPollUs": 1000,
|
|
19
|
+
"workerRingBytes": 16384,
|
|
20
|
+
"notesPerBlock": 256,
|
|
21
|
+
"mainPortChannels": 2,
|
|
22
|
+
"auxOutputs": 8,
|
|
23
|
+
"auxInputs": 8,
|
|
24
|
+
"stateMaxBytes": 1048576,
|
|
25
|
+
"logBytes": 256,
|
|
26
|
+
"rolePollUs": 1000,
|
|
27
|
+
"roleTimeoutUs": 200000,
|
|
28
|
+
"paramCountMax": 2048,
|
|
29
|
+
"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 const HOSTING_CODES = {
|
|
37
|
+
"headlessFailed": {
|
|
38
|
+
"code": "hosting.clap.headless-failed"
|
|
39
|
+
},
|
|
40
|
+
"notAudioEffect": {
|
|
41
|
+
"code": "hosting.clap.not-audio-effect",
|
|
42
|
+
"doc": "the plugin is not an audio effect"
|
|
43
|
+
},
|
|
44
|
+
"noteInput": {
|
|
45
|
+
"code": "hosting.clap.note-input",
|
|
46
|
+
"doc": "the plugin declares a note input the configuration refuses"
|
|
47
|
+
},
|
|
48
|
+
"noAudioInput": {
|
|
49
|
+
"code": "hosting.topology.no-audio-input",
|
|
50
|
+
"doc": "the plugin has no audio input"
|
|
51
|
+
},
|
|
52
|
+
"noAudioOutput": {
|
|
53
|
+
"code": "hosting.topology.no-audio-output",
|
|
54
|
+
"doc": "the plugin has no audio output"
|
|
55
|
+
},
|
|
56
|
+
"widerThanStrip": {
|
|
57
|
+
"code": "hosting.topology.wider-than-strip",
|
|
58
|
+
"doc": "the plugin is wider than the strip"
|
|
59
|
+
},
|
|
60
|
+
"extraInputs": {
|
|
61
|
+
"code": "hosting.topology.extra-inputs-fed-silence",
|
|
62
|
+
"doc": "the plugin has extra inputs, fed silence"
|
|
63
|
+
},
|
|
64
|
+
"crashedLive": {
|
|
65
|
+
"code": "hosting.stability.crashed-live-on-this-rig",
|
|
66
|
+
"doc": "the plugin crashed live on this rig"
|
|
67
|
+
},
|
|
68
|
+
"outputNonFinite": {
|
|
69
|
+
"code": "hosting.output.non-finite",
|
|
70
|
+
"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
|
|
@@ -106,7 +175,7 @@ export const BAND_DYN_MAX_BANDS = 9;
|
|
|
106
175
|
export const DETECTOR_OVERSAMPLE_AUTO_MS = 0.5;
|
|
107
176
|
|
|
108
177
|
/**
|
|
109
|
-
* The chorus's right-leg phase offset, in TURNS of its one oscillator
|
|
178
|
+
* 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 ''.
|
|
110
179
|
* @see data/kernels/chorus.json
|
|
111
180
|
*/
|
|
112
181
|
export const CHORUS_SPREAD_RANGE = {
|
|
@@ -119,7 +188,7 @@ export const CHORUS_SPREAD_RANGE = {
|
|
|
119
188
|
};
|
|
120
189
|
|
|
121
190
|
/**
|
|
122
|
-
* The chorus sweep's speed
|
|
191
|
+
* The chorus sweep's speed. Above ~3 Hz it stops being a chorus and becomes a vibrato.
|
|
123
192
|
* @see data/kernels/chorus.json
|
|
124
193
|
*/
|
|
125
194
|
export const CHORUS_RATE_RANGE = {
|
|
@@ -132,7 +201,7 @@ export const CHORUS_RATE_RANGE = {
|
|
|
132
201
|
};
|
|
133
202
|
|
|
134
203
|
/**
|
|
135
|
-
* The chorus's peak-to-peak excursion above its declared 10 ms base
|
|
204
|
+
* The chorus's peak-to-peak excursion above its declared 10 ms base.
|
|
136
205
|
* @see data/kernels/chorus.json
|
|
137
206
|
*/
|
|
138
207
|
export const CHORUS_DEPTH_RANGE = {
|
|
@@ -145,7 +214,7 @@ export const CHORUS_DEPTH_RANGE = {
|
|
|
145
214
|
};
|
|
146
215
|
|
|
147
216
|
/**
|
|
148
|
-
* The chorus's tap count — one oscillator read at k/N
|
|
217
|
+
* The chorus's tap count — one oscillator read at k/N.
|
|
149
218
|
* @see data/kernels/chorus.json
|
|
150
219
|
*/
|
|
151
220
|
export const CHORUS_VOICES_RANGE = {
|
|
@@ -158,7 +227,7 @@ export const CHORUS_VOICES_RANGE = {
|
|
|
158
227
|
};
|
|
159
228
|
|
|
160
229
|
/**
|
|
161
|
-
* 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
|
|
230
|
+
* 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.
|
|
162
231
|
* @see data/kernels/chorus.json
|
|
163
232
|
*/
|
|
164
233
|
export const CHORUS_MIX_RANGE = {
|
|
@@ -265,7 +334,7 @@ export const DETECTOR_OVERSAMPLINGS = [
|
|
|
265
334
|
];
|
|
266
335
|
|
|
267
336
|
/**
|
|
268
|
-
* 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
|
|
337
|
+
* 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.
|
|
269
338
|
* @see data/kernels/comp.json
|
|
270
339
|
*/
|
|
271
340
|
export const DETECTOR_TOPOLOGY = [
|
|
@@ -274,7 +343,7 @@ export const DETECTOR_TOPOLOGY = [
|
|
|
274
343
|
];
|
|
275
344
|
|
|
276
345
|
/**
|
|
277
|
-
* The program-dependent release's model constants — the LA-2A's opto cell as DATA
|
|
346
|
+
* 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.
|
|
278
347
|
* @see data/kernels/comp.json
|
|
279
348
|
*/
|
|
280
349
|
export const PROGRAM_RELEASE = {
|
|
@@ -349,7 +418,7 @@ export const DEESS_RATIO_RANGE = {
|
|
|
349
418
|
};
|
|
350
419
|
|
|
351
420
|
/**
|
|
352
|
-
* 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
|
|
421
|
+
* 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.
|
|
353
422
|
* @see data/kernels/deesser.json
|
|
354
423
|
*/
|
|
355
424
|
export const DEESS_RANGE_RANGE = {
|
|
@@ -467,7 +536,7 @@ export const DELAY_PINGPONGS = [
|
|
|
467
536
|
];
|
|
468
537
|
|
|
469
538
|
/**
|
|
470
|
-
* 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
|
|
539
|
+
* 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.
|
|
471
540
|
* @see data/kernels/delay.json
|
|
472
541
|
*/
|
|
473
542
|
export const FX_DELAY_PINGPONG_DEFAULT = false;
|
|
@@ -560,7 +629,7 @@ export const DRIVE_BANDS = [
|
|
|
560
629
|
];
|
|
561
630
|
|
|
562
631
|
/**
|
|
563
|
-
* 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
|
|
632
|
+
* 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.
|
|
564
633
|
* @see data/kernels/drive.json
|
|
565
634
|
*/
|
|
566
635
|
export const DRIVE_AUTO_GAINS = [
|
|
@@ -569,7 +638,7 @@ export const DRIVE_AUTO_GAINS = [
|
|
|
569
638
|
];
|
|
570
639
|
|
|
571
640
|
/**
|
|
572
|
-
* 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
|
|
641
|
+
* 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.
|
|
573
642
|
* @see data/kernels/drive.json
|
|
574
643
|
*/
|
|
575
644
|
export const DRIVE_STEREO_LINKS = [
|
|
@@ -578,13 +647,13 @@ export const DRIVE_STEREO_LINKS = [
|
|
|
578
647
|
];
|
|
579
648
|
|
|
580
649
|
/**
|
|
581
|
-
* The drive's post-curve HIGH-FREQUENCY ROLL-OFF
|
|
650
|
+
* The drive's post-curve HIGH-FREQUENCY ROLL-OFF: `off` (the section does not run: `omx_drive.h`'s `struct omx_drive.hf_on` is 0), `12000` or `16000`, each carrying its corner in Hz as its value and `off` none (operator ruling, 2026-10-13: the choice is an enumeration and the frequency is data of each member, so no 0 Hz doubles as a sentinel). The ids are the console's drive-row wire vocabulary (`DriveState.hfRolloff`, what the drive row's OPTIONS publishes and a session stores), so the console re-exports this set; a kernel reads the corner from the id's value. It comes up off, as omx-dsp's drive face does.
|
|
582
651
|
* @see data/kernels/drive.json
|
|
583
652
|
*/
|
|
584
653
|
export const DRIVE_HF_ROLLOFFS = [
|
|
585
|
-
|
|
586
|
-
12000,
|
|
587
|
-
16000
|
|
654
|
+
"off",
|
|
655
|
+
"12000",
|
|
656
|
+
"16000"
|
|
588
657
|
];
|
|
589
658
|
|
|
590
659
|
/**
|
|
@@ -598,7 +667,7 @@ export const DRIVE_OVERSAMPLES = [
|
|
|
598
667
|
];
|
|
599
668
|
|
|
600
669
|
/**
|
|
601
|
-
* The bias at `character = +1`, in the SHAPER's own input units — `OMX_DRIVE_BIAS_MAX`. DERIVED, not chosen
|
|
670
|
+
* 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.
|
|
602
671
|
* @see data/kernels/drive.json
|
|
603
672
|
*/
|
|
604
673
|
export const DRIVE_BIAS_MAX = 0.7071067811865476;
|
|
@@ -763,7 +832,7 @@ export const ISO_THIRD_OCTAVE_CENTRES_HZ = [
|
|
|
763
832
|
];
|
|
764
833
|
|
|
765
834
|
/**
|
|
766
|
-
* 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 (
|
|
835
|
+
* 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).
|
|
767
836
|
* @see data/kernels/eq.json
|
|
768
837
|
*/
|
|
769
838
|
export const GEQ_BANDS = 31;
|
|
@@ -965,7 +1034,7 @@ export const GROWTH_WINDOW_FRAMES = 5;
|
|
|
965
1034
|
export const DEEP_PLATEAU_FRAMES = 20;
|
|
966
1035
|
|
|
967
1036
|
/**
|
|
968
|
-
* 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.
|
|
1037
|
+
* 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.
|
|
969
1038
|
* @see data/kernels/fbs.json
|
|
970
1039
|
*/
|
|
971
1040
|
export const GROWTH_MIN_DB_PER_FRAME = 0.8;
|
|
@@ -977,19 +1046,19 @@ export const GROWTH_MIN_DB_PER_FRAME = 0.8;
|
|
|
977
1046
|
export const GROWTH_MAX_DIP_DB = 0.5;
|
|
978
1047
|
|
|
979
1048
|
/**
|
|
980
|
-
* Minimum END-TO-END rise (dB) across the window. The live-music corpus
|
|
1049
|
+
* 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.
|
|
981
1050
|
* @see data/kernels/fbs.json
|
|
982
1051
|
*/
|
|
983
1052
|
export const GROWTH_MIN_TOTAL_RISE_DB = 6;
|
|
984
1053
|
|
|
985
1054
|
/**
|
|
986
|
-
* 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
|
|
1055
|
+
* 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.
|
|
987
1056
|
* @see data/kernels/fbs.json
|
|
988
1057
|
*/
|
|
989
1058
|
export const GROWTH_MAX_SINGLE_FRAME_SHARE = 0.5;
|
|
990
1059
|
|
|
991
1060
|
/**
|
|
992
|
-
* 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
|
|
1061
|
+
* 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.
|
|
993
1062
|
* @see data/kernels/fbs.json
|
|
994
1063
|
*/
|
|
995
1064
|
export const GROWTH_CONFIRM_FRAMES = 2;
|
|
@@ -1013,7 +1082,7 @@ export const DEFAULT_THRESHOLDS = {
|
|
|
1013
1082
|
};
|
|
1014
1083
|
|
|
1015
1084
|
/**
|
|
1016
|
-
* 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
|
|
1085
|
+
* 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.
|
|
1017
1086
|
* @see data/kernels/fbs.json
|
|
1018
1087
|
*/
|
|
1019
1088
|
export const FBS_MAX_NOTCH_DEPTH_DB = 18;
|
|
@@ -1031,7 +1100,7 @@ export const FBS_DEFAULT_NOTCH_Q = 116;
|
|
|
1031
1100
|
export const FBS_DEFAULT_MAX_AUTO_BANDS = 6;
|
|
1032
1101
|
|
|
1033
1102
|
/**
|
|
1034
|
-
* The flanger's jet sweep
|
|
1103
|
+
* The flanger's jet sweep.
|
|
1035
1104
|
* @see data/kernels/flanger.json
|
|
1036
1105
|
*/
|
|
1037
1106
|
export const FLANGER_RATE_RANGE = {
|
|
@@ -1044,7 +1113,7 @@ export const FLANGER_RATE_RANGE = {
|
|
|
1044
1113
|
};
|
|
1045
1114
|
|
|
1046
1115
|
/**
|
|
1047
|
-
* The flanger's peak-to-peak excursion above its declared 0.5 ms base
|
|
1116
|
+
* The flanger's peak-to-peak excursion above its declared 0.5 ms base.
|
|
1048
1117
|
* @see data/kernels/flanger.json
|
|
1049
1118
|
*/
|
|
1050
1119
|
export const FLANGER_DEPTH_RANGE = {
|
|
@@ -1057,7 +1126,7 @@ export const FLANGER_DEPTH_RANGE = {
|
|
|
1057
1126
|
};
|
|
1058
1127
|
|
|
1059
1128
|
/**
|
|
1060
|
-
* The flanger's SIGNED resonance
|
|
1129
|
+
* 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.
|
|
1061
1130
|
* @see data/kernels/flanger.json
|
|
1062
1131
|
*/
|
|
1063
1132
|
export const FLANGER_FEEDBACK_RANGE = {
|
|
@@ -1070,7 +1139,7 @@ export const FLANGER_FEEDBACK_RANGE = {
|
|
|
1070
1139
|
};
|
|
1071
1140
|
|
|
1072
1141
|
/**
|
|
1073
|
-
* The flanger's wet/dry, as an instance of DRIVE_MIX_RANGE: 50 %, equal dry and wet, where the comb is deepest
|
|
1142
|
+
* The flanger's wet/dry, as an instance of DRIVE_MIX_RANGE: 50 %, equal dry and wet, where the comb is deepest.
|
|
1074
1143
|
* @see data/kernels/flanger.json
|
|
1075
1144
|
*/
|
|
1076
1145
|
export const FLANGER_MIX_RANGE = {
|
|
@@ -1223,7 +1292,7 @@ export const WAVEFORMS = [
|
|
|
1223
1292
|
];
|
|
1224
1293
|
|
|
1225
1294
|
/**
|
|
1226
|
-
* 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
|
|
1295
|
+
* 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.
|
|
1227
1296
|
* @see data/kernels/geq.json
|
|
1228
1297
|
*/
|
|
1229
1298
|
export const GEQ_BAND_RANGE = {
|
|
@@ -1236,19 +1305,19 @@ export const GEQ_BAND_RANGE = {
|
|
|
1236
1305
|
};
|
|
1237
1306
|
|
|
1238
1307
|
/**
|
|
1239
|
-
* 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
|
|
1308
|
+
* 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.
|
|
1240
1309
|
* @see data/kernels/geq.json
|
|
1241
1310
|
*/
|
|
1242
1311
|
export const GEQ_BAND_Q = 4.3;
|
|
1243
1312
|
|
|
1244
1313
|
/**
|
|
1245
|
-
* The prototype gain the `true` solve's first interaction matrix is evaluated at
|
|
1314
|
+
* 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.
|
|
1246
1315
|
* @see data/kernels/geq.json
|
|
1247
1316
|
*/
|
|
1248
1317
|
export const GEQ_PROTO_DB = 12;
|
|
1249
1318
|
|
|
1250
1319
|
/**
|
|
1251
|
-
* The ceiling on a section gain the `true` solve may ask for
|
|
1320
|
+
* 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.
|
|
1252
1321
|
* @see data/kernels/geq.json
|
|
1253
1322
|
*/
|
|
1254
1323
|
export const GEQ_DESIGN_GAIN_MAX_DB = 30;
|
|
@@ -1285,31 +1354,31 @@ export const HRP_MAX_VOICES = 8;
|
|
|
1285
1354
|
export const HRP_BAND_Q = 5;
|
|
1286
1355
|
|
|
1287
1356
|
/**
|
|
1288
|
-
* How far a partial must stand above its LEARNED BASELINE before HRP calls it a resonance (increment 8
|
|
1357
|
+
* 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.)
|
|
1289
1358
|
* @see data/kernels/hrp.json
|
|
1290
1359
|
*/
|
|
1291
1360
|
export const HRP_EXCESS_THRESHOLD_DB = 3;
|
|
1292
1361
|
|
|
1293
1362
|
/**
|
|
1294
|
-
* How far ONE reconcile pass may move an HRP band's gain, in dB —
|
|
1363
|
+
* 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.
|
|
1295
1364
|
* @see data/kernels/hrp.json
|
|
1296
1365
|
*/
|
|
1297
1366
|
export const HRP_GAIN_STEP_DB = 2;
|
|
1298
1367
|
|
|
1299
1368
|
/**
|
|
1300
|
-
* How close two correction candidates must sit, in cents, to count as the SAME spectral region
|
|
1369
|
+
* 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.
|
|
1301
1370
|
* @see data/kernels/hrp.json
|
|
1302
1371
|
*/
|
|
1303
1372
|
export const HRP_COLLISION_CENTS = 100;
|
|
1304
1373
|
|
|
1305
1374
|
/**
|
|
1306
|
-
* The ATTRIBUTION window
|
|
1375
|
+
* 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.
|
|
1307
1376
|
* @see data/kernels/hrp.json
|
|
1308
1377
|
*/
|
|
1309
1378
|
export const HRP_ATTRIBUTION_CENTS = 60;
|
|
1310
1379
|
|
|
1311
1380
|
/**
|
|
1312
|
-
* 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
|
|
1381
|
+
* 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.
|
|
1313
1382
|
* @see data/kernels/hrp.json
|
|
1314
1383
|
*/
|
|
1315
1384
|
export const HRP_DEFAULT_MAX_AUTO_BANDS = 8;
|
|
@@ -1346,13 +1415,13 @@ export const LIMITER_LIMITS = {
|
|
|
1346
1415
|
};
|
|
1347
1416
|
|
|
1348
1417
|
/**
|
|
1349
|
-
* The input cap a summing bus can be sized to — **the engine's declared input ceiling**, read from
|
|
1418
|
+
* 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.
|
|
1350
1419
|
* @see data/kernels/mixmatrix.json
|
|
1351
1420
|
*/
|
|
1352
1421
|
export const BUS_INPUT_CAP = 128;
|
|
1353
1422
|
|
|
1354
1423
|
/**
|
|
1355
|
-
* The phaser's sweep speed
|
|
1424
|
+
* The phaser's sweep speed. `omx_lfo_inc` freezes at Nyquist; this travel stays far below.
|
|
1356
1425
|
* @see data/kernels/phaser.json
|
|
1357
1426
|
*/
|
|
1358
1427
|
export const PHASER_RATE_RANGE = {
|
|
@@ -1365,7 +1434,7 @@ export const PHASER_RATE_RANGE = {
|
|
|
1365
1434
|
};
|
|
1366
1435
|
|
|
1367
1436
|
/**
|
|
1368
|
-
* The phaser's lowest centre frequency; the sweep runs upward from it
|
|
1437
|
+
* The phaser's lowest centre frequency; the sweep runs upward from it.
|
|
1369
1438
|
* @see data/kernels/phaser.json
|
|
1370
1439
|
*/
|
|
1371
1440
|
export const PHASER_BASE_RANGE = {
|
|
@@ -1378,7 +1447,7 @@ export const PHASER_BASE_RANGE = {
|
|
|
1378
1447
|
};
|
|
1379
1448
|
|
|
1380
1449
|
/**
|
|
1381
|
-
* The sweep's span above `base`, in octaves; 0 is a static phaser at `base
|
|
1450
|
+
* The sweep's span above `base`, in octaves; 0 is a static phaser at `base`.
|
|
1382
1451
|
* @see data/kernels/phaser.json
|
|
1383
1452
|
*/
|
|
1384
1453
|
export const PHASER_DEPTH_RANGE = {
|
|
@@ -1391,7 +1460,7 @@ export const PHASER_DEPTH_RANGE = {
|
|
|
1391
1460
|
};
|
|
1392
1461
|
|
|
1393
1462
|
/**
|
|
1394
|
-
* The phaser's section count per leg — EVEN, 2 … 12 (
|
|
1463
|
+
* 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.
|
|
1395
1464
|
* @see data/kernels/phaser.json
|
|
1396
1465
|
*/
|
|
1397
1466
|
export const PHASER_STAGES_RANGE = {
|
|
@@ -1404,7 +1473,7 @@ export const PHASER_STAGES_RANGE = {
|
|
|
1404
1473
|
};
|
|
1405
1474
|
|
|
1406
1475
|
/**
|
|
1407
|
-
* The phaser's SIGNED resonance
|
|
1476
|
+
* 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.
|
|
1408
1477
|
* @see data/kernels/phaser.json
|
|
1409
1478
|
*/
|
|
1410
1479
|
export const PHASER_FEEDBACK_RANGE = {
|
|
@@ -1417,7 +1486,7 @@ export const PHASER_FEEDBACK_RANGE = {
|
|
|
1417
1486
|
};
|
|
1418
1487
|
|
|
1419
1488
|
/**
|
|
1420
|
-
* The phaser's wet/dry, as an instance of DRIVE_MIX_RANGE: 50 %, where the notch is complete
|
|
1489
|
+
* The phaser's wet/dry, as an instance of DRIVE_MIX_RANGE: 50 %, where the notch is complete.
|
|
1421
1490
|
* @see data/kernels/phaser.json
|
|
1422
1491
|
*/
|
|
1423
1492
|
export const PHASER_MIX_RANGE = {
|
|
@@ -1430,7 +1499,7 @@ export const PHASER_MIX_RANGE = {
|
|
|
1430
1499
|
};
|
|
1431
1500
|
|
|
1432
1501
|
/**
|
|
1433
|
-
* The phaser's continuous travels by row field — the ONE map its control bounds and its row travels both read
|
|
1502
|
+
* 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.
|
|
1434
1503
|
* @see data/kernels/phaser.json
|
|
1435
1504
|
*/
|
|
1436
1505
|
export const PHASER_TRAVELS = {
|
|
@@ -1503,17 +1572,26 @@ export const PITCH_LIMITS = {
|
|
|
1503
1572
|
"semitones": {
|
|
1504
1573
|
"min": -12,
|
|
1505
1574
|
"max": 12,
|
|
1506
|
-
"
|
|
1575
|
+
"step": 1,
|
|
1576
|
+
"unit": "st",
|
|
1577
|
+
"default": 0,
|
|
1578
|
+
"defaultFrom": "desk"
|
|
1507
1579
|
},
|
|
1508
1580
|
"cents": {
|
|
1509
1581
|
"min": -50,
|
|
1510
1582
|
"max": 50,
|
|
1511
|
-
"
|
|
1583
|
+
"step": 1,
|
|
1584
|
+
"unit": "cents",
|
|
1585
|
+
"default": 0,
|
|
1586
|
+
"defaultFrom": "desk"
|
|
1512
1587
|
},
|
|
1513
1588
|
"mix": {
|
|
1514
1589
|
"min": 0,
|
|
1515
1590
|
"max": 100,
|
|
1516
|
-
"
|
|
1591
|
+
"step": 0.1,
|
|
1592
|
+
"unit": "%",
|
|
1593
|
+
"default": 100,
|
|
1594
|
+
"defaultFrom": "desk"
|
|
1517
1595
|
}
|
|
1518
1596
|
};
|
|
1519
1597
|
|
|
@@ -1783,7 +1861,7 @@ export const ROTARY_BALANCE_RANGE = {
|
|
|
1783
1861
|
};
|
|
1784
1862
|
|
|
1785
1863
|
/**
|
|
1786
|
-
* 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
|
|
1864
|
+
* 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.
|
|
1787
1865
|
* @see data/kernels/rotary.json
|
|
1788
1866
|
*/
|
|
1789
1867
|
export const ROTARY_MIX_RANGE = {
|
|
@@ -1977,7 +2055,7 @@ export const SRC_ROLLOFF = 0.92;
|
|
|
1977
2055
|
export const SRC_MAX_L = 1024;
|
|
1978
2056
|
|
|
1979
2057
|
/**
|
|
1980
|
-
* The legal range of each transient-designer field (engineering units)
|
|
2058
|
+
* 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.
|
|
1981
2059
|
* @see data/kernels/transient.json
|
|
1982
2060
|
*/
|
|
1983
2061
|
export const TRANSIENT_LIMITS = {
|
|
@@ -2024,25 +2102,25 @@ export const TRANSIENT_LIMITS = {
|
|
|
2024
2102
|
};
|
|
2025
2103
|
|
|
2026
2104
|
/**
|
|
2027
|
-
* The fast follower's attack, ms: exactly the dynamics detector's no-oversampling line
|
|
2105
|
+
* The fast follower's attack, ms: exactly the dynamics detector's no-oversampling line.
|
|
2028
2106
|
* @see data/kernels/transient.json
|
|
2029
2107
|
*/
|
|
2030
2108
|
export const TRANSIENT_FAST_ATTACK_MS = 0.5;
|
|
2031
2109
|
|
|
2032
2110
|
/**
|
|
2033
|
-
* The fast follower's release, ms: one 50 Hz cycle held, a 180 bpm sixteenth forgotten
|
|
2111
|
+
* The fast follower's release, ms: one 50 Hz cycle held, a 180 bpm sixteenth forgotten.
|
|
2034
2112
|
* @see data/kernels/transient.json
|
|
2035
2113
|
*/
|
|
2036
2114
|
export const TRANSIENT_FAST_RELEASE_MS = 20;
|
|
2037
2115
|
|
|
2038
2116
|
/**
|
|
2039
|
-
* The contrast, dB, at which a knob reaches its full value
|
|
2117
|
+
* The contrast, dB, at which a knob reaches its full value.
|
|
2040
2118
|
* @see data/kernels/transient.json
|
|
2041
2119
|
*/
|
|
2042
2120
|
export const TRANSIENT_REF_DB = 6;
|
|
2043
2121
|
|
|
2044
2122
|
/**
|
|
2045
|
-
* The detector floor, linear (−100 dBFS): below it both envelopes read the floor and the stage is unity
|
|
2123
|
+
* The detector floor, linear (−100 dBFS): below it both envelopes read the floor and the stage is unity.
|
|
2046
2124
|
* @see data/kernels/transient.json
|
|
2047
2125
|
*/
|
|
2048
2126
|
export const TRANSIENT_FLOOR_LIN = 0.00001;
|
|
@@ -2179,7 +2257,7 @@ export const XOVER_LIMITS = {
|
|
|
2179
2257
|
};
|
|
2180
2258
|
|
|
2181
2259
|
/**
|
|
2182
|
-
* The order the chorus and flanger construct their lines with (four taps
|
|
2260
|
+
* The order the chorus and flanger construct their lines with (four taps).
|
|
2183
2261
|
* @see data/primitives.json
|
|
2184
2262
|
*/
|
|
2185
2263
|
export const FDELAY_MOD_READ_ORDER = 3;
|
|
@@ -2351,6 +2429,16 @@ export const RME_RATES = [
|
|
|
2351
2429
|
192000
|
|
2352
2430
|
];
|
|
2353
2431
|
|
|
2432
|
+
/**
|
|
2433
|
+
* The value each id of DRIVE_HF_ROLLOFFS carries, in "Hz"; null for an id that carries none.
|
|
2434
|
+
* @see data/kernels/drive.json
|
|
2435
|
+
*/
|
|
2436
|
+
export const DRIVE_HF_ROLLOFFS_VALUES = {
|
|
2437
|
+
"12000": 12000,
|
|
2438
|
+
"16000": 16000,
|
|
2439
|
+
"off": null
|
|
2440
|
+
};
|
|
2441
|
+
|
|
2354
2442
|
/**
|
|
2355
2443
|
* Every kernel's readouts, the meters a host draws, each kernel's in its declared order: the position is the
|
|
2356
2444
|
* readout's id. Every reference is resolved.
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/* SPDX-License-Identifier: GPL-3.0-or-later */
|
|
2
|
+
/*
|
|
3
|
+
* This file is part of omx-clap-host.
|
|
4
|
+
*
|
|
5
|
+
* omx-clap-host is free software: you can redistribute it and/or modify
|
|
6
|
+
* it under the terms of the GNU General Public License as published by
|
|
7
|
+
* the Free Software Foundation, either version 3 of the License, or
|
|
8
|
+
* (at your option) any later version.
|
|
9
|
+
*
|
|
10
|
+
* omx-clap-host is distributed in the hope that it will be useful,
|
|
11
|
+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
12
|
+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
13
|
+
* GNU General Public License for more details.
|
|
14
|
+
*
|
|
15
|
+
* You should have received a copy of the GNU General Public License
|
|
16
|
+
* along with omx-clap-host. If not, see <http://www.gnu.org/licenses/>.
|
|
17
|
+
*
|
|
18
|
+
* Copyright (C) 2026 Pau Aliagas <linuxnow@gmail.com>
|
|
19
|
+
*/
|
|
20
|
+
|
|
21
|
+
#ifndef CLAP_HOST_LIMITS_H
|
|
22
|
+
#define CLAP_HOST_LIMITS_H
|
|
23
|
+
/*
|
|
24
|
+
* GENERATED — DO NOT EDIT BY HAND.
|
|
25
|
+
* Rendered by `omx-contract render --target c` from FreeMixer/omx-contract's HOSTED_STAGE_LIMITS and
|
|
26
|
+
* HOSTING_CODES. The rendered file is kept in this repository so the library builds on its own; the numbers
|
|
27
|
+
* and codes are changed where they are declared and the file is re-rendered, never edited here.
|
|
28
|
+
*/
|
|
29
|
+
|
|
30
|
+
/** @file
|
|
31
|
+
* @brief The limits and refusal codes of the hosting code. */
|
|
32
|
+
|
|
33
|
+
#include <stddef.h>
|
|
34
|
+
|
|
35
|
+
/** the stage and the host: every number the core reads */
|
|
36
|
+
#define CLAP_HOST_WARMUP_BLOCKS 64u
|
|
37
|
+
#define CLAP_HOST_WARMUP_LEVEL_DBFS -6.0f ///< the level of the warm-up signal, in dBFS
|
|
38
|
+
#define CLAP_HOST_NON_FINITE_STRIKES 3u ///< the blocks of non-finite output that strike a stage
|
|
39
|
+
#define CLAP_HOST_CLAMP_DBFS 24.0f ///< the level the output is clamped at, in dBFS
|
|
40
|
+
#define CLAP_HOST_PARAM_QUEUE_DEPTH 256u ///< the records the parameter queue holds
|
|
41
|
+
#define CLAP_HOST_EVENTS_PER_BLOCK 64u ///< the parameter events delivered in one block
|
|
42
|
+
#define CLAP_HOST_UNPUBLISH_POLL_US 100u ///< the poll interval while an unpublish waits for the audio thread, in microseconds
|
|
43
|
+
#define CLAP_HOST_UNPUBLISH_TIMEOUT_US 2000000u ///< the longest an unpublish waits for the audio thread, in microseconds
|
|
44
|
+
#define CLAP_HOST_NOTES_PER_BLOCK 256u ///< the note events delivered in one block
|
|
45
|
+
#define CLAP_HOST_MAIN_PORT_CHANNELS 2u ///< the channels the main port is limited to
|
|
46
|
+
#define CLAP_HOST_AUX_OUTPUTS 8u ///< the auxiliary output ports the core accepts
|
|
47
|
+
#define CLAP_HOST_AUX_INPUTS 8u ///< the auxiliary input ports (side chains) the core accepts
|
|
48
|
+
#define CLAP_HOST_STATE_MAX_BYTES 1048576u ///< the largest plugin state the core saves or loads, in bytes
|
|
49
|
+
#define CLAP_HOST_LOG_BYTES 256u ///< the size of a plugin log message, in bytes
|
|
50
|
+
#define CLAP_HOST_ROLE_POLL_US 1000u ///< the poll interval while the audio role is taken, in microseconds
|
|
51
|
+
#define CLAP_HOST_ROLE_TIMEOUT_US 200000u ///< the longest the audio role is waited for, in microseconds
|
|
52
|
+
#define CLAP_HOST_PARAM_COUNT_MAX 2048u ///< the widest parameter count the core trusts
|
|
53
|
+
#define CLAP_HOST_LATENCY_HOLD_MS 250u ///< the hold before a hosted stage's new latency takes effect, in milliseconds
|
|
54
|
+
|
|
55
|
+
/** the refusals the core returns, as the hosting codes the console's verdicts use */
|
|
56
|
+
#define CLAP_HOST_CODE_HEADLESS_FAILED "hosting.clap.headless-failed"
|
|
57
|
+
#define CLAP_HOST_CODE_NOT_AUDIO_EFFECT "hosting.clap.not-audio-effect" ///< the plugin is not an audio effect
|
|
58
|
+
#define CLAP_HOST_CODE_NOTE_INPUT "hosting.clap.note-input" ///< the plugin declares a note input the configuration refuses
|
|
59
|
+
#define CLAP_HOST_CODE_NO_AUDIO_INPUT "hosting.topology.no-audio-input" ///< the plugin has no audio input
|
|
60
|
+
#define CLAP_HOST_CODE_NO_AUDIO_OUTPUT "hosting.topology.no-audio-output" ///< the plugin has no audio output
|
|
61
|
+
#define CLAP_HOST_CODE_WIDER_THAN_STRIP "hosting.topology.wider-than-strip" ///< the plugin is wider than the strip
|
|
62
|
+
#define CLAP_HOST_CODE_EXTRA_INPUTS "hosting.topology.extra-inputs-fed-silence" ///< the plugin has extra inputs, fed silence
|
|
63
|
+
#define CLAP_HOST_CODE_CRASHED_LIVE "hosting.stability.crashed-live-on-this-rig" ///< the plugin crashed live on this rig
|
|
64
|
+
#define CLAP_HOST_CODE_OUTPUT_NON_FINITE "hosting.output.non-finite" ///< the plugin produced non-finite output
|
|
65
|
+
|
|
66
|
+
#endif /* CLAP_HOST_LIMITS_H */
|