« パーリンノイズ | トップページ | 鏡面反射 »

2008年5月16日 (金)

オーディオスペクトラム

P_5





















MP3のスペクトラムを作成しました。

これが、一番単純な形だと思います。

MP3の素材は、Methuselah様より使わせていただきました。

サンプルはこちら(注意:音がでます)






以下がソースです。

(2009/3 ソース書き直しました。)

package
{
	import flash.display.Bitmap;
	import flash.display.BitmapData;
	import flash.display.Sprite;
	import flash.display.StageAlign;
	import flash.display.StageQuality;
	import flash.display.StageScaleMode;
	import flash.events.Event;
	import flash.geom.Rectangle;
	import flash.media.Sound;
	import flash.media.SoundMixer;
	import flash.net.URLRequest;
	import flash.utils.ByteArray;

	[SWF(backgroundColor="#000000")]
	public class Main extends Sprite
	{
		private var bytes:ByteArray;
		private var spectrum:Array;
		private var bmpd:BitmapData;
		private var bmp:Bitmap;

		public function Main()
		{
			stage.frameRate=40;
			stage.quality=StageQuality.HIGH;
			stage.align=StageAlign.TOP_LEFT;
			stage.scaleMode=StageScaleMode.NO_SCALE;

			bytes=new ByteArray();
			spectrum=new Array();
			bmpd=new BitmapData(1000, 600, false, 0x111111);
			bmp=new Bitmap(bmpd);
			addChild(bmp);
			bmp.x=(stage.stageWidth - bmp.width) / 2;
			bmp.y=(stage.stageHeight - bmp.height) / 2;
			stage.addEventListener(Event.RESIZE, onResize);

			var sound:Sound=new Sound();
			sound.addEventListener(Event.COMPLETE, onComplete);
			sound.load(new URLRequest("sound.mp3"));
		}

		private function onResize(e:Event):void
		{
			bmp.x=(stage.stageWidth - bmp.width) / 2;
			bmp.y=(stage.stageHeight - bmp.height) / 2;
		}

		private function onComplete(e:Event):void
		{
			(e.target as Sound).play();
			addEventListener(Event.ENTER_FRAME, makeSpectrum);
		}

		public function makeSpectrum(e:Event):void
		{
			bmpd.fillRect(bmpd.rect, 0x111111);
			SoundMixer.computeSpectrum(bytes, true, 0);
			for (var i:int=0; i < 256; ++i)
				spectrum[i]=bytes.readFloat();

			for (var i:int=0; i < 256; ++i)
			{
				var h:int=400 * spectrum[i];
				bmpd.fillRect(new Rectangle(i * 3 + 100, 500 - h, 3, h), HSBtoRGB(i / 256, 1, 1));
			}
		}

		private function HSBtoRGB(hue:Number, saturation:Number, brightness:Number):uint
		{
			var r:int=0;
			var g:int=0;
			var b:int=0;
			if (saturation == 0)
			{
				r=g=b=brightness * 255.0 + 0.5;
			}
			else
			{
				var h:Number=(hue - Math.floor(hue)) * 6.0;
				var f:Number=h - Math.floor(h);
				var p:Number=brightness * (1.0 - saturation);
				var q:Number=brightness * (1.0 - saturation * f);
				var t:Number=brightness * (1.0 - (saturation * (1.0 - f)));
				switch (int(h))
				{
					case 0:
						r=brightness * 255.0 + 0.5;
						g=t * 255.0 + 0.5;
						b=p * 255.0 + 0.5;
						break;
					case 1:
						r=q * 255.0 + 0.5;
						g=brightness * 255.0 + 0.5;
						b=p * 255.0 + 0.5;
						break;
					case 2:
						r=p * 255.0 + 0.5;
						g=brightness * 255.0 + 0.5;
						b=t * 255.0 + 0.5;
						break;
					case 3:
						r=p * 255.0 + 0.5;
						g=q * 255.0 + 0.5;
						b=brightness * 255.0 + 0.5;
						break;
					case 4:
						r=t * 255.0 + 0.5;
						g=p * 255.0 + 0.5;
						b=brightness * 255.0 + 0.5;
						break;
					case 5:
						r=brightness * 255.0 + 0.5;
						g=p * 255.0 + 0.5;
						b=q * 255.0 + 0.5;
						break;
				}
			}
			return (r << 16) | (g << 8) | (b << 0);
		}
	}
}

|

« パーリンノイズ | トップページ | 鏡面反射 »

コメント

コメントを書く



(ウェブ上には掲載しません)




トラックバック

この記事のトラックバックURL:
http://app.f.cocolog-nifty.com/t/trackback/1040194/20981211

この記事へのトラックバック一覧です: オーディオスペクトラム:

« パーリンノイズ | トップページ | 鏡面反射 »