使用Python程序计算钢琴88个键的音高
作者:雪山飞猪 发布时间:2021-12-24 06:46:31
标签:Python,计算,钢琴,音高
我们知道了钢琴键盘的音高是其实是有规律的,如下
频率翻倍,高一个八度
国际基准音:440Hz,钢琴键盘上对应小字一组的la
小字一组的la可以看下图
根据这两个规律,我们就可以计算出所有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)
输出一下
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这个数组保存了每个琴键的音高
展示琴键音高
df.replace(data)
查看一下
这样就计算出了所有琴键的音高
来源:https://www.cnblogs.com/chenqionghe/p/16118460.html


猜你喜欢
- 我们从一个测试开始。下面这个函数的功能是什么? def foo(lst): a = 0 for i in
- 解决大于5.7版本mysql的分组报错Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated原因:MySQL 5.7.5和up实现了对功能依赖的检测。如果启用了only_full_group_by SQL模式(在默认情况下是这样),
- 想到TDE(Transparent Data Encryption)。 TDE MSDN 说明: “透明数据加密”(TDE) 可对数据和日志
- 译注:前两天看到一篇不错的英文文章,叫做 How browsers work,该文概要的介绍了浏览器从头到尾的工作机制,包括HTML等的解析
- 在JavaScript中,我们应该尽可能的用局部变量来代替全局变量,这句话所有人都知道,可是这句话是谁先说的?为什么要这么做?有什么根据么?
- Node.js中的事件触发器所引发的思考今天在看 Node.js 文档的时候讲到事件触发器,其中的 emit 方法让我想到了 Vue 中的自
- 数据库 属性 &nbs
- 基础类似于自定义指令,可以用全局方法 Vue.filter() 注册一个自定义过滤器,它接收两个参数:过滤器 ID 和过滤器函数。过滤器函数
- 本文章以一个表为例,要转多个表则可将DataSet关联多个表,下面给出完整代码,包括引用以及main函数与复制函数。要说明的是,必须先用Sq
- 前言数据分析就是将数据以各种图表的形式展现给领导,供领导做决策用,因此熟练掌握饼图、柱状图、线图等图表制作是一个数据分析师必备的技能。Pyt
- 如何用POP3接收电子邮件?POP3大行其道,我看见朋友已经用Jmail和POP3接收邮件了。该如何做?以Jmail4.1为例,我们演示一下
- 科学设计你的网站网页:来自 Eye-Tracking研究的23节必修课 ——Christina Laun在网络设计领域关于Eye-
- 1、get方法请求接口url:显而易见,就是接口的地址url啦headers:请求头,例如:content-type = applicati
- 下载地址:安装包可以从这里下载:http://www.itellyou.cn/SQL Server 2016 Enterprise with
- 前言:之前的文章我们已经开启了爬虫程序的exe之旅,但是我们最终实现的程序存在一个非常大的问题,当进行网络请求的时候,程序卡死,直到数据请求
- 学习笔记,写到哪是哪。接着上一篇对纯文本文件读写操作,主要去实现一些文件夹操作。创建文件夹创建文件夹的时候往往要先判断文件夹是否存在。样例代
- 概述Base64 是网络上最常见的用于传输 8Bit 字节码的编码方式之一,Base64 就是一种基于 64 个可打印字符来表示二进制数据的
- 实例如下:$("#stream_title").val().trim().replace(/\s/g,"&qu
- /*Bresenham画圆算法*/var arc = function(x0,y0,r){/*起点坐标x0,y
- 本文为大家分享了python的concat等多种用法,供大家参考,具体内容如下1、numpy中的concatenate()函数:>&g