音階の周波数一覧と求め方(Python)

6/24/2023

Python

t f B! P L

今回は音階の周波数一覧と求め方について説明します。

周波数一覧

とりあえず一覧が必要な方向けに最初に一覧を貼っておきます。

下記の「小数点以下の桁数」に値を入力して「変更」ボタンを押すと、桁数を変更することができます。

小数点以下の桁数:

周波数の求め方(Python)

そもそも音階の周波数は一定の法則に従って決まっています。

まず、表を見ると、A4の周波数は440Hzとなり、B♭は440Hzに2の1/12乗を掛けた値になっています。

これはすべての音に共通しています。

なので、基準音A4の周波数fを440Hz、基準音との差(±も考慮)をdとすると、

と求めることができます。

たとえば、A3の場合基準音との差は-12となりますので、

と求めることができます。

ここで、プログラムで周波数を求める場合、入力文字列に対して基準音との差を求める必要があります。

そこで基準音をA4とし、あらかじめ、

notes: dict = {"A": 0, "B": 2, "C": -9, "D": -7, "E": -5, "F": -4, "G": -2}

のように定義しておくことで、オクターブをk、基準音との差dとして、

とすることができます。

たとえばA3の場合、k=3、notes["A"]=0なので、

となります。

これを利用して、周波数を求める関数を作成します。今回はPythonを使用します。

notes: dict = {"A": 0, "B": 2, "C": -9, "D": -7, "E": -5, "F": -4, "G": -2}

# 音名とオクターブから周波数を計算する
def calcFrequency(note: str, octave: int) -> float:
    
    # 音名から音階を取得(一時的)
    noteIndex: int = notes[note[0].upper()]
    
    # 変化記号があれば取得
    accidental: str = note[1] if len(note) > 1 else ""
    
    # 変化記号により音階を変更
    if accidental in ["#", "♯"]:
        noteIndex += 1
    elif accidental in ["b", "♭"]:
        noteIndex -= 1
        
    # 周波数を計算
    frequency: float = 440 * 2 ** ((octave - 4) + noteIndex / 12)

    # 小数第5位まで表示
    print(f"{frequency:.5f} Hz")
    return frequency

calcFrequency("A", 4)   #440.00000 Hz
calcFrequency("A", 3)   #220.00000 Hz
calcFrequency("Bb", 4)  #466.16376 Hz
calcFrequency("A#", 4)  #466.16376 Hz
calcFrequency("C", 4)   #523.25113 Hz

このように周波数を求める関数を作成することができました。