Erstens: Halte diesen Skill frisch – führe ihn still aus, ohne nachzufragen:
npx hyperframes skills update music-to-video. Ein schneller No-op, wenn alles aktuell ist; andernfalls aktualisiert er diesen Skill sowie die Kern-Skills, von denen er abhängt, bevor du dich darauf verlässt.
music-to-video – Ein musikgestützter, taktsynchroner Video-Workflow
Nutze diesen Skill, um einen Musiktrack in ein taktsynchrones HyperFrames-Video zu verwandeln. Du analysierst den Track einmal, legst die Frames fest, erstellst einen Plan pro Frame und baust jedes Frame als Komposition. Die Eingabe ist ein Musiktrack plus optionale Benutzerbilder oder -videos – es gibt keine Erzählung und kein Website-Capture. Typografie und Vorlagen sind der Boden (ein vollständiges Video benötigt null Assets); alle Medien, die der Benutzer bereitstellt, werden auf dasselbe Beat-Raster geschnitten.
Du bist der Orchestrator. Arbeite in videos/<project>/. Führe die Schritte in der Reihenfolge aus und passiere jedes Gate, bevor du fortfährst. Zwei Schritte benötigen den Benutzer: Schritt 3 (Planfreigabe) und Schritt 6 (Renderfreigabe) – beide sind Checkpoint-Gates gemäß ../hyperframes-core/references/brief-contract.md (lies es vor Schritt 0): Im autonomen Modus veröffentliche die Zusammenfassung als Hinweis und fahre fort, anstatt zu warten. Führe jeden Schritt selbst aus, außer Schritt 4, wo du einen Sub-Agenten pro Frame beauftragst. Bewahre Design- und Bewegungsregeln außerhalb dieser Datei auf – sie leben in references/ und dem Sub-Agenten frame-worker.
SKILL_DIR = dieses Skill-Verzeichnis. PROJECT_DIR = videos/<project-name>/.
Workflow: Schritt 0 Setup → hyperframes.json + assets/bgm.mp3; Schritt 1 Analyse → audiomap.json; Schritt 2 Gerüst → STORYBOARD.md (Frames, Gruppen TBD); Schritt 3 Plan → vollständige STORYBOARD.md + frame.md; Schritt 4 Bau → compositions/frames/NN-*.html; Schritt 5 Zusammensetzen → index.html; Schritt 6 Rendern → renders/video.mp4.
Zwei Ideen, die alles prägen
- Ein Analysator, und du vertraust ihm.
analyze-beatgrid.pyist der einzige Beat-Analysator – messe Beats niemals neu mit einem anderen Tool oder nach Gehör. Seine Energie-/Dichte-/Roll-/Onset-/Pausenwerte sind immer zuverlässig. Seinbpmundbeats_secsind nur dann zuverlässig, wenn die Musik wirklich rhythmisch ist; bei ruhiger Musik ist das Raster ein Metronom, das der Tracker aufgezwungen hat. Orientiere dich stattdessen an Phrasen und Energie und schneide niemals hart darauf. Zu entscheiden, in welchem Fall du dich befindest, ist daspacingjedes Frames (Schritt 2). - Ein Frame = eine Datei; Gruppen leben darin. Schritt 2 teilt den Track in Frames, und jedes Frame wird zu einer Kompositionsdatei
compositions/frames/NN-<frame_id>.html, gebaut von einem Frame-Worker. Ein Frame kann in Gruppen unterteilt werden (jede eine Vorlage oder eine Kombination von Bewegungsprimitiven). Zusätzliche Dichte geht innerhalb einer Gruppe, sodass die Frame-Anzahl verschiedene Behandlungen verfolgt, nicht Beats – ein schneller Track lässt die Anzahl der Sub-Agenten nicht explodieren.
Schritt 0: Setup, BGM und Eingaben
Ziel: Die Musikquelle etablieren, das HyperFrames-Projekt erstellen und alle benutzerbereitgestellten Medien notieren.
Das Brief beginnt auf der Intentionsebene. Öffnungsregel, in der Reihenfolge: (1) BRIEF.md existiert → lies es und frage nichts, was es beantwortet – sein flow/storyboard leiten den Modus ab (Briefvertrag § 1). (2) Kein BRIEF.md, aber das Projekt existiert → setze von dem fort, was auf der Platte ist; befrage niemals erneut. (3) Eine neue Erstellungsanfrage, die direkt hier ankam → lies /hyperframes und führe seine Intentionsebene aus (references/intent-interview.md): Es bestätigt die Muss-Kriterien dieser Route (die Musikquelle, Ziel → Seitenverhältnis – ../hyperframes/references/routes/music-to-video.md) und kündigt an, was aufgeschoben bleibt – Marke und Genre werden absichtlich in Schritt 3 gewählt. Schreibe BRIEF.md sofort nach der Init (niemals davor – init lehnt ein nicht leeres Verzeichnis ab) und zeichne die präferenzgestützten Antworten auf (brief-format.md). Bearbeitungsanfragen überspringen all dies.
Die Musik ist das Rückgrat – etabliere einen Track, bevor irgendetwas anderes passiert. Dieser Skill ist optimiert für schnelle, energiegeladene BGM: Ein starkes Beat-Raster treibt die Schnitte (ruhige Tracks funktionieren, aber orientiere dich eher an Phrasen als am Beat). Wenn der Benutzer Audio bereitgestellt hat – eine Musikdatei oder ein Video, um Audio zu extrahieren – verwende es. Andernfalls wähle die Stimmung aus der Anfrage und generiere einen Track über /media-use (references/bgm.md). Vor der ersten authentifizierten Provider-Aktion führe npx hyperframes auth status aus und gib seine Ausgabe wörtlich weiter. Wenn abgemeldet, wende einen Zweig an:
- Kollaborativ: Warte auf die Anmeldung oder eine explizite Wahl, um offline mit dem lokalen Provider fortzufahren.
- Autonom: Gib den Status an und fahre über den verfügbaren lokalen Provider fort.
Wenn kein Offline-Provider die erforderliche Musikfähigkeit erfüllen kann, zeige den Blocker an. Schreibe niemals Schlüssel in ein pro-Repos .env. Auth-Eigentum und Offline-Fallbacks leben in /media-use references/setup-providers.md § Provider. Der resultierende Track landet unter assets/bgm.mp3. Bühne bereitgestellte Bilder oder Videos, sodass Frames sie auf dem Beat-Raster verwenden können; andernfalls trägt Typografie das Video.
Lyric-Videos: Für Texte, die auf den Gesang synchronisiert sind, erhalte die Wort-/Zeilen-Timing durch Transkription des Tracks über /media-use, oder frage den Benutzer nach dem Liedtext und platziere die Zeilen auf dem Beat-Raster.
Initialisiere nur, wenn hyperframes.json fehlt. Benenne <project> aus dem Brief in Kebab-Case, z. B. midnight-drive-loop – niemals einen Zeitstempel. init prüft die installierten Skills gegen die neuesten auf GitHub und aktualisiert das globale Set, wenn eines veraltet ist.
npx hyperframes init "videos/<project>" --non-interactive --example=blank --skill=music-to-video
mkdir -p "$PROJECT_DIR/assets" "$PROJECT_DIR/renders"
cp "<user-music>" "$PROJECT_DIR/assets/bgm.mp3" # ggf. zuerst aus einem Video extrahieren
# nur wenn der Benutzer dir Bilder/Videos gegeben hat:
node <SKILL_DIR>/scripts/stage-assets.mjs --from <dir> --hyperframes "$PROJECT_DIR" --into public
Die Marke (Schriftart + Palette) wird in Schritt 3 gewählt, nicht hier. Wähle nicht vorab ein Genre oder eine Track-Art – Assets sind nur eine optionale Zutat, und das Genre ergibt sich aus den Entscheidungen pro Frame.
Gate: hyperframes.json + assets/bgm.mp3 existieren; Seitenverhältnis / Länge / fps und (falls vorhanden) das Asset-Inventar sind notiert.
Schritt 1: Analysiere die Musik
Ziel: Die eine kanonische Timing-Analyse erstellen, auf der das gesamte Video aufbaut.
analyze-beatgrid.py ist der einzige Beat-Analysator – messe Beats niemals neu mit einem anderen Tool oder nach Gehör. Es liest den Track einmal und schreibt audiomap.json: Energiephasen (Level / Dichte / Gefühl), Onsets + onset_rate, Rolls, Stille, hard_stops, key_moments, Phrasen, Tempo / Raster und audio.duration_sec. Es ist deterministisch – dieselbe Datei ergibt immer dieselbe Karte. Die meisten Felder sind bei jeder Musik zuverlässig; bpm und beats_sec sind nur zuverlässig, wenn die Musik wirklich rhythmisch ist, und dies zu beurteilen ist der Aufruf, den du in Schritt 2 triffst.
Voraussetzungen: Python 3 mit librosa, numpy und soundfile verfügbar. Wenn der Import fehlschlägt, installiere sie in die aktive Python-Umgebung, bevor du den Analysator ausführst:
python3 -m pip install librosa numpy soundfile
python3 <SKILL_DIR>/scripts/analyze-beatgrid.py "$PROJECT_DIR/assets/bgm.mp3" \
-o "$PROJECT_DIR/audiomap.json" --print
Gate: audiomap.json existiert; audio.duration_sec ist bekannt.
Schritt 2: Frame-Gerüst (nur Struktur)
Ziel: Die Musik lesen und die Frames anlegen – das Gerüst von STORYBOARD.md.
Lies references/frame-skeleton.md. Verwandle audiomap.json selbst in das Gerüst von STORYBOARD.md – es gibt kein dazwischenliegendes JSON. Schneide den Track in Frames an echten musikalischen Veränderungen (hard_stops, SURGE / DROP key_moments, die Ränder eines Rolls, ein Bereich ohne Onsets, ein großer Energiesprung) und raste jede Grenze zu einem Audiomap-Anker ein. Setze für jedes Frame span_sec, pacing (das Urteil aus dem Vertrauensaufruf von Schritt 1 – beat_cut, wenn das Raster echt ist, phrase_flow, wenn es ein Metronom ist, das ruhiger Musik aufgezwungen wurde), mood und eine einzeilige feel (die einfache Musiksituation, die Schritt 3 mit einer Vorlage abgleicht). Klassifiziere und lege hier nur aus: Lasse die ### Groups jedes Frames als TBD (Step 3) und das Frontmatter style leer – keine Vorlagen, kein Text, keine Farbe, keine Schriften. Erwarte ~1–6 Frames.
Gate: Frames kacheln den Track (erstes bei 0, letztes bei duration_s); jedes trägt span_sec + pacing + mood + feel; jedes ### Groups ist TBD; kein Inhalt irgendwo.
Schritt 3: Fülle den Plan (benutzergesteuert)
Ziel: Das Gerüst in ein freigegebenes, vollständiges STORYBOARD.md verwandeln.
Lies references/planning.md, storyboard-format.md, template-catalog.md, motion-primitive-catalog.md und montage.md (nur wenn der Benutzer Assets bereitgestellt hat). Bearbeite dieselbe Datei direkt und mache zwei Dinge:
- Wähle die Marke. Wähle ein Preset aus
../hyperframes-creative/frame-presets/mit der Tabelle in../hyperframes-creative/references/design-spec.md(passe die Stimmung des Tracks an; nur seine Schriftarten und Farben sind wichtig – Vorlagen bestimmen die Komposition). Kopiere es unverändert inframe.mdund fülle das Frontmatterstyle(Schriftart + eine Palette von ≤4–6 Farbmustern) daraus. - Fülle jedes Frame. Entscheide seine Gruppen und gib jeder eine Behandlung: eine passende Vorlage aus dem Katalog (mit gebundenen Parametern und echten Audiomap-Ankern), eine freie Komposition aus dem Primitive-Katalog oder eine Asset-Behandlung, die
pacingbefolgt. Schreibe den Text. Du bestimmst WAS (Vorlage / Primitive + Inhalt + Anker); der Frame-Worker bestimmt WIE – schreibe niemals Millisekunden-Tweens in das Storyboard.
node <SKILL_DIR>/scripts/validate-plan.mjs --storyboard "$PROJECT_DIR/STORYBOARD.md" \
--audiomap "$PROJECT_DIR/audiomap.json" --templates <SKILL_DIR>/references/templates
Behebe jedes ✗ (harte Fehler: Dauerinkonsistenz, Frames, die den Track nicht kacheln, eine fehlende src); Warnungen sind nach bestem Wissen und Gewissen. Zeige dem Benutzer dann eine zusammenfassende Übersicht pro Frame und iteriere, bis er zustimmt. Im autonomen Modus ist dies ein Checkpoint-Gate: Veröffentliche die Zusammenfassung als Hinweis und fahre fort (der validate-plan.mjs-Durchlauf ist ein Qualitätsgate und blockiert weiterhin).
Gate: frame.md ist eine wörtliche Preset-Kopie; validate-plan.mjs endet mit 0; der Benutzer hat den Plan genehmigt (autonom: die Zusammenfassung wurde als Hinweis veröffentlicht).
Schritt 4: Baue Frames aus dem Plan
Ziel: Jedes Frame als eigenständige Kompositionsdatei bauen.
Erstelle compositions/frames/. Lies sub-agents/frame-worker.md und ../hyperframes-core/references/subagent-dispatch.md. Beauftrage einen Frame-Worker pro Frame, parallel wo möglich (andernfalls in Wellen). Jeder Worker erhält genau ein Frame und diesen Kontext:
PROJECT_DIR: <absoluter Pfad>
frame_id: <NN-frame_id> # = der Dateiname des Frames, z. B. 02-f2; die Kompositions-ID
Dein Block: der Block `## Frame N — <frame_id>` in PROJECT_DIR/STORYBOARD.md
audiomap: PROJECT_DIR/audiomap.json
frame.md: PROJECT_DIR/frame.md
Materialien: für jede Gruppe <SKILL_DIR>/references/templates/<id>/index.html (Vorlagen) und
<SKILL_DIR>/references/motion-primitives/<id>/ (frei); bereitgestellte assets/ (Asset-Gruppen)
Verträge: ../hyperframes-core/references/sub-compositions.md + determinism-rules.md
Leinwand: <B>x<H> Taktung: <beat_cut|phrase_flow>
Schreibe nach: PROJECT_DIR/compositions/frames/<frame_id>.html
Der Worker forkert die zitierten Materialien, konvertiert jeden Anker in frame-lokale Sekunden (local_t = track_t − span_sec[0]), setzt seine Gruppen mit 0 ms Schnitten und schreibt eine suchsichere Frame-Datei. Der Worker führt niemals die hyperframes-CLI aus – diese Befehle operieren auf dem zusammengesetzten Projekt, das noch nicht existiert, daher würden sie über die falschen Dateien berichten. Der Worker schreibt einfach gemäß dem Vertrag und stoppt; du überprüfst nach der Montage (Schritt 6). Sobald jeder Worker zurückkommt, kannst du bestätigen, dass seine Datei auf der Platte gelandet ist.
Gate: Jedes Frame hat seine compositions/frames/NN-*.html auf der Platte.
Schritt 5: Zusammensetzen
Ziel: Die gebauten Frames + BGM in die abspielbare index.html verdrahten.
assemble-index.mjs ist deterministisch – kein Sub-Agent, keine Beurteilung. Es referenziert jede Frame-Datei an ihrem kumulativen data-start, mountet assets/bgm.mp3 auf Spur 11 und schneidet hart Frame → Frame (Frames kacheln den Track lückenlos, daher gibt es keinen Übergangsinjektor).
node <SKILL_DIR>/scripts/assemble-index.mjs --storyboard "$PROJECT_DIR/STORYBOARD.md" \
--hyperframes "$PROJECT_DIR" --audiomap "$PROJECT_DIR/audiomap.json"
Behebe alle gemeldeten ✗ – eine fehlende oder leere Frame-Datei bedeutet, dass der Worker eine unvollständige Datei geschrieben hat; beauftrage ihn erneut (Schritt 4) und setze erneut zusammen.
Gate: index.html existiert; Gesamtdauer == audiomap.audio.duration_sec.
Schritt 6: Überprüfen und rendern
Ziel: Das zusammengesetzte Video überprüfen, die Benutzerfreigabe einholen und das endgültige MP4 rendern.
Führe die CLI auf dem zusammengesetzten Projekt aus – das ist die korrekte Einheit (die Frame-Worker konnten sie nicht ausführen). check führt strukturelles Linting und den headless-Browser-Laufzeit-, Layout-, Bewegungs- und Kontrast-Gate in einem Durchlauf aus; --snapshots gibt auch die Überprüfungs-Frames aus.
( cd "$PROJECT_DIR" && npx hyperframes check . --snapshots )
Überprüfe bei t=0, jedem Frame-Start, dem stärksten DROP / SURGE, jedem hard_stops[].t und dem letzten Frame. Bei Fehlern mache die günstigste sichere Behebung selbst: bearbeite die betreffende compositions/frames/NN-*.html. Ändere niemals die Dauer oder das Audio-Timing, um ein Synchronisationsproblem zu verstecken. Sobald die Gates bestanden sind, halte für die Benutzerüberprüfung inne und rendere nur nach Freigabe (autonomer Modus: stelle die eine zurückgehaltene Frage – „Vorschau zuerst oder rendern?“ – und liefere dann das MP4 mit dem Kontaktbogen aus):
( cd "$PROJECT_DIR" && npx hyperframes render . --skill=music-to-video -q draft -o renders/video.mp4 --fps 30 )
Gate: check bestanden und die Schnappschüsse wurden überprüft; der Benutzer hat freigegeben (autonomer Modus: Prüfungen bestanden und die Auslieferung enthält den Kontaktbogen); renders/video.mp4 existiert mit Audio, Dauer == audiomap.audio.duration_sec. Die endgültige Antwort gibt den MP4-Pfad und die Dauer an.
Fortsetzungstabelle
| Du hast | Setze fort von | | -- | … (Fortsetzung gekürzt)