Arduino controller MIDI

Ciao Ragazzi!
Da poco mi sto cimentando a costruire un controller midi con arduino, un Mega2560 per esattezza...rev3

Detto questo, ho cercato per giorni interi sul web (e non solo 2 giorni interi), ed ho visto di tutto, provato di tutto, e preso spunto da tante cose...

alla fine sono giunto alla conclusione che neanche uno di quei progetti, per quanto ben fatti facesse al caso mio...

Ho già realizzato un piccolo sketch, con spunti presi quà e la...

Diciamo che funziona...

Collegato a un mac con Mainstage 3 via midi dalla scheda audio, mi permette di accendere e spegnere un pulsante su mainstage tramite Control change, e, da mainstage, rimandare su arduino il valore di quel pulsante e quindi accendere o spegnere un led.

Quindi se premo il mio pulsante su breadboard, arduino manda un CC a Mainstage che cambia lo stato del "pulsante virtuale".

Se premo il "pulsante virtuale" su Mainstage, il pc manda ad arduino un CC del valore di 0 oppure 127 in base allo stato del pulsante, e arduino accende o spegne il led.

Fin quì tutto bene, se non collego contemporaneamente i pin TX ed RX di arduino!!!

infatti se li collego entrambi, rispettivamente alle loro porte midi IN ed OUT della scheda audio, il tutto sclera...

il mio pulsante non accende più il "pulsante virtuale" di Mainstage, e mainstage non fa accendere più il mio led su arduino...

sembra una specie di interferenza fra TX ed RX di arduino...

altra cosa curiosa è che quando trasmetto si accende il led TX, ma si accende anche quando ricevo! Mentre il led RX rimane sempre spento...

Ecco lo sketch:

#include <MIDI.h>  // Add Midi Library
                     



int pulsante=26;
int statoPulsante = 0;
int ultimoStatoPulsante = 0;


//Create an instance of the library with default name, serial port and settings
MIDI_CREATE_DEFAULT_INSTANCE();



void setup() {
  pinMode(24, OUTPUT);
  pinMode(pulsante, INPUT);
  digitalWrite(pulsante, LOW); 
  pinMode (22, OUTPUT);         // Set Arduino board pin 13 to output
  MIDI.begin(1); // Initialize the Midi Library.
                                 // OMNI sets it to listen to all channels.. MIDI.begin(2) would set it
                                 // to respond to notes on channel 2 only.
  MIDI.setHandleControlChange(MyCCFunction); // This command tells the MIDI Library
  // the function you want to call when a Continuous Controller command
  // is received. In this case it's "MyCCFunction".

}



void loop() {     // Main loop
      // Continuously check if Midi data has been received.
    MIDI.read();
    statoPulsante = digitalRead(pulsante);       
        if (statoPulsante == HIGH && ultimoStatoPulsante == LOW)  {
            digitalWrite(24, HIGH);
            MIDI.sendControlChange (22, 127, 1);
            ultimoStatoPulsante = statoPulsante;
           
	}
        if (statoPulsante == LOW && ultimoStatoPulsante == HIGH){
            digitalWrite(24, LOW);
            MIDI.sendControlChange (22, 0, 1);
            ultimoStatoPulsante = statoPulsante;
        
}
}

// MyCCFunction is the function that will be called by the Midi Library
// when a Continuous Controller message is received.
// It will be passed bytes for Channel, Controller Number, and Value
// It checks if the controller number is within the 22 to 27 range
// If it is, light up the corresponding LED with the PWM brightness equal to the Value byte
void MyCCFunction(byte channel, byte number, byte value) {
      if (value==127){
      digitalWrite(22, HIGH);
      }
      else {
      digitalWrite(22, LOW);
      }

}

:o
scusate il casino...

riecco il programma più ordinato:

#include <MIDI.h>  // Add Midi Library
                     
int pulsante=26;
int statoPulsante = 0;
int ultimoStatoPulsante = 0;

MIDI_CREATE_DEFAULT_INSTANCE();  //Create an instance of the library with
                                 //default name, serial port and settings

