fractal-midi 0.3.0 → 0.4.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 (157) hide show
  1. package/NOTICE +1 -1
  2. package/README.md +50 -24
  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/setParam.d.ts.map +1 -1
  12. package/dist/am4/setParam.js +1 -5
  13. package/dist/gen1/blockTypes.d.ts.map +1 -0
  14. package/dist/gen1/index.d.ts.map +1 -0
  15. package/dist/{axe-fx-gen1 → gen1}/index.js +1 -1
  16. package/dist/gen1/nibble.d.ts.map +1 -0
  17. package/dist/gen1/params.d.ts.map +1 -0
  18. package/dist/gen1/readParam.d.ts.map +1 -0
  19. package/dist/gen1/setParam.d.ts.map +1 -0
  20. package/dist/gen1/types.d.ts.map +1 -0
  21. package/dist/gen2/axe-fx-ii/applicability.d.ts.map +1 -0
  22. package/dist/gen2/axe-fx-ii/blockTypes.d.ts.map +1 -0
  23. package/dist/gen2/axe-fx-ii/index.d.ts.map +1 -0
  24. package/dist/{axe-fx-ii → gen2/axe-fx-ii}/index.js +1 -1
  25. package/dist/gen2/axe-fx-ii/opcodes.d.ts.map +1 -0
  26. package/dist/gen2/axe-fx-ii/paramAliases.d.ts.map +1 -0
  27. package/dist/gen2/axe-fx-ii/params.d.ts.map +1 -0
  28. package/dist/{axe-fx-ii → gen2/axe-fx-ii}/setParam.d.ts +17 -46
  29. package/dist/gen2/axe-fx-ii/setParam.d.ts.map +1 -0
  30. package/dist/{axe-fx-ii → gen2/axe-fx-ii}/setParam.js +21 -69
  31. package/dist/gen2/axe-fx-ii/typeApplicability.d.ts.map +1 -0
  32. package/dist/gen3/axe-fx-iii/blockTypes.d.ts.map +1 -0
  33. package/dist/gen3/axe-fx-iii/enumOverlay.d.ts.map +1 -0
  34. package/dist/{axe-fx-iii → gen3/axe-fx-iii}/enumOverlay.js +1 -1
  35. package/dist/gen3/axe-fx-iii/enumRawId.d.ts.map +1 -0
  36. package/dist/gen3/axe-fx-iii/gen3ReadRosters.d.ts.map +1 -0
  37. package/dist/gen3/axe-fx-iii/index.d.ts.map +1 -0
  38. package/dist/{axe-fx-iii → gen3/axe-fx-iii}/index.js +1 -1
  39. package/dist/{axe-fx-iii → gen3/axe-fx-iii}/params.d.ts +3 -63
  40. package/dist/gen3/axe-fx-iii/params.d.ts.map +1 -0
  41. package/dist/{axe-fx-iii → gen3/axe-fx-iii}/params.js +1 -1
  42. package/dist/{axe-fx-iii → gen3/axe-fx-iii}/setParam.d.ts +23 -18
  43. package/dist/gen3/axe-fx-iii/setParam.d.ts.map +1 -0
  44. package/dist/{axe-fx-iii → gen3/axe-fx-iii}/setParam.js +20 -43
  45. package/dist/gen3/fm3/index.d.ts.map +1 -0
  46. package/dist/{fm3 → gen3/fm3}/params.d.ts +1 -1
  47. package/dist/gen3/fm3/params.d.ts.map +1 -0
  48. package/dist/gen3/fm9/enumOverrides.d.ts.map +1 -0
  49. package/dist/gen3/fm9/index.d.ts.map +1 -0
  50. package/dist/{fm9 → gen3/fm9}/params.d.ts +1 -1
  51. package/dist/gen3/fm9/params.d.ts.map +1 -0
  52. package/dist/gen3/fm9/ranges.generated.d.ts.map +1 -0
  53. package/dist/gen3/fm9/rosters.generated.d.ts.map +1 -0
  54. package/dist/gen3/types.d.ts +75 -0
  55. package/dist/gen3/types.d.ts.map +1 -0
  56. package/dist/gen3/types.js +13 -0
  57. package/dist/gen3/vp4/index.d.ts.map +1 -0
  58. package/dist/{vp4 → gen3/vp4}/params.d.ts +1 -1
  59. package/dist/gen3/vp4/params.d.ts.map +1 -0
  60. package/dist/{vp4 → gen3/vp4}/setParam.d.ts +5 -3
  61. package/dist/gen3/vp4/setParam.d.ts.map +1 -0
  62. package/dist/{vp4 → gen3/vp4}/setParam.js +12 -29
  63. package/dist/index.js +1 -1
  64. package/dist/shared/displayScale.d.ts +52 -0
  65. package/dist/shared/displayScale.d.ts.map +1 -0
  66. package/dist/shared/displayScale.js +55 -0
  67. package/dist/shared/effectId.js +2 -2
  68. package/dist/shared/index.d.ts +3 -0
  69. package/dist/shared/index.d.ts.map +1 -1
  70. package/dist/shared/index.js +4 -1
  71. package/dist/shared/septet16.d.ts +48 -0
  72. package/dist/shared/septet16.d.ts.map +1 -0
  73. package/dist/shared/septet16.js +65 -0
  74. package/docs/CATALOG-SCHEMA.md +95 -0
  75. package/docs/README.md +79 -0
  76. package/package.json +26 -21
  77. package/dist/axe-fx-gen1/blockTypes.d.ts.map +0 -1
  78. package/dist/axe-fx-gen1/index.d.ts.map +0 -1
  79. package/dist/axe-fx-gen1/nibble.d.ts.map +0 -1
  80. package/dist/axe-fx-gen1/params.d.ts.map +0 -1
  81. package/dist/axe-fx-gen1/readParam.d.ts.map +0 -1
  82. package/dist/axe-fx-gen1/setParam.d.ts.map +0 -1
  83. package/dist/axe-fx-gen1/types.d.ts.map +0 -1
  84. package/dist/axe-fx-ii/applicability.d.ts.map +0 -1
  85. package/dist/axe-fx-ii/blockTypes.d.ts.map +0 -1
  86. package/dist/axe-fx-ii/index.d.ts.map +0 -1
  87. package/dist/axe-fx-ii/opcodes.d.ts.map +0 -1
  88. package/dist/axe-fx-ii/paramAliases.d.ts.map +0 -1
  89. package/dist/axe-fx-ii/params.d.ts.map +0 -1
  90. package/dist/axe-fx-ii/setParam.d.ts.map +0 -1
  91. package/dist/axe-fx-ii/typeApplicability.d.ts.map +0 -1
  92. package/dist/axe-fx-iii/blockTypes.d.ts.map +0 -1
  93. package/dist/axe-fx-iii/enumOverlay.d.ts.map +0 -1
  94. package/dist/axe-fx-iii/enumRawId.d.ts.map +0 -1
  95. package/dist/axe-fx-iii/gen3ReadRosters.d.ts.map +0 -1
  96. package/dist/axe-fx-iii/index.d.ts.map +0 -1
  97. package/dist/axe-fx-iii/params.d.ts.map +0 -1
  98. package/dist/axe-fx-iii/setParam.d.ts.map +0 -1
  99. package/dist/fm3/index.d.ts.map +0 -1
  100. package/dist/fm3/params.d.ts.map +0 -1
  101. package/dist/fm9/enumOverrides.d.ts.map +0 -1
  102. package/dist/fm9/index.d.ts.map +0 -1
  103. package/dist/fm9/params.d.ts.map +0 -1
  104. package/dist/fm9/ranges.generated.d.ts.map +0 -1
  105. package/dist/fm9/rosters.generated.d.ts.map +0 -1
  106. package/dist/vp4/index.d.ts.map +0 -1
  107. package/dist/vp4/params.d.ts.map +0 -1
  108. package/dist/vp4/setParam.d.ts.map +0 -1
  109. /package/dist/{axe-fx-gen1 → gen1}/blockTypes.d.ts +0 -0
  110. /package/dist/{axe-fx-gen1 → gen1}/blockTypes.js +0 -0
  111. /package/dist/{axe-fx-gen1 → gen1}/index.d.ts +0 -0
  112. /package/dist/{axe-fx-gen1 → gen1}/nibble.d.ts +0 -0
  113. /package/dist/{axe-fx-gen1 → gen1}/nibble.js +0 -0
  114. /package/dist/{axe-fx-gen1 → gen1}/params.d.ts +0 -0
  115. /package/dist/{axe-fx-gen1 → gen1}/params.js +0 -0
  116. /package/dist/{axe-fx-gen1 → gen1}/readParam.d.ts +0 -0
  117. /package/dist/{axe-fx-gen1 → gen1}/readParam.js +0 -0
  118. /package/dist/{axe-fx-gen1 → gen1}/setParam.d.ts +0 -0
  119. /package/dist/{axe-fx-gen1 → gen1}/setParam.js +0 -0
  120. /package/dist/{axe-fx-gen1 → gen1}/types.d.ts +0 -0
  121. /package/dist/{axe-fx-gen1 → gen1}/types.js +0 -0
  122. /package/dist/{axe-fx-ii → gen2/axe-fx-ii}/applicability.d.ts +0 -0
  123. /package/dist/{axe-fx-ii → gen2/axe-fx-ii}/applicability.js +0 -0
  124. /package/dist/{axe-fx-ii → gen2/axe-fx-ii}/blockTypes.d.ts +0 -0
  125. /package/dist/{axe-fx-ii → gen2/axe-fx-ii}/blockTypes.js +0 -0
  126. /package/dist/{axe-fx-ii → gen2/axe-fx-ii}/index.d.ts +0 -0
  127. /package/dist/{axe-fx-ii → gen2/axe-fx-ii}/opcodes.d.ts +0 -0
  128. /package/dist/{axe-fx-ii → gen2/axe-fx-ii}/opcodes.js +0 -0
  129. /package/dist/{axe-fx-ii → gen2/axe-fx-ii}/paramAliases.d.ts +0 -0
  130. /package/dist/{axe-fx-ii → gen2/axe-fx-ii}/paramAliases.js +0 -0
  131. /package/dist/{axe-fx-ii → gen2/axe-fx-ii}/params.d.ts +0 -0
  132. /package/dist/{axe-fx-ii → gen2/axe-fx-ii}/params.js +0 -0
  133. /package/dist/{axe-fx-ii → gen2/axe-fx-ii}/typeApplicability.d.ts +0 -0
  134. /package/dist/{axe-fx-ii → gen2/axe-fx-ii}/typeApplicability.js +0 -0
  135. /package/dist/{axe-fx-iii → gen3/axe-fx-iii}/blockTypes.d.ts +0 -0
  136. /package/dist/{axe-fx-iii → gen3/axe-fx-iii}/blockTypes.js +0 -0
  137. /package/dist/{axe-fx-iii → gen3/axe-fx-iii}/enumOverlay.d.ts +0 -0
  138. /package/dist/{axe-fx-iii → gen3/axe-fx-iii}/enumRawId.d.ts +0 -0
  139. /package/dist/{axe-fx-iii → gen3/axe-fx-iii}/enumRawId.js +0 -0
  140. /package/dist/{axe-fx-iii → gen3/axe-fx-iii}/gen3ReadRosters.d.ts +0 -0
  141. /package/dist/{axe-fx-iii → gen3/axe-fx-iii}/gen3ReadRosters.js +0 -0
  142. /package/dist/{axe-fx-iii → gen3/axe-fx-iii}/index.d.ts +0 -0
  143. /package/dist/{fm3 → gen3/fm3}/index.d.ts +0 -0
  144. /package/dist/{fm3 → gen3/fm3}/index.js +0 -0
  145. /package/dist/{fm3 → gen3/fm3}/params.js +0 -0
  146. /package/dist/{fm9 → gen3/fm9}/enumOverrides.d.ts +0 -0
  147. /package/dist/{fm9 → gen3/fm9}/enumOverrides.js +0 -0
  148. /package/dist/{fm9 → gen3/fm9}/index.d.ts +0 -0
  149. /package/dist/{fm9 → gen3/fm9}/index.js +0 -0
  150. /package/dist/{fm9 → gen3/fm9}/params.js +0 -0
  151. /package/dist/{fm9 → gen3/fm9}/ranges.generated.d.ts +0 -0
  152. /package/dist/{fm9 → gen3/fm9}/ranges.generated.js +0 -0
  153. /package/dist/{fm9 → gen3/fm9}/rosters.generated.d.ts +0 -0
  154. /package/dist/{fm9 → gen3/fm9}/rosters.generated.js +0 -0
  155. /package/dist/{vp4 → gen3/vp4}/index.d.ts +0 -0
  156. /package/dist/{vp4 → gen3/vp4}/index.js +0 -0
  157. /package/dist/{vp4 → gen3/vp4}/params.js +0 -0
