サンプリングされたソースデータライン(Java Sound API)から取得したバイト配列を処理しようとしています。バイト配列に小数を掛けると、ストリームの再生中にノイズが発生します。
サウンドを再生する前に、ステレオwavファイルを彼の左右のチャンネルに分けます。これは正常に機能します。しかし、遅延係数に依存するゲインコントロールを使用してチャネルを処理したい場合、ノイズが発生します。
for(int i=0; i<bufferSize; i++) { array[i] = (byte) (array[i] * gain); }
誰かが問題を解決する方法を知っていますか?
//編集:
ビットシフトを使用して、2バイトを短い(2バイト)に変換しようとしました。例:
short leftMask = 0xff00;
short rightMask = 0x00ff;
short sValue = (array[i] + array[i+1] <<8) * gain;
array[i] = (sValue & leftMask) >> 8;
array[i+1] = (sValue & rightMask);
しかし、1バイトにゲイン値を掛けただけでも同じようになりました。
//編集
または、このように2つの配列値をshortに追加する必要がありますか?
short shortValue = array[i] + array[i+1];
shortValue *= gain;
array[i] = ???
しかし、サウンドを失うことなく、このショートを2つのシングルバイトに変換するにはどうすればよいですか?
//分離メソッドからいくつかのコードを編集します:
public static void channelManipulation(byte[] arrayComplete) {
int i=2;
char channel='L';
int j=0;
/**
* The stereo stream will be divided into his channels - the Left and the Right channel.
* Every 2 bytes the channel switches.
* While data is collected for the left channel the right channel will be set by 0. Vice versa.
*/
while(j<arrayComplete.length) {
//while we are in the left channel we are collecting 2 bytes into the arrayLeft
while(channel=='L') {
if(i==0) {
channel='R'; //switching to the right channel
i=2;
break;
}
arrayLeft[j] = (byte)(arrayComplete[j]);
arrayRight[j] = 0;
i--; j++;
}
//while we are in the right channel we are collecting 2 bytes into the arrayRight
while(channel=='R') {
if(i==0) {
channel='L'; //switching to the left channel
i=2;
break;
}
arrayRight[j] = (byte) (arrayComplete[j]);
arrayLeft[j] = 0;
i--; j++;
}
}
}