3

Rtaudioライブラリを使用していて、パンを制御できるオーディオプログラムを実装したいと思います(たとえば、サウンドを左チャンネルから右チャンネルにシフトする)。

私の特定のケースでは、デュプレックスモードを使用しています(例はここにあります:デュプレックスモード)。これは、マイク入力をスピーカー出力にリンクすることを意味します。

出力バッファーにフィルターを適用する必要がありますか?どんなフィルター?
誰か助けてもらえますか?

4

1 に答える 1

0

左側の信号を減らすには、左側のすべてのサンプルに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;
}
于 2012-11-06T04:47:21.483 に答える