Python生成音樂 之 mido庫讀取midi文件
midi文件記錄的是一系列的彈奏動作.
比如一首鋼琴曲的midi文件:里面就是記錄了彈奏鋼琴曲的按鍵按下和松開等操作,并且記錄了按鍵按下的時長,聲音大小,樂器種類等參數(shù).
midi文件的后綴是mid:

然后midi音樂文件可以用下面的軟件打開,這個軟件是一個免費的軟件:

打開之后的效果:

也可以用下面軟件打開:(這個軟件也是免費的,可以查看曲子的五線譜或者簡譜之類的)

下載midi文件可以用這個網(wǎng)站:(這個網(wǎng)站定期會發(fā)積分,可以下載一些midi文件,也算免費吧)
如果你想用程序去編寫midi文件,最好下載一些簡單的文件,最好是單一的鋼琴曲...


上面是準備條件,下面開始說一下Python3的程序問題:
有點亂,我粘貼一張圖片吧:

其中有一個:enumerate的函數(shù),
它的作用呢就是給一個序列中每個元素都進行編號,可以參考下圖:

運行上面的程序,就會輸出midi文件中每個音軌中包含了什么,也就是輸出音軌中包含的彈奏動作. 運行結(jié)果:

我們找到圖中: 倒數(shù)第四行.(這里實際上是音樂的開始,從倒數(shù)第四行看才有些價值)
從程序中運行的圖片,可以看出,都是一條一條的信息,
每條信息都代表了對鋼琴按鍵的一次操作.
比如:note_on channel=0 note=64 velocity=40 time=0
分別代表了: 按下,0號樂器,音階是64,音量是40,開始時間是0
(這里的時間是相對的,是相對于上一個動作,而不是相對于第一個音符的動作.)

下面是同一首曲子? 程序運行結(jié)果,及,軟件打開后的結(jié)果 進行比對:

可以找到一些規(guī)律:
1,每一個音都有對應的note_on和note_off組合.
2.time時間不是絕對的,是相對的.(是本次動作相對于上一次的動作)
3.如果要同時按下兩個琴鍵,就需要連續(xù)寫兩個note_on,然后連續(xù)寫兩個note_off.