Использование массива для вызова тонов с использованием библиотеки java stdlib

Используя следующую библиотеку:

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

Мой вопрос в том, что мне не хватает? Код работает нормально, но не воспроизводит тон.

Это мило, но у вас есть вопрос?

Scary Wombat 27.09.2018 03:26

Что такое stdlib? Это не является частью стандартной Java, поэтому мы ничего об этом не знаем.

greg-449 27.09.2018 09:08
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
2
164
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вот пример из документа 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).

Joseph Yeagle 27.09.2018 14:48

Требовалось использовать StdIn.fromFile, что мешает мне завершить его, потому что я не знаю, как это сделать. По сути, я не знаю, как вызвать этот файл для воспроизведения / использования содержимого моего файла a2song.txt. (по сути, HZ для звезды помета Twinkle twinkle).

Joseph Yeagle 27.09.2018 14:50

Я не думаю, что StdIn.fromFile не может найти его в документе API. StdIn читает из стандартного ввода. Однако существует метод In.readDoubles, который вы можете использовать для чтения файла.

Bentaye 27.09.2018 15:10

Ok. Я работаю над проектом для одного из моих мастер-классов. Это то, что он просил нас сделать. Мне это тоже показалось немного странным. Я отправил ему письмо вчера вечером. Буду ждать его ответа. Спасибо за вашу помощь.

Joseph Yeagle 27.09.2018 16:34

@JosephYeagle также может быть, что он хочет, чтобы программа запускалась из командной строки, а затем вы могли передать ей значения вручную. В любом случае проблема с воспроизведением тона решена.

Bentaye 27.09.2018 16:39

Другие вопросы по теме