声部与歌词
上一章介绍了音符的节奏与时值。这一章用 @voice 把旋律组织成声部,为音符添加声部名称和歌词,再学习日常写谱的 N:、L: 简写,以及歌词的分词、占位和多行写法。
用 @voice 定义声部
Section titled “用 @voice 定义声部”一个声部可以理解为一条独立的旋律。@voice 把一段音符收在一起,并允许在左侧写上声部名称、在下方配上歌词:
@voice({content}, name="", "歌词1", "歌词2", ..., 歌词名="歌词3", ...)第一个参数是音符内容,第二个参数是声部名称,后面的参数都是歌词。
@voice({
1 2 3 5 | 3 2 1 -
}, 主唱, "微风轻轻,吹过来。")这里的七个字依次对应七个音符,最后的增时线只延长音符,不另配一个字。歌词中的逗号、句号等标点会附着在文字旁边,不单独占一个音符的位置。
函数调用中的歌词建议用双引号包裹,尤其是含有英文逗号等可能与参数分隔符混淆的字符时。如果不需要声部名称,要把第二个参数留空,不能直接把歌词放到它的位置:
@voice({1 2 3}, , "你好吗")用命名参数标出歌词行名称
Section titled “用命名参数标出歌词行名称”一段旋律可以对应多个歌词。歌词参数有两种写法:从第三个位置开始直接用位置参数写 "歌词",表示不带名称的一行歌词;写成 名称="歌词",则会把等号左边的参数名显示在这行歌词的左侧,等号右边才是配给音符的歌词正文。
@voice({1 2 3}, 钢琴, "你好吗", 回应="我很好")- “钢琴”是声部名称,显示在音符行左侧;
- 第一行“你好吗”没有名称,因为是位置传参;
- “回应”是第二行歌词的名称,显示在“我很好”左侧;
歌词行按参数的书写顺序从上到下排列。由于显式调用要求位置参数写在命名参数之前,无行名的歌词也会排在有行名的歌词之前。需要自由安排顺序时,可以使用下面的 N:、L: 简写。
歌词行名称可以按需要取成“第一段”“第二段”“男”“女”等,不是函数预先规定的参数名(这是 voice 的特殊实现)。不过 name 已用于设置声部名称,不要拿它作为歌词行名称。
用 N: 和 L: 简写
Section titled “用 N: 和 L: 简写”完整函数调用把音符和歌词放在同一个函数中。日常写谱时,更方便的方式是把它们分开写:
| 简写 | 作用 |
|---|---|
N: 音符 | 写一个没有名称的声部 |
N(主唱): 音符 | 写一个名为“主唱”的声部 |
L: 歌词 | 给前面的声部添加一行歌词 |
L(第一段): 歌词 | 添加一行歌词,并在左侧标出“第一段” |
N 和 L 都要大写,冒号使用英文冒号。L: 要跟在对应的 N: 行后,在前面的旋律下方补充歌词。
连续写多条 N: 会组成同时演奏的多声部块,而不是接着演奏下一句。多声部与临时多声部会介绍它们的分段、同步和连接括号;这一章先关注一条旋律如何配词。
N(钢琴): 1 1 5 5 | 6 6 5 -
L(女高): 一闪一闪亮晶晶,
L: 漫天都是小星星。用语法糖的写法可以让命名的歌词出现在无名歌词的上方。
一行歌词太长时
Section titled “一行歌词太长时”如果一行歌词太长,想在源码里分成几行写,却仍然作为同一行歌词处理,可以在要接下去的行末加一个反斜杠 \。这叫作换行转义:告诉 jpFun 把当前行和下一行接起来。
N: 1 2 3 4 5 6 7
L: 哆来咪发\
索拉\
踢这里等同于写一行 L: 哆来咪发索拉踢。续写的行前面不要再加 L:;重新写 L: 表示给同一段旋律添加另一行歌词,而不是接着上一行写。
歌词怎样对应音符
Section titled “歌词怎样对应音符”歌词不是按源码中的空格位置对齐,而是先拆成一个个词,再依次放到音符下方。中文默认逐字拆分,英文默认按空格和连字符 - 拆分;需要改变对应关系时,可以使用下面的写法:
| 歌词写法 | 对应方式 |
|---|---|
微风轻轻 | 四个字分别对应四个音符 |
hello world | 两个单词分别对应两个音符 |
hel-lo | 拆成 hel- 和 lo,分别对应两个音符 |
{微风}轻轻 | 把“微风”放在同一个音符下,后面两字各占一个音符 |
你 @ 好 | 第二个音符不配词,“好”放到第三个音符下 |
歌词里的花括号用于把多个字合为一组,与音符内容里的花括号用途不同。@ 则是一个空占位;书写时在它两侧留出空格,便于和歌词正文区分。
N: 1 2 3 4
L: {微风} @ 轻轻
L: hel-lo my friend一字多音与休止
Section titled “一字多音与休止”一个字唱几个音时,把字配在第一个音符上,后面的音符用 @ 留空。连音线只负责连接音符,并不会自动替歌词跳过后面的音;休止符 0 也占一个配词位置,没有歌词时同样用 @ 占位。增时线 - 不占配词位置,不需要为它补占位。
N: 0 1@start 2@end @tie(start, end) 3 | 5 - - -
L: @ 风 @ 吹来“风”从 1 唱到 2,“吹”与“来”分别对应 3 和 5。歌词写得再长,也不会增加音符或延长旋律;配词时仍要检查文字和音符是否一一对应。
直接写音符与 N: 混用
Section titled “直接写音符与 N: 混用”如果不需要歌词或命名,单声部时可以直接写裸音符,不必使用 N:。两者是可以混用的,在 jpFun 底层,它们都属于同一个音轨。
注意,N: 不是一个持续生效的开关,不会让后面所有音符都自动归入这个声部。它只收进当前源码行的音符;下一行的音符,已经在这个 @voice 之外了。
N: 1 2
L: 微风轻轻
3 4这里按 1 2 3 4 的顺序演奏,四个音符仍排在同一条谱线上;但只有 1 2 属于 N:,歌词“微风轻轻”也只配给它们(例子中 voice 的音符比歌词少,所以歌词会被截断,而不是继续分给 voice 外的音符)。
N: 生效的范围仅限于当前源码行,下一行直接写出的裸音符不再属于该声部。比如下面的写法会报错的:
N: 1 23 4L: 微风轻轻如果让 N: 后可以填写多行曲谱,应该使用内容块 {} 包裹:
N: {
1 2
3 4
}
L: 微风轻轻@voice把音符组织成一个声部,可附带声部名称和多行歌词;N:、L:是它的日常简写。- 歌词可用位置参数直接书写,也可用
名称="歌词"标出歌词行名称;L(名称):是命名歌词行的简写。 - 歌词默认按中文字、英文单词或音节配给音符;
{...}合并文字,@留出一个空位,标点不单独占位。 - 多个
L:为同一条旋律添加多行歌词,不会增加新的声部。 - 行末的
\让一行歌词在源码中接到下一行,不会新增歌词行。
下一章谱面与页面排版将介绍如何换行、设置页面尺寸和边距,以及自动分页与横向撑满规则。