Build & hack

SysEx protocol

Wire format used by the Web MIDI configurator to configure and update devices.

Framing

  • Manufacturer ID: 00 21 7E
  • Standard MIDI SysEx: F0 … F7
  • Multi-packet assembly for long responses (browser client)

Transports

Firmware 2.5 beta accepts configuration SysEx over USB MIDI and BLE MIDI and returns each response through the transport that sent the request. Only one fragmented configuration command is assembled at a time. Firmware-update commands 0x200x23 remain USB-only.

Commands

CmdHexName
PING0x01Identify
GET_INFO0x02Feature / I/O counts
GET_CONFIG0x03Read global config
SET_CONFIG0x04Write global config (RAM)
SAVE0x05Commit EEPROM
RESET0x06Factory defaults
GET_BANK_CONFIG0x07Read bank layer
SET_BANK_CONFIG0x08Write bank layer
GET_CONFIG_CHUNK0x16Read a TX-safe global-config slice
FW_BEGIN0x20Start firmware session
FW_DATA0x21Firmware chunk
FW_END0x22Finalize firmware
FW_CANCEL0x23Abort firmware

Feature flags (GET_INFO)

BitMaskFeature
00x01Bank switching
10x02Harmony
40x10USB firmware update
50x20Deep sleep

Current configuration extensions

Extended GET_INFO metadata reports the EC11 encoder and addressable LED counts. GET_CONFIG and SET_CONFIG append six bytes per encoder: enabled, action type, CC number, current/start value, reversed direction, and MIDI channel.

Encoder action types are CC, Program Change, Bank Select MSB (CC 0), and Bank Select LSB (CC 32). Button types also include Program Change and Bank Select MSB/LSB increment and decrement.

Devices with addressable LEDs can also store a pressed and released RGB color for each matching button/LED position. These settings are global per physical control and persist with Save Permanently.

The v2.5 beta supports six additional harmony voices as literal MIDI notes, each with its own velocity. Each note button can inherit the global stack or define its own six-voice stack, including an empty stack.

Large product profiles use requested 32-byte GET_CONFIG_CHUNK and GET_BANK_CONFIG_CHUNK slices so live MIDI messages cannot overflow the ESP32 USB-MIDI transmit queue while configuration is loading. The legacy single-response commands remain available for compatibility.

A second extension feature byte advertises bounded control ranges. The global payload appends minimum/maximum pairs for buttons, analog knobs, and encoders; bank payloads append the per-bank button and analog-knob pairs. Analog travel maps across the bounded range, while stepped actions and encoders wrap within it.