Bank up/Bank down pedaliera midi

Ciao a tutti ragazzi vorrei chiedere il vostro aiuto per un problema nello sketch di una pedaliera midi che ho costruito seguendo questo link http://hyperglitch.com/articles/standalone-midi-controller
Il problema è che non riesco ad aumentare il numero di banchi di memoria disponibili.
Posto il codice che per motivi di spazio ho tagliato fino al “bank 3 definition”
Grazie in anticipo a tutti coloro che proveranno ad aiutarmi :)))

 // midi.controller
// Sends midi program change ,midi notes and control change messages based on foot pedal pressed
#include <LiquidCrystal.h>
LiquidCrystal lcd(12,11,5,4,3,2);


// Constants
#define led1 6
#define led2 7

#define BANK_DOWN 14
#define BANK_UP 19
#define SWITCH1 18
#define SWITCH2 17
#define SWITCH3 13
#define SWITCH4 16
#define SWITCH5 15 
#define SWITCH6 23
#define SWITCH7 24
#define SWITCH8 25



// Variables: 
int switches[8] = {SWITCH1, SWITCH2, SWITCH3, SWITCH4, SWITCH5, SWITCH6, SWITCH7, SWITCH8 };
int switchState[8] = {HIGH, HIGH, HIGH, HIGH, HIGH, HIGH, HIGH, HIGH }; // Initial state of switch is high due to internal pullup
int currentSwitch = 0;
int currentProgram = 0;   // current program - sent to the output
int note=0; //Midi Note (pitch)
short bank=1; // (actual bank selected)
int BANK_DOWNState = HIGH ;
int BANK_UPState = HIGH ;

int AnalogValue[6] = {0,0,0,0,0,0};    
// define the "lastValue" variables
int lastAnalogValue[6] = {0,0,0,0,0,0}; 
// select the midi Controller Number for each input
int midiCCselect[6] = {1,2,3,4,5,6};
// select threshold for each analog input  
int thresh[6] = {1,1,1,1,1,1}; 
// Select the midi channel Number for each input
int midichan[6]={0xB0 ,0xB0 ,0xB0 ,0xB0 ,0xB0 ,0xB0};
// select number of desired analog inputs (max 6)
int input_no = 6;


void setup() {
  pinMode(led1, OUTPUT);
  pinMode(led2,OUTPUT);

  
  digitalWrite(led1,HIGH);
  digitalWrite(led2,HIGH);
 
  
  lcd.begin(16,2);
  
  delay(1000);
  lcd.clear();



  //  Set MIDI baud rate:
  Serial.begin(31250);

  // Setup Switches 
  pinMode(BANK_DOWN, INPUT);
  pinMode(BANK_UP, INPUT);
  for( currentSwitch = 0; currentSwitch < 8; currentSwitch++ ) {
    pinMode( switches[currentSwitch], INPUT );          // Set pin for switch
    digitalWrite( switches[currentSwitch], HIGH );      // Turn on internal pullup
  }
}

