- 浏览: 128423 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
zhanchaojiang:
...
Flash使用到数学、物理的公式 -
沈冠军:
太好啦,呵呵···
用Flex Builder创建第一个Flex AIR程序 -
zht110227:
代码能加上点注释吗?看着效果更好。
Flex的通信方式(N)——URLLoader -
yangkd548:
可能是SWF是2.0的原因吧,你用3.0的试试吧
Flex与Flash的交互_1(初级简单示例) -
aotie:
你好我套用你的模式!做为什么这句 flashMc=flashC ...
Flex与Flash的交互_1(初级简单示例)
音乐频谱的效果,截图的效果:
源码及编译后的SWF见附件
源码解释:
包括了5个类:
MusicControl类,不多说了,用来控制音乐的,包括音乐的载入和播放时的控制等。
ID3Control类,用来提取音乐文件的相关信息的类,循环的显示各种信息,提取的中文显示乱码,这里用一个函数进行更正即可:
Spectrum类,管理和显示频谱的类,从MusicControl类里取出频谱的信息,注意MusicControl类里的
里第二个参数 true 表示取出的是频谱,而 false 表示取出的是波形。
Column类,条形的频谱类,在Spectrum类里柱状样式中创建了 64 个,而波浪样式中创建了 256 个。
Waveform类,波形的类,用一条线条来绘制的,加入了逐渐消失的轨迹的效果。
源码及编译后的SWF见附件
源码解释:
包括了5个类:
MusicControl类,不多说了,用来控制音乐的,包括音乐的载入和播放时的控制等。
ID3Control类,用来提取音乐文件的相关信息的类,循环的显示各种信息,提取的中文显示乱码,这里用一个函数进行更正即可:
var oriByteArr:ByteArray = new ByteArray(); oriByteArr.writeUTFBytes(str); var tempByteArr:ByteArray = new ByteArray(); for (var i = 0; i<oriByteArr.length; i++) { if (oriByteArr == 194) { tempByteArr.writeByte(oriByteArr[i+1]); i++; } else if (oriByteArr == 195) { tempByteArr.writeByte(oriByteArr[i+1] + 64); i++; } else { tempByteArr.writeByte(oriByteArr); } } tempByteArr.position = 0; return tempByteArr.readMultiByte(tempByteArr.bytesAvailable,"chinese"); }
Spectrum类,管理和显示频谱的类,从MusicControl类里取出频谱的信息,注意MusicControl类里的
SoundMixer.computeSpectrum(_spectrumArray,true);
里第二个参数 true 表示取出的是频谱,而 false 表示取出的是波形。
/* 类功能:显示频谱。 */ package net.cdipan.spectrum{ import flash.display.Sprite; import flash.utils.ByteArray; import flash.text.TextField; import flash.events.MouseEvent; import flash.net.navigateToURL; import flash.net.URLRequest; public class Spectrum extends Sprite { //记录频谱的数组 private var _spectrum:Array; //记录显示的类型 private var _type:int; //用于显示频谱的精灵对象 private var _showSpectrum:Sprite; //用于显示柱状频谱的精灵对象 private var _show1:Sprite; //用于显示波浪频谱的精灵对象 private var _show2:Sprite; //用于显示波形频谱的精灵对象 private var _show3:Sprite; //柱形对象 private var _column:Column; //波形对象 private var _waveform:Waveform; public function Spectrum():void { _spectrum = new Array(512); _showSpectrum = new Sprite(); _showSpectrum.x = 22; _showSpectrum.y = 18; _show1 = new Sprite(); _show2 = new Sprite(); _show3 = new Sprite(); this.addChild(_showSpectrum); //创建柱状频谱 createColumn(64,3,1,_show1); createColumn(256,1,0,_show2); //创建波形频谱 _waveform = new Waveform(); _show3.addChild(_waveform); _showSpectrum.addChild(_show1); } //获取频谱数组 public function getSpectrum(byteArray:ByteArray):void { for (var i:int=0; i<512; i++) { _spectrum = byteArray.readFloat(); } //将频谱数据传送给柱状和波浪的精灵实例 for (var j:int=0; j<64; j++) { var temp1:Column = _show1.getChildByName("column_"+j.toString()) as Column; temp1.getSpectrum((_spectrum[j*4]+_spectrum[j*4+1]+_spectrum[j*4+2]+_spectrum[j*4+3]+_spectrum[j*4+256]+_spectrum[j*4+257]+_spectrum[j*4+258]+_spectrum[j*4+259])*12.5); } for (var m:int=0; m<256; m++) { var temp2:Column = _show2.getChildByName("column_"+m.toString()) as Column; temp2.getSpectrum((_spectrum[m]+_spectrum[m+256])*50); } //将频谱数据传送给波形的精灵实例 _waveform.getSpectrum(_spectrum); } //创建柱状的精灵对象 private function createColumn(f_num:int,f_width:int,f_space:int,target:Sprite):void { for (var i:int=0; i<f_num; i++) { _column = new Column(); _column.name = "column_"+i.toString(); _column.width = f_width; _column.x = i*(f_width+f_space); target.addChild(_column); } } //更改样式(type 为 0 时显示柱形,为 1 时显示波浪,为 2 时显示波形) public function changeType(type:int):void { switch (type) { case 0 : if (_showSpectrum.contains(_show1)) { _showSpectrum.removeChild(_show1); } if (_showSpectrum.contains(_show2)) { _showSpectrum.removeChild(_show2); } if (_showSpectrum.contains(_show3)) { _showSpectrum.removeChild(_show3); } _showSpectrum.addChild(_show1); break; case 1 : if (_showSpectrum.contains(_show1)) { _showSpectrum.removeChild(_show1); } if (_showSpectrum.contains(_show2)) { _showSpectrum.removeChild(_show2); } if (_showSpectrum.contains(_show3)) { _showSpectrum.removeChild(_show3); } _showSpectrum.addChild(_show2); break; case 2 : if (_showSpectrum.contains(_show1)) { _showSpectrum.removeChild(_show1); } if (_showSpectrum.contains(_show2)) { _showSpectrum.removeChild(_show2); } if (_showSpectrum.contains(_show3)) { _showSpectrum.removeChild(_show3); } _showSpectrum.addChild(_show3); break; } } } }
Column类,条形的频谱类,在Spectrum类里柱状样式中创建了 64 个,而波浪样式中创建了 256 个。
/* 类功能:柱状的频谱。 */ package net.cdipan.spectrum{ import flash.display.*; import flash.geom.*; import flash.events.Event; import flash.utils.Timer; import flash.events.TimerEvent; public class Column extends Sprite { //顶部小方块颜色 private const square_color:uint = 0xffffff; //顶部颜色 private const top_color:uint = 0xffffff; //中间颜色 private const middle_color:uint = 0x8cdcff; //底部颜色 private const bottom_color:uint = 0x07f7ff; //背景精灵对象 private var BG_Sp:Sprite; //遮罩精灵对象 private var mask_Sp:Sprite; //小方块精灵对象 private var square_Sp:Sprite; //记录上次的频谱的值,如果比这次的高就减一,否则将这次的设为此值 private var oldNum:Number; //计时器对象 private var myTimer:Timer; //记录小方块是否可以下落 private var canDrop:Boolean; public function Column():void { BG_Sp = new Sprite(); drawGradualRect(); addChild(BG_Sp); mask_Sp = new Sprite(); drawMaskRect(); addChild(mask_Sp); square_Sp = new Sprite(); drawSquareRect(); square_Sp.y = 99; square_Sp.addEventListener(Event.ENTER_FRAME, _enterframe); addChild(square_Sp); //设置遮罩 BG_Sp.mask = mask_Sp; oldNum = 0; myTimer = new Timer(200, 1); myTimer.addEventListener("timer", onTimer); canDrop = false; } //使小方块下落 private function _enterframe(e:Event):void { if (canDrop) { square_Sp.y += 4; } if (square_Sp.y > 99) { square_Sp.y = 99; } if (square_Sp.y < -1) { square_Sp.y = -1; } } //绘制渐变图形 private function drawGradualRect():void { var fillType:String = GradientType.RADIAL; var colors:Array = [top_color, middle_color, bottom_color]; var alphas:Array = [1, 1, 1]; var ratios:Array = [0x00, 0x7f, 0xff]; BG_Sp.graphics.beginGradientFill(fillType, colors, alphas, ratios); BG_Sp.graphics.drawRect(0,-1,100,1); BG_Sp.rotation = 90; } //绘制遮罩图形 private function drawMaskRect():void { mask_Sp.graphics.lineStyle(); mask_Sp.graphics.beginFill(0); mask_Sp.graphics.drawRect(0,-100,1,100); mask_Sp.graphics.endFill(); mask_Sp.y = 100; } //绘制小方块 private function drawSquareRect():void { square_Sp.graphics.lineStyle(); square_Sp.graphics.beginFill(square_color); square_Sp.graphics.drawRect(0,0,1,1); square_Sp.graphics.endFill(); } //接收频谱数据 public function getSpectrum(num:Number):void { if (oldNum > num) { oldNum -= 7; } else { oldNum = num; if (oldNum != 0) { //调用小方块运动的函数 squareMove(oldNum); } } if (oldNum<0) { oldNum = 0; } mask_Sp.height = oldNum; } //控制小方块运动的函数 private function squareMove(num:Number):void { if (square_Sp.y > 99 - oldNum) { square_Sp.y = 99 - num; canDrop = false; myTimer.reset(); myTimer.start(); } } public function onTimer(e:TimerEvent):void { canDrop = true; } } }
Waveform类,波形的类,用一条线条来绘制的,加入了逐渐消失的轨迹的效果。
/* 类功能:波形。 */ package net.cdipan.spectrum{ import flash.display.*; import flash.filters.*; import flash.geom.*; public class Waveform extends Sprite { //线条颜色 private const line_color:uint = 0x07f7ff; //创建用来绘制线条的精灵对象 private var Line:Sprite; //用于逐渐消失的轨迹的位图对象 private var bmpData:BitmapData; private var bmp:Bitmap; //滤镜的各项参数 private var colorM:ColorMatrixFilter; private var blur:BlurFilter; private var r:Rectangle; private var point; //通过数字使滤镜处理慢一步 private var num:int; public function Waveform():void { Line = new Sprite(); bmpData = new BitmapData(256,100,true,0); bmp = new Bitmap(bmpData); colorM = new ColorMatrixFilter([.98,0,0,0,0,0,.98,0,0,0,0,0,.98,0,0,0,0,0,.5,0]); blur = new BlurFilter(7,7,BitmapFilterQuality.LOW); r = new Rectangle(0,0,256,100); p = new Point(0,0); //添加显示对象 this.blendMode=BlendMode.ADD; this.addChild(bmp); this.addChild(Line); } //接收频谱数据 public function getSpectrum(array:Array):void { if (num%2 == 0) { var m:Number = 0; for (var j=0; j<256; j+=2) { m += array[j]; } if (m != 0) { //停止播放时不绘制图像,就只会显示一条直线 bmpData.draw(this); } bmpData.applyFilter(bmpData,r,p,colorM); bmpData.applyFilter(bmpData,r,p,blur); } num++; Line.graphics.clear(); Line.graphics.lineStyle(1,line_color,100); for (var i=0; i<256; i+=2) { var n:Number = array*50; if (i != 0) { Line.graphics.lineTo(i,50-n); } else { Line.graphics.moveTo(0,50-n); } } } } }
发表评论
-
Flash网页游戏的技术内容
2013-06-07 09:55 0经过5年的从业经历,现在应该对Flash网页游戏的工作内容 ... -
安全沙箱问题实例
2012-10-12 15:14 1005安全沙箱问题实例 案例1: swf加载资源需要知道资源的地址 ... -
Flash使用到数学、物理的公式
2012-02-17 12:40 1394基本三角函数的计算: ... -
FlashDevelop配置、使用随笔
2011-12-20 17:19 2965安装基础配置见 1、http://www.cnblogs.co ... -
动画旋转移动、沿鼠标绘制轨迹移动
2011-08-01 15:12 1740package common{ import core ... -
常用资源备份
2011-05-06 13:19 11611、显示到该trace位置的 ... -
Flash 程序屏幕自适应的实现
2010-12-10 15:09 3779首先确定一个最外层的容器,针对于一下两种情况作处理 1、其内部 ... -
FD编辑器变量高亮插件
2010-12-10 15:06 1275FD变量高亮插件(放在Plugins下) 在代码和左侧边框都可 ... -
禁止Flash右键菜单,禁止放大,左上对齐
2010-08-17 15:17 1780//禁止Flash右键菜单 this.contextMe ... -
加载并使用其他Swf中的类
2010-08-15 16:54 0加载其他的SWF到当前SWF的主域,并可以实例化加载的SWF中 ... -
Flash CS3联合Flash Develop开发的配置
2010-07-20 10:38 1874两个编辑器的关联配置 1.安装Flash CS3编辑器 2.安 ... -
不规则图片或对象的碰撞检测
2010-07-02 17:23 1381下面这个类封装了3个公共的静态方法,简单的碰撞检测可以直接使用 ... -
Flash Develop的快捷键
2010-05-19 13:24 2039flashdevelop的快捷键很多 ... -
获取当前Flash的SWF文件所在文件夹绝对路径(AS项目和Flex Web项目)
2010-05-07 11:29 10157首先,说明我测试的系统地址和网络地址的情况: 某电脑一:fil ... -
AS 与 js 交互示例
2010-02-10 17:19 1404ActionScript/Flash代码 package ... -
Flash常用的交互信息加密的方式汇总
2010-02-10 16:16 1325常用的通信加密方式有:MD5(主用用途是验证数据的完整性)、R ... -
模仿下拉列表下拉和收起的动画效果
2010-02-10 15:55 1205/** * 实现下拉列表、弹出菜单出现和隐藏时缓动的效 ... -
拖动元件延时跟随的动画效果
2010-02-10 15:37 850/** * 实现拖动延时效果的代码 */ p ... -
创建Flash CS3组件(二) Flash CS3组件体系
2009-12-29 09:44 1665在Flash MX 2004时代,组件体系相当庞大.核心有U ... -
request.ContentType的可取值
2009-10-26 15:48 3793服务器送给客户端的数据包类型可以是text/html文本,也可 ...
相关推荐
在Flash中,声音处理是一个重要的组成部分,而声音频谱则可以帮助我们直观地了解声音的频率分布,这对于音乐、音频编辑和游戏音效设计等应用非常有价值。 一、理解声音频谱 声音频谱是将声音信号转换为可视化图像的...
这种可视化工具对于音乐制作、音频编辑和音频分析有着重要的作用,例如检测音频中的噪声、识别音调或频率失真等。 在AS3中,我们可以利用Adobe Flash的API来创建音乐频谱图。"SoundMixer_computeSpectrum"是一个...
STM32音乐频谱资料是基于STM32F103微控制器的音频播放系统,主要涉及STM32F103系列芯片、音乐播放功能、频谱显示以及音乐键盘的实现。在这个项目中,STM32F103芯片扮演了核心控制器的角色,它通过集成的USB接口或者...
主音调测量功能涉及音高识别,通常采用自动音调检测算法(如Yin算法),通过分析频谱找出主导频率,确定音乐的主音调。这一步需要复杂的信号处理算法,并可能需要优化以适应资源有限的微控制器。 在软件开发方面,...
在这个“AS3制作的音频频谱”项目中,我们将探讨如何利用AS3来实时分析音频信号并可视化其频谱。 在AS3中,我们可以使用Sound和SoundChannel类来处理音频。`Sound`类用于加载和控制音频文件,而`SoundChannel`类则...
音频频谱分析在多个领域有广泛应用,如音乐制作、音频编辑、语音识别、噪声检测等。了解如何在AS3中实现音频频谱分析,不仅可以提升开发者的技术能力,也有助于创造更丰富的多媒体交互体验。 通过深入学习和实践这...
总的来说,SWiSHJukebox v2.0 Build 2009.12.20 是一个功能强大的工具,它将音乐播放器的创建过程简化,使非专业用户也能轻松制作出具有专业水准的Flash音乐播放器。通过将MP3文件转化为流媒体格式,SWiSHJukebox ...
2. **带通采样定理**:对于带通信号,采样频率不一定要满足奈奎斯特频率条件,而可以利用信号频谱的周期重复特性来降低采样频率。 通过以上知识点的梳理,我们可以看到DSP工程设计不仅涉及硬件电路的设计,还包括...
在这个特效中,JavaScript可能会监听音频播放事件,根据音频的频率和振幅数据动态更新线条的形状和位置,形成随声音变化的波纹效果。同时,jQuery也可能用来处理用户交互,如播放、暂停、音量控制等。 为了实现声波...
- **频率**:每两年举办一次,通常在奇数年进行(例如2005年、2007年等)。 #### 二、赛事意义及目标群体 - **目的**:旨在培养学生的实践能力和创新能力,通过实际项目设计,提升学生的综合能力。 - **目标群体**...