2012-06-18 2 views
2

iOS 5에서 CoreAudio를 사용하여 MIDI 파일을 재생하고 있습니다. 내가 처음부터 시퀀스 부터 시작하여 동안 시퀀스를 시작하고 싶을 때를 제외하고는 모든 설정, 작동, 모든 것이 복숭아입니다. 내가 자연스럽게 부르는 수행합니다iOS 및 CoreAudio : MusicPlayerSetTime()을 호출하면 MusicPlayer가 중지됩니다.

if (MusicPlayerSetTime(musicPlayer, (MusicTimeStamp)0.0) != noErr) 
     [NSException raise:@"playMIDI" format:@"Can't reset the player"]; 

나는 새로운 위치에서 재생을 계속 오류를 얻을 수 있지만, (문서에서 말했다대로)이 호출을하는 대신, 모두 재생을 중지하지 않습니다. 난이도 (같은 종류의 많은 다른 조합) 시도 :

Boolean isPlaying = NO; 
if (MusicPlayerIsPlaying(musicPlayer, &isPlaying) != noErr) 
    [NSException raise:@"playMIDI:" format:@"Can't get MusicPlayer play state"]; 

if (isPlaying) { 
    if (MusicPlayerStop(musicPlayer) != noErr) 
     [NSException raise:@"playMIDI:" format:@"Can't stop MusicPlayer"]; 
} 

if (MusicPlayerSetSequence(musicPlayer, musicSequence) != noErr) 
    [NSException raise:@"playMIDI:" format:@"Can't set sequence for MusicPlayer"]; 

if (MusicPlayerSetTime(musicPlayer, (MusicTimeStamp)0.0) != noErr) 
    [NSException raise:@"playMIDI" format:@"Can't reset the player"]; 

if (MusicPlayerSetPlayRateScalar(musicPlayer, 1.0) != noErr) 
    [NSException raise:@"playMIDI" format:@"Can't set speed"]; 

if (MusicPlayerStart(musicPlayer) != noErr) 
    [NSException raise:@"playMIDI" format:@"Can't start MusicPlayer"]; 

기쁨, 같은 효과를.

그러나 MusicSequence를 변경하면 새 MusicSequence가 정상적으로 재생됩니다. 그래서 저는 같은 미디 파일에서 2 개의 MusicSequence를 생성하고 하나에서 다른 것으로 전환하는 극단으로갔습니다. 기쁨도, iOS도 같은 파일을 두 번 재생하고 금지하고 있음을 알고 있습니다. 시퀀스를 완전히 재생할 때까지 기다렸다가 다시 재생할 수 있습니다. 깜짝 놀라게하기.

아이디어가 있으십니까?

감사

답변

0

OK, 여기에 내가 무슨 일이 일어나고 무엇을 생각 : 코어 오디오 기반 당겨, 즉 단위 데이터를 필요로 할 때, 그것의 소스를 요청한다. 이제 MusicPlayer에서 시간을 재설정하면 t0과 같이 특정 시간에 완료됩니다. 잠시 후 t1에서이 MusicPlayer가 제공 한 AU 노드가 데이터를 요청합니다. MusicPlayer는 t1을 가져 와서 이벤트 시퀀스에서 어디에 해당하는지 계산합니다. 항상 t0보다 크기 때문에 t0에서 정확히 시작하는 모든 이벤트 (예 : MIDI 틱 0에서 시작하는 이벤트)는 재생 된 것으로 간주되어 전혀 재생되지 않습니다. 즉, 미디 파일의 첫 번째 음표가 연주되지 않습니다.

내 파일이 매우 짧고 실제로 틱 0에서 시작하는 코드 만 포함되어 있기 때문에 아무 음표도 연주되지 않으며 나는 침묵을 느낍니다. 나는 새로운 순서를로드하거나 이미 재생되지 않는 시퀀스를 시작하는 나에게 분명하지 않을 때 이런 일이되지 않는 이유

...

어쨌든, 하나의 가능한 수정하는 것입니다 : 플레이어를 중지 시퀀스를 설정하고 시간을 0으로 설정 한 다음 예를 들어 플레이어의 시작을 지연합니다. 25ms. 이는 응답성에 이상적이지는 않지만 작동합니다.

