music/midi/ MidiPitches
There is a table here and here.
Summary
In A=440hz equal temperament, naturally A is 440Hz. The ration of a semitone is always e5777d56ce82393838ae7c7d452e2479f03ceb09de36527cd653c72c363e931a2c624232cdd221771294dfbb310aca000a0df6ac8b66b696d90ef06fdefb64a3. So we can find all the other frequencies using this. Middle C is 60 and the A above middle C (the 400Hz one, sometimes called concert pitch) is 69.
Some Notes
I've only included A's and C's – you can work out the rest from here
| Lilypond name | ABC name | Pitch(dec) | Pitch(hex) | Freq(hz) | |--------|-------|--------|--------------| C,,,,,|C,,,,,|0|00|8.175798915643707Hz Cis,,,,,/Des,,,,,|^C,,,,,/_D,,,,,|1|01|8.661957218027252Hz Gis,,,,,/Aes,,,,,|^G,,,,,/_A,,,,,|8|08|12.978271799373287Hz A,,,,,|A,,,,,|9|09|13.75Hz Ais,,,,,/Bes,,,,,|^A,,,,,/_B,,,,,|10|0a|14.567617547440307Hz C,,,,|C,,,,|12|0c|16.351597831287414Hz Cis,,,,/Des,,,,|^C,,,,/_D,,,,|13|0d|17.323914436054505Hz Gis,,,,/Aes,,,,|^G,,,,/_A,,,,|20|14|25.956543598746574Hz A,,,,|A,,,,|21|15|27.5Hz Ais,,,,/Bes,,,,|^A,,,,/_B,,,,|22|16|29.13523509488062Hz C,,,|C,,,|24|18|32.70319566257483Hz Cis,,,/Des,,,|^C,,,/_D,,,|25|19|34.64782887210901Hz Gis,,,/Aes,,,|^G,,,/_A,,,|32|20|51.91308719749314Hz A,,,|A,,,|33|21|55.0Hz Ais,,,/Bes,,,|^A,,,/_B,,,|34|22|58.27047018976124Hz C,,|C,,|36|24|65.40639132514966Hz Cis,,/Des,,|^C,,/_D,,|37|25|69.29565774421802Hz Gis,,/Aes,,|^G,,/_A,,|44|2c|103.82617439498628Hz A,,|A,,|45|2d|110.0Hz Ais,,/Bes,,|^A,,/_B,,|46|2e|116.54094037952248Hz C,|C,|48|30|130.8127826502993Hz Cis,/Des,|^C,/_D,|49|31|138.59131548843604Hz Gis,/Aes,|^G,/_A,|56|38|207.65234878997256Hz A,|A,|57|39|220.0Hz Ais,/Bes,|^A,/_B,|58|3a|233.08188075904496Hz C|C|60|3c|261.6255653005986Hz Cis/Des|^C/_D|61|3d|277.1826309768721Hz Gis/Aes|^G/_A|68|44|415.3046975799451Hz A|A|69|45|440.0Hz Ais/Bes|^A/_B|70|46|466.1637615180899Hz c|c|72|48|523.2511306011972Hz cis/des|^c/_d|73|49|554.3652619537442Hz gis/aes|^g/_a|80|50|830.6093951598903Hz a|a|81|51|880.0Hz ais/bes|^a/_b|82|52|932.3275230361799Hz c'|c'|84|54|1046.5022612023945Hz cis'/des'|^c'/_d'|85|55|1108.7305239074883Hz gis'/aes'|^g'/_a'|92|5c|1661.2187903197805Hz a'|a'|93|5d|1760.0Hz ais'/bes'|^a'/_b'|94|5e|1864.6550460723597Hz c''|c''|96|60|2093.004522404789Hz cis''/des''|^c''/_d''|97|61|2217.4610478149766Hz gis''/aes''|^g''/_a''|104|68|3322.437580639561Hz a''|a''|105|69|3520.0Hz ais''/bes''|^a''/_b''|106|6a|3729.3100921447194Hz c'''|c'''|108|6c|4186.009044809578Hz cis'''/des'''|^c'''/_d'''|109|6d|4434.922095629953Hz gis'''/aes'''|^g'''/_a'''|116|74|6644.875161279122Hz a'''|a'''|117|75|7040.0Hz ais'''/bes'''|^a'''/_b'''|118|76|7458.620184289437Hz c''''|c''''|120|78|8372.018089619156Hz cis''''/des''''|^c''''/_d''''|121|79|8869.844191259906Hz
Note table generator
This is a simple python script to generate the table above.
concert_a_frequency = 440 # A above middle C freq
middle_c_midi_pitch = 60
concert_a_midi_pitch = 69 # A above middle C pitch, 440Hz at concert pitch
def note_name_abc(x):
rel_to_middle_c = x - middle_c_midi_pitch
octave, pitch_class = divmod(rel_to_middle_c,12)
pitches = "C ^C D ^D E F ^F G ^G A ^A B".split(" ")
pitches_flat = "C _D D _E E F _G G _A A _B B".split(" ")
return note_name_core(pitch_class,octave,pitches,pitches_flat)
def note_name_lilypond(x):
rel_to_middle_c = x - middle_c_midi_pitch
octave, pitch_class = divmod(rel_to_middle_c,12)
pitches = "C Cis D Dis E F Fis G Gis A Ais B".split(" ")
pitches_flat = "C Des D Ees E F Ges G Aes A Bes B".split(" ")
return note_name_core(pitch_class,octave,pitches,pitches_flat)
def note_name_core(pitch_class,octave,pitches,pitches_flat):
letter = pitches[pitch_class]
letterf = pitches_flat[pitch_class]
if octave <= 0:
suffix = ","*(-octave)
elif octave >= 1:
letter = letter.lower()
letterf = letterf.lower()
suffix = "'"*(octave - 1)
if letter != letterf:
result = f"{letter}{suffix}/{letterf}{suffix}"
else:
result = f"{letter}{suffix}"
return result
def note_freq(x,concert_a=concert_a_frequency):
rel_to_concert_a = x - concert_a_midi_pitch
ratio = 2**(rel_to_concert_a/12)
return concert_a*ratio
only_ac = True # set to False to print all notes, True prints only A,C
print("""| Lilypond name | ABC name | Pitch(dec) | Pitch(hex) | Freq(hz) |
--------------------------------------""")
for x in range(128):
name = note_name_lilypond(x)
if "C" in name.upper() or "A" in name.upper() or not only_ac:
print(f"{note_name_lilypond(x)}|{note_name_abc(x)}|{x}|{x:02x}|{note_freq(x)}Hz")