Модераторы: SoWa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Компонент Visualization 
:(
    Опции темы
AntonioBanderaz
Дата 3.2.2007, 15:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Velichko Anton
**


Профиль
Группа: Участник
Сообщений: 851
Регистрация: 28.4.2005
Где: Санкт-Петербург

Репутация: 9
Всего: 18



выкладываю просто класс с комментами
Код

package ascript.components
{
    
    import flash.display.Bitmap;
    import flash.display.BitmapData;
    import flash.events.ContextMenuEvent;
    import flash.events.Event;
    import flash.events.MouseEvent;
    import flash.filters.BlurFilter;
    import flash.geom.Point;
    import flash.geom.Rectangle;
    import flash.media.SoundMixer;
    import flash.utils.ByteArray;
    
    import mx.core.UIComponent;
    
    [Style(name="LineColor", type="Number", format="Color", inherit="no")]
    [Style(name="FillColor", type="Number", format="Color", inherit="no")]
    public class Visualization extends UIComponent
    {
        
        public static var AEVENT:String = "aVis";
        
        public static var STYLE_LINE:uint = 10;
        public static var STYLE_WAVE:uint = 20;
        public static var STYLE_BARS:uint = 30;
        
        public static var CHANEL_MONO:uint = 10;
        public static var CHANEL_STEREO:uint = 20;
        public static var CHANEL_RIGHT:uint = 30;
        public static var CHANEL_LEFT:uint = 40;
        
        public static var EFFECT_VBLUR:uint = 10;
        public static var EFFECT_HBLUR:uint = 20;
        public static var EFFECT_VSCROLL:uint = 30;
        public static var EFFECT_HSCROLL:uint = 40;
        
        
        public var beforEffects:uint = Visualization.EFFECT_VBLUR;
        public var afterEffects:uint = Visualization.EFFECT_HBLUR;
        
        public var type:uint = Visualization.STYLE_WAVE;
        public var channel:uint = Visualization.CHANEL_STEREO;
        public var bars:uint = 256;
        
        private var audioLineColor:uint = 0xFFFFFF;
        private var audioFillColor:uint = 0xFFEEFF;

        private var gain:uint = 1;
        
        private var display:UIComponent = new UIComponent();
        
        public var bitmapData:BitmapData = new BitmapData(1, 1, true, 0x00000000);
        public var bitmap:Bitmap = new Bitmap(bitmapData);
        
        public var peak:Number = 0;
        
        private var spectrumData:ByteArray = new ByteArray();
        private var rc:Number = 0; 
        private var rp:Number = 0;
        
        /**
         * Конструктор компонента
         */
        public function Visualization() 
        {
            // Вешаем событие на onEnterFrame
            addEventListener(Event.ENTER_FRAME, enterFrameListener);
            if(!hasEventListener(Visualization.AEVENT)) {
                switch(afterEffects) {
                    case Visualization.EFFECT_HBLUR:
                        addEventListener(Visualization.AEVENT, this.horizontalBlur);
                        break;
                    case Visualization.EFFECT_VBLUR:
                        addEventListener(Visualization.AEVENT, this.verticalBlur);
                        break;
                    case Visualization.EFFECT_HSCROLL:
                        addEventListener(Visualization.AEVENT, this.horizontalScroll);
                        break;
                    case Visualization.EFFECT_VSCROLL:
                        addEventListener(Visualization.AEVENT, this.verticalScroll);
                        break;
                }
            }
            addEventListener(MouseEvent.MOUSE_DOWN, this.changeStyle);
        }
        
        
        /**
        * Добавляем битмапу на компонент
        * переопределяет метод createChildren()
        * у UIComponent
        */
        override protected function createChildren():void {
            addChild(bitmap);
        }
        
        /**
         * Проверяем на изменения размера и пересоздаём 
         * битмапу.
         */
        override protected function updateDisplayList(width:Number, heigth:Number):void 
        {
            super.updateDisplayList(width, heigth);
            // забираем толщину границы
            var borderTrick:uint = getStyle("borderThickness") * 2;
            if(width - borderTrick > 0 && heigth - borderTrick > 1) {
                bitmapData = new BitmapData(width - borderTrick, heigth - borderTrick, true, 0x0);
            }
            bitmap.bitmapData = bitmapData;
            // Берем цвета
            audioLineColor = getStyle("LineColor");
            audioFillColor = getStyle("FillColor");
            
            // Выставляем переменные reorder center и reorder pixel
            rc = (heigth - borderTrick) / 2;
            rp = (width - borderTrick) / 256;
        }
        
        /**
         * Обработчик события onEnterFrame у нашего компонента
         */
        private function enterFrameListener(e:Event):void 
        {
            // забрали ректангл
            var rect:Rectangle = bitmapData.rect;
            // Сделали снапшет нашего звука
            SoundMixer.computeSpectrum(spectrumData, (type == Visualization.STYLE_BARS), 0);
            
            bitmapData.fillRect(rect, 0x0); 
            
            switch (channel) {
                case Visualization.CHANEL_MONO:
                    toMono();
                case Visualization.CHANEL_LEFT:
                    if(type == Visualization.STYLE_LINE || type == Visualization.STYLE_WAVE) { 
                        drawWave(1); 
                    }
                    if(type == Visualization.STYLE_WAVE) {
                        spectrumData.position=0;
                        drawWave(-1);
                    }
                    if(type == Visualization.STYLE_BARS) {
                        drawEQ();
                    }
                    break;
                case Visualization.CHANEL_RIGHT:
                    for (var i:uint = 0; i < 256 ; i++) {
                        spectrumData.readFloat();
                    } // используем spectrumData.position
                    if(type == Visualization.STYLE_LINE || type == Visualization.STYLE_WAVE) { 
                        drawWave(1); 
                    }
                    if(type == Visualization.STYLE_WAVE) {
                        spectrumData.position = 0;
                        for(i = 0; i < 256 ; i++) {
                            spectrumData.readFloat();
                        }
                        drawWave(-1);
                    }
                    if(type == Visualization.STYLE_BARS) {
                        drawEQ();
                    }
                    break;
                case Visualization.CHANEL_STEREO:
                    if(type == Visualization.STYLE_LINE || type == Visualization.STYLE_WAVE) { 
                        drawWave(1);
                        drawWave(1);
                    }
                    if(type == Visualization.STYLE_WAVE) {
                        spectrumData.position = 0;
                        drawWave(-1);
                        drawWave(-1);
                    }
                    if(type == Visualization.STYLE_BARS) {
                        drawEQ();
                        drawEQ();
                    }
                    break;
                default:
            }
            
            // Блёрим для красоты )
            bitmapData.applyFilter( bitmapData, 
                                    rect, 
                                    new Point(0, 0), 
                                    new BlurFilter(bitmapData.width / 256, bitmapData.width / 256, 1));
            dispatchEvent( new Event(Visualization.AEVENT, true) );
        }
        /**
         * Используется только для моно выхода
         */
        private function toMono():void 
        {
            spectrumData.position = 0;
            if(spectrumData.length == 2048) {
                var leftData:ByteArray = new ByteArray();
                var rightData:ByteArray = new ByteArray();
                spectrumData.readBytes(leftData, 0, 1024);
                spectrumData.readBytes(rightData, 0, 1024);
                spectrumData = new ByteArray();
                for (var i:uint = 0; i < 256 ; i++) {
                    // Усредняем по 2-м каналам - получаем моно )
                    spectrumData.writeFloat((leftData.readFloat() + rightData.readFloat()) / 2);
                }
                spectrumData.position = 0;
            }
        }
        
        /**
         * Используется когда стиль отображения 
         * Visualization.STYLE_LINE || Visualization.STYLE_WAVE
         */
        private function drawWave(modifier:Number=1):void 
        {
            var v:Number;
            var lastv:Number = rc;
            peak = 0;
            for (var i:uint = 0; i < 256; i++) {
                var rf:Number = spectrumData.readFloat();
                v = rc - rf * rc * modifier;
             if(type == Visualization.STYLE_WAVE){
                 bitmapData.fillRect(
                                     new Rectangle( i * rp, 
                                                    Math.min(v, rc), 
                                                    rp, 
                                                    Math.abs(rc - v)), 
                                     0xFF000000 | audioFillColor );
                }
                bitmapData.fillRect( new Rectangle( i * rp, 
                                                    v, 
                                                    rp, 
                                                    1 + Math.abs(lastv - v)), 
                                     0xFF000000 | audioLineColor);
             lastv = v;
             if(Math.abs(rf) > peak) {
                 peak = Math.abs(rf); 
             }
             //horizontalScroll(null);
            }
        }
        
        private function drawEQ():void 
        {
            var v:Number;
            var n:Number = 0;
            var nrp:Number = rp * 256 / bars;
            for (var i:uint = 0; i < bars; i++) {
                n = 0;
                for (var j:uint = 0; j < Math.floor(256 / bars); j++) {
                    n += spectrumData.readFloat();
                    if(Math.abs(n)>peak) {
                        peak = Math.abs(n); 
                    }
                }
                n = n / Math.floor(256 / bars)
                v = Math.max(rc * 2 - n * rc * 2 * gain, 5);
                
             bitmapData.fillRect( new Rectangle( nrp / 8 + i * nrp, 
                                                 v, 
                                                 nrp / 2 + nrp / 4, 
                                                 rc * 2 - v), 
                                  0xFF000000 | audioFillColor);
                bitmapData.fillRect( new Rectangle( nrp / 8 + i * nrp, 
                                                    v, 
                                                    nrp / 2 + nrp / 4, 1), 
                                     0xFF000000 | audioLineColor );
            }
        }
        
        private function verticalBlur(e:Event):void {
            bitmapData.applyFilter( bitmapData, 
                                    bitmapData.rect, 
                                    new Point(0,0), 
                                    new BlurFilter(0,3));
        }
            
        private function horizontalBlur(e:Event):void {
            bitmapData.applyFilter( bitmapData, 
                                    bitmapData.rect, 
                                    new Point(0,0), 
                                    new BlurFilter(3,0));
        }
        
        private function verticalScroll(e:Event):void {
            bitmapData.scroll(0,1);
        }
        
        private function horizontalScroll(e:Event):void {
            bitmapData.scroll(1,0);
        }
        
        private function changeStyle(e:Event):void {
            type = (type + 10) == 40 ? 10 : type + 10;
        }
    }
}



--------------------
ГЫ... 
PM MAIL ICQ   Вверх
AlDev
Дата 3.2.2007, 15:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный идиотъ
***


Профиль
Группа: Участник Клуба
Сообщений: 1927
Регистрация: 17.4.2005
Где: Irk, rus

Репутация: 10
Всего: 50



описание цели этого дела в студию плиз )
PM MAIL WWW ICQ YIM MSN   Вверх
AntonioBanderaz
Дата 3.2.2007, 15:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Velichko Anton
**


