程序员拒绝单曲循环:曲子只有5分钟,也得不重样播放450多天

2019 年 3 月 31 日 量子位
乾明 发自 凹非寺 
量子位 报道 | 公众号 QbitAI

程序员要是喜欢上一个东西,指不定会搞出什么“疯狂”事情来。

今天要说的,是特别喜欢一首曲子的程序员贝特(Alex Bainter)。

这首曲子,名为aisatsana,来自电子乐大师Aphex Twin,只有5分多钟。

让他很苦恼的是,单曲循环听着容易腻歪,他想让这个曲子能一直不重样地播放下去。

然后,他选择了马尔可夫链……

现在这首曲子已经能够不间断播放451天不重样……(听歌地址在文末)

贝特把完成这一“壮举”的过程写成了文章,分享了出来,而且,代码已经开源

在Hacker News很快就获得了400多热度,200多条评论。

不少人评论称,这样听歌真的很爽, 实现起来很简单,但效果很好!

它到底是怎么做的呢?我们一起来看看。

从算法的角度理解一首曲子

想要曲子不重样地播放下去,首要的任务就是要理解曲子的结构。

一般情况下,播放曲子的速度可以BPM(beats per minute)来衡量。

aisatsana这首曲子很简单,共有102BPM。如果从第一个音符开始计数的,每16个节拍包含一系列音符,他称之为乐句(phrase),整首曲子中,一共有32个乐句。

想要创建一个能够不间断、不重复播放aisatsana的系统,算法需要满足以下两个要求:

  • 知道一个乐句什么时候结束。

  • 播放不重样的乐句。

第一个要求,相对来说非常简单,只是计时。第二个要求,是最棘手的部分。

让曲子一直播放下去

一种简单的策略是,编写一个程序,粗暴地把32个乐句拆分开,一个乐句之后,随机播放另一个。

这种方式,虽然相互衔接上没有问题,听起来也比单曲循环更加灵活有趣,但本质上也是重复的。

只要熟悉了这32个乐句,曲子依旧会无聊。

怎么办?答案只有一个:

创造一个系统,来生成听起很与原来乐句很相似的新乐句。

最直接的方法,就是深度学习技术了。但只有32个乐句的样本……很显然不太现实。

最后,贝特就把目光转向了马尔可夫链这个“老方法”。

马尔可夫链,能够记录一组状态中,从一个状态转移到另一个状态的概率。

举例来说,你生活中只去3个地方:家、公司和商店,也就是说,你要么在家里,要么在公司,要么在商店。

想要的知道你接下来要去哪?首先就是记录你一段时间内去这三个地方情况,根据记录数据来分析相关的可能性。

比如说,当你在家的时候,你有80%的可能性去公司,你在公司的时候,回家和去商店概率都是50%,如果你在商店,接下来回家的可能性就有95%。

以上,就是创建一个马尔可夫链的所需要的一切:状态,以及从一个状态到另一个状态的概率。

如果把它应用到音乐上,该怎么做?

马尔可夫链生成新乐句

先来看一张图:


图中展示的是两个乐句,每个有4个节拍,每个音符旁边,是音符的名字,最上面是节拍。播放这些乐句的顺序,是从左到右依次进行。

然后,把两个乐句放到马尔可夫链中,状态命名为节拍与音符的组合,比如1A就是在第一个节拍的时候演奏A音符。

除了这些,还需要有开始和结束的状态,来表示乐句的开始和结束。用箭头来表示一个状态到另一个状态的转变。

在上图中,第一个乐句就是开始→1A→2F→3A→4F→结束。第二个乐句是开始→1E→2C→3A→4C→结束。

这里面,一共有9个状态,分别是开始、1A、1E、2F、2C、3A、4F、4C和结束。从一个状态到另一个状态的概率是:

开始→1A:50%

开始→1E:50%

1A→2F:100%

1E→2C:100%

2F→3A:100%

2C→3A:100%

3A→4F:50%

3A→4C:50%

4F→结束:100%

4C→结束:100%

这样,就建立了一个马尔可夫链。从开始到结束,所有可能的路径,可以生成4个乐句:

开始→1A→2F→3A→4F→结束(原始乐句1)

开始→1A→2F→3A→4C→结束(新乐句)

开始→1E→2C→3A→4C→结束(原始乐句2)

开始→1E→2C→3A→4F→结束(新乐句)



就这样,马尔科夫链就生成了两个新的乐句!因为是通过同一个链构建的,听起来也会非常相似。

在这个例子中,只是用了2个乐句,每个乐句中4个节拍。而aisatsana中有32个乐句,每个乐句16个节拍。

按照这个逻辑,贝特最后生成了400多万个独特的乐句,可以播放超过451天,而且所有的乐句都不会重复……

