《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)

                    • 具體表示為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個部分

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