是否承认「和弦功能」的实质在于是否承认音乐有平移不变性

我在之前写的文章里提过,西方音乐思维的闪光点是其高度的抽象概括能力:

作曲技术理论发展到极致,将会变成一种怎样的形态??

www.zhihu.com图标

「和弦功能」是音乐抽象思维的经典案例。如果没有功能的概念,你在C大调看到的C和弦,在D大调看到的D和弦,在F大调看到的F和弦等等,它们都是不一样的和弦。引入功能的概念后,所有这些和弦在它们各自的调里都有了同样的功能:主功能(在斯波索宾体系下标记为T)。

换言之,有了功能的概念后,我们能用一套音乐思维逻辑应对全部24个大小调。套用机器学习的术语,这叫「归一化」。如果人类的音乐思维是一个认知模型,归一化的方法大大提高了模型的推广能力,让你只需学会一个调的和弦编配方法,就等于掌握了所有调的和弦编配方法。这就是「和弦功能」的牛逼之处。

所以,问题的关键不在「共同音转调」——功能和声与非功能和声都会借助共同音转调,问题的关键在平移不变性假设是否work。C大调里C和弦的用法和G大调里G和弦的用法是一致的吗?认为一致就是承认平移不变性假设,反之,就是不承认。

验证音乐的平移不变性假设在过去基本是不可能的。因为科学研究里最重要的方法是控制变数法,对照组之间应该只有一个要素是不同的,这样你才能确切地知道这个要素起到了什么作用。我们不可能找到一个人,让他先用功能思维配和弦,然后清空他大脑里所有关于和声功能的知识,再让他重新配一版,看看结果有什么不同。对照实验做不了,我们就没办法知道「和弦功能」在配和弦过程中究竟起到了什么作用。

幸运的是,我们生在了人工智慧时代,我们可以为过去的大师建模,让大师亲自为我们演示使用和弦功能和不使用和弦功能之间的差异!

为了回答这道题,我也是拼了,决定为大师建模:

图1 Johann Sebastian Bach

之所以为巴赫建模,是因为巴赫留下来一套众赞歌曲集,至今都被认为是和声写作的范例:

图2 bwv 66.6(局部)

接下来,我将为大家演示如何用机器学习大师的作品,给旋律配和弦。为了照顾音乐专业背景的同学,我不会罗列数学公式,并尽量用轻松简明的方式讲解。同时附上源代码,方便会编程的同学复现。对原理不感兴趣的同学也不要弃文,我制作了用机器学习给旋律配和弦的小demo,可以翻到后面看一看,还是挺有趣的。在很多人眼里,用人工智慧做音乐或许是个挺神秘的事,今天就用这个小例子带大家一窥究竟,让我们现在开始吧~

1. 数据准备

图2里的谱子是没办法直接拿来给机器学习的,必须首先从中提取有用的信息,这一步在机器学习中被称为「特征提取」(Feature extraction):

图3 从和弦化后的bwv 66.6中提取特徵音

安装Python包music21后,我把它自带的巴赫数据集全部433首作品都做了和弦化,从中提取旋律音、根音和三音作为模型的训练数据备用:

from music21 import *
import numpy as np

sequences = []

for path in corpus.getComposer(bach):
s = corpus.parse(path)
bChords = s.chordify()
seq = []
for c in bChords.recurse().getElementsByClass(Chord):
chord_class = c.root().pitchClass + 12 if c.isMinorTriad() else c.root().pitchClass
seq.append((chord_class, c.pitches[-1].pitchClass))

sequences.append(seq)

2. 模型设计

图4 模型的结构设计

懂演算法的同学一眼就能看出这是个隐马尔科夫模型(Hidden Markov Model,HMM),但学音乐的同学不需要知道这些。你只需要知道我们同时建模了和弦进行以及和弦同旋律音之间的关系(即「协和性」),配和弦的时候,既要考虑旋律音是什么,也要考虑前面一个和弦是什么(代码来自GitHub[1]):

class HMM:
#constructor
#transition_probs[i, j] is the probability of transitioning to state i from state j
#emission_probs[i, j] is the probability of emitting emission j while in state i
def __init__(self, transition_probs, emission_probs):
self._transition_probs = transition_probs
self._emission_probs = emission_probs

