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 