2

我正在尝试在播放多个 AKPlayers 时实现开关。首先,我调用了两个,由inAKPlayers触发。AKCallbackInstrumentsAKSequencer

当我打开开关时,1)两个 AKPlayer 被分配给 AKMixer,2)Audiokit 启动,3)两个轨道被添加到 AKSequencer,4)Sequencer 启动。

并且当关闭时,1)两个AKPlayers.stop(),2)sequencer.stop()3)sequencer.deleteTrack(trackIndex: 0)sequencer.deleteTrack(trackIndex:1)4)AudioKit.stop()

首先打开和关闭工作成功。但是当我第二次打开开关时,音乐越来越响亮,可能是因为一些 MIDI 音轨/音序器音轨没有完全移除。谁能告诉我我在这里缺少什么?非常感激。<3

4

2 回答 2

2

这是不断将播放器添加到越来越多的混音器通道而不删除以前的播放器的症状。如果您实际上想在启动时重新连接它,您还想做的是停止播放器.disconnectOutput()。

我不知道它与你的音序器有什么关系。

也就是说,我不明白你为什么要在开始时重新添加播放器。最好在 init 上建立音频链,并在您完全完成后拆除。

于 2018-11-06T17:46:47.303 回答
2

要了解此处实际发生的情况,您可以在每次删除后记录曲目的内容。例如:

for (i, track) in sequencer.tracks.enumerated() {
    print("track: \(i)")
    print(track.getMIDINoteData())
}

一种可能性是,当您删除磁道 0 时,这些磁道会自行重新编制索引,这意味着第二次删除调用将无效。

也许更安全和更可预测的处理方式是使用track.clear()而不是delete. 您可以在开始时创建您需要的轨道,并AKCallbackInstrument在设置阶段将它们的输出分配给唯一一次。然后,您可以根据需要安全地向曲目添加注释或清除曲目中的事件。同样,记录轨道内容track.getMIDINoteData()将有助于调试。

此外,我不建议您过多地停止和启动 AudioKit。初始化应用程序时启动 AudioKit,并保持打开状态,除非您有令人信服的理由停止它。

于 2018-10-29T12:46:55.317 回答