欢迎光临散文网 会员登陆 & 注册

【BanGDream】用绿条画波形图

2023-08-17 14:26 作者:小鸟钢丝  | 我要投稿

前段时间我发布了一个整活谱子:【邦邦自制谱】《为什么要演奏?》毫秒级采音,评论区里有人想要生成谱面的py文件,于是我来整体介绍一下写法。

首先我们要做的是音频处理,推荐使用ffmpeg命令、audition软件等进行处理。我们的目标是将音频文件转换为wav格式,安装ffmpeg之后可以用ffmpeg的这个命令完成从mp3格式到wav格式的转换:

音频截取也可以用ffmpeg完成:

当然,音频重采样、再编码都可以利用ffmpeg完成,具体方法可自行百度。

另外,要注意选取音频的时候留好一定量的余量,比如前后各插入一段静音以防开始时直接绿条怼脸,使用audition、goldwave等音频处理软件可以很方便地插入静音。

如果是要对歌曲中的念白、kick等进行采样,建议先分离人声、伴奏、鼓点等,保留对应的wav文件,记下要转换段落的起止时间。

下一步需要依赖的库(相信大家都会安装python了吧)。我们需要numpy和wave两个库文件,可用pip进行安装。

安装完毕后就可以开始愉快写码了,为了方便,我们把wav文件和py文件放在同一个文件夹中。首先import上述两个库:

然后开文件,读入你准备好的wav文件:

这里我们可以先运行一遍py文件来获得参数,比如我这里的soyo.wav有46秒,其中前两秒和最后两秒是我添加的静音。print出来的音频参数如下:

这表明该音频是单声道的、采样字节数为2字节(16位)、采样频率16000Hz,总共有737792个采样点。

接下来,由于bestdori谱面的时间是用beat(节拍数)来表示的,我们需要将时间点转换为beat:

BPM(beat per minute,每分钟拍数)代表音乐每分钟有多少拍,简单理解BPM越高则音乐越快。这一步我们需要知道乐曲的bpm,可以使用BpmAnalyzer这个软件很方便地测得乐曲的BPM。这里因为我用的并不是一段音乐而是音频,所以测出来的bpm也只是为了时间同步而已。为了方便,我们再求出每秒钟的拍数bps,于是此时将时间点序列(以秒为单位)各乘以bps则得到beat序列。

之后,我们定义一下开始和结束的时间坐标、beat坐标、采样点坐标:

接下来就可以开始生成谱面文件啦。

不过在此之前先简单介绍一下bestdori制谱的基本语法。

bestdori谱面最外层用中括号[ ]括起来,每一个对象(如BPM对象、note、绿条等)都用大括号{ }括起来,对象之间用半角逗号(,)隔开。我们先来了解一下各种对象:

各种对象

首先是BPM,每个谱面都至少要有一个BPM对象,在它后面的谱面都为这一BPM。表现为一条紫红色的标有BPM数值的实线。新建谱面会带有一个默认位于beat 0处的bpm为120的BPM对象,如下:

我们可以通过修改"bpm"参数的值来改变bpm。谱面上横实线即为节拍线,一条代表一拍。bpm越高,节拍线越密。虚线是1/n节拍线(默认是1/4,可改),在不动代码的情况下,note只能放在这些线上。

其次是note:如上图,在1/4拍有两个单键、1/2拍上有一个单键和一个滑键。

可以看到,一个单键("type":"Single")有两个必填参数:"lane"表示轨道数,邦邦有7个轨道,编号从左到右为从0到6,在不改代码的情况下只能为整数,但是我们可以通过修改代码来将note放在非整数轨道上(虽然这样做会导致无法上传谱面);"beat"表示节拍数,其实是note在铺面上的位置。此外,"skill"属性设置为true会变成黄色的技能键,"flick"属性设置为true会变成粉色滑键。注意:谱面代码各对象之间是无序的(实际上应该是按照你放置对象的顺序),也就是说调整上述几句代码的顺序并不会改变谱面。

对于横滑键,"type"为"Directional",除了"lane","beat"两个参数之外,还有"direction"控制方向(左右)、"width"控制横滑键宽度(1~3,修改代码可以>=3)。

接下来是比较重要的绿条("type":"Slide")。

后面的参数"connections"接受一个对象列表(以中括号[ ]括起),里面是绿条的各节点。各节点都有"beat"和"lane"两个参数,用大括号{ }括起。各节点都可以添加"hidden"参数,若设置为true,则该节点隐藏,表现为上图中右边绿条拐弯处没有节点的情况。这里要注意的是:1)头判节点和尾判节点不会被隐藏(即使"hidden"设为true也不会被隐藏),且要放在整数轨上。2)中间节点可以放在非整数轨上,但是必须隐藏,否则无法上传。3)节点不可以超界("lane"<0或>6),否则无法上传。

有了上述谱面代码知识,我们就可以开始生成谱面了。

我们用with open() as ... 来创建一个txt文件(这里是'soyo_chart.txt'),'w'表示覆写模式,若'soyo_chart.txt'存在则每次都会覆盖该txt文件中的内容;若不存在则新建一个名称为'soyo_chart.txt'的文件。用with open() as ... 的方式打开文件可以避免写close,程序段结束后会自动关闭文件。

注意中间的降采样步长可以自行设定,step越小,则保留的采样越多,波形就越精细。由于这里我原有的wav文件46秒含有737792个采样,去掉32000*4个静音采样之后还有609792个采样,这样生成出来的代码如果粘贴到bestdori的话会直接卡死,只能清除网站缓存,别问我怎么知道的(*警告:在粘贴前如果已经有铺面代码,请保存好备份,以防卡死恢复后丢失)。所以我们降采样,每50个采样取一个,这样大约只保留了一万多个节点,亲测一万个节点不会彻底卡死(但会卡一会儿)。

由于我们的波形生成的绿条大部分集中在2至4轨,为了使铺面更有表现力,我们可以适当将w放大3倍以上,即chart=w*4+3等,但这样要注意可能会有超界的节点,要注意削波处理。(如果已知头尾节点不会超界也可不做头尾的削波处理)

运行以上py文件,恭喜你,你就得到了用绿条画出来的波形图谱面了。把谱面代码粘贴到bestdori中,就可以看到波形图啦!快来试试吧!

-END-


【BanGDream】用绿条画波形图的评论 (共 条)

分享到微博请遵守国家法律