Flex3で、マイクの音量に応じてネギを振る初音ミクを作りました

まずはじめに画像が無断借用です(゚Д゚ )。すみません。
気に入って保存してたんですが、どこのサイトだったか判らなくなり、画像検索しても見つからないので、
勝手に拝借しております。
初音ミク名人のネギテクニックといった画像でした。


こちらからFlashが動きます。
http://misakirara.s296.xrea.com/flex/flex003.html


Flex3とActionScript3.0でマイクを使ったアプリを作るべく研究中なのですが、
プロパティを見ているとマイク音量を調べるactivityLevelというのがあり、
これを使えば「ダンシングフラワー」が作れるのではないか? と思ったのが発端です(・∀・)



swfはこちらからダウンロードできます。
http://misakirara.s296.xrea.com/flex/MicrophoneEx.swf


flashが起動すると、「マイクから音声を送っていいですか?」ダイアログが出ますので、許可をすると
動きます。


会社のヘッドセットのマイクは感度がいいので、
「遠くの席で電話がかかってきたり」「会話を始める」と初音ミクが反応します(w


同じ島の人で、しょっちゅう大きなくしゃみをする人がいるんですが、
その人がくしゃみをすると音量ゲージが振り切れます(w


「イデのパワー発動!キタ━━━━(゚∀゚)━━━━ッ!!? 」
と仕事中に、ニヤニヤしています(w


他にもマイクの側で、ボールペンで机をたたくと、音量に応じてネギを振るので、
なかなか面白いと思います。


actionScript自体を仕事として使ったことはなく(現在はC言語の開発の仕事をしています)
完全に我流で、お見せできるようなソースではないのですが、
日頃ネット情報にはお世話になっておりますので、なにかの参考になればと張っておきます。
例によって、こちらのサンプルを参考にしています。
http://www.saturn.dti.ne.jp/~npaka/flash/index.html

package {
    import flash.display.*;
    import flash.events.*;
    import flash.media.*;
    import flash.system.*;
    import flash.text.*;
	import flash.utils.Timer;
    import flash.geom.*;
 
    //マイクを使用する
    public class MicrophoneEx extends Sprite {

//リソース
        [Embed(source='miku00.png')]
        private var Image0:Class;

        [Embed(source='miku01.png')]
        private var Image1:Class;

        [Embed(source='miku02.png')]
        private var Image2:Class;

        [Embed(source='miku03.png')]
        private var Image3:Class;

        [Embed(source='bar.png')]
        private var ImageBar:Class;

		public var label:TextField;
		public var mic:Microphone;
		public var temp:Number;

		public var image0:Bitmap;
		public var image1:Bitmap;
		public var image2:Bitmap;
		public var image3:Bitmap;
		public var imageBar:Bitmap;

		public var timer:Timer;
		public var togle:Number;

        //コンストラクタ
        public function MicrophoneEx() {

			graphics.beginFill(0xF0F0FF);
			graphics.moveTo(10, 60);
			graphics.lineTo(10, 60+120);
			graphics.lineTo(90, 60+120);
			graphics.lineTo(90, 60);
			graphics.endFill();

			//リソース
			image0=new Image0() as Bitmap;
			image0.x=100;     //X座標
			image0.y=70;     //Y座標
			stage.addChild(image0);//追加

			image1=new Image1() as Bitmap;
			image1.x=100;     //X座標
			image1.y=70;     //Y座標
			stage.addChild(image1);//追加

			image2=new Image2() as Bitmap;
			image2.x=100;     //X座標
			image2.y=70;     //Y座標
			stage.addChild(image2);//追加

			image3=new Image3() as Bitmap;
			image3.x=100;     //X座標
			image3.y=70;     //Y座標
			stage.addChild(image3);//追加

			imageBar=new ImageBar() as Bitmap;
			imageBar.x=35;     //X座標
			imageBar.y=60;     //Y座標
			stage.addChild(imageBar);//追加

			//ラベルの追加
			label=makeLabel("Hello World!");
			label.x=20;     //X座標
			label.y=60;     //Y座標
			stage.addChild(label);//追加

            //マイクの生成
			mic=Microphone.getMicrophone();
            if (mic!=null) {
                //ローカルスピーカーへのマイク音送信
                mic.setLoopBack(true);

                //エコー抑制機能の使用
                mic.setUseEchoSuppression(true);

				togle=0;

				//タイマーの追加
	            timer=new Timer(50,0);
	            timer.addEventListener(TimerEvent.TIMER,onTick);
	            timer.start();
            }
        }

		//タイマーリスナー
		public function onTick(event:TimerEvent):void {

			var temp:Number = mic.activityLevel;
			var temp2:Number;

			label.text="0"+temp;

			image0.y=70-temp;
			image1.y=70-temp;
			image2.y=70-temp;
			image3.y=70-temp;

			imageBar.height = temp*2;
			if(imageBar.height >= 200) { imageBar.height = 200; }
			if(imageBar.height <= 0  ) { imageBar.height = 0; }

			if( temp<5 ) {
				genAnime(2);
			}
			else
			if( temp<20 ) {
				if( (timer.currentCount%3) == 0 ) genAnime(0);
			}
			else
			if( temp<40 ) {
				if( (timer.currentCount%2) == 0 ) genAnime(0);
			}
			else
			if( temp<60 ) {
				if( (timer.currentCount%1) == 0 ) genAnime(0);
			}
			else
			{
				genAnime(1);
			}

		}

		private function genAnime(mode:Number):void {

			if(mode==0) {
				image0.visible=false;
				image3.visible=false;
			}

			if(mode==1) {
				image0.visible=false;
				image1.visible=false;
				image2.visible=false;
				image3.visible=true;
				return;
			}

			if(mode==2) {
				image0.visible=true;
				image1.visible=false;
				image2.visible=false;
				image3.visible=false;
				return;
			}

			if( togle==0 ) togle=1;
			else if( togle==1 ) togle=0;
			if( togle == 0 ) {
				image1.visible=true;
				image2.visible=false;
			}
			else {
				image1.visible=false;
				image2.visible=true;
			}
		}

        //ラベルの生成
        private function makeLabel(text:String):TextField {
            //ラベルの生成
            var label:TextField=new TextField();
            label.text      =text;                  //テキスト
            label.autoSize  =TextFieldAutoSize.LEFT;//オートサイズ
            label.selectable=false;                 //選択不可

            //書式の指定
            var format:TextFormat=new TextFormat();
            format.font     ="_等幅"; //フォント名
            format.size     =20;      //サイズ
            format.color    =0xFF0000;//色
            format.bold     =true;    //ボールド
//            format.italic   =true;    //イタリック
//            format.underline=true;    //アンダーライン
            label.setTextFormat(format);
            return label;
        }
    }
}

画像などリソースはswfと同じフォルダに入ってますので、コンパイルするときは個別にダウンロードしておいて下さい。
Flex3SDKをダウンロードしてパスを通しておけば、
mxmlc 保存したソース名
コンパイルすればswfができます。


らき☆すたFlashは、mtascとかつかってコマンドラインで作りましたが、リソースの埋め込みとか、すごく簡単になりました(゚Д゚ )ウマー



http://www.saturn.dti.ne.jp/~npaka/flash/apollo10/index.html
ここを参考に、
AdobeAIRもダウンロードして、AIRアプリとしてもコンパイルしてみたのですが、
マイクが動くときと動かないときがあって、よく原因が分かりませんでした。
ただ、インストーラーも作ってくれて、透過Windowも作れるようで、非常に面白い開発環境と思いました。

はてなダイアリーにFLashがはれるらしいテスト


あ、張れた! 張れた!
これなら、将棋の棋譜プレイヤーをFlashで作れば張れるじゃん! やったー!


http://d.hatena.ne.jp/nitoyon/20070829/embed_flash_on_hatena_diary
こちらに張り方が書いてあります。
Googleガジェットを経由しているようです。すごく便利ですね! ありがとう!