AVMIDIPlayer有这个初始值设定项:
initWithData:soundBankURL:error:
这是用于从标准MIDI文件读取的初始化程序。
数据是NSData,我假设它是标准的MIDI文件格式。那么,如何获取这些数据?那么,创建MIDI序列的当前方法是AudioToolbox MusicSequence。 (AVAudioEngine甚至有这种类型的成员)。
MusicSequence有这个转换器:
MusicSequenceFileCreateData (
MusicSequence inSequence,
MusicSequenceFileTypeID inFileType,
MusicSequenceFileFlags inFlags,
SInt16 inResolution,
CFDataRef *outData
);
让我们试试吧。
var status = OSStatus(noErr)
var data:Unmanaged<CFData>?
status = MusicSequenceFileCreateData (musicSequence,
MusicSequenceFileTypeID(kMusicSequenceFile_MIDIType),
MusicSequenceFileFlags(kMusicSequenceFileFlags_EraseFile),
480, &data)
var ns:NSData = data!.takeRetainedValue()
var error:NSError?
self.mp = AVMIDIPlayer(data: ns, soundBankURL: soundbank, error: &error)
(我之前加载过音库)。 好消息:那确实播放了MIDI数据。 坏消息:一旦到达序列的末尾,就会崩溃。
queue = 'CallbackQueue', stop reason = EXC_BAD_ACCESS (code=1, address=0x0)
两个猜测。平台代码中存在错误,或者(更有可能)我的代码。
tl; dr我是否错误地获取了数据?
答案 0 :(得分:0)
我收到了Tumbleweed徽章!
无论如何,问题是AVMIDIPlayer的播放功能。如果你给它一个零完成处理程序,它很高兴它不会崩溃。如果你给它一个完成处理程序,那么blammo - 崩溃。我已经为完成处理程序尝试了闭包和花园多样化函数。
var completion:AVMIDIPlayerCompletionHandler = {
println("done")
}
<强> TL;博士强>
这样做:
midiPlayer.play(nil)
而不是这个:
midiPlayer.play(completion)