@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.
@@ -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 (§2, §3a; the native-FX catalogue's M32 Dimension row). The right leg's voice k reads the LFO at k/N + spread: 0 is both legs one phase (the stage without the field, bit for bit), 0.25 quadrature, 0.5 the Dimension's opposed sweep. A fraction of a cycle carries no engineering symbol, so the unit is ''.
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 (§3a). Above ~3 Hz it stops being a chorus and becomes a vibrato.
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 (§3a).
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 (§3a).
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 (§3a). The REVERB_LOWCUT_RANGE-over- REVERB_CUT_RANGE shape: one travel, one declared default per field that reads it.
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`, the SSL bus compressor design §3a) and comes up `feedforward`, so a zeroed atom is the compressor every slot runs.
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 (compressor models design §3b). `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.
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, §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.
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, DPF plugin design §3a) reads the same fact the desk seeds a fresh strip with.
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`, drive-stage spec §4d), 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.
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`, spec §4e). A field of the console's drive row (`DriveState.stereoLink`), on at come-up there and in omx-dsp's drive face.
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 = [
@@ -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 (§4b). In the saturating limit every knee tends to `sgn`, the output is a rectangular wave of duty `d = ½ + asin(b)/π`, and its `n`th harmonic goes as `sin(nπd)/n` — so `|H2|` is maximal at `d = ¾`, which is `b = sin(π/4) = 1/√2` exactly. Measured too: the H2-maximising bias for a full-scale sine at unity drive is 0.712 (soft), 0.658 (tape), 0.645 (tube), and this one value costs 0.000 / 0.035 / 0.088 dB of H2 against each curve's own optimum. ONE normalised bias for all three knees, not three.
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 (graphic-eq-31 spec §3, roster ruling 3).
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. Issue #91's 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.
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 (issue #106) 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.
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 issue #106's 72 live false positives). 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.
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 (issue #106): 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.
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 §4 — "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.
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 (§3b).
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 (§3b).
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 (§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.
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 (§3b).
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 (graphic-eq-31 spec §3).
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 (graphic-eq-31 spec §3).
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 (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.
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 (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.
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, §23–§24: `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.)
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 — §48's gain smoothing, done at the control level because the native cascade applies pushed coefficients verbatim and §48 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.
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 (§30): 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 spec orders the threshold configurable and tested (§30's last line): declared once here, a parameter everywhere below.
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 (§11): 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 (§30's 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.
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 (§9.3(b)) 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 (spec §29) 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.
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 `@freemixer/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 §9 carries the ruling and the measured cost of width.
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 (§3). `omx_lfo_inc` freezes at Nyquist; this travel stays far below.
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 (§3).
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` (§3).
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 (§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.
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 (§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.
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 (§3).
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 (§3). `stages` is not here: it moves through PHASER_STAGE_COUNTS.
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
- "default": 0
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
- "default": 0
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
- "default": 100
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 (§3).
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), transient spec §3. 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 (issue #921).
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 (transient spec §3, L7).
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 (transient spec §3).
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 (transient spec §2, §3).
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 (transient spec §3).
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; the fdelay spec §1).
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;
@@ -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 */
@@ -387,6 +387,26 @@
387
387
  #define OMX_GROWTH_MIN_DB_PER_FRAME_DOUBLE 0.8
388
388
  #define OMX_GROWTH_MIN_TOTAL_RISE_DB 6
389
389
  #define OMX_GROWTH_WINDOW_FRAMES 5
390
+ #define OMX_HOSTED_STAGE_AUX_INPUTS 8
391
+ #define OMX_HOSTED_STAGE_AUX_OUTPUTS 8
392
+ #define OMX_HOSTED_STAGE_CLAMP_DBFS 24
393
+ #define OMX_HOSTED_STAGE_EVENTS_PER_BLOCK 64
394
+ #define OMX_HOSTED_STAGE_LATENCY_HOLD_MS 250
395
+ #define OMX_HOSTED_STAGE_LOG_BYTES 256
396
+ #define OMX_HOSTED_STAGE_MAIN_PORT_CHANNELS 2
397
+ #define OMX_HOSTED_STAGE_NON_FINITE_STRIKES 3
398
+ #define OMX_HOSTED_STAGE_NOTES_PER_BLOCK 256
399
+ #define OMX_HOSTED_STAGE_PARAM_COUNT_MAX 2048
400
+ #define OMX_HOSTED_STAGE_PARAM_QUEUE_DEPTH 256
401
+ #define OMX_HOSTED_STAGE_ROLE_POLL_US 1000
402
+ #define OMX_HOSTED_STAGE_ROLE_TIMEOUT_US 200000
403
+ #define OMX_HOSTED_STAGE_STATE_MAX_BYTES 1048576
404
+ #define OMX_HOSTED_STAGE_UNPUBLISH_POLL_US 100
405
+ #define OMX_HOSTED_STAGE_UNPUBLISH_TIMEOUT_US 2000000
406
+ #define OMX_HOSTED_STAGE_WARMUP_BLOCKS 64
407
+ #define OMX_HOSTED_STAGE_WARMUP_LEVEL_DBFS -6
408
+ #define OMX_HOSTED_STAGE_WORKER_POLL_US 1000
409
+ #define OMX_HOSTED_STAGE_WORKER_RING_BYTES 16384
390
410
  #define OMX_HPF_FREQ_RANGE_MAX 1000
391
411
  #define OMX_HPF_FREQ_RANGE_MIN 20
392
412
  #define OMX_HPF_FREQ_RANGE_STEP 10
package/lib/data.mjs CHANGED
@@ -203,11 +203,12 @@ export function rawValue(item) {
203
203
  case 'sheet': return item.value;
204
204
  case 'list': return item.values;
205
205
  case 'set': return item.ids;
206
+ case 'codes': return item.codes;
206
207
  default: return undefined;
207
208
  }
208
209
  }
209
210
 
210
- /** The closed list of derivations (spec §3.3). A new one is a change here with its own test. */
211
+ /** The closed list of derivations. A new one is a change here with its own test. */
211
212
  export const DERIVATIONS = {
212
213
  count: (d, val) => {
213
214
  const v = val(typeof d.of === 'string' ? { ref: d.of } : d.of);
@@ -302,6 +303,7 @@ export function resolveData(data) {
302
303
  if (item.why !== undefined) r.why = item.why;
303
304
  if (item.unit !== undefined) r.unit = item.unit;
304
305
  if (item.c !== undefined) r.c = item.c;
306
+ if (item.docs !== undefined) r.docs = item.docs;
305
307
  if (item.kind === 'set') {
306
308
  if (item.default !== undefined) r.default = setDefault(item, (v) => val(v, name), name);
307
309
  if (item.labels !== undefined) r.labels = item.labels;