package/NOTICE CHANGED
@@ -9,7 +9,7 @@ See the LICENSE file for the full license text.
9
9
  TRADEMARKS
10
10
 
11
11
  This project is an unaffiliated community library. "Fractal Audio",
12
- "AM4", "Axe-Fx", "Axe-Fx II", "Axe-Fx III", "FM3", "FM9", and
12
+ "AM4", "Axe-Fx", "Axe-Fx II", "Axe-Fx III", "FM3", "FM9", "VP4", and
13
13
  related product names are trademarks of Fractal Audio Systems, Inc.
14
14
 
15
15
  This project neither claims endorsement from, nor affiliation with,
package/README.md CHANGED
@@ -5,13 +5,14 @@ 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
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.
8
+ > family (Axe-Fx III / FM3 / FM9 / VP4) at codec and calibration via
9
+ > public-capture verification and editor-binary mining, and the Axe-Fx
10
+ > Standard/Ultra (gen-1) as a set + parameter-read descriptor. The gen-3
11
+ > family stays community-driven for hardware verification; see the
12
+ > per-device notes in the coverage table.
12
13
 
13
14
  > **Unaffiliated community library.** "Fractal Audio", "AM4",
14
- > "Axe-Fx", "Axe-Fx II", "Axe-Fx III", "FM3", and "FM9" are
15
+ > "Axe-Fx", "Axe-Fx II", "Axe-Fx III", "FM3", "FM9", and "VP4" are
15
16
  > trademarks of Fractal Audio Systems, Inc. This project neither
