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
将数据包转发到你的采样器
我正在尝试使用 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