October 2024: Fractal Audio's VP4 Virtual Pedalboard has been added to the wiki.
Difference between revisions of "MIDI SysEx"
m (fix bitwise operator typo) |
|||
Line 664: | Line 664: | ||
</tt> | </tt> | ||
− | [[category: | + | [[category:MIDI]] |
Revision as of 13:44, 23 March 2015
Contents
- 1 MIDI SysEx: System Exclusive messages
- 2 MIDI SysEx: Standard/Ultra
- 3 MIDI SysEx: Axe-Fx II
- 3.1 MIDI SysEx: MIDI_GET_PARAMETER, MIDI_SET_PARAMETER
- 3.2 MIDI SysEx: MIDI_GET_MODIFIER, MIDI_SET_MODIFIER
- 3.3 MIDI SysEx: MIDI_GET_FIRMWARE_VERSION
- 3.4 MIDI SysEx: MIDI_TUNER_INFO
- 3.5 MIDI SysEx: MIDI_GET_PRESET_EFFECT_BLOCKS_AND_CC_AND_BYPASS_STATE
- 3.6 MIDI SysEx: MIDI_GET_PRESET_NAME
- 3.7 MIDI SysEx: MIDI_TEMPO_BEAT
- 3.8 MIDI SysEx: MIDI_GET_PRESET_NUMBER
- 3.9 MIDI SysEx: MIDI_GET_ROUTING_GRID_LAYOUT
- 3.10 MIDI SysEx: MIDI_LOOPER_STATUS_ENABLE, MIDI_LOOPER_STATUS
- 3.11 MIDI SysEx: MIDI_SET_SCENE_NUMBER
- 3.12 MIDI SysEx: MIDI_SET_PRESET
- 4 MIDI SysEx: calculating the SysEx checksum
- 5 MIDI SysEx: obtaining parameter values
- 6 MIDI SysEx: loading IRs
- 7 MIDI SysEx: Effect IDs
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.
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: 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 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_ENABLE, MIDI_LOOPER_STATUS |
0x29 | MIDI_SET_SCENE_NUMBER |
MIDI SysEx: 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 SysEx: MIDI_GET_MODIFIER, MIDI_SET_MODIFIER
Message format:
- 0xF0 sysex start
- 0x00 Manf. ID byte0
- 0x01 Manf. ID byte1
- 0x74 Manf. ID byte2
- 0x03 Model #
- 0x07 Function ID (7)
- 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:
- 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 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
MIDI SysEx: MIDI_GET_FIRMWARE_VERSION
Message format:
- 0xF0 sysex start
- 0x00 Manf. ID byte0
- 0x01 Manf. ID byte1
- 0x74 Manf. ID byte2
- 0x03 Model #
- 0x08 Function ID (8)
- 0xdd checksum
- 0xF7 sysex end
Response format:
- 0xF0 sysex start
- 0x00 Manf. ID byte0
- 0x01 Manf. ID byte1
- 0x74 Manf. ID byte2
- 0x03 Model #
- 0x08 Function ID (8)
- 0xdd Firmware Version major number
- 0xdd Firmware Version minor number
- 0xdd
- 0xdd
- 0xdd
- 0xdd
- 0xdd checksum
- 0xF7 sysex end
MIDI SysEx: MIDI_TUNER_INFO
This message is broadcast when the Tuner enabled. Note that the Axe-FX II does not include the checksum byte in this message:
- 0xF0 sysex start
- 0x00 Manf. ID byte0
- 0x01 Manf. ID byte1
- 0x74 Manf. ID byte2
- 0x03 Model #
- 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
MIDI SysEx: MIDI_GET_PRESET_EFFECT_BLOCKS_AND_CC_AND_BYPASS_STATE
Message format:
- 0xF0 sysex start
- 0x00 Manf. ID byte0
- 0x01 Manf. ID byte1
- 0x74 Manf. ID byte2
- 0x03 Model #
- 0x0E Function ID (0x0E)
- 0xdd checksum
- 0xF7 sysex end
Response format:
- 0xF0 sysex start
- 0x00 Manf. ID byte0
- 0x01 Manf. ID byte1
- 0x74 Manf. ID byte2
- 0x03 Model #
- 0x0E Function ID (0x0E)
- Information about each effect block in preset follows, using 5 bytes for each effect block in the preset
- 0xdd Status Bits
- Bit 0: 0=Bypassed, 1=Enabled
- Bit 1: 0=Y, 1=X
- Bit 2:
- Bit 3:
- Bit 4:
- Bit 5:
- Bit 6:
- 0xdd IA CC Number LSB
- 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
- 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
- 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
- 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)
- 0xdd checksum
- 0xF7 sysex end
MIDI SysEx: 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 SysEx: 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:
- 0xF0 sysex start
- 0x00 Manf. ID byte0
- 0x01 Manf. ID byte1
- 0x74 Manf. ID byte2
- 0x03 Model #
- 0x10 Function ID (0x10)
- 0xF7 sysex end
MIDI SysEx: 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 SysEx: MIDI_GET_ROUTING_GRID_LAYOUT
Message format:
- 0xF0 sysex start
- 0x00 Manf. ID byte0
- 0x01 Manf. ID byte1
- 0x74 Manf. ID byte2
- 0x03 Model #
- 0x20 Function ID (0x20)
- 0xdd checksum
- 0xF7 sysex end
Response format:
- 0xF0 sysex start
- 0x00 Manf. ID byte0
- 0x01 Manf. ID byte1
- 0x74 Manf. ID byte2
- 0x03 Model #
- 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 SysEx: MIDI_LOOPER_STATUS_ENABLE, MIDI_LOOPER_STATUS
Message format:
- 0xF0 sysex start
- 0x00 Manf. ID byte0
- 0x01 Manf. ID byte1
- 0x74 Manf. ID byte2
- 0x03 Model #
- 0x23 Function ID (0x23)
- 0xdd 0=Disable looper status messages, 1=Enable looper status messages
- 0xdd checksum
- 0xF7 sysex end
Response format:
- 0xF0 sysex start
- 0x00 Manf. ID byte0
- 0x01 Manf. ID byte1
- 0x74 Manf. ID byte2
- 0x03 Model #
- 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
MIDI SysEx: MIDI_SET_SCENE_NUMBER
Message format:
- 0xF0 sysex start
- 0x00 Manf. ID byte0
- 0x01 Manf. ID byte1
- 0x74 Manf. ID byte2
- 0x03 Model #
- 0x29 Function ID (0x29)
- 0xdd Scene Number (range: 0 to 7)
- 0xdd checksum
- 0xF7 sysex end
Response format:
- 0xF0 sysex start
- 0x00 Manf. ID byte0
- 0x01 Manf. ID byte1
- 0x74 Manf. ID byte2
- 0x03 Model #
- 0x29 Function ID (0x29)
- 0xdd Scene Number (range: 0 to 7)
- 0xdd checksum
- 0xF7 sysex end
MIDI SysEx: 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
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:
- 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;
MIDI SysEx: Effect IDs
- 100 Comp 1
- 101 Comp 2
- 102 GEQ 1
- 103 GEQ 2
- 104 PEQ 1
- 105 PEQ 2
- 106 Amp 1
- 107 Amp 2
- 108 Cab 1
- 109 Cab 2
- 110 Reverb 1
- 111 Reverb 2
- 112 Delay 1
- 113 Delay 2
- 114 Multi Delay 1
- 115 Multi Delay 2
- 116 Chorus 1
- 117 Chorus 2
- 118 Flanger 1
- 119 Flanger 2
- 120 Rotary 1
- 121 Rotary 2
- 122 Phaser 1
- 123 Phaser 2
- 124 Wah 1
- 125 Wah 2
- 126 Formant
- 127 Vol 1
- 128 Pan Trem 1
- 129 Pan Trem 2
- 130 Pitch 1
- 131 Filter 1
- 132 Filter 2
- 133 Drive 1
- 134 Drive 2
- 135 Enhancer 1
- 136 Effects Loop
- 137 Mixer 1
- 138 Mixer 2
- 139 Noise Gate
- 140 Output
- 141 Controllers
- 142 FB Send
- 143 FB Return
- 144 Synth 1
- 145 Synth 2
- 146 Vocoder
- 147 Megatap Dly
- 148 Crossover 1
- 149 Crossover 2
- 150 Gate Exp 1
- 151 Gate Exp 2
- 152 Ring Mod
- 153 Pitch 2
- 154 MB Comp 1
- 155 MB Comp 2
- 156 Quad Cho 1
- 157 Quad Cho 2
- 158 Resonator 1
- 159 Resonator 2
- 160 GEQ 3
- 161 GEQ 4
- 162 PEQ 3
- 163 PEQ 4
- 164 Filter 3
- 165 Filter 4
- 166 Vol 2
- 167 Vol 3
- 168 Vol 4
- 169 Looper
- 170 Tone Match