python生成midi之算法部分1
生成midi的算法应该有很多,
不过,目前我想到的一个算法是根据相似度.

原理大概如下:把相似的程度看做距离.
地图上,如果你想描述一个地点.就必须要找参照.
如果想要去超市,
那你可以说,最近的超市在小区的南门的对面,它的旁边有一棵树.
上面的这种说法就是相对的,目的地是超市.
描述他,用到了小区和树这两个参照.当然,如果想要更加准确的位置,你可以说出更多的参照物.
也可以说出距离,比如超市距离小区4m,距离树3m.
那么同理,(我们把距离看做相似度)
音乐也一样,只要我们先找好一个自己喜欢的音乐片段(这里就是树和小区).
然后随机生成一些音符,如果这些音符和你喜欢的曲子很相似,那么生成的就是好音乐了.
相反如果你生成的音符和噪声很相似,那么就不是好的音乐了.
这样需要找很多你喜欢的曲子,然后慢慢训练.

还有另一种,就是音乐自身是有规律的,比如一个建筑.
故宫的每个房间虽然都有所不同,但是它们是相似的,整体和部分之间是很融洽的,也就是各个部分之间相似度很高.
我们可以找一首曲子,然后把它按照合理的节奏进行拆分(这是一个难点)
拆分成多个部分,求取各个部分之间的相似度.
然后,自己生成一首曲子,如果自己生成的曲子,各个部分相似度也和目标一致,
那么,就初步认为这个是一首好的曲子.

当然,上面的两种算法都是基于概率的,即便是满足了上面的两条,也未必是一首好的曲子.
不过它至少满足了一些初级的条件.

下面开始实现上面的思想,用Python编写代码:
首先把midi文件的根音符找出来排成一个1维的序列.作图,下面就是这个曲子的震动波形了,大体可以看出一点趋势.然后根据这个趋势,选取分段的间隔(我这里简化了,如果严格来说实际上可以设成一个变量).我这里选择的是23,每隔23个音符,就分成一段.

然后把序列进行分割,(按照节奏合理的分割)
之后求取各个部分之间的相似度:
根据上面每23个音符分成一段,然后求取各段与第一段的相似程度.
这里我就简化了,只是求取第一部分与其他几部分的相似程度,并作图.
从下面图中也可以看到一定的趋势(建议大家用超级简单的曲子,这样容易找到规律)

根据上面两幅图,大体找到了趋势,
然后随机生成一些序列,让这个序列满足上面的要求,基本符合上面的趋势.
(当然,还可以找更多的曲子做参照,找到其他更多的特性)

目前,打算用Python字典去做,
先生成多个包含23个数字的序列,然后求取相似度.
使各个相似度满足图2中的趋势.