16
17
  > claims endorsement from, nor affiliation with, Fractal Audio
17
18
  > Systems. The package name uses the "Fractal" trademark
@@ -55,29 +56,47 @@ Node >= 18. ESM-only.
55
56
  ## Usage
56
57
 
57
58
  ```ts
58
- import { buildSetParam, parseSetParam } from 'fractal-midi/am4/codec';
59
- import { params, blocks } from 'fractal-midi/am4';
59
+ import { buildSetParam, KNOWN_PARAMS } from 'fractal-midi/am4';
60
60
 
61
- // Build the SysEx bytes for "set amp gain to 7.5"
62
- const bytes = buildSetParam({ block: 'amp', param: 'gain', value: 7.5 });
63
- // → Uint8Array starting with 0xF0 ... 0xF7
64
-
65
- // Round-trip: parse captured bytes back to display values
66
- const display = parseSetParam(bytes);
67
- // → { block: 'amp', param: 'gain', value: 7.5 }
61
+ // Build the SysEx bytes for "set amp gain to 7.5" (display value in)
62
+ const bytes = buildSetParam('amp.gain', 7.5);
63
+ // → number[] starting with 0xF0 ... ending 0xF7 — send via your MIDI library
68
64
 
69
65
  // Inspect the dictionary directly
70
- console.log(params.amp.gain);
71
- // → { unit: 'knob-0-10', range: [0, 10], pidHigh: ..., pidLow: ..., ... }
66
+ console.log(KNOWN_PARAMS['amp.gain']);
67
+ // → { block: 'amp', name: 'gain', unit: ..., displayMin: 0, displayMax: 10,
68
+ // pidLow: ..., pidHigh: ..., ... }
72
69
  ```
