python将⾳乐加⼊程序_可以编程写⾳乐的python库musicpy教
程(第五期)mu。。。
这个是我在github上给我的项⽬musicpy写的wiki,分为数据结构,基础语法,实际应⽤三⼤部分来为⼤家讲解这门⾳乐编程语⾔,主要是想给⼤家写⼀个musicpy的详细的教程与介绍,⽬前wiki只写了⼀部分,不过已经有⾮常多的东西了。我在这⾥把github上我⽬前写的musicpy的wiki分成⼏期连载。github上我的项⽬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函数读取
电脑python安装教程因为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的⽂件夹⾥,打开exe⽂件就可以使⽤了。
error错误代码这个编辑器⾥⾯有很多⽅便快速写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: 编辑器⾥的部件的字体颜⾊。(需要重启编辑器才能看到修改后的效果)iconfont
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编辑器我之后还会多加完善,希望⼤家⽤的开⼼~
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论