乐音体系是有限多个音级构成的集合[1]。律学(temperament)要解决的问题就是确定这个集合中的各个元素。举例来说,它决定钢琴的88个按键各自要发出什么频率的声音?吉他的每一根品丝要安在什么位置?竹笛要在哪里打孔?
律学让我们能制定乐谱,传唱数千年前的乐曲。律学还能调整乐器之间的关系,使它们合奏的声音保持和谐。回顾历史可以发现,古代世界各地的人们在制定乐律方面,往往做出了相似的选择。乍看之下,这像是一个令人惊讶的巧合。但假如我们了解音乐背后的数学,我们会发现这可能不是偶然。
三分损益法
在古代中国,《管子·地员篇》中有如下记载:
凡将起五音,凡首,先主一而三之,四开以合九九;以是生黄钟小素之首,以成宫。三分而益之以一,为百有八,为征。不无有三分而去其乘,适足,以是生商。有三分而复于其所,以是成羽。有三分去其乘,适足,以是成角。
按照文字描述,首先确定宫音对应的数为\(3^4=81\);而后“三分而益之”得徵音,其数为\(81\times(1+\frac{1}{3})=108\);再“三分损一”得到商音,其数为\(108\times(1-\frac{1}{3})=72\);接著“三分益一”得到羽音为\(72\times\frac{4}{3}=96\);最后再“三分损一”得到角音为\(96\times\frac{2}{3}=64\). 这就是中国古代的三分损益法。
三分损益法算得的是音对应的管长或弦长,与频率成反比。因此按照频率从低到高排列这五音,顺序是
征 | 羽 | 宫 | 商 | 角 |
108 | 96 | 81 | 72 | 64 |
五度相生律
古希腊的毕达哥拉斯提出万物皆数,认为一切规律都可以用数字表达。音乐也不例外。他认为乐音之间的和谐性来源于频率之间的简单比例关系。 频率的比例关系越简单,则音级的关系越「和谐」。在这里,「简单」意指频率的关系可以用小的自然数的比例表示。
毕达哥拉斯学派提出的五度相生律做法为:先确定一个基准频率\(f\),然后以\(\frac{3}{2}\)为比例累乘,生成各个音级的频率。这个过程中,一旦生成的频率达到\(f\)的两倍以上,就按\(\frac{1}{2}\)的比例将其缩小。
不难看出毕达哥拉斯和古中国人在乐律上不谋而合。《管子》一书记录的三分损益,实际上是以\(\frac{2}{3}\)和\(\frac{4}{3}\)为比例,对基准管长/弦长进行缩放。这实际上就是以\(\frac{3}{2}\)和\(\frac{3}{4}= \frac{3}{2} \cdot \frac{1}{2}\)的比例对频率进行缩放。
下面的代码演示了如何按五度相生律生成音级。var coeff = [] for (var i = 0; i < 7; ++i) { // 一共只生成七个音级 // 从 4/3*f 开始,依次乘以3/2 var f = 4 / 3 * (3 / 2)**i; // 总是将比例限制在1和2之间。之后只要将频率翻倍/减半,就可以得到八度关系上的所有音级。 while (f >= 2) f = f / 2; while (f < 1) f = f * 2; // 打印 if (coeff.length > 0) { console.log(coeff[coeff.length - 1] + "生成" + f); } coeff.push(f); } coeff = coeff.sort(); function mod(a, b) { return ((a % b) + b) % b; } const f5 = function(index) { index = index + 5; const p = Math.floor(index / 7); return 440 / coeff[5] * coeff[mod(index, 7)] * 2**p; } const t = 0.4; playNotes([ [f5(-3), 2 * t], [f5(-3), t], [f5(-1), t], [f5(0), t], [f5(2), t], [f5(2), t], [f5(0), t], [f5(-1), 2 * t], [f5(-1), t], [f5(0), t], [f5(-1), 4 * t], ])
十二平均律
以往方法的缺陷
五度相生律和三分损益法在历史上长久以来发挥了重要的作用,但也都存在共同的问题,即使用\(\frac{1}{2}\)和\(\frac{3}{2}\)两种比例,无法从基础音级出发,生成各音级,然再次回到基础音级。用数学公式表述,即不存在正整数\(m,n\),使得\((\frac{1}{2})^m \cdot (\frac{3}{2})^n = 1\).
这一问题就导致了转调的困难。例如,设有一套乐器从\(f_1\)出发,生成了\(f_2\)。现在有一首歌曲需要转调,希望以\(f_2\)作为基础生成各音级,我们会发现\(f_2\)无法生成\(f_1\)。因此旧的乐器无法完成转调任务,我们只得重新打造一把乐器!
平均律的提出
为了应对转调的需求,我们希望各音级是“平等”的,它们之间的距离是“均匀”的。这样,我们就可以以其中任何一个音为基准,生成其它的音。
人类的听觉对于高频声音不敏感。声音的频率指数增长时,在人听来,他们的「距离」却是均匀增加的。例如,设\(f\)是一常数,人耳会认为 \[(f, kf, k^2f, k^3f \dots)\] 这样一组声音是「等间距」的。
在十二平均律中,两倍频率的关系称为八度关系,将一个频率到其两倍之间的范围称为一个八度。例如,频率\(f\)和\(2f\)之间就是一个八度。将八度「十二等分」,就能得到十二平均律下的所有音级。
在八度上构造一个听觉上等间距的十二段,相当于求一个比例为\(2^{1/12}\)的等比数列。最早明确提出十二平均律,并且精确计算\(2^{1/12}\)的人是明朝的朱载堉。
十二平均律代码实现
记十二平均律下音级和频率的映射函数为f12()
,假设f12(0)=440 Hz
,以下代码实现了12平均律的计算,并基于十二平均律播放了一段旋律
const f12 = this.f12 = function(index) { return 440 * (2**(1/12 * index)); } const t = 0.4; playNotes([ [f12(-5), 2 * t], [f12(-5), t], [f12(-2), t], [f12(0), t], [f12(3), t], [f12(3), t], [f12(0), t], [f12(-2), 2 * t], [f12(-2), t], [f12(0), t], [f12(-2), 4 * t] ])