Piano Frequencies

Stephen Lukacs (2) iquanta.org/instruct/python
keynotef (Hz)f Tesla (Hz)
88C84186.009044109.89979
87B73951.066413879.22884
86A#7/B♭73729.310093661.50445
85A73520.03456.0
84G#7/A♭73322.437583262.02962
83G73135.963493078.94597
82F#7/G♭72959.955382906.13801
81F72793.825852743.02902
80E72637.020462589.07463
79D#7/E♭72489.015872443.76104
78D72349.318142306.60327
77C#7/D♭72217.461052177.14357
76C72093.004522054.94989
75B61975.533211939.61442
74A#6/B♭61864.655051830.75223
73A61760.01728.0
72G#6/A♭61661.218791631.01481
71G61567.981741539.47298
70F#6/G♭61479.977691453.06901
69F61396.912931371.51451
68E61318.510231294.53731
67D#6/E♭61244.507931221.88052
66D61174.659071153.30163
65C#6/D♭61108.730521088.57179
64C61046.502261027.47495
63B5987.7666969.80721
62A#5/B♭5932.32752915.37611
61A5880.0864.0
60G#5/A♭5830.6094815.50741
59G5783.99087769.73649
58F#5/G♭5739.98885726.5345
57F5698.45646685.75725
56E5659.25511647.26866
55D#5/E♭5622.25397610.94026
54D5587.32954576.65082
53C#5/D♭5554.36526544.28589
52C5523.25113513.73747
51B4493.8833484.9036
50A#4/B♭4466.16376457.68806
49A4440.0432.0
48G#4/A♭4415.3047407.7537
47G4391.99544384.86825
46F#4/G♭4369.99442363.26725
45F4349.22823342.87863
44E4329.62756323.63433
43D#4/E♭4311.12698305.47013
42D4293.66477288.32541
41C#4/D♭4277.18263272.14295
40C4261.62557256.86874
39B3246.94165242.4518
38A#3/B♭3233.08188228.84403
37A3220.0216.0
36G#3/A♭3207.65235203.87685
35G3195.99772192.43412
34F#3/G♭3184.99721181.63363
33F3174.61412171.43931
32E3164.81378161.81716
31D#3/E♭3155.56349152.73506
30D3146.83238144.1627
29C#3/D♭3138.59132136.07147
28C3130.81278128.43437
27B2123.47083121.2259
26A#2/B♭2116.54094114.42201
25A2110.0108.0
24G#2/A♭2103.82617101.93843
23G297.9988696.21706
22F#2/G♭292.4986190.81681
21F287.3070685.71966
20E282.4068980.90858
19D#2/E♭277.7817576.36753
18D273.4161972.08135
17C#2/D♭269.2956668.03574
16C265.4063964.21718
15B161.7354160.61295
14A#1/B♭158.2704757.21101
13A155.054.0
12G#1/A♭151.9130950.96921
11G148.9994348.10853
10F#1/G♭146.249345.40841
9F143.6535342.85983
8E141.2034440.45429
7D#1/E♭138.8908738.18377
6D136.708136.04068
5C#1/D♭134.6478334.01787
4C132.703232.10859
3B030.8677130.30648
2A#0/B♭029.1352428.6055
1A027.527.0
{"data":[{"marker":{"color":"DarkGray"},"mode":"markers","name":"tesla","x":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88],"y":[27.0,28.6055,30.30648,32.10859,34.01787,36.04068,38.18377,40.45429,42.85983,45.40841,48.10853,50.96921,54.0,57.21101,60.61295,64.21718,68.03574,72.08135,76.36753,80.90858,85.71966,90.81681,96.21706,101.93843,108.0,114.42201,121.2259,128.43437,136.07147,144.1627,152.73506,161.81716,171.43931,181.63363,192.43412,203.87685,216.0,228.84403,242.4518,256.86874,272.14295,288.32541,305.47013,323.63433,342.87863,363.26725,384.86825,407.7537,432.0,457.68806,484.9036,513.73747,544.28589,576.65082,610.94026,647.26866,685.75725,726.5345,769.73649,815.50741,864.0,915.37611,969.80721,1027.47495,1088.57179,1153.30163,1221.88052,1294.53731,1371.51451,1453.06901,1539.47298,1631.01481,1728.0,1830.75223,1939.61442,2054.94989,2177.14357,2306.60327,2443.76104,2589.07463,2743.02902,2906.13801,3078.94597,3262.02962,3456.0,3661.50445,3879.22884,4109.89979],"type":"scatter"},{"marker":{"color":"Black"},"mode":"markers","name":"notes","x":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88],"y":[27.5,29.13524,30.86771,32.7032,34.64783,36.7081,38.89087,41.20344,43.65353,46.2493,48.99943,51.91309,55.0,58.27047,61.73541,65.40639,69.29566,73.41619,77.78175,82.40689,87.30706,92.49861,97.99886,103.82617,110.0,116.54094,123.47083,130.81278,138.59132,146.83238,155.56349,164.81378,174.61412,184.99721,195.99772,207.65235,220.0,233.08188,246.94165,261.62557,277.18263,293.66477,311.12698,329.62756,349.22823,369.99442,391.99544,415.3047,440.0,466.16376,493.8833,523.25113,554.36526,587.32954,622.25397,659.25511,698.45646,739.98885,783.99087,830.6094,880.0,932.32752,987.7666,1046.50226,1108.73052,1174.65907,1244.50793,1318.51023,1396.91293,1479.97769,1567.98174,1661.21879,1760.0,1864.65505,1975.53321,2093.00452,2217.46105,2349.31814,2489.01587,2637.02046,2793.82585,2959.95538,3135.96349,3322.43758,3520.0,3729.31009,3951.06641,4186.00904],"type":"scatter"}],"layout":{"template":{"data":{"histogram2dcontour":[{"type":"histogram2dcontour","colorbar":{"outlinewidth":0,"ticks":""},"colorscale":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]]}],"choropleth":[{"type":"choropleth","colorbar":{"outlinewidth":0,"ticks":""}}],"histogram2d":[{"type":"histogram2d","colorbar":{"outlinewidth":0,"ticks":""},"colorscale":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]]}],"heatmap":[{"type":"heatmap","colorbar":{"outlinewidth":0,"ticks":""},"colorscale":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]]}],"contourcarpet":[{"type":"contourcarpet","colorbar":{"outlinewidth":0,"ticks":""}}],"contour":[{"type":"contour","colorbar":{"outlinewidth":0,"ticks":""},"colorscale":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]]}],"surface":[{"type":"surface","colorbar":{"outlinewidth":0,"ticks":""},"colorscale":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]]}],"mesh3d":[{"type":"mesh3d","colorbar":{"outlinewidth":0,"ticks":""}}],"scatter":[{"fillpattern":{"fillmode":"overlay","size":10,"solidity":0.2},"type":"scatter"}],"parcoords":[{"type":"parcoords","line":{"colorbar":{"outlinewidth":0,"ticks":""}}}],"scatterpolargl":[{"type":"scatterpolargl","marker":{"colorbar":{"outlinewidth":0,"ticks":""}}}],"bar":[{"error_x":{"color":"#2a3f5f"},"error_y":{"color":"#2a3f5f"},"marker":{"line":{"color":"#E5ECF6","width":0.5},"pattern":{"fillmode":"overlay","size":10,"solidity":0.2}},"type":"bar"}],"scattergeo":[{"type":"scattergeo","marker":{"colorbar":{"outlinewidth":0,"ticks":""}}}],"scatterpolar":[{"type":"scatterpolar","marker":{"colorbar":{"outlinewidth":0,"ticks":""}}}],"histogram":[{"marker":{"pattern":{"fillmode":"overlay","size":10,"solidity":0.2}},"type":"histogram"}],"scattergl":[{"type":"scattergl","marker":{"colorbar":{"outlinewidth":0,"ticks":""}}}],"scatter3d":[{"type":"scatter3d","line":{"colorbar":{"outlinewidth":0,"ticks":""}},"marker":{"colorbar":{"outlinewidth":0,"ticks":""}}}],"scattermap":[{"type":"scattermap","marker":{"colorbar":{"outlinewidth":0,"ticks":""}}}],"scattermapbox":[{"type":"scattermapbox","marker":{"colorbar":{"outlinewidth":0,"ticks":""}}}],"scatterternary":[{"type":"scatterternary","marker":{"colorbar":{"outlinewidth":0,"ticks":""}}}],"scattercarpet":[{"type":"scattercarpet","marker":{"colorbar":{"outlinewidth":0,"ticks":""}}}],"carpet":[{"aaxis":{"endlinecolor":"#2a3f5f","gridcolor":"white","linecolor":"white","minorgridcolor":"white","startlinecolor":"#2a3f5f"},"baxis":{"endlinecolor":"#2a3f5f","gridcolor":"white","linecolor":"white","minorgridcolor":"white","startlinecolor":"#2a3f5f"},"type":"carpet"}],"table":[{"cells":{"fill":{"color":"#EBF0F8"},"line":{"color":"white"}},"header":{"fill":{"color":"#C8D4E3"},"line":{"color":"white"}},"type":"table"}],"barpolar":[{"marker":{"line":{"color":"#E5ECF6","width":0.5},"pattern":{"fillmode":"overlay","size":10,"solidity":0.2}},"type":"barpolar"}],"pie":[{"automargin":true,"type":"pie"}]},"layout":{"autotypenumbers":"strict","colorway":["#636efa","#EF553B","#00cc96","#ab63fa","#FFA15A","#19d3f3","#FF6692","#B6E880","#FF97FF","#FECB52"],"font":{"color":"#2a3f5f"},"hovermode":"closest","hoverlabel":{"align":"left"},"paper_bgcolor":"white","plot_bgcolor":"#E5ECF6","polar":{"bgcolor":"#E5ECF6","angularaxis":{"gridcolor":"white","linecolor":"white","ticks":""},"radialaxis":{"gridcolor":"white","linecolor":"white","ticks":""}},"ternary":{"bgcolor":"#E5ECF6","aaxis":{"gridcolor":"white","linecolor":"white","ticks":""},"baxis":{"gridcolor":"white","linecolor":"white","ticks":""},"caxis":{"gridcolor":"white","linecolor":"white","ticks":""}},"coloraxis":{"colorbar":{"outlinewidth":0,"ticks":""}},"colorscale":{"sequential":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]],"sequentialminus":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]],"diverging":[[0,"#8e0152"],[0.1,"#c51b7d"],[0.2,"#de77ae"],[0.3,"#f1b6da"],[0.4,"#fde0ef"],[0.5,"#f7f7f7"],[0.6,"#e6f5d0"],[0.7,"#b8e186"],[0.8,"#7fbc41"],[0.9,"#4d9221"],[1,"#276419"]]},"xaxis":{"gridcolor":"white","linecolor":"white","ticks":"","title":{"standoff":15},"zerolinecolor":"white","automargin":true,"zerolinewidth":2},"yaxis":{"gridcolor":"white","linecolor":"white","ticks":"","title":{"standoff":15},"zerolinecolor":"white","automargin":true,"zerolinewidth":2},"scene":{"xaxis":{"backgroundcolor":"#E5ECF6","gridcolor":"white","linecolor":"white","showbackground":true,"ticks":"","zerolinecolor":"white","gridwidth":2},"yaxis":{"backgroundcolor":"#E5ECF6","gridcolor":"white","linecolor":"white","showbackground":true,"ticks":"","zerolinecolor":"white","gridwidth":2},"zaxis":{"backgroundcolor":"#E5ECF6","gridcolor":"white","linecolor":"white","showbackground":true,"ticks":"","zerolinecolor":"white","gridwidth":2}},"shapedefaults":{"line":{"color":"#2a3f5f"}},"annotationdefaults":{"arrowcolor":"#2a3f5f","arrowhead":0,"arrowwidth":1},"geo":{"bgcolor":"white","landcolor":"#E5ECF6","subunitcolor":"white","showland":true,"showlakes":true,"lakecolor":"white"},"title":{"x":0.05},"mapbox":{"style":"light"}}},"yaxis":{"title":{"text":"Frequency (Hz)"},"anchor":"x","side":"left"},"xaxis":{"title":{"text":"key"}},"title":{"text":"Piano Frequency Response per Key"},"width":880,"height":640,"margin":{"b":60,"l":25,"pad":0,"r":25,"t":60},"plot_bgcolor":"#f5f5f5","paper_bgcolor":"White"}}
"""
reference: https://iquanta.org/instruct/python ::: Piano: Frequencies of Notes ::: Stephen Lukacs, Ph.D. ©2023-03-22
"""
<page_scripts>
<style>
table.notes { width: 200px; }
table.notes td { padding: 2px 8px; }
table.notes tr:nth-child(12n+2) td { border: 2px solid gray; border-radius: 5px; }
table.notes tr:nth-child(12n+5) td { border: 2px solid pink; border-radius: 5px; }
</style>
</page_scripts>
from yatl.helpers import *
import plotly.graph_objects as go

