乾明 发自 凹非寺
量子位 报道 | 公众号 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​generative.fm

量子位 · QbitAI

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

戳右上角「+关注」获取最新资讯↗↗

如果喜欢,请分享or点赞吧~比心❤

程序员口中的demo是什么意思_怎样让5分钟的曲子不重样播放450天?程序员:用马尔可夫链...相关推荐

  1. 程序员口中的demo是什么意思_URL 地址栏能玩出什么新花样?这位歪果程序员小哥给你开开脑洞!...

    前言 在现在一些互联网营销号的传播素材中,程序员往往会被塑造成一个邋遢.木讷.秃头.低情商的形象,以借此博得普通群众的眼球,吸引他人注意力. 前阵子,暴走漫画发布的一个视频<创造1024> ...

  2. 程序员说的demo是什么意思_“黄龄说的什么意思”???

    买书当然是当当dangdang.com今日打开微博我本以为这是一个有关说话有关情商的争议一本本诸如提高情商好好说话高效沟通的书已经争相在脑海里请求出战了--所谓情商高,就是会说话说出灿烂人生沟通的艺术 ...

  3. 【福利】微信小程序130个精选Demo合集

    小编最近在开发小程序,也读到了不少优秀的小程序源码,项目中有些需求可以直接从源码里粘贴复制过来,虽然这样做不利于自己独立编写代码,但比较是给公司做项目啊,秉着效率第一的原则,简直没有什么比ctrl+c ...

  4. 为什么都要鄙视 PHP 程序员? Java联盟 百家号 07-24 21:43 前几天发表了一篇文章《图解:程序员之间是如何相互鄙视的?》,有人就在留言处留言。 可以解释下:为什么都鄙视PHP工程师

    为什么都要鄙视 PHP 程序员? Java联盟 百家号 07-24 21:43 前几天发表了一篇文章<图解:程序员之间是如何相互鄙视的?>,有人就在留言处留言. 可以解释下:为什么都鄙视P ...

  5. HDFS设计思路,HDFS使用,查看集群状态,HDFS,HDFS上传文件,HDFS下载文件,yarn web管理界面信息查看,运行一个mapreduce程序,mapreduce的demo

    26 集群使用初步 HDFS的设计思路 l 设计思想 分而治之:将大文件.大批量文件,分布式存放在大量服务器上,以便于采取分而治之的方式对海量数据进行运算分析: l 在大数据系统中作用: 为各类分布式 ...

  6. HDFS设计思路,HDFS使用,查看集群状态,HDFS,HDFS上传文件,HDFS下载文件,yarn web管理界面信息查看,运行一个mapreduce程序,mapreduce的demo...

    26 集群使用初步 HDFS的设计思路 l 设计思想 分而治之:将大文件.大批量文件,分布式存放在大量服务器上,以便于采取分而治之的方式对海量数据进行运算分析: l 在大数据系统中作用: 为各类分布式 ...

  7. python大数据就业方向_大数据专业未来的就业方向有哪些?[黑马程序员]

    目前大数据是一个十分热门的行业.一个行业的兴起必定会衍生出相对应的岗位.本篇文章给大家总结下学习大数据后未来可以就业的方向,给大家提供参考. 在数据驱动的未来,大数据人才市场势必会越来越大,而现在仅仅 ...

  8. 微信小程序入门教程+案例demo

    微信小程序入门教程+案例demo 尊重原创,转载请注明出处:原文查看惊喜更多 http://blog.csdn.net/qq137722697 首先摆在好姿态,--微信小程序开发也就那么回事.你只需要 ...

  9. ai取代程序员_未来50%的工作都将被人工智能给取代,程序员会被机器人取代吗?...

    首先程序员这个行业和其他行业一样也是分等级的. 虽然非常不想用"底层从业者"这五个词来定义最低层次的程序员,但事实就是如此. 当行业的某个技术领域发展成熟到一定程度时,这个领域的大 ...

最新文章

  1. 简易无线电能接收方法
  2. WPF中制作带中国农历的万年历
  3. 【 Linux 】单台服务器上并发TCP连接数(转)
  4. 【生成函数基础题】hdu1085 hdu1028
  5. 应用层的AIDL用法(原)
  6. ts watch路由 参数变化_vue watch 监听路由变化
  7. kubernetes日志采集与解析
  8. android流量显示插件,[android]仿360状态,种流量监控桌面浮动显示
  9. 用DirectX Audio和DirectShow播放声音和音乐(3)
  10. excel制作一个信息录入系统_Excel数据总是重复录入?使用这招,让系统帮你做检查,非常实用...
  11. Actionscript 3.0 迁移指南
  12. python 按从小到大的顺序组合成一个字典_Python 按照某个或某几个字段来排序字典列表...
  13. html5下移标签,不可不知的html5标签
  14. IBM heapAnalyzer分析dump文件
  15. excel能和html链接吗,非常棒的 Excel 超链接功能可以跳转到网址和邮箱等
  16. 华为服务器的系统,华为服务器 操作系统
  17. 逼死程序员的翟某被媒体起底,疑有 5 个对象离了 4 次获利上亿
  18. facebook网页版登录_微信网页版关闭登录将影响一大批使用itchat等Web Api方案的微信机器人...
  19. hcna网络技术学习指南_网络工程与弱电工程师有什么区别?这些你都会吗
  20. Python 文件夹批量重命名

热门文章

  1. tensorflow 常遇函数
  2. SLAM前端知识汇总
  3. Two Sum (两数之和) - Hash Table (哈希表)
  4. 基于C语言的 WAV 文件双声道转单声道的实现
  5. java方法重写[详解]
  6. 扎心!为何HR看了你的简历却不通知面试?
  7. 地块电力监控系统的设计和应用
  8. 中小板、创业板、新三板和科创板之间的区别
  9. Git提交指定的文件
  10. python学习——StringIO和BytesIO