使用Python程序計(jì)算鋼琴88個(gè)鍵的音高
我們知道了鋼琴鍵盤的音高是其實(shí)是有規(guī)律的,如下
- 頻率翻倍,高一個(gè)八度
- 國(guó)際基準(zhǔn)音:440Hz,鋼琴鍵盤上對(duì)應(yīng)小字一組的la
小字一組的la可以看下圖

根據(jù)這兩個(gè)規(guī)律,我們就可以計(jì)算出所有88個(gè)琴鍵的音高(單位是頻率)。
鋼琴鍵盤是標(biāo)準(zhǔn)的十二平均律,12個(gè)鍵后頻率翻倍,那么每?jī)蓚€(gè)琴鍵之間的頻率倍數(shù)是固定的,也就是可以根據(jù)一個(gè)琴鍵的音高,計(jì)算出下一個(gè)琴鍵的音高。
計(jì)算鋼琴最左邊琴鍵的音高
我們知道小字一組的la頻率是440Hz,鋼琴最左邊的鍵也是la,隔了4個(gè)組,根據(jù)x * 2 * 2 * 2 * 2 = 440Hz。
那么最左邊琴鍵的音高為
x = 440 / 16 = 27.5
計(jì)算每?jī)蓚€(gè)琴鍵的頻率倍數(shù)
每隔12個(gè)鍵音高翻倍,x^12=2
那么每個(gè)鍵的音高倍數(shù)為2開(kāi)12次方
x = pow(2, 1/12)=1.0594630943592953
python程序?qū)崿F(xiàn)
知道了最左邊琴鍵的音高,還知道了倍數(shù),那么不停地乘個(gè)87次就能知道鋼琴所有琴鍵的音高了。
我們用python實(shí)現(xiàn)一樣
定義鋼琴鍵盤
我們先定義一個(gè)相關(guān)鋼琴鍵盤的變量
# 鋼琴鍵盤chenqionghe
keyboard = {
"大字二組": ['A2', 'A2#', 'B2'],
"大字一組": ['C1', 'C1#', 'D1', 'D1#', 'E1', 'F1', 'F1#', 'G1', 'G1#', 'A1', 'A1#', 'B1'],
"大字組": ['C', 'C#', 'D', 'D#', 'E', 'F', 'F#', 'G', 'G#', 'A', 'A#', 'B'],
"小字組": ['c', 'c#', 'd', 'd#', 'e', 'f', 'f#', 'g', 'g#', 'a', 'a#', 'b'],
"小字一組": ['c1', 'c1#', 'd1', 'd1#', 'e1', 'f1', 'f1#', 'g1', 'g1#', 'a1', 'a1#', 'b1'],
"小字二組": ['c2', 'c2#', 'd2', 'd2#', 'e2', 'f2', 'f2#', 'g2', 'g2#', 'a2', 'a2#', 'b2'],
"小字三組": ['c3', 'c3#', 'd3', 'd3#', 'e3', 'f3', 'f3#', 'g3', 'g3#', 'a3', 'a3#', 'b3'],
"小字四組": ['c4', 'c4#', 'd4', 'd4#', 'e4', 'f4', 'f4#', 'g4', 'g4#', 'a4', 'a4#', 'b4'],
"小字五組": ['c5']
}為了友好展示,我們放入DataFrame中查看
keybord_data={k: [*v, *[""]*(12-len(v))] for k, v in keyboard.items()}
df = pd.DataFrame(keybord_data)輸出一下

OK,這里我們就先把鋼琴鍵盤弄出來(lái)了。
計(jì)算每個(gè)琴鍵的音高
# python
data = {}
start = 440 / 16
loop = math.pow(2, 1 / 12)
i = 0
for groupName, group in keyboard.items():
for name in group:
if name == "A2":
current = start
else:
current = current * loop
data[name] = name + ": " + str(round(current,3))
i = i + 1data這個(gè)數(shù)組保存了每個(gè)琴鍵的音高

展示琴鍵音高
df.replace(data)
查看一下

這樣就計(jì)算出了所有琴鍵的音高
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Python時(shí)間戳轉(zhuǎn)換為字符串與字符串轉(zhuǎn)換為時(shí)間戳
在編寫代碼時(shí),往往涉及時(shí)間、日期、時(shí)間戳的相互轉(zhuǎn)換,下面這篇文章主要給大家介紹了關(guān)于Python時(shí)間戳轉(zhuǎn)換為字符串與字符串轉(zhuǎn)換為時(shí)間戳的相關(guān)資料,文中給出了詳細(xì)的實(shí)例代碼,需要的朋友可以參考下2023-02-02
pytorch中函數(shù)tensor.numpy()的數(shù)據(jù)類型解析
這篇文章主要介紹了pytorch中函數(shù)tensor.numpy()的數(shù)據(jù)類型,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-07-07
Pytorch.nn.conv2d 過(guò)程驗(yàn)證方式(單,多通道卷積過(guò)程)
今天小編就為大家分享一篇Pytorch.nn.conv2d 過(guò)程驗(yàn)證方式(單,多通道卷積過(guò)程),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-01-01
python同時(shí)遍歷兩個(gè)list用法說(shuō)明
這篇文章主要介紹了python同時(shí)遍歷兩個(gè)list用法說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-05-05
Python爬蟲(chóng)實(shí)例——scrapy框架爬取拉勾網(wǎng)招聘信息
這篇文章主要介紹了Python爬蟲(chóng)實(shí)例——scrapy框架爬取拉勾網(wǎng)招聘信息的相關(guān)資料,文中講解非常細(xì)致,代碼幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下2020-07-07
在linux下實(shí)現(xiàn) python 監(jiān)控usb設(shè)備信號(hào)
今天小編就為大家分享一篇在linux下實(shí)現(xiàn) python 監(jiān)控usb設(shè)備信號(hào),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-07-07

