pullup interne e cambi di stato

buona sera, sto aggiungendo al mio piccolo progettino la capacità di gestire suoni mediante pulsanti.
non sono ancora in grado di eseguire tale operazione premendo consecutivamente un solo pulsante per cambiare suono, ecco perchè per cambiare suoni, avendo una serie di 6 pulsanti a leve, li ho collegati sfruttando le pull-up interne. Inserendo un serial.println su ogni pulsante, ho potuto constatare(cosa che già avevo letto sul seguente forum) che le pull-up interne funzionano "al contrario"(risolto facendo funzionare al contrario le leve). Il vero problema è che non avviene il cambio di stato.
Mi potreste dare una mano? Grazie

#define       knockSensor  A1 
#define       pinPiezo     11
byte          statoPiezo = LOW;
byte          sensorestato = LOW;
byte          sensStat = 0;
unsigned long sensTime;
byte          soundStat = 0;
unsigned long soundTime;  
const int     threshold = 5;  
byte          sensorReading = 0;    
int           pulsante1 = 4;
int           pulsante2 = 5;
int           pulsante3 = 6;
int           pulsante4 = 7;
int           pulsante5 = 8;
int           pulsante6 = 9;

//-----------------------------------------------------------------------------
void setup()
{
    delay(1000);
    Serial.begin(9600);
    Serial.println("avvio programma");
    pinMode(pinPiezo, OUTPUT);
 pinMode(pulsante1, INPUT_PULLUP);
 pinMode(pulsante2, INPUT_PULLUP);
 pinMode(pulsante3, INPUT_PULLUP);
 pinMode(pulsante4, INPUT_PULLUP);
 pinMode(pulsante5, INPUT_PULLUP);
 pinMode(pulsante6, INPUT_PULLUP);
}
//-----------------------------------------------------------------------------
void loop()
{
    gestKnock();
    gestSens();
    gestSound();
}
//-----------------------------------------------------------------------------
void gestKnock()
 { sensorReading = analogRead(knockSensor); 
 // Serial.println(sensorReading);interrotto per visualizzare stato pulsanti
 if (sensorReading >= threshold) {
    sensorestato = HIGH;
 }else { sensorestato = LOW;
 }
  }
 
void gestSens()
{
    byte sens = digitalRead(sensorestato);
       
    switch (sensStat)
    {
        case 0:  // attende sensore HIGH
            if (sens)
            {
                sensTime = millis();  // memorizza tempo attuale
                sensStat = 1;         // passa a stato 1
            }
            break;

        case 1:  // conteggio 5 sec, torna a stato zero se sens LOW
            if (!sens)
                sensStat = 0;
            else if (millis() - sensTime >= 5000)  // se timeout 5 secondi
            {
                statoPiezo = HIGH;
                Serial.println("Stato high");
                sensStat = 3;
            }
            break;

        case 3:  // attende sensore LOW, poi torna a stato zero
            if (!sens)
            {
                statoPiezo = LOW;
                Serial.println("Stato low");
                sensStat = 0;
            }
    }
}
//-----------------------------------------------------------------------------
void gestSound()
{
    switch (soundStat)
    {
        case 0://traccia
            if (statoPiezo) { soundStat = 3; break; }
            {int buttonState1 = digitalRead(pulsante1);
            Serial.println(buttonState1);
            int buttonState2 = digitalRead(pulsante2);
             Serial.println(buttonState2);
            int buttonState3 = digitalRead(pulsante3);
             Serial.println(buttonState3);
              {if (buttonState1 == LOW){
            tone(pinPiezo, 1397, 600);
delay(600);
            tone(pinPiezo, 1175, 600);}}
            {if (buttonState2 == LOW){
             tone(pinPiezo,1047,50);
delay(50);      
tone(pinPiezo,1245,50);
delay(50);
tone(pinPiezo,1047,50);
delay(50);
tone(pinPiezo,1245,50);
delay(50);
tone(pinPiezo,1047,50);
delay(50);
tone(pinPiezo,1245,50);
delay(50);
tone(pinPiezo,1047,50);
delay(50);
tone(pinPiezo,1245,50);
delay(50);
tone(pinPiezo,1047,50);
delay(50);}}
            {if (buttonState3 == LOW){
            tone(pinPiezo, 987.8, 300);
delay(300);
            tone(pinPiezo, 1140, 600);}}}
            soundTime = millis();
            soundStat = 2;
            break;   

        case 2:
            if (statoPiezo) { soundStat = 3; break; }
            if (millis() - soundTime >= 18000) soundStat = 0;//tempo traccia
            break;

        case 3:
            if (!statoPiezo) { soundStat = 0; break; }
            {int buttonState1 = digitalRead(pulsante1);
            Serial.println(buttonState1);
            int buttonState2 = digitalRead(pulsante2);
             Serial.println(buttonState2);
            int buttonState3 = digitalRead(pulsante3);
             Serial.println(buttonState3);
              {if (buttonState1 == LOW){
            tone(pinPiezo, 1397, 600);
delay(600);
            tone(pinPiezo, 1175, 600);}}
            {if (buttonState2 == LOW){
             tone(pinPiezo,1047,50);
delay(50);      
tone(pinPiezo,1245,50);
delay(50);
tone(pinPiezo,1047,50);
delay(50);
tone(pinPiezo,1245,50);
delay(50);
tone(pinPiezo,1047,50);
delay(50);
tone(pinPiezo,1245,50);
delay(50);
tone(pinPiezo,1047,50);
delay(50);
tone(pinPiezo,1245,50);
delay(50);
tone(pinPiezo,1047,50);
delay(50);}}
            {if (buttonState3 == LOW){
            tone(pinPiezo, 987.8, 300);
delay(300);
            tone(pinPiezo, 1140, 600);}}}
            soundTime = millis();
            soundStat = 5;
            break;
            
     

        case 5:
            if (!statoPiezo) { soundStat = 0; break; }
            if (millis() - soundTime >= 3000) soundStat = 3;//tempo ferma
    }
}

