5. Do texto ao som
▶ Abrir no Aratu para ouvir e mudar os exemplos
Quando você edita, o texto passa por estas etapas, cada uma num módulo do compilador (escrito em Rust e levado ao navegador como WebAssembly):
- Léxico. O texto é cortado em linhas, blocos e palavras.
- Pré-leitura. Motivos, séries, listas e o tom são recolhidos primeiro, para que uma linha possa usá-los de qualquer lugar do texto.
- Análise sintática (parse). Cada linha vira uma declaração numa árvore de sintaxe (AST), com o lugar exato onde cada pedaço está escrito, para as mensagens e para acender as notas.
- Modelo. As declarações viram partes, linhas, padrões, seções e ordens, com as conferências: se cada compasso cabe na fórmula, se os nomes existem.
- Desenrolar. Ritornelos, saltos,
%ex4viram uma sequência simples de compassos. - Dinâmica e tempo. Cada nota recebe a sua força, e as posições viram segundos pelo mapa de andamento. As posições são frações exatas: uma tercina é 1/3 de tempo, sem arredondar.
- Agendamento (scheduling). Para os compassos pedidos, saem os eventos: cada nota, cada batida, cada mudança de parâmetro, com o instante em segundos.
O agendamento é determinístico: o mesmo texto, a mesma semente e os mesmos compassos de partida dão sempre os mesmos eventos. Por isso o tocador pode pedir um compasso de cada vez, um pouco antes de ele soar, e uma edição pode entrar no compasso seguinte sem que nada recomece.
Os eventos vão para o motor de áudio. Os sons gravados e as baterias tocam pelo motor do Manguebyte (um AudioWorklet que roda WebAssembly); os outros, pelo motor provisório feito com o Web Audio do navegador.