Python生成音樂(lè) 之 讀取midi轉(zhuǎn)換為數(shù)組
這一章,我們進(jìn)行到了下圖中這一關(guān)卡.

上一節(jié)我已經(jīng)實(shí)現(xiàn)了通過(guò)mido的庫(kù)讀取midi文件.
并且打印出來(lái)運(yùn)行結(jié)果.

我們可以看到每個(gè)音符,對(duì)應(yīng)與音軌(track)中的信息.
但是這樣的一條一條不成系統(tǒng)的結(jié)果并不是很好用程序進(jìn)行處理.
要想對(duì)midi文件進(jìn)行處理,就需要建模.
音樂(lè)是一系列的音符,而且每個(gè)音符都有他自己的屬性: 時(shí)間長(zhǎng)短,音量高低,音調(diào)高低...

目前我們先不考慮很復(fù)雜的問(wèn)題,也不考慮太復(fù)雜的數(shù)據(jù)結(jié)構(gòu),就只用程序中的序列表示一首曲子.一首曲子里我們先只考慮音符部分,其他的音量,時(shí)長(zhǎng),先不做考慮.
那么,我們重新看一下midi文件,就是一系列的音符組成,
我們把midi文件的每個(gè)音符轉(zhuǎn)換成Python序列中的一個(gè)數(shù)字.這樣音符和數(shù)字就被對(duì)應(yīng)起來(lái)了.
最終達(dá)到的效果就是,一首midi對(duì)應(yīng)一個(gè)Python中的序列.
還有個(gè)問(wèn)題:

上面圖中我們可以看到,
第一個(gè)時(shí)間段:有一個(gè)音符;
第二個(gè)時(shí)間段:有一個(gè)音符;
第三個(gè)時(shí)間段:有一個(gè)音符;
第四個(gè)時(shí)間段:有兩個(gè)音符,(這里就不同于以前了);而且有時(shí)候會(huì)出現(xiàn)更多的音符出現(xiàn)的情況;
這個(gè)時(shí)候用一維的數(shù)組就不好表示了,所以改成用二維的數(shù)組:

這里只是第一步,把midi文件中的音符摘出來(lái),變成Python中的二維數(shù)組;
以后還有很多的路要走呀...

以后的事以后再說(shuō),
目前講一下如何把midi文件中的音符,變成Python中對(duì)應(yīng)的二維數(shù)組(也可以叫做二維序列)
先粘貼一下代碼:
最后生成的note_list_ex_sort就是最后的音符的二維數(shù)組.
實(shí)現(xiàn)的方式是:
一條一條查看mido庫(kù)讀取出來(lái)的動(dòng)作.
遇到note_on就說(shuō)明按鍵按下,遇到note_off就說(shuō)明有鋼琴鍵松開(kāi).
當(dāng)然還要考慮上一次是note_on還是note_off,這樣就有4中組合方式.
這里還是有些不太完整,但是基本可以用了,日后再去修改...