October 2024: Fractal Audio's VP4 Virtual Pedalboard has been added to the wiki.

MIDI SysEx

From Fractal Audio Wiki
Revision as of 17:05, 11 March 2013 by Dsorlien (talk | contribs) (Add Get Preset Number mesage format)
Jump to navigation Jump to search

About MIDI System Exclusive (SysEx) messages

  • If you're a MIDI expert, you can use SysEx messages (MIDI System Exclusive) to control the Axe-Fx II.
  • To learn more about MIDI, read this article.
  • To learn more about SysEx, read this article.

SysEx messages for Ultra

  • Ultra-specific SysEx information has been accurately acquired and organized by forum member GM Arts: here.
  • Information about SysEx commands for retrieving Preset/Effect bypass states is here.

SysEx messages for Axe-Fx II

  • Many Axe-Fx II SysEx messages are similar to Standard/Ultra messages documented here.
  • Model ID is 3.
  • All messages must be sent with checksums.
  • Responses for some key messages are different. Information about SysEx commands for retrieving Preset names and Preset/Effect bypass states is here.
  • All Axe-Fx II SysEx messages have the same header as follows:

0xF0 sysex start
0x00 Manf. ID byte0
0x01 Manf. ID byte1
0x74 Manf. ID byte2
0x03 Model # (Axe-Fx II = 0x03)
0xdd Function ID

Function IDs
Function ID Function Name
0x02 MIDI_GET_PARAMETER, MIDI_SET_PARAMETER
0x07 MIDI_GET_MODIFIER, MIDI_SET_MODIFIER
0x08 MIDI_GET_FIRMWARE_VERSION
0x0D MIDI_TUNER_INFO
0x0E MIDI_GET_PRESET_EFFECT_BLOCKS_AND_CC_AND_BYPASS_STATE
0x0F MIDI_GET_PRESET_NAME
0x10 MIDI_TEMPO_BEAT
0x14 MIDI_GET_PRESET_NUMBER
0x20 MIDI_GET_ROUTING_GRID_LAYOUT
0x23 MIDI_LOOPER_STATUS, MIDI_LOOPER_STATUS_ENABLE
0x29 MIDI_GET_SCENE_STATUS

MIDI_GET_PARAMETER, MIDI_SET_PARAMETER

Message format:

0xF0 sysex start
0x00 Manf. ID byte0
0x01 Manf. ID byte1
0x74 Manf. ID byte2
0x03 Model #
0x02 Function ID (2)
0xdd effect ID bits 6-0
0xdd effect ID bits 13-7
0xdd parameter ID bits 6-0
0xdd parameter ID bits 13-7
0xdd parameter value bits 6-0
0xdd parameter value bits 13-7
0xdd parameter value bits 15-14
0x00 0: query value, 1: set value
0xdd checksum
0xF7 sysex end

Response format:

0xF0 sysex start
0x00 Manf. ID byte0
0x01 Manf. ID byte1
0x74 Manf. ID byte2
0x03 Model #
0x02 Function ID (2)
0xdd effect ID bits 6-0
0xdd effect ID bits 13-7
0xdd parameter ID bits 6-0
0xdd parameter ID bits 13-7
0xdd parameter value bits 6-0
0xdd parameter value bits 13-7
0xdd parameter value bits 15-14
0xdd
0xdd
0xdd
0xdd
0xdd
0xdd null-terminated string byte0
0xdd byte1
...
0x00 null character
0xdd checksum
0xF7 sysex end

MIDI_GET_PRESET_NAME

Message format:

0xF0 sysex start
0x00 Manf. ID byte0
0x01 Manf. ID byte1
0x74 Manf. ID byte2
0x03 Model #
0x0F Function ID (0x0F)
0xdd checksum
0xF7 sysex end

Response format:

0xF0 sysex start
0x00 Manf. ID byte0
0x01 Manf. ID byte1
0x74 Manf. ID byte2
0x03 Model #
0x0F Function ID (0x0F)
0xdd null-terminated string byte0
0xdd byte1
...
0x00 null character
0xdd checksum
0xF7 sysex end

MIDI_GET_PRESET_NUMBER

Message format:

0xF0 sysex start
0x00 Manf. ID byte0
0x01 Manf. ID byte1
0x74 Manf. ID byte2
0x03 Model #
0x14 Function ID (0x14)
0xdd checksum
0xF7 sysex end

Response format:

0xF0 sysex start
0x00 Manf. ID byte0
0x01 Manf. ID byte1
0x74 Manf. ID byte2
0x03 Model #
0x14 Function ID (0x14)
0xdd Preset Number bits 6-0
0xdd Preset Number bits 13-7
0xdd checksum
0xF7 sysex end

MIDI_SET_PRESET

Function number: 14
Example: F0 0 1 74 3 14 0 1 13 0 FF --> to set the current preset (edit buffer) to preset 0 (1 if DISPLAY OFFSET activated)
F0 0 1 74 3 14 1 0 13 0 FF --> to set the current preset (edit buffer) to preset 128 (129 if DISPLAY OFFSET activated)
Send from AXE-FX to AXE-EDIT and MFC-101

