BMS(Be-Music Source)是一种用于音乐游戏的文件格式,由日本的Urao Yane与NBK于1998年创造。
发展
BMS最初是为一款名为BM98的音乐游戏设计,用于储存曲目信息和谱面,与相关的音视频文件联合构成可供弹奏的乐曲,创建者Urao Yane公开了该格式,使BMS成为了通行的标准。支持BMS的音乐游戏有:RDM、SSR、StepMania、O2Mania、Synth’N、Ruv-it、Lunatic-Rave等。
做为一种开放的文件格式,BMS先后分化出了两版:BM98(最初的BMS)和BME(扩展的BMS,E=Extended),BME在前者基础上增加了许多特性如长音、7KEY等,目前使用较为广泛,因此以下涉及的格式说明也以BME为准。
文件特征
BMS文件可被识别的扩展名为.bms或.bme,曾经用于区分BM98和BME,但在MG中并不作为判断的依据,也就是说,两个扩展名可随意混用。
格式说明
类似于XML,BMS文件内部由“标签行”构成,采用纯文本方式保存,音乐游戏程序负责解析该文件并读入所有关联的资源,最终“编译”形成完整的曲子。BMS语句以行首的“#”字符进行标识,其余行均视为注释。
BMS源文件按语句功能可分为三个区域:
1.信息区(HEADER),用于储存曲目的TAG
2.定义区(DEFINE FIELD),用于关联外部资源
3.谱面数据区(MAIN DATA FIELD),用于存储构建谱面的全部数据
常用语句与用法:(不区分大小写)
*—信息区(HEADER FIELD)—*
#PLAYER x
单人谱面/双人谱面
x=1:单人
x=3:双人
#GENRE xxxxxx
风格
#TITLE xxxxxx
曲名
#ARTIST xxxxxx
曲作者
#BPM x
每分钟的节拍数,默认值为130
#PLAYLEVEL x
难度级数
#RANK x
判定难度
x=0:very hard
x=1:hard
x=2:normal
x=3:easy
#TOTAL x
全部Note均以最高准确率命中后获得的生命值
#STAGEFILE <文件>
封面图片
<文件>:用作封面的图形文件名,bmp或png格式。主文件名相同即可,扩展名
一般写为“.bmp”。
#LNTYPE x
长音定义方式(详细说明在后面补充)
x=1:短音对模式
x=2:长音标模式
LR扩展标签(LR专用)
#DIFFICULTY x
同组中的难度划分
x=1:Beginner
x=2:Normal
x=3:Hyper
x=4:Another
x=5:Insane
#SUBTITLE xxxxxx
曲目的副标题
信息区代码示例:
//ALMAGEST [SP ANOTHER].bme
#PLAYER 1
#GENRE AKASHIC RECORDS
#TITLE Almagest
#ARTIST Galdeira
#BPM 178
#PLAYLEVEL 12
#RANK 3
#TOTAL 544
#DIFFICULTY 4
*—定义区(DEFINE FIELD)—*
#WAV<编号> <文件>
定义一个音频引用,即将曲目所需的音频资源文件关联至音频对象,以便导入谱面,其中
<编号>:36进制,2位数(取值范围:01 – ZZ)。
<文件>:被引用的音频文件名,wav或ogg格式。主文件名相同即可,扩展名一般写为“.wav”。
例如:
#WAV01 0001.wav //将0001.wav或0001.ogg关联至WAV01
#WAV02 0002.wav //将0002.wav或0002.ogg关联至WAV02
#WAV4T 004t.wav //将004t.wav或004t.ogg关联至WAV4T
#BMP<编号> <文件>
定义一个图片引用,图片对象与图形文件关联,用于实现背景动画,其中<编号>:36进制,2位数(取值范围:01 – ZZ)。
<文件>:被引用的图形文件名,bmp或png格式。主文件名相同即可,扩展名一般写为“.bmp”。
例如:
#BMP04 01_00.bmp //将01_00.bmp或01_00.png关联至BMP04
#BMP05 01_01.bmp //将01_01.bmp或01_01.png关联至BMP05
#BMPZZ 01_03.bmp //将01_03.bmp或01_03.png关联至BMPZZ
#BPM<编号> <数值>
定义BPM引用,用于阶段性变速,其中
<编号>:36进制,2位数(取值范围:01 – ZZ)。
<数值>:BPM值,可以取小数。
例如:
#BPM01 188 //BPM01=188
#BPM02 90.5 //BPM02=90.5
#BPMRR 100 //BPMRR=100
*—谱面数据区(MAIN DATA FIELD)—*
此处数据结构类似由小节和通道构成的二维数组,语句行格式如下
#<小节><通道>:<数据>
<小节>:数据所在的当前小节编号,三位十进制数(000 – 999)。
<通道>:通道编号,两位十进制数。
<数据>:由对象编号依次组成的序列,代表当前通道内相应对象在小节中的位置。
例如:
#00201:03030303 该行表示第2小节的通道1(背景通道)上共有四个编号为03的音频对象,这四个音频对象分别位于该小节的0(起始位)、1/4、2/4、3/4处。
#01311:03AE000000000000
该行表示第13小节的通道11(1P的1号位)上有两个音符对象,00为占位符。
该小节被8等分,03与AE位于0、1/8处。
通道编号列表(括号中为对象类型):
01:背景音/BGM(WAV)
02:节拍
03:BPM
04:背景动画/BGA(BMP)
06:弹奏中Miss时出现的画面(BMP)
07:Layer(BMP)
08:BPM
09:暂停
11 – 17:1P的弹奏通道(WAV)
11:1号键
12:2号键
13:3号键
14:4号键
15:5号键
18:6号键
19:7号键
16:转盘
21 – 27:2P的弹奏通道(WAV)
21:1号键
22:2号键
23:3号键
24:4号键
25:5号键
28:6号键
29:7号键
26:转盘
51 – 57:1P的长音通道(WAV)
61 – 67:2P的长音通道(WAV)
特殊说明
背景音通道(01)
同一小节内可以有多个背景音通道并存,例如:
#00701:00BW00BY000000000000C5C60000C9CA
#00701:BVJABXJCBZC0C1C2C3C4JDJEC7C8JFJG
节拍通道(02)
节拍通道中的数据为一个十进制数值,用于表示当前小节的长度,默认值为1
(4/4拍)。
例如:
#00302:0.75
表示第3小节为3/4拍
BPM通道(03)
谱面中的速度变更,除了先定义BPM对象后发送编号外,还可以直接将BPM值(不大于255的整数)以16进制发送至BPM通道中。
例如:
#00103:000000FF //255@3/4
#00303:1A // 11@0/1
长音
BMS提供两种长音类型,在使用前需要先进行声明,语句为:
#LNTYPE x
其中
x=1
此方式下,长音需放在单独的通道中,由一对同样的短音组成,长度为两个音符的间距,长音通道编号=对应的弹奏通道编号+40。例如:
#LNTYPE 1
.
.
.
#00051:0001000100000000
#00053:0002000000000000
#00153:0002000000000000
表示1P中1号位和3号位的两个长音
x=2
此方式下,需要定义一个长音截止符,长音位于短音通道中,由长音截止符标记结尾。例如:
#LNTYPE 2
#LNOBJ FF
.
.
.
#00012:0000000000000001
#00212:00FF000000000000
表示1P中2号位的一个长音
使用视频文件
LR与Ruv-it支持avi或mpeg文件做为背景动画,常用方法是将视频文件关联至BMP对象,然后将其发送到起始位置的BGA通道中即可。
示例:
#BMPZZ bo17t.avi
.
.
.
#00104:ZZ
需要注意的是,由于avi可以封装多种视频编码(xvid、H264等),系统需装有相应的视频解码器才能在MG中正常显示。
参考资料:
http://www.sun-inet.or.jp/~yaneurao/bm98/bmsformat.html
http://fileformats.wikia.com/wiki/Be-Music_Script
http://ja.wikipedia.org/wiki/BMS_%E9%9F%B3%E6%A5%BD%E3%82%B2%E3%83%BC%E3%83%A0
