Modo normal y modo cambio de canal en Controlador MIDI

Hola un buen día a todos.

Podrían ayudarme con el siguiente código para definir las instrucciones requeridas para poder completar un pequeño proyecto que estoy realizando.

Estoy trabajando en un proyecto para crear un controlador MIDI (Utilizando arduino MEGA), ya lo tengo avanzado pero hice una pequeña pausa para poder desarrollar a través de un prototipo, un pequeño código para poder lograr hacer algo que quiero para este controlador, y es poder utilizar la función de LongPress o mantener un botón presionado durante un segundo para cambiar a un modo de "Cambio de Canal MIDI" que me permita cambiar el canal del controlador MIDI a través de otros botones (Ver imagen Adjunta).

Hay 3 botones para enviar notas MIDI ("modo normal"), me gustaría poder usar el botón 1 y mantenerlo presionado (pulsación larga de 1seg), para poder acceder a un "modo para el cambio de canal MIDI", ya estando en este modo, poder usar dos de los botones (Botón 1 y 2), uno para aumentar y otro para disminuir el canal MIDI, y que luego de elegir el canal MIDI deseado, presionar el botón 3 para salir del "modo de cambio de canal" y regresar al "modo normal" para enviar notas MIDI.

Esta es la base de mi código:

#include <MIDI.h>

MIDI_CREATE_DEFAULT_INSTANCE();

const int NButtons = 3;
const int Button_Pins[NButtons] = {2, 3, 4};

int buttonCState[NButtons]= {};
int buttonPState[NButtons]= {};

unsigned long lastDebounceTime[NButtons]= {0};
unsigned long debounceDelay = 5;

byte midiCh = 1;
byte note = 1;
byte cc = 1;


void setup () {
  
  MIDI.begin();
  Serial.begin(115200);
  for (int i = 0; i < NButtons; i++) pinMode (Button_Pins[i], INPUT_PULLUP);
}

void loop() {

  buttons ();

}

void buttons() {

  for (int i=0; i<NButtons; i++) {

    buttonCState[i] = digitalRead(Button_Pins[i]);

if ((millis() - lastDebounceTime[i]) > debounceDelay) {

      if (buttonCState[i] != buttonPState[i]) {

        lastDebounceTime[i] = millis();

        if (buttonCState[i] == LOW) {

          if (i == 0) {
            MIDI.sendNoteOn(note+i, 127, midiCh);
          }

          else if (i == 1) {
            MIDI.sendNoteOn(note+i, 127, midiCh);

          }

          else if (i == 2) {
            MIDI.sendNoteOn(note+i, 127, midiCh);
          }
        }

        else {

          if (i == 0) {
            MIDI.sendNoteOn(note+i, 0, midiCh);
          }

          else if (i == 1) {
            MIDI.sendNoteOn(note+i, 0, midiCh);

          }

          else if (i == 2) {
            MIDI.sendNoteOn(note+i, 0, midiCh);

          }
         }
        }
        buttonPState[i] = buttonCState[i];
       }
      }
     }

Muchas gracias a todos por la ayuda que me puedan brindar para poder finalizar con este proyecto.

Pegale una mirada a la librería AceButton que creo que te puede ser de mucha utilidad.

Como alternativa hay muchos ejemplos en la red de códigos para detectar pulsaciones largas de botones.

Saludos

Moderador:
Hola, bienvenido al foro Arduino.
En la sección proyectos tienes estos dos hilos que debiste haber leído antes de postear

Como tu consulta es para otra sección lo muevo a Software.

Normas del foro