Skip to content
cccskills
FreePublished on GitHubEnglish overview

music-to-video

Turn a music track into a HyperFrames video with text, images, and clips timed to its rhythm and energy. Additional visual assets are optional, and the workflow includes storyboard approval, visual checks, and final MP4 rendering.

OriginalShow the original description

Use when the user has a music track (an audio file, or a video to pull audio from) and wants a beat-synced HyperFrames video, calm to hard-hitting. The music drives everything: one analyzer reads it once, the orchestrator lays out the frames and fills a per-frame plan, and one sub-agent builds each frame. Typography and templates are the floor — a complete video needs zero assets — but any images or videos the user supplies are cut into the frames on the same beat grid (beat-cut / ken-burns). The genre (lyric video, slideshow, kinetic promo) falls out of the per-frame choices; the pipeline never branches on it.

Run score Not tested

See how to install

Good for

  • Create a promotional video timed to a music track
  • Build a slideshow from music and supplied photos
  • Make a music video using animated text alone
  • Pace calm visuals around musical phrases

Overview

What it does

Analyzes a track’s beats, dynamics, silences, and energy changes to create a HyperFrames video that follows the music. It can build the video from text and templates alone, or incorporate your images and clips using the same timing. Strongly rhythmic tracks use beat-based cuts; calm tracks develop along musical phrases and changes in intensity. The workflow covers the plan, scene creation, assembly, validation, and MP4 output.

When it helps

Use it to create a promotional video or slideshow starting with a song. Animated text can carry the video when visual assets are limited. It supports landscape, portrait, and square formats, and accepts music files or audio extracted from a video.

Example requests

  • “Create a promotional video for this track, mainly using animated text.”
  • “Make a slideshow from this music and these photos, with transitions on the beat.”

Notes

Requires the HyperFrames CLI and Python 3 with librosa, numpy, and soundfile. User approval is required for the plan and before final rendering. When generating new music, it checks authentication status and lets you choose online or local generation. Narration and website recording are outside its scope.

This overview was written by AI (OpenAI Codex) from the public SKILL.md. Check the original below for the exact behavior.

Document check

AI checked the SKILL.md for operations that need care and for setup requirements. The score comes only from actually running the skill (hands-on test).

SafetyAre sending data, deleting files, and running commands disclosed?
BPartly lackingPlanning and rendering require approval, but init updates global skills without a specified confirmation step.
Easy setupDoes it need few tools or API keys, and are they documented?
BPartly lackingIt provides a Python dependency installation command but no HyperFrames CLI installation instructions.

Not counted in the score. Rated by AI (OpenAI Codex) as of Oct 23, 2026. Treat it as a guide and read the original before installing.

Disagree? Request a re-evaluation

Tell us which point is wrong and why. No login needed. We will check it against the SKILL.md, redo the evaluation, and show the result here.

This form is protected by reCAPTCHA, and the Google Privacy Policy and Terms of Service apply.

