MIDI文件解析

SST*_*SST 2 objective-c

我们如何使用objective-C进行midi文件解析?

在用于MIDI文件解析的Java中,有一个名为javax.sound.midi的包; Objective-c中有什么东西吗?

如果你们中的任何人发送回复,那将会很有帮助..

提前致谢.

Ben*_*ley 8

您可以使用CoreMidi解析MIDI文件.一般的想法是你从文件中获取MusicSequence:

MusicSequence s;
NewMusicSequence(&s);

NSString *midiFilePath = [[NSBundle mainBundle]
                          pathForResource:path
                          ofType:@"mid"];

NSURL * midiFileURL = [NSURL fileURLWithPath:midiFilePath];

MusicSequenceFileLoad(s, (CFURLRef)midiFileURL, 0, 0);
Run Code Online (Sandbox Code Playgroud)

然后得到轨道:

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, &timestamp, &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);
    }
}
Run Code Online (Sandbox Code Playgroud)