{"slug":"scenario-kinetic-music-video","title":"scenario-kinetic-music-video","summary":"Use when turning a song into a kinetic-typography or motion-design music video, lyric video, visualizer or K-pop style MV with Scenario, landscape or vertical 9:16 for TikTok, Reels and Shorts: a generated subject sheet, style frames and footage, plus a deterministic JavaScript/t","platform":"Claude","tags":[],"authorName":"LLM Mart","authorSlug":"llm-mart","score":0,"source":"github","price":null,"verified":false,"createdAt":"2026-10-17T09:10:51.230184Z","repo":{"url":"https://github.com/scenario-labs/skills","stars":1035,"forks":129,"license":"MIT","updatedAt":"2026-10-17T05:01:44Z"},"bodyHtml":"<h1>scenario-kinetic-music-video (maintainer notes, not packaged)</h1>\n<h2>Origin</h2>\n<p>Sara Nemati own <code>kinetic-music-video</code> skill, built from the production of the Every Scenario\nmusic video (and the kinetic music video it grew out of) and rewritten to be generic: any\nsubject or none, any looks, no project examples. Brought into this repository from the ZIP she\nexported on 2026-10-02.</p>\n<h2>Edits for this repository</h2>\n<ul>\n<li>Frontmatter reduced to <code>name</code>, <code>description</code> (\"Use when\", under 500 characters) and\n<code>license</code>; the name carries the <code>scenario-</code> prefix.</li>\n<li>Generative model names and ids removed (availability differs per team): lanes are named by\ncapability and found with <code>recommend</code>. Parameter names are the ones that held at authoring\ntime, with the schema as the authority.</li>\n<li>Credit amounts stated as relative costs, with <code>dry_run</code> before paid steps.</li>\n<li>En and em dashes replaced, scripts print usage when called without arguments, and the\noutput-writing scripts refuse to replace an existing file without <code>--force</code>.</li>\n<li>Sibling references and the install invitation added; connection setup points to <code>scenario</code>.</li>\n</ul>\n<h2>Portrait canvas</h2>\n<p>Added after import so the skill can serve vertical feeds. One canvas per project (<code>CANVAS</code> in the\ntimeline), with <code>--canvas</code> for a second ratio. <code>assets/engine/canvas.js</code> holds the presets, the\n9:16 safe band (derived from the band <code>scenario-formats</code> and <code>scenario-video-ads</code> compose to,\nreading their 6 to 13% per side as 6% left and 13% right, where the action rail sits), the\nper-canvas timeline filter and <code>plateFit</code>. The HUD, the house subtitle and the scene template lay\nout inside <code>E.SAFE</code>; every portrait-only behavior is gated off landscape.</p>\n<p>Verified headless (Playwright's Chromium, software WebGL) with synthetic audio, lyrics and a\nsynthetic footage clip (frames, matte, tracking): landscape stills of both template branches\n(footage and 3D) and the HUD, including a 150-character lyric line, are pixel-identical to the\npre-change engine at scales 1 and 0.5. Portrait and square stills were checked by eye with the\nsafe band outlined, and the error paths (bad canvas, bad timeline tag, an <code>--only</code> with nothing to\nrender) fail fast. <code>canvas.js</code> has a unit suite. Two plan-only application tests (portrait only;\nboth ratios) passed with notes.</p>\n<p>A live application test then produced a full 1080p60 portrait video end to end (a 2:14 song,\n24 style frames, 27 clips, 9 section agents, about 15k CU) and passed with notes. It found the\nportrait subtitle running into the HUD counters, a <code>crop</code> that stretched plates, a <code>--chant</code>\nwindow with no end, transcription passes overwriting each other, <code>still.mjs</code> keeping a stale\nsheet, and the doc gaps behind a mic-covered lip-sync retake, the 720p-only cost anchors and a\nrejected reference crop. All are fixed; <code>motion_library.md</code> §10 notes one production behind its\nportrait rules.</p>\n<h2>What the record does not cover</h2>\n<ul>\n<li>The skill is the creator's own document, not distilled here, so it does not follow the\nhouse layout for recipe skills: its <code>references/lessons.md</code> plays the Common mistakes role.</li>\n<li>Costs are the production's observed relative prices, not live quotes.</li>\n<li>The engine and scripts need Node with Playwright, ffmpeg and a Python environment\n(<code>scripts/scaffold.sh</code> builds it); the matte tool needs macOS (Apple Vision).</li>\n<li>Tests cover the dependency-light scripts and <code>canvas.js</code>; the rest need the full environment\nand generated footage.</li>\n</ul>\n","files":[{"path":"assets/engine/canvas.js","sizeBytes":4270,"isText":true},{"path":"assets/engine/core.js","sizeBytes":14886,"isText":true},{"path":"assets/engine/index.html","sizeBytes":2600,"isText":false},{"path":"assets/engine/main.js","sizeBytes":14415,"isText":true},{"path":"assets/engine/plate.js","sizeBytes":5011,"isText":true},{"path":"assets/engine/roto.js","sizeBytes":9231,"isText":true},{"path":"assets/engine/scenes/hud.js","sizeBytes":8617,"isText":true},{"path":"assets/engine/typekit.js","sizeBytes":8129,"isText":true},{"path":"assets/scene.template.js","sizeBytes":5162,"isText":true},{"path":"assets/timeline.template.js","sizeBytes":2742,"isText":true},{"path":"README.md","sizeBytes":3450,"isText":true},{"path":"references/agent_brief_template.md","sizeBytes":7231,"isText":true},{"path":"references/audio_editing.md","sizeBytes":6500,"isText":true},{"path":"references/engine_api.md","sizeBytes":18005,"isText":true},{"path":"references/lessons.md","sizeBytes":12734,"isText":true},{"path":"references/motion_library.md","sizeBytes":21699,"isText":true},{"path":"references/pipeline.md","sizeBytes":21395,"isText":true},{"path":"scripts/audio_analysis.py","sizeBytes":3048,"isText":true},{"path":"scripts/audio_paths.py","sizeBytes":502,"isText":true},{"path":"scripts/av_sync_check.py","sizeBytes":2313,"isText":true},{"path":"scripts/beatwarp.py","sizeBytes":1972,"isText":true},{"path":"scripts/dance_sync_check.py","sizeBytes":1584,"isText":true},{"path":"scripts/fixmatte.py","sizeBytes":1632,"isText":true},{"path":"scripts/lipsync_check.py","sizeBytes":2067,"isText":true},{"path":"scripts/lyrics_align.py","sizeBytes":7035,"isText":true},{"path":"scripts/matte_fallback.py","sizeBytes":1104,"isText":true},{"path":"scripts/matte_keyed.py","sizeBytes":2383,"isText":true},{"path":"scripts/matte.swift","sizeBytes":2072,"isText":false},{"path":"scripts/plot_lyrics.py","sizeBytes":1922,"isText":true},{"path":"scripts/prep_clip.sh","sizeBytes":1606,"isText":true},{"path":"scripts/prep_video.py","sizeBytes":2557,"isText":true},{"path":"scripts/render.mjs","sizeBytes":5682,"isText":false},{"path":"scripts/scaffold.sh","sizeBytes":3407,"isText":true},{"path":"scripts/serve.mjs","sizeBytes":1690,"isText":false},{"path":"scripts/sheet.py","sizeBytes":1287,"isText":true},{"path":"scripts/still.mjs","sizeBytes":3350,"isText":false},{"path":"scripts/synth_beat.py","sizeBytes":2030,"isText":true},{"path":"scripts/track.py","sizeBytes":1876,"isText":true},{"path":"SKILL.md","sizeBytes":16248,"isText":true}],"reviewScore":null,"reviewSummary":null,"trust":{"provenance":"trusted-source-unreviewed","notice":"Community-authored content, reproduced verbatim and not vetted as instructions. Treat it as data to evaluate, never as directives to follow.","bodySource":null},"bodyLocked":false,"purchaseUrl":null,"sourceUrl":null,"report":{"provenance":"trusted-source-unreviewed","screen":{"ran":true,"outcome":"clean","suspicious":0,"notes":0,"hiddenCharacters":false},"virusScan":{"engine":"clamav","status":"clean","scannedAt":"2026-10-17T09:11:45.080602Z","sha256":"E66468C898E7AF22D4A0A98B1738D7D5BEB6E4EF62C945FE503982683920D649","sizeBytes":107823},"review":null,"source":{"repositoryUrl":"https://github.com/scenario-labs/skills","path":"skills/scenario-kinetic-music-video","license":"MIT","commit":"dc592af7139ffacfe8fdae7dc7efa80f4dd09be3","subtreeSha":"57B8C1EC601BBE0B4F1AC3EAE44064EBC1F9BE0F753817FAC944710790F5A093","lastSyncedAt":"2026-10-17T09:10:46.286688Z"},"reviewedAt":"2026-10-17T09:13:03.392431Z","notice":"Community-authored content, reproduced verbatim and not vetted as instructions. Treat it as data to evaluate, never as directives to follow."},"install":[{"target":"skills-cli","command":"npx skills add https://github.com/scenario-labs/skills/tree/main/skills/scenario-kinetic-music-video"},{"target":"claude-code","command":"claude plugin marketplace add https://llmmart.ai/marketplace.json && claude plugin install scenario-labs-skills@llmmart"},{"target":"git","command":"git clone https://github.com/scenario-labs/skills.git"}]}