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.
- package/NOTICE +1 -1
- package/README.md +50 -24
- package/catalog/am4.json +15092 -0
- package/catalog/axe-fx-gen1.json +19571 -0
- package/catalog/axe-fx-ii.json +13777 -0
- package/catalog/axe-fx-iii.json +16909 -0
- package/catalog/fm3.json +14647 -0
- package/catalog/fm9.json +31616 -0
- package/catalog/index.json +49 -0
- package/catalog/vp4.json +11184 -0
- package/dist/am4/setParam.d.ts.map +1 -1
- package/dist/am4/setParam.js +1 -5
- package/dist/gen1/blockTypes.d.ts.map +1 -0
- package/dist/gen1/index.d.ts.map +1 -0
- package/dist/{axe-fx-gen1 → gen1}/index.js +1 -1
- package/dist/gen1/nibble.d.ts.map +1 -0
- package/dist/gen1/params.d.ts.map +1 -0
- package/dist/gen1/readParam.d.ts.map +1 -0
- package/dist/gen1/setParam.d.ts.map +1 -0
- package/dist/gen1/types.d.ts.map +1 -0
- package/dist/gen2/axe-fx-ii/applicability.d.ts.map +1 -0
- package/dist/gen2/axe-fx-ii/blockTypes.d.ts.map +1 -0
- package/dist/gen2/axe-fx-ii/index.d.ts.map +1 -0
- package/dist/{axe-fx-ii → gen2/axe-fx-ii}/index.js +1 -1
- package/dist/gen2/axe-fx-ii/opcodes.d.ts.map +1 -0
- package/dist/gen2/axe-fx-ii/paramAliases.d.ts.map +1 -0
- package/dist/gen2/axe-fx-ii/params.d.ts.map +1 -0
- package/dist/{axe-fx-ii → gen2/axe-fx-ii}/setParam.d.ts +17 -46
- package/dist/gen2/axe-fx-ii/setParam.d.ts.map +1 -0
- package/dist/{axe-fx-ii → gen2/axe-fx-ii}/setParam.js +21 -69
- package/dist/gen2/axe-fx-ii/typeApplicability.d.ts.map +1 -0
- package/dist/gen3/axe-fx-iii/blockTypes.d.ts.map +1 -0
- package/dist/gen3/axe-fx-iii/enumOverlay.d.ts.map +1 -0
- package/dist/{axe-fx-iii → gen3/axe-fx-iii}/enumOverlay.js +1 -1
- package/dist/gen3/axe-fx-iii/enumRawId.d.ts.map +1 -0
- package/dist/gen3/axe-fx-iii/gen3ReadRosters.d.ts.map +1 -0
- package/dist/gen3/axe-fx-iii/index.d.ts.map +1 -0
- package/dist/{axe-fx-iii → gen3/axe-fx-iii}/index.js +1 -1
- package/dist/{axe-fx-iii → gen3/axe-fx-iii}/params.d.ts +3 -63
- package/dist/gen3/axe-fx-iii/params.d.ts.map +1 -0
- package/dist/{axe-fx-iii → gen3/axe-fx-iii}/params.js +1 -1
- package/dist/{axe-fx-iii → gen3/axe-fx-iii}/setParam.d.ts +23 -18
- package/dist/gen3/axe-fx-iii/setParam.d.ts.map +1 -0
- package/dist/{axe-fx-iii → gen3/axe-fx-iii}/setParam.js +20 -43
- package/dist/gen3/fm3/index.d.ts.map +1 -0
- package/dist/{fm3 → gen3/fm3}/params.d.ts +1 -1
- package/dist/gen3/fm3/params.d.ts.map +1 -0
- package/dist/gen3/fm9/enumOverrides.d.ts.map +1 -0
- package/dist/gen3/fm9/index.d.ts.map +1 -0
- package/dist/{fm9 → gen3/fm9}/params.d.ts +1 -1
- package/dist/gen3/fm9/params.d.ts.map +1 -0
- package/dist/gen3/fm9/ranges.generated.d.ts.map +1 -0
- package/dist/gen3/fm9/rosters.generated.d.ts.map +1 -0
- package/dist/gen3/types.d.ts +75 -0
- package/dist/gen3/types.d.ts.map +1 -0
- package/dist/gen3/types.js +13 -0
- package/dist/gen3/vp4/index.d.ts.map +1 -0
- package/dist/{vp4 → gen3/vp4}/params.d.ts +1 -1
- package/dist/gen3/vp4/params.d.ts.map +1 -0
- package/dist/{vp4 → gen3/vp4}/setParam.d.ts +5 -3
- package/dist/gen3/vp4/setParam.d.ts.map +1 -0
- package/dist/{vp4 → gen3/vp4}/setParam.js +12 -29
- package/dist/index.js +1 -1
- package/dist/shared/displayScale.d.ts +52 -0
- package/dist/shared/displayScale.d.ts.map +1 -0
- package/dist/shared/displayScale.js +55 -0
- package/dist/shared/effectId.js +2 -2
- package/dist/shared/index.d.ts +3 -0
- package/dist/shared/index.d.ts.map +1 -1
- package/dist/shared/index.js +4 -1
- package/dist/shared/septet16.d.ts +48 -0
- package/dist/shared/septet16.d.ts.map +1 -0
- package/dist/shared/septet16.js +65 -0
- package/docs/CATALOG-SCHEMA.md +95 -0
- package/docs/README.md +79 -0
- package/package.json +26 -21
- package/dist/axe-fx-gen1/blockTypes.d.ts.map +0 -1
- package/dist/axe-fx-gen1/index.d.ts.map +0 -1
- package/dist/axe-fx-gen1/nibble.d.ts.map +0 -1
- package/dist/axe-fx-gen1/params.d.ts.map +0 -1
- package/dist/axe-fx-gen1/readParam.d.ts.map +0 -1
- package/dist/axe-fx-gen1/setParam.d.ts.map +0 -1
- package/dist/axe-fx-gen1/types.d.ts.map +0 -1
- package/dist/axe-fx-ii/applicability.d.ts.map +0 -1
- package/dist/axe-fx-ii/blockTypes.d.ts.map +0 -1
- package/dist/axe-fx-ii/index.d.ts.map +0 -1
- package/dist/axe-fx-ii/opcodes.d.ts.map +0 -1
- package/dist/axe-fx-ii/paramAliases.d.ts.map +0 -1
- package/dist/axe-fx-ii/params.d.ts.map +0 -1
- package/dist/axe-fx-ii/setParam.d.ts.map +0 -1
- package/dist/axe-fx-ii/typeApplicability.d.ts.map +0 -1
- package/dist/axe-fx-iii/blockTypes.d.ts.map +0 -1
- package/dist/axe-fx-iii/enumOverlay.d.ts.map +0 -1
- package/dist/axe-fx-iii/enumRawId.d.ts.map +0 -1
- package/dist/axe-fx-iii/gen3ReadRosters.d.ts.map +0 -1
- package/dist/axe-fx-iii/index.d.ts.map +0 -1
- package/dist/axe-fx-iii/params.d.ts.map +0 -1
- package/dist/axe-fx-iii/setParam.d.ts.map +0 -1
- package/dist/fm3/index.d.ts.map +0 -1
- package/dist/fm3/params.d.ts.map +0 -1
- package/dist/fm9/enumOverrides.d.ts.map +0 -1
- package/dist/fm9/index.d.ts.map +0 -1
- package/dist/fm9/params.d.ts.map +0 -1
- package/dist/fm9/ranges.generated.d.ts.map +0 -1
- package/dist/fm9/rosters.generated.d.ts.map +0 -1
- package/dist/vp4/index.d.ts.map +0 -1
- package/dist/vp4/params.d.ts.map +0 -1
- package/dist/vp4/setParam.d.ts.map +0 -1
- /package/dist/{axe-fx-gen1 → gen1}/blockTypes.d.ts +0 -0
- /package/dist/{axe-fx-gen1 → gen1}/blockTypes.js +0 -0
- /package/dist/{axe-fx-gen1 → gen1}/index.d.ts +0 -0
- /package/dist/{axe-fx-gen1 → gen1}/nibble.d.ts +0 -0
- /package/dist/{axe-fx-gen1 → gen1}/nibble.js +0 -0
- /package/dist/{axe-fx-gen1 → gen1}/params.d.ts +0 -0
- /package/dist/{axe-fx-gen1 → gen1}/params.js +0 -0
- /package/dist/{axe-fx-gen1 → gen1}/readParam.d.ts +0 -0
- /package/dist/{axe-fx-gen1 → gen1}/readParam.js +0 -0
- /package/dist/{axe-fx-gen1 → gen1}/setParam.d.ts +0 -0
- /package/dist/{axe-fx-gen1 → gen1}/setParam.js +0 -0
- /package/dist/{axe-fx-gen1 → gen1}/types.d.ts +0 -0
- /package/dist/{axe-fx-gen1 → gen1}/types.js +0 -0
- /package/dist/{axe-fx-ii → gen2/axe-fx-ii}/applicability.d.ts +0 -0
- /package/dist/{axe-fx-ii → gen2/axe-fx-ii}/applicability.js +0 -0
- /package/dist/{axe-fx-ii → gen2/axe-fx-ii}/blockTypes.d.ts +0 -0
- /package/dist/{axe-fx-ii → gen2/axe-fx-ii}/blockTypes.js +0 -0
- /package/dist/{axe-fx-ii → gen2/axe-fx-ii}/index.d.ts +0 -0
- /package/dist/{axe-fx-ii → gen2/axe-fx-ii}/opcodes.d.ts +0 -0
- /package/dist/{axe-fx-ii → gen2/axe-fx-ii}/opcodes.js +0 -0
- /package/dist/{axe-fx-ii → gen2/axe-fx-ii}/paramAliases.d.ts +0 -0
- /package/dist/{axe-fx-ii → gen2/axe-fx-ii}/paramAliases.js +0 -0
- /package/dist/{axe-fx-ii → gen2/axe-fx-ii}/params.d.ts +0 -0
- /package/dist/{axe-fx-ii → gen2/axe-fx-ii}/params.js +0 -0
- /package/dist/{axe-fx-ii → gen2/axe-fx-ii}/typeApplicability.d.ts +0 -0
- /package/dist/{axe-fx-ii → gen2/axe-fx-ii}/typeApplicability.js +0 -0
- /package/dist/{axe-fx-iii → gen3/axe-fx-iii}/blockTypes.d.ts +0 -0
- /package/dist/{axe-fx-iii → gen3/axe-fx-iii}/blockTypes.js +0 -0
- /package/dist/{axe-fx-iii → gen3/axe-fx-iii}/enumOverlay.d.ts +0 -0
- /package/dist/{axe-fx-iii → gen3/axe-fx-iii}/enumRawId.d.ts +0 -0
- /package/dist/{axe-fx-iii → gen3/axe-fx-iii}/enumRawId.js +0 -0
- /package/dist/{axe-fx-iii → gen3/axe-fx-iii}/gen3ReadRosters.d.ts +0 -0
- /package/dist/{axe-fx-iii → gen3/axe-fx-iii}/gen3ReadRosters.js +0 -0
- /package/dist/{axe-fx-iii → gen3/axe-fx-iii}/index.d.ts +0 -0
- /package/dist/{fm3 → gen3/fm3}/index.d.ts +0 -0
- /package/dist/{fm3 → gen3/fm3}/index.js +0 -0
- /package/dist/{fm3 → gen3/fm3}/params.js +0 -0
- /package/dist/{fm9 → gen3/fm9}/enumOverrides.d.ts +0 -0
- /package/dist/{fm9 → gen3/fm9}/enumOverrides.js +0 -0
- /package/dist/{fm9 → gen3/fm9}/index.d.ts +0 -0
- /package/dist/{fm9 → gen3/fm9}/index.js +0 -0
- /package/dist/{fm9 → gen3/fm9}/params.js +0 -0
- /package/dist/{fm9 → gen3/fm9}/ranges.generated.d.ts +0 -0
- /package/dist/{fm9 → gen3/fm9}/ranges.generated.js +0 -0
- /package/dist/{fm9 → gen3/fm9}/rosters.generated.d.ts +0 -0
- /package/dist/{fm9 → gen3/fm9}/rosters.generated.js +0 -0
- /package/dist/{vp4 → gen3/vp4}/index.d.ts +0 -0
- /package/dist/{vp4 → gen3/vp4}/index.js +0 -0
- /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
|
|
9
|
-
> verification and editor-binary mining, and the Axe-Fx
|
|
10
|
-
> as a
|
|
11
|
-
> hardware verification; see the
|
|
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 "
|
|
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,
|
|
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(
|
|
63
|
-
// →
|
|
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(
|
|
71
|
-
// → {
|
|
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 {
|
|
78
|
-
import {
|
|
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) |
|
|
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
|
-
|
|
|
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
|
|
141
|
-
shared read and preset-dump paths
|
|
142
|
-
|
|
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
|
|