程序员的乐理
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 增大七和弦 |