У меня есть aksequencer с поддержкой петель, и я хочу изменить длину во время воспроизведения.Я пробовал это с setLength () и setLoopInfo (), но ни один из них, кажется, не работает правильно.
Ожидаемое поведение: если у меня есть 16-битная последовательность, и я вызываю changeSequenceToLength (12), я ожидаюЦикл, чтобы играть от ударов 1-12, и повторите.(конечно, я должен разобраться со случаем, когда я изменяю длину после удара 12, но вы понимаете).
Фактическое поведение: смешанная сумка.Когда я использую setLength (endbeat), он просто удаляет события midi после endbeat, но цикл все равно 16 ударов.Когда я вызываю setLoopInfo (duration, numloops), он сокращает цикл, но не с той стороны.Таким образом, вместо 1-12, он играет 4-16.Это также делает странное заикание, когда я впервые изменяю длительность цикла.
Любые предложения о том, как подойти к этому, будут высоко оценены!Я также посмотрел документы для поддержки MusicSequence для Apple, но он довольно скудный.
Мой код выглядит примерно так:
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)
}
}
edit: Итак, я нашел AKMusicTrack.setLengthSoft (), поэтому моя последовательность миди не удаляется, когда я укорачиваю последовательность.Я также прочитал код для setLoopInfo, и он действительно должен создавать цикл от конца назад (не должен ли он принимать startTime и смещение ??).Но у меня все еще возникают проблемы с заиканием воспроизведения при изменении длины последовательности.