返回列表 发帖

BMS文件数字化及其应用

BMS文件数字化及其应用

一.引言

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

具体情况如下图:



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

Error 1Error 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):记录了曲名、曲风、作者等信息
2K音区(即上文中的#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,详见下图:

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




                                      注:此图不与上文所述#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)压的最细的Grid4,则#00116:后面的字串有4*2=8

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





[ 本帖最后由 handsome8848 于 2010-8-6 23:23 编辑 ]

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

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


第一个GridNote,即第一部分为00,第二个Grid线上有一个Note#WAV 02),故第二部分为02,后2Grid都无Note,故后2个部分为0000,综上,记录为#00116:00020000.

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




第一个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”中的Y1换成5即可(Y=1为米粒,Y=5为面条),即6号键(对应X=5,并参照1号键的BMS语言)为#00155: 000200007号键为(X=8#00158: 00020000

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

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

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



[ 本帖最后由 handsome8848 于 2010-8-6 23:24 编辑 ]

TOP

三.应用之压音检查篇:

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


首先,我们需要观察整首曲子的大致最细压音Grid(忽略变速处用到的64Grid以及歌曲高潮密集处,取大部分谱面),就上图而言,如果无错误情况(见下图)

应该是压的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(替换),点击“更多>>”并勾选“使用通配符”(重要!)如图



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

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

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


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



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




与实际情况完全相符(6号键既犯了Error 1 压了32线,又犯了Error 2压了64线,取更细的线即64线)。




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




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






[ 本帖最后由 handsome8848 于 2010-8-8 11:44 编辑 ]

TOP

四.应用之自动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



[ 本帖最后由 handsome8848 于 2013-8-19 16:35 编辑 ]

TOP

拍砖
子曾经曰过:在哪里跌倒了,就在哪里躺着。

TOP

自动机其实我并不赞成,不过提高效率倒是很值得支持(这两者概念是不同的,人可以稍微偷点懒,不过超过一个“度”的话肯定要出事)


这篇文章还是很新颖的,加精了,希望LZ加油做出好的BMS

TOP

技术性很强 不过貌似用不到哎 好复杂 不过应该支持一下技术贴

TOP

。。。。东西少没有问题。。。东西多了以后。。。很复杂的说。。。昨天我用程序生成BMS,结果这个编码我足足复制了5分钟。。。。

TOP

- -嘛嘛,GUI本身就是开发人员为使用者创造的工具.就像PS是艺术家的工具一样,不可能所有人都是程序员的,研究源码与制作BMS并没有太多关系,最重要的不是用什么工具,而是找到可以尽情发挥的方法.
学习规则,然后忘掉规则...

TOP

这文章有个很大的漏洞。
http://www.o2mania.com/4_Downloa ... 200907220005977.htm
别人的BMS我不清楚,这是我去年做的忍者神龟3,请用你的“快速检查方法”对此BMS进行一次检查,你就明白文章的漏洞在哪了。
实际检查压音,还得靠放慢。文章中的这个方法仅仅适用于BPM完全恒定且旋律变化反差很小的一部分曲子。可以说适用范围极小。
如果审核单单用此方法会很容易造成大量的冤案错案假案。
当然,作为技术帖,值得鼓励,有认真研究的心态,这是很好的。
不过方法的可用性和可行性就值得商榷了。

[ 本帖最后由 Bombtrack 于 2010-8-7 19:55 编辑 ]

TOP

回复 #10 Bombtrack 的帖子

拜读过您关于这歌的测BPM的帖子,我感觉这首歌属于比较另类的吧,测个BPM都用了您所说的3种方法,此文方法不适用也似乎在情理之中。

这篇文章提出的方法具有一定的普遍使用性(毕竟一般的曲子BPM不会经常浮动),特别是对于新手和压音效率有很大帮助,由于某些个案而否定了此方法似有不妥。

当然了,放慢速度来检查压音乃是根本方法,并不与此文冲突,本文提出的是快速检查(强调效率)由于粗心所犯的压音错误(手一抖放错了线等情况)

欢迎继续讨论~

TOP

社友者(37969986) 19:54:01
还有一点,RO的变速经常是移动NOTE的,而且经常出现64线甚至192线的NOTE
社友者(37969986) 19:54:28
碰到这种,他的“快速检查压音法”也是无能为力
道·Freefire(183203079) 19:55:34
所以本来就是新手用的  
道·Freefire(183203079) 19:55:43
当时我跟他说起过这个的  
道·Freefire(183203079) 19:55:56
不过如果只是以提高效率来说的话,也勉强可以吧  
社友者(37969986) 19:56:02
也不行的
道·Freefire(183203079) 19:56:07
你一个个检查,这样跳跃起来快写  
道·Freefire(183203079) 19:56:25
就像word里的查找一样,不一定查找的都是你的不表,不是的话就跳过去就行了  
道·Freefire(183203079) 19:56:39
毕竟大多的地方还是比较规律的  
社友者(37969986) 19:56:45
毕竟他是以记事本来检查,从记事本的代码转到BMSE的小节,又得花大工夫去找
道·Freefire(183203079) 19:57:13
这方法发明者自己用或许还不错  
道·Freefire(183203079) 19:57:20
别人用的话可能就不适应了  
社友者(37969986) 19:57:29
你就算找到有几个是不合规律的,还得用BMSE再进行确认
再者,这只能针对无变速或纯A类变速的BMS
社友者(37969986) 19:58:03
有这工夫一点一点找,我MANIA放慢2次看都整曲看完了
道·Freefire(183203079) 19:58:33
那得看曲子有多长了  
社友者(37969986) 19:58:41
以技术帖来说,这帖写得是有创意
但是从可行性来说,太低
道·Freefire(183203079) 19:58:43
这个方法某种场合还是很适用的  
道·Freefire(183203079) 19:59:09
越是时间长,BPM稳定的曲子就越实用  
社友者(37969986) 19:59:19
就是这某些场合具体是多大的场合
实际上据我看来,5个曲子有1个都不错了
社友者(37969986) 19:59:40
因为现在的投稿很少出现完全没变速的
道·Freefire(183203079) 19:59:43
从总体投稿的BMS来看的话,应该远远不止  
社友者(37969986) 19:59:51
一碰到变速的,这办法就行不通了
道·Freefire(183203079) 19:59:53
只能说,如果是RO的话,估计没啥用  
道·Freefire(183203079) 20:00:13
包括DB这种比较喜欢渐进缓冲变速的  
社友者(37969986) 20:00:34
就说新手的变速吧,新手不会用RO那种级别的变速,我就简单举例,某个地方旋律缓慢,新手整体来个0.5倍BPM,这怎么办
道·Freefire(183203079) 20:01:30
那段直接跳过就行了  
道·Freefire(183203079) 20:01:35
做的人应该自己有数的  
社友者(37969986) 20:01:48
所以你还得去查这段对应在记事本里是什么位置
道·Freefire(183203079) 20:01:54
不过如果在0.5BPM的段落出现压音问题的话,就不行了  
社友者(37969986) 20:02:02
是啊
道·Freefire(183203079) 20:02:02
我先重启  
社友者(37969986) 20:02:16
所以说实用性太低

TOP

"毕竟他是以记事本来检查,从记事本的代码转到BMSE的小节,又得花大工夫去找"
上文提到的方法是“用笔记本打开BMS文件,然后在WORD中剔除到只剩下压64线,128线”,剔除后剩余的结果为#0xy????:的形式,其中XY即代表所在小节,直接在BMSE中查看即可,本文提出的方法没有在“不使用BMSE”的条件下呀,只是为了方便查找需要检查的、可能出错的小节。不信的话您可以拿一首变速不太多的歌曲实验一下,由于可以成片跳过剔除结果(如变速段、高潮段),检查效率其实是挺高的。

至于所说只有发明人会用,就此问题特别在3L总结了使用方法,可以不必透彻研究理论,按照3L的方法操作几步WORD即可知道出现问题的小节,何乐而不为呢?

另,我有一点疑问,传说中RO的超级变速难道变完了不压小节线的吗?如果变完了还是要压小节线,我们要做的只是检查的时候“跳过变速段”,文中已经提到,此方法不检查变速度(因为经常压高线)的错误!当然,如果变完速不压小节线,后面的NOTE全排在64,128线上,那就无能为力咯~

综上,我认为在一个“规律的歌曲”(变速不太多)和规律的BMS writing(对齐小节线)情况下,该方法还是可以起到一定作用的~

当然,如果习惯了用放慢速度检查的方法,那也是可以的~

打个不太恰当的比方,原子弹和小刀都可以杀人,原子弹杀人速度快但精确度可能有所欠缺(不能解决所有问题),小刀可以一个一个杀(精确)但是效率低,喜欢那种杀人方式任君选择~

TOP

再提出一点疑问:文中提到的两种Error 靠“放慢速度”似乎难以听出!

以BPM 100的歌曲为例,每一小节0.6秒,Error 2这种错误引起的误差是1格64线,也就是0.6/64约为0.01秒,Error 2引起的误差为1格32线,约0.02秒,不知道要放慢到什么样的速度才能察觉出0.01秒数量级的误差呢?(不知道0.1速能否看出,也就是视听之间有0.01(~0.02)/0.1=0.1(~0.2)秒的误差,话又说回来,一首5分钟的歌用0.1速听一遍可是50分钟)

是以,我认为对于这两种粗心所导致的误差,还是本文提出的方法比较适用,而放慢速度的方法,恰是对付本文没有涉及到的错误(如抓音不准等),望指正

TOP

应该说两种方法各有利弊吧,不过不论是哪种方法,用得熟练的人一般很快直接扫一遍就能看出来了


小B的那种放慢方式说的也不全面,事实上尤其像Rock里那种电吉他的面条音在放慢的情况下更难听出来,(面条收尾音就更不用提了),而LZ你这个方法的局限刚才也提到的,就是不适用于不规则的变速。

至于恒速下,哪怕是一段0.5倍变速段中,如果这个方法用的得当的话,自己显然也可以辨认的,毕竟是自己的作品,大概在什么地方会出现怎么样的“信号”应该有数的,反之,如果是检查别人的问题那么又另当别论了。

关键还是个习惯问题,如果新人看了这篇文,觉得很能接受并且会投入使用的话,这也绝对是件好事呢~

TOP

返回列表