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

上一章中讲到如何利用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吧...
有需要可以向我要哈...我努力完善吧...