使用数组使用stdlib Java库调用音调

时间:2018-09-27 01:21:41

标签: java eclipse

使用以下库:

https://introcs.cs.princeton.edu/java/stdlib/

我正尝试使用数组使用Stdin.fromFile从文件中播放.4秒的Java音调。我可以编写代码并使用playTone (double, double)使其播放,代码如下:

package csc402;
import stdlib.StdAudio;
import stdlib.StdIn;

public class PlaySong {

    public static void playTone(double frequency, double duration) {

        double[] values = StdIn.readAllDoubles();
        final int sliceCount = (int) (StdAudio.SAMPLE_RATE * duration);
        final double[] slices = new double[sliceCount+1];
        for (int i = 0; i <= sliceCount; i++) {
            slices[i] = Math.sin(2 * Math.PI * i * frequency / StdAudio.SAMPLE_RATE);
        }
        StdAudio.play(slices);
    }

    public static void main(String[] args) {
        StdIn.fromFile("data/a2song.txt");
        playTone (0,.4);
        StdAudio.close();
        System.exit(0);
    }

}

我的a2song.txt文件如下

278.4375
278.4375
417.1849
417.1849
468.2742
468.2742
417.1849

我的问题是我想念什么?该代码运行良好,但没有发挥作用。

1 个答案:

答案 0 :(得分:0)

以下是stdlib文档中播放一种音调的示例: (您可能已经看到了,因为您的代码看起来像这样)

https://introcs.cs.princeton.edu/java/15inout/Tone.java.html

public class Tone {
    public static void main(String[] args) {
        double hz       = Double.parseDouble(args[0]);    // frequency in Hz
        double duration = Double.parseDouble(args[1]);    // duration in seconds

        int n = (int) (StdAudio.SAMPLE_RATE * duration);

        // build sine wave with desired frequency
        double[] a = new double[n+1];
        for (int i = 0; i <= n; i++) {
            a[i] = Math.sin(2 * Math.PI * i * hz / StdAudio.SAMPLE_RATE);
        }

        // play using standard audio
        StdAudio.play(a);
    }
}

播放一个音调,并且文件中的每个值都是一个音调,因此您需要为文件的每个值调用类似的方法。

这对我有用:(我没有使用StdIn.fromFile,因为它没有编译,而是将值硬编码在数组中)

public static void main(String[] args) {
    //StdIn.fromFile("data/a2song.txt");
    double[] values = new double[] {278.4375, 278.4375, 417.1849, 417.1849, 468.2742, 468.2742, 417.1849};
    for(double value : values) {
        playTone (value,.4);
    }
    StdAudio.close();
    System.exit(0);
}

public static void playTone(double frequency, double duration) {
    int n = (int) (StdAudio.SAMPLE_RATE * duration);
    // build sine wave with desired frequency
    double[] a = new double[n+1];
    for (int i = 0; i <= n; i++) {
        a[i] = Math.sin(2 * Math.PI * i * frequency / StdAudio.SAMPLE_RATE);
    }
    // play using standard audio
    StdAudio.play(a);
}