← 筆記

《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 = 數據

iBMSC編輯

  • 該譜面的流動可表示為:

  • 這樣的譜面,在.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)
              • 具體表示為09加上AZ的36進制數
          • ”:” = 分割符
          • 02 = 具體數據
            • 對於具體數據的部分,需要2個字2個字的來進行閱讀。在該全音符的例子中,一個「02」就對應了一個數據。
            • 一行裡有n個「2位數數據」,就代表該小節被分為n等分
            • 單獨的一個「02」就代表把該小節分為1等分,然後在這小節的開頭放置一個對象編號為02的對象
            • 對象的編號範圍同樣是從09、AZ的36進制數
            • 當通道編號的十位數為「1」時,該對象就代表是一個「note」
              • 這裡的對象具體是甚麼受到通道編號的影響,對象不一定是note。比如軌道編號的十位數為「2」,該對象則是「拍子變化」的表示
    • 第二小節(軌道A2上的4個四分音符)
      •   #00211:02020202
      • 同樣地,先把數據拆解成上面提到過的5個部分

        • 字首小節編號通道編號分隔符數據本體
          #00211: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等分