BMS 文件格式

2 评论61次阅读2011.06.02 11:23 作者:Felicia 编辑

[阅读更多]

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

标签, , | 日志分类:Game, 转载