Fate﹏贝里奇娜 发表于 2020-4-18 01:42

BMS文件数字化及其应用

【全文转自浆糊论坛,不代表本人观点】
【本文作者:handsome8848】
【原文链接:http://bbs.rohome.net/thread-1048409-1-1.html】




BMS文件数字化及其应用一.引言本人乃BMS新手一枚,信誓旦旦做好了了处女作**交给FF验明正身,结果被无情地打击回来,理由“压音不准”,以下对白:
Me:我咋觉得0.4速都没看出啥问题呢?
FF:视觉和听觉也要跟理论结合!

具体情况如下图:
http://bbs.chinagames.net/attachments/201008/6/284753475_12811077880600.jpg

稍有经验的Noter(甚至菜鸟如我)一眼就能看出来Error 1中一排NOTE应该下移一排,Error 2应该向下微移半格(出现此状况的原因是由于使用了64 Grid;注:本图为32 Grid视图)

Error 1及Error 2应该都是新人容易犯的压音问题,出错原因很大程度上是由于不仔细(如理论上有不理解的请参阅论坛相关文章),快速、有效地检查出此两类错误是制作、提交作品时不可或缺的一个步骤,面对上百个小节、上千个Note,我对FF大嚎道:“要是有软件检查就好了~”,FF答曰:“Just do it!”
于是,本文诞生了。
谨以此文献给和我一样新的新手Noter,以帮助大家减少压音不准的错误,尽快走上正途(我们的目标~通过审核!)

废话不多说,正文开始。(对于理论不太感兴趣的同志请直接跳往3L实践篇,但请理解“数字串规律”前面“压线”的定义)

二.理论篇

怀着一颗好奇的心,我用笔记本打开了一个BMS文件,得到了以下结果:
*---------------------- HEADER FIELD
#PLAYER 1
#GENRE Pop
………………(省略)
#WAV01 oops.mp3

#BPM01 52.17
#BPM02 122.78
……………(省略)
#LNTYPE 1
*---------------------- MAIN DATA FIELD

#00001:00000001
………………(省略)
#00603:000000000000000000000000000000000000000000AE003C000000000000005A
#00608:00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000020300000004000000000000
#00611:0002000200020000
#00612:02000000000000000200000000020000
#00613:0002000000020000
#00614:00000000020000000000000000020000
#00615:0002000200020000
#00616:00000000000002000000000000020000
#00618:00000000000002000000000000020000
#00653:00000000000000000000000002020000
………………(省略)

