2011-01-12 100 views
1

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

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

会有很大的帮助,如果你们任何人发送答复..提前

感谢。

回答

0

如果您要滚动自己的加载程序,或者考虑使用NSXMLParser更容易加载的MusicXML,有很多站点描述MIDI格式。我对这种格式不太了解,或者你想要达到什么目标,所以我可以推荐。 CoreMidi只处理midi设备的通信,而不是回放或文件解析(据我所知)。如果这就是你想要做的,那么你也需要写自己的球员,这将是真正的挑战。

祝你好运。

7

您可以使用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); 

然后得到的曲目:

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); 
    } 
} 
+0

本笑脸今天救了我大约10小时。优秀的答案。 – Charlesism 2017-09-24 01:41:13