@openmixer/plugin-qualify 0.11.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.
- package/README.md +7 -1
- package/dist/clap-qualify.d.ts +60 -4
- package/dist/clap-qualify.js +141 -3
- package/dist/clap-qualify.js.map +1 -1
- package/dist/host-profiles.d.ts +1 -2
- package/dist/host-profiles.js +12 -2
- package/dist/host-profiles.js.map +1 -1
- package/dist/hosting-codes.d.ts +77 -57
- package/dist/hosting-codes.js +89 -77
- package/dist/hosting-codes.js.map +1 -1
- package/dist/hosting-suitability.d.ts +12 -4
- package/dist/hosting-suitability.js +18 -16
- package/dist/hosting-suitability.js.map +1 -1
- package/dist/measurement/cli.d.ts +8 -1
- package/dist/measurement/cli.js +15 -1
- package/dist/measurement/cli.js.map +1 -1
- package/dist/measurement/format.d.ts +45 -5
- package/dist/measurement/format.js +46 -3
- package/dist/measurement/format.js.map +1 -1
- package/dist/measurement/probe-json.js +3 -0
- package/dist/measurement/probe-json.js.map +1 -1
- package/dist/measurement/sweep-jsonl.js +2 -1
- package/dist/measurement/sweep-jsonl.js.map +1 -1
- package/dist/measurement/vocabulary.d.ts +39 -22
- package/dist/measurement/vocabulary.js +93 -145
- package/dist/measurement/vocabulary.js.map +1 -1
- package/dist/probe-judge.d.ts +6 -1
- package/dist/probe-judge.js +7 -3
- package/dist/probe-judge.js.map +1 -1
- package/dist/probe-output.d.ts +3 -0
- package/dist/probe-output.js +5 -0
- package/dist/probe-output.js.map +1 -1
- package/dist/qualification-record.d.ts +3 -1
- package/dist/qualification-record.js.map +1 -1
- package/fixtures/clap-scan/fake.json +109 -7
- package/fixtures/probe-output/success-msi.json +11 -0
- package/package.json +2 -2
- package/src/clap-qualify.ts +177 -5
- package/src/host-profiles.ts +12 -2
- package/src/hosting-codes.ts +182 -77
- package/src/hosting-suitability.ts +25 -18
- package/src/measurement/cli.ts +21 -1
- package/src/measurement/format.ts +81 -3
- package/src/measurement/probe-json.ts +3 -0
- package/src/measurement/sweep-jsonl.ts +2 -1
- package/src/measurement/vocabulary.ts +148 -149
- package/src/probe-judge.ts +13 -5
- package/src/probe-output.ts +6 -0
- package/src/qualification-record.ts +9 -2
- package/tools/benchmark.py +104 -13
- package/tools/lv2-measure.mjs +2 -0
|
@@ -8,10 +8,16 @@
|
|
|
8
8
|
* whether the plugin has nothing to measure or whether OUR PROBE failed — and each with
|
|
9
9
|
* a plain description a UI can render.
|
|
10
10
|
*
|
|
11
|
-
* Everything is a data table, not a switch.
|
|
12
|
-
*
|
|
13
|
-
*
|
|
11
|
+
* Everything is a data table, not a switch. A consumer that meets a term it does not know
|
|
12
|
+
* must be able to fall back on the `kind`, which is why the readers below return a term record
|
|
13
|
+
* rather than a bare string.
|
|
14
|
+
*
|
|
15
|
+
* The WORDS are omx-contract's (`data/measurement.json` and `data/resource-profile.json`, rendered
|
|
16
|
+
* as `<ITEM>_WORDS`), in its order: a word is added there, once, and every consumer reads it. What
|
|
17
|
+
* stays here is the prose, keyed by the contract's word type, so a word the contract adds without
|
|
18
|
+
* a description here, or a description for a word it lacks, is a type error.
|
|
14
19
|
*/
|
|
20
|
+
import { MEASUREMENT_COST_METHODS_WORDS, MEASUREMENT_LATENCY_METHODS_WORDS, MEASUREMENT_LATENCY_SCALING_NOTES_WORDS, MEASUREMENT_LATENCY_SCALING_WORDS, MEASUREMENT_UNMEASURED_KINDS_WORDS, MEASUREMENT_UNMEASURED_REASONS_WORDS } from "@openmixer/omx-contract";
|
|
15
21
|
/**
|
|
16
22
|
* What an absent figure means for a MERGE, and it is the only distinction that changes
|
|
17
23
|
* behaviour:
|
|
@@ -26,18 +32,17 @@
|
|
|
26
32
|
* a finding nor a failure; it is the shape a PARTIAL run has, and partial runs are
|
|
27
33
|
* first-class here.
|
|
28
34
|
*/
|
|
29
|
-
export type UnmeasuredKind =
|
|
35
|
+
export type UnmeasuredKind = (typeof MEASUREMENT_UNMEASURED_KINDS_WORDS)[number];
|
|
36
|
+
/** One reason a figure may be absent: a word of the contract's MEASUREMENT_UNMEASURED_REASONS. */
|
|
37
|
+
export type UnmeasuredCode = (typeof MEASUREMENT_UNMEASURED_REASONS_WORDS)[number];
|
|
30
38
|
/** One term of the "why is there no figure" vocabulary. */
|
|
31
39
|
export interface UnmeasuredTerm {
|
|
32
|
-
readonly code:
|
|
40
|
+
readonly code: UnmeasuredCode;
|
|
33
41
|
readonly kind: UnmeasuredKind;
|
|
34
42
|
/** Plain description, English. A UI localises from `code`; this is for logs and specs. */
|
|
35
43
|
readonly description: string;
|
|
36
44
|
}
|
|
37
|
-
/**
|
|
38
|
-
* Every reason a figure may be absent. These were derived from a sweep of 958 plugins — each
|
|
39
|
-
* one is an outcome that sweep actually produced, not a hypothetical.
|
|
40
|
-
*/
|
|
45
|
+
/** Every reason a figure may be absent, in the contract's order, of the contract's kind. */
|
|
41
46
|
export declare const UNMEASURED_TERMS: readonly UnmeasuredTerm[];
|
|
42
47
|
/**
|
|
43
48
|
* The vocabulary term for a code, or `undefined` when the code is not one of ours.
|
|
@@ -63,6 +68,8 @@ export interface ScalingTerm {
|
|
|
63
68
|
readonly code: string;
|
|
64
69
|
readonly description: string;
|
|
65
70
|
}
|
|
71
|
+
/** A word of the contract's MEASUREMENT_LATENCY_SCALING. */
|
|
72
|
+
export type ScalingCode = (typeof MEASUREMENT_LATENCY_SCALING_WORDS)[number];
|
|
66
73
|
export declare const SCALING_TERMS: readonly ScalingTerm[];
|
|
67
74
|
/** True when `code` is a scaling term this version of the format defines. */
|
|
68
75
|
export declare function isKnownScalingCode(code: string): boolean;
|
|
@@ -72,22 +79,23 @@ export declare function isKnownScalingCode(code: string): boolean;
|
|
|
72
79
|
* detector's rather than the plugin's, and `informational-rate`, where only a reading below
|
|
73
80
|
* the operational rates breaks the law (`lv2-measurement-interchange.md` §1a).
|
|
74
81
|
*/
|
|
75
|
-
export declare const SCALING_NOTE_TERMS: readonly
|
|
76
|
-
readonly code: "below-budget";
|
|
82
|
+
export declare const SCALING_NOTE_TERMS: readonly {
|
|
83
|
+
readonly code: "below-budget" | "informational-rate";
|
|
77
84
|
readonly description: string;
|
|
78
|
-
}
|
|
79
|
-
readonly code: "informational-rate";
|
|
80
|
-
readonly description: string;
|
|
81
|
-
}];
|
|
85
|
+
}[];
|
|
82
86
|
/** One of the {@link SCALING_NOTE_TERMS} codes — the words `latency.scalingNote` may carry. */
|
|
83
|
-
export type ScalingNoteCode = (typeof
|
|
87
|
+
export type ScalingNoteCode = (typeof MEASUREMENT_LATENCY_SCALING_NOTES_WORDS)[number];
|
|
84
88
|
/**
|
|
85
89
|
* Why one rate's reading was excluded from the fit and from every rate resolution. A
|
|
86
90
|
* failed reading served as an exact answer is worse than no reading, because a zero reads
|
|
87
91
|
* as confidence.
|
|
88
92
|
*/
|
|
89
93
|
export declare const EXCLUSION_TERMS: readonly ScalingTerm[];
|
|
90
|
-
/**
|
|
94
|
+
/** How a latency figure was taken: a word of the contract's MEASUREMENT_LATENCY_METHODS. */
|
|
95
|
+
export type LatencyMethodCode = (typeof MEASUREMENT_LATENCY_METHODS_WORDS)[number];
|
|
96
|
+
/** How a cost figure was taken: a word of the contract's MEASUREMENT_COST_METHODS. */
|
|
97
|
+
export type CostMethodCode = (typeof MEASUREMENT_COST_METHODS_WORDS)[number];
|
|
98
|
+
/** The measurement methods the format has names for: the latency methods, then the cost methods. */
|
|
91
99
|
export declare const METHOD_TERMS: readonly ScalingTerm[];
|
|
92
100
|
/** True when `code` is a method term this version of the format defines. */
|
|
93
101
|
export declare function isKnownMethodCode(code: string): boolean;
|
|
@@ -116,15 +124,24 @@ export type MeasurementDimension = (typeof MEASUREMENT_DIMENSIONS)[number];
|
|
|
116
124
|
/** `value` as a dimension, or `undefined` when it is not one. */
|
|
117
125
|
export declare function readDimension(value: unknown): MeasurementDimension | undefined;
|
|
118
126
|
/**
|
|
119
|
-
* The four ratings a verdict speaks (`lv2-measurement-interchange.md` §3b)
|
|
120
|
-
* rating vocabulary (`rating.ts`) derives its type from it, so
|
|
121
|
-
* can never disagree on a word.
|
|
127
|
+
* The four ratings a verdict speaks (`lv2-measurement-interchange.md` §3b): the contract's
|
|
128
|
+
* MEASUREMENT_VERDICT_RATINGS. The rating vocabulary (`rating.ts`) derives its type from it, so
|
|
129
|
+
* the document and the classifier can never disagree on a word.
|
|
122
130
|
*/
|
|
123
131
|
export declare const VERDICT_RATINGS: readonly ["suitable", "conditional", "unknown", "unsuitable"];
|
|
124
132
|
export type VerdictRating = (typeof VERDICT_RATINGS)[number];
|
|
125
|
-
/** How a host runs its plugins. */
|
|
133
|
+
/** How a host runs its plugins: the contract's RESOURCE_HOST_ISOLATIONS. */
|
|
126
134
|
export declare const HOST_ISOLATIONS: readonly ["in-process", "per-process", "shared-process"];
|
|
127
135
|
export type HostIsolation = (typeof HOST_ISOLATIONS)[number];
|
|
128
|
-
/** Whether a host aligns on a plugin's reported latency (`compensated`) or only passes it on. */
|
|
136
|
+
/** Whether a host aligns on a plugin's reported latency (`compensated`) or only passes it on: the contract's RESOURCE_HOST_LATENCY_HANDLING. */
|
|
129
137
|
export declare const HOST_LATENCY_HANDLING: readonly ["compensated", "uncompensated"];
|
|
130
138
|
export type HostLatencyHandling = (typeof HOST_LATENCY_HANDLING)[number];
|
|
139
|
+
/**
|
|
140
|
+
* Where the number of notes an instrument's cost was measured with came from: `declared` is the voice
|
|
141
|
+
* capacity the plugin declares (CLAP's voice-info, read after activate at that rate); `probe` is a count
|
|
142
|
+
* the caller gave (`--probe-notes`, the console's `SYNTH_VOICE_PROBE_NOTES`), used when the plugin declares
|
|
143
|
+
* none or when the caller asked for that count whatever it declares.
|
|
144
|
+
*/
|
|
145
|
+
export declare const VOICE_BASES: readonly ["declared", "probe"];
|
|
146
|
+
export type VoiceBasis = (typeof VOICE_BASES)[number];
|
|
147
|
+
export declare function isVoiceBasis(value: unknown): value is VoiceBasis;
|
|
@@ -10,93 +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.
|
|
14
|
-
*
|
|
15
|
-
*
|
|
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
|
|
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
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
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: "refused-instantiation",
|
|
58
|
-
kind: "probe-failed",
|
|
59
|
-
description: "The plugin would not instantiate at this rate or block size.",
|
|
60
|
-
},
|
|
61
|
-
{
|
|
62
|
-
code: "probe-crashed",
|
|
63
|
-
kind: "probe-failed",
|
|
64
|
-
description: "The probe worker died (signal or abort) while hosting this plugin.",
|
|
65
|
-
},
|
|
66
|
-
{
|
|
67
|
-
code: "probe-timeout",
|
|
68
|
-
kind: "probe-failed",
|
|
69
|
-
description: "The probe exceeded its per-plugin time limit and was abandoned.",
|
|
70
|
-
},
|
|
71
|
-
{
|
|
72
|
-
code: "non-finite-output",
|
|
73
|
-
kind: "probe-failed",
|
|
74
|
-
description: "Output contained NaN or infinity, so no onset or block time could be trusted.",
|
|
75
|
-
},
|
|
76
|
-
{
|
|
77
|
-
code: "not-installed",
|
|
78
|
-
kind: "probe-failed",
|
|
79
|
-
description: "The URI was not present in this machine's LV2 world. A fact about this installation, " +
|
|
80
|
-
"not about the plugin — another host may well have it.",
|
|
81
|
-
},
|
|
82
|
-
{
|
|
83
|
-
code: "worker-nonconforming",
|
|
84
|
-
kind: "probe-failed",
|
|
85
|
-
description: "The plugin's LV2_Worker_Interface leaves work or work_response NULL, which the LV2 worker " +
|
|
86
|
-
"specification does not allow: it was refused before any call, not measured.",
|
|
87
|
-
},
|
|
88
|
-
{
|
|
89
|
-
code: "probe-error",
|
|
90
|
-
kind: "probe-failed",
|
|
91
|
-
description: "The probe reported a failure with no more specific term. Its own words are kept verbatim " +
|
|
92
|
-
"in the measurement's `unmeasuredDetail`, so a coarse code never destroys the detail.",
|
|
93
|
-
},
|
|
94
|
-
{
|
|
95
|
-
code: "not-attempted",
|
|
96
|
-
kind: "not-attempted",
|
|
97
|
-
description: "This run did not cover this plugin for this dimension. A partial run, not a finding.",
|
|
98
|
-
},
|
|
99
|
-
];
|
|
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] }));
|
|
100
62
|
const UNMEASURED_BY_CODE = new Map(UNMEASURED_TERMS.map((term) => [term.code, term]));
|
|
101
63
|
/**
|
|
102
64
|
* The vocabulary term for a code, or `undefined` when the code is not one of ours.
|
|
@@ -119,24 +81,15 @@ export function unmeasuredKind(code) {
|
|
|
119
81
|
return "not-attempted";
|
|
120
82
|
return UNMEASURED_BY_CODE.get(code)?.kind ?? "probe-failed";
|
|
121
83
|
}
|
|
122
|
-
export const SCALING_TERMS =
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
{ code: "zero", description: "No latency a mix can notice at any measured rate." },
|
|
132
|
-
{
|
|
133
|
-
code: "nonconforming",
|
|
134
|
-
description: "Fits neither law at a magnitude that reaches a mix: the plugin changes what it does with " +
|
|
135
|
-
"the rate. Flagged rather than averaged; nothing may be projected from it.",
|
|
136
|
-
},
|
|
137
|
-
{ code: "single-rate", description: "One usable reading, so no law can be fitted." },
|
|
138
|
-
{ code: "unmeasured", description: "No rate produced a figure." },
|
|
139
|
-
];
|
|
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
|
+
});
|
|
140
93
|
const SCALING_CODES = new Set(SCALING_TERMS.map((t) => t.code));
|
|
141
94
|
/** True when `code` is a scaling term this version of the format defines. */
|
|
142
95
|
export function isKnownScalingCode(code) {
|
|
@@ -148,49 +101,34 @@ export function isKnownScalingCode(code) {
|
|
|
148
101
|
* detector's rather than the plugin's, and `informational-rate`, where only a reading below
|
|
149
102
|
* the operational rates breaks the law (`lv2-measurement-interchange.md` §1a).
|
|
150
103
|
*/
|
|
151
|
-
export const SCALING_NOTE_TERMS =
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
{
|
|
158
|
-
code: "informational-rate",
|
|
159
|
-
description: "The readings together fit no law, but those at the operational rates (48 kHz and up) do; " +
|
|
160
|
-
"the reading below them stays in perRate as information and does not flag the plugin.",
|
|
161
|
-
},
|
|
162
|
-
];
|
|
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
|
+
});
|
|
163
110
|
/**
|
|
164
111
|
* Why one rate's reading was excluded from the fit and from every rate resolution. A
|
|
165
112
|
* failed reading served as an exact answer is worse than no reading, because a zero reads
|
|
166
113
|
* as confidence.
|
|
167
114
|
*/
|
|
168
|
-
export const EXCLUSION_TERMS =
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
},
|
|
174
|
-
];
|
|
175
|
-
// ---------------------------------------------------------------------------
|
|
176
|
-
// How a figure was taken
|
|
177
|
-
// ---------------------------------------------------------------------------
|
|
178
|
-
/** 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. */
|
|
179
120
|
export const METHOD_TERMS = [
|
|
180
|
-
{
|
|
181
|
-
|
|
182
|
-
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 " +
|
|
183
123
|
"residual floor. Measures the plugin, not what it declares.",
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
code: "block-time-percentile",
|
|
191
|
-
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 " +
|
|
192
130
|
"discarded, normalised to nanoseconds per sample.",
|
|
193
|
-
},
|
|
131
|
+
}),
|
|
194
132
|
];
|
|
195
133
|
const METHOD_CODES = new Set(METHOD_TERMS.map((t) => t.code));
|
|
196
134
|
/** True when `code` is a method term this version of the format defines. */
|
|
@@ -204,7 +142,7 @@ export function isKnownMethodCode(code) {
|
|
|
204
142
|
* hosting verdict — whether a plugin survives, whether its `run()` is RT-clean, what it
|
|
205
143
|
* demands of a host — and merge under exactly the same per-plugin, per-DIMENSION precedence.
|
|
206
144
|
*/
|
|
207
|
-
export const MEASUREMENT_DIMENSIONS =
|
|
145
|
+
export const MEASUREMENT_DIMENSIONS = MEASUREMENT_DIMENSIONS_WORDS;
|
|
208
146
|
/**
|
|
209
147
|
* The dimensions the standalone prober (`scan.py` + `benchmark.py`, driven by `lv2-measure.mjs`
|
|
210
148
|
* and the console's Setup analysis) can measure. The three hosting dimensions come from a
|
|
@@ -223,13 +161,23 @@ export function readDimension(value) {
|
|
|
223
161
|
return MEASUREMENT_DIMENSIONS.find((d) => d === text);
|
|
224
162
|
}
|
|
225
163
|
/**
|
|
226
|
-
* The four ratings a verdict speaks (`lv2-measurement-interchange.md` §3b)
|
|
227
|
-
* rating vocabulary (`rating.ts`) derives its type from it, so
|
|
228
|
-
* 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.
|
|
167
|
+
*/
|
|
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;
|
|
173
|
+
/**
|
|
174
|
+
* Where the number of notes an instrument's cost was measured with came from: `declared` is the voice
|
|
175
|
+
* capacity the plugin declares (CLAP's voice-info, read after activate at that rate); `probe` is a count
|
|
176
|
+
* the caller gave (`--probe-notes`, the console's `SYNTH_VOICE_PROBE_NOTES`), used when the plugin declares
|
|
177
|
+
* none or when the caller asked for that count whatever it declares.
|
|
229
178
|
*/
|
|
230
|
-
export const
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
export const HOST_LATENCY_HANDLING = ["compensated", "uncompensated"];
|
|
179
|
+
export const VOICE_BASES = MEASUREMENT_VOICE_BASES_WORDS;
|
|
180
|
+
export function isVoiceBasis(value) {
|
|
181
|
+
return VOICE_BASES.some((b) => b === value);
|
|
182
|
+
}
|
|
235
183
|
//# sourceMappingURL=vocabulary.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"vocabulary.js","sourceRoot":"","sources":["../../src/measurement/vocabulary.ts"],"names":[],"mappings":"AAAA,4CAA4C;AAC5C,sDAAsD;AACtD
|
|
1
|
+
{"version":3,"file":"vocabulary.js","sourceRoot":"","sources":["../../src/measurement/vocabulary.ts"],"names":[],"mappings":"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"}
|
package/dist/probe-judge.d.ts
CHANGED
|
@@ -3,6 +3,7 @@ import type { HostProfile } from "./host-profiles.js";
|
|
|
3
3
|
import { type ProbeOutput } from "./probe-output.js";
|
|
4
4
|
import type { QualifyVerdict } from "./qualify-cli.js";
|
|
5
5
|
import { type SuitabilityRating } from "./rating.js";
|
|
6
|
+
import type { VoicesHeld } from "./measurement/format.js";
|
|
6
7
|
/** Facts of the descriptor, which the probe output repeats none of. */
|
|
7
8
|
export interface JudgeFacts {
|
|
8
9
|
/** Note input ports the plugin declares. */
|
|
@@ -34,10 +35,14 @@ export interface HostJudgment {
|
|
|
34
35
|
/** In-process only for a suitable plugin on a host that runs its plugins in its own process, else isolated. */
|
|
35
36
|
readonly hosting: "in-process" | "isolated";
|
|
36
37
|
readonly reasons: readonly RecordReason[];
|
|
37
|
-
/**
|
|
38
|
+
/**
|
|
39
|
+
* The cost reasons at this host's rate and quantum, kept beside the verdict, not folded into it; for an instrument,
|
|
40
|
+
* the notes it held while that figure was timed.
|
|
41
|
+
*/
|
|
38
42
|
readonly cost: {
|
|
39
43
|
readonly rate: number;
|
|
40
44
|
readonly quantum: number;
|
|
45
|
+
readonly voices?: VoicesHeld;
|
|
41
46
|
readonly reasons: readonly RecordReason[];
|
|
42
47
|
};
|
|
43
48
|
}
|
package/dist/probe-judge.js
CHANGED
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
import { DEFAULT_HOSTING_POLICY } from "./qualify-declarations.js";
|
|
20
20
|
import { rtSafetyDocument, } from "./clap-qualify.js";
|
|
21
21
|
import { gridCostReadings } from "./cost-fields.js";
|
|
22
|
-
import { hostingCostReasons, rtSafetyReasons, contributedHostingRating, } from "./hosting-suitability.js";
|
|
22
|
+
import { hostingCostReasons, noteSweepReasons, rtSafetyReasons, contributedHostingRating, } from "./hosting-suitability.js";
|
|
23
23
|
import { PROBE_NOT_ATTEMPTED, PROBE_OK } from "./probe-output.js";
|
|
24
24
|
import { RATING_SEVERITY, worstRating } from "./rating.js";
|
|
25
25
|
/** A sum of one count over the points, or `undefined` when a point lacks it: a missing count is not zero. */
|
|
@@ -140,7 +140,8 @@ function decidingOf(reasons, rating) {
|
|
|
140
140
|
function costOf(output, profile) {
|
|
141
141
|
const { rate, quantum } = profile.cost;
|
|
142
142
|
const reasons = hostingCostReasons({ cpuCost: { perRateQuantum: gridCostReadings(output.grid, PROBE_OK) } }, { rate, quantum, profile }, DEFAULT_HOSTING_POLICY);
|
|
143
|
-
|
|
143
|
+
const voices = output.grid.find((p) => p.outcome === PROBE_OK && p.rate === rate && p.quantum === quantum)?.cost?.voices;
|
|
144
|
+
return { rate, quantum, ...(voices === undefined ? {} : { voices }), reasons: reasons.map(asRecordReason) };
|
|
144
145
|
}
|
|
145
146
|
/**
|
|
146
147
|
* The outcome that ended the run badly, or `undefined` when it ended well. The run's own outcome is the
|
|
@@ -186,7 +187,10 @@ export function judgeProbeOutput(output, profiles, facts = {}) {
|
|
|
186
187
|
reasons = doc.verdict.reasons.map(asRecordReason);
|
|
187
188
|
}
|
|
188
189
|
else {
|
|
189
|
-
|
|
190
|
+
// an LV2 plugin: the control sweep's counts, and the note sweep's when it was played through a MIDI input
|
|
191
|
+
const rt = rtSafetyOfProbeOutput(output);
|
|
192
|
+
const notes = noteSweepOfProbeOutput(output, rt);
|
|
193
|
+
reasons = [...rtSafetyReasons(rt), ...noteSweepReasons(notes, facts.noteInputs ?? (notes.applicable ? 1 : 0))].map(asRecordReason);
|
|
190
194
|
}
|
|
191
195
|
const rating = worstRating(reasons.map((r) => r.rating));
|
|
192
196
|
const deciding = decidingOf(reasons, rating);
|
package/dist/probe-judge.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"probe-judge.js","sourceRoot":"","sources":["../src/probe-judge.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"probe-judge.js","sourceRoot":"","sources":["../src/probe-judge.ts"],"names":[],"mappings":"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"}
|
package/dist/probe-output.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { type VoicesHeld } from "./measurement/format.js";
|
|
1
2
|
export declare const PROBE_OUTPUT_FORMAT = "plugin-hostd.probe-output";
|
|
2
3
|
/** The one major this reader knows. A minor of it only adds fields. */
|
|
3
4
|
export declare const PROBE_OUTPUT_MAJOR = 1;
|
|
@@ -29,6 +30,8 @@ export interface ProbeCost {
|
|
|
29
30
|
};
|
|
30
31
|
readonly blocks: number;
|
|
31
32
|
readonly warmupBlocks: number;
|
|
33
|
+
/** For an instrument: the notes it held while it was timed, how many and why that many. */
|
|
34
|
+
readonly voices?: VoicesHeld;
|
|
32
35
|
}
|
|
33
36
|
export interface ProbeRtSafety {
|
|
34
37
|
readonly interposer: boolean;
|
package/dist/probe-output.js
CHANGED
|
@@ -19,6 +19,7 @@
|
|
|
19
19
|
*/
|
|
20
20
|
import { createHash } from "node:crypto";
|
|
21
21
|
import { finiteNumber, isRecord, nonEmptyString, optional } from "./measurement/guards.js";
|
|
22
|
+
import { readVoicesHeld } from "./measurement/format.js";
|
|
22
23
|
export const PROBE_OUTPUT_FORMAT = "plugin-hostd.probe-output";
|
|
23
24
|
/** The one major this reader knows. A minor of it only adds fields. */
|
|
24
25
|
export const PROBE_OUTPUT_MAJOR = 1;
|
|
@@ -111,11 +112,15 @@ function readCost(v, where) {
|
|
|
111
112
|
const value = num(pct, "value", `${where} percentile`);
|
|
112
113
|
if (median < 0 || value < 0)
|
|
113
114
|
invalid(`${where} holds a negative cost`);
|
|
115
|
+
const voices = o["voices"] === undefined ? undefined : readVoicesHeld(o["voices"]);
|
|
116
|
+
if (o["voices"] !== undefined && voices === undefined)
|
|
117
|
+
invalid(`${where} voices is not a count of held notes with its basis`);
|
|
114
118
|
return {
|
|
115
119
|
median,
|
|
116
120
|
percentile: { p, value },
|
|
117
121
|
blocks: posInt(o, "blocks", where),
|
|
118
122
|
warmupBlocks: count(o, "warmupBlocks", where),
|
|
123
|
+
...(voices === undefined ? {} : { voices }),
|
|
119
124
|
};
|
|
120
125
|
}
|
|
121
126
|
function readRtSafety(v, where) {
|