python将音乐加入程序_可以编程写音乐的python库musicpy教程(第五期) musicpy的实际应用...

这篇教程介绍了基于python的音乐编程库musicpy,讲解了如何使用该库进行音乐创作,包括读取和处理midi文件、乐理操作、写入midi文件、和弦类型判断等功能,并提供了音乐编辑器的使用指南。
摘要由CSDN通过智能技术生成

这个是我在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的符号化作曲语法)

正文:

How to use musicpy 如何使用musicpy

在这一部分,我将会讲解如何使用musicpy这门语言来做一些音乐上比较实际的应用。

读取midi文件,转换成和弦类型,以便于进行各种乐理上的操作

使用read函数可以读取一个midi文件,将midi文件的内容转换成和弦类型。read函数的第一个参数name是midi文件名(包括.mid的后缀),

第二个参数trackind是midi文件要读取的轨道数,默认值为1(也就是midi文件的第二个轨道,因为第一个轨道经常用来标记midi文件的初始信息)

第三个参数mode是读取模式,分为'find', 'all'和普通模式。

mode的默认值为find。在find模式下,mode的值为'find',read函数会智能查找midi文件第一个有音符信息的轨道,

并且转换成和弦类型,伴随着BPM(曲速)和音符开始时间(单位为小节)一起返回,返回结果的顺序为BPM,和弦类型,开始时间。

在all模式下,mode的值为'all',read函数会查找midi文件的所有的非空的轨道(有音符信息的轨道),并且把每个轨道都转换为和弦类型,

返回的是一个列表,元素为每个轨道的BPM,每个轨道的和弦类型,每个轨道的开始时间(单位为小节)组成的元组。

当mode的值设置为不是find或者all的时候,就按照普通模式来执行读取,按照参数trackind的值来提取对应的轨道的内容,

并且转换为和弦类型,返回的结果也是BPM,和弦类型,开始时间。

第四个参数is_file是用来处理当第一个参数name传入的是一个midi文件流的情况。第一个参数name如果是midi文件流,

is_file需要设置为True以进行正常的读取。默认值为False,第一个参数为midi文件名的时候用不到这个参数。第五个参数merge设置为True的时候,在all模式下,会合并所有读取到的非空的轨道到一个新的和弦类型,

按照每个轨道的开始时间,重新计算每个音符的长度的间隔,并且排序好,返回的是BPM,合并过后的和弦类型,最早的音符的开始时间。

merge的默认值为False。第六个参数get_off_drums设置为True的时候,在all模式下,会智能查找内容为鼓的轨道(channel为9或者乐器名中含有drum),

并且在转换和弦类型之前过滤掉这些轨道,只转换那些不是鼓的轨道,返回的列表中的轨道都为不是鼓的轨道。

get_off_drums的默认值为True。

read函数使用示例:

比如现在有一个midi文件'Clair de Lune.mid',这个midi文件只有一个有音符的轨道,里面存储着整首曲子的所有音符的信息,

这个midi文件放在musicpy的文件夹里,现在使用read函数读取

因为mode的默认值是find,所以默认是使用find模式读取midi文件,也就是智能查找第一个有音符信息的轨道,转换成和弦类型,

返回的结果是BPM,和弦类型,开始时间,在这里使用bpm, A, start_time三个变量来分别对应。

现在我们可以对和弦类型A进行各种乐理上的操作了。

和弦类型A里面存储的是整首曲子的信息,包括所有的音符,音符的间隔。

可以使用基础语法部分里面讲到的很多语法来对曲子A进行乐理上的玩转,比如转调,升调,降调,切片,倒序等等。

我目前正在开发的一首曲子的调性判断算法也可以直接用在这里,不过目前还在开发阶段,还有很多地方需要改进,详情可以看detect_scale函数。

把和弦类型写入midi文件,以方便DAW中查看和编辑

使用write函数即可把任意一个音符类型,和弦类型或者任意一句musicpy语言的代码写入midi文件。

实际上play函数里面就有使用到write函数,然后调用电脑的播放器播放midi文件进行演奏。name_of_midi是想要的midi文件名,形成的midi文件的名字。

chord1是想要写入的和弦类型,或者任意的musicpy的代码(只要最后得到的结果是和弦类型或者音符类型即可)。

tempo是想要写入的曲子的BPM(曲速)。

track是想要写入的轨道编号。

channel是想要写入的频道编号,需要注意的是9对应的是鼓的轨道。

time1是想要写入的曲子的起始时间(单位为小节)。

track_num是想要写入的midi文件的轨道数量。

