Управление параметрами воспроизведения

Под параметрами воспроизведения будем понимать громкость звука и особенности звучания каж дого из его каналов (баланс). Специальные методы класса Sound позволяют изменять параметры воспроизведения, благодаря чему можно добиваться очень интересных результатов. Например, представьте, что вам необходимо создать игру, в которой герой перемещается по трехмерному лабиринту. Чтобы создать иллюзию движения в пространстве, нужно делать звук шагов тем тише, чем дальше герой находится от игрока, При перемещении героя в правую часть лабиринта громкость правого канала должна увеличиваться, и наоборот, при его переходе в левую часть игрового поля доминировать должен левый канал. Подобного рода манипуляции со звуком позволяют делать игры более живыми, а эффекты — реалистичными.

Громкость звука
Управлять громкостью звука можно при помощи метода setVolume(percent), где percent — уровень громкости в процентах по сравнению с принятой по умолчанию (0 — тишина, 100 — стандартная громкость). Параметр percent может принимать значения и большие 100. При этом громкость будет увеличиваться, однако предел ее роста зависит только от звуковой карты и особенностей используемой акустической системы.


На одних компьютерах значение percenl=300 приведет к увеличению громкости в три раза, на других она практически не изменится по сравнению со стандартным уровнем. Ввиду такой неопределенности, значения percent больше 100 % использовать не рекомендуется (а в фирменной справке Macromedia такая возможность даже не упоминается). Тем более качество звука при этом ухудшается, появляется диссонанс. При percent>1000 в звуке уже будет больше шумов, чем полезной информации.

Важно понимать, что метод setVolume() не может управлять реальной громкостью, которая определяется настройкой акустической системы (проще говоря, тем, на какой угол повернут регулятор на колонках) и принятым в операционной системе стандартным уровнем громкости (в Windows его можно задать через Панель управления). Данный метод может лишь изменять громкость воспроизведения в сторону уменьшения по сравнению с принятым по умолчанию уровнем и совсем немного — в сторону увеличения. Так что оглушить недоброжелателя, послав ему открытку, в коде которой параметру setVolume() передается значение 100 000, не получится.

Метод setVolume() задает громкость всех звуков (как прикрепленных программно, так и «вручную»), связанных с той же временной диаграммой, что и объект класса Sound, через который он был вызван.


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

Если метод setVolume() применяется к глобальному объекту класса Sound(), то он влияет на громкость всех звуков в фильме. Однако соотношение громкостей различных звуков при этом не изменяется. То есть модификация, задаваемая setVolume(), является относительной: она учитывает индивидуальные настройки каждого звука, изменяя принятый в них уровень громкости на одну и ту же величину, а не просто делает громкость всех звуков одинаковой. Для уровня громкости характерно нечто вроде наследования. Это проявляется в том, что если изменить громкость звуков данного клипа, то на такое же значение изменится громкость звуков вложенных в него клипов (степень вложенности не имеет значения). Это довольно существенная особенность, из которой вытекает несколько важных выводов. Так, стоит воздержаться от расположения звуков на основной временной диаграмме, иначе при попытке изменить их громкость изменится громкость всех звуков в фильме. Вообще, лучше держать все звуки в клипах одного уровня, иначе их влияние друг на друга будет иметь довольно запутанный и слабо предсказуемый характер.

Прочитать уровень громкости, присущий звукам, которые связаны с тем же клипом, что и данный объект класса Sound, позволяет метод getVolume().


Возвращаемое им значение по смыслу эквивалентно параметру метода setVolume(). Обычно метод getVolume() используется, если известно не абсолютное значение нового уровня громкости, а лишь то, насколько оно отличается от старой его величины.

Для примера приведем код функции, реализующей эффект равномерного затухания звука:

function fadeIn(sound:Sound):Void {
fade.sound=sound, fade.i=0;
function fade():Void {
var snd:Sound=fade.sound;
if (snd.getVolume()>0) {
var proc:Number=(200/snd.duration)*100;
snd.setVolume(100-proc*fade.i);
fade.i++;
} else {
clearInterval(fade.time);
delete fade;
}
}
fade.time=setInterval(fade, 200);
sound.start();
}

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