Files included (132)

  • SKILL.md15.8 KB
  • references/frame-skeleton.md6.4 KB
  • references/montage.md3.3 KB
  • references/motion-primitive-catalog.md9.7 KB
  • references/motion-primitives/3d-card-flip/index.html4.1 KB
  • references/motion-primitives/assets/gsap.min.js71.2 KB
  • references/motion-primitives/bg-flow-field/index.html11.8 KB
  • references/motion-primitives/binary-decrypt/index.html3.4 KB
  • references/motion-primitives/blur-resolve/index.html2.4 KB
  • references/motion-primitives/braam-punch/index.html3.4 KB
  • references/motion-primitives/chromatic-split/index.html4.2 KB
  • references/motion-primitives/chrome-sweep/index.html2.5 KB
  • references/motion-primitives/counting-punch/index.html3.9 KB
  • references/motion-primitives/crash-zoom-in/index.html4.1 KB
  • references/motion-primitives/datamosh-smear/index.html4.2 KB
  • references/motion-primitives/directional-fill/index.html3.5 KB
  • references/motion-primitives/dolly-zoom/index.html4.0 KB
  • references/motion-primitives/electric-arc/index.html4.1 KB
  • references/motion-primitives/flash-cut/index.html3.9 KB
  • references/motion-primitives/gooey-metaball/index.html5.6 KB
  • references/motion-primitives/hard-cut/index.html3.4 KB
  • references/motion-primitives/hypercut-whip/index.html2.0 KB
  • references/motion-primitives/iris-open/index.html2.7 KB
  • references/motion-primitives/kinetic-letter-in/index.html2.3 KB
  • references/motion-primitives/liquid-morph/index.html3.7 KB
  • references/motion-primitives/mask-reveal/index.html2.8 KB
  • references/motion-primitives/mosaic-pack/index.html3.5 KB
  • references/motion-primitives/neon-flicker/index.html2.7 KB
  • references/motion-primitives/outline-to-fill/index.html3.0 KB
  • references/motion-primitives/palette-flip/index.html3.5 KB
  • references/motion-primitives/particle-burst/index.html3.9 KB
  • references/motion-primitives/pixel-dissolve/index.html3.3 KB
  • references/motion-primitives/radial-burst-lines/index.html4.4 KB
  • references/motion-primitives/screen-shake/index.html2.9 KB
  • references/motion-primitives/slot-machine-reveal/index.html3.5 KB
  • references/motion-primitives/spotlight-sweep/index.html3.7 KB
  • references/motion-primitives/staggered-exit/index.html3.1 KB
  • references/motion-primitives/text-spectral-rays/index.html12.0 KB
  • references/motion-primitives/text-spectral-rays/USAGE.md2.3 KB
  • references/motion-primitives/text-wave-distort/index.html3.7 KB
  • references/motion-primitives/tile-mosaic/index.html3.8 KB
  • references/motion-primitives/typewriter-reveal/index.html3.3 KB
  • references/motion-primitives/word-grid-burst/index.html3.4 KB
  • references/planning.md6.0 KB
  • references/storyboard-format.md6.1 KB
  • references/template-catalog.md8.3 KB
  • references/templates/card-flyby/index.html20.2 KB
  • references/templates/card-flyby/program.json642 B
  • references/templates/held-message-living-field/index.html16.9 KB
  • references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/asphalt-031.png112.5 KB
  • references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/bark-014.png88.5 KB
  • references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/brick.png40.0 KB
  • references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/bricks-075-a.png48.2 KB
  • references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/bricks-101.png47.3 KB
  • references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/bricks-102.png35.2 KB
  • references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/bricks-104.png19.7 KB
  • references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/carpet.png158.7 KB
  • references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/concrete-034.png45.9 KB
  • references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/concrete-042-a.png84.3 KB
  • references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/concrete-046.png97.2 KB
  • references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/concrete-047-a.png111.5 KB
  • references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/concrete.png176.0 KB
  • references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/diamond-plate-009.png90.2 KB
  • references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/fabric-080.png30.2 KB
  • references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/fabric-083.png86.8 KB
  • references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/grass-001.png101.9 KB
  • references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/grass-004.png99.5 KB
  • references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/grass-005.png108.2 KB
  • references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/ground-037.png116.6 KB
  • references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/ground-054.png118.3 KB
  • references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/ground-068.png101.2 KB
  • references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/ground-080.png103.8 KB
  • references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/ground-103.png104.1 KB
  • references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/ground-104.png96.4 KB
  • references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/lava.png72.7 KB
  • references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/leather-037.png118.1 KB
  • references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/marble-012.png92.9 KB
  • references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/marble-016.png100.2 KB
  • references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/metal-032.png86.1 KB
  • references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/metal-038.png67.7 KB
  • references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/metal-041-a.png95.6 KB
  • references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/metal-046-b.png98.4 KB
  • references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/metal-048-a.png105.8 KB
  • references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/metal-049-a.png93.8 KB
  • references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/metal-055-a.png51.6 KB
  • references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/metal-061-b.png84.6 KB
  • references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/metal.png194.6 KB
  • references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/onyx.png85.1 KB
  • references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/painted-plaster-017.png53.4 KB
  • references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/paving-stones-138.png34.2 KB
  • references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/paving-stones-150.png41.8 KB
  • references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/plaster-001.png104.1 KB
  • references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/road-007.png84.1 KB
  • references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/road-008-a.png115.2 KB
  • references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/road-009-c.png72.5 KB
  • references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/road-012-a.png110.1 KB
  • references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/road-012-b.png109.2 KB
  • references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/road-013-a.png102.5 KB
  • references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/rock-058.png78.4 KB
  • references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/rock-063.png39.4 KB
  • references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/rock.png131.0 KB
  • references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/snow-015.png63.7 KB
  • references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/snow.png95.9 KB
  • references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/tiles-138.png109.6 KB
  • references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/travertine-009.png67.3 KB
  • references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/wood-049.png40.1 KB
  • references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/wood-051.png44.4 KB
  • references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/wood-058.png81.8 KB
  • references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/wood-066.png82.0 KB
  • references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/wood-092.png71.9 KB
  • references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/wood-094.png71.0 KB
  • references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/wood-floor-051.png41.6 KB
  • references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/wood-floor-064.png39.8 KB
  • references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/wood-floor-070.png51.8 KB
  • references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/wood.png41.2 KB
  • references/templates/held-text-strobe-burst/index.html11.2 KB
  • references/templates/intro-kinetic-cascade/index.html18.5 KB
  • references/templates/intro-kinetic-cascade/program.json1.5 KB
  • references/templates/logo-split-lockup-pulse/assets/fredoka-700.woff215.5 KB
  • references/templates/logo-split-lockup-pulse/index.html22.9 KB
  • references/templates/poster-tile-mosaic/index.html23.8 KB
  • references/templates/poster-tile-mosaic/program.json558 B
  • references/templates/roll-flipbook-word-cycle/index.html10.9 KB
  • references/templates/split-anchor-word-slot/index.html24.5 KB
  • references/templates/split-anchor-word-slot/program.json707 B
  • references/templates/typewriter-phrase-keyword-shuffle/index.html9.8 KB
  • scripts/analyze-beatgrid.py22.9 KB
  • scripts/assemble-index.mjs8.2 KB
  • scripts/lib/storyboard.mjs8.1 KB
  • scripts/stage-assets.mjs2.1 KB
  • scripts/validate-plan.mjs6.5 KB
  • sub-agents/frame-worker.md4.9 KB