整个实现代码,贝特已经开源了,项目地址:
https://github.com/generative-music/pieces-alex-bainter/blob/master/packages/piece-aisatsana/src/piece.js

如果你有兴趣,可以自己上手试试~

最后,附上生成的aisatsana地址:

https://generative.fm/music/alex-bainter-aisatsana

量子位AI+系列沙龙--智慧城市

加入社群

量子位AI社群开始招募啦,量子位社群分:AI讨论群、AI+行业群、AI技术群;


欢迎对AI感兴趣的同学,在量子位公众号(QbitAI)对话界面回复关键字“微信群”,获取入群方式。(技术群与AI+行业群需经过审核,审核较严,敬请谅解)

诚挚招聘

量子位正在招募编辑/记者,工作地点在北京中关村。期待有才气、有热情的同学加入我们!相关细节,请在量子位公众号(QbitAI)对话界面,回复“招聘”两个字。

量子位 QbitAI · 头条号签约作者

վ'ᴗ' ի 追踪AI技术和产品新动态

喜欢就点这里吧 !

登录查看更多
0

相关内容

马尔可夫链,因安德烈·马尔可夫(A.A.Markov,1856-1922)得名,是指数学中具有马尔可夫性质的离散事件随机过程。该过程中,在给定当前知识或信息的情况下,过去(即当前以前的历史状态)对于预测将来(即当前以后的未来状态)是无关的。 在马尔可夫链的每一步,系统根据概率分布,可以从一个状态变到另一个状态,也可以保持当前状态。状态的改变叫做转移,与不同的状态改变相关的概率叫做转移概率。随机漫步就是马尔可夫链的例子。随机漫步中每一步的状态是在图形中的点,每一步可以移动到任何一个相邻的点,在这里移动到每一个点的概率都是相同的(无论之前漫步路径是如何的)。
AI创新者:破解项目绩效的密码
专知会员服务
32+阅读 · 2020年6月21日
专知会员服务
107+阅读 · 2020年6月12日
和积网络综述论文,Sum-product networks: A survey,24页pdf
专知会员服务
23+阅读 · 2020年4月3日
自回归模型:PixelCNN
专知会员服务
25+阅读 · 2020年3月21日
算法与数据结构Python,369页pdf
专知会员服务
160+阅读 · 2020年3月4日
《代码整洁之道》:5大基本要点
专知会员服务
49+阅读 · 2020年3月3日
【MIT深度学习课程】深度序列建模,Deep Sequence Modeling
专知会员服务
76+阅读 · 2020年2月3日
听完了1000+首古风歌曲,我发现自己也能火
PingWest品玩
4+阅读 · 2019年6月2日
我是怎么走上推荐系统这条(不归)路的……
全球人工智能
11+阅读 · 2019年4月9日
已删除
AI科技评论
4+阅读 · 2018年8月12日
那个要让程序员财务自由的李奥,招人了!
交易门
3+阅读 · 2018年7月13日
使用Keras和LSTM生成说唱歌词
论智
5+阅读 · 2018年5月22日
PPTV创始人姚欣:人工智能到底怎么赚钱?
这位程序员为什么要弃用Facebook?
CSDN
5+阅读 · 2017年7月14日
Arxiv
9+阅读 · 2020年2月15日
Arxiv
10+阅读 · 2017年12月29日
Arxiv
5+阅读 · 2017年11月13日
VIP会员
相关VIP内容
AI创新者:破解项目绩效的密码
专知会员服务
32+阅读 · 2020年6月21日
专知会员服务
107+阅读 · 2020年6月12日
和积网络综述论文,Sum-product networks: A survey,24页pdf
专知会员服务
23+阅读 · 2020年4月3日
自回归模型:PixelCNN
专知会员服务
25+阅读 · 2020年3月21日
算法与数据结构Python,369页pdf
专知会员服务
160+阅读 · 2020年3月4日
《代码整洁之道》:5大基本要点
专知会员服务
49+阅读 · 2020年3月3日
【MIT深度学习课程】深度序列建模,Deep Sequence Modeling
专知会员服务
76+阅读 · 2020年2月3日
相关资讯
听完了1000+首古风歌曲,我发现自己也能火
PingWest品玩
4+阅读 · 2019年6月2日
我是怎么走上推荐系统这条(不归)路的……
全球人工智能
11+阅读 · 2019年4月9日
已删除
AI科技评论
4+阅读 · 2018年8月12日
那个要让程序员财务自由的李奥,招人了!
交易门
3+阅读 · 2018年7月13日
使用Keras和LSTM生成说唱歌词
论智
5+阅读 · 2018年5月22日
PPTV创始人姚欣:人工智能到底怎么赚钱?
这位程序员为什么要弃用Facebook?
CSDN
5+阅读 · 2017年7月14日
Top
微信扫码咨询专知VIP会员