@audiofab-io/fv1-core 0.5.0 → 0.6.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/dist/spnbank/index.d.ts +49 -7
- package/dist/spnbank/index.d.ts.map +1 -1
- package/dist/spnbank/index.js +99 -15
- package/dist/spnbank/index.js.map +1 -1
- package/package.json +1 -1
package/dist/spnbank/index.d.ts
CHANGED
|
@@ -3,31 +3,68 @@
|
|
|
3
3
|
*
|
|
4
4
|
* A `.spnbank` file is a small JSON manifest describing the eight program
|
|
5
5
|
* slots of an Easy Spin pedal. Each slot points at a workspace-relative
|
|
6
|
-
* `.spn` (FV-1 assembly) or `.spndiagram` (block diagram) file
|
|
7
|
-
*
|
|
8
|
-
*
|
|
6
|
+
* `.spn` (FV-1 assembly) or `.spndiagram` (block diagram) file, and may
|
|
7
|
+
* optionally carry presentation metadata (display name, description, pot
|
|
8
|
+
* labels) that override what would otherwise be derived from the source
|
|
9
|
+
* file or its sibling `.json`.
|
|
9
10
|
*
|
|
10
11
|
* Slot indices in the manifest are 1-based (slot 1..8) for human readability.
|
|
11
12
|
* The runtime API uses 0-based indices via `bankSlotIndex0()`.
|
|
12
13
|
*
|
|
13
14
|
* Round-trip:
|
|
14
15
|
* parseSpnBankJson(serializeSpnBankJson(b)) === b // structurally equal
|
|
16
|
+
*
|
|
17
|
+
* Format versions:
|
|
18
|
+
* v1 — { name?, slots: [{ slot, path }] }
|
|
19
|
+
* v2 — adds top-level metadata (version, description, author, license)
|
|
20
|
+
* and per-slot metadata (name, description, controls). v2 files
|
|
21
|
+
* carry `"version": "2.0"`. Parsers tolerate v1 files (no version
|
|
22
|
+
* field) and read just the basic fields, leaving extras at default.
|
|
15
23
|
*/
|
|
24
|
+
/** Per-pot label for a bank slot. */
|
|
25
|
+
export interface SpnBankSlotControl {
|
|
26
|
+
/** Pot index, 0..2. */
|
|
27
|
+
pot: 0 | 1 | 2;
|
|
28
|
+
/** Short display name (e.g. "Decay"). */
|
|
29
|
+
name: string;
|
|
30
|
+
/** Optional longer description (tooltip-friendly). */
|
|
31
|
+
description?: string;
|
|
32
|
+
/** Optional unit suffix (e.g. "ms", "Hz"). */
|
|
33
|
+
unit?: string;
|
|
34
|
+
}
|
|
16
35
|
/** A single entry in a `.spnbank` file. */
|
|
17
36
|
export interface SpnBankSlot {
|
|
18
37
|
/** 1-based slot number (1..8). */
|
|
19
38
|
slot: number;
|
|
20
|
-
/**
|
|
21
|
-
* string indicates an unassigned slot. */
|
|
39
|
+
/** Path (relative to the bank file's directory, or absolute) to a
|
|
40
|
+
* `.spn` or `.spndiagram` file. Empty string indicates an unassigned slot. */
|
|
22
41
|
path: string;
|
|
42
|
+
/** Optional display name override. Defaults to the file's basename. */
|
|
43
|
+
name?: string;
|
|
44
|
+
/** Optional description (free-form text). */
|
|
45
|
+
description?: string;
|
|
46
|
+
/** Optional pot label overrides. When present, these take precedence over
|
|
47
|
+
* any controls metadata that might exist in a sibling `.json` or in the
|
|
48
|
+
* source `.spndiagram`'s metadata block. */
|
|
49
|
+
controls?: SpnBankSlotControl[];
|
|
23
50
|
}
|
|
24
51
|
/** Parsed `.spnbank` file. */
|
|
25
52
|
export interface SpnBankFile {
|
|
26
|
-
/**
|
|
53
|
+
/** Schema version. v2 files set this to "2.0"; v1 files have no version field. */
|
|
54
|
+
version?: string;
|
|
55
|
+
/** Display name for the bank. Defaults to the filename's basename when not set. */
|
|
27
56
|
name?: string;
|
|
57
|
+
/** Optional bank-level description. */
|
|
58
|
+
description?: string;
|
|
59
|
+
/** Optional bank author / credit. */
|
|
60
|
+
author?: string;
|
|
61
|
+
/** Optional licence string for the bank itself. */
|
|
62
|
+
license?: string;
|
|
28
63
|
/** Always exactly `PROGRAM_SLOT_COUNT` (8) entries, in slot-number order. */
|
|
29
64
|
slots: SpnBankSlot[];
|
|
30
65
|
}
|
|
66
|
+
/** Current schema version emitted by `serializeSpnBankJson`. */
|
|
67
|
+
export declare const SPNBANK_SCHEMA_VERSION = "2.0";
|
|
31
68
|
/** True if a slot has no assigned program. */
|
|
32
69
|
export declare function isSlotEmpty(slot: SpnBankSlot): boolean;
|
|
33
70
|
/** Build an empty bank. All slots unassigned. */
|
|
@@ -38,6 +75,10 @@ export declare function createEmptyBank(name?: string): SpnBankFile;
|
|
|
38
75
|
* back to defaults so tooling can render a usable editor over a corrupt or
|
|
39
76
|
* empty file.
|
|
40
77
|
*
|
|
78
|
+
* Backwards-compatible: v1 files (no `version` field, slots with just
|
|
79
|
+
* `{ slot, path }`) parse cleanly and round-trip through serialize without
|
|
80
|
+
* losing fields.
|
|
81
|
+
*
|
|
41
82
|
* @param text Raw file contents.
|
|
42
83
|
* @param fallbackName Display name to use when the file's `name` field is
|
|
43
84
|
* missing — typically the file basename without `.spnbank`.
|
|
@@ -45,7 +86,8 @@ export declare function createEmptyBank(name?: string): SpnBankFile;
|
|
|
45
86
|
export declare function parseSpnBankJson(text: string, fallbackName?: string): SpnBankFile;
|
|
46
87
|
/**
|
|
47
88
|
* Serialise a `.spnbank` file to JSON text. Output is pretty-printed with
|
|
48
|
-
* 2-space indentation and a trailing newline.
|
|
89
|
+
* 2-space indentation and a trailing newline. Optional fields are omitted
|
|
90
|
+
* when not set, keeping diffs minimal for simple banks.
|
|
49
91
|
*/
|
|
50
92
|
export declare function serializeSpnBankJson(bank: SpnBankFile): string;
|
|
51
93
|
/** Convenience: 0-based index for a slot. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/spnbank/index.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/spnbank/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAIH,qCAAqC;AACrC,MAAM,WAAW,kBAAkB;IACjC,uBAAuB;IACvB,GAAG,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;IACd,yCAAyC;IACzC,IAAI,EAAE,MAAM,CAAA;IACZ,sDAAsD;IACtD,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,8CAA8C;IAC9C,IAAI,CAAC,EAAE,MAAM,CAAA;CACd;AAED,2CAA2C;AAC3C,MAAM,WAAW,WAAW;IAC1B,kCAAkC;IAClC,IAAI,EAAE,MAAM,CAAA;IACZ;mFAC+E;IAC/E,IAAI,EAAE,MAAM,CAAA;IACZ,uEAAuE;IACvE,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,6CAA6C;IAC7C,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB;;iDAE6C;IAC7C,QAAQ,CAAC,EAAE,kBAAkB,EAAE,CAAA;CAChC;AAED,8BAA8B;AAC9B,MAAM,WAAW,WAAW;IAC1B,kFAAkF;IAClF,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,mFAAmF;IACnF,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,uCAAuC;IACvC,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,qCAAqC;IACrC,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,mDAAmD;IACnD,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,6EAA6E;IAC7E,KAAK,EAAE,WAAW,EAAE,CAAA;CACrB;AAED,gEAAgE;AAChE,eAAO,MAAM,sBAAsB,QAAQ,CAAA;AAE3C,8CAA8C;AAC9C,wBAAgB,WAAW,CAAC,IAAI,EAAE,WAAW,GAAG,OAAO,CAEtD;AAED,iDAAiD;AACjD,wBAAgB,eAAe,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,WAAW,CAS1D;AAuDD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,WAAW,CA8BjF;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,WAAW,GAAG,MAAM,CAuB9D;AAED,6CAA6C;AAC7C,wBAAgB,cAAc,CAAC,IAAI,EAAE,WAAW,GAAG,MAAM,CAExD;AAED,sFAAsF;AACtF,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAA"}
|
package/dist/spnbank/index.js
CHANGED
|
@@ -3,17 +3,27 @@
|
|
|
3
3
|
*
|
|
4
4
|
* A `.spnbank` file is a small JSON manifest describing the eight program
|
|
5
5
|
* slots of an Easy Spin pedal. Each slot points at a workspace-relative
|
|
6
|
-
* `.spn` (FV-1 assembly) or `.spndiagram` (block diagram) file
|
|
7
|
-
*
|
|
8
|
-
*
|
|
6
|
+
* `.spn` (FV-1 assembly) or `.spndiagram` (block diagram) file, and may
|
|
7
|
+
* optionally carry presentation metadata (display name, description, pot
|
|
8
|
+
* labels) that override what would otherwise be derived from the source
|
|
9
|
+
* file or its sibling `.json`.
|
|
9
10
|
*
|
|
10
11
|
* Slot indices in the manifest are 1-based (slot 1..8) for human readability.
|
|
11
12
|
* The runtime API uses 0-based indices via `bankSlotIndex0()`.
|
|
12
13
|
*
|
|
13
14
|
* Round-trip:
|
|
14
15
|
* parseSpnBankJson(serializeSpnBankJson(b)) === b // structurally equal
|
|
16
|
+
*
|
|
17
|
+
* Format versions:
|
|
18
|
+
* v1 — { name?, slots: [{ slot, path }] }
|
|
19
|
+
* v2 — adds top-level metadata (version, description, author, license)
|
|
20
|
+
* and per-slot metadata (name, description, controls). v2 files
|
|
21
|
+
* carry `"version": "2.0"`. Parsers tolerate v1 files (no version
|
|
22
|
+
* field) and read just the basic fields, leaving extras at default.
|
|
15
23
|
*/
|
|
16
24
|
import { PROGRAM_SLOT_COUNT } from '../pedal/constants.js';
|
|
25
|
+
/** Current schema version emitted by `serializeSpnBankJson`. */
|
|
26
|
+
export const SPNBANK_SCHEMA_VERSION = '2.0';
|
|
17
27
|
/** True if a slot has no assigned program. */
|
|
18
28
|
export function isSlotEmpty(slot) {
|
|
19
29
|
return !slot.path;
|
|
@@ -21,6 +31,7 @@ export function isSlotEmpty(slot) {
|
|
|
21
31
|
/** Build an empty bank. All slots unassigned. */
|
|
22
32
|
export function createEmptyBank(name) {
|
|
23
33
|
return {
|
|
34
|
+
version: SPNBANK_SCHEMA_VERSION,
|
|
24
35
|
name,
|
|
25
36
|
slots: Array.from({ length: PROGRAM_SLOT_COUNT }, (_, i) => ({
|
|
26
37
|
slot: i + 1,
|
|
@@ -28,6 +39,29 @@ export function createEmptyBank(name) {
|
|
|
28
39
|
})),
|
|
29
40
|
};
|
|
30
41
|
}
|
|
42
|
+
function readControls(input) {
|
|
43
|
+
if (!Array.isArray(input))
|
|
44
|
+
return undefined;
|
|
45
|
+
const out = [];
|
|
46
|
+
for (const entry of input) {
|
|
47
|
+
if (typeof entry !== 'object' || entry === null)
|
|
48
|
+
continue;
|
|
49
|
+
const e = entry;
|
|
50
|
+
const pot = typeof e.pot === 'number' ? e.pot : NaN;
|
|
51
|
+
if (pot !== 0 && pot !== 1 && pot !== 2)
|
|
52
|
+
continue;
|
|
53
|
+
const name = typeof e.name === 'string' ? e.name : '';
|
|
54
|
+
if (!name)
|
|
55
|
+
continue;
|
|
56
|
+
const control = { pot: pot, name };
|
|
57
|
+
if (typeof e.description === 'string' && e.description)
|
|
58
|
+
control.description = e.description;
|
|
59
|
+
if (typeof e.unit === 'string' && e.unit)
|
|
60
|
+
control.unit = e.unit;
|
|
61
|
+
out.push(control);
|
|
62
|
+
}
|
|
63
|
+
return out.length > 0 ? out : undefined;
|
|
64
|
+
}
|
|
31
65
|
function normaliseSlots(input) {
|
|
32
66
|
const empty = () => Array.from({ length: PROGRAM_SLOT_COUNT }, (_, i) => ({ slot: i + 1, path: '' }));
|
|
33
67
|
if (!Array.isArray(input))
|
|
@@ -40,18 +74,27 @@ function normaliseSlots(input) {
|
|
|
40
74
|
continue;
|
|
41
75
|
const e = entry;
|
|
42
76
|
const slot = typeof e.slot === 'number' ? e.slot : NaN;
|
|
43
|
-
const path = typeof e.path === 'string' ? e.path : '';
|
|
44
77
|
if (!Number.isFinite(slot))
|
|
45
78
|
continue;
|
|
46
79
|
if (slot < 1 || slot > PROGRAM_SLOT_COUNT)
|
|
47
80
|
continue;
|
|
48
|
-
|
|
81
|
+
const partial = {
|
|
82
|
+
path: typeof e.path === 'string' ? e.path : '',
|
|
83
|
+
};
|
|
84
|
+
if (typeof e.name === 'string' && e.name)
|
|
85
|
+
partial.name = e.name;
|
|
86
|
+
if (typeof e.description === 'string' && e.description)
|
|
87
|
+
partial.description = e.description;
|
|
88
|
+
const controls = readControls(e.controls);
|
|
89
|
+
if (controls)
|
|
90
|
+
partial.controls = controls;
|
|
91
|
+
bySlot.set(slot, partial);
|
|
49
92
|
}
|
|
50
93
|
const result = empty();
|
|
51
94
|
for (const slot of result) {
|
|
52
|
-
const
|
|
53
|
-
if (
|
|
54
|
-
slot
|
|
95
|
+
const partial = bySlot.get(slot.slot);
|
|
96
|
+
if (partial)
|
|
97
|
+
Object.assign(slot, partial);
|
|
55
98
|
}
|
|
56
99
|
return result;
|
|
57
100
|
}
|
|
@@ -61,6 +104,10 @@ function normaliseSlots(input) {
|
|
|
61
104
|
* back to defaults so tooling can render a usable editor over a corrupt or
|
|
62
105
|
* empty file.
|
|
63
106
|
*
|
|
107
|
+
* Backwards-compatible: v1 files (no `version` field, slots with just
|
|
108
|
+
* `{ slot, path }`) parse cleanly and round-trip through serialize without
|
|
109
|
+
* losing fields.
|
|
110
|
+
*
|
|
64
111
|
* @param text Raw file contents.
|
|
65
112
|
* @param fallbackName Display name to use when the file's `name` field is
|
|
66
113
|
* missing — typically the file basename without `.spnbank`.
|
|
@@ -79,20 +126,57 @@ export function parseSpnBankJson(text, fallbackName) {
|
|
|
79
126
|
if (typeof raw !== 'object' || raw === null) {
|
|
80
127
|
return createEmptyBank(fallbackName);
|
|
81
128
|
}
|
|
129
|
+
// Build the bank with its keys in the same order the serialiser emits
|
|
130
|
+
// them so parse→serialise round-trips produce identical JSON output.
|
|
131
|
+
// JS preserves insertion order, so we add slots last and use a partial-
|
|
132
|
+
// object pattern to avoid pinning `slots` as the first key.
|
|
82
133
|
const obj = raw;
|
|
134
|
+
const bank = {};
|
|
135
|
+
if (typeof obj.version === 'string' && obj.version)
|
|
136
|
+
bank.version = obj.version;
|
|
83
137
|
const name = typeof obj.name === 'string' && obj.name ? obj.name : fallbackName;
|
|
84
|
-
|
|
85
|
-
|
|
138
|
+
if (name !== undefined)
|
|
139
|
+
bank.name = name;
|
|
140
|
+
if (typeof obj.description === 'string' && obj.description)
|
|
141
|
+
bank.description = obj.description;
|
|
142
|
+
if (typeof obj.author === 'string' && obj.author)
|
|
143
|
+
bank.author = obj.author;
|
|
144
|
+
if (typeof obj.license === 'string' && obj.license)
|
|
145
|
+
bank.license = obj.license;
|
|
146
|
+
bank.slots = normaliseSlots(obj.slots);
|
|
147
|
+
return bank;
|
|
86
148
|
}
|
|
87
149
|
/**
|
|
88
150
|
* Serialise a `.spnbank` file to JSON text. Output is pretty-printed with
|
|
89
|
-
* 2-space indentation and a trailing newline.
|
|
151
|
+
* 2-space indentation and a trailing newline. Optional fields are omitted
|
|
152
|
+
* when not set, keeping diffs minimal for simple banks.
|
|
90
153
|
*/
|
|
91
154
|
export function serializeSpnBankJson(bank) {
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
155
|
+
// Stamp newly-written banks with the current schema version so future
|
|
156
|
+
// tooling can detect older files. Files that never had a version stay
|
|
157
|
+
// unversioned only if the caller deliberately clears it.
|
|
158
|
+
const version = bank.version ?? SPNBANK_SCHEMA_VERSION;
|
|
159
|
+
// Build slots without empty optional fields to keep on-disk output clean.
|
|
160
|
+
const slots = bank.slots.map(slot => {
|
|
161
|
+
const out = { slot: slot.slot, path: slot.path };
|
|
162
|
+
if (slot.name)
|
|
163
|
+
out.name = slot.name;
|
|
164
|
+
if (slot.description)
|
|
165
|
+
out.description = slot.description;
|
|
166
|
+
if (slot.controls && slot.controls.length > 0)
|
|
167
|
+
out.controls = slot.controls;
|
|
168
|
+
return out;
|
|
169
|
+
});
|
|
170
|
+
const json = { version };
|
|
171
|
+
if (bank.name)
|
|
172
|
+
json.name = bank.name;
|
|
173
|
+
if (bank.description)
|
|
174
|
+
json.description = bank.description;
|
|
175
|
+
if (bank.author)
|
|
176
|
+
json.author = bank.author;
|
|
177
|
+
if (bank.license)
|
|
178
|
+
json.license = bank.license;
|
|
179
|
+
json.slots = slots;
|
|
96
180
|
return JSON.stringify(json, null, 2) + '\n';
|
|
97
181
|
}
|
|
98
182
|
/** Convenience: 0-based index for a slot. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/spnbank/index.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/spnbank/index.ts"],"names":[],"mappings":"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"}
|