SKILL.md (original)

Review the instructions the agent will receive before you install.

music-to-video — one music-grounded, beat-synced video workflow

Use this skill to turn a music track into a beat-synced HyperFrames video. You analyze the track once, lay out the frames, fill in a per-frame plan, and build each frame as a composition. The input is a music track plus optional user images or videos — there is no narration and no website capture. Typography and templates are the floor (a complete video needs zero assets); any media the user supplies is cut in on the same beat grid.

You are the orchestrator. Work in videos/<project>/. Run the steps in order and pass each Gate before moving on. Two steps need the user: Step 3 (plan approval) and Step 6 (render approval). Do every step yourself except Step 4, where you dispatch one sub-agent per frame. Keep design and motion rules out of this file — they live in references/ and the frame-worker sub-agent.

SKILL_DIR = this skill directory. PROJECT_DIR = videos/<project-name>/.

Workflow: Step 0 setup → hyperframes.json + assets/bgm.mp3; Step 1 analyze → audiomap.json; Step 2 skeleton → STORYBOARD.md (frames, groups TBD); Step 3 plan → complete STORYBOARD.md + frame.md; Step 4 build → compositions/frames/NN-*.html; Step 5 assemble → index.html; Step 6 render → renders/video.mp4.

Two ideas that shape everything

  • One analyzer, and you trust it. analyze-beatgrid.py is the only beat analyzer — never re-measure beats with another tool or by ear. Its energy / density / rolls / onsets / silences are always reliable. Its bpm and beats_sec are reliable only when the music is genuinely rhythmic; on calm music the grid is a metronome the tracker imposed, so pace by phrases and energy instead and never hard-cut to it. Deciding which case you're in is each frame's pacing (Step 2).
  • One frame = one file; groups live inside. Step 2 cuts the track into frames, and each frame becomes one composition file compositions/frames/NN-<frame_id>.html, built by one frame-worker. A frame can subdivide into groups (each a template or a motion-primitives combo). Extra density goes inside a group, so frame count tracks distinct treatments, not beats — a fast track does not blow up the number of sub-agents.

Step 0: Setup, BGM, and inputs

Goal: Establish the music source, create the HyperFrames project, and note any user-supplied media.

