SysEx

Many components on the MIDI controllers can be dynamically relabeled by sending sysex containing an address and the desired text to the app's second MIDI port. This will mainly be of interest when writing controller scripts for DAWs that feature such concepts (Live, Bitwig, Cubase 12,...). Parts of the app that support this incl.
  • The mixer part of the main screen in MIDI mode
  • Launchpads and XY-Overlays on the XY-Pads screen
  • Pads and custom controllers on the Keyboard screen
  • The Workshop screen
The basic sysex format is the same for all of them (all values below in hexadecimal format):

F0 7D 74 64 61 77 00 41 00 08 00 48 65 6C 6C 6F F7

would print 'Hello' to the upper text display on channel 1 of the mixer in MIDI mode.

To break that down:

Messages start with a header: F0 7D 74 64 61 77
and a 'reserved' byte: 00
followed by a target specifying byte: 41
two component address bytes: 00 08
a 'command' byte (0x00 = set text): 00
ASCII bytes of the text to transmit (range limited to 7bits!) 48 65 6C 6C 6F
and the sysex termination byte: F7


Address bytes are target specific:

Mixer (target byte: 0x41) - first byte: 0 based channel number, second byte: component id
  • 0 - Encoder
  • 2 - M 1 / Arm
  • 3 - M 2 / Solo
  • 4 - M 3 / Mute
  • 5 - M 4 / Edit
  • 8 - Upper textfield
  • 9 - Lower textfield
Launchpads (target byte: 0x42) - first byte: 0 based row, second byte: 0 based column

XY-Overlays (target byte: 0x43)

first byte: upper two bits address the two launchpads (0,1), resp. the two optional overlays (2,3). Lower 5 bits combined with the second byte give the pad or control index in the targeted block (up to 12 bits. Only the 7 bits of the second byte will probably be needed). For the launchpads this is somewhat redundant with the previous target message (42), which has been in the app for years.

Keyboard (target byte: 0x44)

first byte: upper two bits address the 3 pad-blocks (0,1,2), resp. the central customizable controller (3). Lower 5 bits combined with the second byte give the pad or control index in the targeted block (up to 12 bits. Effectively only the 7 bits of the second byte will be needed)

Workshop (target byte: 0x45)

Component index (up to 12 bit). This is the number you will see in the header of the editor dialog (#.. - the label uses decimal format.). Beware, this is flawed! When inserting and removing components, the indices of some controls will change. You may want to finish your layout before starting to script sysex.

Components that support dynamic text include buttons, drumpads, encoders, labels and 'lcd's (scribble-strips). Sysex-transmitted text targeting one of these will be accepted regardless of the MIDI the component is set to handle normally.

Unicode

You can send text that includes unicode glyphs by using the ASCII values of their codepoint strings in 'U+....' notation or in HTML entity form '&#x....;'.
Availability and rendering of unicode icons will be device and OS version dependent.

Clear / Back to defaults

Sending an empty or zero length string will revert buttons and pads to their original text (as given in xml). If you deliberatly want to blank out a label, send a unicode space (like for example U+2003).



Sysex for color changes

The three colors (background, text and highlight) that may be set for launchpads and controls on custom controllers can mostly also be changed via sysex. Controller and component addressing is the same as described for dynamic text above.

Color messages (Command byte = 0x08) take 8 MIDI data bytes to transmit 32bit RGBA or HSLA values:

Color index in the highest two bits, evtl. a HSL flag in bit 5 and two bits of the Red or Hue value's MSB in bit 1 & 2 0x20
LSB of the Red or Hue value (range 0 - 255 resp. 360) 0x00
Green or Saturation value (range 0 - 255 resp. 100) 0x01 0x7F
Blue or Luma value (range 0 - 255 resp. 100) 0x00 0x00
Alpha value (range 0 - 255) 0x01 0x7F

Examples

F0 7D 74 64 61 77 00 44 00 04 08 20 00 01 7F 00 00 01 7f F7 - would set the text color of pad number 4 of the keyboard screen's first pad controller to a fully opaque bright green.

F0 7D 74 64 61 77 00 44 00 04 08 11 34 00 32 00 32 01 00 F7 - would set the same pad's background color to a semi transparent, medium saturation and brightness cyan given in HSLA notation.


Sample code and realworld examples

The Cubase / Nuendo 12 MIDI remote and Bitwig controller samples use these options to relabel buttons, print parameter names and values to textfields, set clip colors etc. The javascript source files contain utility methods to format the sysex messages.





Sysex for exclusive groups and toggle buttons

Some further sysex options following the same basic format are dealing with exclusive groups and toggle buttons. These are available on all screens featuring these concepts using the same 'screen target' values as the text options (plus for the keyboard and xy-pad screens the same 'sub-controller' targeting in the first address bytes). The second address byte is eventually used to target a specific group. These messages do not carry data.
  • Clear exclusive group: Command byte = 0x10
    Unsets any eventually made selection in an exclusive group, leaving it with no button being 'on'. If a button had been 'on', it will send an 'off' state.
    The second address byte denotes the group number. 0 targets all exclusive groups.
    Examples:
    F0 7D 74 64 61 77 00 45 00 01 10 F7 - will clear group 1 on the Workshop screen
    F0 7D 74 64 61 77 00 42 00 00 10 F7 - clears all groups on launchpads on the XY-Pads screen

  • Dump exclusive group: Command byte = 0x11
    Sends MIDI reflecting the state of all buttons in an exclusive group without changing their state.
    Second address byte denotes the group number. 0 targets all exclusive groups.
    Examples:
    F0 7D 74 64 61 77 00 45 00 01 11 F7 - dumps group 1 on the Workshop screen
    F0 7D 74 64 61 77 00 42 10 00 11 F7 - dumps all groups on the lower / right launchpad on the XY-Pads screen

  • Unset toggles: Command byte = 0x14
    Turns off all toggle buttons that are not part of an exclusive group. If a button had been 'on', it will send an 'off' state.
    Second address byte is not used.
    Example:
    F0 7D 74 64 61 77 00 45 00 00 14 F7 - turns off all toggles on the Workshop screen

  • Dump toggle states: Command byte = 0x15
    Sends MIDI reflecting the state of all toggle-buttons on a screen that are not part of an exclusive group without changing their state.
    Second address byte is not used.
    Example:
    F0 7D 74 64 61 77 00 45 00 00 15 F7 - dumps all toggles on the Workshop screen