In case Flash no longer exists; a copy of this site is included in the Flashpoint archive's "ultimate" collection.

Dead Code Preservation :: Archived AS3 works from wonderfl.net

webカメラ・モザイク・シーケンサー

webカメラから取得した画像にモザイクフィルタをかけて、
モザイクの四角をシーケンサーにみたてて
SiONで音を鳴らしてみた。
いろいろ参考にした。
問題のあるコードだけどとりあえず動いたからうp。
各マスの赤成分をノートナンバーにほうりこんだので、
暗いマスは低い音。
明るいと高い音が鳴る。
Get Adobe Flash player
by agenda23 25 May 2010
/**
 * Copyright agenda23 ( http://wonderfl.net/user/agenda23 )
 * MIT License ( http://www.opensource.org/licenses/mit-license.php )
 * Downloaded from: http://wonderfl.net/c/nH1O
 */

/*
webカメラから取得した画像にモザイクフィルタをかけて、
モザイクの四角をシーケンサーにみたてて
SiONで音を鳴らしてみた。
いろいろ参考にした。
問題のあるコードだけどとりあえず動いたからうp。
各マスの赤成分をノートナンバーにほうりこんだので、
暗いマスは低い音。
明るいと高い音が鳴る。
*/
package {
        import flash.display.Sprite;
        import flash.media.*;
		import flash.display.*;
        import flash.events.*;
		import flash.geom.*;
		import flash.ui.*;
		import flash.utils.Timer;
		import flash.filters.*;
		import flash.text.*;
		import com.flashdynamix.motion.*;
		import com.flashdynamix.motion.easing.*;
		import fl.motion.easing.*;
		import org.si.sion.SiONDriver;
		import org.si.sion.SiONVoice;
		import org.si.sion.utils.SiONPresetVoice;
		
		
		//import org.flashdevelop.utils.FlashConnect;
		
			
		public class cam_test extends Sprite {
			
			//変数
            public var video:Video;
			public var bdTmp:BitmapData;
			public var bmp:Bitmap;
			public var i:int = 0;
			public var SIZE:int = stage.stageWidth / 16;
			public var BPM:Number = 128;
			public var t_clock:Number = (60000 / BPM );
			
			public var moz_box_counts_w:Number = stage.stageWidth / SIZE;
			public var moz_box_counts_h:Number = stage.stageHeight / SIZE;
			public var moz_box_position_w:Number = 0;
			public var moz_box_position_h:Number = 0;
			public var tick_counts:Number = 1;
			public var pos_count_w:Number = 1;
			public var pos_count_h:Number = 1;
			
			public var color_value :uint;

			//Sion設定
			private var driver:SiONDriver = new SiONDriver();
			private var presetVoice:SiONPresetVoice = new SiONPresetVoice();
			private var voice:SiONVoice;
			
            public function cam_test() {
					//webカメラ設定
					var cam:Camera = Camera.getCamera();
					cam.setMode(stage.stageWidth/2,stage.stageHeight/2,30);
					cam.setQuality(0, 50);
                    video = new Video( stage.stageWidth , stage.stageHeight );
                    video.attachCamera(cam);
					addEventListener(Event.ENTER_FRAME, ent);
	
					voice = presetVoice["valsound.special1"];
					driver.play();
					
					//BPM設定
					var timer:Timer = new Timer(t_clock);
					timer.addEventListener(TimerEvent.TIMER,bpm_timer);
					timer.start();
					
					addChild(video);

					//bitmapdata設定
					bdTmp = new BitmapData(video.width, video.height, false, 0xFFFFFF);
					bmp = new Bitmap(bdTmp);
					this.addChild(bmp);	
				
            }
            //表示イベント
            private function ent(event:Event):void {
				//カメラ映像をbitmapdataに変換
				bdTmp.draw(video);
				//モザイク処理実行
				for (var i:int = 0; i<bdTmp.width; i += this.SIZE) {
					for (var j:int = 0; j<bdTmp.height; j += this.SIZE) {
						pixelization(i,j,SIZE,SIZE);
					}
				}
            }
			//タイマーイベント
			private function bpm_timer(event:TimerEvent):void {
				//tick_counts = 251
				if (tick_counts <= 256 ){
						pos_count_h = Math.ceil(tick_counts / 16 );
						if (tick_counts >16) {
								pos_count_w = tick_counts % 16;
								if (pos_count_w == 0) {
									pos_count_w = 16;
									}
							}else {
								pos_count_w = tick_counts;
							}
						if (tick_counts < 256) {
							tick_counts ++;
						}else {
							tick_counts = 1;
						}
					}

				//基準位置取得	
				
				moz_box_position_w = (pos_count_w -1) * SIZE;
				moz_box_position_h = (pos_count_h -1) * SIZE;
				
				color_value = bdTmp.getPixel32(moz_box_position_w,moz_box_position_h);
				var red_value : uint = (color_value >> 16) & 0xFF;
				//FlashConnect.trace(red_value/2);
				
				driver.noteOn(red_value/2,voice, 0, 0, 2);		
				
				
					//graphics 設定
					var shape:Shape = new Shape();
					stage.addChild(shape);
					var g:Graphics = shape.graphics;
					g.beginFill (0x00FF00, 0.8);
					// 四角形描画
					g.drawRect  ( moz_box_position_w, moz_box_position_h ,SIZE , SIZE);
					// 四角形フェードアウト
					var tg:TweensyGroup=new TweensyGroup();
					tg.alphaTo(shape, 0, 0.3); 
					
					
					
			}
			
			//モザイク処理関数
			private function pixelization(x:int, y:int, width:int , height:int):BitmapData {
				var pixel:int = 0;
				var red:int = 0;
				var green:int = 0;
				var blue:int = 0;
				var count:int = 0;

				for (var i:int = x; i<x+width; i += 5) {
					for (var j:int = y; j<y+height; j += 5) {
						if (i>=x+width || j>=y+height) {
							continue;
						}

						//bitmapdataのピクセルを取得
						pixel = bdTmp.getPixel(i, j);
						red += pixel >> 16 & 0xFF;
						green += pixel >> 8 & 0xFF;
						blue += pixel & 0xFF;
						count++;
					}
				}
				red /= count;
				green /= count;
				blue /= count;

				for (i=x; i<x+width; i++) {
					for (j=y; j<y+height; j++) {
						pixel = 0;
						pixel += red << 16;
						pixel += green << 8;
						pixel += blue;
						
						//bitmapdataに処理後のピクセルをセット
						bdTmp.setPixel(i,j,pixel);
					}
				}return bdTmp;
			}
        }
    }