void setup() {
  
  pinMode(24, OUTPUT);
  pinMode(pulsante, INPUT);
  digitalWrite(pulsante, LOW); 
  pinMode (22, OUTPUT);         
  MIDI.begin(1);                 //Initialize the Midi Library on channel 1
  MIDI.setHandleControlChange(MyCCFunction);   // This command tells the MIDI Library
                                               // the function you want to call when a Continuous
 }                                             // Controller command in received.
                                               // In this case it's "MyCCFunction"

void loop() {    
                    
    MIDI.read();      // Continuously check if Midi data has been received.
    statoPulsante = digitalRead(pulsante);       
        if (statoPulsante == HIGH && ultimoStatoPulsante == LOW)  {
            digitalWrite(24, HIGH);
            MIDI.sendControlChange (22, 127, 1);
            ultimoStatoPulsante = statoPulsante;
           
	}
        if (statoPulsante == LOW && ultimoStatoPulsante == HIGH){
            digitalWrite(24, LOW);
            MIDI.sendControlChange (22, 0, 1);
            ultimoStatoPulsante = statoPulsante;
        
    }
  }  

 // MyCCFunction is the function that will be called by the Midi Library
 // when a Continuous Controller message is received.
 // It will be passed bytes for Channel, Controller Number, and Value
 // It checks if the controller number is within the 22 to 27 range
 // If it is, light up the corresponding LED with the PWM brightness equal to the Value byte
void MyCCFunction(byte channel, byte number, byte value) {
      if (value==127){
      digitalWrite(22, HIGH);
      }
      else {
      digitalWrite(22, LOW);
      }

}

Ragazzi nessuno che mi può aiutare?

C'è nessuno?!?!

Ciao,
come hai collegato il tutto? Potresti postare uno schema?

Ciao,Giovicavalla

Ciao Giovicavalla!

Ecco lo schema, tale e quale a come ho fatto i collegamenti io... (il connettore midi SX è midi out, quello DX midi in)

Ragazzi, nessuno che abbia idea di come aiutarmi o non conosca chi può farlo?

Ciao matt-korban,
credo ci siano un po' di errori nel tuo schema. Dal diodo dell'opto ai 5v del midi out. Ti posto due schemi e provi. Io ho provato solo l'output e funge. prova anche l'input e vedi un po' se va.

Ciao, Giovicavalla

Avevo trovato tanti schemi su internet ed avevo provato a realizzarli, ma con il mio 4n25 non funzionavano... cmq riproverò con li schemi che mi hai dato :wink:

Allora ecco il risultato...

L'output funziona perfettamente, ma non ricevo niente... ricontrollato più volte... se modifico qualcosa a livello hardware, magari ricevo, ma abbiamo lo stesso problema di prima, si incasina tutto...

Ciao,
scusa i lunghi periodi di attesa, ma in questo periodo sono parecchio incasinato!
Allora, prova solo a ricevere, cioè, togli la parte dello sketch che manda segnali midi, e prova solo a far accendere un led con un comando midi che mandi ad arduino. Domani se ho tempo controllo il tuo sketch per bene, e ti faccio sapere se c'è qualcosa che non va. Intanto prova così, in modo da escludere la parte hardware.

Ciao, Giovicavalla

ciao!

Rieccomi finalmente...

Allora, ho fatto la prova che mi hai detto... e sorpresa.... lo fa ancora!
Ho eliminato la parte di sketch dedicata alla trasmissione, variabili, e pinMode compresi...

incredibilmente fa ancora lo stesso problema... questo è interessante, perchè conferma che il problema non è nello sketch, ma nell'hardware...

Non vorrei fosse un problema di mainstage, ma non credo... lo uso parecchio, e mi sembra strano che abbia altri segreti per me... Ho pure seguito la configurazione guidata per l'utilizzo di controller midi esterni... quindi mi sembra strano sia quello...

Ciao,
per capirci: tu usi un adattatore Midi -> USB giusto? Se si, quale? Hai la possibilità di provarlo con altri dispositivi che non siano arduino?
In ogni caso, prova a usare un convertitore software seriale -> Midi, vedi Hairless. Poi fammi sapere se il problema si ripresenta, perché, per come la sto vedendo io, al livello hardware non ci dovrebbero essere problemi.

