本教程是向大家介绍Flash制作音乐频谱,教程比较基础,转发过来,希望大家喜欢!花了3天做的音乐频谱的效果,截图的效果:

包括了5个类:

MusicControl类,不多说了,用来控制音乐的,包括音乐的载入和播放时的控制等。

ID3Control类,用来提取音乐文件的相关信息的类,循环的显示各种信息,提取的中文显示乱码,这里用一个函数进行更正即可:

复制代码代码如下:

function EncodeUtf8(str:String):String {

var oriByteArr:ByteArray = new ByteArray();

oriByteArr.writeUTFBytes(str);

var tempByteArr:ByteArray = new ByteArray();

for (var i = 0; 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

_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制作音乐频谱过程,希望对大家有所帮助,谢谢大家观看本教程!

flash 频谱 转html,Flash制作音乐频谱相关推荐

  1. 桌面音乐频谱linux,X Music Spectrum(音乐频谱桌面特效)

    XMusicSpectrum是一款音乐频谱桌面特效软件,听上去可能很复杂,简单点来说就是当你用播放器播放音乐时,屏幕下方会出现动态音乐频谱,让你的桌面变成更加丰富多彩. 相关软件软件大小版本说明下载地 ...

  2. 51DIY音乐频谱显示

    以前,每当看到家里的音箱功放上的几排小灯,随着播放的音乐如波浪般跳跃,或者在电脑上打开千千静听这个音乐播放软件时,看到那动感的频谱跟随音乐节奏优美的舞动着时,不禁思绪万千,要是自己某天能亲手用普通的单 ...

  3. STM32F103+FFT+OLED25664的音乐频谱制作分享(继续干货)

    前言:之前,笔者设计并制作了一个简单的FFT音乐频谱,并且分享了制作过程.本文是在原来的基础上做了一些修改. 效果演示:https://www.bilibili.com/video/av4791553 ...

  4. stm32f103+FFT+OLED的音乐频谱制作(只需三步即可)

    效果演示:FFT音乐频谱DIY STM32+OLED_哔哩哔哩_bilibili 制作过程: 1.准备材料: stm32f103核心板 1块 OLED12864显示屏 1块(SPI接口) 声音检测传感 ...

  5. html音乐跳动的线,利用CSS3制作跳动音乐频谱跳动效果

    [摘要] CSS3新增很多实用的属性,特别是可以实现动画效果的animation属性,本文通过使用CSS3来实现一个类似于音乐频谱跳动效果. 在一个网站上看到"直播中"的提示标题, ...

  6. Arduino音乐频谱

    一. 项目简介 本制作是踩在前人的肩膀上走过来的,在清风duino基于arduino Pro Mimi_语音播放彩灯系统基础上修改过来的,现在把不成熟的制作过程分享给大家,希望对需要的朋友有所帮助. ...

  7. 每天学一点flash(76)百度MP3音乐APi接口使用

    百度MP3音乐API接口及应用 http://cloud21.javaeye.com/blog/611914 这里有一篇关于百度MP3音乐APi接口的应用,写了一下关于这个百度接口的应用,他可以提供一 ...

  8. Flash引导层动画的制作

    1.引导层 引导层也就是引导图层,其作用是辅助其它图层(被引导层)对象的运动或定位.在运动引导层中绘制路径,可以使被引导层中运动渐变动画中的对象沿着指定的路径运动,在一个运动引导层下可以建立一个或多个 ...

  9. 音乐频谱显示小玩具——FFT在STM32中的实现与应用

    0.前言 音乐频谱显示说白了就是"儿童版"频谱仪.笔者平时比较喜欢听音乐,闲暇之余听音乐的时候如果有个频谱显示的小玩具在旁边跳来跳去的也挺有意思的,所以笔者去万能的某宝上搜索了一下 ...

最新文章

  1. sql 删除重复记录保留一条_从零学会SQL·二——简单查询
  2. Introspection
  3. 算术表达式的实现,支持加减乘除,括号运算,表达式转二叉树
  4. init.x java_详谈jvm--Java中init和clinit的区别
  5. C# CLRInsideOut 托管代码与非托管代码互操作,产生相关调用代码的好工具 C++ 头文件转C# 的好工具...
  6. 阿里云原生“因云而生”心智大图重磅发布
  7. 在fstab中使用UUID挂载
  8. 三星note5 android9,【极光ROM】-【三星NOTE9 N960X-845】-【V16.0 Android-Q-TD5】
  9. python-docx库读写word文档
  10. Codeforces 949A Zebras(构造)
  11. 封装一个简单实用的朋友圈
  12. response.reset() 与response.resetbuffer使用场景
  13. 【深度学习】---行人检测应用
  14. 顺丰慢其实只是主观感觉,真正原因是以下几个方面
  15. 引入隔离率与潜伏人员的SIR模型附matlab代码
  16. 除websocket外前端还需要知道心跳包
  17. vivo云测平台上线Android 13开发者预览版通知
  18. 两化融合贯标认定条件
  19. [ios版本]AR 现实增强之高通Vuforia QCAR SDK (一)
  20. 维宏系统如何制作安全包

热门文章

  1. 使用echarts完成市级的图表
  2. 网件r8000刷openwrt官方固件_关于路由器的问题,请问NETGEAR R8000 有openwrt可刷吗
  3. vue打包nginx部署
  4. 【JTAG 转接板原理图】
  5. 聚类总结(二)聚类性能评估、肘部法则、轮廓系数
  6. 【一起入门MachineLearning】中科院机器学习-期末题库-【选择题12+计算题7,12+简答题1】
  7. 2017沈阳第二十届国际供热通风空调及舒适家居展览会会刊(参展商名录)
  8. 阿里云安全科学家吴翰清入选MIT TR35,你知道弹性安全网络技术吗?
  9. 化学中68个“不一定”
  10. 《0day安全:软件漏洞分析技术》学习笔记·1(需要补充节部分)