fractal-midi 0.1.0-alpha.3 → 0.3.1

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 (166) hide show
  1. package/NOTICE +17 -0
  2. package/README.md +39 -28
  3. package/catalog/am4.json +15092 -0
  4. package/catalog/axe-fx-gen1.json +19571 -0
  5. package/catalog/axe-fx-ii.json +13777 -0
  6. package/catalog/axe-fx-iii.json +16909 -0
  7. package/catalog/fm3.json +14647 -0
  8. package/catalog/fm9.json +31616 -0
  9. package/catalog/index.json +49 -0
  10. package/catalog/vp4.json +11184 -0
  11. package/dist/am4/blockLayout.d.ts +48 -0
  12. package/dist/am4/blockLayout.d.ts.map +1 -0
  13. package/dist/am4/blockLayout.js +39 -0
  14. package/dist/am4/blockTypes.js +2 -2
  15. package/dist/am4/cacheEnums.d.ts +1 -1
  16. package/dist/am4/cacheEnums.js +1 -1
  17. package/dist/am4/cacheOracleParams.generated.d.ts +1247 -0
  18. package/dist/am4/cacheOracleParams.generated.d.ts.map +1 -0
  19. package/dist/am4/cacheOracleParams.generated.js +783 -0
  20. package/dist/am4/cacheParams.d.ts +88 -24
  21. package/dist/am4/cacheParams.d.ts.map +1 -1
  22. package/dist/am4/cacheParams.js +81 -17
  23. package/dist/am4/index.d.ts +5 -2
  24. package/dist/am4/index.d.ts.map +1 -1
  25. package/dist/am4/index.js +6 -2
  26. package/dist/am4/paramNames.d.ts +3 -3
  27. package/dist/am4/paramNames.js +56 -56
  28. package/dist/am4/params.d.ts +1360 -290
  29. package/dist/am4/params.d.ts.map +1 -1
  30. package/dist/am4/params.js +826 -433
  31. package/dist/am4/presetBinary.d.ts +72 -0
  32. package/dist/am4/presetBinary.d.ts.map +1 -0
  33. package/dist/am4/presetBinary.js +104 -0
  34. package/dist/am4/setParam.d.ts +64 -26
  35. package/dist/am4/setParam.d.ts.map +1 -1
  36. package/dist/am4/setParam.js +92 -29
  37. package/dist/am4/shared/paramHelpers.d.ts +3 -3
  38. package/dist/am4/shared/paramHelpers.js +4 -4
  39. package/dist/am4/symbolicIds.d.ts +1 -1
  40. package/dist/am4/symbolicIds.js +1 -1
  41. package/dist/am4/typeApplicability.d.ts +3 -3
  42. package/dist/am4/typeApplicability.d.ts.map +1 -1
  43. package/dist/am4/typeApplicability.js +3 -4
  44. package/dist/axe-fx-gen1/blockTypes.d.ts +6 -0
  45. package/dist/axe-fx-gen1/blockTypes.d.ts.map +1 -0
  46. package/dist/axe-fx-gen1/blockTypes.js +48 -0
  47. package/dist/axe-fx-gen1/index.d.ts +7 -0
  48. package/dist/axe-fx-gen1/index.d.ts.map +1 -0
  49. package/dist/axe-fx-gen1/index.js +15 -0
  50. package/dist/axe-fx-gen1/nibble.d.ts +5 -0
  51. package/dist/axe-fx-gen1/nibble.d.ts.map +1 -0
  52. package/dist/axe-fx-gen1/nibble.js +22 -0
  53. package/dist/axe-fx-gen1/params.d.ts +8 -0
  54. package/dist/axe-fx-gen1/params.d.ts.map +1 -0
  55. package/dist/axe-fx-gen1/params.js +935 -0
  56. package/dist/axe-fx-gen1/readParam.d.ts +37 -0
  57. package/dist/axe-fx-gen1/readParam.d.ts.map +1 -0
  58. package/dist/axe-fx-gen1/readParam.js +140 -0
  59. package/dist/axe-fx-gen1/setParam.d.ts +23 -0
  60. package/dist/axe-fx-gen1/setParam.d.ts.map +1 -0
  61. package/dist/axe-fx-gen1/setParam.js +76 -0
  62. package/dist/axe-fx-gen1/types.d.ts +51 -0
  63. package/dist/axe-fx-gen1/types.d.ts.map +1 -0
  64. package/dist/axe-fx-gen1/types.js +14 -0
  65. package/dist/axe-fx-ii/applicability.d.ts +63 -0
  66. package/dist/axe-fx-ii/applicability.d.ts.map +1 -0
  67. package/dist/axe-fx-ii/applicability.js +121 -0
  68. package/dist/axe-fx-ii/blockTypes.d.ts +3 -3
  69. package/dist/axe-fx-ii/blockTypes.js +3 -3
  70. package/dist/axe-fx-ii/index.d.ts +2 -0
  71. package/dist/axe-fx-ii/index.d.ts.map +1 -1
  72. package/dist/axe-fx-ii/index.js +2 -0
  73. package/dist/axe-fx-ii/opcodes.d.ts +5 -5
  74. package/dist/axe-fx-ii/opcodes.d.ts.map +1 -1
  75. package/dist/axe-fx-ii/opcodes.js +9 -10
  76. package/dist/axe-fx-ii/paramAliases.d.ts.map +1 -1
  77. package/dist/axe-fx-ii/paramAliases.js +16 -1
  78. package/dist/axe-fx-ii/params.d.ts +461 -35
  79. package/dist/axe-fx-ii/params.d.ts.map +1 -1
  80. package/dist/axe-fx-ii/params.js +416 -254
  81. package/dist/axe-fx-ii/setParam.d.ts +164 -43
  82. package/dist/axe-fx-ii/setParam.d.ts.map +1 -1
  83. package/dist/axe-fx-ii/setParam.js +213 -35
  84. package/dist/axe-fx-ii/typeApplicability.d.ts +41 -0
  85. package/dist/axe-fx-ii/typeApplicability.d.ts.map +1 -0
  86. package/dist/axe-fx-ii/typeApplicability.js +905 -0
  87. package/dist/axe-fx-iii/blockTypes.d.ts +16 -11
  88. package/dist/axe-fx-iii/blockTypes.d.ts.map +1 -1
  89. package/dist/axe-fx-iii/blockTypes.js +27 -20
  90. package/dist/axe-fx-iii/enumOverlay.d.ts +14 -0
  91. package/dist/axe-fx-iii/enumOverlay.d.ts.map +1 -1
  92. package/dist/axe-fx-iii/enumOverlay.js +72 -1
  93. package/dist/axe-fx-iii/enumRawId.d.ts +57 -0
  94. package/dist/axe-fx-iii/enumRawId.d.ts.map +1 -0
  95. package/dist/axe-fx-iii/enumRawId.js +102 -0
  96. package/dist/axe-fx-iii/gen3ReadRosters.d.ts +37 -0
  97. package/dist/axe-fx-iii/gen3ReadRosters.d.ts.map +1 -0
  98. package/dist/axe-fx-iii/gen3ReadRosters.js +595 -0
  99. package/dist/axe-fx-iii/index.d.ts +5 -3
  100. package/dist/axe-fx-iii/index.d.ts.map +1 -1
  101. package/dist/axe-fx-iii/index.js +8 -4
  102. package/dist/axe-fx-iii/params.d.ts +4 -4
  103. package/dist/axe-fx-iii/params.js +6 -6
  104. package/dist/axe-fx-iii/setParam.d.ts +412 -62
  105. package/dist/axe-fx-iii/setParam.d.ts.map +1 -1
  106. package/dist/axe-fx-iii/setParam.js +1065 -163
  107. package/dist/fm3/index.d.ts +2 -0
  108. package/dist/fm3/index.d.ts.map +1 -0
  109. package/dist/fm3/index.js +1 -0
  110. package/dist/fm3/params.d.ts +29 -0
  111. package/dist/fm3/params.d.ts.map +1 -0
  112. package/dist/fm3/params.js +2033 -0
  113. package/dist/fm9/enumOverrides.d.ts +2 -0
  114. package/dist/fm9/enumOverrides.d.ts.map +1 -0
  115. package/dist/fm9/enumOverrides.js +64 -0
  116. package/dist/fm9/index.d.ts +4 -0
  117. package/dist/fm9/index.d.ts.map +1 -0
  118. package/dist/fm9/index.js +3 -0
  119. package/dist/fm9/params.d.ts +29 -0
  120. package/dist/fm9/params.d.ts.map +1 -0
  121. package/dist/fm9/params.js +2064 -0
  122. package/dist/fm9/ranges.generated.d.ts +46 -0
  123. package/dist/fm9/ranges.generated.d.ts.map +1 -0
  124. package/dist/fm9/ranges.generated.js +2106 -0
  125. package/dist/fm9/rosters.generated.d.ts +7 -0
  126. package/dist/fm9/rosters.generated.d.ts.map +1 -0
  127. package/dist/fm9/rosters.generated.js +512 -0
  128. package/dist/index.d.ts +1 -1
  129. package/dist/index.d.ts.map +1 -1
  130. package/dist/index.js +9 -2
  131. package/dist/shared/device.d.ts +4 -4
  132. package/dist/shared/device.js +1 -1
  133. package/dist/shared/effectId.d.ts +56 -0
  134. package/dist/shared/effectId.d.ts.map +1 -0
  135. package/dist/shared/effectId.js +117 -0
  136. package/dist/shared/index.d.ts +1 -0
  137. package/dist/shared/index.d.ts.map +1 -1
  138. package/dist/shared/index.js +1 -0
  139. package/dist/shared/lineage/amp-lineage.json +270 -292
  140. package/dist/shared/lineage/axefx2-amp-lineage.json +343 -147
  141. package/dist/shared/lineage/cab-lineage.json +10777 -10777
  142. package/dist/shared/lineage/chorus-lineage.json +173 -173
  143. package/dist/shared/lineage/compressor-lineage.json +338 -338
  144. package/dist/shared/lineage/delay-lineage.json +313 -313
  145. package/dist/shared/lineage/drive-lineage.json +217 -39
  146. package/dist/shared/lineage/flanger-lineage.json +313 -313
  147. package/dist/shared/lineage/phaser-lineage.json +208 -208
  148. package/dist/shared/lineage/reverb-lineage.json +793 -793
  149. package/dist/shared/lineage/wah-lineage.json +117 -117
  150. package/dist/shared/lineageLookup.d.ts +1 -0
  151. package/dist/shared/lineageLookup.d.ts.map +1 -1
  152. package/dist/shared/lineageLookup.js +4 -0
  153. package/dist/shared/packValue.d.ts +2 -2
  154. package/dist/shared/packValue.js +2 -2
  155. package/dist/vp4/index.d.ts +3 -0
  156. package/dist/vp4/index.d.ts.map +1 -0
  157. package/dist/vp4/index.js +2 -0
  158. package/dist/vp4/params.d.ts +27 -0
  159. package/dist/vp4/params.d.ts.map +1 -0
  160. package/dist/vp4/params.js +1702 -0
  161. package/dist/vp4/setParam.d.ts +59 -0
  162. package/dist/vp4/setParam.d.ts.map +1 -0
  163. package/dist/vp4/setParam.js +161 -0
  164. package/docs/CATALOG-SCHEMA.md +95 -0
  165. package/docs/README.md +79 -0
  166. package/package.json +27 -5
