2012-04-20 6 views
5

Я успешно получил IOS, чтобы играть .mid (миди) файл с образцом Soundfont, используя следующий код:Воспроизведение миди файлов с 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); 
} 

Однако проблема возникает, когда я тогда попробуйте сыграть второй файл, когда первый все еще играет.

Я пробовал много вариантов. Во-первых, вышеуказанный код будет воспроизводить оба трека одновременно. Или, я попробовал:

DisposeMusicPlayer(musicPlayer); 
DisposeMusicSequence(musicSequence); 

Перед NewMusicPlayer(&musicPlayer), но это производит странную версию мелодии с только спорадическими нотами играется.

Мне очень хотелось бы просто называть этот метод и следующий трек для воспроизведения.

+0

я последовал фрагмент кода и учебник здесь http://www.deluge.co/?q=comment/477#comment-477 , но нет выхода там. не могли бы вы помочь мне воспроизвести средний файл – makboney

ответ

7

Хорошо, я нашел ответ о том, как правильно распорядиться MusicPlayer и 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

Не должно быть 'MusicSequenceGetIndTrack (musicSequence, i, & track);' (заменить «0» на «i»)? – Olie

+0

@ Оли, ты прав. Отредактировал ответ для других. – ilikejames

+1

В моем опыте с MusicPlayer я просто переключил MusicSequences - не нужно было удалять экземпляр игрока. –