2012-04-20 24 views
5

He IOS para jugar un .mid (MIDI) presentar con una muestra soundfont usando el siguiente código conseguido con éxito:reproducir archivos MIDI con el Reproductor Musical & Music Secuencia

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

Sin embargo, el problema viene cuando a continuación, intente reproducir un segundo archivo cuando el primero se esté reproduciendo.

He intentado muchas variaciones. En primer lugar, el código anterior reproducirá ambas pistas simultáneamente. O, lo he intentado:

DisposeMusicPlayer(musicPlayer); 
DisposeMusicSequence(musicSequence); 

Antes de la NewMusicPlayer(&musicPlayer), pero esto produce una extraña versión de la sintonía con notas sólo esporádicos que se está reproduciendo.

Me encantaría simplemente llamar a este método, y la próxima pista que se reproducirá.

+0

i siguieron el fragmento de código y el tutorial aquí http://www.deluge.co/?q=comment/477#comment-477 pero no hay salida allí. ¿podría ayudarme a reproducir un archivo intermedio – makboney

Respuesta

7

Ok, encontré la respuesta sobre cómo desechar correctamente un MusicPlayer y 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

¿No debería ser 'MusicSequenceGetIndTrack (musicSequence, i, & track);' (reemplazar "0" por "i")? – Olie

+0

@Olie, tienes razón. Editó la respuesta para otros. – ilikejames

+1

En mi experiencia con MusicPlayer, acabo de cambiar MusicSequences, no tuve que deshacerme de la instancia del reproductor. –

Cuestiones relacionadas