Spec-Zone .ru
спецификации, руководства, описания, API
След: Звук
Обработка Аудио со Средствами управления
Домашняя страница > Звук

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

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

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

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

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

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

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

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

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

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

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

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

Конечно, у каждого class есть методы, которые определены к нему и модель данных, представленная class. Например, 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 получить строку, у которой есть правильные характеристики, как ранее описано при Получении Строки Требуемого Типа.

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

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, который Вы получили как ранее описано при Получении Строки Требуемого Типа. Можно получить доступ к средствам управления строки, вызывая следующий Line метод:

Control[] getControls()

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

Control.Type getType()

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

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

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

Теперь, когда Вы знаете, как получить доступ к управлению и определить его тип, этот раздел опишет, как использовать 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 пакет удовлетворяет Ваши потребности вместо этого. Вы узнаете больше о javax.sound.midi позже при Синтезировании Звука.


Проблемы с примерами? Попытайтесь Компилировать и Выполнить Примеры: FAQ.
Жалобы? Поздравление? Предложения? Дайте нам свою обратную связь.

Предыдущая страница: Получение Аудио
Следующая страница: Используя Файлы и Преобразователи Формата