如何用PYTHON代碼寫出音樂

2021-03-06 凡人機器學習
什麼是MIDI

博主本人雖然五音不全,而且唱歌還很難聽,但是還是非常喜歡聽歌的。我一直在做這樣的嘗試,就是通過人工智慧算法實現機器自動的作詞和編曲(在這裡預告下,通過深度學習寫歌詞已經實現了,之後會分享給大家),本文我們主要聊下如何寫曲。

說到用代碼寫曲子,有一個東西大家一定要了解就是MIDI。MIDI是一種樂器數字接口,是編曲界最廣泛的音樂標準格式。MIDI並不是真正意義上的音樂文件,大家可以把它理解成樂譜,需要有環境編譯MIDI文件,才可以生成音樂。這個關係有點像代碼和編譯器的關係。市面上可以解析MIDI文件的軟體有很多種,本文將用到MuseScore2的軟體,以下就是這個軟體的截圖,界面中的五線譜就是MIDI文件的呈現。這個樂譜是可以播放的,並且可以導出為MP3格式的音樂文件。 

下面我們就介紹下生成MIDI文件所使用的Python庫。

python-midi庫介紹

市面上差不多有十多種python庫可以編寫MIDI格式的文件,本文會推薦大家使用PYTHON-MIDI。我覺得python-midi的優勢是不光可以自己寫程序生成MIDI,而且還可以對MIDI文件進行解析。這樣的功能配合機器學習算法,或許可以幫助我們實現機器的自動編曲,當然這是後話。先來看下如何安裝python-midi。

1.首先進入https://github.com/vishnubob/python-midi#Installation,將整個項目克隆下來。

2.在程序目錄下執行以下命令安裝,

python setup.py install

3.如果想執行某個以mid為後綴的MIDI文件,只要執行以下命令即可:

mididump.py test.mid

接下來介紹下如何寫代碼生成midi文件。

實操

在python-midi庫中,每個樂譜用Pattern對象表示,樂譜中的每個音軌(通常音樂都有很多軌道組成,每種樂器是一個軌道)用Track對象表示。每個音符的開端用midi.NoteOnEvent表示,結束用midi.NoteOffEvent表示,可以在參數中定義每個字符的音長和音高。示例代碼如下:

生成的是一個簡單的音階: 

更多有趣的音樂生成代碼和樣例可以關注我的微信公眾號進行下載,進入公眾號,輸入「music」顯示下載連結,謝謝。 

