Always consult the official Owners Manuals first

Difference between revisions of "MIDI SysEx"

From Fractal Audio Wiki
Jump to navigation Jump to search
Line 926: Line 926:
  
 
=MIDI SysEx: Effect IDs=
 
=MIDI SysEx: Effect IDs=
<tt>
+
{| class="wikitable"
: 100 Comp 1
+
|-
: 101 Comp 2
+
! ID
: 102 GEQ 1
+
! Block Name
: 103 GEQ 2
+
! Can Bypass
: 104 PEQ 1
+
! Axe-Fx II
: 105 PEQ 2
+
! Axe-Fx II XL
: 106 Amp 1
+
! Axe-Fx II XL +
: 107 Amp 2
+
! AX8
: 108 Cab 1
+
|-
: 109 Cab 2
+
|100
: 110 Reverb 1
+
|Compressor 1
: 111 Reverb 2
+
|true
: 112 Delay 1
+
|Available
: 113 Delay 2
+
|Available
: 114 Multi Delay 1
+
|Available
: 115 Multi Delay 2
+
|Available
: 116 Chorus 1
+
|-
: 117 Chorus 2
+
|101
: 118 Flanger 1
+
|Compressor 2
: 119 Flanger 2
+
|true
: 120 Rotary 1
+
|Available
: 121 Rotary 2
+
|Available
: 122 Phaser 1
+
|Available
: 123 Phaser 2
+
|Unavailable
: 124 Wah 1
+
|-
: 125 Wah 2
+
|102
: 126 Formant
+
|Graphic EQ 1
: 127 Vol 1
+
|true
: 128 Pan Trem 1
+
|Available
: 129 Pan Trem 2
+
|Available
: 130 Pitch 1
+
|Available
: 131 Filter 1
+
|Available
: 132 Filter 2
+
|-
: 133 Drive 1
+
|103
: 134 Drive 2
+
|Graphic EQ 2
: 135 Enhancer 1
+
|true
: 136 Effects Loop
+
|Available
: 137 Mixer 1
+
|Available
: 138 Mixer 2
+
|Available
: 139 Noise Gate
+
|Available
: 140 Output
+
|-
: 141 Controllers
+
|104
: 142 FB Send
+
|Parametric EQ 1
: 143 FB Return
+
|true
: 144 Synth 1
+
|Available
: 145 Synth 2
+
|Available
: 146 Vocoder
+
|Available
: 147 Megatap Dly
+
|Available
: 148 Crossover 1
+
|-
: 149 Crossover 2
+
|105
: 150 Gate Exp 1
+
|Parametric EQ 2
: 151 Gate Exp 2
+
|true
: 152 Ring Mod
+
|Available
: 153 Pitch 2
+
|Available
: 154 MB Comp 1
+
|Available
: 155 MB Comp 2
+
|Available
: 156 Quad Cho 1
+
|-
: 157 Quad Cho 2
+
|106
: 158 Resonator 1
+
|Amp 1
: 159 Resonator 2
+
|true
: 160 GEQ 3
+
|Available
: 161 GEQ 4
+
|Available
: 162 PEQ 3
+
|Available
: 163 PEQ 4
+
|Available
: 164 Filter 3
+
|-
: 165 Filter 4
+
|107
: 166 Vol 2
+
|Amp 2
: 167 Vol 3
+
|true
: 168 Vol 4
+
|Available
: 169 Looper
+
|Available
: 170 Tone Match
+
|Available
</tt>
+
|Unavailable
 +
|-
 +
|108
 +
|Cab 1
 +
|true
 +
|Available
 +
|Available
 +
|Available
 +
|Available
 +
|-
 +
|109
 +
|Cab 2
 +
|true
 +
|Available
 +
|Available
 +
|Available
 +
|Unavailable
 +
|-
 +
|110
 +
|Reverb 1
 +
|true
 +
|Available
 +
|Available
 +
|Available
 +
|Available
 +
|-
 +
|111
 +
|Reverb 2
 +
|true
 +
|Available
 +
|Available
 +
|Available
 +
|Unavailable
 +
|-
 +
|112
 +
|Delay 1
 +
|true
 +
|Available
 +
|Available
 +
|Available
 +
|Available
 +
|-
 +
|113
 +
|Delay 2
 +
|true
 +
|Available
 +
|Available
 +
|Available
 +
|Available
 +
|-
 +
|114
 +
|Multi Delay 1
 +
|true
 +
|Available
 +
|Available
 +
|Available
 +
|Available
 +
|-
 +
|115
 +
|Multi Delay 2
 +
|true
 +
|Available
 +
|Available
 +
|Available
 +
|Unavailable
 +
|-
 +
|116
 +
|Chorus 1
 +
|true
 +
|Available
 +
|Available
 +
|Available
 +
|Available
 +
|-
 +
|117
 +
|Chorus 2
 +
|true
 +
|Available
 +
|Available
 +
|Available
 +
|Unavailable
 +
|-
 +
|118
 +
|Flanger 1
 +
|true
 +
|Available
 +
|Available
 +
|Available
 +
|Available
 +
|-
 +
|119
 +
|Flanger 2
 +
|true
 +
|Available
 +
|Available
 +
|Available
 +
|Unavailable
 +
|-
 +
|120
 +
|Rotary Speaker 1
 +
|true
 +
|Available
 +
|Available
 +
|Available
 +
|Available
 +
|-
 +
|121
 +
|Rotary Speaker 2
 +
|true
 +
|Available
 +
|Available
 +
|Available
 +
|Unavailable
 +
|-
 +
|122
 +
|Phaser 1
 +
|true
 +
|Available
 +
|Available
 +
|Available
 +
|Available
 +
|-
 +
|123
 +
|Phaser 2
 +
|true
 +
|Available
 +
|Available
 +
|Available
 +
|Unavailable
 +
|-
 +
|124
 +
|Wah 1
 +
|true
 +
|Available
 +
|Available
 +
|Available
 +
|Available
 +
|-
 +
|125
 +
|Wah 2
 +
|true
 +
|Available
 +
|Available
 +
|Available
 +
|Unavailable
 +
|-
 +
|126
 +
|Formant
 +
|true
 +
|Available
 +
|Available
 +
|Available
 +
|Available
 +
|-
 +
|127
 +
|Volume/Pan 1
 +
|true
 +
|Available
 +
|Available
 +
|Available
 +
|Available
 +
|-
 +
|128
 +
|Tremolo/Panner 1
 +
|true
 +
|Available
 +
|Available
 +
|Available
 +
|Available
 +
|-
 +
|129
 +
|Tremolo/Panner 2
 +
|true
 +
|Available
 +
|Available
 +
|Available
 +
|Unavailable
 +
|-
 +
|130
 +
|Pitch 1
 +
|true
 +
|Available
 +
|Available
 +
|Available
 +
|Available
 +
|-
 +
|131
 +
|Filter 1
 +
|true
 +
|Available
 +
|Available
 +
|Available
 +
|Available
 +
|-
 +
|132
 +
|Filter 2
 +
|true
 +
|Available
 +
|Available
 +
|Available
 +
|Available
 +
|-
 +
|133
 +
|Drive 1
 +
|true
 +
|Available
 +
|Available
 +
|Available
 +
|Available
 +
|-
 +
|134
 +
|Drive 2
 +
|true
 +
|Available
 +
|Available
 +
|Available
 +
|Available
 +
|-
 +
|135
 +
|Enhancer
 +
|true
 +
|Available
 +
|Available
 +
|Available
 +
|Available
 +
|-
 +
|136
 +
|FX Loop
 +
|true
 +
|Available
 +
|Available
 +
|Available
 +
|Available
 +
|-
 +
|137
 +
|Mixer
 +
|false
 +
|Available
 +
|Available
 +
|Available
 +
|Unavailable
 +
|-
 +
|138
 +
|Mixer 2
 +
|true
 +
|Available
 +
|Available
 +
|Available
 +
|Unavailable
 +
|-
 +
|139
 +
|Input Noise Gate
 +
|true
 +
|Available
 +
|Available
 +
|Available
 +
|Available
 +
|-
 +
|140
 +
|Output
 +
|true
 +
|Available
 +
|Available
 +
|Available
 +
|Available
 +
|-
 +
|141
 +
|Controllers
 +
|true
 +
|Available
 +
|Available
 +
|Available
 +
|Available
 +
|-
 +
|142
 +
|Feedback Send
 +
|false
 +
|Available
 +
|Available
 +
|Available
 +
|Unavailable
 +
|-
 +
|143
 +
|Feedback Return
 +
|false
 +
|Available
 +
|Available
 +
|Available
 +
|Unavailable
 +
|-
 +
|144
 +
|Synth 1
 +
|true
 +
|Available
 +
|Available
 +
|Available
 +
|Available
 +
|-
 +
|145
 +
|Synth 2
 +
|true
 +
|Available
 +
|Available
 +
|Available
 +
|Unavailable
 +
|-
 +
|146
 +
|Vocoder
 +
|true
 +
|Available
 +
|Available
 +
|Available
 +
|Unavailable
 +
|-
 +
|147
 +
|Megatap Delay
 +
|true
 +
|Available
 +
|Available
 +
|Available
 +
|Unavailable
 +
|-
 +
|148
 +
|Crossover 1
 +
|true
 +
|Available
 +
|Available
 +
|Available
 +
|Unavailable
 +
|-
 +
|149
 +
|Crossover 2
 +
|true
 +
|Available
 +
|Available
 +
|Available
 +
|Unavailable
 +
|-
 +
|150
 +
|Gate Expander
 +
|true
 +
|Available
 +
|Available
 +
|Available
 +
|Available
 +
|-
 +
|151
 +
|Gate Expander 2
 +
|true
 +
|Available
 +
|Available
 +
|Available
 +
|Unavailable
 +
|-
 +
|152
 +
|Ring Modulator
 +
|true
 +
|Available
 +
|Available
 +
|Available
 +
|Available
 +
|-
 +
|153
 +
|Pitch 2
 +
|true
 +
|Available
 +
|Available
 +
|Available
 +
|Unavailable
 +
|-
 +
|154
 +
|Multiband Compressor 1
 +
|true
 +
|Available
 +
|Available
 +
|Available
 +
|Unavailable
 +
|-
 +
|155
 +
|Multiband Compressor 2
 +
|true
 +
|Available
 +
|Available
 +
|Available
 +
|Unavailable
 +
|-
 +
|156
 +
|Quad Chorus 1
 +
|true
 +
|Available
 +
|Available
 +
|Available
 +
|Unavailable
 +
|-
 +
|157
 +
|Quad Chorus 2
 +
|true
 +
|Available
 +
|Available
 +
|Available
 +
|Unavailable
 +
|-
 +
|158
 +
|Resonator 1
 +
|true
 +
|Available
 +
|Available
 +
|Available
 +
|Unavailable
 +
|-
 +
|159
 +
|Resonator 2
 +
|true
 +
|Available
 +
|Available
 +
|Available
 +
|Unavailable
 +
|-
 +
|160
 +
|Graphic EQ 3
 +
|true
 +
|Available
 +
|Available
 +
|Available
 +
|Unavailable
 +
|-
 +
|161
 +
|Graphic EQ 4
 +
|true
 +
|Available
 +
|Available
 +
|Available
 +
|Unavailable
 +
|-
 +
|162
 +
|Parametric EQ 3
 +
|true
 +
|Available
 +
|Available
 +
|Available
 +
|Unavailable
 +
|-
 +
|163
 +
|Parametric EQ 4
 +
|true
 +
|Available
 +
|Available
 +
|Available
 +
|Unavailable
 +
|-
 +
|164
 +
|Filter 3
 +
|true
 +
|Available
 +
|Available
 +
|Available
 +
|Unavailable
 +
|-
 +
|165
 +
|Filter 4
 +
|true
 +
|Available
 +
|Available
 +
|Available
 +
|Unavailable
 +
|-
 +
|166
 +
|Volume/Pan 2
 +
|true
 +
|Available
 +
|Available
 +
|Available
 +
|Available
 +
|-
 +
|167
 +
|Volume/Pan 3
 +
|true
 +
|Available
 +
|Available
 +
|Available
 +
|Unavailable
 +
|-
 +
|168
 +
|Volume/Pan 4
 +
|true
 +
|Available
 +
|Available
 +
|Available
 +
|Unavailable
 +
|-
 +
|169
 +
|Looper
 +
|true
 +
|Available
 +
|Available
 +
|Available
 +
|Available
 +
|-
 +
|170
 +
|Tone Match
 +
|true
 +
|Available
 +
|Available
 +
|Available
 +
|Unavailable
 +
|}
  
 
[[category:MIDI]]
 