snd.setVolume(snd.getVolume()-proc);

Причина этого в том, что метод getVolume() возвращает уровень громкости как целое число, которое получается простым отбрасыванием дробной части. Поэтому, какой бы малой ни была величина proc, громкость звука при каждом вызове функции fade будет уменьшаться на 1 %. Обойти сложности, возникающие из-за проводимого округления, напрямую нельзя. Поэтому в функции fade() для определения текущего уровня громкости мы не применяли метод getVolume(), а просто ввели счетчик количества уже проведенных операций уменьшения громкости.

Баланс
Баланс — это термин, обозначающий соотношение громкостей каналов. В любой стереосистеме вы можете сделать один канал более громким по сравнению с другим (например, чтобы учесть разное расстояние от колонок до слушателя). Регулятор баланса имеется и в плейерах вроде Winamp. В ActionScript настроить баланс позволяет метод setPan() класса Sound.

В качестве аргумента метод setPan() принимает целое число от —100 до 100. При величине параметра — 100 с полной громкостью звучит левый канал, а громкость правого канала равна нулю. По мере увеличения значения аргумента интенсивность правого канала возрастает. Так, при величине параметра -70 громкость правого канала соответствует 30 % от стандартного уровня. При нулевом значении аргумента setPan() громкость правого канала достигает 100 %. Это точка равновесия, в которой оба канала имеют одинаковую громкость, соответствующую стандартной ее величине при данных настройках (именно такое значение баланса применяется по умолчанию). Дальнейшее увеличение параметра setPan() в сторону положительных значений приведет к ослаблению левого канала. При величине аргумента 100 звучать будет только правый канал.

Наиболее эффективно использовать метод setPan() можно, естественно, в случае стереозвуков. Поэтому убедитесь, что в настройках экспорта звуков не активна опция Convert Stereo to Mono.

Впрочем, метод setPan() будет влиять и на характер проигрывания монозвуков. Дело в том, что монозвук обычно разделяется звуковой картой на два идентичных потока, поэтому оба канала оказываются задействованными. Поэтому, например, если у вас есть монозвук летящей стрелы, то вы можете создать эффект ее движения в пространстве, изменяя значение баланса от -100 до 100. Эффекты такого рода называются панорамированием (panning).

Метод setPan(), как и setVolume(), влияет на все звуки, относящиеся к тому клипу, на который указывает соответствующий объект класса Sound. Если setPan() был задействован через глобальный объект класса Sound(), то он воздействует на баланс всех звуков в фильме. Если изменяется баланс для звуков некоторого клипа, то аналогичные изменения происходят и с балансом звуков вложенных в него клипов. Выводы из этого факта можно сделать те же, что и в случае с setVolume().

Прочитать текущее значение баланса позволяет метод getPan(). Он возвращает целое число от -100 до 100, имеющее тот же смысл, что и параметр метода setPan(). Кстати, факт работы методов getPan() и setPan() с округленными значениями означает, что в расчетах с ними не должны фигурировать дробные величины. Иначе результат выполнения кода может оказаться некорректным.

В качестве примера использования метода setPan() приведем код, который задает баланс звука исходя из координаты указателя мыши по оси X, а громкость — исходя из его координаты по оси Y. Подобный код обычно используется для усиления имитации движения в пространстве.

var sound:Sound=new Sound(this);
sound.attachSound("snd");
sound.start();
this.onMouseMove=function():Void {
var pan:Number=Math.round(-100+2*(_xmouse/Stage.width)*100);
var volume:Number=Math.round((_ymouse/Stage.height)*l00);
sound.setPan(pan);
sound.setVolume(volume);
};

