Decoder em JavaScript (Web Audio + Canvas) para reconstruir imagens do Voyager Golden Record a partir do áudio digitalizado (MP3/PCM).
Código Fonte: https://maltegruber.github.io/voyager-record-decoder
Importante: configure sua saída de áudio em 44.1 kHz. Em outras taxas, o “lock” pode falhar e as imagens podem aparecer instáveis.
Este projeto:
- baixa (ou carrega) o áudio do Golden Record (MP3),
- converte para PCM float (canais L/R),
- detecta pulsos de sync,
- reconstrói as linhas de imagem e desenha no Canvas.
Além de manter o decoder, a versão atual inclui:
- Layout responsivo (desktop/tablet/mobile)
- Seções claras: Decoder, Preview, Controles e Explicação técnica
- Visual “card-based”, com foco em usabilidade e leitura
- Controles de contraste e gamma
- Suavização (filtro leve) para reduzir ruído sem “lavar” demais a imagem
- Ajuste para estabilizar intensidade (reduz os “saltos” quando há variação abrupta)
- Abra a página do projeto (Demo) ou rode localmente.
- Garanta 44.1 kHz na configuração de áudio do sistema.
- Inicie o decoding e aguarde o “lock”.
- Ajuste:
- Contraste (1.2–1.8 costuma ajudar)
- Gamma (0.8–1.1 é um bom intervalo)
- Suavização (1–3 para reduzir ruído)
- Download / carregamento do áudio
- Decodificação para PCM
- Separação dos canais Left/Right
- Varredura de sync pulses
- Reconstrução linha-a-linha e renderização no Canvas
O método atual é propositalmente “cru”:
- varre o array do canal em busca de picos
- identifica sync quando um pulso é maior que a vizinhança local
Funciona “na maioria das vezes”, mas sofre com artefatos do arquivo digitalizado.
Durante a digitalização, o áudio aparenta ter passado por algum filtro (provável DC-blocking / high-pass). Isso causa:
- tendência do sinal a “voltar para zero” em trechos com pouca variação,
- “puxões” do nível DC após mudanças bruscas,
- distorções visíveis na imagem reconstruída (skew/arrasto).
Hipóteses levantadas:
- filtro de bloqueio DC do gravador durante a digitalização
- possível influência de RIAA filtering
- ou algum detalhe do processo de codificação
Esse comportamento já foi observado por outras pessoas também (exemplo clássico: Boing Boing).
O Voyager Golden Record contém imagens RGB armazenadas como três imagens separadas (um canal por vez).
Este decoder não combina automaticamente esses três frames em uma imagem RGB final.
Roadmap sugerido:
- detectar sequências R/G/B,
- alinhar temporalmente as três camadas,
- combinar em uma imagem composta.
Se a imagem estiver “apagada”:
- aumente Contraste
- reduza um pouco o Gamma
Se a imagem estiver “chuviscada”:
- aumente Suavização (com moderação)
Uma estrutura comum (pode variar conforme seu fork):
index.html— página principal (UI + canvas)styles.css— estilos e responsividadejs/decoder.js— pipeline principal (PCM → sync → linhas → render)audio.js— carregamento/decodificação do áudiorender.js— desenho no canvas (imagem, waveform, overlays)utils.js— helpers (normalização, LUT, filtros, etc.)
assets/— ícones, imagens de UI, arquivos auxiliaresdoc/— documentação e figuras técnicas (ex.:voyager-lp.png,numbers.png)README.md— este arquivoLICENSE— licença do repositório
- Malte Gruber — implementação original do decoder e publicação da demo em GitHub Pages.
- NASA/JPL – Voyager Golden Record — contexto, missão e acervo histórico/cultural.
- Boing Boing (2017) — “How to decode the images on the Voyager Golden Record” (post/relato popular citado no README original).

