書名:《Unityで作るリズムゲーム》
作者:長崎大学マルチメディア研究会
BMS文件格式
在本書中,譜面的編輯和讀取是通過一個名為「iBMSC」的軟件進行編輯並導出一個bms格式文件
而在BMS格式的文件中,以”#”號開頭的行被視為有效的命令。(更詳細的信息可參閱BMS command memo (JP) – https://hitkey.nekokan.dyndns.info/cmdsJP.htm)
命令大體可以分為兩部分:Header部分以及MainData部分
Header部分包括:曲名、作曲者名、難易度等指定譜面背景信息的命令
MainData部分包括:notes、拍子變化、速度變化等指定時間信息的命令
在MainData部分,每一行信息以這種形式表示:#xxxnn:AABBCC
xxx = 小節(節拍)編號
nn = 通道編號
AABBCC = 數據
iBMSC編輯
首先下載iBMSC
推薦:B站使用教程 + 配套文件下載鏈接(https://www.bilibili.com/video/BV15t411T7GU?from=search&seid=9136169063703448733)《iBMSC基礎教學》- wscxzl
界面使用
將以下信息填充至右上角的HEADER區域
#TITLE Sample1 #ARTIST Sample Artist #GENRE Sample Genre #BPM 120 #PLAYER 1 – Single #RANK 1 – HARD #LEVEL 100
在工具列中找到選項 -> 主題 -> IIDX.Theme.xml
點開右側的#wav,選擇「02:」
把notes添加到譜面中,如下圖
該譜面的流動可表示為:
這樣的譜面,在.bms文件格式的表示為:
*---------------------- HEADER FIELD
#PLAYER 1
#GENRE Sample Genre
#TITLE Sample1
#ARTIST Sample Artist
#BPM 120
#PLAYLEVEL 100
#RANK 1
#LNTYPE 1
*---------------------- MAIN DATA FIELD
#00111:02
#00112:02
#00113:02
#00114:02
#00115:02
#00211:02020202
#00312:00020200
#00453:0202
#00554:02020202
#00615:00000002
#00655:0200020002020000每一個以”#”號開始的行都是一個命令行
首先是HEAD FIELD部分,這部分表示了譜面的整體信息,Header名和數據本體之間使用一個半角空格分開,如:
命令:#PLAYER;其數據為:1,代表是單人遊戲的譜面
命令:#LNTYPE;其數據為:1,代表LongNote的記法是RDM類型(不需要太在意)
其他命令如#GENRE、#TITLE等等的同理
在這裡雖然沒有拍號的信息,但是一般在不標明的情況下,會默認為4/4拍號。
然後是MAIN DATA FIELD部分
第一小節(全音符):
#00111:02
#00112:02
#00113:02
#00114:02
#00115:02這對應了第1小節的最開始,在軌道A2-A6上設置了全音符的部分,由此可見MAIN DATA的具體數據分割為:
“#” = 命令標志符
001 = 小節編號(000~999)
11/12/13/14/15 = 通道編號
十位數的”1″代表「該note為單點(Single Note)」;如果十位數是”5″的的話,就代表「該note為長押(Long Note)」
個位數的”1″到”5″代表具體的軌道(A2~A6)
具體表示為0~9加上A~Z的36進制數
“:” = 分割符
02 = 具體數據
對於具體數據的部分,需要2個字2個字的來進行閱讀。在該全音符的例子中,一個「02」就對應了一個數據。
一行裡有n個「2位數數據」,就代表該小節被分為n等分
單獨的一個「02」就代表把該小節分為1等分,然後在這小節的開頭放置一個對象編號為02的對象
對象的編號範圍同樣是從0~9、A~Z的36進制數
當通道編號的十位數為「1」時,該對象就代表是一個「note」
這裡的對象具體是甚麼受到通道編號的影響,對象不一定是note。比如軌道編號的十位數為「2」,該對象則是「拍子變化」的表示
第二小節(軌道A2上的4個四分音符)
#00211:02020202
同樣地,先把數據拆解成上面提到過的5個部分
字首 小節編號 通道編號 分隔符 數據本體 # 002 11 : 02 02 02 02 在這行數據中,數據的本體一共有4個「02」,意味「該小節被分成4等分,每一個等分的開頭都放置了一個對象編號為「02」的note」
也就是在這一小節中,放置了4個4分音符
第三小節(軌道A3上的四分休符 -> 四分音符 * 2 -> 四分休符)
#00312:00020200
數據本體部分為:00 02 02 00
00代表了四分休符
02代表了四分音符
第四小節(軌道A4上的長度為一個二分音符的Long Note)
#00453:0202
通道編號為53,其十位數為5,代表這是一個Long Note
數據本體部分為:02 02
這一小節被分成兩等分
第一個02代表了Long Note的起點
第二個02代表了Long Note的終點
也就代表這個Long Note的持續時間起於該小節第一等分的開始,終結於第二等分的開始
第五小節(軌道A5上的兩個長度為一個四分音符的Long Note)
#00554:02020202
通道編號為54,表示數據是Long Note
數據本體部分為:02 02 02 02
這一小節被分成四等分,兩個Long Note
第一個Long Note開始於第一等分的開始,結束於第二等分的開始
第二個Long Note開始於第三等分的開始,結束於第四等分的開始
因此,可以把Long Note中的兩個02作為Long Note的開關來看待
第六小節(軌道A6上一個長度為一個四分音符的Long Note -> 一個長度為一個八分音符的Long Note -> 一個四分音符)
#00615:00000002
#00655:0200020002020000在這一小節中有兩行數據
第一行數據的軌道編號十位數是1,代表這行數據是Single Note
它把這一小節先分成了4等分,並在第四等分的開始放置該Single Note
第二行數據的軌道編號十位數為5,代表這行數據是Long Note
它把這一小節分成了8等分
第一個Long Note開始在第一等分的開始,結束在第三等分的開始
第二個Long Note開始在第五等分的開始,結束在第六等分的開始
依次具體表示為:「第一個Long Note起點 -> 八分休符 -> 第一個Long Note終點 -> 八分休符 -> 第二個Long Note起點 -> 第二個Long Note終點 -> 八分休符 -> 八分休符」
最後將兩行數據的結果合併
總結:
HEADER部分
“#” 號開始命令
空格作為HEADER名和並實際數據的分割
MAIN DATA部分
“#” 號開始命令
“#” 號之後的數據結構為:
小節編號(3字元)
000~999
通道編號(2字元)
00~ZZ
編號意義
Single Note:1L
Long Note:5L
L = 軌道編號
分隔符 – “:”
其後的為數據本體
數據本體中,每兩個字元代表一個「物件編號」
「物件編號」值範圍 = 00~ZZ
00為休止符
數據本體中有n個數據編號就代表該小節被分成n個部分
如:02 00 02 02 00 02 => 6等分