@openmixer/plugin-qualify 0.12.0 → 0.13.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.
@@ -10,110 +10,55 @@
10
10
  * whether the plugin has nothing to measure or whether OUR PROBE failed — and each with
11
11
  * a plain description a UI can render.
12
12
  *
13
- * Everything is a data table, not a switch. Adding a term is one row; a consumer that
14
- * meets a term it does not know must be able to fall back on the `kind`, which is why the
15
- * readers below return a term record rather than a bare string.
13
+ * Everything is a data table, not a switch. A consumer that meets a term it does not know
14
+ * must be able to fall back on the `kind`, which is why the readers below return a term record
15
+ * rather than a bare string.
16
+ *
17
+ * The WORDS are omx-contract's (`data/measurement.json` and `data/resource-profile.json`, rendered
18
+ * as `<ITEM>_WORDS`), in its order: a word is added there, once, and every consumer reads it. What
19
+ * stays here is the prose, keyed by the contract's word type, so a word the contract adds without
20
+ * a description here, or a description for a word it lacks, is a type error.
16
21
  */
22
+ import { MEASUREMENT_COST_METHODS_WORDS, MEASUREMENT_DIMENSIONS_WORDS, MEASUREMENT_LATENCY_EXCLUSIONS_WORDS, MEASUREMENT_LATENCY_METHODS_WORDS, MEASUREMENT_LATENCY_SCALING_NOTES_WORDS, MEASUREMENT_LATENCY_SCALING_WORDS, MEASUREMENT_UNMEASURED_REASONS, MEASUREMENT_VERDICT_RATINGS_WORDS, MEASUREMENT_VOICE_BASES_WORDS, RESOURCE_HOST_ISOLATIONS_WORDS, RESOURCE_HOST_LATENCY_HANDLING_WORDS, } from "@openmixer/omx-contract";
17
23
  import { nonEmptyString } from "./guards.js";
24
+ /** Pairs each word, in the contract's order, with its description here. */
25
+ function described(words, descriptions) {
26
+ return words.map((code) => ({ code, description: descriptions[code] }));
27
+ }
18
28
  /**
19
- * Every reason a figure may be absent. These were derived from a sweep of 958 plugins — each
20
- * one is an outcome that sweep actually produced, not a hypothetical.
29
+ * Every reason a figure may be absent, in plain English. These were derived from a sweep of 958
30
+ * plugins — each one is an outcome that sweep actually produced, not a hypothetical. The words and
31
+ * their kinds are the contract's.
21
32
  */
22
- export const UNMEASURED_TERMS = [
23
- {
24
- code: "no-audio-in",
25
- kind: "nothing-to-measure",
26
- description: "No audio input port: an instrument, a generator or an analyser. Nothing to drive.",
27
- },
28
- {
29
- code: "no-audio-out",
30
- kind: "nothing-to-measure",
31
- description: "No audio output port: a meter or a sink. Nothing to read.",
32
- },
33
- {
34
- code: "silent-output",
35
- kind: "nothing-to-measure",
36
- description: "Instantiated and driven, but emitted nothing under a stimulus that should have passed. " +
37
- "A convolver with no impulse response, a vocoder with no carrier, a gate that never opened.",
38
- },
39
- {
40
- code: "needs-carrier",
41
- kind: "nothing-to-measure",
42
- description: "Requires a second audio input (a carrier or side-chain) the prober did not supply.",
43
- },
44
- {
45
- code: "needs-impulse-response",
46
- kind: "nothing-to-measure",
47
- description: "A convolver requiring an IR file the prober did not load.",
48
- },
49
- {
50
- code: "unpinnable",
51
- kind: "nothing-to-measure",
52
- description: "The files the host loads cannot be pinned (plugin-qualify spec §11.1): a path holding ',', '=' or " +
53
- "whitespace, a manifest using @base or a percent-encoded IRI, or a CLAP plugin with more parameters than the " +
54
- "host accepts. The plugin stays unpinned, never partly pinned.",
55
- },
56
- {
57
- code: "no-voices",
58
- kind: "nothing-to-measure",
59
- description: "An instrument whose voice-info declares a voice capacity of 0: there is no voice to hold down, so its " +
60
- "cost with notes held cannot be taken.",
61
- },
62
- {
63
- code: "notes-unplayable",
64
- kind: "nothing-to-measure",
65
- description: "An instrument whose note input reads no dialect the prober speaks (CLAP's or MIDI's): it cannot be played.",
66
- },
67
- {
68
- code: "voices-unknown",
69
- kind: "not-attempted",
70
- description: "An instrument that declares no voice capacity, measured by a run given no probe count (`--probe-notes`): " +
71
- "the run did not know how many notes to hold, so it timed none.",
72
- },
73
- {
74
- code: "refused-instantiation",
75
- kind: "probe-failed",
76
- description: "The plugin would not instantiate at this rate or block size.",
77
- },
78
- {
79
- code: "probe-crashed",
80
- kind: "probe-failed",
81
- description: "The probe worker died (signal or abort) while hosting this plugin.",
82
- },
83
- {
84
- code: "probe-timeout",
85
- kind: "probe-failed",
86
- description: "The probe exceeded its per-plugin time limit and was abandoned.",
87
- },
88
- {
89
- code: "non-finite-output",
90
- kind: "probe-failed",
91
- description: "Output contained NaN or infinity, so no onset or block time could be trusted.",
92
- },
93
- {
94
- code: "not-installed",
95
- kind: "probe-failed",
96
- description: "The URI was not present in this machine's LV2 world. A fact about this installation, " +
97
- "not about the plugin — another host may well have it.",
98
- },
99
- {
100
- code: "worker-nonconforming",
101
- kind: "probe-failed",
102
- description: "The plugin's LV2_Worker_Interface leaves work or work_response NULL, which the LV2 worker " +
103
- "specification does not allow: it was refused before any call, not measured.",
104
- },
105
- {
106
- code: "probe-error",
107
- kind: "probe-failed",
108
- description: "The probe reported a failure with no more specific term. Its own words are kept verbatim " +
109
- "in the measurement's `unmeasuredDetail`, so a coarse code never destroys the detail.",
110
- },
111
- {
112
- code: "not-attempted",
113
- kind: "not-attempted",
114
- description: "This run did not cover this plugin for this dimension. A partial run, not a finding.",
115
- },
116
- ];
33
+ const UNMEASURED_DESCRIPTIONS = {
34
+ "no-audio-in": "No audio input port: an instrument, a generator or an analyser. Nothing to drive.",
35
+ "no-audio-out": "No audio output port: a meter or a sink. Nothing to read.",
36
+ "silent-output": "Instantiated and driven, but emitted nothing under a stimulus that should have passed. " +
37
+ "A convolver with no impulse response, a vocoder with no carrier, a gate that never opened.",
38
+ "needs-carrier": "Requires a second audio input (a carrier or side-chain) the prober did not supply.",
39
+ "needs-impulse-response": "A convolver requiring an IR file the prober did not load.",
40
+ "unpinnable": "The files the host loads cannot be pinned (plugin-qualify spec §11.1): a path holding ',', '=' or " +
41
+ "whitespace, a manifest using @base or a percent-encoded IRI, or a CLAP plugin with more parameters than the " +
42
+ "host accepts. The plugin stays unpinned, never partly pinned.",
43
+ "no-voices": "An instrument whose voice-info declares a voice capacity of 0: there is no voice to hold down, so its " +
44
+ "cost with notes held cannot be taken.",
45
+ "notes-unplayable": "An instrument whose note input reads no dialect the prober speaks (CLAP's or MIDI's): it cannot be played.",
46
+ "voices-unknown": "An instrument that declares no voice capacity, measured by a run given no probe count (`--probe-notes`): " +
47
+ "the run did not know how many notes to hold, so it timed none.",
48
+ "refused-instantiation": "The plugin would not instantiate at this rate or block size.",
49
+ "probe-crashed": "The probe worker died (signal or abort) while hosting this plugin.",
50
+ "probe-timeout": "The probe exceeded its per-plugin time limit and was abandoned.",
51
+ "non-finite-output": "Output contained NaN or infinity, so no onset or block time could be trusted.",
52
+ "not-installed": "The URI was not present in this machine's LV2 world. A fact about this installation, " +
53
+ "not about the plugin — another host may well have it.",
54
+ "worker-nonconforming": "The plugin's LV2_Worker_Interface leaves work or work_response NULL, which the LV2 worker " +
55
+ "specification does not allow: it was refused before any call, not measured.",
56
+ "probe-error": "The probe reported a failure with no more specific term. Its own words are kept verbatim " +
57
+ "in the measurement's `unmeasuredDetail`, so a coarse code never destroys the detail.",
58
+ "not-attempted": "This run did not cover this plugin for this dimension. A partial run, not a finding.",
59
+ };
60
+ /** Every reason a figure may be absent, in the contract's order, of the contract's kind. */
61
+ export const UNMEASURED_TERMS = Object.values(MEASUREMENT_UNMEASURED_REASONS).map((reason) => ({ code: reason.word, kind: reason.group, description: UNMEASURED_DESCRIPTIONS[reason.word] }));
117
62
  const UNMEASURED_BY_CODE = new Map(UNMEASURED_TERMS.map((term) => [term.code, term]));
