音符类型的基本语法
目录
- 使用音名和八度数构建一个音符
- 直接输入音符名(音名+八度数)构建一个音符
- 对已有音符进行音符长度和音量的设置
- 音符的音高数转换成音符类型,以及从音符类型得到音高数
- 音符的升降音
- 音符的升号与降号互相转换
- 多个音符连接组合成和弦
- 音符类型新增可以加上和弦名称获得和弦类型的乐理功能
- 音符类型新增按照音程关系生成和弦的功能
- 附点音符的使用
- 重置音符的音高
- 比较两个音符
使用音名和八度数构建一个音符
a = note('D', 6)
a为音符D6。 note的其他参数还有duration(音符长度,以小节为单位),volume(音符力度,对应MIDI的0~127,也就是0到127之间的任意整数(包括0和127)),channel(MIDI通道编号) 比如
a = note(name='C', num=5, duration=0.5, volume=100)
表示a为音符C5,音符长度为0.5个小节,音符力度为100。
直接输入音符名(音名+八度数)构建一个音符
我们可以使用to_note函数
to_note('E5')
得到的是音符E5。
to_note函数的简写方法:
N('E5')
N表示的是音符note的首字母大写
对已有音符进行音符长度和音量的设置
a.set(duration, volume) # 返回的是一个全新的和弦类型
a % (duration, volume) # 进阶写法
a = a % (duration, volume) # 如果想要直接替换原来的音符类型就这样写,也可以直接单独使用
duration为音符长度,以小节为单位,volume为音符力度,对应MIDI的0~127,0到127之间的任意整数(包括0和127),可以只设置其中一个,(不设置的放空即可)也可以同时设置两个参数。
使用音符类型的内置函数set返回的是一个全新的参数经过修改后的音符类型,与之前的音符类型完全独立开来,这样设计是因为再具体写musicpy代码的时候,可以搭积木式地一句话写好音乐语句的音高,音符间隔,音符长度,音量大小等参数,这也是我对于musicpy的语法设计的要求之一。其他的乐理类型,比如和弦类型的set方法也和这里是一个道理,之后讲到和弦类型的时候会为大家详细说明。
音符的音高数转换成音符类型,以及从音符类型得到音高数
使用degree_to_note函数可以把一个整数转换成对应的音符,比如
degree_to_note(60)
得到的是音符类型C4。
得到一个音符类型a的音高数,只需要
a.degree
即可
音符的升降音
a.up(n)
表示升高a音符n个半音
a.down(n)
表示降低a音符n个半音
进阶写法:
+++a #(音符a升三个半音)
---a #(音符a降三个半音)
a + n #(音符a升n个半音)
a - n #(音符a降n个半音)
(可以类比和弦类的升降音)
音符的升号与降号互相转换
比如音符a的音名是C#,那么
~a
得到的是音符a的降号表示
Db
比如音符b的音名是Eb,那么
~b
得到的是音符b的升号表示
D#
多个音符连接组合成和弦
比如现在有a, b, c, d四个音符,那么可以用+号把这些音符连接起来,组成一个音符依次为a, b, c, d的和弦,
A = a + b + c + d
和弦A的组成音依次为a, b, c, d
音符类型新增可以加上和弦名称获得和弦类型的乐理功能
音符类型可以当作函数或者生成器传入和弦名称获得和弦类型,比如
A3 = N('A3')
>>> print(A3('sus'))
chord(notes=[A3, D4, E4], interval=[0, 0, 0], start_time=0)
# 也同样支持转位,复合和弦等C函数支持解析的和弦名称的语法
音符类型新增按照音程关系生成和弦的功能
你可以使用音符类型的with_interval函数,指定一个音程来形成一个含有两个音的和弦类型,两个音分别是当前的音符类型和与这个音符类型形成指定的音程关系的音符类型。
a = N('C5')
>>> a.with_interval(database.major_seventh) # 形成一个表示C5的大七度的音程的和弦
chord(notes=[C5, B5], interval=[0, 0], start_time=0)
附点音符的使用
你有多种方法可以使用附点音符。首先,音符类型可以使用dotted函数来将音符的长度变为附点音符的长度,可以自定义附点的个数。和弦类型也可以使用dotted函数来将和弦类型中的某个音符,某些音符或者全部音符都变为附点音符,也可以自定义附点的个数,默认情况下和弦类型的音符变为附点音符时只改变音符长度,你也可以设置音符间隔也跟着一起变成附点音符。
除此之外,在使用高级语法和translate函数来构建和弦类型和鼓点类型的时候,也可以使用附点音符,语法为在音符长度或者间隔的后面加上.,可以加上任意多个附点,音符的长度和间隔都会根据你加上的附点的个数进行计算。
a = N('C5')
>>> a.duration
0.25
b = a.dotted() # 获得音符类型a的附点音符(单附点)
>>> b.duration
0.375
c = a.dotted(2) # 获得音符类型a的附点音符(双附点)
>>> c.duration
0.4375
# 和弦类型的dotted函数
dotted(ind=-1, num=1, duration=True, interval=False)
# ind: 变成附点音符的音符的index,可以为一个整数的index,从0开始,
# 或者'all',表示全部的音符都变成附点音符,或者一个index的列表,从0开始,默认值为-1
# num: 附点的个数,默认值为1
# duration: 是否改变音符长度为附点音符的长度,默认值为True
# interval: 是否改变音符间隔为附点音符的长度,默认值为False
a = C('C')
>>> a.get_duration()
[0.25, 0.25, 0.25]
b = a.dotted() # 把和弦类型a的最后一个音符变为附点音符(单附点)
>>> b.get_duration()
[0.25, 0.25, 0.375]
c = a.dotted([0, 2]) # 把和弦类型a的第1个音符和第3个音符变为附点音符(单附点)
>>> c.get_duration()
[0.375, 0.25, 0.375]
a = chord('C5[.8.;.], D5[.8;.], E5[.8.;.], F5[.8;.]')
# 第1个音符和第3个音符为8分音符的附点音符,第2个音符和第4个音符为正常的8分音符
a = translate('C5[.8.;.], D5[.8;.], E5[.8.;.], F5[.8;.]') # 和上面的一样,使用translate函数
重置音符的音高
你可以使用音符类型的reset_pitch函数来重置一个音符类型的音符名称,同时八度保持不变,reset_octave函数来重置一个音符类型的八度,同时音符名称保持不变,reset_name函数通过一个音符名称字符串如C5来重置音符名称和八度。所有这些函数都返回一个具有新的音符音高的新音符实例,而其他属性保持不变。
a = N('C5', duration=2)
b = a.reset_name('A5')
>>> b
A5
>>> b.duration
2
c = a.reset_pitch('E')
>>> c
E5
d = a.reset_octave(3)
>>> d
C3
比较两个音符
当比较两个音符时,如果两个音符相等,说明这两个音符在十二平均律中对应的音高相同,与音名和其他属性无关。如果一个音符小于另一个音符,说明它的音高比另一个音符低。
a = N('C#5')
b = N('Db5')
>>> a == b
True
a = N('C5')
b = N('c5')
>>> a == b
True
a = N('C5')
b = N('D3')
>>> a == b
False
>>> a > b
True