@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.
- package/LICENSE +674 -0
- package/README.md +50 -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/delay.json +66 -0
- package/data/kernels/drive.json +12 -0
- package/data/kernels/eq.json +59 -0
- package/data/kernels/gate.json +81 -0
- package/data/kernels/limiter.json +33 -0
- package/data/kernels/pitch.json +35 -0
- package/data/kernels/reverb.json +15 -0
- package/data/kernels/transient.json +73 -0
- package/data/plugins/delay.json +48 -0
- package/data/primitives.json +47 -0
- package/data/rates.json +30 -0
- package/dist/ts/omx-contract.d.ts +517 -0
- package/dist/ts/omx-contract.js +562 -0
- package/include/omxcontract/omx_contract_limits.h +201 -0
- package/include/omxcontract/params/omx_delay_params.h +47 -0
- package/include/omxcontract/params/omx_plugin_param.h +25 -0
- package/lib/data.mjs +182 -0
- package/lib/fmt.mjs +63 -0
- package/lib/semver.mjs +124 -0
- package/lib/validate.mjs +107 -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 +104 -0
- package/render/doors.mjs +64 -0
- package/render/json.mjs +16 -0
- package/render/ts.mjs +42 -0
- package/schema/omx-contract.schema.json +194 -0
- package/share/omx-contract/omx-contract.json +597 -0
|
@@ -0,0 +1,517 @@
|
|
|
1
|
+
// SPDX-License-Identifier: GPL-3.0-or-later
|
|
2
|
+
// Copyright (C) 2026 Pau Aliagas <linuxnow@gmail.com>
|
|
3
|
+
// GENERATED by `omx-contract render --target ts` from FreeMixer/omx-contract's data/ — do not edit.
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* 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
|
+
* @see data/kernels/chorus.json
|
|
8
|
+
*/
|
|
9
|
+
export declare const CHORUS_SPREAD_RANGE: {
|
|
10
|
+
readonly min: 0;
|
|
11
|
+
readonly max: 0.5;
|
|
12
|
+
readonly step: 0.01;
|
|
13
|
+
readonly unit: "";
|
|
14
|
+
readonly default: 0;
|
|
15
|
+
readonly defaultFrom: "desk";
|
|
16
|
+
};
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* 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
|
+
* @see data/kernels/comp.json
|
|
21
|
+
*/
|
|
22
|
+
export declare const COMP_LIMITS: {
|
|
23
|
+
readonly thresholdDb: {
|
|
24
|
+
readonly min: -60;
|
|
25
|
+
readonly max: 0;
|
|
26
|
+
readonly step: 1;
|
|
27
|
+
readonly unit: "dB";
|
|
28
|
+
readonly default: -18;
|
|
29
|
+
readonly defaultFrom: "desk";
|
|
30
|
+
};
|
|
31
|
+
readonly ratio: {
|
|
32
|
+
readonly min: 1;
|
|
33
|
+
readonly max: 20;
|
|
34
|
+
readonly step: 0.5;
|
|
35
|
+
readonly unit: "";
|
|
36
|
+
readonly default: 4;
|
|
37
|
+
readonly defaultFrom: "desk";
|
|
38
|
+
};
|
|
39
|
+
readonly kneeDb: {
|
|
40
|
+
readonly min: 0;
|
|
41
|
+
readonly max: 24;
|
|
42
|
+
readonly step: 0.5;
|
|
43
|
+
readonly unit: "dB";
|
|
44
|
+
readonly default: 6;
|
|
45
|
+
readonly defaultFrom: "desk";
|
|
46
|
+
};
|
|
47
|
+
readonly attackMs: {
|
|
48
|
+
readonly min: 0.1;
|
|
49
|
+
readonly max: 100;
|
|
50
|
+
readonly step: 1;
|
|
51
|
+
readonly unit: "ms";
|
|
52
|
+
readonly default: 5;
|
|
53
|
+
readonly defaultFrom: "desk";
|
|
54
|
+
};
|
|
55
|
+
readonly releaseMs: {
|
|
56
|
+
readonly min: 5;
|
|
57
|
+
readonly max: 3000;
|
|
58
|
+
readonly step: 10;
|
|
59
|
+
readonly unit: "ms";
|
|
60
|
+
readonly default: 200;
|
|
61
|
+
readonly defaultFrom: "desk";
|
|
62
|
+
};
|
|
63
|
+
readonly makeupDb: {
|
|
64
|
+
readonly min: 0;
|
|
65
|
+
readonly max: 24;
|
|
66
|
+
readonly step: 0.5;
|
|
67
|
+
readonly unit: "dB";
|
|
68
|
+
readonly default: 0;
|
|
69
|
+
readonly defaultFrom: "desk";
|
|
70
|
+
};
|
|
71
|
+
readonly mixPct: {
|
|
72
|
+
readonly min: 0;
|
|
73
|
+
readonly max: 100;
|
|
74
|
+
readonly step: 5;
|
|
75
|
+
readonly unit: "%";
|
|
76
|
+
readonly default: 100;
|
|
77
|
+
readonly defaultFrom: "desk";
|
|
78
|
+
};
|
|
79
|
+
};
|
|
80
|
+
|
|
81
|
+
/**
|
|
82
|
+
* 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.
|
|
83
|
+
* @see data/kernels/comp.json
|
|
84
|
+
*/
|
|
85
|
+
export declare const PROGRAM_RELEASE: {
|
|
86
|
+
readonly chargeMs: 1000;
|
|
87
|
+
readonly dischargeMs: 5000;
|
|
88
|
+
readonly profiles: {
|
|
89
|
+
readonly opto: {
|
|
90
|
+
readonly fastMs: 70;
|
|
91
|
+
readonly slowMinMs: 110;
|
|
92
|
+
readonly slowMaxMs: 1100;
|
|
93
|
+
readonly share: 0.5;
|
|
94
|
+
};
|
|
95
|
+
};
|
|
96
|
+
};
|
|
97
|
+
|
|
98
|
+
/**
|
|
99
|
+
* 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.
|
|
100
|
+
* @see data/kernels/delay.json
|
|
101
|
+
*/
|
|
102
|
+
export declare const FX_DELAY_TIME_RANGE: {
|
|
103
|
+
readonly min: 0;
|
|
104
|
+
readonly max: 2000;
|
|
105
|
+
readonly step: 1;
|
|
106
|
+
readonly unit: "ms";
|
|
107
|
+
readonly default: 300;
|
|
108
|
+
readonly defaultFrom: "desk";
|
|
109
|
+
};
|
|
110
|
+
|
|
111
|
+
/**
|
|
112
|
+
* 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.
|
|
113
|
+
* @see data/kernels/delay.json
|
|
114
|
+
*/
|
|
115
|
+
export declare const FX_DELAY_FEEDBACK_RANGE: {
|
|
116
|
+
readonly min: 0;
|
|
117
|
+
readonly max: 0.99;
|
|
118
|
+
readonly step: 0;
|
|
119
|
+
readonly unit: "";
|
|
120
|
+
readonly default: 0.3;
|
|
121
|
+
readonly defaultFrom: "desk";
|
|
122
|
+
};
|
|
123
|
+
|
|
124
|
+
/**
|
|
125
|
+
* 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.
|
|
126
|
+
* @see data/kernels/delay.json
|
|
127
|
+
*/
|
|
128
|
+
export declare const DELAY_TONE_RANGE: {
|
|
129
|
+
readonly min: 0;
|
|
130
|
+
readonly max: 1;
|
|
131
|
+
readonly step: 0;
|
|
132
|
+
readonly unit: "";
|
|
133
|
+
readonly default: 0.3;
|
|
134
|
+
readonly defaultFrom: "desk";
|
|
135
|
+
};
|
|
136
|
+
|
|
137
|
+
/**
|
|
138
|
+
* The FX DELAY's wet/dry — the same split as REVERB_MIX_RANGE, its own declaration.
|
|
139
|
+
* @see data/kernels/delay.json
|
|
140
|
+
*/
|
|
141
|
+
export declare const DELAY_MIX_RANGE: {
|
|
142
|
+
readonly min: 0;
|
|
143
|
+
readonly max: 1;
|
|
144
|
+
readonly step: 0;
|
|
145
|
+
readonly unit: "";
|
|
146
|
+
readonly default: 0.3;
|
|
147
|
+
readonly defaultFrom: "desk";
|
|
148
|
+
readonly byKind: {
|
|
149
|
+
readonly fxReturn: 1;
|
|
150
|
+
};
|
|
151
|
+
};
|
|
152
|
+
|
|
153
|
+
/**
|
|
154
|
+
* 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.
|
|
155
|
+
* @see data/kernels/delay.json
|
|
156
|
+
*/
|
|
157
|
+
export declare const FX_DELAY_PINGPONG_DEFAULT: false;
|
|
158
|
+
|
|
159
|
+
/**
|
|
160
|
+
* 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.
|
|
161
|
+
* @see data/kernels/drive.json
|
|
162
|
+
*/
|
|
163
|
+
export declare const DRIVE_BIAS_MAX: 0.7071067811865476;
|
|
164
|
+
|
|
165
|
+
/**
|
|
166
|
+
* 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.
|
|
167
|
+
* @see data/kernels/eq.json
|
|
168
|
+
*/
|
|
169
|
+
export declare const EQ_MAX_BANDS: 24;
|
|
170
|
+
|
|
171
|
+
/**
|
|
172
|
+
* The standard ISO 266 one-third-octave centre frequencies, 20 Hz–20 kHz (31 bands) — the classic 31-band graphic-EQ layout's centres.
|
|
173
|
+
* @see data/kernels/eq.json
|
|
174
|
+
*/
|
|
175
|
+
export declare const ISO_THIRD_OCTAVE_CENTRES_HZ: readonly [20, 25, 31.5, 40, 50, 63, 80, 100, 125, 160, 200, 250, 315, 400, 500, 630, 800, 1000, 1250, 1600, 2000, 2500, 3150, 4000, 5000, 6300, 8000, 10000, 12500, 16000, 20000];
|
|
176
|
+
|
|
177
|
+
/**
|
|
178
|
+
* 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).
|
|
179
|
+
* @see data/kernels/eq.json
|
|
180
|
+
*/
|
|
181
|
+
export declare const GEQ_BANDS: 31;
|
|
182
|
+
|
|
183
|
+
/**
|
|
184
|
+
* 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).
|
|
185
|
+
* @see data/kernels/gate.json
|
|
186
|
+
*/
|
|
187
|
+
export declare const GATE_LIMITS: {
|
|
188
|
+
readonly thresholdDb: {
|
|
189
|
+
readonly min: -80;
|
|
190
|
+
readonly max: 0;
|
|
191
|
+
readonly step: 1;
|
|
192
|
+
readonly unit: "dB";
|
|
193
|
+
readonly default: -40;
|
|
194
|
+
readonly defaultFrom: "desk";
|
|
195
|
+
};
|
|
196
|
+
readonly rangeDb: {
|
|
197
|
+
readonly min: -90;
|
|
198
|
+
readonly max: 0;
|
|
199
|
+
readonly step: 1;
|
|
200
|
+
readonly unit: "dB";
|
|
201
|
+
readonly default: -90;
|
|
202
|
+
readonly defaultFrom: "desk";
|
|
203
|
+
};
|
|
204
|
+
readonly kneeStartDb: {
|
|
205
|
+
readonly min: -80;
|
|
206
|
+
readonly max: 0;
|
|
207
|
+
readonly step: 1;
|
|
208
|
+
readonly unit: "dB";
|
|
209
|
+
readonly default: -43;
|
|
210
|
+
readonly defaultFrom: "desk";
|
|
211
|
+
};
|
|
212
|
+
readonly kneeEndDb: {
|
|
213
|
+
readonly min: -80;
|
|
214
|
+
readonly max: 0;
|
|
215
|
+
readonly step: 1;
|
|
216
|
+
readonly unit: "dB";
|
|
217
|
+
readonly default: -37;
|
|
218
|
+
readonly defaultFrom: "desk";
|
|
219
|
+
};
|
|
220
|
+
readonly attackMs: {
|
|
221
|
+
readonly min: 0;
|
|
222
|
+
readonly max: 500;
|
|
223
|
+
readonly step: 0.5;
|
|
224
|
+
readonly unit: "ms";
|
|
225
|
+
readonly default: 1;
|
|
226
|
+
readonly defaultFrom: "desk";
|
|
227
|
+
};
|
|
228
|
+
readonly holdMs: {
|
|
229
|
+
readonly min: 0;
|
|
230
|
+
readonly max: 2000;
|
|
231
|
+
readonly step: 5;
|
|
232
|
+
readonly unit: "ms";
|
|
233
|
+
readonly default: 10;
|
|
234
|
+
readonly defaultFrom: "desk";
|
|
235
|
+
};
|
|
236
|
+
readonly releaseMs: {
|
|
237
|
+
readonly min: 0;
|
|
238
|
+
readonly max: 5000;
|
|
239
|
+
readonly step: 10;
|
|
240
|
+
readonly unit: "ms";
|
|
241
|
+
readonly default: 100;
|
|
242
|
+
readonly defaultFrom: "desk";
|
|
243
|
+
};
|
|
244
|
+
readonly hysteresisDb: {
|
|
245
|
+
readonly min: 0;
|
|
246
|
+
readonly max: 24;
|
|
247
|
+
readonly step: 0.5;
|
|
248
|
+
readonly unit: "dB";
|
|
249
|
+
readonly default: 3;
|
|
250
|
+
readonly defaultFrom: "desk";
|
|
251
|
+
};
|
|
252
|
+
readonly ratio: {
|
|
253
|
+
readonly min: 1;
|
|
254
|
+
readonly max: 100;
|
|
255
|
+
readonly step: 1;
|
|
256
|
+
readonly unit: "";
|
|
257
|
+
readonly default: 16;
|
|
258
|
+
readonly defaultFrom: "desk";
|
|
259
|
+
};
|
|
260
|
+
};
|
|
261
|
+
|
|
262
|
+
/**
|
|
263
|
+
* 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.
|
|
264
|
+
* @see data/kernels/limiter.json
|
|
265
|
+
*/
|
|
266
|
+
export declare const LIMITER_LIMITS: {
|
|
267
|
+
readonly ceilingDb: {
|
|
268
|
+
readonly min: -12;
|
|
269
|
+
readonly max: 0;
|
|
270
|
+
readonly step: 0.1;
|
|
271
|
+
readonly unit: "dBFS";
|
|
272
|
+
readonly default: -1;
|
|
273
|
+
readonly defaultFrom: "desk";
|
|
274
|
+
};
|
|
275
|
+
readonly lookaheadMs: {
|
|
276
|
+
readonly min: 0.5;
|
|
277
|
+
readonly max: 5;
|
|
278
|
+
readonly step: 0.1;
|
|
279
|
+
readonly unit: "ms";
|
|
280
|
+
readonly default: 1.5;
|
|
281
|
+
readonly defaultFrom: "desk";
|
|
282
|
+
};
|
|
283
|
+
readonly releaseMs: {
|
|
284
|
+
readonly min: 1;
|
|
285
|
+
readonly max: 1000;
|
|
286
|
+
readonly step: 1;
|
|
287
|
+
readonly unit: "ms";
|
|
288
|
+
readonly default: 50;
|
|
289
|
+
readonly defaultFrom: "desk";
|
|
290
|
+
};
|
|
291
|
+
};
|
|
292
|
+
|
|
293
|
+
/**
|
|
294
|
+
* PITCH_LIMITS, moved from openmixer.
|
|
295
|
+
* @see data/kernels/pitch.json
|
|
296
|
+
*/
|
|
297
|
+
export declare const PITCH_LIMITS: {
|
|
298
|
+
readonly semitones: {
|
|
299
|
+
readonly min: -12;
|
|
300
|
+
readonly max: 12;
|
|
301
|
+
readonly default: 0;
|
|
302
|
+
};
|
|
303
|
+
readonly cents: {
|
|
304
|
+
readonly min: -50;
|
|
305
|
+
readonly max: 50;
|
|
306
|
+
readonly default: 0;
|
|
307
|
+
};
|
|
308
|
+
readonly mix: {
|
|
309
|
+
readonly min: 0;
|
|
310
|
+
readonly max: 100;
|
|
311
|
+
readonly default: 100;
|
|
312
|
+
};
|
|
313
|
+
};
|
|
314
|
+
|
|
315
|
+
/**
|
|
316
|
+
* PITCH_KERNEL, moved from openmixer.
|
|
317
|
+
* @see data/kernels/pitch.json
|
|
318
|
+
*/
|
|
319
|
+
export declare const PITCH_KERNEL: {
|
|
320
|
+
readonly windowMs: 40;
|
|
321
|
+
readonly prefilterCeilingHz: 20000;
|
|
322
|
+
readonly prefilterQ: 0.7071067811865476;
|
|
323
|
+
};
|
|
324
|
+
|
|
325
|
+
/**
|
|
326
|
+
* 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).
|
|
327
|
+
* @see data/kernels/reverb.json
|
|
328
|
+
*/
|
|
329
|
+
export declare const REVERB_PLATE_MOD_DEPTH_RANGE: {
|
|
330
|
+
readonly min: 0;
|
|
331
|
+
readonly max: 400;
|
|
332
|
+
readonly step: 1;
|
|
333
|
+
readonly unit: "%";
|
|
334
|
+
readonly default: 100;
|
|
335
|
+
readonly defaultFrom: "desk";
|
|
336
|
+
};
|
|
337
|
+
|
|
338
|
+
/**
|
|
339
|
+
* 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).
|
|
340
|
+
* @see data/kernels/transient.json
|
|
341
|
+
*/
|
|
342
|
+
export declare const TRANSIENT_LIMITS: {
|
|
343
|
+
readonly attackDb: {
|
|
344
|
+
readonly min: -24;
|
|
345
|
+
readonly max: 24;
|
|
346
|
+
readonly step: 0.1;
|
|
347
|
+
readonly unit: "dB";
|
|
348
|
+
readonly default: 0;
|
|
349
|
+
readonly defaultFrom: "desk";
|
|
350
|
+
};
|
|
351
|
+
readonly sustainDb: {
|
|
352
|
+
readonly min: -24;
|
|
353
|
+
readonly max: 24;
|
|
354
|
+
readonly step: 0.1;
|
|
355
|
+
readonly unit: "dB";
|
|
356
|
+
readonly default: 0;
|
|
357
|
+
readonly defaultFrom: "desk";
|
|
358
|
+
};
|
|
359
|
+
readonly attackTimeMs: {
|
|
360
|
+
readonly min: 2;
|
|
361
|
+
readonly max: 50;
|
|
362
|
+
readonly step: 0.1;
|
|
363
|
+
readonly unit: "ms";
|
|
364
|
+
readonly default: 10;
|
|
365
|
+
readonly defaultFrom: "desk";
|
|
366
|
+
};
|
|
367
|
+
readonly sustainTimeMs: {
|
|
368
|
+
readonly min: 50;
|
|
369
|
+
readonly max: 2000;
|
|
370
|
+
readonly step: 1;
|
|
371
|
+
readonly unit: "ms";
|
|
372
|
+
readonly default: 250;
|
|
373
|
+
readonly defaultFrom: "desk";
|
|
374
|
+
};
|
|
375
|
+
readonly outputDb: {
|
|
376
|
+
readonly min: -24;
|
|
377
|
+
readonly max: 12;
|
|
378
|
+
readonly step: 0.1;
|
|
379
|
+
readonly unit: "dB";
|
|
380
|
+
readonly default: 0;
|
|
381
|
+
readonly defaultFrom: "desk";
|
|
382
|
+
};
|
|
383
|
+
};
|
|
384
|
+
|
|
385
|
+
/**
|
|
386
|
+
* The fast follower's attack, ms: exactly the dynamics detector's no-oversampling line (transient spec §3, L7).
|
|
387
|
+
* @see data/kernels/transient.json
|
|
388
|
+
*/
|
|
389
|
+
export declare const TRANSIENT_FAST_ATTACK_MS: 0.5;
|
|
390
|
+
|
|
391
|
+
/**
|
|
392
|
+
* The fast follower's release, ms: one 50 Hz cycle held, a 180 bpm sixteenth forgotten (transient spec §3).
|
|
393
|
+
* @see data/kernels/transient.json
|
|
394
|
+
*/
|
|
395
|
+
export declare const TRANSIENT_FAST_RELEASE_MS: 20;
|
|
396
|
+
|
|
397
|
+
/**
|
|
398
|
+
* The contrast, dB, at which a knob reaches its full value (transient spec §2, §3).
|
|
399
|
+
* @see data/kernels/transient.json
|
|
400
|
+
*/
|
|
401
|
+
export declare const TRANSIENT_REF_DB: 6;
|
|
402
|
+
|
|
403
|
+
/**
|
|
404
|
+
* The detector floor, linear (−100 dBFS): below it both envelopes read the floor and the stage is unity (transient spec §3).
|
|
405
|
+
* @see data/kernels/transient.json
|
|
406
|
+
*/
|
|
407
|
+
export declare const TRANSIENT_FLOOR_LIN: 0.00001;
|
|
408
|
+
|
|
409
|
+
/**
|
|
410
|
+
* 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.
|
|
411
|
+
*
|
|
412
|
+
* 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).
|
|
413
|
+
* @see data/plugins/delay.json
|
|
414
|
+
*/
|
|
415
|
+
export declare const DELAY_PLUGIN: {
|
|
416
|
+
readonly plugin: "delay";
|
|
417
|
+
readonly header: "omx_delay_params.h";
|
|
418
|
+
readonly prefix: "OMX_DELAY";
|
|
419
|
+
readonly params: readonly [{
|
|
420
|
+
readonly symbol: "timeMs";
|
|
421
|
+
readonly min: 0;
|
|
422
|
+
readonly max: 2000;
|
|
423
|
+
readonly def: 300;
|
|
424
|
+
readonly step: 1;
|
|
425
|
+
readonly unit: "ms";
|
|
426
|
+
readonly toggle: false;
|
|
427
|
+
}, {
|
|
428
|
+
readonly symbol: "feedback";
|
|
429
|
+
readonly min: 0;
|
|
430
|
+
readonly max: 0.99;
|
|
431
|
+
readonly def: 0.3;
|
|
432
|
+
readonly step: 0;
|
|
433
|
+
readonly unit: "";
|
|
434
|
+
readonly toggle: false;
|
|
435
|
+
}, {
|
|
436
|
+
readonly symbol: "mix";
|
|
437
|
+
readonly min: 0;
|
|
438
|
+
readonly max: 1;
|
|
439
|
+
readonly def: 0.3;
|
|
440
|
+
readonly step: 0;
|
|
441
|
+
readonly unit: "";
|
|
442
|
+
readonly toggle: false;
|
|
443
|
+
}, {
|
|
444
|
+
readonly symbol: "tone";
|
|
445
|
+
readonly min: 0;
|
|
446
|
+
readonly max: 1;
|
|
447
|
+
readonly def: 0.3;
|
|
448
|
+
readonly step: 0;
|
|
449
|
+
readonly unit: "";
|
|
450
|
+
readonly toggle: false;
|
|
451
|
+
}, {
|
|
452
|
+
readonly symbol: "pingpong";
|
|
453
|
+
readonly min: 0;
|
|
454
|
+
readonly max: 1;
|
|
455
|
+
readonly def: 0;
|
|
456
|
+
readonly step: 1;
|
|
457
|
+
readonly unit: "";
|
|
458
|
+
readonly toggle: true;
|
|
459
|
+
}];
|
|
460
|
+
};
|
|
461
|
+
|
|
462
|
+
/**
|
|
463
|
+
* 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).
|
|
464
|
+
* @see data/primitives.json
|
|
465
|
+
*/
|
|
466
|
+
export declare const BUTTERWORTH_Q: 0.7071067811865476;
|
|
467
|
+
|
|
468
|
+
/**
|
|
469
|
+
* ALLPASS_LIMITS, moved from openmixer.
|
|
470
|
+
* @see data/primitives.json
|
|
471
|
+
*/
|
|
472
|
+
export declare const ALLPASS_LIMITS: {
|
|
473
|
+
readonly unityTolerance: 0.0001;
|
|
474
|
+
};
|
|
475
|
+
|
|
476
|
+
/**
|
|
477
|
+
* XOVER_LIMITS, moved from openmixer.
|
|
478
|
+
* @see data/primitives.json
|
|
479
|
+
*/
|
|
480
|
+
export declare const XOVER_LIMITS: {
|
|
481
|
+
readonly lr2SectionQ: 0.5;
|
|
482
|
+
readonly lr4SectionQ: 0.7071067811865476;
|
|
483
|
+
readonly partitionTolerance: 0.00001;
|
|
484
|
+
};
|
|
485
|
+
|
|
486
|
+
/**
|
|
487
|
+
* The order the chorus and flanger construct their lines with (four taps; the fdelay spec §1).
|
|
488
|
+
* @see data/primitives.json
|
|
489
|
+
*/
|
|
490
|
+
export declare const FDELAY_MOD_READ_ORDER: 3;
|
|
491
|
+
|
|
492
|
+
/**
|
|
493
|
+
* `Λ` for the chorus/flanger read — ONE value; the header and every law read this.
|
|
494
|
+
* @see data/primitives.json
|
|
495
|
+
*/
|
|
496
|
+
export declare const FDELAY_READ_L1_NORM: 1.25;
|
|
497
|
+
|
|
498
|
+
/**
|
|
499
|
+
* 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.
|
|
500
|
+
* @see data/rates.json
|
|
501
|
+
*/
|
|
502
|
+
export declare const STANDARD_SAMPLE_RATES: readonly [44100, 48000, 88200, 96000, 176400, 192000];
|
|
503
|
+
|
|
504
|
+
/**
|
|
505
|
+
* THE declaration: 192 kHz at quantum 128.
|
|
506
|
+
* @see data/rates.json
|
|
507
|
+
*/
|
|
508
|
+
export declare const RT_HARD_TARGET: {
|
|
509
|
+
readonly rate: 192000;
|
|
510
|
+
readonly quantum: 128;
|
|
511
|
+
};
|
|
512
|
+
|
|
513
|
+
/**
|
|
514
|
+
* 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.
|
|
515
|
+
* @see data/rates.json
|
|
516
|
+
*/
|
|
517
|
+
export declare const DSP_KNOB_REFERENCE_RATE: 96000;
|