118
63
  /**
119
64
  * The vocabulary term for a code, or `undefined` when the code is not one of ours.
@@ -136,24 +81,15 @@ export function unmeasuredKind(code) {
136
81
  return "not-attempted";
137
82
  return UNMEASURED_BY_CODE.get(code)?.kind ?? "probe-failed";
138
83
  }
139
- export const SCALING_TERMS = [
140
- {
141
- code: "fixed-frame",
142
- description: "Constant frame count at every rate — an FFT window. Milliseconds halve when the rate doubles.",
143
- },
144
- {
145
- code: "fixed-time",
146
- description: "Constant milliseconds at every rate — a look-ahead. Frames double when the rate doubles.",
147
- },
148
- { code: "zero", description: "No latency a mix can notice at any measured rate." },
149
- {
150
- code: "nonconforming",
151
- description: "Fits neither law at a magnitude that reaches a mix: the plugin changes what it does with " +
152
- "the rate. Flagged rather than averaged; nothing may be projected from it.",
153
- },
154
- { code: "single-rate", description: "One usable reading, so no law can be fitted." },
155
- { code: "unmeasured", description: "No rate produced a figure." },
156
- ];
84
+ export const SCALING_TERMS = described(MEASUREMENT_LATENCY_SCALING_WORDS, {
85
+ "fixed-frame": "Constant frame count at every rate — an FFT window. Milliseconds halve when the rate doubles.",
86
+ "fixed-time": "Constant milliseconds at every rate — a look-ahead. Frames double when the rate doubles.",
87
+ zero: "No latency a mix can notice at any measured rate.",
88
+ nonconforming: "Fits neither law at a magnitude that reaches a mix: the plugin changes what it does with " +
89
+ "the rate. Flagged rather than averaged; nothing may be projected from it.",
90
+ "single-rate": "One usable reading, so no law can be fitted.",
91
+ unmeasured: "No rate produced a figure.",
92
+ });
157
93
  const SCALING_CODES = new Set(SCALING_TERMS.map((t) => t.code));
158
94
  /** True when `code` is a scaling term this version of the format defines. */
