Tastiera MIDI con Arduino

Salve a tutti, ho trasformato una pianola Bontempi in una tastiera MIDI con l'uso di un Arduino UNO R3.
Ho solo un problema: non riesco a mandare la nota attraverso il connettore MIDI, la scheda audio proprio non riceve il messaggio. Così ho provato a mandarlo tramite USB e con dei software come Hairless e LoopBee ho tentato di far arrivare l'input ad FL Studio; il risultato che ho ottenuto è stato semplicemente un input sulla DAW (come se stessi premendo un pulsante), ma non riconosce la nota.
Di seguito vi allego lo sketch.
Stavo pensando di provare ad usare la libreria MIDI, ma non so se funziona con Arduino UNO R3.
Per i collegamenti sulla scheda guardate questo video (ho praticamente seguito questo tutorial): - YouTube
Grazie in anticipo per le risposte.

MIDI_Keyboard.ino (2.55 KB)

Buongiorno e benvenuto sul forum,
essendo il tuo primo post, nel rispetto del regolamento, ti chiedo cortesemente di presentarti QUI (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 il su citato REGOLAMENTO ... Grazie.

Guglielmo

P.S.: Qui una serie di link utili, NON necessariamente inerenti alla tua domanda:
- serie di schede by xxxPighi per i collegamenti elettronici vari: ABC - Arduino Basic Connections
- pinout delle varie schede by xxxPighi: Pinout
- link generali utili: Link Utili

Scusa, ma nello sketch vedo che gli eventi NoteOn 0x90 e NoteOff 0x80 li stai mandando sul canale 1 (i 4 bit a zero nel byte): non hai sul PC un qualche software che ti faccia da monitor MIDI ossia dei messaggi MIDI ricevuti, per capire se effettivamente l'interfaccia riceve quelle note e sono sul canale giusto?
PS: prima di rispondere, scrivi la tua presentazione come richiesto da Guglielmo!!!

Ciao,
io sono fan accanito di Evan Kale, youtuber poco conosciuto ma che vanta di avere un suo video sulla home page del sito di Arduino. Se la tua idea non viene dal suo video ti consiglio di guardarlo e di seguirlo passo passo.
Fammi sapere :slight_smile:
edit, non avevo visto il link da te postato ma ecco qui i suoi sketch GitHub - evankale/ArduinoMidiPiano: Arduino code for homemade MIDI Keyboard
spero di non aver infranto regole...

docdoc:
Scusa, ma nello sketch vedo che gli eventi NoteOn 0x90 e NoteOff 0x80 li stai mandando sul canale 1 (i 4 bit a zero nel byte): non hai sul PC un qualche software che ti faccia da monitor MIDI ossia dei messaggi MIDI ricevuti, per capire se effettivamente l'interfaccia riceve quelle note e sono sul canale giusto?
PS: prima di rispondere, scrivi la tua presentazione come richiesto da Guglielmo!!!

Scusate per non essermi presentato, lo ho appena fatto come da voi suggerito :slight_smile:
Ad ogni modo sul pc non arriva niente che faccia capire che nota sto premendo, ho provato con midiox quando lo ho collegato tramite usb con loopbee, ma comunque quando lo ho collegato col midi alla scheda audio il relativo non lampeggiava (come invece accade quando collego la mia tastiera yamaha).

La cosa che proverei a fare io (a parte verificare che il cablaggio di RX e TX del connettore MIDI sia giusto, ossia RX Arduino -> TX PC, TX Arduino -> RX PC), è provare ad usare SoftwareSerial per allocare altri 2 pin per l'I/O MIDI (i pin 0 ed 1 li usi per il MIDI quindi non puoi usarli per il terminale seriale), ed usare quindi l'UART integrato per ricevere informazioni di debug dallo sketch Arduino per poter capire se riceve qualcosa, e cosa, e se manda qualcosa, e cosa (ovviamente aggiungerai un po' di Serial.print() in giro).

Allora un attimo, cos'è un UART?
Io non ho collegato sia RX che TX, il connettore midi ha un pin per i dati e gli altri due sono di alimentazione.
Un mio amico mi ha suggerito di cambiare il firmware con HIDUINO, a cosa potrebbe giovarmi?

Apocalypse480:
Allora un attimo, cos'è un UART?

UART è il circuito che gestisce una seriale (Universal Asynchronous Receiver/Transmitter).Arduino Uno ha una UART sui pin 0 e 1.

Io non ho collegato sia RX che TX, il connettore midi ha un pin per i dati e gli altri due sono di alimentazione.

Si, scusa, ti ho fatto confondere io: ogni connettore ne ha uno solo di pin dati, io parlavo genericamente, la porta MIDI OUT ha il TX in quanto trasmette, e MIDI IN un RX che riceve. Praticamente l'interfaccia MIDI è una banale seriale, ma on RX e TX separati su connettori diversi.
Tu hai realizzato un MIDI OUT che ha solo il pin TX.

Quindi, per tornare al problema, confermi che il MIDI OUT di Arduino lo hai mandato sul MIDI IN dell'input MIDI del PC?
La cosa che ancora non mi è chiara, è cosa tu abbia usato nel PC per l'input MIDI, prova a spiegare meglio.
Parli di "scheda audio", io ho una certa età e una volta le schede audio avevano la possibilità di interfaccia MIDI sulla "porta giochi" (quella del joystick), con un opportuno cavo che da un lato ha il connettore sub-D della porta giochi e si sdoppia nei due cavi con connettori DIN del MIDI. Ma a parte il fatto che non ricordo di aver più visto schede audio recenti con la porta joystick, mi sembra che questa interfaccia non sia più supportata in Windows (credo già dal 7) per cui forse è questo il motivo per cui non ricevi nulla.
Invece io personalmente uso una interfaccia USB-MIDI, molto comoda, economica, e semplice: un cavo che ha da un lato il connettore USB e poi i due cavi MIDI/DIN. Queste interfacce hanno quasi sempre anche dei LED che indicano l'attività, e già con questi puoi capire se passa "qualcosa".
Intendo cavi come questo.
Quindi una volta inserito il cavo USB ti installa i driver e da quel momento Windows vede una interfaccia MIDI standard, IN e OUT, senza che tu debba fare cose strane.
Una volta sistemata la questione connessione, apri un qualsiasi software che gestisce MIDI (Cubase, Cakewalk, quello che hai) o un VST host (Chainer, Forte...) e qualche strumento VST, e dovrebbe andare.
Se non va, prova ad usare un qualche monitor MIDI per vedere la comunicazione (come questo o questo).

Fai queste prove e facci sapere!

Un mio amico mi ha suggerito di cambiare il firmware con HIDUINO, a cosa potrebbe giovarmi?

E che ne so, chiedilo a lui! :smiley:

Allora, la scheda audio che uso è USB, quindi in sostanza vado a collegare col cavo midi solo arduino alla scheda e poi la scheda è collegata via USB. Proprio il LED di cui parlavi tu non si accende quando mando un dato (come invece fa con la tastiera yamaha).
Per quanto riguarda il software, ho usato principalmente 3 software quando ho provato a comunicare via USB: Hairless (converte l'input seriale in MIDI), LoopBee (crea una interfaccia MIDI virtuale), MIDI-OX (legge gli input MIDI, in questo caso segnalava un input generico e non la nota).
Per il firmware HIDUINO mi sono informato e consisterebbe nel riprogrammare l'ATMEGA8U2 per far riconoscere al pc un'interfaccia MIDI, cos' facendo potrei comunicare col MIDI dalla USB senza ulteriori software che fungono da interprete.

Si ma continuo a non capire perché dovresti usare qualcosa che converte un input seriale in MIDI se la tua scheda audio ha già un ingresso MIDI, o una interfaccia MIDI virtuale... Di quale scheda audio USB parliamo? E come hai collegato ESATTAMENTE l'uscita di Arduino?

Ripeto, con un cavo USB MIDI come quello che ti ho indicato, la cosa potrebbe funzionare senza nessun problema o altro software anche senza firmware Hiduino o altro. A patto che sia chiaro che il tuo Arduino funzioni e che stia mandando i dati corretti (e per fare questo dovresti provare, come ti ho consigliato, di NON usare la seriale hardware di Arduino, quindi pin 0 e 1, ma tramite SoftwareSerial mandare i comandi usando altri pin e sfruttare la USB collegata al computer per poter fare debugging ossia monitorare cosa rileva e cosa manda!!).

docdoc:
Si ma continuo a non capire perché dovresti usare qualcosa che converte un input seriale in MIDI se la tua scheda audio ha già un ingresso MIDI, o una interfaccia MIDI virtuale... Di quale scheda audio USB parliamo? E come hai collegato ESATTAMENTE l'uscita di Arduino?

Ripeto, con un cavo USB MIDI come quello che ti ho indicato, la cosa potrebbe funzionare senza nessun problema o altro software anche senza firmware Hiduino o altro. A patto che sia chiaro che il tuo Arduino funzioni e che stia mandando i dati corretti (e per fare questo dovresti provare, come ti ho consigliato, di NON usare la seriale hardware di Arduino, quindi pin 0 e 1, ma tramite SoftwareSerial mandare i comandi usando altri pin e sfruttare la USB collegata al computer per poter fare debugging ossia monitorare cosa rileva e cosa manda!!).

Quando ho usato i software stavo usando solo la USB di Arduino e quindi era necessari collegare il tutto virtualmente ad una interfaccia MIDI fittizia. Quando invece ho usato la scheda audio (una Focusrite Scarlett 2i4) non ho usato alcun software poichè è un'interfaccia fisica. Il problema è che quando uso la scheda audio non si accende alcun MIDI e ancora adesso che ho apportato delle modifiche al codice utilizzando la MIDI.h piuttosto che le Serial.write non si accende quel fatidico LED sulla scheda audio.

Ma passiamo ai tentativi effetuati con la sola usb di arduino (niente scheda audio):
sul monitor seriale vedo simboli strani con la Serial.write, che cambiano in base al baud rate a cui setto il monitor.
Ora che ho escluso le Serial.write per mandare le note e ho usato MIDI.sendNoteOn e Off ottengo comunque dei risultati sul monitor seriale, sempre lettere.
Ed è proprio questa la cosa che mi sembra strana, cioè che il monitor legge un qualcosa ma al resto rimane tutto come se non succedesse niente.

I collegamenti che ho fatto sono esattamente quelli del video che ho detto nel primo post. La porta MIDI è collegata all'alimentazione e al TX di Arduino.
Questo è il codice:

#include <MIDI.h>
MIDI_CREATE_DEFAULT_INSTANCE();

#define NUM_ROWS 5
#define NUM_COLS 8

#define NOTE_ON_CMD 0x90
#define NOTE_OFF_CMD 0x80
#define NOTE_VELOCITY 127

//MIDI baud rate
#define SERIAL_RATE 31250

// Pin Definitions

// Row input pins
const int row1Pin = 2;
const int row2Pin = 3;
const int row3Pin = 4;
const int row4Pin = 5;
const int row5Pin = 6;

// 74HC595 pins
const int dataPin = 8;
const int latchPin = 9;
const int clockPin = 10;

boolean keyPressed[NUM_ROWS][NUM_COLS];
uint8_t keyToMidiMap[NUM_ROWS][NUM_COLS];

int NOTA;

// bitmasks for scanning columns
int bits[] =
{ 
  B00000001,
  B00000010,
  B00000100,
  B00001000,
  B00010000,
  B00100000,
  B01000000,
  B10000000
};

void setup()
{
  int note = 72;

  for(int colCtr = 0; colCtr < NUM_COLS; ++colCtr)
  {
    for(int rowCtr = 0; rowCtr < NUM_ROWS; ++rowCtr)
    {
      keyPressed[rowCtr][colCtr] = false;
      keyToMidiMap[rowCtr][colCtr] = note;
      note++;
    }
  }

  // setup pins output/input mode
  pinMode(dataPin, OUTPUT);
  pinMode(clockPin, OUTPUT);
  pinMode(latchPin, OUTPUT);

  pinMode(row1Pin, INPUT);
  pinMode(row2Pin, INPUT);
  pinMode(row3Pin, INPUT);
  pinMode(row4Pin, INPUT);
  pinMode(row5Pin, INPUT);

  //Serial.begin(SERIAL_RATE);
  MIDI.begin(MIDI_CHANNEL_OMNI);
}

void loop()
{
  for (int colCtr = 0; colCtr < NUM_COLS; ++colCtr)
  {
    //scan next column
    scanColumn(colCtr);

    //get row values at this column
    int rowValue[NUM_ROWS];
    rowValue[0] = digitalRead(row1Pin);
    rowValue[1] = digitalRead(row2Pin);
    rowValue[2] = digitalRead(row3Pin);
    rowValue[3] = digitalRead(row4Pin);
    rowValue[4] = digitalRead(row5Pin);

    // process keys pressed
    for(int rowCtr=0; rowCtr<NUM_ROWS; ++rowCtr)
    {
      if(rowValue[rowCtr] != 0 && !keyPressed[rowCtr][colCtr])
      {
        keyPressed[rowCtr][colCtr] = true;
        noteOn(rowCtr,colCtr);
      }
    }

    // process keys released
    for(int rowCtr=0; rowCtr<NUM_ROWS; ++rowCtr)
    {
      if(rowValue[rowCtr] == 0 && keyPressed[rowCtr][colCtr])
      {
        keyPressed[rowCtr][colCtr] = false;
        noteOff(rowCtr,colCtr);
      }
    }
  }
}

void scanColumn(int colNum)
{
  digitalWrite(latchPin, LOW);

  if(0 <= colNum && colNum <= 7)
  {
    shiftOut(dataPin, clockPin, MSBFIRST, B00000000); //right sr
    shiftOut(dataPin, clockPin, MSBFIRST, bits[colNum]); //left sr
  }
  digitalWrite(latchPin, HIGH);
}

void noteOn(int row, int col)
{
  /*Serial.write(NOTE_ON_CMD);
  Serial.write(keyToMidiMap[row][col]);
  Serial.write(NOTE_VELOCITY);*/
  NOTA=keyToMidiMap[row][col];
  MIDI.sendNoteOn(NOTA,127,1);
}

void noteOff(int row, int col)
{
  /*Serial.write(NOTE_OFF_CMD);
  Serial.write(keyToMidiMap[row][col]);
  Serial.write(NOTE_VELOCITY);*/
  MIDI.sendNoteOff(NOTA,127,1);
}

P.S. Se non sono stato ancora abbastanza chiaro: se uso USB di arduino con sw per trasmettere non uso la scheda audio.
Potresti spiegarmi cos'è SoftwareSerial?

---EDIT---
Ho capito a che serve SoftwareSerial ma non ne capisco l'utilità in questo progetto :frowning:

Apocalypse480:
Quando invece ho usato la scheda audio (una Focusrite Scarlett 2i4) non ho usato alcun software poichè è un'interfaccia fisica.

Ok, perfetto, grazie ora mi è più chiaro. Ho visto le specifiche della scheda e le sue porte MIDI, quindi va benissimo quella, non cambiare più nulla, non serve cercare altre strade se hai l'interfaccia fisica e quelle porte MIDI funzionano perfettamente con una normale tastiera.

Ma passiamo ai tentativi effetuati con la sola usb di arduino (niente scheda audio):
sul monitor seriale vedo simboli strani con la Serial.write, che cambiano in base al baud rate a cui setto il monitor.

Mi pare normale, primo perché il MIDI usa un baud rate non standard (e quindi non presente nella lista del Serial Monitor) secondo perché comunque i byte inviati sono binari, e tu ne vedi solo l'equivalente carattere nella codifica impostata nel terminale (per dire, il comando NOTE ON è 0x90 ossia il carattere 144, che in codifica ASCII è una "E" maiuscola accentata).
Dovresti usare un altro software seriale che consenta di impostare il baud rate a 31.250, a quel punto puoi verificare che i byte siano quelli giusti (ma sono quasi certo che li vedrai).

I collegamenti che ho fatto sono esattamente quelli del video che ho detto nel primo post.
La porta MIDI è collegata all'alimentazione e al TX di Arduino.

Uhm, allora, vediamo di riassumere. La catena è Arduino -> UART -> MIDI OUT -> MIDI IN -> PC.

Dando per scontato quindi che MIDI IN -> PC funziona (ossia con una tastiera MIDI e con un programma sul PC tipo Cubase riesci a ricevere gli eventi nota e li puoi "suonare"), escludendo l'invio di byte sbagliati (lo sketch è già collaudato visto che lo hai preso da quel video) o a velocità sbagliata (lo sketch imposta la velocità standard per il MIDI), l'unica cosa che mi viene in mente a questo punto è la connessione MIDI OUT -> MIDI IN.

Controlla bene la piedinatura che hai usato, ossia sei certo di aver collegato al TX di Arduino il pin 5 del connettore e non al 4? A volte ci si sbaglia perché invece di guardare il numero del pin (indicato quasi sempre sulla plastica del connettore stesso) si prende il riferimento visivo, invertendo la vista connettore con quella dei contatti, di fatto rendendo speculari le connessioni..

Sinceramente non vedo altre spiegazioni, verifica bene e fammi sapere.

Ho capito a che serve SoftwareSerial ma non ne capisco l'utilità in questo progetto :frowning:

Come detto, solo per debug ossia poter avere un riscontro sul monitor seriale di quello che fa lo sketch e di quali dati sta scrivendo, e dato che per fare questo non puoi usare la UART (in quanto impegnata con il monitor seriale) dovresti spostare il TX su altro piedino, ma per farlo devi usare SoftwareSerial che ti permette di gestire due pin digitali come una seriale. Quindi una volta capito il problema, rimetterai a posto lo sketch per usare definitivamente la UART.

Allora, la piedinatura è giusta, anche perchè ho solo i pin 0 e 1 liberi e poi dall'11 in poi.

Ho lasciato perdere il monitor seriale di Arduino e con Hairless ho fatto un debug del messaggio MIDI e mi da questo errore:
Non riesco a capire a cosa sia dovuto...

Interessante. In particolare non mi spiego il messaggio "unexpected data byte" per il valore 0x38: devo supporre che quello sia il valore della nota che volevi suonare, ma 0x38 equivale al valore decimale 56 (per il MIDI leggo che è un G#4), e nell'array mi sembra tu metta i valori delle note a partire dal 72 (che è altino, è un C6, perché inizi così in alto?) per cui non dovresti avere quel valore.

E comunque su Hairless hai provato ad abilitare "Debug MIDI messages"? Con quello forse avrai maggiori informazioni su cosa "vede" dalla porta seriale..

Il primo passo che farei io a questo punto è o fare uno sketch di test, o debuggare per capire cosa effettivamente mandi sulla seriale ossia al MIDI.

Hai già provato uno sketch di esempio tipo questo sotto?

#include <MIDI.h>

MIDI_CREATE_DEFAULT_INSTANCE();

static const unsigned ledPin = 13;      // LED pin on Arduino Uno

void setup(){
    pinMode(ledPin, OUTPUT);
    MIDI.begin();
}
void loop() {
  digitalWrite(ledPin, HIGH);
  MIDI.sendNoteOn(42, 127, 1);    // Send a Note (pitch 42, velo 127 on channel 1)
  delay(1000);                // Wait for a second
  MIDI.sendNoteOff(42, 0, 1);     // Stop the note
  digitalWrite(ledPin, LOW);
  delay(1000)
}

Con questo funziona?

Poi per fare un ulteriore debugging proverei a mandare i codici esadecimali di tutti i byte che stai mandando sul MIDI, ovvero clonerei lo sketch che hai ora, toglierei il MIDI.h per tornare ad usare Serial, cambierei il baud a 115200 (o quello che vuoi, basta che sia lo stesso del monitor seriale), e sostituirei tutti i Serial.write() in Serial.print(), ad esempio:

/* 
Serial.write(NOTE_ON_CMD);
Serial.write(keyToMidiMap[row][col]);
Serial.write(NOTE_VELOCITY);
*/
Serial.print(NOTE_ON_CMD, HEX);
Serial.print(" ");
Serial.print(keyToMidiMap[row][col], HEX);
Serial.print(" ");
Serial.println(NOTE_VELOCITY, HEX);

A quel punto se apri il monitor seriale puoi "vedere" esattamente quali byte stai mandando, e da lì cercare di capire se qualcosa non torna per qualche ragione.

Era la stessa idea che avevo avuto io quella del provare uno sketch per vedere il funzionamento del MIDI.
Ma la MIDI.h funziona su Arduino Uno?
Comincio dal 72 perchè è effettivamente quella la prima nota, è una tastiera molto piccola.
Ma dai pin TX e RX si usa il baud rate impostato nella serial.begin o i 57600? Perchè altrimenti dovrei provare ad usare softwareserial.
Ad ogni modo siccome con la MIDI.h non funzionava la ho tolta e rimesso le serial.write.
La seconda parte di codice che mi hai mandato la avevo già provata ma non stampa davvero niente sul monitor seriale, il che mi sembra alquanto strano. Inoltre non riesco a capire che cos'è quel keyToMidiMap (al livello di programmazione), se è una matrice o cosa.
Comunque ho intenzione di fare un piccolo circuito che mi consenta di analizzare l'input midi mandato dalla tastiera yamaha funzionante, in modo tale da capire le differenze col messaggio mandato dallo sketch di Evan Kale.

... solo come nota ... da prove effettuate da vari utenti del forum, l'affidabulità della SoftwareSerial, in uso intensivo, è buona fino a 9600 a 38400 comincia a dare problemi, oltre sono più gli errori che i caratteri buoni ::slight_smile:

Guglielmo

gpb01:
... solo come nota ... da prove effettuate da vari utenti del forum, l'affidabulità della SoftwareSerial, in uso intensivo, è buona fino a 9600 a 38400 comincia a dare problemi, oltre sono più gli errori che i caratteri buoni ::slight_smile:

Guglielmo

Grazie Guglielmo, quindi la tolgo dalle cose da provare.

Una domanda visto che ci sono: per fare il circuito di MIDI IN per analizzare il messaggio è strettamente necessario un optocoupler?

Apocalypse480:
Era la stessa idea che avevo avuto io quella del provare uno sketch per vedere il funzionamento del MIDI.

Ok, quindi? L'hai provato? Ho l'impressione di no... Quindi PROVALO e dimmi se funziona! Almeno iniziamo a distinguere tra i problemi lato MIDI da quelli di riconoscimento dei tasti.

Ma la MIDI.h funziona su Arduino Uno?

Non vedo perché non dovrebbe se è una libreria per Arduino...

Comincio dal 72 perchè è effettivamente quella la prima nota, è una tastiera molto piccola.

Da quale nota MIDI parti significa la trasposizione da dare: il DO basso della tua tastiera puà suonare qualsiasi DO di qualsiasi ottava tu voglia, indipendentemente dalla nota che la tastierina suonava...
Non è detto che una tastiera piccola non possa suonare un C2 e farne suoni da basso o bass pedal..

Ma dai pin TX e RX si usa il baud rate impostato nella serial.begin o i 57600? Perchè altrimenti dovrei provare ad usare softwareserial.

I pin TX ed RX ossia D0 e D1 usano la velocità che metti nella Serial.begin(), e se usi quei pin per la comunicazione, per il MIDI userai SoftwareSerial. Ma se provi a seguire le mie indicazioni, inizia a simulare su monitor seriale quello che mandi (le cose che ti ho scritto nella seconda parte del mio messaggio) ovviamente impostandolo alla STESSA velocità che metti nella begin().

La seconda parte di codice che mi hai mandato la avevo già provata ma non stampa davvero niente sul monitor seriale, il che mi sembra alquanto strano.

Se non visualizza nulla significa che non entra affatto in noteOn() o noteOff(), per cui il problema è a monte. come nella scienza, anche un esito negativo è un'informazione!

Inoltre non riesco a capire che cos'è quel keyToMidiMap (al livello di programmazione), se è una matrice o cosa.

Ah. Scusa, ma se siamo a questi livelli, non è affatto facile capirci..
Come il nome dice, è la mappatura dei tasti rilevati verso le relative note MIDI, ossia data la coordinata del tasto premuto (riga e colonna) ottieni il valore della nota.
Mentre "keyPressed" è una matrice analoga ma che contiene true se quel tasto è premuto, e false se non lo è. Per il resto, direi che devi studiarti meglio TU il programma per capire come funziona...

Mantenendo quindi il codice modificato per NON usare il MIDI ma mandare a video le note, aggiungi qualche altro Serial.print() per capire perché non entra in noteOn().

Apocalypse480:
Grazie Guglielmo, quindi la tolgo dalle cose da provare.

Beh, non ho ancora provato ma il MIDI avendo una velocità inferiore a 38400 dovrebbe funzionare anche con la SoftwareSerial, in ogni caso PRIMA fai i test senza MIDI ma con la Serial.print() e quando quello funziona, allora puoi anche usare TX e RX senza SoftwareSerial

docdoc non avevo fatto caso che era la stessa matrice in cui andava ad inserire le note col ciclo FOR, scusami.

Se non visualizza nulla significa che non entra affatto in noteOn() o noteOff(), per cui il problema è a monte. come nella scienza, anche un esito negativo è un'informazione!

Ma entra in quelle funzioni se mi da un output quando premo il tasto, quindi non credo sia questo il problema.
Credo piuttosto che sia un problema nella formattazione del messaggio visto gli errori segnalatimi da hairless, motivo per cui voglio costruire un circuito per analizzare il MIDI proveniente dalla tastiera yamaha, il quale viene accettato dalla scheda audio al contrario di quello generato dallo sketch.

Non vedo perché non dovrebbe se è una libreria per Arduino...

Forse la stavo confondendo con MIDIUSB che dovrebbe funzionare solo con Arduino Leonardo in quanto può essere riconosciuto nativamente con HID, SE NON SBAGLIO.

Ok, quindi? L'hai provato? Ho l'impressione di no... Quindi PROVALO e dimmi se funziona! Almeno iniziamo a distinguere tra i problemi lato MIDI da quelli di riconoscimento dei tasti.

La mia idea è quella di mettere 2 o 3 pulsanti e associare ad ognuno di loro un messaggio MIDI fatto da me e vedere che succede. Magari servendomi di attachInterrupt...