用Ruby写了一个自动连接循环音频片段的脚本

从3月开始我接了一个给游戏作曲的项目。大家知道游戏的BGM一般是循环播放的,因此作曲时也要考虑到这一特性,最后输出的音频素材(wav文件)应该切成两个Part,其中Part-A是一个引子(不进入循环的部分),Part-B是主循环体,A到B、B到B应该都可以无缝衔接,在游戏中播放出来应该是“A-B-B-B-B-...”这样无限循环下去。

为什么要说这个呢?因为除了给游戏输出素材之外,我还需要输出一份原声碟用的音轨,按照游戏原声碟的惯例,一首曲子一般是输出“A-B-B”(即循环两次),最后的部分再做一个淡出(fade out)效果。在有很多首曲子的情况下,一首一首到DAW里面去输出太麻烦了,既然我已经输出好了A、B素材,那么如果我写一个脚本,自动按照“A-B-B-淡出”的形式合并起来不就好了吗?

于是我想到用Ruby来完成这个工作。首先,找一个可以处理wav文件的gem:wav-file;接下来我们来想想如何实现两个操作:连接和淡出。连接很简单,只要将两个wav文件的数据块连起来就可以了;淡出也不难,wav文件中每个采样的值代表该采样的振幅(-32767~32767,以16位采样为例),将每个采样的值按一定比例缩小,最后缩小到0,就实现淡出了。 继续阅读