[[category:MIDI]]

Revision as of 19:12, 21 May 2017

The information on this page supplements the official manuals.

MIDI.png

MIDI SysEx: System Exclusive 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.

Fractal Audio's SysEx implementation is discussed here.

MIDI SysEx: Standard/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.

MIDI SysEx: SysEx Model number per device

The numbers below are the Model #

  • 0 Axe FX Standard
  • 1 Axe FX Ultra
  • 2 MFC101
  • 3 Axe FX II
  • 4 MFC101 mk3
  • 5 FX8
  • 6 Axe FX II XL
  • 7 Axe FX II XL+
  • 8 AX8

MIDI SysEx: Axe-Fx II

Many Axe-Fx II SysEx messages are similar to Standard/Ultra messages documented here.

The messages documented here are compatible between Axe-Fx II, Axe-Fx II XL, Axe-Fx II XL+ and AX8, FX8 messages are not documented at the moment

Note, many examples on this page are using 3 for the Model #.

All messages you send must be sent with checksums, but not all response messages will have a checksum, those documented here will specify if a checksum is not included.

All Axe-Fx II/AX8 SysEx messages have the same HEADER as follows:

0xF0 sysex start
0x00 Manf. ID byte0
0x01 Manf. ID byte1
0x74 Manf. ID byte2
0xdd Model #

