Skip to content

Latest commit

 

History

History
131 lines (84 loc) · 12.6 KB

README_cn.md

File metadata and controls

131 lines (84 loc) · 12.6 KB

musicpy

你们有想过用简洁并且可读性好的代码来写音乐吗?

Musicpy是一个可以让你用编程写音乐的python领域特定语言,可以让你用非常简洁并且可读性高的语法通过乐理知识和算法写出优美的音乐。Musicpy容易学,容易写,可读性也比较强,并且是一个完全计算机化的乐理系统。

Musicpy除了用来创作音乐之外,还可以从乐理层面上来创作音乐和分析音乐,并且你可以在musicpy的基础上设计乐理算法来探索音乐的可能性。

Musicpy可以让你用非常简洁的语法来表达一段音乐的音符,和弦,旋律,节奏,力度等信息,可以通过乐理逻辑来生成曲子,并且进行高级的乐理操作。你可以很容易地把musicpy代码输出为MIDI文件的格式,也可以很简单地加载MIDI文件并且转换为musicpy的数据结构进行高级乐理的操作。musicpy的语法设计非常地简洁与灵活,因此musicpy的代码的可读性比较强,并且musicpy和python完全兼容,因此你可以写python代码和musicpy进行互动。这个库里面涉及到非常多的乐理知识,所以个人推荐至少要先了解一部分乐理再来使用会比较上手。相对地,如果你是一个对乐理比较了解的人,那么看完我写的教程之后你应该很快就可以上手了。

使用说明文档

你可以看musicpy wikiRead the Docs documentation,这里有完整并且详细的使用教程,你可以了解并且学习musicpy的语法,数据结构与具体使用。

这个wiki经常更新,因为musicpy经常在新版本中加入全新的函数和功能。wiki里的语法与功能与最新版本的musicpy是同步的。

我写的musicpy的wiki的pdf档和markdown档全套可以点击这里下载,正在不断地更新中。

安装musicpy

先确定电脑里有安装python,python版本最好是 >= 3.7, 打开电脑的cmd然后输入

pip install musicpy

注意事项1: 在Linux上,你需要确保安装的pygame版本早于2.0.3,否则musicpy的play函数将不能正常运行,这是由于pygame的较新版本的一个现有bug。你可以在终端运行pip install pygame==2.0.2来安装pygame 2.0.2或任何早于2.0.3的版本。你还需要安装freepats以使play函数在Linux上运行,你可以运行sudo apt-get install freepats(在Ubuntu上)。

注意事项2: 如果你在运行play函数时听不到任何声音,这是因为有些IDE不会等待pygame的播放结束,他们会在所有代码执行完后停止整个过程,而不等待播放。你可以在播放函数的参数中设置 wait=True,这将阻塞该函数直到播放结束,这样你就可以听到声音了。

除此之外,我为musicpy专门写了一个编辑器,你可以在这里写musicpy的代码,这个编辑器可以实时自动编译和运行,比在常规的python IDE里更加方便。这个编辑器有一些语法糖,并且你可以实时地听到你写的musicpy代码生成的音乐,更加地方便与互动。我强烈推荐大家使用这个musicpy编辑器来写musicpy代码。你可以在仓库musicpy_editor下载musicpy editor, 准备步骤在README。

Musicpy对于Windows, macOS和Linux都是兼容的。

Musicpy现在也支持读写musicxml文件,注意你需要通过pip install partitura安装partitura来使用这些功能。

import这个库

在你喜欢用的python的IDE里面输入

from musicpy import *

或者

import musicpy as mp

以避免和其他模块的可能的函数名和变量名的冲突。

作曲示例

由于musicpy有太多的特性可以介绍,在这里就先写一段用musicpy语言作曲的代码示例:

# 尼龙弦吉他分解和弦演奏一个和弦进行

