Solucionado (ver solução)
Solucionado
(ver solução)
4
respostas

Tocar o som várias vezes

Olá pessoal, meu primeiro tópico no fórum.

Gostaria de fazer com que os sons fossem sempre reproduzidos no momento que eu clicasse no botão. Atualmente pelo que me parece ele "espera" o som ser reproduzido completamente para então tocar novamente.

De maneira geral gostaria de clicar repetidas vezes em qualquer tecla e ouvir o som "spamando" no fundo.

Uma maneira fácil que encontrei de reproduzir o cenário que gostaria é: entre em qualquer vídeo do YouTube e com o teclado numérico digite (repetidas vezes) a tecla 1 ou 2. O som será repetido instantaneamente.

Não sei se fui muito claro, porém desde já agradeço.

4 respostas

Também senti falta deste comportamento. Se bem entendi, por 'spamar' você está se referindo a interromper o som que estava sendo reproduzido e iniciar prontamente o som da nova tecla pressionada, mesmo que a mesma.

Tudo que consegui pensar a respeito seria adicionar justamente esse comportamento no CSS nos eventos de click:

1) interromper o som em execução ao pressionar qualquer nova tecla e 2) então, reproduzir o novo som

mas ainda não pesquisei a respeito para entregar a resposta

Imaginei uma possível solução, mas ainda não consegui implementar ela.

Sei que não é a melhor, nem a mais correta, mas a "solução" que pensei foi: ao invés de 1 arquivo de áudio para cada som eu criaria 5 arquivos de áudio para o mesmo som. E cada vez que a tecla fosse pressionada eu executaria um áudio "diferente".

Pois com sons de teclas diferentes, dá certo.. por exemplo clique no Toim e depois no Tim. Um som é executado por cima do outro, mesmo que ele não tenha sido finalizado ainda. Analisando esse comportamento me veio a ideia de criar mais de um som para o mesmo som, ou para a mesma tecla.

Algo como...

<audio src="sounds/keyq0.wav" id="som_tecla_pom1"></audio>
<audio src="sounds/keyq1.wav" id="som_tecla_pom2"></audio>
<audio src="sounds/keyq2.wav" id="som_tecla_pom3"></audio>
<audio src="sounds/keyq3.wav" id="som_tecla_pom4"></audio>
<audio src="sounds/keyq4.wav" id="som_tecla_pom5"></audio>

Então da primeira vez que pressiono a tecla pom irá reproduzia a "somteclapom1" da segunda vez a "somteclapom2", após a "somteclapom5" ele voltaria pra 1 e assim vai, em loop.

Daria pra fazer um índice que a cada tecla pressionada ele incrementasse e reproduzisse o som com base no índice, algo nesse sentido.

Ainda estou buscando outras soluções e estudando a biblioteca mas assim que implementar a ideia acima, atualizo aqui.

solução!

Deu certo Rafael, fiz um rascunho bem simples e funcionou exatamente como eu esperava, reproduzindo o som (o mesmo som) mesmo que o anterior não tenha terminado ainda.

No HTML


    <audio src="sounds/keyq.wav" id="som_tecla_pom"></audio>
    <audio src="sounds/keyw.wav" id="som_tecla_clap"></audio>

    <audio src="sounds/keyq.wav" id="som_tecla_pom2"></audio>
    <audio src="sounds/keyw.wav" id="som_tecla_clap2"></audio>

    <audio src="sounds/keyq.wav" id="som_tecla_pom3"></audio>
    <audio src="sounds/keyw.wav" id="som_tecla_clap3"></audio>

    <audio src="sounds/keyq.wav" id="som_tecla_pom4"></audio>
    <audio src="sounds/keyw.wav" id="som_tecla_clap4"></audio>

    <audio src="sounds/keyq.wav" id="som_tecla_pom5"></audio>
    <audio src="sounds/keyw.wav" id="som_tecla_clap5"></audio>

No JS


var contador_pom = 1;
var contador_clap = 1;

function tocaSomPom () {
    if (contador_pom===1){
        document.querySelector('#som_tecla_pom').play();
        contador_pom ++;
    }else if(contador_pom===2){
        document.querySelector('#som_tecla_pom2').play();
        contador_pom ++;
    }else if(contador_pom===3){
        document.querySelector('#som_tecla_pom3').play();
        contador_pom ++;
    }else if(contador_pom===4){
        document.querySelector('#som_tecla_pom4').play();
        contador_pom ++;
    }else{
        document.querySelector('#som_tecla_pom5').play();
        contador_pom = 1;
    }

Vou melhorar o código agora, colocando tudo dentro de alguns laços para economizar algumas e ficar mais legível.

Matheus, obrigado por compartilhar a tua solução. Feliz que tenha dado certo para você. Forte abraço!