В вашем коде есть несколько запутанных вещей, поэтому я не уверен, что это ваша единственная проблема, но, как минимум, каждый раз, когда вы изменяете длину вашей последовательности, вам нужно будет вызвать setLength()
с последующим enableLooping
.По сути, по умолчанию (т. Е. Если вы явно не установите длину) длина последовательности будет равна длине самой длинной дорожки в последовательности.В вашем методе «воспроизведения» вы добавляете дорожку поверх дорожки, не удаляя старые, поэтому у вас нет возможности узнать, как долго вы предполагаете эту последовательность.
Ваш метод «воспроизведения» выполняет два разных действия.вещи (ни одна из которых не включает воспроизведение).Вы могли бы хотеть сломать это.У вас может быть setup()
для выполнения действий, которые когда-либо нужно выполнять только один раз (создание дорожек, настройка их выходов, настройка обратного вызова) и rewriteSequence()
методы, которые вызываются, когда вы хотите переписатьдорожек.Таким образом, вы можете повторно использовать существующие треки, а не постоянно создавать новые.
var metronomeTrack: AKMusicTrack!
var callbackTrack: AKMusicTrack!
// call this just once at the start
func setup() {
metronomeTrack = sequencer.newTrack()
metronomeTrack?.setMIDIOutput(click.midiIn)
callbackTrack = sequencer.newTrack()
callbackTrack?.setMIDIOutput(callbackInst.midiIn)
callbackInst.callback = {status, noteNumber, velocity in
guard status == .noteOn else { return }
print("beat number: \(noteNumber + 1)")
}
}
// call this each time you want to change the sequence
func rewriteSequence() {
metronomeTrack?.clear()
callbackTrack?.clear()
for steps in 0 ... Int(measuresRowOneValue) {
metronomeTrack?.add(noteNumber: 60, velocity: 100, position: AKDuration(beats: Double(steps)), duration: AKDuration(beats: 0.5))
callbackTrack?.add(noteNumber: MIDINoteNumber(steps), velocity: 100, position: AKDuration(beats: Double(steps)), duration: AKDuration(beats: 0.5))
}
// This will make sure it loops correctly:
sequencer.setLength(AKDuration(beats: Double(measuresRowOneValue)))
sequencer.enableLooping()
}
Надеюсь, это поможет.