BR = TAG['br/']
rtn = DIV()
if 1:
    html = { '':"&natural;", '-':"&natural;", '_':"&flat;", '^':"&sharp;", '#':"&sharp;" }
    octave = ['A', 'A#/B_', 'B', 'C', 'C#/D_', 'D', 'D#/E_', 'E', 'F', 'F#/G_', 'G', 'G#/A_']
    for i, o in enumerate(octave):
        xx = o.find('/')
        if (xx > -1):
            octave[i] = o[:xx]+"~"+'/<span class="flat">'+o[xx+1]+html["_"]+"</span>~"
        else:
            octave[i] = o+"~"
    Hz440 = lambda n: round(440.*(2**((n-49)/12.)), 5)
    Hz432 = lambda n: round(432.*(2**((n-49)/12.)), 5)
    nth_octave, ith_octave = 8, 3
    snth_octave = str(nth_octave)
    t = TABLE(TR(TH("key"), TH("note"), TH("f (Hz)"), TH("f Tesla (Hz)"),), _class="notes")
    for n in range(88, 0, -1):
        try:
            key = XML(octave[ith_octave].replace('~', snth_octave))
        except Exception as E:
            rtn.append(E)
        t.append(TR(TD(n), TD(key), TD(Hz440(n)), TD(Hz432(n))))
        ith_octave -= 1
        if (ith_octave < 0):
            ith_octave = 11
        if (ith_octave == 2):
            nth_octave -= 1
            snth_octave = str(nth_octave)
    rtn.append(DIV(t, _style="float:left;"))
    fig = go.Figure()
    fig.add_trace(go.Scatter(x=[ i for i in range(1, 89) ], y=[ Hz432(i) for i in range(1, 89) ], mode='markers', name="tesla", marker=go.scatter.Marker(color="DarkGray")))
    fig.add_trace(go.Scatter(x=[ i for i in range(1, 89) ], y=[ Hz440(i) for i in range(1, 89) ], mode='markers', name="notes", marker=go.scatter.Marker(color="Black")))
    fig.update_layout(xaxis=go.XAxis(title="key"), yaxis=go.YAxis(title="Frequency (Hz)", anchor='x', side='left'))
    fig.update_layout(title_text="Piano Frequency Response per Key", width=880, height=640, margin=go.layout.Margin(l=25, r=25, b=60, t=60, pad=0), plot_bgcolor="#f5f5f5", paper_bgcolor="White")
    rtn.append(CAT(DIV(XML(fig.to_json()), _id="figure0"),))
    rtn.append(DIV(_style="float:none; clear:both;"))