python音乐编程_可以编程写音乐的python库musicpy教程(第一期) musicpy的数据结构...

这个是我在github上给我的项目musicpy写的wiki,分为数据结构,基础语法,实际应用三大部分来为大家讲解这门音乐编程语言,主要是想给大家写一个musicpy的详细的教程与介绍,目前wiki只写了一部分,不过已经有非常多的东西了。我在这里把github上我目前写的musicpy的wiki分成几期连载。github上我的项目musicpy的wiki的地址:https://github.com/Rainbow-Dreamer/musicpy/wiki

(注:musicpy是我个人开发的一门基于python实现的内部DSL(领域特定语言),整体是一个python库,我以python的类的运算符重写以及其他的magic methods的重写,将musicpy变成了一门符号化的音乐编程语言,有自己的一套独特的语法与数据结构,musicpy的作曲代码看上去和python会长得完全不一样(不过当然也可以写成很像2333),以后我会更新一些musicpy的作曲代码示例,给大家体验一下musicpy的符号化作曲语法)

正文:

Musicpy是一门音乐编程语言,是设计给音乐人通过乐理逻辑在非常简洁的语法下创作音乐的。Musicpy不只可以用来写代码作曲,它还有一些我自己开发的音乐分析算法,包括判断任何一组音组成的和弦类型的乐理逻辑算法,分离出一首曲子的主旋律与和弦部分的算法。

在百科部分,我将主要讲解musicpy的数据结构设计,基础语法以及如何使用这门音乐编程语言。我写这门语言的初衷就是能够用简洁的代码来作曲,更重要的是这门语言完全融入了乐理逻辑,因此你可以在乐理上面做出各种尝试。

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

musicpy的数据结构,基础语法,以及如何使用,请到对应的pages查看,我之后会加入更多的pages解释musicpy的细节。

Data structure of musicpy 数据结构

musicpy这门语言可以让你用非常简洁的语法,来表达一段音乐的音符,节奏等等信息,并且可以简单地输出成midi文件的格式。这个库里面涉及到非常多的乐理知识,所以个人推荐至少要先了解一部分乐理再来使用会比较上手。相对地,如果你是一个对乐理比较了解的人,那么看完我写的教程之后你应该很快就上手了。

在musicpy里面,几个基本的类是note(音符), chord(和弦)和scale(音阶)。这几个类是构成音乐代码的基础。musicpy里面的乐理功能非常多,先从几个最基本的开始介绍吧。

note类(音符类)

初始化一个note的实例只需要给一个音名(CDEFGAB其中一个)和一个音高(一个正整数),现在你就可以使用这个音符去做音乐里的任何事情了。你还可以设定音符的duration(音符长度)和volume(音符的音量大小)。音符长度默认为0.25(1/4个小节),音量默认为100。

比如:

这样就是把音符A5赋值给了a,表示出来是这样:

表示的是音名和八度数,这两个共同决定了音高。

