用PYTHON去计算88键钢琴的琴键频率和音高


Posted in Python onApril 10, 2022

我们知道了钢琴键盘的音高是其实是有规律的,如下

  • 频率翻倍,高一个八度
  • 国际基准音:440Hz,钢琴键盘上对应小字一组的la

小字一组的la可以看下图

用PYTHON去计算88键钢琴的琴键频率和音高

根据这两个规律,我们就可以计算出所有88个琴键的音高(单位是频率)。

钢琴键盘是标准的十二平均律,12个键后频率翻倍,那么每两个琴键之间的频率倍数是固定的,也就是可以根据一个琴键的音高,计算出下一个琴键的音高。

计算钢琴最左边琴键的音高

我们知道小字一组的la频率是440Hz,钢琴最左边的键也是la,隔了4个组,根据x * 2 * 2 * 2 * 2 = 440Hz。
那么最左边琴键的音高为

x = 440 / 16 = 27.5

计算每两个琴键的频率倍数

每隔12个键音高翻倍,x^12=2
那么每个键的音高倍数为2开12次方

x = pow(2, 1/12)=1.0594630943592953

python程序实现

知道了最左边琴键的音高,还知道了倍数,那么不停地乘个87次就能知道钢琴所有琴键的音高了。
我们用python实现一样

定义钢琴键盘

我们先定义一个相关钢琴键盘的变量

# 钢琴键盘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)

输出一下

用PYTHON去计算88键钢琴的琴键频率和音高

OK,这里我们就先把钢琴键盘弄出来了。

计算每个琴键的音高

# 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 + 1

data这个数组保存了每个琴键的音高

用PYTHON去计算88键钢琴的琴键频率和音高

展示琴键音高

df.replace(data)

查看一下

用PYTHON去计算88键钢琴的琴键频率和音高

这样就计算出了所有琴键的音高

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
怎么使用pipenv管理你的python项目
Mar 12 Python
python如何修改装饰器中参数
Mar 20 Python
pandas string转dataframe的方法
Apr 11 Python
pycham查看程序执行的时间方法
Nov 29 Python
python实现Flappy Bird源码
Dec 24 Python
解决pycharm 远程调试 上传 helpers 卡住的问题
Jun 27 Python
python切片(获取一个子列表(数组))详解
Aug 09 Python
python下载库的步骤方法
Oct 12 Python
redis数据库及与python交互用法简单示例
Nov 01 Python
Python使用Socket实现简单聊天程序
Feb 28 Python
简单了解Python多态与属性运行原理
Jun 15 Python
Python实现PS滤镜中的USM锐化效果
Dec 04 Python
python图像处理 PIL Image操作实例
Apr 09 #Python
Python Pytorch查询图像的特征从集合或数据库中查找图像
Python实现科学占卜 让视频自动打码
Python自动化工具之实现Excel转Markdown表格
Python加密技术之RSA加密解密的实现
Apr 08 #Python
Python识别花卉种类鉴定网络热门植物并自动整理分类
请求模块urllib之PYTHON爬虫的基本使用
You might like
php实现telnet功能示例
2014/04/08 PHP
PHP提示Cannot modify header information - headers already sent by解决方法
2014/09/22 PHP
推荐几个开源的微信开发项目
2014/12/28 PHP
PHP批量获取网页中所有固定种子链接的方法
2016/11/18 PHP
浅析php如何实现爬取数据原理
2018/09/27 PHP
PHP之认识(二)关于Traits的用法详解
2019/04/11 PHP
javascript当中的代码嗅探扩展原生对象和原型(prototype)
2013/01/11 Javascript
JS实现图片横向滚动效果示例代码
2013/09/04 Javascript
javascript中的遍历for in 以及with的用法
2014/12/22 Javascript
JavaScript数组去重的五种方法
2015/11/05 Javascript
JavaScript设计模式开发中组合模式的使用教程
2016/05/18 Javascript
nodejs学习笔记之路由
2017/03/27 NodeJs
Vue.Draggable实现拖拽效果
2020/07/29 Javascript
详解如何在React组件“外”使用父组件的Props
2018/01/12 Javascript
react写一个select组件的实现代码
2019/04/03 Javascript
Vue 2.0双向绑定原理的实现方法
2019/10/23 Javascript
react的hooks的用法详解
2020/10/12 Javascript
[01:57]2016完美“圣”典风云人物:国士无双专访
2016/12/04 DOTA
[01:04:22]2018DOTA2亚洲邀请赛 3.31 小组赛 B组 IG vs EG
2018/04/01 DOTA
在Django中使用Sitemap的方法讲解
2015/07/22 Python
新手常见6种的python报错及解决方法
2018/03/09 Python
python中不能连接超时的问题及解决方法
2018/06/10 Python
pytorch中tensor的合并与截取方法
2018/07/26 Python
Python数据可视化库seaborn的使用总结
2019/01/15 Python
详解Python可视化神器Yellowbrick使用
2019/11/11 Python
vscode调试django项目的方法
2020/08/06 Python
Python 爬虫批量爬取网页图片保存到本地的实现代码
2020/12/24 Python
英国莱斯特松木橡木家具网上商店:Choice Furniture Superstore
2019/07/05 全球购物
C#笔试题和英文面试题
2013/02/07 面试题
销售会计工作职责
2013/12/02 职场文书
幼儿园亲子活动方案
2014/01/29 职场文书
淘宝活动策划方案
2014/02/06 职场文书
机关作风建设整改方案
2014/10/27 职场文书
交通事故代理词范文
2015/05/23 职场文书
高一语文教学反思
2016/02/16 职场文书
动视暴雪取消疫苗禁令 让所有员工返回线下工作
2022/04/03 其他游戏