将洛奇的MML乐谱转为beep(蜂鸣器)乐谱

本文介绍了如何将洛奇游戏的MML乐谱转换为适用于蜂鸣器播放的beep乐谱。通过音高频率表、词法分析和语法分析,将MML谱转化为beep谱,并提供了C++播放方法。注意,Windows 7及更高版本的系统由于使用声卡模拟,可能无法准确播放蜂鸣器音乐。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近对蜂鸣器音乐感兴趣,但是找不到乐谱,于是想把其他乐谱转为蜂鸣器乐谱。直接用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, 
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值