package/NOTICE CHANGED
@@ -26,3 +26,20 @@ descriptively (nominative fair use) to identify the hardware family
26
26
  this library targets. The library does not embed Fractal Audio
27
27
  firmware, factory presets, branding assets, or any other Fractal-
28
28
  copyrighted material.
29
+
30
+ ---
31
+
32
+ THIRD-PARTY SOFTWARE
33
+
34
+ This library includes gen-3 (Axe-Fx III / FM3 / FM9) protocol data
35
+ derived from:
36
+
37
+ - fractal-syx-codec (Apache License, Version 2.0)
38
+ Copyright 2026 Andrew Mercurio ("BoodieTraps")
39
+ https://github.com/drewmerc302/fractal-syx-codec
40
+ The gen-3 preset-file format spec (FORMAT.md) and the read-ordinal
41
+ effect-type roster tables (shipped as the gen-3 read rosters /
42
+ body-decode tables). The Huffman/CRC codec is a clean-room
43
+ reimplementation from that spec; the roster name tables are derived
44
+ from its data, independently cross-validated against our own
45
+ hardware captures.
package/README.md CHANGED
@@ -4,14 +4,11 @@ Pure-TypeScript codec and parameter dictionaries for Fractal Audio
4
4
  guitar processors. Build and parse the SysEx wire bytes a Fractal