The byte after the Model # will always be the Function ID.

The last byte of each message will be 0xF7, the checksum is the byte before 0xF7

Function IDs
Function ID Function Name
0x02 GET_BLOCK_PARAMETER_VALUE, SET_BLOCK_PARAMETER_VALUE
0x07 GET_MODIFIER_VALUE, SET_MODIFIER_VALUE
0x08 GET_FIRMWARE_VERSION
0x42 DISCONNECT_FROM_CONTROLLER
0x21 FRONT_PANEL_CHANGE_DETECTED
0x0D TUNER_INFO
0x0E GET_PRESET_BLOCKS_FLAGS
0x0F GET_PRESET_NAME
0x10 MIDI_TEMPO_BEAT
0x14 GET_PRESET_NUMBER
0x3C SET_PRESET_NUMBER
0x20 GET_GRID_LAYOUT_AND_ROUTING
0x23 MIDI_LOOPER_STATUS_ENABLE, MIDI_LOOPER_STATUS
0x29 SET_SCENE_NUMBER
0x01 GET_BLOCK_PARAMETERS_LIST
0x32 BATCH_LIST_REQUEST_START
0x33 BATCH_LIST_REQUEST_COMPLETE
0x64 MULTIPURPOSE_RESPONSE
0x11 GET_BLOCK_XY, SET_BLOCK_XY
0x17 GET_MIDI_CHANNEL
0x13 GET_CPU_USAGE
0x2A GET_PRESET_EDITED_STATUS

