@openmixer/omx-contract 2.9.0 → 2.10.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -49,7 +49,7 @@ pkg-config --cflags omx-contract
49
49
  ```
50
50
 
51
51
  Pin one version and build against its renders instead of keeping a copy: the installed package at exactly
52
- that version (`pkg-config --exact-version=2.9.0 omx-contract`), else the npm tarball, unpacked, and
52
+ that version (`pkg-config --exact-version=2.10.1 omx-contract`), else the npm tarball, unpacked, and
53
53
  `omx-contract render --target c --out build/omx-contract/include`. A kernel's controls and readouts, in their
54
54
  order, are in `share/omx-contract/omx-contract.json`; how a declaration is written is in
55
55
  [docs/kernel-files.md](docs/kernel-files.md), and what a readout is in [docs/readouts.md](docs/readouts.md).
@@ -110,11 +110,11 @@
110
110
  "name": "detectorOversampling",
111
111
  "kind": "choice",
112
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`.",
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, `4x` always (omx-dsp's OMX_DYN_OVS_AUTO, _OFF and _X4, in that order, so the index mapping holds). The ids are the console's wire vocabulary (`CompState.detectorOversampling`, what the dynamics row's OPTIONS publishes and a session stores), so the console re-exports this set; it comes up `auto`.",
114
114
  "ids": [
115
115
  "auto",
116
116
  "off",
117
- "x4"
117
+ "4x"
118
118
  ],
119
119
  "default": "auto",
120
120
  "labels": [
@@ -249,10 +249,10 @@ export declare const COMP_LIMITS: {
249
249
  export declare const COMP_KINDS: readonly ["comp", "limiter"];
250
250
 
251
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`.
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, `4x` always (omx-dsp's OMX_DYN_OVS_AUTO, _OFF and _X4, in that order, so the index mapping holds). The ids are the console's wire vocabulary (`CompState.detectorOversampling`, what the dynamics row's OPTIONS publishes and a session stores), so the console re-exports this set; it comes up `auto`.
253
253
  * @see data/kernels/comp.json
254
254
  */
255
- export declare const DETECTOR_OVERSAMPLINGS: readonly ["auto", "off", "x4"];
255
+ export declare const DETECTOR_OVERSAMPLINGS: readonly ["auto", "off", "4x"];
256
256
 
257
257
  /**
258
258
  * Where the compressor's detector listens: `feedforward` hears the slot's input (or its key), `feedback` hears the slot's own pre-make-up output DYN_FB_LOOP_DELAY_SAMPLES late, through one envelope stage, and a keyed slot stays feed-forward (omx-dsp's OMX_DYN_TOPOLOGY_FEEDFORWARD 0 and _FEEDBACK 1, in that order; the set is named for its control, so C spells them OMX_DETECTOR_TOPOLOGY_*). The console's comp row carries it (`detectorTopology`, the SSL bus compressor design §3a) and comes up `feedforward`, so a zeroed atom is the compressor every slot runs.
@@ -255,13 +255,13 @@ export const COMP_KINDS = [
255
255
  ];
256
256
 
257
257
  /**
258
- * 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`.
258
+ * 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, `4x` always (omx-dsp's OMX_DYN_OVS_AUTO, _OFF and _X4, in that order, so the index mapping holds). The ids are the console's wire vocabulary (`CompState.detectorOversampling`, what the dynamics row's OPTIONS publishes and a session stores), so the console re-exports this set; it comes up `auto`.
259
259
  * @see data/kernels/comp.json
260
260
  */
261
261
  export const DETECTOR_OVERSAMPLINGS = [
262
262
  "auto",
263
263
  "off",
264
- "x4"
264
+ "4x"
265
265
  ];
266
266
 
267
267
  /**
@@ -659,7 +659,7 @@ enum omx_delay_pingpongs {
659
659
  enum omx_detector_oversamplings {
660
660
  OMX_DETECTOR_OVERSAMPLINGS_AUTO = 0,
661
661
  OMX_DETECTOR_OVERSAMPLINGS_OFF = 1,
662
- OMX_DETECTOR_OVERSAMPLINGS_X4 = 2,
662
+ OMX_DETECTOR_OVERSAMPLINGS_4X = 2,
663
663
  };
664
664
  #define OMX_DETECTOR_OVERSAMPLINGS_COUNT 3u
665
665
  #define OMX_DETECTOR_OVERSAMPLINGS_DEFAULT OMX_DETECTOR_OVERSAMPLINGS_AUTO
package/lib/semver.mjs CHANGED
@@ -23,7 +23,7 @@ const RANK = { none: 0, patch: 1, minor: 2, major: 3 };
23
23
  * The development-phase rule (omx-contract spec §3.6): while every consumer of
24
24
  * omx-contract is a FreeMixer repository named here, removing an item is MINOR. The rule ends, and
25
25
  * this becomes null so a removal is MAJOR again, in the release that names the first consumer
26
- * outside the list.
26
+ * outside the list. Until then a MAJOR class is released as a minor bump (see refusal).
27
27
  */
28
28
  export const DEVELOPMENT_PHASE = Object.freeze({ consumers: Object.freeze(['omx-dsp', 'omx-plugins', 'openmixer']) });
29
29
  const same = (a, b) => JSON.stringify(a) === JSON.stringify(b);
@@ -155,9 +155,16 @@ export function bumpOf(from, to) {
155
155
  return 'none';
156
156
  }
157
157
 
158
- /** null when bumping `from` -> `to` covers `level`, else the refusal. */
159
- export function refusal(level, from, to) {
158
+ /**
159
+ * null when bumping `from` -> `to` covers `level`, else the refusal. In the development phase no
160
+ * release takes a major bump (operator ruling 2026-10-13: majors wait for the first public
161
+ * release), so a MAJOR class is covered by a minor bump; the classes are still reported as found.
162
+ */
163
+ export function refusal(level, from, to, { developmentPhase = DEVELOPMENT_PHASE } = {}) {
160
164
  let bump;
161
165
  try { bump = bumpOf(from, to); } catch (e) { return e.message; }
162
- return RANK[bump] >= RANK[level] ? null : `the changes since ${from} are ${level.toUpperCase()}, and ${from} -> ${to} is a ${bump} bump`;
166
+ const need = developmentPhase && level === 'major' ? 'minor' : level;
167
+ if (RANK[bump] >= RANK[need]) return null;
168
+ const phase = need === level ? '' : ' (at least a minor in the development phase)';
169
+ return `the changes since ${from} are ${level.toUpperCase()}, and ${from} -> ${to} is a ${bump} bump${phase}`;
163
170
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@openmixer/omx-contract",
3
- "version": "2.9.0",
3
+ "version": "2.10.1",
4
4
  "description": "The FreeMixer declarations as data: a JSON Schema, the data, and one CLI that renders them into C, TypeScript and JSON",
5
5
  "type": "module",
6
6
  "license": "GPL-3.0-or-later",
@@ -181,7 +181,7 @@
181
181
  },
182
182
  "set": {
183
183
  "type": "object",
184
- "description": "Ordered ids with an optional default and labels. The ids and their order are the contract: all strings (the id is the name, its position the value) or all non-negative integers (the id is the value). Labels are face text and optional. The default may be a reference to the scalar that states it: a boolean names the second id of a two-id switch when true, the first when false.",
184
+ "description": "Ordered ids with an optional default and labels. The ids and their order are the contract: all strings of letters and digits (the id is the name, its position the value; an id may start with a digit, as 4x does) or all non-negative integers (the id is the value). Labels are face text and optional. The default may be a reference to the scalar that states it: a boolean names the second id of a two-id switch when true, the first when false.",
185
185
  "properties": {
186
186
  "kind": { "const": "set" },
187
187
  "since": { "$ref": "#/$defs/since" },
@@ -189,11 +189,11 @@
189
189
  "why": { "$ref": "#/$defs/text" },
190
190
  "ids": {
191
191
  "oneOf": [
192
- { "type": "array", "items": { "type": "string", "pattern": "^[A-Za-z][A-Za-z0-9]*$" }, "minItems": 1, "uniqueItems": true },
192
+ { "type": "array", "items": { "type": "string", "pattern": "^[A-Za-z0-9]+$" }, "minItems": 1, "uniqueItems": true },
193
193
  { "type": "array", "items": { "type": "integer", "minimum": 0 }, "minItems": 1, "uniqueItems": true }
194
194
  ]
195
195
  },
196
- "default": { "oneOf": [{ "type": "string", "pattern": "^[A-Za-z][A-Za-z0-9]*$" }, { "type": "integer", "minimum": 0 }, { "$ref": "#/$defs/ref" }] },
196
+ "default": { "oneOf": [{ "type": "string", "pattern": "^[A-Za-z0-9]+$" }, { "type": "integer", "minimum": 0 }, { "$ref": "#/$defs/ref" }] },
197
197
  "labels": { "type": "array", "items": { "$ref": "#/$defs/text" }, "minItems": 1 }
198
198
  },
199
199
  "required": ["kind", "doc", "ids"],
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@openmixer/omx-contract",
3
- "version": "2.9.0",
3
+ "version": "2.10.1",
4
4
  "items": {
5
5
  "PAN_RANGE": {
6
6
  "rel": "data/kernels/balance.json",
@@ -286,7 +286,7 @@
286
286
  "DETECTOR_OVERSAMPLINGS": {
287
287
  "rel": "data/kernels/comp.json",
288
288
  "kind": "set",
289
- "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`.",
289
+ "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, `4x` always (omx-dsp's OMX_DYN_OVS_AUTO, _OFF and _X4, in that order, so the index mapping holds). The ids are the console's wire vocabulary (`CompState.detectorOversampling`, what the dynamics row's OPTIONS publishes and a session stores), so the console re-exports this set; it comes up `auto`.",
290
290
  "default": "auto",
291
291
  "labels": [
292
292
  "Auto",
@@ -296,7 +296,7 @@
296
296
  "value": [
297
297
  "auto",
298
298
  "off",
299
- "x4"
299
+ "4x"
300
300
  ]
301
301
  },
302
302
  "DETECTOR_TOPOLOGY": {