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

本文瀏覽次數

发布日期

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 : #音律, #樂理, #五度相生率, #十二平均律, #音樂,