StdAudio
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) и возвращает управление только после завершения проигрывания.
Пример простого ритма:
Файлы (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.