Python生成音樂 之 數(shù)組生成midi文件

上一章中講到如何利用mido讀取midi文件,并把midi文件中的音符,也就是一首曲子的音符轉(zhuǎn)換成二維數(shù)組.

這一部分還是有些bug,以后會逐漸完善....
今天我們開啟新的一章,
就是通過二維數(shù)組,轉(zhuǎn)換成midi文件.

這是一個比較大的課題.我想分成幾步講,希望有人能夠耐心的看望我這雜亂的代碼.

第一步:
如何生成midi文件,先從簡單的開始:
怎樣生成只有一個音符的曲子.如果會了,
就可以通過循環(huán),把一個一維的數(shù)組,生成含有多個音符的曲子.
就要我們深究一下midi這個庫了.
官網(wǎng)給了一個例子:https://mido.readthedocs.io/en/latest/midi_files.html#creating-a-new-file
上面代碼:
1.? mid = MidiFile()?
? ? 代表創(chuàng)建一個對象,對象的名字叫做mid(這個名字是我們自己寫的),這里是類的思想.
2.track = MidiTrack()
? ? 創(chuàng)建一個音軌,track.通常一個音軌是用來存入一個樂器的.
? ? 如果有多個樂器,可以建立多個音軌,加入到mid中. 這里就簡單點,創(chuàng)建一個音軌.
3.mid.tracks.append(track)
? ? 把音軌track加入到mid中.這里就好像mid是一本書,track是書的一頁. 上面這幾步都是常規(guī)的套路.一般都是需要這樣寫的.
4.track.append(Message('program_change', program=12, time=0))
? ? 代表向音軌track中加入一些屬性,包括節(jié)拍,速度,調(diào)式等等,具體用法和參數(shù),可以查找Message函數(shù)的用法.
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構(gòu)成,代表了一個動作,就是彈奏鋼琴的一個按鍵.然后就是代表了一個音符的產(chǎn)生.
6.mid.save('new_song.mid')
? ? 這里save()函數(shù)就是生成了一個曲子,名字叫做"new_song.mid"
效果類似:


第二步:
但是,如果某一時刻,有多個按鍵同時按下,就需要通過循環(huán),讓一個序列都加入到midi文件.
這個序列包含了某一時刻同時按下的幾個按鍵.?

就是這樣的效果:


第三步:
如果想要生成一首曲子,就是達(dá)到下面效果:

就需要在外面再套入一層循環(huán):


第四步:
主函數(shù)的調(diào)用.

比如array_note
=[[1,2,3],[4,5,6],[7,8,9]]
array2
=[40,50,70]
傳入進(jìn)去,然后就可以生成midi文件了.

第五步:
當(dāng)然可以用上一章的程序讀取midi文件,
然后把得到的數(shù)組,傳進(jìn)去,就會生成曲子...
不過曲子的速度要調(diào)整一下,否則可能會太快...

一邊寫,一邊改,可能會有很多問題.我會持續(xù)更新它的...
目前程序就不上傳了,如果哪天整理好了,在上傳到github吧...
有需要可以向我要哈...我努力完善吧...