Вы определенно на правильном пути - вы можете легко получить случайные аудиофайлы для зацикливания с фиксированным интервалом с помощью AKSequencer + AKCallbackInstrument.Но я бы не стал беспокоиться о попытке перезагрузить сообщение NoteOff.
Сначала я бы загрузил каждый mp3 в отдельный проигрыватель (например, AKAppleSampler) в массиве (например, вы могли бы назвать его players
).и создайте метод, который будет запускать одного из этих игроков случайным образом:
func playRandom() {
let playerIndex = Int(arc4random_uniform(UInt32(players.count)))
try? players[playerIndex].play()
}
Когда вы создаете свой секвенсор, добавьте трек и назначьте его для AKCallbackInstrument
.Функция обратного вызова для этого AKCallbackInstrument
вызовет playRandom
, когда получит сообщение noteOn.
seq = AKSequencer()
track = seq.newTrack()!
callbackInst = AKCallbackInstrument()
track.setMIDIOutput(callbackInst.midiIn)
callbackInst.callback = { status, note, vel in
guard status == .noteOn else { return }
self.playRandom()
}
Нет необходимости загружать секвенсор с файлом MIDI.Вы можете просто добавить инициирующее MIDI-событие непосредственно на дорожку.
track.add(noteNumber: 48, // i.e., C3
velocity: 127,
position: AKDuration(beats: 0), // noteOn message here
duration: AKDuration(beats: 8), // noteOff 8 beats later
channel: 0)
Возможно, ваша проблема с синусоидальной волной вызвана дополнительной дорожкой (возможно, дорожкой темпа) в созданном вами MIDI-файле, который не имеетне был назначен выход.Вы можете полностью избежать этой проблемы, напрямую добавляя события MIDI.
В принципе, вы можете использовать обратный вызов для проверки событий noteOff и запуска кода из noteOff, но я не рекомендовал бы это в вашем случае.Нет веских причин повторно использовать один плеер для нескольких аудиофайлов.При загрузке файла вы, скорее всего, создадите ошибку.Что произойдет, если ваш файл не закончил воспроизведение, и вы пытаетесь загрузить другой?Ресурсы, необходимые для хранения нескольких плееров в памяти, довольно тривиальны - если вы собираетесь воспроизводить один и тот же файл более одного раза, его будет проще и безопаснее загрузить один раз и сохранить плеер в памяти.