fractal-midi 0.1.0-alpha.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/LICENSE +200 -0
- package/NOTICE +28 -0
- package/README.md +147 -0
- package/dist/am4/applicability.d.ts +61 -0
- package/dist/am4/applicability.d.ts.map +1 -0
- package/dist/am4/applicability.js +285 -0
- package/dist/am4/blockTypes.d.ts +43 -0
- package/dist/am4/blockTypes.d.ts.map +1 -0
- package/dist/am4/blockTypes.js +48 -0
- package/dist/am4/cacheEnums.d.ts +46 -0
- package/dist/am4/cacheEnums.d.ts.map +1 -0
- package/dist/am4/cacheEnums.js +734 -0
- package/dist/am4/cacheParams.d.ts +3533 -0
- package/dist/am4/cacheParams.d.ts.map +1 -0
- package/dist/am4/cacheParams.js +1996 -0
- package/dist/am4/editorControlLabels.d.ts +45 -0
- package/dist/am4/editorControlLabels.d.ts.map +1 -0
- package/dist/am4/editorControlLabels.js +15894 -0
- package/dist/am4/index.d.ts +28 -0
- package/dist/am4/index.d.ts.map +1 -0
- package/dist/am4/index.js +31 -0
- package/dist/am4/ir/preset.d.ts +24 -0
- package/dist/am4/ir/preset.d.ts.map +1 -0
- package/dist/am4/ir/preset.js +12 -0
- package/dist/am4/ir/transpile.d.ts +9 -0
- package/dist/am4/ir/transpile.d.ts.map +1 -0
- package/dist/am4/ir/transpile.js +19 -0
- package/dist/am4/locations.d.ts +32 -0
- package/dist/am4/locations.d.ts.map +1 -0
- package/dist/am4/locations.js +58 -0
- package/dist/am4/paramNames.d.ts +55 -0
- package/dist/am4/paramNames.d.ts.map +1 -0
- package/dist/am4/paramNames.js +863 -0
- package/dist/am4/paramNamesGenerated.d.ts +41 -0
- package/dist/am4/paramNamesGenerated.d.ts.map +1 -0
- package/dist/am4/paramNamesGenerated.js +183 -0
- package/dist/am4/parameterBridge.d.ts +46 -0
- package/dist/am4/parameterBridge.d.ts.map +1 -0
- package/dist/am4/parameterBridge.js +300 -0
- package/dist/am4/params.d.ts +9577 -0
- package/dist/am4/params.d.ts.map +1 -0
- package/dist/am4/params.js +4537 -0
- package/dist/am4/setParam.d.ts +414 -0
- package/dist/am4/setParam.d.ts.map +1 -0
- package/dist/am4/setParam.js +819 -0
- package/dist/am4/shared/paramHelpers.d.ts +55 -0
- package/dist/am4/shared/paramHelpers.d.ts.map +1 -0
- package/dist/am4/shared/paramHelpers.js +146 -0
- package/dist/am4/symbolicIds.d.ts +11 -0
- package/dist/am4/symbolicIds.d.ts.map +1 -0
- package/dist/am4/symbolicIds.js +587 -0
- package/dist/am4/typeApplicability.d.ts +39 -0
- package/dist/am4/typeApplicability.d.ts.map +1 -0
- package/dist/am4/typeApplicability.js +466 -0
- package/dist/am4/variantResolverTables.d.ts +51 -0
- package/dist/am4/variantResolverTables.d.ts.map +1 -0
- package/dist/am4/variantResolverTables.js +3128 -0
- package/dist/axe-fx-ii/blockTypes.d.ts +45 -0
- package/dist/axe-fx-ii/blockTypes.d.ts.map +1 -0
- package/dist/axe-fx-ii/blockTypes.js +116 -0
- package/dist/axe-fx-ii/index.d.ts +5 -0
- package/dist/axe-fx-ii/index.d.ts.map +1 -0
- package/dist/axe-fx-ii/index.js +18 -0
- package/dist/axe-fx-ii/paramAliases.d.ts +54 -0
- package/dist/axe-fx-ii/paramAliases.d.ts.map +1 -0
- package/dist/axe-fx-ii/paramAliases.js +146 -0
- package/dist/axe-fx-ii/params.d.ts +11502 -0
- package/dist/axe-fx-ii/params.d.ts.map +1 -0
- package/dist/axe-fx-ii/params.js +2847 -0
- package/dist/axe-fx-ii/setParam.d.ts +560 -0
- package/dist/axe-fx-ii/setParam.d.ts.map +1 -0
- package/dist/axe-fx-ii/setParam.js +888 -0
- package/dist/axe-fx-iii/blockTypes.d.ts +87 -0
- package/dist/axe-fx-iii/blockTypes.d.ts.map +1 -0
- package/dist/axe-fx-iii/blockTypes.js +156 -0
- package/dist/axe-fx-iii/enumOverlay.d.ts +73 -0
- package/dist/axe-fx-iii/enumOverlay.d.ts.map +1 -0
- package/dist/axe-fx-iii/enumOverlay.js +236 -0
- package/dist/axe-fx-iii/index.d.ts +9 -0
- package/dist/axe-fx-iii/index.d.ts.map +1 -0
- package/dist/axe-fx-iii/index.js +20 -0
- package/dist/axe-fx-iii/params.d.ts +179 -0
- package/dist/axe-fx-iii/params.d.ts.map +1 -0
- package/dist/axe-fx-iii/params.js +6913 -0
- package/dist/axe-fx-iii/setParam.d.ts +460 -0
- package/dist/axe-fx-iii/setParam.d.ts.map +1 -0
- package/dist/axe-fx-iii/setParam.js +910 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +12 -0
- package/dist/shared/checksum.d.ts +10 -0
- package/dist/shared/checksum.d.ts.map +1 -0
- package/dist/shared/checksum.js +14 -0
- package/dist/shared/device.d.ts +195 -0
- package/dist/shared/device.d.ts.map +1 -0
- package/dist/shared/device.js +27 -0
- package/dist/shared/index.d.ts +8 -0
- package/dist/shared/index.d.ts.map +1 -0
- package/dist/shared/index.js +11 -0
- package/dist/shared/lineage/amp-lineage.json +8313 -0
- package/dist/shared/lineage/axefx2-amp-lineage.json +5871 -0
- package/dist/shared/lineage/axefx2-delay-lineage.json +226 -0
- package/dist/shared/lineage/axefx2-drive-lineage.json +575 -0
- package/dist/shared/lineage/axefx2-reverb-lineage.json +467 -0
- package/dist/shared/lineage/cab-lineage.json +10777 -0
- package/dist/shared/lineage/chorus-lineage.json +173 -0
- package/dist/shared/lineage/compressor-lineage.json +338 -0
- package/dist/shared/lineage/delay-lineage.json +313 -0
- package/dist/shared/lineage/drive-lineage.json +1844 -0
- package/dist/shared/lineage/flanger-lineage.json +313 -0
- package/dist/shared/lineage/phaser-lineage.json +208 -0
- package/dist/shared/lineage/reverb-lineage.json +793 -0
- package/dist/shared/lineage/wah-lineage.json +117 -0
- package/dist/shared/lineageLookup.d.ts +69 -0
- package/dist/shared/lineageLookup.d.ts.map +1 -0
- package/dist/shared/lineageLookup.js +196 -0
- package/dist/shared/packValue.d.ts +40 -0
- package/dist/shared/packValue.d.ts.map +1 -0
- package/dist/shared/packValue.js +105 -0
- package/dist/shared/types.d.ts +23 -0
- package/dist/shared/types.d.ts.map +1 -0
- package/dist/shared/types.js +9 -0
- package/package.json +75 -0
|
@@ -0,0 +1,560 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Axe-Fx II family GET/SET_BLOCK_PARAMETER_VALUE message builders.
|
|
3
|
+
*
|
|
4
|
+
* Reference: Fractal Audio Wiki "MIDI_SysEx" page (cached at
|
|
5
|
+
* `docs/_private/wiki-cache/axe-fx-ii-midi-sysex.html`), §"GET/SET_
|
|
6
|
+
* BLOCK_PARAMETER_VALUE" + §"obtaining parameter values".
|
|
7
|
+
*
|
|
8
|
+
* Wire envelope (function ID `0x02`):
|
|
9
|
+
*
|
|
10
|
+
* F0 00 01 74 [model] 02
|
|
11
|
+
* [effectId bits 6-0] [effectId bits 13-7]
|
|
12
|
+
* [paramId bits 6-0] [paramId bits 13-7]
|
|
13
|
+
* [value bits 6-0] [value bits 13-7] [value bits 14-15]
|
|
14
|
+
* [00=query, 01=set]
|
|
15
|
+
* [checksum] F7
|
|
16
|
+
*
|
|
17
|
+
* Value range: 0..65534 (16-bit). Packed across three 7-bit septets
|
|
18
|
+
* because SysEx bytes can't have bit 7 set. The high 2 bits of the
|
|
19
|
+
* 16-bit value land in the bottom 2 bits of the third septet (bits
|
|
20
|
+
* 6..2 of that byte are zero).
|
|
21
|
+
*
|
|
22
|
+
* Status: 🟢 hardware-verified on Quantum 8.02 (2026-05-10). HW-075
|
|
23
|
+
* landed both halves of function 0x02 SET: normal paramId (Amp 1 Bass
|
|
24
|
+
* 5.30 → 6.30, audibly warmer) and paramId=255 bypass (Reverb 1 tail
|
|
25
|
+
* dropped, front-panel LED disengaged). Wiki spec matches Q8.02
|
|
26
|
+
* firmware behavior — no drift detected. HW-077 covers the GET half
|
|
27
|
+
* (function 0x02 query). Byte-exact goldens in
|
|
28
|
+
* `scripts/verify-axe-fx-ii-encoding.ts` lock the encoder.
|
|
29
|
+
*/
|
|
30
|
+
/** Default model byte for the founder's hardware (Axe-Fx II XL+). */
|
|
31
|
+
export declare const AXE_FX_II_XL_PLUS_MODEL_ID = 7;
|
|
32
|
+
/** Wire model byte for each Axe-Fx II family variant. */
|
|
33
|
+
export declare const MODEL_IDS: Readonly<{
|
|
34
|
+
'axe-fx-ii': 3;
|
|
35
|
+
'axe-fx-ii-xl': 6;
|
|
36
|
+
'axe-fx-ii-xl-plus': 7;
|
|
37
|
+
ax8: 8;
|
|
38
|
+
}>;
|
|
39
|
+
export interface AxeFxIIParamId {
|
|
40
|
+
/** 14-bit block instance ID (e.g. 106 = Amp 1, 107 = Amp 2). */
|
|
41
|
+
effectId: number;
|
|
42
|
+
/** 14-bit parameter index within the block (e.g. 1 = Input Drive). */
|
|
43
|
+
paramId: number;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Pack a 16-bit unsigned value into the wire's three 7-bit septets.
|
|
47
|
+
*
|
|
48
|
+
* septet 0 = bits 6..0 (lowest seven bits)
|
|
49
|
+
* septet 1 = bits 13..7 (next seven bits)
|
|
50
|
+
* septet 2 = bits 15..14 (top two bits, zero-padded into a 7-bit byte)
|
|
51
|
+
*
|
|
52
|
+
* Per wiki, valid input range is 0..65534. We accept up to 65535 (the
|
|
53
|
+
* full 16-bit range) so callers can passes through without an extra
|
|
54
|
+
* clamp; firmware reportedly clamps 65535 → 65534 internally.
|
|
55
|
+
*/
|
|
56
|
+
export declare function packValue16(value: number): [number, number, number];
|
|
57
|
+
/** Inverse of `packValue16`. Inputs may have unused upper bits — masked. */
|
|
58
|
+
export declare function unpackValue16(b0: number, b1: number, b2: number): number;
|
|
59
|
+
/**
|
|
60
|
+
* Convert a display value to its corresponding 16-bit wire value, given
|
|
61
|
+
* a param's calibrated `displayMin` / `displayMax` / `displayScale`.
|
|
62
|
+
*
|
|
63
|
+
* Two scale shapes supported:
|
|
64
|
+
*
|
|
65
|
+
* **`'linear'`** (default) — wire 0..65534 maps linearly onto
|
|
66
|
+
* displayMin..displayMax. Confirmed by HW-079 / HW-088 / HW-089 across
|
|
67
|
+
* 0..10 (AMP knobs), 0..100% (mix), -100..+100% (feedback / balance /
|
|
68
|
+
* pan), -80..+20 dB (cab level).
|
|
69
|
+
*
|
|
70
|
+
* **`'log10'`** — wire 0..65534 maps log-base-10 onto
|
|
71
|
+
* displayMin..displayMax. Used for frequency knobs (HW-090 confirmed
|
|
72
|
+
* cab.low_cut 20..2000 Hz and cab.high_cut 200..20000 Hz both fit
|
|
73
|
+
* `displayHz = displayMin × (displayMax/displayMin)^(wire/65534)`
|
|
74
|
+
* exactly at every measured anchor). Requires displayMin > 0.
|
|
75
|
+
*
|
|
76
|
+
* Callers should only invoke this on params with populated displayMin
|
|
77
|
+
* AND displayMax. For uncalibrated params, the tool layer falls back
|
|
78
|
+
* to the wire-value path.
|
|
79
|
+
*
|
|
80
|
+
* Clamps to [displayMin, displayMax] silently — the wire value pins to
|
|
81
|
+
* [0, 65534] either way, so an out-of-range display value rounds to
|
|
82
|
+
* the same endpoint. The tool layer surfaces a clamp note when needed.
|
|
83
|
+
*/
|
|
84
|
+
export type DisplayScale = 'linear' | 'log10';
|
|
85
|
+
export interface DisplayToWireOptions {
|
|
86
|
+
readonly displayMin: number;
|
|
87
|
+
readonly displayMax: number;
|
|
88
|
+
readonly displayScale?: DisplayScale;
|
|
89
|
+
}
|
|
90
|
+
export declare function displayToWire(display: number, opts: DisplayToWireOptions): number;
|
|
91
|
+
/**
|
|
92
|
+
* Inverse of `displayToWire`. Wire 0..65534 → display value via the
|
|
93
|
+
* param's linear or log10 scale.
|
|
94
|
+
*/
|
|
95
|
+
export declare function wireToDisplay(wire: number, opts: DisplayToWireOptions): number;
|
|
96
|
+
export interface BuildOptions {
|
|
97
|
+
/** Target hardware variant. Defaults to XL+ (the founder's device). */
|
|
98
|
+
modelId?: number;
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Build a SET_BLOCK_PARAMETER_VALUE message (function `0x02`, action 1).
|
|
102
|
+
*
|
|
103
|
+
* `value` is the wire-level 16-bit integer (0..65534). Display ↔ wire
|
|
104
|
+
* conversion is the caller's responsibility — see KNOWN_PARAMS in
|
|
105
|
+
* `./params.ts` for per-param display ranges where the wiki documents
|
|
106
|
+
* them, and the §LOUDNESS BUDGET / display-anchor doc for params
|
|
107
|
+
* without populated ranges.
|
|
108
|
+
*/
|
|
109
|
+
export declare function buildSetBlockParameterValue(param: AxeFxIIParamId, value: number, opts?: BuildOptions): number[];
|
|
110
|
+
/**
|
|
111
|
+
* Build a GET_BLOCK_PARAMETER_VALUE request (function `0x02`, action 0).
|
|
112
|
+
*
|
|
113
|
+
* Per wiki: "When you are getting a parameter value you still have to
|
|
114
|
+
* include a parameter value with your message but this value can be 0."
|
|
115
|
+
* We send three zero septets for the value field.
|
|
116
|
+
*/
|
|
117
|
+
export declare function buildGetBlockParameterValue(param: AxeFxIIParamId, opts?: BuildOptions): number[];
|
|
118
|
+
/**
|
|
119
|
+
* Build a block-bypass toggle. Per wiki:
|
|
120
|
+
*
|
|
121
|
+
* "Bypassing/Engaging a Block is also done with this function with
|
|
122
|
+
* parameter 255. Send the value 0 to Engage, 1 to Bypass."
|
|
123
|
+
*/
|
|
124
|
+
export declare function buildSetBlockBypass(effectId: number, bypassed: boolean, opts?: BuildOptions): number[];
|
|
125
|
+
/**
|
|
126
|
+
* Predicate: does `bytes` look like the response to our GET_BLOCK_PARAMETER_VALUE
|
|
127
|
+
* request for `(effectId, paramId)`? The device echoes the same
|
|
128
|
+
* envelope+function+effectId+paramId, then includes the actual wire
|
|
129
|
+
* value, then 5 unknown bytes, then a null-terminated label string.
|
|
130
|
+
*
|
|
131
|
+
* Per wiki §"GET/SET_BLOCK_PARAMETER_VALUE", response payload is:
|
|
132
|
+
* [eff7-0][eff13-7][param7-0][param13-7][val7-0][val13-7][val15-14]
|
|
133
|
+
* [unk1][unk2][unk3][unk4][unk5][label-bytes...][0x00][checksum] F7
|
|
134
|
+
*
|
|
135
|
+
* Distinguishing GET response from a SET echo: the GET response always
|
|
136
|
+
* carries a label string (>= 1 character + null terminator), so total
|
|
137
|
+
* length is well above the SET request's 14 bytes. We use the length
|
|
138
|
+
* cutoff as the discriminator.
|
|
139
|
+
*/
|
|
140
|
+
export declare function isGetBlockParameterResponse(bytes: number[], target: AxeFxIIParamId, expectedModelId?: number): boolean;
|
|
141
|
+
export interface GetBlockParameterResponse {
|
|
142
|
+
/** 16-bit unsigned wire value the device reports as currently held. */
|
|
143
|
+
value: number;
|
|
144
|
+
/** Display label the device shows for this value (e.g. "5.00", "Plexi 50W Hi"). */
|
|
145
|
+
label: string;
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* Parse a GET_BLOCK_PARAMETER_VALUE response. Caller must have already
|
|
149
|
+
* matched it via `isGetBlockParameterResponse` for the right target —
|
|
150
|
+
* this just decodes the value + label string from a known-shape buffer.
|
|
151
|
+
*/
|
|
152
|
+
export declare function parseGetBlockParameterResponse(bytes: number[]): GetBlockParameterResponse;
|
|
153
|
+
/**
|
|
154
|
+
* Build a GET_PRESET_NAME request (function 0x0F). Empty body —
|
|
155
|
+
* envelope + function + checksum + F7.
|
|
156
|
+
*/
|
|
157
|
+
export declare function buildGetPresetName(opts?: BuildOptions): number[];
|
|
158
|
+
export declare function isGetPresetNameResponse(bytes: number[], expectedModelId?: number): boolean;
|
|
159
|
+
/**
|
|
160
|
+
* Parse a GET_PRESET_NAME response. Body is null-terminated ASCII
|
|
161
|
+
* starting at byte 6.
|
|
162
|
+
*/
|
|
163
|
+
export declare function parseGetPresetNameResponse(bytes: number[]): string;
|
|
164
|
+
/**
|
|
165
|
+
* Build a GET_GRID_LAYOUT_AND_ROUTING request (function 0x20). Empty
|
|
166
|
+
* body. Response carries 48× 4-byte grid cells (4 rows × 12 columns).
|
|
167
|
+
*/
|
|
168
|
+
export declare function buildGetGridLayout(opts?: BuildOptions): number[];
|
|
169
|
+
export declare function isGetGridLayoutResponse(bytes: number[], expectedModelId?: number): boolean;
|
|
170
|
+
/**
|
|
171
|
+
* One cell in the 4×12 routing grid. `blockId` is the 14-bit ID per
|
|
172
|
+
* `blockTypes.ts` — block IDs 100..170, shunt IDs 200..235, or 0 for
|
|
173
|
+
* an empty cell. `routingFlags` is a 4-bit mask: bit N set means
|
|
174
|
+
* "connect row (N+1) of the previous column to this cell's input".
|
|
175
|
+
*/
|
|
176
|
+
export interface GridCell {
|
|
177
|
+
/** Column 1..12. */
|
|
178
|
+
col: number;
|
|
179
|
+
/** Row 1..4. */
|
|
180
|
+
row: number;
|
|
181
|
+
/** 14-bit block ID (100-170 = block, 200-235 = shunt, 0 = empty). */
|
|
182
|
+
blockId: number;
|
|
183
|
+
/** Routing-input mask. Bit N (0..3) set ⇒ row N+1 of previous column connects to this input. */
|
|
184
|
+
routingFlags: number;
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* Parse a GET_GRID_LAYOUT_AND_ROUTING response into 48 grid cells.
|
|
188
|
+
*
|
|
189
|
+
* Per wiki §"GET_GRID_LAYOUT_AND_ROUTING": cell order is column-major,
|
|
190
|
+
* top-to-bottom within each column. Cell 0 = (col=1, row=1); cell 1 =
|
|
191
|
+
* (col=1, row=2); ...; cell 4 = (col=2, row=1); etc.
|
|
192
|
+
*
|
|
193
|
+
* Per cell (4 bytes):
|
|
194
|
+
* bytes[0]: blockId bits 6-0
|
|
195
|
+
* bytes[1]: blockId bits 13-7
|
|
196
|
+
* bytes[2]: routing flags
|
|
197
|
+
* bytes[3]: unused (per wiki)
|
|
198
|
+
*/
|
|
199
|
+
export declare function parseGetGridLayoutResponse(bytes: number[]): GridCell[];
|
|
200
|
+
/**
|
|
201
|
+
* Build a SET_SCENE_NUMBER message (function 0x29). Pass scene 0..7
|
|
202
|
+
* to switch; pass undefined to query the current scene (sentinel 0x7F
|
|
203
|
+
* per wiki — response carries the actual scene number).
|
|
204
|
+
*/
|
|
205
|
+
export declare function buildSetSceneNumber(scene: number, opts?: BuildOptions): number[];
|
|
206
|
+
export declare function buildGetSceneNumber(opts?: BuildOptions): number[];
|
|
207
|
+
export declare function isSceneNumberResponse(bytes: number[], expectedModelId?: number): boolean;
|
|
208
|
+
export declare function parseSceneNumberResponse(bytes: number[]): number;
|
|
209
|
+
/**
|
|
210
|
+
* Block channel select (function 0x11) — Axe-Fx II has TWO channels
|
|
211
|
+
* per block (X and Y), distinct from AM4's four-channel A/B/C/D model.
|
|
212
|
+
*
|
|
213
|
+
* Wiki documents the envelope:
|
|
214
|
+
*
|
|
215
|
+
* Request (host → device):
|
|
216
|
+
* F0 00 01 74 [model] 11 [eff_lo] [eff_hi] [chan] [action] [cs] F7
|
|
217
|
+
* chan = 0 (X) or 1 (Y)
|
|
218
|
+
* action = 0 (get current value) or 1 (set)
|
|
219
|
+
*
|
|
220
|
+
* Response/broadcast (device → host):
|
|
221
|
+
* F0 00 01 74 [model] 11 [eff_lo] [eff_hi] [chan] [cs] F7
|
|
222
|
+
*
|
|
223
|
+
* The device emits the response form whenever the active channel for a
|
|
224
|
+
* block changes (e.g. user clicks X/Y in AxeEdit or front-panel) —
|
|
225
|
+
* cross-confirmed via passive capture in
|
|
226
|
+
* `samples/captured/session-60-channel-toggle.syx` (HW-097, 2026-05-11):
|
|
227
|
+
* Amp 1 toggle X→Y produced `F0 00 01 74 07 11 6A 00 01 78 F7`;
|
|
228
|
+
* Y→X produced `F0 00 01 74 07 11 6A 00 00 79 F7`. Checksums verified.
|
|
229
|
+
*
|
|
230
|
+
* Status: 🟢 hardware-verified on Q8.02 (2026-05-11, HW-098). Amp 1
|
|
231
|
+
* X→Y SET round-tripped cleanly: pre-read = X, set wrote Y (12 bytes
|
|
232
|
+
* out), post-read = Y, front panel + AxeEdit both confirmed Y. The
|
|
233
|
+
* 0=X / 1=Y mapping holds; wire envelope is byte-exact with wiki spec
|
|
234
|
+
* and the broadcast capture from HW-097.
|
|
235
|
+
*/
|
|
236
|
+
export type AxeFxIIChannel = 'X' | 'Y';
|
|
237
|
+
export declare function channelToWire(c: AxeFxIIChannel | 0 | 1): number;
|
|
238
|
+
export declare function wireToChannel(b: number): AxeFxIIChannel;
|
|
239
|
+
export declare function buildSetBlockChannel(effectId: number, channel: AxeFxIIChannel | 0 | 1, opts?: BuildOptions): number[];
|
|
240
|
+
export declare function buildGetBlockChannel(effectId: number, opts?: BuildOptions): number[];
|
|
241
|
+
export declare function isGetBlockChannelResponse(bytes: number[], expectedEffectId: number, expectedModelId?: number): boolean;
|
|
242
|
+
export declare function parseGetBlockChannelResponse(bytes: number[]): AxeFxIIChannel;
|
|
243
|
+
/**
|
|
244
|
+
* Switch preset (function 0x3C) — load preset N into the working buffer.
|
|
245
|
+
* Wiki documents the envelope as `F0 00 01 74 [model] 3C [pn_lo]
|
|
246
|
+
* [pn_hi] [cs] F7` where `pn_lo`/`pn_hi` is a 14-bit septet pair
|
|
247
|
+
* encoding the preset number.
|
|
248
|
+
*
|
|
249
|
+
* Axe-Fx II preset numbering: 0-based linear index 0..N across the
|
|
250
|
+
* bank (each bank holds 128 presets typically; XL+ has bigger
|
|
251
|
+
* capacity). 0x14 GET_PRESET_NUMBER returns the same number space.
|
|
252
|
+
*
|
|
253
|
+
* Status: 🟢 hardware-verified on Q8.02 (2026-05-11, HW-100).
|
|
254
|
+
* `preset_number: 0` loaded "59 Bassguy" into the working buffer
|
|
255
|
+
* cleanly; front panel showed slot "1" (the MIDI 0-based index maps
|
|
256
|
+
* to the device's 1-based front-panel display — preset N appears as
|
|
257
|
+
* slot N+1 on the front panel).
|
|
258
|
+
*/
|
|
259
|
+
export declare function buildSwitchPreset(presetNumber: number, opts?: BuildOptions): number[];
|
|
260
|
+
/**
|
|
261
|
+
* Set working-buffer preset name (function 0x09). Wiki documents the
|
|
262
|
+
* envelope as the function byte followed by ASCII characters. Preset
|
|
263
|
+
* names on Axe-Fx II are 32 chars, space-padded.
|
|
264
|
+
*
|
|
265
|
+
* Status: 🟢 hardware-verified on Q8.02 (2026-05-11, HW-100).
|
|
266
|
+
* `"HW-100 Test"` written to the working buffer; immediate
|
|
267
|
+
* `axefx2_get_preset_name` echoed it back; front panel showed the
|
|
268
|
+
* new name. Working-buffer scope confirmed — switching presets
|
|
269
|
+
* discards it (no persistent change to factory slot).
|
|
270
|
+
*/
|
|
271
|
+
export declare function buildSetPresetName(name: string, opts?: BuildOptions): number[];
|
|
272
|
+
/**
|
|
273
|
+
* STORE the working buffer to a user preset slot (function 0x1D).
|
|
274
|
+
*
|
|
275
|
+
* Wire envelope:
|
|
276
|
+
*
|
|
277
|
+
* F0 00 01 74 [model] 1D [preset_high] [preset_low] [cs] F7
|
|
278
|
+
* preset_high = (n >> 7) & 0x7F
|
|
279
|
+
* preset_low = n & 0x7F
|
|
280
|
+
*
|
|
281
|
+
* Note: this function uses **MSB-first** byte ordering for the 14-bit
|
|
282
|
+
* preset number, unlike `buildSwitchPreset` / `buildEnvelope(..., [0x02,
|
|
283
|
+
* ...effectId, ...paramId, ...])` which use LSB-first via `encode14()`.
|
|
284
|
+
* The MSB-first ordering for 0x1D is taken from bspaulding/axe-fx-midi
|
|
285
|
+
* (Rust) and matches the byte order the device uses for its own
|
|
286
|
+
* 0x14 GET_PRESET_NUMBER response (captured session-61 payload `05 3B`
|
|
287
|
+
* for preset 699 = display preset 700).
|
|
288
|
+
*
|
|
289
|
+
* Status: 🟢 hardware-verified on Q8.02 XL+ (HW-102, 2026-05-11).
|
|
290
|
+
* End-to-end round-trip from our encoder landed on the first attempt:
|
|
291
|
+
* `axefx2_save_preset({ preset_number: 699, name: "..." })` produced
|
|
292
|
+
* the captured save sequence, device returned `0x64 1D 00` (OK),
|
|
293
|
+
* working buffer persisted to slot 700 confirmed by founder front-
|
|
294
|
+
* panel inspection. Wire format derived from bspaulding/axe-fx-midi
|
|
295
|
+
* + session-61 passive capture (AxeEdit File → Save Preset); our
|
|
296
|
+
* encoder matches AxeEdit's behavior byte-for-byte.
|
|
297
|
+
*
|
|
298
|
+
* Cross-checks before shipping:
|
|
299
|
+
* - bspaulding's test case (Mark II, preset 217):
|
|
300
|
+
* `[F0 00 01 74 03 1D 01 59 43 F7]` — locked as a golden in
|
|
301
|
+
* `scripts/verify-axe-fx-ii-encoding.ts`.
|
|
302
|
+
* - XL+ encoding for preset 699:
|
|
303
|
+
* `[F0 00 01 74 07 1D 05 3B 21 F7]` — also locked, paired with the
|
|
304
|
+
* captured device-side 0x64 ACK pattern.
|
|
305
|
+
*
|
|
306
|
+
* 0-vs-1 indexing: same as `buildSwitchPreset` — wire is 0-based, the
|
|
307
|
+
* device's front panel displays 1-based. To save to what the user sees
|
|
308
|
+
* as "preset 700," pass `presetNumber: 699`. The tool layer surfaces
|
|
309
|
+
* this in `axefx2_save_preset`'s description so the agent translates.
|
|
310
|
+
*/
|
|
311
|
+
export declare function buildStorePreset(presetNumber: number, opts?: BuildOptions): number[];
|
|
312
|
+
/**
|
|
313
|
+
* Match a MULTIPURPOSE_RESPONSE (function 0x64) acknowledging a
|
|
314
|
+
* STORE_PRESET (function 0x1D) request. The device's response format
|
|
315
|
+
* is `[echoed_fn, result_code]`:
|
|
316
|
+
*
|
|
317
|
+
* F0 00 01 74 [model] 64 1D [result_code] [cs] F7
|
|
318
|
+
* result_code 0x00 = OK
|
|
319
|
+
* result_code 0x05 = parsed but not honored (e.g. malformed payload)
|
|
320
|
+
*
|
|
321
|
+
* Captured session-61, 2026-05-11 from AxeEdit's save-to-slot operation
|
|
322
|
+
* on Q8.02 XL+: `F0 00 01 74 07 64 1D 00 7B F7` (result=OK).
|
|
323
|
+
*/
|
|
324
|
+
export declare function isStorePresetResponse(bytes: readonly number[]): boolean;
|
|
325
|
+
export interface StorePresetResult {
|
|
326
|
+
/** Raw device result code (0x00 = OK). */
|
|
327
|
+
resultCode: number;
|
|
328
|
+
/** True iff resultCode === 0x00. */
|
|
329
|
+
ok: boolean;
|
|
330
|
+
}
|
|
331
|
+
export declare function parseStorePresetResponse(bytes: readonly number[]): StorePresetResult;
|
|
332
|
+
/**
|
|
333
|
+
* GET the device's currently-active preset number (function 0x14).
|
|
334
|
+
*
|
|
335
|
+
* Wire envelope (request): F0 00 01 74 [model] 14 [cs] F7 (no payload)
|
|
336
|
+
* Wire envelope (response): F0 00 01 74 [model] 14 [hi] [lo] [cs] F7
|
|
337
|
+
*
|
|
338
|
+
* **Byte ordering is MSB-first** in the response — `[bits 13-7, bits 6-0]`
|
|
339
|
+
* — contrary to the wiki's "bits 6-0 first" documentation. Empirically
|
|
340
|
+
* disambiguated by session-61 passive capture: payload `05 3B` decodes
|
|
341
|
+
* to wire preset 699 (= front-panel display "slot 700") only under
|
|
342
|
+
* MSB-first, matching the founder's reported state at capture time.
|
|
343
|
+
* LSB-first decode would yield preset 7557, which is impossible (XL+
|
|
344
|
+
* user range is 0..767). See `docs/SYSEX-MAP-AXE-FX-II.md` § 6b.
|
|
345
|
+
*
|
|
346
|
+
* Status: 🟡 wire format from session-61 passive capture; will flip to
|
|
347
|
+
* 🟢 once axefx2_get_active_preset_number lands end-to-end on Q8.02.
|
|
348
|
+
*/
|
|
349
|
+
export declare function buildGetPresetNumber(opts?: BuildOptions): number[];
|
|
350
|
+
export declare function isGetPresetNumberResponse(bytes: readonly number[]): boolean;
|
|
351
|
+
export interface GetPresetNumberResult {
|
|
352
|
+
/** 0-based wire preset number (0..16383). */
|
|
353
|
+
presetNumber: number;
|
|
354
|
+
/** 1-based front-panel display slot (presetNumber + 1). */
|
|
355
|
+
displaySlot: number;
|
|
356
|
+
}
|
|
357
|
+
export declare function parseGetPresetNumberResponse(bytes: readonly number[]): GetPresetNumberResult;
|
|
358
|
+
/**
|
|
359
|
+
* Set the block at a grid cell (function 0x05). Places a block at the
|
|
360
|
+
* specified cell, or clears the cell (blockId = 0). If the block was
|
|
361
|
+
* already on the grid elsewhere, the device MOVES it (clears its
|
|
362
|
+
* previous cell as a side effect).
|
|
363
|
+
*
|
|
364
|
+
* Wire envelope:
|
|
365
|
+
*
|
|
366
|
+
* F0 00 01 74 [model] 05
|
|
367
|
+
* [blockId_lo] [blockId_hi]
|
|
368
|
+
* [cell_idx]
|
|
369
|
+
* [reserved=0]
|
|
370
|
+
* [cs] F7
|
|
371
|
+
*
|
|
372
|
+
* cell_idx = (col_idx × 4) + row_idx
|
|
373
|
+
* col_idx ∈ 0..11 (column 1..12 minus 1)
|
|
374
|
+
* row_idx ∈ 0..3 (row 1..4 minus 1)
|
|
375
|
+
* col-major, top-to-bottom — same ordering as the 0x20
|
|
376
|
+
* GET_GRID_LAYOUT_AND_ROUTING response.
|
|
377
|
+
*
|
|
378
|
+
* blockId = 14-bit, LSB-first septet pair.
|
|
379
|
+
* 0 = empty cell (clears whatever was there)
|
|
380
|
+
* 100..170 = named blocks (see blockTypes.ts)
|
|
381
|
+
* 200..235 = shunts (pass-through cells)
|
|
382
|
+
*
|
|
383
|
+
* reserved = the device accepts 0x00; non-zero behavior is unknown.
|
|
384
|
+
* May be a routing-flag mask in some firmwares; on Q8.02 XL+
|
|
385
|
+
* we observed no effect on routing when set. The device
|
|
386
|
+
* auto-assigns a routing mask to newly-placed cells (e.g.
|
|
387
|
+
* :2 for row-2 placements) regardless of this byte.
|
|
388
|
+
*
|
|
389
|
+
* Decoding evidence (session-62 + session-63 probes, 2026-05-11):
|
|
390
|
+
*
|
|
391
|
+
* Probe (payload bytes after 0x05) Observed effect
|
|
392
|
+
* ─────────────────────────────────────────────────────────
|
|
393
|
+
* 64 00 00 00 → CPR1 at cell 0 (R1C1) ✓ matches
|
|
394
|
+
* 00 00 02 00 → empty at cell 2 (R3C1) ✓ matches (was already empty)
|
|
395
|
+
* 00 00 01 02 → empty at cell 1 (R2C1) ✓ matches (CPR1 cleared)
|
|
396
|
+
* 64 00 01 00 → CPR1 at cell 1 (R2C1) ✓ matches (CPR1 returned)
|
|
397
|
+
*
|
|
398
|
+
* Cell index 1 disambiguates col-major vs row-major: under col-major
|
|
399
|
+
* it points to (col 0, row 1) = R2C1, which IS where the change
|
|
400
|
+
* landed. Under row-major it would point to (row 0, col 1) = R1C2,
|
|
401
|
+
* which is empty and would show no change. Col-major confirmed.
|
|
402
|
+
*
|
|
403
|
+
* Probes with bare (no payload) and 1-byte payload were rejected by
|
|
404
|
+
* the device with non-OK result codes (0x06 / 0x0C) — the 4-byte
|
|
405
|
+
* payload is the minimum the device accepts.
|
|
406
|
+
*
|
|
407
|
+
* KNOWN LIMITATION: this write does NOT propagate routing/cabling.
|
|
408
|
+
* Moving a block out of a cell leaves the downstream block's input
|
|
409
|
+
* mask pointing at empty space (audio dead-end). The agent / user is
|
|
410
|
+
* responsible for re-wiring via a separate mechanism (TBD — likely
|
|
411
|
+
* either byte[3] of this function with the right value, or a sibling
|
|
412
|
+
* function byte like 0x06 which also fires during grid-move captures).
|
|
413
|
+
*
|
|
414
|
+
* Status: 🟢 wire format hardware-validated on Q8.02 XL+
|
|
415
|
+
* (session-63 probe sequence). Routing-propagation limitation
|
|
416
|
+
* documented above.
|
|
417
|
+
*/
|
|
418
|
+
export declare function buildSetGridCell(opts: {
|
|
419
|
+
row: number;
|
|
420
|
+
col: number;
|
|
421
|
+
blockId: number;
|
|
422
|
+
modelId?: number;
|
|
423
|
+
}): number[];
|
|
424
|
+
/**
|
|
425
|
+
* Match a MULTIPURPOSE_RESPONSE (function 0x64) acknowledging a
|
|
426
|
+
* SET_GRID_CELL (function 0x05) request.
|
|
427
|
+
*
|
|
428
|
+
* F0 00 01 74 [model] 64 05 [result_code] [cs] F7
|
|
429
|
+
*
|
|
430
|
+
* Result codes observed on Q8.02 XL+ during decode:
|
|
431
|
+
* 0x00 — OK, write applied
|
|
432
|
+
* 0x06 — payload too short (e.g. bare envelope)
|
|
433
|
+
* 0x0C — payload too short (e.g. 1-byte payload)
|
|
434
|
+
*
|
|
435
|
+
* Other values are unknown; treat any non-0x00 as a rejection.
|
|
436
|
+
*/
|
|
437
|
+
export declare function isSetGridCellResponse(bytes: readonly number[]): boolean;
|
|
438
|
+
export interface SetGridCellResult {
|
|
439
|
+
resultCode: number;
|
|
440
|
+
ok: boolean;
|
|
441
|
+
}
|
|
442
|
+
export declare function parseSetGridCellResponse(bytes: readonly number[]): SetGridCellResult;
|
|
443
|
+
/**
|
|
444
|
+
* Build a SET_CELL_ROUTING message (function 0x06) — add or remove a
|
|
445
|
+
* cable between two adjacent-column grid cells. Companion to
|
|
446
|
+
* `buildSetGridCell` (function 0x05): 0x05 places the block, 0x06 wires
|
|
447
|
+
* its inputs.
|
|
448
|
+
*
|
|
449
|
+
* Wire envelope:
|
|
450
|
+
*
|
|
451
|
+
* F0 00 01 74 [model] 06
|
|
452
|
+
* [src_cell_idx] ← col-major linear index (col-1)*4 + (row-1)
|
|
453
|
+
* [dst_cell_idx] ← col-major linear index; MUST be src_col + 1
|
|
454
|
+
* [connect] ← 0x01 = add cable, 0x00 = remove cable
|
|
455
|
+
* [cs] F7
|
|
456
|
+
*
|
|
457
|
+
* Effect: the device updates `dst_cell.routing_mask` by setting
|
|
458
|
+
* (connect=1) or clearing (connect=0) the bit at index `src_row_0indexed`.
|
|
459
|
+
* The mask byte uses 4-bit input-mask encoding — bit N set means "feed
|
|
460
|
+
* from row N+1 of previous column" (see `parseGetGridLayoutResponse`).
|
|
461
|
+
* So a cable from row 2 → row 2 with src_col=2, dst_col=3 toggles
|
|
462
|
+
* `dst_cell.routing_mask`'s bit 1 (= 0x02) on or off.
|
|
463
|
+
*
|
|
464
|
+
* Status: 🟢 hardware-decoded on Q8.02 XL+ (Session 70, 2026-05-13).
|
|
465
|
+
* Captured AxeEdit's outbound fn 0x06 from a click-to-connect on
|
|
466
|
+
* Amp(R2C2) → Cab(R2C3):
|
|
467
|
+
*
|
|
468
|
+
* F0 00 01 74 07 06 05 09 01 09 F7
|
|
469
|
+
* src_cell = 5 = (2-1)*4 + (2-1) = R2C2
|
|
470
|
+
* dst_cell = 9 = (3-1)*4 + (2-1) = R2C3
|
|
471
|
+
* connect = 1 = add cable
|
|
472
|
+
*
|
|
473
|
+
* Replayed by our own probe with byte-exact match — device acked
|
|
474
|
+
* 0x00 OK and the grid-state read confirmed Cab's routing mask
|
|
475
|
+
* flipped 0x00 → 0x02 ("Cab now feeds from row 2 of col 2 = from Amp").
|
|
476
|
+
*
|
|
477
|
+
* Validates adjacency (`dstCol === srcCol + 1`); the device rejects
|
|
478
|
+
* non-adjacent cables. Cross-row cables (e.g. row 1 of col 5 → row 3
|
|
479
|
+
* of col 6) ARE allowed — that's how parallel paths are wired.
|
|
480
|
+
*/
|
|
481
|
+
export declare function buildSetCellRouting(opts: {
|
|
482
|
+
srcRow: number;
|
|
483
|
+
srcCol: number;
|
|
484
|
+
dstRow: number;
|
|
485
|
+
dstCol: number;
|
|
486
|
+
connect?: boolean;
|
|
487
|
+
modelId?: number;
|
|
488
|
+
}): number[];
|
|
489
|
+
/**
|
|
490
|
+
* Match a MULTIPURPOSE_RESPONSE (function 0x64) acknowledging a
|
|
491
|
+
* SET_CELL_ROUTING (function 0x06) request.
|
|
492
|
+
*
|
|
493
|
+
* F0 00 01 74 [model] 64 06 [result_code] [cs] F7
|
|
494
|
+
*
|
|
495
|
+
* Result codes observed on Q8.02 XL+ during decode:
|
|
496
|
+
* 0x00 — OK, routing updated
|
|
497
|
+
* 0x01 — request rejected (e.g. non-adjacent columns, malformed shape)
|
|
498
|
+
* 0x0C — payload length too short
|
|
499
|
+
*/
|
|
500
|
+
export declare function isSetCellRoutingResponse(bytes: readonly number[]): boolean;
|
|
501
|
+
export interface SetCellRoutingResult {
|
|
502
|
+
resultCode: number;
|
|
503
|
+
ok: boolean;
|
|
504
|
+
}
|
|
505
|
+
export declare function parseSetCellRoutingResponse(bytes: readonly number[]): SetCellRoutingResult;
|
|
506
|
+
/**
|
|
507
|
+
* Axe-Fx II preset-state-dump triple builder (functions 0x74/0x75/0x76).
|
|
508
|
+
*
|
|
509
|
+
* Wire format decoded Session 60, 2026-05-11 from passive captures
|
|
510
|
+
* (`docs/axefx2-state-broadcast-decode-research.md`). The device
|
|
511
|
+
* broadcasts this triple every time AxeEdit makes a block-level
|
|
512
|
+
* edit — header announces target block + total item count, then 1+
|
|
513
|
+
* chunks of 16-bit values (3 septets each), then a one-byte footer.
|
|
514
|
+
*
|
|
515
|
+
* Layout per message:
|
|
516
|
+
*
|
|
517
|
+
* HEADER (function 0x74, 13 bytes)
|
|
518
|
+
* F0 00 01 74 [model] 74
|
|
519
|
+
* [target_id 14b septet] [item_count 14b septet] [op_flag]
|
|
520
|
+
* [cs] F7
|
|
521
|
+
*
|
|
522
|
+
* CHUNK (function 0x75, variable, 8 + 3·N bytes)
|
|
523
|
+
* F0 00 01 74 [model] 75
|
|
524
|
+
* [chunk_item_count 14b septet]
|
|
525
|
+
* [N × packValue16]
|
|
526
|
+
* [cs] F7
|
|
527
|
+
*
|
|
528
|
+
* FOOTER (function 0x76, 8 bytes — checksum-only terminator)
|
|
529
|
+
* F0 00 01 74 [model] 76 [cs] F7
|
|
530
|
+
*
|
|
531
|
+
* `target_id` matches `BLOCK_BY_ID` (e.g. 106 = Amp 1, 112 = Delay 1,
|
|
532
|
+
* 127 = Volume/Pan 1). `op_flag` observed values: 0x01 for direct-
|
|
533
|
+
* block edits (knob turn, grid move), 0x00 for preset-structure
|
|
534
|
+
* changes (block add). Value positions correspond to `paramId 0..N`
|
|
535
|
+
* of the target block's group in linear order (position-as-paramId
|
|
536
|
+
* model confirmed Session 60 across AMP 1 + Delay 1 captures).
|
|
537
|
+
*
|
|
538
|
+
* Returns a flat byte array — caller can transmit it as a single
|
|
539
|
+
* MIDI stream (the device receives the 3 messages in order). Use
|
|
540
|
+
* `buildStateBroadcastTripleMessages` if you need them as separate
|
|
541
|
+
* arrays.
|
|
542
|
+
*
|
|
543
|
+
* Status: 🟡 spec-derived from passive captures + decoded round-trip
|
|
544
|
+
* golden against the captured Volume/Pan 1 triple in
|
|
545
|
+
* `scripts/verify-axe-fx-ii-encoding.ts`. Has NOT been transmitted
|
|
546
|
+
* to hardware yet — Step 2 in STATE.md (synthesize an outgoing
|
|
547
|
+
* triple and observe AxeEdit's UI for state-change confirmation)
|
|
548
|
+
* is the unfinished hardware step.
|
|
549
|
+
*/
|
|
550
|
+
export interface BuildStateBroadcastOptions extends BuildOptions {
|
|
551
|
+
/** Op flag byte 10. 0x01 = direct block edit, 0x00 = preset-structure. Default 0x01. */
|
|
552
|
+
opFlag?: number;
|
|
553
|
+
}
|
|
554
|
+
export declare function buildStateBroadcastTripleMessages(targetId: number, values: readonly number[], opts?: BuildStateBroadcastOptions): {
|
|
555
|
+
header: number[];
|
|
556
|
+
chunks: number[][];
|
|
557
|
+
footer: number[];
|
|
558
|
+
};
|
|
559
|
+
export declare function buildStateBroadcastTriple(targetId: number, values: readonly number[], opts?: BuildStateBroadcastOptions): number[];
|
|
560
|
+
//# sourceMappingURL=setParam.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setParam.d.ts","sourceRoot":"","sources":["../../src/axe-fx-ii/setParam.ts"],"names":[],"mappings":"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"}
|