1
AVMIDIPlayer有这个初始化:AVMIDIPlayer初始化与MusicSequence
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我是否正确获取数据?