DIY MIDI Amp knobs.

Clockwork Creep

Power User
Hi.
Brainstorming. Let's say that I wanted to make a DIY MIDI controller that controls amp knobs on the Axe FX.
Like, the RAC12, just simpler...

How do I know what the MIDI singals are to control those knobs?
 
Hi.

I am already DIY’ing a knob controller for the Axe-FX with Arduino Mega and rotary encoders. One difference with the RAC12 is that mine has one individual display for each knob to show all the values on real time (OLED displays and I2C multiplexers are so cheap on ebay!)

I am using a recycled 2016 calendar for this project (it is an ecologic controller):cool:

I was waiting to have the project finalized before opening a dedicated thread with the detailed instructions but I have abandoned it to make other things (like a MIDI Bass Pedal).

So far I am able to send the real-time controls to the Axe-FX and reflect the value of each knob on the display. Pending to debug the part of the program to read the existing parameter values on the Axe-FX when selecting a new preset.

I do not have the program at hand now. I will post the current version and more details tomorrow.

Axe_Analog_01.jpg


Axe_Analog_02.jpg


Axe_Analog_03.jpg
 
Last edited:
That's a cool DIY project, but I think OP's question was how do you read the MIDI signals and know what MIDI messages are for what knobs? Is there a particular software and/or device you use with the Axe FX? I'd like to know this myself.

EDIT: Nevermind. I misunderstood that the program would read the MIDI info.
 
Last edited:
That's a cool DIY project, but I think OP's question was how do you read the MIDI signals and know what MIDI messages are for what knobs? Is there a particular software and/or device you use with the Axe FX? I'd like to know this myself.
I think you don't understand the answer :)

The program he mentions the he will post would include the code for reading and interpreting the midi.
 
Currently I have an Arduino board, a bunch of test 16x2 lcd displays, an I2C multiplexer and a bunch of RGB LED's sitting in a box waiting for me to start working on a midi control pedalboard. I'm gonna use a Raspberry Pi to control it, the Arduino is just to control the LED's (since they have some stringent timing requirements that the Pi can't guarantee as it's multitasking).

The idea is to have something like 12 footswitches, each with an LCD display and an LED near it. Each button can map to any function, and the action from any button could cause any number of buttons to re-map. For instance, say you have a button allocated (at the moment) to define the key for harmonizing - then all of the twelve button would remap to select a key (hence 12 buttons!), then go back to what they were (or something else) when the key is selected.

Anyways, got a day job programming, so it's a bit of a chore to push myself to do more of it at the end of work. The wife also has me writing software for our flower shop. She'd get annoyed if she caught me "playing" with my at home programming time. Sigh.
 
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
 
Last edited:
Great information - thanks for sharing Piing. I've been working on a footswitch with different modes to use with my Axe-FX and also control my Sonar DAW. I was struggling a bit with the sysex messages to and from the Axe-FX (particularly the checksum) so this is great information. I'm going to take a good look at your program.
 
Piing, What displays and rotary encoders or pots did you use for this project? I'm really interested in building something very similar.
Bill
 
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

I have all Axe Fx II and AX8 parameters mapped out for use with AxeLive i'll add them to the wiki so they are documented
 
Piing, What displays and rotary encoders or pots did you use for this project? I'm really interested in building something very similar.
Bill

Rotary Encoders:
http://www.ebay.com/itm/10Pcs-Modul...551997?hash=item1ec665627d:g:gKEAAOSwnbZYHVYl

0.96" I2C IIC SPI Serial 128X64 White OLED LCD LED (I choose Yellow and Blue, so I can have the title highlited in yellow)
http://www.ebay.com/itm/SSD1306-0-9...494357&hash=item3d2b3cb98b:g:6~EAAOSwXeJYKVu2

8-Channel-I2C-TCA9548A-Multiplexer (can handle up to 8 displays. I've used two)
http://www.ebay.com/itm/8-Channel-I...213984?hash=item43fea7baa0:g:aHgAAOSwx6pYrPzf

note: I have chosen those ebay links at random. There may be cheaper vendors.
 
Great information - thanks for sharing Piing. I've been working on a footswitch with different modes to use with my Axe-FX and also control my Sonar DAW. I was struggling a bit with the sysex messages to and from the Axe-FX (particularly the checksum) so this is great information. I'm going to take a good look at your program.
Great information - thanks for sharing Piing. I've been working on a footswitch with different modes to use with my Axe-FX and also control my Sonar DAW. I was struggling a bit with the sysex messages to and from the Axe-FX (particularly the checksum) so this is great information. I'm going to take a good look at your program.

Once you get your project working, it would be awesome if you shared your work. I use SONAR Platinum for my DAW and am definitely interested to see how you're controlling it with MIDI.
 
Once you get your project working, it would be awesome if you shared your work. I use SONAR Platinum for my DAW and am definitely interested to see how you're controlling it with MIDI.

Actually I'm using "keystrokes" rather than "MIDI" at the moment. I've been using an Arduino Leonardo that can send keystrokes to your PC via USB. Sonar has such an extensive list of key bindings that I simply defined the commands I wanted to a series of keystrokes like Ctrl+Alt+0, Ctrl+Alt+1 etc.

When it's in Axe-Edit mode I use AutoHotkey with some of the commands to turn keystrokes into cursor clicks on the screen to select different knobs and buttons on the Axe-Edit window (because they don;t all have keyboard shortcuts).

Because the Aruino didn't have enough I/O ports I used an MCP23017 expansion to give more than enough for this project. I think I might try to switch the 10 LCDs over to I2C to save some I/O ports.

I did set it up with Midi but I found it easier to just use the USB option.

The footswitch has different modes for Sonar, Axe-Edit etc. and you can hold button 1 down to change modes. Also any switch can be programmed for any command. I've used a FRAM memory to remember all the settings on power down.

Here's some photos of two of the modes and also the guts.
_MG_3775.jpg _MG_3776.jpg _MG_3779.jpg _MG_3775.jpg _MG_3776.jpg _MG_3779.jpg
 
Great projects, dudes :)
Question though: you've been using these arduino boards. Is it possible to just build something simpler and just analog that would work?
 
Back
Top Bottom