Tetorica · 音の実験 / 02

1つの音から始めよう。
周波数の比を聴いてみよう。

JavaScriptとメガドライブのYM2612で、純正律と平均律を試します。

ド・レ・ミの前に、基準になる音を1つ決めてみましょう。その周波数を1とします。1オクターブ上は2倍、純正5度は1.5倍です。ここから音を作って聴いてみます。

← FM入門 · Playgroundの実験へ移動

1. 音楽は440 Hzから始まる?

現在、A4 = 440 Hzは広く使われる調律の基準です。標準音としてISO 16にも規定されています。

赤ちゃんの泣き声は440 Hz、という話を聞いたことがあるかもしれません。しかし泣き声は一定の音程に留まらず、新生児の泣き声の研究では基本周波数がおよそ400〜600 Hzと報告されています。

この説明では、440 Hzを出発点にします。音楽理論が生まれたころから特別な数だったと仮定する必要はありません。なじみのある基準として、音同士の関係を探るために使います。

YM2612で聴いてみましょう。下のPlaygroundでRunを押すと3秒間鳴ります。単純な音色を設定して、sound(CH1, 440, 3)を呼びます。引数はチャンネル、周波数(Hz)、長さ(秒)です。

YM2612の周波数設定は整数なので、440 Hzに近い音になります。サンプル下部のsound関数がHzをチップの設定へ変換します。

2. 純正律:単純な比を選ぶ

440 Hzを基準に、単純な整数の比で周波数を選びます。3度、4度、5度を試せます。5度から始める必要はありません。

基準との比周波数音程
1/1440 Hz同度
5/4550 Hz純正長3度
4/3約586.67 Hz純正4度
3/2660 Hz純正5度

各周波数は直前の結果からではなく、同じ440 Hzを基準に計算します。これは試すための音程の一部で、完全な音階ではありません。

周波数を2倍にすると、1オクターブ上

880 Hzは440 Hzの1オクターブ上です。周波数を2倍にすると1オクターブ上がり、半分にすると1オクターブ下がります。2倍・半分を繰り返すことで、440〜880 Hzの1オクターブ内へ音を移して比較できます。

単純な比を探す方法の1つは、440 Hzの整数倍から始めて、その1オクターブへ戻すことです。

const base = 440;
const n = 5;
let frequency = base * n;

while (frequency >= base * 2) {
  frequency /= 2;
}
// 550 Hz:第5倍音を2オクターブ下げた音。

このループでは880 Hzを次のオクターブの始まりとして、440 Hzへ戻します。常にbase × nから始めます。直前の結果に3/2を繰り返し掛ける手順ではありません。

4倍や5倍も使える?

使えます。実際にその考え方を使う調律もあります。4倍は2オクターブ上なので、戻すと新しい音は増えません。5倍なら別の音を作れます。440 × 5 ÷ 4 = 550 Hzで純正長3度になります。

手順を組み合わせることもできます。550 Hzを3倍にして半分にすると、550 × 3 ÷ 2 = 825 Hzです。元の基準との比は15/8になります。2・3・5の因子を組み合わせる考え方が、5-limitの純正律の基礎です。

難しいのは音を作ることではなく、異なる手順の結果を固定した音の組に収めることです。440 Hzから純正5度を4回進むと440 × 81/64 = 556.875 Hz、純正長3度を直接選ぶと440 × 5/4 = 550 Hzになります。どちらも長3度として使えますが、固定した1つの鍵盤で両方の周波数を同時には持てません。和音の調律の選択肢が増える一方、和音や調が変わるときの判断も増えます。

どの関係を正確に保ち、食い違う関係をどう扱うか、という問題です。ピタゴラス音律、5-limitの純正律、各種の音律は異なる選択をします。これはその選択を試すための説明で、現代の音楽全体の唯一の起源を示すものではありません。詳しくはJohn Baezによる純正律の解説を参照してください。

整数倍は純正な比を探す方法の1つです。4度の4/3は、基準の整数倍を半分にするだけでは得られません。第4倍音と第3倍音の比であり、純正5度と掛け合わせると1オクターブになります。(3/2) × (4/3) = 2です。

CH1で基準を鳴らし、CH2で各比率の音を聴きます。コードでは440 * 4 / 3を使うので、表の丸めた数値は計算に影響しません。

自分の手順を試す

変更するのはmultipliersだけです。Runを押してください。[4]は基準へ戻り、[5]は純正長3度、[5, 3]は550 Hzを通って825 Hzへ進みます。[3, 3, 3, 3]は純正5度を4回進んで作る別の長3度です。[7]も試せます。770 Hz、基準の7/4になります。7を含む比では、5-limitの範囲を超えた実験になります。

2つの手順、2つの長3度

440 Hzに対して550 Hzと556.875 Hzを比較します。最後は2つの長3度を同時に鳴らします。近い周波数の間のうなりを聴いてください。どちらの計算も間違いではなく、保っている関係が異なります。

JavaScriptを編集して試す

3. 基準1つ、音2つ

下のPlaygroundでRunを押します。基準音、上の音、両方同時の順に鳴ります。ratioを3 / 2から5 / 4へ変えて再実行すると、何が変わるでしょうか。

次はbaseを220から440へ変えます。レジスターの設定は変わりますが、比は同じです。コード上部の値を変更して、もう一度実行してください。

Playground全体で開く ↗ · JavaScriptのソース

各例は最後にキーオフします。別のPlaygroundを始める前にStopしてください。同じ加算合成の音色に、第1・第2・第3・第5倍音を含め、上の倍音ほど小さくしています。

4. ピタゴラス音律:純正5度を繰り返す

次は別の手順です。純正5度の周波数比3/2を繰り返します。新しい音を次の5度の出発点にし、高くなったら半分にして元の音域へ戻します。

