PDA

Просмотр полной версии : Возможно ли сделать эхо у подгружаемого звука? (loadSound)


Кот Баюн
23.03.2014, 10:22
Всем доброго дня!
Интересный вопрос возник.
Можно подгрузить внешний звук на таймлайн при помощи
var my_sound = new Sound();
my_sound.loadSound("snd/my_sound.mp3", true);
my_sound.onLoad = function ()
{
my_sound.start();
};


А есть ли возможность сделать "эхо" у такого звука, то есть запустить его клон еще два раза подряд с некоторой задержкой и более тихой громкостью?
То есть к примеру -

Звук.
Спустя 0,25 секунды - тот же звук, но тише.
И спустя 0,5 секунды - тот же звук, но еще тише.

Буду благодарен за любые варианты))

Hauts
23.03.2014, 14:24
Кот Баюн, да, возможно.

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

Но принцип один и тот же, — создаете несколько инстансов звуков, запускаете с задержкой. Звуки для эха с пониженной громкостью.

Собственно, вашего кода должно хватать. Ну, setTimeout еще пригодится.

mooncar
23.03.2014, 15:36
Держите пример.
Если непонятно, для чего создавать пустые мувики для каждого экземпляра звука.
PS. Подгружаемый звук придется подгружать столько раз, сколько нужно эхо-экземпляров, поэтому звук целесообразно заранее положить в библиотеку.

Кот Баюн
23.03.2014, 17:02
Я посмотрел этот вариант - хороший вариант, к нему можно прикрутить подгрузку звука, и усовершенствовать стерео-панорамирование)))



this.createEmptyMovieClip('mc_s1', 0);
this.createEmptyMovieClip('mc_s2', 1);
this.createEmptyMovieClip('mc_s3', 2);
this.createEmptyMovieClip('mc_s4', 3);

var s1:Sound = new Sound(mc_s1);
s1.loadSound("snd/28.mp3", false);


var s2:Sound = new Sound(mc_s2);
s2.loadSound("snd/28.mp3", false);

var s3:Sound = new Sound(mc_s3);
s3.loadSound("snd/28.mp3", false);

var s4:Sound = new Sound(mc_s4);
s4.loadSound("snd/28.mp3", false);


startSound(s1, 100); //нормальный старт
setTimeout(startSound, 25, s2, 20, -50);
setTimeout(startSound, 50, s3, 10, 100);
setTimeout(startSound, 75, s4, 5, -50);

function startSound(sound:Sound, vol:Number, pan:Number)
{
sound.setVolume(vol);
sound.setPan(pan);
sound.start();
}


stop();



Но вот что интересно, значения задержки при определенных цифрах не работают.
И при выставлении задержки, например, меньше 25, звук просто пропадает.
А допустим, как сделать эффект "ванной комнаты" - когда задержки очень малы?

Hauts
23.03.2014, 17:18
Кот Баюн для подобных задач целесообразнее либо готовить звуки заранее, либо использовать ас3.

Кот Баюн
23.03.2014, 17:20
Хотелось бы, так сказать, понять причину.

dark256
25.03.2014, 10:01
Можно вот тут почитать на вашу тему:
http://www.flasher.ru/forum/showthread.php?t=205696

Обратите внимание на использование события "onLoad"

Кот Баюн
26.03.2014, 14:13
Про OnLoad - оно было в первоначальном коде.
var my_sound = new Sound();
my_sound.loadSound("snd/my_sound.mp3", true);
my_sound.onLoad = function ()
{
my_sound.start();
};

В варианте от mooncar отсутствует, потому что там звуки из библиотеки.
Я честно пытался прикрутить туда onload, но в конечном итоге он все-таки не прикрутился.

mooncar
26.03.2014, 14:51
Я честно пытался прикрутить туда onload, но в конечном итоге он все-таки не прикрутился.
А туда и не надо. В чем смысл? Считается, что добавление объектов из библиотеки в рантайме происходит синхронно, в отличии от асинхронной (по отношению к исполнению кода) подгрузки ресурсов извне (считай - из инета), поэтому обработчик события загрузки не нужен.

Кот Баюн
26.03.2014, 16:51
Очень много звуков, которые надо "реверберировать" и весят они нехило.
Затолкать все в библиотеку - "компиляция" SWF будет длиться полчаса.
Потому подгружаю.
А делать копии файлов с заранее наложенным эхом было бы слишком хлопотно.
Про задержку в курсе.
Но не совсем ясно, почему после уменьшения задержек в копиях эхо пропадает вообще.

mooncar
26.03.2014, 23:28
Точность исполнения setTimeout, setInterval зависят от FPS. При временах, приближенных к FPS, могут возникать неточности исполнения отложенных действий. Я сам никогда не использую во флеше временные промежутки, меньше чем 50 мс, не вижу смысла по вышеуказанной причине.
Возможно, кто-либо даст развернутый ответ и укажет более точные причины.

Кот Баюн
27.03.2014, 09:10
Проблему можно было бы решить, если бы к одному из sound-объектов приделать seconds offset (это первый аргумент в скобках после start).

sound.start(secondsoffset, loops)

Но они стартуют все одновременно, если бы была возможность их разделить.

А кстати, один кадр при 25fps - это 40 ms?