純正律の比を計算する
（平均律に一番近い分数を力技で求める）

2003/2/25 平野拓一（東京工業大学）
Takuichi Hirano (Tokyo Institute of Technology)

純正律(just intonation)とは、オクターブ内にある音階を構成する音の周波数が基音の分数倍n/mになっている音階である。周波数比が分数で表されるf2/f1=n/mということは、波長（周波数の逆数に比例）は簡単な整数比L1:L2=n:mで表すことができる。音の波形は周期関数と見なすことができるため、フーリエ級数で表すことができる。波長が簡単な整数比L1:L2=n:mになっているということは違う音を同時に鳴らしたとき（和音）、もし高い音の周波数が低い音の整数倍になっているとき(L1:L2=1:m)は高い音の周波数線スペクトルは低い音の倍音の線スペクトルと完全に一致する。つまり、周期も同じなのでよく混じりあい、うなり（時間的に振幅がゆっくり変化する現象。正弦波ならば「和→積公式」で簡単に計算できる）が発生しないから澄んだ音の和音となる（と人間は感じる）。整数倍でなくても、分数倍L2/L1=m/nならば低い音の周期を何回か繰り返せばまたあとは同じ波形の繰り返しとなる(m L1=n L2)。しかし、もし波長比が分数（有理数）でなく、無理数だったらいつまでたっても同じ波形の繰り返しとなる周期が永久にこない。直感的には周期関数と周期関数の足し算だからその和も周期関数になりそうに思えるが、それらの周期が違っていていつまで時間がたっても一致しないのである。このように波長の比が分数で表される音同士の和音だと人間は澄んだ音だと感じるようである。また、波長の整数比は簡単な比（分数に使われる分母と分子の数が小さい）である程よく音が混じりあい、調和すると感じるようである。それは上の説明のように比が簡単だと早く元の波形と同じ周期に落ち着き、音を加えても元の音の波形の周期を崩さないからであると考えられる。

純正律ではこのように周波数、波長が簡単な整数比で表され、和音の響きが美しいというのが特徴である。しかし、欠点もある。現在西洋音楽を中心に世界で主流となっているのは（純正律ではなく）平均律(temperament)である。平均律を使うとオクターブが変わっても移調、転調しても音の間隔（人間が感じる音の高さの一定間隔）が同じであるため特別なことをしなくても違和感を感じずに聞けるというのが特徴である。しかし、純正律はそれから少しずれているため、オクターブが変わったり移調、転調したりするとそのときに応じて補正しなければならない。ピアノやギターなどの楽器ではそんなに瞬時に調律しなおすことは不可能であり、長所と短所を認めて純正律が使われることがあったが、最近ではコンピュータの発達によりMIDI音源が登場し、人間からみたら時間がぜんぜんかかっていないと言えるほど瞬時に調律することが可能であり、実際にそのようにして純正律で音楽を作っている人もいる。

歴史的に見たら平均律よりも純正律の方が昔から使われていたようである。中世ヨーロッパの教会のパイプオルガンの演奏では純正律が使われていたそうである。しかし、使う音の高さもそれ程広くなかったため純正律の欠点が問題になっていなかったようである。人間が感じる音の高さと周波数の関係を心理学のウェーバー・フェヒナ(Weber-Fechner)の法則で考察したら平均律にするのが自然だと思われるが、歴史的に音楽で使われ始めたのは純正律が先であり、音楽の世界では平均律は純正律を補正してさまざまな移調、転調にも対応できるようにしたと言われる。ところで、平均律と純正律がどの程度違うのかということだが、私は音楽が専門ではないしあまり得意ではないので（好きではあるが）聞き分けられないと思っていたが平均律と純正律の違いについて研究したホームページを見てみると、確かに和音の響きが全然違うと思った。聞いた曲が中世ヨーロッパをイメージさせる曲だったからかもしれないが、純正律と平均律を比較すると純正律の響きは古代の神様がいて自然と調和して人間が暮らしていた時代（スーパーファミコンのゲーム「アクトレーザー」のイメージ）を思わせる美しい響きだと思った。もちろん私は神様なんか信じないし、世の中無矛盾で全て科学（サイエンス）で解明できると思っているから単なるイメージであるが、人間の心に与えるイメージはそのようなとても美しい響きだった。

純正律の比をどのように求めたのかは知らないが、ここでは平均律になるべく近くなる整数比を探すという手法で純正律を構築する。（まず、平均律ありきという考え方でやってみる）

平均律の公比を求める

Solve[440*(r^12) == 880, r]

平均律の周波数を求める関数

[Input]
オクターブ
音 (c,c#,d,d#,e,f,f#,g,g#,a,a#,b)

FreqDoReMi[Octave_, ABCTone_] := 
        Module[{r = (2^(1/12))}, 
NumTone = 
            Which[
ABCTone == "A"  ||  
                ABCTone == "a", 
              0, 
ABCTone == "A#"  ||  
                ABCTone == "a#", 
              1, 
ABCTone == "B"  ||  
                ABCTone == "b", 
              2, 
ABCTone == "C"  ||  
                ABCTone == "c", 
              3, 
ABCTone == "C#"  ||  
                ABCTone == "c#", 
              4, 
ABCTone == "D"  ||  
                ABCTone == "d", 
              5, 
ABCTone == "D#"  ||  
                ABCTone == "d#", 
              6, 
ABCTone == "E"  ||  
                ABCTone == "e", 
              7, 
ABCTone == "F"  ||  
                ABCTone == "f", 
              8, 
ABCTone == "F#"  ||  
                ABCTone == "f#", 
              9, 
ABCTone == "G"  ||  
                ABCTone == "g", 
              10, 
ABCTone == "G#"  ||  
                ABCTone == "g#", 
              11]; 
(27.5*(2^Octave))*(r^NumTone)  // 
            N
];

純正律の比を計算する

アルゴリズムは単純で、16を比を作る最大の整数として力技で全ての分数を作り出し、平均律の値に一番近い分数を探し、その比を純正律の比として採用している。力技ではあるが、数が多くないのですぐに計算が終わる。

実はこんな計算しなくてもMathematicaの Add-ons の Miscellaneous`Music`にいろいろな音律を扱う機能が備わっている。

StdFreq = 
        FreqDoReMi[4, "C"];
f[1] = 
        FreqDoReMi[4, "C"];
f[2] = 
        FreqDoReMi[4, "C#"];
f[3] = 
        FreqDoReMi[4, "D"];
f[4] = 
        FreqDoReMi[4, "D#"];
f[5] = 
        FreqDoReMi[4, "E"];
f[6] = 
        FreqDoReMi[4, "F"];
f[7] = 
        FreqDoReMi[4, "F#"];
f[8] = 
        FreqDoReMi[4, "G"];
f[9] = 
        FreqDoReMi[4, "G#"];
f[10] = 
        FreqDoReMi[5, "A"];
f[11] = 
        FreqDoReMi[5, "A#"];
f[12] = FreqDoReMi[5, "B"];

JustIntonationFractionList=Table[
Module[{NumLevel = 16},
  
MNTable = 
                    Flatten[
                      Table[{m, n, (n/m), Abs[(n/m) - f[i]/StdFreq]}, {m, 1, 
                          NumLevel}, {n, 1, NumLevel}], 1];
  
MNTable = 
                    Sort[MNTable, (#1[[4]] < #2[[4]] &)];
MNTable[[1, 3]]
]
,{i, 1, 12}
];

JustIntonationFractionList

純正律の比を計算する
♯, ♭ のための音階は8段階にする

アルゴリズムは単純で、16を比を作る最大の整数として力技で全ての分数を作り出し、平均律の値に一番近い分数を探し、その比を純正律の比として採用している。力技ではあるが、数が多くないのですぐに計算が終わる。

実はこんな計算しなくてもMathematicaの Add-ons の Miscellaneous`Music`にいろいろな音律を扱う機能が備わっている。

StdFreq = 
        FreqDoReMi[4, "C"];
f[1] = 
        FreqDoReMi[4, "C"];
f[2] = 
        FreqDoReMi[4, "C#"];
f[3] = 
        FreqDoReMi[4, "D"];
f[4] = 
        FreqDoReMi[4, "D#"];
f[5] = 
        FreqDoReMi[4, "E"];
f[6] = 
        FreqDoReMi[4, "F"];
f[7] = 
        FreqDoReMi[4, "F#"];
f[8] = 
        FreqDoReMi[4, "G"];
f[9] = 
        FreqDoReMi[4, "G#"];
f[10] = 
        FreqDoReMi[5, "A"];
f[11] = 
        FreqDoReMi[5, "A#"];
f[12] = FreqDoReMi[5, "B"];

JustIntonationFractionList=Table[
Module[{NumLevel = 10},
  
MNTable = 
                    Flatten[
                      Table[{m, n, (n/m), Abs[(n/m) - f[i]/StdFreq]}, {m, 1, 
                          NumLevel}, {n, 1, NumLevel}], 1];
  
MNTable = 
                    Sort[MNTable, (#1[[4]] < #2[[4]] &)];
MNTable[[1, 3]]
]
,{i, 1, 12}
];

JustIntonationFractionList