Prima di postarvi il codice voglio darvi una lista dell'hardware e del software utilizzato:
-Arduino Uno R3
-EasyVR Shield
-Arduino IDE 1.0.2
-Scheda audio M-Audio Profire 610
-Controller Behringer BCF2000
-Cavo convertitore MIDI-USB
-Sequencer Logic Pro
-MacBook Pro
Il sistema è così assemblato: arduino manda fuori messaggi MIDI con una porta midi assemblata (alimentazione 5V con resistore 220 Ohm dal MIDI-pin 4 al pin 5V, GND dal MIDI-pin 2 al pin GND, flusso dati dal MIDI-pin 5 al pin TX) verso la porta MIDI-IN della scheda audio. Dalla porta MIDI-OUT della scheda audio entro nella porta MIDI-IN del Behringer e dalla porta MIDI-OUT del Behringer esco con il cavo MIDI-USB ed entro nel portatile. In questo modo qualsiasi comando MIDI generato da Arduino passa per il Behringer e si ripercuote sul Logic Pro! Questo è il normale funzionamento!
Di seguito il codice:
Code:
#if defined(ARDUINO) && ARDUINO >= 100
#include "Arduino.h"
#include "SoftwareSerial.h"
SoftwareSerial port(12,13);
#else // Arduino 0022 - use modified NewSoftSerial
#include "WProgram.h"
#include "NewSoftSerial.h"
NewSoftSerial port(12,13);
#endif
#include "MIDI.h"
#include "EasyVR.h"
EasyVR easyvr(port);
EasyVRBridge bridge;
uint32_t mask = 0;
int8_t group = 0;
uint8_t train = 0;
char name[32];
void setup()
{
// bridge mode?
if (bridge.check())
{
cli();
bridge.loop(0, 1, 12, 13);
}
Serial.begin(9600);
port.begin(9600);
if (!easyvr.detect())
{
Serial.println("EasyVR not detected!");
for (;;);
}
easyvr.setPinOutput(EasyVR::IO1, LOW);
Serial.println("EasyVR detected!");
easyvr.setTimeout(31);
easyvr.setLanguage(EasyVR::ITALIAN);
MIDI.begin();//Launch MIDI with default options
}
void loop()
{
int idx_cmd; //variabile indicante l'indice numerico del comando
int idx_grp=3; //variabile indicante l'indice del gruppo
easyvr.setPinOutput(EasyVR::IO1,HIGH); //LED ON (Ascolto ON)
Serial.println("Inizia l'ascolto ");
easyvr.recognizeCommand(idx_grp); //questo comando riceve il numero del gruppo ed effettua il controllo in quel gruppo
while (!easyvr.hasFinished()); //aspetta che un comando venga fornito
easyvr.setPinOutput(EasyVR::IO1,LOW); //LED OFF (Ascolto OFF)
idx_cmd = easyvr.getCommand(); //immagazzina l'indice del comando trovato nella variabile precedentemente istanziata
switch (idx_cmd) {
case 0:
{
int cmd_grp_uno;
do
{
easyvr.setPinOutput(EasyVR::IO1,HIGH); //LED ON (Ascolto ON)
Serial.println("Inizia l'ascolto per il gruppo 1:");
easyvr.recognizeCommand(1); //questo comando riceve il numero del gruppo ed effettua il controllo in quel gruppo
while (!easyvr.hasFinished()); //aspetta che un comando venga fornito
easyvr.setPinOutput(EasyVR::IO1,LOW); //LED OFF (Ascolto OFF)
cmd_grp_uno = easyvr.getCommand();
switch (cmd_grp_uno){
case 0:
{
Serial.println("Hai selezionato il canale uno!");
MIDI.sendNoteOn(24,127,1);
break;
}
case 1:
{
Serial.println("Hai selezionato il canale due!");
MIDI.sendNoteOn(25,127,1);
break;
}
case 2:
{
Serial.println("Hai selezionato il canale tre!");
MIDI.sendNoteOn(26,127,1);
break;
}
case 3:
{
Serial.println("Hai selzionato il canale quattro!");
MIDI.sendNoteOn(27,127,1);
break;
}
}
}
while (cmd_grp_uno != 4);
break;
}
case 1:
{
int cmd_grp_due;
do
{
easyvr.setPinOutput(EasyVR::IO1,HIGH); //LED ON (Ascolto ON)
Serial.println("Inizia l'ascolto per il gruppo 2:");
easyvr.recognizeCommand(2); //questo comando riceve il numero del gruppo ed effettua il controllo in quel gruppo
while (!easyvr.hasFinished()); //aspetta che un comando venga fornito
easyvr.setPinOutput(EasyVR::IO1,LOW); //LED OFF (Ascolto OFF)
cmd_grp_due = easyvr.getCommand();
switch (cmd_grp_due){
case 0:
{
Serial.println("Hai selezionato il canale cinque!");
MIDI.sendNoteOn(28,127,1);
break;
}
case 1:
{
Serial.println("Hai selezionato il canale sei!");
MIDI.sendNoteOn(29,127,1);
break;
}
case 2:
{
Serial.println("Hai selezionato il canale sette!");
MIDI.sendNoteOn(30,127,1);
break;
}
case 3:
{
Serial.println("Hai selezionato il canale otto!");
MIDI.sendNoteOn(31,127,1);
break;
}
}
}
while (cmd_grp_due != 4);
break;
}
default:
{
Serial.println("Ritenta!!!");
break;
}
}
}
a questo punto ho due perplessità:
- Possibile conflitto di BaudRate: MIDI va a 31250 mentre EasyVR a 9600 (con possibilità di diversi settaggi). Ho provato a forzare il MIDI su un Baud diverso ma il controller a quel punto non riesce a ricevere più i comandi (come giusto che sia!!)
- Dal momento che EasyVR Shield in modalità Adapter (jumper SW sulla schedina) comunica con arduino tramite i pin 12 e 13 non è che il problema sia dovuto al fatto che continuo a collegare la porta midi sul pin TX?? In questo caso qualcuno mi illumina come faccio a far passare il flusso dati dal pin TX al pin 13?? (credo che il 13 corrisponda all'out)
Credo di aver detto tutto se necessitate di altri dettagli chiedete pure!
Spero possiate aiutarmi a risolvere questo problema!!
Grazie a tutti!!