Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Шорох при уменьшении громкости. (http://www.flasher.ru/forum/showthread.php?t=198619)

RedLizard 30.04.2013 22:54

Шорох при уменьшении громкости.
 
При нажатии на клавишу начинается проигрывание звука:

Код AS3:

soundChannel = sound.play();

При отпускании клавиши в цикле запускается уменьшение громкости на 0.1 за шаг:

Код AS3:

for(var cnt1:int = 10;cnt1 < 0;cnt1++)
{
    soundChannel.soundTransform = new SoundTransform(cnt1/10);
}

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

И вторая беда. При повторном нажатии на одну и ту же клавишу, старый звук останавливаю, новый проигрываю:

Код AS3:

soundChannel.stop();
soundChannel = sound.play();

В результате если быстро нажимать на одну и ту же клавишу (т.е. быстро создавать/останавливать звук) появляются щелчки. Что тоже непонятно.

В живую попробовать проблему можно здесь http://www.pixorama.ru/demo/piano

Wolsh 30.04.2013 23:36

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

Партизан 30.04.2013 23:41

Звук в цикле уменьшать без толку... Цикл мгновенно отработает. Что-бы сделать затухание нужно учесть время между шагами. Возможно из-за этого и щелчок.
Еще щелчок возможен из-за того, что вы в каждой итерации назначаете новый класс SoundTransform, хоть это и маловероятно но все же...

Добавлено через 2 минуты
Цитата:

Сообщение от Wolsh (Сообщение 1131815)
Приведенный код ни разу не выполнится, так что непонятно что здесь обсуждать.
Не говоря уже о том, что совершенно непонятно, зачем тут вообще нужен цикл.

У, шайтан... :) Я даже не обратил внимания на условия цикла...

RedLizard 30.04.2013 23:43

Цитата:

Сообщение от Wolsh (Сообщение 1131815)
Приведенный код ни разу не выполнится, так что непонятно что здесь обсуждать.
Не говоря уже о том, что совершенно непонятно, зачем тут вообще нужен цикл.

Ну естественно это псевдокод. Да в цикле ошибку допустил -- должен быть. Это не принципиально. Вопрос в другом, код для большей наглядности приведен.

Добавлено через 2 минуты
Цитата:

Сообщение от Партизан (Сообщение 1131816)
Звук в цикле уменьшать без толку... Цикл мгновенно отработает. Что-бы сделать затухание нужно учесть время между шагами. Возможно из-за этого и щелчок.
Еще щелчок возможен из-за того, что вы в каждой итерации назначаете новый класс SoundTransform, хоть это и маловероятно но все же...

Добавлено через 2 минуты

У, шайтан... :) Я даже не обратил внимания на условия цикла...

Ну не важно, пусть не в цикле, пусть по таймеру с задержкой в 100 миллисекунд, у меня так и сделано, здесь просто для краткости так написал. Непонятно откуда берется шуршание.

Добавлено через 55 минут
Нагуглил кучу топиков с описанием подобной проблемы, и все без решения. Вот тут та же самая проблема, только звук уменьшается твинером http://stackoverflow.com/questions/1...ding-sound-as3

Партизан 01.05.2013 01:18

Ну может вам это поможет. У меня прекрасно работает, без щелчков.
Код AS1/AS2:

package
{
        import com.greensock.TweenMax;
        import flash.events.Event;
        import flash.events.IOErrorEvent;
        import flash.media.Sound;
        import flash.media.SoundChannel;
        import flash.media.SoundTransform;
        import flash.net.URLRequest;
 
 
        /**
        * ...
        * @author Mikhail Klabukov
        */

        public class BackgroundSound
        {
                static public const SOUND_OFF:String = "soundOff";
                static public const SOUND_ON:String = "soundOn";
                private var sound:Sound;
                private var channel:SoundChannel
                private var played:Boolean = false;
                private var _pos:Number;
                private var st:SoundTransform;
 
                public function BackgroundSound()
                {
                        sound = new Sound(new URLRequest('**********soundUrl**********'));
                        sound.addEventListener(IOErrorEvent.IO_ERROR, errorSoundLoad)
                        channel = sound.play(0, 10000);
                        played = true;
                        MainControls.self.addEventListener(MainControls.SOUND_SWITCH, switchSound);
                }
 
                private function errorSoundLoad(e:IOErrorEvent):void
                {
                        trace(e)
                }
 
                private function switchSound(e:Event):void
                {
                        if (TweenMax.isTweening(st))
                                return;
                        st = channel.soundTransform;
                        if (played)
                        {
                                _pos = channel.position;
                                TweenMax.to(st, 2, {volume: 0, onUpdate: function():void
                                        {
                                                channel.soundTransform = st;
                                        }, onComplete: function():void
                                        {
                                                channel.stop();
                                        }});
                                played = false
                                MainControls.self.dispatchEvent(new Event(SOUND_OFF));
                        }
                        else
                        {
                                channel = sound.play(_pos, 10000);
 
                                TweenMax.to(st, 3, {volume: 1, onUpdate: function():void
                                        {
                                                channel.soundTransform = st;
                                        }});
                                played = true;
                                MainControls.self.dispatchEvent(new Event(SOUND_ON));
 
                        }
                }
 
        }
 
}


RedLizard 01.05.2013 14:57

Цитата:

Сообщение от Партизан (Сообщение 1131823)
Ну может вам это поможет. У меня прекрасно работает, без щелчков.

В том то и дело, что щелчки так же есть. Методом научного тыка удалось установить, что щелчки при быстром изменении громкости есть всегда во флеше. Просто на некоторых звуках это заметнее. Пример, берем тот же ютуб, ищем видео где играют на пианино. http://www.youtube.com/watch?v=x9a5u4JzkLg и ползунок громкости резко двигаем вверх-вниз. И получаем тоже самое шуршание что и в моем коде.

КорДум 01.05.2013 15:05

У меня артефактов нет.
FP 11,7,700,169
Win8 x64

Помнится, когда раньше баловался с секвенсорами, у меня не хватало процессора на реалтаймовую обработку midi VST инструментами. Треск был всегда.

RedLizard 01.05.2013 15:12

Цитата:

Сообщение от КорДум (Сообщение 1131873)
У меня артефактов нет.
FP 11,7,700,169
Win8 x64

Помнится, когда раньше баловался с секвенсорами, у меня не хватало процессора на реалтаймовую обработку midi VST инструментами. Треск был всегда.

Цитата:

В том то и дело, что щелчки так же есть. Методом научного тыка удалось установить, что щелчки при быстром изменении громкости есть всегда во флеше. Просто на некоторых звуках это заметнее. Пример, берем тот же ютуб, ищем видео где играют на пианино. http://www.youtube.com/watch?v=x9a5u4JzkLg и ползунок громкости резко двигаем вверх-вниз. И получаем тоже самое шуршание что и в моем коде.
Вот проделай то что я выше описал.

КорДум 01.05.2013 15:18

Я на основе этого эксперимента и сказал.

iflamberg 07.05.2013 15:12

У меня тоже нет никаких щелчков. Колонки/наушники/звукавая карта глючат?


Часовой пояс GMT +4, время: 14:01.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.