Instalação de plugins: Antes de comandos de configuração ou atualização, siga as regras de execução de plugin quando esta skill estiver dentro de um plugin HyperFrames. Instalações independentes mantêm as instruções de atualização abaixo.
HyperFrames Audio
Uma mixagem é um conjunto de relacionamentos, não uma pilha de processadores. Duas faixas que soam bem isoladamente podem ser inaudíveis juntas, e a correção quase nunca é "abaixar uma" — é descobrir pelo que elas estão competindo e dar isso a quem precisa. Cada ferramenta aqui existe para expressar um desses relacionamentos.
Os efeitos residem no elemento como data-fx-chain, e a pré-visualização e a renderização usam o mesmo Web Audio Graph — o estúdio em um contexto ao vivo, o motor em um contexto offline dentro do navegador que ele já dirige. Há uma única implementação de cada efeito, então o que você ouve enquanto ajusta é o que será gravado. Você nunca ajusta duas vezes.
A temporização de clipes permanece em /hyperframes-core: cortes de áudio/vídeo e intervalos de origem usam data-start, data-duration e data-media-start, e crossfades sobrepõem clipes em faixas diferentes. Esta skill lida com fade-in/fade-out de faixa posicionada, envelopes de crossfade, ganho de faixa/volume de faixa, automação de volume e efeitos, ducking/voiceover carve e a cadeia de efeitos. /media-use lida com obtenção, geração e pré-processamento.
A constante data-playback-rate (0.1..10) é segura para renderização de imagem e som com preservação de tom quando elementos de áudio/vídeo correspondentes usam a mesma temporização, deslocamento de origem e taxa. Uma rampa de velocidade é uma faixa rate em data-automation (veja docs/reference/speed-ramps); ela prevalece sobre a constante e mantém o tom na pré-visualização e na renderização. O HyperFrames não fornece sincronização automática de forma de onda ou correção de deriva. Para receitas copiáveis de corte/crossfade/re-temporização, use /hyperframes-core → references/creator-editing-recipes.md.
Três atributos carregam tudo, no próprio elemento de áudio/vídeo — ou, para os dois primeiros, em um barramento <hf-audio-group> (veja "Um barramento para muitas faixas"):
| Atributo | Contém |
|---|---|
data-fx-chain | os efeitos, na ordem de sinal |
data-automation | envelopes no volume desta faixa ou em seus parâmetros de efeito |
data-fx-carve | as configurações da escultura, para que possa ser rederivada |
As famílias de efeitos disponíveis são ganho, EQ (passa-altas, passa-baixas, pico, prateleiras), compressor, limitador, gate, saturar, delay, reverb, chorus, phaser e bitcrush.
JSON exato para cada um, e as regras que uma faixa deve satisfazer: references/attributes.md.
Cada efeito com seus parâmetros, intervalos e unidades: references/fx-registry.md.
Como descobrir o que está errado com um arquivo que você não pode ouvir: references/diagnosis.md.
Presets, trabalhos nomeados e perfis de um knob, além de uma tabela de sintoma para correção: references/presets.md — leia isso antes de construir uma cadeia manualmente, porque um dos presets ou trabalhos nomeados geralmente já nomeia o problema.
Como tudo se encaixa
Duas superfícies de autoria escrevem esses atributos; dois tempos de execução os leem através dos mesmos construtores. Esse meio compartilhado é o motivo pelo qual a pré-visualização prevê a renderização.
flowchart TB
voice["faixa de voz<br/>arquivo de mídia"]
bed["base musical<br/>arquivo de mídia"]
subgraph AUTHOR["Autoria — as únicas coisas que escrevem atributos"]
panel["Studio<br/>Controle de voiceover carve"]
script["scripts/carve.mjs<br/>detecta o par"]
analysis["core/audioCarve.ts<br/>carveProfile · analyseCarveBands<br/>analyseCarveDuck · analyseCarveDynamics"]
panel --> analysis
script --> analysis
end
voice --> analysis
bed --> analysis
subgraph ATTRS["Escrito no elemento da base musical"]
carveAttr["data-fx-carve<br/>fontes · intensidade"]
chainAttr["data-fx-chain<br/>pico xN + ganho, marcado fromCarve"]
autoAttr["data-automation<br/>uma faixa por parâmetro esculpido"]
end
analysis --> carveAttr
analysis --> chainAttr
analysis --> autoAttr
subgraph SHARED["Uma implementação, lida por ambos"]
build["audioFxGraph.ts · buildFxChain"]
sched["audioFxAutomation.ts · scheduleChainAutomation"]
end
chainAttr --> build
autoAttr --> sched
build --> preview["Pré-visualização<br/>AudioContext ao vivo<br/>attachElementFxChain"]
sched --> preview
build --> render["Renderização<br/>OfflineAudioContext no navegador headless<br/>applyAudioFxChain"]
sched --> render
preview --> heard["o que você ouve enquanto ajusta"]
render --> wav["WAV processado<br/>+ chainTailSeconds para que a mixagem deixe a cauda passar"]
wav --> mix["motor · audioMixer<br/>faixa de volume assada no PCM aqui, não no grafo"]
mix --> out["a mixagem renderizada"]
edit["editando o atributo durante a reprodução"] -.->|MutationObserver| preview
As configurações da escultura nunca são lidas durante a reprodução — a cadeia e as faixas que ela produziu são o que toca. data-fx-carve existe para que a intensidade possa ser alterada em uma escultura existente, em vez de ser adivinhada de volta a partir dos filtros.
Dentro de uma base musical esculpida, o sinal passa primeiro pelos cortes, depois pelo ajuste de nível, depois por tudo que você construiu — que é o motivo pelo qual um limitador que você adiciona ainda atua como o teto final:
flowchart LR
src["base musical decodificada"] --> p1["pico<br/>400 Hz"]
p1 --> p2["pico<br/>1 kHz"]
p2 --> p3["pico<br/>1.6 kHz"]
p3 --> g["ganho<br/>ajuste de nível"]
g --> hand["seus próprios efeitos<br/>ex.: limitador"]
hand --> dest["ganho da faixa, depois saída"]
l1["faixa fx.n1.gain"] -.->|"envelope do nível da voz<br/>naquela banda"| p1
l4["faixa fx.n4.gain"] -.->|"o quanto a base<br/>abaixa no geral"| g
Primeiro, descubra o que está errado
A tabela abaixo parte de "soa encorpado" — o que pressupõe que alguém já ouviu e disse isso. Ao receber um arquivo e "consertar isso", você não tem essa frase e não pode ouvir, então precisa medir. Uma regra governa tudo:
O espectro absoluto de uma única voz desconhecida não pode ser diagnosticado. Formantes são ±10 dB, fundamentais variam de 85 a 255 Hz, e as frases caem 5–6 dB à medida que terminam. Cada uma dessas coisas parece um defeito por si só, e todas elas são o falante.
Portanto, compare, e compare com algo dentro do mesmo arquivo: o original limpo se existir, caso contrário, as pausas — o que for audível em uma lacuna é aditivo, e o espectro da lacuna é o canal, não a voz. Comparar com um espectro médio publicado ou uma voz de controle sintetizada não funciona: dois falantes diferem mais do que a maioria dos defeitos, e ambas as respostas erradas na avaliação por trás desta orientação vieram exatamente disso.
Quando não há original e nem silêncio utilizável, um defeito tonal estático é genuinamente subdeterminado. Diga isso e ofereça as leituras que se encaixam, em vez de escolher uma e construir uma cadeia nela.
Comandos, armadilhas e receitas práticas: references/diagnosis.md. Leia antes de diagnosticar um arquivo que ninguém descreveu.
Comece pelo sintoma
Depois de saber a banda e o tipo, nomeie o que está errado com o áudio. A maioria dos áudios ruins é um ou dois destes, e cada um tem uma resposta pronta:
| Parece que | Use |
|---|---|
| Zumbido ou ruído grave por baixo | rumble-cut, ou um highpass a 80 Hz |
| Encorpado, peitoral | Tame Boominess trabalho (200 Hz) |
| Abafado, atrás de papelão | Reduce Mud trabalho (250 Hz) |
| Palavras difíceis de entender | Add Clarity trabalho (3 kHz), ou escultura base musical |
| Áspero e cansativo | Soften Harshness trabalho (3.2 kHz) |
| Algumas palavras muito mais altas que outras | Evenness em um compressor, ou Even Out Levels |
| Ruído ambiente entre frases | room-gate |
| Voz e música competindo | Voiceover carve — não um EQ em nenhum dos dois |
| Seco, gravado em lugar nenhum | room-tight ou room-natural |
| Apenas "amador" | voice-clean, que é quatro dos acima em ordem |
Catálogo completo, o que cada preset contém, o vocabulário de bandas e o que é deliberadamente NÃO coberto (de-essing, remoção de ruído, correspondência de tom): references/presets.md.
Subtraia antes de adicionar, nivele depois de filtrar, relacionamentos depois do nível, caráter e teto por último. Cada etapa muda o que a próxima ouve — um compressor configurado antes de um passa-altas gasta seu tempo perseguindo ruídos graves.
Escolha uma família pelo problema, não pelo nome
Filtros (highpass, lowpass, peaking, lowshelf, highshelf) decidem quais frequências uma faixa pode ocupar. Esta é a primeira ferramenta para colisões entre duas fontes, porque as colisões acontecem em bandas: uma base musical e uma voz querem ambas 1–3 kHz, e tirar isso da base custa muito menos à base do que abaixar tudo custa à mixagem. Um passa-altas em uma voz é a correção padrão para ruídos graves; um passa-baixas escurece ou abafa deliberadamente.
Dinâmicos (gain, compressor, limiter, gate) decidem como o nível de uma faixa se comporta ao longo do tempo. A compressão diminui a distância entre o alto e o baixo para que as partes baixas possam subir. Um limitador é um teto — não molda nada, garante que nada passe. Um gate remove o que está abaixo de um limiar, que é como se silencia o ruído ambiente entre frases. gain é um estágio de nível simples, e é o que uma faixa de automação monta quando uma faixa precisa se mover.
Não lineares (saturate, bitcrush) mudam a forma da onda, o que adiciona harmônicos que não estavam lá. Use quando uma faixa precisar de caráter ou aspereza em vez de correção — e lembre-se de que é generativo: torna uma fonte fina mais densa, não mais limpa.
Tempo (delay, reverb, chorus, phaser) coloca uma faixa em um espaço ou dá largura a ela. Estes são os que mais facilmente estragam uma mixagem, porque uma cauda ou uma cópia desafinada ocupa o mesmo espaço que uma voz precisa. Use-os na coisa que deve ficar atrás de algo, e mantenha a quantidade de efeito molhado mais baixa do que parece correto isoladamente.
A cadeia é serial: cada efeito processa o que o anterior produziu. Portanto, a filtragem corretiva vai no início, o caráter no meio, e um limitador por último, onde pode realmente atuar como um teto.
Voiceover carve (Escultura de narração)
O problema que resolve. Uma base musical sob uma voz dificulta o acompanhamento da voz. O reflexo é abaixar toda a base, o que funciona, mas custa à base toda a sua presença — a música fica mole durante toda a narração. Mas a voz não precisa de todo o espectro. Ela precisa das poucas bandas que realmente ocupa. A escultura tira apenas essas, e a base mantém suas frequências graves e agudas, então ainda é música enquanto a voz ainda é inteligível.
É um relacionamento, não um efeito. As configurações ficam na base — a faixa que é processada — e nomeiam as vozes para ouvir, exatamente como um compressor sidechain faz: você seleciona a faixa que fica mais baixa e escolhe o que a deixa mais baixa. Nunca coloque uma escultura em uma faixa de voz. Uma voz esculpida contra si mesma é um erro, não uma escolha sutil de mixagem.
Cada voz, não apenas uma delas. sources é uma lista, porque uma base geralmente toca sob uma sequência inteira — um narrador, uma resposta de entrevista, um segundo apresentador. Elas são somadas no próprio relógio da base antes que qualquer coisa seja medida (mixCarveSources), então uma análise cobre todas elas: as bandas vêm de toda a fala que existe, e os envelopes sobem onde quer que algo esteja acontecendo. Vozes que nunca tocam enquanto a base toca são deixadas de fora; elas não podem mascará-la.
Uma escultura contra mais de um id de clipe está errada. Agrupe os clipes e faça a escultura contra o grupo. Isso é um invariante, não uma dica. Nomear clipes um por um tem que estar exaustivamente correto e só permanece correto até a próxima edição — um quarto clipe de narração adicionado depois toca fora do conhecimento da escultura, e a base falha em abaixar sob ele silenciosamente. Nomear o grupo resolve a associação no momento da análise, então um clipe adicionado ao grupo depois é coberto sem tocar em sources:
<!-- agrupe a narração, depois faça a escultura da base contra o grupo -->
<audio id="vo-intro" data-audio-group="voz" …></audio>
<audio id="vo-middle" data-audio-group="voz" …></audio>
<audio id="vo-outro" data-audio-group="voz" …></audio>
<audio id="musica" data-fx-carve='{"enabled":true,"sources":["voz"],"strength":0.8}' …></audio>
Uma lista sources nomeando dois ou mais ids de clipe simples em vez de um grupo é detectada pela regra de lint audio_carve_ungrouped_sources — ainda funciona, mas é a versão que silenciosamente se degrada quando um clipe é adicionado.
Mantenha o grupo de escultura como um grupo de voz: sem base musical, sem SFX, sem música. Um id de grupo em sources resolve para todos os membros atuais em cada análise, então o grupo que você nomeia é o grupo que você obtém depois — não as faixas que foram medidas quando foi escrito. Duas maneiras pelas quais isso morde:
- A base musical em seu próprio grupo de origem. Ela é passada para si mesma como uma voz e esculpida contra seu próprio conteúdo — a regra "nunca esculpir uma faixa contra si mesma" chegando uma reanálise depois.
- Um clipe SFX ou de música no grupo de voz. Ele entra no sidechain na próxima análise e a base começa a abaixar sob um whoosh, mesmo que a execução que escreveu o atributo nunca o tenha medido.
Ambos são invisíveis no momento em que a escultura é escrita: a análise soma as vozes que detectou e nunca passa pela resolução do grupo, então a primeira passagem é genuinamente correta e apenas a próxima está errada. Portanto, dê a cada função seu próprio grupo — musica para a base, voz para a narração, sfx para os efeitos sonoros — e mantenha o grupo nomeado em sources contendo apenas vozes.
carve.mjs se recusa a escrever a forma de grupo quando vê qualquer um dos casos, registra ids de clipe e diz em stderr qual membro o bloqueou. A regra audio_carve_ungrouped_sources então aponta para o arranjo.