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
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.
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
30-day change not yet available: not enough history.
Individual skills in this repository
- music-mv
/
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 tokensAlways available to the agent
SKILL.md
2,919 tokensWhen the skill is activated
Reference documents
16,292 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- 底线(每一步都守)
- 开始之前
- 第 1 步 听懂这首歌
- 第 2 步 定画风
- 第 3 步 画角色
- 第 4 步 剧本和分镜
- 第 5 步 先出草图,再做整片
- 第 6 步 看片、修改
- 发布前(提醒用户)
- 学一支视频的风格(可选)
- 脚本和模板
Scripts executed separately
scripts/_common.pyscripts/analyze_song.pyscripts/check_env.pyscripts/contact_sheet.pyscripts/finalize_audio.pyscripts/render_frames.mjsscripts/srt2js.pyscripts/video_rhythm.pytemplates/lyrics-layer.js
Files
.gitignoreasset37 bytesLICENSEasset1,063 bytesNOTICE.mddoc2,027 bytesREADME.mddoc7,769 bytesSKILL.mdcore9,663 bytesdocs/mv-earth.gifasset4,317,240 bytesdocs/mv-fireworks.gifasset4,405,463 bytesdocs/mv-seasons.gifasset3,482,746 bytesdocs/mv-sky.gifasset5,464,801 bytesdocs/style-collage.gifasset3,891,243 bytesdocs/style-crayon.gifasset4,481,425 bytesdocs/style-diorama.gifasset3,860,819 bytesdocs/style-pixel.gifasset301,877 bytesexamples/collage/scene.htmlasset63,734 bytesexamples/crayon/scene.htmlasset52,251 bytesexamples/diorama/scene.htmlasset66,201 bytesexamples/pixel/scene.htmlasset43,389 bytesreferences/character.mddoc2,303 bytesreferences/learn-style.mddoc2,607 bytesreferences/render.mddoc9,368 bytesreferences/review.mddoc4,063 bytesreferences/storyboard.mddoc3,076 bytesreferences/styles.mddoc6,499 bytesreferences/transitions.mddoc2,762 bytesrequirements.txtdoc21 bytesscripts/_common.pyruns2,119 bytesscripts/analyze_song.pyruns7,926 bytesscripts/check_env.pyruns2,355 bytesscripts/contact_sheet.pyruns7,228 bytesscripts/finalize_audio.pyruns3,073 bytesscripts/render_frames.mjsruns8,831 bytesscripts/srt2js.pyruns1,451 bytesscripts/video_rhythm.pyruns6,352 bytestemplates/frames/scene.htmlasset2,461 bytestemplates/hf-canvas/index.htmlasset4,535 bytestemplates/hf-overlay/index.htmlasset1,898 bytestemplates/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 GitHubSkills 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 shellAutomated signals, not a guarantee
Checked Nov 6, 2026
- No broad tool permissions
- 2 dangerous shell commandsin 1 file: examples/collage/scene.html:336
- 42 network referencesin 8 files: NOTICE.md:5 README.md:7 examples/crayon/scene.html:29 and 5 more
- No hidden or obfuscated text
- No instruction overrides
- 9 executable scriptsin 9 files: scripts/_common.py:1 scripts/analyze_song.py:1 scripts/check_env.py:1 and 6 more
- No access to secrets
- No requests to vote in Hot
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
- Network access in prose of documentationNOTICE.md:5Low confidence
- Network access in prose of documentationNOTICE.md:6Low confidence
- Network access in prose of documentationNOTICE.md:7Low confidence
- Network access in prose of documentationNOTICE.md:8Low confidence
- Network access in prose of documentationNOTICE.md:9Low confidence
- Network access in prose of documentationNOTICE.md:10Low confidence
- Network access in prose of documentationNOTICE.md:11Low confidence
- Network access in prose of documentationNOTICE.md:12Low confidence
- Network access in prose of documentationNOTICE.md:13Low confidence
- Network access in prose of documentationNOTICE.md:17Low confidence
- Network access in prose of documentationNOTICE.md:18Low confidence
- Network access in prose of documentationNOTICE.md:19Low confidence
- Network access in prose of documentationREADME.md:7Low confidence
- Network access in prose of documentationREADME.md:8Low confidence
- Network access in prose of documentationREADME.md:9Low confidence
- Network access in prose of documentationREADME.md:10Low confidence
- Network access in code of documentationREADME.md:66Low confidence
- Network access in prose of documentationREADME.md:69Low confidence
- Network access in code of documentationREADME.md:80Low confidence
- Executable script in prose of a file that runsscripts/_common.py:1Low confidence
- Executable script in code of a file that runsscripts/analyze_song.py:1High confidence
- Executable script in code of a file that runsscripts/check_env.py:1High confidence
- Executable script in code of a file that runsscripts/contact_sheet.py:1High confidence
- Executable script in code of a file that runsscripts/finalize_audio.py:1High confidence
- Executable script in code of a file that runsscripts/render_frames.mjs:1High confidence
- Executable script in code of a file that runsscripts/srt2js.py:1High confidence
- Executable script in code of a file that runsscripts/video_rhythm.py:1High confidence
- Executable script in a comment of a file that runstemplates/lyrics-layer.js:1Low confidence
Works with
| Agent | Status | Evidence | Install to |
|---|---|---|---|
| Claude Code | Compatible | Standard SKILL.md SKILL.md | .claude/skills/<skill-name>/ |
| Codex | Compatible | Standard SKILL.md SKILL.md | .agents/skills/<skill-name>/ |
| Cursor | Compatible | Standard SKILL.md SKILL.md | .cursor/skills/<skill-name>/ |
| Gemini CLI | Compatible | Standard SKILL.md SKILL.md | .gemini/skills/<skill-name>/ |
| GitHub Copilot | Compatible | Standard SKILL.md SKILL.md | .github/skills/<skill-name>/ |
| OpenCode | Compatible | Standard 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.