Профиль
Группа: Участник
Сообщений: 851
Регистрация: 28.4.2005
Где: Санкт-Петербург

Репутация: 9
Всего: 18



Примерно так используется
Код

<vs:Visualization FillColor="#000000" LineColor="#FEFEFE"  type="{Visualization.STYLE_WAVE}"  width="30%" top="5" bottom="5" left="5"/>


Добавлено @ 15:31 
Грузишь звук, и хочешь, чтобы как в винампе, оно, того, дергалось )))


--------------------
ГЫ... 
PM MAIL ICQ   Вверх
AlDev
Дата 4.2.2007, 08:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный идиотъ
***


Профиль
Группа: Участник Клуба
Сообщений: 1927
Регистрация: 17.4.2005
Где: Irk, rus

Репутация: 10
Всего: 50



а сделать полноценно что бы дергалось, в зависимости от играемого? а не рандомно? smile

Добавлено @ 08:49 
сори, не посмотрел код.
+1 )
PM MAIL WWW ICQ YIM MSN   Вверх
AntonioBanderaz
Дата 4.2.2007, 08:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Velichko Anton
**


Профиль
Группа: Участник
Сообщений: 851
Регистрация: 28.4.2005
Где: Санкт-Петербург

Репутация: 9
Всего: 18



Цитата(AlDev @  4.2.2007,  08:37 Найти цитируемый пост)
а сделать полноценно что бы дергалось, в зависимости от играемого? а не рандомно? smile 

В перекрёстную: доки читать надо... )
И сечёт весь муз поток )
Код

SoundMixer.computeSpectrum(spectrumData, (type == Visualization.STYLE_BARS), 0);




--------------------
ГЫ... 
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | ActionScript 3 | Следующая тема »


 




[ Время генерации скрипта: 0.0759 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.