私はこの小さな信号生成方法を書いています。私の目標は、2つのチャンネル間のわずかな時間遅れ(左右)またはチャンネル間のわずかなゲイン差でビープ音を発生させることです。 現在のところ、1つのチャネルに対して0のバッファを設定し、2番目のチャネルの値をバッファに書き込むことで、遅延を作成します。チャネル間の振る舞いをスワップします(この点についてはヒントやアイデアがあれば分かります)。 次のステージでは、ゲインと同様のことをしています。私は、JavaがFloatControl経由でゲインコントロールを組み込んでいることを見てきました。しかし、各チャンネルのゲインを個別に制御する方法がわかりません。これを行うための方法が組み込まれていますか? チャンネルごとに2つの別々のストリームが必要ですか?もしそうなら、同時にどのようにプレイするのですか? 私はプログラミングを聴くには新しいです、これを行うより良い方法があれば教えてください。どんな助力も非常に感謝しています。個別にJavaを使ったサウンドチャンネルのコントロールゲイン
これは、これまでの私のコードです:
public static void generateTone(int delayR, int delayL, double gainRightDB, double gainLeftDB)
throws LineUnavailableException, IOException {
// in hz, number of samples in one second
int sampleRate = 100000; // let sample rate and frequency be the same
// how much to add to each side:
double gainLeft = 100;//Math.pow(10.0, gainLeftDB/20.0);
double gainRight = 100;// Math.pow(10.0, gainRightDB/20.0);;
// click duration = 40 us
double duration = 0.08;
double durationInSamples = Math.ceil(duration * sampleRate);
// single delay window duration = 225 us
double baseDelay = 0.000225;
double samplesPerDelay = Math.ceil(baseDelay * sampleRate);
AudioFormat af;
byte buf[] = new byte[sampleRate * 4]; // one second of audio in total
af = new AudioFormat(sampleRate, 16, 2, true, true); // 44100 Hz, 16 bit, 2 channels
SourceDataLine sdl = AudioSystem.getSourceDataLine(af);
sdl.open(af);
sdl.start();
// only one should be delayed at a time
int delayRight = delayR;
int delayLeft = delayL;
int freq = 1000;
/*
* NOTE:
* The buffer holds data in groups of 4. Every 4 bytes represent a single sample. The first 2 bytes
* are for the left side, the other two are for the right. We take 2 each time because of a 16 bit rate.
*
*
*/
for(int i = 0; i < sampleRate * 4; i++){
double time = ((double)i/((double)sampleRate));
// Left side:
if (i >= delayLeft * samplesPerDelay * 4 // when the left side plays
&& i % 4 < 2 // access first two bytes in sample
&& i <= (delayLeft * 4 * samplesPerDelay)
+ (4 * durationInSamples)) // make sure to stop after your delay window
buf[i] = (byte) ((1+gainLeft) * Math.sin(2*Math.PI*(freq)*time)); // sound in left ear
//Right side:
else if (i >= delayRight * samplesPerDelay * 4 // time for right side
&& i % 4 >= 2 // use second 2 bytes
&& i <= (delayRight * 4 * samplesPerDelay)
+ (4 * durationInSamples)) // stop after your delay window
buf[i] = (byte) ((1+gainRight) * Math.sin(2*Math.PI*(freq)*time)); // sound in right ear
}
for (byte b : buf)
System.out.print(b + " ");
System.out.println();
sdl.write(buf,0,buf.length);
sdl.drain();
sdl.stop();
sdl.close();
}
* "各チャンネルのゲインを個別に制御する方法が分かりません" * ['FloatControl.Type.BALANCE'](http://docs.oracle.com/javase/8/docs/api/javax /sound/sampled/FloatControl.Type.html#BALANCE).. –
より良いヘルプを早く得るには、[MCVE]または[短く、自己完結型の正しい例](http://www.sscce.org/)を投稿してください。 –