今回は音階の周波数一覧と求め方について説明します。
周波数一覧
とりあえず一覧が必要な方向けに最初に一覧を貼っておきます。
下記の「小数点以下の桁数」に値を入力して「変更」ボタンを押すと、桁数を変更することができます。
小数点以下の桁数:
周波数の求め方(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
このように周波数を求める関数を作成することができました。