mode是写入midi文件的模式,分为'quick', 'new', 'new2', 'm', 'm+', 'multi'六种模式。quick模式是速度最快的把一个和弦类型(一个和弦类型可以存下一首曲子的所有音符)或者音符类型写入单个轨道的模式, 创建并写入一个全新的midi文件,或者覆盖原有的同名的midi文件(只支持写入单个轨道),速度比其他模式(除了multi模式) 都要快非常多,quick模式也是作为write函数的默认模式使用。multi模式里的写入轨道的方法和quick模式相同,因此速度和quick模式一样快。

new模式,创建并且写入一个全新的midi文件,或者覆盖原有的同名的midi文件,只支持写入单个轨道。

new2模式,和new模式做完全一样的事情,区别在于new模式使用midiutil作为最后写入midi文件信息的工具,而new2模式使用的是mido作为最后写入midi文件信息的工具。

m模式和m+模式都是往已存在的midi文件进行追加写入,区别在于m模式是从midi文件的头部开始追加写入(直接加上新的音符,不会覆盖掉原来就有的音符),

m+模式是从midi文件的末尾追加写入。在m模式中,设置time1参数可以选择追加写入的音符的开始位置。

multi模式支持一次性写入多个轨道的音符类型,但是只接收piece类型(乐曲类型),关于piece类型我在基础语法也会进行讲解。

instrument参数是想要写入的轨道的乐器类型,对应的是General Midi的乐器,编号从0~127,可以输入乐器名(General Midi的乐器列表里的乐器名),

也可以直接输入数字(0~127之间的任何一个整数)。save_as_file参数设置为True的时候,在本地写入或者生成midi文件,不返回任何值。save_as_file设置为False的时候,返回一个midi文件流。默认值为True。

midi_io是在save_as_file设置为False的时候,在函数调用中起到传参作用的参数,用来在函数之间传递midi文件流。

判断任意一组音组成的和弦类型的乐理逻辑算法

这个乐理逻辑算法是我完全使用musicpy语言以及其数据结构开发出来的,可以判断非常复杂的和弦组成,包括原位和弦,转位和弦,省略音,变化音,voicings, 复合和弦等等,这个算法有很多乐理逻辑参数可以设置,不同的乐理逻辑参数的设置可能会导致不同的判断结果。默认的参数设置适用程度最广泛。

这个乐理逻辑算法判断和弦类型的速度也很快,对于绝大部分的和弦都是极速判断出结果。

这个和弦判断的算法在detect函数里,detect函数本身的内容就是这个和弦判断的算法,接下来讲讲detect函数的用法。(伴随着算法的更新改进,一直有新的乐理配置参数加入,所以最后是省略号)

具体的使用的例子如下:

会对A5, C5, E5, G5这组音符进行乐理逻辑分析,返回的是这组音符组成的和弦类型(包括根音的音名)Am7。

这里只稍微提一下这个算法的大概,这个算法想要详细讲解的话需要一整个章节,如果想了解这个算法的完整的细节

请看我在wiki为这个算法写的章节我在musicpy的基础上开发的原创的按照乐理逻辑判断任意一组音组成的和弦类型的算法

detect函数的这些参数的具体含义和用法也在这里有写。

我专门为musicpy这个项目写了一个高效的编辑器供大家使用

musicpy editor.pyw这个文件是我专门为musicpy语言开发的一个高效的编辑器,电脑上有安装python的可以直接打开musicpy editor.pyw使用,因为这个编辑器需要的依赖库pygame和pillow在pip install musicpy的时候已经顺带安装了,不需要再安装其他的依赖库。电脑上没有安装python的可以到release那边下载最新版的musicpy.editor.exe,放到musicpy的文件夹里,打开exe文件就可以使用了。

这个编辑器里面有很多方便快速写musicpy代码的功能,并且可以实时听到对应的音乐。

接下来详细介绍一下这个编辑器。

首先,在上面的框输入musicpy代码,在下方的框显示结果,实时运行,不使用print和自动补全都是默认打开的,不用的时候也可以到对应的打钩框关闭。自动补全让你在写代码时可以只打一两个字符就给出一个包含这几个字符的函数方法的列表,让你快速选择,鼠标点击和方向盘上下键加上回车选择都可以。自动补全在一个对象的"."之后也会开启,此时的自动补全列表是这个对象所拥有的类方法和属性。小括号和中括号自动配对补全(打出左边的括号,会自动填上右边的括号),并且输入的光标自动放在两个括号之间。文件栏里面有打开musicpy代码文件(只要是文本文件格式都可以),保存当前写的musicpy代码为文件,以及设置。这个编辑器也支持语法高亮,同时大家也可以在设置里自己定制语法高亮的内容和对应的颜色。

