Skip to content

drivers: Axe-Fx II (gen2, 0x07) + VP4 (0x14) device drivers#33

Merged
sKuhLight merged 1 commit into
feature/gen3-telemetryfrom
feature/axe2-vp4-support
Jul 4, 2026
Merged

drivers: Axe-Fx II (gen2, 0x07) + VP4 (0x14) device drivers#33
sKuhLight merged 1 commit into
feature/gen3-telemetryfrom
feature/axe2-vp4-support

Conversation

@sKuhLight

Copy link
Copy Markdown
Owner

Wires Axe-Fx II and VP4 through the driver layer + detection so Axis can edit them. Community-beta, not yet hardware-verified (mocked-transport tests only — no device available here).

What

  • descriptorConn.ts — shared MidiConnectionTransport bridge for descriptor-driven drivers (extracted from the AM4 pattern; AM4 left untouched).
  • gen2.ts (0x07, key axe2) — 4×12 grid, 8 scenes, X/Y channels. Reads via the verified AXEFX2_DESCRIPTOR.reader.getPreset (behind a reader mutex + TTL cache); writes via the low-level wire builders so setParam(eid,paramId,…) stays byte-precise (fn 0x2e display-float for continuous, fn 0x02 int for discrete, plus bypass/channel/place/scene/select/store/rename).
  • vp4.ts (0x14, key vp4) — linear 4-slot; shared gen-3 reader. Only continuous set_param, set_bypass, and save are decoded → shipped; discrete/placement/scene/rename are gated (methods omitted → routes 501). ⚠️ grid() is discovery-order, not true slot position: the gen-3 grid read has no VP4 4-slot geometry, so real placement isn't decodable yet (needs a sub=0x2E capture upstream).
  • registryCore.ts — detect + drive 0x07/0x14; forced-profile keys axe2/vp4.
  • Tests — detection (handshake + port-name + longest-name regression) and gen2/vp4 write-frame + capability suites.

Verification

npm run typecheck clean; npm test11/11 suites pass; browser-safe check clean.

Base is feature/gen3-telemetry (PR #32) so this diff is isolated to the axe2/VP4 work. gen1 (Axe-Fx Std/Ultra) is intentionally out of scope — its protocol has no grid/preset read.

Wire both remaining ForgeFX-MIDI devices through the driver layer. Reads reuse
the verified forgefx-midi descriptor readers over the shared transport; writes
use the low-level wire builders so setParam(eid,paramId,...) stays byte-precise.

- descriptorConn: shared MidiConnection<->Transport bridge for descriptor-driven
  drivers (extracted from the AM4 pattern)
- gen2: 4x12 grid, 8 scenes, X/Y channels; getPreset-backed grid/blockParams,
  raw-builder writes (param/bypass/channel/place/scene/select/store/rename)
- vp4: linear 4-slot; shared gen-3 reader; only continuous set_param, set_bypass,
  and save are decoded (community-beta) - discrete/placement/scene/rename stay
  gated (routes 501). grid() is discovery-order: the gen-3 grid read has no VP4
  4-slot geometry, so true slot placement is not decodable yet
- registry: detect + drive 0x07/0x14; forced-profile keys axe2/vp4
- test: detection cases (handshake + port-name + longest-name regression) and
  gen2/vp4 write-frame + capability suites (mocked transport, no hardware)
@sKuhLight sKuhLight merged commit 24c748f into feature/gen3-telemetry Jul 4, 2026
@sKuhLight sKuhLight deleted the feature/axe2-vp4-support branch July 4, 2026 14:17
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant