使用软件合成器制作实时音频应用程序

Tom*_*ing 3 audio synthesizer latency real-time openal

我正在研究制作一些使键盘功能像钢琴的软件(例如,用户按下'W'键,扬声器播放D音符).我可能会使用OpenAL.我理解数字音频的基础知识,但是在按键时播放实时音频会带来一些问题我无法解决.

问题在于:假设我有10个音频缓冲区,每个缓冲区都有一秒钟的音频数据.如果我必须在通过扬声器播放之前填充缓冲区,那么我会在播放前一两秒填充缓冲区.这意味着每当用户尝试播放音符时,按下琴键和正在播放的音符之间将有一到两秒的延迟.

你是如何解决这个问题的?你是否只是让缓冲区尽可能小,并尽可能地填充它们?有一些我不知道的伎俩吗?

Nil*_*nck 6

大多数软件合成器根本不使用多个缓冲区.

他们只使用一个不断播放的小铃声.

高优先级线程将尽可能多地检查当前播放位置并填充具有声音数据的环形缓冲区的自由部分(例如,自上次线程运行以来已播放的部分).

这将为您提供恒定的延迟,该延迟仅受环形缓冲区大小和声卡输出延迟的限制(通常不会那么多).

您可以进一步降低延迟:

如果要播放新音符(例如用户刚刚按下一个键),则检查铃声缓冲区中的当前播放位置,添加一些样本以确保安全,然后使用新声音重新渲染声音数据 - 应用的设置.

如果你有基于时间的效果运行(延迟线,混响等),这变得很棘手,但它是可行的.只需跟踪每毫秒左右基于时间的效果的最后10个状态.这样就可以及时恢复10毫秒.