159
95
  export function isKnownScalingCode(code) {
@@ -165,49 +101,34 @@ export function isKnownScalingCode(code) {
165
101
  * detector's rather than the plugin's, and `informational-rate`, where only a reading below
166
102
  * the operational rates breaks the law (`lv2-measurement-interchange.md` §1a).
167
103
  */
168
- export const SCALING_NOTE_TERMS = [
169
- {
170
- code: "below-budget",
171
- description: "The readings fit no law, but every one of them is inside the per-channel latency budget, " +
172
- "so the disagreement is measurement noise rather than plugin behaviour.",
173
- },
174
- {
175
- code: "informational-rate",
176
- description: "The readings together fit no law, but those at the operational rates (48 kHz and up) do; " +
177
- "the reading below them stays in perRate as information and does not flag the plugin.",
178
- },
179
- ];
104
+ export const SCALING_NOTE_TERMS = described(MEASUREMENT_LATENCY_SCALING_NOTES_WORDS, {
105
+ "below-budget": "The readings fit no law, but every one of them is inside the per-channel latency budget, " +
106
+ "so the disagreement is measurement noise rather than plugin behaviour.",
107
+ "informational-rate": "The readings together fit no law, but those at the operational rates (48 kHz and up) do; " +
108
+ "the reading below them stays in perRate as information and does not flag the plugin.",
109
+ });
180
110
  /**
181
111
  * Why one rate's reading was excluded from the fit and from every rate resolution. A
182
112
  * failed reading served as an exact answer is worse than no reading, because a zero reads
183
113
  * as confidence.
184
114
  */
185
- export const EXCLUSION_TERMS = [
186
- {
187
- code: "impossible-zero",
188
- description: "Zero frames at this rate while another rate measured non-zero. Both scaling laws map zero " +
189
- "to zero, so no single latency produces this; the onset detector was defeated.",
190
- },
191
- ];
192
- // ---------------------------------------------------------------------------
193
- // How a figure was taken
194
- // ---------------------------------------------------------------------------
195
- /** The measurement methods the format has names for. */
115
+ export const EXCLUSION_TERMS = described(MEASUREMENT_LATENCY_EXCLUSIONS_WORDS, {
116
+ "impossible-zero": "Zero frames at this rate while another rate measured non-zero. Both scaling laws map zero " +
117
+ "to zero, so no single latency produces this; the onset detector was defeated.",
118
+ });
119
+ /** The measurement methods the format has names for: the latency methods, then the cost methods. */
196
120
  export const METHOD_TERMS = [
197
- {
198
- code: "impulse-onset",
199
- description: "Latency as the round-trip delay from a unit impulse to the first output sample above the " +
121
+ ...described(MEASUREMENT_LATENCY_METHODS_WORDS, {
122
+ "impulse-onset": "Latency as the round-trip delay from a unit impulse to the first output sample above the " +
200
123
  "residual floor. Measures the plugin, not what it declares.",
201
- },
202
- {
203
- code: "declared-port",
204
- description: "Latency read from the plugin's own lv2:latency output port. What it CLAIMS.",
205
- },
206
- {
207
- code: "block-time-percentile",
208
- description: "Cost as a percentile of per-block wall time under a sustained stimulus, warm-up blocks " +
124
+ "declared-port": "Latency read from the plugin's own lv2:latency output port. What it CLAIMS.",
125
+ "note-onset": "An instrument's latency: the delay from a note on to the first output sample above the " +
126
+ "residual floor. Measures what the plugin does with a held note.",
127
+ }),
128
+ ...described(MEASUREMENT_COST_METHODS_WORDS, {
129
+ "block-time-percentile": "Cost as a percentile of per-block wall time under a sustained stimulus, warm-up blocks " +
209
130
  "discarded, normalised to nanoseconds per sample.",
210
- },
131
+ }),
211
132
  ];
212
133
  const METHOD_CODES = new Set(METHOD_TERMS.map((t) => t.code));
213
134
  /** True when `code` is a method term this version of the format defines. */
@@ -221,7 +142,7 @@ export function isKnownMethodCode(code) {
221
142
  * hosting verdict — whether a plugin survives, whether its `run()` is RT-clean, what it
222
143
  * demands of a host — and merge under exactly the same per-plugin, per-DIMENSION precedence.
223
144
  */
224
- export const MEASUREMENT_DIMENSIONS = ["latency", "cost", "stability", "rtSafety", "features"];
145
+ export const MEASUREMENT_DIMENSIONS = MEASUREMENT_DIMENSIONS_WORDS;
225
146
  /**
226
147
  * The dimensions the standalone prober (`scan.py` + `benchmark.py`, driven by `lv2-measure.mjs`
227
148
  * and the console's Setup analysis) can measure. The three hosting dimensions come from a
@@ -240,22 +161,22 @@ export function readDimension(value) {
240
161
  return MEASUREMENT_DIMENSIONS.find((d) => d === text);
241
162
  }
242
163
  /**
243
- * The four ratings a verdict speaks (`lv2-measurement-interchange.md` §3b) — the ONE list; the
244
- * rating vocabulary (`rating.ts`) derives its type from it, so the document and the classifier
245
- * can never disagree on a word.
164
+ * The four ratings a verdict speaks (`lv2-measurement-interchange.md` §3b): the contract's
165
+ * MEASUREMENT_VERDICT_RATINGS. The rating vocabulary (`rating.ts`) derives its type from it, so
166
+ * the document and the classifier can never disagree on a word.
246
167
  */
247
- export const VERDICT_RATINGS = ["suitable", "conditional", "unknown", "unsuitable"];
248
- /** How a host runs its plugins. */
249
- export const HOST_ISOLATIONS = ["in-process", "per-process", "shared-process"];
250
- /** Whether a host aligns on a plugin's reported latency (`compensated`) or only passes it on. */
251
- export const HOST_LATENCY_HANDLING = ["compensated", "uncompensated"];
168
+ export const VERDICT_RATINGS = MEASUREMENT_VERDICT_RATINGS_WORDS;
169
+ /** How a host runs its plugins: the contract's RESOURCE_HOST_ISOLATIONS. */
170
+ export const HOST_ISOLATIONS = RESOURCE_HOST_ISOLATIONS_WORDS;
171
+ /** Whether a host aligns on a plugin's reported latency (`compensated`) or only passes it on: the contract's RESOURCE_HOST_LATENCY_HANDLING. */
172
+ export const HOST_LATENCY_HANDLING = RESOURCE_HOST_LATENCY_HANDLING_WORDS;
252
173
  /**
253
174
  * Where the number of notes an instrument's cost was measured with came from: `declared` is the voice
254
175
  * capacity the plugin declares (CLAP's voice-info, read after activate at that rate); `probe` is a count
255
176
  * the caller gave (`--probe-notes`, the console's `SYNTH_VOICE_PROBE_NOTES`), used when the plugin declares
256
177
  * none or when the caller asked for that count whatever it declares.
257
178
  */
258
- export const VOICE_BASES = ["declared", "probe"];
179
+ export const VOICE_BASES = MEASUREMENT_VOICE_BASES_WORDS;
259
180
  export function isVoiceBasis(value) {
260
181
  return VOICE_BASES.some((b) => b === value);
261
182
  }
@@ -1 +1 @@
1
- {"version":3,"file":"vocabulary.js","sourceRoot":"","sources":["../../src/measurement/vocabulary.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"vocabulary.js","sourceRoot":"","sources":["../../src/measurement/vocabulary.ts"],"names":[],"mappings":"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"}