编程音序器

时间:2011-03-19 14:53:58

标签: audio midi

我想构建一个类似于鼓机的音频多轨音序器。 您认为实现这一目标的最佳方式是什么?

目前我有2个数组代表的2个轨道:2 x [tick,samplePointer]。 我将主要数组中的这2个轨道合并为[tick,samplePointer]并按刻度排序。 音频回调会触发每个节拍(每个节拍4个节拍)并检查数组中的第一个元素,如果其音符等于全局歌曲位置(以刻度表示),则我播放它。 如果我在2个轨道(数组)中的一个中添加或删除音符,则我将合并两个轨道(数组)并再次对它们进行排序。

它有效,但我觉得有一种更好的方法。 实施这样一个项目的最佳做法是什么?像Logic,Ableton,Cubase,Reason等专业应用程序如何实现音频/ midi事件列表并管理已播放的内容,需要播放的内容?

提前感谢您的想法。

布莱斯

1 个答案:

答案 0 :(得分:5)

需要更多细节才能更好地回答您。你用的是哪种语言?您定位的节奏范围是多少?你将编程什么音频接口(重要的是要知道你将要处理的延迟)。

另外,它只是一个鼓音序器吗?还是更复杂的东西?你打算支持多少“乐器”/“声音”?如果你要支持< 32个声音,那么可以有一个[int(tick),int(voices)]数​​组。每个单独的语音都是32位数字。然后,要确定是否正在播放语音,您只需要“&”语音标志对阵阵列中的声音int。这样可以避免数组排序/复制/构建。

延迟是这里需要了解的重要问题。例如,如果你的速度为240bpm,每次击打有4个“滴答”(实际上,我们正在谈论一个措施,每个节拍细分为十六分音符):

  • 每秒钟有4次节拍(每分钟240次/ 60秒) - >每个节拍每250毫秒发生一次 - >每个“tick”发生在62.5毫秒

如果音频接口具有高延迟(例如,Windows Vista +中的共享模式WASAPI的延迟大约为30毫秒),您将需要生成不同的“窗口”。

如果您正在处理MIDI事件,这变得更加重要,因为您可以在个人刻度内接收MIDI事件。

我使用的大多数DAW(数字音频工作站)通常以两种不同的“类型”来思考世界:音频数据和midi数据。音频数据往往更“实时”(或尽可能实时,因此对于3ms以下的延迟非常重要)。 Midi仍然相当“快节奏”。最终,您可能会考虑midi数据。

然而,开始这样一个项目的最好方法是构建一个非常简单的鼓音序器。拿四个鼓,你正在做的东西,然后从那里去:)。祝你好运!