webカメラ・モザイク・シーケンサー
webカメラから取得した画像にモザイクフィルタをかけて、
モザイクの四角をシーケンサーにみたてて
SiONで音を鳴らしてみた。
いろいろ参考にした。
問題のあるコードだけどとりあえず動いたからうp。
各マスの赤成分をノートナンバーにほうりこんだので、
暗いマスは低い音。
明るいと高い音が鳴る。
/**
* 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;
}
}
}