【问题标题】:Using AVAudioSequencer to send MIDI to third-party AUv3 instruments使用 AVAudioSequencer 将 MIDI 发送到第三方 AUv3 乐器
【发布时间】:2019-02-18 19:00:37
【问题描述】:

我在使用AVAudioSequencer(iOS 12.1.4、Swift 4.2、Xcode 10.1)通过 MIDI 控制第三方 AUv3 乐器时遇到问题,希望您能提供帮助。

我目前在做什么:

  • 获取kAudioUnitType_MusicDevice类型的所有AU。

  • 实例化一个并将其连接到AVAudioEngine

  • 创建一些笔记,并将它们放在MusicTrack

  • 将跟踪数据交给连接到引擎的AVAudioSequencer

  • 将轨道的destinationAudioUnit 设置为我选择的音频单元。

到目前为止,一切都很好,但是......

当我使用AVAudioSequencer 播放序列时,它第一次播放良好,使用选定的音频单元。第二次我得到了沉默或正弦波的声音(我想知道是谁在制造它)。我认为音频单元不应该在序列播放之间超出范围,但我确实停止了引擎并再次重新启动它以进行新一轮。 (但它甚至应该可以在引擎运行时交换 AU,所以我认为这是可以的。)

是否有一些我遗漏的步骤?我很想包含代码,但是很难从一堵文本墙中将其浓缩为本质。但是如果你想问具体的,我可以回答。或者,如果您能指出一个工作示例,展示如何使用 AVAudioSequencer 可靠地将 MIDI 发送到 AUv3,那就太好了。

AVAudioSequencer 甚至应该与 Apple 以外的其他音频单元一起使用吗?还是我应该开始寻找其他方式将 MIDI 发送到 AUv3?

我应该补充一点,我可以使用 Apple 的 AUv3Host 示例中的 InstrumentPlayer 方法始终将 MIDI 发送到 AUv3,但这涉及并发线程,并导致各种 UI 同步和计时问题。

编辑:我向 GitHub 添加了一个示例项目: https://github.com/jerekapyaho/so54753738

它现在似乎可以在 iPadOS 13.7 中运行,但我认为我所做的与以前没有什么不同,除了这会从包中加载一个 MIDI 文件,而不是从动态数据中生成它。

如果有人仍然拥有 iOS 12,那么很高兴知道它是否在那里坏了,但在 iOS 13.x 上工作 (x = ?)

【问题讨论】:

  • 嗨,杰尔。你能分享你在这些步骤中使用的代码吗?可能更容易看出问题所在。
  • 您好 Jere,希望您找到解决问题的方法。我正在做一些不同的事情,它是尝试使用AVAudioSequencer 来生成一个 MIDI 文件。在我的应用程序中,我正在播放 MIDI 音符,并希望将它们发送到 AVMusicTrack 并从那里创建一个 AVAudioSequencer。文档非常稀少。你说你能够创建一些笔记,将它们放在MusicTrack 上并将曲目交给AVAudioSequencer,你能分享一下你是如何做到这一点的吗?提前感谢您提供的任何帮助。
  • @TheNeil 我仍然希望/需要在我的应用程序中执行此操作,因此我正在考虑制作一个孤立的、最小的、可验证的示例并将其放在 GitHub 上。也许我会在这个过程中解决它,或者至少希望它有助于尝试推理它。
  • @caminante-errante:如果/当我开始制作我在上面评论中提到的孤立示例时,这也可能对您有所帮助。
  • 该示例已在 GitHub 上发布,请参阅问题中的上述链接。

标签: ios swift avfoundation core-audio audiounit


【解决方案1】:

如果您使用AVAudioUnitSampler 作为音频单元乐器,当您停止并启动音频引擎而不重新加载预设时,会出现正弦音。每当您启动引擎时,您都需要将任何乐器加载回采样器(例如 SoundFont),否则您可能会听到正弦波。这是 Apple AUSampler 的问题,而不是 3rd 方仪器的问题。

顺便说一句,您可以使用模拟器在 iOS 12 下对其进行测试。

【讨论】:

    猜你喜欢
    • 2011-06-19
    • 2020-03-11
    • 1970-01-01
    • 1970-01-01
    • 2011-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多