可以看到一个BMS文件可以完美地用记事本打开(或解码,Decode),打开后文件分为下列几个部分:
1.头文件(HEADER FIELD):记录了曲名、曲风、作者等信息
2.K音区(即上文中的#WAV01),如果是K-BMS,这里将会有一大串
3.变速区,记录了变速的信息
4.面条区,即#LNTYPE一行
5.重头戏,主要数据区(MAIN DATA FIELD),记录了谱面信息

从上面叙述我们可以看出,用记事本打开的BMS文件详细完整地记录了歌曲的Note信息,换言之,我们完全可以只用记事本而无需BMSE做出Note(前提是你的头脑足够发达,具体见下文)更直白的说,用BMSE只是一个GUI(图形用户接口),关于这点的讨论详见后文“四.应用之自动Note机”

下面关注数据区(main data field),和BMSE上所见一样,数据的记录也是按小节来记的,如#000****、#001****、#002****……那么以006节为例,#006后面的数字又代表什么意思呢?

经过实验,可以得出结论:#0061X记录的是米粒Note,#0065X记录的是面条Note,也就是说BMS里面米粒和面条是分开记录的。自然地,我们可以猜测,#0060X记录的是变速信息(为何存在#00603和#00608两行?有待研究)

进一步,我们通过实验可以的出上文所提到的X代表的是Note所在列----BMS记录每小节的NOTE信息是以列记录的,具体对应关系如下:(Xà键)
6à1
1à2

2à3
3à4
4à5
5à6
8à7
记实际击打键位从左至右为1-7,详见下图:

http://bbs.chinagames.net/attachments/201008/6/284753475_1281107934HQkI.jpg如#00611后面的一串数字“0002000200020000”(下称为数字串)就是X=1,即实际击打的2号键(左蓝)的米粒NOTE信息(因为是1X,注5X为面条信息),02为#WAV 02的意思,代表该位置排了一个#WAV 02
为什么有的数字串为16位(如#00611,#00613)有的数字串为32位(如#00612,#00614)?这与排放NOTE的位置有关,见下图:

http://bbs.chinagames.net/attachments/201008/6/284753475_12811073134N8Z.jpg

                                    注:此图不与上文所述#006对应!(假设该小节为#001,且除所示Note 外无其余Note)

我们称1号键位第一个Note(自下往上数)压在Grid 4上,2号(蓝)压在Grid 8上,3号(白)压在Grid 16上,4号(黄)压在Grid 32上, 5号(右白)压在Grid 64上 (本图为Grid 32视图,每一节有32格线,每一拍有8格线)

数字串规律:

1.数字串位数为该键位该节所压最细的Gird数乘2(由于#WAV 后面的编号由两位,如#WAV 01,#WAV 02)如1号键(对应X=6)在第一节(#001)压的最细的Grid为4,则#00116:后面的字串有4*2=8位

2.记录Note的顺序总体上为从上向下(以一个最细Grid线为单位上移),例如1号键压的最细格线为4,则#00116:后面的数字串由4部分(每部分2位)从上向下记录该节1号键的Note米粒信息。

看完这两条大家或许有些晕头转向了,下面以上图所示例子(设为#001)写出对应的BMS语言:

1号键:对应X=6(见上文提到的对应关系),最细压在Grid 4,故一共有8位,Grid 4视图如下

http://bbs.chinagames.net/attachments/201008/6/284753475_1281107331jwJS.jpg
第一个Grid无Note,即第一部分为00,第二个Grid线上有一个Note(#WAV 02),故第二部分为02,后2个Grid都无Note,故后2个部分为0000,综上,记录为#00116:00020000.

2号键:对应X=1(见上文提到的对应关系),最细压在Grid 8,故一共有16位,Grid 8 视图如下


http://bbs.chinagames.net/attachments/201008/6/284753475_12811073409QtT.jpg
第一个Grid 无Note,为00,第二个Grid 有一个Note,为02,第三个Grid 有一个Note,为02,后均无Note,故4-8“部分”(每部分2位构成)均为00,总计为#00111:0002020000000000

同样可以写出3号键(压Grid 16),4号键(压Grid 32)……的BMS。
3号键(白,X=2) #00112:00020000020000000000000000000000
4号键(黄,X=3)#00113:0002000000000000020000000000000000000000000000000000000000000000
5号键压Grid 64,数字串位数则有128位之多。

别忘了6,7号键的面条,只需要将“#001YX”中的Y由1换成5即可(Y=1为米粒,Y=5为面条),即6号键(对应X=5,并参照1号键的BMS语言)为#00155: 00020000,7号键为(X=8)#00158: 00020000

不妨试着写这样一段NOTE,用记事本打开看看是不是这样?
同样的,如果用记事本写下这一段BMS语言,用BMSE打开,即可看到NOTE效果!

至此我们已经可以用记事本写无K-BMS了(变速问题仍未解决,召唤神牛参与变速部分的破译工作,为何变速有两行信息03和08,且有些#BPM没有在变速列表之中?)

有人可能纳闷,费这么大劲弄这个干吗?依我看来,至少有2个作用:一是自己可以开发写Note的程序了(依据BMS语言)可以制作出新的BMS制作软件(讨论见“四.应用之自动Note机”);二是本文的高潮与主题---“BMS文件数字化在压音检查中的应用”


三.应用之压音检查篇:

如何将上文繁琐的BMS数字化应用在压音检查上?(注:此检查只针对由于粗心导致的错误,如下图Error 1,Error 2所示,对于抓音问题无法查出)

http://bbs.chinagames.net/attachments/201008/6/284753475_12811077880600.jpg
首先,我们需要观察整首曲子的大致最细压音Grid(忽略变速处用到的64Grid以及歌曲高潮密集处,取大部分谱面),就上图而言,如果无错误情况(见下图)
http://bbs.chinagames.net/attachments/201008/6/284753475_1281107323F7FD.jpg应该是压的Grid 8(每拍2线足矣,也就是每节8线),以此方法观察整曲发现最细压的大致是Grid 16(一般歌曲大概都是这个,即一小节16线,NOTE基本都落在16线上,某些High歌可能大量音符排列在Grid 32上,下面方法类推)

然后,我们用记事本打开歌曲的BMS文件,复制到WORD中(此举为了防止直接修改BMS文件,要知道记事本中修改BMS文件对NOTE会有影响!)删去多余部分,即 “*---------------------- MAIN DATA FIELD”之前的部分都删去,只保留数据区(MAIN DATA FIELD)。

接着进行如下WORD操作:
0.CTRL+H(替换),点击“更多>>”并勾选“使用通配符”(重要!)如图


http://bbs.chinagames.net/attachments/201008/6/284753475_1281108227OY00.jpg
在“查找内容”中粘贴“#0??0?:*^13”,“替换为”保持空格状态,点击“全部替换”(注:此操作删除掉“#0xx0x:……”的部分,即删除所有变速段,此法检查压音不考虑变速部分的压音,因为变速部分经常使用高BPM以及密格线)

1.
CTRL+H(替换)查找内容:“#?????:??^13”à替换为空格à全部替换(删除掉所有压Grid 1的部分,冒号后2个问号)
2.
CTRL+H(替换)查找内容:“#?????:????^13”à替换为空格à全部替换(删除掉所有压Grid 2的部分,冒号后4个问号,注:Grid 1和Grid 2在BMSE中没有视图,Grid 1即为1小节最多1个Note,Grid 2为1小节最多2个Note且压在小节均分处)
3.
CTRL+H(替换)查找内容:“#?????:????????^13”à替换为空格à全部替换(删除掉所有压Grid 4的部分,冒号后8个问号)
4.
CTRL+H(替换)查找内容:“#?????:????????????????^13”à替换为空格à全部替换(删除掉所有压Grid 8的部分,冒号后16个问号)
5.
CTRL+H(替换)查找内容:“#?????:????????????????????????????????^13”à替换为空格à全部替换(删除掉所有压Grid 16的部分,冒号后32个问号)

至此,剩下的Note信息都是压Grid 32和Grid 64的了,即为“变速密集区”、歌曲密集区及可能的错误区(超出了普遍的压线密度),以上例说明,替换后得到的结果如下:

#00111:02000000000000000000000000000000020000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000
#00112:00000000000000000200000000000000000000000000000000020000000000000000000000000000000000000000000002000000000000000000000000000000
#00113:0000000002000000000000000000000000000000000200000000000002000000
#00115:00000000000000000000000000000000000000000000000000020000000000000000000000000000000002000000000000000000000000000000000000000000



说明第一节的1,2,5(对应2,3,6号键)压了64线(有128位),3(对应4号键)压了32线

http://bbs.chinagames.net/attachments/201008/6/284753475_12811077880600.jpg
与实际情况完全相符(6号键既犯了Error 1 压了32线,又犯了Error 2压了64线,取更细的线即64线)。


对于几十个小节,上百个小节的BMS文件,只需要上述步骤,经过筛选即可得到压线过细(相对于整曲大致最细压线水平),即为可能的粗心摆错线的小节(问题小节)。当然,对于由于变速、或者歌曲自身原因需要压32线、64线的小节也会被误判为“问题小节”,这时我们只需要在“问题小节”中筛选出真正有问题的Note即可(忽略变速、音乐密集的小节)


有此方法,可以大大缩短NOTER检查粗心导致的压音错误的时间(BTW,也可作为FF检查上传作品的方法之一)。需要强调的是,该方法不能检查出所有(特别是抓音不准等问题导致的)压音不准的问题。但对于检查粗心所导致的摆放错误,这无疑是一个筛选的好方法。

四.应用之自动Note机

记得向FF抱怨要是有软件检查“压音失误”时,FF戏言:“要是自动写Note那不更好”,通过二。理论篇的研究,我们是完全可以制造一个Note Generator的(在变速问题没有完美解决前,至少是可以做出恒定BPM的歌曲)
大致思路如下:
1.测BPM
2.用频谱分析的方法测出音所在的位置(压哪格线?)和强弱、甚至音色
3.用随机数生成的方法即可自动生成“#001……”这些信息
可改进的有以下几方面:
1.加入自动识别重复旋律的功能以实现重复旋律Note的循环排列
2.判别音色排列出更有规律的Note(避免纯随机)
3.音响决定Note个数

发明是伟大的(至少像嘻哈练习曲、NOF等很有规律的曲子跑个程序就能出一套Note)然而,有了Note Generator,咱这些Noter还享受什么乐趣呢?

五.结论

本文通过对BMS文件的数字化研究,得出了检查“压音失误”的有效方法,可以有效提高Noter检查Note排列失误的效率,同时提出了自动Note机(Note Generator)的构想(有点Crazy)。
最后,感谢CCTV,感谢浆糊论坛,感谢FF大大,祝大家的NOTE越写越好~红名作品越来越多~

(就本文有任何问题与想法,欢迎联系QQ拍砖,QQ:)



handsome8848
2010.8.6

页: [1]
查看完整版本: BMS文件数字化及其应用