Arduino Axe-Fx control library

I have a few question

I registered connection call back and define function to response callback already , to get connected true or false. After call begin() i don't get callback connection.
I want to check connection and display connecting info on screen. But i don't get callback to check it

How i do it . Or i mistake something.

Thank you.


And i have a few request, i want to get effect name or effect name tag when fxid is not in current preset

I have fxid , want know effect name or tag only.
 
I am still 100% stoked about the library.

I still use my FBV into arduino to play my Axe3 every day. I can make this thing act exactly how I want it to act. I'm working on incorporating my 2nd FBV into my setup.

FC12 would be neato, but this gives me absolute control. I can choose at a granular level what every button does in every context.

I have 1200 lines of code in my thingy. I think tysonlt has half that in his library to do 10x the shit. He's the man.

Nice! I know it’s been a while but have you documented your work anywhere?
 
I have a few question

I registered connection call back and define function to response callback already , to get connected true or false. After call begin() i don't get callback connection.
I want to check connection and display connecting info on screen. But i don't get callback to check it

How i do it . Or i mistake something.

Thank you.


And i have a few request, i want to get effect name or effect name tag when fxid is not in current preset

I have fxid , want know effect name or tag only.
Can you post your code? Hard to help otherwise
 
Can you post your code? Hard to help otherwise

onConnection not fire or callback
void setup()
{
Serial.begin(115200);
pinMode(SwitchInput_Int_Pin, INPUT);

Axe_Setup();
}

void Axe_Setup()
{
Serial.println("- Axe System Setup -> Begin");

//register a callback so we know when preset details are available
Axe.registerConnectionStatusCallback(onConnection);
Axe.registerPresetChangingCallback(onPresetChanging);
Axe.registerPresetChangeCallback(onPresetChange);
Axe.registerSceneNameCallback(onSceneName);
Axe.registerSystemChangeCallback(onSystemChange);
Axe.registerConnectionStatusCallback(onConnection);
Axe.registerEffectsReceivedCallback(onEffectReceived);

Axe.setMidiChannel(midi_channel);
Axe.begin(Serial2);
Axe.setStartupDelay(1000);

Axe.requestFirmwareVersion();
Axe.fetchEffects(true);
//delay(500);
Axe.requestPresetDetails();
Serial.println("- Axe System Setup -> End");
}

void onConnection(const bool Connected)
{
Serial.println("\n+++++++++++Call Connection Change +++++++++++++\n\n");
connection = Connected;
Serial.println("\n+++++++++++End Call Connection Change +++++++++++++\n\n");
}

void onSystemChange()
{
}

void onPresetChange(AxePreset preset)
{
}

void onPresetChanging(const PresetNumber number)
{
}

void onSceneName(const SceneNumber number, const char* name, const byte length)
{
}

void onEffectReceived(PresetNumber number, AxePreset preset)
{
}


void loop()
{

Axe.update();
}
 
Is that the whole file? I don't see you including headers or declaring the Axe variable, like:

C++:
#include <AxeFxControl.h>

AxeSystem Axe;

Apart from that it looks ok, except I can't see where you've declared midi_channel. If you leave that off it will revert to OMNI.

Try this example and see if that works: https://github.com/tysonlt/AxeFxControl/blob/main/examples/PresetDetails/PresetDetails.ino

If it's still not working I'd check how you've wired up Serial2.
 
Is that the whole file? I don't see you including headers or declaring the Axe variable, like:

C++:
#include <AxeFxControl.h>

AxeSystem Axe;

Apart from that it looks ok, except I can't see where you've declared midi_channel. If you leave that off it will revert to OMNI.

Try this example and see if that works: https://github.com/tysonlt/AxeFxControl/blob/main/examples/PresetDetails/PresetDetails.ino

If it's still not working I'd check how you've wired up Serial2.
Plus:

There is no reference to any buttonfunction from the loop. No input is detected or handled imho
 
it is part of code. it work, i received callback when preset change or scene name and effect detail. it work perfect.

but i dont receive call back on connection call back when i unplug or plug from fractal fm3 unit. i put while loop in setup function for checking connection , it false alltime.

i wire up Serail2 (GPIO 16, 17) on ESP32. it working i can received sysex message from fm3 unit perfectly.

i test unplug midi in out from this system an turn on this system, it not receive anything (that correct). then i plug it back it working, i can receive preset detail and scene detail. but connection callback it not work when it plug in back or unplug.


C++:
#include <AxeFxControl.h>

#define SwitchInput_Int_Pin 14

AxeSystem Axe;

static byte midi_channel = 0;
bool connection = false;

void setup()
{
      Serial.begin(115200);
      pinMode(SwitchInput_Int_Pin, INPUT);

      Axe_Setup();
}

