Here is my DIY Arduino based MIDI foot controller for Axe-Fx

Hello everyone,
this is my DIY midi foot controller based on Arduino Mega. It was funny and a great challenge to make it.
I am not a software engineer but I had several experiences with Arduino for my hobbies.
At the moment I use it with my old but still rocking Axe-Fx Ultra, and it totally bring new life to it. It should be easy to update it for the next generations if needed.

Hardware features:
  • 8 fully programmable buttons
  • 8 LCD displays, one for each button. Upper row is the "press and release" label, lower row is the "hold" label
  • 1 main LCD
  • 2 expression pedals inputs
  • 4 opto-isolated contacts for channel amp switching
  • stainless steel chassis

Main software features:
  • retrieve Axe-Fx patch names
  • retrieve Axe-Fx effects blocks and their status. This is the very game changing feature because every layout modification in the Axe-Fx is reflected on the pedalboard without any user intervention
  • Axe-Fx tuner on main LCD
  • each button can have multiple functions on press and hold event
  • assignable functions are: program change, control change, control change with note on/off, external switches toggle, change layout or bank
  • the press or hold function of each button can be automatically assigned to the blocks used in the active preset. You can choose what blocks to display and their priority.
  • buttons can be organized in different layouts, at the moment I am using 3 of them: one for preset change, one for effects and one for the looper.

The configuration is hard-coded for now, it is easily editable but a re-compile and re-flash is needed.
If someone is interested in going more deep I will be happy to explain.
 

Attachments

  • layout0.jpg
    layout0.jpg
    509.9 KB · Views: 198
  • layout1.jpg
    layout1.jpg
    569.4 KB · Views: 189
  • layout2.jpg
    layout2.jpg
    551.7 KB · Views: 159
  • tuner.jpg
    tuner.jpg
    605.6 KB · Views: 177
Great job man, congratulations!!! You did the chassis by yourself aswell, right?

I too built my own midi controller for the Ultra. I could give a presentation for it. I've gone so far that I brought named scenes to the Ultra and a lot more ;) Crazy shit and definitely my most fun project so far!
 
@lauke-lux Thank you, dimensions are 42x20x7cm.

@axifist Yes I made the chassis too, but with some cnc help ;). So you used sysex to modify settings on the fly and store them as scenes in the pedalboard? That is great and I guess it required a great effort! A presentation of yours would be awesome!
 
Yeah, I also switched to using a CNC machine, because doing it manually was a real pain.

Using SysEx that way was an idea, but it requires too much memory and I guess is a pain to code and configure. Because of the memory requirements the Arduino Due could be an option, I don't know. No, I stuck with storing only the bypass states in the controller (among other things of course: scene names, switch assignments and modes, expression pedal assignments etc.). What's great is, that the number of scenes is only limited by the memory. So right now I have 24 scenes per preset if I remember correctly :cool:

So you see, there's always room for improvements and a custom midi controller can give you features even the combination of AxeFX III + FCs don't provide. It's quite cheap to build one and you learn a lot! I learned programming while building this thing. Started with a blinking LED and was fascinated by it. One year later I had this hell of a machine in my hands! Arduino is such a great platform!!!
 
Yeah, I also switched to using a CNC machine, because doing it manually was a real pain.

Using SysEx that way was an idea, but it requires too much memory and I guess is a pain to code and configure. Because of the memory requirements the Arduino Due could be an option, I don't know. No, I stuck with storing only the bypass states in the controller (among other things of course: scene names, switch assignments and modes, expression pedal assignments etc.). What's great is, that the number of scenes is only limited by the memory. So right now I have 24 scenes per preset if I remember correctly :cool:

So you see, there's always room for improvements and a custom midi controller can give you features even the combination of AxeFX III + FCs don't provide. It's quite cheap to build one and you learn a lot! I learned programming while building this thing. Started with a blinking LED and was fascinated by it. One year later I had this hell of a machine in my hands! Arduino is such a great platform!!!

Congrats, starting from zero and build a midi a pedalboard is an impressive result.
I agree with you, I don't have an AxeFx III yet and I didn't want to buy a midi pedalboard that is limited in functions and doesn't make use of the features that my good old Ultra provides.
Now it's a pleasure to play and to have all synced between the Axe-fx and the pedalboard, when I'll get a III i can use this setup as backup.

