AudioTrack を使用して、正弦波、方形波、のこぎり波を生成しようとしています。ただし、これが作成しているオーディオは、純粋な正弦波のようには聞こえませんが、何らかの他の波がオーバーレイされているようです。最初の例のメソッドを使用しながら、2 番目のコード例のように純粋な正弦波を取得するにはどうすればよいでしょうか? 上の例は、2 番目の例で使用されている演算の一部を移動するだけなので、同じ波を生成するべきではありませんか?
@Override
protected Void doInBackground(Void... foo) {
short[] buffer = new short[1024];
this.track = new AudioTrack(AudioManager.STREAM_MUSIC, 44100, AudioFormat.CHANNEL_CONFIGURATION_MONO, AudioFormat.ENCODING_PCM_16BIT, minBufferSize, AudioTrack.MODE_STREAM);
float samples[] = new float[1024];
this.track.play();
while (true) {
for (int i = 0; i < samples.length; i++) {
samples[i] = (float) Math.sin( (float)i * ((float)(2*Math.PI) * frequency / 44100)); //the part that makes this a sine wave....
buffer[i] = (short) (samples[i] * Short.MAX_VALUE);
}
this.track.write( buffer, 0, samples.length ); //write to the audio buffer.... and start all over again!
}
}
注:これにより、純粋な正弦波が得られます。
@Override
protected Void doInBackground(Void... foo) {
short[] buffer = new short[1024];
this.track = new AudioTrack(AudioManager.STREAM_MUSIC, 44100, AudioFormat.CHANNEL_CONFIGURATION_MONO, AudioFormat.ENCODING_PCM_16BIT, minBufferSize, AudioTrack.MODE_STREAM);
float increment = (float)(2*Math.PI) * frequency / 44100; // angular increment for each sample
float angle = 0;
float samples[] = new float[1024];
this.track.play();
while (true) {
for (int i = 0; i < samples.length; i++) {
samples[i] = (float) Math.sin(angle); //the part that makes this a sine wave....
buffer[i] = (short) (samples[i] * Short.MAX_VALUE);
angle += increment;
}
this.track.write( buffer, 0, samples.length ); //write to the audio buffer.... and start all over again!
}
}
Martijn に感謝: 問題は、バッファ内の波長間で波が遮断されていることです。バッファ サイズを増やすと、2 番目の例の問題が解決されます。Math.PI * 2 算術演算がループの中で最も集中しているように見えるため、その値を 1 回だけ計算される外部変数に移動すると、すべてが解決されます。