《Unityで作るリズムゲーム》學習筆記(五):「BMS文件編輯」
書名:《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 = 數據
- 在MainData部分,每一行信息以這種形式表示:#xxxnn:AABBCC
iBMSC編輯
- 首先下載iBMSC
- 官方網站(https://www.cs.mcgill.ca/~ryang6/iBMSC/Download.html)
- 推薦: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加上AZ的36進制數
- 具體表示為0
- ”:” = 分割符
- 02 = 具體數據
- 對於具體數據的部分,需要2個字2個字的來進行閱讀。在該全音符的例子中,一個「02」就對應了一個數據。
- 一行裡有n個「2位數數據」,就代表該小節被分為n等分
- 單獨的一個「02」就代表把該小節分為1等分,然後在這小節的開頭放置一個對象編號為02的對象
- 對象的編號範圍同樣是從0
9、AZ的36進制數 - 當通道編號的十位數為「1」時,該對象就代表是一個「note」
- 這裡的對象具體是甚麼受到通道編號的影響,對象不一定是note。比如軌道編號的十位數為「2」,該對象則是「拍子變化」的表示
-
- 第一小節(全音符):
- 第二小節(軌道A2上的4個四分音符)
-
#00211:02020202 -
同樣地,先把數據拆解成上面提到過的5個部分
-
字首 小節編號 通道編號 分隔符 數據本體 # 002 11 : 02 02 02 02 - 在這行數據中,數據的本體一共有4個「02」,意味「該小節被分成4等分,每一個等分的開頭都放置了一個對象編號為「02」的note」
- 也就是在這一小節中,放置了4個4分音符
- 在這行數據中,數據的本體一共有4個「02」,意味「該小節被分成4等分,每一個等分的開頭都放置了一個對象編號為「02」的note」
-
-
- 第三小節(軌道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的開關來看待
- 這一小節被分成四等分,兩個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終點 -> 八分休符 -> 八分休符」
- 它把這一小節分成了8等分
- 最後將兩行數據的結果合併
- 第一行數據的軌道編號十位數是1,代表這行數據是Single Note
- 在這一小節中有兩行數據
-
- 首先是HEAD FIELD部分,這部分表示了譜面的整體信息,Header名和數據本體之間使用一個半角空格分開,如:

- 總結:
- 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等分
- 小節編號(3字元)
- HEADER部分