1 Star 0 Fork 0

brendanaaa / musicpy

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
更新日志Changelog.txt 12.90 KB
一键复制 编辑 原始数据 按行查看 历史
Rainbow-Dreamer 提交于 2020-08-26 15:20 . update
2020.8.25
这些天更新了很多新的功能,包括很多我在这个库里开发的算法也有了很多进展。我会找时间按照日期把这些天的更新内容
告诉大家,敬请期待。
2020.8.6
1.增加了新的语法标记符'|',放在两个和弦之间,用法和'//'一样,达成完全一样的功能,可作为另一种选择。之后可能会加入这个语法标记符的其他的新功能。
2.和弦类的语法标记符'%',之前的功能是接收一个元素为整数的列表,按照索引提取和弦里的音出来组成一个新的和弦。现在加入了一个新的功能,
一个和弦后面加上'%'然后加上一个整数n,表示重复这个和弦n次,与'*'的区别在于,连接和弦的方式是a.add(b, mode='after'),也就是可以保证
下一个和弦一定会出现在前一个和弦结束之后,因此可以避免一个和弦本身所有音的间隔都为0的时候在重复连接时所有音都重合在一起的情况,
非常适用于柱式和弦。(分解和弦一般来说音都是有明显的间隔的,因此使用'*'都没有什么问题)
2020.8.5
1.更新了音阶类的方法,增加了standard函数,可以得到一个自然音阶的标准的音名标记法,自然音阶包括自然大调以及其所有的衍生调式,
最常见的就是自然大调和自然小调,还有中古调式。实际上standard函数对于七音音阶都可以使用,包括和声小调,旋律小调这种不属于
自然音阶的调式也可以使用。比如D大调的标准音名标记法是D, E, F♯, G, A, B, C♯, 只需要scale('D','major').standard()就可以得到
['D', 'E', 'F#', 'G', 'A', 'B', 'C#']这个包含着D大调音阶的音名标记法的列表,里面每个元素都是表示音名的字符串。
除此之外,与standard函数相关联的一个全局函数relative_note, 接收两个参数,都是表示音名的字符串,比如音名a和音名b,这个函数可以得到
音名b如何加上变音记号从而得到与音名a一样的音高。比如relative_note('E', 'F')会得到'Fb', relative_note('D', 'C')会得到'Cx',
relative_note('F', 'G')会得到'Gbb', relative_note('A#', 'B')会得到'Bb', relative_note('C','C#')会得到'C♮'。
两个音名参数本身也可以带上任何的变音记号,这个函数都会智能判断并且给出正确的结果。standard函数里就有用到relative_note这个函数
用来得到每个音阶的标准的音名标记。
2020.7.31
1.和弦类增加了get_duration和get_volume两个新方法,get_duration可以得到和弦里的所有音符的长度的列表,get_volume可以得到
和弦里的所有音符的力度的列表。
2020.7.27
1. 增加了一些全新的语法标记符,使得对于和弦类的某些处理函数的调用更加简洁。
增加的语法标记符如下:(这里的和弦也可以是一条可以产生和弦的音乐代码语句)
1. '+'标记符,放在一个和弦之前,等价于和弦.up(),并且可以多个叠加使用。
举例:+chd('A','maj7')会得到A#maj7和弦,++chd('C','maj')会得到D大三和弦。
2. '-'标记符,放在一个和弦之前,等价于和弦.down(),并且可以多个叠加使用。
举例:-chd('A','maj7')会得到Abmaj7和弦,--chd('D','maj')会得到C大三和弦。
3. '~'标记符,放在一个和弦之前,等价于和弦.reverse(),并且可以多个叠加使用(使用两个就是变回原来的顺序)。
4. '//'连接符,放在两个和弦a, b之间,等价于a.add(b, mode='after'),能够将
a, b两个和弦进行连接,并且避免两个和弦的音完全重叠的情况。(如果使用a + b,
也可以同样对a和b进行连接,但是当和弦a的所有的音都是0间隔的情况下(也就是和弦a是一个柱式和弦,
所有的音同时一起弹),直接a+b会让和弦b的音与和弦a的音直接重叠,因为和弦a和b之前没有间隔,
使用a.period(n) + b可以解决这个问题,n为和弦a与b之前需要的间隔,但是这样做比较麻烦。
因此这个'//'连接符,等价于使用a.add(b, mode='after'),add函数在after的模式下,会自动计算
a和b进行连接使得b的音在a的音之后所需要的最短的间隔,然后把这个间隔加在a和b之间,然后进行连接。
5. '&'连接符,放在两个和弦a, b之间,等价于a.add(b, mode='head'),当b为一个tuple的时候,如果b有两个元素,
比如b为(c, i),那么等价于a.add(c, start=i, mode='head')。这个连接符的作用是把和弦a和b作为两个声部放在一起,
也就是让a和b同时开始演奏,如果要b稍微迟一些演奏,那么就用(b,偏移的时间秒数)来代替这个连接符后面的b。
6. '/'连接符,有几种不同的用法:
1.放在和弦a和一个音符或者表示音符的字符串之间,如果这个音符的音名不在和弦a里面,
那么等价于在和弦a的下方加上这个音符作为bass。如果这个音符的音名在和弦a里面,
那么等价于和弦a的对于这个音符的转位。
2.放在和弦a和一个正整数n之间,等价于和弦a的第n转位。
3.放在和弦a和一个元素为正整数的list(列表)之间,等价于和弦a的音按照这个列表里的数字的顺序来进行排序。
4.放在和弦a和另一个和弦b之间,等价于和弦b的音放在和弦a下面组成的复合和弦。
7.'^'连接符,放在和弦a和一个正整数n之间,等价于和弦a的第n最高音转位(把和弦a的第n个音放到最高音的位置),
放在和弦a和一个音符或者表示音符的字符串之间,等价于和弦a增加这个音符作为最高音的新和弦。
2. 新增了trans函数,能够直接对一个完整的和弦名进行解析,包括常规的[和弦根音+和弦类型]的模式,[和弦/音符或者和弦]的
和弦转位(或者加新的音当做bass)或者复合和弦的模式。如果和弦类型不写,则判断为大三和弦。
举例:trans('C')会得到C大三和弦。
trans('Amaj7')会得到A大七和弦。
trans('C/D')会得到C大三和弦加上D作为最低音。
trans('Am/C')会得到A小三和弦的第一转位,也就是C作为最低音的转位。
trans('E/Cmaj')会得到E大三和弦下面是C大三和弦的复合和弦。
trans函数的第一个参数就是和弦名,第二个参数为和弦最低音的音高,这个音高同时决定了整个和弦的音高位置。
第三个参数是duration(和弦里每个音的持续长度),第四个参数是interval(和弦里每个音与下一个音之间的间隔长度)。
对于alt和弦或者省略音的和弦,也就是有升降某些度数的和弦,在和弦名之后加上一个英文逗号,以逗号分隔升降音或者
省略音(有多个变化音的时候),比如trans('C7, #9')可以得到C属七升九和弦,trans('D7, #5, b9')可以得到
D属七升五降九和弦,trans('Cmaj7, omit5')可以得到C大七和弦省略五度音。这个和弦变化音的语法同样可以用在有斜杠
的情况(也就是有转位,增加最低音或者复合和弦的情况),比如trans('C7,#9/E')可以得到C属七升九和弦把E转位到最低音。
3.新增了和弦加上括号里面写和弦配置的功能,实际上是把和弦的实例本身当做可调用的函数对象来进行和弦配置。
括号里接收一个表示和弦配置的字符串,目前可以识别的几种不同的和弦配置为:和弦度数升降音,和弦省略音。
不同种类的和弦配置可以写在同一个字符串里,需要用英文的逗号分隔开来。接下来对每一种和弦配置的语法进行讲解。
1.和弦度数的升降音,也就是5, 7, 9, 11, 13度音的升半音或者降半音。(除了这几个比较热门的alt和弦度数的选择,
也支持1, 2, 3, 4, 6度音的升降音)表示的规则和变化音和弦的普遍写法相同,比如C属七升九和弦,和弦的表示
为C7#9,因此在C7和弦的括号里的字符串写上'#9',即可得到C属七升九和弦,也就是trans('C7')('#9')。
比如D属7降九和弦,和弦的表示为D7b9,因此在D7和弦的括号里的字符串写上'b9',即可得到D属七降九和弦,
也就是trans('D7')('b9')。如果有多个变化音,只需要用英文的逗号分隔每个变化音即可。比如F属七降五升九和弦,
和弦的表示为F7b5#9,这里写trans('F7')('b5, #9')即可得到F属七降五升九和弦。
2.和弦的省略音,与音乐界主流的写法相同,按照和弦的度数来进行省略,语法为omit度数,或者no度数。
比如C大七和弦省略5度音,和弦的写法为Cmaj7(omit5)或者Cmaj7(no5),这里写trans('Cmaj7')('omit5')或者
trans('Cmaj7')('no5')即可得到C大七和弦省略5度音。
4.和弦类的内置函数增加了get函数,可以接收一个正整数的列表,按照和弦的第几个音来对和弦的音进行提取,构建出一个新和弦
或者新的旋律线,和弦的音可以重复提取,音高保持着原来的和弦里的音高。
5.我专门为这个musicpy库写了一个高效编辑器,里面有很多方便快速写musicpy代码的功能,并且可以实时听到对应的音乐。
musicpy editor.pyw这个文件就是编辑器,这个编辑器需要的额外的库有pillow, pygame,如果电脑里还没有安装
这两个python库请先安装,以正常使用此编辑器。接下来详细介绍一下这个编辑器。
首先,在上面的框输入musicpy代码,在下方的框显示结果,实时运行,不使用print和自动补全都是默认打开的,
不用的时候也可以到对应的打钩框关闭。自动补全让你在写代码时可以只打一两个字符就给出一个包含这几个字符的函数方法的列表,
让你快速选择,鼠标点击和方向盘上下键加上回车选择都可以。自动补全在一个对象的"."之后也会开启,此时的自动补全列表
是这个对象所拥有的类方法和属性。小括号和中括号自动配对补全(打出左边的括号,会自动填上右边的括号),
并且输入的光标自动放在两个括号之间。文件栏里面有打开musicpy代码文件(只要是文本文件格式都可以),保存当前写的
musicpy代码为文件,以及设置。在设置里目前的几项为:
bakground_image: 可以选择背景图片的文件路径,点击“更改”按钮就可以打开一个文件浏览框,选择自己想要设置的背景图片的
文件路径,也可以手动输入文件路径。
background_places: 背景图片的位置,第一项为x(横向)的坐标,第二项为y(纵向)的坐标,以编辑器的左上角为0, 0(原点),
x从左往右加大,y从上往下加大。
eachline_character: 自动换行每一行的最大字数。
之后会加入更多的可以设置的项。
不使用print如果打勾,在输入一行代码时,在每一行,如果有可以显示出来的东西,下面的框就会显示,等价于自动加上了print。
实施运行如果打勾,编辑器会在你写的代码发生改变时实时运行你写的代码,并且在下方的框里显示出结果(如果不使用print打勾的话)。
在这个musicpy编辑器里,除了实时运行,自动补全,不使用print的几个打勾框和文件栏之外,还有保存的按钮,保存当下写的代码为文件;
运行的按钮,运行当下写的代码,如果当前的代码运行会出现错误,则显示出错误信息在下方的框里,并且不会影响到编辑器的正常工作。
在实时运行的时候,如果当前的代码运行会出现错误,则在下方的框不会显示任何东西,此时点击运行的按钮可以看到错误信息;
自动换行的按钮,可以让下面的框显示的运行结果自动换行。
这个musicpy编辑器有几个非常好用的功能,接下来一一介绍。
1.在一行musicpy代码之前加上'/',就会直接播放这段代码代表的音乐,并且是内部播放,并不会打开任何电脑上的播放器。
与此同时也会在musicpy文件夹里生成当前的musicpy代码对应的midi文件。这个语法等价于在这行代码放在play函数里面,
play函数的参数设置可以用英文的逗号跟在代码的后面,比如bpm(曲速),instrument(乐器)等等的选择。
建议实时运行同时打开(默认是打开的),就可以musicpy代码写到哪,加上'/'就可以马上听到。
2.在一行musicpy代码前(特别是表示一个和弦的代码)加上'?'可以得到这个和弦按照乐理逻辑判断出来的和弦类型名称,
比如?chord(['C','E','G','B'])会得到Cmaj7(原位和弦的时候会返回一个列表,列表里是这个和弦类型的各种版本的称呼)。
这个语法等价于表示一个和弦的musicpy代码放在detect函数里面,detect函数的参数配置也可以用英文的逗号跟在代码的后面。
这个musicpy编辑器我之后还会多加完善,希望大家用的开心~
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
1
https://gitee.com/brendanaaa/musicpy.git
git@gitee.com:brendanaaa/musicpy.git
brendanaaa
musicpy
musicpy
master

搜索帮助

344bd9b3 5694891 D2dac590 5694891