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