Глава 01: Введение в Java Sound API
Цели дизайна
Java Sound API - это низкоуровневый API для создания и управления вводом и выводом звуковых носителей, включая как аудио, так и данные цифрового интерфейса музыкальных инструментов (MIDI). Java Sound API обеспечивает явный контроль над возможностями, которые обычно требуются для ввода и вывода звука, в структуре, которая способствует расширяемости и гибкости.
Для кого предназначен Java Sound API?
Поскольку звук имеет фундаментальное значение, Java Sound API удовлетворяет потребности широкого круга разработчиков приложений. Возможные области применения:
- Коммуникационные платформы, такие как конференц-связь и телефония
- Системы доставки контента конечным пользователям, такие как медиаплееры и музыка, использующие потоковый контент
- Интерактивные прикладные программы, такие как игры и веб-сайты, использующие динамический контент
- Создание и редактирование контента
- Инструменты, наборы инструментов и утилиты
Как Java Sound API соотносится с другими интерфейсами?
Java Sound API обеспечивает самый низкий уровень звуковой поддержки на платформе Java. Он предоставляет прикладным программам большой объем контроля над звуковыми операциями и является расширяемым. Например, Java Sound API предоставляет механизмы для установки, доступа и управления системными ресурсами, такими как аудиомикшеры, MIDI-синтезаторы, другие аудио-или MIDI-устройства, устройства чтения и записи файлов и преобразователи звуковых форматов. Java Sound API не включает в себя сложные звуковые редакторы или графические инструменты, но предоставляет возможности, на которых могут быть построены такие программы. Он подчеркивает низкоуровневый контроль сверх того, что обычно ожидается конечным пользователем.
Существуют и другие API платформы Java, которые имеют элементы, связанные со звуком. Java Media Framework (JMF)-это высокоуровневый API, который в настоящее время доступен в качестве стандартного расширения платформы Java. JMF определяет унифицированную архитектуру, протокол обмена сообщениями и программный интерфейс для захвата и воспроизведения мультимедиа на основе времени. JMF предоставляет более простое решение для базовых прикладных программ медиаплеера и обеспечивает синхронизацию между различными типами носителей, такими как аудио и видео. С другой стороны, программы, ориентированные на звук, могут извлечь выгоду из API Java Sound, особенно если они требуют более продвинутых функций, таких как возможность тщательно контролировать буферизованное воспроизведение звука или непосредственно управлять MIDI-синтезатором. Другие API Java со звуковыми аспектами включают Java 3D и API для телефонии и речи. Реализация любого из этих API может использовать реализацию Java Sound API внутренне, но не обязательно делать это.
Пакеты
Java Sound API включает в себя поддержку как цифрового аудио, так и MIDI-данных. Эти два основных модуля функциональности предоставляются в отдельных пакетах:
- javax.sound.sampled Этот пакет определяет интерфейсы для захвата, микширования и воспроизведения цифрового (сэмплированного) аудио.
- javax.sound.midi Этот пакет предоставляет интерфейсы для синтеза MIDI, секвенирования и транспорта событий.
Два других пакета позволяют поставщикам услуг (в отличие от разработчиков приложений) создавать пользовательские программные компоненты, расширяющие возможности реализации Java Sound API:
- javax.sound.sampled.spi
- javax.sound.midi.spi
Остальная часть этой главы кратко обсуждает сэмплированную аудиосистему, MIDI-систему и пакеты SPI. Каждый из них затем подробно обсуждается в следующей части руководства.
Дискретное (Сэмплированное) аудио
Что такое дискретизированный звук?
Пакет javax.sound.sampled обрабатывает цифровые аудиоданные, которые Java Sound API называет дискретизированным звуком. Samples - это последовательные снимки сигнала. В случае аудио сигнал представляет собой звуковую волну. Микрофон преобразует акустический сигнал в соответствующий аналоговый электрический сигнал, а аналого-цифровой преобразователь преобразует этот аналоговый сигнал в дискретную цифровую форму. На следующем рисунке показан краткий момент записи звука.
Оцифрованная звуковая волна.
На этом графике по вертикальной оси отложено звуковое давление (амплитуда), а по горизонтальной оси - время. Амплитуда аналоговой звуковой волны периодически измеряется с определенной скоростью, в результате чего получаются дискретные выборки (красные точки данных на рисунке), которые составляют цифровой аудиосигнал. Центральная горизонтальная линия указывает нулевую амплитуду; точки над линией - это положительные образцы, а точки ниже - отрицательные. Точность цифровой аппроксимации аналогового сигнала зависит от его разрешения по времени (частота дискретизации) и его квантования или разрешения по амплитуде (количество битов, используемых для представления каждой выборки). Для сравнения: звук, записанный для хранения на компакт-дисках, дискретизируется 44 100 раз в секунду и представляется с 16 битами на отсчет.
Термин «дискретизированный звук» используется здесь немного вольно. Звуковая волна может быть дискретизирована через дискретные промежутки времени, оставаясь в аналоговой форме. Однако для Java Sound API «дискретизированное аудио» эквивалентно «цифровому аудио».
Обычно дискретизированный звук на компьютере поступает из звукозаписи, но вместо этого звук может быть сгенерирован синтетически (например, для создания звуков тонального набора телефона). Термин «дискретизированный звук» относится к типу данных, а не к их происхождению.
Дополнительная информация о структуре цифровых аудиоданных приведена в разделе "Что такое форматированные аудиоданные?" в главе 2, "Обзор пакета Samples."
Аудио конфигурации
Java Sound API не предполагает определенной конфигурации аудиооборудования; он предназначен для установки в системе различных видов аудиокомпонентов и доступа к ним через API. Java Sound API поддерживает общие функции, такие как ввод и вывод со звуковой карты (например, для записи и воспроизведения звуковых файлов), а также смешивание нескольких потоков звука. Вот один пример типичной аудиоархитектуры:
Типичная аудио архитектура
В этом примере такое устройство, как звуковая карта, имеет различные входные и выходные порты, а микширование обеспечивается в программном обеспечении. Микшер может получать данные, которые были прочитаны из файла, переданы из сети, сгенерированы на лету прикладной программой или созданы синтезатором MIDI. (Пакет javax.sound.midi, обсуждаемый далее, предоставляет интерфейс языка Java для синтезаторов.) Микшер объединяет все свои аудиовходы в единый поток, который может быть отправлен на устройство вывода для рендеринга.
MIDI
Пакет javax.sound.midi содержит API-интерфейсы для передачи и упорядочивания MIDI-событий, а также для синтеза звука из этих событий.
Что такое MIDI?
В то время как сэмплы являются прямым представлением самого звука, MIDI-данные можно рассматривать как рецепт создания звука, особенно музыкального звука. MIDI-данные, в отличие от аудиоданных, не описывают звук напрямую. Вместо этого он описывает события, которые влияют на звук, издаваемый синтезатором. MIDI-данные аналогичны событиям клавиатуры и мыши графического пользовательского интерфейса. В случае MIDI события можно рассматривать как действия на музыкальной клавиатуре, а также действия на различные педали, ползунки, переключатели и ручки на этом музыкальном инструменте. Эти события не обязательно должны происходить с аппаратным музыкальным инструментом; их можно смоделировать в программном обеспечении и хранить в файлах MIDI. Программа, которая может создавать, редактировать и исполнять эти файлы, называется секвенсором. Многие компьютерные звуковые карты включают в себя управляемые по MIDI микросхемы музыкального синтезатора, на которые секвенсоры могут отправлять свои MIDI-события. Синтезаторы также могут быть реализованы полностью программно. Синтезаторы интерпретируют принимаемые MIDI-события и производят аудиовыход. Обычно звук, синтезируемый из данных MIDI, является музыкальным звуком (в отличие, например, от речи). MIDI-синтезаторы также могут создавать различные звуковые эффекты.
Некоторые звуковые карты имеют порты ввода и вывода MIDI, к которым можно подключать внешние устройства MIDI (например, синтезаторы клавиатуры или другие инструменты). Из входного порта MIDI прикладная программа может получать события, генерируемые внешним музыкальным инструментом, оснащенным MIDI. Программа может воспроизводить музыкальное исполнение, используя внутренний синтезатор компьютера, сохранять его на диск как файл MIDI или преобразовывать его в нотную запись. Программа может использовать выходной порт MIDI для игры на внешнем инструменте или для управления другими внешними устройствами, такими как записывающее оборудование.
Более подробная информация о данных MIDI дана в главе 8 "Обзор пакета MIDI," , в частности в разделе "Обновление MIDI: провода и файлы"
Конфигурации MIDI
На диаграмме ниже показаны функциональные отношения между основными компонентами в возможной конфигурации MIDI на основе Java Sound API. (Как и в случае со звуком, Java Sound API позволяет устанавливать и соединять различные программные MIDI-устройства. Показанная здесь система является одним из возможных сценариев.) Поток данных между компонентами обозначен стрелками. Данные могут быть в стандартном формате файла или (как указано клавишей в правом нижнем углу диаграммы) это могут быть аудио, необработанные байты MIDI или сообщения MIDI с метками времени.
Возможная конфигурация MIDI
В этом примере прикладная программа подготавливает музыкальное исполнение, загружая партитуру, которая хранится в виде стандартного файла MIDI на диске (левая часть схемы). Стандартные файлы MIDI содержат треки, каждый из которых представляет собой список событий MIDI с метками времени. Большинство событий представляют собой музыкальные ноты (высоту звука и ритмы). Этот файл MIDI читается и затем «исполняется» программным секвенсором. Секвенсор исполняет свою музыку, отправляя MIDI-сообщения на какое-то другое устройство, например, на внутренний или внешний синтезатор. Сам синтезатор может читать файл звукового банка, содержащий инструкции по имитации звуков определенных музыкальных инструментов. В противном случае синтезатор будет воспроизводить ноты, хранящиеся в файле MIDI, с использованием звуков любых инструментов, уже загруженных в синтезатор.
Как показано, события MIDI должны быть преобразованы в необработанные (без временных меток) MIDI перед отправкой через выходной порт MIDI на внешний синтезатор. Точно так же необработанные MIDI-данные, поступающие в компьютер от внешнего MIDI-источника (клавишного инструмента на схеме), преобразуются в MIDI-сообщения с временными метками, которые могут управлять синтезатором или которые секвенсор может сохранить для дальнейшего использования. Все эти аспекты потока данных MIDI подробно описаны в последующих главах, посвященных MIDI (см. Часть II этого руководства).
Интерфейсы Поставщика Услуг
Пакеты javax.sound.sampled.spi и javax.sound.midi.spi содержат API-интерфейсы, которые позволяют разработчикам программного обеспечения создавать новые аудио- или MIDI-ресурсы, которые могут быть предоставлены пользователю отдельно и «подключены» к существующей реализации звука Java. API. Вот несколько примеров услуг (ресурсов), которые можно добавить таким образом:
- Аудиомикшер
- MIDI-синтезатор
- Парсер файлов, который может читать или записывать новый тип аудио или MIDI файла
- Конвертер, который переводит между различными форматами звуковых данных
В некоторых случаях службы представляют собой программные интерфейсы для возможностей аппаратных устройств, таких как звуковые карты, и поставщик услуг может быть тем же, что и поставщик оборудования. В других случаях услуги существуют исключительно в программном обеспечении. Например, синтезатор или микшер могут быть интерфейсом к микросхеме на звуковой карте или могут быть реализованы без какой-либо аппаратной поддержки вообще.
Реализация Java Sound API содержит базовый набор служб, но пакеты интерфейса поставщика услуг (SPI) позволяют третьим сторонам создавать новые службы. Эти сторонние сервисы интегрируются в систему так же, как и встроенные сервисы. Класс AudioSystem в выбранном пакете и класс AudioSystem в пакете sampled и класс MidiSystem в пакете midi действуют как координаторы, которые позволяют прикладным программам явно или неявно обращаться к службам. Часто существование службы полностью прозрачно для прикладной программы, которая ее использует. Механизм поставщика услуг приносит пользу пользователям прикладных программ на основе Java Sound API, поскольку новые звуковые функции могут быть добавлены в программу, не требуя нового выпуска JDK или среды выполнения, а во многих случаях даже не требуя нового выпуск самой прикладной программы.
Предыдущая | Следующая |