The music is the spine — establish one track before anything else. This skill is tuned for fast, high-energy BGM: a strong beat grid drives the cuts (calm tracks work, but pace by phrase rather than beat). If the user gave you audio — a music file, or a video to pull the audio from — use it. If not, generate one: choose the mood from the user's description (e.g. "driving synthwave", "trap beat", "upbeat corporate") and produce a track via /hyperframes-media (references/bgm.md — HeyGen retrieval when credentialed, else local Lyria / MusicGen; ElevenLabs or another generator also works). Before generating, run npx hyperframes auth status and relay its output verbatim (don't paraphrase or rewrite it) — it shows whether BGM comes from HeyGen or local MusicGen and, if not signed in, how to sign in. If not signed in, STOP and wait for the user to choose — sign in, or continue offline with local MusicGen — before generating the track; don't write keys into a per-repo .env. (In autonomous mode, note the status and continue offline.) See /hyperframes-media → Preflight for the canonical guidance. Either way the track lands at assets/bgm.mp3. Stage any user-supplied images or videos so frames can weave them in on the beat grid; otherwise typography carries the whole video.

Initialize only if hyperframes.json is missing. Name <project> from the brief in kebab-case, such as midnight-drive-loop — never a timestamp. init checks the installed skills against the latest on GitHub and updates the global set if any are out of date.

npx hyperframes init "videos/<project>" --non-interactive --example=blank
mkdir -p "$PROJECT_DIR/assets" "$PROJECT_DIR/renders"
cp "<user-music>" "$PROJECT_DIR/assets/bgm.mp3"   # extract from a video first if needed
# only if the user gave you images/videos:
node <SKILL_DIR>/scripts/stage-assets.mjs --from <dir> --hyperframes "$PROJECT_DIR" --into public

The brand (font + palette) is chosen at Step 3, not here. Don't pick a genre or a track type up front — assets are just an optional ingredient, and the genre emerges from the per-frame choices.

Gate: hyperframes.json + assets/bgm.mp3 exist; aspect / length / fps and (if any) the asset inventory are noted.


Step 1: Analyze the music

Goal: Produce the one canonical timing analysis the whole video is built on.

analyze-beatgrid.py is the only beat analyzer — never re-measure beats with another tool or by ear. It reads the track once and writes audiomap.json: energy phases (level / density / feel), onsets + onset_rate, rolls, silences, hard_stops, key_moments, phrases, tempo / grid, and audio.duration_sec. It's deterministic — the same file always gives the same map. Most fields are reliable on any music; bpm and beats_sec are reliable only when the music is genuinely rhythmic, and judging that is the call you make at Step 2.

Prerequisites: Python 3 with librosa, numpy, and soundfile available. If import fails, install them into the active Python environment before running the analyzer:

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 exists; audio.duration_sec is known.


Step 2: Frame skeleton (structure only)

Goal: Read the music and lay out the frames — the skeleton of STORYBOARD.md.

Read references/frame-skeleton.md. Turn audiomap.json into the skeleton of STORYBOARD.md yourself — there is no intermediate JSON. Cut the track into frames at real musical changes (hard_stops, SURGE / DROP key_moments, the edges of a roll, a stretch with no onsets, a big energy jump), snapping every boundary to an audiomap anchor. For each frame set span_sec, pacing (the verdict from Step 1's trust call — beat_cut when the grid is real, phrase_flow when it's a metronome imposed on calm music), mood, and a one-line feel (the plain music situation Step 3 matches a template against). Only classify and lay out here: leave every frame's ### Groups as TBD (Step 3) and the frontmatter style blank — no templates, copy, color, or fonts. Expect ~1–6 frames.

Gate: frames tile the track (first at 0, last at duration_s); each carries span_sec + pacing + mood + feel; every ### Groups is TBD; no content anywhere.


Step 3: Fill the plan (user-gated)

Goal: Turn the skeleton into an approved, complete STORYBOARD.md.

