2012-04-20 19 views
5

Mam powodzeniem zdobyć iOS odgrywają .mid (MIDI) plik z próbką soundfont stosując następujący kod:Odtwarzanie plików midi z MusicPlayer & Muzyka Sequence

-(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); 
} 

Jednak problem pojawia się, gdy ja potem spróbuj odtworzyć drugi plik, gdy pierwszy będzie nadal odtwarzany.

Próbowałem wielu odmian. Po pierwsze, powyższy kod będzie odtwarzał obie ścieżki jednocześnie. Albo, próbowałem:

DisposeMusicPlayer(musicPlayer); 
DisposeMusicSequence(musicSequence); 

Przed NewMusicPlayer(&musicPlayer), ale produkuje dziwne wersję melodii z tylko sporadyczne notatki są odtwarzane.

Chciałbym po prostu wywołać tę metodę i następny utwór do odtworzenia.

+0

i następnie swój fragment kodu i tutorial tutaj http://www.deluge.co/?q=comment/477#comment-477 ale nie ma wyjścia. czy mógłbyś mi pomóc w odtwarzaniu pliku środkowego? – makboney

Odpowiedz

7

Ok, znalazłem odpowiedź, jak prawidłowo pozbyć się MusicPlayer i MusicSequence.

-(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

Czy nie powinno to być 'MusicSequenceGetIndTrack (musicSequence, i & track); (zastąp" 0 "przez" i ")? – Olie

+0

@Jeśli masz rację. Edytowano odpowiedź dla innych. – ilikejames

+1

W moim doświadczeniu z MusicPlayer, po prostu zmieniłem MusicSequences - nie musiałem pozbywać się instancji odtwarzacza. –