Spec-Zone .ru
спецификации, руководства, описания, API
Содержание документации

<Содержание

Глава 6: Обработка Аудио со Средствами управления

Предыдущие главы обсудили, как играть или получить аудиосэмплы. Неявная цель состояла в том, чтобы поставить выборки настолько искренне насколько возможно без модификации (кроме возможного смешивания выборок с теми от других аудио строк). Иногда, однако, Вы хотите быть в состоянии изменить сигнал. Пользователь мог бы хотеть, чтобы это звучало громче, более тихим, более полным, более отражающим, выше или ниже в подаче, и так далее. Эта глава обсуждает функции API Звука Java, которые обеспечивают эти виды сигнальной обработки.

Есть два способа применить сигнальную обработку:

Эта глава обсуждает первый метод более подробно, потому что нет никакого специального API для второго метода.

Введение в Средства управления

У микшера могут быть различные виды обрабатывающих сигнал средств управления на некоторых или всех его строках. Например, микшер, используемый для аудио получения, мог бы иметь входной порт с управлением усилением, и предназначаться для строк данных со средствами управления панорамированием и усилением. У микшера, используемого для воспроизведения аудио, могли бы быть средства управления демонстрационного уровня на его строках исходных данных. В каждом случае к средствам управления все получают доступ через методы Line интерфейс.

Поскольку Mixer интерфейс расширяется Line, у самого микшера может быть свой собственный набор средств управления. Они могли бы служить основными средствами управления, влияющими на источник всего микшера, или предназначаться для строк. Например, микшер мог бы иметь основной контроль усиления, значение которого в децибелах добавляется к значениям отдельных средств управления усилением на его целевых строках.

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

Если у микшера или какой-либо из его строк есть средства управления, Вы могли бы хотеть представить средства управления через графические объекты в пользовательском интерфейсе Вашей программы, так, чтобы пользователь мог скорректировать аудио характеристики как требующийся. Средства управления не являются самостоятельно графическими; они только позволяют Вам получать и изменять их настройки. Вам решать решить какой графические изображения (ползунки, кнопки, и т.д.), если таковые вообще имеются, чтобы использовать в Вашей программе.

Все средства управления реализуются как конкретные подклассы абстрактного класса Control. Много типичных средств управления обработки аудиоданных могут быть описаны абстрактными подклассами Control основанный на типе данных (таком как булевская переменная, перечисленная, или плавание). Булевы средства управления, например, представляют двоичный государственный контроль, такой как вкл\выкл средства управления для бесшумного или реверберации. Средства управления плавающие, с другой стороны, хорошо подходят представлять непрерывно переменные средства управления, такие как панорамирование, баланс, или объем.

API Звука Java определяет следующие абстрактные подклассы Control:

Каждый подкласс Control выше имеет методы, подходящие для его базового типа данных. Большинство классов включает методы, которые устанавливают и получают текущую стоимость (ь) управления, получают метку (ки) управления и так далее.

Конечно, у каждого класса есть методы, которые определены к нему и модель данных, представленная классом. Например, EnumControl имеет метод, который позволяет Вам получать набор его возможных значений, и FloatControl разрешения Вы, чтобы получить ее минимальные и максимальные значения, так же как точность (инкремент или размер шага) управления.

Каждый подкласс Control имеет соответствие Control.Type подкласс, который включает статические экземпляры, которые идентифицируют определенные средства управления.

Следующая таблица показывает каждого Control подкласс, его соответствие Control.Type подкласс, и статические экземпляры, которые указывают на определенные виды средств управления:

Control Control.Type Control.Type экземпляры
BooleanControl BooleanControl.Type

MUTE

Бесшумное состояние строки

APPLY_REVERB

Реверберация вкл\выкл

CompoundControl CompoundControl.Type (ни один)
EnumControl EnumControl.Type REVERB

Доступ, чтобы ревербировать настройки (каждый - экземпляр ReverbType),

FloatControl FloatControl.Type AUX_RETURN

Вспомогательный возврат нагоняет строку

AUX_SEND

Вспомогательный передаются, нагоняют строку

BALANCE

Лево-правильный баланс объема

MASTER_GAIN

Повсюду нагоните строку

PAN

Лево-правильная позиция

REVERB_RETURN

Постреверберация нагоняет строку

REVERB_SEND

Предварительная реверберация нагоняет строку

SAMPLE_RATE

Демонстрационный уровень воспроизведения

VOLUME

Объем на строке

Реализация API Звука Java может обеспечить любые из этих типов управления на его микшерах и строках. Это может также предоставить дополнительные типы управления, не определенные в API Звука Java. Такие типы управления могли быть реализованы через конкретные подклассы любого из этих четырех абстрактных подклассов, или через дополнительный Control подклассы, которые не наследовались ни от одного из этих четырех абстрактных подклассов. Прикладная программа может запросить каждую строку, чтобы найти то, что управляет этим, поддерживает.