GET_BLOCK_PARAMETER_VALUE, SET_BLOCK_PARAMETER_VALUE

This message will get or set the value of the specified block parameter, this value ranges from 0 to 65534, the response message will contain a string which is the label displayed by the Axe Fx II and it's editor, for example the Bass parameter of the AMP block may have a value of 32767 but the label will be "5.00", the value may be 65534 but the label will be "10.00".

Also many parameters have a low/high limit and step, for example the "Voices" parameter of the CHORUS block will have a low limit: 2, high limit: 8 and step: 2 that means you can send values of 2,4,6,8, if you send a value lower than 2 it will set the parameter to 2, if it's higher than 8 it will set the value to 8.

The Effect Type selector is also a parameter, for example on the AMP block the effect type is parameter 0, most blocks with an effect type use parameter 0 as the effect type but not all, you should monitor the MIDI messages between the Axe FX II and Axe-Edit to make sure which parameter is which.

Bypassing/Engaging a Block is also done with this function with parameter 255, send value 0 to Engage, 1 to Bypass.

When you are getting a parameter value you still have to inclue a parameter value with your message but this value can be 0.

See the bottom of this page for Block IDs and functions to convert these bytes to decimal and vice-versa.

Message format:

HEADER BYTES
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:

HEADER BYTES
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

GET_MODIFIER_VALUE, SET_MODIFIER_VALUE

Message format:

HEADER BYTES
0x07 Function ID (0x07)
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 modifier parameter selector ID bits 6-0
0xdd 0
0xdd modifier value bits 6-0
0xdd modifier value bits 13-7
0xdd modifier value bits 15-14
0x00 0=query value, 1=set value
0xdd checksum
0xF7 sysex end

Response format:

HEADER BYTES
0x02 Function ID (0x02)
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 modifier parameter selector ID bits 6-0
0xdd 0
0xdd modifier value bits 6-0
0xdd modifier value bits 13-7
0xdd modifier value bits 15-14
0xdd null-terminated string byte0
0xdd byte1
...
0x00 null character
0xdd checksum
0xF7 sysex end

Modifier Parameter Selector IDs:

0x0 modifier source
0x1 min
0x2 max
0x3 start
0x4 mid
0x5 end
0x6 slope
0x7 damping
0x8 ?
0x9 ?
0xA auto engage
0xB pc reset
0xC off val
0xD scale
0xE offset

GET_FIRMWARE_VERSION

This message responds with the firmware version, also this acts as a "Greeting" message, only after the Axe FX II has received a firmware version request it will start sending message 0x21 (FRONT_PANEL_CHANGE_DETECTED), if you're writing an app or foot controller that will need to be in sync then the first thing you want to do is request the firmware version so that message 0x21 is sent when changes happen on the front panel. Keep in mind, if you do this you will need to "Disconnect" from the hardware when your app closes by sending message 0x42 (DISCONNECT_FROM_CONTROLLER)

Message format:

HEADER BYTES
0x08 Function ID (0x08)
0xdd checksum
0xF7 sysex end

Response format:

HEADER BYTES
0x08 Function ID (0x08)
0xdd Firmware Version major number
0xdd Firmware Version minor number
0xdd
0xdd
0xdd
0xdd
0xdd checksum
0xF7 sysex end

FRONT_PANEL_CHANGE_DETECTED

This message is sent when to notify you that something may have changed on the Hardware, this is the message that causes Axe-Edit/AX8-Edit to "Pause Communication". This message is sent to notify the editor that something has changed and that it should reload the data for that preset, hence why you get the PAUSE overlay on the editor, when you click that overlay the Editor will re-request all the preset data it needs to keep the editor in sync with the hardware.

For example if you select a block on the Axe FX II say the Filter block and you change the gain, then Axe FX will then send this message.

