基于flash Actionscript3.0 的频谱分析

这段时间一直在忙于毕业答辩毕业设计的事情,很久没有写点代码了。而这几天,忙里偷闲,拿之前写的一个频谱分析做了点修改,改着改着,没想到没什么艺术细胞的自己居然把这个频谱分析改得挺漂亮的。

简单介绍一下频谱分析,即千千静听里面那些跟着音乐节奏不停跳动的条子,

这个程序先是读取出音乐中各个频段的分量,然后根据分量绘制不同大小不同颜色的圆圈,然后对圆圈加入模糊滤镜及发光滤镜,并设置了三种不同的显示方式。

package { /* *引入绘图类,用于绘制圆圈 *引入基本事件类 *引入鼠标事件类,用于监听鼠标的点击 *引入声音类,用于播放音乐 *引入声音混音器类,用于获取flash当前播放声音的各个频段的分量 *引入图形类 *引入URL请求类,用于请求MP3文件 *引入图像滤镜质量类,用于设置各个滤镜的渲染质量 *引入模糊滤镜类 *引入发光滤镜类 *引入按钮类 *引入文本框类 *引入字节数组类 */ import flash.display.Graphics; import flash.events.Event; import flash.events.MouseEvent; import flash.media.Sound; import flash.media.SoundMixer; import flash.net.URLRequest; import flash.display.Sprite; import flash.filters.BitmapFilterQuality; import flash.filters.BlurFilter; import flash.filters.GlowFilter; import flash.display.SimpleButton; import flash.text.TextField; import flash.utils.ByteArray; public class SoundMixerExample extends Sprite { private var req:URLRequest; private var soundFactory:Sound; private var method:uint; private var play_btn:SimpleButton; private var change_btn:SimpleButton; private var path:TextField; private var getParme:Function; public function SoundMixerExample(btn1:SimpleButton,btn2:SimpleButton,txt:TextField) { path=txt; play_btn=btn1; change_btn=btn2; play_btn.addEventListener(MouseEvent.CLICK, playClickHandler); change_btn.addEventListener(MouseEvent.CLICK, changeClickHandler); } private function playClickHandler(event:MouseEvent):void { method=0; getParme=getParmeMethod0; soundFactory=new Sound(); req=new URLRequest(path.text.replace("/r","").replace("/n","")); soundFactory.load(req); soundFactory.play(); this.addEventListener(Event.ENTER_FRAME, onEnterFrame); } private function changeClickHandler(event:MouseEvent):void { method=++method%3; switch (method) { case 0 : getParme=getParmeMethod0; break; case 1 : getParme=getParmeMethod1; break; case 2 : getParme=getParmeMethod2; break; } } //获取发光滤镜 private function getGlowFilter(color) { var alpha:Number=1; var blurX:Number=35; var blurY:Number=35; var strength:Number=10; var inner:Boolean=false; var knockout:Boolean=false; var quality:Number=3; return new GlowFilter(color, alpha, blurX, blurY, strength, quality, inner, knockout); } //获取模糊滤镜 private function getBlurFilter(){ var blurX:Number=0; var blurY:Number=3; return new BlurFilter(blurX, blurY, BitmapFilterQuality.HIGH); } private function onEnterFrame(event:Event):void { const PLOT_HEIGHT:int=50; const CHANNEL_LENGTH:int=64; const STEP=128/CHANNEL_LENGTH; var bytes:ByteArray = new ByteArray(); SoundMixer.computeSpectrum(bytes, true, 0); var g:Graphics=this.graphics; g.clear(); var n:Number=0; // 左声道 for (var i:int = 0; i < CHANNEL_LENGTH; i+=STEP) { g.lineStyle(0,Math.floor(0x111111*bytes.readFloat()*16)); //获取不同显示方式的x y值 var parme=getParme(i); g.drawCircle(parme[0],parme[1],Math.pow(bytes.readFloat()+0,2)*PLOT_HEIGHT); } // 右声道 g.moveTo(CHANNEL_LENGTH * 2, PLOT_HEIGHT); for (i = CHANNEL_LENGTH; i > 0; i-=STEP) { g.lineStyle(0,Math.floor(0x11111111*bytes.readFloat()*16)); //获取不同显示方式的x y值 parme=getParme(i); g.drawCircle(parme[0],parme[1],Math.pow(bytes.readFloat()+0,2)*PLOT_HEIGHT); } g.endFill(); this.filters=new Array(getBlurFilter(),getGlowFilter(Math.floor(0x11111111*bytes.readFloat()*16))); } //三种不同的显示方式 private function getParmeMethod0(num:Number) { return new Array(10*num,200); } private function getParmeMethod1(num:Number) { return new Array(10*Math.random()*45+50,200); } private function getParmeMethod2(num:Number) { return new Array(10*Math.random()*32+100,200*Math.random()); } } }

下载地址:http://download.csdn.net/source/3126813

你可能感兴趣的:(基于flash Actionscript3.0 的频谱分析)