• 用程序计算出钢琴88个键的音高


    image

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

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

    小字一组的la可以看下图

    image

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

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

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

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

    x = 440 / 16 = 27.5
    

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

    image

    每隔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)
    

    输出一下
    image
    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这个数组保存了每个琴键的音高
    image

    展示琴键音高

    df.replace(data)
    

    查看一下
    image
    这样就计算出了所有琴键的音高,perfect~

    延伸一下,泛音配比决定了音色,那么我们是不是也可以用程序控制泛音配比来调音呢?

  • 相关阅读:
    神经网络梯度下降的推导
    在虚拟环境里安装TensorFlow-cpu完成Ng作业
    利用anaconda配置虚拟环境
    Java基础(三)面向对象(下)
    Java基础(二)面向对象(上)
    Java基础(一)
    《深入理解计算机系统》阅读笔记--程序的机器级表示(上)
    《深入理解计算机系统》阅读笔记--信息的表示和处理(下)
    《深入理解计算机系统》阅读笔记--信息的表示和处理(上)
    《深入理解计算机系统》阅读笔记--计算机系统漫游
  • 原文地址:https://www.cnblogs.com/chenqionghe/p/16118460.html
Copyright © 2020-2023  润新知