이 문제를 해결하는 약간 더 복잡한 방법은 다음
- 음악 플레이어가 먹이 오디오 기기의 렌더링에 콜백을 설정 (AudioUnitAddRenderNotify())
-의 리셋시 시퀀스에서 플레이어의 시간을 재설정하지는 않지만 부울 플래그를 설정하십시오.
- 렌더링 콜백에서 플래그가 설정되어 있으면 플레이어에서 시간을 재설정하고 플래그를 설정 해제하십시오.
지연이 도입되지 않으며 또한 작품은 문제에 대한 나의 해석을 입증하는 경향이있다.

2

t0에서 시퀀스를 시작/중지/다시 시작하는 데 문제가 없습니다. 순서의 메모가 자신이 생각하는 시간에 있다고 확신합니까? 아니면 다른 일이 있니?

아래 코드 (오류 검사가 제거됨)로 빠른 테스트가 중지되고 정상적으로 다시 시작됩니다. 또는 내가 설명했던 문제를 오해했을 수도 있습니다. Fwiw - 중지/시작 플레이어 호출 없이도 작동하지만 일시적인 음은 여전히 ​​들리므로 깨끗한 점프가 적습니다.

- (void)jump 
{ 
    if (player) { 
     MusicPlayerStop(player) 
     MusicPlayerSetTime(player, 0.0f); 
     MusicPlayerStart(player); 
    } 
} 

UPDATE

은 내가 .MID 파일을 살펴했다 그것을 테스트했습니다. 전에 그것을 보지 못했다하지만 내가 작업하는 파일이 더 이상 - 이것은 MusicPlayer 내가 그 파일에 문제를 repro 수 할 수 있었다

Sequence @0x68ad7c0 
NumTracks = 1, Type = beats 
* * TempoTrack * * 
SequenceTrack @0x68ab250 
    Num Events: 3, Track Length: 0.00 beats 
    0.000: Time Sig:4/4, 24 clks/qtr, 8 32nds/clk 
    0.000: SMPTE Offset [33:0:0:0.0] 
    0.000: Tempo:120.000 

* * Track 1 * * 
SequenceTrack @0x6a815e0 
    Num Events: 9, Track Length: 4.11 beats 
    0.000: MetaEvent:03 
     0: 30 31 30 31 30 31 31 31       01010111   
    0.000: MetaEvent:04 
     0: 30 31 20 43          01 C    
    0.000: MetaEvent:59 
     0: 00 00            ..    
    0.000: MetaEvent:06 
     0: 31 20 4D 41 4A 45 55 52 53      1 MAJEURS  
    0.000: MetaEvent:06 
     0: 31 31            11    
    0.000: Note:Ch:0 36 121 (4.113) 
    0.000: Note:Ch:0 60 116 (3.931) 
    0.000: Note:Ch:0 64 110 (3.931) 
    0.000: Note:Ch:0 67 105 (3.931) 

(기능 CAShow(nameOfYourSequence)를 사용하여) 파일을 보는 방법이다. 무엇을하려고하는지 알지 못하지만 해결 방법은 이벤트를 0.000보다 조금 늦게 시작하는 것일 수 있습니다.

한편

, 당신이 사용하는 직접 noteOn + noteOff 이벤트를 관리하는 것으로 간주 있습니다 노트는 0에서 시작, 내가 확인,

MusicDeviceMIDIEvent (self.samplerUnit, noteCommand, noteNum, onVelocity, 0); 
+0

예 (내가 사용 http://www.fourmilab.ch/ webtools/midicsv /는 파일의 내용을 덤프하고 Aria Maestosa와 함께 확인했습니다. 나는 내가 아래에 설명하는 해석을 제외하고는 그 행동을 설명하기가 어려울 것이라고 말한다. –

+0

나는 잃어버린 감정을 이해할 수 있도록 MusicPlayer와 상당히 씨름 해 왔습니다! 템포, 연주 속도에 대해 특별한 것은 없습니까? 다른 것을 생각할 수는 없습니다. –

+0

미디 파일은 너무 간단하기 때문에 그다지 잘못되어 있지는 않습니다.하지만 여기서는 스스로 판단하십시오 : https://dl.dropbox.com/u/3916368/01010111.mid. 처음으로 재생 한 후 1 초가 지나면 다시 시작하도록 알려주십시오. 감사합니다 –

관련 문제