lyric-structure-mapper

当使用者贴出一段 xxxxx 形式的字数模板、说"按这个结构写"、"帮我定一下歌曲结构"、"主歌预副副歌该各写几句"时使用。把 x 模板解析成可执行的骨架表:每段每行的字数、停顿位置、押韵位、以及这一段在整首歌里的功能;没有模板时给两三个常用骨架供选。这是确定性工作,不派子代理。产出的骨架是填词的唯一输入,改字数等于改旋律。

SKILL.md

GitHub

定歌曲骨架 / Lyric Structure Mapper

把字数模板变成一张可执行的骨架表,或者在没有模板时给出一个。

骨架是填词唯一的硬约束来源。后面所有环节都拿它当输入,所以这一步的产出必须精确到每一行。

这一步不需要子代理

解析模板是确定性工作:数 x、找空格、标段落。派子代理不会更准,只会更慢更贵。 没有模板需要生成骨架时,也是从下面几个成熟结构里挑一个,不是创作。

为了用而用子代理是浪费。 需要创意的是填词那一步(adversarial-lyric-writer)。

何时使用 / When to use

  • 使用者贴了一段 xxxxx 模板要照着写
  • 有旋律或 demo,需要把它转成字数格子
  • 还没有结构,问各段该写几句

不适用于 / Not for:

  • 已经有骨架、要填词 → adversarial-lyric-writer
  • 不知道这首歌写什么 → 先 lyric-concept-builder;骨架定得再准,没内容也填不出东西

模板怎么读

主
xxxxxxxxxx
xxxxxxxxxx
xxxxxx
xxxxxxxxx

预副
xxxxxxxx
xxxxx xxxxx
  • 一个 x = 一个汉字 = 一个音节 = 一个节拍位
  • 空格 = 停顿 / 换气 / 分句。xxxxx xxxxx 是"五字,停,五字",不是十字一口气唱完
  • 空行 = 段落分隔
  • "字数可以细微变动" = ±1 字,但同段落里位置对应的行必须同长, 因为它们唱的是同一句旋律

详细规则见 _shared/craft-reference.md 第 4 节。

逐行数,不要目测。 十个 x 和十一个 x 看上去一样,填出来的词唱起来不一样。

段落功能 / What each section does

骨架表里每一段都要标功能,否则填词时会四段写成同一段:

段落 功能 常见特征
主歌 1 建立处境:谁、在哪、发生了什么 行较长,叙述性,情绪压着
预副 收窄并抬升 行变短或字数递减,情绪转向,最后一行像个问号
副歌 hook + 情绪顶点 行数多,开口辙,第一句或最后一句是 hook
主歌 2 推进,不是重述 与主歌 1 同长,但时间/地点/事件/视角要变
桥段 视角转换或反转 常换辙、换人称,是全曲唯一可以"说别的"的地方
尾段 收束 行数少,可以只留一句,字数短于其他段

主歌 2 是整首歌最容易塌的地方。同长同韵会诱使人把主歌 1 换个说法再写一遍。 骨架表里就要写死主歌 2 相对主歌 1 要变什么,别留到填词时才想。

没有模板时的三个常用骨架

按歌的性质挑,不要默认给最长的那个:

A. 标准流行(最常用) 主歌1 → 预副 → 副歌 → 主歌2 → 预副 → 副歌 → 桥段 → 副歌 → 尾 适合:有故事、有转折的题材。预副是这个结构的关键,没有它副歌会来得很突兀。

B. 无预副(更直接) 主歌1 → 副歌 → 主歌2 → 副歌 → 桥段 → 副歌 适合:情绪单一、想快点到副歌的歌。主歌末行要自带抬升,否则接副歌会硬。

C. AABA(老派、短) A → A → B → A 适合:三分钟以内、以旋律取胜的小品。B 段承担全部转折。

给骨架时把每段的行数和字数一并给出,不要只给段落名。

输出格式 / Output

## 骨架表

### 主歌 1 —— 建立处境
| 行 | 字数 | 停顿 | 押韵 |
|---|---|---|---|
| 1 | 10 | 无 | 否 |
| 2 | 10 | 无 | 是 |
| 3 | 6 | 无 | 否 |
| 4 | 9 | 4+5 | 是 |

(各段照排)

## 押韵方案
主歌:<辙名> 预副:<辙名> 副歌:<辙名,开口辙> 桥段:<辙名>

## 段落间的约定
- 主歌 2 相对主歌 1 要变的是:<时间 / 地点 / 事件 / 视角,指明一项>
- 副歌 A/B 的差别在:<哪几行不同>
- hook 落在:<第几段第几行>

## 总字数与时长估算
<总字数>字;BPM <B>、每拍 <k> 字,演唱约 <总字数 ÷ (k × B)> 分钟,加前奏间奏约 <M> 分钟(假设的数写明是假设)

时长按 BPM 推,给个范围就行:演唱时长(分钟)≈ 总字数 ÷(每拍字数 × BPM)。 一拍一个字,每拍字数取 1;一拍唱两个字(八分音符的密度)取 2。还没有旋律时按 _shared/craft-reference.md 第 3 节"一字一音"的读法取 1,写明是假设。没有 BPM 就问一句, 或者按 80 到 120 给范围。句尾拖长和换气也占拍,所以这个数只会偏短;前奏、间奏、尾奏 另按"小节数 × 每小节拍数 ÷ BPM"加上。

例:主歌、预副各 35 字、副歌 67 字排结构 A,不算桥段和尾声共 341 字。BPM 90、一拍一字时, 光演唱就要约 3.8 分钟(341 ÷ 90),做三分钟的歌就得砍段落或压字数;一拍两字时约 1.9 分钟。 这个数用来提醒结构排得是不是太长或太短。

边界 / Boundaries

  • 不改使用者给的字数。他给的模板可能来自已经写好的旋律,多一个字就唱不下。 觉得某行字数有问题就指出来问他,不要自己顺手改了。
  • 不在这一步写词。骨架表里出现示例句子,填词时会被当成基调锚住。
  • 不推断段落功能后直接当定论。模板没标段落名时,推断结果要说出来让他确认。
  • 不给"随便你"式的结构。三个骨架各自适合什么要说清楚,让人能选。

Token 控制 / Token discipline

  • 解析模板是纯计数工作,不要展开讨论
  • 骨架表一次给全,不要一段一段问
  • 结构建议最多给三个,每个两行说明

变更记录 / Changelog

版本 日期 变更 类型
0.1.1 2026-09-26 时长估算改按 BPM 推算(总字数 ÷(每拍字数 × BPM),另加前奏间奏):原来的"每分钟 180 到 240 字"与本 skill 自己的模板和例子对不上,时长约偏短一半;输出模板和例子同步改 patch
0.1.0 2026-08-11 初始草稿 minor