我想构建一个类似于鼓机的音频多轨音序器。 您认为实现这一目标的最佳方式是什么?
目前我有2个数组代表的2个轨道:2 x [tick,samplePointer]。 我将主要数组中的这2个轨道合并为[tick,samplePointer]并按刻度排序。 音频回调会触发每个节拍(每个节拍4个节拍)并检查数组中的第一个元素,如果其音符等于全局歌曲位置(以刻度表示),则我播放它。 如果我在2个轨道(数组)中的一个中添加或删除音符,则我将合并两个轨道(数组)并再次对它们进行排序。
它有效,但我觉得有一种更好的方法。 实施这样一个项目的最佳做法是什么?像Logic,Ableton,Cubase,Reason等专业应用程序如何实现音频/ midi事件列表并管理已播放的内容,需要播放的内容?
提前感谢您的想法。
布莱斯
答案 0 :(得分:5)
需要更多细节才能更好地回答您。你用的是哪种语言?您定位的节奏范围是多少?你将编程什么音频接口(重要的是要知道你将要处理的延迟)。
另外,它只是一个鼓音序器吗?还是更复杂的东西?你打算支持多少“乐器”/“声音”?如果你要支持< 32个声音,那么可以有一个[int(tick),int(voices)]数组。每个单独的语音都是32位数字。然后,要确定是否正在播放语音,您只需要“&”语音标志对阵阵列中的声音int。这样可以避免数组排序/复制/构建。
延迟是这里需要了解的重要问题。例如,如果你的速度为240bpm,每次击打有4个“滴答”(实际上,我们正在谈论一个措施,每个节拍细分为十六分音符):
如果音频接口具有高延迟(例如,Windows Vista +中的共享模式WASAPI的延迟大约为30毫秒),您将需要生成不同的“窗口”。
如果您正在处理MIDI事件,这变得更加重要,因为您可以在个人刻度内接收MIDI事件。
我使用的大多数DAW(数字音频工作站)通常以两种不同的“类型”来思考世界:音频数据和midi数据。音频数据往往更“实时”(或尽可能实时,因此对于3ms以下的延迟非常重要)。 Midi仍然相当“快节奏”。最终,您可能会考虑midi数据。
然而,开始这样一个项目的最好方法是构建一个非常简单的鼓音序器。拿四个鼓,你正在做的东西,然后从那里去:)。祝你好运!