Read references/planning.md, storyboard-format.md, template-catalog.md, motion-primitive-catalog.md, and montage.md (only if the user supplied assets). Editing the same file in place, do two things:

  1. Pick the brand. Choose one preset from ../hyperframes-creative/frame-presets/ using the table in ../hyperframes-creative/references/design-spec.md (match the track's mood; only its fonts and colors matter — templates own composition). Copy it into frame.md unmodified and fill the frontmatter style (font + a ≤4–6 swatch palette) from it.
  2. Fill every frame. Decide its groups and give each a treatment: a matched template from the catalog (with bound params and real audiomap anchors), a free-compose from the primitive catalog, or an asset treatment that obeys pacing. Write the copy. You own WHAT (template / primitives + content + anchors); the frame-worker owns HOW — never write millisecond tweens into the storyboard.
node <SKILL_DIR>/scripts/validate-plan.mjs --storyboard "$PROJECT_DIR/STORYBOARD.md" \
  --audiomap "$PROJECT_DIR/audiomap.json" --templates <SKILL_DIR>/references/templates

Fix every ✗ (hard errors: duration mismatch, frames not tiling the track, a missing src); warnings are best-effort. Then show the user a frame-by-frame summary and iterate until they approve.

Gate: frame.md is a verbatim preset copy; validate-plan.mjs exits 0; the user approved the plan.


Step 4: Build frames from the plan

Goal: Build every frame as a self-contained composition file.

Create compositions/frames/. Read sub-agents/frame-worker.md and ../hyperframes-core/references/subagent-dispatch.md. Dispatch one frame-worker per frame, in parallel where possible (otherwise in waves). Each worker gets exactly one frame and this context:

PROJECT_DIR: <abs path>
frame_id: <NN-frame_id>              # = the frame file stem, e.g. 02-f2; the composition id
Your block: the `## Frame N — <frame_id>` block in PROJECT_DIR/STORYBOARD.md
audiomap: PROJECT_DIR/audiomap.json
frame.md: PROJECT_DIR/frame.md
Materials: for each group, <SKILL_DIR>/references/templates/<id>/index.html (templates) and
           <SKILL_DIR>/references/motion-primitives/<id>/ (free); staged assets/ (asset groups)
Contracts: ../hyperframes-core/references/sub-compositions.md + determinism-rules.md
Canvas: <w>×<h>   Pacing: <beat_cut|phrase_flow>
Write to: PROJECT_DIR/compositions/frames/<frame_id>.html

The worker forks the cited materials, converts every anchor to frame-local seconds (local_t = track_t − span_sec[0]), gates its groups with 0ms cuts, and writes one seek-safe frame file. The worker never runs the hyperframes CLI — those commands operate on the assembled project, which doesn't exist yet, so they'd report on the wrong files. The worker just writes to the contract and stops; you verify after assembly (Step 6). As each worker returns, you can confirm its file landed on disk.

Gate: every frame has its compositions/frames/NN-*.html on disk.


Step 5: Assemble

Goal: Wire the built frames + BGM into the playable index.html.

assemble-index.mjs is deterministic — no subagent, no judgment. It references each frame file at its cumulative data-start, mounts assets/bgm.mp3 on track 11, and hard-cuts frame → frame (frames tile the track with no gaps, so there is no transition injector).

node <SKILL_DIR>/scripts/assemble-index.mjs --storyboard "$PROJECT_DIR/STORYBOARD.md" \
  --hyperframes "$PROJECT_DIR" --audiomap "$PROJECT_DIR/audiomap.json"

Fix any ✗ it reports — a missing or blank frame file means that worker wrote a partial file; re-dispatch it (Step 4) and re-assemble.

Gate: index.html exists; total duration == audiomap.audio.duration_sec.


Step 6: Verify and render

Goal: Verify the assembled video, get user approval, and render the final MP4.

Run the CLI on the assembled project — that's the correct unit (the per-frame workers couldn't run it). lint checks structure, validate runs headless Chrome (catching JS errors and missing assets), inspect snapshots frames.

( cd "$PROJECT_DIR" && npx hyperframes lint . && npx hyperframes validate . && npx hyperframes inspect . )

Inspect at t=0, each frame start, the strongest DROP / SURGE, every hard_stops[].t, and the final frame. On failure, make the cheapest safe fix yourself: edit the offending compositions/frames/NN-*.html. Never change duration or audio timing to hide a sync issue. Once the gates pass, pause for user review, then render only on approval:

( cd "$PROJECT_DIR" && npx hyperframes render . --skill=music-to-video -q draft -o renders/video.mp4 --fps 30 )

Gate: lint / validate / inspect passed; the user approved; renders/video.mp4 exists with audio, duration == audiomap.audio.duration_sec. The final reply states the MP4 path and duration.


Resume table

You haveContinue from
assets/bgm.mp3 onlyStep 1
audiomap.jsonStep 2
STORYBOARD.md (skeleton)Step 3
STORYBOARD.md (complete)Step 4
all frame filesStep 5
index.htmlStep 6

Quick Reference

Formats: landscape 1920x1080 by default; portrait 1080x1920; square 1080x1080. Set the canvas once in the storyboard frontmatter (canvas: { w, h, fps }).

