2010-12-06 3 views
4

최근에 iOS에서 OpenAL을 사용하여 피치 이동을 할 수 있음을 알았습니다.iOS : OpenAL에서 버퍼로 출력되는 피치 시프트 및 파이프

나는 Hollance의 사운드 뱅크 플레이어를보고있다. 범위를 뛰어 넘는 15 개 정도의 피아노 음을 받아들이고 가장 가까운 샘플을 알아내어 적절한 음을 샘플링하여 음을 연주합니다. 이 라인을 볼 수 있습니다

- (void) noteOn: (int) midiNoteNumber 
      gain: (float) gain 
{ 
    if (!initialized) 
    { 
     NSLog(@"SoundBankPlayer is not initialized yet"); 
     return; 
    } 

    int sourceIndex = [self findAvailableSource]; 
    if (sourceIndex != -1) 
    { 
     alGetError(); // clear any errors 

     Note* note = notes + midiNoteNumber; 
     if (note->bufferIndex != -1) 
     { 
      Buffer* buffer = buffers + note->bufferIndex; 
      Source* source = sources + sourceIndex; 

      source->noteIndex = midiNoteNumber; 

      alSourcef(source->sourceId, AL_PITCH, note->pitch/buffer->pitch); 
      alSourcei(source->sourceId, AL_LOOPING, AL_FALSE); 
      alSourcef(source->sourceId, AL_REFERENCE_DISTANCE, 100.0f); 
      alSourcef(source->sourceId, AL_GAIN, gain); 

      float sourcePos[] = { note->panning, 0.0f, 0.0f }; 
      alSourcefv(source->sourceId, AL_POSITION, sourcePos); 

      alSourcei(source->sourceId, AL_BUFFER, AL_NONE); 
      alSourcei(source->sourceId, AL_BUFFER, buffer->bufferId); 
      ALenum error; 
      if ((error = alGetError()) != AL_NO_ERROR) 
      { 
       NSLog(@"Error attaching buffer to source: %x", error); 
       return; 
      } 

      alSourcePlay(source->sourceId); 
      if ((error = alGetError()) != AL_NO_ERROR) 
      { 
       NSLog(@"Error starting source: %x", error); 
       return; 
      } 
     } 
    } 
} 

피치가 변화 않습니다 :

 alSourcef(source->sourceId, AL_PITCH, note->pitch/buffer->pitch); 

불행하게도이 동시에 노트의 번들 재생을위한 좋은하지 않습니다, 너무 많이 사용되기 때문에, 이것은 수행하는 코드입니다 CPU. 그것은 동적으로 피치 쉬프팅입니다.

내가 원하는 것은 각 피아노 음표에 대한 버퍼를 만들고이 피치 쉬프트 기술을 사용하여 버퍼를 채우는 것입니다. 그러나 나는 스피커를 통해 그것을 재생하는 것과 반대로 버퍼에 사운드를 재생하는 openAL을 얻는 방법을 볼 수 없습니다.

거기에 어떤 방법으로 파이프 출력을 alSourcePlay (source-> sourceId);

버퍼로?

내가 할 수 없다면 내 선택은 무엇입니까? 필자는 DSPDimension 기사에서 smbPitchShift를 사용해 보았지만 좋은 충실 함을주지 못했습니다. 피아노 음의 공격 단계는 실제로 손실됩니다. 나는 Dirac3의 무료 버전을 사용할 수 있다고 생각합니다 ... (현재 풀 버전을위한 돈이 없습니다.하지만 무료 버전이 모노 처리를 허용하므로 해킹 할 수 있습니다). 다른 옵션이 있습니까?

EDIT : Dirac3을 테스트 한 이래로 같은 문제가 있습니다. 공격을 포위하는 것 같습니다. OpenAL의 피치 쉬프터 (pitch shifter)는 Dirac3이하지 않는 것을 어떻게 든합니다.

+1

(완전성 여기, 사과 코어 오디오 목록에 답) iOS에서 32 코드! 고마워요, 제게 많은 도움이되었습니다. :) – cregox

+0

그 때까지 그것을 잊지 마세요;) –

답변

4

alSourcePlayv는 동시에 여러 소스를 재생할 수 있습니다 - 소스의 최대 수는 플랫폼에 의존하지만, 내가 설명을 소스로 질문을 사랑

+1

나는 당신에게 맥주 빚 졌어, 윌;) –