73
70
 
74
- The Axe-Fx II and Axe-Fx III sub-paths follow the same shape:
71
+ The Axe-Fx II and Axe-Fx III sub-paths follow the same shape (each
72
+ device's builders and dictionaries carry that device's own names):
75
73
 
76
74
  ```ts
77
- import { buildSetParam } from 'fractal-midi/axe-fx-ii/codec';
78
- import { params } from 'fractal-midi/axe-fx-iii';
75
+ import { buildSetBlockParameterValue, KNOWN_PARAMS } from 'fractal-midi/gen2/axe-fx-ii';
76
+ import { buildSetParameter, PARAMS_BY_FAMILY } from 'fractal-midi/gen3/axe-fx-iii';
79
77
  ```
80
78
 
79
+ > **Breaking change in 0.4.0 — generation-prefixed subpaths.** Device
80
+ > subpaths are now organized by Fractal codec generation:
81
+ > `fractal-midi/gen1` (Axe-Fx Standard/Ultra, formerly `/axe-fx-gen1`),
82
+ > `fractal-midi/gen2/axe-fx-ii` (formerly `/axe-fx-ii`), and
83
+ > `fractal-midi/gen3/{axe-fx-iii,fm3,fm9,vp4}` (formerly `/axe-fx-iii`,
84
+ > `/fm3`, `/fm9`, `/vp4`). `fractal-midi/am4` and `fractal-midi/shared`
85
+ > are unchanged (the AM4 is its own codec, not one of the three
86
+ > generations), and **`catalog/*.json` paths are unchanged** — JSON
87
+ > consumers are unaffected.
88
+
89
+ ### Not using TypeScript? Use the JSON catalog
90
+
91
+ `catalog/` ships a generated, language-agnostic export of every device's
92
+ parameter dictionary, block tables, enum rosters, and ranges — one JSON file
93
+ per device. Read it straight from the installed package
94
+ (`node_modules/fractal-midi/catalog/<device>.json`) or from a pinned git tag.
95
+ Pin a version rather than copying the files: calibration fixes and enum-roster
96
+ fills land here first. Shape contract:
97
+ [docs/CATALOG-SCHEMA.md](docs/CATALOG-SCHEMA.md). The JSON is regenerated from
98
+ the TypeScript source on every change and CI-gated against drift.
99
+
81
100
  ## Per-device coverage