void loop() {
  lcd.setCursor(1,0);
  lcd.print("BANK");
  // BANK SELECTOR start
    // check if the pushbutton is pressed.
 if(digitalRead (BANK_DOWN)==LOW) {
      delay(250);
     bank --;
    if (bank==0) {bank=9;}
  }
  delay(20);
  digitalWrite (BANK_DOWN ,HIGH);

  // check if the pushbutton is pressed.
  if (digitalRead (BANK_UP)==LOW) {
    delay(250);
    bank++;
    if (bank==10) {bank=1;}
   
  } 
  delay(20);
  digitalWrite(BANK_UP ,HIGH);
 
lcd.setCursor(15, 0);
lcd.print(bank);



  
  for( currentSwitch = 0; currentSwitch < 8; currentSwitch++ ) {
    if((digitalRead(switches[currentSwitch]) != switchState[currentSwitch] )&&(switchState[currentSwitch] == HIGH)){
      // bank specific action:
      switch (bank) {
      case 1:
        //BANK 1 DEFINITION ******************
        switch( currentSwitch ) {
        case 0:
          currentProgram = 0;
          midiProg( 0xC0, currentProgram );
          
          digitalWrite(led2,HIGH);
          delay(10);
          digitalWrite(led1,LOW);
          delay(10);
          digitalWrite(led1,HIGH);
          delay(10);
          digitalWrite(led1,LOW);
          delay(10);
          digitalWrite(led1,HIGH);
          
         
       
           lcd.clear();
           lcd.setCursor(0,1);
           lcd.print("Uno");

          break;
        case 1:
          currentProgram = 1;
          midiProg( 0xC0, currentProgram );
          
          digitalWrite(led2,HIGH);
          delay(10);
          digitalWrite(led1,LOW);
          delay(10);
          digitalWrite(led1,HIGH);
         
          
       
          
 
          
           lcd.clear();
           lcd.setCursor(0,1);
           lcd.print("Due");




          break;
        case 2:
          currentProgram = 2;
          midiProg( 0xC0, currentProgram );
          
          digitalWrite(led2,LOW);
          delay(10);
          digitalWrite(led1,LOW);
          delay(10);
          digitalWrite(led1,HIGH);
          
          
          
          lcd.clear();
          lcd.setCursor(0,1);
          lcd.print("Tre");
          



          break;
        case 3:
          currentProgram = 6;
          midiProg( 0xC0, currentProgram );
          digitalWrite(led1,LOW);
          delay(10);
          digitalWrite(led1,HIGH);
          delay(10);
          digitalWrite(led1,LOW);
          delay(10);
          digitalWrite(led1,HIGH);
          
         
          
           lcd.clear();
           lcd.setCursor(0,1);
           lcd.print("Quattro");

          break;
        case 4:
          currentProgram = 51;
          midiProg( 0xC1, currentProgram );
          digitalWrite(led2,HIGH);
          
          lcd.clear();
           lcd.setCursor(0,1);
           lcd.print("Cinque");


          break;  
        
        }
        break;
      case 2:
        //BANK 2 DEFINITION ******************
        switch( currentSwitch ) {
        case 0:
          currentProgram = 3;
          midiProg( 0xC0, currentProgram );
          digitalWrite(led2,LOW);
          delay(10);
          digitalWrite(led1,LOW);
          delay(10);
          digitalWrite(led1,HIGH);
         
          
           lcd.clear();
           lcd.setCursor(0,1);
           lcd.print("Sei");



          break;
        case 1:
          currentProgram = 4;
          midiProg( 0xC0, currentProgram );
          digitalWrite(led2,HIGH);
          delay(10);
          digitalWrite(led1,LOW);
          delay(10);
          digitalWrite(led1,HIGH);
          
        
          
          lcd.clear();
          lcd.setCursor(0,1);
          lcd.print("Sette");
          
          




          break;
        case 2:
          currentProgram = 5;
          midiProg( 0xC0, currentProgram );
          digitalWrite(led2,HIGH);
          delay(10);
          digitalWrite(led1,LOW);
          delay(10);
          digitalWrite(led1,HIGH);
          delay(10);
          digitalWrite(led1,LOW);
          delay(10);
          digitalWrite(led1,HIGH);
          
         
          
           lcd.clear();
           lcd.setCursor(0,1);
           lcd.print("Otto");
          



          break;
        case 3:
          currentProgram = 7;
          midiProg( 0xC0, currentProgram );
          digitalWrite(led1,HIGH);
          digitalWrite(led2,HIGH);
        
          
           lcd.clear();
           lcd.setCursor(0,1);
           lcd.print("Nove");


          break;
        case 4:
          currentProgram = 52;
          midiProg( 0xC1, currentProgram );
          break;  
        
        }
        break;    
      case 3:
        //BANK 3 DEFINITION ******************
        switch( currentSwitch ) {
        case 0:
           note=0x01;
          noteOn(0x90, note, 0x45);
          delay(200);
          noteOn(0x90, note, 0x00);


          break;
        case 1:
           noteOn(0x90, note, 0x45);
          delay(200);
          noteOn(0x90, note, 0x00);


          break;
        case 2:
         note=0x04;
          noteOn(0x90, note, 0x45);
          delay(200);
          noteOn(0x90, note, 0x00);


          break;
        case 3:
          note=0x02;
          noteOn(0x90, note, 0x45);
          delay(200);
          noteOn(0x90, note, 0x00);


          break;
        case 4:
          currentProgram = 19;
          midiProg( 0xC0, currentProgram );
           currentProgram = 40;
          midiProg( 0xC1, currentProgram );




          break;  
        case 5:
          currentProgram = 15;
          midiProg( 0xC1, currentProgram );
          break;
          case 6:
         currentProgram = 4;
          midiProg( 0xC0, currentProgram );


          break;
        case 7:
          currentProgram = 5;
          midiProg( 0xC0, currentProgram );


          break;    
        }
        break;

      //il codice continua ma per motivi di spazio è stato tagliato

Scusa ma non ho ben capito. Quando dici "non riesco ad aumentare il numero di banchi" cosa intendi? Attualmente dal codice vedo che ce ne sono 9, numerati da 1 a 9, volevi aumentare questo valore o hai qualche problema con questo codice che hai già espanso rispetto all'originale?

Nel primo caso non ti basta fare in modo che la variabile bank vada da 1 al nuovo valore, aggiungendo gli appositi blocchi per i nuovi banchi nel primo switch?

E nel secondo invece, se hai qualche problema, di quale problema si tratta (visto che non possiamo riprodurre il problema per via del codice non completo e dell'hardware abbastanza complesso da mettere in piedi per una prova)?

docdoc:
Nel primo caso non ti basta fare in modo che la variabile bank vada da 1 al nuovo valore, aggiungendo gli appositi blocchi per i nuovi banchi nel primo switch?

Ciao Alex e grazie per l'intervento.
lo sketch funziona alla grande però solo con 9 banchi di memoria.
Ho provato ad aumentare il valore della variabile bank però non succede nulla o meglio accade questo:
1- con lo sketch originale i pulsanti bank down e bank up fanno in modo che il num di banchi visualizzati sul display vada da 1 a 9 e poi ritorna a 1 e viceversa al contrario.
2-aumentando il valore della variabile bank succede la stessa identica cosa solo che il display invece di visualizzare i banchi 1 a 9 visualizza 10 a 90 di dieci in dieci.
allego la modifica per portare i banchi a 11

molto probabilmente sbaglio qualcosa ma non riesco a capire...ho fatto tutte le prove possibili cambiando i valori ma niente.

void loop() {
  lcd.setCursor(1,0);
  lcd.print("BANK");
  // BANK SELECTOR start
    // check if the pushbutton is pressed.
 if(digitalRead (BANK_DOWN)==LOW) {
      delay(250);
     bank --;
    if (bank==0) {bank=10;}
  }
  delay(20);
  digitalWrite (BANK_DOWN ,HIGH);

  // check if the pushbutton is pressed.
  if (digitalRead (BANK_UP)==LOW) {
    delay(250);
    bank++;
    if (bank==11) {bank=1;}
   
  } 
  delay(20);
  digitalWrite(BANK_UP ,HIGH);
 
lcd.setCursor(11, 0);
lcd.print(bank);

rocktrust:
2-aumentando il valore della variabile bank succede la stessa identica cosa solo che il display invece di visualizzare i banchi 1 a 9 visualizza 10 a 90 di dieci in dieci.
allego la modifica per portare i banchi a 11

Intanto non va di dieci in dieci, è che il display si “sporca” quando scrivi “10”. Quando con la print scrivi “9” il carattere “9” sovrascrive l’“1” di “10” mentre lo zero resta! Quindi diminuendo il banco vedrai 90 poi 80 poi 70 e così via, ma in realtà il valore della variabile è corretto 9, 8, 7, eccetera.
Però i pushbutton non sono corretti secondo me, se vuoi avere 11 banchi (numerati da 1 a 11) devi cambiare il codice, prova questo dove ti ho anche corretto la visualizzazione del numero banco (che è ora sempre a 2 cifre, quindi va da 01 a 11).

void loop() {
  lcd.setCursor(1,0);
  lcd.print("BANK");
  // BANK SELECTOR start
    // check if the pushbutton is pressed.
 if(digitalRead (BANK_DOWN)==LOW) {
      delay(250);
     bank --;
    if (bank==0) {bank=11;} //<--(1)
  }
  delay(20);
  digitalWrite (BANK_DOWN ,HIGH);

  // check if the pushbutton is pressed.
  if (digitalRead (BANK_UP)==LOW) {
    delay(250);
    bank++;
    if (bank==12) {bank=1;} //<--(2)
   
  } 
  delay(20);
  digitalWrite(BANK_UP ,HIGH);
 
lcd.setCursor(11, 0);

char buf[3]; //<--(3)
sprintf(buf,"%2d",bank); //<--(3)
lcd.print(buf); //<--(3)

Note:
(1) = qui devi mettere “bank=11” e non “bank=10” se vuoi avere 11 banchi.
(2) = qui devi mettere “bank==12” e non “bank==11” se vuoi avere 11 banchi (signfica che prima “bank” valeva 11, l’ha incrementato arrivando a 12, ma questo valore non è ammesso quindi riporti a uno).
(3) = appoggio l’output in una stringa formattata con 2 cifre, vedi un qualsiasi reference del linguaggio C per capire come funziona la sprintf(), è molto comoda.

Grazie mille Alex ho risolto con la tua modifica :slight_smile:
Molto interessante e comoda la funzione sprintf :slight_smile:
Grazie mille ancora e buona giornata

p.s.
moderatori possono chiudere, grazie - Risolto

Felice di esserti stato d'aiuto. :slight_smile:
Buon making, anzi, buona Arduinata! :smiley: