C++ 在音符中转换 MIDI 音符 ID

Posted

技术标签:

【中文标题】C++ 在音符中转换 MIDI 音符 ID【英文标题】:C++ Converting MIDI Note ID in a note 【发布时间】:2020-05-31 14:41:36 【问题描述】:

我有一个 Midi 键盘,当插入我的程序时,我可以将每个按下的值变为红色,但我很难找到合适的方法将每个 Note ID 转换为特定的音符。

键 ID 从 128 跳转到 640 到 1152 到 1408,每按一次键,它就会增加。

这是我尝试将 id 转换为音符的一些方法,但没有一种方法能够产生我想要的比例。

FTYPE CSscaleConvert(const int noteID)

    double d12th = pow(2.0, 1.0 / 12.0);
    //noteID = noteID * 0.01;
    //return 12 * log2((noteID / 100) / 440.0);
    return 0.256 * pow(d12th, noteID);
    //return 440 * log2(noteID * 0.01 - 69) / 12;
    //return noteID * 0.256;
    //return noteID;

【问题讨论】:

您如何阅读和解析音符开/关事件?请记住,数据分为两个字节,每个字节都有特殊的含义(分别是键和速度)。还要记住,每个字节仅使用 7 位来表示音符 ID 和速度。 wcout 我得到了id和速度的咬合的LO和HI 如果您使用 Windows HIWORDLOWORD 宏,它们会从 32 位双字中检索 16 位 字。 Midi 协议是基于 byte 的。你读过the specifications? 我对这方面的编程很陌生,我已经阅读了一些规范,但如果您可以发送对一些来源的参考,我真的无法在网上找到任何细节,我将不胜感激跨度> 【参考方案1】:

对于其他可能遇到此问题的人,我以前使用它来尝试访问数据 wcout

但这是正确的做法

HIBYTE(dwParam1)

【讨论】:

以上是关于C++ 在音符中转换 MIDI 音符 ID的主要内容,如果未能解决你的问题,请参考以下文章

如何将 magenta.js 音符序列转换为 midi 文件?

C++ 中的 MIDI 音符消息

将 midi 时间转换为小节和节拍

在 AudioKit 中“重新触发”Midi 音符

从 MIDI 中提取音符开始

MIDI,如何获取小节和音符