5
5
  device speaks, without pulling in a MIDI transport library.
6
6
 
7
- > **Status pre-release.** The first published version (`0.1.0`)
8
- > covers AM4 and Axe-Fx II at hardware-verified parity, plus the
9
- > Axe-Fx III at codec + calibration via public-capture
10
- > verification and JUCE-BinaryData mining (hardware-verification
11
- > stays community-driven see the III notes in the coverage table).
12
- > FM3 / FM9 ship next via mechanical ports of the III pipeline.
13
- > Don't depend on this package from production code yet — APIs may
14
- > shift before `0.1.0`.
7
+ > Covers AM4 and Axe-Fx II at hardware-verified parity, the modern Fractal
8
+ > family (Axe-Fx III / FM3 / FM9) at codec and calibration via public-capture
9
+ > verification and editor-binary mining, and the Axe-Fx Standard/Ultra (gen-1)
10
+ > as a SET-only descriptor. The gen-3 family stays community-driven for
11
+ > hardware verification; see the per-device notes in the coverage table.
15
12
 
16
13
  > **Unaffiliated community library.** "Fractal Audio", "AM4",
17
14
  > "Axe-Fx", "Axe-Fx II", "Axe-Fx III", "FM3", and "FM9" are
@@ -24,16 +21,16 @@ device speaks, without pulling in a MIDI transport library.
24
21
 
25
22
  ## What this is
26
23
 
27
- - **JSON-shaped parameter dictionaries** every block-and-param the
24
+ - **JSON-shaped parameter dictionaries.** Every block-and-param the
28
25
  device understands, with display unit, value range, and the
29
26
  paramId that goes on the wire. Reverse-engineered against real
30
27
  hardware and Fractal's own published 3rd-party MIDI specs.
31
- - **Pure-TypeScript codec** display value in (`gain: 7.5`,
28
+ - **Pure-TypeScript codec.** Display value in (`gain: 7.5`,
32
29
  `'Plexi 100W High'`), SysEx bytes out (`Uint8Array`). No MIDI
33
30
  library required.
34
- - **Parsers / validators** given captured bytes, parse back to
31
+ - **Parsers and validators.** Given captured bytes, parse back to
35
32
  display values for round-trip equality testing.
36
- - **Reference data** Fractal's amp / cab / drive lineage tables
33
+ - **Reference data.** Fractal's amp / cab / drive lineage tables
37
34
  (the "the JC-120 model is based on this real-world amp" data),
38
35
  factory bank metadata, applicability tables.
39
36
 
@@ -41,7 +38,7 @@ device speaks, without pulling in a MIDI transport library.
41
38
 
42
39
  - **Not a MIDI library.** Routing bytes to and from your hardware
43
40
  is your responsibility. Use `node-midi`, `webmidi`,
44
- `easymidi`, JUCE, RtMidi, CoreMIDI, ALSA whatever fits.
41
+ `easymidi`, JUCE, RtMidi, CoreMIDI, ALSA, whatever fits.
45
42
  - **Not a preset editor.** This package gives you the wire-level
46
43
  primitives a preset editor would be built on top of.
47
44
  - **Not affiliated with Fractal Audio Systems.** See the trademark
@@ -57,9 +54,6 @@ Node >= 18. ESM-only.
57
54
 
58
55
  ## Usage
59
56
 
60
- > The shape below is the target API. Until `0.1.0` ships, the
61
- > module surface may differ.
62
-
63
57
  ```ts
64
58
  import { buildSetParam, parseSetParam } from 'fractal-midi/am4/codec';
65
59
  import { params, blocks } from 'fractal-midi/am4';
@@ -84,15 +78,27 @@ import { buildSetParam } from 'fractal-midi/axe-fx-ii/codec';
84
78
  import { params } from 'fractal-midi/axe-fx-iii';
85
79
  ```
86
80
 
81
+ ### Not using TypeScript? Use the JSON catalog
82
+
83
+ `catalog/` ships a generated, language-agnostic export of every device's
84
+ parameter dictionary, block tables, enum rosters, and ranges — one JSON file
85
+ per device. Read it straight from the installed package
86
+ (`node_modules/fractal-midi/catalog/<device>.json`) or from a pinned git tag.
87
+ Pin a version rather than copying the files: calibration fixes and enum-roster
88
+ fills land here first. Shape contract:
89
+ [docs/CATALOG-SCHEMA.md](docs/CATALOG-SCHEMA.md). The JSON is regenerated from
90
+ the TypeScript source on every change and CI-gated against drift.
91
+
87
92
  ## Per-device coverage
88
93
 
89
94
  | Device | Catalog | Codec | Calibration | Hardware-verified |
90
95
  |---|---|---|---|---|
91
96
  | AM4 | ✅ | ✅ | ✅ | ✅ |
92
97
  | Axe-Fx II | ✅ | ✅ | ✅ | ✅ |
93
- | Axe-Fx III | ✅ (2216 params) | ✅ ([see note](#axe-fx-iii-codec-note)) | ✅ ([see note](#axe-fx-iii-calibration-note)) | 🟡 community beta ([see note](#axe-fx-iii-hardware-note)) |
94
- | FM3 | | | | ❌ |
95
- | FM9 | | | | ❌ |
98
+ | Axe-Fx III | ✅ (full catalog) | ✅ ([see note](#axe-fx-iii-codec-note)) | ✅ ([see note](#axe-fx-iii-calibration-note)) | 🟡 community beta ([see note](#axe-fx-iii-hardware-note)) |
99
+ | FM3 | (device-true, mined from FM3-Edit) | (shared gen-3) | 🟡 (linear; some non-linear pending) | ❌ community beta |
100
+ | FM9 | (device-true, mined from FM9-Edit) | (shared gen-3) | 🟡 (linear; some non-linear pending) | ❌ community beta |
101
+ | Axe-Fx Standard/Ultra (gen-1) | ✅ (922 params) | ✅ (nibble-split, SET-only) | 🟡 (linear; 171 non-linear pending) | ❌ community beta (no gen-1 hardware) |
96
102
 
97
103
  ### Coverage notes
98
104
 
@@ -100,9 +106,9 @@ import { params } from 'fractal-midi/axe-fx-iii';
100
106
 
101
107
  The III's SET_PARAMETER wire envelope (fn=0x01, sub-action `09 00`,
102
108
  23-byte frame) is byte-verified against 10 public community captures
103
- spanning two effect blocks and two sub-action codes see the
104
- `axe-fx-iii/setparam` test goldens (302 cases: 36 envelope vectors +
105
- 264 round-trip `build parse equality` cases + 2
109
+ spanning two effect blocks and two sub-action codes. See the
110
+ `axe-fx-iii/setparam` test goldens (302 cases: 36 envelope vectors,
111
+ 264 round-trip `build` to `parse` to equality cases, and 2
106
112
  `parseStateBroadcast` assertions). The GET-response shape is
107
113
  hypothesis-only (no public capture exists); the parser handles both
108
114
  the `09 00` / `52 00` set-echo shape and the async `04 01`
@@ -113,14 +119,14 @@ STATE_BROADCAST shape via `parseSetGetParameterResponse` /
113
119
 
114
120
  III calibration = 100% of catalog entries carry a non-`'unverified'`
115
121
  unit tag (16 string-typed `_NAME` / `_LABEL` / `_MSG` entries are
116
- exempted by the calibration gate they have no `'string'` unit in
122
+ exempted by the calibration gate, since they have no `'string'` unit in
117
123
  the `Param` type). Enum vocabularies are resolved at runtime via
118
124
  `resolveEnumValues(name)` from `enumOverlay.ts`, which carries a
119
- `provenance` field on every entry `'am4-shared'` (AM4-verified,
125
+ `provenance` field on every entry: `'am4-shared'` (AM4-verified,
120
126
  shared with III), `'fractal-convention'` (universal Fractal-family
121
127
  convention like OFF/ON / channel pickers), or `'iii-spec'` (hand-
122
128
  curated for III-only params). Coverage of enum vocabularies and
123
- numeric display ranges is partial `resolveEnumValues` returns
129
+ numeric display ranges is partial: `resolveEnumValues` returns
124
130
  `undefined` for params not yet mapped, and many XML-derived numeric
125
131
  entries carry a unit tag but no `displayMin` / `displayMax`. Treat
126
132
  the catalog as the wire-level truth; treat the calibration overlay
@@ -137,9 +143,14 @@ that disagrees with their hardware.
137
143
 
138
144
  FM3 and FM9 share the III protocol family (model bytes `0x11` /
139
145
  `0x12` vs III's `0x10`, identical envelope per Fractal's v1.4 MIDI
140
- spec). Catalog + codec + calibration for those devices are planned as
141
- mechanical ports of the III pipeline once the FM3-Edit / FM9-Edit
142
- JUCE binaries are mined for parameterName + dispatcher tables.
146
+ spec). Both ship device-true param catalogs mined from their own
147
+ FM3-Edit / FM9-Edit JUCE binaries (paramIds are device-specific and are
148
+ never reused from the III) on the shared gen-3 codec. Calibration
149
+ covers the linear params; some non-linear display formulas are still
150
+ pending. Neither has been hardware-verified by the maintainer, so they
151
+ remain community beta: FM9 has real community captures confirming the
152
+ shared read and preset-dump paths, while FM3 confirmation is still
153
+ open.
143
154
 
144
155
  ## License
145
156