赞
踩
最近对蜂鸣器音乐感兴趣,但是找不到乐谱,于是想把其他乐谱转为蜂鸣器乐谱。直接用MIDI转换很困难,因为MIDI一个音轨可以同时发出不同的音,所以我想到了用以前玩过的游戏中的乐谱(MML乐谱参考)
首先要知道每个音高对应的频率,按照十二平均律算,标准音高A4是440Hz,一个半音相差21/12倍,一个八度相差2倍
FREQ_TABLE = [[0 for scale in range(12)] for octave in range(9)] def gen_freq_table(): global FREQ_TABLE # A4标准音高 FREQ_TABLE[4][9] = 440 # 十二平均律 for scale in range(8, -1, -1): FREQ_TABLE[4][scale] = FREQ_TABLE[4][scale + 1] / 2 ** (1 / 12) for scale in range(10, 12): FREQ_TABLE[4][scale] = FREQ_TABLE[4][scale - 1] * 2 ** (1 / 12) for octave in range(3, -1, -1): for scale in range(12): FREQ_TABLE[octave][scale] = FREQ_TABLE[octave + 1][scale] / 2 for octave in range(5, 9): for scale in range(12): FREQ_TABLE[octave][scale] = FREQ_TABLE[octave - 1][scale] * 2 for octave in range(9): for scale in range(12): FREQ_TABLE[octave][scale] = round(FREQ_TABLE[octave][scale]) gen_freq_table()
生成表后直接硬编码即可
# 音程 -> 音阶 -> 频率,按十二平均律算
FREQ_TABLE = [
[16, 17, 18, 19, 21, 22, 23, 24, 26, 28, 29, 31], # C0~B0(未使用)
[33, 35, 37, 39, 41, 44, 46, 49, 52, 55, 58, 62], # C1~B1
[65, 69, 73, 78, 82, 87, 92, 98, 104, 110, 117, 123],
[131, 139, 147, 156, 165, 175, 185, 196, 208, 220, 233, 247],
[262, 277, 294, 311, 330, 349, 370, 392, 415, 440, 466, 494], # C4~B4
[523, 554, 587, 622, 659, 698, 740, 784, 831, 880, 932, 988],
[1047, 1109, 1175, 1245, 1319, 1397, 1480, 1568, 1661, 1760, 1865, 1976],
[2093, 2217
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。