用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判断图片宽度和高度后删除图片的方法
May 22 Python
Python实现自动上京东抢手机
Feb 06 Python
python画图--输出指定像素点的颜色值方法
Jul 03 Python
Python中变量的输入输出实例代码详解
Jul 28 Python
python 使用while写猜年龄小游戏过程解析
Oct 07 Python
Python中sorted()排序与字母大小写的问题
Jan 14 Python
解决Pycharm 导入其他文件夹源码的2种方法
Feb 12 Python
浅谈图像处理中掩膜(mask)的意义
Feb 19 Python
python可以用哪些数据库
Jun 22 Python
python logging 重复写日志问题解决办法详解
Aug 04 Python
变长双向rnn的正确使用姿势教学
May 31 Python
python 中的jieba分词库
Nov 23 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/06/05 PHP
PHP中file_get_contents函数抓取https地址出错的解决方法(两种方法)
2015/09/22 PHP
如何在旧的PHP系统中使用PHP 5.3之后的库
2015/12/02 PHP
thinkphp多表查询两表有重复相同字段的完美解决方法
2016/09/22 PHP
PHP机器学习库php-ml的简单测试和使用方法
2017/07/14 PHP
PHP常用日期加减计算方法实例小结
2018/07/31 PHP
PHP实现的分解质因数操作示例
2018/08/01 PHP
PHP时间函数使用详解
2019/03/21 PHP
JSON JQUERY模板实现说明
2010/07/03 Javascript
jQuery EasyUI API 中文文档 - Calendar日历使用
2011/10/19 Javascript
基于jQuery中对数组进行操作的方法
2013/04/16 Javascript
详细介绍8款超实用JavaScript框架
2013/10/25 Javascript
通过复制Table生成word和excel的javascript代码
2014/01/20 Javascript
jQuery获取选中内容及设置元素属性的方法
2014/07/09 Javascript
jQuery实现表单提交时判断的方法
2014/12/13 Javascript
js文本框走动跑马灯效果代码分享
2015/08/25 Javascript
分享我对JS插件开发的一些感想和心得
2016/02/04 Javascript
JS原型、原型链深入理解
2016/02/27 Javascript
xtemplate node.js 的使用方法实例解析
2016/08/22 Javascript
详解vue中引入stylus及报错解决方法
2017/09/22 Javascript
微信小程序6位或多位验证码密码输入框功能的实现代码
2018/05/29 Javascript
浅析Vue 和微信小程序的区别、比较
2018/08/03 Javascript
angular6.x中ngTemplateOutlet指令的使用示例
2018/08/09 Javascript
Vue框架TypeScript装饰器使用指南小结
2019/02/18 Javascript
Node.js+Express+Mysql 实现增删改查
2019/04/03 Javascript
[04:45]上海特级锦标赛主赛事第三日TOP10
2016/03/05 DOTA
在Python的Django框架中用流响应生成CSV文件的教程
2015/05/02 Python
Django实现一对多表模型的跨表查询方法
2018/12/18 Python
python实现测试工具(一)——命令行发送get请求
2020/10/19 Python
澳大利亚在线生活方式商店:Mytopia
2018/07/08 全球购物
《穷人》教学反思
2014/04/08 职场文书
消防隐患整改通知书
2015/04/22 职场文书
2015年教学管理工作总结
2015/05/20 职场文书
申请吧主发表的感言
2015/08/03 职场文书
2016十一国庆节慰问信
2015/12/01 职场文书
幼儿园六一儿童节开幕词
2016/03/04 职场文书