トップページ -> 音律の仕組みと計算 → 純正律 - 純正な三和音を求めて

純正律 - 純正な三和音を求めて

音律の仕組みと計算:ピタゴラスから平均律まで - 目次
0. はじめに
1. ピタゴラス音律 - 純正完全五度を求めて
2. 純正律 - 純正な三和音を求めて
3. 中全音律 - 近親調への転調と純正長三度
4. ウェル・テンペラメント - 転調と調性格
5. 平均律 - 自由な転調と均質化
6. おまけ - 鍵盤の多い楽器と53平均律
7. 参考・関連リンク集

このページでは純正律の音階を設計した後に,この音律の特徴を確認します.
【キーワード】ウルフ,純正完全五度,純正長三度,転調

Palestrina | Missa Papae Marcelli - Dresdner Kammerchor (パレストリーナ: 教皇マルチェルスのミサ曲)

1. 主要三和音による音律構築

三和音を純正に濁らせずに弾きたくなってくると,長三度が濁ってしまうピタゴラス音律ではない音律が必要になります. 純正律は三和音を綺麗に響かせるために主要な音の長三度を5:4 完全五度を3:2になるように設計する音律です. 基準音に対して5/4と3/2を掛けたり,割ったりして音階を作ります.
三和音を綺麗に響かせることが目的なので,以下のコードのように演奏したい曲の調の主要和音から設計していきます. 以下はCメジャーの演奏用に設計した純正律です.
※ 3で検証するように純正律は適切に設計しないとウルフが多発します.
※ 優先する音を変えれば他の調用の純正律も設計できます.


import math

# A4 = 440Hz から逆算した C4
C4 = 264.0

# --- 3つの主要和音(スリーコード)を基準に作る標準ルート ---
G4 = C4 * (3/2)
E4 = C4 * (5/4)
F4 = C4 / (3/2) * 2 
A4 = F4 * (5/4)
D4 = G4 * (3/2) / 2
B4 = G4 * (5/4)

# 派生音(黒鍵)
Cs4 = F4 / (5/4)
Ds4 = G4 / (5/4)
Fs4 = D4 * (5/4)
Gs4 = E4 * (5/4)
As4 = F4 / (3/2) * 2

# 本来のC5 (完璧なオクターブ)
C5 = C4 * 2

notes = {
    "C4": C4,
    "C#4": Cs4,
    "D4": D4,
    "D#4": Ds4,
    "E4": E4,
    "F4": F4,
    "F#4": Fs4,
    "G4": G4,
    "G#4": Gs4,
    "A4": A4,
    "A#4": As4,
    "B4": B4,
    "C5": C5
}

ordered_keys = ["C4", "C#4", "D4", "D#4", "E4", "F4", "F#4", "G4", "G#4", "A4", "A#4", "B4", "C5"]

print("音名  | 周波数(Hz) | 純正律の比率 | セント")
print("-" * 45)

for i, key in enumerate(ordered_keys):
    ratio = notes[key] / C4
    print(f"{key:<6} | {notes[key]:>8.3f}   | {ratio:>11.4f} | {1200*math.log2(notes[key]/C4):.1f}")


print("\n" + "="*35 + "\n")

# --- 純正律のシントニックコンマの検証 ---

print("基準音から辿ったルートによって音の組み合わせが純正にならない")

# DからAへの音程(五度)の比率を計算
DA_ratio = A4 / D4
perfect_fifth = 3/2

print(f"D4の周波数: {D4:.3f} Hz")
print(f"A4の周波数: {A4:.3f} Hz")
print(f"DからAへの実際の比率: {DA_ratio:.4f} (分数で表すと 40/27)")

# ズレをCentsで計算
diff_cents = 1200 * math.log2(perfect_fifth / DA_ratio)
print(f"純正五度(3/2)とのズレ: {round(diff_cents,3)} Cents → 半音1/5個分くらい狭い")

音名  | 周波数(Hz) | 純正律の比率 | セント
---------------------------------------------
C4     |  264.000   |      1.0000 | 0.0
C#4    |  281.600   |      1.0667 | 111.7
D4     |  297.000   |      1.1250 | 203.9
D#4    |  316.800   |      1.2000 | 315.6
E4     |  330.000   |      1.2500 | 386.3
F4     |  352.000   |      1.3333 | 498.0
F#4    |  371.250   |      1.4062 | 590.2
G4     |  396.000   |      1.5000 | 702.0
G#4    |  412.500   |      1.5625 | 772.6
A4     |  440.000   |      1.6667 | 884.4
A#4    |  469.333   |      1.7778 | 996.1
B4     |  495.000   |      1.8750 | 1088.3
C5     |  528.000   |      2.0000 | 1200.0
===================================

基準音から辿ったルートによって音の組み合わせが純正にならない
D4の周波数: 297.000 Hz
A4の周波数: 440.000 Hz
DからAへの実際の比率: 1.4815 (分数で表すと 40/27)
純正五度(3/2)とのズレ: 21.506 Cents → 半音1/5個分くらい狭い

2. ウルフと転調の制約

