Da MIDI a led

Salve a tutti continuano i miei esperimenti col midi, vorrei fare in modo che premendo un do sul computer dopo aver impostato l' uscita midi corretta si accenda il primo led con il re il secondo e così via sino al si.
Penso sia possibile ma come?
Ho già trasmesso dati MIDI ma non ho mai provato a riceverne. Chi mi aiuta?

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

scusate se non mi sono fatto sentire ma ho avuto problemi con internet.
se io volessi riceverli da seriale usando ad esempio midi yoke con serial to midi?