簡體   English   中英

您如何編寫使用StdAudio在Java中彈奏和弦的方法?

[英]How do you write a method that plays chords in Java using StdAudio?

我目前正在編寫一種演奏和弦的方法,但遇到了一些麻煩。 我能夠發出聲音,但是我得到的只是白噪聲的片段。 我在下面列出了我的方法。

    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);
        }

這里有兩個問題:

第一個是您在每個樣本上都使用frequencies[j] += frequencies[j]線踩踏頻率陣列。 假設frequencies[0] == 100 在生成第一個樣本之前,它將變為200。即使頻率數組的長度僅為1,也不會產生正弦波。

第二個問題是您組合多個頻率的概念是錯誤的。 假設頻率數組有兩個元素100和200。如果解決了第一個問題,您實際上將計算出一個300 Hz的正弦。 那是因為您以錯誤的級別將它們加在一起,所以您正在計算的是'sin(2 * pi i (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
 }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM