StdAudio

Скачать StdAudio.java

StdAudio - библиотека для воспроизведения, чтения, сохранения и записи звука.


Класс StdAudio предоставляет статические методы для воспроизведения, чтения и сохранения звука. Используется простая модель: в звуковую карту отправляются отдельные сэмплы (samples), каждый сэмпл — вещественное число в диапазоне от -1.0 до +1.0. Воспроизведение идет в реальном времени с частотой дискретизации 44100 Гц.

Кроме одиночных сэмплов, StdAudio поддерживает чтение, запись и воспроизведение аудиофайлов в стандартных форматах.

Начало работы.

Чтобы использовать этот класс, у вас должен быть StdAudio.java. Скачайте StdAudio.java и поместите в рабочую директорию проекта.

Теперь скопируйте в редактор следующую короткую программу:

public class TestStdAudio {
    public static void main(String[] args) {
        double freq = 440.0;
        for (int i = 0; i < StdAudio.SAMPLE_RATE; i++) {
            double sample = 0.5 * Math.sin(2 * Math.PI * freq * i / StdAudio.SAMPLE_RATE);
            StdAudio.play(sample);
        }
        StdAudio.drain();
    }
}

Если скомпилировать и запустить программу, вы услышите чистый тон с частотой 440 Гц (нота «ля», concert A).

Воспроизведение сэмплов.

Для воспроизведения отдельных сэмплов используются:

  • play(double sample)
  • play(double[] samples)

Каждый сэмпл должен быть в диапазоне от -1.0 до +1.0. Если значение выходит за диапазон, оно будет обрезано (clipped) до ближайшей границы: -1.0 или +1.0.

Воспроизведение аудиофайлов.

Для воспроизведения файла используется:

  • play(String filename)

Метод воспроизводит файл (WAVE, AU, AIFF, MIDI) и возвращает управление только после завершения проигрывания.

Пример простого ритма:

while (true) {
    StdAudio.play("BassDrum.wav");
    StdAudio.play("SnareDrum.wav");
}

Файлы (BassDrum.wav, SnareDrum.wav) должны быть доступны Java, обычно в той же папке, где запускается программа.

Чтение и запись аудиофайлов.

Для чтения и сохранения:

  • read(String filename)
  • save(String filename, double[] samples)

read(...) читает аудио и возвращает массив double со значениями в диапазоне -1.0..+1.0.
save(...) сохраняет массив сэмплов в аудиофайл.

Форматы и параметры аудио.

StdAudio опирается на Java Media Framework при работе с файлами. Обычно доступно:

  • чтение/воспроизведение: .wav, .au, .aiff, .midi
  • сохранение: .wav, .au, .aiff

Некоторые системы поддерживают дополнительные форматы, но чаще всего не MP3 и не M4A.

При сохранении используется формат:

  • частота дискретизации: 44100 Гц
  • 16 бит на сэмпл
  • моно (1 канал)
  • little-endian
  • линейное PCM-кодирование

При чтении входной звук приводится к 44100 Гц и 16 битам на сэмпл.

Запись воспроизводимого звука.

Для записи сэмплов, проигрываемых через play(double) и play(double[]), используются:

  • startRecording()
  • stopRecording()

startRecording() запускает запись, а stopRecording() останавливает и возвращает записанные сэмплы как массив double.

Важно: запись не включает звук, запущенный через playInBackground(...).

Фоновое воспроизведение.

Для фонового звука:

  • playInBackground(String filename)
  • stopInBackground()

Каждый вызов playInBackground(...) запускает звук в отдельном фоновом потоке, и программа продолжает выполняться без ожидания конца аудио.

Завершение воспроизведения (drain).

На некоторых системах программа может завершиться раньше, чем все сэмплы реально уйдут в звуковую карту. Чтобы этого избежать, в конце работы со звуком рекомендуется вызывать:

  • drain()

Метод отправляет оставшиеся буферизованные сэмплы в устройство вывода.

Дополнительная документация.

Дополнительно см. раздел 1.5 книги Computer Science: An Interdisciplinary Approach.

Полное API StdAudio на английском


По материалам:
Robert Sedgewick, Kevin Wayne. Computer Science: An Interdisciplinary Approach. Princeton University.