最近对蜂鸣器音乐感兴趣,但是找不到乐谱,于是想把其他乐谱转为蜂鸣器乐谱。直接用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, 2349, 2489, 2637, 2794, 2960,