分行、小节宽度与边距
默认情况下,Sparks NMN 总是采取四小节一行且每个小节等宽的排版方式,有时候,我们可能需要调整这些规则;当小节中连音线和三连音记号等内容过多时,它们可能与上方标记的文本(主要是小节线属性)出现重叠,通过添加上边距可以修复这一问题。
本节将介绍这些与精细控制乐谱排版有关的内容。为了更加具体一些,我们修改这份糟糕的《Frozen Heart》乐谱,使其变得可读且优雅。
控制分行
显然,上面的乐谱后半部分歌词出现了严重的重叠,这是因为小节宽度太小,自动布局也无能为力了。增大小节宽度的一个方法就是减少每行的小节数。
每行小节数
通过渲染属性 n
可以指定此文档或此章节中的每行小节数。
名称 | 类型 | 说明 | 默认值 |
---|---|---|---|
n | number | 每行小节数 | 4 |
time_lining | boolean | 基于时值的小节宽度 | false |
legacy_positioning 最低版本:Sparks NMN 1.14.20 | boolean | 使用旧版布局算法 | false |
例如,对上面的乐谱设置 n=3
,
然而这并没有很好地解决问题。现在,此乐谱的前一半变得过于空旷,而后一半仍然存在歌词重叠的问题。我们需要更加准确地为每一行指定小节数。
控制某一行的小节数
在碎片开头添加一行 Frp: n=<小节数>
(Frp
是 FragmentRenderProps
的缩写),即可指定碎片的每行小节数。显示时,一行的小节数取决于此行第一小节所在的碎片。
这样,就可以精细地调控上述乐谱,获得较好的显示效果。
目前情况已经好多了。尽管还是有少数小节内出现了歌词重叠的情况,但是重叠都非常轻微。这时就不应该继续调小该行的小节数了,而是应该调节某一个小节的宽度(权重)。我们稍后将进行这一操作。
Frp:
开头的行形式上是碎片的渲染属性,但是实际上只有 n
一个属性是有效的。目前这是有意的。
在保证可读性的情况下,也可以通过调节歌词字体大小来解决歌词重叠问题。详见自定义字体。
乐句对齐原则
观察上面调整之后的乐谱。其前四行都是 拍号,音符密度也相差无几,为什么一、二、四两行是 5 个小节,而第三行是 4 个小节呢?这并不是随便乱调的,而是为了使乐谱具有更好的空间感。
- 首先,前两行其实是歌曲的前两句。它们(和后面 拍的部分相比)都多出了一个两拍的小节,故设置为每行 5 小节。
- 第三行是第三乐句,只有 4 小节。
- 第四乐句有三个分句,同样是 5 小节,并且随后紧跟分段线,因此这一行也是 5 小节。
对于乐句相对规整的旋律或歌曲,在不导致布局变得突兀的情况下,应当尽可能让每个乐句的第一个强拍位于各自行中的相同位置。这就是乐句对齐原则。
调整小节尺寸
剩下的任务,是调节个别小节的宽度,解决歌词重叠的问题。
宽度权重
默认情况下,Sparks NMN 分配小节宽度时使用均分原则。因此,你并不能直接调整每个小节的宽度。相反,你调节的是每个小节的宽度权重——权重高的小节分得的宽度大,权重低的小节分得的宽度小,小节宽度的比例等于权重的比例。小节的默认宽度权重是 1。
调节小节宽度,需要在小节前的小节线上添加后置属性,写作 w=<权重>
。这个属性除调节宽度外没有其他显示效果。
对于上面的乐谱,可以做这些调整:
- 第 8 小节宽度略微调大。
- 第 20 小节宽度略微调大。
- 第 28 小节宽度减小,使得 26、27 的宽度增大。
- 第 31 小节宽度略微增大。
再次提醒,如果你觉得在代码中定位某个小节很困难,请尝试在预览中用鼠标点击该小节中的音符。
多声部乐谱中,要调整某一小节的宽度,只须在其中一个声部中调节即可。若多个声部的同一小节都指定了宽度权重,将选择最大的那个。
上边距
现在还有一个小问题——最后一小节的变速记号与自由延长符号或许太近了,稍微增加一点间距会更好。这样的调节可以通过指定小节上边距实现。
上边距的调节方式与宽度权重类似,写法为 t=<上边距>
,上边距以 em
为单位,表示页面总宽度的 。
另一个需要增加上边距的情况是使用了三连音记号,像这样:
根据时值自动设置小节宽度
上面提到,Sparks NMN 默认对小节宽度采用均分原则。一般情况下这种匀称整齐的划分方式是美观的,但是,当拍号频繁变化,或者使用散板时,这样的宽度划分就不能正确体现各小节长度之间的关系。
通过手动调整宽度权重调节宽度是可行的,但是操作起来十分麻烦。因此,Sparks NMN 提供了“基于时值的小节宽度”功能,能够根据小节的总时值来自动调节宽度权重。只须在渲染属性中加上 time_lining=true
即可。
目前,time_lining
属性在 Frp:
开头的行中也是无效的,千万注意。
根据时值调整权重的具体原理就是将当前小节的总时值(以四分音符为单位)直接当作权重使用,例如拍号 的小节获得 的权重,拍号 的小节获得 的权重。此外,如果小节开头或末尾标注了拍号,则每个拍号会额外增加 的权重。
此外,开启此特性后,部分布局行为变得与原来不同,需要注意:
- 通过
w=<权重>
语法手动指定的布局权重将会与自动生成的权重相乘,而不是覆盖。 - 空白小节(以及类似空白小节的特殊小节)获得的权重取决于此处拍号规定的每小节时值。散板设置下,它们始终获得 的权重。
其他特性
还有一些不太常用(一般情况下也不需要使用)的特性。
强制换行
在碎片开头添加一行 B:
(没有内容,但是冒号不能省略)可以在该碎片前强制换行。强制换行前的一行并不会自动充满它所在的空间。
要使强制换行前的一行填满页面宽度,仍然需要为其指定每行小节数。
小节边距
通过后置属性 p=<额外边距>
可以增大小节内音符与小节线之间的边距。这一特性很少用到,故不举例说明。
新版自动布局算法
最低版本:Sparks NMN 1.14.20
Sparks NMN 默认使用实验性的新自动布局方法,这种布局方法对多声部乐谱更加友好。若出现自动布局问题,可尝试禁用新算法,将渲染属性 legacy_positioning
设为 true
即可。
false
true
挑战
接下来...
你可能觉得 Sparks NMN 的默认排版有些“浪费纸”。终于,我们要介绍控制行距与段落间距的方式了。