note(音符类)的构成:name 音名 (C, D, E, G#, Gb, ...), 为一个表示音名的字符串

num 八度的数字, (和音名一起确定一个音的音高) 为一个正整数

duration 音符的长度,单位为小节,比如duration = 1 表示音符长度为1个小节,默认值为0.25

volume 音符的力度,对应的是midi文件里的音符的力度,范围从0到127,默认值为100

degree 音符的音高数,以C0为12,每一个八度有十二个音,比如C1的音高数就是24,D1的音高数就是26,C5的音高数就是72,以此类推,每一个音符在构建的时候都会自动计算自己的音名和八度数所对应的音高数并且存储起来,之后的用处非常多。(这个音高数是对应midi文件的通用标准里的音符的midi数字)

由于音高数这一基本属性,因此音符类本身是等值为纯数字的,也就是完全可以作为纯数字使用,和弦类是音符类的集合, 也说明和弦类本身等值为一个全部都是数字的集合,也可以作为向量,甚至矩阵来看待 (比如多个和弦的连接走向就可以看作多个向量的拼接,因此也就有了行列数,也就是矩阵的形式)。 也因此在这门语言的数据结构设计中,音符类,和弦类,音阶类都是可以进行数学运算的, 比如线性代数领域的运算,离散数学领域的运算等等。也可以在这门语言的数据结构的基础上建立一整套乐理逻辑的算法, 结合纯数学逻辑来进行多方面的音乐分析研究。现代音乐领域的很多实验性质的音乐,比如序列主义,偶然音乐, 后现代主义音乐(比如极简主义音乐),理论上全部都可以在这门语言的纯数字化的数据结构的基础上进行严格的创作。 即使不提实验性质的音乐,这门语言也可以写任何的古典音乐,爵士音乐,流行音乐。

chord类(和弦类)

这个应该是最重要的类了。在musicpy里,和弦类被定义为“一组音符的集合”,这个定义或许比乐理里面的和弦定义更为广义化,因为按照这个定义,一首完整的乐曲也可以完全装进和弦类里面,在这个库里也确实可以2333

初始化一个和弦实例,只需要给一个音符的列表即可。还可以设定duration(所有音符的长度设置),interval(音符之间的间隔,用列表表示)。这里比较人性化的一个地方是,你在给定音符列表时无需先用note类初始化,而只需要直接写音符的名字(字符串)就行了。

比如:

这样就写出了一个C大七和弦了。我们可以用play函数播放这个和弦:play(Cmaj7) 这个C大七和弦表示出来是这样:

chord(和弦类)的构成:notes 音符列表,为一个记载着这个和弦(或者曲子)所有音符的列表

duration 和弦的每个音符各自的音符长度,默认为None,如果为None则按照音符本身的长度,如果为一个整数或者列表则对音符的长度进行调整。

interval 每两个连续音符之间的间隔,单位为小节,为一个记载着音符间隔的列表(如果在初始化时是整数,则设定为全部的间隔都为此整数)

rootpitch 如果传入的音符列表的元素不是音符类型,而是表示音符的字符串,则会尝试用toNote函数转化为音符类型,如果音符字符串没有八度数,只有音名的情况下,会使用rootpitch来当做音符的八度数,默认值为4。

scale类(音阶类)

这个类可以表示一个特定的音阶。使用这个类可以快速按照音的间隔来构建调式,比如大调的音的排列是全全半全全全半(全代表全音,半代表半音),那么如果想构建一个C大调音阶,就可以写

这样就得到了以C5为根音的C大调音阶,表示出来是这样:

当然,对于大部分知名的调式来说,只需要输入调式的名称就行了。比如

就可以得到以C5为根音的C大调音阶,

比如

得到以C5为根音的C小调音阶,

等等。 在database.py里面的scaleTypes是所有musicpy自带的调式,用户也可以自己定制调式。

scale(音阶类)的构成:start 音阶的主音(起始音) ,为一个音符类

mode 音阶的名字,比如major, minor, dorian, lydian等等

interval 音阶内的音程关系,1表示半音,2表示全音,3表示增二度,以此类推,为一个列表的形式,比如大调音阶的interval就是[2,2,1,2,2,2,1]

name 当直接输入interval而不输入mode构建音阶的时候,作为音阶的名字来使用

notels 音符的列表,可以参考和弦类的音符列表,一个音阶本身是一组确定的音符,因此notels就是一个音阶类里的所有音符

pitch 当start(音阶的主音)在构建音阶的时候只有音名,没有八度数,pitch就作为音阶的主音的八度数,默认值为4

音阶类的内置方法中,有着丰富的乐理逻辑函数,比如和声功能函数,主和弦,属和弦,下属和弦,某一级的副属和弦, 从音阶按照一定的步进来提取自然三和弦,自然七和弦,按照五度圈进行顺时针或者逆时针方向一定步数的转调,关系调, 平行调,负面和声(镜像和声),按照级数提取和弦走向,按照指定调式进行转调,从某一级的音得到衍生调式, 得到标准化的音名标记(每个调里的音名的升降记号)等等。关于具体的细节,我在基础语法和如何使用的部分会详细讲解。

(下一期更新musicpy的基础语法第一部分)

  • 5
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值