最近、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の無料版を使用することができたと思う...(私は現時点でフルバージョンのお金を持っていないが、私は無料版でモノ処理ができると思うので、それをハックすることができる)。他の選択肢はありますか?
編集:私はDirac3をテストして以来、同じ問題を共有しています。それは攻撃を封じ込めるようだ。 OpenALのピッチ・シフターは、ディアック3がやらないことをどうにかしているようだ。
(完全を期すため、ここで、リンゴのコア・オーディオ・リスト上の答え)のiOS上の32でありますコード!ありがとう、それは私をたくさん助けました! :) – cregox
それをバンプすることを忘れないでください;) –