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

曲げセンサで音を鳴らす。SiON+WEBカメラ

Gainerで値をとることができたから、
* 次はSiONライブラリを使って音をならしてみる。
* ナイキのあれみたいだね
* あそこまでいいものじゃないけど(笑)
* 
* SiONのことなら、ほかのサイトさんを参考にした
* SiONの練習シリーズをどうぞ
* http://wonderfl.net/c/ttPL
* 
* 音に映像をぷらす。
* こちらのソースをいただきました。
* http://wonderfl.net/c/xn08
* 
* 1キーでpiano
* 2	lead
* 3	wind
*
Get Adobe Flash player
by umi_kappa 21 Jul 2010
/**
 * Copyright umi_kappa ( http://wonderfl.net/user/umi_kappa )
 * MIT License ( http://www.opensource.org/licenses/mit-license.php )
 * Downloaded from: http://wonderfl.net/c/sau3
 */

// forked from umi_kappa's 曲げセンサで音を鳴らす。SiON
// forked from umi_kappa's Gainerで曲げセンサを使ってみる
/*Gainerで値をとることができたから、
 * 次はSiONライブラリを使って音をならしてみる。
 * ナイキのあれみたいだね
 * あそこまでいいものじゃないけど(笑)
 * 
 * SiONのことなら、ほかのサイトさんを参考にした
 * SiONの練習シリーズをどうぞ
 * http://wonderfl.net/c/ttPL
 * 
 * 音に映像をぷらす。
 * こちらのソースをいただきました。
 * http://wonderfl.net/c/xn08
 * 
 * 1キーでpiano
 * 2	lead
 * 3	wind
 * */

