前段时间在给学生讲乐理的时候,有看到这样的一个题型。
下列哪些和弦是不能被构成的。
当时候我还没细想,算了一下是#B为根音时不能构成增三和弦
这个选项。因为#B为根音时,三音就是xD,那么五音最多是xF,也不满足增三和弦大三度+大三度结构的要求。
不过现在写Aurality的时候发现还是得把这些情况都罗列出来。但是网上又没有资料,所以只能自己思考一下。
我用python推导了一下,如果感兴趣的话可以看看下文,我先把结论贴上来。
这个表格可以左右滑动
和弦种类 | 大三和弦 | 小三和弦 | 减三和弦 | 增三和弦 | 大大七和弦 | 大小七和弦 | 小小七和弦 | 减小七和弦 | 减减七和弦 |
---|---|---|---|---|---|---|---|---|---|
根音 | xD,xE,xA,xB | bbC,bbF,bbG,xB | bbC,bbD,bbE,bbF,bbG,bbA | xC,xD,xE,xF,xG,xA,xB,#B | xD,xE,xG,xA,xB | bbC,xD,xE,bbF,xA,xB | bbC,bbF,bbG,xB | bbC,bbD,bbE,bbF,bbG,bbA | bbC,bC,bbD,bbE,bbF,bF,bbG,bbA,bbB |
以上的例举了一些常见的和弦,如表所示,当根音为xD,xE,xA,xB
时均不能构成大三和弦。
实现思路
那么写个什么样的程序来推导呢?
我觉得不能构成的和弦,其实就是升降记号到了极限,无能为力。如上文中的例子#B为根音时不能构成增三和弦
,就是因为五音最多只能xF
但是依旧不能满足三音与五音形成大三度的条件。
所以我的思路就是,在同样的根音下,生成一个正常的和弦,然后再生成一个只有对应音级的和弦(即没有升降记号的)。接着两个进行对比,如果后者需要添加超过重升或重降的记号,那就视为无法生成。
- 首先音都要转换成数字的方式来表示,
C
就是1,#C
就是2,D
就是3...所以升降记号能做的极限就是加上或减去数字2,即重升重降的效果。 - 因为同一种和弦,结构是一样的。如大三和弦根音与三音的音数之差就是4,三音与五音之差就是3。通过这个原理,我们输入根音,再输入和弦的种类,就可以知道和弦应该由哪几个音构成(数字形式)。比如我们输入
C
,大三和弦
,那么得出来的结果应该是[1,5,8]即C-E-G
- 接下来再生成一个不带升降记号的和弦,与之对比。如果差值的绝对值超过了2(超过了升降记号调整的极限)那么就是无法生成。
- 举一个例子,首先我生成一个根音为#B的增三和弦。那么得出第一个和弦列表[13,17,21]即根音为#B,三音为xD,五音为#xF(好吧,没有这个记号,但总之就是把xF再升高一次)
- 接下来在生成一个不带升降记号的和弦列表,[12,15,18]即B-D-F三个音。
- 最后两个列表比较一下,发现最后21-18=3,超过了2,也就是超过了升降记号能处理的能力。所以和弦不能生成。
开写!
首先把需要的元素列出来。
base_note=['c','d','e','f','g','a','b','c1','d1','e1','f1','g1','a1','b1']
base_note_num=[1,3,5,6,8,10,12,13,15,17,18,20,22,24]
sharpe_flat_kind=['','sharpe','double_sharpe','double_flat','flat']
sharpe_flat_num=[0,1,2,-2,-1]
音我弄了两组,因为过会生成和弦的时候可能会用到高八度的音,不过我就验证个结论,就手打两组好了。(好叭,高级一点方法我不是很会)
然后写一个能得到任意音数字形式的函数
def convert_note_num(root_note,sharpe_flat):
note_num=base_note_num[base_note.index(root_note)]
sharpe_flat_num=sharpe_flat_num[sharpe_flat_kind.index(sharpe_flat)]
note_num_all=note_num+sharpe_flat_num
接下来我们在数字的范畴上先构一个和弦。比如说三和弦,C-E-G
那么根音与三音的音数之差固定为4,三音与五音则是为3。我们把其他的和弦也一一列举一下:
- 大三和弦:4+3
- 小三和弦:3+4
- 减三和弦:3+3
- 增三和弦:4+4
- 大大七和弦:4+3+4
- 大小七和弦:4+3+3
- 小小七和弦:3+4+3
- 减小七和弦:3+3+4
- 减减七和弦:3+3+3
接着写出一个函数。
def create_chord_num():
# 先把根音转换成数字
note_num=convert_note_num(root_note,sharpe_flat)
# 罗列不同种类的和弦
if chord_name=='major':
add_l=[4,3]
if chord_name=='minor':
add_l=[3,4]
if chord_name=='dim':
add_l=[3,3]
if chord_name=='aug':
add_l=[4,4]
if chord_name=='major_seventh':
add_l=[4,3,4]
if chord_name=='dominant_seventh':
add_l=[4,3,3]
if chord_name=='minor_seventh':
add_l=[3,4,3]
if chord_name=='dim_minor_seventh':
add_l=[3,3,4]
if chord_name=='diminished_seventh':
add_l=[3,3,3]
# 形成一个和弦的数字列表
chord_num_l=[note_num]
for v1 in add_l:
note_num+=v1
chord_num_l.append(note_num)
return chord_num_l
接着再写出不带升降记号的和弦应该是怎样的数字形式。
def chord_to_base_note_num():
# 根据和弦种类求出还需要哪几个基本音级
v1=base_note.index(root_note)
chord_base_l=[root_note]
if chord_name in triad_chord:
for i in range(2):
v1+=2
chord_base_l.append(self.base_note[v1])
if chord_name in seventh_chord:
for i in range(3):
v1+=2
chord_base_l.append(base_note[v1])
# 根据基本音级的列表转换成数字
chord_base_note_l=[]
for v2 in chord_base_l:
chord_base_note_l.append(convert_note_num(v2,''))
return chord_base_note_l
最后这两个列表一一比较,如果差值超过2,那肯定就是不能构成的和弦了。
def compare_list():
l1=create_chord_num()
l2=chord_to_base_note_num()
# 对两个列表进行比较,如果差值超过2,那么就是不能生成的情况。
error_l=[]
for v1,v2 in zip(l1,l2):
if abs(v1-v2)>2:
error_l.append('fail')
else:
error_l.append('normal')
return error_l
在用程序书写之前,我自己也手动推算过,结果也是对的,不过真的是劳心劳力....
不能构成的音程
在考虑不能构成的和弦之前,我们先考虑一下不能构成的音程。
无论是三和弦还是七和弦都是由大三度或小三度叠置而成。如果有些情况下不能构成大三度或小三度,那么对应的和弦自然也无法构成。
大三度与小三度
有没有什么音是不能往上构一个大三度或小三度的呢?
我们先采取一个非常简单的罗列法,把现有的情况分成5类。分别是:
- 根音不带升降记号
- 根音是一个升号
- 根音是一个降号
- 根音是一个重升记号
- 根音是一个重降记号
在分情况讨论之前,我们先明确一点,那就是大小三度的转换只需要升高或降低冠音即可。
根音不带升降记号
没有升降记号的音也就是基本音级,那么往上三度(不加升降记号)只有大三度或者小三度两种情况。比如C-E
大三度,B-D
小三度。
可以全部变成大三度吗?
当然是可以的,只需要给小三度
冠音添加升号即可。可以全部变成小三度吗?
当然也是可以的,只需要给大三度
冠音添加降号即可。
综上所述,本类的所有音都可以往上构大三度或小三度
根音是一个升号
如果说音都带了升号,那么往上三度(不加升降记号)的音程可能会出现减三度。比如说#D-F
。这个我们的思考带来了太多的变量。所以不妨把所有的音都往上三度,并且这个音程的冠音都是添加了一个升号
的,如#D-#F,#E-#G...
我们会发现其实跟没有升降记号的音
的情况是一致的,也是会出现大三度或小三度两种情况。
可以全部变成大三度吗?
需要把小三度
的冠音再次升高,虽然现在所有的冠音都有升号,但是再次升高也没有问题,只需要写重升记号就行。可以全部变成小三度吗?
需要把大三度
的冠音降低,现在的冠音都是有升号的,所以改成还原记号即可。
综上所述,本类的所有音都可以往上构大三度或小三度
根音是一个降号
与上一类一样,我们把所有的往上三度,并且这个音程的冠音都添加了一个降号
。如bD-bF,bE-bG...
那么也是会出现大三度或小三度两种情况。
可以全部变成大三度吗?
需要把小三度
的冠音升高,现在所有的冠音都有降号,所以变成还原记号即可。可以全部变成小三度吗?
需要把大三度
的冠音降低,现在的冠音都是有降号的,所以需要写重降记号。
综上所述,本类的所有音都可以往上构大三度或小三度
根音是一个重升记号
与上一类一样,我们把所有的往上三度,并且这个音程的冠音都添加了一个重升记号
。如xD-xF,xE-xG...
那么也是会出现大三度或小三度两种情况。
可以全部变成大三度吗?
肯定是不行的。这类情况有小三度
,如果要变成大三度
则要再次升高,但是音程的冠音已经是重升了,没有办法再次升高了。我们很轻松的得出,所有的小三度都没有办法变成大三度。也就是xD,xE,xA,xB
作为根音的四种情况。可以全部变成小三度吗?
当然是可以的,因为这里需要的是降低大三度
的冠音,把重升变成升就行。
综上所述,本类的xD,xE,xA,xB
作为根音是不能构成大三度。
根音是一个重降记号
与上一类一样,我们把所有的往上三度,并且这个音程的冠音都添加了一个重降记号
。如bbD-bbF,bbE-bbG...
那么也是会出现大三度或小三度两种情况。
可以全部变成大三度吗?
当然是可以的。只需升高小三度
的冠音,把重降变成降号即可。可以全部变成小三度吗?
当根音是bbC,bbF,bbG
则不行,因为音程的冠音已经是重降记号不能再次降低了。
综上所述,本类的bbC,bbF,bbG
作为根音是不能构成小三度。
最后总结一下,如果是xD,xE,xA,xB
作为根音则不能构成大三度,如果是bbC,bbF,bbG
作为根音则不能构成小三度。
大、小、增、减四类三和弦
刚才的三度已经列举完了,接下来继续考虑这个四种和弦,同样我们分为五类。
- 根音不带升降记号
- 根音是一个升号
- 根音是一个降号
- 根音是一个重升记号
- 根音是一个重降记号
根音不带升降记号
- 大、小、增、减四类三和弦都是由三度+三度叠置而成。当根音没有升降记号时,根据上文的结论我们可知,三音只有可能有三种情况,即没有升降记号、有一个升号、有一个降号。
- 如果三音没有升降记号,那么五音不用考虑,自然也是三种情况。所以主要考虑一下三音带一个升号或带一个降号的情况。根据上文的推断很容易知道,五音可能会出现重升或重降记号。但是也没有关系,是可以构成的和弦。
综上所述,本类的四种和弦都是可以构成的。
根音是一个升号
- 如果根音带有一个升号,同样先考虑三音的情况。根据上文的推断,三音可能是没有升降记号、一个升号、一个重升记号。
- 三音如果是无升降记号、一个升号这两种情况,那自然是不需要考虑的,根据上文可知是一定能构出的和弦。但是如果三音是一个重升记号,那么就要注意了!因为
xD,xE,xA,xB
作为音程的根音则不能构成大三度。而像小三和弦、增三和弦的三音跟五音都是需要一个大三度的。 - 根据上面的四个音反推一下,很轻易的得知,根音为
#B
的增三和弦,三音为xD
,五音没法满足条件。
综上所述,本类有一种和弦无法被构成,即根音为#B
的增三和弦。
根音是一个降号
- 如果根音带有一个降号,三音会是无升降记号、一个降号、一个重降记号三种情况。
- 当三音为带有重降记号的音时,要注意
bbC,bbF,bbG
作为音程根音是不能构成小三度。而像大三和弦、减三和弦,三音与五音则需要小三度。 - 根据上面三种情况反推一下,没有情况是契合的。
综上所述,本类中所有的和弦都可以被构成。
根音是一个重升记号
- 如果根音是一个重升记号,那么
xD,xE,xA,xB
作为根音则不能构成大三度,也就无法构成大三和弦与增三和弦。当然,三音也只有两种情况,即重升记号、一个升记号。 - 如果三音是升记号,肯定可以构成所有和弦。如果是重升记号,也是
xD,xE,xA,xB
作为根音则不能构成大三度。即小三和弦、增三和弦不能构成。 - 根据上面4种情况反推一下,即根音为
xB
时不能构成小三和弦。根音为xC,xF,xG
时不能构成增三和弦。
综上所述,本类所有的增三和弦
无法构成,根音为xD,xE,xA,xB
时不能构成大三和弦,根音为xB
时不能构成小三和弦。
根音是一个重降记号
- 如果根音是一个重降记号,那么
bbC,bbF,bbG
作为根音则不能构成小三度,也就是说不能构成小三和弦与减三和弦。当然,三音也只有两种情况,即重降记号、一个降号。 - 如果三音是降记号,肯定可以构成所有和弦。如果是重降记号,那么
bbC,bbF,bbG
则不能构成小三度,即不能构成大三和弦,减三和弦。 - 通过上面3种情况反推一下,即根音为
bbA,bbD,bbE
时不能构成减三和弦。
综上所述,只有根音为bbB
时能构成减三和弦,根音为bbC,bbF,bbG
时不能构成小三和弦。
最后总结一下。
- 大三和弦:根音为
xD,xE,xA,xB
时不能构成大三和弦。 - 小三和弦:根音为
xB,bbC,bbF,bbG
时不能构成小三和弦 - 增三和弦:根音为
重升
或者#B
时不能构成增三和弦。 - 减三和弦:如果根音为重降记号,那么只有
bbB
作为根音才能成为减三和弦。
4 条评论
肥佬太强了!!!
一下子不知道到底谁才是计算机专业
嘻嘻嘻嘻