Swift 中响应 MIDI 事件的 UIAnimations

UIAnimations in response to MIDI events in Swift

我正在尝试使用 Apple 的 AudioToolbox 框架编写一个 MIDI 序列,该框架在 UI 中触发动画。感谢 Gene De Lisa 的博客,我已经成功地创建了序列,由于代码的长度,我不会在这里完整地复制它。基本过程是设置一个 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
}

SO...我不明白如何检测音符事件并根据它们实时为 UI 设置动画——我知道设置用户回调或 MIDI 端点与此有关,但是我正在使用 swift 并且似乎很少有我能够理解的关于这个主题的文档。有人能指出我正确的方向吗?

使用 MIDIDestinationCreateWithBlock 创建虚拟目的地 在您的阅读块中,您将获得一个数据包列表。遍历它们并制作动画。如果你想要声音,你的 readblock 必须使用 MusicDeviceMIDIEvent

将数据包转发到你的采样器