33 efeitos sonoros e nenhum arquivo de áudio
· 4 min de leitura
Strandbreak Online faz muito barulho: oito armas principais, cada uma com o seu disparo, uma dúzia de armas secundárias que pegam emprestada a voz da arma com que mais se parecem, acertos e acertos críticos, mortes e mortes de elite, coletas, subidas de nível, explosões e um chefe com cinco sons só dele. Trinta e três efeitos sonoros ao todo. E o download do jogo não contém nenhum arquivo de áudio.
Como isso funciona
Cada som é uma receita curta escrita como dados: quais osciladores, que formato de envelope de volume, um filtro, um pouco de ruído. Quando o jogo começa, essas receitas são renderizadas em buffers de amostras brutas (a mesma coisa em que um arquivo de áudio teria sido decodificado) e tocadas a partir daí.
O custo, medido no navegador, é de 37 milissegundos para renderizar os onze sons que vale a pena ter prontos no momento em que o navegador libera o áudio, a 48.000 amostras por segundo. Os demais são renderizados na primeira vez que tocam. O custo no download é zero bytes.
O ganho que ninguém espera: dá para testar
Downloads menores são bons, mas não eram o objetivo. O objetivo é que o código que transforma uma receita em amostras é puro: ele não toca no sistema de áudio do navegador nem na página. Isso quer dizer que ele roda num teste comum, numa máquina sem caixas de som, e um teste pode afirmar coisas sobre cada um dos sons do jogo:
- É audível. O volume dele está acima de um mínimo. Uma receita com um erro de digitação que renderiza silêncio quebra o build.
- Nunca clipa. Nenhuma amostra passa do máximo.
- Não contém nada quebrado — nenhum número inválido.
- Não tem offset DC, aquele empurrão constante para um lado que faz as caixas de som darem um baque.
- Começa e termina em silêncio, então não estala.
- É determinístico: a mesma receita produz as mesmas amostras toda vez.
- É diferente de todos os outros sons. Dois sinais que acabam compartilhando uma receita por acidente reprovam o teste.
- Cada arma principal tem o seu disparo, e cada arma do jogo, secundárias incluídas, aponta para um som que existe.
Nada disso pode ser verificado ouvindo. A falha que mais importa, "o evento dispara e não sai nada", é invisível numa captura de tela e fácil de deixar passar num teste de jogo, porque o jogador está ocupado. Com arquivos de áudio, tudo isso seria uma pessoa passando pelos sons de fone de ouvido, uma vez, e depois nunca mais.
Três coisas que o mixer de um jogo de hordas precisa fazer
Um jogo em que centenas de inimigos podem estar na tela pede sons mais rápido do que alguém consegue ouvi-los. Sem regras, a mixagem vira papa, ou ruído.
Todo som tem um intervalo mínimo e um limite de vozes. Um único quadro pode conter cinquenta eventos de acerto. Tocados como cinquenta sons sobrepostos, eles só ficam altos. Testado no navegador, cinquenta pedidos simultâneos do som de acerto agora produzem duas vozes. O ouvido não percebe a diferença, e o resto da mixagem sobrevive.
Cada receita tem o pico normalizado. O quanto um som é alto em relação a outro é decidido na tabela de receitas, não pelo volume de cada camada, então ajustar como um som é construído não muda, sem ninguém perceber, o volume com que ele toca.
Há um limitador na saída master. Quarenta vozes de um som com pico em 0,3 somam muito mais do que o máximo, e o que um navegador faz acima do máximo é distorção audível. Um limitador suave mantém a soma dentro.
Silenciar e abaixar são coisas diferentes
Mais uma regra, aprendida a duras penas num jogo anterior. Quando a página precisa que o jogo fique quieto (durante um anúncio, por exemplo), o jogo abaixa: o som some aos poucos e volta aos poucos quando acaba. Quando o jogador aperta o mudo, o jogo fica mudo. São dois interruptores separados. Se forem um só, o fim de um anúncio tira do mudo um jogador que pediu silêncio. Isso também é testado no navegador: um mudo ativado durante um abaixamento sobrevive ao fim dele.
A lição geral
Gerar assets em código costuma ser discutido em termos de tamanho. O argumento mais forte é que qualquer coisa gerada por uma função pura pode ser testada como qualquer outro código, e o som é uma das partes menos testadas da maioria dos jogos. Se um som não pode ser verificado por uma máquina, uma hora ele vai quebrar sem ninguém perceber.
Jogue Strandbreak Online — com o som ligado.
