关于 motion-design-prompt-generator
面向 AI 编码 Agent 的工作流技能,可将动态影片提示词转化为 Remotion 项目。它侧重保留提示词细节、预先规划时间线、设计各个元素并检查渲染结果。
主要功能
- 01提示词与变换清单
- 02设计契约与风格种子
- 03场景时间线规划
- 04元素专属设计指南
- 05评审与反模板检查
- 06确定性 Remotion 渲染
适用场景
- 01将简短创意扩写为影片提案
- 02根据提示词制作动态影片
- 03检查场景连续性与时序
- 04检查渲染帧并修订设计
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ 8533502-dev/ deepseek-opus-motion-skill --skill motion-design-prompt-generator安装后在 Claude Code 中输入/motion-design-prompt-generator确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
REFERENCE.md安装说明.mddesign-systems/bold-poster.mddata-instrument.mddrafting-table.mdeditorial-ink.mdREADME.mdriso-halftone.mdstorybook-scene.mdswiss-kinetic.mdexamples/character-rig/README.mdexamples/character-rig/src/Film.tsxexamples/drafting-table/README.mdexamples/drafting-table/src/Film.tsxspec.tstemplates/remotion-starter/package.jsontsconfig.jsontemplates/remotion-starter/scripts/check.shcues.jsonscore.mjstemplates/remotion-starter/src/Film.tsxindex.tsRoot.tsxspec.tstemplates/remotion-starter/src/lib/film.tsxmotion.tsxtemplates/remotion-starter/src/scenes/Scene01.tsx详细介绍
Opus 同等水准的动态影片(Remotion)
**目标:**无论主题或风格如何,将同一条提示词分别交给 Opus 5.5 和运行此技能的模型,生成的影片在观感、动态和声音上都几乎相同。
差距很少在于审美,更多在于行为。Opus 会:
- 遵循长提示词中的每一项要求;
- 将模糊的词语转化为具体的设计决策;
- 妥善设计每个元素,而不是用占位符敷衍了事;
- 编码前规划完整时间线;
- 构建一套共享系统,确保内容始终保持一致;
- 检视自己的输出并加以修正。
如果不明确要求,较弱的模型会跳过上述每一项。此技能基于 Open Design 架构,将这些要求明确下来:
| Open Design 组成部分 | 本项目中的对应内容 |
|---|---|
| 负责工作流的功能性技能 | 本文件:优先级、各阶段和元素操作指南 |
每次渲染都会读取的 DESIGN.md 契约 | src/spec.ts 顶部的设计契约;design-systems/*.md 是其起始模板 |
| 模板 | templates/remotion-starter/,已通过测试(完整源代码见 REFERENCE.md) |
| Design Jury 评审关卡 | 第 6 阶段:五位评审,持续修正,直至每位评审的评分都达到 ≥ 8 |
| 防止低质生成的检查清单 | 第 6 阶段的禁用清单 |
| 确定性渲染 | Remotion:每一帧都是帧编号的纯函数 |
优先级顺序
当规则相互竞争、需要取舍时,按以下顺序处理:
- 提示词本身的文字:每项价值、节拍、文案和禁用要求。
- 符合风格水准的视觉效果和工艺:构图、调色板、字体,以及每个元素的妥善设计(见操作指南)。质感和光线也属于这一项。这是观众最先评判的内容。
- 连贯性:真实的变换、持久一致的身份、可信的物理效果。
- 节奏和声音。
- 记录管理:台账、表格和检查。它们服务于第 1–4 项,绝不能取而代之。
辅助工具和示例只是实现机制,不是风格。 motion.tsx 决定元素的位置和运动方式,但绝不决定它们的外观。绝不可将辅助工具的中性默认效果(例如纯色方框或棍状四肢)直接当作设计交付。绝不可将某个示例的主题、调色板或布局照搬到另一部影片中。每部影片都必须有专属设计风格,其丰富程度至少不低于不使用辅助工具时的效果。
调用方式
- 任何动态影片请求都要执行完整流程。不要提问:在第 1 阶段解决缺失信息,并在“解读”中说明。
- 每条新提示词都是一部新影片,必须基于起始模板重新构建,即使此前的对话中已经制作过影片。只有用户明确要求修改时,才可复用先前的代码(修改、改一下、在上一版基础上、fix this)。在支持文件工具的宿主中,为影片创建新的项目文件夹。
- 模式。 默认模式是构建。只要提示词 / 扩写 / “prompt only”模式会在第 2 阶段后停止,并将扩写后的简报放在一个围栏式
text代码块中输出。 - 宿主环境。 纯聊天环境:以代码块形式输出文件(第 7 阶段)。支持文件和 shell 工具的环境:写入文件,运行
npx tsc -p .、npm run render和npm run check,查看静帧并进行修正,然后汇报结果。 - 如果消息中没有创意,唯一回复:“请给我一句话的创意或一段完整的提示词。”
阶段 0 — 像 Opus 一样阅读提示词:三本台账
-
规格台账
S01…:每个数值或指令各占一行,并逐字引用。内容涵盖时长、尺寸、颜色、字体、字重、文案、数量、角度、位置、时间、缓动、禁用项、循环或结尾、角色以及每个分镜节拍。spec.ts中的FILM(时长、fps、尺寸)由这些条目确定;绝不能保留起始模板中的占位值。截断的提示词应沿用其最后一个完整部分的语气和信息密度补全,并将相应条目标记为S##*。 -
变换台账
X01…:记录每个表示变化的动词(becomes、turns into、gathers、dissolves、unfolds、grows into、变成、化成、收拢、汇聚、展开),格式为source → target · mechanism · start–end s · what is conserved。 -
元素台账
E01…:记录每个绘制对象,并按其操作手册分类(type、object、character、environment、data、UI、transition、texture-light、sound),同时列出:- 三个或更多结构特征;
- 尺寸和坐标;
- 移动方式;
- 对于角色,列出设计稿和命名姿势;
- 对于手持物品,记录各时间点的持有者。
每个场景还要列出从后到前的图层顺序。
每个数值都具有约束力:不得对其取整、改名、改色、改时间或省略。长提示词的最后三分之一与开头同等重要。如果两条目冲突,保留更具体的一条,并在解读中注明。在代码中:
- 常量放在
spec.ts,并标记为// S07; - 构建器放在
film.tsx,并标记为// E03; - 节拍放在场景文件中,并标记为
// S31 X02。
阶段 1 — 像 Opus 一样填补空缺
仅补充提示词未明确的内容;绝不覆盖台账条目。
| 空缺 | 类 Opus 默认值 |
|---|---|
| 格式 | 1920 × 1080;密集动态内容用 60 fps,平静或角色类作品用 30 fps。明确指定的格式具有约束力;快速预览时使用 npm run preview,绝不降低 FILM |
| 时长和结尾 | 概念短片为 15 s,作品集或品牌影片为 30 s。短循环和标识采用无缝循环;故事和宣传片采用完整的最终画面或片尾卡 |
| 节奏 | 根据氛围确定节奏:舒缓为 60–90 BPM,品牌类为 110–128 BPM,活力充沛为 128–140 BPM。密集作品每拍都有一个事件,平静作品每小节都有一个事件。密集内容的停留时间 ≤ 0.5 s;平静内容则按文案所需时长停留 |
| 叙事 | 用一个母题或载体贯穿影片;每个场景都从前一个场景自然延展;不使用无关的标题卡 |
| 摄影机 | 除非提示词暗示有移动,否则固定并正面拍摄。故事类作品以完整世界的广角画面开场 |
| 构图 | 根据风格的画面占比和留白来确定。静止内容距左右边缘不得小于 150 px,距上下边缘不得小于 90 px |
| 字体排印 | 选择一个有个性的字体系列。重点词或数字使用最粗字重和最大字号。拉丁字体:Inter、Geist、Space Grotesk、Fraunces;中文字体:Noto Sans SC、Noto Serif SC |
| 色彩 | 采用 3–5 种各有用途的颜色;强调色应预示接下来的内容 |
| 纹理和光线 | 根据元素尺寸选择对应材质。光线应来自合理的光源 |
| 细节 | 设计三个反复出现的微细节,让影片具有创作感(标签、刻度、图例、时间码、标识)。不得在提示词之外添加新的主张、数字或文案;提示词有明确措辞时应沿用 |
| 字幕 | 任何屏幕上的对白、歌词或字幕:1080p 下字号 ≥ 40 px,对比度高,位于下三分之一处;完整句子应在其阅读时间内持续显示(每个汉字约 0.25 s,拉丁文每秒约 3 个词) |
| 声音 | 生成符合氛围的配乐;环境主导的场景则使用环境音。只有在明确要求时才保持静音 |
第 2 阶段 — 方向:从提示词中推导设计契约
风格来源:
- 提示词明确说明风格(配色、材质、字体、参考)。契约仅从记录表中得出。
- 提示词描述一种感受、媒介或参考(“像报纸”、“水墨”、“terminal”、“Swiss poster”、“Pixar-like”)。从
design-systems/中最接近的种子开始并加以调整。 - 提示词只有一个大致想法。 使用以下方法综合设计新契约。种子只是可选的起点,并非默认方案。
风格综合方法(适用于任何主题):
- 主题 → 世界。 这个主题存在于什么物质世界中?纸张、墨水、玻璃、金属、织物、屏幕、自然、城市、实验室。选一个,最多再选一个与之形成对比、用于转化的世界。
- 受众和情绪 → 能量。 平静还是有冲击力,温暖还是精准,活泼还是严肃。这决定节奏、缓动、超调和密度。
- 具体化。 用数值而不是形容词写出契约:
- 配色: 带用途的十六进制值。
- 字体: 字体系列、字重、字号、字距。
- 视觉标记: 线条、填充和形状的绘制方式,采用 SVG 技法说明。
- 纹理和光线: 分元素说明。
- 构图: 占比、留白、边缘规则。
- 动态特征: 按运动类型指定缓动。
- 转场语法: 哪种机制改变哪一个场景。
- 标志性细节。
- 声音配色。
- 禁用项。
- 检查是否流于俗套。 每项选择都必须能追溯到主题或提示词。泛泛的渐变、辉光和模板布局,正是设计契约要取代的内容。
design-systems/ 中的种子:
| 种子 | 适用场景 |
|---|---|
drafting-table | 流程、工具、工程 |
swiss-kinetic | 品牌、发布、宣言 |
editorial-ink | 文化、工艺、传统、东亚主题 |
data-instrument | 解说、金融、科学 |
bold-poster | 音乐、体育、青年 |
riso-halftone | 独立、复古、活泼 |
storybook-scene | 角色、故事、MV |
简短提示词: 先以 Opus 密度写出完整简报。简报包含方向段落、契约、结构(节奏、场景名称、场景变化)、角色(如有),以及带时间戳和数字的逐场景分镜。该简报将成为记录表。在仅提示词模式下,输出简报后即停止。
第 3 阶段 — 先定时间线,再写代码
- 每个场景写一行:
start–end s · name · what the viewer learns · carried element in → out · transition out (X##)。 - 列出每个事件:
t: element (E##) · action · numbers · ids。 - 在
T块中标出关键时刻。 - 根据同一组事件推导声音提示列表。
继续之前的检查:
- 节拍落在 60/BPM 的倍数上;
- 每个场景的结束状态与下一个场景的进入状态一致;
- 同一属性不会同时由两个动作驱动;
- 所有内容都在结束前完成;
- 对于循环,虚拟的 t = D 帧必须与第 0 帧一致,且所有运动都处于静止状态。
第 4 阶段 — 先设计,再制作动态效果
- 在模块级别根据每个元素的结构特征构建其几何形状。
- 对于角色,先制作一张角色设定表:在同一张静帧中呈现每个角色的所有指定姿势,并让角色拿着各自的道具。
- 将关键构图精确固定为以 px 为单位的布局:第 0 帧、每个场景或材质的首个完整帧,以及最终帧。逐一检查它们是否符合契约中的占比和留白要求。
- 在编写静态状态后,再编写它们之间的动态变化。动态效果无法挽救糟糕的静帧。在文件工具宿主中,先渲染并查看这些静帧。
元素制作手册
每个请求都由以下元素类型组成。针对每种元素,遵循其制作手册。
| 元素 | 构建 | 动起来 | 检查(常见故障) |
|---|---|---|---|
| 文字 | 使用同一套字体;通过字重和字号建立层级;每种字号单独设置字距;大词排在一行,适配指定宽度;拆分的单词和字母之间保留空格;CJK 文字可以竖排 | 以 EASE.out 入场;错开 0.02–0.06 s;通过槽位裁切、沿轨道滑动、缩放显现;离场前保持足够时间,确保可读 | 单词连在一起、行尾孤字、字幕太小或对比度太低、最有冲击力的部分没有采用最粗的字重 |
| 物体(图标、道具、产品、符号) | 至少呈现真实物体的三个结构特征;用一侧阴影塑造体积;保持轮廓处理方式一致;将其构建为函数,仅构建一次 | 根据物体特性运动:纸张沿折痕弯曲、液体泛起涟漪、金属绕轴旋转、灯光开关 | 用符号代替物体、部件悬浮、不同镜头间比例不一致 |
| 角色 | 使用 Body 设计表:轮廓、比例、颜色、面部、标记均通过 color、face 和 parts 设计;为姿势命名 | 在命名姿势之间使用 poseMix 过渡,并以 settle 稳定姿势;行走时使用 walk();加入细微且易读的表演动作;道具放在 grip() 处,并绘制在 held 中 | 不同镜头间外观漂移、手没有拿住道具、肢体穿过头部、默认采用火柴人外观、双脚离地 |
| 环境(房间、城市、景观、天气) | 从后到前分层:天空或墙面、远景、中景、地面、前景。光源及其光影形状要有明确依据。天气在画面中分布于两个深度 | 保持持续的环境动态(天气、灯光、细小循环动作);除非有要求,否则摄像机保持静止 | 背景过于平面、天气穿过实体、缺少合理的光照逻辑、画面边缘到边缘都很杂乱 |
| 数据(图表、计数器、示意图、地图) | 先确定坐标轴和单位;数值必须与数据台账完全一致;标签附在对应标记上;每个场景只放一张图表 | 依次呈现坐标轴、数据、注释;计数器与对应标记同步滚动;图表通过共用槽位相互变形 | 数字错误、坐标轴未标注、装饰遮盖数据、标签不符合提示词中的措辞 |
| UI / 产品 | 使用真实界面或忠实重现的界面,确保矩形边缘清晰、比例准确、层级真实 | 由光标或状态变化驱动;放大到发生变化的区域 | 截图拉伸、界面中出现虚假的杂乱元素、小字难以辨读 |
| 转场 | 使用物理机制:变形(chain)、合并(converge)、遮罩或擦除(Reveal)、材质变化(在 Reveal 下使用两次 MaterialLayer)、展开、通过共享形状匹配衔接 | 边缘清晰;按节拍规划;源元素消失的同时目标元素形成 | 交叉淡化、使用提示词未要求的切镜、元素突然出现、材质变化时失去原有身份特征 |
| 纹理与光线 | 将纸张与油墨分为独立图层(使用 Paper、由 roughFor 缩放的 InkFilter);通过图案实现网点和排线;用形状呈现光线(光锥、亮灯窗户、反射) | 使用固定种子并保持稳定,或按固定步长变化 | 所有物体都使用均匀纹理、装饰性光晕或泛光、未设置随机种子导致闪烁 |
| 声音 | 在 scripts/cues.json 中:音乐场景使用带有音高的背景音和旋律,或环境主导的场景使用 ambience 背景音;每次视觉冲击都配有音效 | 与 T 区块同步;循环音轨的尾部衔接到开头 | 因遗漏而无声、用噪声代替音乐、音效与画面不同步 |
通用规则
- 变形真实发生。 每一行 X 都会让同一个对象逐点变形(点数相同;多个形状用
chain(),多个对象合并为一个用converge())。目标成形时,源对象消失。必须完全变成目标:如果提示词说“变成柱状图”,最终就要呈现为柱形。各部分从源位置诞生并移动。合并和拆分要保持数量守恒。绝不能用叠加、交叉淡化或缩放整个画面来伪造变形。 - 身份持续不变。 除非提示词另有说明,否则元素在每个场景和材质变化中都要保留其颜色、形状和槽位。只需将形状描述一次,作为带有调色板索引的
Item,并用MaterialLayer渲染每种材质。彼此变形的元素要共用一个槽位常量(路径、基线或锚点)。 - 明确表现物理效果和深度。 每个场景都要列出从后到前的图层。天气效果要遵循遮挡关系;玻璃后的物体要带有色调;反射要镜像其来源;阴影要共用一个光源方向。要计算接触位置:脚落在地面上,手接触所持物体。
- 空间词汇对应坐标。 在 1920 × 1080 的画面中,中心是 (960, 540);左右三分之一处的 x ≈ 640 和 x ≈ 1280;上方是 y ≈ 360;下方是 y ≈ 760。其他格式需按比例缩放。
- 节奏均匀。 屏幕变化要遵循节拍。重音是经过规划的节点;除非计划停顿,否则不能有空白秒数。用
npm run check检查。 - 默认带声音,且只能通过
score.mjs添加。音乐使用有音高的乐器;环境场景要有ambience氛围音轨;噪声点缀不得超过 1 s。脚本会拒绝既没有音乐也没有氛围音轨的配乐。 - 完成并检查。 完整编写每个场景,运行评审,并持续修复,直到每位评审者的评分都达到 8 分或以上。
第 5 阶段 — 在 Remotion 中构建
templates/remotion-starter/ (copy once) tested on Remotion 4.0.537 + React 19.1.0
src/index.ts src/Root.tsx do not change
src/lib/motion.tsx helpers — do not change (API below)
src/lib/film.tsx your builders, Body sheets, Items (E##)
src/spec.ts design contract, FILM, ledger constants (S##), T block
src/Film.tsx master timeline: persistent layers, material changes, <Audio>
src/scenes/SceneNN.tsx one file per scene, absolute timestamps
scripts/cues.json sound cues (you write it) · score.mjs, check.sh — do not change
规则:
- 时间。 只能使用
useTime(),其中t是绝对秒数。禁止使用 CSS 动画、计时器、Date、Math.random(改用rand或wobble),也不能在帧之间保留状态。 - 场景不能使用
<Sequence>。 每个场景都使用绝对时间t,并在自身时间窗口之外返回null。持久元素要在整个影片的Film.tsx中只绘制一次。 - 缓动。 使用
EASE.*和settle()。Remotion 自带的Easing.exp在起始位置并非恰好为 0,会导致隐藏图层泄漏。 - 文字。
- 使用 HTML 排版,字母间距以 em 为单位;逐字母运动使用
<Letters>。 - 图案填充、描边和裁剪使用 SVG
<text>。 - 竖排 CJK 使用
writingMode: 'vertical-rl'。
- 使用 HTML 排版,字母间距以 em 为单位;逐字母运动使用
- 字体。 从
@remotion/google-fonts/<Family>使用loadFont,并且只加载所用的字重;对于 CJK 字体系列,省略subsets。 - 声音。
FILM.sound = true会播放public/score.wav。npm run studio、npm run preview和npm run render会先根据cues.json重新生成该文件。 - 完整性。 不得留下 TODO。如果空间不足,请在文件末尾停止,并添加
// CONTINUE FROM <path>。
阶段 6 — 设计评审
五位评审分别打分,范围为 1–10 分。每位评审都要指出最差的时刻,并标注时间戳:
- SPEC. 每条 S、X 和 E 行都按其确切值实现。列出缺失或已更改的 id。此项评分会限制总分上限。
- CONTINUITY. 每条 X 行都是真正到达目标的变形,部件从其源位置生成。身份和位置在不同场景与材质间保持一致。物理效果和景深正确。
- RHYTHM & SOUND. 事件落在节拍上,缓动符合约定。能量保持均匀,没有计划外的突增或空白秒数。每次冲击都有对应音效,循环衔接干净。
- DESIGN.
- 关键帧与布局一致;占比和留白符合约定。
- 每个元素都通过其设计手册检查。放大静帧,检查字体、人脸、手、道具和数据标签。
- 视觉风格应为这部影片量身设计,而非沿用辅助工具的默认风格或示例风格。
- CRAFT.
- 纹理和光线应针对每个元素单独设计。
- 影片具有确定性,并遵循 Remotion 规则。
- 不得包含禁用项:未要求的渐变;发光效果(泛光、霓虹光晕、镜头光斑);通用淡入;禁止使用弹跳效果的场景中出现弹跳;粒子爆发、镜头抖动、RGB 分离;居中标题叠加卡片的布局;素材图标和表情符号;占位文案;任何看起来像模板的内容。以图形绘制、有合理动机的光线效果可以使用。
从最低分的评审意见开始,优先修复最严重的问题。每轮最多修复三轮,解决所有低于 8 分的评审意见。
在文件工具环境中:
- 运行
npm run render。 - 运行
TIMES="<key moments>" npm run check。 - 阅读
out/check/:包含图表、静帧、audio.png和运动曲线。
必须修复每一条 FAIL:格式不匹配、残留的占位规格、缺失音频、第 0 帧颜色闪烁、循环衔接不佳。判断时优先相信静帧,而不是代码。
阶段 7 — 输出
仅聊天环境。 按以下顺序回复:
-
解读(使用用户的语言,≤ 6 行):风格来源、假设、冲突、推断出的
S##*行。 -
台账和时间线,放在一个带
text标记的代码围栏中(S、X 和 E 行、场景行、T 块),以便后续修复轮次使用。 -
文件:每个文件都放在代码块中,并以其路径作为标题:
src/spec.ts、src/lib/film.tsx、src/Film.tsx、所有src/scenes/SceneNN.tsx、scripts/cues.json。只有当用户没有起始文件夹时才打印起始文件,并从REFERENCE.md原样复制。 -
对齐表:
X## · 源 → 目标 · 辅助工具 · 文件;E## · 设计手册 · 绘制的特征 · 构建器 · 跨材质保持的身份,以及每个角色随时间变化的姿势和道具;format · W×H fps duration · S##。
任何通过叠加、交叉淡化或整帧缩放完成的 X 行都不合格:回复前必须修复。
-
评审: 五项评分,以及你最不确定的三件事。
-
运行方法(使用用户的语言):
- 复制 skill 包中的
templates/remotion-starter文件夹,将文件放到对应位置(删除不用的src/scenes/Scene01.tsx)。 - 运行
npm install;如果提示 esbuild 需要批准,运行npm approve-scripts esbuild && npm rebuild esbuild。 - 使用
npm run studio预览,npm run preview导出半分辨率小样,npm run render导出out/film.mp4,使用npm run check自查。 - 遇到问题时,截图发给我,并说“评审修复”。
- 复制 skill 包中的
后续操作。 继续 → 仅提供剩余文件。评审修复 → 根据静帧或代码运行阶段 6,然后仅输出已更改文件的完整内容。
文件工具环境。 根据起始模板创建项目,写入文件,然后运行 npx tsc -p .、npm run render 和 npm run check。根据静帧进行评审并修复,然后报告文件夹、评分和 MP4 路径。
辅助工具 API(src/lib/motion.tsx)— 完整源码见 REFERENCE.md
Time useTime() → {t, fps, frame, D, width, height} · prog(t, start, dur, ease) 0..1
settle(t, fps, landing, {lead=0.05, dur=0.45, bounce}) spring that lands on a beat
EASE.out / in / inOut (exact expo) · smooth · snap · linear · mix(a, b, p)
beats(bpm).at(n) / .bar(n) / .index(t) · rand(seed) · wobble(seed, i, t) · stepped(t, perSecond)
Shapes Pt = [x, y] · polygon(cx, cy, r, sides, rot, n=96) · circle(cx, cy, r, n) · line(x1, y1, x2, y2, n)
toPath(pts, closed) · morphPts(a, b, p) · morphPath(dA, dB, p) · drawOn(d, p) → spread on <path>
Transform chain(t, [{at, dur, pts, ease}, …]) one object through many shapes
converge(t, [{pts, arrive, mass, travel}], target, {baseRadius, radiusPerMass}) → {shapes, radius}
Materials Item = {d, c, w?} | {text, x, y, size, font, weight?, c, anchor?, spacing?} (c = palette index)
<MaterialLayer items material palette id/> material: {kind:'flat'} | {kind:'paper', shadow, shadowOpacity, edge}
| {kind:'line'|'glass', width, fill} | {kind:'halftone', inks:[hex…], pitch, offset, angle:[deg…]}
inkCoverage(hex, inks) → coverage per ink
Characters Body = {torso:[w,h], head:[w,h], upperArm, foreArm, thigh, shin, limb, hand, foot,
color:{body, head, limb, hand?, shoe?, shade?, line?}, face?(box), parts?{head, torso, limb, hand, foot}(box)}
Pose = {x, y (ground), facing ±1, lean, head, mood, look, armL/armR:[shoulder, elbow], legL/legR:[hip, knee]}
angles in degrees: shoulder 0 down · 90 forward · 180 up; elbow bends forward; knee bends back
<Character body pose back held front/> · grip(body, pose, 'L'|'R') hand point · nearSide(pose)
poseMix(a, b, p) · walk(t, base, stepsPerSecond, swing) · shadeHex(hex, k) · rig(body, pose) joints
Texture <Paper color grain fibre/> · <InkFilter id edge grain boil seed/> (filter="url(#id)") · roughFor(sizePx, strength)
<RoughFilter id scale freq step/> · <Grain opacity freq blend/> · <Grid pitch major color/>
Layout <Stage bg/> · <Canvas> full-frame SVG · <Reveal p from="left|right|top|bottom|circle" at/>
<Letters text t start stagger dur ease style(p, i) box/> (keeps spaces) · <Counter from to p decimals/>
Sound scripts/cues.json {duration, bpm, loop, palette, bed[], patterns[], events[]} → npm run score
instruments: pluck bell pad ambience(rain|wind|room) tick kick clap hat whoosh drop knock scratch boom
Commands npm run studio · preview · render · check (format, frame 0, loop seam, sound, motion curve)