简谱动画播放器:
https://www.funnyai.com/animate/music/
简谱歌词对齐标准(NN-MD 通俗版 v1.4)
本规范是 NN-MD v1.3 的升级版(v1.4),用大白话讲清如何用纯文本书写简谱和歌词,并让它们严格对齐。
v1.4 在完整保留 v1.3 规则的基础上,重点规范了:
- 增时线
- - 延音线
~ - 圆滑线
( ) - 三连音
[3: ... ] - 连音与歌词的对应关系
- 跨小节连音
- 跨行连音
- 连音在最终乐谱中的显示方式
其中最重要的一点是:
简谱文本里的
~、(、)是音乐关系标记,不是普通歌词格子。最终显示时,应根据音符的位置画出真正的弧线,而不是把这些字符直接显示出来。
一、音乐名词小词典(先弄懂再说)
为了看懂规则,您只需要理解下面几个词:
音符
数字 1 到 7,代表 do re mi fa so la ti。
数字 0 叫休止符,代表不唱、不出声,但拍子照样数够。
增时线(也叫“延时线”)
短横 -,每个 - 单独占一个位置,作用是把前面的音再延长一拍。
比如:
5 -
就是“5”唱两拍。
再比如:
5 - -
就是“5”持续三拍。
注意:
-是时值的一部分,它本身占一个拍位。
附点
小圆点 .,附在音符后面,让它延长一半的拍子。
如:
5.
唱一拍半。
减时线
斜杠 /,附在音符后面让它变短。
加一个 / 变八分音符(半拍),加两个 // 变十六分音符(四分之一拍)。
例如:
5/
5//
装饰音(也叫倚音)
写在大音符前面的小音符,用花括号 { } 包起来。
例如:
{6 5} 3
它一闪而过,不占歌词的字位。唱的时候带一下就行。
延音线
波浪号 ~,放在两个一样的音之间,表示:
两个相同的音连接起来唱,中间不能断。
例如:
5 ~ 5
这两个 5 仍然分别占自己的拍位,但演唱时不重新发声。
歌词只对应第一个音,后面的音用下划线 _ 占位。
例如:
M: | 5 ~ 5 |
L: | 啦 _ |
这里:
5
和:
5
都是拍位。
但是“啦”只唱一次。
圆滑线
小括号 ( ),表示包起来的几个音要唱得连贯、圆滑。
例如:
( 1 2 3 5 )
表示:
1 → 2 → 3 → 5
这一组音需要连贯演唱或演奏。
它不影响歌词对齐,里面的音该怎么对字就怎么对。
例如:
M: | ( 1 2 3 5 ) |
L: | 春 天 在 哪 |
四个音仍然对应四个歌词格子。
注意:
圆滑线最终显示时,不是把 ( ) 两个括号显示出来,而是应该在音符上方画出类似“眉毛”的弧线:
╭────────────╮
1 2 3 5
春 天 在 哪
三连音
标记:
[3: ... ]
表示括号里的三个音平均分拍子。
例如:
[3: 2/ 1/ 2/]
表示三个音作为三连音演奏。
里面的音符照样一个字一个位置。
小节、拍号
音乐用竖线 | 分成一节一节的,叫小节。
拍号如:
4/4
表示每小节有 4 拍。
这些只是辅助,不影响歌词对齐。
M 行 / L 行
M 行是简谱行(Music)。
L 行是歌词行(Lyrics)。
v1.3 开始推荐使用:
M:
L:
前缀标记,更清晰。
占位符 _
下划线在 v1.4 中有两个用途:
- 音后修饰符(紧跟音符,如
5_):表示低音 5 - 歌词占位(独立成“词”):表示“这里不唱新字、拍子照数”
例如:
M: | 5 - |
L: | 啦 _ |
好了,就这些,足够用了。
二、核心思想:像填格子一样对齐
把简谱(M 行)和歌词(L 行)想象成两条带格子的纸条。
每个格子之间用空格隔开,格子的数量必须一样多,然后一格对一格,就自然对齐了。
哪些算“格子”?
简谱行里:
- 每个音符(包括
0)算一格。 - 每个增时线
-也算一格。 - 小节线
| - 延音线
~ - 圆滑线
( ) - 三连音
[3:]
等结构标记不算格子,它们被跳过。
装饰音:
{6 5}
包住的整个花括号内部,全部不算格子,完全无视。
歌词行里:
- 一个汉字算一格。
- 一个英文单词也算一格。
- 遇到不唱但占拍子的地方,就用下划线
_占一格。 - 空格用来分格,绝不省略。
规则就这么简单:
简谱的有效格子数 = 歌词的格子数。
不等就说明写错了。
三、文件整体结构
v1.4 推荐用以下结构写一首歌(从上到下):
# 标题 (Markdown 一级标题:歌名)
## 1=C 4/4 (Markdown 二级标题:调号 + 拍号)
## 速度 120 (可选:速度 / BPM)
## 词作者 / 曲作者 (可选:作者信息,会被识别但忽略)
---
M: | 1 2 3 1 | 1 2 3 - |
L: | 你 问 我 爱 | 有 多 深 |
M: | ... |
L: | ... |
3.1 标题 / 元信息(Markdown 风格)
# 标题
解析为:
标题: ...
## 1=C 4/4
解析为:
调: C
拍号: 4/4
## 速度 120
解析为:
速度: 120
## 作者 信息
会被识别为元信息行,但不会报错,会安全忽略。
也兼容旧式:
标题: 小星星
写法。
Markdown 风格和旧式写法可以混用。
3.2 M/L 前缀
v1.4 推荐使用:
M:
L:
前缀标记简谱行和歌词行。
例如:
M: | 1 2 3 1 |
L: | 你 问 我 爱 |
也兼容无前缀写法。
程序会按:
含数字多 = 简谱行
含汉字多 = 歌词行
自动分类。
3.3 分隔线 ---
--- 行是元信息和正文之间的分界。
如果不想写元信息,可以不写 ---,直接进入 M/L 行。
四、简谱行(M行)书写规矩
M 行只放简谱内容。
每个要素之间用空格分开。
1. 基本音符
1 2 3 4 5 6 7
表示中音区。
休止符用:
0
2. 高低音
在数字后加 ^ 表示高音,_ 表示低音。
例如:
1^
5_
分别表示高音 do 和低音 so。
1^^
5__
分别表示倍高音和倍低音。
v1.4 严格规定:
^和_互斥。
一个音只能高八度或低八度,不能同时使用。
兼容旧写法
1^_
是 v1.2 旧风格。
v1.4 不推荐,但程序可以宽容处理:
只取第一个修饰符。
推荐写法:
1^
或者:
1_
二选一。
3. 长短
不加东西的纯数字是四分音符,算 1 拍。
后面加 /:
1/
变八分音符,半拍。
加 //:
1//
变十六分音符,四分之一拍。
后面加 -:
1 -
每多一个 - 就多延 1 拍。
后面加点:
1.
延长一半。
4. 升降号
数字前面加 # 升,加 b 降。
例如:
#4
b7
5. 特殊记号
小节线
|
前后加空格。
延音线
~
放在两个相同音之间。
例如:
5 ~ 5
圆滑线
(
)
开始和结束位置。
例如:
( 1 2 3 5 )
三连音
[3:
]
例如:
[3: 1/ 2/ 3/ ]
装饰音
{
}
里面只能放音符,不能放 - 等杂物。
例如:
{6 5} 3
重要:增时线 - 必须单独写成“词”
前后空格。
正确:
5 -
错误:
5-
虽然程序可以识别 5-,但不利于人眼对齐阅读。
五、歌词行(L行)书写规矩
L 行只放歌词和占位符,空格分隔。
- 每个格子放一个汉字。
- 拖腔、延音、连音等不需要唱新字的地方,用下划线
_占一个格子。 - 英文歌词一个单词占一格,如
love。 - 休止符
0处必须用_占位,因为这里虽然不唱,但拍子位置要保留。 - 歌词中不要出现下划线字符,如果需要表示停顿或拖音,已经统一用
_处理。
标点符号
歌词中可以包含中文标点:
。
,
?
!
等。
每个标点算一格。
这和汉字一样处理。
六、对齐规则精讲(消除所有歧义)
1. 拍位数严格相等
简谱行去掉所有结构记号:
|
~
( )
[3:
]
以及整个装饰音块:
{...}
之后,剩下的每一个音符和每一个 - 都是一个“拍位”。
L 行用空格切出来的词数量必须和拍位数相同。
多一个少一个都不行。
2. 装饰音彻底无关
例如:
{6 5}
里面的 6 和 5 绝对不占拍位。
不参与歌词计数。
L 行不用为它们准备任何格子。
就像没看到它们一样。
3. 延音线后的音符占拍位但不换字
例如:
5 ~ 5
中,两个 5 都是拍位。
但唱成一个连贯的“啊”。
所以歌词对应第一个 5 写实际歌词,第二个 5 的位置用 _ 顶替:
M: | 5 ~ 5 |
L: | 啦 _ |
同理,它的增时线 - 也一样占位用 _。
4. 一字多音用 _ 撑开
一个“风”字拖了四个拍位,例如:
6 - 6 -
歌词就写成:
风 _ _ _
四个格子,一个“风”,三个下划线。
5. 休止符必须用 _ 占位
休止符:
0
虽然不唱,但在拍位计数里,它和普通音符没有区别。
如果歌词行少给它一个格子,对齐就全乱了。
所以:
0
处永远用:
_
占位。
6. 按小节对齐宽容模式(v1.3 新增)
核心改进:
L 行可以“偷懒”少写几个字,程序会按 M 行的小节结构自动补
_占位。
两种情况:
情况 A:L 行有 | 切分,且段数等于 M 行小节数
按段对齐。
适用于:
用户精确写出了每小节的歌词。
算法:
L 段少词时补
_到 M 段格数,多词时截断。
情况 B:L 行没有 |(一段长串),或段数不对
按词池切分。
适用于:
用户懒得写
|,把所有歌词用空格连成一行。
算法:
把 L 行所有词展平成词池,按 M 行小节顺序切分。
每小节长度 = M 小节格数。
示例
M: | 1 1 5 5 | 6 6 5 - | 4 4 3 3 | 2 2 1 - |
L: | 一 闪 一 闪 | 亮 晶 晶 _ | 满 天 都 是 | 小 星 星 _ |
如果用户偷懒不写 |,下面这种写法也合法:
M: | 1 1 5 5 | 6 6 5 - | 4 4 3 3 | 2 2 1 - |
L: 一 闪 一 闪 亮 晶 晶 _ 满 天 都 是 小 星 星 _
程序会把 L 词池按:
4 - 4 - 4 - 4
切分,分配到 4 个小节。
更厉害的是:用户忘写 - 也没事
比如:
M: | 6 6 5 - | 4 4 3 3 |
L: | 亮 晶 晶 | 闪 闪 闪 |
每小节都是 4 cells。
虽然 L 比 M 少 2 个词,但程序会自动补 _:
亮 晶 晶 _ | 闪 闪 闪 _
对应:
“亮晶晶”2 拍 + 延音 1 拍。
七、连音、延音、圆滑线的详细规则(v1.4 新增)
这一节是 v1.4 最重要的新增内容。
简谱里容易把“延长一个音”和“几个音连贯演唱”混在一起。
v1.4 明确区分三种东西:
| 符号 | 名称 | 作用 |
|---|---|---|
- |
增时线 | 延长前面的音,每个 - 占一个拍位 |
~ |
延音线 | 两个相同音连接起来,中间不重新发音 |
( ) |
圆滑线 | 一组音连贯、圆滑地演唱或演奏 |
1. - 是时值,不是连音关系
例如:
5 -
表示:
5延长到两拍。
它的拍位是:
5 -
歌词:
啦 _
2. ~ 是两个音之间的延音关系
例如:
5 ~ 5
表示两个相同的 5 连续保持。
两个 5 仍然分别占拍位:
5 5
但第二个 5 不重新唱一个字。
歌词:
啦 _
3. ( ) 是一组音之间的圆滑关系
例如:
( 1 2 3 5 )
四个音仍然是四个拍位:
1 2 3 5
歌词:
春 天 在 哪
圆滑线不会减少音符数量,也不会减少歌词格子。
4. 圆滑线不是普通括号
文本:
( 1 2 3 5 )
只是输入方式。
最终显示时,不应该直接显示:
( 1 2 3 5 )
而应该显示成:
╭────────────╮
1 2 3 5
也就是简谱上方常见的“眉毛”一样的弧线。
因此:
(表示圆滑线开始,)表示圆滑线结束;它们本身不是最终乐谱中的可见字符。
5. 圆滑线不影响歌词格子
例如:
M: | ( 1 2 3 5 ) |
L: | 春 天 在 哪 |
有效拍位仍然是:
1 2 3 5
歌词仍然是:
春 天 在 哪
不能因为有 ( ) 就减少格子。
6. 连音可以跨小节
例如:
M: | ( 1 2 3 | 4 5 6 ) |
L: | 春 天 在 | 哪 里 啊 |
圆滑线从第一小节的 1 一直连接到第二小节的 6。
最终视觉效果应该类似:
╭────────────────────────╮
1 2 3 | 4 5 6
春 天 在 | 哪 里 啊
小节线 | 不会截断圆滑线。
7. 连音可以跨行
如果歌曲太长,需要换行:
M: | ( 1 2 3 4 |
M: | 5 6 7 1 ) |
仍然表示:
从第一行的
1一直圆滑连接到第二行的1。
换行不能让这条音乐关系消失。
实际显示时,可以根据排版空间分成两段:
第一行:
╭────────────
1 2 3 4
第二行:
────────────╮
5 6 7 1
具体画法由显示程序决定。
8. 延音线与圆滑线可以同时存在
例如:
M: | ( 1 2 ~ 2 3 ) |
这里有两个不同关系:
圆滑线:
1 → 3
延音线:
2 → 2
歌词:
L: | 春 天 _ 风 |
两种关系互不冲突。
八、完整实例(看着例子秒懂)
例1:《小星星》(标准格式 v1.4)
# 小星星
## 1=C 4/4
## 速度 120
## 莫扎特 曲
---
M: | 1 1 5 5 | 6 6 5 - | 4 4 3 3 | 2 2 1 - |
L: | 一 闪 一 闪 | 亮 晶 晶 _ | 满 天 都 是 | 小 星 星 _ |
M: | 5 5 4 4 | 3 3 2 - | 5 5 4 4 | 3 3 2 - |
L: | 挂 在 天 空 | 放 光 明 _ | 好 像 许 多 | 小 眼 睛 _ |
M: | 1 1 5 5 | 6 6 5 - | 4 4 3 3 | 2 2 1 - |
L: | 一 闪 一 闪 | 亮 晶 晶 _ | 满 天 都 是 | 小 星 星 _ |
第三小节简谱有四个拍位:
5 6 5 -
歌词正好:
满 天 都 是
末位使用“是”字占住对应位置。
如果这里是拖音,也可以根据具体唱法写成 _。
例2:延音线和跨小节圆滑线
M: | ( 3/ 5/ ) 6 - | ( 6 5 3 ) | 2 - - - |
L: | 春 风 吹 _ | 绿 吹 岸 _ | _ _ _ _ |
第一小节:
3/ 5/ 6 -
共 4 个有效拍位。
圆滑线:
( 3/ 5/ )
不占格子。
第二小节:
6 5 3
以及最后的占位结构,根据实际歌词填写。
如果一个“风”字需要跨越多个拍位,例如:
M: | 6 - | 6 - |
L: | 风 _ | _ _ |
则表示“风”持续跨越四个拍位。
例3:装饰音和三连音
M: | {6 5} 3 - 3 - | [3: 2/ 1/ 2/] 3 - - |
L: | 练 _ 习 _ | 三 连 音 _ _ _ |
装饰音:
{6 5}
完全忽略。
第一小节拍位:
3 - 3 -
共 4 个,对应:
练 _ 习 _
第二小节三连音内部:
2/ 1/ 2/
都是有效拍位。
加上后面的:
3 - -
一共 6 个拍位。
歌词:
三 连 音 _ _ _
也是 6 个格子,完美。
例4:宽容模式——L 行偷懒
M: | 1 2 3 1 | 1 2 3 - |
L: 两 只 老 虎 跑 得 快
L 行没写 |,也没用 _ 占延音位。
程序会按 M 行小节自动切分:
- 小节 1(4 cells):
两 只 老 虎 - 小节 2(4 cells):
跑 得 快 _
自动补 1 个 _ 占延音。
例5:纯器乐段(无歌词)
M: | 1 1 5 5 | 3^ 3^ 2^ 2^ | 1 - - - | 0 - - - |
L: | 卡 农 之 门 | _ _ _ _ | _ _ _ _ | _ _ _ _ |
中间两小节没有歌词,全部用 _ 占位。
4 cells × 2 段 = 8 个 _。
九、v1.2 → v1.3 → v1.4 兼容性说明
| 特性 | v1.2 旧写法 | v1.3 写法 | v1.4 写法 | 兼容性 | |
|---|---|---|---|---|---|
| 同时高低音 | 1^_ |
1^ 或 1_ |
1^ 或 1_ |
程序宽容处理 | |
| 元信息 | 标题: ... 调: ... |
# 标题 ## 1=C |
同 v1.3 | 两种都支持 | |
| M/L 前缀 | 无 | M: L: |
M: L: |
两种都支持 | |
| L 行分小节 | 必有 | |
可有可无 | 可有可无 | 按小节宽容对齐 | |
_ 在音后 |
低音/旧八分音符 | 低音 | 低音 | v1.3 规则延续 | |
_ 在 L 行 |
歌词占位 | 歌词占位 | 歌词占位 | 行为一致 | |
| 八分音符 | 旧写法可能使用 _ |
1/ |
1/ |
v1.3 起统一 | |
| 增时线 | - |
- |
- |
行为一致 | |
| 延音线 | 旧规则存在歧义 | ~ |
~ |
v1.4 明确规范 | |
| 圆滑线 | ( ) |
( ) |
( ) |
v1.4 明确显示规则 | |
| 三连音 | [3: ... ] |
[3: ... ] |
[3: ... ] |
行为一致 |
关于 v1.2 中 1^_ 的特殊说明
v1.2 用户如果写:
1^_
期望:
“1 升八度 + 八分音符”
在 v1.3 及 v1.4 中,这个写法已经被重新定义。
现在:
_
在音后只表示:
低音。
八分音符使用:
/
所以:
1^_
如果原本想表示:
高音 + 八分音符
应该改成:
1^/
升级替换规则
1^_ → 1^/
表示:
升八度 + 八分音符。
1_
如果原来就是低音:
1_ → 1_
无需修改。
如果旧文件中的:
1_
原本表示八分音符,则升级为:
1/
十、连音显示规范(v1.4 新增)
这一节专门说明:
文本怎么写是一回事,最终乐谱怎么显示是另一回事。
这是 v1.4 与 v1.3 最大的改进之一。
1. 文本中的 ~ 不应该直接显示
例如:
M: | 5 ~ 5 |
最终乐谱不应该显示:
5 ~ 5
而应该显示成类似:
╭────╮
5 5
也就是说:
~是“两个音之间存在延音关系”的说明。
2. 文本中的 ( ) 不应该直接显示
例如:
M: | ( 1 2 3 5 ) |
最终显示应该类似:
╭────────────╮
1 2 3 5
而不是:
( 1 2 3 5 )
3. 连音线不能参与普通文字排版
程序不能简单地认为:
(
和:
)
是两个普通字符,然后按照字符宽度画线。
因为实际显示时:
- 字体可能改变
- 字号可能改变
- 页面宽度可能改变
- 小节宽度可能改变
- 音符可能自动换行
- PDF 和 HTML 的字体尺寸可能不同
所以连音必须跟随音符实际位置。
4. 圆滑线应该根据首尾音符画
例如:
( 1 2 3 5 )
解析后可以理解为:
开始音符 = 1
结束音符 = 5
显示程序找到:
1 的中心位置
5 的中心位置
然后在两个位置之间画弧线。
5. 连音线默认位于音符上方
例如:
╭────────────╮
1 2 3 5
如果音符上方已经有高音符号、其他记号,程序可以自动提高弧线位置,避免重叠。
6. 连音线不能压住歌词
歌词位于音符下方:
╭────────────╮
1 2 3 5
春 天 在 哪
连音线应该始终保持在音符区域上方。
7. 跨小节时不能被小节线截断
例如:
M: | ( 1 2 3 | 4 5 6 ) |
应该理解为一条完整的音乐关系:
╭────────────────────────╮
1 2 3 | 4 5 6
而不是:
╭──────╮
1 2 3 | 4 5 6
然后丢失后半部分。
8. 跨行时必须保留关系
如果:
M: | ( 1 2 3 4 |
M: | 5 6 7 1 ) |
表示一条从第一行延续到第二行的圆滑线。
程序至少要保证:
连音关系不会因为换行而丢失。
十一、程序解析时的基本原则(v1.4 新增)
对于普通读者来说,这一节可以简单理解为:
程序应该先理解音乐,再负责画出来。
不要把所有东西都当成普通文字。
音符
1
2
3
4
5
6
7
0
这些是真正的音符或休止符。
它们占格子。
时值
-
.
/
这些影响音符的时值。
其中:
-
本身占一个拍位。
音乐关系
~
( )
这些不是新的音符。
它们描述:
音符之间是什么关系。
所以不占歌词格子。
装饰结构
{ }
内部的音符作为装饰音处理。
整个装饰音块不占歌词格子。
三连音
[3:
]
只是告诉程序:
里面这一组音符应该按照三连音方式演奏。
真正的音符仍然正常占格子。
十二、几个容易搞错的地方
1. - 和 ~ 不一样
5 -
表示:
一个音延长。
而:
5 ~ 5
表示:
两个相同音之间存在延音关系。
2. ~ 和 ( ) 不一样
5 ~ 5
重点是:
相同音连接,中间不重新发声。
而:
( 1 2 3 5 )
重点是:
多个音连续、圆滑地演唱或演奏。
3. 连音不会减少歌词格子
例如:
M: | ( 1 2 3 5 ) |
仍然是:
1 2 3 5
四个格子。
4. 延音也不会减少歌词格子
例如:
M: | 5 ~ 5 |
仍然有两个音符格子:
5 5
只是歌词:
啦 _
5. 装饰音才是完全不占格子的音符
例如:
{6 5} 3
只有:
3
占正常歌词格子。
十三、v1.4 相比 v1.3 的改进
1. 明确休止符占位规则
明文规定:
0
必须在歌词行用:
_
顶格。
不再靠猜。
2. 装饰音内部成分限制
规定:
{ }
内只能出现音符,不能放增时线或其他记号,避免误解。
3. _ 双重含义明确化
v1.2 中 _ 既是低音修饰符又是八分音符修饰符,含义混乱。
v1.3 / v1.4 中:
_在音后 = 低音/= 减时线(八分音符)_在 L 行 = 歌词占位
4. 延音线占位原理图解
明确:
5 ~ 5
两端音符都是独立拍位。
但连起来唱时不换字:
啦 _
5. 圆滑线的视觉含义明确化
v1.4 明确规定:
( 1 2 3 5 )
表示:
从
1到5的一组音符需要连贯、圆滑地演奏。
最终显示时应该画成音符上方类似“眉毛”的弧线,而不是直接显示括号。
6. 支持跨小节连音
圆滑线和延音关系可以跨越:
|
小节线。
小节线不会自动终止音乐关系。
7. 支持跨行连音
乐谱换行后:
原来的连音关系不能丢失。
8. 连音不影响歌词格子
明确规定:
~
(
)
都不占歌词格子。
9. 按小节对齐宽容模式
L 行可以偷懒少写 | 或忘写 -,程序按 M 行小节结构自动补 _,降低用户书写负担。
10. M/L 前缀 + Markdown 头部
文件结构更清晰:
标题
元信息
分隔线
M 行
L 行
程序宽容接受多种写法。
11. 语言全部大白话
不用:
Token、词法映射
等程序术语。
全部换成:
格子、拍位、音符、歌词、连音
零基础也能懂。
十四、v1.4 最终记忆口诀
如果只记住下面几句话,就已经足够使用这套标准:
音符占格子。
-延长时值,也占格子。
~连接两个相同音,不占格子。
( )表示一组音圆滑演唱,不占格子。
{ }装饰音整个不占格子。
[3: ]是三连音标记,里面的真正音符仍然占格子。
歌词一个字对应一个格子,不唱新字就用
_。
文本里的连音符号是“关系”,最终显示时应该画成真正的弧线。
有了这份标准,任何两个人按照同样的空格规则敲出简谱和歌词,都能做到一字一音,准确无误;同时,程序也可以根据统一规则直接解析。
更重要的是:
人阅读时看的是简单、直观的简谱文本;程序处理时理解的是音符、时值和音符之间的关系。
这样既保持了 NN-MD 的“大白话、好输入、好阅读”特点,又为后面的 HTML、PDF、图片等真正乐谱渲染留下了足够清晰的规则。