type
Post
status
Published
date
Jan 3, 2022
slug
summary
人生苦短,我用python
tags
python
category
探索新世界
icon
password
完整代码已上传到github
前段时间在给学生讲乐理的时候,有看到这样的一个题型。
下列哪些和弦是不能被构成的。
- #B为根音时的增三和弦
- C为根音的减七和弦
- 降D为三音的大小七和弦
当时候我还没细想,算了一下是
#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(超过了升降记号调整的极限)那么就是无法生成。
开写!
首先把需要的元素列出来。
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作为音程的根音则不能构成大三度。而像小三和弦、增三和弦的三音跟五音都是需要一个大三度的。
- 根据上面的四个音反推一下,很轻易的得知,根音为
#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作为根音才能成为减三和弦。
- 作者:xhhdd
- 链接:https://blog.xhhdd.cc/article/e9321796-fa6d-47e1-bf3e-dae25920ac67
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。
相关文章