DとAで純正五度とのズレが確認されたように,主要な音に関しては優先的に設計し,純正な響きが得られるようにしたのですが,そのしわ寄せで純正な響きにならない音が発生してしまいます. 具体的には,純正五度では(5/4)を何回掛けたか, 長三度では(3/2)を何回掛けたかが異なる場合には純正な響きが得られません.
Cメジャーで綺麗に響くように設計したのでCメジャーはD周り以外は純正な響きが得られますが,その他の調では2か所以上にウルフが発生しています. 鍵盤楽器のような固定ピッチの楽器では転調に強い制約がかかります.
※ ピタゴラス音律で(3/2)^12 ≒ 2^7のズレが起きたように,純正律も(5/4)^n * (3/2)^m = 2^7 になるような自然数(m,n)の組み合わせは存在しないので必ず周波数のズレが発生します.


# =========================================================
# 音名と周波数
# =========================================================

note_names = ["C", "C#", "D", "D#", "E", "F", "F#", "G", "G#", "A", "A#", "B"]

freqs = [
    C4, Cs4, D4, Ds4,
    E4, F4, Fs4, G4,
    Gs4, A4, As4, B4
]

# =========================================================
# 純正比率
# =========================================================

pure_M3_cents = 1200 * math.log2(5/4)
pure_m3_cents = 1200 * math.log2(6/5)
pure_p5_cents = 1200 * math.log2(3/2)

# =========================================================
# 理論的表記
# =========================================================

# 古典音律なので音名のすり替えがあった場合は * を付けておく
THEORETICAL_NAMES = {
    "C": {
        # Cメジャーは変更なし
    },

    "G": {
        # Gメジャーは変更なし
    },

    "F": {
        "A#": "Bb*"
    },

    "A": {
        # Aメジャーは変更なし
    }
}

# =========================================================
# 音名変換
# =========================================================

def theoretical_name(scale_key, raw_name):
    mapping = THEORETICAL_NAMES.get(scale_key, {})
    return mapping.get(raw_name, raw_name)

# =========================================================
# コード解析関数
# =========================================================

def analyze_chords(scale_key, scale_name, indices, major_roots, dim_roots):

    print(f"【 {scale_name} のダイアトニックコード 】")
    print(f"{'和音':<8} | {'3度':<6} | {'3度差(Cents)':<16} | {'5度':<6} | {'5度差(Cents)'}")
    print("-" * 80)

    for i in indices:

        root_raw = note_names[i]
        root_name = theoretical_name(scale_key, root_raw)
        root_freq = freqs[i]

        # メジャー判定
        is_major = root_raw in major_roots

        # --------------------------
        # 3度
        # --------------------------

        third_steps = 4 if is_major else 3
        pure_3rd = pure_M3_cents if is_major else pure_m3_cents

        idx_3 = (i + third_steps) % 12

        raw_3 = note_names[idx_3]
        name_3 = theoretical_name(scale_key, raw_3)

        freq_3 = freqs[idx_3]
        if idx_3 < i:
            freq_3 *= 2

        diff_3 = (1200 * math.log2(freq_3 / root_freq)) - pure_3rd

        # --------------------------
        # 5度
        # --------------------------

        fifth_steps = 6 if root_raw in dim_roots else 7
        idx_5 = (i + fifth_steps) % 12

        raw_5 = note_names[idx_5]
        name_5 = theoretical_name(scale_key, raw_5)

        freq_5 = freqs[idx_5]
        if idx_5 < i:
            freq_5 *= 2

        diff_5 = (1200 * math.log2(freq_5 / root_freq)) - pure_p5_cents

        # --------------------------
        # 表示整形
        # --------------------------

        diff_3_str = f"{diff_3:+.3f}" if abs(diff_3) > 0.001 else " 0.000"
        diff_5_str = f"{diff_5:+.3f}" if abs(diff_5) > 0.001 else " 0.000"

        # --------------------------
        # --------------------------
        # コード名
        # --------------------------

        if root_raw in dim_roots:
            chord_name = root_name + "dim"
            diff_5_str = "N/A"
        else:
            chord_name = root_name if is_major else root_name + "m"

        print(
            f"{chord_name:<8} | {name_3:<6} | {diff_3_str:>16} | {name_5:<6} | {diff_5_str:>14}"
        )
    print()

# =========================================================
# 各調設定
# =========================================================

# Cメジャー
c_major_indices = [0, 2, 4, 5, 7, 9, 11]
c_major_roots = ["C", "F", "G"]
c_dim_roots = ["B"]

# Gメジャー
g_major_indices = [7, 9, 11, 0, 2, 4, 6]
g_major_roots = ["G", "C", "D"]
g_dim_roots = ["F#"]

# Fメジャー
f_major_indices = [5, 7, 9, 10, 0, 2, 4]
f_major_roots = ["F", "A#", "C"]
f_dim_roots = ["E"]

# Aメジャー
a_major_indices = [9, 11, 1, 2, 4, 6, 8]
a_major_roots = ["A", "D", "E"]
a_dim_roots = ["G#"]

# =========================================================
# 実行
# =========================================================

