关于自制"Mod" Rsmplayer所使用的rsm文本格式的介绍

用语解释:
文件头 设想中的在音轨定义前进行预定义信息的文本,内容包括歌曲信息、作者信息、预定义音色、音量、音量渐变模式(函数)及参数、自动建造模式参数及各音轨偏移参数(不过全都暂未实现……);
主音轨 rsm文本中第一次出现的$所标记的音轨;
元参数 在解析rsm文本时每遇到各种记号便对两个预定义的RsmNote对象noteA和noteB进行修改,新增的音符由noteA复制并修改而来,它的参数称作元参数;
临时记号 将要修改的元参数赋给noteB后再修改元参数,其后添加音符之后再从noteB还原该参数;
参数n 带有参数的标记用n代表参数,使用时n可取值0~61,用0~9,a~z,A~Z共62个字符依序代替;
音符、控制音符、标记 “音符”和“控制音符”对应单个RsmNote对象,具有各种用于发音的成员变量,区别在于后者soundID成员变量等于0,且将其他成员变量用作控制参数起控制作用;标记起操控元参数和RsmNote序列的作用;
已实现:
$ 标记一个音轨的开始,初始化当前音轨;
; 标记一个音轨的结束,将该音轨添加至List<RsmTrack> trackList中;
@n 标记另一个音轨在此启动,参数n由该音轨的结束标记是第几次出现并减去1确定(主音轨是0,请不要使用@0);
~ 修改元delay参数为四分音符时值(12);
_ 修改元delay参数为八分音符时值(6);
= 修改元delay参数为十六分音符时值(3);
. 修改元delay参数为原来的1.5倍,即附点音符,不建议在"="标记后使用;
* 修改元delay参数为原来的三分之二,实现三连音;
- 将已添加至List<RsmNote> thisNotes的最新音符的delay参数加12,即延长一拍;
, 标记其后的音符与前一个音符同时播放;
0 向List<RsmNote> thisNotes中添加休止符;
1~7 对应一个钢琴音组的七个白键,以对应noteNum值生成RsmNote对象添加至thisNotes中;
8 增加已添加至thisNotes的最新音符的时值,将它的delay参数加上当前元delay参数的值,实现连音符;
9 复制已添加至thisNotes的最新音符,降八度后添加,且设置为同时播放;
> 升八度前缀标记;
< 降八度前缀标记;
# 临时升半音前缀标记;
b 临时降半音前缀标记;
+ 临时升八度前缀标记;
! 临时降八度前缀标记;
Zn 暂未分配字母标记的杂项功能标记,参数n表示功能号:
Z1 启动自动音符9功能
Z2 关闭自动音符9功能
暂未实现:
%n 复制标记,将已添加至thisNotes的最新的“参数n”个音符(包括控制音符)复制一次再次添加;
An,Bn 标记复制起始点和结束点,参数n相等的AB标记确定了一个音符组,结合P标记实现重复音符复制功能;
Pn 复制参数n代表的音符组添加到thisNotes中;
K 标记歌词文本的开始,代码会搜索其后出现的第一个字符";",截取"K"与";"之间的文本作为一行歌词,建议在所有音轨定义完成后,在rsm文本的末尾写入歌词;
Ln 控制音符,标记某行歌词的启用,参数n由该行歌词的"K"标记是第几次出现确定,L0表示空行;
以下是将音轨1略简化后的无歌词《千本樱》rsm文本(看上去很让人眼花……将来做个专用编辑器吧……)
视频地址:https://www.bilibili.com/video/av38250376/

