gpt4 book ai didi

audiokit - 更改 AKSequencer 的长度 : weird behavior

转载 作者:行者123 更新时间:2023-12-02 19:04:20 26 4
gpt4 key购买 nike

我有一个支持循环的 aksequencer,我想在播放期间更改长度。我已经用 setLength() 和 setLoopInfo() 尝试过这一点,但似乎都无法正常工作。

预期行为:如果我有一个 16 节拍序列,并且我调用changeSequenceToLength(12),我希望循环从节拍 1-12 播放,然后重复。 (当然,我应该处理在第 12 拍之后更改长度的情况,但你明白了)。

实际行为:鱼龙混杂。当我使用 setLength(endbeat) 时,它只是删除 endbeat 之后的 MIDI 事件,但循环仍然是 16 节拍。当我调用 setLoopInfo(duration, numloops) 时,它缩短了循环,但从错误的一侧。因此,它不再播放 1-12,而是播放 4-16。当我第一次更改循环持续时间时,它还会出现一些奇怪的卡顿现象。

任何有关如何解决此问题的建议将不胜感激!我也查看了支持苹果 MusicSequence 的文档,但它非常稀疏。

我的代码大致如下:

import AudioKit
import AudioKitUI

final class Sequencer: AKSequencer {
static let shared = Sequencer() //Singleton

var numBeats = 16 // Number of spaces in the grid
var beatLength = 1/4.0
var sequenceDuration: AKDuration {
get {
return AKDuration(beats: (numBeats * beatLength))
}
}

private override init() {
super.init()
setTempo(120.0)
for _ in 0..<8 {
let track = newTrack()
}
let callback = AKCallbackInstrument() { status, note, velocity in
//send midi messages...
}
let midiNode = AKMIDINode(node: callback)
setLength(sequenceDuration)
AudioKit.output = midiNode
AudioKit.start()
midiNode.enableMIDI(Midi.shared.client, name: "midiNode midi in")
enableLooping()
}

func changeSequenceToLength(length: Int) {
numBeats = length
setLength(sequenceDuration)
// setLoopInfo(sequenceDuration, numberOfLoops: 50)
}
}

编辑:所以我找到了 AKMusicTrack.setLengthSoft(),所以当我缩短序列时,我的 midi 序列不会被删除。我还阅读了 setLoopInfo 的代码,它确实应该从末尾向后创建一个循环(它不应该采用 startTime 和 offset 吗??)。但当我更改序列长度时,我仍然遇到播放卡顿的问题。

最佳答案

调用 setLength() 后,您需要通过调用 enableLooping() 重新断言循环行为(或者您可以使用 setloopInfo这将一步完成这两件事)。但基本上在定序器运行时改变循环长度将是一个问题。

重要的是要了解,AKSequencer 本质上是 CoreMIDI 的 MusicSequence 的 Swift 包装器,因此它基本上继承了 MusicSequence 的大部分怪癖,并且限制。这些限制之一是,虽然您可以设置循环范围的“左侧”,但无法设置“右侧” - 它将始终循环回 MusicTimeStamp 0。调用 setLoopinfo (或者也可以调用 setLength() 后跟 enableLooping()) 实际上并没有像你所说的那样从错误的一侧缩短循环(尽管我也认为它是这样做的,一开始) )。它正确设置了循环长度,但还将播放头传送到“新循环长度”节拍远离“旧循环长度”的位置。因此,如果您将 16 节拍循环更改为 12 节拍循环,MusicSequence 将从 0 循环到 12,但会将播放头移动到节拍 4 (16 - 12 = 4)。它不会从4播放到16,而是从4播放到12,它们从0循环到12。有时你可以work around this你可以在玩的时候完成这项工作,但大多数情况下这是一种痛苦。最好的解决方案是在更改循环长度时停止播放。 CoreMIDI'a MusicSequence 不太擅长动态处理变化。

关于audiokit - 更改 AKSequencer 的长度 : weird behavior,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50655994/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com