E-mail Comment Del.icio.us Digg Reddit Technorati Furl

一个声音光谱效果的源码

偶然发现了这个效果,只有一个类,效果狂好.奉上源码

点击下面的[flash]开始欣赏.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
package
{
	import flash.display.Bitmap;
	import flash.display.BitmapData;
	import flash.display.Shape;
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.events.MouseEvent;
	import flash.geom.ColorTransform;
	import flash.geom.Matrix;
	import flash.geom.Rectangle;
	import flash.media.Microphone;
	import flash.media.Sound;
	import flash.media.SoundMixer;
	import flash.utils.ByteArray;
 
	[SWF( backgroundColor='0', frameRate='35', height='400', width='400')]
 
	public class Main extends Sprite
	{
 
		private var mic: Microphone;
		private var sound: Sound;
		private var bytes: ByteArray;
 
		private var output: BitmapData;
		private var peaks: BitmapData;
		private var displace: Matrix;
		private var rect: Rectangle;
		private var gradient: Array;
		private var darken: ColorTransform;
 
        [Embed(source="song.mp3")]
        public var soundClass:Class;
 
		public function Main()
		{
			sound = new soundClass as Sound;
			stage.addEventListener(MouseEvent.CLICK,onStageClicked);
 
			bytes = new ByteArray();
 
			output = new BitmapData( stage.stageWidth, stage.stageHeight, true, 0 );
			peaks = new BitmapData( stage.stageWidth, stage.stageHeight, true, 0 );
 
			displace = new Matrix();
			displace.tx = 2;
			displace.ty = -1;
 
			darken = new ColorTransform( 1, 1, 1, 1, -2, -2, -2, 0 );
 
			rect = new Rectangle( 0, 0, 1, 0 );
 
			addChild( new Bitmap( output ) );
			addChild( new Bitmap( peaks ) );
 
			stage.addEventListener( Event.ENTER_FRAME, onEnterFrame );
 
			graphics.beginFill( 0 );
			graphics.drawRect( 0, 0, stage.stageWidth, stage.stageHeight );
			graphics.endFill();
 
			gradient = createRainbowGradientArray();
		}
 
		private function onStageClicked( event:MouseEvent ): void
		{
			sound.play();
			stage.removeEventListener(MouseEvent.CLICK,onStageClicked);
		}
 
		private function onEnterFrame( event: Event ): void
		{
			peaks.fillRect( peaks.rect, 0 );
 
			SoundMixer.computeSpectrum( bytes, true, 0 );
 
			var value: Number;
			var height: Number;
 
			var smooth: Number;
 
			for( var i: int = 0 ; i < 256 ; i++ )
			{
				value = bytes.readFloat();
 
				if( i == 0 ) smooth = value;
				else smooth += ( value - smooth ) / 8;
 
				height = 2 + smooth * 0xf0;
 
				rect.x = 8 + i;
				rect.y = 320 + ( i >> 2 ) - height;
				rect.height = height;
 
				peaks.setPixel32( rect.x, rect.y, 0xffffffff );
 
				output.fillRect( rect, 0xff000000 | gradient[i] );
			}
 
			output.draw( output, displace, darken, null, null, true );
		}
 
		private function createRainbowGradientArray(): Array
		{
			var gradient: Array = new Array();
 
			var shape: Shape = new Shape();
			var bmp: BitmapData = new BitmapData( 256, 1, false, 0 );
 
			var colors: Array = [ 0, 0xff0000, 0xffff00, 0x00ff00, 0x00ffff ];
			var alphas: Array = [ 100, 100, 100, 100, 100 ];
			var ratios: Array = [ 0, 16, 128, 192, 255 ];
 
			var matrix: Matrix = new Matrix();
 
			matrix.createGradientBox( 256, 1, 0, 0, 0 );
 
			shape.graphics.beginGradientFill( 'linear', colors, alphas, ratios, matrix );
			shape.graphics.drawRect( 0, 0, 256, 1 );
			shape.graphics.endFill();
 
			bmp.draw( shape );
 
			for( var i: int = 0 ; i < 256 ; i++ )
			{
				gradient[i] = bmp.getPixel( i, 0 );
			}
 
			return gradient;
		}
	}
}

Leave a Reply

XHTML: You can use these tags: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre lang="" line="" escaped="">