Problema a far interagire Loop midi con Hairless midi

Salve mi chiamo Jacopo e sono nuovo di questo mondo.Ho scelto di creare un lauchpad midi funzionante con fl studio. (non sono ne musicista ne esperto di arduino ma solo molto interessato ad entrambi). Ho usato un arduino nano della elegoo, costruito il circuito e collegato i bottoni ai pin tramite il concetto di matrix seguendo questa guida:
Keyboard Matrix Help .
Il mio problema risulta essere che, una volta caricato il progetto su arduino, creo una midi port tramite "loop midi" e quando provo a farla interagire con la porta seriale COM 4 non succede nulla anzi mi esce questo messaggio: FTDI drivers don't semm to be installed. Not attempting any FTDI latency tricks.
e quando premo qualsiasi tasto invece mi esce questo: Error: got unexpected data byte 0x0.
Vi ringrazio.
Mi scuso in anticipo se non ho rispettato alcune delle regole, grazie mille.

Questo invece è il codice:

iaiu.ino (10.1 KB)

Buongiorno e benvenuto, :slight_smile:
essendo il tuo primo post, nel rispetto del regolamento della sezione Italiana del forum (… punto 13, primo capoverso), ti chiedo cortesemente di presentarti IN QUESTO THREAD (spiegando bene quali conoscenze hai di elettronica e di programmazione ... possibilmente evitando di scrivere solo una riga di saluto) e di leggere con molta attenzione tutto il su citato REGOLAMENTO ... Grazie. :slight_smile:

Guglielmo

P.S.: Ti ricordo che, purtroppo, fino a quando non sarà fatta la presentazione nell’apposito thread, nessuno ti potrà rispondere, quindi ti consiglio di farla al più presto. :wink:

Il messaggio FTDI drivers è un warning, puoi anche per ora ignorarlo.

Per quanto riguarda l'errore, se usi la seriale di Arduino per comunicare, devi evitare di mandare byte che non siano messaggi MIDI, ad esempio elimina subito questa cosa:

Serial.println("Ciammaruga");

Poi qui tu imposti come velocità seriale 9600:

Serial.begin(9600);

Il MIDI è a 31250 baud, e ti consiglierei di usare sempre questo valore, ma in ogni caso devi impostare su Hairless la stessa velocità che imposti sulla seriale di Arduino: sicuro di averlo fatto?

Per finire, qualche consiglio "stilistico" sul codice.
Tu hai una lunga switch() con blocchi quasi identici, tipo questo:

        leds[0] = CRGB::Red;
        FastLED.show();
        delay(lighttime);
        leds[0] = CRGB::Black;
        FastLED.show();
        Serial.write(B10010000);
        Serial.write(1);
        Serial.write(100);
        break;

Intanto io l'evento MIDI lo manderei subito, e non dopo il tempo di spegnimento/accensione del LED (cos'è più importante che sia "a tempo", l'evento MIDI o la luce del LED?). Poi perché imposti in binario il noteOn (che è semplicemente 0x90)? E comunque magari meglio definirlo come simbolo, insieme anche alla velocity così se ti serve puoi modificare il parametro senza problemi.
Ossia i blocchi "case" diventano:

...
#define NOTEON 0x90
#define VELOCITY 100
...
        leds[0] = CRGB::Red;
        FastLED.show();
        Serial.write(NOTEON);
        Serial.write(1);
        Serial.write(VELOCITY);
        delay(lighttime);
        leds[0] = CRGB::Black;
        FastLED.show();
        break;

Poi i codici dei "case" sono tutti praticamente identici, nella mappatura tasto-LED immagino che tu abbia seguito un percorso a zig-zag, e per fare tutto questo ti basterebbe definire un array di 36 byte, col codice del led per ognuno dei tasti:

byte keyLed[] = { 0,1,2,3,4,5, 11,10,9,8,7,6, 12,13,14,15,16,17,
 23,22,21,20,19,18, 24,25,26,27,28,29, 35,34,33,32,31,30 };

e quindi calcolare l'indice "n" del tasto dal carattere corrispondente (da '0' a '9' è il carattere meno il codice di '0' ossia 48, per quelli da 'A' in avanti, ossia da 10 in poi, va semplicemente sottratto il cvalore di 'A' e sommato 10.

A quel punto il tuo loop() al posto dell'interminabile sequenza di switch case, diventerebbe semplicemente:

void loop() {
  char customKey = customKeypad.getKey();
  if (customKey) {
    byte n = customKey-'0';
    if ( customKey >= 'A' )
      n = customKey-'A'+10: // 'A' deve valere 10
    leds[keyLed[n]] = CRGB::Red;
    FastLED.show();
    Serial.write(NOTEON);
    Serial.write(n+1);  // Nota
    Serial.write(VELOCITY);
    delay(lighttime);
    leds[keyLed[n]] = CRGB::Black;
    FastLED.show();
}

PS: ma fai solo noteON? Niente noteOFF?