#accessors
def emission_dist(self, emission):
return self._emission_probs[:, emission]

@property
def num_states(self):
return self._transition_probs.shape[0]

@property
def transition_probs(self):
return self._transition_probs

#the Viterbi algorithm
def viterbi(hmm, initial_dist, emissions):
probs = hmm.emission_dist(emissions[0]) * initial_dist
stack = []

for emission in emissions[1:]:
trans_probs = hmm.transition_probs * np.row_stack(probs)
max_col_ixs = np.argmax(trans_probs, axis=0)
probs = hmm.emission_dist(emission) * trans_probs[max_col_ixs, np.arange(hmm.num_states)]

stack.append(max_col_ixs)

state_seq = [np.argmax(probs)]

while stack:
max_col_ixs = stack.pop()
state_seq.append(max_col_ixs[state_seq[-1]])

state_seq.reverse()

return state_seq

3. 学习策略

这一步是关键。为了验证「和弦功能」的存在性,我们用两种方式训练模型:一种根据「平移不变性」假说做数据增强,一种不做数据增强。

先说不做数据增强的情况。就是简单地统计一下和弦转移矩阵以及和弦发射矩阵:

transition_matrix = np.zeros((24, 24))
emission_matrix = np.zeros((24, 12))
initial_dist = np.zeros(24)

for s in sequences:
for a,b in zip(s[:-1], s[1:]):
transition_matrix[a[0], b[0]] += 1

for p in s:
emission_matrix[p[0], p[1]] += 1
initial_dist[p[0]] += 1

initial_dist /= initial_dist.sum()
row_sums = transition_matrix.sum(axis=1) + 1e-6
transition_probs = transition_matrix / row_sums[:, np.newaxis]
row_sums = emission_matrix.sum(axis=1) + 1e-6
emission_probs = emission_matrix / row_sums[:, np.newaxis]

我们把学习到的和弦转移矩阵以及和弦发射矩阵可视化出来看:

图5 和弦转移矩阵

和弦转移矩阵刻画的是模型中和弦进行的部分。纵坐标是前一个和弦,横坐标是后一个和弦,图中每一个格子代表从前一个和弦进行到后一个和弦的概率,颜色越深代表概率越大。因为我们只建模了和弦的根音和三音,所以可用的和弦有24种(12个大三和弦,12个小三和弦)。

从图5中能够明显看出,巴赫偏爱使用大三和弦,无论前一个和弦是大三和弦还是小三和弦,下一个和弦跳转到小三和弦的概率都很低。所以可以预期,这个模型也会偏爱使用大三和弦给旋律配和声。

图6 和弦发射矩阵

和弦发射矩阵刻画的是模型中协和性的部分。纵坐标代表每一个可能出现的和弦,横坐标表示12个可能出现的音级,每个格子显示旋律音在背景和弦下的出现概率,颜色越深表明概率越大。图6清晰地显示,当旋律音是和弦组成音的时候,出现概率较高,这符合我们日常的音乐经验。

再来看应用「平移不变性」假设增强训练数据的情况。我们通过移调让每个作品都出现在所有12个调上:

transition_matrix = np.zeros((24, 24))
emission_matrix = np.zeros((24, 12))
initial_dist = np.zeros(24)

for s in sequences:
for i in range(12): # 移调12次
for a,b in zip(s[:-1], s[1:]):
pre = (a[0] + i) % 12 if a[0] &< 12 else (a[0] + i) % 12 + 12 post = (b[0] + i) % 12 if b[0] &< 12 else (b[0] + i) % 12 + 12 transition_matrix[pre, post] += 1 for p in s: pre = (p[0] + i) % 12 if p[0] &< 12 else (p[0] + i) % 12 + 12 post = (p[1] + i) % 12 emission_matrix[pre, post] += 1 initial_dist[pre] += 1 initial_dist /= initial_dist.sum() row_sums = transition_matrix.sum(axis=1) + 1e-6 transition_probs = transition_matrix / row_sums[:, np.newaxis] row_sums = emission_matrix.sum(axis=1) + 1e-6 emission_probs = emission_matrix / row_sums[:, np.newaxis]