Scripts under scripts/: analyze-beatgrid.py (the one analyzer), validate-plan.mjs (plan check), assemble-index.mjs (index assembly), stage-assets.mjs (stage user media), lib/storyboard.mjs (vendored parser). Everything else is the hyperframes CLI.

ReadWhen
references/frame-skeleton.mdStep 2: read the music, lay out the frames, set pacing
references/planning.md · storyboard-format.mdStep 3: pick the brand, fill each frame, write the plan
references/template-catalog.mdStep 3: pick a template per group
references/motion-primitive-catalog.mdStep 3/4: L0 recipes for free-compose
references/montage.mdStep 3/4: asset treatments (beat-cut / ken-burns)
sub-agents/frame-worker.mdStep 4: dispatch + build one frame
../hyperframes-core/references/subagent-dispatch.mdStep 4: dispatch sub-agents safely
../hyperframes-creative/references/design-spec.mdStep 3: pick the preset (the brand)

Directory layout

music-to-video/
  SKILL.md
  references/   frame-skeleton.md · planning.md · storyboard-format.md
                template-catalog.md · motion-primitive-catalog.md · montage.md
                templates/<id>/          { index.html (+ assets/ · program.json) }  ← L1 catalog impls
                motion-primitives/<id>/  { index.html } (+ ../assets/gsap.min.js shared by recipes) ← L0 catalog impls
  scripts/      analyze-beatgrid.py · assemble-index.mjs · validate-plan.mjs · stage-assets.mjs · lib/storyboard.mjs
  sub-agents/   frame-worker.md   ← the one subagent (one per frame)

Reviews

No reviews yet. Tell others what you thought.

Comments

No login needed. Share how it worked for you, ask a question, or note where it did not run.

No comments yet. Be the first to write one.

Comments are published right away. Do not include personal information such as email addresses or phone numbers. Up to 2 URLs.

0 / 1,000 characters

This form is protected by reCAPTCHA, and the Google Privacy Policy and Terms of Service apply.

More skills from this repository

Create 3D objects from text or images, choose catalog assets for repeated scenery, and inspect the results in Blender. The workflow checks geometry, materials, scale, and ground contact while recording asset sources and generation costs.

  • Create a unique 3D object from a text description
  • Reconstruct a 3D object from a concept image
  • Populate scenery with catalog vegetation and rocks
calesthio/OpenMontage71.4KUpdated Oct 24, 2026

acestep

FreeSummary

Generate background music and songs with lyrics using ACE-Step 1.5, with controls for duration, tempo, and musical key. You can also restyle reference audio and separate vocals or individual instruments from mixed tracks.

  • Generate background music to match a video scene
  • Create a short jingle with supplied lyrics
  • Make a jazz arrangement of reference audio
calesthio/OpenMontage71.4KUpdated Oct 24, 2026

agents

FreeSummary

Build voice assistants and conversational characters with ElevenLabs. Configure voices, language models, and external tools, then connect conversations to a website widget or use Twilio integration for outbound phone calls.

  • Creating a voice bot for customer support
  • Embedding a voice assistant on a website
  • Building an interactive voice character
calesthio/OpenMontage71.4KUpdated Oct 24, 2026

ai-video-gen

FreeSummary

Generate video clips from text descriptions or reference images through multiple API services. Compare available providers by cost and task needs, choose aspect ratios, track generation progress, and refine existing clips through conversational editing with Gemini Omni.

  • Generating clips from written scene descriptions
  • Animating a product photo
  • Creating vertical videos for social media
calesthio/OpenMontage71.4KUpdated Oct 24, 2026

ai-video-gen

FreeSummary

Create AI video clips from text or reference images, choosing among providers to match the task and budget. Supports vertical social videos, product photo animation, and conversational editing of existing clips with Gemini Omni Flash.

  • Create vertical video clips for social media
  • Animate product photos
  • Choose a video provider for a budget and visual style
calesthio/OpenMontage71.4KUpdated Oct 24, 2026

atlas-cloud

FreeSummary

Generate and edit images and videos through Atlas Cloud using one API key across multiple model families. Choose supported models for each task, download the results, and retain details about the model, inputs, and estimated cost.

  • Generate images and videos through one service
  • Edit product images using reference materials
  • Create videos from images, video, or audio references
calesthio/OpenMontage71.4KUpdated Oct 24, 2026

See all skills by calesthio

Report a problem with this skill