package {
	import flash.display.*;
	import flash.events.*;
	import flash.geom.*;
	import flash.media.*;
	import flash.text.*;
	import flash.utils.Timer;
	import funnel.*;
	import org.si.sion.*;
	import org.si.sion.utils.*;
	
    public class Main extends Sprite {
		//Gainer--------------------------------------------------------
		private var _gio:Gainer;
		//曲げセンサーの入力を入れるピン
		private var _mage_Pin:Pin;
		
		//曲げセンサの値を保存する変数
		private var _mage_value:int = 0;
		//--------------------------------------------------------------
		
		//SiON----------------------------------------------------------
		private var sion_Driver:SiONDriver;
		private var prisetVoice:SiONPresetVoice;
		private var voice:SiONVoice;
		private var _timer:Timer = new Timer(50);
		//--------------------------------------------------------------
		
		//WEBカメラ用------------------------------------------------------
        // 震えの許容値
        private var LATITUDE:Number = 1;
		
		//bitmapdataの倍率
		private var zoom:Number = 1.2;
        
        private var _cam:Camera;
        private var _vid:Video;
        private var _bmp:Bitmap;
        private var _bmpDataSrc:BitmapData = new BitmapData(stage.stageWidth, stage.stageHeight, true);
        private var _bmpDataDst:BitmapData = new BitmapData(stage.stageWidth, stage.stageHeight, true);
        private var _bmpDataC:BitmapData = new BitmapData(stage.stageWidth, stage.stageHeight, true);
        private var _bmpDataM:BitmapData = new BitmapData(stage.stageWidth, stage.stageHeight, true);
        private var _bmpDataY:BitmapData = new BitmapData(stage.stageWidth, stage.stageHeight, true);
        private var _bmpDataK:BitmapData = new BitmapData(stage.stageWidth, stage.stageHeight, true);
		//--------------------------------------------------------------
		
		
        public function Main() {
			addEventListener(Event.ADDED_TO_STAGE, add);
        }
		
		//配置完了!
		private function add(e:Event):void 
		{
			removeEventListener(Event.ADDED_TO_STAGE, add);
			
			gainer_set();
			camera_set();
			
			addEventListener(Event.ENTER_FRAME, onEF);
		}
		
		private function camera_set():void
		{// ビデオ準備
            _cam = Camera.getCamera();
            _cam.setMode(stage.stageWidth, stage.stageHeight, stage.frameRate);
            _vid = new Video(stage.stageWidth, stage.stageHeight);
            _vid.attachCamera(_cam);
			
			//カメラがactiveになったら音を流す。
			_cam.addEventListener(ActivityEvent.ACTIVITY, onActive);
            
            // 表示用Bitmapに出力用bitmapを関連づける
            _bmp = new Bitmap(_bmpDataDst);
			_bmp.width = stage.stageWidth * zoom;
			_bmp.height = stage.stageHeight * zoom;
            
            // stageにadd
            addChild(_bmp);
		}
		
		private function onActive(e:ActivityEvent):void 
		{
			SiON_set();
		}
		
		private function SiON_set():void
		{
			sion_Driver = new SiONDriver;
			prisetVoice = new SiONPresetVoice;
			voice = new SiONVoice;
			voice = prisetVoice["valsound.piano1"];
			sion_Driver.play();
			
			_timer.addEventListener(TimerEvent.TIMER, onTimer);
			_timer.start();
			
			stage.addEventListener(KeyboardEvent.KEY_DOWN, onKD);
		}
		
		private function onTimer(e:TimerEvent):void 
		{
			//曲げセンサーの値をSiONに対応させる
			sion_Driver.noteOn(_mage_value, voice, 1, 0, 0, 0, true);
		}
		
		private function onKD(e:KeyboardEvent):void 
		{
			switch(e.keyCode) {
				case 49:
				voice = prisetVoice["valsound.piano1"];
				break;
				
				case 50:
				voice = prisetVoice["valsound.lead5"];
				break;
				
				case 51:
				voice = prisetVoice["valsound.wind1"];
				break;
				
				case 52:
				voice = prisetVoice["valsound.bell1"];
				break;
				
				case 53:
				voice = prisetVoice["midi.dram24"];
				break;
				
				case 54:
				voice = prisetVoice["midi.drum30"];
				break;
				
				case 55:
				voice = prisetVoice["midi.drum35"];
				break;
				
				case 56:
				voice = prisetVoice["midi.drum45"];
				break;
				
				case 57:
				voice = prisetVoice["midi.drum65"];
				break;
				
				case 48:
				voice = prisetVoice["midi.drum72"];
				break;
			}
		}
		
		private function gainer_set():void
		{
			_gio = new Gainer();
			//アナログINの0を使うよ
			_mage_Pin = _gio.analogInput(0);
			
			//フィルターをかける
			_mage_Pin.addFilter(new Scaler(0.5, 0.65, 40, 120, Scaler.LINEAR, true));
            _mage_Pin.addFilter(new Convolution(Convolution.MOVING_AVERAGE));
		}
		
		private function onEF(e:Event):void 
		{
			//曲げセンサーの値を毎フレーム見る。
			_mage_value = Math.round(_mage_Pin.value);
			
			
			
			//WEBカメラ用
			LATITUDE = _mage_value - 40;
			
            // 基画像
            _bmpDataSrc.draw(_vid);
            
            // CMYK4色抽出
			/*別の BitmapData オブジェクトまたは現在の BitmapData オブジェクトの 1 つのチャンネルのデータを、
			 * 現在の BitmapData オブジェクトのチャンネルに転送します。
			 * */
            _bmpDataC.copyChannel(
                _bmpDataSrc,
                _bmpDataSrc.rect,
                new Point(Math.random() * LATITUDE - LATITUDE, Math.random() * LATITUDE - LATITUDE),
                BitmapDataChannel.RED,
                BitmapDataChannel.RED
            );
            _bmpDataM.copyChannel(
                _bmpDataSrc,
                _bmpDataSrc.rect,
                new Point(Math.random() * LATITUDE - LATITUDE, Math.random() * LATITUDE - LATITUDE),
                BitmapDataChannel.GREEN,
                BitmapDataChannel.GREEN
            );
            _bmpDataY.copyChannel(
                _bmpDataSrc,
                _bmpDataSrc.rect,
                new Point(Math.random() * LATITUDE - LATITUDE, Math.random() * LATITUDE - LATITUDE),
                BitmapDataChannel.BLUE,
                BitmapDataChannel.BLUE
            );
            _bmpDataK.copyChannel(
                _bmpDataSrc,
                _bmpDataSrc.rect,
                new Point(Math.random() * LATITUDE - LATITUDE, Math.random() * LATITUDE - LATITUDE),
                BitmapDataChannel.ALPHA,
                BitmapDataChannel.ALPHA
            );
            
            // 描画
            _bmpDataDst.draw(_bmpDataC, null, new ColorTransform());
            _bmpDataDst.draw(_bmpDataM, null, new ColorTransform(), BlendMode.MULTIPLY);
            _bmpDataDst.draw(_bmpDataY, null, new ColorTransform(), BlendMode.MULTIPLY);
            _bmpDataDst.draw(_bmpDataK, null, new ColorTransform(), BlendMode.MULTIPLY);
		}
    }
}