我试图了解如何添加两个以上的正弦波来创建或合成声音并在Java的sourceDataLine中播放?我正在尝试创建一个钢琴应用程序,我需要知道如何添加正弦波,以便我可以同时听到两个以上的声音。
我也想了解钢琴键发出的声音的波动方程。
import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.SourceDataLine;
import javax.sound.sampled.LineUnavailableException;
public class ExampleTone1{
public static void main(String[] args){
try {
ExampleTone1.createTone(262,100);
} catch (LineUnavailableException lue) {
System.out.println(lue);
}
}
/** parameters are frequency in Hertz and volume
**/
public static void createTone(int Hertz,int volume)
throws LineUnavailableException {
/** Exception is thrown when line cannot be opened */
float rate = 44100;
byte[] buf;
AudioFormat audioF;
buf = new byte[1];
audioF = new AudioFormat(rate,8,1,true,false);
//sampleRate,sampleSizeInBits,channels,signed,bigEndian
SourceDataLine sourceDL =
AudioSystem.getsourceDataLine(audioF);
sourceDL = AudioSystem.getsourceDataLine(audioF);
sourceDL.open(audioF);
sourceDL.start();
for(int i=0; i<rate; i++){
double angle = (i/rate)*Hertz*2.0*Math.PI;
buf[0]=(byte)(Math.sin(angle)*volume);
sourceDL.write(buf,1);
}
sourceDL.drain();
sourceDL.stop();
sourceDL.close();
}
}
现在在上面的代码中,我只做了一个正弦波函数。但是我想发出钢琴键的声音,比方说C,这种声音只包含固定的频率和振幅/音量,但是我们知道真正的钢琴声波非常复杂并且振幅变化。那么谁能告诉我如何使用正弦或任何其他功能来复制钢琴的声音?
所以有人知道我该怎么做吗?