Ciao a tutti! Questo è il mio primo post, quindi spero di averlo impostato correttamente e di risultare chiaro.
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
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).