如何在Java中添加任意数量的正弦波以创建类似声音/音频的钢琴?

我试图了解如何添加两个以上的正弦波来创建或合成声音并在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,这种声音只包含固定的频率和振幅/音量,但是我们知道真正的钢琴声波非常复杂并且振幅变化。那么谁能告诉我如何使用正弦或任何其他功能来复制钢琴的声音?

所以有人知道我该怎么做吗?

yang880912 回答:如何在Java中添加任意数量的正弦波以创建类似声音/音频的钢琴?

暂时没有好的解决方案,如果你有好的解决方案,请发邮件至:iooj@foxmail.com
本文链接:https://www.f2er.com/3016923.html

大家都在问