你想過用代碼來寫音樂嗎?這里給大家介紹一個國人寫的庫 musicpy,讓你用簡潔的語法通過樂理邏輯寫出優(yōu)美的音樂。
這個庫可以讓你用非常簡潔的語法,來表達一段音樂的音符,節(jié)奏等等信息,并且可以簡單地輸出成midi文件的格式。
這個庫里面涉及到非常多的樂理知識,所以個人推薦至少要先了解一部分樂理再來使用會比較上手。相對地,如果你是一個對樂理比較了解的人,那么看完作者在Wiki正在寫的教程之后,你應(yīng)該很快就上手了。
(說明:這個庫的作者還在持續(xù)開發(fā)中,很有創(chuàng)意的一個庫,向大家推薦)
安裝
首先在musicpy文件夾里打開cmd, 跑一下pip install -r requirements.txt安裝依賴庫(如果本來就是pip install musicpy安裝的就不需要這一步, 作者也比較推薦直接pip install musicpy就行)
import 這個庫:
from musicpy import *
作者自己做的介紹與使用教程視頻第一期:
https://www.bilibili.com/video/BV1754y197a9/
詳細的musicpy數(shù)據(jù)結(jié)構(gòu),基礎(chǔ)語法以及使用教程,請看作者正在寫的Wiki,作者會盡量把所有的細節(jié)都講清楚。
Wiki的地址:https://github.com/Rainbow-Dreamer/musicpy/wiki
musicpy說明
在musicpy里面,幾個基本的類是note(音符), chord(和弦)和scale(音階)。這幾個類是構(gòu)成音樂代碼的基礎(chǔ)。
在musicpy這門語言的數(shù)據(jù)結(jié)構(gòu)設(shè)計中,音符類本身是等值為純數(shù)字的,也就是完全可以作為純數(shù)字使用。
和弦類是音符類的集合,也說明和弦類本身等值為一個全部都是數(shù)字的集合,也可以作為向量,甚至矩陣來看待(比如多個和弦的連接走向就可以看作多個向量的拼接,因此也就有了行列數(shù),也就是矩陣的形式)。
也因此在這門語言的數(shù)據(jù)結(jié)構(gòu)設(shè)計中,音符類,和弦類,音階類都是可以進行數(shù)學(xué)運算的,比如線性代數(shù)領(lǐng)域的運算,離散數(shù)學(xué)領(lǐng)域的運算等等。也可以在這門語言的數(shù)據(jù)結(jié)構(gòu)的基礎(chǔ)上建立一整套樂理邏輯的算法,結(jié)合純數(shù)學(xué)邏輯來進行多方面的音樂分析研究。
現(xiàn)代音樂領(lǐng)域的很多實驗性質(zhì)的音樂,比如序列主義,偶然音樂,后現(xiàn)代主義音樂(比如極簡主義音樂),理論上全部都可以在這門語言的純數(shù)字化的數(shù)據(jù)結(jié)構(gòu)的基礎(chǔ)上進行嚴格的創(chuàng)作。即使不提實驗性質(zhì)的音樂,這門語言也可以寫任何的古典音樂,爵士音樂,流行音樂。
作者每隔兩三天就會更新一次這個庫的內(nèi)容,具體的更新內(nèi)容請大家看這個庫里的“更新日志Changelog.txt”,里面有按照日期的每次更新的非常詳細的細節(jié)與說明。
更新日志的鏈接:
https://github.com/Rainbow-Dreamer/musicpy/blob/master/%E6%9B%B4%E6%96%B0%E6%97%A5%E5%BF%97Changelog.txt
初衷
作者開發(fā)這個語言主要的初衷有兩點:
第一,比起工程文件和midi文件單純存儲音符,力度,速度等單位化的信息,如果能夠按照樂理上的角度來表示一段音樂從作曲上的角度是如何實現(xiàn)的,那就更加有表示的意義了。而且只要不是現(xiàn)代主義無調(diào)性音樂,大部分的音樂都是極其具有樂理上的規(guī)律性的,這些規(guī)律抽象成樂理邏輯語句可以大大地精簡化。(比如一個midi文件1000個音符,實際上按照樂理角度可能可以簡化到幾句代碼)。
第二,開發(fā)這個語言是為了讓作曲AI能夠在真正懂得樂理的情況下來作曲(而不是深度學(xué)習(xí),喂大量的數(shù)據(jù)),這個語言也算是一個接口,AI只要把樂理的語法搞懂了,那作曲就會擁有和人一樣的思維。我們可以把樂理上的規(guī)則,做什么好不做什么好告訴AI,這些東西還是可以量化的,所以這個樂理庫也可以作為一個樂理接口,溝通人和AI之間的音樂。因此,比如想讓AI學(xué)習(xí)某個人的作曲風(fēng)格,那么在樂理上面也同樣可以量化這個人的風(fēng)格,每種風(fēng)格對應(yīng)著一些不同的樂理邏輯規(guī)則,這些只要寫給AI,經(jīng)過作者這個庫,AI就可以實現(xiàn)模仿那個人的風(fēng)格了。如果是AI自己原創(chuàng)風(fēng)格,那就是從各種復(fù)雜的作曲規(guī)則里尋找可能性。
為何不用深度學(xué)習(xí)?
作者在想不用深度學(xué)習(xí),神經(jīng)網(wǎng)絡(luò)這些東西,直接教給AI樂理和某個人的風(fēng)格化的樂理規(guī)則,那么AI或許可以做的比深度學(xué)習(xí)大數(shù)據(jù)訓(xùn)練出來的更好。因為大數(shù)據(jù)訓(xùn)練只是給AI模仿數(shù)據(jù)本身而已,這樣其實AI并沒有真正地和人類自己一樣理解作曲是什么,樂理是什么,所以作者才想通過這個庫實現(xiàn)把人的樂理同樣教給AI,讓AI真正意義上地理解樂理,這樣的話,作曲起來就不會生硬了,沒有機器和隨機的感覺了。
所以作者寫這個庫的初衷之一就是避開深度學(xué)習(xí)那一套。但是感覺抽象出不同音樂人的樂理規(guī)則確實很有難度,作者會加油寫好這個算法的qwq 另外其實也可以音樂人自己告訴AI他自己樂理上喜歡怎么寫(也就是自己獨特的樂理偏好規(guī)則),那么AI就會模仿的很到位,因為AI那時候確實懂得樂理了,作曲不可能會有機器感和隨機感,此時AI腦子里想的就和音樂人腦子里想的是完全一樣的東西。
AI不必完全按照我們給他的樂理邏輯規(guī)則來創(chuàng)作,我們可以設(shè)置一個“偏好度”的概念給AI,AI在自己作曲時會有一定程度地偏好某種風(fēng)格,但是除此之外會有自己在“符合正確樂理”的規(guī)則里面找到的獨特的風(fēng)格,這樣AI就可以說“受到了某些音樂人的影響下自己原創(chuàng)的作曲風(fēng)格了”。當(dāng)這個偏好度為0時,AI的作曲將會完全是自己通過樂理尋找到的風(fēng)格,就像一個人自己學(xué)習(xí)了樂理之后,開始摸索自己的作曲風(fēng)格一樣。一個懂得樂理的AI很容易找到自己獨特的風(fēng)格來作曲,我們甚至都不需要給他數(shù)據(jù)來訓(xùn)練,而只要教給AI樂理就行。
如何教AI樂理?
那么怎么教給AI樂理呢?在音樂上面,暫時不考慮現(xiàn)代主義音樂的范疇,那么絕大部分的音樂都是遵循著一些很基本的樂理規(guī)則的。這里的規(guī)則指的是,怎么樣寫樂理上ok,怎么樣寫犯了樂理上的錯誤。比如寫和聲的時候,四部同向往往是要避免的,尤其是在編曲時寫管弦樂的部分。比如寫一個和弦,如果和弦里面的音出現(xiàn)小二度(或者小九度)會聽著比較打架。比如當(dāng)AI自己決定一首曲子要從A大調(diào)開始寫,那么他應(yīng)該從A大調(diào)音階里按照級數(shù)來選取和弦,有可能適當(dāng)?shù)仉x調(diào)一下,加幾個副屬和弦,寫完主歌部分可能按照五度圈轉(zhuǎn)個調(diào),或者大三度/小三度轉(zhuǎn)調(diào),同主音大小調(diào)轉(zhuǎn)調(diào)等等。我們需要做的事情就是告訴AI作曲的時候怎么寫是正確的,更進一步的,怎么寫聽著比較有水平。
AI學(xué)好了樂理,不會忘記,也比較難犯錯,因此可以寫出真正屬于AI自己的音樂。他們會真正懂得音樂是什么,樂理是什么。因為這個庫的語言做的事情就是把樂理抽象成邏輯語句,那么我們每次給AI“上課”,就是把人自己的樂理概念用這個庫的語言來表述,然后寫進AI的數(shù)據(jù)庫里。通過這種方式,AI真正的學(xué)習(xí)到了樂理。這樣的作曲AI,不需要深度學(xué)習(xí),不需要訓(xùn)練集,不需要大數(shù)據(jù),而與之相比,那些深度學(xué)習(xí)訓(xùn)練出來的作曲AI實際上根本就不懂樂理是什么,也沒有音樂的概念,他們只是從海量的訓(xùn)練數(shù)據(jù)里面照葫蘆畫瓢而已。還有一個重點是,既然可以用具體的邏輯來描述的事情,其實是不需要機器學(xué)習(xí)的。如果是文字識別,圖像分類這些比較難以用抽象的邏輯來描述的事情,那才是深度學(xué)習(xí)的用武之地。
結(jié)語
這個庫作者也上傳到 pypi 上了,大家 pip install musicpy 就可以使用了。
作者從去年的10月份開始開發(fā)musicpy,目前這個項目還在初期進度,不過已經(jīng)有一套比較完整的樂理邏輯語法了。這個庫的使用教程視頻作者會持續(xù)更新。作者之前發(fā)的專欄也有一部分的使用教學(xué)。
GitHub鏈接:https://github.com/Rainbow-Dreamer/musicpy
責(zé)任編輯:xj
原文標(biāo)題:Python 國產(chǎn)庫推薦之 musicpy
文章出處:【微信公眾號:數(shù)據(jù)分析與開發(fā)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
-
代碼
+關(guān)注
關(guān)注
30文章
4891瀏覽量
70351 -
python
+關(guān)注
關(guān)注
56文章
4825瀏覽量
86355
原文標(biāo)題:Python 國產(chǎn)庫推薦之 musicpy
文章出處:【微信號:DBDevs,微信公眾號:數(shù)據(jù)分析與開發(fā)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
這個夏天,用代碼定義你的硬核實力!RT-Thread開源之夏重磅來襲

?如何在虛擬環(huán)境中使用 Python,提升你的開發(fā)體驗~

創(chuàng)建了用于OpenVINO?推理的自定義C++和Python代碼,從C++代碼中獲得的結(jié)果與Python代碼不同是為什么?
使用Python實現(xiàn)xgboost教程
適用于MySQL和MariaDB的Python連接器:可靠的MySQL數(shù)據(jù)連接器和數(shù)據(jù)庫

使用Python進行串口通信的案例
NVIDIA發(fā)布cuPyNumeric加速計算庫
全志T507-H國產(chǎn)平臺Ubuntu系統(tǒng)正式發(fā)布,讓您的應(yīng)用開發(fā)更便捷!
Python常用函數(shù)大全
Python庫解析:通過庫實現(xiàn)代理請求與數(shù)據(jù)抓取
pytorch和python的關(guān)系是什么
用pycharm進行python爬蟲的步驟
深度學(xué)習(xí)常用的Python庫
來寫個代碼,改變你的電機轉(zhuǎn)速

評論