Plugin-Installationen: Bevor du Setup- oder Freshness-Befehle ausführst, befolge die Plugin-Ausführungsregeln, wenn dieser Skill Teil eines HyperFrames-Plugins ist. Bei eigenständigen Installationen behältst du die unten stehenden Update-Anweisungen bei.
HyperFrames Audio
Ein Mix ist eine Reihe von Beziehungen, kein Stapel von Prozessoren. Zwei Spuren, die für sich genommen richtig klingen, können zusammen unerträglich sein – und die Lösung ist fast nie „eine leiser drehen“, sondern herauszufinden, worüber sie streiten, und es dem zu geben, der es braucht. Jedes Werkzeug hier dient dazu, eine dieser Beziehungen auszudrücken.
Effekte leben auf dem Element als data-fx-chain, und Vorschau und Render nutzen denselben Web-Audio-Graphen – das Studio in einem Live-Kontext, die Engine in einem Offline-Kontext innerhalb des Browsers, den es bereits steuert. Es gibt eine Implementierung jedes Effekts, sodass das, was du beim Scrubbing hörst, auch das ist, was geschrieben wird. Du stimmst nie zweimal ab.
Clip-Timing bleibt /hyperframes-core: Audio-/Video-Trimms und Quellenbereiche verwenden data-start, data-duration und data-media-start, und Überblendungen überlappen Clips auf verschiedenen Spuren. Dieser Skill verwaltet Ein-/Ausblendungen auf platzierten Spuren, Überblendungshüllkurven, Spurlautstärke/-gain, Automatisierung von Lautstärke und Effekten, Ducking/Voiceover-Carve und die Effektkette. /media-use verwaltet Beschaffung, Generierung und Vorverarbeitung.
Das konstante data-playback-rate (0.1..10) ist render-sicher für Bild und tonhöhenerhaltenen Sound, wenn übereinstimmende Audio-/Video-Elemente dieselbe Zeitsteuerung, Quellenversatz und Rate verwenden. Ein Geschwindigkeitsrampe ist eine rate-Spur in data-automation (siehe docs/reference/speed-ramps); sie überschreibt die Konstante und erhält die Tonhöhe in Vorschau und Render. HyperFrames bietet keine automatische Wellenformsynchronisation oder Driftkorrektur. Für kopierbare Schnitt-/Überblend-/Neuzeit-Rezepte verwende /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 auf der Lautstärke dieser Spur oder ihren Effektparametern |
data-fx-carve | die eigenen Einstellungen des Carves, sodass er neu abgeleitet werden kann |
Die mitgelieferten Effektfamilien sind Gain, EQ (Hochpass, Tiefpass, Spitzenfilter, Regale), Kompressor, Limiter, Gate, Sättigung, Delay, Hall, Chorus, Phaser und Bitcrush.
Exaktes 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-Lösung-Tabelle: references/presets.md – lies das, bevor du eine Kette von Hand baust, denn eines der Presets oder benannten Jobs benennt das Problem meist bereits.
Wie es zusammenhängt
Zwei Authoring-Oberflächen schreiben diese Attribute; zwei Laufzeitumgebungen lesen sie durch dieselben Builder. Diese gemeinsame Mitte ist der Grund, warum die Vorschau das Rendering vorhersagt.
flowchart TB
voice["Sprachspur<br/>Mediendatei"]
bett["Musikbett<br/>Mediendatei"]
subgraph AUTHOR["Authoring – die einzigen Dinge, die Attribute schreiben"]
pult["Studio<br/>Voiceover-Carve-Steuerung"]
script["scripts/carve.mjs<br/>erkennt das Paar"]
analyse["core/audioCarve.ts<br/>carveProfile · analyseCarveBands<br/>analyseCarveDuck · analyseCarveDynamics"]
pult --> analyse
script --> analyse
end
voice --> analyse
bett --> analyse
subgraph ATTR["Geschrieben auf das Bettelement"]
carveAttr["data-fx-carve<br/>quellen · stärke"]
chainAttr["data-fx-chain<br/>Peaking xN + Gain, getaggt von fromCarve"]
autoAttr["data-automation<br/>eine Spur pro gecarvtem Parameter"]
end
analyse --> carveAttr
analyse --> chainAttr
analyse --> autoAttr
subgraph GEMEINSAM["Eine Implementierung, von beiden gelesen"]
bauen["audioFxGraph.ts · buildFxChain"]
planen["audioFxAutomation.ts · scheduleChainAutomation"]
end
chainAttr --> bauen
autoAttr --> planen
bauen --> vorschau["Vorschau<br/>Live AudioContext<br/>attachElementFxChain"]
planen --> vorschau
bauen --> render["Render<br/>OfflineAudioContext im Headless-Browser<br/>applyAudioFxChain"]
planen --> render
vorschau --> gehoert["was du beim Scrubbing hörst"]
render --> wav["verarbeitetes WAV<br/>+ chainTailSeconds, damit der Mix den Ausklang durchlässt"]
wav --> mix["Engine · audioMixer<br/>Lautstärkespur hier in das PCM eingebacken, nicht im Graph"]
mix --> ausgabe["der gerenderte Mix"]
bearbeiten["Bearbeiten des Attributs während der Wiedergabe"] -.->|MutationObserver| vorschau
Die eigenen Einstellungen des Carves werden nie zur Wiedergabe gelesen – die Kette und Spuren, die er erzeugt hat, werden abgespielt. data-fx-carve existiert, damit die Stärke an einem vorhandenen Carve geändert werden kann, anstatt sie aus den Filtern zurückzuraten.
Innerhalb eines gecarvten Betts durchläuft das Signal zuerst die Absenkungen, dann den Pegelausgleich und dann alles, was du selbst gebaut hast – weshalb ein von dir hinzugefügter Limiter 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/>Pegelausgleich"]
g --> hand["deine eigenen Effekte<br/>z. B. Limiter"]
hand --> ziel["Spurgain, dann raus"]
l1["Spur fx.n1.gain"] -.->|"Hüllkurve des<br/>Sprachpegels in diesem Band"| p1
l4["Spur fx.n4.gain"] -.->|"wie stark das Bett<br/>insgesamt duckt"| g
Zuerst: Herausfinden, was falsch ist
Die folgende Tabelle beginnt mit „es klingt dröhnend“ – was voraussetzt, dass schon jemand zugehört und das gesagt hat. Wenn du eine Datei erhältst mit der Anweisung „behebe das“, hast du diesen Satz nicht und kannst nicht zuhören, also musst du messen. Eine Regel beherrscht alles:
Das absolute Spektrum einer einzelnen unbekannten Stimme kann nicht diagnostiziert werden. Formanten liegen bei ±10 dB, Grundfrequenzen zwischen 85 und 255 Hz, und Sätze fallen zum Ende hin um 5–6 dB ab. Jeder dieser Werte liest sich für sich genommen als Defekt, und jeder einzelne davon ist der Sprecher.
Also vergleiche, und vergleiche mit etwas in derselben Datei: dem sauberen Original, falls vorhanden, ansonsten 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, stammen genau daher.
Wenn es kein Original und keine nutzbare Stille gibt, ist ein statischer tonaler Defekt wirklich unterbestimmt. Sage das und biete die passenden Messwerte an, anstatt einen auszuwählen und eine Kette darauf aufzubauen.
Befehle, Fallstricke und durchgearbeitete Rezepte: references/diagnosis.md. Lies es, bevor du eine Datei diagnostizierst, die niemand beschrieben hat.
Beginne mit dem Symptom
Sobald du das Band und die Art kennst, benenne, was mit dem Audio nicht stimmt. Die meisten schlechten Audios sind ein oder zwei dieser Punkte, und jeder hat eine mitgelieferte Antwort:
| Es klingt wie | Greife zu |
|---|---|
| Brummen oder dumpfes Dröhnen | rumble-cut oder ein highpass bei 80 Hz |
| Dröhnend, brummig | Tame Boominess-Job (200 Hz) |
| Gedämpft, wie hinter Pappe | Reduce Mud-Job (250 Hz) |
| Wörter schwer zu verstehen | Add Clarity-Job (3 kHz) oder Carve das Bett |
| Scharf und ermüdend | Soften Harshness-Job (3,2 kHz) |
| Manche Wörter viel lauter als andere | Evenness auf einem Kompressor oder Even Out Levels |
| Raumton zwischen den Sätzen | room-gate |
| Stimme und Musik kämpfen | Voiceover-Carve – kein EQ auf einem von beiden |
| Trocken, klingt nach nirgendwo | room-tight oder room-natural |
| Einfach „Amateur“ | voice-clean, das vier der obigen in der richtigen Reihenfolge ist |
Vollständiger Katalog, was jedes Preset enthält, das Band-Vokabular und was bewusst NICHT abgedeckt wird (De-Essing, Rauschentfernung, Ton-Matching): references/presets.md.
Subtrahiere, bevor du hinzufügst, pegel nach dem Filtern, Beziehungen nach dem Pegel, Charakter und Deckel zuletzt. Jeder Schritt ändert, was der nächste hört – ein Kompressor, der vor einem Hochpass eingestellt wird, verbringt seine Zeit damit, Brummen zu jagen.
Greife nach einer Familie je nach Problem, nicht nach dem Namen
Filter (highpass, lowpass, peaking, lowshelf, highshelf) entscheiden, welche Frequenzen eine Spur belegen darf. Dies ist das erste Werkzeug für Kollisionen zwischen zwei Quellen, weil Kollisionen in Bändern passieren: Ein Bett und eine Stimme wollen beide 1–3 kHz, und dem Bett diesen Bereich wegzunehmen, kostet das Bett viel weniger, als die gesamte Spur leiser zu drehen den Mix kostet. Ein Hochpass auf einer Stimme ist die Standardlösung für Brummen; ein Tiefpass verdunkelt oder dämpft absichtlich.
Dynamikeffekte (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 Limiter ist eine Obergrenze – er formt nichts, er stellt sicher, dass nichts darüber hinausgeht. Ein Gate entfernt, was unter einem Schwellwert liegt, wodurch Raumton zwischen Phrasen zum Schweigen gebracht wird. gain ist eine einfache Pegelstufe, die von einer Automatisierungsspur geritten wird, wenn eine Spur aus dem Weg gehen muss.
Nichtlineare Effekte (saturate, bitcrush) verändern die Wellenform, was Oberschwingungen hinzufügt, die vorher nicht da waren. Greife danach, wenn eine Spur Charakter oder Biss statt Korrektur braucht – und denke daran, sie ist generativ: Sie macht eine dünne Quelle dichter, nicht sauberer.
Zeiteffekte (delay, reverb, chorus, phaser) versetzen eine Spur in einen Raum oder verleihen ihr Breite. Diese ruinieren am leichtesten einen Mix, weil ein Ausklang oder eine verstimmte Kopie denselben Raum einnimmt, den eine Stimme braucht. Verwende sie auf dem, was hinter etwas anderem sitzen soll, und halte den Nassanteil niedriger, als es in Isolation richtig klingt.
Die Kette ist seriell: Jeder Effekt verarbeitet das, was der vorherige produziert hat. Korrigierende Filter gehören also an den Anfang, Charakter in die Mitte und ein Limiter ans Ende, wo er tatsächlich als Obergrenze wirken kann.
Voiceover-Carve
Das Problem, das es löst. Ein Musikbett unter einer Stimme macht die Stimme schwer verständlich. Der Reflex ist, das ganze Bett zu ducken, was funktioniert, aber dem Bett seine gesamte Präsenz raubt – die Musik wird für den gesamten Voiceover schlaff. Aber die Stimme braucht nicht das gesamte Spektrum. Sie braucht nur die wenigen Bänder, die sie tatsächlich belegt. Carve nimmt nur diese, und das Bett behält seinen Tiefton und seine Höhen, 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 werden soll, genau wie ein Sidechain-Kompressor: Du wählst die Spur aus, die leiser wird, und bestimmst, was sie leiser macht. Setze niemals ein Carve auf eine Sprachspur. Eine gegen sich selbst gecarvte Stimme ist ein Fehler, keine subtile Mix-Entscheidung.
Jede Stimme, nicht nur eine von ihnen. sources ist eine Liste, weil ein Bett normalerweise unter einer ganzen Sequenz läuft – einem Erzähler, einer Interviewantwort, einer zweiten Moderatorin. Sie werden vor der Messung auf die eigene Uhr des Betts summiert (mixCarveSources), sodass eine Analyse alle abdeckt: Die Bänder stammen von der gesamten Sprache dort, und die Hüllkurven steigen, wo immer etwas davon passiert. Stimmen, die niemals spielen, während das Bett läuft, werden weggelassen; sie können es nicht überdecken.
Ein Carve gegen mehr als eine Clip-ID ist falsch. Gruppiere die Clips und carve gegen die Gruppe. Dies ist eine Invariante, kein Tipp. Das Aufzählen von Clips einzeln muss erschöpfend richtig sein und bleibt nur bis zum nächsten Schnitt richtig – ein vierter, später hinzugefügter Erzähl-Clip spielt außerhalb des Bewusstseins des Carves, und das Bett duckt nicht still unter ihm. Stattdessen benenne die Gruppe, die Mitgliedschaft wird zum Analysezeitpunkt aufgelöst, sodass ein später zur Gruppe hinzugefügter Clip abgedeckt ist, ohne sources zu berühren:
<!-- Gruppiere die Erzählung, dann carve das Bett gegen die Gruppe -->
<audio id="vo-intro" data-audio-group="voiceover" …></audio>
<audio id="vo-mitte" data-audio-group="voiceover" …></audio>
<audio id="vo-outro" data-audio-group="voiceover" …></audio>
<audio id="musik" data-fx-carve='{"enabled":true,"sources":["voiceover"],"strength":0.8}' …></audio>
Eine sources-Liste, die zwei oder mehr einfache Clip-IDs anstelle einer Gruppe nennt, wird von der Lint-Regel audio_carve_ungrouped_sources abgefangen – sie funktioniert trotzdem, aber es ist die Version, die still verrottet, wenn ein Clip hinzugefügt wird.
Halte die Carve-Gruppe eine Sprachgruppe: kein Bett, kein SFX, keine Musik. Eine Gruppen-ID in sources wird zu jedem aktuellen Mitglied bei jeder Analyse aufgelöst, sodass die Gruppe, die du nennst, auch die Gruppe ist, die du später bekommst – nicht die Spuren, die gemessen wurden, als sie geschrieben wurde. Zwei Arten, wie das beißt:
- Das Bett in seiner eigenen Quellengruppe. Es wird sich selbst als Stimme übergeben und gegen seinen eigenen Inhalt gecarvt – die Regel „carve niemals eine Spur gegen sich selbst“ kommt bei der nächsten Neu-Analyse.
- Ein SFX- oder Musik-Clip in der Sprachgruppe. Er gelangt bei der nächsten Analyse in die Sidechain und das Bett beginnt unter einem Whoosch zu ducken, obwohl der Lauf, der das Attribut geschrieben hat, ihn nie gemessen hat.
Beide sind im Moment des Schreibens des Carves unsichtbar: Die Analyse summiert die erkannten Stimmen und durchläuft nie die Gruppenauflösung, sodass der erste Durchgang wirklich korrekt ist und erst der nächste falsch ist. Gib also jeder Rolle ihre eigene Gruppe – music für das Bett, voiceover für die Erzählung, sfx für die Effekte – und halte die in sources genannte Gruppe nur mit Stimmen besetzt.
carve.mjs weigert sich, die Gruppenform zu schreiben, wenn einer der beiden Fälle auftritt, zeichnet Clip-IDs auf und gibt auf stderr aus, welches Mitglied sie blockiert hat. Die Regel audio_carve_ungrouped_sources zeigt dann auf das Arrangement.