Cから始めると、音名は次の順に進みます。

C → G → D → A → E → B → F♯
→ C♯ → G♯ → D♯ → A♯ → E♯ → B♯

12平均律ではE♯とF、B♯とCは同じ周波数です。そのため最初の12段階で12種類の音を通ります。しかし正確な3/2の比では、純正5度を12回進んでオクターブを戻しても、出発点と完全には一致しません。音名は手順を示すもので、元へ戻ることを保証しません。

この手順をforループで書いてみましょう。最初の例の440 Hzを基準として残します。Aから始めて、各段階で3/2を掛け、純正5度上へ進みます。その後、オクターブ単位で移して、出発点のAに近い音域へ戻します。

Aから始めると次の順です。

A → E → B → F♯ → C♯ → G♯ → D♯
→ A♯ → E♯ → B♯ → F𝄪 → C𝄪 → G𝄪

コードは周波数を直接計算し、平均律の音名による再生は使いません。

各段階で、CH1の一定の440 Hzと、CH2の計算した周波数を同時に鳴らします。sound(channel, hz)は1つの音を鳴らし、Promise.allは2つの呼び出しを同時に開始して、両方の終了を待ちます。純正5度を12回進んで音域を戻すと、目標は約446.0 Hzで、出発点のAより約23.46セント高くなります。近い2音のうなりを聴いてください。YM2612は、使える設定で目標周波数を近似します。

この作り方をピタゴラス音律と呼びます。純正5度とオクターブから音を作ります。3-limitの純正律として分類されることもありますが、このページでは、基準に対して5/4などの比を直接選ぶ方法とは区別して説明します。

純正5度を4回進んで1オクターブ内へ戻すと81/64です。先ほどの純正長3度の5/4とは異なります。どちらも正確な比を使いますが、選ぶ長3度が違います。

5. 等しい段階、異なる長3度

12平均律は、オクターブを12個の等しい比で分けます。Hzの差が等しいわけではありません。

frequency = base * 2 ** (semitones / 12)
音程 純正な比 純正律のセント値 平均律のセント値
長3度 5/4 386.31 400
完全5度 3/2 701.96 700
オクターブ 2/1 1200 1200

平均律の長3度は5/4より約13.69セント広く、5度は3/2より約1.96セント狭くなります。基準音と音色を固定して比率だけを変えます。

自分で和音を作る

まずtuning = "just"でRunし、その後"equal"へ変えます。基準音と音色は同じです。持続する長3度をよく聴いてください。最初の2つの比だけを残すと、その音程に集中できます。

Playground全体で開く ↗ · JavaScriptのソース

さらに聴き比べて理解したいときは、Joe WolfeによるUNSWの音と音律の解説を参照してください。

6. 純正5度を12回進んでも戻らないのはなぜ?

C → G → D → A → E → B → F♯ → C♯ …
(3/2) ** 12 / 2 ** 7 ≈ 1.01364
1200 * Math.log2((3/2) ** 12 / 2 ** 7) ≈ 23.46 cents

純正5度12回は、7オクターブより少し上へ届きます。その差がピタゴラスコンマです。純正5度から音を作るのがピタゴラス音律で、5/4の純正長3度を加えると別の関係が入ります。

純正5度を4回進んで1オクターブ内へ戻すと81/64です。これは5/4とは異なり、その比の81/80がシントニックコンマです。「純正律」は、すべての音程が純正になる唯一の12鍵配置を意味するものではありません。

12平均律の鍵盤ではC♯とD♭は同じ周波数です。他の音律では、どう作った音かによって関係が変わります。同じ響きでも、音名の表記が異なる音楽上の役割を示すことがあります。

7. 音程を連続した座標で考える

自分の基準から何半音離れたかで音程を表します。整数でなくても構いません。

const ratioToPitch = ratio => 12 * Math.log2(ratio);
const pitchToHz = (pitch, base = 220) => base * 2 ** (pitch / 12);

const equal = [0, 4, 7];
const just = [0, ratioToPitch(5/4), ratioToPitch(3/2)];
// 0.01半音 = 1セント。滑らかなベンドには小数を使えます。

これは記事内で定義した座標で、新しいTetorica APIではありません。チップへ渡すときは整数のBLOCK/FNUMへ変換します。数式が連続的でも、YM2612の精度が無限になるわけではありません。

小数の音程を試す

純正長3度でRunした後、pitchを4へ置き換えます。その次に4.1も試してください。同じ音程の軸を動かすので、新しい音名体系を選ぶ必要はありません。

Playground全体で開く ↗ · JavaScriptのソース

例のヘルパーはPlaygroundの音名の基準ではなくHzを直接使います。Playground全体のConsoleには目標とチップでの近似周波数が表示されます。BLOCK/FNUMは離散的なので、小さな誤差が残ります。純正な数式の比は目標であり、チップでの完全一致を保証しません。

8. 音程からFMの比率へ

ここまでは別々の音を比較しました。FM合成では1つの音の中の発振器同士を関係づけます。モジュレーターとキャリアーの周波数比を変えると、スペクトラムが変わります。整数の倍音関係なら調和した倍音を、別の比率なら非整数の成分を作る場合があります。

オペレーター間の3:2は、3:2の音程を2音で鳴らす実験と同じではありません。接続、変調の強さ、エンベロープ、フィードバックも関係します。YM2612のMULTIは離散的で、0が0.5倍、1〜15が整数倍です。MULTIだけですべての比率を指定できるわけではありません。

共通する問いは、1つの周波数をもう1つと関係づけると、何が変わるか?ということです。基準を決め、比を選んで、聴いてみましょう。

FMオペレーターを試す Playgroundを開く ↗