【前言】
之前写的博文《我用Cocos2d-x模拟〈Love Live!学院偶像祭〉的Live场景》中提到了一个谱面制作工具,有读者反映说希望讲一下这玩意怎么做的。编辑器也不是啥机密资料,本来想着把从头到尾的制作过程写出来,然而最后发现事情太多懒癌晚期放弃治疗。
那篇博文中做出的项目是《Easy Live!》的Demo。《Easy Live!》是我设计的一个在WP上运行的,可以选择谱面玩并且没有LP限制的简化版《Love Live!学院偶像祭》,简单地说就是一个LL的练习器,虽然到现在还没做完然后我跳U3D坑然后没有然后了(死
而EL是在编辑器开发完成之后才开工的。写编辑器的时候做得有点随意,里面的代码没有经过组织,比较乱,就不开源雾岛大家思维了。
于是这篇文章就主要讲一下编辑器里面核心部分的原理,这个逻辑也适用于其他节奏类的游戏。
注意这篇博文不会涉及代码部分。
【目标】
编辑器的功能,就是新建或打开谱面,添加、删除物件,给物件设置它们出现的时间,然后导出成游戏需要的格式。而设置物件出现的时间,就是编辑器的核心功能了。
以我做的这个编辑器为例。物件的时间取决于它放在哪一根横线上(其实据我所知大部分其他节奏游戏的编辑器,基本都是把物件放在线上,或线对应的时间上),我们的目标就是要求出横线的时间。
怎么求?请继续看,接下来要引入一些专业词汇。
【BPM与分拍】
我们知道,抛开课金啊练习啊剧情啊这些,LL的核心部分是一个音乐游戏。如果进行游戏的时候,手稳一点,会感觉到每个物件响起的时间和歌曲特别合得上拍子,这种感觉在Easy和Normal难度中更为明显。如果我们人为地打快点或者点慢点,也就是说让物件响起的时间稍微快点或者慢点,听着就特别别扭。
那么说明了一个问题:让物件听起来合拍的时间,和歌曲本身是有关的。换言之,就是横线的时间应当和歌曲本身有关。
和歌曲的什么相关呢?别急。我们来听小一段音乐。注意音乐开始播放后,请试着跟着音乐击掌:
百度网盘(《辉夜の城で踊りたい》的开头片段)
如果你的乐感不太差的话,你会发现自己击掌的频率是一定的。如果发现自己找不着调,就反复尝试几次。
如果还是不行,也没关系,再来听加入了滴答声的版本:
乐感不太差的话,你拍手的频率和滴答的声音应该是一致的。
音乐学上把这个滴答的频率,定义为节奏的每分钟拍子数。它表示在这个节奏下,每分钟的滴答数。这个数值通常记作BPM(Beat Per Minute)。
而两个相邻滴答声的间隙时间,称为一个拍子的时间。
假设我们把一个拍子的时间折半,会怎样呢?显然,滴答声的频率会提高一倍。此时两个相邻滴答声的间隙时间是一个拍子的时间的1 / 2,叫做二分拍。
依次类推,还有三分拍(通常适用于BPM可以被三整除的音乐),四分拍,六分拍(通常适用于BPM可以被六整除的音乐),八分拍,等。
可以肯定一点的是,只要物件的音效在这些分拍的时刻响起,人听起来就会觉得谐调。
事实上,编曲者在编曲的时候,音符也是放在分拍上的;谱面制作者在创作的时候,物件也是放在分拍上的。
那么现在可以回答前面的问题了:让物件听起来合拍的时间,和歌曲的BPM有关。
为什么人耳听着处于分拍上的声音就会觉得谐调呢?抱歉这个我真答不上了,也许和大脑的结构有关?有兴趣的读者可以自己查阅一下资料。
【小节与每小节拍子数】
首先说一下什么是小节。百科上的解释是“音乐进行中,其强拍、弱拍总是有规律地循环出现,从一个强拍到下一个强拍之间的部分即称一小节”。
光看文字还是有点迷糊。让我们再播放一下带有滴答音的那个音频。
可以听出,滴答的声音是以“滴 答 答 答”为一组,反复地重复的。每个“滴 答 答 答”所经过的时间,就是一个小节。
如果听去掉滴答声的版本,可以感受到音乐本身敲击声在“滴”音时和“答”时不一样,在“滴”音时要重一些。这就是上文说的“重音”。
那么什么又是每小节拍子数呢?还记得小学音乐课上讲过的“四四拍”、“四三拍”吗?
四四拍表示,以四分音符为一拍,每小节有四拍子;四三拍表示以四分音符为一拍,每小节三拍。
而作为范例的这个音乐,是一个四四拍的音乐,就是说以一个滴答为一拍,每小节有四个滴答音,每一个滴答音就是一个四分音符。
需要注意的是,这里的四分音符和上文的四分拍不是同一个玩意。x分拍的长度是1 / x个拍子的长度,而x分音符的长度是x分之一个全音符的长度。
一句话讲就是:一个拍子和一个x分音符相对应,y个x分音符构成一个小节,
以这样的小节组成的节奏是一个xy拍的节奏,乐谱上记作y / x。
通常来说,绝大多数流行乐采用4 / 4拍,圆舞曲采用3 / 4拍(嘭 嚓 擦),少数音乐使用其他拍。
上面的编辑器的截图,白色的线就是一分拍线,白色双杠是重音,红色的是二分拍线。
【总结】
大致整理一下可以知道,一个音乐有至少一个节奏,每个节奏包含BPM、起始时间和每小节拍子数。
上面扯了一堆音乐学相关的知识。说这些有什么意义呢?意义在于:它可以将一段音乐的节奏用数学的形式表现出来。
举个例子:如果我们已知一段3 / 4拍音乐的BPM为120,那么可以知道一个拍子的时长为60000 / 120 = 500毫秒,一个小节的长度为 500 × 3 = 1500毫秒。
由于所有的音符(物件)都必然出现在分拍上,那么只要知道这段节奏相对于音乐开始的时间,和物件所在的拍子索引,就能推算出物件所在的时间。
再举个例子:同样是这段音乐,已知节奏是从歌曲开始播放233毫秒后开始的,求第五小节第一拍后第一个四分音符相对于歌曲开始播放的时间:
233 + ( ( 5 - 1 ) × 1500 ) + 500 + ( 1 × ( 500 / 4 ) ) = 6858 ms
用数学的形式表达出来之后,任何处于分拍上的音符都能够用这种形式来表达和计算时间。
反之,也可以根据播放时间推算出其对应的小节和拍子。
后面的程序实现就比较方便了。在拖放物件的时候可以知道距离物件坐标最近的横线是哪一根,进而就能知道横线的时间。
然后我得消失一段时间了,预备弄个大新闻。没错,我准备和朋友创业去,做人没有梦想,跟咸鱼有什么区别?不能丢人现眼!