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 ![]()
Ciao