Получение Строки, у которой Есть Требуемые Средства управления

Во многих случаях прикладная программа просто выведет на экран любые средства управления, оказывается, поддерживаются рассматриваемой строкой. Если у строки нет никаких средств управления, пусть будет так. Но что, если важно найти строку, у которой есть определенные средства управления? В этом случае можно использовать a Line.Info получить строку, у которой есть правильные характеристики, как описано при "Получении Строки Требуемого Типа" в Главе 3, "Получая доступ к Ресурсам Аудиосистемы."

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

Port lineIn;
FloatControl volCtrl;
try {
  mixer = AudioSystem.getMixer(null);
  lineIn = (Port)mixer.getLine(Port.Info.LINE_IN);
  lineIn.open();
  volCtrl = (FloatControl) lineIn.getControl(
FloatControl.Type.VOLUME);
// Assuming getControl call succeeds, // we now have our LINE_IN VOLUME control. } catch (Exception e) { System.out.println("Failed trying to find LINE_IN" + " VOLUME control: exception = " + e); } if (volCtrl != null) // ...

Получение Средств управления от Строки

Прикладная программа, которая должна представить средства управления в ее пользовательском интерфейсе, могла бы просто запросить доступные строки и средства управления, и затем вывести на экран соответствующий элемент пользовательского интерфейса для каждого управления на каждой строке интереса. В таком случае единственная миссия программы состоит в том, чтобы предоставить пользователю "дескрипторы" на управлении; не знать, что те средства управления делают к аудиосигналу. Пока программа знает, как отобразить средства управления строки в элементы пользовательского интерфейса, архитектуру API Звука Java Mixer, Line, и Control будет обычно заботиться об остальных.

Например, предположите, что Ваша программа воспроизводит звук. Вы используете a SourceDataLine, который Вы получили как описано при "Получении Строки Требуемого Типа" в Главе 3, "Получая доступ к Ресурсам Аудиосистемы." Можно получить доступ к средствам управления строки, вызывая Line метод:

Control[] getControls()
Затем, для каждых из средств управления в этом возвращенном массиве, Вы тогда используете следующий Control метод, чтобы получить тип управления:
Control.Type getType()
Знание определенного Control.Type экземпляр, Ваша программа может вывести на экран соответствующий элемент пользовательского интерфейса. Конечно, выбирая "соответствующий элемент пользовательского интерфейса" для определенного Control.Type зависит от подхода, проявленного Вашей программой. С одной стороны Вы могли бы использовать тот же самый вид элемента, чтобы представить все Control.Type экземпляры того же самого класса. Это потребовало бы, чтобы Вы запросили класс Control.Type использование экземпляра, например, Object.getClass метод. Скажем, результат соответствовал BooleanControl.Type. В этом случае Ваша программа могла бы вывести на экран универсальный флажок или выключатель, но если его соответствующий класс FloatControl.Type, тогда Вы могли бы вывести на экран графический ползунок.

С другой стороны Ваша программа могла бы различить различные типы средств управления — даже таковых из того же самого класса — и использовать различный элемент пользовательского интерфейса для каждого. Это потребовало бы, чтобы Вы протестировали экземпляр, возвращенный Control's getType метод. Затем, если, например, тип соответствовал BooleanControl.Type.APPLY_REVERB, Ваша программа могла бы вывести на экран флажок; в то время как, если тип соответствовал BooleanControl.Type.MUTE, Вы могли бы вместо этого вывести на экран выключатель.

Используя Управление, чтобы Изменить Аудиосигнал

Отметить

Текущая реализация требует что изменить значение a Control его соответствие Line должно быть открытым.

Теперь, когда Вы знаете, как получить доступ к управлению и определить его тип, этот раздел опишет, как использовать Controls изменить аспекты аудиосигнала. Этот раздел не покрывает каждый доступный элемент управления; скорее это обеспечивает несколько примеров в этой области, чтобы показать Вам, как начать. Они пример включают:

Предположите, что Ваша программа получила доступ ко всем своим микшерам, их строкам и средствам управления на тех строках, и что у нее есть структура данных, чтобы управлять логическими ассоциациями между средствами управления и их соответствующими элементами пользовательского интерфейса. Затем, преобразовывая манипуляции пользователя теми средствами управления в соответствие Control методы становятся довольно прямым вопросом.

Следующие подразделы описывают некоторые из методов, которые должны быть вызваны, чтобы влиять на изменения к определенным средствам управления.

Управление Бесшумным государством Строки

Управление бесшумным состоянием любой строки является просто вопросом вызова следующего BooleanControl метод:

void setValue(boolean value)
(По-видимому, программа знает, относясь к ее структурам данных управления управления, что бесшумным является экземпляр a BooleanControl.), Чтобы отключить звук сигнала это проходит через строку, программа вызывает метод выше, определяя true как значение. Чтобы выключить отключение звука, разрешая сигнал течь через строку, программа вызывает метод с набором параметра к false.

Изменение Объема Строки

Давайте предполагать, что Ваша программа связывает определенный графический ползунок с регулировкой громкости определенной строки. Значение регулировки громкости (то есть, FloatControl.Type.VOLUME) устанавливается, используя следующий FloatControl метод:

void setValue(float newValue)
Обнаруживая, что пользователь, перемещенный ползунок, программа, получает текущую стоимость ползунка и передает это как параметр newValue, к методу выше. Это изменяет объем течения сигнала, хотя строка, которой "принадлежит" управление.

Выбор среди Различных Предварительных установок Реверберации

Давайте предположим, что у нашей программы есть микшер со строкой, которая имеет контроль над типом EnumControl.Type.REVERB. Вызов EnumControl метод:

java.lang.Objects[] getValues() 
на том управлении производит массив ReverbType объекты. При желании к определенным установкам параметров каждого из этих объектов можно получить доступ, используя следующий ReverbType методы:
int getDecayTime() 
int getEarlyReflectionDelay() 
float getEarlyReflectionIntensity() 
int getLateReflectionDelay() 
float getLateReflectionIntensity() 
Например, если программа только хочет единственную реверберацию, устанавливающую, который походит на пещеру, она может выполнить итерации по ReverbType объекты, пока это не находит один для который getDecayTime возвращает значение, больше чем 2000. Для полного объяснения этих методов, включая таблицу представительных возвращаемых значений, см. справочную документацию API для javax.sound.sampled.ReverbType.

Как правило, хотя, программа создаст элемент пользовательского интерфейса, например, переключатель, для каждого из ReverbType объекты в пределах массива, возвращенного getValues метод. Когда пользователь щелкает по одному из этих переключателей, программа вызывает EnumControl метод

void setValue(java.lang.Object value) 
где value устанавливается в ReverbType это соответствует недавно занятой кнопке. Аудиосигнал, отправленный через строку, которой "принадлежит" это EnumControl будет тогда отражен согласно установкам параметров, которые составляют ток управления ReverbType (то есть, деталь ReverbType определенный в value параметр setValue метод).

Так, с точки зрения нашей прикладной программы, позволяя пользователю переместиться от одной предварительной установки реверберации (то есть, ReverbType) другому просто вопрос соединения каждого элемента массива, возвращенного getValues к отличному переключателю.

Управление Аудиоданными Непосредственно

Control API позволяет реализацию API Звука Java, или стороннего провайдера микшера, чтобы предоставить произвольные виды обработки сигнала посредством средств управления. Но что, если никакой микшер не предлагает вид сигнала, обрабатывающего Вас потребность? Потребуется больше работы, но Вы могли бы быть в состоянии реализовать обработку сигнала в своей программе. Поскольку API Звука Java предоставляет Вам доступ к аудиоданным как массив байтов, можно изменить эти байты всегда, Вы выбираете.

Если Вы обрабатываете входящий звук, можно считать байты из a TargetDataLine и затем управляйте ими. Алгоритмически тривиальный пример, который может привести к акустически интригующим результатам, должен играть звук назад, располагая его фреймы в обратном порядке. Этот тривиальный пример, возможно, не имеет большого количества применения для Вашей программы, но есть многочисленный сложный цифровой сигнал, обрабатывающий (DSP) методы, которые могли бы быть более соответствующими. Некоторыми примерами является коррекция, сжатие динамического диапазона, пиковое ограничение, и время, простираясь или сжатие, так же как спецэффекты, такие как задержка, хор, flanging, искажение, и так далее.

Чтобы воспроизвести обработанный звук, можно разместить свой массив, которым управляют, байтов в a SourceDataLine или Clip. Конечно, массив байтов не должен быть получен из существующего звука. Можно синтезировать звуки с нуля, хотя это требует некоторого знания акустики или иначе доступа к функциям синтеза звука. Или для обработки или для синтеза, можно хотеть консультироваться с аудио учебником DSP для алгоритмов, в которых Вы интересно, или иначе импортируете стороннюю библиотеку обрабатывающих сигнал функций в Вашу программу. Для воспроизведения синтезируемого звука рассмотрите ли Synthesizer API в javax.sound.midi пакет удовлетворяет Ваши потребности вместо этого. (См. Главу 12, "Синтезируя Звук.")

 


Oracle и/или его филиалы Авторское право © 1993, 2011, Oracle и/или его филиалы. Все права защищены.
Свяжитесь с Нами