使用Python程序计算钢琴88个键的音高

作者:雪山飞猪 时间:2021-12-24 06:46:31 

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

  • 频率翻倍,高一个八度

  • 国际基准音: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个键的音高

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

来源:https://www.cnblogs.com/chenqionghe/p/16118460.html

标签:Python,计算,钢琴,音高
0
投稿

猜你喜欢

  • python 中文件输入输出及os模块对文件系统的操作方法

    2023-04-10 18:34:05
  • Javascript Closures (1)

    2009-03-18 12:14:00
  • Flask response响应的具体使用

    2021-01-30 06:48:27
  • python的pdb调试命令的命令整理及实例

    2022-10-01 01:47:12
  • 教程:纯CSS作的小灯笼效果

    2008-08-26 17:22:00
  • 用Dreamweaver实现Real与网页结合

    2010-07-13 12:11:00
  • 从零学python系列之从文件读取和保存数据

    2021-02-11 01:51:29
  • asp.net DropDownList实现二级联动效果

    2023-07-23 07:48:41
  • 未将对象引用设置到对象的实例 (System.NullReferenceException)

    2023-06-27 10:46:53
  • 使用pandas的DataFrame的plot方法绘制图像的实例

    2023-07-02 08:33:52
  • Web 标准要求一览表

    2009-01-08 12:35:00
  • Python去除字符串前后空格的三种方法汇总

    2023-04-18 22:40:57
  • 使用WingPro 7 设置Python路径的方法

    2022-05-23 03:59:56
  • 《Python学习手册》学习总结

    2021-09-17 08:55:01
  • Python AI编程助手AICodeHelper使用示例

    2022-01-15 03:22:22
  • 动态加载JavaScript的小实践

    2009-11-12 12:38:00
  • sql server not in 语句使程充崩溃

    2012-01-05 19:05:00
  • python request 模块详细介绍

    2021-02-12 22:15:33
  • 如何在Python中妥善使用进度条详解

    2022-05-30 12:10:05
  • Python中的套接字编程是什么?

    2021-02-28 12:46:01
  • asp之家 网络编程 m.aspxhome.com