Вы можете проанализировать MIDI-файл, используя CoreMidi. Общая идея заключается в том, что вы получаете MusicSequence из файла:
MusicSequence s;
NewMusicSequence(&s);
NSString *midiFilePath = [[NSBundle mainBundle]
pathForResource:path
ofType:@"mid"];
NSURL * midiFileURL = [NSURL fileURLWithPath:midiFilePath];
MusicSequenceFileLoad(s, (CFURLRef)midiFileURL, 0, 0);
Тогда получите треки:
MusicTrack track = NULL;
UInt32 tracks;
MusicSequenceGetTrackCount(s, &tracks);
for (NSInteger i=0; i<tracks; i++) {
MusicSequenceGetIndTrack(s, i, &track);
// Create an interator
MusicEventIterator iterator = NULL;
NewMusicEventIterator(track, &iterator);
MusicTimeStamp timestamp = 0;
MusicEventType eventType = 0;
const void *eventData = NULL;
UInt32 eventDataSize = 0;
Boolean hasNext = YES;
// A variable to store note messages
MIDINoteMessage * midiNoteMessage;
// Iterate over events
while (hasNext) {
// See if there are any more events
MusicEventIteratorHasNextEvent(iterator, &hasNext);
// Copy the event data into the variables we prepaired earlier
MusicEventIteratorGetEventInfo(iterator, ×tamp, &eventType, &eventData, &eventDataSize);
// Process Midi Note messages
if(eventType==kMusicEventType_MIDINoteMessage) {
// Cast the midi event data as a midi note message
midiNoteMessage = (MIDINoteMessage*) eventData;
}
// Load the next event
MusicEventIteratorNextEvent(iterator);
}
}