UIAnimations 响应 Swift 中的 MIDI 事件

Posted

技术标签:

【中文标题】UIAnimations 响应 Swift 中的 MIDI 事件【英文标题】:UIAnimations in response to MIDI events in Swift 【发布时间】:2016-04-30 20:53:58 【问题描述】:

我正在尝试使用 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

所以...我无法理解如何检测音符事件并根据它们实时为 UI 设置动画——我知道设置用户回调或 midi 端点与此有关,但我正在使用 swift 和那里似乎很少有我能够在这个主题上理解的文档。有人能指出我正确的方向吗?

【问题讨论】:

【参考方案1】:

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

【讨论】:

以上是关于UIAnimations 响应 Swift 中的 MIDI 事件的主要内容,如果未能解决你的问题,请参考以下文章

低内存性能慢 - Swift

尝试订购内置的 UIAnimations,但没有太大成功

UICollectionViewCell 中的 Swift 3 按钮不响应触摸

从 Swift 中的 Socket 获取响应

handleWatchKitExtensionRequest 未响应 Watchkit 扩展(Swift)中的 openParentApplication

如何在 Swift 中访问 JSON 响应中的特定数据