Como fazer com que o som pare ao soltar o botão?

Olá pessoal. Bom, eu criei um código que toca o tema do Mario no Arduino. Na verdade o meu código só dá "play" e altera os leds de verde para quando não foi pressionado o botão e a música não está tocando e vermelho para quando o botão foi pressionado e a música está tocando. A melodia, a pausa das notas e tals, eu copiei de um site.
A minha dúvida de noob é a seguinte, eu queria saber como eu posso fazer para que quando eu soltar o botão, a música pare de tocar.

Seria tipo "enquanto o botão estiver pressionado, toca. Quando o botão for solto, para". Eu sei que existe a função while, mas já tentei ela e várias outras. Até gambiarra com o if eu tentei.

Bom, como eu disse, sou noob, estou aprendendo ainda. Se alguma alma caridosa quiser me ajudar.

PS:

1- Botão é o simples, de 4 pernas, duas de cada lado.

2 - O som sai pelo piezo.

O código é este:

int ledred = 10;  
int ledgreen = 9; 
int som = 11;
int botao = 8;   
int botaoestado = 0;  

//copiado
int melodia[] = {660,660,660,510,660,770,380,510,380,320,440,480,450,430,380,660,760,860,700,760,660,520,580,480,510,380,320,440,480,450,430,380,660,760,860,700,760,660,520,580,480,500,760,720,680,620,650,380,430,500,430,500,570,500,760,720,680,620,650,1020,1020,1020,380,500,760,720,680,620,650,380,430,500,430,500,570,585,550,500,380,500,500,500,500,760,720,680,620,650,380,430,500,430,500,570,500,760,720,680,620,650,1020,1020,1020,380,500,760,720,680,620,650,380,430,500,430,500,570,585,550,500,380,500,500,500,500,500,500,500,580,660,500,430,380,500,500,500,500,580,660,870,760,500,500,500,500,580,660,500,430,380,660,660,660,510,660,770,380};
int duracaodasnotas[] = {100,100,100,100,100,100,100,100,100,100,100,80,100,100,100,80,50,100,80,50,80,80,80,80,100,100,100,100,80,100,100,100,80,50,100,80,50,80,80,80,80,100,100,100,100,150,150,100,100,100,100,100,100,100,100,100,100,150,200,80,80,80,100,100,100,100,100,150,150,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,150,150,100,100,100,100,100,100,100,100,100,100,150,200,80,80,80,100,100,100,100,100,150,150,100,100,100,100,100,100,100,100,100,100,100,100,100,60,80,60,80,80,80,80,80,80,60,80,60,80,80,80,80,80,60,80,60,80,80,80,80,80,80,100,100,100,100,100,100,100};
//fim da cópia

void setup(){
  pinMode(ledred, OUTPUT);  
  pinMode(ledgreen, OUTPUT);
  pinMode(som, OUTPUT); 
  pinMode(botao, INPUT); 
}

void loop(){
  botaoestado = digitalRead(botao);
  if(botaoestado == HIGH){   
 
    digitalWrite(ledred, HIGH); 
    digitalWrite(ledgreen, LOW); 
    //copiado
    for (int nota = 0; nota < 156; nota++) {
              int duracaodanota = duracaodasnotas[nota];
              tone(som, melodia[nota],duracaodanota); 
              int pausadepoisdasnotas[] ={150,300,300,100,300,550,575,450,400,500,300,330,150,300,200,200,150,300,150,350,300,150,150,500,450,400,500,300,330,150,300,200,200,150,300,150,350,300,150,150,500,300,100,150,150,300,300,150,150,300,150,100,220,300,100,150,150,300,300,300,150,300,300,300,100,150,150,300,300,150,150,300,150,100,420,450,420,360,300,300,150,300,300,100,150,150,300,300,150,150,300,150,100,220,300,100,150,150,300,300,300,150,300,300,300,100,150,150,300,300,150,150,300,150,100,420,450,420,360,300,300,150,300,150,300,350,150,350,150,300,150,600,150,300,350,150,150,550,325,600,150,300,350,150,350,150,300,150,600,150,300,300,100,300,550,575};
              delay(pausadepoisdasnotas[nota]);}
              //fim da cópia
  }else{
    digitalWrite(10, 0);
    digitalWrite(9, 1);    
  }
}

Abraços.

while (botao_pressionado == TRUE) {
    vira_o_disco();
    e_toca_o_mesmo();
    }

