Rtaudioライブラリを使用していて、パンを制御できるオーディオプログラムを実装したいと思います(たとえば、サウンドを左チャンネルから右チャンネルにシフトする)。
私の特定のケースでは、デュプレックスモードを使用しています(例はここにあります:デュプレックスモード)。これは、マイク入力をスピーカー出力にリンクすることを意味します。
出力バッファーにフィルターを適用する必要がありますか?どんなフィルター?
誰か助けてもらえますか?
Rtaudioライブラリを使用していて、パンを制御できるオーディオプログラムを実装したいと思います(たとえば、サウンドを左チャンネルから右チャンネルにシフトする)。
私の特定のケースでは、デュプレックスモードを使用しています(例はここにあります:デュプレックスモード)。これは、マイク入力をスピーカー出力にリンクすることを意味します。
出力バッファーにフィルターを適用する必要がありますか?どんなフィルター?
誰か助けてもらえますか?
左側の信号を減らすには、左側のすべてのサンプルに1以下の数値を掛けるだけです。これをlと呼びます。同様に、右側については、その番号をrと呼びます。一般的に言って、1より大きい数を掛けたくない場合は、信号が歪む可能性があります。
lとrは両方とも「パン位置」の関数です。どのようにパンの位置からあなたの数に到達するかは、いくつかの議論の問題です。これが単純なものである場合は、極値でこれらの値を使用して、値を直線的に下げることができます。
Hard Left:
l=1; r=0
Center:
l=1; r=1
Hard Right:
l=0; r=1;
これがもっと凝ったものなら、あなたは「汎法」をグーグルで検索するべきです。良いスタートのように見える例を次に示します。
http://www.kvraudio.com/forum/viewtopic.php?p=4264576
更新:私はRTオーディオを使用したことがありません(私は通常PortAudioを使用しますが、これは似ています)が、パンするコードは上記のようにlとrを使用して次のようになります(int32_t型-符号付き32ビット整数を想定) :
int inout( void *outputBuffer, void *inputBuffer, unsigned int nBufferFrames,
double streamTime, RtAudioStreamStatus status, void *data )
{
if ( status ) std::cout << "Stream over/underflow detected." << std::endl;
int32_t *ob = (int32_t *)outputBuffer;
int32_t *in = (int32_t *)inputBuffer;
unsigned long *bytes = (unsigned long *) data;
int i =0;
while( i < bytes / 4 ) {
ob[i] = (int32_t) ( ib[i] * l + .5 );
++i;
ob[i] = (int32_t) ( ib[i] * r + .5 );
++i;
}
return 0;
}