将弯音 (MIDI) 值转换为“正常”音高值

信息处理 音乐 沥青
2022-01-14 06:32:52

我正在尝试使用此处给出的 rt_lpc(实时 LPC)实现进行离线 LPC 分析和综合程序中有一些函数可用于离线 LPC 分析和综合程序。rt_lpc 代码主要用于作曲家等,这意味着它使用 MIDI 或声门脉冲输入。程序中有一些代码将音高值(从自相关获得)转换为该bend值。关系如下:

    pitch = (int)( Stk::sampleRate() / midi2pitch[ananya.data[1]] ) /
                            pow( 1.0653f, bend/64.0f*11.0f );
                    power *= ananya.data[2] / 64.0f;
bend = ge.data[1] / 128.0f + ge.data[2] - 64;

几点
是一个似乎是动态填充ananya的类型的对象。 湾。也是一个似乎也是动态填充的类型对象。 C。这两个对象是在程序实时运行时创建的(我的是一个离线版本,它在我自己的 main.cpp 中运行它的选择性部分。MidiMsg
geMidiMsg

我的问题:
1. 什么是弯音?
2. 如何将音高值转换为弯曲值?映射关系是什么?

我搜索了解决方案,但没有找到明确的答案。

2个回答

MIDI 的核心是将音乐表示为离散的音符事件,每个音符事件都有一个静态音高。这非常适合代表在键盘乐器上演奏的音乐。您可以使用以下方法将与回火音阶上的音符对应的任何频率转换为 MIDI 音符编号:

69+12×log2frequency440

假设 MIDI 接收器校准为 A4 = 440 Hz。

这种表示对于钢琴音乐来说是可以的,但问题是如何表示未映射到调音音阶的音高(非西方音乐,非音乐声音),以及如何表示音符持续时间的音高变化(滑音,颤音)。

这是通过使用“弯音信息”在 MIDI 中完成的,该信息指示合成器将当前播放的音符的音高移动一个小间隔。大多数合成器在弯音消息范围 (0 .. 16383) 的过程中默认校准为 +/- 2 个半音。8192 对应于没有音高弯曲 - 发出的音高正是音符值的音高。弯音值和频移比之间的映射由下式给出:

femitted_notefnote_message=2pitchbend81924096×12

因此,您可以从以下公式中获得合成器播放音符的频率:

440×2note6912.0+pitchbend81924096×12

其中note是最后收到的Note On消息的 7 位 MIDI 音符编号;pitchbend是最后收到的Pitch Bend消息的 14 位值。合成器开始时其弯音寄存器设置为 8192,并且在接收到“重置所有控制器”消息期间该值也会重置。

让我们举个例子。您想将具有以下频率轨迹的长笛颤音表示为 MIDI 信息:500 Hz、510 Hz、500 Hz。

基音编号为:

round(69+12×log2(500/440))=71.

所以你发送一个“note on”消息,note# 等于 71。这相当于一个音高:

440×2(7169)/12=493.88

这是回火音阶上最近的音高。您需要发送弯音消息以将音高提高以下系数:

500493.88=1.0124

并获得您的 500 Hz。对应的弯音值为:

round(8192+4096×12×log21.0124)=9065

要获得 510 Hz,弯音值将是:

round(8192+4096×12×log2510493.88)=10469

因此,500、510、500 Hz 的 MIDI 消息序列将是:

  • 注释 71
  • 弯音 9065
  • ...
  • 弯音 10469
  • ...
  • 弯音 9065

您可以将 MIDI 音符编号视为音高的“整体”部分;和弯音作为音高的冗余“小数”部分。

MIDI 是一种允许(主要)合成器控制或受其他合成器或计算机控制的协议。

这是一个串行协议,允许交换消息,例如“key C1 up”“key D4 down”“key velocity”,“sound change”等。许多控制器都有一个“音高轮”,它是一个操纵杆或调制轮。这些允许演奏者以交互方式改变当前正在演奏的音符的音高以手动创建颤音或从一个音符连续“滑动”到下一个音符。由于吉他演奏者经常用左手弯曲按弦的琴弦来完成此操作,因此通常称为音高弯曲,因此得名。

MIDI 弯音消息是一种传达在任何给定时间点应该发生多少音高变化的方式。接收弯音消息的合成器(软件或硬件)应该改变所有当前正在播放的音符的音高给定的数量。

控制器消息有一个从 -8192 到 8191 的参数,在标准 MIDI 文件中,这应该涵盖从 -200 分到 200 分的范围,其中 1 分是半音的 1/100,即比率为 2^( 1/1200) = 1.000577789506555。示例:要创建向下的音调偏移以达到标称频率的 93%,控制器值将是

c = round(log2(.93)*12*8192/2);

或 -5146 在这种情况下。0.93 是您想要的比率,12 是每个八度音程的半音数,2 是最大弯音范围(在这种情况下是 200 分或 2 个半音),log2() 是基数为 2 的对数。

然而,在大多数合成器中,范围是可配置的,假设所有合成器的行为都相同可能不是一个好主意。

这是一个可能有帮助的转换表。 http://www.elvenminstrel.com/music/tuning/reference/pitchbends.shtml