我还给这个编辑器加入了输入以及输出界面的开灯/关灯功能,让大家可以在白底黑字主题和黑底白字主题来回切换,以适应不同程序员的的口味。同时,大家可以自己选择字体类型和字体大小,以及自己定制编辑器的部件的背景颜色,字体颜色以及鼠标光标移到部件上显示的颜色。设置文件config.py里的所有参数都可以修改,而且不需要打开config.py修改,只需要打开编辑器,然后点击左上角的文件——设置,在弹出的设置窗口里修改参数,然后点击保存按钮就可以了。某些参数修改后需要重启编辑器才会看到修改后的效果,我接下来在介绍设置里的参数的部分会说。

在设置里的参数的说明:bakground_image: 可以选择背景图片的文件路径,点击“更改”按钮就可以打开一个文件浏览框,选择自己想要设置的背景图片的文件路径,也可以手动输入文件路径。修改之后点击保存就会重新加载背景图片。

background_places: 背景图片的位置,第一项为x(横向)的坐标,第二项为y(纵向)的坐标,以编辑器的左上角为0, 0(原点),x从左往右加大,y从上往下加大。修改之后点击保存就会重新加载背景图片的位置。

eachline_character: 自动换行每一行的最大字数。

pairing_symbols: 自动补全符号的列表,大家可以自己定制想要自动补全的符号,比如打一个'('会自动补全')'。

wraplines_number: 自动换行的时候每两行之间的空行数。

font_type: 输入和输出窗口的字体类型。

font_size: 输入和输出窗口的字体大小。

background_mode: 开灯/关灯模式的参数,'white'表示开灯模式,'black'表示关灯模式,在编辑器的主界面会有一个按钮可以切换开灯和关灯。

grammar_highlight: 语法高亮的字典,键为颜色名称,值为需要语法高亮为这种颜色的单词的列表。

background_color: 编辑器里的部件的背景颜色。(需要重启编辑器才能看到修改后的效果)

foreground_color: 编辑器里的部件的字体颜色。(需要重启编辑器才能看到修改后的效果)

active_background_color: 鼠标光标移到编辑器里的部件上显示的颜色。(需要重启编辑器才能看到修改后的效果)

day_and_night_colors: 开灯/关灯模式分别对应的输入窗口和输出窗口的背景颜色名称。(需要重启编辑器才能看到修改后的效果)

不使用print如果打勾,在输入一行代码时,在每一行,如果有可以显示出来的东西,下面的框就会显示,等价于自动加上了print。实时运行如果打勾,编辑器会在你写的代码发生改变时实时运行你写的代码,并且在下方的框里显示出结果(如果不使用print打勾的话)。在这个musicpy编辑器里,除了实时运行,自动补全,不使用print的几个打勾框和文件栏之外,还有保存的按钮,保存当下写的代码为文件;运行的按钮,运行当下写的代码,如果当前的代码运行会出现错误,则显示出错误信息在下方的框里,并且不会影响到编辑器的正常工作。在实时运行的时候,如果当前的代码运行会出现错误,则在下方的框不会显示任何东西,此时点击运行的按钮可以看到错误信息;自动换行的按钮,可以让下面的框显示的运行结果自动换行。

这个musicpy编辑器有几个非常好用的功能,接下来一一介绍。

1.在一行musicpy代码之前加上'/',就会直接播放这段代码代表的音乐,并且是内部播放,并不会打开任何电脑上的播放器。

与此同时也会在musicpy文件夹里生成当前的musicpy代码对应的midi文件。这个语法等价于在这行代码放在play函数里面,play函数的参数设置可以用英文的逗号跟在代码的后面,比如bpm(曲速),instrument(乐器)等等的选择。

建议实时运行同时打开(默认是打开的),就可以musicpy代码写到哪,加上'/'就可以马上听到。

比如在编辑器里写/C('Dmaj7') % 4 | C('Em7') % 4, 150就可以直接听到这段musicpy语言对应的音乐了。2.在一行musicpy代码前(特别是表示一个和弦的代码)加上'?'可以得到这个和弦按照乐理逻辑判断出来的和弦类型名称,比如

?chord(['C','E','G','B'])

会得到Cmaj7(原位和弦的时候会返回一个列表,列表里是这个和弦类型的各种版本的称呼)。

这个语法等价于表示一个和弦的musicpy代码放在detect函数里面,detect函数的参数配置也可以用英文的逗号跟在代码的后面。

这个musicpy编辑器我之后还会多加完善,希望大家用的开心~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值