程序音乐生成技术
一段时间以来,我一直在对程序性内容生成进行大量的思考,而我从来没有看到过程式音乐的很多实验。 我们有很棒的技术来生成模型,animation,纹理,但是音乐仍然是完全静态的,或者是简单的分层循环(比如孢子)。
因此,我一直在想最佳的音乐生成技术,而且我很好奇别人的想法。 即使你以前没有考虑过,你觉得怎么样? 每个答案的一种技术,请尽可能包括例子。 这种技术可以使用现有的数据,或者从头开始生成音乐,可能是某种input(情绪,速度等等)。
元胞自动机 – 阅读 。
你也可以在这里试试。
编辑:
rakkarage已经提供了另一个资源: http : //www.ibm.com/developerworks/java/library/j-camusic/
最成功的系统可能会结合几种技术。 我怀疑你会发现一种适用于所有types的音乐中的旋律,和声,节奏和低音序列生成的技术。
马尔可夫链 ,例如,非常适合旋律和谐波序列的产生。 这种方法需要分析现有的歌曲来build立链转换概率。 马尔可夫链的真正之美是,国家可以是任何你想要的。
- 对于旋律生成,请尝试键相关的音符编号(例如,如果键是C小调,C将是0,D将是1,D#将是2等等)
- 为了和声的产生,试试和弦的根音相关的音符号,和弦的types(大调,小调,减小,增强等)和和弦(根,第一或第二)的反转的组合,
neural network非常适合时间序列预测 (预测),这意味着它们同样适用于在针对现有stream行旋律/和声进行训练时“预测”音乐序列。 最终结果将类似于马尔可夫链方法。 除了减less内存占用之外,我想不出比马尔可夫链方法有什么好处。
除了音调之外,还需要持续时间来确定生成的音符或和弦的节奏。 您可以select将这些信息合并到马尔可夫链状态或neural network输出中,也可以单独生成它并合并独立的音高和持续时间序列。
遗传algorithm可以用来演化节奏部分。 一个简单的模型可以使用一个二进制染色体 ,其中第一个32位代表基鼓的模式,第二个32位是一个圈套,第三个32位是闭合的,等等。 这种情况下的缺点是需要持续的人类反馈来评估新演变模式的适应性。
专家系统可以用来validation由其他技术产生的序列。 这种validation系统的知识基础可能可以从任何优秀的音乐理论书籍或网站中解脱出来。 尝试利玛窦亚当斯musictheory.net 。
对这些技术有超过50年的研究,往往被不熟悉电脑音乐和algorithm构成的开发者所忽视。 解决这些问题的系统和研究的大量例子可以在这里find:
一个简单而有效的algorithm是使用1 / f噪声(又称“粉红噪声”)从一个音阶中select持续时间和音符。 这听起来像音乐,可以是一个很好的起点。
一个更好的algorithm是使用“马尔可夫链”。扫描一些示例音乐,并build立一个概率表。 在最简单的情况下,C会有20%的可能跟随A.为了使这个更好,看看过去几个音符的顺序,例如“CAB”有15%被B跟随, 4%可能跟随一个Bb,等等。然后,使用先前select的音符的概率来挑选音符。 这个非常简单的algorithm产生了相当好的结果。
音乐生成的马尔可夫链
Dmitri Tymoczko在这里有一些有趣的想法和例子:
http://music.princeton.edu/~dmitri/whatmakesmusicsoundgood.html
我的软件使用应用进化论来“增长”音乐。 这个过程与理查德·道金斯(Richard Dawkins)的“盲人制表师”计划类似 – MusiGenesis随机添加音乐元素,然后用户决定是否保留每个添加的元素。 这个想法就是保持你喜欢的东西,把任何不正确的东西甩掉,你不需要任何音乐训练就可以使用它。
界面吹,但它是老 – 起诉我。
我一直很喜欢使用iMuse系统的老式Lucas游戏,它为游戏制作了一个永无止境的反应式配乐,而且非常有音乐性(因为它大部分还是由composer php创作的)。 你可以在这里find规格(包括专利): http : //en.wikipedia.org/wiki/IMUSE
任天堂似乎是唯一仍然使用类似于iMuse的方法来创造或影响音乐的飞行。
除非你的项目是非常实验性的,否则我不会放弃使用composer php – 一个真正的人类composer php将产生比乐曲更多的音乐和可听的结果。
把它写成一首诗:你可以很容易地生成非常前卫的非诗,但是用一个algorithm复制莎士比亚是很困难的。
你看过SoundHelix(http://www.soundhelix.com)吗?; 这是一个用于algorithm随机音乐创作的开源Java框架,能够产生非常整洁的音乐。 您可以将SoundHelix作为独立应用程序(作为embedded在网页中的小程序)用作基于JNLP的小程序,也可以将其包含到您自己的Java程序中。
使用SoundHelix生成的示例可以在这里find: http : //www.soundhelix.com/audio-examples
对非无聊的程序音乐的研究走回头路。 浏览电脑音乐杂志的新旧问题http://www.mitpressjournals.org/cmj (没有真正的域名?)这有严重的技术文章的实际使用音乐合成锡匠,烙铁骑师,位牧民和学术研究人员。 这是一个蓬松的评论和采访抹布,如几个你可以在各大书店find的杂志。
这么大的话题。 你可以看看我的iPad应用程序,Thicket,或者我的Ripple软件在morganpackard.com。 根据我的经验,大多math习dynamic音乐的方法都会提供听起来很好的学术知识。 我认为在俱乐部/电子世界的边缘可以find更成功的东西。 Monolake是我在这方面的英雄。 非常可听的东西,非常计算机生成。 我自己的音乐也不错。 保罗·兰斯基(Paul Lansky)的“Alphabet Book”就是一个非常可听的algorithm音乐的好例子,特别是考虑到他是一个学术性的人。
我一直在考虑的技术是创build小型音乐模式,高达一个酒吧左右。 用感觉标识符来标记这些模式,比如“兴奋”,“激烈”等等。当您想为某种情况生成音乐时,根据这些标签select一些模式,然后select一个您想要使用的乐器。 在乐器的基础上,弄清楚如何组合这些乐器(例如,在钢琴上,您可以将它们一起演奏,具体取决于手的跨度,在吉他上可以连续快速演奏音符),然后将其渲染到PCM 。 此外,你可以改变键,改变速度,添加效果等。
你所描述的具体技术是托马斯·杜比(Thomas Dolby)十年或十五年前的工作,虽然现在我不记得他叫什么了,所以我不能给你一个好的search术语。
但请参阅这篇维基百科文章和这个 Metafilter页面。
“ algorithm组合 ”一书很好地介绍了所使用的几种方法:
“涵盖的主题有:马尔可夫模型,生成语法,转换networking,混沌和自相似性,遗传algorithm,细胞自动机,neural network和人工智能。
在这个广泛的话题上,这是一个很好的起点,但是从来没有深入地描述每种方法的工作原理。 它提供了一个很好的概述,但是如果你还不了解它们,那将是不够的。
早在90年代末,微软就创build了一个名为“交互式音乐控制”的ActiveX控件,它确实符合你的要求。 不幸的是,他们似乎已经放弃了这个项目。
并不完全一样,但是我知道有人会自动生成一个名为“ 基于内容的音乐相似性”的 DJ集。
如果你对音乐如何挂在一起有更深入的理论, Bill Sethares网站有一些有趣的转折。
我一直在研究这个项目的build议 -来自哥本哈根大学“CS编程语言理论与实践”研究小组的“8.1 ” – CS:
8.1音乐资料库的自动收集和统计分析
对乐谱的传统分析包括一个或多个人分析单个乐曲的节奏,和弦序列和其他特征,在同一时期由相同composer php或其他composer php经常模糊地比较其他乐曲的情况下设置。
传统的音乐自动分析几乎没有处理乐谱,但是专注于信号分析和使用机器学习技术来提取和分类,如情绪或stream派。 相比之下,DIKU的初步研究旨在自动化乐谱分析的部分内容。 附加价值是从大量乐谱中提取信息的潜力,这些乐谱不易用手工完成,并且不能通过机器学习技术进行有意义的分析。
这个 – 正如我所看到的 – 是你的问题的相反方向,我所想的数据生成的数据可以在程序生成音乐的某些情况下使用。
我的观点是,生成音乐只有经过严格的select过程才能奏效。 algorithm音乐先驱大卫·科普(David Cope)将从他的algorithm(我认为主要是基于马尔科夫链的algorithm)中抽出数小时的音乐输出来挑出那些实际结果不错的人。
我认为这个select过程可以通过对特定音乐风格的特征进行build模来实现自动化。 例如,一种“迪斯科”风格将奖励大量的低音谱线,其特征在于背景上具有带有圈套的背景和鼓部分,但是为重度不协调的和声减去分数。
事实上,音乐创作过程充满了许多惯用的习惯,如果没有这方面的专门知识,就很难模仿。
我一直在为程序音乐开发一个Python模块。 我只是编制了我所知道的有关音符,音阶和和弦结构的知识,然后就能够从这些约束中随机生成内容。 我相信有更多的理论和模式可以教授这样的系统,尤其是那些更好地理解这个问题的人。 然后,您可以使用这些系统作为遗传algorithm或随机内容生成的约束条件。
你可以在这里继续我的实现,特别是随机生成的主要例子可能对你有用。 对和弦进程有深刻理解的人可以用这样的技术创build一个歌曲结构,并在其上实现受约束的随机旋律。 我对音乐理论的理解并没有那么深入。
但基本上,您需要对要生成的音乐types的理论进行编码,然后将其用作某种algorithm的约束,以便在程序上探索该理论的范围。