用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 相关文章推荐
Python中生成器和yield语句的用法详解
Apr 17 Python
详解Python字符串对象的实现
Dec 24 Python
python搭建虚拟环境的步骤详解
Sep 27 Python
Django学习笔记之Class-Based-View
Feb 15 Python
Scrapy框架爬取Boss直聘网Python职位信息的源码
Feb 22 Python
Django urls.py重构及参数传递详解
Jul 23 Python
python处理document文档保留原样式
Sep 23 Python
详解有关PyCharm安装库失败的问题的解决方法
Feb 02 Python
Python线程threading模块用法详解
Feb 26 Python
将pycharm配置为matlab或者spyder的用法说明
Jun 08 Python
python时间序列数据转为timestamp格式的方法
Aug 03 Python
pytorch加载预训练模型与自己模型不匹配的解决方案
May 13 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简单静态页生成过程
2008/03/27 PHP
PHP 解决session死锁的方法
2013/06/20 PHP
PHP创建桌面快捷方式的实例代码
2014/02/17 PHP
PHP计算加权平均数的方法
2015/07/16 PHP
PHP 数组基本操作方法详解
2016/06/17 PHP
js escape,unescape解决中文乱码问题的方法
2010/05/26 Javascript
ASP.NET jQuery 实例2 (表单中使用回车在TextBox之间向下移动)
2012/01/13 Javascript
Javascript小技巧之生成html元素
2014/05/15 Javascript
js 动态修改css文件用到了cssRule
2014/08/20 Javascript
jquery Deferred 快速解决异步回调的问题
2016/04/05 Javascript
详解vue.js2.0父组件点击触发子组件方法
2017/05/10 Javascript
js 两个日期比较相差多少天的实例
2017/10/19 Javascript
使用layui日期控件laydate对开始和结束时间进行联动控制的方法
2019/09/06 Javascript
vue3中轻松实现switch功能组件的全过程
2021/01/07 Vue.js
[40:29]2018DOTA2亚洲邀请赛 4.7总决赛 LGD vs Mineski 第一场
2018/04/10 DOTA
Python实现多行注释的另类方法
2014/08/22 Python
深入解析Python中的urllib2模块
2015/11/13 Python
利用Python产生加密表和解密表的实现方法
2019/10/15 Python
Python闭包与装饰器原理及实例解析
2020/04/30 Python
使用CSS3来制作消息提醒框
2015/07/12 HTML / CSS
详解HTML5 data-* 自定义属性
2018/01/24 HTML / CSS
NFL Game Pass欧洲:在线观看NFL比赛直播和点播,以高清质量播放
2018/08/30 全球购物
Python如何实现单例模式
2016/06/03 面试题
在DELPHI中调用存储过程和使用内嵌SQL哪种方式更好
2016/11/22 面试题
畜牧兽医本科生个人的自我评价
2013/10/11 职场文书
教育局长自荐信范文
2013/12/22 职场文书
个人工作主要事迹
2014/05/08 职场文书
社区优秀志愿者先进事迹
2014/05/09 职场文书
2014年人事行政工作总结
2014/12/03 职场文书
幼儿园大班毕业评语
2014/12/31 职场文书
邀请函的格式
2015/01/30 职场文书
2015年前台个人工作总结
2015/04/03 职场文书
餐馆开业致辞
2015/08/01 职场文书
2019思想汇报范文
2019/05/21 职场文书
选对餐饮营销策略,营业额才会上涨
2019/08/27 职场文书
win10以太网连接不上怎么办?Win10连接以太网详细教程
2022/04/08 数码科技