@openmixer/omx-contract 1.1.0 → 1.2.1
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 +4 -3
- package/data/kernels/balance.json +19 -0
- package/data/kernels/chorus.json +48 -0
- package/data/kernels/drive.json +90 -0
- package/data/kernels/eq.json +60 -0
- package/data/kernels/reverb.json +135 -0
- package/data/primitives.json +74 -0
- package/dist/ts/omx-contract.d.ts +417 -0
- package/dist/ts/omx-contract.js +417 -0
- package/include/omxcontract/omx_contract_limits.h +137 -0
- package/package.json +1 -1
- package/share/omx-contract/omx-contract.json +484 -1
package/dist/ts/omx-contract.js
CHANGED
|
@@ -2,6 +2,17 @@
|
|
|
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 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
|
+
* @see data/kernels/balance.json
|
|
8
|
+
*/
|
|
9
|
+
export const PAN_RANGE = {
|
|
10
|
+
"min": -1,
|
|
11
|
+
"max": 1,
|
|
12
|
+
"step": 0,
|
|
13
|
+
"unit": ""
|
|
14
|
+
};
|
|
15
|
+
|
|
5
16
|
/**
|
|
6
17
|
* 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 ''.
|
|
7
18
|
* @see data/kernels/chorus.json
|
|
@@ -15,6 +26,58 @@ export const CHORUS_SPREAD_RANGE = {
|
|
|
15
26
|
"defaultFrom": "desk"
|
|
16
27
|
};
|
|
17
28
|
|
|
29
|
+
/**
|
|
30
|
+
* The chorus sweep's speed (§3a). Above ~3 Hz it stops being a chorus and becomes a vibrato.
|
|
31
|
+
* @see data/kernels/chorus.json
|
|
32
|
+
*/
|
|
33
|
+
export const CHORUS_RATE_RANGE = {
|
|
34
|
+
"min": 0.05,
|
|
35
|
+
"max": 8,
|
|
36
|
+
"step": 0.01,
|
|
37
|
+
"unit": "Hz",
|
|
38
|
+
"default": 0.6,
|
|
39
|
+
"defaultFrom": "desk"
|
|
40
|
+
};
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* The chorus's peak-to-peak excursion above its declared 10 ms base (§3a).
|
|
44
|
+
* @see data/kernels/chorus.json
|
|
45
|
+
*/
|
|
46
|
+
export const CHORUS_DEPTH_RANGE = {
|
|
47
|
+
"min": 0,
|
|
48
|
+
"max": 12,
|
|
49
|
+
"step": 0.1,
|
|
50
|
+
"unit": "ms",
|
|
51
|
+
"default": 4,
|
|
52
|
+
"defaultFrom": "desk"
|
|
53
|
+
};
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* The chorus's tap count — one oscillator read at k/N (§3a).
|
|
57
|
+
* @see data/kernels/chorus.json
|
|
58
|
+
*/
|
|
59
|
+
export const CHORUS_VOICES_RANGE = {
|
|
60
|
+
"min": 1,
|
|
61
|
+
"max": 4,
|
|
62
|
+
"step": 1,
|
|
63
|
+
"unit": "",
|
|
64
|
+
"default": 3,
|
|
65
|
+
"defaultFrom": "desk"
|
|
66
|
+
};
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* 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.
|
|
70
|
+
* @see data/kernels/chorus.json
|
|
71
|
+
*/
|
|
72
|
+
export const CHORUS_MIX_RANGE = {
|
|
73
|
+
"min": 0,
|
|
74
|
+
"max": 100,
|
|
75
|
+
"step": 0.1,
|
|
76
|
+
"unit": "%",
|
|
77
|
+
"default": 35,
|
|
78
|
+
"defaultFrom": "desk"
|
|
79
|
+
};
|
|
80
|
+
|
|
18
81
|
/**
|
|
19
82
|
* 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.
|
|
20
83
|
* @see data/kernels/comp.json
|
|
@@ -259,6 +322,71 @@ export const FX_DELAY_PINGPONG_DEFAULT = false;
|
|
|
259
322
|
*/
|
|
260
323
|
export const DRIVE_BIAS_MAX = 0.7071067811865476;
|
|
261
324
|
|
|
325
|
+
/**
|
|
326
|
+
* The PRE-CURVE gain, in dB. 0 dB is unity into the curve, so a stage switched on at its defaults changes almost nothing — which is what an `on` switch should mean. The ceiling is where every curve is saturating hard on any signal a console carries.
|
|
327
|
+
* @see data/kernels/drive.json
|
|
328
|
+
*/
|
|
329
|
+
export const DRIVE_AMOUNT_RANGE = {
|
|
330
|
+
"min": 0,
|
|
331
|
+
"max": 36,
|
|
332
|
+
"step": 0.1,
|
|
333
|
+
"unit": "dB",
|
|
334
|
+
"default": 0,
|
|
335
|
+
"defaultFrom": "desk"
|
|
336
|
+
};
|
|
337
|
+
|
|
338
|
+
/**
|
|
339
|
+
* The EVEN/ODD harmonic balance. −1 is pure odd (the curve itself), +1 is pure even, 0 an equal blend — the kernel splits its own distortion residue into an odd and an even half and fades between them, so the two ends are exact rather than approximate (`mix_drive.h`, measured: H2 at −317 dBc at −1, H3 at −118 dBc at +1). Unitless, and signed by construction. NOT NORMALIZED_RANGE: this is a BALANCE with a meaningful centre, and a 0..1 travel would put its centre at 0.5 and its neutral nowhere.
|
|
340
|
+
* @see data/kernels/drive.json
|
|
341
|
+
*/
|
|
342
|
+
export const DRIVE_CHARACTER_RANGE = {
|
|
343
|
+
"min": -1,
|
|
344
|
+
"max": 1,
|
|
345
|
+
"step": 0.01,
|
|
346
|
+
"unit": "",
|
|
347
|
+
"default": 0,
|
|
348
|
+
"defaultFrom": "desk"
|
|
349
|
+
};
|
|
350
|
+
|
|
351
|
+
/**
|
|
352
|
+
* The band split / tilt corner, in Hz. ONE travel for all three band modes, because the C imposes one constraint on all of them: it is the corner of a single biquad, and the split's other half is `x − LP(x)`. The full audio band, not the channel filters' narrower HPF/LPF pair — the same reasoning REVERB_CUT_RANGE records: a surface narrower than the row removes reach the console genuinely has.
|
|
353
|
+
* @see data/kernels/drive.json
|
|
354
|
+
*/
|
|
355
|
+
export const DRIVE_BAND_FREQ_RANGE = {
|
|
356
|
+
"min": 20,
|
|
357
|
+
"max": 20000,
|
|
358
|
+
"step": 1,
|
|
359
|
+
"unit": "Hz",
|
|
360
|
+
"default": 2000,
|
|
361
|
+
"defaultFrom": "desk"
|
|
362
|
+
};
|
|
363
|
+
|
|
364
|
+
/**
|
|
365
|
+
* The wet/dry, as a PERCENT — the unit a drive control is read in on every desk that has one. Deliberately not NORMALIZED_RANGE (which is unitless 0..1): a mix a surface must label "0.35" when the operator thinks in "35 %" is a control whose declaration is fighting its reader. The kernel divides by 100 where it resolves the atom, in one place. The come-up is 100 %, not the reverb's modest 30: a saturator's insert use is IN the path. The `exciter` curve seeds itself lower (DRIVE_EXCITER_SEED), because that is a property of the TOPOLOGY and not of the travel.
|
|
366
|
+
* @see data/kernels/drive.json
|
|
367
|
+
*/
|
|
368
|
+
export const DRIVE_MIX_RANGE = {
|
|
369
|
+
"min": 0,
|
|
370
|
+
"max": 100,
|
|
371
|
+
"step": 0.1,
|
|
372
|
+
"unit": "%",
|
|
373
|
+
"default": 100,
|
|
374
|
+
"defaultFrom": "desk"
|
|
375
|
+
};
|
|
376
|
+
|
|
377
|
+
/**
|
|
378
|
+
* The POST-stage make-up, in dB. Symmetric enough either way that an operator can null the stage in and out against the bypass, which is how a colour stage is actually judged.
|
|
379
|
+
* @see data/kernels/drive.json
|
|
380
|
+
*/
|
|
381
|
+
export const DRIVE_TRIM_RANGE = {
|
|
382
|
+
"min": -24,
|
|
383
|
+
"max": 12,
|
|
384
|
+
"step": 0.1,
|
|
385
|
+
"unit": "dB",
|
|
386
|
+
"default": 0,
|
|
387
|
+
"defaultFrom": "desk"
|
|
388
|
+
};
|
|
389
|
+
|
|
262
390
|
/**
|
|
263
391
|
* 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.
|
|
264
392
|
* @see data/kernels/eq.json
|
|
@@ -309,6 +437,72 @@ export const ISO_THIRD_OCTAVE_CENTRES_HZ = [
|
|
|
309
437
|
*/
|
|
310
438
|
export const GEQ_BANDS = 31;
|
|
311
439
|
|
|
440
|
+
/**
|
|
441
|
+
* The frequency band a parametric band can be dragged across.
|
|
442
|
+
* @see data/kernels/eq.json
|
|
443
|
+
*/
|
|
444
|
+
export const EQ_FREQ_RANGE = {
|
|
445
|
+
"min": 20,
|
|
446
|
+
"max": 20000,
|
|
447
|
+
"step": 10,
|
|
448
|
+
"unit": "Hz"
|
|
449
|
+
};
|
|
450
|
+
|
|
451
|
+
/**
|
|
452
|
+
* The parametric-band gain travel, in dB. The ± scalar `clampEqGain` enforces is READ off this (`core/src/eq.ts` derives `EQ_GAIN_LIMIT_DB` from `max`), so the bound is stated once and a surface cannot draw a wider knob than the clamp will honour.
|
|
453
|
+
* @see data/kernels/eq.json
|
|
454
|
+
*/
|
|
455
|
+
export const EQ_GAIN_RANGE = {
|
|
456
|
+
"min": -15,
|
|
457
|
+
"max": 15,
|
|
458
|
+
"step": 0.5,
|
|
459
|
+
"unit": "dB"
|
|
460
|
+
};
|
|
461
|
+
|
|
462
|
+
/**
|
|
463
|
+
* The Q (resonance) extent of a parametric band.
|
|
464
|
+
* @see data/kernels/eq.json
|
|
465
|
+
*/
|
|
466
|
+
export const EQ_Q_RANGE = {
|
|
467
|
+
"min": 0.3,
|
|
468
|
+
"max": 8,
|
|
469
|
+
"step": 0.1,
|
|
470
|
+
"unit": ""
|
|
471
|
+
};
|
|
472
|
+
|
|
473
|
+
/**
|
|
474
|
+
* The Q extent of a NOTCH band. Wider than EQ_Q_RANGE on purpose (#116, operator decision): an ultra-narrow surgical cut is the notch shape's whole point — the FBS ring-out pool plants dbx-AFS-style ring killers at Q ≈ 116 (~1/80 octave), inaudible on program yet fatal to a single ringing frequency. Gain-carrying shapes stay bounded at EQ_Q_RANGE — a Q-116 bell is a resonator, not an EQ move.
|
|
475
|
+
* @see data/kernels/eq.json
|
|
476
|
+
*/
|
|
477
|
+
export const EQ_NOTCH_Q_RANGE = {
|
|
478
|
+
"min": 0.3,
|
|
479
|
+
"max": 116,
|
|
480
|
+
"step": 1,
|
|
481
|
+
"unit": ""
|
|
482
|
+
};
|
|
483
|
+
|
|
484
|
+
/**
|
|
485
|
+
* Where the HPF cutoff can sit (low end); mirrors the drawn low-frequency handle.
|
|
486
|
+
* @see data/kernels/eq.json
|
|
487
|
+
*/
|
|
488
|
+
export const HPF_FREQ_RANGE = {
|
|
489
|
+
"min": 20,
|
|
490
|
+
"max": 1000,
|
|
491
|
+
"step": 10,
|
|
492
|
+
"unit": "Hz"
|
|
493
|
+
};
|
|
494
|
+
|
|
495
|
+
/**
|
|
496
|
+
* Where the LPF cutoff can sit (high end).
|
|
497
|
+
* @see data/kernels/eq.json
|
|
498
|
+
*/
|
|
499
|
+
export const LPF_FREQ_RANGE = {
|
|
500
|
+
"min": 1000,
|
|
501
|
+
"max": 20000,
|
|
502
|
+
"step": 10,
|
|
503
|
+
"unit": "Hz"
|
|
504
|
+
};
|
|
505
|
+
|
|
312
506
|
/**
|
|
313
507
|
* The flanger's jet sweep (§3b).
|
|
314
508
|
* @see data/kernels/flanger.json
|
|
@@ -685,6 +879,152 @@ export const REVERB_PLATE_MOD_DEPTH_RANGE = {
|
|
|
685
879
|
"defaultFrom": "desk"
|
|
686
880
|
};
|
|
687
881
|
|
|
882
|
+
/**
|
|
883
|
+
* The REVERB's wet/dry. An insert keeps the dry signal (0.3); an `fxReturn` is wet-only (1), so the return carries only the effect. Both numbers live HERE and nowhere else: the row's `mix` limit, `ReverbController`'s seed and its fresh state read them through limitForKind.
|
|
884
|
+
* @see data/kernels/reverb.json
|
|
885
|
+
*/
|
|
886
|
+
export const REVERB_MIX_RANGE = {
|
|
887
|
+
"min": 0,
|
|
888
|
+
"max": 1,
|
|
889
|
+
"step": 0,
|
|
890
|
+
"unit": "",
|
|
891
|
+
"default": 0.3,
|
|
892
|
+
"defaultFrom": "desk",
|
|
893
|
+
"byKind": {
|
|
894
|
+
"fxReturn": 1
|
|
895
|
+
}
|
|
896
|
+
};
|
|
897
|
+
|
|
898
|
+
/**
|
|
899
|
+
* The reverb's SIZE/DAMPING/WIDTH — each a NORMALIZED_RANGE instance with its own come-up value, matching `DEFAULT_REVERB_STATE`. Three separate constants rather than one shared default on `NORMALIZED_RANGE`: that range is the bare 0..1 REPRESENTATION, reused by fields across the whole console whose come-up values disagree (a fader position is not a reverb's damping), so a default belongs on the NAMED field, never on the shape it borrows.
|
|
900
|
+
* @see data/kernels/reverb.json
|
|
901
|
+
*/
|
|
902
|
+
export const REVERB_SIZE_RANGE = {
|
|
903
|
+
"min": 0,
|
|
904
|
+
"max": 1,
|
|
905
|
+
"step": 0,
|
|
906
|
+
"unit": "",
|
|
907
|
+
"default": 0.7,
|
|
908
|
+
"defaultFrom": "desk"
|
|
909
|
+
};
|
|
910
|
+
|
|
911
|
+
/**
|
|
912
|
+
* The reverb's DAMPING — a NORMALIZED_RANGE instance with its own come-up value, matching `DEFAULT_REVERB_STATE`. Declared with SIZE and WIDTH (see REVERB_SIZE_RANGE for why each is a named constant rather than a default on the shared 0..1 shape).
|
|
913
|
+
* @see data/kernels/reverb.json
|
|
914
|
+
*/
|
|
915
|
+
export const REVERB_DAMPING_RANGE = {
|
|
916
|
+
"min": 0,
|
|
917
|
+
"max": 1,
|
|
918
|
+
"step": 0,
|
|
919
|
+
"unit": "",
|
|
920
|
+
"default": 0.5,
|
|
921
|
+
"defaultFrom": "desk"
|
|
922
|
+
};
|
|
923
|
+
|
|
924
|
+
/**
|
|
925
|
+
* The reverb's stereo WIDTH — a NORMALIZED_RANGE instance with its own come-up value, matching `DEFAULT_REVERB_STATE`. Declared with SIZE and DAMPING (see REVERB_SIZE_RANGE for why each is a named constant rather than a default on the shared 0..1 shape).
|
|
926
|
+
* @see data/kernels/reverb.json
|
|
927
|
+
*/
|
|
928
|
+
export const REVERB_WIDTH_RANGE = {
|
|
929
|
+
"min": 0,
|
|
930
|
+
"max": 1,
|
|
931
|
+
"step": 0,
|
|
932
|
+
"unit": "",
|
|
933
|
+
"default": 1,
|
|
934
|
+
"defaultFrom": "desk"
|
|
935
|
+
};
|
|
936
|
+
|
|
937
|
+
/**
|
|
938
|
+
* The reverb's PRE-DELAY travel — the gap before the first reflection, in milliseconds. Declared here so the unit crosses with the bounds: a `finiteNumber(0, 100)` codec publishes `unit: ''`, and a surface binding that draws a millisecond control it cannot label. The panel knowing better than the wire is the wrong way round.
|
|
939
|
+
* @see data/kernels/reverb.json
|
|
940
|
+
*/
|
|
941
|
+
export const REVERB_PREDELAY_RANGE = {
|
|
942
|
+
"min": 0,
|
|
943
|
+
"max": 100,
|
|
944
|
+
"step": 1,
|
|
945
|
+
"unit": "ms",
|
|
946
|
+
"default": 0,
|
|
947
|
+
"defaultFrom": "desk"
|
|
948
|
+
};
|
|
949
|
+
|
|
950
|
+
/**
|
|
951
|
+
* The reverb's LOW cut, as an instance of REVERB_CUT_RANGE — same bounds, its own come-up value. `0` reads as "none" (`mix_reverb.h`), which is also `DEFAULT_REVERB_STATE`'s seed, so a fresh reverb's low cut and its declared default are the same fact stated once. Split from REVERB_CUT_RANGE rather than adding `default` there: the low and high cut share ONE travel (the C imposes one constraint on both) but do NOT share one come-up value, and a `default` on the shared range could only be honest for one of the two fields that read it.
|
|
952
|
+
* @see data/kernels/reverb.json
|
|
953
|
+
*/
|
|
954
|
+
export const REVERB_LOWCUT_RANGE = {
|
|
955
|
+
"min": 0,
|
|
956
|
+
"max": 20000,
|
|
957
|
+
"step": 10,
|
|
958
|
+
"unit": "Hz",
|
|
959
|
+
"default": 0,
|
|
960
|
+
"defaultFrom": "desk"
|
|
961
|
+
};
|
|
962
|
+
|
|
963
|
+
/**
|
|
964
|
+
* The reverb's HIGH cut, as an instance of REVERB_CUT_RANGE — same bounds, its own come-up value. The top of the travel reads as "open" (`mix_reverb.h`), matching `DEFAULT_REVERB_STATE`'s seed.
|
|
965
|
+
* @see data/kernels/reverb.json
|
|
966
|
+
*/
|
|
967
|
+
export const REVERB_HIGHCUT_RANGE = {
|
|
968
|
+
"min": 0,
|
|
969
|
+
"max": 20000,
|
|
970
|
+
"step": 10,
|
|
971
|
+
"unit": "Hz",
|
|
972
|
+
"default": 20000,
|
|
973
|
+
"defaultFrom": "desk"
|
|
974
|
+
};
|
|
975
|
+
|
|
976
|
+
/**
|
|
977
|
+
* REVERSE's MIRROR WINDOW — how long a slice of the wet is played backward, in milliseconds (`2026-07-15-native-delay-reverb.md`, Amendment 2026-09-17 §B). A DECLARED travel and never derived from `size`'s RT60: an RT60 of seconds cannot be buffered at 192 kHz, and a window silently clamped to fit is the silent-clamp defect. The ceiling is what `mix_reverb.h`'s pool budgets a ring for (`OMX_REVERB_REVERSE_MAX_MS`), so the console offers exactly the travel the kernel accepts — nothing wider, nothing narrower.
|
|
978
|
+
* @see data/kernels/reverb.json
|
|
979
|
+
*/
|
|
980
|
+
export const REVERB_REVERSE_RANGE = {
|
|
981
|
+
"min": 50,
|
|
982
|
+
"max": 500,
|
|
983
|
+
"step": 10,
|
|
984
|
+
"unit": "ms",
|
|
985
|
+
"default": 300,
|
|
986
|
+
"defaultFrom": "desk"
|
|
987
|
+
};
|
|
988
|
+
|
|
989
|
+
/**
|
|
990
|
+
* GATED's HOLD — how long the wet stays at full level after the key falls away, in milliseconds. The Phil-Collins tail is cut where the operator puts the cut, so this is the control that decides the effect's length; `size` still decides what is being cut off.
|
|
991
|
+
* @see data/kernels/reverb.json
|
|
992
|
+
*/
|
|
993
|
+
export const REVERB_HOLD_RANGE = {
|
|
994
|
+
"min": 10,
|
|
995
|
+
"max": 2000,
|
|
996
|
+
"step": 10,
|
|
997
|
+
"unit": "ms",
|
|
998
|
+
"default": 120,
|
|
999
|
+
"defaultFrom": "desk"
|
|
1000
|
+
};
|
|
1001
|
+
|
|
1002
|
+
/**
|
|
1003
|
+
* GATED's RELEASE — how long the held wet takes to reach zero, in milliseconds. A straight line down, short by design: a long release is a reverb tail again, which is the thing a gated reverb exists to remove.
|
|
1004
|
+
* @see data/kernels/reverb.json
|
|
1005
|
+
*/
|
|
1006
|
+
export const REVERB_RELEASE_RANGE = {
|
|
1007
|
+
"min": 1,
|
|
1008
|
+
"max": 500,
|
|
1009
|
+
"step": 1,
|
|
1010
|
+
"unit": "ms",
|
|
1011
|
+
"default": 20,
|
|
1012
|
+
"defaultFrom": "desk"
|
|
1013
|
+
};
|
|
1014
|
+
|
|
1015
|
+
/**
|
|
1016
|
+
* GATED's ARM THRESHOLD — the level the reverb's own mono feed must reach to arm the hold, in dBFS. Declared, because the alternative is a hidden onset detector: the kernel compares `|input|` against exactly this number and nothing else.
|
|
1017
|
+
* @see data/kernels/reverb.json
|
|
1018
|
+
*/
|
|
1019
|
+
export const REVERB_GATE_THRESHOLD_RANGE = {
|
|
1020
|
+
"min": -80,
|
|
1021
|
+
"max": 0,
|
|
1022
|
+
"step": 1,
|
|
1023
|
+
"unit": "dBFS",
|
|
1024
|
+
"default": -40,
|
|
1025
|
+
"defaultFrom": "desk"
|
|
1026
|
+
};
|
|
1027
|
+
|
|
688
1028
|
/**
|
|
689
1029
|
* The horn's chorale (slow) rate, Hz.
|
|
690
1030
|
* @see data/kernels/rotary.json
|
|
@@ -1088,6 +1428,83 @@ export const FDELAY_MOD_READ_ORDER = 3;
|
|
|
1088
1428
|
*/
|
|
1089
1429
|
export const FDELAY_READ_L1_NORM = 1.25;
|
|
1090
1430
|
|
|
1431
|
+
/**
|
|
1432
|
+
* The gate's threshold, range, release and ratio as a plugin host draws them: GATE_LIMITS' bounds, units and defaults with no step. The console's row quantises these four to whole steps (1 dB, 10 ms, 1:1), and a travel whose step is 1 or more reads as an integer control; the omx-strip plugin has always offered them continuous, so it reads this table instead. Every number but the step is GATE_LIMITS', held equal by test/continuous-travels.test.mjs. Not rendered to C: no C reader needs a second spelling of the gate's bounds.
|
|
1433
|
+
* @see data/primitives.json
|
|
1434
|
+
*/
|
|
1435
|
+
export const GATE_CONTINUOUS_TRAVELS = {
|
|
1436
|
+
"thresholdDb": {
|
|
1437
|
+
"min": -80,
|
|
1438
|
+
"max": 0,
|
|
1439
|
+
"step": 0,
|
|
1440
|
+
"unit": "dB",
|
|
1441
|
+
"default": -40,
|
|
1442
|
+
"defaultFrom": "desk"
|
|
1443
|
+
},
|
|
1444
|
+
"rangeDb": {
|
|
1445
|
+
"min": -90,
|
|
1446
|
+
"max": 0,
|
|
1447
|
+
"step": 0,
|
|
1448
|
+
"unit": "dB",
|
|
1449
|
+
"default": -90,
|
|
1450
|
+
"defaultFrom": "desk"
|
|
1451
|
+
},
|
|
1452
|
+
"releaseMs": {
|
|
1453
|
+
"min": 0,
|
|
1454
|
+
"max": 5000,
|
|
1455
|
+
"step": 0,
|
|
1456
|
+
"unit": "ms",
|
|
1457
|
+
"default": 100,
|
|
1458
|
+
"defaultFrom": "desk"
|
|
1459
|
+
},
|
|
1460
|
+
"ratio": {
|
|
1461
|
+
"min": 1,
|
|
1462
|
+
"max": 100,
|
|
1463
|
+
"step": 0,
|
|
1464
|
+
"unit": "",
|
|
1465
|
+
"default": 16,
|
|
1466
|
+
"defaultFrom": "desk"
|
|
1467
|
+
}
|
|
1468
|
+
};
|
|
1469
|
+
|
|
1470
|
+
/**
|
|
1471
|
+
* The compressor's threshold and release as a plugin host draws them: COMP_LIMITS' bounds, units and defaults with no step. The console's row quantises them to whole steps (1 dB, 10 ms), and a travel whose step is 1 or more reads as an integer control; the omx-strip plugin has always offered them continuous, so it reads this table instead. Every number but the step is COMP_LIMITS', held equal by test/continuous-travels.test.mjs. Not rendered to C: no C reader needs a second spelling of the compressor's bounds.
|
|
1472
|
+
* @see data/primitives.json
|
|
1473
|
+
*/
|
|
1474
|
+
export const COMP_CONTINUOUS_TRAVELS = {
|
|
1475
|
+
"thresholdDb": {
|
|
1476
|
+
"min": -60,
|
|
1477
|
+
"max": 0,
|
|
1478
|
+
"step": 0,
|
|
1479
|
+
"unit": "dB",
|
|
1480
|
+
"default": -18,
|
|
1481
|
+
"defaultFrom": "desk"
|
|
1482
|
+
},
|
|
1483
|
+
"releaseMs": {
|
|
1484
|
+
"min": 5,
|
|
1485
|
+
"max": 3000,
|
|
1486
|
+
"step": 0,
|
|
1487
|
+
"unit": "ms",
|
|
1488
|
+
"default": 200,
|
|
1489
|
+
"defaultFrom": "desk"
|
|
1490
|
+
}
|
|
1491
|
+
};
|
|
1492
|
+
|
|
1493
|
+
/**
|
|
1494
|
+
* The digital input trim as a travel: openmixer's TRIM_RANGE (packages/declarations, -24..+24 dB in 0.1 dB steps, spelled minDb/maxDb/stepDb there and OMX_TRIM_RANGE_*_DB in omx-dsp's header), coming up at 0 dB, the trim a channel has when none is set. The omx-strip plugin's trim reads it. A table with the one field `trimDb`, the name the trim row and the plugin store; not rendered to C, which already spells TRIM_RANGE its own way.
|
|
1495
|
+
* @see data/primitives.json
|
|
1496
|
+
*/
|
|
1497
|
+
export const TRIM_TRAVELS = {
|
|
1498
|
+
"trimDb": {
|
|
1499
|
+
"min": -24,
|
|
1500
|
+
"max": 24,
|
|
1501
|
+
"step": 0.1,
|
|
1502
|
+
"unit": "dB",
|
|
1503
|
+
"default": 0,
|
|
1504
|
+
"defaultFrom": "desk"
|
|
1505
|
+
}
|
|
1506
|
+
};
|
|
1507
|
+
|
|
1091
1508
|
/**
|
|
1092
1509
|
* 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.
|
|
1093
1510
|
* @see data/rates.json
|
|
@@ -101,22 +101,62 @@
|
|
|
101
101
|
|
|
102
102
|
/* The second C spelling of a travel, its item's `c.alias` { fact, field }:
|
|
103
103
|
* OMX_<FACT>_<FIELD>_MIN/_MAX/_DEFAULT. Removed by a MAJOR release once no consumer reads it. */
|
|
104
|
+
#define OMX_PAN_PAN_MIN -1.0f
|
|
105
|
+
#define OMX_PAN_PAN_MAX 1.0f
|
|
106
|
+
|
|
104
107
|
#define OMX_DELAY_TIME_MS_MIN 0.0f
|
|
105
108
|
#define OMX_DELAY_TIME_MS_MAX 2000.0f
|
|
106
109
|
#define OMX_DELAY_TIME_MS_DEFAULT 300.0f
|
|
107
110
|
|
|
111
|
+
#define OMX_DRIVE_DRIVE_DB_MIN 0.0f
|
|
112
|
+
#define OMX_DRIVE_DRIVE_DB_MAX 36.0f
|
|
113
|
+
#define OMX_DRIVE_DRIVE_DB_DEFAULT 0.0f
|
|
114
|
+
#define OMX_DRIVE_CHARACTER_MIN -1.0f
|
|
115
|
+
#define OMX_DRIVE_CHARACTER_MAX 1.0f
|
|
116
|
+
#define OMX_DRIVE_CHARACTER_DEFAULT 0.0f
|
|
117
|
+
#define OMX_DRIVE_BAND_HZ_MIN 20.0f
|
|
118
|
+
#define OMX_DRIVE_BAND_HZ_MAX 20000.0f
|
|
119
|
+
#define OMX_DRIVE_BAND_HZ_DEFAULT 2000.0f
|
|
120
|
+
#define OMX_DRIVE_MIX_MIN 0.0f
|
|
121
|
+
#define OMX_DRIVE_MIX_MAX 100.0f
|
|
122
|
+
#define OMX_DRIVE_MIX_DEFAULT 100.0f
|
|
123
|
+
#define OMX_DRIVE_TRIM_DB_MIN -24.0f
|
|
124
|
+
#define OMX_DRIVE_TRIM_DB_MAX 12.0f
|
|
125
|
+
#define OMX_DRIVE_TRIM_DB_DEFAULT 0.0f
|
|
126
|
+
|
|
108
127
|
/* Every scalar, sheet leaf and single travel's numbers, one block sorted by macro. An integer value
|
|
109
128
|
* is an integer literal, any other a float literal AND its OMX_<macro>_DOUBLE spelling. */
|
|
110
129
|
#define OMX_ALLPASS_UNITY_TOLERANCE 0.0001f
|
|
111
130
|
#define OMX_ALLPASS_UNITY_TOLERANCE_DOUBLE 0.0001
|
|
112
131
|
#define OMX_BUTTERWORTH_Q 0.7071067811865476f
|
|
113
132
|
#define OMX_BUTTERWORTH_Q_DOUBLE 0.7071067811865476
|
|
133
|
+
#define OMX_CHORUS_DEPTH_RANGE_DEFAULT 4
|
|
134
|
+
#define OMX_CHORUS_DEPTH_RANGE_MAX 12
|
|
135
|
+
#define OMX_CHORUS_DEPTH_RANGE_MIN 0
|
|
136
|
+
#define OMX_CHORUS_DEPTH_RANGE_STEP 0.1f
|
|
137
|
+
#define OMX_CHORUS_DEPTH_RANGE_STEP_DOUBLE 0.1
|
|
138
|
+
#define OMX_CHORUS_MIX_RANGE_DEFAULT 35
|
|
139
|
+
#define OMX_CHORUS_MIX_RANGE_MAX 100
|
|
140
|
+
#define OMX_CHORUS_MIX_RANGE_MIN 0
|
|
141
|
+
#define OMX_CHORUS_MIX_RANGE_STEP 0.1f
|
|
142
|
+
#define OMX_CHORUS_MIX_RANGE_STEP_DOUBLE 0.1
|
|
143
|
+
#define OMX_CHORUS_RATE_RANGE_DEFAULT 0.6f
|
|
144
|
+
#define OMX_CHORUS_RATE_RANGE_DEFAULT_DOUBLE 0.6
|
|
145
|
+
#define OMX_CHORUS_RATE_RANGE_MAX 8
|
|
146
|
+
#define OMX_CHORUS_RATE_RANGE_MIN 0.05f
|
|
147
|
+
#define OMX_CHORUS_RATE_RANGE_MIN_DOUBLE 0.05
|
|
148
|
+
#define OMX_CHORUS_RATE_RANGE_STEP 0.01f
|
|
149
|
+
#define OMX_CHORUS_RATE_RANGE_STEP_DOUBLE 0.01
|
|
114
150
|
#define OMX_CHORUS_SPREAD_RANGE_DEFAULT 0
|
|
115
151
|
#define OMX_CHORUS_SPREAD_RANGE_MAX 0.5f
|
|
116
152
|
#define OMX_CHORUS_SPREAD_RANGE_MAX_DOUBLE 0.5
|
|
117
153
|
#define OMX_CHORUS_SPREAD_RANGE_MIN 0
|
|
118
154
|
#define OMX_CHORUS_SPREAD_RANGE_STEP 0.01f
|
|
119
155
|
#define OMX_CHORUS_SPREAD_RANGE_STEP_DOUBLE 0.01
|
|
156
|
+
#define OMX_CHORUS_VOICES_RANGE_DEFAULT 3
|
|
157
|
+
#define OMX_CHORUS_VOICES_RANGE_MAX 4
|
|
158
|
+
#define OMX_CHORUS_VOICES_RANGE_MIN 1
|
|
159
|
+
#define OMX_CHORUS_VOICES_RANGE_STEP 1
|
|
120
160
|
#define OMX_DEESS_ATTACK_RANGE_DEFAULT 1
|
|
121
161
|
#define OMX_DEESS_ATTACK_RANGE_MAX 50
|
|
122
162
|
#define OMX_DEESS_ATTACK_RANGE_MIN 0.1f
|
|
@@ -164,10 +204,50 @@
|
|
|
164
204
|
#define OMX_DELAY_TONE_RANGE_MAX 1
|
|
165
205
|
#define OMX_DELAY_TONE_RANGE_MIN 0
|
|
166
206
|
#define OMX_DELAY_TONE_RANGE_STEP 0
|
|
207
|
+
#define OMX_DRIVE_AMOUNT_RANGE_DEFAULT 0
|
|
208
|
+
#define OMX_DRIVE_AMOUNT_RANGE_MAX 36
|
|
209
|
+
#define OMX_DRIVE_AMOUNT_RANGE_MIN 0
|
|
210
|
+
#define OMX_DRIVE_AMOUNT_RANGE_STEP 0.1f
|
|
211
|
+
#define OMX_DRIVE_AMOUNT_RANGE_STEP_DOUBLE 0.1
|
|
212
|
+
#define OMX_DRIVE_BAND_FREQ_RANGE_DEFAULT 2000
|
|
213
|
+
#define OMX_DRIVE_BAND_FREQ_RANGE_MAX 20000
|
|
214
|
+
#define OMX_DRIVE_BAND_FREQ_RANGE_MIN 20
|
|
215
|
+
#define OMX_DRIVE_BAND_FREQ_RANGE_STEP 1
|
|
167
216
|
#define OMX_DRIVE_BIAS_MAX 0.7071067811865476f
|
|
168
217
|
#define OMX_DRIVE_BIAS_MAX_DOUBLE 0.7071067811865476
|
|
218
|
+
#define OMX_DRIVE_CHARACTER_RANGE_DEFAULT 0
|
|
219
|
+
#define OMX_DRIVE_CHARACTER_RANGE_MAX 1
|
|
220
|
+
#define OMX_DRIVE_CHARACTER_RANGE_MIN -1
|
|
221
|
+
#define OMX_DRIVE_CHARACTER_RANGE_STEP 0.01f
|
|
222
|
+
#define OMX_DRIVE_CHARACTER_RANGE_STEP_DOUBLE 0.01
|
|
223
|
+
#define OMX_DRIVE_MIX_RANGE_DEFAULT 100
|
|
224
|
+
#define OMX_DRIVE_MIX_RANGE_MAX 100
|
|
225
|
+
#define OMX_DRIVE_MIX_RANGE_MIN 0
|
|
226
|
+
#define OMX_DRIVE_MIX_RANGE_STEP 0.1f
|
|
227
|
+
#define OMX_DRIVE_MIX_RANGE_STEP_DOUBLE 0.1
|
|
228
|
+
#define OMX_DRIVE_TRIM_RANGE_DEFAULT 0
|
|
229
|
+
#define OMX_DRIVE_TRIM_RANGE_MAX 12
|
|
230
|
+
#define OMX_DRIVE_TRIM_RANGE_MIN -24
|
|
231
|
+
#define OMX_DRIVE_TRIM_RANGE_STEP 0.1f
|
|
232
|
+
#define OMX_DRIVE_TRIM_RANGE_STEP_DOUBLE 0.1
|
|
169
233
|
#define OMX_DSP_KNOB_REFERENCE_RATE 96000
|
|
234
|
+
#define OMX_EQ_FREQ_RANGE_MAX 20000
|
|
235
|
+
#define OMX_EQ_FREQ_RANGE_MIN 20
|
|
236
|
+
#define OMX_EQ_FREQ_RANGE_STEP 10
|
|
237
|
+
#define OMX_EQ_GAIN_RANGE_MAX 15
|
|
238
|
+
#define OMX_EQ_GAIN_RANGE_MIN -15
|
|
239
|
+
#define OMX_EQ_GAIN_RANGE_STEP 0.5f
|
|
240
|
+
#define OMX_EQ_GAIN_RANGE_STEP_DOUBLE 0.5
|
|
170
241
|
#define OMX_EQ_MAX_BANDS 24
|
|
242
|
+
#define OMX_EQ_NOTCH_Q_RANGE_MAX 116
|
|
243
|
+
#define OMX_EQ_NOTCH_Q_RANGE_MIN 0.3f
|
|
244
|
+
#define OMX_EQ_NOTCH_Q_RANGE_MIN_DOUBLE 0.3
|
|
245
|
+
#define OMX_EQ_NOTCH_Q_RANGE_STEP 1
|
|
246
|
+
#define OMX_EQ_Q_RANGE_MAX 8
|
|
247
|
+
#define OMX_EQ_Q_RANGE_MIN 0.3f
|
|
248
|
+
#define OMX_EQ_Q_RANGE_MIN_DOUBLE 0.3
|
|
249
|
+
#define OMX_EQ_Q_RANGE_STEP 0.1f
|
|
250
|
+
#define OMX_EQ_Q_RANGE_STEP_DOUBLE 0.1
|
|
171
251
|
#define OMX_FDELAY_MOD_READ_ORDER 3
|
|
172
252
|
#define OMX_FDELAY_READ_L1_NORM 1.25f
|
|
173
253
|
#define OMX_FDELAY_READ_L1_NORM_DOUBLE 1.25
|
|
@@ -216,6 +296,15 @@
|
|
|
216
296
|
#define OMX_GEQ_BAND_RANGE_STEP_DOUBLE 0.5
|
|
217
297
|
#define OMX_GEQ_DESIGN_GAIN_MAX_DB 30
|
|
218
298
|
#define OMX_GEQ_PROTO_DB 12
|
|
299
|
+
#define OMX_HPF_FREQ_RANGE_MAX 1000
|
|
300
|
+
#define OMX_HPF_FREQ_RANGE_MIN 20
|
|
301
|
+
#define OMX_HPF_FREQ_RANGE_STEP 10
|
|
302
|
+
#define OMX_LPF_FREQ_RANGE_MAX 20000
|
|
303
|
+
#define OMX_LPF_FREQ_RANGE_MIN 1000
|
|
304
|
+
#define OMX_LPF_FREQ_RANGE_STEP 10
|
|
305
|
+
#define OMX_PAN_RANGE_MAX 1
|
|
306
|
+
#define OMX_PAN_RANGE_MIN -1
|
|
307
|
+
#define OMX_PAN_RANGE_STEP 0
|
|
219
308
|
#define OMX_PHASER_BASE_RANGE_DEFAULT 200
|
|
220
309
|
#define OMX_PHASER_BASE_RANGE_MAX 2000
|
|
221
310
|
#define OMX_PHASER_BASE_RANGE_MIN 50
|
|
@@ -260,10 +349,58 @@
|
|
|
260
349
|
#define OMX_PROGRAM_RELEASE_PROFILES_OPTO_SHARE_DOUBLE 0.5
|
|
261
350
|
#define OMX_PROGRAM_RELEASE_PROFILES_OPTO_SLOW_MAX_MS 1100
|
|
262
351
|
#define OMX_PROGRAM_RELEASE_PROFILES_OPTO_SLOW_MIN_MS 110
|
|
352
|
+
#define OMX_REVERB_DAMPING_RANGE_DEFAULT 0.5f
|
|
353
|
+
#define OMX_REVERB_DAMPING_RANGE_DEFAULT_DOUBLE 0.5
|
|
354
|
+
#define OMX_REVERB_DAMPING_RANGE_MAX 1
|
|
355
|
+
#define OMX_REVERB_DAMPING_RANGE_MIN 0
|
|
356
|
+
#define OMX_REVERB_DAMPING_RANGE_STEP 0
|
|
357
|
+
#define OMX_REVERB_GATE_THRESHOLD_RANGE_DEFAULT -40
|
|
358
|
+
#define OMX_REVERB_GATE_THRESHOLD_RANGE_MAX 0
|
|
359
|
+
#define OMX_REVERB_GATE_THRESHOLD_RANGE_MIN -80
|
|
360
|
+
#define OMX_REVERB_GATE_THRESHOLD_RANGE_STEP 1
|
|
361
|
+
#define OMX_REVERB_HIGHCUT_RANGE_DEFAULT 20000
|
|
362
|
+
#define OMX_REVERB_HIGHCUT_RANGE_MAX 20000
|
|
363
|
+
#define OMX_REVERB_HIGHCUT_RANGE_MIN 0
|
|
364
|
+
#define OMX_REVERB_HIGHCUT_RANGE_STEP 10
|
|
365
|
+
#define OMX_REVERB_HOLD_RANGE_DEFAULT 120
|
|
366
|
+
#define OMX_REVERB_HOLD_RANGE_MAX 2000
|
|
367
|
+
#define OMX_REVERB_HOLD_RANGE_MIN 10
|
|
368
|
+
#define OMX_REVERB_HOLD_RANGE_STEP 10
|
|
369
|
+
#define OMX_REVERB_LOWCUT_RANGE_DEFAULT 0
|
|
370
|
+
#define OMX_REVERB_LOWCUT_RANGE_MAX 20000
|
|
371
|
+
#define OMX_REVERB_LOWCUT_RANGE_MIN 0
|
|
372
|
+
#define OMX_REVERB_LOWCUT_RANGE_STEP 10
|
|
373
|
+
#define OMX_REVERB_MIX_RANGE_BY_KIND_FX_RETURN 1
|
|
374
|
+
#define OMX_REVERB_MIX_RANGE_DEFAULT 0.3f
|
|
375
|
+
#define OMX_REVERB_MIX_RANGE_DEFAULT_DOUBLE 0.3
|
|
376
|
+
#define OMX_REVERB_MIX_RANGE_MAX 1
|
|
377
|
+
#define OMX_REVERB_MIX_RANGE_MIN 0
|
|
378
|
+
#define OMX_REVERB_MIX_RANGE_STEP 0
|
|
263
379
|
#define OMX_REVERB_PLATE_MOD_DEPTH_RANGE_DEFAULT 100
|
|
264
380
|
#define OMX_REVERB_PLATE_MOD_DEPTH_RANGE_MAX 400
|
|
265
381
|
#define OMX_REVERB_PLATE_MOD_DEPTH_RANGE_MIN 0
|
|
266
382
|
#define OMX_REVERB_PLATE_MOD_DEPTH_RANGE_STEP 1
|
|
383
|
+
#define OMX_REVERB_PREDELAY_RANGE_DEFAULT 0
|
|
384
|
+
#define OMX_REVERB_PREDELAY_RANGE_MAX 100
|
|
385
|
+
#define OMX_REVERB_PREDELAY_RANGE_MIN 0
|
|
386
|
+
#define OMX_REVERB_PREDELAY_RANGE_STEP 1
|
|
387
|
+
#define OMX_REVERB_RELEASE_RANGE_DEFAULT 20
|
|
388
|
+
#define OMX_REVERB_RELEASE_RANGE_MAX 500
|
|
389
|
+
#define OMX_REVERB_RELEASE_RANGE_MIN 1
|
|
390
|
+
#define OMX_REVERB_RELEASE_RANGE_STEP 1
|
|
391
|
+
#define OMX_REVERB_REVERSE_RANGE_DEFAULT 300
|
|
392
|
+
#define OMX_REVERB_REVERSE_RANGE_MAX 500
|
|
393
|
+
#define OMX_REVERB_REVERSE_RANGE_MIN 50
|
|
394
|
+
#define OMX_REVERB_REVERSE_RANGE_STEP 10
|
|
395
|
+
#define OMX_REVERB_SIZE_RANGE_DEFAULT 0.7f
|
|
396
|
+
#define OMX_REVERB_SIZE_RANGE_DEFAULT_DOUBLE 0.7
|
|
397
|
+
#define OMX_REVERB_SIZE_RANGE_MAX 1
|
|
398
|
+
#define OMX_REVERB_SIZE_RANGE_MIN 0
|
|
399
|
+
#define OMX_REVERB_SIZE_RANGE_STEP 0
|
|
400
|
+
#define OMX_REVERB_WIDTH_RANGE_DEFAULT 1
|
|
401
|
+
#define OMX_REVERB_WIDTH_RANGE_MAX 1
|
|
402
|
+
#define OMX_REVERB_WIDTH_RANGE_MIN 0
|
|
403
|
+
#define OMX_REVERB_WIDTH_RANGE_STEP 0
|
|
267
404
|
#define OMX_ROTARY_ACCEL_RANGE_DEFAULT 1
|
|
268
405
|
#define OMX_ROTARY_ACCEL_RANGE_MAX 4
|
|
269
406
|
#define OMX_ROTARY_ACCEL_RANGE_MIN 0.25f
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@openmixer/omx-contract",
|
|
3
|
-
"version": "1.1
|
|
3
|
+
"version": "1.2.1",
|
|
4
4
|
"description": "The FreeMixer declarations as data: a JSON Schema, the data, and one CLI that renders them into C, TypeScript and JSON",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "GPL-3.0-or-later",
|