Interprétation de commande MIDI en Rx

Bonjour,

J’ai réalisé un montage à base de UNO pour recevoir des messages MIDI (commande CC-canal-note-vélocité), transmis via un cordon ROLAND UM-ONE Mk2. La finalité n’est pas musicale mais de déclencher des relais selon besoins. Tout fonctionne à un détail près :

Je parviens à lire les valeurs en entrée Rx sur la broche 8 (d’où l’utilisation de SoftwareSerial, pour conserver l’affichage Moniteur Serie pendant les tests), cependant les valeurs reçues ne correspondent pas à celle envoyées – je ne récupère que les data de 0 à 127, considérant les autres comme parasites (250, 252, etc.).

Exemple envoi de : CC – 1 – 3 – 30 affichage : 32 – 2 – 28. CC – 16 – 3 – 30 affichage : 62 – 2 – 28 etc.

L’erreur étant constante (quel que soit le canal, la note et la vélocité), et comme je n’avais pas le temps d’approfondir, j’ai adapté mon code en conséquence. Mais je pense être passé à côté de quelque chose. J’ai essayé d’utiliser MIDI.h, pour laquelle je ne trouve rien que je puisse adapter, à fortiori en implémentant SoftwareSerial. Mon manque d’expérience en programmation en est probablement la cause.

La question est donc : par quelle méthode obtenir les bonnes valeurs ?

D’avance merci pour vos suggestions.

#include <SoftwareSerial.h>              // gestion du second port série
SoftwareSerial ROLAND(8, 255);           // définition de port Secondaire (Rx, Tx) <- cordon ROLAND UM-ONE Mk2 (Tx inutilisé mis à 255)
byte CanalByte;
byte NoteByte;
byte VelocityByte;
void setup() {                         
  Serial.begin(9600);                   
  ROLAND.begin(31250);
}
void loop() { 
 do{
    if (ROLAND.available()){
      CanalByte = ROLAND.read(); //read first byte
      if (CanalByte < 128) { // MIDI 0-127 au-delà valeurs parasites
        Serial.print("Canal ");
        Serial.print(CanalByte);
        Serial.print(" ");        
      }
      NoteByte = ROLAND.read(); //read next byte
      if (NoteByte < 128) {
        Serial.print("Note ");
        Serial.print(NoteByte);
        Serial.print(" "); 
      }
      VelocityByte = ROLAND.read(); //read final byte
      if (VelocityByte < 128) {
        Serial.print("Vélocité ");       
        Serial.println(VelocityByte);            
      }
    }
  }
  while (ROLAND.available() > 2); //when at least three bytes available
}  

Le problème vient sans doute du fait que vous utilisez SoftwareSerial pour lire du MIDI à 31 250 baud. SoftwareSerial n’est pas fiable à cette vitesse, surtout sur Arduino Uno.

Si vous essayez avec Serial et trouvez un autre moyen d'afficher ce qui est reçu, ça permettrait de confirmer cette hypothèse