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.
Files changed (123) hide show
  1. package/LICENSE +200 -0
  2. package/NOTICE +28 -0
  3. package/README.md +147 -0
  4. package/dist/am4/applicability.d.ts +61 -0
  5. package/dist/am4/applicability.d.ts.map +1 -0
  6. package/dist/am4/applicability.js +285 -0
  7. package/dist/am4/blockTypes.d.ts +43 -0
  8. package/dist/am4/blockTypes.d.ts.map +1 -0
  9. package/dist/am4/blockTypes.js +48 -0
  10. package/dist/am4/cacheEnums.d.ts +46 -0
  11. package/dist/am4/cacheEnums.d.ts.map +1 -0
  12. package/dist/am4/cacheEnums.js +734 -0
  13. package/dist/am4/cacheParams.d.ts +3533 -0
  14. package/dist/am4/cacheParams.d.ts.map +1 -0
  15. package/dist/am4/cacheParams.js +1996 -0
  16. package/dist/am4/editorControlLabels.d.ts +45 -0
  17. package/dist/am4/editorControlLabels.d.ts.map +1 -0
  18. package/dist/am4/editorControlLabels.js +15894 -0
  19. package/dist/am4/index.d.ts +28 -0
  20. package/dist/am4/index.d.ts.map +1 -0
  21. package/dist/am4/index.js +31 -0
  22. package/dist/am4/ir/preset.d.ts +24 -0
  23. package/dist/am4/ir/preset.d.ts.map +1 -0
  24. package/dist/am4/ir/preset.js +12 -0
  25. package/dist/am4/ir/transpile.d.ts +9 -0
  26. package/dist/am4/ir/transpile.d.ts.map +1 -0
  27. package/dist/am4/ir/transpile.js +19 -0
  28. package/dist/am4/locations.d.ts +32 -0
  29. package/dist/am4/locations.d.ts.map +1 -0
  30. package/dist/am4/locations.js +58 -0
  31. package/dist/am4/paramNames.d.ts +55 -0
  32. package/dist/am4/paramNames.d.ts.map +1 -0
  33. package/dist/am4/paramNames.js +863 -0
  34. package/dist/am4/paramNamesGenerated.d.ts +41 -0
  35. package/dist/am4/paramNamesGenerated.d.ts.map +1 -0
  36. package/dist/am4/paramNamesGenerated.js +183 -0
  37. package/dist/am4/parameterBridge.d.ts +46 -0
  38. package/dist/am4/parameterBridge.d.ts.map +1 -0
  39. package/dist/am4/parameterBridge.js +300 -0
  40. package/dist/am4/params.d.ts +9577 -0
  41. package/dist/am4/params.d.ts.map +1 -0
  42. package/dist/am4/params.js +4537 -0
  43. package/dist/am4/setParam.d.ts +414 -0
  44. package/dist/am4/setParam.d.ts.map +1 -0
  45. package/dist/am4/setParam.js +819 -0
  46. package/dist/am4/shared/paramHelpers.d.ts +55 -0
  47. package/dist/am4/shared/paramHelpers.d.ts.map +1 -0
  48. package/dist/am4/shared/paramHelpers.js +146 -0
  49. package/dist/am4/symbolicIds.d.ts +11 -0
  50. package/dist/am4/symbolicIds.d.ts.map +1 -0
  51. package/dist/am4/symbolicIds.js +587 -0
  52. package/dist/am4/typeApplicability.d.ts +39 -0
  53. package/dist/am4/typeApplicability.d.ts.map +1 -0
  54. package/dist/am4/typeApplicability.js +466 -0
  55. package/dist/am4/variantResolverTables.d.ts +51 -0
  56. package/dist/am4/variantResolverTables.d.ts.map +1 -0
  57. package/dist/am4/variantResolverTables.js +3128 -0
  58. package/dist/axe-fx-ii/blockTypes.d.ts +45 -0
  59. package/dist/axe-fx-ii/blockTypes.d.ts.map +1 -0
  60. package/dist/axe-fx-ii/blockTypes.js +116 -0
  61. package/dist/axe-fx-ii/index.d.ts +5 -0
  62. package/dist/axe-fx-ii/index.d.ts.map +1 -0
  63. package/dist/axe-fx-ii/index.js +18 -0
  64. package/dist/axe-fx-ii/paramAliases.d.ts +54 -0
  65. package/dist/axe-fx-ii/paramAliases.d.ts.map +1 -0
  66. package/dist/axe-fx-ii/paramAliases.js +146 -0
  67. package/dist/axe-fx-ii/params.d.ts +11502 -0
  68. package/dist/axe-fx-ii/params.d.ts.map +1 -0
  69. package/dist/axe-fx-ii/params.js +2847 -0
  70. package/dist/axe-fx-ii/setParam.d.ts +560 -0
  71. package/dist/axe-fx-ii/setParam.d.ts.map +1 -0
  72. package/dist/axe-fx-ii/setParam.js +888 -0
  73. package/dist/axe-fx-iii/blockTypes.d.ts +87 -0
  74. package/dist/axe-fx-iii/blockTypes.d.ts.map +1 -0
  75. package/dist/axe-fx-iii/blockTypes.js +156 -0
  76. package/dist/axe-fx-iii/enumOverlay.d.ts +73 -0
  77. package/dist/axe-fx-iii/enumOverlay.d.ts.map +1 -0
  78. package/dist/axe-fx-iii/enumOverlay.js +236 -0
  79. package/dist/axe-fx-iii/index.d.ts +9 -0
  80. package/dist/axe-fx-iii/index.d.ts.map +1 -0
  81. package/dist/axe-fx-iii/index.js +20 -0
  82. package/dist/axe-fx-iii/params.d.ts +179 -0
  83. package/dist/axe-fx-iii/params.d.ts.map +1 -0
  84. package/dist/axe-fx-iii/params.js +6913 -0
  85. package/dist/axe-fx-iii/setParam.d.ts +460 -0
  86. package/dist/axe-fx-iii/setParam.d.ts.map +1 -0
  87. package/dist/axe-fx-iii/setParam.js +910 -0
  88. package/dist/index.d.ts +2 -0
  89. package/dist/index.d.ts.map +1 -0
  90. package/dist/index.js +12 -0
  91. package/dist/shared/checksum.d.ts +10 -0
  92. package/dist/shared/checksum.d.ts.map +1 -0
  93. package/dist/shared/checksum.js +14 -0
  94. package/dist/shared/device.d.ts +195 -0
  95. package/dist/shared/device.d.ts.map +1 -0
  96. package/dist/shared/device.js +27 -0
  97. package/dist/shared/index.d.ts +8 -0
  98. package/dist/shared/index.d.ts.map +1 -0
  99. package/dist/shared/index.js +11 -0
  100. package/dist/shared/lineage/amp-lineage.json +8313 -0
  101. package/dist/shared/lineage/axefx2-amp-lineage.json +5871 -0
  102. package/dist/shared/lineage/axefx2-delay-lineage.json +226 -0
  103. package/dist/shared/lineage/axefx2-drive-lineage.json +575 -0
  104. package/dist/shared/lineage/axefx2-reverb-lineage.json +467 -0
  105. package/dist/shared/lineage/cab-lineage.json +10777 -0
  106. package/dist/shared/lineage/chorus-lineage.json +173 -0
  107. package/dist/shared/lineage/compressor-lineage.json +338 -0
  108. package/dist/shared/lineage/delay-lineage.json +313 -0
  109. package/dist/shared/lineage/drive-lineage.json +1844 -0
  110. package/dist/shared/lineage/flanger-lineage.json +313 -0
  111. package/dist/shared/lineage/phaser-lineage.json +208 -0
  112. package/dist/shared/lineage/reverb-lineage.json +793 -0
  113. package/dist/shared/lineage/wah-lineage.json +117 -0
  114. package/dist/shared/lineageLookup.d.ts +69 -0
  115. package/dist/shared/lineageLookup.d.ts.map +1 -0
  116. package/dist/shared/lineageLookup.js +196 -0
  117. package/dist/shared/packValue.d.ts +40 -0
  118. package/dist/shared/packValue.d.ts.map +1 -0
  119. package/dist/shared/packValue.js +105 -0
  120. package/dist/shared/types.d.ts +23 -0
  121. package/dist/shared/types.d.ts.map +1 -0
  122. package/dist/shared/types.js +9 -0
  123. 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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"}