Da MIDI a led

Ciao, forse ti posso aiutare in quanto in passato mi sono trovato ad affrontare un problema simile al tuo.
A differenza della trasmissione, la ricezione di dati MIDI richiede una soluzione circuitale un tantino più complessa; in rete ci sono centinaia di schemi, io realizzato questo con successo:

Per quanto riguarda il problema dell'accensione dei LED, è molto semplice:
I codici nota ricevuti, detti pitch vanno solitamente da 21 (La0) a 108 (D08), come si vede in questo link:
http://www.phys.unsw.edu.au/jw/notes.html.

Fortunatamente il protocollo MIDI è strutturato in modo tale che ogni valore di Do, qualsiasi sia la sua ottava MODULO 12 da resto 0. Per cui per ottenere il valore della nota basta calcolare pitch % 12 e il resto ottenuto (da 0 a 11) sarà la nota da Do a Si.
Per avere il numero d'ottava è, invece, sufficiente dividere per 12 e sottrarre 1.
Ad esempio se il pitch ricevuto fosse 52, allora:

52 % 12 = 4, che corrisponde a MI
int(52 / 12) - 1 = 3, ovvero Ottava 3

Riepilogando: 52 = Mi3
Semplice, no?

A questo punto puoi facilmente accendere i LED con una logica di questo tipo:

void HandleNoteOn(byte channel, byte pitch, byte velocity) { 
  byte nota = (int)pitch % 12;
  int ottava = ((int)pitch / 12) - 1;
  
  switch (nota) {
    case 0: // DO di qualsiasi ottava
      digitalWrite(LED1, ON);
      break;
    case 2: // RE di qualsiasi ottava
      digitalWrite(LED2, ON);
      break;

    case 4:  // MI
       // altri LED da accendere...
    case 5:  // FA
    case 7:  // SOL
    case 9:  // LA
    case 11: // SI
  }

Nota bene che case 1 corrisponde a DO#, case 3 corrisponde a Re#, e cosi via...
Puoi anche sfruttare il numero d'ottava per far accendere altri LED o chissà quant'altro ti venga in mente.

La libreria usata è la <MIDI.h>, che usa vantaggiosamente un handler per la ricezione dei codici di nota che sarà dichiarato nel setup:

void setup() {
  MIDI.setHandleNoteOn(HandleNoteOn);                 // Put only the name of the function
}

Mentre nel loop (che a questo punto potrebbe anche essere vuoto), si potrà inserire solo:

void loop() {
  // Call MIDI.read the fastest you can for real-time performance.
  MIDI.read();
}

Ma i dettagli della libreria li trovi facilmente ovunque :slight_smile:

Ciao