Not in the top 1,000 by GitHub stars

Win-Hao/music-mv

用 AI 写代码给一首歌做音乐 MV 的 agent skill:听懂歌 → 定画风 → 画角色 → 剧本分镜 → 先出草图再做整片 → 看片修改。每一帧都是代码画的,不是视频生成;不限模型。

History

Review weekly changes to SKILL.md before updating. Dates mark the weeks in which we observed each version; checks apply to the recorded commits.

View weekly changes

SKILL.md

Week of Nov 2, 2026 · +0 / −0 lines

Before Network or broad shell → After Network or broad shell

0088b1422f7f → 0088b1422f7f

Compare on GitHub

Week of Oct 26, 2026 · Line counts unavailable

Before Not checked yet → After Network or broad shell

First observation → 0088b1422f7f

No earlier version was observed for comparison.

Compare on GitHub

View on GitHubAdd to my skills

Verified commit 0088b1422f7f82cdf51b456436a6313127a26d6b

96GitHub stars
39stars in 7 days
1skill in this repository
3commits in 30 days

Heat

7.5
  • Star growth, last 7 daysNot available
  • Star growth, last 24 hoursNot available
  • Rank movement, last 7 daysNot available
  • Commits, last 30 daysNot available
  • Accounts asking about it through MCP, last 7 daysNot available
  • Hot votes this weekNot available

Heat never changes the order by stars, and sponsorship never touches it. How heat works

Stars over time

Oct 25, 2026Nov 6, 202696

30-day change not yet available: not enough history.

Individual skills in this repository

How it works

music-mv

When your agent uses it

用代码给一首歌做一支音乐 MV(不用视频生成模型):先把歌听懂(歌词时间轴、节拍、情绪起落、别人怎么理解这首歌),再定画风、画角色、写剧本和分镜、先出草图再做整片,最后照清单看片修改;也能先拆一支参考视频的风格再照着做。画面用 Canvas / p5.js / p5.brush 一帧一帧画,HyperFrames 合成歌词和歌。用户说「给这首歌做个 MV」「做一支音乐 MV / 歌词 MV / 动画 MV」「学这个视频的风格做一支 MV」,或 make a music video / lyric video for this song 时使用。不限模型,能读写文件、跑命令的 agent 都能照做。

What it loads into context

Frontmatter

195 tokens

Always available to the agent

SKILL.md

2,919 tokens

When the skill is activated

Reference documents

16,292 tokens

Loaded on request

Token counts are estimates. Scripts run separately; they are not counted as reference context.

The playbook

  1. 底线(每一步都守)
  2. 开始之前
  3. 第 1 步 听懂这首歌
  4. 第 2 步 定画风
  5. 第 3 步 画角色
  6. 第 4 步 剧本和分镜
  7. 第 5 步 先出草图,再做整片
  8. 第 6 步 看片、修改
  9. 发布前(提醒用户)
  10. 学一支视频的风格(可选)
  11. 脚本和模板

Scripts executed separately

  • scripts/_common.py
  • scripts/analyze_song.py
  • scripts/check_env.py
  • scripts/contact_sheet.py
  • scripts/finalize_audio.py
  • scripts/render_frames.mjs
  • scripts/srt2js.py
  • scripts/video_rhythm.py
  • templates/lyrics-layer.js

Files

  • .gitignoreasset37 bytes
  • LICENSEasset1,063 bytes
  • NOTICE.mddoc2,027 bytes
  • README.mddoc7,769 bytes
  • SKILL.mdcore9,663 bytes
  • docs/mv-earth.gifasset4,317,240 bytes
  • docs/mv-fireworks.gifasset4,405,463 bytes
  • docs/mv-seasons.gifasset3,482,746 bytes
  • docs/mv-sky.gifasset5,464,801 bytes
  • docs/style-collage.gifasset3,891,243 bytes
  • docs/style-crayon.gifasset4,481,425 bytes
  • docs/style-diorama.gifasset3,860,819 bytes
  • docs/style-pixel.gifasset301,877 bytes
  • examples/collage/scene.htmlasset63,734 bytes
  • examples/crayon/scene.htmlasset52,251 bytes
  • examples/diorama/scene.htmlasset66,201 bytes
  • examples/pixel/scene.htmlasset43,389 bytes
  • references/character.mddoc2,303 bytes
  • references/learn-style.mddoc2,607 bytes
  • references/render.mddoc9,368 bytes
  • references/review.mddoc4,063 bytes
  • references/storyboard.mddoc3,076 bytes
  • references/styles.mddoc6,499 bytes
  • references/transitions.mddoc2,762 bytes
  • requirements.txtdoc21 bytes
  • scripts/_common.pyruns2,119 bytes
  • scripts/analyze_song.pyruns7,926 bytes
  • scripts/check_env.pyruns2,355 bytes
  • scripts/contact_sheet.pyruns7,228 bytes
  • scripts/finalize_audio.pyruns3,073 bytes
  • scripts/render_frames.mjsruns8,831 bytes
  • scripts/srt2js.pyruns1,451 bytes
  • scripts/video_rhythm.pyruns6,352 bytes
  • templates/frames/scene.htmlasset2,461 bytes
  • templates/hf-canvas/index.htmlasset4,535 bytes
  • templates/hf-overlay/index.htmlasset1,898 bytes
  • templates/lyrics-layer.jsruns2,148 bytes
  • 教程.mddoc12,099 bytes
Read SKILL.md

# 用代码做一支音乐 MV

**原理**:不生成视频。代码把每一帧画出来(画面是时间 t 的函数),踩着歌的节拍和歌词编排,最后和原曲合成一条视频。下文 `<skill>` 指本文件所在的文件夹。

## 底线(每一步都守)

1. **一切跟着音乐走**:镜头在哪变、哪个画面最安静、最重要的画面放哪,都从歌里来(`song.md`、`song-analysis.json`)
2. **一句歌词,一个画面**:这句唱什么,画面就演什么。没听过这首歌的人只看画面,也能说出发生了什么
3. **关键处停下来等用户点头**:歌词、画风、角色设定图、分镜、草图。用户没确认,不往下做
4. **画面只由 t 决定**:同一个 t 永远画出同一帧,随机数用固定种子
5. **一个镜头一个画布**:背景、角色、道具画在同一个画布上、跟同一个镜头动,不把单独渲的角色视频叠在背景上
6. **你看不了视频**:节奏和动静靠脚本量(`video_rhythm.py`),画面靠接触表看(`contact_sheet.py`)。每版都跑,不凭感觉说「很流畅」
7. **歌词有版权**:不在对话、命令里整段打出歌词(会被内容过滤拦),脚本读文件,回复里只说第几句
8. **歌词以外的字不自己加**:片名、章节角标、印章徽章,用户要了再加
View the complete source on GitHub

Skills included

  • music-mv

Repository facts

License
MIT
Created
Oct 20, 2026
Last pushed
Oct 20, 2026
Forks
4
Open issues
0
Project activity
Active

Before you install

Network or broad shell

Automated signals, not a guarantee

Checked Nov 6, 2026

Show all 53 signals by file

NOTICE.md

  • Network accessline 5
    - HyperFrames(HTML 渲染成视频):<https://github.com/heygen-com/hyperframes>
  • Network accessline 6
    - GSAP 3(时间线,模板从 jsDelivr 加载):<https://gsap.com/standard-license>
  • Network accessline 7
    - p5.js(LGPL-2.1,模板从 jsDelivr 加载):<https://github.com/processing/p5.js>
  • Network accessline 8
    - p5.brush(MIT,模板从 jsDelivr 加载):<https://github.com/acamposuribe/p5.brush>
  • Network accessline 9
    - librosa(ISC):<https://github.com/librosa/librosa>
  • Network accessline 10
    - NumPy(BSD-3-Clause)、Pillow(MIT-CMU) - FFmpeg(LGPL / GPL,看你装的版本):<https://ffmpeg.org> - Whisper(MIT,可选):<https://github.com/openai/whisper>
  • Network accessline 11
    - FFmpeg(LGPL / GPL,看你装的版本):<https://ffmpeg.org>
  • Network accessline 12
    - Whisper(MIT,可选):<https://github.com/openai/whisper>
  • Network accessline 13
    - Puppeteer(Apache-2.0,逐帧渲染用):<https://github.com/puppeteer/puppeteer>
  • Network accessline 17
    - 缝合像素字体 Fusion Pixel Font(OFL-1.1,像素风的字):<https://github.com/TakWolf/fusion-pixel-font>
  • Network accessline 18
    - 霞鹜文楷 LXGW WenKai(字体 OFL-1.1,网页字体包 MIT,拼贴风的字):<https://github.com/lxgw/LxgwWenKai>
  • Network accessline 19
    - hanzi-writer-data(汉字笔顺数据,Arphic Public License,蜡笔风一笔笔写歌词):<https://github.com/chanind/hanzi-writer-data>

README.md

  • Network accessline 7
    <p align="center">   <img src="https://img.shields.io/badge/license-MIT-111111?style=flat-square" alt="MIT">
  • Network accessline 8
    <img src="https://img.shields.io/badge/license-MIT-111111?style=flat-square" alt="MIT">
  • Network accessline 9
    <img src="https://img.shields.io/badge/works%20with-any%20SKILL.md%20agent-111111?style=flat-square" alt="Agents">
  • Network accessline 10
    <img src="https://img.shields.io/badge/render-HyperFrames%20%2B%20FFmpeg-111111?style=flat-square" alt="Render">
  • Network accessline 66
    帮我安装这个 skill:https://github.com/Win-Hao/music-mv
  • Network accessline 69
    **或者用 [skills 命令行](https://github.com/vercel-labs/skills)**,一条命令装进 Claude Code、Codex、Cursor、Cline 等二十多种 agent:
  • Network accessline 80
    git clone https://github.com/Win-Hao/music-mv ~/.claude/skills/music-mv

examples/collage/scene.html

  • Network accessline 22
    --> <html lang="zh-CN"><head><meta charset="UTF-8" /> <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/lxgw-wenkai-webfont@1.7.0/lxgwwenkai-bold.css">
  • Network accessline 23
    <html lang="zh-CN"><head><meta charset="UTF-8" /> <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/lxgw-wenkai-webfont@1.7.0/lxgwwenkai-bold.css"> <style>html, body { margin: 0; padding: 0; overflow: hidden; background: #1f2f55; } 
  • Network accessline 24
    <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/lxgw-wenkai-webfont@1.7.0/lxgwwenkai-bold.css">
  • Dangerous shell operationline 336
    const rm = Math.min(rmax, Math.atan(2.0 / Math.max(4, size * 0.5)) / D2R);
  • Dangerous shell operationline 338
    return [(r() * 2 - 1) * amp, (r() * 2 - 1) * amp, (r() * 2 - 1) * rm * D2R + tilt];

examples/crayon/scene.html

  • Network accessline 29
    --> <html lang="zh-CN"><head><meta charset="UTF-8" /> <script src="https://cdn.jsdelivr.net/npm/p5@2.3.3/lib/p5.min.js"></script>
  • Network accessline 30
    <html lang="zh-CN"><head><meta charset="UTF-8" /> <script src="https://cdn.jsdelivr.net/npm/p5@2.3.3/lib/p5.min.js"></script> <script src="https://cdn.jsdelivr.net/npm/p5.brush@2.2.3/dist/p5.brush.js"></script>
  • Network accessline 31
    <script src="https://cdn.jsdelivr.net/npm/p5@2.3.3/lib/p5.min.js"></script>
  • Network accessline 32
    <script src="https://cdn.jsdelivr.net/npm/p5.brush@2.2.3/dist/p5.brush.js"></script>
  • Network accessline 702
    makePaper(); makeGlow();       await Promise.all([...new Set(LYRIC.replace(",", ""))].map(async (ch) => {         try { const res = await fetch(`https://cdn.jsdelivr.net/npm/hanzi-writer-data@2.0.1/${encodeURIComponent(ch)}.json`); MED[ch] 
  • Network accessline 703
    await Promise.all([...new Set(LYRIC.replace(",", ""))].map(async (ch) => {         try { const res = await fetch(`https://cdn.jsdelivr.net/npm/hanzi-writer-data@2.0.1/${encodeURIComponent(ch)}.json`); MED[ch] = (await res.json()).medians; }
  • Network accessline 704
    try { const res = await fetch(`https://cdn.jsdelivr.net/npm/hanzi-writer-data@2.0.1/${encodeURIComponent(ch)}.json`); MED[ch] = (await res.json()).medians; }

examples/pixel/scene.html

  • Network accessline 35
    const LW = 320, LH = 180;                         // 逻辑画布:一切都在这上面一格一格画 const SCALE = Math.max(1, Math.floor(Math.min((window.innerWidth || 640) / LW, (window.innerHeight || 360) / LH))); const FONT_URL = 'https://cdn.jsdelivr.net/npm/@fonts
  • Network accessline 36
    const SCALE = Math.max(1, Math.floor(Math.min((window.innerWidth || 640) / LW, (window.innerHeight || 360) / LH))); const FONT_URL = 'https://cdn.jsdelivr.net/npm/@fontsource/fusion-pixel-12px-proportional-sc@5.3.0/files/fusion-pixel-12px-p
  • Network accessline 37
    const FONT_URL = 'https://cdn.jsdelivr.net/npm/@fontsource/fusion-pixel-12px-proportional-sc@5.3.0/files/fusion-pixel-12px-proportional-sc-latin-400-normal.woff2';

scripts/_common.py

  • Executable scriptline 1
    Executable file

scripts/analyze_song.py

  • Executable scriptline 1
    #!/usr/bin/env python3

scripts/check_env.py

  • Executable scriptline 1
    #!/usr/bin/env python3

scripts/contact_sheet.py

  • Executable scriptline 1
    #!/usr/bin/env python3

scripts/finalize_audio.py

  • Executable scriptline 1
    #!/usr/bin/env python3

scripts/render_frames.mjs

  • Executable scriptline 1
    #!/usr/bin/env node

scripts/srt2js.py

  • Executable scriptline 1
    #!/usr/bin/env python3

scripts/video_rhythm.py

  • Executable scriptline 1
    #!/usr/bin/env python3

templates/frames/scene.html

  • Network accessline 5
    换成你的:DURATION、BPM、OFF、W/H、drawWorld(p, t)。出样图、草图:render_frames.mjs --times 1.5,4.2 --out sketches --> <html lang="zh-CN"><head><meta charset="UTF-8" /> <script src="https://cdn.jsdelivr.net/npm/p5@2.3.3/lib/p5.min.js"></script>
  • Network accessline 6
    <html lang="zh-CN"><head><meta charset="UTF-8" /> <script src="https://cdn.jsdelivr.net/npm/p5@2.3.3/lib/p5.min.js"></script> <script src="https://cdn.jsdelivr.net/npm/p5.brush@2.2.3/dist/p5.brush.js"></script>
  • Network accessline 7
    <script src="https://cdn.jsdelivr.net/npm/p5@2.3.3/lib/p5.min.js"></script>
  • Network accessline 8
    <script src="https://cdn.jsdelivr.net/npm/p5.brush@2.2.3/dist/p5.brush.js"></script>

templates/hf-canvas/index.html

  • Network accessline 10
    <meta charset="UTF-8" />     <meta name="viewport" content="width=1920, height=1080" />     <script src="https://cdn.jsdelivr.net/npm/gsap@3.14.2/dist/gsap.min.js"></script>
  • Network accessline 11
    <meta name="viewport" content="width=1920, height=1080" />     <script src="https://cdn.jsdelivr.net/npm/gsap@3.14.2/dist/gsap.min.js"></script>     <script src="lyrics.js"></script>
  • Network accessline 12
    <script src="https://cdn.jsdelivr.net/npm/gsap@3.14.2/dist/gsap.min.js"></script>

templates/hf-overlay/index.html

  • Network accessline 6
    <meta charset="UTF-8" />     <meta name="viewport" content="width=1920, height=1080" />     <script src="https://cdn.jsdelivr.net/npm/gsap@3.14.2/dist/gsap.min.js"></script>
  • Network accessline 7
    <meta name="viewport" content="width=1920, height=1080" />     <script src="https://cdn.jsdelivr.net/npm/gsap@3.14.2/dist/gsap.min.js"></script>     <script src="lyrics.js"></script>
  • Network accessline 8
    <script src="https://cdn.jsdelivr.net/npm/gsap@3.14.2/dist/gsap.min.js"></script>

templates/lyrics-layer.js

  • Executable scriptline 1
    Executable file

How the signals fit together

Facts from a static read of the files at the pinned commit. They describe what the code does, not why.

Some files could not be read; the facts below still hold.

Signal confidence: 28 facts

Works with

Agent compatibility, from the files in this repository
AgentStatusEvidenceInstall to
Claude CodeCompatibleStandard SKILL.md SKILL.md.claude/skills/<skill-name>/
CodexCompatibleStandard SKILL.md SKILL.md.agents/skills/<skill-name>/
CursorCompatibleStandard SKILL.md SKILL.md.cursor/skills/<skill-name>/
Gemini CLICompatibleStandard SKILL.md SKILL.md.gemini/skills/<skill-name>/
GitHub CopilotCompatibleStandard SKILL.md SKILL.md.github/skills/<skill-name>/
OpenCodeCompatibleStandard SKILL.md SKILL.md.opencode/skills/<skill-name>/
  • Native The repository ships a manifest, folder or frontmatter field for this agent.
  • Compatible A standard SKILL.md that this agent can read.
  • Unknown No evidence either way.

Derived automatically from paths, manifests and frontmatter. Not tested on each agent.