5分鐘曲子連續播放451天,還能不重樣?當程序員不想單曲循環……
這一壯舉還附贈了教程和開源代碼。
乾明 發自 凹非寺
量子位 報道 | 公眾號 QbitAI
程序員要是喜歡上一個東西,指不定會搞出什么“瘋狂”事情來。
今天要說的,是特別喜歡一首曲子的程序員貝特(Alex Bainter)。
這首曲子,名為aisatsana,來自電子樂大師Aphex Twin,只有5分多鐘。
這里可以聽到:https://mp.weixin.qq.com/s/0ZNsP7sEfagZhjyaLZohSQ
讓他很苦惱的是,單曲循環聽著容易膩歪,他想讓這個曲子能一直不重樣地播放下去。
然后,他選擇了馬爾可夫鏈……
現在這首曲子已經能夠不間斷播放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天,而且所有的樂句都不會重復……
整個實現代碼,貝特已經開源了,項目地址:
如果你有興趣,可以自己上手試試~
最后,附上生成的aisatsana地址:
https://generative.fm/music/alex-bainter-aisatsana
—?完?—
誠摯招聘
量子位正在招募編輯/記者,工作地點在北京中關村。期待有才氣、有熱情的同學加入我們!相關細節,請在量子位公眾號(QbitAI)對話界面,回復“招聘”兩個字。
量子位?QbitAI · 頭條號簽約作者
?’?’ ? 追蹤AI技術和產品新動態
- 滴滴副總裁葉杰平離職,他是出行巨頭的AI掌門人,戰勝Uber中國的關鍵科學家2020-09-07
- 董明珠的格力空調賣不動了:上半年營收同比腰斬,24年來首次被美的反超2020-09-01
- 手機配件市場上的“隱形巨頭”:80后長沙夫妻創辦,IPO首日市值逼近600億2020-08-31
- 寒武紀半年報:每天虧百萬,銷售力度提升營收反降11%,上市高峰市值跌去40%2020-08-30