ho modificato il programma inserendo dei delay tra le funzioni tone.
ora suona, ma non avviene il cambio di stato.

Ehm ci sto provando, ma se vuoi facilitare le cose a chi deve leggere il tuo codice indentalo in modo comprensibile, per favore... Nell'editor premi Ctrl-T e fattelo indentare dall'IDE stesso.
Poi scusa, ma che sono tutte quelle graffe in punti inutili? Per dire, il tuo codice:

        case 0://traccia
            if (statoPiezo) { soundStat = 3; break; }
            {int buttonState1 = digitalRead(pulsante1);
            Serial.println(buttonState1);
            int buttonState2 = digitalRead(pulsante2);
             Serial.println(buttonState2);
            int buttonState3 = digitalRead(pulsante3);
             Serial.println(buttonState3);
              {if (buttonState1 == LOW){
            tone(pinPiezo, 1397, 600);
delay(600);
            tone(pinPiezo, 1175, 600);}}
            {if (buttonState2 == LOW){
             tone(pinPiezo,1047,50);
delay(600);
            tone(pinPiezo, 1175, 600);}}
            {if (buttonState2 == LOW){
             tone(pinPiezo,1047,50);
....eccetera

in pratica è equivalente ad un più leggibile:

    case 0://traccia
      if (statoPiezo)
        soundStat = 3;
      else {
        int buttonState1 = digitalRead(pulsante1);
        Serial.println(buttonState1);
        int buttonState2 = digitalRead(pulsante2);
        Serial.println(buttonState2);
        int buttonState3 = digitalRead(pulsante3);
        Serial.println(buttonState3);
        if (buttonState1 == LOW) {
            tone(pinPiezo, 1397, 600);
            delay(600);
            tone(pinPiezo, 1175, 600);
        }
....eccetera

La cosa curiosa è che nelle altre funzioni come gestSens() il codice è in un formato "buono", come se fosse stato scritto da un'altra mano... Il codice è un copia/incolla al quale vuoi aggiungere funzionalità, esatto?

Beh comunque ti consiglio di iniziare a "ripulire" il tuo codice indentandolo decentemente e cambiando le cose che ti ho segnalato, perché non è solo un fatto "estetico" ma il debugging ti assicuro è molto più semplice se lo fai su un codice "leggibile". Se poi devi farlo vedere ad altri, semplifichi le cose anche a loro non ti pare?

Una volta fatto, posta il "nuovo" codice e possiamo vedere, ma nel frattempo perché non verifichi (e ci dici) cosa scrivono le Serial.print() per capire meglio dove passa il codice e quindi perché non funziona come ti aspetti?