October 2024: Fractal Audio's VP4 Virtual Pedalboard has been added to the wiki.
Difference between revisions of "MIDI SysEx"
CyberFerret (talk | contribs) m |
CyberFerret (talk | contribs) m |
||
Line 26: | Line 26: | ||
We would have to XOR all the byte values from the starting 'F0' to the '0F' which is the second last byte: | 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 | + | * 0xF0 ^ 0x00 ^ 0x01 ^ 0x74 ^ 0x03 ^ 0x0F = "0x89" |
Then, we would need to strip the leftmost bit from the result (by ANDing it to 0x7F): | Then, we would need to strip the leftmost bit from the result (by ANDing it to 0x7F): | ||
− | * 0x89 && 0x7F = 0x09 | + | * 0x89 && 0x7F = "0x09" |
And, we add this byte (actually, a septet now) to the end of the SYSEX string, BEFORE the terminating F7: | 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 | * 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. | ||
Revision as of 12:35, 18 March 2012
Contents
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, see the article in Wikipedia
- To learn more about SysEx see this article in the Electronic Music Wiki.
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.
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.
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;