bubulindo:

while (botao_pressionado == TRUE) {

vira_o_disco();
    e_toca_o_mesmo();
    }

Então, eu tentei várias vezes o while. Teria como você explicar melhor esse código que você postou, se possível? Abraços.

int ledred = 10;  
int ledgreen = 9; 
int som = 11;
int botao = 8;   
int botaoestado = 0;  

//copiado
const int melodia[] = {660,660,660,510,660,770,380,510,380,320,440,480,450,430,380,660,760,860,700,760,660,520,580,480,510,380,320,440,480,450,430,380,660,760,860,700,760,660,520,580,480,500,760,720,680,620,650,380,430,500,430,500,570,500,760,720,680,620,650,1020,1020,1020,380,500,760,720,680,620,650,380,430,500,430,500,570,585,550,500,380,500,500,500,500,760,720,680,620,650,380,430,500,430,500,570,500,760,720,680,620,650,1020,1020,1020,380,500,760,720,680,620,650,380,430,500,430,500,570,585,550,500,380,500,500,500,500,500,500,500,580,660,500,430,380,500,500,500,500,580,660,870,760,500,500,500,500,580,660,500,430,380,660,660,660,510,660,770,380};
const int duracaodasnotas[] = {100,100,100,100,100,100,100,100,100,100,100,80,100,100,100,80,50,100,80,50,80,80,80,80,100,100,100,100,80,100,100,100,80,50,100,80,50,80,80,80,80,100,100,100,100,150,150,100,100,100,100,100,100,100,100,100,100,150,200,80,80,80,100,100,100,100,100,150,150,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,150,150,100,100,100,100,100,100,100,100,100,100,150,200,80,80,80,100,100,100,100,100,150,150,100,100,100,100,100,100,100,100,100,100,100,100,100,60,80,60,80,80,80,80,80,80,60,80,60,80,80,80,80,80,60,80,60,80,80,80,80,80,80,100,100,100,100,100,100,100};
//fim da cópia

void setup(){
  pinMode(ledred, OUTPUT);  
  pinMode(ledgreen, OUTPUT);
  pinMode(som, OUTPUT); 
  pinMode(botao, INPUT); 
}

void loop(){
  botaoestado = digitalRead(botao);
  while(botaoestado == HIGH){ //AQUI... assim ele toca sempre um ciclo de música completo enquanto o botão estiver pressionado.   
 
    digitalWrite(ledred, HIGH); 
    digitalWrite(ledgreen, LOW); 
    //copiado
    for (int nota = 0; nota < 156; nota++) {  //se colocares o while aqui, ele só toca mesmo enquanto o botão estiver pressionado... 
              int duracaodanota = duracaodasnotas[nota];
              tone(som, melodia[nota],duracaodanota); 
              int pausadepoisdasnotas[] ={150,300,300,100,300,550,575,450,400,500,300,330,150,300,200,200,150,300,150,350,300,150,150,500,450,400,500,300,330,150,300,200,200,150,300,150,350,300,150,150,500,300,100,150,150,300,300,150,150,300,150,100,220,300,100,150,150,300,300,300,150,300,300,300,100,150,150,300,300,150,150,300,150,100,420,450,420,360,300,300,150,300,300,100,150,150,300,300,150,150,300,150,100,220,300,100,150,150,300,300,300,150,300,300,300,100,150,150,300,300,150,150,300,150,100,420,450,420,360,300,300,150,300,150,300,350,150,350,150,300,150,600,150,300,350,150,150,550,325,600,150,300,350,150,350,150,300,150,600,150,300,300,100,300,550,575};
              delay(pausadepoisdasnotas[nota]);}
              //fim da cópia
  }else{
    digitalWrite(10, 0);
    digitalWrite(9, 1);    
  }
}

Vê as notas no código.

Atenta que provavelmente estás a usar memória a mais com esses vectores. Tenta passar isso para código com o const como fiz nos dois primeiros vectores

Tente este

int ledred = 10;  
int ledgreen = 9; 
int som = 11;
int botao = 8;   
int botaoestado = 0;  

