@openmixer/omx-contract 0.0.0 → 1.0.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.
@@ -0,0 +1,597 @@
1
+ {
2
+ "name": "@openmixer/omx-contract",
3
+ "version": "1.0.0",
4
+ "items": {
5
+ "CHORUS_SPREAD_RANGE": {
6
+ "rel": "data/kernels/chorus.json",
7
+ "kind": "travels",
8
+ "doc": "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 ''.",
9
+ "shape": "travel",
10
+ "value": {
11
+ "min": 0,
12
+ "max": 0.5,
13
+ "step": 0.01,
14
+ "unit": "",
15
+ "default": 0,
16
+ "defaultFrom": "desk"
17
+ }
18
+ },
19
+ "COMP_LIMITS": {
20
+ "rel": "data/kernels/comp.json",
21
+ "kind": "travels",
22
+ "doc": "The legal range of each compressor field (engineering units). The widget clamps drags to these, `normalizeComp` enforces them, the row's codec refuses by them and the travel sheet publishes them. `default`/`defaultFrom` are the come-up values `defaultCompState` seeds a fresh strip with, read BACK from here rather than restated there.",
23
+ "shape": "table",
24
+ "value": {
25
+ "thresholdDb": {
26
+ "min": -60,
27
+ "max": 0,
28
+ "step": 1,
29
+ "unit": "dB",
30
+ "default": -18,
31
+ "defaultFrom": "desk"
32
+ },
33
+ "ratio": {
34
+ "min": 1,
35
+ "max": 20,
36
+ "step": 0.5,
37
+ "unit": "",
38
+ "default": 4,
39
+ "defaultFrom": "desk"
40
+ },
41
+ "kneeDb": {
42
+ "min": 0,
43
+ "max": 24,
44
+ "step": 0.5,
45
+ "unit": "dB",
46
+ "default": 6,
47
+ "defaultFrom": "desk"
48
+ },
49
+ "attackMs": {
50
+ "min": 0.1,
51
+ "max": 100,
52
+ "step": 1,
53
+ "unit": "ms",
54
+ "default": 5,
55
+ "defaultFrom": "desk"
56
+ },
57
+ "releaseMs": {
58
+ "min": 5,
59
+ "max": 3000,
60
+ "step": 10,
61
+ "unit": "ms",
62
+ "default": 200,
63
+ "defaultFrom": "desk"
64
+ },
65
+ "makeupDb": {
66
+ "min": 0,
67
+ "max": 24,
68
+ "step": 0.5,
69
+ "unit": "dB",
70
+ "default": 0,
71
+ "defaultFrom": "desk"
72
+ },
73
+ "mixPct": {
74
+ "min": 0,
75
+ "max": 100,
76
+ "step": 5,
77
+ "unit": "%",
78
+ "default": 100,
79
+ "defaultFrom": "desk"
80
+ }
81
+ }
82
+ },
83
+ "PROGRAM_RELEASE": {
84
+ "rel": "data/kernels/comp.json",
85
+ "kind": "sheet",
86
+ "doc": "The program-dependent release's model constants — the LA-2A's opto cell as DATA (`docs/design/specs/2026-09-26-compressor-models.md` §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.",
87
+ "value": {
88
+ "chargeMs": 1000,
89
+ "dischargeMs": 5000,
90
+ "profiles": {
91
+ "opto": {
92
+ "fastMs": 70,
93
+ "slowMinMs": 110,
94
+ "slowMaxMs": 1100,
95
+ "share": 0.5
96
+ }
97
+ }
98
+ }
99
+ },
100
+ "FX_DELAY_TIME_RANGE": {
101
+ "rel": "data/kernels/delay.json",
102
+ "kind": "travels",
103
+ "doc": "The FX delay's time travel. `max` is the NATIVE ring's ceiling — the same number as `OMX_FXDELAY_MAX_MS` in `omx_delay.h`, pinned to it by `output-delay-ceiling.test.ts`. Distinct from the per-route ALIGNMENT delay (`OUTPUT_DELAY_RANGE`, 1 s, `OMX_DELAY_MAX_MS`): one is a musical echo with feedback and mix, the other is a pure latency. Two facts, two rings, two ceilings — sharing the word \"delay\" is why they keep being confused for each other.",
104
+ "c": {
105
+ "alias": {
106
+ "fact": "delay",
107
+ "field": "timeMs"
108
+ }
109
+ },
110
+ "shape": "travel",
111
+ "value": {
112
+ "min": 0,
113
+ "max": 2000,
114
+ "step": 1,
115
+ "unit": "ms",
116
+ "default": 300,
117
+ "defaultFrom": "desk"
118
+ }
119
+ },
120
+ "FX_DELAY_FEEDBACK_RANGE": {
121
+ "rel": "data/kernels/delay.json",
122
+ "kind": "travels",
123
+ "doc": "The FX delay's REGENERATION travel — how much of the wet tail feeds back in. Stops short of 1: unity feedback is a runaway the kernel hard-clamps anyway, so offering it would draw travel the DSP refuses. Not NORMALIZED_RANGE for exactly that reason — it is a 0..1 quantity whose top the DSP does not accept, and a control must not offer a value its actuator will eat.",
124
+ "shape": "travel",
125
+ "value": {
126
+ "min": 0,
127
+ "max": 0.99,
128
+ "step": 0,
129
+ "unit": "",
130
+ "default": 0.3,
131
+ "defaultFrom": "desk"
132
+ }
133
+ },
134
+ "DELAY_TONE_RANGE": {
135
+ "rel": "data/kernels/delay.json",
136
+ "kind": "travels",
137
+ "doc": "The FX delay's TONE — a NORMALIZED_RANGE instance with its own come-up value, matching `DEFAULT_DELAY_STATE.tone`. See REVERB_SIZE_RANGE for why this is a named constant rather than a default on the shared shape.",
138
+ "shape": "travel",
139
+ "value": {
140
+ "min": 0,
141
+ "max": 1,
142
+ "step": 0,
143
+ "unit": "",
144
+ "default": 0.3,
145
+ "defaultFrom": "desk"
146
+ }
147
+ },
148
+ "DELAY_MIX_RANGE": {
149
+ "rel": "data/kernels/delay.json",
150
+ "kind": "travels",
151
+ "doc": "The FX DELAY's wet/dry — the same split as REVERB_MIX_RANGE, its own declaration.",
152
+ "shape": "travel",
153
+ "value": {
154
+ "min": 0,
155
+ "max": 1,
156
+ "step": 0,
157
+ "unit": "",
158
+ "default": 0.3,
159
+ "defaultFrom": "desk",
160
+ "byKind": {
161
+ "fxReturn": 1
162
+ }
163
+ }
164
+ },
165
+ "FX_DELAY_PINGPONG_DEFAULT": {
166
+ "rel": "data/kernels/delay.json",
167
+ "kind": "scalar",
168
+ "doc": "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 server's `DEFAULT_DELAY_STATE` (which now reads it) so the DPF plugin generator (`packages/omx-plugins/tools/params-gen.mjs`, `2026-09-25-omx-plugins-dpf.md` §3a) reads the same fact the desk seeds a fresh strip with.",
169
+ "unit": "",
170
+ "value": false
171
+ },
172
+ "DRIVE_BIAS_MAX": {
173
+ "rel": "data/kernels/drive.json",
174
+ "kind": "scalar",
175
+ "doc": "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.",
176
+ "unit": "",
177
+ "value": 0.7071067811865476
178
+ },
179
+ "EQ_MAX_BANDS": {
180
+ "rel": "data/kernels/eq.json",
181
+ "kind": "scalar",
182
+ "doc": "The maximum number of parametric bands a channel EQ may hold — the operator can add up to this many. Generated into `omx_contract_limits.h` as `OMX_EQ_MAX_BANDS`, which `omx_biquad.h` reads (`output-delay-ceiling.test.ts` reads the header): the native lane allocates exactly this many biquad slots per channel and silently clamps above it, so the model, the wire, and the DSP agree by test, not by memory.",
183
+ "unit": "",
184
+ "value": 24
185
+ },
186
+ "ISO_THIRD_OCTAVE_CENTRES_HZ": {
187
+ "rel": "data/kernels/eq.json",
188
+ "kind": "list",
189
+ "doc": "The standard ISO 266 one-third-octave centre frequencies, 20 Hz–20 kHz (31 bands) — the classic 31-band graphic-EQ layout's centres.",
190
+ "unit": "Hz",
191
+ "c": {
192
+ "render": false
193
+ },
194
+ "value": [
195
+ 20,
196
+ 25,
197
+ 31.5,
198
+ 40,
199
+ 50,
200
+ 63,
201
+ 80,
202
+ 100,
203
+ 125,
204
+ 160,
205
+ 200,
206
+ 250,
207
+ 315,
208
+ 400,
209
+ 500,
210
+ 630,
211
+ 800,
212
+ 1000,
213
+ 1250,
214
+ 1600,
215
+ 2000,
216
+ 2500,
217
+ 3150,
218
+ 4000,
219
+ 5000,
220
+ 6300,
221
+ 8000,
222
+ 10000,
223
+ 12500,
224
+ 16000,
225
+ 20000
226
+ ]
227
+ },
228
+ "GEQ_BANDS": {
229
+ "rel": "data/kernels/eq.json",
230
+ "kind": "scalar",
231
+ "doc": "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).",
232
+ "unit": "",
233
+ "value": 31
234
+ },
235
+ "GATE_LIMITS": {
236
+ "rel": "data/kernels/gate.json",
237
+ "kind": "travels",
238
+ "doc": "The legal range of each gate field (engineering units). The widget clamps drags to these, `normalizeGate` enforces them, the row's codec refuses by them and the travel sheet publishes them — one source of truth. `rangeDb` reaches GATE_RANGE_FLOOR_DB, shown as \"−∞\" in readouts (a gate fully closed is silence).",
239
+ "shape": "table",
240
+ "value": {
241
+ "thresholdDb": {
242
+ "min": -80,
243
+ "max": 0,
244
+ "step": 1,
245
+ "unit": "dB",
246
+ "default": -40,
247
+ "defaultFrom": "desk"
248
+ },
249
+ "rangeDb": {
250
+ "min": -90,
251
+ "max": 0,
252
+ "step": 1,
253
+ "unit": "dB",
254
+ "default": -90,
255
+ "defaultFrom": "desk"
256
+ },
257
+ "kneeStartDb": {
258
+ "min": -80,
259
+ "max": 0,
260
+ "step": 1,
261
+ "unit": "dB",
262
+ "default": -43,
263
+ "defaultFrom": "desk"
264
+ },
265
+ "kneeEndDb": {
266
+ "min": -80,
267
+ "max": 0,
268
+ "step": 1,
269
+ "unit": "dB",
270
+ "default": -37,
271
+ "defaultFrom": "desk"
272
+ },
273
+ "attackMs": {
274
+ "min": 0,
275
+ "max": 500,
276
+ "step": 0.5,
277
+ "unit": "ms",
278
+ "default": 1,
279
+ "defaultFrom": "desk"
280
+ },
281
+ "holdMs": {
282
+ "min": 0,
283
+ "max": 2000,
284
+ "step": 5,
285
+ "unit": "ms",
286
+ "default": 10,
287
+ "defaultFrom": "desk"
288
+ },
289
+ "releaseMs": {
290
+ "min": 0,
291
+ "max": 5000,
292
+ "step": 10,
293
+ "unit": "ms",
294
+ "default": 100,
295
+ "defaultFrom": "desk"
296
+ },
297
+ "hysteresisDb": {
298
+ "min": 0,
299
+ "max": 24,
300
+ "step": 0.5,
301
+ "unit": "dB",
302
+ "default": 3,
303
+ "defaultFrom": "desk"
304
+ },
305
+ "ratio": {
306
+ "min": 1,
307
+ "max": 100,
308
+ "step": 1,
309
+ "unit": "",
310
+ "default": 16,
311
+ "defaultFrom": "desk"
312
+ }
313
+ }
314
+ },
315
+ "LIMITER_LIMITS": {
316
+ "rel": "data/kernels/limiter.json",
317
+ "kind": "travels",
318
+ "doc": "The precision limiter's travels (`2026-09-27-precision-limiter.md` §2), rendered into `omx_contract_limits.h` as `OMX_LIMITER_*` by `harness/contract-limits-gen.mjs`, so `mix_limiter.h` reads them and never restates one (R-094). The ceiling is a TRUE peak in dBFS (the ×4 detector); the look-ahead sets the declared latency; the release is the envelope's time constant on the gain depth.",
319
+ "shape": "table",
320
+ "value": {
321
+ "ceilingDb": {
322
+ "min": -12,
323
+ "max": 0,
324
+ "step": 0.1,
325
+ "unit": "dBFS",
326
+ "default": -1,
327
+ "defaultFrom": "desk"
328
+ },
329
+ "lookaheadMs": {
330
+ "min": 0.5,
331
+ "max": 5,
332
+ "step": 0.1,
333
+ "unit": "ms",
334
+ "default": 1.5,
335
+ "defaultFrom": "desk"
336
+ },
337
+ "releaseMs": {
338
+ "min": 1,
339
+ "max": 1000,
340
+ "step": 1,
341
+ "unit": "ms",
342
+ "default": 50,
343
+ "defaultFrom": "desk"
344
+ }
345
+ }
346
+ },
347
+ "PITCH_LIMITS": {
348
+ "rel": "data/kernels/pitch.json",
349
+ "kind": "travels",
350
+ "doc": "PITCH_LIMITS, moved from openmixer.",
351
+ "shape": "table",
352
+ "value": {
353
+ "semitones": {
354
+ "min": -12,
355
+ "max": 12,
356
+ "default": 0
357
+ },
358
+ "cents": {
359
+ "min": -50,
360
+ "max": 50,
361
+ "default": 0
362
+ },
363
+ "mix": {
364
+ "min": 0,
365
+ "max": 100,
366
+ "default": 100
367
+ }
368
+ }
369
+ },
370
+ "PITCH_KERNEL": {
371
+ "rel": "data/kernels/pitch.json",
372
+ "kind": "sheet",
373
+ "doc": "PITCH_KERNEL, moved from openmixer.",
374
+ "value": {
375
+ "windowMs": 40,
376
+ "prefilterCeilingHz": 20000,
377
+ "prefilterQ": 0.7071067811865476
378
+ }
379
+ },
380
+ "REVERB_PLATE_MOD_DEPTH_RANGE": {
381
+ "rel": "data/kernels/reverb.json",
382
+ "kind": "travels",
383
+ "doc": "PLATE's tank MODULATION DEPTH, in percent of Dattorro's own excursion (±8 samples at his 29 761 Hz tuning rate, scaled to the live rate the way the tank lengths are). 100 is the depth the plate has always run at, so the come-up is bit-identical to the plate before the field; 0 brings back the unmodulated tank's ring; 400 is the wide, chorused EMT-style swing. The rate stays 1 Hz. Only PLATE reads it (`2026-09-26-native-fx-catalogue.md` §2, Reverb).",
384
+ "shape": "travel",
385
+ "value": {
386
+ "min": 0,
387
+ "max": 400,
388
+ "step": 1,
389
+ "unit": "%",
390
+ "default": 100,
391
+ "defaultFrom": "desk"
392
+ }
393
+ },
394
+ "TRANSIENT_LIMITS": {
395
+ "rel": "data/kernels/transient.json",
396
+ "kind": "travels",
397
+ "doc": "The legal range of each transient-designer field (engineering units), transient spec §3. Every kind comes up flat: no per-kind default differs. `harness/contract-limits-gen.mjs` emits each as `OMX_TRANSIENT_<FIELD>_{MIN,MAX,DEFAULT}` for `mix_transient.h`'s resolve; the row publishes them on OPTIONS when it lands (issue #921).",
398
+ "shape": "table",
399
+ "value": {
400
+ "attackDb": {
401
+ "min": -24,
402
+ "max": 24,
403
+ "step": 0.1,
404
+ "unit": "dB",
405
+ "default": 0,
406
+ "defaultFrom": "desk"
407
+ },
408
+ "sustainDb": {
409
+ "min": -24,
410
+ "max": 24,
411
+ "step": 0.1,
412
+ "unit": "dB",
413
+ "default": 0,
414
+ "defaultFrom": "desk"
415
+ },
416
+ "attackTimeMs": {
417
+ "min": 2,
418
+ "max": 50,
419
+ "step": 0.1,
420
+ "unit": "ms",
421
+ "default": 10,
422
+ "defaultFrom": "desk"
423
+ },
424
+ "sustainTimeMs": {
425
+ "min": 50,
426
+ "max": 2000,
427
+ "step": 1,
428
+ "unit": "ms",
429
+ "default": 250,
430
+ "defaultFrom": "desk"
431
+ },
432
+ "outputDb": {
433
+ "min": -24,
434
+ "max": 12,
435
+ "step": 0.1,
436
+ "unit": "dB",
437
+ "default": 0,
438
+ "defaultFrom": "desk"
439
+ }
440
+ }
441
+ },
442
+ "TRANSIENT_FAST_ATTACK_MS": {
443
+ "rel": "data/kernels/transient.json",
444
+ "kind": "scalar",
445
+ "doc": "The fast follower's attack, ms: exactly the dynamics detector's no-oversampling line (transient spec §3, L7).",
446
+ "unit": "ms",
447
+ "value": 0.5
448
+ },
449
+ "TRANSIENT_FAST_RELEASE_MS": {
450
+ "rel": "data/kernels/transient.json",
451
+ "kind": "scalar",
452
+ "doc": "The fast follower's release, ms: one 50 Hz cycle held, a 180 bpm sixteenth forgotten (transient spec §3).",
453
+ "unit": "ms",
454
+ "value": 20
455
+ },
456
+ "TRANSIENT_REF_DB": {
457
+ "rel": "data/kernels/transient.json",
458
+ "kind": "scalar",
459
+ "doc": "The contrast, dB, at which a knob reaches its full value (transient spec §2, §3).",
460
+ "unit": "dB",
461
+ "value": 6
462
+ },
463
+ "TRANSIENT_FLOOR_LIN": {
464
+ "rel": "data/kernels/transient.json",
465
+ "kind": "scalar",
466
+ "doc": "The detector floor, linear (−100 dBFS): below it both envelopes read the floor and the stage is unity (transient spec §3).",
467
+ "unit": "",
468
+ "value": 0.00001
469
+ },
470
+ "DELAY_PLUGIN": {
471
+ "rel": "data/plugins/delay.json",
472
+ "kind": "plugin",
473
+ "doc": "The delay plugin's parameters, in append-only order: DPF's parameter index is the CLAP param id and the LV2 port order (omx-plugins-dpf §3b). Moved from openmixer's packages/omx-plugins/tools/params-gen.mjs PLUGINS.delay.",
474
+ "why": "mix is per instance on the desk (insert or fxReturn); a plugin racked in a foreign host is an INSERT, so it reads the input kind's default (omx-plugins-dpf §3a).",
475
+ "plugin": "delay",
476
+ "header": "omx_delay_params.h",
477
+ "prefix": "OMX_DELAY",
478
+ "source": "FX_DELAY_TIME_RANGE, FX_DELAY_FEEDBACK_RANGE, DELAY_MIX_RANGE for kind input, DELAY_TONE_RANGE, FX_DELAY_PINGPONG_DEFAULT",
479
+ "value": [
480
+ {
481
+ "symbol": "timeMs",
482
+ "min": 0,
483
+ "max": 2000,
484
+ "def": 300,
485
+ "step": 1,
486
+ "unit": "ms",
487
+ "toggle": false
488
+ },
489
+ {
490
+ "symbol": "feedback",
491
+ "min": 0,
492
+ "max": 0.99,
493
+ "def": 0.3,
494
+ "step": 0,
495
+ "unit": "",
496
+ "toggle": false
497
+ },
498
+ {
499
+ "symbol": "mix",
500
+ "min": 0,
501
+ "max": 1,
502
+ "def": 0.3,
503
+ "step": 0,
504
+ "unit": "",
505
+ "toggle": false
506
+ },
507
+ {
508
+ "symbol": "tone",
509
+ "min": 0,
510
+ "max": 1,
511
+ "def": 0.3,
512
+ "step": 0,
513
+ "unit": "",
514
+ "toggle": false
515
+ },
516
+ {
517
+ "symbol": "pingpong",
518
+ "min": 0,
519
+ "max": 1,
520
+ "def": 0,
521
+ "step": 1,
522
+ "unit": "",
523
+ "toggle": true
524
+ }
525
+ ]
526
+ },
527
+ "BUTTERWORTH_Q": {
528
+ "rel": "data/primitives.json",
529
+ "kind": "scalar",
530
+ "doc": "The Q of a second-order Butterworth section, 1/√2 — maximally flat, the one value every Butterworth biquad in the tree designs at: the LR4 crossover section, the pitch pre-filter and the drive's tilt / band / HF sections, in TS and (as `OMX_BUTTERWORTH_Q`) in C (§7, the scalar door).",
531
+ "unit": "",
532
+ "value": 0.7071067811865476
533
+ },
534
+ "ALLPASS_LIMITS": {
535
+ "rel": "data/primitives.json",
536
+ "kind": "sheet",
537
+ "doc": "ALLPASS_LIMITS, moved from openmixer.",
538
+ "value": {
539
+ "unityTolerance": 0.0001
540
+ }
541
+ },
542
+ "XOVER_LIMITS": {
543
+ "rel": "data/primitives.json",
544
+ "kind": "sheet",
545
+ "doc": "XOVER_LIMITS, moved from openmixer.",
546
+ "value": {
547
+ "lr2SectionQ": 0.5,
548
+ "lr4SectionQ": 0.7071067811865476,
549
+ "partitionTolerance": 0.00001
550
+ }
551
+ },
552
+ "FDELAY_MOD_READ_ORDER": {
553
+ "rel": "data/primitives.json",
554
+ "kind": "scalar",
555
+ "doc": "The order the chorus and flanger construct their lines with (four taps; the fdelay spec §1).",
556
+ "unit": "",
557
+ "value": 3
558
+ },
559
+ "FDELAY_READ_L1_NORM": {
560
+ "rel": "data/primitives.json",
561
+ "kind": "scalar",
562
+ "doc": "`Λ` for the chorus/flanger read — ONE value; the header and every law read this.",
563
+ "unit": "",
564
+ "value": 1.25
565
+ },
566
+ "STANDARD_SAMPLE_RATES": {
567
+ "rel": "data/rates.json",
568
+ "kind": "list",
569
+ "doc": "The standard sample rates (Hz) the desk recognises — the pro-audio superset. One source of truth for the clock controller's `clock.allowed-rates` seed, the force row's validation ceiling and the device-rate probe fallback. What the operator is OFFERED is always the DEVICE's own `supportedRates` (`2026-07-15-clock-rate-honest-force-rate.md`) — this is the ceiling a write is refused by, never a menu.",
570
+ "unit": "Hz",
571
+ "value": [
572
+ 44100,
573
+ 48000,
574
+ 88200,
575
+ 96000,
576
+ 176400,
577
+ 192000
578
+ ]
579
+ },
580
+ "RT_HARD_TARGET": {
581
+ "rel": "data/rates.json",
582
+ "kind": "sheet",
583
+ "doc": "THE declaration: 192 kHz at quantum 128.",
584
+ "value": {
585
+ "rate": 192000,
586
+ "quantum": 128
587
+ }
588
+ },
589
+ "DSP_KNOB_REFERENCE_RATE": {
590
+ "rel": "data/rates.json",
591
+ "kind": "scalar",
592
+ "doc": "The rate a unit-range DSP knob is quoted at (R-058): the rate this desk runs (ruling 2026-09-14). A kernel raises the knob to `REF / sr`, so at this rate the exponent is exactly 1 and the response is bit-for-bit the one cut before the law. Emitted to C as `OMX_DSP_KNOB_REFERENCE_RATE`; the reverb damping and FX-delay tone references `#define` from it.",
593
+ "unit": "Hz",
594
+ "value": 96000
595
+ }
596
+ }
597
+ }