Plugin-Installation: Bevor Sie Setup- oder Frische-Befehle ausführen, befolgen Sie die Plugin-Ausführungsregeln, wenn sich diese Fähigkeit innerhalb eines HyperFrames-Plugins befindet. Bei eigenständigen Installationen bleiben die untenstehenden Update-Anweisungen erhalten.
HyperFrames Audio
Ein Mix ist eine Menge von Beziehungen, kein Stapel von Prozessoren. Zwei Spuren, die alleine jeweils richtig klingen, können zusammen ungenießbar sein, und die Lösung ist fast nie "eine herunterdrehen" – es geht darum, herauszufinden, worüber sie streiten, und es dem zu geben, der es braucht. Jedes Werkzeug hier existiert, um eine dieser Beziehungen auszudrücken.
Effekte leben auf dem Element als data-fx-chain, und Vorschau und Rendern verwenden denselben Web Audio Graphen – das Studio in einem Live-Kontext, die Engine in einem Offline-Kontext innerhalb des Browsers, den sie bereits steuert. Es gibt eine Implementierung jedes Effekts, sodass das, was Sie beim Scrubbing hören, auch das ist, was geschrieben wird. Sie stimmen nie zweimal ab.
Das Clip-Timing bleibt bei /hyperframes-core: Audio-/Video-Trimmungen und Quellbereich verwenden data-start, data-duration und data-media-start, und Überblendungen überlappen Clips auf verschiedenen Spuren. Diese Fähigkeit verwaltet platziertes Spur-Ein-/Ausblenden, Überblendungshüllkurven, Spurverstärkung/Spurlautstärke, Lautstärke- und Effektautomation, Ducking/Voiceover-Einschnitt und die Effektkette. /media-use verwaltet Quellen, Generierung und Vorverarbeitung.
Die Konstante data-playback-rate (0.1..10) ist render-sicher für Bild und tonhöhenerhaltenen Ton, wenn übereinstimmende Audio-/Video-Elemente dieselbe Timing-, Quell-Offset- und Rate verwenden. Ein Geschwindigkeitsrampe ist eine rate-Spur in data-automation (siehe docs/reference/speed-ramps); sie überschreibt die Konstante und behält die Tonhöhe in Vorschau und Rendern bei. HyperFrames bietet keine automatische Wellenform-Synchronisation oder Drift-Korrektur.
Für kopierbare Schnitt-/Überblendungs-/Neuzeit-Rezepte verwenden Sie /hyperframes-core → references/creator-editing-recipes.md.
Drei Attribute tragen alles auf dem Audio-/Video-Element selbst – oder, für die ersten beiden, auf einem <hf-audio-group>-Bus (siehe "Ein Bus für viele Spuren"):
| Attribut | Enthält |
|---|---|
data-fx-chain | die Effekte, in Signalreihenfolge |
data-automation | Hüllkurven für die Lautstärke dieser Spur oder deren Effektparameter |
data-fx-carve | die eigenen Einstellungen des Einschnitts, sodass er neu abgeleitet werden kann |
Die ausgelieferten Effektfamilien sind: Verstärkung, EQ (Hochpass, Tiefpass, Spitzenfilter, Shelf-Filter), Kompressor, Begrenzer, Gate, Sättigung, Delay, Hall, Chorus, Phaser und Bitcrush.
Genaues JSON für jeden und die Regeln, die eine Spur erfüllen muss: references/attributes.md.
Jeder Effekt mit seinen Parametern, Bereichen und Einheiten: references/fx-registry.md.
Wie man herausfindet, was mit einer Datei nicht stimmt, die man nicht hören kann: references/diagnosis.md.
Presets, benannte Jobs und Ein-Knopf-Profile, sowie eine Symptom-zu-Fix-Tabelle: references/presets.md – lesen Sie dies, bevor Sie eine Kette von Hand bauen, denn eines der Presets oder benannten Jobs benennt normalerweise bereits das Problem.
Wie es zusammenpasst
Zwei Autoren-Oberflächen schreiben diese Attribute; zwei Laufzeitumgebungen lesen sie durch dieselben Builder. Diese gemeinsame Mitte ist der Grund, warum die Vorschau das Rendern vorhersagt.
flowchart TB
voice["Sprachspur<br/>Mediendatei"]
bed["Musikbett<br/>Mediendatei"]
subgraph AUTHOR["Autoring – das Einzige, was Attribute schreibt"]
panel["Studio<br/>Voiceover-Einschnitt-Steuerung"]
script["scripts/carve.mjs<br/>erkennt das Paar, standardmäßig dynamisch"]
analysis["core/audioCarve.ts<br/>carveProfile · analyseCarveBands<br/>analyseCarveDuck · analyseCarveDynamics"]
panel --> analysis
script --> analysis
end
voice --> analysis
bed --> analysis
subgraph ATTRS["Auf das Bettelement geschrieben"]
carveAttr["data-fx-carve<br/>source · strength · dynamic"]
chainAttr["data-fx-chain<br/>peaking xN + gain, getaggt fromCarve"]
autoAttr["data-automation<br/>eine Spur pro eingeschnittenen Parameter"]
end
analysis --> carveAttr
analysis --> chainAttr
analysis --> autoAttr
subgraph SHARED["Eine Implementierung, von beiden gelesen"]
build["audioFxGraph.ts · buildFxChain"]
sched["audioFxAutomation.ts · scheduleChainAutomation"]
end
chainAttr --> build
autoAttr --> sched
build --> preview["Vorschau<br/>Live AudioContext<br/>attachElementFxChain"]
sched --> preview
build --> render["Rendern<br/>OfflineAudioContext im kopflosen Browser<br/>applyAudioFxChain"]
sched --> render
preview --> heard["was Sie beim Scrubbing hören"]
render --> wav["verarbeitete WAV<br/>+ chainTailSeconds, damit der Mix den Nachhall durchlässt"]
wav --> mix["Engine · audioMixer<br/>Lautstärke-Spur hier im PCM eingebacken, nicht im Graphen"]
mix --> out["der gerenderte Mix"]
edit["Bearbeiten des Attributs während der Wiedergabe"] -.->|MutationObserver| preview
Die eigenen Einstellungen des Einschnitts werden nie bei der Wiedergabe gelesen – die Kette und Spuren, die er erzeugt hat, sind das, was abgespielt wird. data-fx-carve existiert, damit die Stärke an einem bestehenden Einschnitt geändert werden kann, anstatt sie aus den Filtern zurückraten zu müssen.
In einem eingeschnittenen Bett durchläuft das Signal zuerst die Absenkungen, dann den Level-Ausgleich, dann alles, was Sie selbst gebaut haben – weshalb ein von Ihnen hinzugefügter Begrenzer immer noch als letzte Decke fungiert:
flowchart LR
src["dekodiertes Bett"] --> p1["peaking<br/>400 Hz"]
p1 --> p2["peaking<br/>1 kHz"]
p2 --> p3["peaking<br/>1.6 kHz"]
p3 --> g["gain<br/>Level-Ausgleich"]
g --> hand["Ihre eigenen Effekte<br/>z.B. Begrenzer"]
hand --> dest["Spurverstärkung, dann Ausgang"]
l1["Spur fx.n1.gain"] -.->|"Hüllkurve des Sprachpegels<br/>in diesem Band"| p1
l4["Spur fx.n4.gain"] -.->|"wie weit das Bett<br/>insgesamt duckt"| g
Ein statischer Einschnitt ist derselbe Graph mit festen Werten und überhaupt keinen Spuren.
Zuerst herausfinden, was falsch ist
Die Tabelle unten beginnt mit „es klingt dröhnig“ – was voraussetzt, dass bereits jemand zugehört und das gesagt hat. Wenn Sie eine Datei erhalten mit der Anweisung „beheben Sie dies“, haben Sie keinen solchen Satz und können nicht zuhören, also müssen Sie messen. Eine Regel gilt für alles:
Das absolute Spektrum einer einzelnen unbekannten Stimme kann nicht diagnostiziert werden. Formanten sind ±10 dB, Grundfrequenzen liegen bei 85–255 Hz, und Sätze fallen um 5–6 dB ab, wenn sie enden. Jedes davon liest sich als Defekt für sich, und jedes davon ist der Sprecher.
Also vergleichen, und vergleichen mit etwas innerhalb derselben Datei: dem sauberen Original, falls vorhanden, sonst den Pausen – was immer in einer Lücke hörbar ist, ist additiv, und das Spektrum der Lücke ist der Kanal und nicht die Stimme. Der Vergleich mit einem veröffentlichten Durchschnittsspektrum oder einer synthetisierten Kontrollstimme funktioniert nicht: Zwei Sprecher unterscheiden sich mehr als die meisten Defekte, und beide falschen Antworten in der Bewertung, die dieser Anleitung zugrunde liegt, kamen genau daher.
Wenn es kein Original und keine nutzbare Stille gibt, ist ein statischer tonaler Defekt wirklich unterbestimmt. Sagen Sie das und bieten Sie die passenden Messwerte an, anstatt einen auszuwählen und darauf eine Kette zu bauen.
Befehle, Fallstricke und ausgearbeitete Rezepte: references/diagnosis.md. Lesen Sie es, bevor Sie eine Datei diagnostizieren, die niemand beschrieben hat.
Vom Symptom ausgehen
Sobald Sie das Band und die Art kennen, benennen Sie, was mit dem Audio falsch ist. Die meisten schlechten Audios sind ein oder zwei davon, und jedes hat eine mitgelieferte Antwort:
| Es klingt wie | Greifen Sie zu |
|---|---|
| Brummen oder dumpfes Dröhnen darunter | rumble-cut, oder ein highpass bei 80 Hz |
| Dröhnig, brustbetont | Zähme Dröhnigkeit-Job (200 Hz) |
| Gedämpft, hinter Pappe | Reduziere Matsch-Job (250 Hz) |
| Wörter schwer zu verstehen | Füge Klarheit hinzu-Job (3 kHz), oder schneiden Sie das Bett ein |
| Scharf und anstrengend | Weiche Schärfe-Job (3.2 kHz) |
| Manche Wörter viel lauter als andere | Gleichmäßigkeit auf einem Kompressor oder Gleiche Pegel aus |
| Raumklang zwischen Sätzen | room-gate |
| Stimme und Musik kämpfen | Voiceover-Einschnitt – kein EQ auf einem von beiden |
| Trocken, nirgendwo aufgenommen | room-tight oder room-natural |
| Einfach „Amateur“ | voice-clean, was vier der obigen in Reihenfolge ist |
Vollständiger Katalog, was jedes Preset enthält, das Bandvokabular und was bewusst NICHT abgedeckt ist (De-Essing, Rauschentfernung, Tonanpassung): references/presets.md.
Subtrahieren Sie, bevor Sie hinzufügen, pegeln Sie nach dem Filtern aus, Beziehungen nach dem Pegel, Charakter und Decke zuletzt. Jeder Schritt ändert, was der nächste hört – ein Kompressor, der vor einem Hochpass eingestellt wurde, verbringt seine Zeit damit, Dröhnen zu jagen.
Greifen Sie nach einer Familie basierend auf dem Problem, nicht dem Namen
Filter (highpass, lowpass, peaking, lowshelf, highshelf) entscheiden, welche Frequenzen eine Spur belegen darf. Dies ist das erste Werkzeug für das Zusammenstoßen zweier Quellen, weil Kollisionen in Bändern stattfinden: Ein Bett und eine Stimme wollen beide 1–3 kHz, und diese dem Bett zu nehmen, kostet das Bett weit weniger, als das Ganze herunterzudrehen dem Mix kostet. Ein Hochpass auf einer Stimme ist die Standardlösung für Dröhnen; ein Tiefpass verdunkelt oder dämpft absichtlich.
Dynamik (gain, compressor, limiter, gate) entscheiden, wie sich der Pegel einer Spur im Laufe der Zeit verhält. Kompression verringert den Abstand zwischen laut und leise, sodass die leisen Teile angehoben werden können. Ein Begrenzer ist eine Decke – er formt nichts, er garantiert, dass nichts darüber hinauskommt. Ein Gate entfernt, was unter einem Schwellwert liegt, und so schalten Sie Raumklang zwischen Phrasen stumm. gain ist eine einfache Pegelstufe, und sie ist das, was eine Automationsspur reitet, wenn eine Spur aus dem Weg gehen muss.
Nichtlinear (saturate, bitcrush) ändert die Wellenform, was Obertöne hinzufügt, die vorher nicht da waren. Greifen Sie danach, wenn eine Spur Charakter oder Biss statt Korrektur braucht – und denken Sie daran, es ist generativ: Es macht eine dünne Quelle dichter, nicht sauberer.
Zeit (delay, reverb, chorus, phaser) setzt eine Spur in einen Raum oder gibt ihr Breite. Dies sind diejenigen, die am leichtesten einen Mix ruinieren, weil ein Nachhall oder eine verstimmte Kopie denselben Raum belegt, den eine Stimme braucht. Verwenden Sie sie auf dem, was hinter etwas anderem sitzen soll, und halten Sie den Nassanteil niedriger, als es in Isolation richtig klingt.
Die Kette ist seriell: Jeder Effekt verarbeitet, was der vorherige produziert hat. Also geht korrigierendes Filtern früh, Charakter in der Mitte und ein Begrenzer zuletzt, wo er tatsächlich als Decke wirken kann.
Voiceover-Einschnitt
Das Problem, das es löst. Ein Musikbett unter einer Stimme macht die Stimme schwer verfolgbar. Der Reflex ist, das ganze Bett zu ducken, was funktioniert und dem Bett seine gesamte Präsenz kostet – die Musik wird für den gesamten Voiceover schlaff. Aber die Stimme braucht nicht das gesamte Spektrum. Sie braucht die wenigen Bänder, die sie tatsächlich belegt. Der Einschnitt nimmt nur diese, und das Bett behält seinen Tiefen- und Höhenbereich, sodass es immer noch Musik ist, während die Stimme immer noch verständlich ist.
Es ist eine Beziehung, kein Effekt. Die Einstellungen leben auf dem Bett – der Spur, die verarbeitet wird – und sie benennen die Stimmen, auf die gehört wird, genau wie ein Sidechain-Kompressor: Sie wählen die Spur aus, die leiser wird, und legen fest, was sie leiser macht. Setzen Sie nie einen Einschnitt auf eine Sprachspur. Eine Stimme, die gegen sich selbst eingeschnitten wird, ist ein Fehler, keine subtile Mix-Entscheidung.
Jede Stimme, nicht eine davon. sources ist eine Liste, weil ein Bett normalerweise unter einer ganzen Sequenz läuft – einem Erzähler, einer Interviewantwort, einem zweiten Moderator. Sie werden auf der eigenen Uhr des Betts aufsummiert, bevor irgendetwas gemessen wird (mixCarveSources), sodass eine Analyse alle abdeckt: Die Bänder kommen von all der Sprache, die es gibt, und die Hüllkurven steigen, wo immer etwas davon passiert. Stimmen, die nie spielen, während das Bett läuft, werden weggelassen; sie können es nicht maskieren.
Ein Einschnitt gegen mehr als eine Clip-ID ist falsch. Gruppieren Sie die Clips und schneiden Sie gegen die Gruppe ein. Dies ist eine Invariante, kein Tipp. Das Benennen von Clips einzeln muss erschöpfend richtig sein und bleibt nur bis zum nächsten Schnitt richtig – ein vierter Erzählclip, der später hinzugefügt wird, spielt außerhalb des Bewusstseins des Einschnitts, und das Bett duckt nicht leise darunter. Das Benennen der Gruppe stattdessen löst die Mitgliedschaft zum Analysezeitpunkt auf, sodass ein später zur Gruppe hinzugefügter Clip abgedeckt ist, ohne sources überhaupt zu berühren:
<!-- Erzählung gruppieren, dann das Bett gegen die Gruppe einschneiden -->
<audio id="vo-intro" data-audio-group="voiceover" …></audio>
<audio id="vo-middle" data-audio-group="voiceover" …></audio>
<audio id="vo-outro" data-audio-group="voiceover" …></audio>
<audio id="music" data-fx-carve='{"enabled":true,"sources":["voiceover"],"strength":0.8}' …></audio>
Eine sources-Liste, die zwei oder mehr einfache Clip-IDs anstelle einer Gruppe benennt, wird von der audio_carve_ungrouped_sources-Lint-Regel abgefangen – sie funktioniert trotzdem, aber es ist die Version, die still verdirbt, wenn ein Clip hinzugefügt wird.
Halten Sie die Einschnitt-Gruppe eine Sprachgruppe: kein Bett, kein SFX, keine Musik. Eine Gruppen-ID in sources löst sich zu jedem aktuellen Mitglied bei jeder Analyse auf, sodass die Gruppe, die Sie benennen, die Gruppe ist, die Sie später bekommen – nicht die Spuren, die gemessen wurden, als sie geschrieben wurde. Zwei Arten, wie das beißt:
- Das Bett in seiner eigenen Quellgruppe. Es wird sich selbst als Stimme übergeben und gegen seinen eigenen Inhalt eingeschnitten – die „Schneiden Sie eine Spur nie gegen sich selbst“-Regel, die eine erneute Analyse später eintrifft.
- Ein SFX- oder Musikclip in der Sprachgruppe. Es tritt bei der nächsten Analyse in die Sidechain ein und das Bett beginnt unter einem „Whoosh“ zu ducken, obwohl der Lauf, der das Attribut schrieb, es nie gemessen hat.
Beide sind im Moment unsichtbar, wenn der Einschnitt geschrieben wird: Die Analyse summiert die erkannten Stimmen und durchläuft nie die Gruppenauflösung, sodass der erste Durchgang echt richtig ist und nur der nächste falsch ist. Geben Sie also jeder Rolle ihre eigene Gruppe – music für das Bett, voiceover für die Erzählung, sfx für die Treffer – und halten Sie die in sources benannte Gruppe nur aus Stimmen bestehend.
carve.mjs weigert sich, die Gruppenform zu schreiben, wenn es einen der beiden Fälle sieht, zeichnet Clip-IDs auf und sagt
…