//copiado
int melodia[] = {660,660,660,510,660,770,380,510,380,320,440,480,450,430,380,660,760,860,700,760,660,520,580,480,510,380,320,440,480,450,430,380,660,760,860,700,760,660,520,580,480,500,760,720,680,620,650,380,430,500,430,500,570,500,760,720,680,620,650,1020,1020,1020,380,500,760,720,680,620,650,380,430,500,430,500,570,585,550,500,380,500,500,500,500,760,720,680,620,650,380,430,500,430,500,570,500,760,720,680,620,650,1020,1020,1020,380,500,760,720,680,620,650,380,430,500,430,500,570,585,550,500,380,500,500,500,500,500,500,500,580,660,500,430,380,500,500,500,500,580,660,870,760,500,500,500,500,580,660,500,430,380,660,660,660,510,660,770,380};
int duracaodasnotas[] = {100,100,100,100,100,100,100,100,100,100,100,80,100,100,100,80,50,100,80,50,80,80,80,80,100,100,100,100,80,100,100,100,80,50,100,80,50,80,80,80,80,100,100,100,100,150,150,100,100,100,100,100,100,100,100,100,100,150,200,80,80,80,100,100,100,100,100,150,150,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,150,150,100,100,100,100,100,100,100,100,100,100,150,200,80,80,80,100,100,100,100,100,150,150,100,100,100,100,100,100,100,100,100,100,100,100,100,60,80,60,80,80,80,80,80,80,60,80,60,80,80,80,80,80,60,80,60,80,80,80,80,80,80,100,100,100,100,100,100,100};
//fim da cópia

void setup(){
  pinMode(ledred, OUTPUT);  
  pinMode(ledgreen, OUTPUT);
  pinMode(som, OUTPUT); 
  pinMode(botao, INPUT); 
}

void loop(){
  botaoestado = digitalRead(botao);
  if(botaoestado == HIGH){   
 
    digitalWrite(ledred, HIGH); 
    digitalWrite(ledgreen, LOW); 
    //copiado
    for (int nota = 0; nota < 156; nota++) {
              int duracaodanota = duracaodasnotas[nota];
              tone(som, melodia[nota],duracaodanota); 
              int pausadepoisdasnotas[] ={150,300,300,100,300,550,575,450,400,500,300,330,150,300,200,200,150,300,150,350,300,150,150,500,450,400,500,300,330,150,300,200,200,150,300,150,350,300,150,150,500,300,100,150,150,300,300,150,150,300,150,100,220,300,100,150,150,300,300,300,150,300,300,300,100,150,150,300,300,150,150,300,150,100,420,450,420,360,300,300,150,300,300,100,150,150,300,300,150,150,300,150,100,220,300,100,150,150,300,300,300,150,300,300,300,100,150,150,300,300,150,150,300,150,100,420,450,420,360,300,300,150,300,150,300,350,150,350,150,300,150,600,150,300,350,150,150,550,325,600,150,300,350,150,350,150,300,150,600,150,300,300,100,300,550,575};
              delay(pausadepoisdasnotas[nota]);
              if(digitalRead(botaoestado) == LOW){
                 noTone(som);
                 break;
              }
     }
              //fim da cópia

  }else{
    digitalWrite(ledred, 0);
    digitalWrite(ledgreen, 1);    
  }
}

No final de cada toque, ele vai verificar se o botão está LOW. Se estiver, ele vai "desligar" o som (apesar que este noTone não é muito necessário porque seu tone possui 3 argumentos) e vai fazer o break. O break faz com que ele saia do enlace "for".
Estou no trabalho e não testei. teste lá e veja se funciona. Deixe o feedback aqui.

PS.: Acho que variável pausadepoisdasnotas[] poderia ser considerada uma variável global. Toda vez que ele faz um "turno" do "for" esta variável gigantesca está sendo declarada, dando muito trabalho para o coitado do arduino. Ela realmente precisa ser declarada dentro do enlace for, e não lá em cima?

Abraços

Filantropic:
PS.: Acho que variável pausadepoisdasnotas[] poderia ser considerada uma variável global. Toda vez que ele faz um "turno" do "for" esta variável gigantesca está sendo declarada, dando muito trabalho para o coitado do arduino. Ela realmente precisa ser declarada dentro do enlace for, e não lá em cima?

Todas elas precisam é de ser declaradas como const... como está agora está a desperdiçar memória do Arduino.

Opa, desculpa a demora para responder.

Então, não deu certo. Pois ou ele tocava sem parar ou então tocava uma coisa estranha heheheh. Mas mesmo tocando uma coisa estranha, ele não parava quando eu soltava o botão de jeito nenhum.