analyze_chords(
    "C",
    "1. 完璧に調整された Cメジャー (比較元)",
    c_major_indices,
    c_major_roots,
    c_dim_roots
)

analyze_chords(
    "G",
    "2. Gメジャー (属調)",
    g_major_indices,
    g_major_roots,
    g_dim_roots
)

analyze_chords(
    "F",
    "3. Fメジャー (下属調)",
    f_major_indices,
    f_major_roots,
    f_dim_roots
)

analyze_chords(
    "A",
    "4. Aメジャー (遠隔調)",
    a_major_indices,
    a_major_roots,
    a_dim_roots
)

【 1. 完璧に調整された Cメジャー (比較元) のダイアトニックコード 】
和音       | 3度     | 3度差(Cents)       | 5度     | 5度差(Cents)
--------------------------------------------------------------------------------
C        | E      |            0.000 | G      |          0.000
Dm       | F      |          -21.506 | A      |        -21.506
Em       | G      |            0.000 | B      |          0.000
F        | A      |            0.000 | C      |          0.000
G        | B      |            0.000 | D      |          0.000
Am       | C      |            0.000 | E      |          0.000
Bdim     | D      |            0.000 | F      |            N/A

【 2. Gメジャー (属調) のダイアトニックコード 】
和音       | 3度     | 3度差(Cents)       | 5度     | 5度差(Cents)
--------------------------------------------------------------------------------
G        | B      |            0.000 | D      |          0.000
Am       | C      |            0.000 | E      |          0.000
Bm       | D      |            0.000 | F#     |          0.000
C        | E      |            0.000 | G      |          0.000
D        | F#     |            0.000 | A      |        -21.506
Em       | G      |            0.000 | B      |          0.000
F#dim    | A      |          -21.506 | C      |            N/A

【 3. Fメジャー (下属調) のダイアトニックコード 】
和音       | 3度     | 3度差(Cents)       | 5度     | 5度差(Cents)
--------------------------------------------------------------------------------
F        | A      |            0.000 | C      |          0.000
Gm       | Bb*    |          -21.506 | D      |          0.000
Am       | C      |            0.000 | E      |          0.000
Bb*      | D      |          +21.506 | F      |          0.000
C        | E      |            0.000 | G      |          0.000
Dm       | F      |          -21.506 | A      |        -21.506
Edim     | G      |            0.000 | Bb*    |            N/A

【 4. Aメジャー (遠隔調) のダイアトニックコード 】
和音       | 3度     | 3度差(Cents)       | 5度     | 5度差(Cents)
--------------------------------------------------------------------------------
A        | C#     |          +41.059 | E      |          0.000
Bm       | D      |            0.000 | F#     |          0.000
C#m      | E      |          -41.059 | G#     |        -41.059
D        | F#     |            0.000 | A      |        -21.506
E        | G#     |            0.000 | B      |          0.000
F#m      | A      |          -21.506 | C#     |        +19.553
G#dim    | B      |            0.000 | D      |            N/A

3. おまけ 綺麗な音階を作らない構築方法

1で「純正律は適切に設計しないとウルフが多発します.」と述べましたが,ここでは純正律のルールを守りつつもめちゃくちゃな音階になる設計を試してみます. 本来は音階の構造の分析などに使われるものですが,以下のような音階のネットワークで考えると分かりやすいです. 縦に隣り合っていれば純正五度,横に隣り合っていれば純正長三度です.
2の「3度上げて5度上げてを繰り返す純正律」は実際に鳴らしてみると以下のようにガタガタな音階になります.

3度上げて5度上げてを繰り返す純正律


計算によって求める場合は主要三和音を優先して設計するように注意しないと,演奏したい調でウルフが多発する周波数比率になってしまうことがあります.


# トーンネットで音階を作る場合
# 上に行くと5度上がって右に行くと3度上がります

# 1. Cメジャー用に設計した純正律
# 主要三和音が綺麗にL字に接続されているので純正で響く
"""
   D4 Fs
Ds G4 B4 
   C4 E4 Gs
Cs F4 A4
   As
"""

# 2. 3度上げて5度上げてを繰り返す純正律
"""
               S11 S12
            S9 S10
         S7 S8
      S5 S6
   S3 S4
S1 S2
"""

# 3. 戻ってくる純正律
"""
S4  S5  S6  S7 
S3          S8 
S2          S9
S1  S12 S11 S10
"""

実際に演奏された曲を聞いてみたい場合はこちらのサイトがオススメです.
【関連(外部サイト)】聴き比べ:古典音律(ピタゴラス音律、純正律、中全音律、ウェル・テンペラメント)と平均律
【参考(外部サイト)】純正律 - Wikipedia
【参考(外部サイト)】Tonnetz - Wikipedia
【参考(外部サイト)】ネオ・リーマン理論❶ PLR操作とトネッツ
※ 本ページ中で音階ネットワークは短三度の関係を無視し,長三度と完全五度の関係を二次元で表したもの.

次の記事を読む 【中全音律 - 近親調への転調と純正長三度】 目次へ戻る