static String rsm_senbon_zakura_3 = "" //
+ "$@1 _.6,+2 _.6,+2 _5,+1 _.6,+2 _.6,+2 _5,+1 _.6,+2 _.6,+2 _5,+1 ~6,+2 ~+1,+4" // 1-2
+ "_.6,+2 _.6,+2 _5,+1 _.6,+2 _.6,+2 _5,+1 ~6,+2 ~+4,+6 ~+3,+5 ~+4,+6>" // 3-4
+ "_56=2121 _56=2121 _56=2121 _4=*343_21 _56=2121 _56=2121 _56>_14 =3432_1<6" // 5-8
+ "_56=2121 _56=2121 _56=2121 _4=*343_21 _2=12_4=24 _6=56>14<6>1 _4=*343_21 ~2_24" // 9-12
+ "_56=2121 _56=2121 _56=2121 _4=*343_21 _56=2121 _56=2121 _56>_14 =3432_1<6" // 13-16
+ "_56=2121 _56=2121 _56=2121 _4=*343_21 _5=6>121<65 _2456 _.2.2_1~2-" // 17-20
+ "<~2_.2=1 _2445 ~2_.2=1 _21<6>1 ~2_.2=1 _2456 ~6_*565 ~42" // 21-24
+ "~2_.2=1 _1245 ~2_.2=1 _211<6> ~2_.2=1 _1245 ~6_*565 ~42" // 25-28
+ "4321 _1=12<_65~6- _6>1~253 4_31~2-" // 29-32
+ "4321 _1=12<_65~6_6>1 2~2_2~45 3--_24" // 33-36
+ "_.5.5_6 ~.6_6 >12<54 ~6_24 _.5.5_6 ~.6_6 b7654 ~4_24" // 37-40
+ "_.5.5_6 ~.6_6 >12<54 ~6_24 ~b76 54 _5631 ~2_24" // 41-44
+ "_.5.5_6 ~.6_6 >12<54 ~6_24 _.5.5_6 ~.6_6 b7654 ~4_24" // 45-48
+ "_.5.5_6 ~.6_6 >12<54 ~6_24 ~b76 54 _546>1 ~2-" // 49-52
+ "_2222 22=1<7_6 5555 55=54_2 2222 22=21_<6 5=65 6>124 6>124 _3=<24" // 53-56
+ "64268624 64268624 b754b78b754 b754b78b754" // 57-58
+ "b742b78b742 b742b78b742 53158531 63168631" // 59-60
+ "6426 +2642 5426 +4+264 b742b7 +2b742 b742b7 >432<b7" // 61-62
+ "+2b74b7 >4!b724 b742<b7 b742!b7 ~1 =<135+1 ~+#1 =#14#5>#1" // 63-64
+ "=5646 5432 3212 21<65 6546 5434 ~2-" // 65-66
+ "_2346 =56>23 4324 ~.6_+1 ~6-" // 67-68
+ "<_2154 64>21 64=*+16+16+16 ~+1-" // 69-70
+ "_4=2<b7 4b7>24 _5=31 !5135 _.6.b6=6b6 ~6-" // 71-72
+ "4321 _1=12<_65~6- _6>1~253 4_31~2-" // 73-76
+ "4321 _1=12<_65~6_6>1 2~2_2~45 3--_24" // 77-80
+ "_.5.5_6 ~.6_6 >12<54 ~6_24 _.5.5_6 ~.6_6 b7654 ~4_24" // 81-84
+ "_.5.5_6 ~.6_6 >12<54 ~6_24 ~b76 54 _5656 ~6_35" // 85-88
+ "_.6.6_7 ~.7_7 >23<65 ~7_35 _.6.6_7 ~.7_7 +1765 ~5_35" // 89-92
+ "_.6.6_7 ~.7_7 >23<65 ~7_35 ~+17 65 _657>2 ~3_<35" // 93-96
+ "67=3232 _67=3232 _67=3232 _5=*#45#4_32" // 97-98
+ "67=3232 _67=3232 _67>25 =#45#43_2<7" // 99-100
+ "67=3232 _67=3232 _67=3232 _5=*#45#4_32" // 101-102
+ "_3=23 _5=35 _6=67 >25!72 _5=*#45#4_32 ~3_35" // 103-104 ">"
+ "67=3232 _67=3232 _67=3232 _5=*#45#4_32" // 105-106
+ "67=3232 _67=3232 _67>25 =#45#4#3_2<7" // 107-108
+ "67=3232 _67=3232 _67=3232 _5=*#45#4_32" // 109-110
+ "_6=7>2 32<76 _3567 .3.3_2 ~3-" // 111-112
+ "_.3.3_2 ~3- 0000;"// 113-114
+ "$< A1 _.2,6,+2 _.2,6,+2 _2,6,+2 B1 P1 P1 P1" // 1-2
+ "P1 P1 ~2,6,+2 ~2,6,+2 ~1,5,+1 ~1,5,+1" // 3-4
+ "A2 _!b7_4,b7 _!b7_4,b7 _1_5,+1 _1_5,+1 _2_6,+2 _2_6,+2 _2_6,+2 _2_6,+2 B2" // 5-6
+ "P2 P2 P2 P2 P2 P2 P2" // 7-20
+ "A3 _2_6,+2 _2_6,+2 _2_6,+2 _2_6,+2 _!b7_4,b7 _!b7_4,b7 _1_5,+1 _1_5,+1 B3" // 21-22
+ "P3 P3 P3" // 23-28
+ "A4 _!b7_4,b7 _!b7_4,b7 _!b7_4,b7 _!b7_4,b7 >_!4_1,4 _!4_1,4 _!4_1,4 _!4_1,4" // 29-30
+ "<_!b7_4,b7 _!b7_4,b7 _1_5,+1 _1_5,+1 B4 _2_6,+2 _2_6,+2 _2_6,+2 _2_6,+2" // 31-32
+ "P4 _!6_3,6 _!6_3,6 ~3,6,+#1,+3 8" // 33-36
+ "A5 _2_6,+2 _2_6,+2 _!b7_4,b7 _!b7_4,b7 _1_5,+1 _1_5,+1 >_!4_1,4 _!4_1,4<" // 37-38
+ "_2_6,+2 _2_6,+2 _!b7_4,b7 _!b7_4,b7 _1_5,+1 _1_5,+1 >_!4_1,4 _!4_1,4<" // 39-40
+ "_2_6,+2 _2_6,+2 _!b7_4,b7 _!b7_4,b7 _1_5,+1 _1_5,+1 >_!4_1,4 _!4_1,4<" // 41-42
+ "_!b7_4,b7 _!b7_4,b7 _1_5,+1 _1_5,+1 _!b7_4,b7 _!b7_5,+1 ~2,6,+2 8 B5 P5" // 43-52
+ "~2,6,+2 8 ~!b7,4,b7 8 ~1,5,+1 8 ~2,6,+2 8" // 53-54
+ "~2,6,+2 8 ~!b7,4,b7 8 ~1,5,+1 8 ~!6,3,6 8" // 55-56
+ "A6 ~2,6,+2 ~2,6,+2 ~2,6,+2 ~2,6,+2 ~!b7,4,b7 ~!b7,4,b7 ~!b7,4,b7 ~!b7,4,b7 B6" // 57-58
+ "~!b7,4,b7 ~!b7,4,b7 ~!b7,4,b7 ~!b7,4,b7 ~1,5,+1 ~1,5,+1 ~!6,3,6 ~!6,3,6 P6" // 59-62
+ "~!5,2,5 ~!5,2,5 ~!5,2,5 ~!5,2,5 <~1,5,+1 ~1,5,+1 >~!6,#1,3,6 ~!6,#1,3,6" // 63-64
+ "A7 ~!b7,4,b7 ~!b7,4,b7 ~1,5,+1 ~1,5,+1 B7 ~2,4,6 ~2,4,6 ~2,4,6 ~2,4,6" // 65-66
+ "P7 ~2,4,6 ~2,4,6 ~2,4,6 ~2,4,6" // 67-68
+ "P7 ~2,6,+2 ~2,6,+2 ~2,6,+2 ~2,6,+2" // 69-70
+ "P7 ~!6,3,6 ~!6,3,6 ~!6,3,6 ~!6,3,6" // 71-72
+ "A8 ~!b7,4,b7 ~!b7,4,b7 ~!b7,4,b7 ~!b7,4,b7 ~!4,1,4 ~!4,1,4 ~!4,1,4 ~!4,1,4 B8" // 73-74
+ "~!b7,4,b7 ~!b7,4,b7 ~1,5,+1 ~1,5,+1 ~2,6,+2 ~2,6,+2 ~2,6,+2 ~2,6,+2 P8" // 75-78
+ "_!b7,4,b7 ~!b7,4,b7 _!b7,4,b7 ~!b7,4,b7 ~!b7,4,b7 ~!6,3,6 ~!6,3,6 ~3,6,+#1,+3 8" // 79-80
+ "A9 ~2,6,+2 8 ~!b7,4,b7 8 ~1,5,+1 ~1,5,+1 >~!4,1,4 8< B9 P9 P9" // 81-86
+ "~!b7,4,b7 ~!b7,4,b7 ~1,5,+1 ~1,5,+1 ~!b7,4,b7 ~1,5,+1 ~2,6,+2 8" // 87-88
+ "Aa _3_7,+3 _3_7,+3 _1_5,+1 _1_5,+1 _2_6,+2 _2_6,+2 _5_+2,+5 _5_+2,+5 Ba Pa Pa" // 89-94
+ "_1_5,+1 _1_5,+1 _2_6,+2 _2_6,+2 _1_5,+1 _2_6,+2 ~3,7,+3 8" // 95-96
+ "Ab _1_5,+1 _1_5,+1 _2_6,+2 _2_6,+2 _3_7,+3 _3_7,+3 _3_7,+3 _3_7,+3 Bb Pb Pb" // 97-102
+ "_1_5,+1 _1_5,+1 _2_6,+2 _2_6,+2 _1_5,+1 _2_6,+2 ~3,7,+3 8 Pb Pb Pb" // 103-110
+ "_1_5,+1 _1_5,+1 _2_6,+2 _2_6,+2 _.3,.7,.+3 _.3,.7,.+3 _3,7,+3 ~3,7,+3 _3,7,+3 =2,+2 =#2,+#2" // 111-112
+ "_.3,.7,.+3 _.3,.7,.+3 _3,7,+3 ~3,7,+3 <~3,7,+3 ~0000;" // 113-114
+ "";