程序员的乐理
1 音符 Note
与音程 Interval
1.1 音符 Note
定义一个音符类 Note
,包含两个成员:音名 name
与升降数 acc
。音名取值于 A
至 G
七个字母,升降数取任意自然数。音符有友好名称:
- 以
Note.name
开头。 - 若
Note.acc
是正数,则添加Note.acc
个"#"
;若是负数,则添加-Note.acc
个"b"
。
例
Note(name="G", acc=-1)
的友好名称是Gb
。
友好名称十分重要,请尽快熟悉音符的友好名称。
1.2 音程 Interval
音程是用来描述两个音符之间距离的度量。例如需要度量音符 C
与 Eb
之间的“距离”是多远?此时就要定义音程概念。
定义一个音程类 Interval
,包含两个成员:度 num
与质量 quality
。度取任意正整数,质量取任意自然数。音程有友好名称:以 Note.num
结尾,前缀由下表给出。
质量 quality | -3 | -2 | -1 | 0 | 1 | 2 |
---|---|---|---|---|---|---|
度 num 模 8 余 1、4、5 或 7 | ddd | dd | d | P | A | AA |
度 num 模 8 余 2、3、6 或 0 | dd | d | m | M | A | AA |
若希望表达更高或更低的质量,叠加 A
或 d
即可。友好名称的规则略微复杂,但也请熟练掌握。
例
Interval(num=3, quality=-1)
的友好名称是m3
,Interval(num=4, quality=1)
的友好名称是A4
。
注 在中文里,P
、M
、m
的名称分别是“纯”“大”“小”。A
、AA
、d
、dd
的名称分别是“增”“倍增”“减”“倍减”。例如 P5
称为“纯五度”,M6
称为“大六度”。
友好名称十分重要,请尽快熟悉音符与音程的友好名称。
1.3 音符的减法、音符与音程的加法
定义两个音符之间的减法运算 Note - Note -> Interval
。返回值 Interval
由下面规则给出:
- 给定字符串
...ABCDEFGABCDEFG...
,返回值的num
是该字符串中,以减数Note.name
开头、以被减数Note.name
结尾的最小子串长度。换言之就是从减数开始,数多少个字母,可以数到被减数。 - 返回值的
quality
是被减数Note.acc
与减数Note.acc
之差。
例
Gb - C = d5
,即Note(name="G", acc=-1) - Note(name="C", acc=0) = Interval(num=5, quality=-1)
。这是因为字符串CDEFG
长度为5
。而quality
是-1 - 0 = -1
。
例
B - C = M7
,即Note(name="B", acc=0) - Note(name="C", acc=0) = Interval(num=7, quality=0)
。这是因为字符串CDEFGAB
长度为7
。而quality
是0 - 0 = 0
。
用相反的方法,可以定义音符与之间的加法运算 Note + Interval -> Note
。
例
C + P4 = F
。这是因为C
开头长度为 4 的字符串CDEF
能“数到”F
,而quality
是0 + 0 = 0
。
例
C + m9 = Db
,是因为C
开头长度为 9 的字符串CDEFGABCD
能“数到”Db
,而quality
是0 - 1 = -1
。
友好名称十分重要,请尽快熟悉音符与音程的友好名称,以及尽快熟练掌握它们的运算规则。
2 和弦 Chord
与音阶 Scale
2.1 和弦 Chord
和弦是按照一定规则排列的至多 7 个音的集合。定义和弦类 Chord
,包含两个成员:根音 root
与和弦音程 intervals
。根音 root
可以是任意音符 Note
,和弦音程 intervals
是长度为 7 的音程元组,每一个元素必须依次为纯一度、某种三度(或空)、某种五度(或空)、某种七度(或空)、某种九度(或空)、某种十一度(或空)、某种十三度(或空)。
例
Chord(C, [P1, M3, P5, M7, M9, None, None])
、Chord(G, [P1, None, None, m7, M9, M11, None])
都是合法的和弦。
和弦音 Chord.notes
是长度为 7 的音符元组,分别是根音、根音加该种三度、该音加该种五度、……、根音加该种十三度。
2.2 和弦的友好名称
P1 | m3d5 | m3P5 | M3P5 | M3A5 |
---|---|---|---|---|
None | dim 减三和弦 | m 小三和弦 | - 大三和弦 | aug 增三和弦 |
d7 | dim7 减七和弦 | |||
m7 | m7 小七和弦 | 7 属七和弦 | aug7 增七和弦 | |
M7 | mM7 小大七和弦 | M7 大七和弦 | augM7 增大七和弦 |