音效
所有音效文件位于 kit/sfx/(会被复制到每个项目的 sfx/ 文件夹中)。这些音效由代码生成,无许可问题。
纸张音效集通过 tools/make-paper-sfx.ps1 生成(基于 FFmpeg 合成技术;重新运行该脚本可调整某个音效)。
| 文件 | 使用场景 |
|---|
tick.wav | 每个列表项 / 勾选出现时(干净样式) |
counter.wav | 数字滚动时(计数开始的瞬间) |
chime.wav | 最后一张卡片 / 结束卡片 |
pop.wav | 药丸形标签、徽章、贴纸、日历芯片弹出时 |
snap.wav | 截图或卡片到位时 |
star.wav · switch.wav · fill.wav · success.wav | 高亮显示 · 从之前到之后切换 · 进度条填充 · 达成目标 |
paper-flip.wav | 翻页:切换出入场景,场景变换 |
paper-drop.wav | 纸质卡片落下时 |
tape-rip.wav | 胶带固定卡片时(每张卡片一个,而不是每条胶带一个) |
paper-rustle.wav | 赎金风格字母 / 许多芯片爆发时 |
marker-tick.wav | 马克笔在列表行上打勾时 |
marker-scribble.wav | 连续多个叉号或涂鸦(约 0.85 秒) |
stamp.wav | 橡皮图章、"VS" 拍击、计数器卡片拍击 |
paper-slide.wav | 卡片从侧面滑入时 |
thump.wav | 重音强调关键行时 |
清脆 UI / 玻璃音效集(tools/make-crisp-sfx.ps1 [-Project projects\<n>])—— 当用户要求“更清脆”时使用
| 文件 | 使用场景 |
|---|
crisp-click | 卡片 / 面板落下时 |
crisp-pop | 药丸形标签、芯片、徽章、播放按钮 |
crisp-tick | 列表行、小型揭示效果、进度条开始 |
glass-tap | 液态玻璃瓷砖 / 应用 Logo 出现时 |
type-burst | 打字效果(0.6 秒) |
count-roll | 计数增加(1 秒) |
whoosh | 切换出入场景,大幅缩放 |
hit | 重音强调 |
alert · switch-on · send · sparkle · ding | 限制/错误 · 切换/开关 · 发送按钮 · 星星/高亮 · 成功 / 结束卡片 |
规则
- 套件默认(创作者风格):滑入/滑出无音效,无“嗖嗖”声,音量比人声低约 20 dB,音效数量少。
- 纸张剪裁风格(用户要求清脆的纸张音效):每次落下、胶带、勾选、印章、翻页都有音效;标题或退出时仍无音效。
- 音效必须与视觉事件发生的画面帧同步,而非动画开始的帧。
纸张剪裁模板偏移量(来自 kit/templates/paper-cut-vertical.html)
| 组件 | 音效 |
|---|
headline(t0) | paper-drop t0+0.35 · tape-rip t0+0.42 |
ransom(t0) | paper-rustle t0 |
checklist(items) | paper-drop items[0].t−0.10 · tape-rip items[0].t−0.05 · marker-tick 每个 item.t+0.08 |
counter(t0) | stamp t0+0.17 (音量 0.25) · counter t0+0.2 · tape-rip t0+0.25 |
versus(t0, right.t) | paper-slide t0 · paper-slide right.t · stamp right.t+0.52 |
calendar(t0, crossAt, glowAt, stamp) | paper-drop t0+0.35 · tape-rip t0+0.42 · marker-scribble crossAt · pop glowAt+0/0.12/0.24 · stamp stamp.t |
reframe(t0, t1) | paper-flip t0 · paper-flip t1 |
punch(t0) | thump t0 |
| 最后一张卡片 | chime 在卡片落下约 0.5 秒后 |
操作步骤(一个列表 → HTML + 快速混音)
- 编写
projects/<name>/sfx.json:[[时间, "音效名称", 音量?], ...](音量可选;默认值在 tools/sfx.mjs 中)。
node tools/sfx.mjs projects/<name> → 将 <audio> 标签(唯一 ID、实际时长、不重叠的音轨)写入 <!-- sfx:start --> / <!-- sfx:end --> 之间的 index.html 中,这样未来每次渲染都会包含它们。
- 已渲染完成?不要再重新渲染(渲染很慢):
node tools/sfx.mjs projects/<name> --mix renders/with-cards.mp4 renders/with-sfx.mp4 使用 FFmpeg 将音效混入现有音频,并复制视频流(对于 3 分钟的短片大约需要 10 秒)。限制器可防止削波。
npx hyperframes lint(期望 0 错误)。检查电平:ffmpeg -ss <时间> -t 1 -i out.mp4 -af volumedetect -f null NUL。
- 将结果复制到
exports/ 目录。通过编辑 sfx.json 并重新运行步骤 3(几秒钟)进行调整。
切勿触碰 <video> 的音频。VS Code 的内置播放器无法播放 AAC;请在 VLC 或默认播放器中预览完成的视频。