guitar = (C('CM7', 3, 1/4, 1/8)^2 |
          C('G7sus', 2, 1/4, 1/8)^2 |
          C('A7sus', 2, 1/4, 1/8)^2 |
          C('Em7', 2, 1/4, 1/8)^2 | 
          C('FM7', 2, 1/4, 1/8)^2 |
          C('CM7', 3, 1/4, 1/8)@1 |
          C('AbM7', 2, 1/4, 1/8)^2 |
          C('G7sus', 2, 1/4, 1/8)^2) * 2

play(guitar, bpm=100, instrument=25)

点击这里试听 (Microsoft GS Wavetable Synth)

如果你认为这太过于简单,musicpy也可以在不到30行的代码内制作出这样的音乐(如果你不关心可读性,代码还可以更短)。不过,这也只是一个非常短的电子舞曲的例子,并没有写的很复杂。

更多的musicpy的作曲示例可以看wiki的作曲示例章节。

数据结构简述

在 musicpy里面,几个基本的类是 note(音符),chord(和弦)和 scale(音阶)。这几个类是构成音乐代码的基础。除此之外,musicpy还有很多其他的乐理类型。

在 musicpy这门语言的数据结构设计中,音符类本身是等值为纯数字的,也就是完全可以作为纯数字使用。

和弦类是音符类的集合,也说明和弦类本身等值为一个全部都是数字的集合,也可以作为向量,甚至矩阵来看待(比如多个和弦的连接走向就可以看作多个向量的拼接,因此也就有了行列数,也就是矩阵的形式)。

也因此在这门语言的数据结构设计中,音符类,和弦类,音阶类都是可以进行数学运算的,比如线性代数领域的运算,离散数学领域的运算等等。也可以在这门语言的数据结构的基础上建立一整套乐理逻辑的算法,结合纯数学逻辑来进行多方面的音乐分析研究。

现代音乐领域的很多实验性质的音乐,比如序列主义,偶然音乐,后现代主义音乐(比如极简主义音乐),理论上全部都可以在这门语言的纯数字化的数据结构的基础上进行严格的创作。即使不提实验性质的音乐,这门语言也可以写任何的古典音乐,爵士音乐,流行音乐。

关于更加详细的musicpy的数据结构的描述,请看wiki。

总结

我从2019年的10月份开始开发musicpy,到现在已经有一套完整的乐理逻辑语法了,还有很多作曲编曲以及高级乐理逻辑操作的功能,详细请看wiki。musicpy的视频教程和wiki我都会持续更新。 musicpy我一直在持续更新中,不断地加入新的乐理功能,让musicpy在音乐上能做到的事情更多。

感谢大家的支持~

如果你对于musicpy的最新进展和开发想法感兴趣,你可以看一下这个仓库 musicpy_dev

联系方式

Discord: Rainbow Dreamer#7122

qq: 2180502841

B站账号: Rainbow_Dreamer

邮箱: 2180502841@qq.com / q1036889495@gmail.com

讨论群:

Join our Discord server!

QQ讨论群: 364834221

捐赠

这个项目是由Rainbow Dreamer在业余时间开发的,旨在创建一个有趣的音乐创作库和一个高级MIDI工具包。如果你觉得这个项目对你有用,想支持它和它的未来发展,请考虑给我买杯咖啡,我很感激任何金额。

Support via PayPal

我开发musicpy的初衷

我开发这个语言主要的初衷有两点,第一,比起工程文件和 MIDI 文件单纯存储音符,力度,速度等单位化的信息,如果能够按照乐理上的角度来表示一段音乐从作曲上的角度是如何实现的,那就更加有表示的意义了。而且只要不是现代主义无调性音乐,大部分的音乐都是极其具有乐理上的规律性的,这些规律抽象成乐理逻辑语句可以大大地精简化。(比如一个 MIDI 文件 1000 个音符,实际上按照乐理角度可能可以简化到几句代码)。第二,开发这个语言是为了让作曲 AI 能够在真正懂得乐理的情况下来作曲(而不是深度学习,喂大量的数据),这个语言也算是一个接口,AI 只要把乐理的语法搞懂了,那作曲就会拥有和人一样的思维。我们可以把乐理上的规则,做什么好不做什么好告诉 AI,这些东西还是可以量化的,所以这个乐理库也可以作为一个乐理接口,沟通人和 AI 之间的音乐。因此,比如想让 AI 学习某个人的作曲风格,那么在乐理上面也同样可以量化这个人的风格,每种风格对应着一些不同的乐理逻辑规则,这些只要写给 AI,经过我这个库,AI 就可以实现模仿那个人的风格了。如果是 AI 自己原创风格,那就是从各种复杂的作曲规则里寻找可能性。

