Используя следующую библиотеку:
https://introcs.cs.princeton.edu/java/stdlib/
Я пытаюсь воспроизвести тон в java в течение 0,4 секунды из файла с помощью Stdin.fromFile с использованием массива. Я могу написать код и заставить его воспроизводиться с помощью 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
Мой вопрос в том, что мне не хватает? Код работает нормально, но не воспроизводит тон.
Что такое stdlib? Это не является частью стандартной Java, поэтому мы ничего об этом не знаем.




Вот пример из документа 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);
}
Мне этот способ намного больше нравится. Я знаю, как это сделать так, как вы должны были сказать выше. Я также сделал это, вызывая для каждого тона использование playTone (248.75, .4).
Требовалось использовать StdIn.fromFile, что мешает мне завершить его, потому что я не знаю, как это сделать. По сути, я не знаю, как вызвать этот файл для воспроизведения / использования содержимого моего файла a2song.txt. (по сути, HZ для звезды помета Twinkle twinkle).
Я не думаю, что StdIn.fromFile не может найти его в документе API. StdIn читает из стандартного ввода. Однако существует метод In.readDoubles, который вы можете использовать для чтения файла.
Ok. Я работаю над проектом для одного из моих мастер-классов. Это то, что он просил нас сделать. Мне это тоже показалось немного странным. Я отправил ему письмо вчера вечером. Буду ждать его ответа. Спасибо за вашу помощь.
@JosephYeagle также может быть, что он хочет, чтобы программа запускалась из командной строки, а затем вы могли передать ей значения вручную. В любом случае проблема с воспроизведением тона решена.
Это мило, но у вас есть вопрос?