这时候调性之间的差异就被消除了,和弦转移矩阵以及和弦发射矩阵都变得均匀了:

图7 数据增强后的和弦转移矩阵
图8 数据增强后的和弦发射矩阵

4. 和弦预测

接下来就可以给旋律配和声了。之前我已经实现了一个旋律自动生成器,加上现在的自动配和声程序,我们已经有了一个初步的演算法作曲模型了:

有哪些与中国有关的音乐风格??

www.zhihu.com图标

大概没有人想过巴赫为中国民歌配和声这样无厘头的事,但借助演算法作曲模型,这样荒诞的场景居然成为现实了!让我们赶紧体验一下效果:

mf = midi.MidiFile()
mf.open(markov-chain.mid)
mf.read()
mf.close()
m = midi.translate.midiFileToStream(mf)
emissions = [n.pitch.pitchClass for n in m.flat.notes]
hmm = HMM(transition_probs, emission_probs)
cs = viterbi(hmm, initial_dist, emissions)

for i, n in enumerate(m.flat.notes):
cn = note.Note(cs[i]-12).name+m if cs[i] &>= 12 else note.Note(cs[i]).name
n.addLyric(cn)

m.write(xml,markov-chain.xml)

使用MuseScore插件[2],可以把和弦标签自动转为四部和声:

和声版本1和声版本2

版本2的调性感明显要比版本1强得多,甚至可以说,版本2对于调性中心的坚持已经达到了一种偏执的程度,不仅首末和弦都落在了主和弦上,连第二小节第三拍这种明显不和谐的情况都强行用了一个主和弦。反观版本1对于调性的坚持就弱得多,整首曲子明显感觉调中心在移动,最后的终止式也没收住,让人感觉曲子没完。

但若论艺术效果,版本1则要强于版本2,因为我们的旋律是由为汉族民歌建模的马尔科夫链生成的,没有明确的调性中心。这符合民歌没有主音的特点,它们的调性中心游移不定,学界管这种现象叫「调式交替」。版本1的和声有一种脚踩西瓜皮,溜到哪里算哪里的感觉,与民歌的调式感相合,所以综合来看,版本1胜出。

5. 结论

「功能和声」与其说是一种作曲技术,不如说是一种作曲风格。借助「和弦功能」作曲,天然会加强调性中心的地位,形成一种鲜明的调性风格。这点在我们「控制变数法」的和声编配实验中得到证实。

实验中,我们用移调的方法增强训练数据,使得训练样本之间的调性差异消失。结果训练得到的模型能够配出非常典型的「I IV V I」和声进行,印证了和声教科书中关于功能进行的理论。

所以,作曲的时候应该联系作曲的意图使用功能和声理论。你是想写成强中心的还是弱中心的?是调性的还是调式的?如果你天然厌恶调性音乐,听到古典音乐就想吐,你当然不需要坚持和弦功能,功能和声于你而言就是音乐的毒药。关于调性思维调式思维的分野,樊祖荫教授在其《中国五声性调式和声写作教程》中有精彩论述,大家有兴趣可以去看。因为我的级别不够,没法带货,就不放购买链接了,网上应该一搜就能找到。

我是一个致力用人工智慧做音乐的博士生,欢迎大家点赞关注~


有热心观众 @Raymond 表示不服,要给模型「极限施压」,用最极端的旋律「刁难」模型。我想这是一个测试模型推广能力的好例子,下面是用未做数据增强版本的模型的测试结果,大家觉得模型干得怎么样?欢迎在评论区留下你的意见。

测试旋律1的结果国得杰的视频 · 161 播放测试旋律2的结果国得杰的视频 · 270 播放

参考

  1. ^Hidden Markov Models in various languages https://github.com/AustinRochford/hmm
  2. ^MuseScore 3 plugin that expands chord symbols into notes. https://github.com/markshepherd/ExpandChordSymbols


老师的问题永远富有创意和深度!我想从老师提问的本身回答一下这个问题:似乎转调已经开始抛弃和声功能了,引导音和线条在转调中的角色已取代和声功能成为重中之重 …… 那么事实是否这样呢?」对这一个问题,首先我的结论是:事实不尽然是这样的。