Dealing with Arduino limited hardware resources can be a pain for advanced tasks. I used FreeRTOS to have some kind of multi-tasking and I make an extensive use of PROGMEM to store variables, strings and array of objects to limit RAM usage.
 
Hello. I have been wanting to make a foot controller like an RJM GT22 or a Liquid Foot Plus, with larger screens for each button. I know nothing about programming and about electronics, but willing to do the research and spend the money for parts. What I am curious about is how to build a, for lack of a better term, library of presets, which can be then organized into songs (a collection of presets) and then into set lists (a collection of songs).

My goal would be to have presets with about 100 lines of space available to enter midi commands - PC, CC, midi delays, and other complex commands for the pedal like making the preset momentary and then be able to jump to another preset that is determined by the command in the preset itself. Ideally, I like to have the capacity to store 1000 of these presets, and then use them to construct songs (each containing a dozen presets or something similar to that capability.

From what I've read on the sites of "how to build a midi controller" with an Arduino or some other similar device, the project focuses on how to make a button send a single command, like some guy will make one for an axe fx and his buttons send the CC and value for scenes.

I don't think I've seen anything available online where there is a repository of hundreds of presets, each one capable of sending 50-100 lines of commands simultaneously, which can then be assigned to a footswitch on the pedal. Can someone point me to a project where a library of this type is demonstrated, or explain how to make one myself?

Thanks
 
Hello. I have been wanting to make a foot controller like an RJM GT22 or a Liquid Foot Plus, with larger screens for each button. I know nothing about programming and about electronics, but willing to do the research and spend the money for parts. What I am curious about is how to build a, for lack of a better term, library of presets, which can be then organized into songs (a collection of presets) and then into set lists (a collection of songs).
Hey there

@axifist his program on github has song functions.. maby his program is of use for your project?

https://github.com/axifist/DIY-Midi-Controller/blob/master/songs_functions.h

Yeah, massive use of PROGMEM here aswell, like you already might have guessed ;)

I never had performance issues, it still does about 500 circles per second, so I have 2ms of latency tops, which e.g. doesn't make a dedicated looper mode necessary.

By the way, I have my code on github, if you or anyone else is interested: https://github.com/axifist/DIY-Midi-Controller

cheers
 
I built my controller so it's in charge of almost everything in order do increase the functionality of the Ultra. With the II I have one preset per song and I switch sounds via scenes within this preset. This is what I wanted to have on the Ultra aswell. I achieve this by sending all bypass states via CCs with one single push of a button. For this the bypass states have to be stored on the Arduino.
@axifist his program on github has song functions.. maby his program is of use for your project?

https://github.com/axifist/DIY-Midi-Controller/blob/master/songs_functions.h
About that header file with song functions:
In there I have collected the functions I need to setup a new song. The details are described as comments in the code.