void Axe_Setup()
{
      Serial.println("- Axe System Setup -> Begin");

     //register a callback so we know when preset details are available
    Axe.registerConnectionStatusCallback(onConnection);
    Axe.registerPresetChangingCallback(onPresetChanging);
    Axe.registerPresetChangeCallback(onPresetChange);
    Axe.registerSceneNameCallback(onSceneName);
    Axe.registerSystemChangeCallback(onSystemChange);
    Axe.registerConnectionStatusCallback(onConnection);
    Axe.registerEffectsReceivedCallback(onEffectReceived);

    //Axe.setMidiChannel(midi_channel);
    Axe.begin(Serial2);
   //Axe.setStartupDelay(1000);

   //when i comment this while loop to skip this loop it working. but when i put this loop it  not pass to next code. because connection it false not change to true
   while(1)
   {
               if(connection)
               {
                         break;
               }
    }

   Axe.requestFirmwareVersion();
   Axe.fetchEffects(true);
   //delay(500);
  Axe.requestPresetDetails();
   Serial.println("- Axe System Setup -> End");
}

void onConnection(const bool Connected)
{
      Serial.println("\n+++++++++++Call Connection Change +++++++++++++\n\n");
      connection = Connected;
      Serial.println("\n+++++++++++End Call Connection Change +++++++++++++\n\n");
}

void onSystemChange()
{
}

void onPresetChange(AxePreset preset)
{
}

void onPresetChanging(const PresetNumber number)
{
}

void onSceneName(const SceneNumber number, const char* name, const byte length)
{
}

void onEffectReceived(PresetNumber number, AxePreset preset)
{
}


void loop()
{
  
       //Input switch part
       .
       .
       .

      Axe.update();
}
 
It appears you have found a bug - that callback is not actually being called anywhere.

You don't need it for what you're trying to do. Just remove it and it will work fine, you don't have to wait for it to be connected.
 
Hi tysonlt, I was told by Axelman8 about your very nice project.

Please have a look on my wish here:
https://forum.fractalaudio.com/thre...geting-setlists-presets-targeting-too.205057/

Since I don't know whether and when FAS will ever do it (hope soon),

the idea could be to use your code to get from FM9 the bank No. I am targeting with INC/DEC buttons (with no auto preset load),
and show it on an external display,
in order to be sure "where I am" before selecting the final preset inside that bank.

Currently FM9 show targeted bank with little fonts (I added a lens to make it bigger... :tearsofjoy: ):

super lens.jpg

I already have an Arduino board connected to FM9 (inside the alluminum bar),
and I can even drive the LED display to show the BANK:

super lens 2.jpg

That Arduino can send and receive already MIDI comands to/from FM9, it also "merges" (stupid merge...) internal MIDI with external one.

Do you think it's possible ? :)
 
Last edited:
Hi tysonlt, I was told by Axelman8 about your very nice project.

Please have a look on my wish here:
https://forum.fractalaudio.com/thre...geting-setlists-presets-targeting-too.205057/

Since I don't know whether and when FAS will ever do it (hope soon),

the idea could be to use your code to get from FM9 the bank No. I am targeting with INC/DEC buttons (with no auto preset load),
and show it on an external display,
in order to be sure "where I am" before selecting the final preset inside that bank.

Currently FM9 show targeted bank with little fonts (I added a lens to make it bigger... :tearsofjoy: ):

View attachment 139736

I already have an Arduino board connected to FM9 (inside the alluminum bar),
and I can even drive the LED display to show the BANK:

View attachment 139750

That Arduino can send and receive already MIDI comands to/from FM9, it also "merges" (stupid merge...) internal MIDI with external one.

Do you think it's possible ? :)
Use the bodmer eSPI libriary in combination with a Teensy and a big screen tft (or 15 screens ;) ) and it will work perfectly with this libriary. Very little limitations what is possible to show on your screen. If you know arduino and CPP, your good to go.

Cheers 🍻
 
Last edited:
Hi tysonlt, I was told by Axelman8 about your very nice project.
Thanks!

I replied in the wish thread but I'll answer here as well:

the idea could be to use your code to get from FM9 the bank No. I am targeting with INC/DEC buttons (with no auto preset load),
and show it on an external display,
in order to be sure "where I am" before selecting the final preset inside that bank.

No you can't really get the bank no, but you can get the present number, and be told whenever it changes. From there you can just figure out the bank number with a bit of math.

That Arduino can send and receive already MIDI comands to/from FM9, it also "merges" (stupid merge...) internal MIDI with external one.
Then you're halfway there. The library in this thread will help you get the preset names, which is really the only thing missing.

Do you think it's possible ? :)
Yep, with a bit of sneaky coding. You can know the current preset number, then on your device you just ask for all preset names in that range (ie 20-29 if we're on preset 23), then bank up = ++10, load all names, etc. Then you just commit by sending a preset change command.

I believe @Axelman8 has a lot of experience getting preset names :) You probably have more experience with the library than me now, man!
 
Back
Top Bottom