@openmixer/omx-contract 1.0.0 → 1.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 +10 -6
- package/data/kernels/balance.json +19 -0
- package/data/kernels/chorus.json +48 -0
- package/data/kernels/deesser.json +93 -0
- package/data/kernels/drive.json +90 -0
- package/data/kernels/eq.json +60 -0
- package/data/kernels/flanger.json +51 -0
- package/data/kernels/geq.json +33 -0
- package/data/kernels/phaser.json +109 -0
- package/data/kernels/reverb.json +135 -0
- package/data/kernels/rotary.json +186 -0
- package/data/kernels/tremolo.json +54 -0
- package/data/primitives.json +74 -0
- package/dist/ts/omx-contract.d.ts +1051 -80
- package/dist/ts/omx-contract.js +1063 -91
- package/include/omxcontract/omx_contract_limits.h +317 -0
- package/lib/data.mjs +2 -25
- package/lib/fmt.mjs +1 -3
- package/lib/semver.mjs +17 -16
- package/lib/validate.mjs +1 -16
- package/package.json +1 -1
- package/render/c.mjs +6 -16
- package/render/doors.mjs +2 -3
- package/render/ts.mjs +1 -2
- package/schema/omx-contract.schema.json +6 -36
- package/share/omx-contract/omx-contract.json +1149 -61
- package/data/plugins/delay.json +0 -48
- package/include/omxcontract/params/omx_delay_params.h +0 -47
- package/include/omxcontract/params/omx_plugin_param.h +0 -25
|
@@ -1,7 +1,25 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@openmixer/omx-contract",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.2.0",
|
|
4
4
|
"items": {
|
|
5
|
+
"PAN_RANGE": {
|
|
6
|
+
"rel": "data/kernels/balance.json",
|
|
7
|
+
"kind": "travels",
|
|
8
|
+
"doc": "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.",
|
|
9
|
+
"c": {
|
|
10
|
+
"alias": {
|
|
11
|
+
"fact": "pan",
|
|
12
|
+
"field": "pan"
|
|
13
|
+
}
|
|
14
|
+
},
|
|
15
|
+
"shape": "travel",
|
|
16
|
+
"value": {
|
|
17
|
+
"min": -1,
|
|
18
|
+
"max": 1,
|
|
19
|
+
"step": 0,
|
|
20
|
+
"unit": ""
|
|
21
|
+
}
|
|
22
|
+
},
|
|
5
23
|
"CHORUS_SPREAD_RANGE": {
|
|
6
24
|
"rel": "data/kernels/chorus.json",
|
|
7
25
|
"kind": "travels",
|
|
@@ -16,6 +34,62 @@
|
|
|
16
34
|
"defaultFrom": "desk"
|
|
17
35
|
}
|
|
18
36
|
},
|
|
37
|
+
"CHORUS_RATE_RANGE": {
|
|
38
|
+
"rel": "data/kernels/chorus.json",
|
|
39
|
+
"kind": "travels",
|
|
40
|
+
"doc": "The chorus sweep's speed (§3a). Above ~3 Hz it stops being a chorus and becomes a vibrato.",
|
|
41
|
+
"shape": "travel",
|
|
42
|
+
"value": {
|
|
43
|
+
"min": 0.05,
|
|
44
|
+
"max": 8,
|
|
45
|
+
"step": 0.01,
|
|
46
|
+
"unit": "Hz",
|
|
47
|
+
"default": 0.6,
|
|
48
|
+
"defaultFrom": "desk"
|
|
49
|
+
}
|
|
50
|
+
},
|
|
51
|
+
"CHORUS_DEPTH_RANGE": {
|
|
52
|
+
"rel": "data/kernels/chorus.json",
|
|
53
|
+
"kind": "travels",
|
|
54
|
+
"doc": "The chorus's peak-to-peak excursion above its declared 10 ms base (§3a).",
|
|
55
|
+
"shape": "travel",
|
|
56
|
+
"value": {
|
|
57
|
+
"min": 0,
|
|
58
|
+
"max": 12,
|
|
59
|
+
"step": 0.1,
|
|
60
|
+
"unit": "ms",
|
|
61
|
+
"default": 4,
|
|
62
|
+
"defaultFrom": "desk"
|
|
63
|
+
}
|
|
64
|
+
},
|
|
65
|
+
"CHORUS_VOICES_RANGE": {
|
|
66
|
+
"rel": "data/kernels/chorus.json",
|
|
67
|
+
"kind": "travels",
|
|
68
|
+
"doc": "The chorus's tap count — one oscillator read at k/N (§3a).",
|
|
69
|
+
"shape": "travel",
|
|
70
|
+
"value": {
|
|
71
|
+
"min": 1,
|
|
72
|
+
"max": 4,
|
|
73
|
+
"step": 1,
|
|
74
|
+
"unit": "",
|
|
75
|
+
"default": 3,
|
|
76
|
+
"defaultFrom": "desk"
|
|
77
|
+
}
|
|
78
|
+
},
|
|
79
|
+
"CHORUS_MIX_RANGE": {
|
|
80
|
+
"rel": "data/kernels/chorus.json",
|
|
81
|
+
"kind": "travels",
|
|
82
|
+
"doc": "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.",
|
|
83
|
+
"shape": "travel",
|
|
84
|
+
"value": {
|
|
85
|
+
"min": 0,
|
|
86
|
+
"max": 100,
|
|
87
|
+
"step": 0.1,
|
|
88
|
+
"unit": "%",
|
|
89
|
+
"default": 35,
|
|
90
|
+
"defaultFrom": "desk"
|
|
91
|
+
}
|
|
92
|
+
},
|
|
19
93
|
"COMP_LIMITS": {
|
|
20
94
|
"rel": "data/kernels/comp.json",
|
|
21
95
|
"kind": "travels",
|
|
@@ -97,6 +171,111 @@
|
|
|
97
171
|
}
|
|
98
172
|
}
|
|
99
173
|
},
|
|
174
|
+
"DEESS_FREQ_RANGE": {
|
|
175
|
+
"rel": "data/kernels/deesser.json",
|
|
176
|
+
"kind": "travels",
|
|
177
|
+
"doc": "The detector band's CENTRE, in Hz. Sibilance lives at 5–10 kHz on most voices; 7 kHz with the default width covers 4 950–9 900 Hz, which is where an \"s\" and a \"t\" sit on a close vocal mic. The travel is wider than the come-up on both sides on purpose: a bright female vocal wants the band up near 9 kHz and a chesty male one down at 5, and a surface narrower than the row removes reach the console genuinely has (the same reasoning core's `REVERB_CUT_RANGE` records).",
|
|
178
|
+
"shape": "travel",
|
|
179
|
+
"value": {
|
|
180
|
+
"min": 2000,
|
|
181
|
+
"max": 16000,
|
|
182
|
+
"step": 10,
|
|
183
|
+
"unit": "Hz",
|
|
184
|
+
"default": 7000,
|
|
185
|
+
"defaultFrom": "desk"
|
|
186
|
+
}
|
|
187
|
+
},
|
|
188
|
+
"DEESS_WIDTH_RANGE": {
|
|
189
|
+
"rel": "data/kernels/deesser.json",
|
|
190
|
+
"kind": "travels",
|
|
191
|
+
"doc": "The band's WIDTH, in OCTAVES around the centre: the edges are `f / 2^(w/2)` and `f · 2^(w/2)`, which is what makes the centre the geometric middle at every width. Octaves and not a Q, because a Q is a property of one section and this band is TWO (a highpass and a lowpass, `mix_deesser.h`) — an operator asked to dial a Q would be dialling a number neither filter carries. One octave is the classic de-esser band: wide enough for a sibilant that moves with the vowel, narrow enough that a 1 kHz vowel sits 27.8 dB down the skirt.",
|
|
192
|
+
"shape": "travel",
|
|
193
|
+
"value": {
|
|
194
|
+
"min": 0.25,
|
|
195
|
+
"max": 4,
|
|
196
|
+
"step": 0.05,
|
|
197
|
+
"unit": "oct",
|
|
198
|
+
"default": 1,
|
|
199
|
+
"defaultFrom": "desk"
|
|
200
|
+
}
|
|
201
|
+
},
|
|
202
|
+
"DEESS_THRESHOLD_RANGE": {
|
|
203
|
+
"rel": "data/kernels/deesser.json",
|
|
204
|
+
"kind": "travels",
|
|
205
|
+
"doc": "Where reduction starts — the level of the BAND, not of the strip, which is why the come-up is so much lower than the compressor's. A vocal peaking −12 dBFS carries roughly −30 dBFS in a one-octave band at 7 kHz on its sibilants and under −40 on its vowels, so −30 sits between the two and the stage opens on an \"s\" and stays shut on an \"ah\".",
|
|
206
|
+
"shape": "travel",
|
|
207
|
+
"value": {
|
|
208
|
+
"min": -60,
|
|
209
|
+
"max": 0,
|
|
210
|
+
"step": 0.5,
|
|
211
|
+
"unit": "dB",
|
|
212
|
+
"default": -30,
|
|
213
|
+
"defaultFrom": "desk"
|
|
214
|
+
}
|
|
215
|
+
},
|
|
216
|
+
"DEESS_RATIO_RANGE": {
|
|
217
|
+
"rel": "data/kernels/deesser.json",
|
|
218
|
+
"kind": "travels",
|
|
219
|
+
"doc": "How hard the band is held once it is over the threshold. 4:1 is the textbook de-esser ratio: firm on the \"s\", short of a limiter.",
|
|
220
|
+
"shape": "travel",
|
|
221
|
+
"value": {
|
|
222
|
+
"min": 1,
|
|
223
|
+
"max": 20,
|
|
224
|
+
"step": 0.1,
|
|
225
|
+
"unit": "",
|
|
226
|
+
"default": 4,
|
|
227
|
+
"defaultFrom": "desk"
|
|
228
|
+
}
|
|
229
|
+
},
|
|
230
|
+
"DEESS_RANGE_RANGE": {
|
|
231
|
+
"rel": "data/kernels/deesser.json",
|
|
232
|
+
"kind": "travels",
|
|
233
|
+
"doc": "The FLOOR on the reduction, in dB and never positive — the deepest cut the stage may reach however loud the sibilant is (`mix_deesser.h`'s clamp, §4c). 12 dB tames a hard sibilant; past that a voice starts to lisp, and a de-esser with NO floor turns a shouted \"s\" into a hole. The ceiling is 0, which switches the reduction off without switching the stage off — a legitimate thing to want while dialling the band in by ear.",
|
|
234
|
+
"shape": "travel",
|
|
235
|
+
"value": {
|
|
236
|
+
"min": -24,
|
|
237
|
+
"max": 0,
|
|
238
|
+
"step": 0.5,
|
|
239
|
+
"unit": "dB",
|
|
240
|
+
"default": -12,
|
|
241
|
+
"defaultFrom": "desk"
|
|
242
|
+
}
|
|
243
|
+
},
|
|
244
|
+
"DEESS_ATTACK_RANGE": {
|
|
245
|
+
"rel": "data/kernels/deesser.json",
|
|
246
|
+
"kind": "travels",
|
|
247
|
+
"doc": "The detector's ATTACK, in ms. A sibilant's onset is a few milliseconds; 1 ms catches it without the detector chattering on the band's own waveform.",
|
|
248
|
+
"shape": "travel",
|
|
249
|
+
"value": {
|
|
250
|
+
"min": 0.1,
|
|
251
|
+
"max": 50,
|
|
252
|
+
"step": 0.1,
|
|
253
|
+
"unit": "ms",
|
|
254
|
+
"default": 1,
|
|
255
|
+
"defaultFrom": "desk"
|
|
256
|
+
}
|
|
257
|
+
},
|
|
258
|
+
"DEESS_RELEASE_RANGE": {
|
|
259
|
+
"rel": "data/kernels/deesser.json",
|
|
260
|
+
"kind": "travels",
|
|
261
|
+
"doc": "The detector's RELEASE, in ms. 60 ms is long enough not to modulate inside one \"s\" and short enough to be open again for the next syllable.",
|
|
262
|
+
"shape": "travel",
|
|
263
|
+
"value": {
|
|
264
|
+
"min": 5,
|
|
265
|
+
"max": 500,
|
|
266
|
+
"step": 1,
|
|
267
|
+
"unit": "ms",
|
|
268
|
+
"default": 60,
|
|
269
|
+
"defaultFrom": "desk"
|
|
270
|
+
}
|
|
271
|
+
},
|
|
272
|
+
"DEESS_KNEE_DB": {
|
|
273
|
+
"rel": "data/kernels/deesser.json",
|
|
274
|
+
"kind": "scalar",
|
|
275
|
+
"doc": "The knee, in dB — a CONSTANT of the stage and not a row field (`2026-09-22-native-deesser-stage.md` §4b): a de-esser without a soft knee latches audibly on the first sibilant of a phrase, and no other value of this number is a de-esser anyone would dial. The controller pushes it to the node and this is the same number; a second spelling would be a picture that disagrees with the audio about where the reduction starts.",
|
|
276
|
+
"unit": "dB",
|
|
277
|
+
"value": 6
|
|
278
|
+
},
|
|
100
279
|
"FX_DELAY_TIME_RANGE": {
|
|
101
280
|
"rel": "data/kernels/delay.json",
|
|
102
281
|
"kind": "travels",
|
|
@@ -176,6 +355,106 @@
|
|
|
176
355
|
"unit": "",
|
|
177
356
|
"value": 0.7071067811865476
|
|
178
357
|
},
|
|
358
|
+
"DRIVE_AMOUNT_RANGE": {
|
|
359
|
+
"rel": "data/kernels/drive.json",
|
|
360
|
+
"kind": "travels",
|
|
361
|
+
"doc": "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.",
|
|
362
|
+
"c": {
|
|
363
|
+
"alias": {
|
|
364
|
+
"fact": "drive",
|
|
365
|
+
"field": "driveDb"
|
|
366
|
+
}
|
|
367
|
+
},
|
|
368
|
+
"shape": "travel",
|
|
369
|
+
"value": {
|
|
370
|
+
"min": 0,
|
|
371
|
+
"max": 36,
|
|
372
|
+
"step": 0.1,
|
|
373
|
+
"unit": "dB",
|
|
374
|
+
"default": 0,
|
|
375
|
+
"defaultFrom": "desk"
|
|
376
|
+
}
|
|
377
|
+
},
|
|
378
|
+
"DRIVE_CHARACTER_RANGE": {
|
|
379
|
+
"rel": "data/kernels/drive.json",
|
|
380
|
+
"kind": "travels",
|
|
381
|
+
"doc": "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.",
|
|
382
|
+
"c": {
|
|
383
|
+
"alias": {
|
|
384
|
+
"fact": "drive",
|
|
385
|
+
"field": "character"
|
|
386
|
+
}
|
|
387
|
+
},
|
|
388
|
+
"shape": "travel",
|
|
389
|
+
"value": {
|
|
390
|
+
"min": -1,
|
|
391
|
+
"max": 1,
|
|
392
|
+
"step": 0.01,
|
|
393
|
+
"unit": "",
|
|
394
|
+
"default": 0,
|
|
395
|
+
"defaultFrom": "desk"
|
|
396
|
+
}
|
|
397
|
+
},
|
|
398
|
+
"DRIVE_BAND_FREQ_RANGE": {
|
|
399
|
+
"rel": "data/kernels/drive.json",
|
|
400
|
+
"kind": "travels",
|
|
401
|
+
"doc": "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.",
|
|
402
|
+
"c": {
|
|
403
|
+
"alias": {
|
|
404
|
+
"fact": "drive",
|
|
405
|
+
"field": "bandHz"
|
|
406
|
+
}
|
|
407
|
+
},
|
|
408
|
+
"shape": "travel",
|
|
409
|
+
"value": {
|
|
410
|
+
"min": 20,
|
|
411
|
+
"max": 20000,
|
|
412
|
+
"step": 1,
|
|
413
|
+
"unit": "Hz",
|
|
414
|
+
"default": 2000,
|
|
415
|
+
"defaultFrom": "desk"
|
|
416
|
+
}
|
|
417
|
+
},
|
|
418
|
+
"DRIVE_MIX_RANGE": {
|
|
419
|
+
"rel": "data/kernels/drive.json",
|
|
420
|
+
"kind": "travels",
|
|
421
|
+
"doc": "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.",
|
|
422
|
+
"c": {
|
|
423
|
+
"alias": {
|
|
424
|
+
"fact": "drive",
|
|
425
|
+
"field": "mix"
|
|
426
|
+
}
|
|
427
|
+
},
|
|
428
|
+
"shape": "travel",
|
|
429
|
+
"value": {
|
|
430
|
+
"min": 0,
|
|
431
|
+
"max": 100,
|
|
432
|
+
"step": 0.1,
|
|
433
|
+
"unit": "%",
|
|
434
|
+
"default": 100,
|
|
435
|
+
"defaultFrom": "desk"
|
|
436
|
+
}
|
|
437
|
+
},
|
|
438
|
+
"DRIVE_TRIM_RANGE": {
|
|
439
|
+
"rel": "data/kernels/drive.json",
|
|
440
|
+
"kind": "travels",
|
|
441
|
+
"doc": "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.",
|
|
442
|
+
"c": {
|
|
443
|
+
"alias": {
|
|
444
|
+
"fact": "drive",
|
|
445
|
+
"field": "trimDb"
|
|
446
|
+
}
|
|
447
|
+
},
|
|
448
|
+
"shape": "travel",
|
|
449
|
+
"value": {
|
|
450
|
+
"min": -24,
|
|
451
|
+
"max": 12,
|
|
452
|
+
"step": 0.1,
|
|
453
|
+
"unit": "dB",
|
|
454
|
+
"default": 0,
|
|
455
|
+
"defaultFrom": "desk"
|
|
456
|
+
}
|
|
457
|
+
},
|
|
179
458
|
"EQ_MAX_BANDS": {
|
|
180
459
|
"rel": "data/kernels/eq.json",
|
|
181
460
|
"kind": "scalar",
|
|
@@ -232,6 +511,134 @@
|
|
|
232
511
|
"unit": "",
|
|
233
512
|
"value": 31
|
|
234
513
|
},
|
|
514
|
+
"EQ_FREQ_RANGE": {
|
|
515
|
+
"rel": "data/kernels/eq.json",
|
|
516
|
+
"kind": "travels",
|
|
517
|
+
"doc": "The frequency band a parametric band can be dragged across.",
|
|
518
|
+
"shape": "travel",
|
|
519
|
+
"value": {
|
|
520
|
+
"min": 20,
|
|
521
|
+
"max": 20000,
|
|
522
|
+
"step": 10,
|
|
523
|
+
"unit": "Hz"
|
|
524
|
+
}
|
|
525
|
+
},
|
|
526
|
+
"EQ_GAIN_RANGE": {
|
|
527
|
+
"rel": "data/kernels/eq.json",
|
|
528
|
+
"kind": "travels",
|
|
529
|
+
"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.",
|
|
530
|
+
"shape": "travel",
|
|
531
|
+
"value": {
|
|
532
|
+
"min": -15,
|
|
533
|
+
"max": 15,
|
|
534
|
+
"step": 0.5,
|
|
535
|
+
"unit": "dB"
|
|
536
|
+
}
|
|
537
|
+
},
|
|
538
|
+
"EQ_Q_RANGE": {
|
|
539
|
+
"rel": "data/kernels/eq.json",
|
|
540
|
+
"kind": "travels",
|
|
541
|
+
"doc": "The Q (resonance) extent of a parametric band.",
|
|
542
|
+
"shape": "travel",
|
|
543
|
+
"value": {
|
|
544
|
+
"min": 0.3,
|
|
545
|
+
"max": 8,
|
|
546
|
+
"step": 0.1,
|
|
547
|
+
"unit": ""
|
|
548
|
+
}
|
|
549
|
+
},
|
|
550
|
+
"EQ_NOTCH_Q_RANGE": {
|
|
551
|
+
"rel": "data/kernels/eq.json",
|
|
552
|
+
"kind": "travels",
|
|
553
|
+
"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.",
|
|
554
|
+
"shape": "travel",
|
|
555
|
+
"value": {
|
|
556
|
+
"min": 0.3,
|
|
557
|
+
"max": 116,
|
|
558
|
+
"step": 1,
|
|
559
|
+
"unit": ""
|
|
560
|
+
}
|
|
561
|
+
},
|
|
562
|
+
"HPF_FREQ_RANGE": {
|
|
563
|
+
"rel": "data/kernels/eq.json",
|
|
564
|
+
"kind": "travels",
|
|
565
|
+
"doc": "Where the HPF cutoff can sit (low end); mirrors the drawn low-frequency handle.",
|
|
566
|
+
"shape": "travel",
|
|
567
|
+
"value": {
|
|
568
|
+
"min": 20,
|
|
569
|
+
"max": 1000,
|
|
570
|
+
"step": 10,
|
|
571
|
+
"unit": "Hz"
|
|
572
|
+
}
|
|
573
|
+
},
|
|
574
|
+
"LPF_FREQ_RANGE": {
|
|
575
|
+
"rel": "data/kernels/eq.json",
|
|
576
|
+
"kind": "travels",
|
|
577
|
+
"doc": "Where the LPF cutoff can sit (high end).",
|
|
578
|
+
"shape": "travel",
|
|
579
|
+
"value": {
|
|
580
|
+
"min": 1000,
|
|
581
|
+
"max": 20000,
|
|
582
|
+
"step": 10,
|
|
583
|
+
"unit": "Hz"
|
|
584
|
+
}
|
|
585
|
+
},
|
|
586
|
+
"FLANGER_RATE_RANGE": {
|
|
587
|
+
"rel": "data/kernels/flanger.json",
|
|
588
|
+
"kind": "travels",
|
|
589
|
+
"doc": "The flanger's jet sweep (§3b).",
|
|
590
|
+
"shape": "travel",
|
|
591
|
+
"value": {
|
|
592
|
+
"min": 0.05,
|
|
593
|
+
"max": 5,
|
|
594
|
+
"step": 0.01,
|
|
595
|
+
"unit": "Hz",
|
|
596
|
+
"default": 0.25,
|
|
597
|
+
"defaultFrom": "desk"
|
|
598
|
+
}
|
|
599
|
+
},
|
|
600
|
+
"FLANGER_DEPTH_RANGE": {
|
|
601
|
+
"rel": "data/kernels/flanger.json",
|
|
602
|
+
"kind": "travels",
|
|
603
|
+
"doc": "The flanger's peak-to-peak excursion above its declared 0.5 ms base (§3b).",
|
|
604
|
+
"shape": "travel",
|
|
605
|
+
"value": {
|
|
606
|
+
"min": 0,
|
|
607
|
+
"max": 5,
|
|
608
|
+
"step": 0.1,
|
|
609
|
+
"unit": "ms",
|
|
610
|
+
"default": 2,
|
|
611
|
+
"defaultFrom": "desk"
|
|
612
|
+
}
|
|
613
|
+
},
|
|
614
|
+
"FLANGER_FEEDBACK_RANGE": {
|
|
615
|
+
"rel": "data/kernels/flanger.json",
|
|
616
|
+
"kind": "travels",
|
|
617
|
+
"doc": "The flanger's SIGNED resonance (§3b). The ±0.95 clamp is DECLARED here — a PATCH asking for 1.0 is answered by this travel — and the kernel's own clamp is the enforcement half.",
|
|
618
|
+
"shape": "travel",
|
|
619
|
+
"value": {
|
|
620
|
+
"min": -0.95,
|
|
621
|
+
"max": 0.95,
|
|
622
|
+
"step": 0.01,
|
|
623
|
+
"unit": "",
|
|
624
|
+
"default": 0.6,
|
|
625
|
+
"defaultFrom": "desk"
|
|
626
|
+
}
|
|
627
|
+
},
|
|
628
|
+
"FLANGER_MIX_RANGE": {
|
|
629
|
+
"rel": "data/kernels/flanger.json",
|
|
630
|
+
"kind": "travels",
|
|
631
|
+
"doc": "The flanger's wet/dry, as an instance of DRIVE_MIX_RANGE: 50 %, equal dry and wet, where the comb is deepest (§3b).",
|
|
632
|
+
"shape": "travel",
|
|
633
|
+
"value": {
|
|
634
|
+
"min": 0,
|
|
635
|
+
"max": 100,
|
|
636
|
+
"step": 0.1,
|
|
637
|
+
"unit": "%",
|
|
638
|
+
"default": 50,
|
|
639
|
+
"defaultFrom": "desk"
|
|
640
|
+
}
|
|
641
|
+
},
|
|
235
642
|
"GATE_LIMITS": {
|
|
236
643
|
"rel": "data/kernels/gate.json",
|
|
237
644
|
"kind": "travels",
|
|
@@ -312,6 +719,41 @@
|
|
|
312
719
|
}
|
|
313
720
|
}
|
|
314
721
|
},
|
|
722
|
+
"GEQ_BAND_RANGE": {
|
|
723
|
+
"rel": "data/kernels/geq.json",
|
|
724
|
+
"kind": "travels",
|
|
725
|
+
"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).",
|
|
726
|
+
"shape": "travel",
|
|
727
|
+
"value": {
|
|
728
|
+
"min": -15,
|
|
729
|
+
"max": 15,
|
|
730
|
+
"step": 0.5,
|
|
731
|
+
"unit": "dB",
|
|
732
|
+
"default": 0,
|
|
733
|
+
"defaultFrom": "desk"
|
|
734
|
+
}
|
|
735
|
+
},
|
|
736
|
+
"GEQ_BAND_Q": {
|
|
737
|
+
"rel": "data/kernels/geq.json",
|
|
738
|
+
"kind": "scalar",
|
|
739
|
+
"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).",
|
|
740
|
+
"unit": "",
|
|
741
|
+
"value": 4.3
|
|
742
|
+
},
|
|
743
|
+
"GEQ_PROTO_DB": {
|
|
744
|
+
"rel": "data/kernels/geq.json",
|
|
745
|
+
"kind": "scalar",
|
|
746
|
+
"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.",
|
|
747
|
+
"unit": "dB",
|
|
748
|
+
"value": 12
|
|
749
|
+
},
|
|
750
|
+
"GEQ_DESIGN_GAIN_MAX_DB": {
|
|
751
|
+
"rel": "data/kernels/geq.json",
|
|
752
|
+
"kind": "scalar",
|
|
753
|
+
"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.",
|
|
754
|
+
"unit": "dB",
|
|
755
|
+
"value": 30
|
|
756
|
+
},
|
|
315
757
|
"LIMITER_LIMITS": {
|
|
316
758
|
"rel": "data/kernels/limiter.json",
|
|
317
759
|
"kind": "travels",
|
|
@@ -344,17 +786,163 @@
|
|
|
344
786
|
}
|
|
345
787
|
}
|
|
346
788
|
},
|
|
347
|
-
"
|
|
348
|
-
"rel": "data/kernels/
|
|
789
|
+
"PHASER_RATE_RANGE": {
|
|
790
|
+
"rel": "data/kernels/phaser.json",
|
|
349
791
|
"kind": "travels",
|
|
350
|
-
"doc": "
|
|
351
|
-
"shape": "
|
|
792
|
+
"doc": "The phaser's sweep speed (§3). `omx_lfo_inc` freezes at Nyquist; this travel stays far below.",
|
|
793
|
+
"shape": "travel",
|
|
352
794
|
"value": {
|
|
353
|
-
"
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
795
|
+
"min": 0.05,
|
|
796
|
+
"max": 5,
|
|
797
|
+
"step": 0.01,
|
|
798
|
+
"unit": "Hz",
|
|
799
|
+
"default": 0.5,
|
|
800
|
+
"defaultFrom": "desk"
|
|
801
|
+
}
|
|
802
|
+
},
|
|
803
|
+
"PHASER_BASE_RANGE": {
|
|
804
|
+
"rel": "data/kernels/phaser.json",
|
|
805
|
+
"kind": "travels",
|
|
806
|
+
"doc": "The phaser's lowest centre frequency; the sweep runs upward from it (§3).",
|
|
807
|
+
"shape": "travel",
|
|
808
|
+
"value": {
|
|
809
|
+
"min": 50,
|
|
810
|
+
"max": 2000,
|
|
811
|
+
"step": 1,
|
|
812
|
+
"unit": "Hz",
|
|
813
|
+
"default": 200,
|
|
814
|
+
"defaultFrom": "desk"
|
|
815
|
+
}
|
|
816
|
+
},
|
|
817
|
+
"PHASER_DEPTH_RANGE": {
|
|
818
|
+
"rel": "data/kernels/phaser.json",
|
|
819
|
+
"kind": "travels",
|
|
820
|
+
"doc": "The sweep's span above `base`, in octaves; 0 is a static phaser at `base` (§3).",
|
|
821
|
+
"shape": "travel",
|
|
822
|
+
"value": {
|
|
823
|
+
"min": 0,
|
|
824
|
+
"max": 6,
|
|
825
|
+
"step": 0.1,
|
|
826
|
+
"unit": "oct",
|
|
827
|
+
"default": 4,
|
|
828
|
+
"defaultFrom": "desk"
|
|
829
|
+
}
|
|
830
|
+
},
|
|
831
|
+
"PHASER_STAGES_RANGE": {
|
|
832
|
+
"rel": "data/kernels/phaser.json",
|
|
833
|
+
"kind": "travels",
|
|
834
|
+
"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.",
|
|
835
|
+
"shape": "travel",
|
|
836
|
+
"value": {
|
|
837
|
+
"min": 2,
|
|
838
|
+
"max": 12,
|
|
839
|
+
"step": 2,
|
|
840
|
+
"unit": "",
|
|
841
|
+
"default": 6,
|
|
842
|
+
"defaultFrom": "desk"
|
|
843
|
+
}
|
|
844
|
+
},
|
|
845
|
+
"PHASER_STAGE_COUNTS": {
|
|
846
|
+
"rel": "data/kernels/phaser.json",
|
|
847
|
+
"kind": "list",
|
|
848
|
+
"doc": "The member set the `stages` field accepts: PHASER_STAGES_RANGE walked by its step.",
|
|
849
|
+
"unit": "",
|
|
850
|
+
"value": [
|
|
851
|
+
2,
|
|
852
|
+
4,
|
|
853
|
+
6,
|
|
854
|
+
8,
|
|
855
|
+
10,
|
|
856
|
+
12
|
|
857
|
+
]
|
|
858
|
+
},
|
|
859
|
+
"PHASER_FEEDBACK_RANGE": {
|
|
860
|
+
"rel": "data/kernels/phaser.json",
|
|
861
|
+
"kind": "travels",
|
|
862
|
+
"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.",
|
|
863
|
+
"shape": "travel",
|
|
864
|
+
"value": {
|
|
865
|
+
"min": -0.9,
|
|
866
|
+
"max": 0.9,
|
|
867
|
+
"step": 0.01,
|
|
868
|
+
"unit": "",
|
|
869
|
+
"default": 0.4,
|
|
870
|
+
"defaultFrom": "desk"
|
|
871
|
+
}
|
|
872
|
+
},
|
|
873
|
+
"PHASER_MIX_RANGE": {
|
|
874
|
+
"rel": "data/kernels/phaser.json",
|
|
875
|
+
"kind": "travels",
|
|
876
|
+
"doc": "The phaser's wet/dry, as an instance of DRIVE_MIX_RANGE: 50 %, where the notch is complete (§3).",
|
|
877
|
+
"shape": "travel",
|
|
878
|
+
"value": {
|
|
879
|
+
"min": 0,
|
|
880
|
+
"max": 100,
|
|
881
|
+
"step": 0.1,
|
|
882
|
+
"unit": "%",
|
|
883
|
+
"default": 50,
|
|
884
|
+
"defaultFrom": "desk"
|
|
885
|
+
}
|
|
886
|
+
},
|
|
887
|
+
"PHASER_TRAVELS": {
|
|
888
|
+
"rel": "data/kernels/phaser.json",
|
|
889
|
+
"kind": "travels",
|
|
890
|
+
"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.",
|
|
891
|
+
"shape": "table",
|
|
892
|
+
"value": {
|
|
893
|
+
"rateHz": {
|
|
894
|
+
"min": 0.05,
|
|
895
|
+
"max": 5,
|
|
896
|
+
"step": 0.01,
|
|
897
|
+
"unit": "Hz",
|
|
898
|
+
"default": 0.5,
|
|
899
|
+
"defaultFrom": "desk"
|
|
900
|
+
},
|
|
901
|
+
"baseHz": {
|
|
902
|
+
"min": 50,
|
|
903
|
+
"max": 2000,
|
|
904
|
+
"step": 1,
|
|
905
|
+
"unit": "Hz",
|
|
906
|
+
"default": 200,
|
|
907
|
+
"defaultFrom": "desk"
|
|
908
|
+
},
|
|
909
|
+
"depthOct": {
|
|
910
|
+
"min": 0,
|
|
911
|
+
"max": 6,
|
|
912
|
+
"step": 0.1,
|
|
913
|
+
"unit": "oct",
|
|
914
|
+
"default": 4,
|
|
915
|
+
"defaultFrom": "desk"
|
|
916
|
+
},
|
|
917
|
+
"feedback": {
|
|
918
|
+
"min": -0.9,
|
|
919
|
+
"max": 0.9,
|
|
920
|
+
"step": 0.01,
|
|
921
|
+
"unit": "",
|
|
922
|
+
"default": 0.4,
|
|
923
|
+
"defaultFrom": "desk"
|
|
924
|
+
},
|
|
925
|
+
"mix": {
|
|
926
|
+
"min": 0,
|
|
927
|
+
"max": 100,
|
|
928
|
+
"step": 0.1,
|
|
929
|
+
"unit": "%",
|
|
930
|
+
"default": 50,
|
|
931
|
+
"defaultFrom": "desk"
|
|
932
|
+
}
|
|
933
|
+
}
|
|
934
|
+
},
|
|
935
|
+
"PITCH_LIMITS": {
|
|
936
|
+
"rel": "data/kernels/pitch.json",
|
|
937
|
+
"kind": "travels",
|
|
938
|
+
"doc": "PITCH_LIMITS, moved from openmixer.",
|
|
939
|
+
"shape": "table",
|
|
940
|
+
"value": {
|
|
941
|
+
"semitones": {
|
|
942
|
+
"min": -12,
|
|
943
|
+
"max": 12,
|
|
944
|
+
"default": 0
|
|
945
|
+
},
|
|
358
946
|
"cents": {
|
|
359
947
|
"min": -50,
|
|
360
948
|
"max": 50,
|
|
@@ -391,6 +979,409 @@
|
|
|
391
979
|
"defaultFrom": "desk"
|
|
392
980
|
}
|
|
393
981
|
},
|
|
982
|
+
"REVERB_MIX_RANGE": {
|
|
983
|
+
"rel": "data/kernels/reverb.json",
|
|
984
|
+
"kind": "travels",
|
|
985
|
+
"doc": "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.",
|
|
986
|
+
"shape": "travel",
|
|
987
|
+
"value": {
|
|
988
|
+
"min": 0,
|
|
989
|
+
"max": 1,
|
|
990
|
+
"step": 0,
|
|
991
|
+
"unit": "",
|
|
992
|
+
"default": 0.3,
|
|
993
|
+
"defaultFrom": "desk",
|
|
994
|
+
"byKind": {
|
|
995
|
+
"fxReturn": 1
|
|
996
|
+
}
|
|
997
|
+
}
|
|
998
|
+
},
|
|
999
|
+
"REVERB_SIZE_RANGE": {
|
|
1000
|
+
"rel": "data/kernels/reverb.json",
|
|
1001
|
+
"kind": "travels",
|
|
1002
|
+
"doc": "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.",
|
|
1003
|
+
"shape": "travel",
|
|
1004
|
+
"value": {
|
|
1005
|
+
"min": 0,
|
|
1006
|
+
"max": 1,
|
|
1007
|
+
"step": 0,
|
|
1008
|
+
"unit": "",
|
|
1009
|
+
"default": 0.7,
|
|
1010
|
+
"defaultFrom": "desk"
|
|
1011
|
+
}
|
|
1012
|
+
},
|
|
1013
|
+
"REVERB_DAMPING_RANGE": {
|
|
1014
|
+
"rel": "data/kernels/reverb.json",
|
|
1015
|
+
"kind": "travels",
|
|
1016
|
+
"doc": "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).",
|
|
1017
|
+
"shape": "travel",
|
|
1018
|
+
"value": {
|
|
1019
|
+
"min": 0,
|
|
1020
|
+
"max": 1,
|
|
1021
|
+
"step": 0,
|
|
1022
|
+
"unit": "",
|
|
1023
|
+
"default": 0.5,
|
|
1024
|
+
"defaultFrom": "desk"
|
|
1025
|
+
}
|
|
1026
|
+
},
|
|
1027
|
+
"REVERB_WIDTH_RANGE": {
|
|
1028
|
+
"rel": "data/kernels/reverb.json",
|
|
1029
|
+
"kind": "travels",
|
|
1030
|
+
"doc": "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).",
|
|
1031
|
+
"shape": "travel",
|
|
1032
|
+
"value": {
|
|
1033
|
+
"min": 0,
|
|
1034
|
+
"max": 1,
|
|
1035
|
+
"step": 0,
|
|
1036
|
+
"unit": "",
|
|
1037
|
+
"default": 1,
|
|
1038
|
+
"defaultFrom": "desk"
|
|
1039
|
+
}
|
|
1040
|
+
},
|
|
1041
|
+
"REVERB_PREDELAY_RANGE": {
|
|
1042
|
+
"rel": "data/kernels/reverb.json",
|
|
1043
|
+
"kind": "travels",
|
|
1044
|
+
"doc": "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.",
|
|
1045
|
+
"shape": "travel",
|
|
1046
|
+
"value": {
|
|
1047
|
+
"min": 0,
|
|
1048
|
+
"max": 100,
|
|
1049
|
+
"step": 1,
|
|
1050
|
+
"unit": "ms",
|
|
1051
|
+
"default": 0,
|
|
1052
|
+
"defaultFrom": "desk"
|
|
1053
|
+
}
|
|
1054
|
+
},
|
|
1055
|
+
"REVERB_LOWCUT_RANGE": {
|
|
1056
|
+
"rel": "data/kernels/reverb.json",
|
|
1057
|
+
"kind": "travels",
|
|
1058
|
+
"doc": "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.",
|
|
1059
|
+
"shape": "travel",
|
|
1060
|
+
"value": {
|
|
1061
|
+
"min": 0,
|
|
1062
|
+
"max": 20000,
|
|
1063
|
+
"step": 10,
|
|
1064
|
+
"unit": "Hz",
|
|
1065
|
+
"default": 0,
|
|
1066
|
+
"defaultFrom": "desk"
|
|
1067
|
+
}
|
|
1068
|
+
},
|
|
1069
|
+
"REVERB_HIGHCUT_RANGE": {
|
|
1070
|
+
"rel": "data/kernels/reverb.json",
|
|
1071
|
+
"kind": "travels",
|
|
1072
|
+
"doc": "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.",
|
|
1073
|
+
"shape": "travel",
|
|
1074
|
+
"value": {
|
|
1075
|
+
"min": 0,
|
|
1076
|
+
"max": 20000,
|
|
1077
|
+
"step": 10,
|
|
1078
|
+
"unit": "Hz",
|
|
1079
|
+
"default": 20000,
|
|
1080
|
+
"defaultFrom": "desk"
|
|
1081
|
+
}
|
|
1082
|
+
},
|
|
1083
|
+
"REVERB_REVERSE_RANGE": {
|
|
1084
|
+
"rel": "data/kernels/reverb.json",
|
|
1085
|
+
"kind": "travels",
|
|
1086
|
+
"doc": "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.",
|
|
1087
|
+
"shape": "travel",
|
|
1088
|
+
"value": {
|
|
1089
|
+
"min": 50,
|
|
1090
|
+
"max": 500,
|
|
1091
|
+
"step": 10,
|
|
1092
|
+
"unit": "ms",
|
|
1093
|
+
"default": 300,
|
|
1094
|
+
"defaultFrom": "desk"
|
|
1095
|
+
}
|
|
1096
|
+
},
|
|
1097
|
+
"REVERB_HOLD_RANGE": {
|
|
1098
|
+
"rel": "data/kernels/reverb.json",
|
|
1099
|
+
"kind": "travels",
|
|
1100
|
+
"doc": "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.",
|
|
1101
|
+
"shape": "travel",
|
|
1102
|
+
"value": {
|
|
1103
|
+
"min": 10,
|
|
1104
|
+
"max": 2000,
|
|
1105
|
+
"step": 10,
|
|
1106
|
+
"unit": "ms",
|
|
1107
|
+
"default": 120,
|
|
1108
|
+
"defaultFrom": "desk"
|
|
1109
|
+
}
|
|
1110
|
+
},
|
|
1111
|
+
"REVERB_RELEASE_RANGE": {
|
|
1112
|
+
"rel": "data/kernels/reverb.json",
|
|
1113
|
+
"kind": "travels",
|
|
1114
|
+
"doc": "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.",
|
|
1115
|
+
"shape": "travel",
|
|
1116
|
+
"value": {
|
|
1117
|
+
"min": 1,
|
|
1118
|
+
"max": 500,
|
|
1119
|
+
"step": 1,
|
|
1120
|
+
"unit": "ms",
|
|
1121
|
+
"default": 20,
|
|
1122
|
+
"defaultFrom": "desk"
|
|
1123
|
+
}
|
|
1124
|
+
},
|
|
1125
|
+
"REVERB_GATE_THRESHOLD_RANGE": {
|
|
1126
|
+
"rel": "data/kernels/reverb.json",
|
|
1127
|
+
"kind": "travels",
|
|
1128
|
+
"doc": "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.",
|
|
1129
|
+
"shape": "travel",
|
|
1130
|
+
"value": {
|
|
1131
|
+
"min": -80,
|
|
1132
|
+
"max": 0,
|
|
1133
|
+
"step": 1,
|
|
1134
|
+
"unit": "dBFS",
|
|
1135
|
+
"default": -40,
|
|
1136
|
+
"defaultFrom": "desk"
|
|
1137
|
+
}
|
|
1138
|
+
},
|
|
1139
|
+
"ROTARY_HORN_SLOW_RANGE": {
|
|
1140
|
+
"rel": "data/kernels/rotary.json",
|
|
1141
|
+
"kind": "travels",
|
|
1142
|
+
"doc": "The horn's chorale (slow) rate, Hz.",
|
|
1143
|
+
"shape": "travel",
|
|
1144
|
+
"value": {
|
|
1145
|
+
"min": 0.1,
|
|
1146
|
+
"max": 2,
|
|
1147
|
+
"step": 0.01,
|
|
1148
|
+
"unit": "Hz",
|
|
1149
|
+
"default": 0.8,
|
|
1150
|
+
"defaultFrom": "desk"
|
|
1151
|
+
}
|
|
1152
|
+
},
|
|
1153
|
+
"ROTARY_HORN_FAST_RANGE": {
|
|
1154
|
+
"rel": "data/kernels/rotary.json",
|
|
1155
|
+
"kind": "travels",
|
|
1156
|
+
"doc": "The horn's tremolo (fast) rate, Hz.",
|
|
1157
|
+
"shape": "travel",
|
|
1158
|
+
"value": {
|
|
1159
|
+
"min": 3,
|
|
1160
|
+
"max": 10,
|
|
1161
|
+
"step": 0.01,
|
|
1162
|
+
"unit": "Hz",
|
|
1163
|
+
"default": 6.8,
|
|
1164
|
+
"defaultFrom": "desk"
|
|
1165
|
+
}
|
|
1166
|
+
},
|
|
1167
|
+
"ROTARY_DRUM_SLOW_RANGE": {
|
|
1168
|
+
"rel": "data/kernels/rotary.json",
|
|
1169
|
+
"kind": "travels",
|
|
1170
|
+
"doc": "The drum's chorale (slow) rate, Hz.",
|
|
1171
|
+
"shape": "travel",
|
|
1172
|
+
"value": {
|
|
1173
|
+
"min": 0.1,
|
|
1174
|
+
"max": 2,
|
|
1175
|
+
"step": 0.01,
|
|
1176
|
+
"unit": "Hz",
|
|
1177
|
+
"default": 0.7,
|
|
1178
|
+
"defaultFrom": "desk"
|
|
1179
|
+
}
|
|
1180
|
+
},
|
|
1181
|
+
"ROTARY_DRUM_FAST_RANGE": {
|
|
1182
|
+
"rel": "data/kernels/rotary.json",
|
|
1183
|
+
"kind": "travels",
|
|
1184
|
+
"doc": "The drum's tremolo (fast) rate, Hz.",
|
|
1185
|
+
"shape": "travel",
|
|
1186
|
+
"value": {
|
|
1187
|
+
"min": 3,
|
|
1188
|
+
"max": 10,
|
|
1189
|
+
"step": 0.01,
|
|
1190
|
+
"unit": "Hz",
|
|
1191
|
+
"default": 5.9,
|
|
1192
|
+
"defaultFrom": "desk"
|
|
1193
|
+
}
|
|
1194
|
+
},
|
|
1195
|
+
"ROTARY_ACCEL_RANGE": {
|
|
1196
|
+
"rel": "data/kernels/rotary.json",
|
|
1197
|
+
"kind": "travels",
|
|
1198
|
+
"doc": "The scale on every speed-change time constant (`ROTARY_*_ACCEL_MS`/`_DECEL_MS`): 2 is twice as slow.",
|
|
1199
|
+
"shape": "travel",
|
|
1200
|
+
"value": {
|
|
1201
|
+
"min": 0.25,
|
|
1202
|
+
"max": 4,
|
|
1203
|
+
"step": 0.01,
|
|
1204
|
+
"unit": "x",
|
|
1205
|
+
"default": 1,
|
|
1206
|
+
"defaultFrom": "desk"
|
|
1207
|
+
}
|
|
1208
|
+
},
|
|
1209
|
+
"ROTARY_BALANCE_RANGE": {
|
|
1210
|
+
"rel": "data/kernels/rotary.json",
|
|
1211
|
+
"kind": "travels",
|
|
1212
|
+
"doc": "The drum/horn balance, percent: −100 drum only, +100 horn only; the law attenuates, never boosts.",
|
|
1213
|
+
"shape": "travel",
|
|
1214
|
+
"value": {
|
|
1215
|
+
"min": -100,
|
|
1216
|
+
"max": 100,
|
|
1217
|
+
"step": 1,
|
|
1218
|
+
"unit": "%",
|
|
1219
|
+
"default": 0,
|
|
1220
|
+
"defaultFrom": "desk"
|
|
1221
|
+
}
|
|
1222
|
+
},
|
|
1223
|
+
"ROTARY_MIX_RANGE": {
|
|
1224
|
+
"rel": "data/kernels/rotary.json",
|
|
1225
|
+
"kind": "travels",
|
|
1226
|
+
"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).",
|
|
1227
|
+
"shape": "travel",
|
|
1228
|
+
"value": {
|
|
1229
|
+
"min": 0,
|
|
1230
|
+
"max": 100,
|
|
1231
|
+
"step": 0.1,
|
|
1232
|
+
"unit": "%",
|
|
1233
|
+
"default": 100,
|
|
1234
|
+
"defaultFrom": "desk"
|
|
1235
|
+
}
|
|
1236
|
+
},
|
|
1237
|
+
"ROTARY_TRAVELS": {
|
|
1238
|
+
"rel": "data/kernels/rotary.json",
|
|
1239
|
+
"kind": "travels",
|
|
1240
|
+
"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).",
|
|
1241
|
+
"shape": "table",
|
|
1242
|
+
"value": {
|
|
1243
|
+
"hornSlowHz": {
|
|
1244
|
+
"min": 0.1,
|
|
1245
|
+
"max": 2,
|
|
1246
|
+
"step": 0.01,
|
|
1247
|
+
"unit": "Hz",
|
|
1248
|
+
"default": 0.8,
|
|
1249
|
+
"defaultFrom": "desk"
|
|
1250
|
+
},
|
|
1251
|
+
"hornFastHz": {
|
|
1252
|
+
"min": 3,
|
|
1253
|
+
"max": 10,
|
|
1254
|
+
"step": 0.01,
|
|
1255
|
+
"unit": "Hz",
|
|
1256
|
+
"default": 6.8,
|
|
1257
|
+
"defaultFrom": "desk"
|
|
1258
|
+
},
|
|
1259
|
+
"drumSlowHz": {
|
|
1260
|
+
"min": 0.1,
|
|
1261
|
+
"max": 2,
|
|
1262
|
+
"step": 0.01,
|
|
1263
|
+
"unit": "Hz",
|
|
1264
|
+
"default": 0.7,
|
|
1265
|
+
"defaultFrom": "desk"
|
|
1266
|
+
},
|
|
1267
|
+
"drumFastHz": {
|
|
1268
|
+
"min": 3,
|
|
1269
|
+
"max": 10,
|
|
1270
|
+
"step": 0.01,
|
|
1271
|
+
"unit": "Hz",
|
|
1272
|
+
"default": 5.9,
|
|
1273
|
+
"defaultFrom": "desk"
|
|
1274
|
+
},
|
|
1275
|
+
"accel": {
|
|
1276
|
+
"min": 0.25,
|
|
1277
|
+
"max": 4,
|
|
1278
|
+
"step": 0.01,
|
|
1279
|
+
"unit": "x",
|
|
1280
|
+
"default": 1,
|
|
1281
|
+
"defaultFrom": "desk"
|
|
1282
|
+
},
|
|
1283
|
+
"balance": {
|
|
1284
|
+
"min": -100,
|
|
1285
|
+
"max": 100,
|
|
1286
|
+
"step": 1,
|
|
1287
|
+
"unit": "%",
|
|
1288
|
+
"default": 0,
|
|
1289
|
+
"defaultFrom": "desk"
|
|
1290
|
+
},
|
|
1291
|
+
"mix": {
|
|
1292
|
+
"min": 0,
|
|
1293
|
+
"max": 100,
|
|
1294
|
+
"step": 0.1,
|
|
1295
|
+
"unit": "%",
|
|
1296
|
+
"default": 100,
|
|
1297
|
+
"defaultFrom": "desk"
|
|
1298
|
+
}
|
|
1299
|
+
}
|
|
1300
|
+
},
|
|
1301
|
+
"ROTARY_CROSSOVER_HZ": {
|
|
1302
|
+
"rel": "data/kernels/rotary.json",
|
|
1303
|
+
"kind": "scalar",
|
|
1304
|
+
"doc": "The complementary split's low-pass corner, Hz: the Leslie 122's passive crossover.",
|
|
1305
|
+
"unit": "Hz",
|
|
1306
|
+
"value": 800
|
|
1307
|
+
},
|
|
1308
|
+
"ROTARY_BASE_MS": {
|
|
1309
|
+
"rel": "data/kernels/rotary.json",
|
|
1310
|
+
"kind": "scalar",
|
|
1311
|
+
"doc": "The shortest Doppler read, ms — above the order-3 read's one-sample reach at every rate.",
|
|
1312
|
+
"unit": "ms",
|
|
1313
|
+
"value": 0.1
|
|
1314
|
+
},
|
|
1315
|
+
"ROTARY_HORN_DOPPLER_MS": {
|
|
1316
|
+
"rel": "data/kernels/rotary.json",
|
|
1317
|
+
"kind": "scalar",
|
|
1318
|
+
"doc": "The horn's Doppler excursion `D_horn`, ms: a 0.15 m radius over 343 m/s.",
|
|
1319
|
+
"unit": "ms",
|
|
1320
|
+
"value": 0.44
|
|
1321
|
+
},
|
|
1322
|
+
"ROTARY_DRUM_DOPPLER_MS": {
|
|
1323
|
+
"rel": "data/kernels/rotary.json",
|
|
1324
|
+
"kind": "scalar",
|
|
1325
|
+
"doc": "The drum's Doppler excursion `D_drum`, ms: its baffle turns over a fixed woofer.",
|
|
1326
|
+
"unit": "ms",
|
|
1327
|
+
"value": 0.29
|
|
1328
|
+
},
|
|
1329
|
+
"ROTARY_HORN_AM": {
|
|
1330
|
+
"rel": "data/kernels/rotary.json",
|
|
1331
|
+
"kind": "scalar",
|
|
1332
|
+
"doc": "The horn's amplitude swing `m_horn` (a −6 dB directivity dip), a ratio.",
|
|
1333
|
+
"unit": "",
|
|
1334
|
+
"value": 0.5
|
|
1335
|
+
},
|
|
1336
|
+
"ROTARY_DRUM_AM": {
|
|
1337
|
+
"rel": "data/kernels/rotary.json",
|
|
1338
|
+
"kind": "scalar",
|
|
1339
|
+
"doc": "The drum baffle's amplitude swing `m_drum`, a ratio.",
|
|
1340
|
+
"unit": "",
|
|
1341
|
+
"value": 0.3
|
|
1342
|
+
},
|
|
1343
|
+
"ROTARY_HORN_ACCEL_MS": {
|
|
1344
|
+
"rel": "data/kernels/rotary.json",
|
|
1345
|
+
"kind": "scalar",
|
|
1346
|
+
"doc": "The horn rotor's speed-up time constant, ms (at `accel` 1).",
|
|
1347
|
+
"unit": "ms",
|
|
1348
|
+
"value": 330
|
|
1349
|
+
},
|
|
1350
|
+
"ROTARY_HORN_DECEL_MS": {
|
|
1351
|
+
"rel": "data/kernels/rotary.json",
|
|
1352
|
+
"kind": "scalar",
|
|
1353
|
+
"doc": "The horn rotor's slow-down time constant, ms (at `accel` 1).",
|
|
1354
|
+
"unit": "ms",
|
|
1355
|
+
"value": 500
|
|
1356
|
+
},
|
|
1357
|
+
"ROTARY_DRUM_ACCEL_MS": {
|
|
1358
|
+
"rel": "data/kernels/rotary.json",
|
|
1359
|
+
"kind": "scalar",
|
|
1360
|
+
"doc": "The drum rotor's speed-up time constant, ms (at `accel` 1).",
|
|
1361
|
+
"unit": "ms",
|
|
1362
|
+
"value": 1700
|
|
1363
|
+
},
|
|
1364
|
+
"ROTARY_DRUM_DECEL_MS": {
|
|
1365
|
+
"rel": "data/kernels/rotary.json",
|
|
1366
|
+
"kind": "scalar",
|
|
1367
|
+
"doc": "The drum rotor's slow-down time constant, ms (at `accel` 1).",
|
|
1368
|
+
"unit": "ms",
|
|
1369
|
+
"value": 1800
|
|
1370
|
+
},
|
|
1371
|
+
"ROTARY_STOP_EPS": {
|
|
1372
|
+
"rel": "data/kernels/rotary.json",
|
|
1373
|
+
"kind": "scalar",
|
|
1374
|
+
"doc": "Below this rate, Hz, a rotor coasting toward `stop` is snapped to exactly 0.",
|
|
1375
|
+
"unit": "",
|
|
1376
|
+
"value": 0.0001
|
|
1377
|
+
},
|
|
1378
|
+
"ROTARY_RING_FLOATS": {
|
|
1379
|
+
"rel": "data/kernels/rotary.json",
|
|
1380
|
+
"kind": "scalar",
|
|
1381
|
+
"doc": "One inline ring per rotor per leg, floats — at least the 192 kHz need of the horn's sweep.",
|
|
1382
|
+
"unit": "",
|
|
1383
|
+
"value": 256
|
|
1384
|
+
},
|
|
394
1385
|
"TRANSIENT_LIMITS": {
|
|
395
1386
|
"rel": "data/kernels/transient.json",
|
|
396
1387
|
"kind": "travels",
|
|
@@ -467,62 +1458,79 @@
|
|
|
467
1458
|
"unit": "",
|
|
468
1459
|
"value": 0.00001
|
|
469
1460
|
},
|
|
470
|
-
"
|
|
471
|
-
"rel": "data/
|
|
472
|
-
"kind": "
|
|
473
|
-
"doc": "The
|
|
474
|
-
"
|
|
475
|
-
"
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
1461
|
+
"TREMOLO_RATE_RANGE": {
|
|
1462
|
+
"rel": "data/kernels/tremolo.json",
|
|
1463
|
+
"kind": "travels",
|
|
1464
|
+
"doc": "The tremolo's LFO rate (the catalogue row's 0.1..20 Hz); 4 Hz is the classic amp tremolo.",
|
|
1465
|
+
"shape": "travel",
|
|
1466
|
+
"value": {
|
|
1467
|
+
"min": 0.1,
|
|
1468
|
+
"max": 20,
|
|
1469
|
+
"step": 0.01,
|
|
1470
|
+
"unit": "Hz",
|
|
1471
|
+
"default": 4,
|
|
1472
|
+
"defaultFrom": "desk"
|
|
1473
|
+
}
|
|
1474
|
+
},
|
|
1475
|
+
"TREMOLO_DEPTH_RANGE": {
|
|
1476
|
+
"rel": "data/kernels/tremolo.json",
|
|
1477
|
+
"kind": "travels",
|
|
1478
|
+
"doc": "The tremolo's modulation depth: the gain's trough is `1 − mix·depth`.",
|
|
1479
|
+
"shape": "travel",
|
|
1480
|
+
"value": {
|
|
1481
|
+
"min": 0,
|
|
1482
|
+
"max": 100,
|
|
1483
|
+
"step": 0.1,
|
|
1484
|
+
"unit": "%",
|
|
1485
|
+
"default": 50,
|
|
1486
|
+
"defaultFrom": "desk"
|
|
1487
|
+
}
|
|
1488
|
+
},
|
|
1489
|
+
"TREMOLO_MIX_RANGE": {
|
|
1490
|
+
"rel": "data/kernels/tremolo.json",
|
|
1491
|
+
"kind": "travels",
|
|
1492
|
+
"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).",
|
|
1493
|
+
"shape": "travel",
|
|
1494
|
+
"value": {
|
|
1495
|
+
"min": 0,
|
|
1496
|
+
"max": 100,
|
|
1497
|
+
"step": 0.1,
|
|
1498
|
+
"unit": "%",
|
|
1499
|
+
"default": 100,
|
|
1500
|
+
"defaultFrom": "desk"
|
|
1501
|
+
}
|
|
1502
|
+
},
|
|
1503
|
+
"TREMOLO_TRAVELS": {
|
|
1504
|
+
"rel": "data/kernels/tremolo.json",
|
|
1505
|
+
"kind": "travels",
|
|
1506
|
+
"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).",
|
|
1507
|
+
"shape": "table",
|
|
1508
|
+
"value": {
|
|
1509
|
+
"rateHz": {
|
|
1510
|
+
"min": 0.1,
|
|
1511
|
+
"max": 20,
|
|
1512
|
+
"step": 0.01,
|
|
1513
|
+
"unit": "Hz",
|
|
1514
|
+
"default": 4,
|
|
1515
|
+
"defaultFrom": "desk"
|
|
506
1516
|
},
|
|
507
|
-
{
|
|
508
|
-
"symbol": "tone",
|
|
1517
|
+
"depth": {
|
|
509
1518
|
"min": 0,
|
|
510
|
-
"max":
|
|
511
|
-
"
|
|
512
|
-
"
|
|
513
|
-
"
|
|
514
|
-
"
|
|
1519
|
+
"max": 100,
|
|
1520
|
+
"step": 0.1,
|
|
1521
|
+
"unit": "%",
|
|
1522
|
+
"default": 50,
|
|
1523
|
+
"defaultFrom": "desk"
|
|
515
1524
|
},
|
|
516
|
-
{
|
|
517
|
-
"symbol": "pingpong",
|
|
1525
|
+
"mix": {
|
|
518
1526
|
"min": 0,
|
|
519
|
-
"max":
|
|
520
|
-
"
|
|
521
|
-
"
|
|
522
|
-
"
|
|
523
|
-
"
|
|
1527
|
+
"max": 100,
|
|
1528
|
+
"step": 0.1,
|
|
1529
|
+
"unit": "%",
|
|
1530
|
+
"default": 100,
|
|
1531
|
+
"defaultFrom": "desk"
|
|
524
1532
|
}
|
|
525
|
-
|
|
1533
|
+
}
|
|
526
1534
|
},
|
|
527
1535
|
"BUTTERWORTH_Q": {
|
|
528
1536
|
"rel": "data/primitives.json",
|
|
@@ -563,6 +1571,86 @@
|
|
|
563
1571
|
"unit": "",
|
|
564
1572
|
"value": 1.25
|
|
565
1573
|
},
|
|
1574
|
+
"GATE_CONTINUOUS_TRAVELS": {
|
|
1575
|
+
"rel": "data/primitives.json",
|
|
1576
|
+
"kind": "travels",
|
|
1577
|
+
"doc": "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.",
|
|
1578
|
+
"shape": "table",
|
|
1579
|
+
"value": {
|
|
1580
|
+
"thresholdDb": {
|
|
1581
|
+
"min": -80,
|
|
1582
|
+
"max": 0,
|
|
1583
|
+
"step": 0,
|
|
1584
|
+
"unit": "dB",
|
|
1585
|
+
"default": -40,
|
|
1586
|
+
"defaultFrom": "desk"
|
|
1587
|
+
},
|
|
1588
|
+
"rangeDb": {
|
|
1589
|
+
"min": -90,
|
|
1590
|
+
"max": 0,
|
|
1591
|
+
"step": 0,
|
|
1592
|
+
"unit": "dB",
|
|
1593
|
+
"default": -90,
|
|
1594
|
+
"defaultFrom": "desk"
|
|
1595
|
+
},
|
|
1596
|
+
"releaseMs": {
|
|
1597
|
+
"min": 0,
|
|
1598
|
+
"max": 5000,
|
|
1599
|
+
"step": 0,
|
|
1600
|
+
"unit": "ms",
|
|
1601
|
+
"default": 100,
|
|
1602
|
+
"defaultFrom": "desk"
|
|
1603
|
+
},
|
|
1604
|
+
"ratio": {
|
|
1605
|
+
"min": 1,
|
|
1606
|
+
"max": 100,
|
|
1607
|
+
"step": 0,
|
|
1608
|
+
"unit": "",
|
|
1609
|
+
"default": 16,
|
|
1610
|
+
"defaultFrom": "desk"
|
|
1611
|
+
}
|
|
1612
|
+
}
|
|
1613
|
+
},
|
|
1614
|
+
"COMP_CONTINUOUS_TRAVELS": {
|
|
1615
|
+
"rel": "data/primitives.json",
|
|
1616
|
+
"kind": "travels",
|
|
1617
|
+
"doc": "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.",
|
|
1618
|
+
"shape": "table",
|
|
1619
|
+
"value": {
|
|
1620
|
+
"thresholdDb": {
|
|
1621
|
+
"min": -60,
|
|
1622
|
+
"max": 0,
|
|
1623
|
+
"step": 0,
|
|
1624
|
+
"unit": "dB",
|
|
1625
|
+
"default": -18,
|
|
1626
|
+
"defaultFrom": "desk"
|
|
1627
|
+
},
|
|
1628
|
+
"releaseMs": {
|
|
1629
|
+
"min": 5,
|
|
1630
|
+
"max": 3000,
|
|
1631
|
+
"step": 0,
|
|
1632
|
+
"unit": "ms",
|
|
1633
|
+
"default": 200,
|
|
1634
|
+
"defaultFrom": "desk"
|
|
1635
|
+
}
|
|
1636
|
+
}
|
|
1637
|
+
},
|
|
1638
|
+
"TRIM_TRAVELS": {
|
|
1639
|
+
"rel": "data/primitives.json",
|
|
1640
|
+
"kind": "travels",
|
|
1641
|
+
"doc": "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.",
|
|
1642
|
+
"shape": "table",
|
|
1643
|
+
"value": {
|
|
1644
|
+
"trimDb": {
|
|
1645
|
+
"min": -24,
|
|
1646
|
+
"max": 24,
|
|
1647
|
+
"step": 0.1,
|
|
1648
|
+
"unit": "dB",
|
|
1649
|
+
"default": 0,
|
|
1650
|
+
"defaultFrom": "desk"
|
|
1651
|
+
}
|
|
1652
|
+
}
|
|
1653
|
+
},
|
|
566
1654
|
"STANDARD_SAMPLE_RATES": {
|
|
567
1655
|
"rel": "data/rates.json",
|
|
568
1656
|
"kind": "list",
|