我想从线性进行在调性转移中的运用及线性进行与和声功能的关系这个方面进行讨论:

——————————————

对于这个问题而言,老师认为「线条」「引导音」的概念与「功能」的概念是对立统一关系,那么事实上真的是这样的吗?下面举三个共性写作时期转调形态的例子:(所谓「线条」即「线性进行」,一般指二度关系的连续进行)

可以很明显看出,从形态上讲以上三个例子均是在「引导音」进行下的调中心转移,均可见明显的线性进行(第一例左手B-A-#G,第二例左手D-C-B-#A,第三例左手E/G-D/F-C/E及左手A-bB-C),同时从手法上讲三例均是同和弦转调(自然-自然),能明显的看到前后调性的功能性进行。在这里线性进行跟功能的关系似乎并不是对立关系!要讨论两者之间的关系,我们需要回到共性写作时期之前,分析共性写作时期之前的调性转移形态,并对此进行分析。

杰苏阿尔多《牧歌》

上例选择文艺复兴时期杰苏阿尔多《牧歌》片段,可以看到在d多利亚调式过渡到#f爱奥里亚调式的过程中,采用的是半音化线性进行,同样在#f爱奥里亚调式过渡到a爱奥里亚调式的过程中,低音采用了半音化线性进行。由于时代特点,半音化形式主要表现在局部声部的半音化线条,这点区别于现代和声进行的观点,但是可以看出在那个时期作者已经有意识的在调性转移的过程中采用线性进行。

巴赫《圣咏》

而到了巴洛克早期,巴赫圣咏中调性转移则更富于线性进行。上例中由e弗里吉亚调式转换至a爱奥里亚调式过程中,同样采用了线性进行。在女高(D-C),男高(C-B),男低(#f-#G)声部分别形成了三个线性进行的线条。从以上两个例子中不难发现,在功能和声理论诞生之前,调性转移的过程中作曲家就已经有意识的采用了线性进行!这点可以得出第一个结论:

线性进行并非随著功能和声体系的发展而发展而是一种诞生于功能和声体系以前的声部思维。

谈到调性转移,首先确定的是我们讨论的是调性音乐的范畴。这里想必很多答主都模糊了两个概念,也就是功能与调性的概念。认为调性音乐存在功能也就存在,这是一种比较狭隘的观点。关于功能与调性的具体含义及区别,我在很多回答中均有分析,不做赘述。既然追溯到线性进行的来源,同样我们有必要对功能瓦解之后的调性转移形态进行分析。

德彪西《佩利亚斯与梅丽桑德》(修正:第三个和平行进行和弦为bEm)

功能瓦解之后的调性陈述方式主要有以下两种:1.通过持续音/固定音型和重复音来强调调中心音。2.通过带有调中心音的音阶组合(五声/六声/八声/全音阶及七种教会调式)确定调中心音。在上例德彪西《佩利亚斯与梅丽桑德》中,调性由持续音所陈述,调性片段的转移由半音化线性进行衔接完成(选段之前为平行和声进行,无明确调性)以德彪西为代表的浪漫主义晚期作品中,大量的三/七/九和弦平行进行,在模糊调性的同时实现了调性的转移。而从形态上看,各声部的线性进行是平行和声最大的特点。

巴托克《小宇宙》

而在巴托克的《小宇宙》中,由于调性复合的手法,调中心的转移是跟随著调式音阶的变化发生的。第一行右手部分出现的是全音阶WT0(C-A复合调性),右手为其发生下三度平移的移位等同音阶WT1(A-#D复合调性)。而到了第二行出现材料b,手法与第一行如出一辙,只是双手的复合调性中心转移到了bG-C与bE-A。这里的调性转移未出现明显的线性进行。所以这里我们可以得出第二个结论:

调性的转移过程与作者思维手法的内容一致而并非与线性进行或者功能进行的形式一致。

老师作为硕士,想必对一个概念十分熟悉,就是内容与形式的辨证统一关系:内容是事物一切内在要素的总和。形式是这些内在要素的结构和组织方式。作曲家在创作中进行调性转移,调中心的改变是内容,功能进行/线性进行或者其他都是形式。回到老师的例子中可以发现,老师所举例子中的转调过程具有相对清晰的功能进行。那么为什么相对于非功能性的调性陈述方式,功能性的调性陈述方式更容易形成局部或者所有声部的线性进行呢?大家入门所用的和声学教程给予了我们暗示:

《和声学教程》谱例中的局部或多声部线性进行

可以很明显的发现,在《和声学教程》的谱例中有很强的功能进行及明显的线性进行。众所周知,调性的建立,功能体系的完善是一个非常漫长但连续的过程,这里面涉及到长久以来人们的听觉习惯及作曲家的创作实践。根据我们之前的分析可以发现,线性进行形成于功能体系之前。而功能体系的完善是否跟线性进行的创作习惯具有相关性呢?这也许是一个值得深入研究的课题,我也会在进后在这方面做进一步的研究。现在我们进行一个全面的总结:

————————————

1.「当代音乐的转调中重视「共同音和线条」,「和弦功能」被忽视」。老师给出的这个命题的正确性(或说准确性)是值得推敲的。功能性和声进行也包含大量的线性进行。

2.在转调过程中「线性进行」与「功能」并不是对立统一的辩证关系,而是同属于「形式」的范畴。功能体系的扩张和瓦解,来自于和声思维和创作手法的辩证否定及推陈出新的「内容」(甚至相反在调性音乐/功能性进行中能看到更多线性进行的例子,无调性时期韦伯恩/勋伯格等作品中则很难看到线性进行的例子)

3.而这个问题的根本原因则在于线性进行往往与功能进行中的声部进行契合。无调性音乐因为避免调性的暗示在声部进行方面往往不会长时间二度进行从而产生线条。

4.线性进行思维不是打破功能的必然因素。是否是推动功能体系形成与完善的因素则有待进一步研究。


先从瓦格纳这首序曲开始说起吧。

这首序曲的明显特征之一即为属和弦的「无家可归」,即各调并非由主和弦呈示,而是由属和弦暗示

全曲的调式布局由此句概括,a为全曲主音,其余各调的主音建立在以a为根音的三和弦上,辅以同主音调同中音调之对比。

题例中的转调应该发生在这里:

大致转调流程:

  • 从宏观上看,这个转调是以三度关系为核心的调式布局的一部分;
  • 和声语言上,仍是传统的手法,但作者借助半音素材,得以引导大量的意外进行、不解决的延留音与七音——这是全曲的声部特征;
  • 从转调细节上的审视,可再对比参考上文两处:

瓦格纳这部作品,从作曲家自己的创作历程上看,是写在「漂泊的荷兰人」、「唐豪舍」和「罗恩格林」这三部歌剧之后;从浪漫派和声素材的发展来看,之前每一位作曲家的积极探索都为此作的诞生提供了土壤。例如肖邦的半音化:

肖邦玛祖卡 Op.30 No.4

例如舒伯特在同主音调式交替上的探索:

舒伯特即兴曲 Op.90 No.4

同样,「特里斯坦与伊索尔德」为之后作曲家的创作更是带来了无尽启示,围绕此作,彼时作曲家们的探索,即为对「调性」的拓展与颠覆。功能和声作为一种「等级制度」的体现,是维护调性权威的有力武器,体现了调性的发展历程。

「功能」和「调性」是相互统一的,调性为中心,功能为手段,不管是维护中心还是分离中心,不管是强调中心还是淡化中心,不管是一个中心还是多个中心,只要「调性」这个因素还存在,「功能和声」便有施展之地。经过几百年间的拓展,功能和声早已开发出了丰富的语汇,和调性形成各种方式的对立与统一。

这里需要说明的是,「功能」是双刃剑,它可以维护调性,自然也可分离调性,瓦格纳这首序曲,便利用了功能和声的特点使调中心一直在游移漂浮。调性的成立,是依托于音与音之间的不平等关系上的,这种不平等关系即为「功能」,就好像一个手握兵权的将军,他可以维护旧皇帝,也可以拥立新主,功能与调性的稳固,此二者并不存在直接关系。

多说一点,音与音之间的不平等关系,可以体现在传统的四五度上,也可以体现在三度上,某种角度上讲也可以体现在二度上,这方面,几百年间的作曲家们作了大量的拓展与探索,这里就不展开了。宽泛地讲,但凡是通过区分音的地位以和调性展开互动的,都可以算作功能和声的范畴。

当代的流行音乐,尽管种类手法繁多,但能够完全彻底地抛弃「调性」因素的,却也不那么多。在各种有调性参与的音乐中,和声手段不管多么五花八门,多么标新立异,实际上大都能在百年前的功能和声中找到根源。研究功能和声,要研究其全貌。全面地了解功能和声的发展,对当代音乐的解读和创作,都有著重要意义。


谢邀。自分现在没人在乎转调怎么转了……

古典音乐最常见的纯五度转调,最功能也最有共同音。

流行音乐最常见的上下半音转调,没共同音。至于功能,C大调里面B和弦、C#和弦有没有功能?这个问题的答案决定了这种转调有没有功能。无论如何,它能达到立刻把情绪提上来的效果。还有一个技巧是用降六级和弦取代一级和弦,这个和弦对于下一个乐段就是五级,这样也就有功能了。

其次常见的是上下全音转调。可以说介于二者之间。这就是为什么当代流行音乐里面都快灭绝了。想要效果惊艳点的都去做半音或者大小三度转调了。

然而大三度转调有请贝多芬。小三度转调,私第一个想到的是巴赫的那首小提琴组曲。

私试验过三全音转调。这是从三全音代理的功能角度出发的,所以算是有功能没共同音。方法是用属和弦接三全音距离的下一个乐段的主和弦。不过私的旋律不大适合做这个。最近发现ZUN早就做过而且做的比私强多了……

Key Changes in Touhou Music?

youtu.be

这个问题的问题在于,哪些进行属于非功能进行?全功能/色彩和声理论告诉我们,任何进行都可以是功能进行。题主之前回答过关于色彩和声的问题,对这一点肯定了然于心了。

私还是选择从调律的角度搞事情,通过认识到十二平均律不只是十二平均律就可以解构转调理论。

观察巴洛克以降的音乐史,下面的结论很明显:当前的调性音乐虽然用十二平均律来调音,但实际上创作思维是中庸全音律的。十二平均律是中庸全音律的一个特例。我们的大小调音阶就是七音中庸全音音阶(meantone[7])。中庸全音律的生程(generator)是纯五度决定了纯五度之间是「近关系调」。那我们现在依然用这种调音,但选择生程不是纯五度的调律(这不符合传统意义上的调性,但也决不是无调性),其「近关系调」自然也不是纯五度咯。

大三度转调,转了增律(augmented)周期的一步。小三度转调,同理是减律(diminished)周期的一步。就算是小二度,私说这是毕氏调律(pythagorean/aristoxenean)周期的一步。这些不也是「近关系调」么。这里「近关系调」的定义被延拓了。现在再看转调理论,哈哈哈。


同觉得谱子上的G7-Fm有误

根据我的扒带经验,这里是G7-Gb/Ab然后接到新的调Db(经评论区提醒F#写成Gb更合理,下同)

这里是一个斜杠和弦Gb/Ab,从特有的属九挂四省去五音得来即Ab9sus4(no5)

所以是在新的调的一级前面接了一个属九挂四,这个操作其实很有功能味道在里面。

至于为啥是挂四?

不·知·道

我只能告诉你,这个形式的斜杠和弦是【转·调·小·能·手】,当你想转到任意调的时候,接一个这样的斜杠属和弦,基本都不会有什么突兀感~它被大量地使用在Jpop里面。

用【四on五(IV/V)】和弦进行转调?

www.bilibili.com

贴个视频,里面的13分钟处就是一个类似的例子,转到A大调之前插了一个D/E ,它就是A大调的属九挂四;甚至后面还可以再接一个不再挂四的属和弦E,这样的行进感会更强,和弦走向也更顺畅

另外这个IV/V和弦确实也是所谓的共同音大法方式的常客。回到问题本身,我觉得当代流行音乐中还是很重视和弦功能的。从BASSLINE的半音或全音模进(走楼梯)和251进行这两点著手去分析可以解决很多问题,至于一些实在不能解释的,这不正是音乐创作的魅力吗(狗头)


推荐阅读:
相关文章