5

我有一个音频应用程序,其中所有的声音生成工作都是由纯数据(使用 libpd)完成的。

我用 swift 编写了一个特殊的音序器,它控制多个序列的开始/停止播放,由合成引擎以纯数据形式播放。

到目前为止,我完全避免在我的应用程序的任何方面使用 Core Audio 或 AVFoundation,因为我对它们一无所知,而且它们似乎都需要 C 或 Objective C 编码,而我几乎一无所知。

但是,我在这里之前的问答中被告知,我需要使用 Core Audio 或 AVFoundation 来获得准确的时间。没有它,我已经尝试了其他所有方法,而且时间完全混乱(迟钝,紧张)。

所有关于 Core Audio 的教程和书籍对我来说似乎都非常广泛和深入。如果我需要从其中一个框架中获得的只是我的音序器的准确时序,那么作为一个完全是 Core Audio 和 Objective-C 的新手,但拥有 95% 完成的音频应用程序的人,你如何建议我实现这一点?

4

2 回答 2

6

如果您的音序器是 Swift 代码,它依赖于即时调用来推送音频,那么它将无法以良好的计时精度工作。例如,您无法获得所需的时间。

Core Audio 使用实时拉取模型(不包括任何有趣复杂的 Swift 代码)。AVFoundation 可能需要您提前创建音频并安排缓冲区。iOS 应用程序几乎需要从头开始设计,以适应这两种解决方案中的一种。

补充:如果您现有的代码可以提前一点生成音频样本,足以使用抖动的操作系统计时器在统计上覆盖,您可以安排此预生成的输出在几毫秒后播放(例如,当在正确的采样时间拉)。

于 2018-05-04T01:43:13.797 回答
2

AudioKit是一个开源音频框架,提供对 Core Audio 服务的 Swift 访问。它包括一个基于 Core Audio 的音序器,并且有大量以 Swift Playgrounds 形式提供的示例代码。

AudioKit AKSequencer类具有您需要的传输控件。您可以通过编程方式将 MIDI 事件添加到您的音序器实例,或从文件中读取它们。然后,您可以将您的音序器连接到 AKCallbackInstrument,它可以在接收到 MIDI noteOn 和 noteOff 命令时执行代码,这可能是触发您生成的音频的一种方式。

于 2018-12-12T17:33:47.857 回答