This message is sent about 400ms after the action was complete.

Another example, on the AX8 if you use the Amp Controls on the front panel to change the Gain then you will receive this message. This message is also sent if you press a footswitch that changes a scene/preset/block bypass/XY.

This message is only sent by the hardware if you requested the Firmware version, Read more about this on the "MIDI SysEx: GET_FIRMWARE_VERSION" section

Message format:

HEADER BYTES
0x21 Function ID (0x21)
0xdd checksum
0xF7 sysex end

DISCONNECT_FROM_CONTROLLER

This message should be sent when you quit an app connected to the Axe Fx if your app sent the GET_FIRMWARE_VERSION message, see the GET_FIRMWARE_VERSION section for more info

Message format:

HEADER BYTES
0x42 Function ID (0x42)
0xdd checksum
0xF7 sysex end

TUNER_INFO

This message is broadcast when the Tuner is engaged. Note that the Axe-FX II does not include the checksum byte in this message:

HEADER BYTES
0x0D Function ID (0x0D)
0xdd Note (0=A; 1=Bb; 2=B; etc.)
0xdd String number (0=high E string; 5=low E string)
0xdd Tuner data (value of 63 indicates 'perfectly in tune')
0xF7 sysex end

GET_PRESET_BLOCKS_FLAGS

Message format:

HEADER BYTES
0x0E Function ID (0x0E)
0xdd checksum
0xF7 sysex end

Response format: (response does not contain a checksum)

HEADER BYTES
0x0E Function ID (0x0E)
Information about each effect block in preset follows, using 5 bytes for each effect block in the preset
0xdd Flags Byte (byte 1 of five-byte chunk)
Bit 0: 0=Bypassed, 1=Engaged
Bit 1: 0=Y, 1=X
Bit 2:
Bit 3:
Bit 4:
Bit 5:
Bit 6:
0xdd IA CC Number LSB (byte 2 of five-byte chunk)
Bit 0:
Bit 1: IA_CC_Number Bit 0
Bit 2: IA_CC_Number Bit 1
Bit 3: IA_CC_Number Bit 2
Bit 4: IA_CC_Number Bit 3
Bit 5: IA_CC_Number Bit 4
Bit 6: IA_CC_Number Bit 5
0xdd IA CC Number MSB (byte 3 of five-byte chunck)
Bit 0: IA_CC_Number Bit 6
Bit 1: IA_CC_Number Bit 7
Bit 2:
Bit 3:
Bit 4:
Bit 5:
Bit 6:
0xdd Effect ID LSB (byte 4 of five-byte chunk)
Bit 0:
Bit 1:
Bit 2:
Bit 3: Effect_ID Bit 0
Bit 4: Effect_ID Bit 1
Bit 5: Effect_ID Bit 2
Bit 6: Effect_ID Bit 3
0xdd Effect ID MSB (byte 5 of five-byte chunck)
Bit 0: Effect_ID Bit 4
Bit 1: Effect_ID Bit 5
Bit 2: Effect_ID Bit 6
Bit 3: Effect_ID Bit 7
Bit 4:
Bit 5:
Bit 6:
... (Additional 5-byte chunks, one for each block in the preset)
0xF7 sysex end


The following C++ code will iterate thru the sysex message array, take each five-byte chunk and determine the state flags, cc and block id.

// "message" is the entire sysex array, "lengthOfMessage" is the length of that array

for(int i = 6; i < lengthOfMessage-1 ; i += 5){
  byte isBypassed = (message[i] == 3 || message[i] == 1) ? false : true;
  byte isX        = (message[i] == 3 || message[i] == 2) ? true : false;
  byte cc         = ((message[i+1] & 0x7E) >> 1) + ((message[i+2] & 3) << 6);
  byte id         = ((message[i+3] & 0x78) >> 3) + ((message[i+4] & 0x0F) << 4);
  // Run the rest of your code here
}


GET_PRESET_NAME

Message format:

HEADER BYTES
0x0F Function ID (0x0F)
0xdd checksum
0xF7 sysex end

Response format:

HEADER BYTES
0x0F Function ID (0x0F)
0xdd null-terminated string byte0
0xdd byte1
...
0x00 null character
0xdd checksum
0xF7 sysex end

MIDI_TEMPO_BEAT

Tempo beat or 'pulse' message sent by Axe-FX II. Note that the Axe-FX II does not include the checksum byte in this message:

HEADER BYTES
0x10 Function ID (0x10)
0xF7 sysex end

GET_PRESET_NUMBER

Message format:

HEADER BYTES
0x14 Function ID (0x14)
0xdd checksum
0xF7 sysex end

Response format:

HEADER BYTES
0x14 Function ID (0x14)
0xdd Preset Number bits 6-0
0xdd Preset Number bits 13-7
0xdd checksum
0xF7 sysex end

SET_PRESET_NUMBER

This message sets a preset number of your choice, it will respond with message 0x64 to confirm.

Message format:

HEADER BYTES
0x3C Function ID (0x3C)
0xdd Preset Number bits 6-0
0xdd Preset Number bits 13-7
0xdd checksum
0xF7 sysex end

On the Axe FX the first byte for the preset number is the bank (with an index of 0) and the second byte is the preset number in that bank from 0 to 127. for example if you are on bank A the first byte is 0, bank B then first byte is 1 and so on. if you are on preset 10 then the preset byte is 9, etc If you are on Bank C preset 50 then you want your first byte to be 2 and the second one to be 49 or in Hex 0x02, 0x31

GET_GRID_LAYOUT_AND_ROUTING

Message format:

HEADER BYTES
0x20 Function ID (0x20)
0xdd checksum
0xF7 sysex end

Response format:

HEADER BYTES
0x20 Function ID (0x20)
Information about each grid location follows. The first 4-byte chunk corresponds to the top-left grid location (column 1, row 1). The next four-byte chunk corresponds to the grid location at column 1, row 2. Following this pattern, each of the 48 grid locations are described.
0xdd effect ID bits 6-0
0xdd effect ID bits 13-7
0xdd routing flags
Bit 0: connect row 1 to effect input
Bit 1: connect row 2 to effect input
Bit 2: connect row 3 to effect input
Bit 3: connect row 4 to effect input
Bit 4:
Bit 5:
Bit 6:
0xdd (unused?)
... (47 additional four-byte chunks)
0xdd checksum
0xF7 sysex end

MIDI_LOOPER_STATUS_ENABLE, MIDI_LOOPER_STATUS

Message format:

HEADER BYTES
0x23 Function ID (0x23)
0xdd 0=Disable looper status messages, 1=Enable looper status messages
0xdd checksum
0xF7 sysex end

Response format:

HEADER BYTES
0x23 Function ID (0x23)
0xdd Looper Status Bits
Bit 0: Record
Bit 1: Play
Bit 2: Once
Bit 3: Overdub
Bit 4: Reverse
Bit 5: Half
Bit 6: Undo
0xdd Looper Position (range: 0 to 99)
0xdd checksum
0xF7 sysex end

SET_SCENE_NUMBER

Message format:

HEADER BYTES
0x29 Function ID (0x29)
0xdd Scene Number (range: 0 to 7)
0xdd checksum
0xF7 sysex end

Response format:

