从图论的角度来分析简单音乐的结构的构想

Standard

一段简单音乐(没有和弦,乐器相同)可以用一段时间序列上的点表示——每个点代表了一次发声,在这个点记录了在某个时间发出了怎样波形的音乐(音高,也就是频率Pitch、声音的大小,也就是响度Volumn、音符长度Duration,也就是这次发声持续的时间)。(我们用M=STime×Pitch×Volume×Duration来表示,注意这些都是集合,STime是音符开始的时间)

表示这类信息的类型)

我们喜欢听的音乐往往是极有规律又变化多端的——主要的几个旋律会穿插在整个乐曲当中,有些变化但变化不大(比如只改变了最后的几个音),也就是说有主要的几段旋律,将它们重复、排列、微调就可以产生动听的曲子。

有没有种准确的方式去表示音乐的这种相关性结构呢?如果我们可以把音乐的结构、旋律的关系表示出来,那么根据现有的人类喜爱的音乐的这些结构,就可以制造出不同的动听的音乐,在此基础上再加入和弦的元素、配上不同的乐器,就可以产生完整的音乐了!

一些音乐片段有着极强的相关性——也就是它们是在同一个旋律的基础上修改得到的;而一些片段极其不同——也许它们根本就没什么联系!找到一个合理的相关性函数\(f:Ms\times Ms\rightarrow R\)(\(Ms\)是M集合元素组成的序列,也就是音符串)去描述两个片段的相关性会很有用。

将完整的音乐分成几个连续的段,每个段仍然可以继续分成段,每个层之间的每个段都有关系,当然前提是这些段都在一个更大的段里(也就是不同大段的小段之间不判断相似性),关系紧密程度视相似度而定。如下图:(最里面的数字代表具体的音高,比如1是Do等等(其他参数例如音量、时长等等没有写出),黄色段之间每两个元素都有线,只不过没画出来(工作量太大了Orz…),连线越粗表示越相似)

一段简化过的音乐的结构

一段简化过的音乐的结构

因为大段中的1和3有很多相似的地方——同样有1、3、2,2、5、3等等,所以相似度很高,而1和2大段无论是从音符数量还是小段结构都不大相同,所以相似度不高。

有了这种音乐结构的模型,我们就可以尝试生成简单的音乐了!首先,给定整首曲子的基调(用一些信息去描述它),然后生成每个大段的基调,如此层层递进,直到最底层将具体的音符生成出来,便完工了!
这种结构使得我们可以很方便的去指定段与段之间的联系,以及曲子“感情”的变化(比如从激昂快活的风格转变为抒情的风格)

当然具体将算法实现要比本文所说的复杂得多,这也是将是我最近一直会处理的事情!