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 事件的主要内容,如果未能解决你的问题,请参考以下文章
UICollectionViewCell 中的 Swift 3 按钮不响应触摸
handleWatchKitExtensionRequest 未响应 Watchkit 扩展(Swift)中的 openParentApplication