五度相生律和十二平均律的计算

本文瀏覽次數

发布日期

2024年1月4日

乐音体系是有限多个音级构成的集合[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]
])

参考文献

[1]
音乐与数学[M]. 北京大学出版社.
By @執迷 in
Tags : #音律, #樂理, #五度相生率, #十二平均律, #音樂,