Interrupteur contrôleur midi Arduino

Bonjour !

Je réalise un contrôleur midi dans le but de l'utiliser avec le logiciel Ableton Live 9.
Au niveau du montage :

(Ce schéma est magnifique)

J'ai trouvé/modifié un code qui fonctionne parfaitement pour les 7 boutons :

#include <MIDI.h>

MIDI_CREATE_DEFAULT_INSTANCE();

int mem[] = { 0, 0, 0, 0, 0, 0, 0 };

void setup()
{
  MIDI.begin(MIDI_CHANNEL_OMNI);

  pinMode(2, INPUT_PULLUP);
  pinMode(3, INPUT_PULLUP);
  pinMode(4, INPUT_PULLUP);
  pinMode(5, INPUT_PULLUP);
  pinMode(6, INPUT_PULLUP);
  pinMode(7, INPUT_PULLUP);
  pinMode(8, INPUT_PULLUP);
}

void loop() {
  int sensorVal[] = {
    !digitalRead(2), !digitalRead(3),
    !digitalRead(4), !digitalRead(5),
    !digitalRead(6), !digitalRead(7), !digitalRead(8)
  };

  for (int j = 0; j < 7; j++) {
    if (sensorVal [j] != mem [j]) {
      mem [j] = sensorVal [j];

      if (mem[j]) {
        MIDI.sendNoteOn(j + 48, 64, 1);
      } else {
        MIDI.sendNoteOff(j + 48, 64, 1);        
      }
    }
  }
}

