2016-04-30 8 views
1

Я пытаюсь запрограммировать 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 связана с этим, но я использую быстро и, похоже, небольшая документация, которую я могу понять по этому вопросу. Может ли кто-нибудь указать мне в правильном направлении?

ответ

1

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