跳转到内容

多声部与临时多声部

给每条旋律配好名称和歌词后,就可以把它们组织成合奏。本章先用 @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, - - -}, 伴奏, 啊啊啊)
)
复制代码

日常写谱不必每次都套上 @voices。把几个 N: 连续写在一起,jpFun 就会自动把它们合成一组;各自的歌词紧跟在各自的音符后面:

连续写 N,组成多声部
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, - - - |
}
复制代码

多声部中,小节线不只是视觉分隔,也是时间同步的锚点。 各声部按先后顺序对应的小节线会对齐到同一时刻:如果某个声部先到达小节线,就等其他声部到达,再一起开始后面的内容。

在小节线处同步后再继续
N(上声部): 1 2 | 3 4 5 6 |||
N(下声部): 1, - - - | 5, - |||
复制代码

上声部的 1 2 只占两拍,下声部的 1, - - - 占四拍,因此第一根小节线对齐到第四拍结束处。上声部的 3 不会紧接着 2 开始,而是等到这里,与下声部的 5, 同时进入下一小节。前面的 1、2 本身并没有被拉长,谱面也不会自动补出休止符。

这个例子特意让小节长短不同,以便看清同步效果。正常写谱仍应把各声部对应小节的时值写完整,需要停顿就明确写休止符;同步不能代替配拍检查。各声部的小节线也应保持对应,不要把某个声部中间的小节线随意省略,否则后面的小节线可能与其他声部的前一根错误配对。如果某个声部需要晚一点进入,应在它开头写休止符,而不是靠缩进或空格推迟。

每个 @voices 都在宿主音轨下为成员分配子音轨,宿主本身不充当其中一个声部。整块以首末声部基线的中点对齐宿主,因此可以在行内局部居中。

同一宿主上,成员数相同的块会复用子音轨;成员数不同则各自分配。例如先写二声部、再写三声部,会得到两组共五条子音轨,而不是让三声部沿用前两条基线。这样两种结构都能保持各自的居中方式。连接括号不参与音轨分配。

即多声部最左侧的括号。jpFun 提供了三种样式:

  1. 连谱线,即一根线贯穿所有声部;
  2. 花连谱号,用于联括由一人演奏的两行曲谱,比如钢琴左右手;
  3. 直连谱号,用以联括二人以上同时唱奏的两行以上曲谱的连谱号。
三种连谱号
@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]"
)
复制代码

连谱号的样式和范围通过 @voices 函数的 connect 参数设置。connect 是一个仅能通过命名参数指定的字符串,值需要遵循以下规则:

  • 基本格式:左括号 起始声部编号 - 终止声部编号 右括号;
  • 声部编号从1开始,包含两端;起点和终点均可以省略,表示从头/到尾;
  • 单个声部可省略连字符和重复端点:[3] 等价于 [3-3],{3} 等价于 {3-3};
  • 没有指定的声部将使用连谱线。
connect 的值效果
"[-]"(默认值)全部声部用带钩括线
"{-}"全部声部用弯曲大括号
"[1-4]{5-7}"前四声部用带钩括线,第五至七声部用弯曲大括号
"[-4]"第一至第四声部用带钩括线
"{3-}"第三至最后一个声部用弯曲大括号
"{1-2}[3]"第一至第二声部用弯曲大括号,第三声部单独用带钩括线
""不加括号,只有公共细线

整首曲子声部不变时,我们可以在开头使用 @set(voices.connect="...") 设置默认值,而不必为每个 @voices 单独设置:

后续多声部复用同一个连谱号方案
@set(voices.connect="{-}")
N(右手): 1 2 3
N(左手): 5, 6, 7,

N(右手): 3 2 1
N(左手): 7, 6, 5,
复制代码

我们不必为了指定连谱号而改用写法颇长的函数调用形式;连谱号的设置也有简写:

声明从下一个声部起使用的外观
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 的第一段留在原来的谱线上,后续各段依次叠在它的上方,不添加多声部括线。

stack 和 voices 的对比
1 2 @stack({3. 4/}, {5 -}, {1'}) | 5 - - -

1 2 @voices(    % 如果使用 @voices 会断开当前旋律
    @voice({3. 4/}),
    @voice({5 -}),
    @voice({1'})
) | 5 - - -
复制代码

@stack 的简写是 &。在需要同时演奏的内容之间加上它即可;如果一边包含多个音符,要先用花括号把那一段收在一起:

用 & 叠加旋律
1 2 {3. 4/} & {5 -} & {1'} | 5 - - -
复制代码

@stack 的第一个参数会继续使用当前音轨,后续的参数才会新开音轨;而 @voices 则是每个 @voice 都会新开音轨,父音轨承载 @voices 函数,不会泄露到里面每个 @voice。因此我们可以说,@stack 是临时的、局部的,而 @voices 是全局的、系统级的。

同一轨道(声部)上多次出现stack,音轨全部会复用。根据上文说过的“一个轨道对应一个对齐基线”的原则,一行内的多次 @stack 会相互影响,无论声部数是否一致:

stack 轨道的复用
1 2 3&4 5 6&7,,,,&1  % 4被后面的7抬高了
复制代码

多声部有两种写法:

  • 使用 @voices 或相邻的 N: 组织并行声部,用空行或内容块分段,在对应的小节线处同步。
  • 使用 connect 或 V{}:、V[]:、V|: 控制连谱号外观;重复使用的方案交给 @set。
  • 使用 @stack 或 &,适合临时多声部,第一段留在原谱线,后续分支叠在上方,不添加括线。

两者的音轨分配策略会影响排版和播放。若只是把同一个声部的几个音叠成和弦,继续阅读下一章和弦,不必为每个音创建声部。