相關焦點

  • 代碼跑得慢甩鍋Python?手把手教你如何給代碼提速30%
    其實某個特定程序(無論使用何種程式語言)的運行速度是快還是慢,在很大程度上取決於編寫該程序的開發人員自身素質,以及他們編寫優化而高效代碼的能力。Medium上一位小哥就詳細講了講如何讓python提速30%,以此證明代碼跑得慢不是python的問題,而是代碼本身的問題。
  • 如何在python語言代碼實現間隔加減法
    工具Visual Studiopython環境技術>pythondjango在使用python語言時,除了可以實現常規的功能之外,還可以用於數學計算。選擇空python文件,添加4、打開新建的python文件,定義兩個變量num和result,然後使用for……in循環,當i對2取模得到0,
  • python實現網易雲音樂批量下載
    今天給大家帶來的是網易雲音樂批量下載,代碼有些粗糙,以後有時間再慢慢改進。我只爬取了某個明星的全部歌曲,如果再添加點代碼完全可以爬取整站音樂,但是我認為還是點到為止,剩下的代碼也不難。首先,通過網頁抓包獲取真實音樂文件的連結,然後找到該提交地址,並分析傳入的 data 。比較走運的是,網上有很多關於獲取 encSecKey和 params 的教程,大家可以搜索一下。
  • Python漫畫爬蟲——漫畫喵的100行代碼逆襲
    我們分析一下,選中的a標籤的代碼如下:<a href="javascript:a_f_qTcms_Pic_nextUrl_Href();" title="下一頁"><span>下一頁</span></a>比較簡單的網站,「下一頁」可以用真的a標籤和href屬性來做。
  • 10行Python代碼教你免費觀看無廣告版的《慶餘年》騰訊視頻
    今天想秀下Python強大的主題是 —— 用10行代碼搞定各類app的廣告。本來這周是要發個關於如何用python打造屬於自己的iphone快捷方式的,結果因為本周一直沉迷在《慶餘年》中不能自拔,所以下周吧!最近《慶餘年》大火的同時,關於騰訊吃相的吐槽也是大火。
  • Python教程|用代碼打開聖誕節的奇妙姿勢!
    代碼如下哦!h = 10for i in range(h): print((" " * (h - i)) + ('*' * (2 * i + 1)))print((' ' * h) + '|')調整h代表的數值,可以畫出不同高度的聖誕樹!接下來,我們用之前學過的turtle庫來試試看吧!turtle - 聖誕卡片!
  • Python中的函數式編程教程,學會用一行代碼搞定
    next__(self):        # second magic method        if self.current > self.high:            raise StopIteration        else:            self.current += 1 return self.current - 1「魔法方法是python
  • 如何用 Python 寫一個安卓 APP ?
    22點24分準時推送,第一時間送達  編輯:技術君 | 來源:youerning  上一篇:  正文  前言  用 Python 寫安卓 APP 肯定不是最好的選擇,目前用Java和 kotlin
  • 如何用Python探究你喜愛的歌手的音樂風格?
    我將使用基本的python技能來分析Tones and I的兩首熱門歌曲:《Dance Monkey》和《Never Seen The Rain》,查看它們之間是否存在任何相似之處,以及她如何通過歌詞的重複創建自己的音樂風格,比如使用語音單詞(例如「oh」和「ah」)等。
  • 用python繪畫一顆愛你的心,不光可以用來撩女神,還能學知識
    春節將至,如何避免家人朋友對於你女朋友的問候呢?很簡單,給自己創建一個對象就好了,下面羽憶教程為你介紹如何用python畫愛心,讓你離你的女神更近一步。python繪畫愛心python繪畫愛心python編程為了讓你學會如何撩妹,很親切的為你安裝了Turtle繪圖庫。只需要在python程序中引入turtle即可自由繪畫,思維好,畫個地球出來也是小意思。
  • 如何使用Visual Studio工具創建python項目
    工具Visual Studio 2019python環境技術python一般情況下,我們使用Visual Studio進行C#、C++和C語言項目進行開發。隨著工具不斷完善,現在也可以進行python項目開發了。那麼,如何在Visual Studio 2019工具上創建python項目?
  • Python三行代碼實時查看電影票房
    本篇閱讀時間為1分鐘,關注我們,用最高效的時間學最有效的簡潔乾貨內容。還在辛辛苦苦爬電影票房數據嗎?想知道電影排名嗎?想實時獲取票房更新數據嗎?三行代碼教你解決,不,除了列印結果出來,其實只需要兩行代碼,馬上上車!
  • Python有嘻哈:Crossin教你用代碼寫出押韻的verse
    於是小D就寫下了:隔壁老王,你不要囂張,放學之後給我等在操場!實在太方便啦!如果你也想來首自己的嘻哈,點擊文章下方的「閱讀原文」,進入網站自個兒玩兒去吧!想要完整代碼及詳細講解的,請在公眾號(Crossin的編程教室)裡回復 嘻哈。最後,本人親自演示,如何用搜出來的雙押詞彙加上一段簡單beat做出一段嘻哈歌曲。
  • 代碼編輯器秒變音樂播放器?這款插件你值得擁有.
    ,不依賴命令行播放器,靈感來自 kangping/video發現音樂 (歌單 / 新歌 / 排行榜)搜索 (單曲 / 歌手 / 專輯 / 歌單)用戶登錄 (手機號 / 郵箱)用戶收藏 (歌單 / 歌手 / 專輯)每日歌曲推薦 / 推薦歌單 / 私人 FM喜歡音樂 / 收藏音樂播放模式切換 / 音量調節
  • 如何用python製作動態二維碼,來哄女朋友開心?
    教你如何用python製作動態二維碼,來哄女朋友開心?2、安裝MyQR庫直接用需要注意的是MyQR依賴於python3,在python2的環境下可能無法正常運行。代碼如下(相關參數解釋我已經寫在了注釋裡):
  • python字典操作大全,學習python第7天
    ,python字典都是由一個鍵和一個值組成的「鍵值對」,兩者之間用冒號隔開,結構如:sco = {'name':'小明','age': 11},需要注意的是python字典中的值不允許重複。下面為你介紹python字典的操作方法大全。python字典取值在python字典中數值都是以鍵值對的形式存在,如果想取得值,就需要通過對應的鍵。
  • 一行代碼能做什麼?看到最後一個我終於忍不住……
    技術能力的提升需要不斷的學習和實踐,面對一行行枯燥的代碼,做出有趣的事情,更能增加學習的興趣和樂趣。那一行python代碼能做出什麼有趣的東西?C/C++有什麼趣味設計?有哪些趣味的Scratch小遊戲?
  • Python 2和Python 3代碼有哪些區別?
    最近的項目開始用Python3寫了,也體會了一下2和3的區別。主要的一些區別在以下幾個方面: print函數Python 2中print是語句(statement),Python 3中print則變成了函數。
  • 5個無聊Python程序,用Python整蠱你的朋友們吧
    以下程序,不要發代碼,要不實現不了你整蠱的目的。要打包成一個 exe 程序,發給朋友才有意思。使用 pip install pyinstaller。pyinstaller 編碼 BUG在使用 pyinstaller 進行打包 exe 的時候,會出現如下錯誤: File "c:\users\administrator\appdata\local\programs\python\python37\lib\site-packages\PyInstaller\utils\hooks
  • 利用python做串口通訊上位機
    最近聽說python很火,一直好奇能否用python開發一個串口上位機軟體,經過這幾天的嘗試,終於成功了。接下來給大家分享一下。1.      他們已經把串行通訊的代碼封裝在了pyserial模塊中(即便封裝好,你也可以看到原始碼的),接下來我們可以直接安裝這個模塊了。大家還記得把大象放進冰箱的三步法嗎,那麼我們安裝pyserial是不是也要經過找到網址,下載軟體,安裝軟體三步法呢?No!