跳到主要内容

自动划分的歌词

给曲谱添加歌词,除了复制粘贴歌词之外,还需要将歌词中的字符或音节与音符对齐。不过,好在 Sparks NMN 有自动歌词划分机制。有了它,添加歌词几乎就像复制粘贴那么简单。

标点符号

歌词文本中的字符有普通字符和标点符号两类。这是决定一个字符是否应该占据一个音符的依据。

标点有三类:后置标点被认为应当紧跟在一个歌词音节后面,前置标点则在前面,连接标点则均匀地分布在其两侧的音节之间。

自动识别的标点

Sparks NMN 会自动识别这些标点,并按照对应的方式处理排版。

// 后置标点的定义
const postfixSymbols = [
')', ']', ']]', '}',
'~', '—',
'!', '!',
'^', '…',
';', ';',
':', ':',
')', '>', '》', '⟩', '⟧', '⟫' ,'⟭', '〉', '』', '〗', '】', '〙', '」', '〕', '〛',
',', ',',
'.', '。',
'”', '’',
'?', '?'
]
// 前置标点的定义
const prefixSymbols = [
'(', '[', '[[', '[',
'(', '<', '《', '⟨', '⟦', '⟪', '⟬', '〈', '『', '〖', '【', '〘', '「', '〔', '〚',
'“', '‘',
'@', '#', '¥', '&', '$'
]
// 连接标点的定义
const connectorSymbols = [
' ', '-', "\\", '|', '/', '+', '='
]

在自动排版测量字符宽度时,大部分全角标点会按照对应的半角标点来测量,避免其占据自身“不该占据”的宽度。但是若半角标点的宽度不及全角标点的一半,则会使用全角标点的一半。

备注

半角单引号 ' 是特殊的,在字基模式下是后置标点,在词基模式下不是标点。(为什么?)

自定义标点

如果存在一些特殊需求,可以通过符号 < > 来自定义前置或后置标点。

  • > 用来连接自定义的前置标点。例如在 Lc: "...">终究要失去 中,... 会成为 的前置标点。
  • < 用来连接自定义的后置标点。例如在 Lw: 100<"%" 中,% 成为 100 的后置标点。
  • 若标点仅包含一个字符,且不是特殊字符,则双引号可以省略。

特殊的字符

除了标点外,还有两个比较特殊的,占据音符的字符:

  • % 占位符,占据音符的位置但是不显示任何东西。
  • _ 从当前音符的位置开始画一条与该音符等长的下划线。
    • 如果它的下一个字符也是 _,那么它会绘制到下一个字符为止。
    • 如果一个普通音节的下一个字符是 _,这个普通音节后面也会有下划线,直到它后面的 _ 字符为止。

有的人习惯在歌词中拖得特别长的字后面画一条长长的下划线,以示强调。下划线记号就是做这个用的。

音节划分

音节划分,即将歌词拆分成音节,是自动划分音节的基础。

首先会在普通字符和标点符号连接的地方进行划分,接下来,对于连续的一段普通字符...

  • 字基模式下,每个字符都会被分开。
  • 词基模式下,只有被空格分隔的地方会被分开。对于被空格分隔的字符,自动布局算法会保证它们之间至少有一个字母 a 的间距。

强制整体化

有时你可能不希望一个音节被自动划分的规则拆开。要做到这一点,只需要把这个音节加上双引号变成字符串。

这可以用来解决中文歌词夹杂英文的问题(不过使用中括号是更好的办法)。比如歌曲《爱很美》副歌的一句:

注意,加引号只是强制整体化,不会让本来是标点符号的东西变成普通字符,也不会将字基歌词变成词基歌词,因而自动排版算法并不会自动避免单词粘连。在字基歌词中夹杂词基歌词,标准的方法应当是使用中括号,稍后会提到。

半角双引号不能作为标点使用,因为无法确定是前置还是后置标点。如需要类似的标点符号,请使用全角双引号

标点认领

拆分完成后,每个音节将开始认领对应的标点。

  • 音节将向后领取一系列连续的后置标点。
  • 音节将向前领取一系列连续的前置标点。
  • 连接标点自然是不需要认领的。

如果有标点最终没有成功被认领,就会出现“有标点因位置无效而未被使用”的警告。

特殊括号

  • 小括号 (),写在里面的东西会被当成文本处理,强制整体化,然后被加上下划线。处理歌词中的儿化音,就可以将其与前面一个字用这种方式组合。
  • 中括号 [],括号本身会被去掉,其内部的内容会被当成词基歌词。这是字基歌词中夹杂单词情况的标准处理方式。
  • 大括号 {},内部写一个数字。只能用在 _% 后,表示将上一个字符重复一定次数。
    • _{0} 是有意义的,可以给上一个字符后面加上与对应音符等长的下划线而不产生其他影响。
  • 双中括号 [[]],用于标记角色或唱法,例如 [[男]] [[女]] [[合]] [[唱]] [[白]]。显示时,括号会被显示为小括号,布局方式相当于下一个字符的前置标点,紧靠在下一个字符之前。

中括号才是解决中文歌词夹杂英文最标准的方法,像这样:

如果要把这样的括号直接当标点使用,可以对其单独加上双引号,形如 "("我是括号内的文本")"

与音符配对

歌词的音节会依次与该声部旋律中的音符配对,如果该歌词行有替代旋律,将会使用替代旋律。

大多数音符都能和音节配对,除了这些:

  • 延时线 -
  • 休止符 0
  • 装饰音符。
  • 被上一个音符用延长连音线 ~ 连接的音符。