【发布时间】: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