OK, here is the current version of my Arduino program
https://www.dropbox.com/s/29bf9hegmm79a88/AxeAnalogControl_C11.ino?dl=0
Disclaimer: I am not an expert, not even a student, in programming. I am just a 51 years old hobbyist, and this is only my second project with Arduino (the first one is the Axe-FX foot controller at my signature) I have learnt everything by trial –and-error and frankesteinizing pieces of code from others. The program can write parameters to the Axe-FX but requires debugging on reading them. The display multiplexers and the encoders may have room for improvement in order to speed up the process. As I’ve said, I have abandoned this project while I am programming a MIDI Foot Bass Pedal Synth. Suggestions, improvements and remakes of the program are welcome.
Anyway, I will try to explain what I think I’ve learnt so far:
In order to control one parameter of the Axe-FX (e.g.: the Gain of Amp-1 block) we have to send a SysEx (System Exclusive) MIDI message.
A Sysex is an array of bytes that always start with the byte F0 and ends with the byte F7 (represented as 0xF0 and 0xF7 as a hexadecimal number). Bytes2, 3 and 4 are the manufacturer ID, byte 5 the device ID, and the rest of the bytes before the F7 end byte are the parameter’s data.
Here is the definition of each byte of the SySex array. (16 bytes in the case of a parameter change for the Axe-FX):
Byte 1 - 0xF0 sysex start
Byte 2 - 0x00 manufacturer ID- byte 0 (0x00 for Fractal Audio)
Byte 3 - 0x01 manufacturer ID byte 1 (0x01 for Fractal Audio)
Byte 4 - 0x74 manufacturer ID byte 2 (0x74 for Fractal Audio)
Byte 5 - 0x03 Axe-fx II id (0x03 for the Axe-FX II)
Bytes 6 to 15 - Variable parameters
Byte 16 - 0xF7 sysex end
And here is the definition of bytes 6 to 15:
byte 6 - funcID = 0x02; //5 Function ID 0x02 = MIDI_GET_PARAMETER, MIDI_SET-PARAMETER)
Byte 6 defines that this Sysex is for getting or setting parameters to/from the Axe-FX
byte 7 - blockIDa = 0x6A; //6 Block ID for Amp 1
byte 8 - blockIDb = 0x00; //7 Block ID for Amp 1
Bytes 7 and 8 define the block. This example is for Amp1
byte 9 - paraIDa = 0x01; //8 Parameter ID for Amp 1 - Gain
byte 10 - paraIDb = 0x00; //9 Parameter ID for Amp 1 – Gain
Bytes 9 and 18 define the parameter of the block defined on bytes 7 and 8. This example is for Gain
byte 11 - parXX = 0x00; //10 Parameter bits 1 to 7 (lowest)
byte 12 - parYY = 0x00; //11 Parameter bits 8 to 14
byte 13 - parZZ = 0x00; //12 Parameter bits 15 to 16
Bytes 11 to 13 are the numeric value of the parameter
byte 14 - setByte = 0x01; //13 Set Byte 0=query value, 1=set value
Byte 14 defines if you are reading or writing the value to/from the axe-FX
byte 15 - CheckSum = 0x00; //14 Checksum byte - Method 3
Byte 15 is the Cheksum to verify the integrity of the message (it was a real PITA for me to learn how to do that, but now it is working)
And that’s all on the SysEx message to write/read a parameter to the Axe-FX.
There is a table with all the parameters for the Axe-FX Ultra, but I haven’t found any for the Axe-FX II. I got that data by reading the SySex messages from the Axe-FX II using Midi Ox. It would be nice if someone could share a complete list for the Axe-FX II.
Wiki info here:
https://wiki.fractalaudio.com/axefx2/index.php?title=MIDI_SysEx
For the Axe-FX Ultra:
https://wiki.fractalaudio.com/gen1/index.php?title=Axe-Fx_SysEx_Documentation&oldid=3738