MIDI 的核心是将音乐表示为离散的音符事件,每个音符事件都有一个静态音高。这非常适合代表在键盘乐器上演奏的音乐。您可以使用以下方法将与回火音阶上的音符对应的任何频率转换为 MIDI 音符编号:
69+12×log2frequency440
假设 MIDI 接收器校准为 A4 = 440 Hz。
这种表示对于钢琴音乐来说是可以的,但问题是如何表示未映射到调音音阶的音高(非西方音乐,非音乐声音),以及如何表示音符持续时间的音高变化(滑音,颤音)。
这是通过使用“弯音信息”在 MIDI 中完成的,该信息指示合成器将当前播放的音符的音高移动一个小间隔。大多数合成器在弯音消息范围 (0 .. 16383) 的过程中默认校准为 +/- 2 个半音。8192 对应于没有音高弯曲 - 发出的音高正是音符值的音高。弯音值和频移比之间的映射由下式给出:
femitted_notefnote_message=2pitchbend−81924096×12
因此,您可以从以下公式中获得合成器播放音符的频率:
440×2note−6912.0+pitchbend−81924096×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(71−69)/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 音符编号视为音高的“整体”部分;和弯音作为音高的冗余“小数”部分。