Sketch non funzionante per un controller MIDI

Ciao a tutti! Questo è il mio primo post, quindi spero di averlo impostato correttamente e di risultare chiaro. :sweat_smile:
Ho assemblato un controller MIDI basato su un Arduino Leonardo; il circuito (che ho allegato) è composto da 12 pulsanti e 12 led collegati al Leonardo tramite due multiplexer CD74HC4067 distinti (uno per pulsanti, uno per led: ho scelto di usare i mux perché prossimamente, se riusciamo a fare funzionare quanto ho già assemblato, intendo aggiungere anche alcuni potenziometri agli ingressi analogici... ma diamo tempo al tempo): i pulsanti mandano tutti un messaggio di program change per la selezione di diversi preset su un multieffetto per chitarra; l'intenzione è che alla pressione di un pulsante si accenda un led corrispondente e venga inviato il messaggio MIDI.
Premetto che il codice l'ho compilato assieme a un mio amico che mastica programmazione (viste le mie limitate capacità offerte da un singolo esamino di informatica offerto dal mio corso di laurea in chimica) e documentandomi su internet: la logica dello sketch mi sembrava funzionare, ma quando caricato sul Leonardo il circuito non dà segni di vita - nessun messaggio MIDI è inviato e nessun led risponde alla pressione dei pulsanti.
Spero che qualcuno possa aiutarmi e ringrazio in anticipo chiunque abbia la pazienza di farlo :blush:
Di seguito allego il codice... grazie ancora

///////////////////////////////////////////////////////////////////
///////////////////////// MIDI controller /////////////////////////
///////////////////////////////////////////////////////////////////

#include <MIDIUSB.h>
#include "MUX74HC4067.h"
// crea un'istanza MUX74HC4067
// 1o argomento è il PIN Arduino a cui è connesso il PIN EN
// 2o-5o argomento sono i PIN Arduino a cui sono connessi i PIN S0-S3

MUX74HC4067 muxBUTTs(2, 3, 4, 5, 6); // MUX dei pulsanti
MUX74HC4067 muxLEDs(8, 9, 10, 11, 12); // MUX dei led

#define NUM_BUTTS  12

const byte channel = 0x0F;  // use midi channel 16
const byte midiBankLSB[NUM_BUTTS] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; // Bank selection based on switch pressed (switch 1-12)
const byte midiProgram[NUM_BUTTS] = {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B}; // Program/Preset selection based on switch pressed (switch 1-12)

int previouslyPressedBUTT = -1; // assegna una valore all'ultimo pulsante premuto

void setup()
{
  Serial.begin(9600);  // Initializes serial port
    // Waits for serial port to connect. Needed for Leonardo only
    while ( !Serial );
    
  muxBUTTs.signalPin(7, INPUT, DIGITAL); // Configures how the SIG pin will be interfaced
  muxLEDs.signalPin(13, OUTPUT, DIGITAL);
}

/////////////////////////////////////////////////////////////////////
///////////////////////// BUTTs e LEDs loop /////////////////////////
/////////////////////////////////////////////////////////////////////
// legge i canali del MUX e controlla se un pulsante è stato premuto
// se un pulsante è stato premuto controlla che il pulsante non sia lo stesso premuto in precedenza 
// (questo evita di impostare un set bank/preset che sono già impostati)
// accende il corrispondente LED e invia il messaggio MIDI

void loop()  {
  byte data;
  for (byte i = 0; i < NUM_BUTTS; i++)  {    
    data = muxBUTTs.read(i); // Reads from channel i and returns HIGH or LOW
    if (( data == LOW ) && (i != previouslyPressedBUTT))  { 
      controlChange(channel, 0X00, 0X00); // Bank select MSB
      controlChange(channel, 0X20, midiBankLSB[i]);  // Bank select LSB
      programChange(channel, midiProgram[i]);  // Program/Preset change
      MidiUSB.flush();
      muxLEDs.write(i, HIGH);
      muxLEDs.write(previouslyPressedBUTT, LOW);
      previouslyPressedBUTT = i; // registra il pulsante premuto
    }
  }
}

/////////////////////////////////////////////////////////////////
///////////////////////// funzioni midi /////////////////////////
/////////////////////////////////////////////////////////////////

void controlChange(byte channel, byte control, byte value) {
  midiEventPacket_t event = {0x0B, 0xB0 | channel, control, value};
  MidiUSB.sendMIDI(event);  
}
// First parameter is the event type (0x0B = control change).
// Second parameter is the event type, combined with the channel.
// Third parameter is the control number number (0-119).
// Fourth parameter is the control value (0-127).

void programChange(byte channel, byte value) {
  midiEventPacket_t event = {0x0C, 0xC0 | channel, value};
  MidiUSB.sendMIDI(event);  
}
// First parameter is the event type (0x0B = control change).
// Second parameter is the event type, combined with the channel.
// Third parameter is the control value (0-127).

Questo tiene tutto fermo finché non colleghi la USB di Leonardo a un computer e la fai comunicare con l'IDE!

Ok, quindi mi basterebbe togliere il
while ( !Serial );
per fare funzionare il controller MIDI collegandolo direttamente alla porta USB del computer con il software multieffetto?
Facendo così il controller manda messaggi MIDI ma ho incontrato altri problemi:

  • mentre i pulsanti dal 2 all'11 mandano messaggi MIDI di program change come previsto, il pulsante 12 non manda nessun messaggio;
  • i led non si accendono, se non quando premo il pulsante 1: in questo caso si accendono tre led diversi;
  • inoltre quando premo il pulsante 1, il programma che riceve i messaggi MIDI riceve in sequenza un messaggio di program change 0, poi uno di PC 2, poi ancora 0, poi ancora 2, e così via (allego lo screenshot).

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.