Io farei in questo modo!
1)Uso un if else per ogni pulsante, in questo modo posso ottenere, se il pulsante è premuto suono, else altrimenti arresto il suono.
2) All'interno dell'if con la funzione millis() comincio il conteggio di 3 secondi, se sono passati interrompo il suono
Esempio per un pulsante, da duplicare per gestire due pulsanti, quindi due variabili per il tempo:
unsigned long tempo1=0; //variabile globale dichiarata ad di fuori di ogni funzione
byte suono1=1;
void loop(){
if(digitalRead(pulsante)==HIGH){
if(suono1==1){
tone(pin, frequency);
}
if(millis()-tempo1>=3000){// Passati 3 secondi
notone(pin); //fermo il suono
suono1=0;// rendo falsa la condizione cosi il programma non esegue piu tone
}
}else{
suono1=1; // Abilito il suono se si preme il pulsante
tempo1=millis(); // Prendo il tempo attuale
notone(pin); // Se non premo il pulsante arresto il suono
}// end if
}// end loop()