HEADER BYTES
0x29 Function ID (0x29)
0xdd Scene Number (range: 0 to 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

GET_BLOCK_PARAMETERS_LIST

This function will get you a list of all the parameters values of a specified block, each parameter with it's value is returned in a separate message.

Message format:

HEADER BYTES
0x01 Function ID (0x01)
0xdd block ID bits 6-0
0xdd block ID bits 13-7
0xdd checksum
0xF7 sysex end

This message will respond with a BATCH_LIST_REQUEST_START (function 0x32) confirming that the batch of messages will be sent and how many will be sent.

After that message you will receive messages with function ID 0x01, these messages are identical to function 0x02 with the exception of the function ID being 0x01

Once complete it will respond with BATCH_LIST_REQUEST_COMPLETE (function 0x33) confirming that they were all sent.

Message 0x01 response format:

HEADER BYTES
0x01 Function ID (0x01)
0xdd block ID bits 6-0
0xdd block 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


BATCH_LIST_REQUEST_START

This message is sent to you when you request a list of certain items, this includes when you request a list of parameters of a block (GET_BLOCK_PARAMETERS_LIST) or when you request a list of factory/user cab names, you can treat this message as confirmation that those parameters are about to be sent to you. The "Response Length" below represents how many messages will be sent as part of that batch.

Message format:

HEADER BYTES
0x32 Function ID (0x32)
0xdd ID of function that it's replying to
0xdd Response Length bits 6-0
0xdd Response Length bits 13-7
0xdd checksum
0xF7 sysex end

BATCH_LIST_REQUEST_COMPLETE

This message is sent to you after a batch of messages you requested was sent to you and it's complete. For Example if you request GET_BLOCK_PARAMETERS_LIST, this message will reply confirming that the request has been complete.

The "ID of function that it's replying to" is the ID of the function that requested the list, in the case of GET_BLOCK_PARAMETERS_LIST which is function 0x01 it will show this byte as 0x01 (on the AX8 the function ID will be 0x02 even tho the request was for 0x01).

Message format:

HEADER BYTES
0x33 Function ID (0x33)
0xdd ID of function that it's replying to
0xdd checksum
0xF7 sysex end

MULTIPURPOSE_RESPONSE

This message is sent by the hardware as a response to certain requests, the first byte after the function id is the requested function id (for example if you change the preset using function id 0x3C the first byte after 0x64 will be 0x3C). The next byte is a response code for the requested function, this code can mean different things, it could mean that the message you first sent had an error, usually if the response code is 0 it means that the task you requested is valid.

Message format:

HEADER BYTES
0x64 Function ID (0x64)
0xdd Response Function ID
0xdd Response Code
0xdd checksum
0xF7 sysex end

GET_BLOCK_XY, SET_BLOCK_XY

Message format:

HEADER BYTES
0x11 Function ID (0x11)
0xdd effect ID bits 6-0
0xdd effect ID bits 13-7
0xdd 0 = set to X, 1 = set to Y
0xdd 0 = get value, 1 = set value
0xdd checksum
0xF7 sysex end

Response format:

HEADER BYTES
0x11 Function ID (0x11)
0xdd effect ID bits 6-0
0xdd effect ID bits 13-7
0xdd 0 = effect is X, 1 = effect is Y
0xdd checksum
0xF7 sysex end

GET_MIDI_CHANNEL

This message message replies with the midi channel set under SETUP > I/O > MIDI > MIDI CHANNEL

Message format:

HEADER BYTES
0x17 Function ID (0x17)
0xdd checksum
0xF7 sysex end

Response format:

HEADER BYTES
0x17 Function ID (0x17)
0xdd Midi Channel (single byte)
0xdd checksum
0xF7 sysex end

GET_CPU_USAGE

Message format:

HEADER BYTES
0x13 Function ID (0x13)
0xdd checksum
0xF7 sysex end

Response format:

HEADER BYTES
0x13 Function ID (0x13)
0xdd CPU % (single byte from 0 to 100)
0xdd checksum
0xF7 sysex end

GET_PRESET_EDITED_STATUS

The Axe FX and AX8 both have an LED on the front panel labeled EDITED, this LED goes on whenever you make any changes to your preset that have not been saved. This message will request that status. It will reply with 1 if the LED on the front panel (preset has changes that need to be saved) is on and 0 if it's off

Message format:

HEADER BYTES
0x2A Function ID (0x2A)
0xdd checksum
0xF7 sysex end

Response format:

HEADER BYTES
0x2A Function ID (0x2A)
0xdd 0 = NO, 1 = YES
0xdd checksum
0xF7 sysex end

MIDI SysEx: calculating the SysEx checksum

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.

MIDI SysEx: obtaining parameter values

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.

MIDI SysEx: loading IRs

The information below was provided by former 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:

HEADER BYTES
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:

HEADER BYTES
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:

HEADER BYTES
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;

MIDI Sysex: converting bytes to decimal and vise versa and more

All functions below written in C++

The following are for each 5 byte chunk of message 0x0E (GET_PRESET_BLOCKS_FLAGS)

This function returns true if the block is in X state or false if the block is in Y state x is the first byte of each 5 byte chunk of message 0x0E

bool isBlockX(byte x){
  if(x==0x03||x==0x02){
    return true;
  }
  return false;
}

This function returns true if the block is bypassed, false if it's not x is the first byte of each 5 byte chunk of message 0x0E

bool isBlockBypassed(byte x){
  if(x==0x03||x==0x01){
    return false;
  }
  return true;
}

This function converts the 2 bytes for the block's bypass CC (IA CC Number LSB/MSB) into a decimal number LSB is the second byte and MSB is the third byte of each 5 byte chunk of message 0x0E

int toBlockCC(byte LSB, byte MSB){
  return ((LSB & 0x7E) >> 1) + ((MSB & 3) << 6);
}

This function converts the 2 bytes for the block's ID (Effect ID LSB/MSB) into a decimal number LSB is the fourth byte and MSB is the fifth byte of each 5 byte chunk of message 0x0E

int blockID(byte LSB, byte MSB){
  return ((LSB & 0x78) >> 3) + ((MSB & 0x0F) << 4);
}

This function converts the effect ID bytes OR the parameter ID bytes into a decimal number

int bytesToInt(byte byte1, byte byte2){
  return (byte1 & 0x7F) | ((byte2 & 0x7F)<<7);
}
<pre>

The reverse of the above to turn a decimal number into 2 bytes where x is the decimal number<BR>
<pre>
byte byte1 = (x & 0x7F);

byte byte2 = ((x >> 7) & 0x7F);

This function converts the 3 parameter value bytes on message (0x02) into a decimal number

int parameterValueBytesToInt(byte byte1, byte byte2, byte byte3){
  return (byte1 & 0x7F) | ((byte2 & 0x7F)<<7) | ((byte3 & 0x7F)<<14);
}

The reverse of the above to turn a decimal number into 3 bytes where x is the decimal number

byte byte1 = x & 0x7F;

byte byte2 = (x >> 7) & 0x7F;

byte byte3 = (x >> 14) & 0x7F);

To convert a decimal number into the 2 bytes for a preset change, where x is the decimal number

byte byte1 = x >> 7;

byte byte2 = x & 0x7F;

