介绍

Musicpy是一门基于python的领域特定的音乐编程语言,是设计给音乐人通过乐理逻辑和算法在非常简洁的语法下创作音乐的。

Musicpy不只可以用来写代码作曲,它还有一些我自己开发的音乐分析算法,包括判断任何一组音组成的和弦类型的乐理逻辑算法,分离出一首曲子的主旋律与和弦部分的算法。

在这个文档,我将主要讲解musicpy的数据结构,基本语法以及如何使用。

我写这门语言的初衷就是能够用简洁的代码来作曲,更重要的是这门语言完全融入了乐理逻辑,因此你可以在乐理上面做出各种尝试。

我致力于在这个项目中将整个乐理体系彻底地数学模型化,计算机化,构建一整个计算机能够理解的乐理系统,让大家可以在musicpy这个世界里研究任何跟音乐,乐理相关的算法,智能分析,实验性作曲等等。(除此之外,你可以用musicpy来写任何你喜欢的类型的音乐,古典音乐,爵士,摇滚,流行,电音,等等)

关于musicpy的数据结构,请看数据结构部分。

关于musicpy的基本语法和其他有用的功能,请看基本语法部分。

关于musicpy作曲代码的例子,请看作曲代码示例部分。

我在2021年6月为musicpy添加了一个新的模块daw,这个模块可以加载音源,比如音频文件和soundfonts音源文件(.sf2, .sf3, .dls),使用musicpy播放或导出音频文件,使用起来非常简单和方便。 如果你想了解如何使用这个模块,请看musicpy宿主模块部分。

如果你想在musicpy在音乐分析算法方面进行更多的探索,请看算法部分,这部分包括了我使用musicpy设计的乐理分析算法。

注意:如果你在使用musicpy时遇到任何问题,你可以先看看这个章节 常见的问题,看看你的问题是否是其中之一,并在这里找到解决方法。

安装musicpy

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

pip install musicpy

如果需要读写musicxml文件,你可以在上述命令后面加入[musicxml]来安装相关依赖。如果需要使用宿主模块(musicpy.daw),则通过加入[daw]来安装相关依赖。就像这样:

pip install musicpy[musicxml]

pip install musicpy[daw]

pip install musicpy[daw, musicxml]

注意事项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,这将阻塞该函数直到播放结束,这样你就可以听到声音了。

注意事项3: 如果你使用的是Linux或者macOS,daw模块的其中一个依赖库sf2_loader有一些必须的配置步骤,详情请看这里

除此之外,我为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

我开发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 实际上根本就不懂乐理是什么,也没有音乐的概念,他们只是从海量的训练数据里面照葫芦画瓢而已。还有一个重点是,既然可以用具体的逻辑来描述的事情,其实是不需要机器学习的。如果是文字识别,图像分类这些比较难以用抽象的逻辑来描述的事情,那才是深度学习的用武之地。