@openmixer/omx-contract 2.1.0 → 2.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +17 -2
- package/data/kernels/comp.json +31 -0
- package/data/kernels/delay.json +16 -0
- package/data/kernels/drive.json +44 -0
- package/data/kernels/eq.json +105 -49
- package/data/kernels/geq.json +2 -1
- package/dist/ts/omx-contract.d.ts +84 -30
- package/dist/ts/omx-contract.js +120 -37
- package/include/omxcontract/omx_contract_limits.h +55 -0
- package/lib/data.mjs +46 -12
- package/lib/validate.mjs +37 -4
- package/package.json +1 -1
- package/schema/omx-contract.schema.json +2 -2
- package/share/omx-contract/omx-contract.json +257 -70
package/README.md
CHANGED
|
@@ -14,6 +14,9 @@ one rule that gives a fresh EQ its bands, the measurement rate sets and the bus
|
|
|
14
14
|
declared here is declared nowhere else: the EQ band budget that 1.2.0 left in openmixer is here too.
|
|
15
15
|
2.0.0 changes how a kernel file is written, not what it declares: every render is the same.
|
|
16
16
|
2.1.0 adds each kernel's ordered controls to the JSON render, and a control's `rearms` flag.
|
|
17
|
+
2.2.0 declares the controls an instance has that were missing: the delay's ping-pong, the drive's auto-gain, stereo
|
|
18
|
+
link and HF roll-off, the compressor's kind and detector oversampling, and an EQ instance's switches, slopes and
|
|
19
|
+
per-band controls (a control's `count`, a use, `of` and `when`, and a default by reference).
|
|
17
20
|
|
|
18
21
|
```
|
|
19
22
|
data/ the declaration, one file per group, edited by hand
|
|
@@ -59,6 +62,14 @@ A kernel file, `data/kernels/<kernel>.json`, holds four sections and nothing els
|
|
|
59
62
|
kernel's state, so it is not a smooth parameter (the limiter's `lookaheadMs`: omx-dsp's limiter face re-arms
|
|
60
63
|
the state and restarts the gain at unity when the look-ahead moves by a frame). It is a boolean, only on a
|
|
61
64
|
control; it is no item, so the C and TypeScript renders do not carry it.
|
|
65
|
+
- A USE is a control with a `global` and no `travel` or `ids`: it takes the item another control of the kernel
|
|
66
|
+
declares, of its kind, and adds no item (the EQ's `lpfSlope` takes FILTER_SLOPES, which `hpfSlope` declares).
|
|
67
|
+
- `count` names the item that counts a control the kernel takes once per band: a positive integer scalar
|
|
68
|
+
(`GEQ_BANDS`), or a sheet whose every variant gives its count as `max` (`EQ_BAND_COUNTS.eq8.max`).
|
|
69
|
+
- `of` and `when` mark a travel that is no control of its own but the travel the control `of` names reaches while
|
|
70
|
+
the choice `when.control` holds `when.is` (the EQ's `notchQ`: the Q's travel while the band is a notch).
|
|
71
|
+
- A choice's `default` may be `{ "ref": … }` to the scalar that states it; a boolean names the second id of a
|
|
72
|
+
two-id switch when true, the first when false (the delay's `pingpong` comes up at FX_DELAY_PINGPONG_DEFAULT).
|
|
62
73
|
- `tables`: a travels table whose fields are the controls that name it, in control order (`GATE_LIMITS`).
|
|
63
74
|
- `aggregates`: a travels table whose fields are references to controls declared once above, listed by name.
|
|
64
75
|
- `constants`: scalars, lists and sheets, as items.
|
|
@@ -93,6 +104,10 @@ the order the file declares them. A consumer reads control order and kinds here,
|
|
|
93
104
|
- `global`: the item the control's value lives in: `items[global].value` for a travel or a choice, and
|
|
94
105
|
`items[global].value[name]` for a field of a table, when `table` (the same item) is present.
|
|
95
106
|
- `rearms`: present, and `true`, only on a control that declares it.
|
|
107
|
+
- `count`: present on a control taken once per band, the item that counts it.
|
|
108
|
+
- `when`: on a control another one is `of`, the list `{ control, is, global }`: while `control` holds `is`, the
|
|
109
|
+
control's travel is `items[global]` (the EQ's `q` reaches EQ_NOTCH_Q_RANGE on a notch). A control that is `of`
|
|
110
|
+
another is not listed on its own. A use is listed like any control, its `global` the item it takes.
|
|
96
111
|
|
|
97
112
|
A kernel with no controls (fbs, mixmatrix, rta) is listed with an empty `controls`.
|
|
98
113
|
|
|
@@ -112,9 +127,9 @@ share/omx-contract` and `render --target ts --out test/golden/ts`; CI holds all
|
|
|
112
127
|
|
|
113
128
|
## Consuming it
|
|
114
129
|
|
|
115
|
-
Pin one version (`omx-contract 2.
|
|
130
|
+
Pin one version (`omx-contract 2.2.0` in `.github/pins.txt`) and build against its renders, committing
|
|
116
131
|
none: the installed `omx-contract-devel` / `libomx-contract-dev` at exactly that version
|
|
117
|
-
(`pkg-config --exact-version=2.
|
|
132
|
+
(`pkg-config --exact-version=2.2.0 omx-contract`), else the release's npm tarball, unpacked, and
|
|
118
133
|
`omx-contract render --target c --out build/omx-contract/include`. Include
|
|
119
134
|
`<omxcontract/omx_contract_limits.h>`. A plugin's parameter header is rendered by omx-plugins from its
|
|
120
135
|
declaration, by reference to the kernel travels here (since 1.1.0).
|
package/data/kernels/comp.json
CHANGED
|
@@ -91,6 +91,37 @@
|
|
|
91
91
|
"default": 100,
|
|
92
92
|
"defaultFrom": "desk"
|
|
93
93
|
}
|
|
94
|
+
},
|
|
95
|
+
{
|
|
96
|
+
"name": "kind",
|
|
97
|
+
"kind": "choice",
|
|
98
|
+
"doc": "The compressor's character, which picks its detector: `comp` runs the RMS detector, `limiter` the peak detector. The console's comp row carries it (`CompState.kind`, `COMP_KINDS`) and comes up as `comp`.",
|
|
99
|
+
"ids": [
|
|
100
|
+
"comp",
|
|
101
|
+
"limiter"
|
|
102
|
+
],
|
|
103
|
+
"default": "comp",
|
|
104
|
+
"labels": [
|
|
105
|
+
"Compressor",
|
|
106
|
+
"Limiter"
|
|
107
|
+
]
|
|
108
|
+
},
|
|
109
|
+
{
|
|
110
|
+
"name": "detectorOversampling",
|
|
111
|
+
"kind": "choice",
|
|
112
|
+
"global": "DETECTOR_OVERSAMPLINGS",
|
|
113
|
+
"doc": "The compressor's detector oversampling: `auto` runs the control path at 4x only while the attack is faster than DETECTOR_OVERSAMPLE_AUTO_MS, `off` never, `x4` always (omx-dsp's OMX_DYN_OVS_AUTO, _OFF and _X4, in that order). The console's comp row carries it as the operator's choice (`CompState.detectorOversampling`, spelled auto, off, 4x) and comes up `auto`.",
|
|
114
|
+
"ids": [
|
|
115
|
+
"auto",
|
|
116
|
+
"off",
|
|
117
|
+
"x4"
|
|
118
|
+
],
|
|
119
|
+
"default": "auto",
|
|
120
|
+
"labels": [
|
|
121
|
+
"Auto",
|
|
122
|
+
"Off",
|
|
123
|
+
"4x"
|
|
124
|
+
]
|
|
94
125
|
}
|
|
95
126
|
],
|
|
96
127
|
"tables": {
|
package/data/kernels/delay.json
CHANGED
|
@@ -63,6 +63,22 @@
|
|
|
63
63
|
"fxReturn": 1
|
|
64
64
|
}
|
|
65
65
|
}
|
|
66
|
+
},
|
|
67
|
+
{
|
|
68
|
+
"name": "pingpong",
|
|
69
|
+
"kind": "choice",
|
|
70
|
+
"doc": "The FX delay's PING-PONG switch: on cross-feeds the two legs' feedback, so each leg's repeats come from the other leg's damped tap and the echoes bounce L<->R (`omx_delay.h`'s `struct omx_fx_delay.pingpong`, read where the feedback is formed). A live control on the console's delay row (`DelayState.pingpong`) and on the omx-delay plugin. Its come-up value is FX_DELAY_PINGPONG_DEFAULT, by reference, so the default keeps one home.",
|
|
71
|
+
"ids": [
|
|
72
|
+
"off",
|
|
73
|
+
"on"
|
|
74
|
+
],
|
|
75
|
+
"default": {
|
|
76
|
+
"ref": "FX_DELAY_PINGPONG_DEFAULT"
|
|
77
|
+
},
|
|
78
|
+
"labels": [
|
|
79
|
+
"Off",
|
|
80
|
+
"On"
|
|
81
|
+
]
|
|
66
82
|
}
|
|
67
83
|
],
|
|
68
84
|
"constants": {
|
package/data/kernels/drive.json
CHANGED
|
@@ -117,6 +117,50 @@
|
|
|
117
117
|
"high",
|
|
118
118
|
"tilt"
|
|
119
119
|
]
|
|
120
|
+
},
|
|
121
|
+
{
|
|
122
|
+
"name": "autoGain",
|
|
123
|
+
"kind": "choice",
|
|
124
|
+
"doc": "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.",
|
|
125
|
+
"ids": [
|
|
126
|
+
"off",
|
|
127
|
+
"on"
|
|
128
|
+
],
|
|
129
|
+
"default": "on",
|
|
130
|
+
"labels": [
|
|
131
|
+
"Off",
|
|
132
|
+
"On"
|
|
133
|
+
]
|
|
134
|
+
},
|
|
135
|
+
{
|
|
136
|
+
"name": "stereoLink",
|
|
137
|
+
"kind": "choice",
|
|
138
|
+
"doc": "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.",
|
|
139
|
+
"ids": [
|
|
140
|
+
"off",
|
|
141
|
+
"on"
|
|
142
|
+
],
|
|
143
|
+
"default": "on",
|
|
144
|
+
"labels": [
|
|
145
|
+
"Off",
|
|
146
|
+
"On"
|
|
147
|
+
]
|
|
148
|
+
},
|
|
149
|
+
{
|
|
150
|
+
"name": "hfRolloff",
|
|
151
|
+
"kind": "choice",
|
|
152
|
+
"doc": "The drive's post-curve HIGH-FREQUENCY ROLL-OFF corner, in Hz: the id is the corner, and 0 names no roll-off (the section does not run: `omx_drive.h`'s `struct omx_drive.hf_on` is 0). The console's drive row offers off, 12000 and 16000 (`DriveState.hfRolloff`, `DRIVE_HF_ROLLOFFS`) and comes up off, as omx-dsp's drive face does.",
|
|
153
|
+
"ids": [
|
|
154
|
+
0,
|
|
155
|
+
12000,
|
|
156
|
+
16000
|
|
157
|
+
],
|
|
158
|
+
"default": 0,
|
|
159
|
+
"labels": [
|
|
160
|
+
"Off",
|
|
161
|
+
"12 kHz",
|
|
162
|
+
"16 kHz"
|
|
163
|
+
]
|
|
120
164
|
}
|
|
121
165
|
],
|
|
122
166
|
"constants": {
|
package/data/kernels/eq.json
CHANGED
|
@@ -2,48 +2,18 @@
|
|
|
2
2
|
"$schema": "../../schema/omx-contract.schema.json",
|
|
3
3
|
"controls": [
|
|
4
4
|
{
|
|
5
|
-
"name": "
|
|
6
|
-
"kind": "
|
|
7
|
-
"doc": "The
|
|
8
|
-
"
|
|
9
|
-
"
|
|
10
|
-
"
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
"kind": "travel",
|
|
18
|
-
"doc": "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.",
|
|
19
|
-
"travel": {
|
|
20
|
-
"min": -15,
|
|
21
|
-
"max": 15,
|
|
22
|
-
"step": 0.5,
|
|
23
|
-
"unit": "dB"
|
|
24
|
-
}
|
|
25
|
-
},
|
|
26
|
-
{
|
|
27
|
-
"name": "q",
|
|
28
|
-
"kind": "travel",
|
|
29
|
-
"doc": "The Q (resonance) extent of a parametric band.",
|
|
30
|
-
"travel": {
|
|
31
|
-
"min": 0.3,
|
|
32
|
-
"max": 8,
|
|
33
|
-
"step": 0.1,
|
|
34
|
-
"unit": ""
|
|
35
|
-
}
|
|
36
|
-
},
|
|
37
|
-
{
|
|
38
|
-
"name": "notchQ",
|
|
39
|
-
"kind": "travel",
|
|
40
|
-
"doc": "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.",
|
|
41
|
-
"travel": {
|
|
42
|
-
"min": 0.3,
|
|
43
|
-
"max": 116,
|
|
44
|
-
"step": 1,
|
|
45
|
-
"unit": ""
|
|
46
|
-
}
|
|
5
|
+
"name": "hpfOn",
|
|
6
|
+
"kind": "choice",
|
|
7
|
+
"doc": "The HPF's switch: off, the filter is not in the EQ's bank at all; on, its one or two Butterworth sections run after the bands. It comes up off, on the console's channel EQ and in omx-dsp's EQ face (see EQ_PASS_FILTER_DEFAULTS).",
|
|
8
|
+
"ids": [
|
|
9
|
+
"off",
|
|
10
|
+
"on"
|
|
11
|
+
],
|
|
12
|
+
"default": "off",
|
|
13
|
+
"labels": [
|
|
14
|
+
"Off",
|
|
15
|
+
"On"
|
|
16
|
+
]
|
|
47
17
|
},
|
|
48
18
|
{
|
|
49
19
|
"name": "hpfFreq",
|
|
@@ -57,6 +27,31 @@
|
|
|
57
27
|
"unit": "Hz"
|
|
58
28
|
}
|
|
59
29
|
},
|
|
30
|
+
{
|
|
31
|
+
"name": "hpfSlope",
|
|
32
|
+
"kind": "choice",
|
|
33
|
+
"global": "FILTER_SLOPES",
|
|
34
|
+
"doc": "The pass-filter slopes the EQ offers, in dB per octave: the HPF's slope, and by use the LPF's. The id is the slope: 12 is one maximally flat section, 24 the two-section Butterworth.",
|
|
35
|
+
"ids": [
|
|
36
|
+
12,
|
|
37
|
+
24
|
|
38
|
+
],
|
|
39
|
+
"default": 12
|
|
40
|
+
},
|
|
41
|
+
{
|
|
42
|
+
"name": "lpfOn",
|
|
43
|
+
"kind": "choice",
|
|
44
|
+
"doc": "The LPF's switch: off, the filter is not in the EQ's bank at all; on, its one or two Butterworth sections run after the bands and the HPF. It comes up off, on the console's channel EQ and in omx-dsp's EQ face (see EQ_PASS_FILTER_DEFAULTS).",
|
|
45
|
+
"ids": [
|
|
46
|
+
"off",
|
|
47
|
+
"on"
|
|
48
|
+
],
|
|
49
|
+
"default": "off",
|
|
50
|
+
"labels": [
|
|
51
|
+
"Off",
|
|
52
|
+
"On"
|
|
53
|
+
]
|
|
54
|
+
},
|
|
60
55
|
{
|
|
61
56
|
"name": "lpfFreq",
|
|
62
57
|
"kind": "travel",
|
|
@@ -69,6 +64,11 @@
|
|
|
69
64
|
"unit": "Hz"
|
|
70
65
|
}
|
|
71
66
|
},
|
|
67
|
+
{
|
|
68
|
+
"name": "lpfSlope",
|
|
69
|
+
"kind": "choice",
|
|
70
|
+
"global": "FILTER_SLOPES"
|
|
71
|
+
},
|
|
72
72
|
{
|
|
73
73
|
"name": "bandType",
|
|
74
74
|
"kind": "choice",
|
|
@@ -89,18 +89,74 @@
|
|
|
89
89
|
"Notch",
|
|
90
90
|
"All-pass 1st",
|
|
91
91
|
"All-pass 2nd"
|
|
92
|
-
]
|
|
92
|
+
],
|
|
93
|
+
"count": "EQ_BAND_COUNTS"
|
|
93
94
|
},
|
|
94
95
|
{
|
|
95
|
-
"name": "
|
|
96
|
+
"name": "freq",
|
|
97
|
+
"kind": "travel",
|
|
98
|
+
"doc": "The frequency band a parametric band can be dragged across.",
|
|
99
|
+
"travel": {
|
|
100
|
+
"min": 20,
|
|
101
|
+
"max": 20000,
|
|
102
|
+
"step": 10,
|
|
103
|
+
"unit": "Hz"
|
|
104
|
+
},
|
|
105
|
+
"count": "EQ_BAND_COUNTS"
|
|
106
|
+
},
|
|
107
|
+
{
|
|
108
|
+
"name": "gain",
|
|
109
|
+
"kind": "travel",
|
|
110
|
+
"doc": "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.",
|
|
111
|
+
"travel": {
|
|
112
|
+
"min": -15,
|
|
113
|
+
"max": 15,
|
|
114
|
+
"step": 0.5,
|
|
115
|
+
"unit": "dB"
|
|
116
|
+
},
|
|
117
|
+
"count": "EQ_BAND_COUNTS"
|
|
118
|
+
},
|
|
119
|
+
{
|
|
120
|
+
"name": "q",
|
|
121
|
+
"kind": "travel",
|
|
122
|
+
"doc": "The Q (resonance) extent of a parametric band.",
|
|
123
|
+
"travel": {
|
|
124
|
+
"min": 0.3,
|
|
125
|
+
"max": 8,
|
|
126
|
+
"step": 0.1,
|
|
127
|
+
"unit": ""
|
|
128
|
+
},
|
|
129
|
+
"count": "EQ_BAND_COUNTS"
|
|
130
|
+
},
|
|
131
|
+
{
|
|
132
|
+
"name": "notchQ",
|
|
133
|
+
"kind": "travel",
|
|
134
|
+
"doc": "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.",
|
|
135
|
+
"travel": {
|
|
136
|
+
"min": 0.3,
|
|
137
|
+
"max": 116,
|
|
138
|
+
"step": 1,
|
|
139
|
+
"unit": ""
|
|
140
|
+
},
|
|
141
|
+
"of": "q",
|
|
142
|
+
"when": {
|
|
143
|
+
"control": "bandType",
|
|
144
|
+
"is": "notch"
|
|
145
|
+
}
|
|
146
|
+
},
|
|
147
|
+
{
|
|
148
|
+
"name": "bandOn",
|
|
96
149
|
"kind": "choice",
|
|
97
|
-
"
|
|
98
|
-
"doc": "The pass-filter slopes the EQ offers, in dB per octave. The id is the slope: 12 is one maximally flat section, 24 the two-section Butterworth.",
|
|
150
|
+
"doc": "A band's switch. Off, the band is not in the EQ's bank (the slots close up); on, it runs, parked when it is a gain-carrying shape at 0 dB. No come-up value is declared, because the strips differ: the console's channel EQ brings its default bands up on, an omx-eq plugin brings every band up off so a racked instance is a wire.",
|
|
99
151
|
"ids": [
|
|
100
|
-
|
|
101
|
-
|
|
152
|
+
"off",
|
|
153
|
+
"on"
|
|
102
154
|
],
|
|
103
|
-
"
|
|
155
|
+
"labels": [
|
|
156
|
+
"Off",
|
|
157
|
+
"On"
|
|
158
|
+
],
|
|
159
|
+
"count": "EQ_BAND_COUNTS"
|
|
104
160
|
}
|
|
105
161
|
],
|
|
106
162
|
"constants": {
|
package/data/kernels/geq.json
CHANGED
|
@@ -242,6 +242,18 @@ export declare const COMP_LIMITS: {
|
|
|
242
242
|
};
|
|
243
243
|
};
|
|
244
244
|
|
|
245
|
+
/**
|
|
246
|
+
* The compressor's character, which picks its detector: `comp` runs the RMS detector, `limiter` the peak detector. The console's comp row carries it (`CompState.kind`, `COMP_KINDS`) and comes up as `comp`.
|
|
247
|
+
* @see data/kernels/comp.json
|
|
248
|
+
*/
|
|
249
|
+
export declare const COMP_KINDS: readonly ["comp", "limiter"];
|
|
250
|
+
|
|
251
|
+
/**
|
|
252
|
+
* The compressor's detector oversampling: `auto` runs the control path at 4x only while the attack is faster than DETECTOR_OVERSAMPLE_AUTO_MS, `off` never, `x4` always (omx-dsp's OMX_DYN_OVS_AUTO, _OFF and _X4, in that order). The console's comp row carries it as the operator's choice (`CompState.detectorOversampling`, spelled auto, off, 4x) and comes up `auto`.
|
|
253
|
+
* @see data/kernels/comp.json
|
|
254
|
+
*/
|
|
255
|
+
export declare const DETECTOR_OVERSAMPLINGS: readonly ["auto", "off", "x4"];
|
|
256
|
+
|
|
245
257
|
/**
|
|
246
258
|
* 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.
|
|
247
259
|
* @see data/kernels/comp.json
|
|
@@ -417,6 +429,12 @@ export declare const DELAY_MIX_RANGE: {
|
|
|
417
429
|
};
|
|
418
430
|
};
|
|
419
431
|
|
|
432
|
+
/**
|
|
433
|
+
* The FX delay's PING-PONG switch: on cross-feeds the two legs' feedback, so each leg's repeats come from the other leg's damped tap and the echoes bounce L<->R (`omx_delay.h`'s `struct omx_fx_delay.pingpong`, read where the feedback is formed). A live control on the console's delay row (`DelayState.pingpong`) and on the omx-delay plugin. Its come-up value is FX_DELAY_PINGPONG_DEFAULT, by reference, so the default keeps one home.
|
|
434
|
+
* @see data/kernels/delay.json
|
|
435
|
+
*/
|
|
436
|
+
export declare const DELAY_PINGPONGS: readonly ["off", "on"];
|
|
437
|
+
|
|
420
438
|
/**
|
|
421
439
|
* 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.
|
|
422
440
|
* @see data/kernels/delay.json
|
|
@@ -500,12 +518,76 @@ export declare const DRIVE_CURVES: readonly ["soft", "tape", "tube", "exciter"];
|
|
|
500
518
|
*/
|
|
501
519
|
export declare const DRIVE_BANDS: readonly ["full", "low", "high", "tilt"];
|
|
502
520
|
|
|
521
|
+
/**
|
|
522
|
+
* 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.
|
|
523
|
+
* @see data/kernels/drive.json
|
|
524
|
+
*/
|
|
525
|
+
export declare const DRIVE_AUTO_GAINS: readonly ["off", "on"];
|
|
526
|
+
|
|
527
|
+
/**
|
|
528
|
+
* 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.
|
|
529
|
+
* @see data/kernels/drive.json
|
|
530
|
+
*/
|
|
531
|
+
export declare const DRIVE_STEREO_LINKS: readonly ["off", "on"];
|
|
532
|
+
|
|
533
|
+
/**
|
|
534
|
+
* The drive's post-curve HIGH-FREQUENCY ROLL-OFF corner, in Hz: the id is the corner, and 0 names no roll-off (the section does not run: `omx_drive.h`'s `struct omx_drive.hf_on` is 0). The console's drive row offers off, 12000 and 16000 (`DriveState.hfRolloff`, `DRIVE_HF_ROLLOFFS`) and comes up off, as omx-dsp's drive face does.
|
|
535
|
+
* @see data/kernels/drive.json
|
|
536
|
+
*/
|
|
537
|
+
export declare const DRIVE_HF_ROLLOFFS: readonly [0, 12000, 16000];
|
|
538
|
+
|
|
503
539
|
/**
|
|
504
540
|
* 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.
|
|
505
541
|
* @see data/kernels/drive.json
|
|
506
542
|
*/
|
|
507
543
|
export declare const DRIVE_BIAS_MAX: 0.7071067811865476;
|
|
508
544
|
|
|
545
|
+
/**
|
|
546
|
+
* The HPF's switch: off, the filter is not in the EQ's bank at all; on, its one or two Butterworth sections run after the bands. It comes up off, on the console's channel EQ and in omx-dsp's EQ face (see EQ_PASS_FILTER_DEFAULTS).
|
|
547
|
+
* @see data/kernels/eq.json
|
|
548
|
+
*/
|
|
549
|
+
export declare const EQ_HPF_ONS: readonly ["off", "on"];
|
|
550
|
+
|
|
551
|
+
/**
|
|
552
|
+
* Where the HPF cutoff can sit (low end); mirrors the drawn low-frequency handle.
|
|
553
|
+
* @see data/kernels/eq.json
|
|
554
|
+
*/
|
|
555
|
+
export declare const HPF_FREQ_RANGE: {
|
|
556
|
+
readonly min: 20;
|
|
557
|
+
readonly max: 1000;
|
|
558
|
+
readonly step: 10;
|
|
559
|
+
readonly unit: "Hz";
|
|
560
|
+
};
|
|
561
|
+
|
|
562
|
+
/**
|
|
563
|
+
* The pass-filter slopes the EQ offers, in dB per octave: the HPF's slope, and by use the LPF's. The id is the slope: 12 is one maximally flat section, 24 the two-section Butterworth.
|
|
564
|
+
* @see data/kernels/eq.json
|
|
565
|
+
*/
|
|
566
|
+
export declare const FILTER_SLOPES: readonly [12, 24];
|
|
567
|
+
|
|
568
|
+
/**
|
|
569
|
+
* The LPF's switch: off, the filter is not in the EQ's bank at all; on, its one or two Butterworth sections run after the bands and the HPF. It comes up off, on the console's channel EQ and in omx-dsp's EQ face (see EQ_PASS_FILTER_DEFAULTS).
|
|
570
|
+
* @see data/kernels/eq.json
|
|
571
|
+
*/
|
|
572
|
+
export declare const EQ_LPF_ONS: readonly ["off", "on"];
|
|
573
|
+
|
|
574
|
+
/**
|
|
575
|
+
* Where the LPF cutoff can sit (high end).
|
|
576
|
+
* @see data/kernels/eq.json
|
|
577
|
+
*/
|
|
578
|
+
export declare const LPF_FREQ_RANGE: {
|
|
579
|
+
readonly min: 1000;
|
|
580
|
+
readonly max: 20000;
|
|
581
|
+
readonly step: 10;
|
|
582
|
+
readonly unit: "Hz";
|
|
583
|
+
};
|
|
584
|
+
|
|
585
|
+
/**
|
|
586
|
+
* The generic EQ band shapes, in the order a picker offers them and in the order of the integer a plugin host sees on a band type port. The id is the name; the position is the value. A bell is the shape a band added by the operator starts as.
|
|
587
|
+
* @see data/kernels/eq.json
|
|
588
|
+
*/
|
|
589
|
+
export declare const EQ_BAND_TYPES: readonly ["bell", "lowShelf", "highShelf", "notch", "allpass1", "allpass2"];
|
|
590
|
+
|
|
509
591
|
/**
|
|
510
592
|
* The frequency band a parametric band can be dragged across.
|
|
511
593
|
* @see data/kernels/eq.json
|
|
@@ -551,38 +633,10 @@ export declare const EQ_NOTCH_Q_RANGE: {
|
|
|
551
633
|
};
|
|
552
634
|
|
|
553
635
|
/**
|
|
554
|
-
*
|
|
636
|
+
* A band's switch. Off, the band is not in the EQ's bank (the slots close up); on, it runs, parked when it is a gain-carrying shape at 0 dB. No come-up value is declared, because the strips differ: the console's channel EQ brings its default bands up on, an omx-eq plugin brings every band up off so a racked instance is a wire.
|
|
555
637
|
* @see data/kernels/eq.json
|
|
556
638
|
*/
|
|
557
|
-
export declare const
|
|
558
|
-
readonly min: 20;
|
|
559
|
-
readonly max: 1000;
|
|
560
|
-
readonly step: 10;
|
|
561
|
-
readonly unit: "Hz";
|
|
562
|
-
};
|
|
563
|
-
|
|
564
|
-
/**
|
|
565
|
-
* Where the LPF cutoff can sit (high end).
|
|
566
|
-
* @see data/kernels/eq.json
|
|
567
|
-
*/
|
|
568
|
-
export declare const LPF_FREQ_RANGE: {
|
|
569
|
-
readonly min: 1000;
|
|
570
|
-
readonly max: 20000;
|
|
571
|
-
readonly step: 10;
|
|
572
|
-
readonly unit: "Hz";
|
|
573
|
-
};
|
|
574
|
-
|
|
575
|
-
/**
|
|
576
|
-
* The generic EQ band shapes, in the order a picker offers them and in the order of the integer a plugin host sees on a band type port. The id is the name; the position is the value. A bell is the shape a band added by the operator starts as.
|
|
577
|
-
* @see data/kernels/eq.json
|
|
578
|
-
*/
|
|
579
|
-
export declare const EQ_BAND_TYPES: readonly ["bell", "lowShelf", "highShelf", "notch", "allpass1", "allpass2"];
|
|
580
|
-
|
|
581
|
-
/**
|
|
582
|
-
* The pass-filter slopes the EQ offers, in dB per octave. The id is the slope: 12 is one maximally flat section, 24 the two-section Butterworth.
|
|
583
|
-
* @see data/kernels/eq.json
|
|
584
|
-
*/
|
|
585
|
-
export declare const FILTER_SLOPES: readonly [12, 24];
|
|
639
|
+
export declare const EQ_BAND_ONS: readonly ["off", "on"];
|
|
586
640
|
|
|
587
641
|
/**
|
|
588
642
|
* 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.
|