这个是我在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的基础语法第一部分)

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

  1. Python灰帽子_黑客与逆向工程师的Python编程之道

    收藏自用 链接:Python灰帽子_黑客与逆向工程师的Python编程之道

  2. 核桃编程python下载网址_核桃编程下载-核桃编程 v2.1.13.0 官方版 - 安下载

    核桃编程提供编程学习功能,可以通过这款软件学习图形化编程技巧,用户到官方平台购买课程以后就可以在软件上听课,远程听老师讲解编程方式,在软件查看老师具体的操作,学习完毕就可以在客户端自己练习编程,可以在 ...

  3. 如何在树莓派上进行python编程_设置并使用树莓派进行Python和C语言编程 (下)

    Python部落(www.freelycode.com)组织翻译, 禁止转载 关键字 条件关键字 下表列出了和条件语句有关的关键字和它们的简要描述 if用来决定将要执行哪条语句 else 可选,条件为 ...

  4. python自学行_有编程基础Python自学行吗?

    有编程基础Python自学行吗?目前Python比较火爆,计算机基础越好对学习Python新的编程语言越有利.大学计算机专业C语言不是很好的入门语言,理解起来有些抽象.零基础学Python很容易上手, ...

  5. 爬虫python编程与cvi编程_无编程经验学习Python做爬虫,目前遇到困难,请各位指点下?...

    这种规模的爬虫用sqlite3就够了 另外如果你要全天运转 推荐写成scrapy框架的形式 下面推荐一下我写的 如何从零开始写python爬虫 有系列文章了,可以看一下专栏 ------------- ...

  6. python手机版_手机编程软件python

    要在e63手机上编写python程序必须先安装py平台,然后下载安装比如ped或者ipro7等编程软件就可以进行编程了.哈哈,有趣的很.解释器也可以安上,不过用处不大哈 . 用python写安卓app ...

  7. 易语言和python的运算速度_【编程专题】实测四种编程语言的运算速度,最快的竟然是它!...

    编程界经常会出现语言鄙视链,各说各的语言怎么怎么的好,那么到底哪种语言好呢?在这里蝈蝈就不发表任何言论了,接下来,我就是想测一下,不同的语言,做同一件事,在运算速度上的差别有多大,由此也可以间接的反应 ...

  8. 用python画小兔子_少儿编程分享:手把手教你用PYTHON编写兔獾大作战(一)

    原标题:少儿编程分享:手把手教你用PYTHON编写兔獾大作战(一) 游戏制作 我们今天要制作的小游戏是Bunnies vs. Badgers (兔獾大作战).游戏中的兔子通过射箭抵御獾的进攻,从而保卫 ...

  9. python图形设计编程_少儿编程分享:手把手教你用Python制作艺术图片

    原标题:少儿编程分享:手把手教你用Python制作艺术图片 在前面的几篇文章中,我们分享了一些用PyGame制作小游戏的教程.我们今天的分享使用的仍然是PyGame,只不过这次不是写游戏啦-我们要用P ...

  10. python向量化编程_向量化编程思维。

    首先恭喜你找到工作:) 在我看来,编程和向量化思维一点关系都没有.向量化思维是只有在处理矩阵运算的时候,才会使用的方式.而且,本质上,在我看来,向量化思维本质是数学能力,而非编程能力.在这个课程中,你 ...

最新文章

  1. mysql 事务id_[转]MySQL 5.6 全局事务 ID(GTID)实现原理(一)
  2. 设置默认Browser
  3. 正则化与L0、L1、L2范数祥解
  4. 计算机网络 鲁士文,《在职研究生计算机网络课程统考复习指南》鲁士文 编_孔网...
  5. spring boot 配置网关时404错误_Kong中使用grpcweb插件代理grpc服务时遇到的坑
  6. python怎样定义font_无法在matplotlib中使用自定义字体
  7. 南阳oj 括号配对问题
  8. Day10 多态 final
  9. 路由器连接上但上不了网原因及解决方法
  10. 七月算法课程《python爬虫》第三课: 爬虫基础知识与简易爬虫实现
  11. sin45怎么用计算机,IT教程:sin45度等于多少
  12. [Web 安全] WASC 和 OWASP两个web安全方面组织机构介绍
  13. 内连接、外连接、全连接
  14. 订单支付功能对接支付宝支付接口
  15. 算法的数值稳定性实验报告用c语言,数值计算实验教案.doc
  16. 《胡闹厨房2》Overcooked 2 for Mac v2.0 烹饪模拟游戏
  17. 视频教程-机器学习数学基础--概率论与数理统计视频教学-机器学习
  18. 软件测试工程师规划需要学什么技能?资深测试分析总结......
  19. 功率谱密度相关方法的MATLAB实现
  20. SR-TE、SR-BE原理

热门文章

  1. 2000年前毕业,学历在学信网查不到解决方法
  2. 频繁gc是什么意思_什么情况下会发生full Gc?如何排查频繁发生full Gc的原因?...
  3. 空间两直线间最短距离计算公式
  4. Windows7不停弹出计算机界面,拨号连接自动弹出,教您如何解决电脑总是自动弹出...
  5. 刷题记录:牛客NC23803DongDong认亲戚
  6. 个人学习笔记---Linux内存:内存管理的实质
  7. git 创建邮箱 用户名_初次安装git配置用户名和邮箱及密钥
  8. 恢复服务器误删文件,云服务器误删文件恢复
  9. JSON在线格式化,美化
  10. 基于Docker搭建RabbitMQ集群(多台服务器)