To convert the 2 bytes received from a preset change to a decimal number:

Axe FX II

int x = (byte1 & 0x7F) << 7 | byte2;

AX8

int x = (byte1 & 0x7F) | ((byte2 & 0x7F) << 7);

To convert the decimal preset number into a Bank/Preset set. This number ranges from 0 to 383 on the Axe FX II, 0 to 767 on the XL/+ and 0 to 511 on the AX8

Axe FX II or later, where x is the decimal number from 0 to 383/767

byte bankNumber = floor(x / 128); // banks are labeled A,B,C,D,E,F where bank A is 0 and bank F is 5

byte presetNumber = x - (bankNumber*128); // preset number with index of 0, to display offset it to 1 just add 1 to this number when displayed

AX8 where x is the decimal number from 0 to 511

byte bankNumber = floor(x / 8); // banks are labeled from 1 to 64, this functions will return a number from 0 to 63, add 1 when you display it

byte presetNumber = x - (bank * 8);

MIDI SysEx: Effect IDs

ID Block Name Can Bypass Axe-Fx II Axe-Fx II XL Axe-Fx II XL + AX8
100 Compressor 1 true Available Available Available Available
101 Compressor 2 true Available Available Available Unavailable
102 Graphic EQ 1 true Available Available Available Available
103 Graphic EQ 2 true Available Available Available Available
104 Parametric EQ 1 true Available Available Available Available
105 Parametric EQ 2 true Available Available Available Available
106 Amp 1 true Available Available Available Available
107 Amp 2 true Available Available Available Unavailable
108 Cab 1 true Available Available Available Available
109 Cab 2 true Available Available Available Unavailable
110 Reverb 1 true Available Available Available Available
111 Reverb 2 true Available Available Available Unavailable
112 Delay 1 true Available Available Available Available
113 Delay 2 true Available Available Available Available
114 Multi Delay 1 true Available Available Available Available
115 Multi Delay 2 true Available Available Available Unavailable
116 Chorus 1 true Available Available Available Available
117 Chorus 2 true Available Available Available Unavailable
118 Flanger 1 true Available Available Available Available
119 Flanger 2 true Available Available Available Unavailable
120 Rotary Speaker 1 true Available Available Available Available
121 Rotary Speaker 2 true Available Available Available Unavailable
122 Phaser 1 true Available Available Available Available
123 Phaser 2 true Available Available Available Unavailable
124 Wah 1 true Available Available Available Available
125 Wah 2 true Available Available Available Unavailable
126 Formant true Available Available Available Available
127 Volume/Pan 1 true Available Available Available Available
128 Tremolo/Panner 1 true Available Available Available Available
129 Tremolo/Panner 2 true Available Available Available Unavailable
130 Pitch 1 true Available Available Available Available
131 Filter 1 true Available Available Available Available
132 Filter 2 true Available Available Available Available
133 Drive 1 true Available Available Available Available
134 Drive 2 true Available Available Available Available
135 Enhancer true Available Available Available Available
136 FX Loop true Available Available Available Available
137 Mixer false Available Available Available Unavailable
138 Mixer 2 true Available Available Available Unavailable
139 Input Noise Gate true Available Available Available Available
140 Output true Available Available Available Available
141 Controllers true Available Available Available Available
142 Feedback Send false Available Available Available Unavailable
143 Feedback Return false Available Available Available Unavailable
144 Synth 1 true Available Available Available Available
145 Synth 2 true Available Available Available Unavailable
146 Vocoder true Available Available Available Unavailable
147 Megatap Delay true Available Available Available Unavailable
148 Crossover 1 true Available Available Available Unavailable
149 Crossover 2 true Available Available Available Unavailable
150 Gate Expander true Available Available Available Available
151 Gate Expander 2 true Available Available Available Unavailable
152 Ring Modulator true Available Available Available Available
153 Pitch 2 true Available Available Available Unavailable
154 Multiband Compressor 1 true Available Available Available Unavailable
155 Multiband Compressor 2 true Available Available Available Unavailable
156 Quad Chorus 1 true Available Available Available Unavailable
157 Quad Chorus 2 true Available Available Available Unavailable
158 Resonator 1 true Available Available Available Unavailable
159 Resonator 2 true Available Available Available Unavailable
160 Graphic EQ 3 true Available Available Available Unavailable
161 Graphic EQ 4 true Available Available Available Unavailable
162 Parametric EQ 3 true Available Available Available Unavailable
163 Parametric EQ 4 true Available Available Available Unavailable
164 Filter 3 true Available Available Available Unavailable
165 Filter 4 true Available Available Available Unavailable
166 Volume/Pan 2 true Available Available Available Available
167 Volume/Pan 3 true Available Available Available Unavailable
168 Volume/Pan 4 true Available Available Available Unavailable
169 Looper true Available Available Available Available
170 Tone Match true Available Available Available Unavailable