Muse 乐谱数据结构解析

这篇文章提出了一个支持 muse 乐谱语法的数据结构,是基于abc 乐谱数据结构的基础上进行部分优化,并支持了 tab 谱[六线谱、四线谱]、简谱。

描述信息

主标题:

1
2
语法:T: 单身情歌 (第一个)
字段:metaText.title

副标题:

1
2
语法:T: 演唱 林志炫(第n个,n 大于等于2)
字段:metaText.subtitle

作者:

1
2
语法:C: 陈耀川
字段:metaText.composer

当有多个 C 出现的时候,在composer用换行符分隔。

调号、拍号和速度

调号:

1
2
3
4
5
6
7
8
语法:K: C
字段:key
{
acc:'', //升降调 (#/b)
accidentals:[],// 忽略
mode:'', // 忽略
root:'C' //调名
}

拍号:

1
2
3
4
5
6
7
8
语法:M: 3/8
字段:meter
{
type: 'specified', //可忽略
value: [
{num:'3',den:'8'}
]
}

速度:

1
2
3
4
5
6
7
语法:Q: 1/4=120 "Slowly"
字段:metaText.tempo
{
bpm: 120,
duration:[0.25],
postString: 'Slowly'
}

上面表示 一分钟 120 个 1/4 拍。

音符、和弦

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
字段:staffs[i].voices[i]:
{
chord: [{
name: "C/E", //和弦名称,查询和弦表
position: ''// 忽略
}],
duration: 0.0625, //音长
el_type: 'note',
pitches: [{
fret:1, //品数,或者'x'
string: 5, //第几弦:{a:1, b:2, c:3, d:4, e:5, f:6}
pitch: 2 //简谱用到
accidental: 'sharp' //升半音:sharp, 降半音:flat
}], //多个的时候表示和声,需要在同一线上绘制,可能是扫弦。
decoration: ['staccato','downstrum']//装饰音
gracenotes: {},//倚音
rest: {//休止符
type: rest/multimeasure
},
startTie: {//延长音开始
//{'S':'shift slide', 'H':'hammer on', 'P':'pull off'}
effect: "shift slide" //滑音等一下效果音会有这个字段,
}
endTie: //延长音结束
startSlur: //连音
endSlur: //连音
startTriplet: 3 // n连音开始标识位,表示 3 连音
endTriplet: // n连音结束标识位
tripletMultiplier: //连音音长
lyric:[{ //歌词, 可能有多行歌词
divider:'',
syllable:'',
}]
}
  • tie 表示的是同相同的延音
  • slur 则是两个不同音高的连音
  • triplet 表示3连音,n连音等,在音长上面比较特殊

音高

四/六线谱

1
2
3
4
{
fret:1, //品数,或者'x'
string: 5, //第几弦:{a:1, b:2, c:3, d:4, e:5, f:6}
}
  • a: 是谱线最上面的一根,以此类推。
  • 如果是扫弦或者琶音的话,那只要关注最上面和最下面的弦就可以了。

简谱

在 muse 中,中央 C 代表 1, 小 c 代表高八度的 1C' 则表示小八度的 1C'' 则必C'更小,c' 则是比 c 高八度。

如下按音从低到高,其顺序和五线谱的表示法是一致的:

1
C'', C', C, c, c', c''

对应在pitch字段中的值是:

1
2
3
4
5
{A: 5, B: 6, C: 0, D: 1, E: 2, F: 3, G: 4, a: 12, b: 13, c: 7, d: 8, e: 9, f: 10, g: 11}

C' = C(0) - 7 = -7
c' = c(7) + 7 = 14
依此类推...

变音记号

例子:

1
^b1
语法记号 字段名 含义
^ sharp 表示升半音
= natural 表示还原音
_ flat 降半音
^^ double sharp 升全音(暂不考虑)

音长

默认音长:L: 1/4

语法:

  • //2 默认音长一半0.5
  • // 默认音长 1/4(0.25)
  • 2 默认音长 2 倍
  • > 前付点 3/2 倍,后减音长 1/2
  • < 后付点,前减音长
1
2
弹唱谱例子:c1/, c1/2, cx//, a2*2
简谱例子:A/, C// ,c1

弹唱谱需要表示把位,所以需要用/表示倍减,*表示倍增。

1
音长计算的值 = 默认音长 * 音长的倍数,

和弦图

所有和弦包括默认的和弦在和弦表字段gchords当中,如果不存在在和弦表中,则绘制和弦名称即可。

语法:

1
2
3
语法:<和弦名称>=<起始品数>;<第n弦品位>(手指),<第n-1弦品位>(手指),...<第1弦品位>(手指)

例子: %%gchord C=1;X,3,2,0,1,0

其中手指是可选的。X代表和弦外音。

数据结构:

1
2
3
4
5
6
{
name: "C", //和弦名
chord: [[1, 0],[2, 1], [3, 0], [4, 2], [5,3], [6, "X"]], //[<第几品>:<手指>],数组的长度是弦的数量,数组下标按弦从上往下(从粗到细), x 代表和弦外音
position: 3, //开始品数
bars: [{from_string: 5, to_string: 1, fret: 1}] //大横按,from_string: 开始弦, to_string:结束弦,fret:品数(相对position)
}

其中 bars 是扩展字段,没有声明不需要绘制;position 没有声明也不需要绘制,

装饰音

用法:在音符前添加。

1
例子:u[b1*2-e3/]

下面是可能出现的装饰音:

语法符号 对应字段 意思
. staccato 断音、切音
V upstrum 上扫弦
U downstrum 下扫弦
A uparpeggio 上琶音
B downarpeggio 下琶音
accent 加重
T trill 颤音
H fermata 延长音
P pralltriller 延长

倚音:

用法:在音符前添加。

1
例子:{a1b1}[c2//d2//]

数据结构:和音符是一样的

1
2
3
4
5
6
7
8
{
accidental:'sharp',
duration: 0.5,
el_type:'note',
pitch: 12,
fret:1,
string:1
}

二连音、三连音和n连音

语法:

1
2
3
4
(n
简单连音例子:(2aC1
(p:q:r
复杂连音例子:(3:2:4G2A2B1

对应数据:

1
2
3
startTriplet: 开始标识位
endTriplet: 结束标识位
tripletMultiplier: 每个音音长 绘制不需要关心这个?

休止符

表示符号:zZ,音长方面表示和音符是一样的。

  • z : rest 休止符
  • Z : multimeasure 多小节休止符,暂时不用考虑

连音线(滑弦、敲弦、勾弦)

语法:

tie :

1
ex-ex 、[^b1*2-e3/]-S-[b2*5/2e4*5/2]

slur: 可以嵌套

1
((a3b2d2)b1)

小节线和重复线

数据结构:

1
2
3
4
5
6
7
{
el_type:'bar',
type: 'bar_thin' //bar类型
startEnding: '' //重复段落数字和开始标志
endEnding: '' //重复结束标志
barNumber: '' //忽略
}

abc bar

歌词

英文歌词以空格断字,中文单字断字。

语法 数据表示 含义
- 英文单词断开
* 跳过一个音符
~ 链接连个字,对齐同个音符

参考资料

  1. abcjs: javascript for rendering abc music notation.

  2. muse 2.7 制谱软件帮助文档。

坚持原创分享,您的支持将鼓励我继续创作!