python生成midi之算法部分1
生成midi的算法應(yīng)該有很多,
不過,目前我想到的一個算法是根據(jù)相似度.

原理大概如下:把相似的程度看做距離.
地圖上,如果你想描述一個地點.就必須要找參照.
如果想要去超市,
那你可以說,最近的超市在小區(qū)的南門的對面,它的旁邊有一棵樹.
上面的這種說法就是相對的,目的地是超市.
描述他,用到了小區(qū)和樹這兩個參照.當然,如果想要更加準確的位置,你可以說出更多的參照物.
也可以說出距離,比如超市距離小區(qū)4m,距離樹3m.
那么同理,(我們把距離看做相似度)
音樂也一樣,只要我們先找好一個自己喜歡的音樂片段(這里就是樹和小區(qū)).
然后隨機生成一些音符,如果這些音符和你喜歡的曲子很相似,那么生成的就是好音樂了.
相反如果你生成的音符和噪聲很相似,那么就不是好的音樂了.
這樣需要找很多你喜歡的曲子,然后慢慢訓練.

還有另一種,就是音樂自身是有規(guī)律的,比如一個建筑.
故宮的每個房間雖然都有所不同,但是它們是相似的,整體和部分之間是很融洽的,也就是各個部分之間相似度很高.
我們可以找一首曲子,然后把它按照合理的節(jié)奏進行拆分(這是一個難點)
拆分成多個部分,求取各個部分之間的相似度.
然后,自己生成一首曲子,如果自己生成的曲子,各個部分相似度也和目標一致,
那么,就初步認為這個是一首好的曲子.

當然,上面的兩種算法都是基于概率的,即便是滿足了上面的兩條,也未必是一首好的曲子.
不過它至少滿足了一些初級的條件.

下面開始實現(xiàn)上面的思想,用Python編寫代碼:
首先把midi文件的根音符找出來排成一個1維的序列.作圖,下面就是這個曲子的震動波形了,大體可以看出一點趨勢.然后根據(jù)這個趨勢,選取分段的間隔(我這里簡化了,如果嚴格來說實際上可以設(shè)成一個變量).我這里選擇的是23,每隔23個音符,就分成一段.

然后把序列進行分割,(按照節(jié)奏合理的分割)
之后求取各個部分之間的相似度:
根據(jù)上面每23個音符分成一段,然后求取各段與第一段的相似程度.
這里我就簡化了,只是求取第一部分與其他幾部分的相似程度,并作圖.
從下面圖中也可以看到一定的趨勢(建議大家用超級簡單的曲子,這樣容易找到規(guī)律)

根據(jù)上面兩幅圖,大體找到了趨勢,
然后隨機生成一些序列,讓這個序列滿足上面的要求,基本符合上面的趨勢.
(當然,還可以找更多的曲子做參照,找到其他更多的特性)

目前,打算用Python字典去做,
先生成多個包含23個數(shù)字的序列,然后求取相似度.
使各個相似度滿足圖2中的趨勢.