Я пытаюсь запрограммировать MIDI-последовательность с использованием инфраструктуры AudioToolbox от Apple, которая запускает анимацию в пользовательском интерфейсе. Мне удалось создать последовательность благодаря блогу Gene De Lisa, который я не буду реплицировать здесь целиком из-за длины кода. Основной процесс был создание AUGraph, сэмплер блока (AudioUnit()), A MusicPlayer и музыкальная последовательность:UIAnimations в ответ на MIDI-события в Swift
var processingGraph:AUGraph
var samplerUnit:AudioUnit
var musicPlayer:MusicPlayer
var musicSequence:MusicSequence
тогда я сделали функцию, чтобы заполнить музыкальную последовательность:
func createMusicSequence(quality: Int, root: UInt8, interval: UInt8) -> MusicSequence {
// create the sequence
var musicSequence = MusicSequence()
var status = NewMusicSequence(&musicSequence)
if status != OSStatus(noErr) {
print("\(__LINE__) bad status \(status) creating sequence")
CheckError(status)
}
MusicSequenceSetAUGraph(musicSequence, self.processingGraph)
status = MusicSequenceNewTrack(musicSequence, &trackOne)
CheckError(status)
status = MusicSequenceNewTrack(musicSequence, &trackTwo)
CheckError(status)
status = MusicTrackSetDestNode(trackOne, samplerNode)
CheckError(status)
status = MusicTrackSetDestNode(trackTwo, samplerNodeTwo)
CheckError(status)
var beat = MusicTimeStamp(0)
var i = 1
while i <= 4 {
var mess = MIDINoteMessage(channel: 0,
note: 60,
velocity: 64,
releaseVelocity: 0,
duration: 1.0)
status = MusicTrackNewMIDINoteEvent(trackOne, beat, &mess)
if status != OSStatus(noErr) {
CheckError(status)
}
beat++
i++
}
switch quality{
case 0: flexiChord(root, transFunc: interval, chordQuality: maj7)
case 1: flexiChord(root, transFunc: interval, chordQuality: min7)
case 2: flexiChord(root, transFunc: interval, chordQuality: dom7sharpNineFive)
default: print("error creating sequence")
}
loopTrack(trackOne)
loopTrack(trackTwo)
status = MusicSequenceNewTrack(musicSequence, &trackThree)
MusicSequenceGetTempoTrack(musicSequence, &trackThree)
self.musicPlayer = createPlayer(musicSequence)
return musicSequence
}
SO ... Я не могу понять, как обнаружить события заметок и анимировать пользовательский интерфейс, основанный на них в режиме реального времени, - я понимаю, что установка обратного вызова пользователя или конечной точки midi связана с этим, но я использую быстро и, похоже, небольшая документация, которую я могу понять по этому вопросу. Может ли кто-нибудь указать мне в правильном направлении?