我在想不用深度学习,神经网络这些东西,直接教给 AI 乐理和某个人的风格化的乐理规则,那么 AI 或许可以做的比深度学习大数据训练出来的更好。因为大数据训练只是给 AI 模仿数据本身而已,这样其实 AI 并没有真正地和人类自己一样理解作曲是什么,乐理是什么,所以我才想通过这个库实现把人的乐理同样教给 AI,让 AI 真正意义上地理解乐理,这样的话,作曲起来就不会生硬了,没有机器和随机的感觉了。所以我写这个库的初衷之一就是避开深度学习那一套。但是感觉抽象出不同音乐人的乐理规则确实很有难度,我会加油写好这个算法的qwq 另外其实也可以音乐人自己告诉 AI 他自己乐理上喜欢怎么写(也就是自己独特的乐理偏好规则),那么 AI 就会模仿的很到位,因为 AI 那时候确实懂得乐理了,作曲不可能会有机器感和随机感,此时 AI 脑子里想的就和音乐人脑子里想的是完全一样的东西。

AI 不必完全按照我们给他的乐理逻辑规则来创作,我们可以设置一个“偏好度”的概念给 AI,AI 在自己作曲时会有一定程度地偏好某种风格,但是除此之外会有自己在“符合正确乐理”的规则里面找到的独特的风格,这样 AI 就可以说“受到了某些音乐人的影响下自己原创的作曲风格了”。当这个偏好度为 0 时,AI 的作曲将会完全是自己通过乐理寻找到的风格,就像一个人自己学习了乐理之后,开始摸索自己的作曲风格一样。一个懂得乐理的 AI 很容易找到自己独特的风格来作曲,我们甚至都不需要给他数据来训练,而只要教给 AI 乐理就行。

那么怎么教给 AI 乐理呢?在音乐上面,暂时不考虑现代主义音乐的范畴,那么绝大部分的音乐都是遵循着一些很基本的乐理规则的。这里的规则指的是,怎么样写乐理上 OK,怎么样写犯了乐理上的错误。比如写和声的时候,四部同向往往是要避免的,尤其是在编曲时写管弦乐的部分。比如写一个和弦,如果和弦里面的音出现小二度(或者小九度)会听着比较打架。比如当 AI 自己决定一首曲子要从 A 大调开始写,那么他应该从 A 大调音阶里按照级数来选取和弦,有可能适当地离调一下,加几个副属和弦,写完主歌部分可能按照五度圈转个调,或者大三度/小三度转调,同主音大小调转调等等。我们需要做的事情就是告诉 AI 作曲的时候怎么写是正确的,更进一步的,怎么写听着比较有水平。AI 学好了乐理,不会忘记,也比较难犯错,因此可以写出真正属于 AI 自己的音乐。他们会真正懂得音乐是什么,乐理是什么。因为这个库的语言做的事情就是把乐理抽象成逻辑语句,那么我们每次给 AI “上课”,就是把人自己的乐理概念用这个库的语言来表述,然后写进 AI 的数据库里。通过这种方式,AI 真正的学习到了乐理。这样的作曲 AI,不需要深度学习,不需要训练集,不需要大数据,而与之相比,那些深度学习训练出来的作曲 AI 实际上根本就不懂乐理是什么,也没有音乐的概念,他们只是从海量的训练数据里面照葫芦画瓢而已。还有一个重点是,既然可以用具体的逻辑来描述的事情,其实是不需要机器学习的。如果是文字识别,图像分类这些比较难以用抽象的逻辑来描述的事情,那才是深度学习的用武之地。