Tema 8-bit: Sons
Insert coin. Programe como se estivesse num fliperama.
Extensão opcional que adiciona pequenos efeitos sonoros 8-bit (chiptune) ao VS Code. Foi feita para acompanhar o Arcade Theme, mas funciona com qualquer tema.
Sons curtos, em volume baixo, gerados com ondas quadradas e triangulares como nos consoles de 8 bits. Nada de MP3 pesado, nada de servidor: oito arquivos .wav de menos de 1 s cada.
Sons e eventos
| Som |
Quando toca |
Como soa |
power-on |
Ao iniciar o VS Code |
Arpejo ascendente C4-E4-G4-C5 |
coin |
Ao salvar um arquivo |
Moeda de fliperama (B5 → E6) |
hit |
Quando a quantidade de erros de um arquivo aumenta |
Golpe: varredura descendente com ruído |
clear |
Quando os erros de um arquivo aberto chegam a zero |
"Ding" suave em onda triangular (C6-E6-G6-C7) |
success |
Comando do terminal ou tarefa termina com código 0 |
Corrida rápida E5-G5-C6-E6 e G6 segurado |
game-over |
Comando do terminal ou tarefa termina com erro |
Três notas descendentes e um C4 grave com vibrato |
level-up |
Servidor de desenvolvimento no ar (imprimiu a URL local ou "ready") |
Fanfarra: corrida até G6, repetição e C7 de resolução |
warp |
Sessão de depuração iniciada (F5) |
Varredura ascendente 200 → 1600 Hz e um "blip" em E6 |
Cada evento tem a sua própria chave nas configurações, além da chave geral. Veja Configuração.
Terminal: sucesso, game over e level up
É aqui que a extensão vira um companheiro de verdade. Ela escuta o terminal integrado e as tarefas do VS Code:
npm run build # terminou bem → success
npm test # testes quebraram → game-over
npm run dev # servidor subiu e imprimiu http://localhost:5173 → level-up
npm run dev # script não existe / porta ocupada / crash → game-over
Como funciona:
- Comandos no terminal integrado usam a
integração com o shell
do VS Code (bash, zsh, fish e PowerShell; ligada por padrão desde a versão 1.93).
Quando um comando termina, a extensão recebe o código de saída:
0 toca
success, qualquer outro toca game-over.
- Só comandos que casam com
tema8bit.sons.terminal.comandos contam
(por padrão: npm, pnpm, yarn, bun, node, python, pytest,
cargo, go, make, mvn, gradle, dotnet, docker, flutter,
git push/pull/clone/... etc.). Um ls ou cd nunca faz barulho. A linha
é analisada trecho a trecho (cd api && npm test testa npm test) e ignora
prefixos como sudo, time e variáveis (PORT=3000 npm run dev).
- Sucessos em menos de
tema8bit.sons.terminal.duracaoMinimaMs (1 s por
padrão) ficam em silêncio: node -v não merece fanfarra. Falhas tocam
sempre, mesmo instantâneas (um npm run dev sem script dev avisa na
hora).
- Interromper um comando com Ctrl+C (códigos 130/137/143) não é falha:
silêncio.
- Servidores de desenvolvimento (
npm run dev, npm start, vite,
next dev, ng serve, flask run, uvicorn, rails s, cargo run,
docker compose up...; padrão em tema8bit.sons.servidorDev.comandos) têm
a saída observada. Assim que aparece uma URL local (http://localhost:3000,
http://127.0.0.1:8000) ou uma frase como ready in, listening on,
compiled successfully (padrão em tema8bit.sons.servidorDev.prontoQuando),
toca level-up e a extensão para de ler. Quando você derruba o servidor
depois, não toca nem success nem game-over: parar era a intenção.
- Tarefas (Terminal > Run Task, Run Build Task,
tasks.json) passam
pelos mesmos sons via tasks.onDidEndTaskProcess, sem o filtro de comandos:
se você rodou uma tarefa, foi de propósito.
Tudo o que a extensão decide (qual comando, qual código de saída, qual som)
fica registrado no painel de saída Tema 8-bit (View > Output).
Erros: golpe e limpo
- Só diagnósticos com severidade Error contam; avisos e informações não
disparam nada.
- Erros que já existiam não contam: na primeira vez que um arquivo aparece
nos diagnósticos (ao abrir um projeto ou um arquivo quebrado), a contagem
vira apenas a linha de base. Só aumentos a partir daí tocam
hit.
- Quando um arquivo que tinha erros chega a zero, toca
clear. Fechar um
arquivo com erros não conta como corrigir (alguns servidores de linguagem
zeram os diagnósticos ao fechar).
- Se no mesmo evento um arquivo ganhou erros e outro ficou limpo, vence o
golpe: algo ainda está quebrado.
hit e clear tocam no máximo uma vez a cada 1,5 s, e nenhum som repete em
menos de 300 ms, para não virar uma metralhadora durante a digitação.
Configuração
| Configuração |
Tipo |
Padrão |
Descrição |
tema8bit.sons.ativos |
boolean |
true |
Liga/desliga todos os sons. |
tema8bit.sons.eventos.iniciar |
boolean |
true |
power-on ao iniciar. |
tema8bit.sons.eventos.salvar |
boolean |
true |
coin ao salvar. |
tema8bit.sons.eventos.erroNovo |
boolean |
true |
hit em novos erros. |
tema8bit.sons.eventos.errosCorrigidos |
boolean |
true |
clear quando os erros zeram. |
tema8bit.sons.eventos.terminal |
boolean |
true |
success / game-over em comandos e tarefas. |
tema8bit.sons.eventos.servidorDev |
boolean |
true |
level-up quando o servidor dev sobe. |
tema8bit.sons.eventos.depuracao |
boolean |
true |
warp ao iniciar a depuração. |
tema8bit.sons.terminal.comandos |
string |
regex com npm, cargo... |
Quais comandos do terminal geram som. Vazia = nenhum. |
tema8bit.sons.terminal.duracaoMinimaMs |
number |
1000 |
Sucessos mais rápidos que isso ficam mudos. |
tema8bit.sons.servidorDev.comandos |
string |
regex com dev, vite... |
Quais comandos são servidores dev (têm a saída observada). |
tema8bit.sons.servidorDev.prontoQuando |
string |
regex com URL local, ready |
O que, na saída, significa "no ar". |
As configurações são lidas a cada evento: basta desmarcar a caixa em
Configurações > Extensões > Tema 8-bit: Sons (ou editar o settings.json)
para o efeito ser imediato, sem reiniciar. As regex não diferenciam
maiúsculas de minúsculas; uma regex inválida é ignorada e registrada no painel
de saída.
Exemplo para quem só quer os sons do terminal:
{
"tema8bit.sons.eventos.salvar": false,
"tema8bit.sons.eventos.erroNovo": false,
"tema8bit.sons.eventos.errosCorrigidos": false,
"tema8bit.sons.terminal.comandos": "^(npm|pnpm|cargo)(\\s|$)"
}
Comandos
Abra a paleta de comandos (Ctrl+Shift+P / Cmd+Shift+P) e digite Tema 8-bit:
| Comando |
ID |
O que faz |
| Tema 8-bit: Testar sons (toca todos) |
tema8bit.sons.testar |
Toca os oito sons em sequência para validar o áudio. |
| Tema 8-bit: Tocar um som... |
tema8bit.sons.tocar |
Lista os sons e toca só o escolhido. |
| Tema 8-bit: Ligar/desligar sons |
tema8bit.sons.alternar |
Inverte tema8bit.sons.ativos (configuração do usuário). |
Dica: associe tema8bit.sons.alternar a um atalho para silenciar tudo em
reuniões.
Como o som é reproduzido
- Linux e macOS: a extensão usa o pacote
play-sound, que delega a
reprodução ao primeiro reprodutor de linha de comando encontrado, nesta
ordem: aplay (ALSA), paplay (PulseAudio), pw-play (PipeWire),
afplay (macOS, já vem instalado), play (sox), mplayer, cvlc.
Só entram reprodutores que tocam .wav (mpg123/mpg321 ficam de fora,
porque só decodificam MPEG).
- Windows: a extensão chama o PowerShell diretamente, sem janela
(
-WindowStyle Hidden), com System.Media.SoundPlayer (.PlaySync()).
Não precisa instalar nada.
Se nenhum reprodutor for encontrado, instale um deles (no Debian/Ubuntu, por
exemplo: sudo apt install alsa-utils ou pulseaudio-utils). Se o som não
puder ser reproduzido, a extensão registra o motivo no painel de saída
Tema 8-bit e mostra um único aviso por sessão. Nunca trava o editor.
A extensão declara "extensionKind": ["ui"]: em sessões remotas (Remote-SSH,
WSL, Dev Containers, Codespaces) ela roda sempre na máquina local, onde está a
placa de som, e não no servidor.
Como os sons são gerados / como trocá-los
Os oito arquivos em sounds/ são gerados por
scripts/gen_sounds.py, que usa somente a biblioteca
padrão do Python (wave + math + struct):
python3 scripts/gen_sounds.py # gera e valida todos
python3 scripts/gen_sounds.py coin warp # só alguns
python3 scripts/gen_sounds.py --list # lista os sons e quando tocam
# ou
npm run sounds
Características:
- 22050 Hz, 16-bit, mono; ondas quadradas (timbre NES) e triangular (
clear);
- pico de amplitude ≤ 0,25 (volume baixo por padrão; mude
PEAK no script
para regenerar mais alto ou mais baixo);
- cada um com no máximo 1 s e fade-out linear curto para evitar cliques;
- o ruído do
hit usa um gerador pseudo-aleatório determinístico (LCG), então
os arquivos gerados são sempre idênticos byte a byte.
O script também valida cada .wav gerado (canais, largura de amostra, taxa,
duração e pico) e imprime o resultado.
Para trocar os sons, substitua os arquivos em sounds/ por outros .wav com o
mesmo nome (coin.wav, game-over.wav...). Duas boas fontes:
- sfxr.me: gerador de efeitos 8-bit no navegador (exporte
como WAV);
- freesound.org: procure por sons com licença CC0.
O ícone (images/icon.png) é gerado por scripts/gen_icon.py
a partir do pixel art em images/music.png (npm run icon; requer Pillow).
Desenvolvimento
- Abra a pasta
tema8bit-sounds/ no VS Code.
- Rode
npm install (instala play-sound e os tipos do VS Code).
- Pressione F5 (configuração Extension em
.vscode/launch.json).
Uma nova janela Extension Development Host abre com a extensão carregada;
você deve ouvir o power-on.
- Salve um arquivo (
coin); introduza um erro de sintaxe num arquivo JS/TS
(hit) e corrija (clear); no terminal integrado rode npm run build
(success), npm run nao-existe (game-over) e npm run dev num projeto
com servidor (level-up); pressione F5 num projeto depurável (warp).
Checagens
npm run check # sintaxe do extension.js + testes dos filtros de comando
Os testes em scripts/test_commands.js exercitam as regex padrão de
package.json contra linhas de comando reais (PORT=3000 npm run dev,
cd api && npm test, git status...), sem precisar abrir o VS Code.
npm install
npx --yes @vscode/vsce ls # confere o que vai para o pacote
npm run package # gera tema8bit-sounds-<versão>.vsix
Atenção: node_modules/ precisa ir no .vsix, porque play-sound é uma
dependência de tempo de execução (o vsce inclui só as dependências de
produção). Por isso ele não está no .vscodeignore (mas está no .gitignore).
Para instalar o pacote localmente:
code --install-extension tema8bit-sounds-0.2.0.vsix
Combina com
Esta extensão foi desenhada para acompanhar o
Arcade Theme (Pac-Man,
Pac-Man Soft e Neon). Os dois são independentes: você pode usar só o tema, só
os sons, ou ambos.
Licença
MIT © nthiago_Dev