So @rodzimguitar68, I don't exactly understand what you are trying to achieve, but I'm very sure that it's possible in theory[1], because if you can configure your controller on a source code level, almost anything is possible. However, in order to push you in the right direction I need another explanation, because I don't understand this section, sorry.
My goal would be to have presets with about 100 lines of space available to enter midi commands - PC, CC, midi delays, and other complex commands for the pedal like making the preset momentary and then be able to jump to another preset that is determined by the command in the preset itself. Ideally, I like to have the capacity to store 1000 of these presets, and then use them to construct songs (each containing a dozen presets or something similar to that capability.
What's meant by "100 lines of space" in that context? What do you mean by "making the preset momentary"? What exactly is the procedure of "jump to another preset that is determined by the command in the preset itself"? Are these 1000 presets supposed to be stored on the Arduino? What would they have to contain?

[1]
What's important to know: Not everything can be controlled with CCs. For some parameters you'll need to send SysEX commands, which is more complicated. It is possible, but requires more memory on the Arduino than simple CCs, because every single parameter has its own SysEX command.
What AxeFX do you want to use it with? It's possible to extract the SysEX commands which AxeEdit (version for the Ultra) sends. I'm sure it's also possible with AxeEdit of the II. But afaik for the III a proprietary language is being used for the communication between the III, AxeEdit and the FC6/12.
 
Hello. I have been wanting to make a foot controller like an RJM GT22 or a Liquid Foot Plus, with larger screens for each button. I know nothing about programming and about electronics, but willing to do the research and spend the money for parts. What I am curious about is how to build a, for lack of a better term, library of presets, which can be then organized into songs (a collection of presets) and then into set lists (a collection of songs).

My goal would be to have presets with about 100 lines of space available to enter midi commands - PC, CC, midi delays, and other complex commands for the pedal like making the preset momentary and then be able to jump to another preset that is determined by the command in the preset itself. Ideally, I like to have the capacity to store 1000 of these presets, and then use them to construct songs (each containing a dozen presets or something similar to that capability.

From what I've read on the sites of "how to build a midi controller" with an Arduino or some other similar device, the project focuses on how to make a button send a single command, like some guy will make one for an axe fx and his buttons send the CC and value for scenes.

I don't think I've seen anything available online where there is a repository of hundreds of presets, each one capable of sending 50-100 lines of commands simultaneously, which can then be assigned to a footswitch on the pedal. Can someone point me to a project where a library of this type is demonstrated, or explain how to make one myself?

Thanks
It depends on what language you are using to program in. I can help you if it is in Python. I haven't posted my project yet but I will do so very soon. My code uses .xml files for configuration of buttons and aux inputs etc. and uses a simple .txt file for set-lists (that I export from Bandhelper on my phone, directly to the pedal) My pedal is currently configured for MY USE, I have two buttons for 'Next Song', 'Previous Song' functions and four buttons for scene changes. That is all I need on stage, but the buttons can be configured to do any midi function.
 
Hello everyone,
this is my DIY midi foot controller based on Arduino Mega. It was funny and a great challenge to make it.
I am not a software engineer but I had several experiences with Arduino for my hobbies.
At the moment I use it with my old but still rocking Axe-Fx Ultra, and it totally bring new life to it. It should be easy to update it for the next generations if needed.

Hardware features:
  • 8 fully programmable buttons
  • 8 LCD displays, one for each button. Upper row is the "press and release" label, lower row is the "hold" label
  • 1 main LCD
  • 2 expression pedals inputs
  • 4 opto-isolated contacts for channel amp switching
  • stainless steel chassis

Main software features:
  • retrieve Axe-Fx patch names
  • retrieve Axe-Fx effects blocks and their status. This is the very game changing feature because every layout modification in the Axe-Fx is reflected on the pedalboard without any user intervention
  • Axe-Fx tuner on main LCD
  • each button can have multiple functions on press and hold event
  • assignable functions are: program change, control change, control change with note on/off, external switches toggle, change layout or bank
  • the press or hold function of each button can be automatically assigned to the blocks used in the active preset. You can choose what blocks to display and their priority.
  • buttons can be organized in different layouts, at the moment I am using 3 of them: one for preset change, one for effects and one for the looper.

The configuration is hard-coded for now, it is easily editable but a re-compile and re-flash is needed.
If someone is interested in going more deep I will be happy to explain.
Hi Michele, well done on a great job. Could you point me in the direction of some info on how to retrieve the Axe-Fx patch names etc. please?
 
Hi Michele, well done on a great job. Could you point me in the direction of some info on how to retrieve the Axe-Fx patch names etc. please?
Thank you Simon.
Basically you have to send a SysEx message to the Axe FX and then handle the response.

These are the SysEx requests:
Code:
byte sysex_get_preset_name[7] = {0xF0, MANUF_ID_1, MANUF_ID_2, MANUF_ID_3, MODEL_ID, 0x0F, 0xF7};
byte sysex_get_blocks_status[7] = {0xF0, MANUF_ID_1, MANUF_ID_2, MANUF_ID_3, MODEL_ID, 0x0E, 0xF7};

This is the Midi SysEx receive event handler:

Code:
void handleSystemExclusive(byte *array, unsigned size) //sysex received handler
{

  if (size > 6)
  {
    if (array[1] == MANUF_ID_1 && array[2] == MANUF_ID_2 && array[3] == MANUF_ID_3 && array[4] == MODEL_ID)
    {

//Your code here....

The fifth byte identifies the response so you will have something like this to store the preset name

Code:
if (array[5] == 0x0f) //preset name id
      {
        memset(axefx_presets[settings.last_preset], 0x00, LABEL_LEN); //clear current string

        for (unsigned int i = 0; (i < LABEL_LEN - 1 && i + 6 < size - 1); i++)
        {
          axefx_presets[settings.last_preset][i] = (char)array[i + 6];
        }

And then to manage the blocks status:

Code:
else if (array[5] == 0x0e && size > 6) // blocks status
      {
        //loop through the received data incrementing by 5
        for (int i = 6; i < size - 6; i += 5)
        {

Keep in mind that I'm not a professional in coding 😉
 
Thank you Simon.
Basically you have to send a SysEx message to the Axe FX and then handle the response.

These are the SysEx requests:
Code:
byte sysex_get_preset_name[7] = {0xF0, MANUF_ID_1, MANUF_ID_2, MANUF_ID_3, MODEL_ID, 0x0F, 0xF7};
byte sysex_get_blocks_status[7] = {0xF0, MANUF_ID_1, MANUF_ID_2, MANUF_ID_3, MODEL_ID, 0x0E, 0xF7};

This is the Midi SysEx receive event handler:

Code:
void handleSystemExclusive(byte *array, unsigned size) //sysex received handler
{

  if (size > 6)
  {
    if (array[1] == MANUF_ID_1 && array[2] == MANUF_ID_2 && array[3] == MANUF_ID_3 && array[4] == MODEL_ID)
    {

//Your code here....

The fifth byte identifies the response so you will have something like this to store the preset name

Code:
if (array[5] == 0x0f) //preset name id
      {
        memset(axefx_presets[settings.last_preset], 0x00, LABEL_LEN); //clear current string

        for (unsigned int i = 0; (i < LABEL_LEN - 1 && i + 6 < size - 1); i++)
        {
          axefx_presets[settings.last_preset][i] = (char)array[i + 6];
        }

And then to manage the blocks status:

Code:
else if (array[5] == 0x0e && size > 6) // blocks status
      {
        //loop through the received data incrementing by 5
        for (int i = 6; i < size - 6; i += 5)
        {

Keep in mind that I'm not a professional in coding 😉
Thank you Simon.
Basically you have to send a SysEx message to the Axe FX and then handle the response.

These are the SysEx requests:
Code:
byte sysex_get_preset_name[7] = {0xF0, MANUF_ID_1, MANUF_ID_2, MANUF_ID_3, MODEL_ID, 0x0F, 0xF7};
byte sysex_get_blocks_status[7] = {0xF0, MANUF_ID_1, MANUF_ID_2, MANUF_ID_3, MODEL_ID, 0x0E, 0xF7};

This is the Midi SysEx receive event handler:

Code:
void handleSystemExclusive(byte *array, unsigned size) //sysex received handler
{

  if (size > 6)
  {
    if (array[1] == MANUF_ID_1 && array[2] == MANUF_ID_2 && array[3] == MANUF_ID_3 && array[4] == MODEL_ID)
    {

//Your code here....

The fifth byte identifies the response so you will have something like this to store the preset name

Code:
if (array[5] == 0x0f) //preset name id
      {
        memset(axefx_presets[settings.last_preset], 0x00, LABEL_LEN); //clear current string

        for (unsigned int i = 0; (i < LABEL_LEN - 1 && i + 6 < size - 1); i++)
        {
          axefx_presets[settings.last_preset][i] = (char)array[i + 6];
        }

And then to manage the blocks status:

Code:
else if (array[5] == 0x0e && size > 6) // blocks status
      {
        //loop through the received data incrementing by 5
        for (int i = 6; i < size - 6; i += 5)
        {

Keep in mind that I'm not a professional in coding 😉
Excellent, thank you very much.
 
Dealing with Arduino limited hardware resources can be a pain for advanced tasks. I used FreeRTOS to have some kind of multi-tasking and I make an extensive use of PROGMEM to store variables, strings and array of objects to limit RAM usage.

You may want to consider the ESP32 microcontroller; it's a great deal more powerful and with more RAM, etc.:

520 KB of SRAM, 448 KB of ROM
32-bit CPU with a clock frequency up to 240 MHz
WiFi/Bluetooth enabled
34 Programmable GPIOs

You can use the Arduino IDE or the PlatformIO add-on for Visual Studio Code (I love this combo) with it, so it's just as easy to use; you can even get ESP32 modules with OLED displays integrated which can be very useful for debugging along with general info display.

Great job...fantastic project indeed.
 
Back
Top Bottom