一个声音光谱效果的源码
一 7, 2010 FLASH/FLEX开发, 资源下载
偶然发现了这个效果,只有一个类,效果狂好.奉上源码
点击下面的[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