82
101
 
83
102
  | Device | Catalog | Codec | Calibration | Hardware-verified |
@@ -85,9 +104,10 @@ import { params } from 'fractal-midi/axe-fx-iii';
85
104
  | AM4 | ✅ | ✅ | ✅ | ✅ |
86
105
  | Axe-Fx II | ✅ | ✅ | ✅ | ✅ |
87
106
  | 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)) |
88
- | FM3 | ✅ (device-true, mined from FM3-Edit) | ✅ (shared gen-3) | 🟡 (linear; some non-linear pending) | community beta |
107
+ | FM3 | ✅ (device-true, mined from FM3-Edit) | ✅ (shared gen-3) | 🟡 (linear; some non-linear pending) | 🟡 community beta ([see note](#fm3--fm9) — core surface field-confirmed 2026-06) |
89
108
  | FM9 | ✅ (device-true, mined from FM9-Edit) | ✅ (shared gen-3) | 🟡 (linear; some non-linear pending) | ❌ community beta |
90
- | Axe-Fx Standard/Ultra (gen-1) | ✅ (922 params) | (nibble-split, SET-only) | 🟡 (linear; 171 non-linear pending) | community beta (no gen-1 hardware) |
109
+ | VP4 | (device-true, mined from VP4-Edit) | ✅ (gen-3 envelope; own fn=0x01 write frame, decoded byte-exact from community captures, fw 4.03) | 🟡 (continuous writes take raw wire values; calibration pending) | 🟡 community beta (reads confirmed via community captures; decoded writes untested on hardware) |
110
+ | Axe-Fx Standard/Ultra (gen-1) | ✅ (922 params) | ✅ (nibble-split, set + param read) | 🟡 (linear; 171 non-linear pending) | ❌ community beta (no gen-1 hardware) |
91
111
 
92
112
  ### Coverage notes
93
113
 
@@ -137,9 +157,15 @@ FM3-Edit / FM9-Edit JUCE binaries (paramIds are device-specific and are
137
157
  never reused from the III) on the shared gen-3 codec. Calibration
138
158
  covers the linear params; some non-linear display formulas are still
139
159
  pending. Neither has been hardware-verified by the maintainer, so they
140
- remain community beta: FM9 has real community captures confirming the
141
- shared read and preset-dump paths, while FM3 confirmation is still
142
- open.
160
+ remain community beta. The FM9 has real community captures confirming
161
+ the shared read and preset-dump paths. The FM3's core surface was
162
+ hardware-confirmed end-to-end by a 2026-06-12 community field test over
163
+ its USB-serial transport (discovery, framing, the whole read path,
164
+ continuous SET, bypass, scene and preset switching, all through this
165
+ codec's own frames), and discrete set-by-name SET was confirmed on FM3
166
+ hardware by a 2026-06-10 community session via frames byte-identical to
167
+ this codec's builder; block placement (`set_block`), store-to-location,
168
+ and the Windows serial-driver path remain unconfirmed.
143
169
 
144
170
  ## License
145
171