Cependant j'essaye de faire fonctionner l'interrupteur de façon à pouvoir utiliser les boutons de 2 façons différentes (Selon la position de l'interrupteur) pour avoir 14 possibilités de mappage midi mais ça ne fonctionne pas du tout :

#include <MIDI.h>

MIDI_CREATE_DEFAULT_INSTANCE();

int mem[] = { 0, 0, 0, 0, 0, 0, 0 };


int interA;
int interB;

void setup()
{
  
  MIDI.begin(MIDI_CHANNEL_OMNI);

  pinMode(2, INPUT_PULLUP);
  pinMode(3, INPUT_PULLUP);
  pinMode(4, INPUT_PULLUP);
  pinMode(5, INPUT_PULLUP);
  pinMode(6, INPUT_PULLUP);
  pinMode(7, INPUT_PULLUP);
  pinMode(8, INPUT_PULLUP);

  pinMode(9, INPUT_PULLUP);
  pinMode(10, INPUT);
  
  interA = HIGH;
  interB = LOW;

}

void loop() {
  int sensorVal[] = {
    !digitalRead(2), !digitalRead(3),
    !digitalRead(4), !digitalRead(5),
    !digitalRead(6), !digitalRead(7), 
    !digitalRead(8), 
  };

interA = { !digitalRead(9) } ; 
interB = { !digitalRead(10) };    

    
if (interA = LOW)
{
  for (int j = 0; j < 7; j++) {
    if (sensorVal [j] != mem [j]) {
      mem [j] = sensorVal [j];

      if (mem[j]) {
        MIDI.sendNoteOn(j + 48, 64, 1);
      } else {
        MIDI.sendNoteOff(j + 48, 64, 1);        
      }
    }
  }
}

if (interB = LOW)
{ 
  for (int j = 0; j < 7; j++) {
    if (sensorVal [j] != mem [j]) {
      mem [j] = sensorVal [j];

      if (mem[j]) {
        MIDI.sendNoteOn(j + 80, 64, 1);
      } else {
        MIDI.sendNoteOff(j + 80, 64, 1);        
      }
    }
  }
}  
}

Est-ce que vous avez une idée de comment le faire fonctionner ?
Merci d'avance pour votre aide !

Bonsoir

Quel est cet interrupteur qui est sur 2 pins + Gnd ?

Est-ce bien comme cela qu'il faut le câbler, le déclarer et l'utiliser?

Faites un petit programme séparé qui lit juste la position de l'interrupteur et l'affiche - une fois que ça fonctionne vous pourrez l'intégrer dans le reste du code

Sinon on n'écrit pas

  • pour une variable simpleinterA = { !digitalRead(9) } ;maisinterA = !digitalRead(9) ; car vous ne déclarez pas un tableau en l'initialisant pour interA

  • pour un test if (interA = LOW) qui fait une affectation de la valeur LOW dans la variable interA maisif (interA == LOW) qui est l'opérateur de comparaison d'égalité

Il y aurait d'autres commentaires mais commencez par le début - faites fonctionner votre interrupteur - si nécessaire lisez ce tuto

C'est une erreur de ma part en modifiant un schéma existant, cet interrupteur sur 2 pins + Gnd n'existe pas en réalité.
Je note les erreurs d'écriture, merci !
En suivant ton lien j'ai réalisé un interrupteur fonctionnant correctement que j'ai ensuite intégré à mon code existant.
Maintenant lorsque j'appuie sur un bouton j'ai ce résultat dans le moniteur "⸮@@MODE B⸮@@" et si je change la position de l'interrupteur en appuyant sur le même bouton "⸮6@MODE A⸮6@".
Ce qui semble m'indiquer que l'interrupteur permet à un bouton d'avoir 2 valeurs MIDI selon la position de l'interrupteur.
Malheureusement lorsque je réalise un test sur Ableton Live, la valeur MIDI est la même pour les 7 boutons et même chose en changeant la position de l'interrupteur...
J'imagine donc qu'il doit y avoir des erreurs de syntaxes.
Je précise que j'utilise Hiduino pour transformer l'Arduino en contrôleur midi
Voici le nouveau code :

#include <MIDI.h>

MIDI_CREATE_DEFAULT_INSTANCE();

int mem[] = { 0, 0, 0, 0, 0, 0, 0 };

//l'interrupteur est connecté à la broche 9 de la carte Adruino
const int bouton = 9;
 
//variable qui enregistre l'état du bouton
int etatBouton;

void setup()
{
  MIDI.begin(MIDI_CHANNEL_OMNI);

  pinMode(2, INPUT_PULLUP);
  pinMode(3, INPUT_PULLUP);
  pinMode(4, INPUT_PULLUP);
  pinMode(5, INPUT_PULLUP);
  pinMode(6, INPUT_PULLUP);
  pinMode(7, INPUT_PULLUP);
  pinMode(8, INPUT_PULLUP);

  Serial.begin(9600);
  
  pinMode(bouton, INPUT_PULLUP); //le bouton est une entrée
  etatBouton = HIGH; //on initialise l'état du bouton comme "relaché"
}

void loop() {
  int sensorVal[] = {
    !digitalRead(2), !digitalRead(3),
    !digitalRead(4), !digitalRead(5),
    !digitalRead(6), !digitalRead(7), !digitalRead(8)
  };


    etatBouton = digitalRead(bouton); //Rappel : interrupteur = 9
    
    if(etatBouton == HIGH) 
    {
       for (int j = 0; j < 7; j++) {
         if (sensorVal [j] != mem [j]) {
            mem [j] = sensorVal [j];

         if (mem[j]) {
          MIDI.sendNoteOn(j + 48, 64, 1);
          Serial.print("MODE A");
      } else {
          MIDI.sendNoteOff(j + 48, 64, 1);        
      }
    }
  }
    }
    
    else 
    {
      for (int j = 0; j < 7; j++) {
        if (sensorVal [j] != mem [j]) {
          mem [j] = sensorVal [j];

        if (mem[j]) {
          MIDI.sendNoteOn(j + 58, 64, 1);
          Serial.print("MODE B");
      } else {
          MIDI.sendNoteOff(j + 58, 64, 1);        
      }
    }
  }
    }

}

Que doit il se passer d'un point de vue événements midi si

  • j'appuie la touche pin 2
  • je bascule l'interrupteur pin 9
  • puis relâche la touche pin 2 ?

Il vous faudra sans doute détecter les bascules de la pin9 et décider d'envoyer des ordres de NoteOff pour chaque touche qui était appuyée en+48, puis renvoyer des noteOn sur ces mêmes touches en +58 et inversement au basculement de l'interrupteur dans l'autre sens (attention aux rebonds)

Comment votre arduino parle au système midi? Si par USB/port série virez le serial.begin et les print qui viennent perturber le fonctionnement

Votre code n'est pas indenté correctement c'est illisible - appuyez ctrl-T dans l'IDE arduino pour mettre le code en forme

Bonjour !
J'ai ce résultat :
"⸮0@MODE A⸮:@"
Ce qui se traduit donc par la note du pin 2 qui s'active en Mode A et la note du pin 2 en mode B qui s'arrête.
Vous avez donc raison, il faudrait effectivement détecter les bascules mais c'est pas un soucis concrètement puisque j'ai aucune raison de faire ce genre d'action.
Je m'y pencherai plus tard je pense, je verrai aussi pour faire fonctionner un potentiomètre.
L'arduino communique au système midi par USB et en supprimant le serial.begin et les print, tout fonctionne parfaitement !
Merci encore pour votre aide :slight_smile: