# 《月圆》分镜脚本

> 一支 59.5 秒的中秋拼贴动画。脚本、分镜、画面、纸张纹理、毛笔字、配乐、音效全部由代码生成，没有任何图片、字体文件或音频素材。
>
> 1920×1080（横版）/ 1080×1920（竖版，`?aspect=9:16`）· Canvas 2D 逐帧绘制 · 导出 30fps（可选 60fps）· Web Audio 实时合成

**一句话故事**：在异乡加班的她，中秋前夜收到妈妈的消息；月亮把她带回童年的院子和外婆讲过的玉兔、嫦娥；第二天傍晚她坐上回家的高铁，一家人围着圆桌分月饼、放孔明灯，最后毛笔写下"中秋快乐"。

**情感线**：孤单 → 想念 → 温暖的回忆 → 传说的浪漫 → 在路上的期待 → 团圆 → 祝福。

**音乐**：D 宫五声音阶，80 BPM（一拍 0.75 秒），段落边界都落在小节线上（9、15、24、33、39 秒）。主旋律分 A、B 两句，在不同段落由古筝、笛子轮流接力，团圆段第一次完整、饱满地奏响。

---

## 一 · 深夜　0:00 – 0:09

| 时间 | 画面 | 声音 |
|---|---|---|
| 0.0 – 2.1 | 靛蓝夜空，城市天际线分三层剪纸（远、中、近），窗户星星点点亮着。朱红撕边的竖条标题签《月圆》从上方落下，微微晃动。 | 城市低鸣（低通噪声）；Bm 和弦的笙音铺底，极轻；古筝零星三个音（B、A、升F，带揉弦）。 |
| 2.1 – 4.2 | 标题签被抽走；镜头推向近处一栋高楼上唯一亮着的一扇窗，窗里是一个伏案的人影。 | 纸签滑入/抽走的"唰"声；推镜的低风声。 |
| 4.2 – 5.1 | **转场·层层叠入**：室内那一幕像一张纸从画面下方滑上来，带着阴影和弹动，盖住城市。 | 纸张滑入，落下时"啪"一声。 |
| 5.1 – 6.2 | 办公室：她在工位上打字，笔记本的冷光照在脸上；墙上挂钟 23:47，日历"24 · 星期四 · 八月十四 · 明日中秋"，一张用胶带贴着的旧全家福，几张便签；台灯、马克杯冒着热气。 | 钟表滴答（每秒一下）；键盘敲击声。 |
| 6.2 – 7.8 | 手机震动、亮起，弹出妈妈的消息："**明天中秋了，回家吃饭吗？**" 她停下打字，低头看手机。 | 手机震动三下；两声清脆的提示音。 |
| 7.8 – 8.6 | 她抬起头望向窗外，月光爬上她的轮廓（冷蓝的屏幕光换成暖金色的月光描边），消息气泡淡去。 | 古筝轻轻上行四个音（D、E、升F、B）。 |

## 二 · 望月　0:09 – 0:15

| 时间 | 画面 | 声音 |
|---|---|---|
| 8.55 – 9.45 | **转场·撕纸**：办公室画面沿一道锯齿状的撕口从中间裂开，左右两半带着纸纤维白边向两侧翻开，露出下一幕。 | 撕纸声（颗粒状的噼啪噪声）。 |
| 9.0 – 11.2 | 她站在落地窗前的背影（金簪），镜头缓缓摇上：窗框、玻璃反光、城市灯火向下退去，剪纸月亮从云层后面露出——网点印刷的暗部、撕纸边缘、错版的朱红描边，隐约能看见月中的玉兔和桂树。 | 和弦转到 G，笙音慢慢涨起来。 |
| 11.2 – 14.0 | 月亮完全出现，云片从前后飘过，她的头微微后仰；镜头慢慢推近。 | 古筝一串上行**刮奏**，正好落在主旋律 A 的第一个音上（11.25s），主题 A 奏起，带滑音和揉弦。 |
| 14.0 – 15.0 | 镜头坠入月亮：画面被满屏的金色和放大的网点吞没。 | 铃声一路上行，风声呼啸。 |

## 三 · 故乡　0:15 – 0:24

| 时间 | 画面 | 声音 |
|---|---|---|
| 15.0 – 17.2 | 月亮的金色变成一盏红灯笼的特写（**转场·匹配剪辑**），镜头一路拉开：朱红飞檐、灯笼、剪纸月亮、墨线枝干的桂花树、月洞门里的竹子、格子窗。暖色的"回忆"调色，桂花一直在飘。 | 和弦 D，古筝八分音符琶音，温暖的低音；蟋蟀、风铃。 |
| 16.0 – 23.3 | 外婆坐在小凳上摇扇子，桌上摆着月饼和青花茶壶；扎着两个小揪揪的小女孩提着发光的兔子灯，从左到右跑过院子（定格动画式的两帧一拍）。 | 主题 B（17.25s 起），D → Bm → G → A；小脚步声。 |
| 18.5 – 23.0 | 一张牛皮纸条被胶带贴上墙，逐字打出：**"小时候，外婆总说：月亮上住着玉兔。"** | 纸条"唰"地贴上；每个字一声轻轻的打字声。 |

## 四 · 传说　0:24 – 0:33

| 时间 | 画面 | 声音 |
|---|---|---|
| 23.35 – 24.45 | **转场·翻卡**：整个院子像一张卡片沿竖轴翻过去，背面翻出传说的一幕。 | 纸卡翻动的两声"唰"，中间一声落定。 |
| 24.2 – 25.5 | 深靛蓝夜空，四个金色剪纸角花从四角滑入；大月亮居中，桂树从月面"长"出来，玉兔弹跳着冒出，面前一只捣药臼。 | 一声轻轻的小锣；铃声点缀；玉兔出现时古筝一个滑音。 |
| 25.5 – 32.6 | 玉兔踩着节拍捣药，每一拍药杵砸下、药粉飞溅；嫦娥（朱红剪纸）拖着金、红、白三条飘带，从左下沿弧线飞向月亮；金色、米白的祥云前后飘过。 | **木鱼声和捣药严格同步**（每拍一下）；笛子吹主题 A，结尾一串上行；Em → A → Em 的笙音。 |

## 五 · 归途　0:33 – 0:39

| 时间 | 画面 | 声音 |
|---|---|---|
| 32.0 – 33.7 | **转场·车票**：一张淡蓝色的"中秋 · 回家专列"车票飞进画面——异乡站 → 故乡站，G815，2026年09月25日 17:30开，08车15号，"¥ 团圆价"；检票钳"咔"地打出一个圆孔，纸屑翻飞；新的一幕从右侧滑入盖住传说，车票飞出。 | 车票滑入；检票"咔嚓"；纸张滑动。 |
| 33.0 – 39.0 | 高铁在夜里驶过河上的高架桥：桂林式的剪纸山峦分两层向后退，远岸树影和村落灯火，桥墩在河里投下晃动的倒影，河面上月亮的倒影被水波揉碎；月亮一直跟着列车。 | 车轮"咔嗒—咔嗒"踩在拍子上，低频隆隆；古筝八分音符律动（G → A）；笛子吹主题 B。 |
| 34.9 – 38.1 | 她的车窗上方弹出回复："**妈，我上车了！今晚回家吃饭。**"一秒后显示"已读"。 | 发送"嗖"一声；"已读"一声轻响。 |

## 六 · 团圆　0:39 – 0:47

| 时间 | 画面 | 声音 |
|---|---|---|
| 38.3 – 39.4 | **转场·月亮变圆桌**：河上的月亮滑到画面中央、放大，落定成一张圆桌的转盘（月圆 = 桌圆）；列车画面淡出，俯视的院子铺开。 | 风声；古筝刮奏落下。 |
| 39.0 – 40.1 | 俯视的红漆圆桌：转盘上一道道菜"弹"出来——大闸蟹、清蒸鱼（年年有余）、柚子、桂花糖藕，正中一盘印着"团圆"的月饼；外婆、外公、爸爸、妈妈、侄女一个个"落"到座位上（剪纸落桌的弹动）。 | 和弦 D；每道菜、每个人落下都有一声纸拍声。 |
| 40.35 – 41.5 | 最靠近镜头的座位一直空着——她从画面下方进来坐下（奶白外套、红围巾、发髻上的金簪，和望月时一样）；大家不约而同朝她靠过来。 | 她落座时稍重的一声，加一声暖铃；**主题 A 第一次完整奏响**（41.25s 起，全片最饱满的一段）。 |
| 41.35 – 43.3 | 刀把月饼切成六块，六块月饼依次飞进六个人的碗里。 | 三声切刀声；六声轻轻的"嗖"。 |
| 43.2 – 45.3 | 全家起身、探身举杯（俯视时"站起来"就是变大、靠近），六只杯子在转盘上方相碰，金、红、白纸屑炸开。院角的水缸里也浮着一个小月亮，桂花、灯笼、茶盘。 | 一串玻璃碰杯声 + 铃声。 |
| 44.9 – 46.75 | 转盘慢慢转动，镜头微微升高。46.75 闪光灯一闪。 | 快门"咔嚓"。 |

## 七 · 中秋快乐　0:47 – 0:59.5

| 时间 | 画面 | 声音 |
|---|---|---|
| 46.75 – 49.1 | **转场·拍立得 + 层层叠入**：定格的团圆画面变成一张白边拍立得"2026 · 中秋 · 全家福"，缩小、倾斜着飘到角落再落下；河边的新场景一层一层叠进来——月亮、远山、河面、河岸和一家人。 | 快门余音；五声依次落下的纸拍声；流水声起。 |
| 47.5 – 51.3 | 一家人的剪影站在河边（月光在轮廓上描一道金边），她和侄女把一盏孔明灯举过头顶，灯越来越亮，49.2 放手升空；整条山谷都升起孔明灯，远山上空绽开剪纸菊花烟花，河面漂着荷花灯。 | 笙音 G → D；笛子吹主题 B；放灯时一声轻呼；烟花的哨声、闷响和噼啪声。 |
| 51.3 – 53.3 | 镜头随孔明灯摇上夜空，满天灯火；一张洒金宣纸（靛蓝裱边）从左侧滑入。 | 铃声一路上行；纸张滑入落定。 |
| 53.35 – 57.25 | 一支毛笔一笔一笔写出 **"中秋快乐"**：按笔顺，起笔重、收笔带飞白，笔在笔画之间提起、移动。 | 每一笔都有沙沙的笔触声（与笔画时长同步）；古筝慢慢地、一个音一个音地回到主题 A。 |
| 57.4 – 58.1 | 朱红的"月圆"印章"咚"地盖下；小字落款"丙午中秋"，下方一行 HAPPY MID-AUTUMN FESTIVAL · 2026。 | 盖章的闷响；古筝一串上行刮奏落在 D 大调和弦上，摇指长音；低音 D、铃声。 |
| 58.1 – 59.5 | 定格在题字、月亮、满天孔明灯上，58.9 起淡出。 | 余音在混响里散去。 |

---

## 转场一览

撕纸（1→2）· 金色匹配剪辑（2→3）· 翻卡（3→4）· 车票打孔 + 新纸滑入（4→5）· 月亮变圆桌（5→6）· 拍立得 + 层层叠入（6→7）。另外第一段内部城市→室内用了一次"纸片从下方叠入"。

## 实现要点

- **纯函数渲染**：`renderFrame(t)` 只由时间 t 决定；所有"随机"都来自整数种子哈希，任意跳帧、倒放、逐帧导出结果一致。
- **纸与笔**（`js/paper.js`、`js/brush.js`，全部自写）：可平铺的纸纤维颗粒（值噪声 + 纤维短线）；撕纸边 = 沿多边形法线推开的分形噪声 + 露出的白色纸芯 + 毛边纤维；剪刀边；旋转网格的网点；丝网印刷式错版描边；Catmull-Rom 样条笔刷（笔丝、洇墨、飞白）。书法字按笔顺存成 `[x, y, 宽度]` 骨架，预先烘焙成墨迹，再用沿笔画推进的裁剪蒙版逐笔"写"出来。
- **定格手作感**：纸片以 8fps 轻微抖动（boil），小女孩跑步两帧一拍，颗粒纹理每秒刷新 8 次。
- **声音**（`js/audio.js`）：古筝 = Karplus-Strong 拨弦（全通分数延迟调音、拨弦位置梳状滤波、指甲噪声、揉弦颤音、滑音、刮奏、摇指）；笙 = 自定义周期波形的和弦铺底；笛子 = 周期波形 + 气声 + 颤音；铃、小锣、木鱼 = 非谐泛音加法合成；纸张、撕纸、车轮、烟花、毛笔 = 滤波噪声包络；混响是程序生成的脉冲响应。整首配乐是一张约 500 个事件的时间表：播放时提前 0.7 秒调度并以音频时钟驱动画面；导出时用 OfflineAudioContext 渲染成 WAV。
- **竖版**：同一套场景在 `?aspect=9:16` 下重新构图（竖条标题、竖幅宣纸、竖排"中秋快乐"等），不是裁切。

## 操作

点击画面开始（有声）· 空格 播放/暂停 · ← → 后退/前进 5 秒 · Home 回到开头 · 拖动进度条跳转（刻度 = 段落）· F 全屏 · M 静音 · "竖版"按钮或 `?aspect=9:16` 切换 1080×1920 · `?t=秒数` 打开到指定时刻 · `?autoplay` 自动播放。

## 导出

```bash
# 依赖 puppeteer（npm i puppeteer），或 puppeteer-core + CHROME=/path/to/chrome
node export.cjs                          # 横版 1920×1080 · 30fps → export/landscape/yueyuan_1920x1080.mp4
node export.cjs --aspect 9:16            # 竖版 1080×1920
node export.cjs --fps 60 --format jpg    # 60fps、JPEG 中间帧（更快）
node export.cjs --from 24 --to 33        # 只导出一段
```

脚本逐帧调用 `renderFrame(t)` 截取画布存成帧序列，再调用页面里的 `__wav()` 离线渲染配乐；找得到 ffmpeg 就合成 MP4（H.264 + AAC），找不到就只导出帧和 `score.wav`，并打印合成命令：

```bash
ffmpeg -framerate 30 -i export/landscape/frames/%05d.png -i export/landscape/score.wav \
  -c:v libx264 -preset slow -crf 19 -pix_fmt yuv420p -movflags +faststart -c:a aac -b:a 192k -shortest yueyuan.mp4
```
