多声部与临时多声部
给每条旋律配好名称和歌词后,就可以把它们组织成合奏。本章先用 @voices 和连续的 N: 编排并行声部,区分时间同步与连接外观,再用 @stack 或 & 为旋律添加临时伴奏。
在单声部 @voice 的基础上,使用 @voices 包裹多个 @voice,即可让多个声部并行:
@voices(@voice(...), @voice(...), ..., connect="[-]")@voices(别名 @vs)的每个位置参数都必须是 @voice。它们从同一时刻开始,各自按自己的节奏推进,并按书写顺序从上到下排列。两个以上声部默认用左侧的细连谱线和带钩括线连接;后面的仅命名参数 connect 用来设置连谱号,后文将详细展开。
@voices(
@voice({1 2 3 5 | 3 2 1 -}, 主唱, "微风轻轻,吹过来。"),
@voice({1, - 5, - | 1, - - -}, 伴奏, 啊啊啊)
)简写:连续的 N:
Section titled “简写:连续的 N:”日常写谱不必每次都套上 @voices。把几个 N: 连续写在一起,jpFun 就会自动把它们合成一组;各自的歌词紧跟在各自的音符后面:
N(主唱): 1 2 3 5 | 3 2 1 -
L: 微风轻轻,吹过来。
N(伴奏): 1, - 5, - | 1, - - -
L: 啊啊啊这里的两条 N: 同时演奏;夹在它们之间的 L: 只为对应声部配词,不增加声部数量。
相邻的 N: 表示同时演奏,不是前后两句。 接着写下一段时,用空行或内容块结束当前多声部块。空行是否同时让谱面换行,仍遵循谱面与页面排版的规则:顶层空行会换行,内容块内部的空行不会。
下面先用顶层空行另起一行,再用相邻内容块把两个多声部块放在同一行:
N(主唱): 1 2 3 5 |
L: 微风轻轻,
N(伴奏): 1, - 5, - |
{ % 下面两个 voices 会在同一行
N(主唱): 3 2 1 - |
L: 吹过来。
N(伴奏): 1, - - - |
}{
N(主唱): 3 2 1 - |
L: 吹过来。
N(伴奏): 1, - - - |
N: 5, - - - |
}小节线是时间同步的锚点
Section titled “小节线是时间同步的锚点”多声部中,小节线不只是视觉分隔,也是时间同步的锚点。 各声部按先后顺序对应的小节线会对齐到同一时刻:如果某个声部先到达小节线,就等其他声部到达,再一起开始后面的内容。
N(上声部): 1 2 | 3 4 5 6 |||
N(下声部): 1, - - - | 5, - |||上声部的 1 2 只占两拍,下声部的 1, - - - 占四拍,因此第一根小节线对齐到第四拍结束处。上声部的 3 不会紧接着 2 开始,而是等到这里,与下声部的 5, 同时进入下一小节。前面的 1、2 本身并没有被拉长,谱面也不会自动补出休止符。
这个例子特意让小节长短不同,以便看清同步效果。正常写谱仍应把各声部对应小节的时值写完整,需要停顿就明确写休止符;同步不能代替配拍检查。各声部的小节线也应保持对应,不要把某个声部中间的小节线随意省略,否则后面的小节线可能与其他声部的前一根错误配对。如果某个声部需要晚一点进入,应在它开头写休止符,而不是靠缩进或空格推迟。
每个 @voices 都在宿主音轨下为成员分配子音轨,宿主本身不充当其中一个声部。整块以首末声部基线的中点对齐宿主,因此可以在行内局部居中。
同一宿主上,成员数相同的块会复用子音轨;成员数不同则各自分配。例如先写二声部、再写三声部,会得到两组共五条子音轨,而不是让三声部沿用前两条基线。这样两种结构都能保持各自的居中方式。连接括号不参与音轨分配。
即多声部最左侧的括号。jpFun 提供了三种样式:
- 连谱线,即一根线贯穿所有声部;
- 花连谱号,用于联括由一人演奏的两行曲谱,比如钢琴左右手;
- 直连谱号,用以联括二人以上同时唱奏的两行以上曲谱的连谱号。
@voices(
@voice({1 2 3}, 旋律), % 1. 连谱线
@voice({3 4 5}, 右手), % 2. 花连谱号
@voice({1 2 3}, 左手), % 3. 花连谱号
@voice({5 6 7}, 低音), % 4. 直连谱号
@voice({X X X}, 鼓点), % 5. 直连谱号
connect="{2-3}[4-5]"
)用 connect 指定范围
Section titled “用 connect 指定范围”连谱号的样式和范围通过 @voices 函数的 connect 参数设置。connect 是一个仅能通过命名参数指定的字符串,值需要遵循以下规则:
- 基本格式:
左括号 起始声部编号 - 终止声部编号 右括号; - 声部编号从1开始,包含两端;起点和终点均可以省略,表示从头/到尾;
- 单个声部可省略连字符和重复端点:
[3]等价于[3-3],{3}等价于{3-3}; - 没有指定的声部将使用连谱线。
connect 的值 | 效果 |
|---|---|
"[-]" | (默认值)全部声部用带钩括线 |
"{-}" | 全部声部用弯曲大括号 |
"[1-4]{5-7}" | 前四声部用带钩括线,第五至七声部用弯曲大括号 |
"[-4]" | 第一至第四声部用带钩括线 |
"{3-}" | 第三至最后一个声部用弯曲大括号 |
"{1-2}[3]" | 第一至第二声部用弯曲大括号,第三声部单独用带钩括线 |
"" | 不加括号,只有公共细线 |
一次设置,后续复用
Section titled “一次设置,后续复用”整首曲子声部不变时,我们可以在开头使用 @set(voices.connect="...") 设置默认值,而不必为每个 @voices 单独设置:
@set(voices.connect="{-}")
N(右手): 1 2 3
N(左手): 5, 6, 7,
N(右手): 3 2 1
N(左手): 7, 6, 5,简写:用 V 声明当前块的连接
Section titled “简写:用 V 声明当前块的连接”我们不必为了指定连谱号而改用写法颇长的函数调用形式;连谱号的设置也有简写:
| 声明 | 从下一个声部起使用的外观 |
|---|---|
V{}: | 花连谱号 |
V[]: | 直连谱号 |
V|: | 连谱线 |
V{}:
N(右手): 1 2 3
N(左手): 5 6 7
V[]:
N(女高): 6 6 5
L: 啊 啊 啊
N(女低): 1 2 3
V|:
N(低音): 5 5 1上面的写法等价于函数传参 connect="{1-2}[3-4]"。不过大部分时候,用 @set(vs.connect="...") 一次性设置是更加推荐的方式。
有时只想在旋律的某一小段叠加另一个声部,前后仍是一条连续的旋律。如果用 @voices,会看到新的多声部行内居中,并不会保持当前行的连贯。此时可以使用 @stack:
@stack({content1}, {content2}, ...)各段内容从同一时刻开始,整体时长同样取最长的一段。与 @voices 不同,@stack 的第一段留在原来的谱线上,后续各段依次叠在它的上方,不添加多声部括线。
1 2 @stack({3. 4/}, {5 -}, {1'}) | 5 - - -
1 2 @voices( % 如果使用 @voices 会断开当前旋律
@voice({3. 4/}),
@voice({5 -}),
@voice({1'})
) | 5 - - -用 & 简写
Section titled “用 & 简写”@stack 的简写是 &。在需要同时演奏的内容之间加上它即可;如果一边包含多个音符,要先用花括号把那一段收在一起:
1 2 {3. 4/} & {5 -} & {1'} | 5 - - -@stack 的第一个参数会继续使用当前音轨,后续的参数才会新开音轨;而 @voices 则是每个 @voice 都会新开音轨,父音轨承载 @voices 函数,不会泄露到里面每个 @voice。因此我们可以说,@stack 是临时的、局部的,而 @voices 是全局的、系统级的。
同一轨道(声部)上多次出现stack,音轨全部会复用。根据上文说过的“一个轨道对应一个对齐基线”的原则,一行内的多次 @stack 会相互影响,无论声部数是否一致:
1 2 3&4 5 6&7,,,,&1 % 4被后面的7抬高了多声部有两种写法:
- 使用
@voices或相邻的N:组织并行声部,用空行或内容块分段,在对应的小节线处同步。 - 使用
connect或V{}:、V[]:、V|:控制连谱号外观;重复使用的方案交给@set。 - 使用
@stack或&,适合临时多声部,第一段留在原谱线,后续分支叠在上方,不添加括线。
两者的音轨分配策略会影响排版和播放。若只是把同一个声部的几个音叠成和弦,继续阅读下一章和弦,不必为每个音创建声部。