编程音乐序列器

6
我想制作一个类似于鼓机的音频多轨序列器。您认为最佳实现方式是什么?
目前,我有两个由2个数组表示的轨道:2 x [tick,samplePointer]。 我将这两个轨道合并到主数组中以进行播放[tick,samplePointer],并按tick进行排序。 每个tick(每拍4个tick)都会触发音频回调,并检查数组中的第一个元素,如果其tick等于全局歌曲位置(以tick为单位),则播放它。 如果我在其中一个轨道(数组)中添加或删除音符,则合并这两个轨道(数组)并再次进行排序。
它能够工作,但我感觉有更好的方法来实现它。 如何实现此类项目的最佳实践?专业应用程序如Logic、Ableton、Cubase、Reason等如何实现音频/ MIDI事件列表并管理已播放和需要播放的内容?
提前感谢您的想法。
Brice
1个回答

6
需要更多细节才能更好地回答您。您使用什么语言?您的目标是什么速度范围?您将针对哪个音频接口进行编程(在处理延迟时非常重要)。
此外,它只是一个鼓序列器吗?还是更复杂的东西?您计划支持多少“乐器”/“声音”?如果您将支持<32个声音,则可以拥有单个[int(tick),int(voices)]数组。每个单独的声音都是32位数字中的一位。然后,要确定是否正在播放声音,您只需要将声音标志与数组中的声音int进行"&"运算即可。这将避免数组排序/复制/构建。
延迟是理解此处的重要问题。例如,如果您的速度为240bpm,并且每个节拍有四个“tick”(实际上,我们谈论的是每个节拍分成十六分音符的一个小节):
  • 每秒有4个节拍(每分钟240个节拍/ 60秒) ->每个节拍每250毫秒发生一次 ->每个“tick”每62.5毫秒发生一次
如果音频接口具有较高的延迟(例如,在Windows Vista+中的共享模式WASAPI的延迟约为30ms),则需要生成不同的“窗口”。
如果您正在处理MIDI事件,则这变得更加重要,因为您可以在单个tick内接收MIDI事件。
我使用过的大多数DAW(数字音频工作站)通常会以两种不同的“类型”来考虑世界:音频数据和midi数据。音频数据倾向于更加“实时”(或尽可能实时,因此对于低于3毫秒的延迟非常重要)。 Midi仍然相当“快节奏”。最终,您可能会考虑midi数据方面。
但是,像这样的项目的最佳方法是构建一个非常简单的鼓序列器。取四个鼓,以及您正在做的事情,并从那里开始:)。祝你好运!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接