Be-Music Source / Script | |
---|---|
Filename extension | .bms |
Developed by | Urao Yane |
Be-Music Script (7-button) | |
---|---|
Filename extension | .bme |
Pop'n Music Script | |
---|---|
Filename extension | .pms |
File formats category - |
The Be-Music script format is a file format for rhythm-matching games, devised by Urao Yane in 1998.
The format have been used in such games as Beatmania (simulation), BM98, StepMania, and Pop'n Music.
Specification[]
Lines starting with the number sign "#" are commands (directive-like). Otherwise, the line can be considered as a comment.
The file is composed of two sections: the header and the game data.
Throughout the section, the data associated with the file will be called "the song" (which is appropriate, as the format is associated with songs).
Header[]
#PLAYER
- indicates the player mode of the song. Possible values are: 1 - single player, 2 - two player, and 3 - double play.#GENRE
- indicates the genre of the song.#TITLE
- indicates the title of the song.#ARTIST
- indicates the artist of the song.#BPM
- indicates the tempo of the song, in beats per minute. Assuming the song has 4/4 time signature, and the song is set to 160 bpm, 160 beats = 40 measures would pass each minute, equivalent to 40m/1m = 40m/60s = 1m/2s, one measure would be played every two seconds. The default value is 130 (bpm).#MIDFILE
- a MIDI file played synchronously in the background, as a filename. Example: "streetjuzz.mid".#PLAYLEVEL
- indicates the level of the song, an integer.#RANK
- indicates the difficulty or "judgment level" of the song. There are four possible values: 0 - very hard, 1 - hard, 2 - normal, 3 - easy.#VOLWAV
- a relative percentage of the volume of the song when it is played.#WAV<hex byte point> <filename>
- defines a file to be played in the song. The file is assigned a hexadecimal point with a range of a byte, excluding 0. The point 0 represents nothingness in the file data. A BMS file usually have multiple #WAV declarations. Example:
#WAV01 "mainsong.wav"
(This assigns the file "mainsong.wav" to point 1, which can be referenced later.)
#WAV1A "bleep.wav"
(This assigns the file "bleep.wav" to point 1A)
#BMP<hex byte point> <filename>
- defines a bitmap to be used in the song. The bitmap's size must be 256 by 256 and it must be in 16-bit color. Example:
#BMP1E "roses03.bmp"
Note that wav points and bmp points are separate. #BMP00
can be assigned an image and is displayed as the default poor image.
Miscellaneous commands[]
#EXTCHR
#VIDEOF/S
- frames per second#STAGEFILE
Game data[]
The data section composes of multiple lines of the format:
- <measure number><channel number>:<message>
where
- measure/track number - a three-digit decimal (base-10) number from 000 to 999 which specifies the measure on which we will assign the message. Since measures always come in order, it is conventional to group together lines with the same measure number and sort these groups according to measure number.
- channel/column number - a two-digit decimal (base-10) number indicating the channel number.
- message - a sequence of points (wav points, bmp points, or other points in hex) indicating a message to be sent to the current channel. The points are placed evenly on the channel. For example, 02020202 corresponds to 02, 02, 02, 02, which means four objects corresponding to the point 02, which are placed evenly in the channel. 030304AE corresponds to 03, 03, 04, AE. To indicate nothingness, 00 is used. 050500 means 05, 05, 00, which means 05 is placed at the beginning of the measure, another at ⅓, and nothing at ⅔.
Example:
#00011:0505000500000500
- The message is placed at measure 0, at channel 11, and the message is:
Part of the measure: | 0 | ⅛ | ¼ | ⅜ | ½ | ⅝ | ¾ | ⅞ |
---|---|---|---|---|---|---|---|---|
05 | 05 | 05 | 05 |
Channel assignment[]
Common/extended common[]
- 01 - background music (BGM) channel. You can specify multiple BGM channel lines.
- 02 - time signature channel (special channel)
- 03 - Tempo/bpm change channel. Points are in hex, equivalent value in decimal is the BPM.
- 04 - background animation (BGA) channel
- 06 - "Poor" bitmap change channel
- 07 - layer channel
- 08 - extended BPM
- 09 - stop channel
BM98[]
- 11 to 17 - player 1 object channel
- 21 to 27 - player 2 object channel
BM IIDX-like games[]
- Player 1
- 11 to 13 - leftmost keys
- 14 - center
- 15, 18, 19 - rightmost keys
- 16 - scratch
- 17 - unassigned
- Player 2
- 20 - unassigned
- 21 to 23 - leftmost keys
- 24 - center
- 25, 28, 29 - rightmost keys
- 26 - scratch
- 27 - unassigned
PMS[]
- 11 - left white
- 12 - left yellow
- 13 - left green
- 14 - left blue
- 15 - red
- 16 - unassigned
- 22 - right blue
- 23 - right green
- 24 - right yellow
- 25 - right white
O2Mania[]
- up to version 1.2
- 16, 11, 12 - leftmost keys
- 13 - center
- 14, 15, 18 - rightmost keys
(Basically the same as the keys in BM IIDX-like games for player 1, but offset with the leftmost key moved to the scratch.)
- Version 1.3+
O2mania version 1.3.0 and above uses the same channel assignment as BM IIDX-like games. For backwards compatibility, O2mania version 1.3.0 and above will use 1.2.0's channel assignment only if the channel "19" is not used at all.
Extended BMS syntax[]
Extended points[]
Newer versions now allow the file to specify a hexatrigesimal (base-36) system to be used instead of a hexadecimal system for specifying points. This is fully backwards-compatible with the old versions. Instead of 0 to 9 and A to F, one can use all digits (0 to 9) and all letters (A to Z).
Long notes[]
Long notes are specified using the #LNTYPE
command. Currently, there are two possible values, 1 and 2.
Extended BPM syntax[]
Channel 03 can only be used on integral beats per minute from 0 to 255. To specify fractional values or values greater than 255, add a #BPM<hex byte point> <bpm value>
command in the header, and call the corresponding point in channel 08. For example, to add a bpm of 124.5 halfway in measure 6, you would type:
#BPM01 124.5
...
00608:0001
Stop syntax[]
The stop syntax is similar to the extended BPM syntax: add a #STOP<hex byte point> <stop duration>
command in the header. A stop will momentarily pause the playing of the file. Depending on the implementation, stop duration is a value indicating how much time will the playing be paused, in 192nds of a measure. Stops are called using channel 09. Example:
#STOP01 96
...
#005009:01
This causes a stop at the beginning of measure 5 with duration equal to a half note's duration.
Time signature[]
Time signatures for individual measures can be specified using the special channel 02. Since only one can be assigned in each measure, it only has one value. The value is the quotient of the upper number and the lower number. For example, the value for 4/4 is 1 (default). The value for 3/4 is 0.75. Values are as-is, in decimal (base-10). Example: #00302:0.5
.
Extended BGA syntax[]
- More verification needed
#BGA<bmp channel> <point of bmp to be loaded> <x1> <y1> <x2> <y2> <dx> <dy>
- x1, y1 - The starting point of the picture
- x2, y2 - The size of the picture to crop
- dx, dy - The offset from the drawing surface to draw the cropped picture.
Extended WAV syntax[]
In addition to hex byte point for #WAV(01-FF) which only supports 255 sound files, modern simulators also support up to 1295 sound files using base 36 numbering #WAV(01-ZZ). Also, .ogg and .mp3 files can also be specified in #WAV files.
References[]
- Specification of original BMS format by Urao Yane
- Extented BMS syntax at ruv-it (Korean)