Эта топика c была покрыта Многочисленные времена , и я успешно использовал AKMIDICallbackInstrument
со старым AKAppleSequencer
в моих предыдущих приложениях.
Я начинаю с используйте новый AKSequencer
, который является абсолютно феноменальным: элегантный интерфейс и простой в использовании. Тем не менее, я не могу за свою жизнь понять, как обрабатывать события обратного вызова с ним. Мне нужно использовать обратный вызов для запуска GUI событий на основе воспроизведения секвенсора.
Вот мой пример кода:
private func setMetronome(bpm: BPM, beats:Int)
{
sequencer = AKSequencer(targetNode: metronomeSampler)
sequencer.tempo = bpm
sequencer.loopEnabled = false
sequencer.length = Double(beats)
metroCallback.callback = {status, noteNumber, velocity in
if let midiStatus = AKMIDIStatus(byte: status), midiStatus.type != .noteOn { return }
//Do callback stuff here
}
let metroCallbackTrack = sequencer.addTrack(for: metroCallback)
for i in 0..<beats
{
if i == 0
{
sequencer.add(noteNumber: MIDINoteNumber(67), position: Double(i), duration: 1.0)
metroCallbackTrack.add(noteNumber: MIDINoteNumber(67), position: Double(i), duration: 1.0)
}
else if (i % 4 == 0)
{
sequencer.add(noteNumber: MIDINoteNumber(67), position: Double(i), duration: 1.0)
metroCallbackTrack.add(noteNumber: MIDINoteNumber(60), position: Double(i), duration: 1.0)
}
else
{
sequencer.add(noteNumber: MIDINoteNumber(60), position: Double(i), duration: 1.0)
metroCallbackTrack.add(noteNumber: MIDINoteNumber(60), position: Double(i), duration: 1.0)
}
print("seq count:\(i)")
}
for track in sequencer.tracks
{
print("Adding track to mixer:\(track.length)")
track >>> mixer
}
}
Этот код правильно создает последовательность n
количество ударов, оно воспроизводится через мои AKSampler
все хорошо в мире. За исключением того, что не происходит никаких событий обратного вызова (используя операторы печати для подтверждения)
Процесс мышления
С AKAppleSequencer
и AKMIDICallbackInstrument
, вы можете установить globalMIDIOutput
с AKAppleSequencer
с миди-входом AKMIDICallBackInstrument
.
Теперь новые AKSequencer
и AKCallbackInstrument
не имеют этих опций, равно как и новый AKSequencerTrack
(старый AKAppleSequencer
будет использовать AKMusicTrack
объекты, которые могут устанавливать миди-ввод / вывод). Рассматривая реализацию нового AKSequencer
, он управляется AKNode
объектами, AKCallbackInstrument
является a AKNode
объектом и должен иметь возможность управляться треком с нужными промежуточными данными. ,
Я добавляю трек в мой секвенсор и с этого трека и необходимые миди-данные, точно дублирующие миди-события, на которые я хочу отозвать, и выполняю мои GUI события. Однако при таком подходе он не вызывает обратный вызов.
Кто-нибудь знает, как использовать эти новые компоненты с обратным вызовом? Я действительно не хочу go возвращаться к AKAppleSequencer
, если нет явного способа управлять обратными вызовами с новым AKSequencer
.