17
May

Another variation of Sound Spectrum 1. Used bitmap data and applied some blur.

Here is the code

Actionscript:
  1. package 
  2. {
  3.     import flash.display.Bitmap;
  4.     import flash.display.BitmapData;
  5.     import flash.display.Shape;
  6.     import flash.display.Sprite;
  7.     import flash.display.StageAlign;
  8.     import flash.display.StageScaleMode;
  9.     import flash.events.Event;
  10.     import flash.events.IOErrorEvent;
  11.     import flash.events.MouseEvent;
  12.     import flash.filters.BitmapFilterQuality;
  13.     import flash.filters.BlurFilter;
  14.     import flash.geom.ColorTransform;
  15.     import flash.geom.Point;
  16.     import flash.geom.Rectangle;
  17.     import flash.media.Sound;
  18.     import flash.media.SoundChannel;
  19.     import flash.media.SoundLoaderContext;
  20.     import flash.media.SoundMixer;
  21.     import flash.net.URLRequest;
  22.     import flash.text.TextField;
  23.     import flash.text.TextFormat;
  24.     import flash.utils.ByteArray;
  25.     /**
  26.      * ...
  27.      * @author Ajay Chhaya
  28.      */
  29.     [SWF(width=512,height=200, backgroundColor="0x0", frameRate="32")]
  30.     public class SpectrumBar5 extends Sprite
  31.     {
  32.         private var txt:TextField = new TextField();
  33.         private var containerArray:Vector.<Bar> = new Vector.<Bar>;
  34.         private var snd:Sound;
  35.         private var bytes:ByteArray = new ByteArray();
  36.        
  37.         private var spectrumSprite:Sprite;
  38.         private var bitmapSource:Bitmap;
  39.         //private var bitmapPolar:Bitmap;
  40.         private var spectrumBitmapData:BitmapData;
  41.        
  42.         private var bars:int = 128;
  43.         private var strechFactor:int = 2;
  44.        
  45.         public function SpectrumBar5()
  46.         {
  47.             if (stage) init();
  48.             else addEventListener(Event.ADDED_TO_STAGE, init);
  49.            
  50.         }
  51.         private function init():void {
  52.             stage.scaleMode = StageScaleMode.NO_SCALE;
  53.             stage.align = "LT";
  54.             removeEventListener(Event.ADDED_TO_STAGE, init);
  55.            
  56.             // add information text
  57.             var tf:TextFormat = new TextFormat();
  58.             tf.font = "Arial";
  59.             txt.textColor = 0x888888;
  60.             tf.color = 0x888888;
  61.             txt.text = "Click to Start";
  62.             txt.setTextFormat(tf);
  63.             txt.x = txt.y = 10;
  64.             txt.selectable = false;
  65.             txt.width = stage.stageWidth;
  66.            
  67.             rectDraw();
  68.             addChild(txt);
  69.             //strechFactor = 256 / bars;
  70.            
  71.             stage.addEventListener(MouseEvent.MOUSE_DOWN, prepareSound);
  72.         }
  73.         private function prepareSound(e:Event = null):void {
  74.            
  75.            
  76.             stage.removeEventListener(MouseEvent.MOUSE_DOWN, prepareSound);
  77.             //mp3 downloaded from incompetech.com
  78.             playSound('Pure Attitude.mp3');
  79.            
  80.         }
  81.        
  82.         private function playSound(url:String):void
  83.         {
  84.             snd = new Sound();
  85.             var context:SoundLoaderContext = new SoundLoaderContext(0, true);
  86.             var sndReq:URLRequest = new URLRequest(url);
  87.            
  88.             snd.addEventListener(IOErrorEvent.IO_ERROR, errorHandler);
  89.             snd.addEventListener(Event.COMPLETE, completeHandler);
  90.            
  91.             txt.text = "Please wait for the file to be loaded.";
  92.            
  93.             snd.load(sndReq,context);
  94.             addEventListener(Event.ENTER_FRAME, onEnter);
  95.             var sndCh:SoundChannel = new SoundChannel();
  96.             sndCh = snd.play();
  97.            
  98.         }
  99.         private function errorHandler(errorEvent:IOErrorEvent):void {
  100.             txt.text = "The sound could not be loaded: " + errorEvent.text;
  101.         }
  102.         private function completeHandler(event:Event):void {               
  103.             txt.text = "File is ready.";
  104.            
  105.         }
  106.  
  107.        
  108.         private function onEnter(event:Event):void
  109.         {
  110.             SoundMixer.computeSpectrum(bytes, true, strechFactor);
  111.             var sp:Bar;
  112.             var i:int;
  113.             for (i = 0; i <bars; i++) {
  114.                 sp = containerArray[i];
  115.                 var rl:Number = bytes.readFloat();
  116.                 sp.setLevel(rl);
  117.             }
  118.            
  119.             //var sine:Number=Math.sin(angle)*RANGE;
  120.             //var cosine:Number=Math.cos(angle)*RANGE;
  121.             var blurX:int=2;
  122.             var blurY:int=8;
  123.             var filter:BlurFilter=new BlurFilter(blurX,blurY,BitmapFilterQuality.LOW);
  124.            
  125.             var rettangolo:Rectangle = new Rectangle(0, 0, stage.stageWidth, stage.stageHeight);
  126.             var p:Point = new Point();
  127.  
  128.  
  129.             spectrumBitmapData.scroll(0, 12);
  130.             spectrumBitmapData.applyFilter(spectrumBitmapData, rettangolo, p, filter);
  131.             spectrumBitmapData.draw(spectrumSprite);
  132.            
  133.            
  134.         }
  135.  
  136.         private function rectDraw():void
  137.         {
  138.            
  139.             // create spectrumBitmapData
  140.             spectrumBitmapData = new BitmapData(stage.stageWidth, stage.stageHeight, false, 0x0);
  141.            
  142.             bitmapSource = new Bitmap();
  143.             addChild(bitmapSource);
  144.             bitmapSource.bitmapData = spectrumBitmapData;
  145.            
  146.             spectrumSprite = new Sprite();
  147.             //addChild(spectrumSprite);
  148.             var shape:Shape;
  149.             var nx:int, ny:int;
  150.             var startX:int = 0;
  151.             var startY:int = stage.stageHeight-80;
  152.             var w:int = 2;
  153.             for (var i:int = 0; i <bars; i++) {
  154.                 nx = i * (w+2);
  155.                 var b:Bar = new Bar();
  156.                 b.drawBar();
  157.                 b.x = nx + startX;
  158.                 b.y = startY;
  159.                 spectrumSprite.addChild(b);
  160.                 containerArray.push(b);
  161.             }
  162.             graphics.lineStyle(1, 0x333333, 1);
  163.             graphics.moveTo(startX, startY + w);
  164.             graphics.lineTo(nx + startX, startY + w);
  165.            
  166.             spectrumBitmapData.draw(spectrumSprite);
  167.         }
  168.         public function rgbToHex(r:int,g:int,b:int):uint
  169.         {
  170.             //trace(r, g, b);
  171.             var hex:uint = (r <<16 | g <<8 | b);
  172.             return hex;
  173.         }
  174.        
  175.     }
  176.  
  177. }
  178.  
  179. import flash.display.Bitmap;
  180. import flash.display.BitmapData;
  181. import flash.display.Sprite;
  182. import flash.display.Shape;
  183. import com.ajaychhaya.utils.Util;
  184.  
  185. class Bar extends Sprite {
  186.     public static const NUM_RECT:uint = 20;
  187.     private var boxW:int = 2;
  188.     private var gap:int = 2;
  189.     private var _rects:Vector.<Box> = new Vector.<Box>;
  190.     private var currentLevel:int = 20;
  191.    
  192.     public function drawBar():void
  193.     {
  194.         var b:Box;
  195.         var nx:int, ny:int;
  196.         var startY:int = 0;
  197.        
  198.         var r:Number = Math.random() * 255;
  199.         var g:Number = Math.random() * 255;
  200.         var bb:Number = Math.random() * 255;
  201.        
  202.         var clr:uint = Util.rgbToHex(r, g, bb);
  203.  
  204.         for (var j:int = 0; j <NUM_RECT; j++) {
  205.             ny = j * (boxW + 2);
  206.             b = new Box(clr);
  207.             b.x = nx;
  208.             b.y = startY - ny;
  209.             b.cacheAsBitmap = true;
  210.             //b.visible = false;
  211.             addChild(b);
  212.             _rects.push(b);
  213.         }
  214.  
  215.     }
  216.     public function setLevel(level:Number):void {
  217.         level = level * NUM_RECT;
  218.         currentLevel = (currentLevel <level) ? level : currentLevel - 1;
  219.         var i:int;
  220.         for (i = 0; i<NUM_RECT; i++) {
  221.             _rects[i].visible = i <currentLevel;
  222.  
  223.         }
  224.        
  225.     }
  226. }
  227.  
  228.  
  229. class Box extends Shape {
  230.     public var boxW:int = 2;
  231.     public var boxH:int = 2;
  232.     public function Box(clr:uint)
  233.     {
  234.         graphics.lineStyle(0, 0, 0);
  235.         graphics.beginFill(clr);
  236.         graphics.drawRect(0, 0, boxW, boxH);
  237.         graphics.endFill();
  238.     }
  239. }

Leave a Reply