Ciao, Giovicavalla

Ciao,
ho finalmente riletto il tuo codice, allora, ho trovato un paio di cose che non vanno:
non ha alcun metodo di debounce quando premi il pulsante, quindi potrebbe potenzialmente leggerti cosa che effettivamente non fai quando premi il pulsante, purtroppo non si tratta di un pulsante immaginario ma stiamo parlando di un reale, quindi non va bene il tuo codice da quel punto di vista.
Dopodiché , la libreria in questione ha il Thru impostato di default, quindi ogni qualvolta riceve qualcosa, la rimanda indietro, tale e quale, quindi devi impostarla in modo che questo non accada utilizzando l'apposito comando MIDI.turnThruOFF(). Volendo puoi anche riattivarlo in seguito nel codice mettendo un MIDI.turnThruOn().

Ti posto un codice cosi provi se funge e mi fai sapere. Ho supposto che tu utilizzassi il pin 22 e il 24 per i led, il pin 26 per il pulsante e che usassi anche un baund di 31250, quindi tramite apposito convertitore MIDI-USB.

Puoi modificarlo per far si che faccia quello che vuoi, ma dovrebbe fare quello che faceva il tuo sketch, fammi sapere se ci sono problemi.

#include "MIDI.h"

MIDI_CREATE_DEFAULT_INSTANCE();

byte midiChannel = 1;

byte pulsante = 26;
boolean letturaPulsante;
boolean statoPulsante = false;
boolean ultimoStatoPulsante = false;
boolean statoMidiMessage = false;

long ultimoTempoDebounce = 0;
long tempoDiDebounce = 50;

void setup() {
  pinMode(24, OUTPUT);
  pinMode(pulsante, INPUT);
  pinMode(22, OUTPUT);
  MIDI.begin(midiChannel);
  MIDI.turnThruOff();

  delay(1000);

}

void loop() {

  if (MIDI.read()) {
    if (MIDI.getChannel() == 1) {
      if (MIDI.getData1() == 127) {
        digitalWrite(22, HIGH);
      }
      else {
        digitalWrite(22, LOW);
      }
    }

  };


  letturaPulsante = digitalRead(pulsante);

  if (letturaPulsante != ultimoStatoPulsante) {
    ultimoTempoDebounce = millis();
  }

  if ((millis() - ultimoTempoDebounce) > tempoDiDebounce) {
    if (letturaPulsante != statoPulsante) {
      statoPulsante = letturaPulsante;

      if (statoPulsante == HIGH) {


        if (statoMidiMessage) {
          MIDI.sendControlChange (22, 127, 1);
          statoMidiMessage = false;
        }
        else {
          MIDI.sendControlChange (22, 0, 1);
          statoMidiMessage = true;
        }


      }

    }
  }
  ultimoStatoPulsante = letturaPulsante;




}

Grazie mille!!!

Appena ho un attimo proverò lo sketch, e ti farò subito sapere...

il convertitore che uso è una scheda audio esterna motu, quindi di altissima qualità, che ho sempre usato in midi senza nessun problema...

probabilmente il vero problema è il Thrue!

cmq proverò e ti farò sapere!!!

Tutto bene? funge?

Ciao Giovicavalla!

Purtroppo non ho avuto molto tempo di recente...Ma, non ho abbandonato il progetto... di fatto mi serve ancora, ed ho intenzione di finirlo, dato che sto aprendo uno studio, ed questo controller mi servirà...

Alla fine quel loop strano tra RX e TX era risolto!

Si trattava di un impostazione MIDI Thrue nativa della libreria, che mi rimandava in ingresso tutto quello che mandavo in uscita...

in poche parole... AVEVI RAGIONE!!!

Dovrei riprendere il progetto in mano, così da ultimarlo... devo ancora implementare alcuni encoder, e capire come configurarlo da Logic Pro...

Ciao,
mi fa piacere sentire che è stato tutto risolto. In caso di altri problemi scrivi che una mano la trovi. Se poi a progetto terminato vuoi condividere aiuteresti la crescita del forum aiutando anche altri!

Ciao Giovicavalla.