2012-04-20 15 views
5

ho ottenuto con successo iOS per svolgere un mid (midi) file con un campione soundfont utilizzando il seguente codice:Riproduzione di file midi con MusicPlayer & Music 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); 
} 

Tuttavia, il problema viene quando ho poi prova a riprodurre un secondo file quando il primo è ancora in riproduzione.

Ho provato molte varianti. Innanzitutto, il codice sopra riprodurrà entrambe le tracce contemporaneamente. Oppure, ho provato:

DisposeMusicPlayer(musicPlayer); 
DisposeMusicSequence(musicSequence); 

Prima della NewMusicPlayer(&musicPlayer), ma questo produce una versione strana del brano con note solo sporadici in fase di riproduzione.

Mi piacerebbe semplicemente chiamare questo metodo e la traccia successiva da riprodurre.

+0

ho seguito lo snippet di codice e il tutorial qui http://www.deluge.co/?q=comment/477#comment-477 ma senza uscita c'è. potresti per favore aiutarmi a suonare un mid file – makboney

risposta

7

Ok, ho trovato la risposta su come smaltire correttamente uno MusicPlayer e 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

Non dovrebbe essere 'MusicSequenceGetIndTrack (musicSequence, i, & track);' (sostituire "0" con "i")? – Olie

+0

@Olie hai ragione. Modificato la risposta per gli altri. – ilikejames

+1

Nella mia esperienza con MusicPlayer, ho appena cambiato MusicSequences - non ho avuto bisogno di disporre dell'istanza del player. –