Aiuto su led accesi da note midi

Sto tentando di accendere alcuni led tramite note midi provenienti da un software di video streaming (Vmix). Premetto che per far capire ad arduino che i valori ricevuti sono note, lancio prima il processing con questo codice:

//Import libraries
import processing.serial.*;
import promidi.*;

Serial myPort;
MidiIO midiIO;
//Message to be sent
int message=0;

void setup() {  
  myPort = new Serial(this, "COM11", 9600);
  midiIO = MidiIO.getInstance(this);
  //Line that prints I/O devices in console
  midiIO.printDevices();
  //Receive input from Virtual MIDI Ports
  midiIO.openInput(0,0);
}

void draw() {}
void noteOn(Note note, int deviceNum, int midiChan){
  int vel = note.getVelocity();
  int pitch = note.getPitch();
  if(vel>0){ // If velocity > 0 set message value to note's pitch
   if(pitch==60){ message=60; } else 
   if(pitch==62){ message=62; } else 
   if(pitch==64){ message=64; } else 
   if(pitch==65){ message=65; } else 
   if(pitch==67){ message=67; } else message=0;
    } else { message=0;}
  //Send message to Arduino
  myPort.write(message);
}

Lo sketch di arduino è invece il seguente:

 // Data received from the serial port
 int val; 
 //LEDs are connected to the following pins
 int pins[] = {4,5,6,7,8}; 
 
 void setup() {
   for(int i=0; i<5; i++){
   pinMode(pins[i], OUTPUT); // Set pins as OUTPUTs
   }
   Serial.begin(9600); // Start serial communication at 9600 bps
 }
 
 void loop() {
 if (Serial.available()) { // If data is available to read,
 val = Serial.read(); // read it and store it in val
 // Turn on LEDs, depending on pitches received
  if (val == 60) { digitalWrite(pins[0],HIGH); } else
  if (val == 62) { digitalWrite(pins[1],HIGH); } else
  if (val == 64) { digitalWrite(pins[2],HIGH); } else
  if (val == 65) { digitalWrite(pins[3],HIGH); } else
  if (val == 67) { digitalWrite(pins[4],HIGH); } else
  if (val==0) { resetLEDs(); }
 }
 }
 //Function that turns all the LEDs off
 void resetLEDs(){
  for(int i=0; i<5; i++){
   digitalWrite(pins[i],LOW);
  } 
 }

Se Vmix manda “nota 60 on” si accende correttamente il led sul pin 4

Se Vmix manda “nota 60 off” e “nota 62 on” si spegne correttamente il led sul pin 4 e si accende correttamente quello sul pin 5.

Il problema viene adesso:
se Vmix manda “nota 60 on” e “nota 62 off” io mi aspetterei che si accendesse il led sul pin 4 e si spegnesse quello sul pin 5 mentre invece il led sul pin 4 fa un piccolo “lampo” e rimane poi spento mentre il led sul pin 5 si spegne correttamente.

Mi potete dire dove sbaglio nel ragionamento?
Grazie in anticipo.

Non conosco processing, ma nel programma di arduino non sembra che ci siano errori di programmazione o logici.

Sembra che in intervalli di tempo brevissimi, processing gli invii il valore 60 e poi il valore 0, da qui un piccolo lampeggio del led.

Prova a stampare sulla seriale di arduino i valori ricevuti

val = Serial.read(); // read it and store it in val

Serial.write(val);// cosi sai quali valori riceve arduino, se riceve in successione 60-0 può spiegare il lampeggio

Se fosse non saprei come correggere perché dipende dal codice di processing.

Forse tra l'uno e l'altro passa un val=0 che spegne tutto?

Comunque, al posto dell'array userei dei semplici define:

define pin0 4

define pin1 5

define pin2 6

define pin3 7

Datman:
Comunque, al posto dell’array userei dei semplici define:

… non sono d’accordo, grazie all’array puoi fare operazioni ripetitive semplicemente con un for ottimizzando la scrittura codice … come. del resto, è stato fatto:

for(int i=0; i<5; i++) pinMode(pins[ i ], OUTPUT);

oppure

for(int i=0; i<5; i++) digitalWrite(pins[ i ], LOW);

che con le #define NON puoi fare.

Guglielmo

Ho monitorato quanto proveniente da vmix ed ho questo:

 002756E8   1  --     90    3C    7F    1  C  4 Note On               
 002756E8   1  --     80    3E    00    1  D  4 Note Off              
 002756E8   1  --     80    40    00    1  E  4 Note Off              
 002756E8   1  --     90    41    7F    1  F  4 Note On               


 0027C0F8   1  --     80    3C    00    1  C  4 Note Off              
 0027C0F8   1  --     90    3E    7F    1  D  4 Note On               
 0027C0F8   1  --     90    40    7F    1  E  4 Note On               
 0027C0F8   1  --     80    41    00    1  F  4 Note Off

Il problema è che quando alla fine del pacchetto d'istruzioni ho una nota on, il tutto è regolare mentre se alla fine ho una nota off si spegne tutto mentre dal codice di Arduino i led con nota on dovrebbero rimanere accesi.... o sbaglio?