python⾳乐编程_可以编程写⾳乐的python库musicpy教程(第
⼀期)music。。。
(注: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类(和弦类)
c语言等级考试题库aspen simulation workbook这个应该是最重要的类了。在musicpy⾥,和弦类被定义为“⼀组⾳符的集合”,这个定义或许⽐乐理⾥⾯的和弦定义更为⼴义化,因为按照这个定义,⼀⾸完整的乐曲也可以完全装进和弦类⾥⾯,在这个库⾥也确实可以2333
初始化⼀个和弦实例,只需要给⼀个⾳符的列表即可。还可以设定duration(所有⾳符的长度设置),interval(⾳符之间的间隔,⽤列表表⽰)。这⾥⽐较⼈性化的⼀个地⽅是,你在给定⾳符列表时⽆需先⽤note类初始化,⽽只需要直接写⾳符的名字(字符串)就⾏了。
⽐如:
同步消息和异步消息这样就写出了⼀个C⼤七和弦了。我们可以⽤play函数播放这个和弦:play(Cmaj7) 这个C⼤七和弦表⽰出来是这样:
chord(和弦类)的构成:notes ⾳符列表,为⼀个记载着这个和弦(或者曲⼦)所有⾳符的列表
duration 和弦的每个⾳符各⾃的⾳符长度,默认为None,如果为None则按照⾳符本⾝的长度,如果为⼀个整数或者列表则对⾳符的长度进⾏调整。
极简python快速入门教程interval 每两个连续⾳符之间的间隔,单位为⼩节,为⼀个记载着⾳符间隔的列表(如果在初始化时是整数,则设定为全部的间隔都为此整数)
voidreverse数据结构rootpitch 如果传⼊的⾳符列表的元素不是⾳符类型,⽽是表⽰⾳符的字符串,则会尝试⽤toNote函数转化为⾳符类型,如果⾳符字符串没有⼋度数,只有⾳名的情况下,会使⽤rootpitch来当做⾳符的⼋度数,默认值为4。
scale类(⾳阶类)
这个类可以表⽰⼀个特定的⾳阶。使⽤这个类可以快速按照⾳的间隔来构建调式,⽐如⼤调的⾳的排列是全全半全全全半(全代表全⾳,半代表半⾳),那么如果想构建⼀个C⼤调⾳阶,就可以写
这样就得到了以C5为根⾳的C⼤调⾳阶,表⽰出来是这样:
array push后数据不变当然,对于⼤部分知名的调式来说,只需要输⼊调式的名称就⾏了。⽐如
就可以得到以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的基础语法第⼀部分)
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论