UIAnimations в ответ на MIDI-события в Swift

Я пытаюсь запрограммировать MIDI-последовательность, используя структуру Apple AudioToolbox, которая запускает анимацию в пользовательском интерфейсе. Мне удалось создать последовательность благодаря блогу Джина Де Лизы, который я не буду воспроизводить здесь полностью из-за длины кода. Основной процесс заключался в настройке AUGraph, блока сэмплера (AudioUnit ()), musicPlayer и музыкальной последовательности:

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
}

ТАК ... Я не могу понять, как обнаруживать события заметок и анимировать пользовательский интерфейс на их основе в реальном времени - я понимаю, что установка обратного вызова пользователя или конечной точки midi имеет отношение к этому, но я использую swift, и, похоже, небольшая документация, которую я могу понять по этому вопросу. Может ли кто-нибудь указать мне правильное направление?


person derekFairholm    schedule 30.04.2016    source источник


Ответы (1)


Создайте виртуальное место назначения, используя MIDIDestinationCreateWithBlock. В вашем блоке чтения вы получите список пакетов. Просмотрите их и сделайте свою анимацию. Если вам нужен звук, ваш блок чтения должен будет перенаправить пакет на ваш сэмплер с помощью MusicDeviceMIDIEvent

person Gene De Lisa    schedule 04.05.2016