HyperFrames Audio
Un mix est un ensemble de relations, pas une pile de processeurs. Deux pistes qui sonnent bien individuellement peuvent être inécoutables ensemble, et la solution n'est presque jamais de "baisser l'une" — il s'agit de trouver sur quoi elles se battent et de le donner à celle qui en a besoin. Chaque outil présent ici existe pour exprimer une de ces relations.
Les effets vivent sur l'élément en tant que data-fx-chain, et la prévisualisation
et le rendu exécutent le même graphe AudioContext — le studio dans un contexte
en direct, le moteur dans un contexte hors ligne à l'intérieur du navigateur
qu'il pilote déjà. Il n'y a qu'une seule implémentation de chaque effet,
donc ce que vous entendez en déplaçant la tête de lecture est ce qui sera écrit.
Vous ne réglez jamais deux fois.
Trois attributs portent tout, tous sur l'élément audio/vidéo lui-même :
| Attribut | Contient |
|---|---|
data-fx-chain | les effets, dans l'ordre du signal |
data-automation | les enveloppes sur le volume de cette piste ou ses paramètres d'effet |
data-fx-carve | les propres réglages de l'évidement, afin qu'il puisse être redérivé |
Le JSON exact pour chacun, et les règles qu'une piste doit satisfaire : references/attributes.md.
Chaque effet avec ses paramètres, plages et unités : references/fx-registry.md.
Comment déterminer ce qui ne va pas avec un fichier que vous ne pouvez pas entendre :
references/diagnosis.md.
Presets, tâches nommées et profils à un bouton, plus un tableau symptôme-à-correction :
references/presets.md — lisez-le avant de construire une chaîne à la main, car
l'un des presets ou des tâches nommées nomme généralement déjà le problème.
Comment tout s'assemble
Deux surfaces de création écrivent ces attributs ; deux environnements d'exécution les lisent via les mêmes constructeurs. Ce noyau partagé est la raison pour laquelle la prévisualisation prédit le rendu.
flowchart TB
voice["piste voix<br/>fichier média"]
bed["piste fond musical<br/>fichier média"]
subgraph AUTHOR["Création — les seules choses qui écrivent les attributs"]
panel["Studio<br/>Contrôle d'évidement de la voix off"]
script["scripts/carve.mjs<br/>détecte la paire, dynamique par défaut"]
analysis["core/audioCarve.ts<br/>carveProfile · analyseCarveBands<br/>analyseCarveDuck · analyseCarveDynamics"]
panel --> analysis
script --> analysis
end
voice --> analysis
bed --> analysis
subgraph ATTRS["Écrits sur l'élément du fond musical"]
carveAttr["data-fx-carve<br/>source · strength · dynamic"]
chainAttr["data-fx-chain<br/>peaking xN + gain, tagué fromCarve"]
autoAttr["data-automation<br/>une piste par paramètre évidé"]
end
analysis --> carveAttr
analysis --> chainAttr
analysis --> autoAttr
subgraph SHARED["Une seule implémentation, lue par les deux"]
build["audioFxGraph.ts · buildFxChain"]
sched["audioFxAutomation.ts · scheduleChainAutomation"]
end
chainAttr --> build
autoAttr --> sched
build --> preview["Prévisualisation<br/>AudioContext en direct<br/>attachElementFxChain"]
sched --> preview
build --> render["Rendu<br/>OfflineAudioContext dans le navigateur headless<br/>applyAudioFxChain"]
sched --> render
preview --> heard["ce que vous entendez en déplaçant la tête de lecture"]
render --> wav["WAV traité<br/>+ chainTailSeconds pour que le mix laisse passer la queue"]
wav --> mix["moteur · audioMixer<br/>la piste de volume est intégrée dans le PCM ici, pas dans le graphe"]
mix --> out["le mix rendu"]
edit["modification de l'attribut en cours de lecture"] -.->|MutationObserver| preview
Les propres réglages de l'évidement ne sont jamais lus lors de la lecture — la chaîne et les pistes
qu'il a produites sont ce qui est joué. data-fx-carve existe pour que la force puisse être modifiée
sur un évidement existant au lieu d'être devinée à partir des filtres.
À l'intérieur d'un fond musical évidé, le signal passe d'abord par les creux, puis par l'adaptation de niveau, puis par tout ce que vous avez construit vous-même — c'est pourquoi un limiteur que vous ajoutez agit toujours comme le plafond final :
flowchart LR
src["fond musical décodé"] --> p1["peaking<br/>400 Hz"]
p1 --> p2["peaking<br/>1 kHz"]
p2 --> p3["peaking<br/>1,6 kHz"]
p3 --> g["gain<br/>adaptation de niveau"]
g --> hand["vos propres effets<br/>par ex. limiteur"]
hand --> dest["gain de piste, puis sortie"]
l1["piste fx.n1.gain"] -.->|"enveloppe du niveau de la voix<br/>dans cette bande"| p1
l4["piste fx.n4.gain"] -.->|"à quel point le fond musical<br/>s'efface globalement"| g
Un évidement statique est le même graphe avec des valeurs fixes et aucune piste du tout.
D'abord, déterminer ce qui ne va pas
Le tableau ci-dessous part de "ça sonne sourd" — ce qui suppose que quelqu'un a déjà écouté et l'a dit. Recevoir un fichier avec "corrige ça", vous n'avez pas une telle phrase et vous ne pouvez pas écouter, vous devez donc mesurer. Une règle gouverne tout cela :
Le spectre absolu d'une seule voix inconnue ne peut pas être diagnostiqué. Les formants sont de ±10 dB, les fondamentales vont de 85 à 255 Hz, et les phrases baissent de 5 à 6 dB à mesure qu'elles se terminent. Chacun de ces éléments ressemble à un défaut en soi, et chacun d'eux est le locuteur.
Donc comparez, et comparez à quelque chose dans le même fichier : l'original propre s'il existe, sinon les pauses — tout ce qui est audible dans un silence est additif, et le spectre du silence est celui du canal plutôt que de la voix. Comparer à un spectre moyen publié ou à une voix de contrôle synthétisée ne fonctionne pas : deux locuteurs diffèrent plus que la plupart des défauts, et les deux mauvaises réponses dans l'évaluation derrière ces conseils provenaient exactement de cela.
Lorsqu'il n'y a pas d'original et pas de silence utilisable, un défaut tonal statique est véritablement sous-déterminé. Dites-le et proposez les lectures qui correspondent, plutôt que d'en choisir une et de construire une chaîne dessus.
Commandes, pièges et recettes éprouvées : references/diagnosis.md. Lisez-le
avant de diagnostiquer un fichier que personne n'a décrit.
Partir du symptôme
Une fois que vous connaissez la bande et le type, nommez ce qui ne va pas avec l'audio. La plupart des mauvais audios se résument à un ou deux de ces éléments, et chacun a une réponse intégrée :
| Ça ressemble à | Utilisez |
|---|---|
| Ronflement ou bruit sourd en dessous | rumble-cut, ou un highpass à 80 Hz |
| Sourd, caverneux | Tame Boominess tâche (200 Hz) |
| Étouffé, comme derrière du carton | Reduce Mud tâche (250 Hz) |
| Mots difficiles à comprendre | Add Clarity tâche (3 kHz), ou évidez le fond musical |
| Âpre et fatiguant | Soften Harshness tâche (3,2 kHz) |
| Certains mots beaucoup plus forts que d'autres | Evenness sur un compresseur, ou Even Out Levels |
| Bruit ambiant entre les phrases | room-gate |
| Voix et musique en conflit | Évidement de la voix off — pas un EQ sur l'un ou l'autre |
| Sec, enregistré nulle part | room-tight ou room-natural |
| Juste "amateur" | voice-clean, qui est quatre des éléments ci-dessus en ordre |
Catalogue complet, ce que contient chaque preset, le vocabulaire des bandes, et ce qui
n'est DÉLIBÉRÉMENT PAS couvert (dé-essing, suppression de bruit, adaptation tonale) :
references/presets.md.
Soustrayez avant d'ajouter, égalisez après avoir filtré, réglez les relations après le niveau, le caractère et le plafond en dernier. Chaque étape change ce que la suivante entend — un compresseur réglé avant un filtre passe-haut passe son temps à chasser les grondements.
Choisissez une famille selon le problème, pas le nom
Filtres (highpass, lowpass, peaking, lowshelf, highshelf) décident
quelles fréquences une piste est autorisée à occuper. C'est le premier outil pour
deux sources qui entrent en collision, car les collisions se produisent dans des bandes :
un fond musical et une voix veulent tous deux 1–3 kHz, et retirer cela du fond musical
coûte bien moins au fond musical que de baisser le tout ne coûte au mix. Un filtre
passe-haut sur une voix est la solution standard pour le grondement ; un filtre
passe-bas assombrit ou étouffe délibérément.
Dynamiques (gain, compressor, limiter, gate) décident comment le niveau
d'une piste se comporte dans le temps. La compression réduit la distance entre le fort
et le faible pour que les parties faibles puissent remonter. Un limiteur est un plafond
— il ne façonne rien, il garantit que rien ne dépasse. Un gate supprime ce qui est en
dessous d'un seuil, c'est ainsi que l'on fait taire le bruit ambiant entre les phrases.
gain est un simple étage de niveau, et c'est ce qu'une piste d'automatisation pilote
lorsqu'une piste doit se déplacer pour laisser passer autre chose.
Non linéaires (saturate, bitcrush) modifient la forme d'onde, ajoutant des
harmoniques qui n'étaient pas là. Utilisez-les lorsqu'une piste a besoin de caractère
ou de grain plutôt que de correction — et rappelez-vous qu'il est génératif : il rend
une source fine plus dense, pas plus propre.
Temporels (delay, reverb, chorus, phaser) placent une piste dans un espace
ou lui donnent de la largeur. Ce sont ceux qui risquent le plus de gâcher un mix, car
une queue ou une copie désaccordée occupe la même pièce dont une voix a besoin. Utilisez-les
sur ce qui doit se situer derrière autre chose, et gardez le niveau humide plus bas
que ce qui sonne bien isolément.
La chaîne est en série : chaque effet traite ce que le précédent a produit. Donc le filtrage correctif va tôt, le caractère au milieu, et un limiteur en dernier là où il peut effectivement agir comme un plafond.
Évidement de la voix off
Le problème qu'il résout. Un fond musical sous une voix rend la voix difficile à suivre. Le réflexe est de baisser tout le fond musical, ce qui fonctionne mais coûte au fond musical toute sa présence — la musique devient molle pendant toute la voix off. Mais la voix n'a pas besoin de tout le spectre. Elle a besoin des quelques bandes qu'elle occupe réellement. L'évidement ne prend que celles-ci, et le fond musical garde ses basses et ses aigus, donc il reste de la musique pendant que la voix reste intelligible.
C'est une relation, pas un effet. Les réglages vivent sur le fond musical — la piste qui est traitée — et ils nomment les voix à écouter, exactement comme le ferait un compresseur sidechain : vous sélectionnez la piste qui devient plus silencieuse et choisissez ce qui la rend plus silencieuse. Ne mettez jamais d'évidement sur une piste de voix. Une voix évidée contre elle-même est un bug, pas un choix de mix subtil.
Chaque voix, pas une seule d'entre elles. sources est une liste, car un
fond musical passe généralement sous une séquence entière — un narrateur, une
réponse d'interview, un deuxième présentateur. Elles sont additionnées sur
l'horloge propre du fond musical avant que quoi que ce soit ne soit mesuré (mixCarveSources),
de sorte qu'une analyse les couvre toutes : les bandes proviennent de toute la parole
présente, et les enveloppes montent chaque fois que l'une d'elles se produit. Les
voix qui ne jouent jamais pendant que le fond musical joue sont laissées de côté ;
elles ne peuvent pas le masquer.
Un seul bouton. strength est de 0 à 1 et dérive tout : la profondeur de
la coupe, le nombre de bandes, leur largeur, à quel point favoriser l'intelligibilité
plutôt que l'énergie vocale brute, jusqu'où le niveau peut baisser, et à quel point
viser sous la voix. Ces six paramètres évoluent ensemble dans tout mix réel — un
évidement doux est une coupe peu profonde dans quelques bandes avec peu de ducking,
un évidement dur est plus profond dans plus de bandes avec plus — donc ils sont une
seule relation écrite une fois, dans carveProfile. La valeur par défaut est 0.25
— une atténuation de 6 dB dans trois bandes avec 6 dB de marge de niveau, audible
sans ressembler à un trou. À 0.5, l'atténuation atteint 10 dB, ce qui est le point
où un évidement commence à être perçu comme un effet plutôt que comme de l'espace
pour la voix ; au-dessus, c'est un territoire délibéré pour un fond musical fort
sous une voix faible. 0 est uniquement spectral — une bande, pas d'adaptation
de niveau du tout.
Évidement par défaut. Un fond musical jouant sous une narration veut un évidement ; ce n'est pas une étape de polissage à faire si le temps le permet. Placez les deux pistes, exécutez la commande ci-dessous, écoutez. Ne l'ignorez que lorsqu'il n'y a pas de narration sous laquelle la musique doit se placer — une vidéo musicale, un carton titre, un montage calé sur le morceau.
Il suit toujours la voix. Il n'y a pas de mode statique : une profondeur fixe aplatit le fond musical pendant chaque pause, et une fois que vous avez entendu les deux, il n'y a aucune raison de vouloir cela. Chaque valeur devient une enveloppe du niveau propre de la parole — le silence laisse le fond musical tranquille, un passage fort pousse l'évidement à pleine profondeur — écrite comme une automatisation ordinaire, c'est pourquoi les pistes apparaissent dans la timeline et peuvent être modifiées par la suite.
L'adaptation de niveau en fait partie. Un évidement spectral ne peut pas
corriger un fond musical qui est simplement plus fort que la voix. Ainsi,
l'évidement mesure également à quel point le fond musical est plus fort que la voix
et écrit un étage gain : maintenu à une valeur pour un évidement statique, piloté
par une enveloppe pour un évidement dynamique. Cette enveloppe se relâche
délibérément lentement — la musique qui revient à plein volume instantanément
après qu'un mot se termine sonne comme une machine.
Exécution. Dans Studio, l'évidement est un module en haut de la chaîne d'effets d'une piste — voix, force, dynamique, et l'analyse qu'il a produite, dans une seule carte. Il est présent chaque fois qu'une autre piste pourrait être la voix, et un fond musical avec exactement un candidat au-dessus est évidé par défaut, de manière dynamique, à la force par défaut : c'est ce qu'un fond musical sous une narration veut, et le module est l'endroit où vous le modifiez ou le désactivez. Plusieurs candidats laissent le sélecteur en attente plutôt que de deviner. Headless — la voie lorsque vous créez une composition plutôt que de l'éditer :
node <SKILL_DIR>/scripts/carve.mjs --comp index.html
C'est toute la commande. Elle trouve elle-même la voix et le fond musical, évide dynamiquement à la force par défaut, et affiche ce qu'elle a décidé :
bed music-bed (le nom ressemble à de la musique)
voice narration (seule piste restante)
carve strength 0.25 dynamic
bands 400Hz -6dB q1.4, 1000Hz -3dB q1.4, 1600Hz -3.17dB q1.4
level 216-point envelope, floor -6 dB
Nommez les pistes avec --bed / --voice (répétable) lorsque le choix automatique
est incorrect, --strength pour pousser la force, --dry-run pour voir ce rapport
sans rien écrire.
Comment il sélectionne les pistes. Les noms d'abord, parce que c'est ce que vous
lui avez déjà dit et la réponse est explicable — classifyAudioName dans le core,
le même classifieur utilisé par le sélecteur de Studio, donc ils ne peuvent pas être
en désaccord. Une piste dont l'id ou le nom de fichier ressemble à de la musique
(music, bgm, bed, score…) est le fond musical ; tout le reste qui joue par-dessus
et qui n'a pas une forme de SFX est une voix. Les éléments audio sont préférés : la
vidéo compte seulement lorsqu'aucune piste audio ne reste pour être la voix, ou que
chaque clip B-roll de la composition serait interprété comme quelqu'un parlant.
Il refuse lorsqu'il ne peut pas trancher — deux noms ressemblant à de la musique
ou deux ressemblant à des voix, car forcer l'évidement en devinant produit un mauvais
mix, et la seule issue est de lui donner le nom de la piste.
À quoi cela ressemble : les pistes sont écrites dans la timeline. Les filtres
peaking sont visibles en tant qu'entrées de chaîne ; leur gain est piloté par des
enveloppes dans data-automation afin que le fond musical respire entre les mots.
L'étage de niveau a également sa propre enveloppe. Tout est éditable, tout est
supprimable. Pour revenir à la vitesse de l'audio décodé non traité, effacez les
trois attributs et le nœud de module est supprimé. Pour désactiver l'évidement sur
cette piste mais conserver les réglages et les filtres en tant que piste illustr
ative, supprimez data-fx-carve et les pistes dont les noms commencent par carve:
dans le tableau d'automatisation.
Automatisation
Ce qu'elle est. Une enveloppe est une piste de forme d'onde dans data-automation
qui pilote n'importe quel paramètre connectable du graphe d'effets. Chaque enveloppe
a une cible — soit le volume de la piste entière, soit fx.<index>.<nom du param> —
et un tableau de points [time, value]. Les temps sont en secondes, relatives au
début de la piste. Les valeurs sont dans l'unité du paramètre : le gain en dB, la
fréquence en Hz, le Q sans unité, le wet en ratio 0–1, etc.
Commentaire traduit. Les points sont linéaires, crénelés par défaut, et peuvent être lissés avec un coefficient de traînée optionnel. Les enveloppes sont évaluées au même taux que la fréquence d'échantillonnage du projet pendant le rendu, donc les changements brusques sont audibles comme des clics à moins d'être intentionnels.
{
"lanes": [
{
"target": "volume",
"points": [
[0, -6],
[2, -3],
[4, 0],
[6, -3],
[8, -6]
],
"smooth": 0.1
}
]
}
Ce qu'elle résout. Les enveloppes permettent au mix de changer au fil du temps. La piste de volume est intégrée dans le PCM avant que le mix ne soit assemblé, car le moteur fonctionne en espace audio planaire et n'applique pas de gain de piste en temps réel. L'atténuation d'évidement est une enveloppe sur l'étage de gain de la chaîne d'effets. Toute modification commence ici.
Comment la créer. Dans Studio, l'automatisation est dessinée en mode timeline de
la piste. Headless, via scripts/automate.mjs :
node <SKILL_DIR>/scripts/automate.mjs --comp index.html --target "fx.0.gain" --points "0,-6 1,-3 2,0"
ÉVITEMENT de l'audio
Ne pas utiliser pour les effets sonores qui ont juste besoin d'être plus forts. Un coup de feu n'a besoin ni d'un évidement ni d'une enveloppe ; il a besoin d'un compresseur pour que l'attaque passe, ou d'un limiteur s'il est déjà assez fort. C'est un outil de mixage, pas de dynamique de la source.
Ne pas utiliser lorsque la piste problématique est un battement de boucle qui n'a pas besoin d'interaction.
Ne pas utiliser lorsqu'un fichier audio a des crêtes qui clippent. C'est de la correction de source, pas de la dynamique de mix. Le limiteur est là pour les crêtes que le mix produit, pas pour celles que le fichier contient déjà.
Flux de travail recommandé
- Lisez
references/presets.mdavant de construire quoi que ce soit à la main — la plupart des problèmes ont déjà un nom. - Pour les fonds musicaux sous narration : exécutez d'abord l'évidement, écoutez, ajustez la force si la voix n'est pas assez claire.
- Pour les corrections de piste individuelles : diagnostiquez via
references/diagnosis.md, puis appliquez le preset nommé. - Pour les réglages personnalisés : construisez la chaîne manuellement dans
data-fx-chain, en commençant par les filtres, puis la dynamique, puis le caractère, puis le plafond. - Testez en prévisualisation : l'animation en boucle du fichier audio applique les effets en temps réel, donc écoutez en boucle et modifiez.
- Validez : le rendu écrit exactement ce que la prévisualisation jouait.
Références
| Fichier | Contenu |
|---|---|
references/attributes.md | Spécifications des attributs et règles de piste |
references/fx-registry.md | Tous les effets, paramètres, plages et unités |
references/diagnosis.md | Comment diagnostiquer les défauts audio que vous ne pouvez pas entendre |
references/presets.md | Presets nommés, tâches, profils à un bouton, tableau symptôme → correctif |