gpt4 book ai didi

c++ - 如何以给定的 MIDI 音符/ Octave 音程播放声音?

转载 作者:行者123 更新时间:2023-11-27 23:12:22 32 4
gpt4 key购买 nike

我正在对一种似乎是带有音色库的 MIDI 的音乐格式进行逆向工程。

但是我无法使我的实现听起来正确,因为我不知道如何以给定的 MIDI 音符播放音库中的样本(我只是以它们的原始 khz 播放它们)。

所以我的问题是 - 如果我在一个波形文件中有一些声音,例如 foo.wav @ 44100khz 和一个 0 到 127 的 MIDI 音符,那么我该如何在这个音符上播放它?

我正在使用 Win32 API 和 DirectSound - 但我不认为这很重要,因为我认为该理论可以应用于任何地方。

最佳答案

您必须以不同的速率播放样本,以使其音调正确。

样本和 MIDI 事件都有音符。使用 Note names, MIDI numbers and frequencies 中的公式计算两个频率:

f = 440Hz * 2^((m−69)/12)

然后,根据实际频率和所需频率,您可以知道样本速度必须改变的比率。


例如,如果您有一个在 B4 播放音符的 44.1 kHz 样本,并且如果您得到一个想要在 D5 播放音符的 MIDI 事件,则样本的音符频率为 493.88 Hz,而它应该播放因此音符的频率为 587.33 Hz。换句话说,它应该被加速 587.33/493.88 ≈ 1.19 倍。

因此,不是以 44.1 kHz 播放该样本,而是必须以 44.1 kHz × 1.19 ≈ 52.4 kHz 播放该样本。

假设您的输出设备仍以 44.1 kHz 运行,您必须重新采样该音符样本。为此,请告诉重采样器您要将 52.4 kHz 转换为 44.1 kHz。


注意:当计算两个音符m1m2的频率比时,440 Hz69 条款抵消,你得到:

f1 / f2 = 2 ^ ((m1 - m2) / 12)

关于c++ - 如何以给定的 MIDI 音符/ Octave 音程播放声音?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19388521/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com