如何使用StdAudio编写一个在Java中播放和弦的方法?

如何使用StdAudio编写一个在Java中播放和弦的方法?,java,audio,nested-loops,Java,Audio,Nested Loops,我目前正在写一种弹奏和弦的方法,但我遇到了一点麻烦。我能发出声音,但我得到的只是一点点白噪音。我在下面列出了我的方法 public static void playChord(double duration, double... frequencies) { final int sliceCount = (int) (StdAudio.SAMPLE_RATE * duration); final double[] slices = new

我目前正在写一种弹奏和弦的方法,但我遇到了一点麻烦。我能发出声音,但我得到的只是一点点白噪音。我在下面列出了我的方法

    public static void playChord(double duration, double... frequencies) {
            final int sliceCount = (int) (StdAudio.SAMPLE_RATE * duration);
            final double[] slices = new double[sliceCount + 1];
            double freqTotal=0;
            for (int i = 0; i <= sliceCount; i++) {
                for (int j=0; j<frequencies.length;j++) {
                    frequencies[j] +=frequencies[j];
                    freqTotal=frequencies[j];
                }
                slices[i] = Math.sin(2 * Math.PI * i * freqTotal/StdAudio.SAMPLE_RATE);
            }
            StdAudio.play(slices);
        }
publicstaticvoidplaychord(双倍持续时间,双倍…频率){
最终整数切片计数=(整数)(StdAudio.SAMPLE_RATE*持续时间);
最终双精度[]切片=新双精度[切片计数+1];
双重频率总计=0;

对于(int i=0;i,这里有两个问题:

第一种情况是,您在每个样本上用
frequencies[j]+=frequencies[j]
行跺频率数组。假设
frequencies[0]==100
。在生成第一个样本之前,它将更改为200。即使频率数组的长度仅为1,也不会生成正弦波

第二个问题是,您组合多个频率的概念是错误的。假设频率数组有100和200两个元素。如果第一个问题得到解决,您将实际计算300 Hz的单个正弦。这是因为您在错误的级别将它们相加,所以您计算的是‘sin(2*pii(100+200)/2)这就是sin(2*pi*i*300/2)

相反,您需要这样做:

 for (int i = 0; i < sliceCount; i++)
 {
     for (int j = 0 ; j < frequencies.length; j++)
     {
         slices[i] += Math.sin(2*Math.PI*i*frequencies[i]/StdAudio.SAMPLE_RATE);
     }
     slices[i] /= frequencies.length; // renormalize to between -1 and 1
 }
for(int i=0;i
对不起,这是我的第一篇文章。我使用了ctrl+k快捷键来格式化代码。这样看起来更好。谢谢。