Детальное управление стереозвучанием. Метод setTransform()
Несмотря на свою компактность, Flash-плейер поддерживает такой мощный инструмент управления звуком, как многоканальное микширование. Суть этой возможности состоит в том, что вы можете произвольным образом задавать, с какой интенсивностью каждый канал должен воспроизводиться определенным динамиком. Например, можно сделать так, чтобы звук воспроизводился только одним динамиком (по умолчанию даже монозвуки проигрываются обеими колонками).

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

Носителем возможности детального управления стереозвучанием в ActionScript является метод setTransform(). Подобно уже изученному методу setTransform() класса Color, в качестве параметра данный метод принимает объект класса Object с набором свойств, определяющих интенсивность каждого канала в определенном динамике. Всего таких свойств четыре:

• 11 — громкость звука левого канала в левом динамике. Может принимать значения от 0 (левый канал вообще не воспроизводится в левом динамике) до 100 (громкость левого канала в левом динамике равна его номинальной громкости). Можно использовать значения и больше 100, однако при этом не происходит заметного усиления звучания, а вот качество становится гораздо хуже;

• 1r — процент от номинальной громкости, с соответствующей интенсивностью которому звук правого канала должен воспроизводиться левым динамиком. Если задать свойству 1r значение 100, а свойству гг — 0, то звук правого канала будет выводиться только в левом динамике;

• r1 — определяет, с какой громкостью звук левого канала должен воспроизводиться правым динамиком;

• rr — громкость звука правого канала в правом динамике.

Описанные свойства абсолютно не зависят от величины друг друга. Если интенсивность левого канала в правом динамике 30 %, то это не значит, что громкость звука этого канала в левом динамике должна составлять 70 %, Сигналы для динамиков формируются независимо, так что микшировать составляющие можно в любом отношении.

По умолчанию значения свойств ll и rr равны 100, а 1r и r1 — 0 (то есть каждый канал проигрывается только «своим» динамиком). Причем такие значения характерны как для стерео, так и для монозвуков. Это объясняется тем, что на основе монозвука создается своего рода имитация стерео за счет выведения звука одного канала в оба динамика. Задавая трансформацию, совсем необязательно определять все свойства. Достаточно прописать лишь те, которые должны изменить величину по сравнению со значением по умолчанию.

Метод setTransform(), как и методы setVolume() и setPat(), воздействует на все звуки, связанные с тем же клипом, что и объект класса Sound, через который данный метод был вызван. При использовании метода setTransform() по отношению к глобальному объекту класса Sound меняется характер стереозвучания всех звуков в фильме. Если применить рассматриваемый метод к звукам одного клипа, то соответствующим образом изменятся параметры воспроизведения и звуков вложенных в него клипов.

В качестве примера использования метода setTransform() приведем код, выводящий один звук в одном динамике, а другой — в другом:

// Создаем для звуков клипы-носители
this.createEmptyMovieClip("clip1", 0);
this.createEmptyMovieClip("clip2", 0);
// Создаем объекты класса Sound и присоединяем к ним нужные звуки
var sound1:Sound=new Sound(clip1);
var sound2:Sound=new Sound(clip2);
sound1.attachSound("snd1");
sound2.attachSound("snd2");
// Перекосим один звук полностью в правый динамик, а второй - в левый
sound1.setTransform({rr:0, 1r:100});
sound2.setTransform({11:0, 1r:100});
// Запускаем проигрывание
sound1.start(), sound2.start();

У метода setTransform() имеется парный метод getTransform(), позволяющий считать текущие значения свойств 11, 1r, r1 и гг. В качестве результата данный метод возвращает объект, содержащий искомые свойства. Обычно метод getTransform() используется, если модификация должна быть проведена не на основе абсолютных значений для свойств, а исходя из величин, на которые они должны измениться.

Оцените статью: (0 голосов)
0 5 0

Статьи из раздела Action Script на эту тему:
Динамическое присоединение звука. Метод attachSound()
Импортирование внешних МР3-файлов
Операции со звуком без использования программирования
Основные понятия теории цифрового звука
Свойства position и duration

Вернуться в раздел: Action Script / 15. Работа со звуком