完整代码已上传到github
点击查看

前段时间在给学生讲乐理的时候,有看到这样的一个题型。

下列哪些和弦是不能被构成的。

当时候我还没细想,算了一下是#B为根音时不能构成增三和弦这个选项。因为#B为根音时,三音就是xD,那么五音最多是xF,也不满足增三和弦大三度+大三度结构的要求。

不过现在写Aurality的时候发现还是得把这些情况都罗列出来。但是网上又没有资料,所以只能自己思考一下。

我用python推导了一下,如果感兴趣的话可以看看下文,我先把结论贴上来。

这个表格可以左右滑动

和弦种类大三和弦小三和弦减三和弦增三和弦大大七和弦大小七和弦小小七和弦减小七和弦减减七和弦
根音xD,xE,xA,xBbbC,bbF,bbG,xBbbC,bbD,bbE,bbF,bbG,bbAxC,xD,xE,xF,xG,xA,xB,#BxD,xE,xG,xA,xBbbC,xD,xE,bbF,xA,xBbbC,bbF,bbG,xBbbC,bbD,bbE,bbF,bbG,bbAbbC,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类。分别是:

  1. 根音不带升降记号
  2. 根音是一个升号
  3. 根音是一个降号
  4. 根音是一个重升记号
  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作为根音则不能构成小三度。

大、小、增、减四类三和弦

刚才的三度已经列举完了,接下来继续考虑这个四种和弦,同样我们分为五类。

  1. 根音不带升降记号
  2. 根音是一个升号
  3. 根音是一个降号
  4. 根音是一个重升记号
  5. 根音是一个重降记号

根音不带升降记号

  • 大、小、增、减四类三和弦都是由三度+三度叠置而成。当根音没有升降记号时,根据上文的结论我们可知,三音只有可能有三种情况,即没有升降记号、有一个升号、有一个降号。
  • 如果三音没有升降记号,那么五音不用考虑,自然也是三种情况。所以主要考虑一下三音带一个升号或带一个降号的情况。根据上文的推断很容易知道,五音可能会出现重升或重降记号。但是也没有关系,是可以构成的和弦。

综上所述,本类的四种和弦都是可以构成的。

根音是一个升号

  • 如果根音带有一个升号,同样先考虑三音的情况。根据上文的推断,三音可能是没有升降记号、一个升号、一个重升记号。
  • 三音如果是无升降记号、一个升号这两种情况,那自然是不需要考虑的,根据上文可知是一定能构出的和弦。但是如果三音是一个重升记号,那么就要注意了!因为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时不能构成小三和弦。

最后总结一下。

  1. 大三和弦:根音为xD,xE,xA,xB时不能构成大三和弦。
  2. 小三和弦:根音为xB,bbC,bbF,bbG时不能构成小三和弦
  3. 增三和弦:根音为重升或者#B时不能构成增三和弦。
  4. 减三和弦:如果根音为重降记号,那么只有bbB作为根音才能成为减三和弦。

最后修改:2022 年 01 月 03 日
如果觉得我的文章对你有用,请随意赞赏