译者前言:
有很多音乐游戏都使用了此格式或此格式的变种,这里举一些例子:《节奏地带》、《VOS》、《劲乐团》、《MYDJ》、《太鼓达人》《MYO2》、《DJMAX》、《超级乐者》、《超级舞者》等均使用了此格式及其变种。
但还有一些游戏类似:《节奏大师》、《劲舞团》、《OSU!》、《巨星》等游戏使用的则不是此格式。
以上仅作一些游戏使用格式的区别及应用场景示例,请读者自己体会~
原文地址:http://bm98.yaneu.com/bm98/bmsformat.html
以下为译文(因原文地址中所示内容版本过早,译者从其他地方更新了更多内容进来):
BMS格式规范
原作者: Urao Yane([email protected])
"BMS"是指"音乐源文件"。后缀名为"bms"的文件都被认为是"BMS"格式文件。这种文件格式是由"Urao Yane"和"NBK"联合研发的。该格式原本是给BM98(2000年左右发行的一款打碟机模拟器游戏)所研发的。但是现在,所有人都可以自由免费的使用该格式。
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
<命令行>
一行以 "#" 为开始的才是需要解析的命令。所有其余的都可以忽略(均视为注释)。BMS文件在程序运行时才解析。另外,命令行中的字母是不区分大小写的。
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
<头数据>
#PLAYER 1
指示当前是玩家1在游戏。
#PLAYER 2
指示当前是玩家2在游戏。
#PLAYER 3
指示当前是双人游戏。
#GENRE xxxxxxxx
指示风格流派。
#TITLE xxxxxxxx
指示音乐名称。
#ARTIST xxxxxxxx
指示艺术家。
#BPM xxx
指示每分钟节拍数。 默认值: 130
#MIDIFILE xxxxxxx.mid
指示当前使用的MIDI背景音乐。
#PLAYLEVEL x
指示歌曲等级。
#RANK x
判定级别。
x为0 :非常难, x为1: 难, x为2: 正常, x为3: 简单
#VOLWAV xxx
指示相对的音量控制(百分比)。
#WAVxx yyyyyyyy.wav
指示波形数据文件。xx的范围是01到FF(十六进制),yyyyyyyy.wav是wav文件名。
例如:
#WAV01 HOUSE01.WAV // 在WAV通道的01数据位使用HOUSE01.WAV文件。
#WAV02 HOUSE02.WAV // 在WAV通道的02数据位使用HOUSE02.WAV文件。
#WAVFF HOUSE03.WAV // 在WAV通道的FF数据位使用HOUSE03.WAV文件。
#BMPxx yyyyyyyy.bmp
指示位图文件。xx的范围是01到FF(十六进制),yyyyyyyy.bmp是位图文件名。
位图大小必须是256 * 256(最大色彩数为65536,16位色)
例如:
#BMP01 HOUSE01.BMP // 在BMP通道的01数据位使用HOUSE01.BMP文件。
#BMP02 HOUSE02.BMP // 在BMP通道的02数据位使用HOUSE02.BMP文件。
#BMPEE HOUSE03.BMP // 在BMP通道的EE数据位使用HOUSE03.BMP文件。
但是,在BMP通道的00数据位(即:#BMP00)定义的是一个特殊的数据。
这个位图的作用是在于玩家发挥失常时反馈显示所用。
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
// 以下是一个随机触发函数的示例
// 译者注:如果翻译为JavaScript则是这样……
var num = (Math.random() * 2 + 1) | 0; switch (num) { case 1: // console.log("00111:31313131"); break; case 2: // console.log("00113:32003232"); break; }
#random 2 // 创建一个随机数 (值为1或2)
#if 1 // 如果随机数字等于1的时候...
#00111:31313131 // 这里将被执行到...
#endif
#if 2 // 如果随机数字等于2的时候...
#00113:32003232 // 这里将被执行到
#endif
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
<通道信息>
#aaabb:cccccccc
aaa: 轨道编号 (从 000 到 999)
bb : 你要发送的消息的类型。(从 00 到 FF)
cccccccc : <具体的消息内容>
<类型通道编号摘要>
01 : BGM(WAVE背景音乐)
02 :节拍
03 : 变速(改变每分钟节拍数),默认为4/4拍即为1
04 : BGA(背景动画)
06 : 改变用户被Miss判定时显示的位图
07 :Layer位图
09 :暂停
11 - 19 : 玩家1按键通道
21 - 29 : 玩家2按键通道
51 - 59 :玩家1长音通道
61 - 69 :玩家2长音通道
<示例>
#00302:0.75
这一行表示第三小节为3/4拍
#00211:03030303
这一行表示002通道中有一个玩家一的按键事件列表,该列表中有4个对象,每个对象被触发时(用户在音符下落的时候正确击打时)都会播放WAV通道数据位为03的音频。并且这4个对象均匀的排列在一个节拍中(根据 [消息内容数量:消息内容长度 / 2] 来确定一个拍是几分音符)。
译者注:关于这一个命令的轨道如下表所示(同样使用上面一行命令做为演示数据),从以下表中可以看出,此小节是4分音符为一拍的:
0 | 1/4 | 2/4 | 3/4 |
03 | 03 | 03 | 03 |
请尝试以下操作:
#00211:0303030303
#00211:0303000303
#00211:010101
译者注:此段提示,此轨道是3/4拍的,4分音符为一拍,每小节3拍。
#00211:00020202
译者注:此段中的00为占位符。
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
这个文档及格式是自由免费的!
我希望有朝一日,我的BMS格式能遍布在全世界!
译者注:你已经做到了……