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

Python生成音乐 之 数组生成midi文件

2021-01-25 21:03 作者:GXTon_阿通  | 我要投稿


上一章中讲到如何利用mido读取midi文件,并把midi文件中的音符,也就是一首曲子的音符转换成二维数组.

这一部分还是有些bug,以后会逐渐完善....

今天我们开启新的一章,

就是通过二维数组,转换成midi文件.

这是一个比较大的课题.我想分成几步讲,希望有人能够耐心的看望我这杂乱的代码.

第一步:

如何生成midi文件,先从简单的开始:

怎样生成只有一个音符的曲子.如果会了,

就可以通过循环,把一个一维的数组,生成含有多个音符的曲子.

就要我们深究一下midi这个库了.

官网给了一个例子:https://mido.readthedocs.io/en/latest/midi_files.html#creating-a-new-file

上面代码:

1.  mid = MidiFile() 

    代表创建一个对象,对象的名字叫做mid(这个名字是我们自己写的),这里是类的思想.

2.track = MidiTrack()

    创建一个音轨,track.通常一个音轨是用来存入一个乐器的.

    如果有多个乐器,可以建立多个音轨,加入到mid中. 这里就简单点,创建一个音轨.

3.mid.tracks.append(track)

    把音轨track加入到mid中.这里就好像mid是一本书,track是书的一页. 上面这几步都是常规的套路.一般都是需要这样写的.

4.track.append(Message('program_change', program=12, time=0))

    代表向音轨track中加入一些属性,包括节拍,速度,调式等等,具体用法和参数,可以查找Message函数的用法.

5.track.append(Message('note_on', note=64, velocity=64, time=32))

    track.append(Message('note_off', note=64, velocity=127, time=32))

    这两行实际上是一对儿,有on和off构成,代表了一个动作,就是弹奏钢琴的一个按键.然后就是代表了一个音符的产生.

6.mid.save('new_song.mid')

    这里save()函数就是生成了一个曲子,名字叫做"new_song.mid"

效果类似:

第二步:

但是,如果某一时刻,有多个按键同时按下,就需要通过循环,让一个序列都加入到midi文件.

这个序列包含了某一时刻同时按下的几个按键. 

就是这样的效果:

第三步:

如果想要生成一首曲子,就是达到下面效果:

就需要在外面再套入一层循环:

第四步:

主函数的调用.

比如array_note

=[[1,2,3],[4,5,6],[7,8,9]]

array2

=[40,50,70]

传入进去,然后就可以生成midi文件了.

第五步:

当然可以用上一章的程序读取midi文件,

然后把得到的数组,传进去,就会生成曲子...

不过曲子的速度要调整一下,否则可能会太快...


一边写,一边改,可能会有很多问题.我会持续更新它的...

目前程序就不上传了,如果哪天整理好了,在上传到github吧...

有需要可以向我要哈...我努力完善吧...

Python生成音乐 之 数组生成midi文件的评论 (共 条)

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