2012-04-20 17 views
5

मैं सफलतापूर्वक आईओएस एक मध्य (मिडी) निम्नलिखित कोड का उपयोग कर एक SoundFont नमूने के साथ फ़ाइल खेलने के लिए मिल गया है:MusicPlayer और संगीत अनुक्रम के साथ मिडी फ़ाइलों बजाना

-(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 (संगीत की आवश्यकता, i, और ट्रैक) नहीं होना चाहिए;' ("i" के साथ "0" को प्रतिस्थापित करें)? – Olie

+0

@ ओली आप सही हैं। दूसरों के लिए जवाब संपादित किया। – ilikejames

+1

म्यूजिकप्लेयर के साथ अपने अनुभव में, मैंने बस संगीत सबवेन्स को स्विच किया - प्लेयर इंस्टेंस का निपटान करने की आवश्यकता नहीं थी। –