使用以下库:
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
我的问题是我想念什么?该代码运行良好,但没有发挥作用。
答案 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);
}