@openmixer/omx-contract 0.0.0 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +674 -0
- package/README.md +53 -5
- package/bin/omx-contract.mjs +175 -0
- package/data/kernels/chorus.json +15 -0
- package/data/kernels/comp.json +81 -0
- package/data/kernels/deesser.json +93 -0
- package/data/kernels/delay.json +66 -0
- package/data/kernels/drive.json +12 -0
- package/data/kernels/eq.json +59 -0
- package/data/kernels/flanger.json +51 -0
- package/data/kernels/gate.json +81 -0
- package/data/kernels/geq.json +33 -0
- package/data/kernels/limiter.json +33 -0
- package/data/kernels/phaser.json +109 -0
- package/data/kernels/pitch.json +35 -0
- package/data/kernels/reverb.json +15 -0
- package/data/kernels/rotary.json +186 -0
- package/data/kernels/transient.json +73 -0
- package/data/kernels/tremolo.json +54 -0
- package/data/primitives.json +47 -0
- package/data/rates.json +30 -0
- package/dist/ts/omx-contract.d.ts +1071 -0
- package/dist/ts/omx-contract.js +1117 -0
- package/include/omxcontract/omx_contract_limits.h +381 -0
- package/lib/data.mjs +159 -0
- package/lib/fmt.mjs +61 -0
- package/lib/semver.mjs +125 -0
- package/lib/validate.mjs +92 -0
- package/package.json +44 -4
- package/render/c/contract-limits-render.mjs +370 -0
- package/render/c/omx_plugin_param.h +25 -0
- package/render/c/params-generate.mjs +83 -0
- package/render/c.mjs +94 -0
- package/render/doors.mjs +63 -0
- package/render/json.mjs +16 -0
- package/render/ts.mjs +41 -0
- package/schema/omx-contract.schema.json +164 -0
- package/share/omx-contract/omx-contract.json +1202 -0
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "../../schema/omx-contract.schema.json",
|
|
3
|
+
"GATE_LIMITS": {
|
|
4
|
+
"kind": "travels",
|
|
5
|
+
"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).",
|
|
6
|
+
"fields": {
|
|
7
|
+
"thresholdDb": {
|
|
8
|
+
"min": -80,
|
|
9
|
+
"max": 0,
|
|
10
|
+
"step": 1,
|
|
11
|
+
"unit": "dB",
|
|
12
|
+
"default": -40,
|
|
13
|
+
"defaultFrom": "desk"
|
|
14
|
+
},
|
|
15
|
+
"rangeDb": {
|
|
16
|
+
"min": -90,
|
|
17
|
+
"max": 0,
|
|
18
|
+
"step": 1,
|
|
19
|
+
"unit": "dB",
|
|
20
|
+
"default": -90,
|
|
21
|
+
"defaultFrom": "desk"
|
|
22
|
+
},
|
|
23
|
+
"kneeStartDb": {
|
|
24
|
+
"min": -80,
|
|
25
|
+
"max": 0,
|
|
26
|
+
"step": 1,
|
|
27
|
+
"unit": "dB",
|
|
28
|
+
"default": -43,
|
|
29
|
+
"defaultFrom": "desk"
|
|
30
|
+
},
|
|
31
|
+
"kneeEndDb": {
|
|
32
|
+
"min": -80,
|
|
33
|
+
"max": 0,
|
|
34
|
+
"step": 1,
|
|
35
|
+
"unit": "dB",
|
|
36
|
+
"default": -37,
|
|
37
|
+
"defaultFrom": "desk"
|
|
38
|
+
},
|
|
39
|
+
"attackMs": {
|
|
40
|
+
"min": 0,
|
|
41
|
+
"max": 500,
|
|
42
|
+
"step": 0.5,
|
|
43
|
+
"unit": "ms",
|
|
44
|
+
"default": 1,
|
|
45
|
+
"defaultFrom": "desk"
|
|
46
|
+
},
|
|
47
|
+
"holdMs": {
|
|
48
|
+
"min": 0,
|
|
49
|
+
"max": 2000,
|
|
50
|
+
"step": 5,
|
|
51
|
+
"unit": "ms",
|
|
52
|
+
"default": 10,
|
|
53
|
+
"defaultFrom": "desk"
|
|
54
|
+
},
|
|
55
|
+
"releaseMs": {
|
|
56
|
+
"min": 0,
|
|
57
|
+
"max": 5000,
|
|
58
|
+
"step": 10,
|
|
59
|
+
"unit": "ms",
|
|
60
|
+
"default": 100,
|
|
61
|
+
"defaultFrom": "desk"
|
|
62
|
+
},
|
|
63
|
+
"hysteresisDb": {
|
|
64
|
+
"min": 0,
|
|
65
|
+
"max": 24,
|
|
66
|
+
"step": 0.5,
|
|
67
|
+
"unit": "dB",
|
|
68
|
+
"default": 3,
|
|
69
|
+
"defaultFrom": "desk"
|
|
70
|
+
},
|
|
71
|
+
"ratio": {
|
|
72
|
+
"min": 1,
|
|
73
|
+
"max": 100,
|
|
74
|
+
"step": 1,
|
|
75
|
+
"unit": "",
|
|
76
|
+
"default": 16,
|
|
77
|
+
"defaultFrom": "desk"
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "../../schema/omx-contract.schema.json",
|
|
3
|
+
"GEQ_BAND_RANGE": {
|
|
4
|
+
"kind": "travels",
|
|
5
|
+
"doc": "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).",
|
|
6
|
+
"travel": {
|
|
7
|
+
"min": -15,
|
|
8
|
+
"max": 15,
|
|
9
|
+
"step": 0.5,
|
|
10
|
+
"unit": "dB",
|
|
11
|
+
"default": 0,
|
|
12
|
+
"defaultFrom": "desk"
|
|
13
|
+
}
|
|
14
|
+
},
|
|
15
|
+
"GEQ_BAND_Q": {
|
|
16
|
+
"kind": "scalar",
|
|
17
|
+
"doc": "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).",
|
|
18
|
+
"unit": "",
|
|
19
|
+
"value": 4.3
|
|
20
|
+
},
|
|
21
|
+
"GEQ_PROTO_DB": {
|
|
22
|
+
"kind": "scalar",
|
|
23
|
+
"doc": "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.",
|
|
24
|
+
"unit": "dB",
|
|
25
|
+
"value": 12
|
|
26
|
+
},
|
|
27
|
+
"GEQ_DESIGN_GAIN_MAX_DB": {
|
|
28
|
+
"kind": "scalar",
|
|
29
|
+
"doc": "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.",
|
|
30
|
+
"unit": "dB",
|
|
31
|
+
"value": 30
|
|
32
|
+
}
|
|
33
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "../../schema/omx-contract.schema.json",
|
|
3
|
+
"LIMITER_LIMITS": {
|
|
4
|
+
"kind": "travels",
|
|
5
|
+
"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.",
|
|
6
|
+
"fields": {
|
|
7
|
+
"ceilingDb": {
|
|
8
|
+
"min": -12,
|
|
9
|
+
"max": 0,
|
|
10
|
+
"step": 0.1,
|
|
11
|
+
"unit": "dBFS",
|
|
12
|
+
"default": -1,
|
|
13
|
+
"defaultFrom": "desk"
|
|
14
|
+
},
|
|
15
|
+
"lookaheadMs": {
|
|
16
|
+
"min": 0.5,
|
|
17
|
+
"max": 5,
|
|
18
|
+
"step": 0.1,
|
|
19
|
+
"unit": "ms",
|
|
20
|
+
"default": 1.5,
|
|
21
|
+
"defaultFrom": "desk"
|
|
22
|
+
},
|
|
23
|
+
"releaseMs": {
|
|
24
|
+
"min": 1,
|
|
25
|
+
"max": 1000,
|
|
26
|
+
"step": 1,
|
|
27
|
+
"unit": "ms",
|
|
28
|
+
"default": 50,
|
|
29
|
+
"defaultFrom": "desk"
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "../../schema/omx-contract.schema.json",
|
|
3
|
+
"PHASER_RATE_RANGE": {
|
|
4
|
+
"kind": "travels",
|
|
5
|
+
"doc": "The phaser's sweep speed (§3). `omx_lfo_inc` freezes at Nyquist; this travel stays far below.",
|
|
6
|
+
"travel": {
|
|
7
|
+
"min": 0.05,
|
|
8
|
+
"max": 5,
|
|
9
|
+
"step": 0.01,
|
|
10
|
+
"unit": "Hz",
|
|
11
|
+
"default": 0.5,
|
|
12
|
+
"defaultFrom": "desk"
|
|
13
|
+
}
|
|
14
|
+
},
|
|
15
|
+
"PHASER_BASE_RANGE": {
|
|
16
|
+
"kind": "travels",
|
|
17
|
+
"doc": "The phaser's lowest centre frequency; the sweep runs upward from it (§3).",
|
|
18
|
+
"travel": {
|
|
19
|
+
"min": 50,
|
|
20
|
+
"max": 2000,
|
|
21
|
+
"step": 1,
|
|
22
|
+
"unit": "Hz",
|
|
23
|
+
"default": 200,
|
|
24
|
+
"defaultFrom": "desk"
|
|
25
|
+
}
|
|
26
|
+
},
|
|
27
|
+
"PHASER_DEPTH_RANGE": {
|
|
28
|
+
"kind": "travels",
|
|
29
|
+
"doc": "The sweep's span above `base`, in octaves; 0 is a static phaser at `base` (§3).",
|
|
30
|
+
"travel": {
|
|
31
|
+
"min": 0,
|
|
32
|
+
"max": 6,
|
|
33
|
+
"step": 0.1,
|
|
34
|
+
"unit": "oct",
|
|
35
|
+
"default": 4,
|
|
36
|
+
"defaultFrom": "desk"
|
|
37
|
+
}
|
|
38
|
+
},
|
|
39
|
+
"PHASER_STAGES_RANGE": {
|
|
40
|
+
"kind": "travels",
|
|
41
|
+
"doc": "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.",
|
|
42
|
+
"travel": {
|
|
43
|
+
"min": 2,
|
|
44
|
+
"max": 12,
|
|
45
|
+
"step": 2,
|
|
46
|
+
"unit": "",
|
|
47
|
+
"default": 6,
|
|
48
|
+
"defaultFrom": "desk"
|
|
49
|
+
}
|
|
50
|
+
},
|
|
51
|
+
"PHASER_STAGE_COUNTS": {
|
|
52
|
+
"kind": "list",
|
|
53
|
+
"doc": "The member set the `stages` field accepts: PHASER_STAGES_RANGE walked by its step.",
|
|
54
|
+
"unit": "",
|
|
55
|
+
"values": [
|
|
56
|
+
2,
|
|
57
|
+
4,
|
|
58
|
+
6,
|
|
59
|
+
8,
|
|
60
|
+
10,
|
|
61
|
+
12
|
|
62
|
+
]
|
|
63
|
+
},
|
|
64
|
+
"PHASER_FEEDBACK_RANGE": {
|
|
65
|
+
"kind": "travels",
|
|
66
|
+
"doc": "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.",
|
|
67
|
+
"travel": {
|
|
68
|
+
"min": -0.9,
|
|
69
|
+
"max": 0.9,
|
|
70
|
+
"step": 0.01,
|
|
71
|
+
"unit": "",
|
|
72
|
+
"default": 0.4,
|
|
73
|
+
"defaultFrom": "desk"
|
|
74
|
+
}
|
|
75
|
+
},
|
|
76
|
+
"PHASER_MIX_RANGE": {
|
|
77
|
+
"kind": "travels",
|
|
78
|
+
"doc": "The phaser's wet/dry, as an instance of DRIVE_MIX_RANGE: 50 %, where the notch is complete (§3).",
|
|
79
|
+
"travel": {
|
|
80
|
+
"min": 0,
|
|
81
|
+
"max": 100,
|
|
82
|
+
"step": 0.1,
|
|
83
|
+
"unit": "%",
|
|
84
|
+
"default": 50,
|
|
85
|
+
"defaultFrom": "desk"
|
|
86
|
+
}
|
|
87
|
+
},
|
|
88
|
+
"PHASER_TRAVELS": {
|
|
89
|
+
"kind": "travels",
|
|
90
|
+
"doc": "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.",
|
|
91
|
+
"fields": {
|
|
92
|
+
"rateHz": {
|
|
93
|
+
"ref": "PHASER_RATE_RANGE"
|
|
94
|
+
},
|
|
95
|
+
"baseHz": {
|
|
96
|
+
"ref": "PHASER_BASE_RANGE"
|
|
97
|
+
},
|
|
98
|
+
"depthOct": {
|
|
99
|
+
"ref": "PHASER_DEPTH_RANGE"
|
|
100
|
+
},
|
|
101
|
+
"feedback": {
|
|
102
|
+
"ref": "PHASER_FEEDBACK_RANGE"
|
|
103
|
+
},
|
|
104
|
+
"mix": {
|
|
105
|
+
"ref": "PHASER_MIX_RANGE"
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "../../schema/omx-contract.schema.json",
|
|
3
|
+
"PITCH_LIMITS": {
|
|
4
|
+
"kind": "travels",
|
|
5
|
+
"doc": "PITCH_LIMITS, moved from openmixer.",
|
|
6
|
+
"fields": {
|
|
7
|
+
"semitones": {
|
|
8
|
+
"min": -12,
|
|
9
|
+
"max": 12,
|
|
10
|
+
"default": 0
|
|
11
|
+
},
|
|
12
|
+
"cents": {
|
|
13
|
+
"min": -50,
|
|
14
|
+
"max": 50,
|
|
15
|
+
"default": 0
|
|
16
|
+
},
|
|
17
|
+
"mix": {
|
|
18
|
+
"min": 0,
|
|
19
|
+
"max": 100,
|
|
20
|
+
"default": 100
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
},
|
|
24
|
+
"PITCH_KERNEL": {
|
|
25
|
+
"kind": "sheet",
|
|
26
|
+
"doc": "PITCH_KERNEL, moved from openmixer.",
|
|
27
|
+
"value": {
|
|
28
|
+
"windowMs": 40,
|
|
29
|
+
"prefilterCeilingHz": 20000,
|
|
30
|
+
"prefilterQ": {
|
|
31
|
+
"ref": "BUTTERWORTH_Q"
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "../../schema/omx-contract.schema.json",
|
|
3
|
+
"REVERB_PLATE_MOD_DEPTH_RANGE": {
|
|
4
|
+
"kind": "travels",
|
|
5
|
+
"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).",
|
|
6
|
+
"travel": {
|
|
7
|
+
"min": 0,
|
|
8
|
+
"max": 400,
|
|
9
|
+
"step": 1,
|
|
10
|
+
"unit": "%",
|
|
11
|
+
"default": 100,
|
|
12
|
+
"defaultFrom": "desk"
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
}
|
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "../../schema/omx-contract.schema.json",
|
|
3
|
+
"ROTARY_HORN_SLOW_RANGE": {
|
|
4
|
+
"kind": "travels",
|
|
5
|
+
"doc": "The horn's chorale (slow) rate, Hz.",
|
|
6
|
+
"travel": {
|
|
7
|
+
"min": 0.1,
|
|
8
|
+
"max": 2,
|
|
9
|
+
"step": 0.01,
|
|
10
|
+
"unit": "Hz",
|
|
11
|
+
"default": 0.8,
|
|
12
|
+
"defaultFrom": "desk"
|
|
13
|
+
}
|
|
14
|
+
},
|
|
15
|
+
"ROTARY_HORN_FAST_RANGE": {
|
|
16
|
+
"kind": "travels",
|
|
17
|
+
"doc": "The horn's tremolo (fast) rate, Hz.",
|
|
18
|
+
"travel": {
|
|
19
|
+
"min": 3,
|
|
20
|
+
"max": 10,
|
|
21
|
+
"step": 0.01,
|
|
22
|
+
"unit": "Hz",
|
|
23
|
+
"default": 6.8,
|
|
24
|
+
"defaultFrom": "desk"
|
|
25
|
+
}
|
|
26
|
+
},
|
|
27
|
+
"ROTARY_DRUM_SLOW_RANGE": {
|
|
28
|
+
"kind": "travels",
|
|
29
|
+
"doc": "The drum's chorale (slow) rate, Hz.",
|
|
30
|
+
"travel": {
|
|
31
|
+
"min": 0.1,
|
|
32
|
+
"max": 2,
|
|
33
|
+
"step": 0.01,
|
|
34
|
+
"unit": "Hz",
|
|
35
|
+
"default": 0.7,
|
|
36
|
+
"defaultFrom": "desk"
|
|
37
|
+
}
|
|
38
|
+
},
|
|
39
|
+
"ROTARY_DRUM_FAST_RANGE": {
|
|
40
|
+
"kind": "travels",
|
|
41
|
+
"doc": "The drum's tremolo (fast) rate, Hz.",
|
|
42
|
+
"travel": {
|
|
43
|
+
"min": 3,
|
|
44
|
+
"max": 10,
|
|
45
|
+
"step": 0.01,
|
|
46
|
+
"unit": "Hz",
|
|
47
|
+
"default": 5.9,
|
|
48
|
+
"defaultFrom": "desk"
|
|
49
|
+
}
|
|
50
|
+
},
|
|
51
|
+
"ROTARY_ACCEL_RANGE": {
|
|
52
|
+
"kind": "travels",
|
|
53
|
+
"doc": "The scale on every speed-change time constant (`ROTARY_*_ACCEL_MS`/`_DECEL_MS`): 2 is twice as slow.",
|
|
54
|
+
"travel": {
|
|
55
|
+
"min": 0.25,
|
|
56
|
+
"max": 4,
|
|
57
|
+
"step": 0.01,
|
|
58
|
+
"unit": "x",
|
|
59
|
+
"default": 1,
|
|
60
|
+
"defaultFrom": "desk"
|
|
61
|
+
}
|
|
62
|
+
},
|
|
63
|
+
"ROTARY_BALANCE_RANGE": {
|
|
64
|
+
"kind": "travels",
|
|
65
|
+
"doc": "The drum/horn balance, percent: −100 drum only, +100 horn only; the law attenuates, never boosts.",
|
|
66
|
+
"travel": {
|
|
67
|
+
"min": -100,
|
|
68
|
+
"max": 100,
|
|
69
|
+
"step": 1,
|
|
70
|
+
"unit": "%",
|
|
71
|
+
"default": 0,
|
|
72
|
+
"defaultFrom": "desk"
|
|
73
|
+
}
|
|
74
|
+
},
|
|
75
|
+
"ROTARY_MIX_RANGE": {
|
|
76
|
+
"kind": "travels",
|
|
77
|
+
"doc": "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).",
|
|
78
|
+
"travel": {
|
|
79
|
+
"min": 0,
|
|
80
|
+
"max": 100,
|
|
81
|
+
"step": 0.1,
|
|
82
|
+
"unit": "%",
|
|
83
|
+
"default": 100,
|
|
84
|
+
"defaultFrom": "desk"
|
|
85
|
+
}
|
|
86
|
+
},
|
|
87
|
+
"ROTARY_TRAVELS": {
|
|
88
|
+
"kind": "travels",
|
|
89
|
+
"doc": "The rotary's numeric travels, field → declaration: the ONE map the row's state, its bounds, its OPTIONS and its controller read (`speed` is a member set, ROTARY_SPEEDS, beside it).",
|
|
90
|
+
"fields": {
|
|
91
|
+
"hornSlowHz": {
|
|
92
|
+
"ref": "ROTARY_HORN_SLOW_RANGE"
|
|
93
|
+
},
|
|
94
|
+
"hornFastHz": {
|
|
95
|
+
"ref": "ROTARY_HORN_FAST_RANGE"
|
|
96
|
+
},
|
|
97
|
+
"drumSlowHz": {
|
|
98
|
+
"ref": "ROTARY_DRUM_SLOW_RANGE"
|
|
99
|
+
},
|
|
100
|
+
"drumFastHz": {
|
|
101
|
+
"ref": "ROTARY_DRUM_FAST_RANGE"
|
|
102
|
+
},
|
|
103
|
+
"accel": {
|
|
104
|
+
"ref": "ROTARY_ACCEL_RANGE"
|
|
105
|
+
},
|
|
106
|
+
"balance": {
|
|
107
|
+
"ref": "ROTARY_BALANCE_RANGE"
|
|
108
|
+
},
|
|
109
|
+
"mix": {
|
|
110
|
+
"ref": "ROTARY_MIX_RANGE"
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
},
|
|
114
|
+
"ROTARY_CROSSOVER_HZ": {
|
|
115
|
+
"kind": "scalar",
|
|
116
|
+
"doc": "The complementary split's low-pass corner, Hz: the Leslie 122's passive crossover.",
|
|
117
|
+
"unit": "Hz",
|
|
118
|
+
"value": 800
|
|
119
|
+
},
|
|
120
|
+
"ROTARY_BASE_MS": {
|
|
121
|
+
"kind": "scalar",
|
|
122
|
+
"doc": "The shortest Doppler read, ms — above the order-3 read's one-sample reach at every rate.",
|
|
123
|
+
"unit": "ms",
|
|
124
|
+
"value": 0.1
|
|
125
|
+
},
|
|
126
|
+
"ROTARY_HORN_DOPPLER_MS": {
|
|
127
|
+
"kind": "scalar",
|
|
128
|
+
"doc": "The horn's Doppler excursion `D_horn`, ms: a 0.15 m radius over 343 m/s.",
|
|
129
|
+
"unit": "ms",
|
|
130
|
+
"value": 0.44
|
|
131
|
+
},
|
|
132
|
+
"ROTARY_DRUM_DOPPLER_MS": {
|
|
133
|
+
"kind": "scalar",
|
|
134
|
+
"doc": "The drum's Doppler excursion `D_drum`, ms: its baffle turns over a fixed woofer.",
|
|
135
|
+
"unit": "ms",
|
|
136
|
+
"value": 0.29
|
|
137
|
+
},
|
|
138
|
+
"ROTARY_HORN_AM": {
|
|
139
|
+
"kind": "scalar",
|
|
140
|
+
"doc": "The horn's amplitude swing `m_horn` (a −6 dB directivity dip), a ratio.",
|
|
141
|
+
"unit": "",
|
|
142
|
+
"value": 0.5
|
|
143
|
+
},
|
|
144
|
+
"ROTARY_DRUM_AM": {
|
|
145
|
+
"kind": "scalar",
|
|
146
|
+
"doc": "The drum baffle's amplitude swing `m_drum`, a ratio.",
|
|
147
|
+
"unit": "",
|
|
148
|
+
"value": 0.3
|
|
149
|
+
},
|
|
150
|
+
"ROTARY_HORN_ACCEL_MS": {
|
|
151
|
+
"kind": "scalar",
|
|
152
|
+
"doc": "The horn rotor's speed-up time constant, ms (at `accel` 1).",
|
|
153
|
+
"unit": "ms",
|
|
154
|
+
"value": 330
|
|
155
|
+
},
|
|
156
|
+
"ROTARY_HORN_DECEL_MS": {
|
|
157
|
+
"kind": "scalar",
|
|
158
|
+
"doc": "The horn rotor's slow-down time constant, ms (at `accel` 1).",
|
|
159
|
+
"unit": "ms",
|
|
160
|
+
"value": 500
|
|
161
|
+
},
|
|
162
|
+
"ROTARY_DRUM_ACCEL_MS": {
|
|
163
|
+
"kind": "scalar",
|
|
164
|
+
"doc": "The drum rotor's speed-up time constant, ms (at `accel` 1).",
|
|
165
|
+
"unit": "ms",
|
|
166
|
+
"value": 1700
|
|
167
|
+
},
|
|
168
|
+
"ROTARY_DRUM_DECEL_MS": {
|
|
169
|
+
"kind": "scalar",
|
|
170
|
+
"doc": "The drum rotor's slow-down time constant, ms (at `accel` 1).",
|
|
171
|
+
"unit": "ms",
|
|
172
|
+
"value": 1800
|
|
173
|
+
},
|
|
174
|
+
"ROTARY_STOP_EPS": {
|
|
175
|
+
"kind": "scalar",
|
|
176
|
+
"doc": "Below this rate, Hz, a rotor coasting toward `stop` is snapped to exactly 0.",
|
|
177
|
+
"unit": "",
|
|
178
|
+
"value": 0.0001
|
|
179
|
+
},
|
|
180
|
+
"ROTARY_RING_FLOATS": {
|
|
181
|
+
"kind": "scalar",
|
|
182
|
+
"doc": "One inline ring per rotor per leg, floats — at least the 192 kHz need of the horn's sweep.",
|
|
183
|
+
"unit": "",
|
|
184
|
+
"value": 256
|
|
185
|
+
}
|
|
186
|
+
}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "../../schema/omx-contract.schema.json",
|
|
3
|
+
"TRANSIENT_LIMITS": {
|
|
4
|
+
"kind": "travels",
|
|
5
|
+
"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).",
|
|
6
|
+
"fields": {
|
|
7
|
+
"attackDb": {
|
|
8
|
+
"min": -24,
|
|
9
|
+
"max": 24,
|
|
10
|
+
"step": 0.1,
|
|
11
|
+
"unit": "dB",
|
|
12
|
+
"default": 0,
|
|
13
|
+
"defaultFrom": "desk"
|
|
14
|
+
},
|
|
15
|
+
"sustainDb": {
|
|
16
|
+
"min": -24,
|
|
17
|
+
"max": 24,
|
|
18
|
+
"step": 0.1,
|
|
19
|
+
"unit": "dB",
|
|
20
|
+
"default": 0,
|
|
21
|
+
"defaultFrom": "desk"
|
|
22
|
+
},
|
|
23
|
+
"attackTimeMs": {
|
|
24
|
+
"min": 2,
|
|
25
|
+
"max": 50,
|
|
26
|
+
"step": 0.1,
|
|
27
|
+
"unit": "ms",
|
|
28
|
+
"default": 10,
|
|
29
|
+
"defaultFrom": "desk"
|
|
30
|
+
},
|
|
31
|
+
"sustainTimeMs": {
|
|
32
|
+
"min": 50,
|
|
33
|
+
"max": 2000,
|
|
34
|
+
"step": 1,
|
|
35
|
+
"unit": "ms",
|
|
36
|
+
"default": 250,
|
|
37
|
+
"defaultFrom": "desk"
|
|
38
|
+
},
|
|
39
|
+
"outputDb": {
|
|
40
|
+
"min": -24,
|
|
41
|
+
"max": 12,
|
|
42
|
+
"step": 0.1,
|
|
43
|
+
"unit": "dB",
|
|
44
|
+
"default": 0,
|
|
45
|
+
"defaultFrom": "desk"
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
},
|
|
49
|
+
"TRANSIENT_FAST_ATTACK_MS": {
|
|
50
|
+
"kind": "scalar",
|
|
51
|
+
"doc": "The fast follower's attack, ms: exactly the dynamics detector's no-oversampling line (transient spec §3, L7).",
|
|
52
|
+
"unit": "ms",
|
|
53
|
+
"value": 0.5
|
|
54
|
+
},
|
|
55
|
+
"TRANSIENT_FAST_RELEASE_MS": {
|
|
56
|
+
"kind": "scalar",
|
|
57
|
+
"doc": "The fast follower's release, ms: one 50 Hz cycle held, a 180 bpm sixteenth forgotten (transient spec §3).",
|
|
58
|
+
"unit": "ms",
|
|
59
|
+
"value": 20
|
|
60
|
+
},
|
|
61
|
+
"TRANSIENT_REF_DB": {
|
|
62
|
+
"kind": "scalar",
|
|
63
|
+
"doc": "The contrast, dB, at which a knob reaches its full value (transient spec §2, §3).",
|
|
64
|
+
"unit": "dB",
|
|
65
|
+
"value": 6
|
|
66
|
+
},
|
|
67
|
+
"TRANSIENT_FLOOR_LIN": {
|
|
68
|
+
"kind": "scalar",
|
|
69
|
+
"doc": "The detector floor, linear (−100 dBFS): below it both envelopes read the floor and the stage is unity (transient spec §3).",
|
|
70
|
+
"unit": "",
|
|
71
|
+
"value": 0.00001
|
|
72
|
+
}
|
|
73
|
+
}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "../../schema/omx-contract.schema.json",
|
|
3
|
+
"TREMOLO_RATE_RANGE": {
|
|
4
|
+
"kind": "travels",
|
|
5
|
+
"doc": "The tremolo's LFO rate (the catalogue row's 0.1..20 Hz); 4 Hz is the classic amp tremolo.",
|
|
6
|
+
"travel": {
|
|
7
|
+
"min": 0.1,
|
|
8
|
+
"max": 20,
|
|
9
|
+
"step": 0.01,
|
|
10
|
+
"unit": "Hz",
|
|
11
|
+
"default": 4,
|
|
12
|
+
"defaultFrom": "desk"
|
|
13
|
+
}
|
|
14
|
+
},
|
|
15
|
+
"TREMOLO_DEPTH_RANGE": {
|
|
16
|
+
"kind": "travels",
|
|
17
|
+
"doc": "The tremolo's modulation depth: the gain's trough is `1 − mix·depth`.",
|
|
18
|
+
"travel": {
|
|
19
|
+
"min": 0,
|
|
20
|
+
"max": 100,
|
|
21
|
+
"step": 0.1,
|
|
22
|
+
"unit": "%",
|
|
23
|
+
"default": 50,
|
|
24
|
+
"defaultFrom": "desk"
|
|
25
|
+
}
|
|
26
|
+
},
|
|
27
|
+
"TREMOLO_MIX_RANGE": {
|
|
28
|
+
"kind": "travels",
|
|
29
|
+
"doc": "The tremolo's wet/dry, as an instance of DRIVE_MIX_RANGE: 100 %. The kernel folds the wet/dry into its one gain, so a strip tremolo IS the sound (as the rotary's mix 100 % is).",
|
|
30
|
+
"travel": {
|
|
31
|
+
"min": 0,
|
|
32
|
+
"max": 100,
|
|
33
|
+
"step": 0.1,
|
|
34
|
+
"unit": "%",
|
|
35
|
+
"default": 100,
|
|
36
|
+
"defaultFrom": "desk"
|
|
37
|
+
}
|
|
38
|
+
},
|
|
39
|
+
"TREMOLO_TRAVELS": {
|
|
40
|
+
"kind": "travels",
|
|
41
|
+
"doc": "The tremolo's numeric travels, field → declaration: the ONE map the row's state, its bounds, its OPTIONS and its controller read (`mode` is a member set, TREMOLO_MODES, beside it).",
|
|
42
|
+
"fields": {
|
|
43
|
+
"rateHz": {
|
|
44
|
+
"ref": "TREMOLO_RATE_RANGE"
|
|
45
|
+
},
|
|
46
|
+
"depth": {
|
|
47
|
+
"ref": "TREMOLO_DEPTH_RANGE"
|
|
48
|
+
},
|
|
49
|
+
"mix": {
|
|
50
|
+
"ref": "TREMOLO_MIX_RANGE"
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "../schema/omx-contract.schema.json",
|
|
3
|
+
"BUTTERWORTH_Q": {
|
|
4
|
+
"kind": "scalar",
|
|
5
|
+
"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).",
|
|
6
|
+
"unit": "",
|
|
7
|
+
"value": {
|
|
8
|
+
"derive": "sqrt",
|
|
9
|
+
"of": 0.5
|
|
10
|
+
}
|
|
11
|
+
},
|
|
12
|
+
"ALLPASS_LIMITS": {
|
|
13
|
+
"kind": "sheet",
|
|
14
|
+
"doc": "ALLPASS_LIMITS, moved from openmixer.",
|
|
15
|
+
"value": {
|
|
16
|
+
"unityTolerance": 0.0001
|
|
17
|
+
}
|
|
18
|
+
},
|
|
19
|
+
"XOVER_LIMITS": {
|
|
20
|
+
"kind": "sheet",
|
|
21
|
+
"doc": "XOVER_LIMITS, moved from openmixer.",
|
|
22
|
+
"value": {
|
|
23
|
+
"lr2SectionQ": 0.5,
|
|
24
|
+
"lr4SectionQ": {
|
|
25
|
+
"ref": "BUTTERWORTH_Q"
|
|
26
|
+
},
|
|
27
|
+
"partitionTolerance": 0.00001
|
|
28
|
+
}
|
|
29
|
+
},
|
|
30
|
+
"FDELAY_MOD_READ_ORDER": {
|
|
31
|
+
"kind": "scalar",
|
|
32
|
+
"doc": "The order the chorus and flanger construct their lines with (four taps; the fdelay spec §1).",
|
|
33
|
+
"unit": "",
|
|
34
|
+
"value": 3
|
|
35
|
+
},
|
|
36
|
+
"FDELAY_READ_L1_NORM": {
|
|
37
|
+
"kind": "scalar",
|
|
38
|
+
"doc": "`Λ` for the chorus/flanger read — ONE value; the header and every law read this.",
|
|
39
|
+
"unit": "",
|
|
40
|
+
"value": {
|
|
41
|
+
"derive": "lagrangeReadL1",
|
|
42
|
+
"order": {
|
|
43
|
+
"ref": "FDELAY_MOD_READ_ORDER"
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
}
|