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

今回は音階の周波数一覧と求め方について説明します。
周波数一覧
とりあえず一覧が必要な方向けに最初に一覧を貼っておきます。
下記の「小数点以下の桁数」に値を入力して「変更」ボタンを押すと、桁数を変更することができます。
| 音名 | 周波数 [Hz] |
|---|---|
| A0 (ラ0) | 27.50000 |
| A#0 (ラ#0) | 29.13524 |
| B0 (シ0) | 30.86771 |
| C1 (ド1) | 32.70320 |
| C#1 (ド#1) | 34.64783 |
| D1 (レ1) | 36.70810 |
| D#1 (レ#1) | 38.89087 |
| E1 (ミ1) | 41.20344 |
| F1 (ファ1) | 43.65353 |
| F#1 (ファ#1) | 46.24930 |
| G1 (ソ1) | 48.99943 |
| G#1 (ソ#1) | 51.91309 |
| A1 (ラ1) | 55.00000 |
| A#1 (ラ#1) | 58.27047 |
| B1 (シ1) | 61.73541 |
| C2 (ド2) | 65.40639 |
| C#2 (ド#2) | 69.29566 |
| D2 (レ2) | 73.41619 |
| D#2 (レ#2) | 77.78175 |
| E2 (ミ2) | 82.40689 |
| F2 (ファ2) | 87.30706 |
| F#2 (ファ#2) | 92.49861 |
| G2 (ソ2) | 97.99886 |
| G#2 (ソ#2) | 103.82617 |
| A2 (ラ2) | 110.00000 |
| A#2 (ラ#2) | 116.54094 |
| B2 (シ2) | 123.47083 |
| C3 (ド3) | 130.81278 |
| C#3 (ド#3) | 138.59132 |
| D3 (レ3) | 146.83238 |
| D#3 (レ#3) | 155.56349 |
| E3 (ミ3) | 164.81378 |
| F3 (ファ3) | 174.61412 |
| F#3 (ファ#3) | 184.99721 |
| G3 (ソ3) | 195.99772 |
| G#3 (ソ#3) | 207.65235 |
| A3 (ラ3) | 220.00000 |
| A#3 (ラ#3) | 233.08188 |
| B3 (シ3) | 246.94165 |
| C4 (ド4) | 261.62557 |
| C#4 (ド#4) | 277.18263 |
| D4 (レ4) | 293.66477 |
| D#4 (レ#4) | 311.12698 |
| E4 (ミ4) | 329.62756 |
| F4 (ファ4) | 349.22823 |
| F#4 (ファ#4) | 369.99442 |
| G4 (ソ4) | 391.99544 |
| G#4 (ソ#4) | 415.30470 |
| A4 (ラ4) | 440.00000 |
| A#4 (ラ#4) | 466.16376 |
| B4 (シ4) | 493.88330 |
| C5 (ド5) | 523.25113 |
| C#5 (ド#5) | 554.36526 |
| D5 (レ5) | 587.32954 |
| D#5 (レ#5) | 622.25397 |
| E5 (ミ5) | 659.25511 |
| F5 (ファ5) | 698.45646 |
| F#5 (ファ#5) | 739.98885 |
| G5 (ソ5) | 783.99087 |
| G#5 (ソ#5) | 830.60940 |
| A5 (ラ5) | 880.00000 |
| A#5 (ラ#5) | 932.32752 |
| B5 (シ5) | 987.76660 |
| C6 (ド6) | 1046.50226 |
| C#6 (ド#6) | 1108.73052 |
| D6 (レ6) | 1174.65907 |
| D#6 (レ#6) | 1244.50793 |
| E6 (ミ6) | 1318.51023 |
| F6 (ファ6) | 1396.91293 |
| F#6 (ファ#6) | 1479.97769 |
| G6 (ソ6) | 1567.98174 |
| G#6 (ソ#6) | 1661.21879 |
| A6 (ラ6) | 1760.00000 |
| A#6 (ラ#6) | 1864.65505 |
| B6 (シ6) | 1975.53321 |
| C7 (ド7) | 2093.00452 |
| C#7 (ド#7) | 2217.46105 |
| D7 (レ7) | 2349.31814 |
| D#7 (レ#7) | 2489.01587 |
| E7 (ミ7) | 2637.02046 |
| F7 (ファ7) | 2793.82585 |
| F#7 (ファ#7) | 2959.95538 |
| G7 (ソ7) | 3135.96349 |
| G#7 (ソ#7) | 3322.43758 |
| A7 (ラ7) | 3520.00000 |
| A#7 (ラ#7) | 3729.31009 |
| B7 (シ7) | 3951.06641 |
| C8 (ド8) | 4186.00904 |
周波数の求め方(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
このように周波数を求める関数を作成することができました。
