这是一个尚未实现或实装的特性设计方案。如果你有问题或者改进建议,可以在 GitHub Issues 或 Discussion 中提出。
下面的描述不适用于完全没有接触过吉他类乐器的选手。
吉他、尤克里里等乐器有一个共同特点——左手按压品格的方式决定了每个弦弹出的音高,而右手负责弹出这些音(可能是以一些特殊的方式)。它们的作用往往是通过和弦/分解和弦来给旋律伴奏,因此左手的按压方式只需要使各个弦的音高形成一个和弦,然后由右手弹拨即可。
为了尽可能好的适应能力以及相对简单的指法,此类乐器每根弦的空弦音往往不组成和弦,而是两个和弦的复合(标准六弦吉他是 E2-A2-D3-G3-B3-E4,尤克里里是 G4-C4-E4-A4)。因此无论简谱还是五线谱,都不能很好地反映此类乐器弹奏时的指法,TAB 记谱法应运而生。TAB 记谱法中,每根横线代表一根弦,而横线上的 x
表示弹拨动作。左手按压方式的变化以和弦标记的形式标在谱的上方。
除了应对吉他类乐器外,TAB 记谱法在伴奏编曲中也有使用的意义。分解和弦是伴奏中的常用手法,而 TAB 记谱法这种和弦与织体分离的记谱方式恰恰能简明扼要地表示分解和弦的弹奏方式。这时,和弦标记所表述的不再是品格按压的指法,而是每根弦在当前和弦下的“空弦音”。相对于吉他谱,我们称这种谱为“广义和弦谱”。
此提案给出了 Sparks NMN 中实现广义 TAB 记谱法的细节。
显然,对于吉他类乐器的乐谱,TAB 记谱法的和弦标记需要包含指法信息,用以渲染和弦图;对于广义和弦谱,和弦标记则必须指出每根弦的空弦音高。描述这些信息都需要不少的字符。如果每次用到一个和弦都要重新描述,代码将变得非常抽象。
为了解决重复描述的问题,我们引入全局的宏定义语法。
#def A:Cmaj c["C", p6x3(2:1"1",4:2"2",5:3"3",x6,o5)]
#def A:Fmaj c["F", p6x3(6-1:1,3:2"2",5:3"3",4:3"4",o6,o4)]
#def A:Bm c["Bm", p6x3:2(6-1:2,2:3"2",4:4"3",3:4"4",o5)]
宏关键字 Cmaj
Fmaj
Bm
令牌会被替换为后面的内容。宏关键字必须是单个单词。这种替换发生在任何以令牌化方式处理的指令行属性与内容中,因此也可以用来简化声部名称、表情记号等内容的表述。正好,吉他的和弦型伴奏中往往有大量重复的音型,也可以通过宏定义来简化表述。
A:
是可选关键字,指定宏定义作用的指令名(实际上的筛选机制是检测每行的第一个单词)。
实践中我们建议用户自行整理不同调下的常用和弦定义,作为代码“火车头”使用。
TAB 记谱法也涉及了新的音乐属性,主要与弦的空置音有关。
此音乐属性不要求不同声部一致
吉他类乐器乐谱中常见三种对基调的描述,分别是原调($t_0$)、选用调($t_s$)和选用指法($t_c$)。一般简谱的基调表述(形如“1=C”)所指的都是选用调,即
所谓选用指法,就是在不使用变调夹的情况下该指法弹出的基调。选用指法可以通过选用调与变调夹品格导出,公式为
原调总是和选用调绑定一同变化,因此语法设计为括号的形式,括号内为原调。
定义位置 | 类型 | 例子 |
---|---|---|
* | 绝对基调,含原调 | 1=G(1=D) |
转调时,如果是绝对转调,对应的原调需要再次标出;如果是相对转调,则相同的变化会作用于原调上。
此音乐属性不要求不同声部一致
变调夹位置的作用就是原来“不推荐使用”的移调音乐属性,因此,我们决定移除移调音乐属性,使用变调夹来代替。原本的属性写法不会失效,但是会出现警告。
定义位置 | 类型 | 例子 |
---|---|---|
* | 变调夹位置 | Capo=3 |
* | 变调夹位置,显示选用指法 | Capo=3^ |
* | 同向调弦 | Capo=-1/所有弦降低半音 |
* | 同向调弦,显示选用指法 | Capo=-1^/所有弦降低半音 |
相对转调不再会改变变调夹位置,需要额外使用属性进行调节。
此音乐属性不要求不同声部一致
一般吉他类乐器中,弦都是按自上而下编号的方式命名。然而,在广义和弦谱中,有的弦可能被分配了特殊用途,希望有一个特殊的名称。不同乐器的调弦也不一样,同样的乐器也可能用到多种不同的调弦方式,因此还需要有指定调弦的方法。
定义位置 | 类型 | 例子 |
---|---|---|
* | 调弦 | Tune:E2-A2-D3-G3-B3-E4 |
* | 调弦,展示名称 | Tune:E2-A2-D3-G3-B3-E4/吉他-标准 |
* | 调弦与命名 | Tune:L:G2-R:C3-3:E3-2:G3-1:C4-0:E4 |
未指定的情况下,弦自上而下以数字形式命名,最下方(编号最大)的弦调节为 C2,之后每根弦升高 3Key。命名一次后,后续调弦不需要再重新指定名称。
弦的名称只能是单字符,并且不能与声部行的预定义符号冲突。
调弦相关的的小节线属性应当展示在和弦标记符号上方,这点在设计时将着重考虑。
相比于原本标记符号中的和弦标记 c"Gd7"
,TAB 记谱法中的和弦标记需要包含更多的信息,例如指法图或者临时调弦。因此,TAB 和弦标记应当有新的语法。为方便,仍然保留原来的和弦标记。
TAB 和弦标记的主体是 c
和一个方括号 []
。方括号内的第一个值为双引号引起的字符串,表示和弦的名称。之后的值用逗号隔开,表示附加信息(接下来介绍的指法图与临时调弦)。
和弦名可以使用 ^{}
上标符号,这一般用于在广义和弦谱中标明和弦延展音的位置。
在附加信息的末尾添加一个 *
符号可用于隐藏。
和弦指法图的表示始终遵循先弦后品的规律。
开头是 p<弦数量>x<品格数量>
,或者 p<弦数量>x<品格数量>:<把位>
,之后一个小括号 ()
内若干项表达式表示按压位置或空弦信息。
类型 | 按压表达式例子 | 备注 |
---|---|---|
按压单个品格 | 4:2 |
|
按压单个品格,显示指法数字 | 4:2"2" |
|
横按多根弦 | 6-1:2 3-1:1 |
写成 1-6 会逆转箭头方向。 |
根音所在弦(可选) | t5 |
|
可用的空弦(可选) | o4 o5 |
|
和弦外音 | x6 |
注意例如在第二把位处,按压二品仍然写作 2
而不是 1
。
超出指法图范围的按压将不会显示,并且报错。
注意:进入无固定指法的 Solo 区域时,需要添加一个空白的指法图来取消和弦的品格按压。
临时调弦的语法与音乐属性保持一致,形如 Tune:G2-C3-E3-G3-C4-G4
或 Tune:5d-1-3-5-1e-5e
,但是不再能包含弦名称。
属性 reveal_chords
可以使切换和弦处谱线上显示其默认音高的唱名首字母。这是一种用于辅助读谱的提示符号,没有额外的用途。
TAB 声部指的是和弦下方的“k线谱”部分。这一声部的记号逻辑与其他类型的声部都相同,只是音符本体的格式有所不同。
TAB 声部以 Nt
(NotesTab
)开头,第二个属性表示弦的数量(声部名可留空),例如 Nt["A"_"1", 6]
Nt[,4]
。
拨弦的音符格式与一般乐谱的音符类似,直接写出弦名称即可。
拨弦 | 示例 | 备注 |
---|---|---|
拨弦 | 5 |
|
拨弦,临时按压 | 5"2" |
按压品格必须是数,品格计数排除变调夹 |
拨弦,自然泛音 | 5"12"[harm] |
harm 是音符属性 |
多指拨弦的音符用尖括号 <>
括起。
多指拨弦 | 示例 | 备注 |
---|---|---|
拨弦 | <321> |
|
拨弦,临时按压 | <3"7" 2"6" 1"5"> |
|
快速琶音型拨弦 | <5321>[fwd] |
fwd 是音符属性 |
拍弦 | <321>[tap] |
tap 是音符属性 |
拍弦将同时起到止弦的作用,撞击音色由特殊的采样乐器发出;快速琶音的发音规则同琶音。
快速琶音与扫弦的语法也使用尖括号,起点和终点弦的名称用 ~
或 -
隔开,分别表示琶音和扫弦。
扫弦 | 示例 | 备注 |
---|---|---|
琶音 | <5~1> |
|
扫弦 | <5-3> <3-1> <1-3> |
分别是向小端、小端和大端扫弦 |
琶音的时间间隔等分原音符,且至多为
多指拨弦中的联合连音线标记在每个拨弦位置之后,此时将在同一根弦上寻找下一个匹配。
延长连音线与常规声部相同,使用字符 ~
,只能作用于音符组(多指拨弦)整体。
联合连音线没有意义,但是仍然允许使用。只能作用于音符组(多指拨弦)整体。
确定型滑音与连音使用与延长连音线相同记号。当标注了 S,H 或 P 后,延长连音线不再具有原有效果。
连音线 | 示例 | 备注 |
---|---|---|
滑音 | 1"3"~[S] 1"5" |
S 是特殊的音符属性 |
上行连音 | 1"3"~[H] 1"5" |
同上 |
下行连音 | 1"5"~[P] 1"3" |
拆分连音线逻辑与普通声部相同,这时 S
H
P
出现在右开连音线上。
常规的 ~
左开连音线被视为延长连音线,且仅连接小节的第一列音符。通过方括号指定弦名称,即可将其变为滑音/连音的连音线。
连音线左开端 | 示例 | 备注 |
---|---|---|
常规 | ~ |
相当于延长连音线 |
指定弦名称 | ~[31] |
不是延长连音线 |
任意滑音通过特殊的音符属性表示。
- 开头带
p
,表示后置滑音。 - 中间的
S
是滑音标记。 - 末尾的
u
或d
表示滑音的走向。
非连接型连音格式类似于后置的任意滑音,开头字符改为 n
。
切音、制音通过音符属性表示。
切音 | 示例 | 备注 |
---|---|---|
切音 | <4-1>[cut] |
|
制音 | <4-1>[prev] |
切音长度为音符长度的一半,至多为
这是非标准特性,但是可能在广义和弦谱中有用。
止弦即手指接触弦使其停止振动,是一种特殊的拨弦形式。
止弦 | 示例 | 备注 |
---|---|---|
止弦 | <3"c" 2"c" 1"c"> |
品格指定为 c 即为止弦,显示为方块 |
所有常规奏法记号均可以在 TAB 声部中正常使用,但是都不能用于多指拨弦中的分音符。
前倚音仍然可以使用,但是含义变为“零时长音符”,也不再允许内部嵌套减时线。前倚音可以包含内部或者连接到主音符的连音线。前倚音只能在同一根弦上,音符只能是双引号引起的品格数字。
装饰音 | 示例 | 备注 |
---|---|---|
滑音前倚音 | 1"5"[("3"~[S])] |
后倚音不再有效。
标记符号行中,属性 sus
可以使标记符号成为持续性标记。持续性标记将一直保持,直到遇到插入符号 &end;
。
持续性标记 | 示例 | 备注 |
---|---|---|
闷音 | f"m"[sus] 0 0 0 &end; |
|
渐强记号(新写法) | cresc[sus] 0 0 0 &end; |
|
渐弱记号(新写法) | dim[sus] 0 0 0 &end; |
此类标记符号应当保证可以跨行。
原有的渐强渐弱记号将移除,以兼容音符组特性的语法。标记符号行也可以使用音符组,多个标记符号将会一个一个一个地排成一排显示。
初步实现的音效试听不实现滑音、连音的功能,也不解析装饰音,仅实现基本的音符功能。
TAB 记谱本质上是用于拨弦乐器,因此 Attack 和 Release 是分开的,Release 发生在重新拨弦、拍弦、切音、非空弦切换和弦以及止弦时,前三种情况需要在极短时间内快速切音。特别注意,乐曲终止时应当缓慢释放所有弦,避免输出音频结束时有音符被强制切断。
需要引入的采样音色:泛音、闷音、拍弦、制音
此次更新将会使 Sparks NMN 大版本变为 2
,以示其与之前版本的格式和逻辑不兼容。以前的乐谱需要经过手动修改才能完全适应新的版本。
此后,Sparks NMN 乐谱开头必须包含一行 #ver <版本号>
,表明乐谱文件的设计版本号。小版本中出现破坏性更改时,此版本号将作为后向兼容的依据。
TAB 乐谱的复杂性决定了其需要一种基于碰撞箱的自动布局。这将是对渲染机制的大重构,并且会同时解决掉目前许多需要手动调节的排版问题。
宏定义用于解决需要反复描述同一个音乐结构,代码非常冗余的问题。
上面的语法中,<>
内的内容可以视为多个子音符(琶音、扫弦除外),并且每个都可能有自己的音符属性。音符组也可以有统一的音符属性。
此特性的引入也将实现柱状和弦功能。
我们要处理的吉他是一种多声乐器,包含多种不同的音色,并且不同弦之间相互独立(即使音高相同)。这需要对现有的乐器框架进行一定修改。