최근에 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이하지 않는 것을 어떻게 든합니다.
(완전성 여기, 사과 코어 오디오 목록에 답) iOS에서 32 코드! 고마워요, 제게 많은 도움이되었습니다. :) – cregox
그 때까지 그것을 잊지 마세요;) –