2012-04-20 6 views
5

Ich habe eine .mid (Midi-Datei) mit einer Soundfont-Probe mit dem folgenden Code zu spielen erfolgreich iOS bekommen:MIDI-Dateien mit Musicplayer & Music Sequence spielt

-(void) playMusic:(NSString*) name 
{ 
    NSString *presetURLPath = [[NSBundle mainBundle] pathForResource:@"GortsMiniPianoJ1" ofType:@"SF2"]; 
    NSURL * presetURL = [NSURL fileURLWithPath:presetURLPath]; 
    [self loadFromDLSOrSoundFont: (NSURL *)presetURL withPatch: (int)3]; 

    NSString *midiFilePath = [[NSBundle mainBundle] pathForResource:name ofType:@"mid"]; 
    NSURL * midiFileURL = [NSURL fileURLWithPath:midiFilePath]; 

    NewMusicPlayer(&musicPlayer); 

    if (NewMusicSequence(&musicSequence) != noErr) 
    { 
     [NSException raise:@"play" format:@"Can't create MusicSequence"]; 
    } 

    if(MusicSequenceFileLoad(musicSequence, (CFURLRef)midiFileURL, 0, 0 != noErr)) 
    { 
     [NSException raise:@"play" format:@"Can't load MusicSequence"]; 
    } 

    MusicPlayerSetSequence(musicPlayer, musicSequence); 
    MusicSequenceSetAUGraph(musicSequence, _processingGraph); 
    MusicPlayerPreroll(musicPlayer); 
    MusicPlayerStart(musicPlayer); 
} 

jedoch das Problem kommt, wenn ich dann versuchen Sie eine zweite Datei abzuspielen, wenn die erste noch spielt.

Ich habe viele Variationen ausprobiert. Erstens werden mit dem obigen Code beide Spuren gleichzeitig abgespielt. Oder ich habe versucht:

DisposeMusicPlayer(musicPlayer); 
DisposeMusicSequence(musicSequence); 

Vor den NewMusicPlayer(&musicPlayer), aber das erzeugt eine seltsame Version der Melodie mit nur sporadischen gespielten Noten.

Ich würde gerne diese Methode anrufen, und den nächsten Titel gespielt werden.

+0

i gefolgt Ihr Code-Snippet und das Tutorial hier http://www.deluge.co/?q=comment/477#comment-477 aber es gibt keinen Ausgang. Könnten Sie mir bitte helfen, eine Mid-Datei zu spielen? – makboney

Antwort

7

Ok, ich habe die Antwort gefunden, wie man eine MusicPlayer und MusicSequence richtig entsorgen kann.

-(void) stop 
{ 
    OSStatus result = noErr; 

    result = MusicPlayerStop(musicPlayer); 

    UInt32 trackCount; 
    MusicSequenceGetTrackCount(musicSequence, &trackCount); 

    MusicTrack track; 
    for(int i=0;i<trackCount;i++) 
    { 
     MusicSequenceGetIndTrack (musicSequence, i, &track); 
     result = MusicSequenceDisposeTrack(musicSequence, track); 
    } 

    result = DisposeMusicPlayer(musicPlayer); 
    result = DisposeMusicSequence(musicSequence); 
    result = DisposeAUGraph(_processingGraph); 
} 
+0

Sollte das nicht "MusicSequenceGetIndTrack (musicSequence, i, & track);" (ersetzen "0" mit "i")? – Olie

+0

@Olie du bist richtig. Bearbeitete die Antwort für andere. – ilikejames

+1

Nach meiner Erfahrung mit MusicPlayer habe ich gerade MusicSequences gewechselt - ich musste die Player-Instanz nicht löschen. –