Calculating the SysEx checksum for the Axe-FX II

  • As mentioned above, the Axe-FX II units require a checksum to be added to the end of the SysEx string that is sent to it (before the terminating F7 byte) as a verification step.
  • In order to calculate the checksum, you basically have to XOR every byte from the start of the SysEx message, up to the character BEFORE the terminating F7 byte. For example, to send the following SysEx message (to fetch a preset name):

F0 00 01 74 03 0F F7

We would have to XOR all the byte values from the starting 'F0' to the '0F' which is the second last byte:

0xF0 ^ 0x00 ^ 0x01 ^ 0x74 ^ 0x03 ^ 0x0F = 0x89

Then, we would need to strip the leftmost bit from the result (by ANDing it to 0x7F):

0x89 && 0x7F = 0x09

And, we add this byte (actually, a septet now) to the end of the SysEx string, BEFORE the terminating F7:

F0 00 01 74 03 0F 09 F7

Obviously, in a 'static' SysEx message like above, you do not have to recalculate the checksum each time as it will always be '09' as the rest of the message does not change, but if you are sending a SysEx string to change a parameter value etc. then you will have to calculate the checksum on the fly as byte values towards the end of the SysEx string will be different each time.


Obtaining Parameter Values via SysEx Messages

The old Standard/Ultra devices used to store the parameter values on *most* knobs as 0-254. This was split into two bytes, XX YY where XX was the lowest 4 bits of the value, and YY was the highest 4 bits. Pretty simple.

The new Axe-II now has more granular control over *most* knobs, with the values going from 0-65534. This requires a full 16 bits to store. The problem is that the MIDI specifications means you can only transmit values using 7 bits as the highest bit of each byte must be a zero.

To get around this, the Axe-II uses THREE bytes to transmit the values XX YY ZZ where XX is the lowest 7 bits of the data, YY is the 8th to the 14th bit of the data, and ZZ is the remaining top two bits of the data.

So, if you had the value 52421 on a knob, then this would be represented by the 16 bits: 1100110011000101

If you split this into segments of length 2/7/7 to store in ZZ/YY/XX: 11 0011001 1000101

So XX gets the last segment: 01000101 And YY gets the middle segment: 00011001 And ZZ gets the first segment: 00000011

You will also have to back-calculate the respective knob values to the 16 bit values. For example, a knob that goes from 0 - 10, 0 would of course be 0, but 10 would be 65534. From there, you would work out that 5 is 32767 and 7 would be about 45871 etc.


Axe Fx II SysEx Information for loading IRs

  • The information below was provided by forum member LMO.
  • The Axe Fx II supports 2040-point impulse responses that are packaged for download in a series of 66 MIDI SysEx messages, as follows:

MIDI_START_IR_DOWNLOAD

Prepare the Axe-Fx II to receive impulse response data

Message Format:

0xF0 sysex start
0x00 manufacturing ID byte 0
0x01 manufacturing ID byte 1
0x74 manufacturing ID byte 2
0x03 model number
0x7A function ID
0x20
0x00
0x10
0xdd checksum
0xF7 sysex end

MIDI_G2_IR_DATA

There are 64 SysEx messages, each containing 32 chunks of data. Each chunk consists of five bytes and can hold either four text characters or one 32-bit IR data sample.

The first data message sent includes 8 chunks of text that specify the 32-character IR name, and 24 chunks of IR data. The subsequent 63 data messages each contain 32 data samples for a total of 2040 samples.

Message Format:

0xF0 sysex start
0x00 manufacturing ID byte 0
0x01 manufacturing ID byte 1
0x74 manufacturing ID byte 2
0x03 model number
0x7B function ID
0x20
0x00
0xdd data chunk byte 0
0xdd data chunk byte 1
0xdd data chunk byte 2
0xdd data chunk byte 3
0xdd data chunk byte 4
--- 31 additional five byte data chunks ---
0xdd checksum
0xF7 sysex end

MIDI_CLOSE_IR_DOWNLOAD

Terminate the IR download sequence

Message Format:

0xF0 sysex start
0x00 manufacturing ID byte 0
0x01 manufacturing ID byte 1
0x74 manufacturing ID byte 2
0x03 model number
0x7C function ID
0xdd encoded checksum byte 0 for IR data
0xdd encoded checksum byte 1 for IR data
0xdd encoded checksum byte 2 for IR data
0xdd encoded checksum byte 3 for IR data
0xdd encoded checksum byte 4 for IR data
0xdd checksum
0xF7 sysex end

Data Chunk Encoding Scheme

The data encoding scheme translates four octets into five septets. Each septet occupies the lower seven bits of a byte, with the most significant bit set to 0.

  • octet is one byte containing 8 bits of data
  • septet is one byte containing 7 bits of data
byte_chunk = (data[0] & 0xFF )<< 24 | (data[1] & 0xFF )<< 16 | (data[2] & 0xFF )<< 8 (data[3] & 0xFF;
  • convert four octets to five septets
septet[0] = byte_chunk & 0xFF;
septet[1] = byte_chunk >> 7 & 0xFF;
septet[2] = byte_chunk >> 14 & 0xFF;
septet[3] = byte_chunk >> 21 & 0xFF;
septet[4] = byte_chunk >> 28 & 0xFF;