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
}