2008年6月 Archives

« 2008年5月 2008年7月 »

Astro(Flash10) ,singing DO-RE-MI--

アストロ(強うそうな名前)でドレミを鳴らすテストを作った!
サンプル(Flash10beta必須)
*いきなり音が鳴ります!
ソースコード

SDKとか環境構築はこちらを参照
http://wiki.libspark.org/wiki/FlashPlayer/10/API

コーディングはこちらを参照
http://www.kaourantin.net/2008/05/adobe-is-making-some-noise-part-2.html

samplesCallbackイベントとSound.samplesCallbackDataを使うだけでさら~とコードがかけて、そして音が鳴ることにびっくり。ハッキリ言ってすごい。リリースしたAdobeはもちろんのこと、Adobe Make Some Noise の執念もすごいな~と感じる。


赤いボタンの左から順に「ド・レ・ミ・ファ・ソ・ラ・シ・ド」と音階になってます。


メインのコードはこちら。
package {
 
 import flash.display.Sprite;
 import flash.events.MouseEvent;
 import flash.events.SamplesCallbackEvent;
 import flash.media.Sound;
 import flash.text.TextField;
 import flash.utils.getTimer;

 use namespace astro;
 

 [SWF ( frameRate="40")]
 
 public class Astrotest extends Sprite{
  
  private const RATE:Number = 44100
  
  private var frequency:Number = 220
  
  private var textField:TextField = new TextField()
  
  public function Astrotest(){
   
   for(var i:int = 0; i < 8; i++){
    createKey(i)
   }

   createDebuger();
    
   var sound:Sound = new Sound(); 
   
   function sineWavGenerator(event:SamplesCallbackEvent):void {  
    
    var rate:Number = RATE
    var amp:Number
    var freq:Number = (Math.PI * 2) * frequency / 44100;
            
    for ( var c:int=0; c<512; c++ ) {  
         
     amp = (event.position + c) * freq
     
     var sample:Number = Math.sin( amp )  * 0.5
        
     sound.samplesCallbackData.writeFloat(sample);      
     sound.samplesCallbackData.writeFloat(sample);    
     
    }
   }  

   sound.addEventListener("samplesCallback",sineWavGenerator);  
   
   sound.play();   
 
  }
  
  private function createKey(index:int = 0):void{
   
   var ary:Array = [220,  //ド
       246.942, //レ
       277.183, //ミ
       293.655, //ファ
       329.628, //ソ
       369.994, //ラ
       415.305, //シ
       440]  //ド
       var key:Sprite = new Sprite()
    key.buttonMode = true;
    key.graphics.beginFill(0xff0000)
    key.graphics.drawRect(0,0,50,50)
    key.graphics.endFill();
    key.addEventListener(MouseEvent.MOUSE_DOWN,
     function ():void{
      frequency = ary[index]
      textField.appendText(frequency.toString() + ",  ");
     })
    addChild(key)
    
    key.x = index * 70;
    
  
  }
  
  private function createDebuger():void{
   addChild(textField)
   textField.text ="debuger"
   textField.wordWrap = true
   textField.width = 800;
   textField.height = 800;
   textField.y = 200
 
  }
  
  
 }
}


詳しい仕様を読んだわけではないのでざっくりだけど、「samplesCallback」っていうのはサウンドデータがバイトレベルで再生し終わった時に送出される様です。

以前は「ON_SOUND_COMPLETE」というイベントを使ってた訳ですが、精度が甘かったり、Vistaだと全く話にならなかったりでみんなが頭を悩ませていました。Astroではなんとかこの精度を上げてくれよと世界中のFlasherが「Adobe Make Some Noise」したところ、なんとAdobeは全く新しいイベントを作ったわけです。よくやった!Adobe!

話がそれたので元に戻しますが、samplesCallbackが発生する毎にサインカーブを生成して直接Soundインスタンスに書き込んでいます。ちなみにその時書き込めるデータの長さが決まっていて512~8192の長さです。たしかPCM形式の仕様に8192って数字は何かしら関連が会ったような気がしますが不勉強なのでよく分かりません。これよりでかくてもちっこくても、何れにせよ音は鳴らないみたいです。
そして、書き込んだデータが再生し終わるとまた新たに、samplesCallbackが呼ばれ、ループします。従って512に近づければ近づくほど生成の間隔が短くなり、よりリアルタイムな処理になるって事です。

いまのところ、生成されるサウンドは32bit,44100Hz,Streo,に限定されているみたいなので、それに併せてサイクルを変えると音階表現が出来ます。

とりあえず今日はここまで。

DreamweaverCS4 beta

ややタイムラグのある話題だけど、FireworksとDreamweaverの次期バージョンベータがリリースされた。

詳しくはこちら

で、あんまり詳しい変更点をチェックした訳じゃ無いけど、とりあえずびっくりしたのが、DreamweaverでSVNリポジトリにチェックインできるらしいってこと。以前からもサードパーティのエクステンションで実現可能だったけど、Windowsのみ対応で、その上有償だったからあまり流行らなかった。多分世界中のDWユーザーが「このままSVN対応しないんだろうな」と半ば諦めムードだったところに、急転直下、SVNが対応されてしまった。

いや、もちろんこのニュースは喜ぶべきで、SVNの敷居を一気に下げる事に成るだろうと思う。

ただこれ、どこまでSVNを使い倒せるんだろう?ざっと読んだ感じだとチェックイン・アウトが関の山という感じで、リバートしたり、ブランチ切ったり、マージしたり、diffを眺めたり出来るんだろうか?リビジョングラフとかログとか、どうなの?リポジトリこさえたりは結局他のツールでやるんだろうか?

個人的にSVNはTortoiseSVNを使って、プロジェクトごとにローカルにリポジトリを作り、そこでバージョニングしている。TortoiseSVNを導入するとき、ファインダーに追加されるのが厭な感じだったけど、今となってはこれ無しではもうダメ。もはやSVNコマンドなんてたたけないのだ。

ともかくDWにSVN機能が搭載されるのであれば、きっちりフル機能で載せて欲しいと思う。

でもって、ゴミファイルをはき出さないようになって(設定弄ってとかじゃなくデフォルトで吐かないようにね)、ファイルの文字コードを間違えないように成ればもう一度DWに戻ってもいいかな。と思う。

FireworksCS4 beta (アンケート付)

前回DreamweaverCS4について書いたので、一応Fireworksに付いても触れておくことにした。

機能的には正直目新しさをあんまり感じなかったFireworksだけど、皆さんはデザインツールは何をお使いでしょうか?ここで言うデザインとはもちろんwebで公開されるデザインのことで、紙メディアは含まれていません。


自分的にはFireworksが一番手になじんでいる。Illustratorとかたまには使うけど、Photoshopは本当に使わなくなってしまった。写真の補正とかレタッチにはPhotosopが以前として最有力だと思うけど、ことデザイン作業においてPhotoshopのレイヤーを前提とした操作感はレガシー以外の何者でも無いんじゃないかと思う。

Photoshopのトーンカーブとか補正機能と同等の機能をFireworksに備えるか、Photoshopでのベクター及びオブジェクトの操作性を向上させるかしてくれればサイコーだけど、Adobeさん的には無理な話だろうな。やれやれ。

more.. "FireworksCS4 beta (アンケート付)" »

FlashDevelop でAstro (trace可)

FlashDevelopでAstro環境を作った。しかもFlashPlayer10betaのインストール無しで。「Astro環境作りたいけど本番環境にbetaプレイヤー入れんのヤダな」というあなた、おすすめです。

[構築フロー]

  1. FlexSDKをダウンロード
  2. FlexSDKのコンフィグ修正
  3. FlashDevelopのAstroパッチ適用
  4. swfファイルのデフォルトアプリをAstroにする
  5. FlashDevelopでAS3プロジェクトを作る


[1] ダウンロード
Adobeの公式サイトからDL
現時点での最新版「3.0.1.1991」をDLし、任意のディレクトリに展開(ここではC:\flex_sdk_301とする)


[2] FlexSDKのコンフィグ修正
Flash Player 10 + FlashDevelop で遊ぶ (from 馬鹿全 ) こちらを参考にconfigを修正。
Adobe公式はこちら


[3] FlashDevelopのAstroパッチ適用
FlashDevelopの公式サイトからFD3_Debug_rev2297.rarをDL、解凍しFlashDevelopのファイルを上書きする(XPならC:\Program Files\FlashDevelop 直下のファイルすべて)この際、SettingsやらSnippetsが初期化されるので、バックアップを取っておく。復元するはC:\Program Files\FlashDevelop\FirstRun以下のファイルを上書きする


[4] swfファイルのデフォルトアプリをAstroにする
任意のswfファイルを選択してコンテクストメニューを出す

プログラムから開く>プログラムの選択>参照>

と進んで、「C:\flex_sdk_301\runtimes\player\10\win\FlashPlayer.exe」を選択する。これで常にswfファイルがFlashplayer10betaで実行される。


[5]  FlashDevelopでAS3プロジェクトを作る
FlashDevelopでAS3プロジェクトを作る。ここでは「Default Project」を選ぶ。

flashdevelop_1.jpg


Project>Propaties>CompilerOpetions から
「Custom Path to FlexSDK」 に 「C:\flex_sdk_301」、
「External Libraries」 に 「C:\flex_sdk_3.0.1\frameworks\libs\player\10\playerglobal.swc」

最後に
Output >Pratform > target を 「FlashPlayer10」、
Output >Test Movie を 「Play in external player」


これでctrl+Enterすればコンパイルされた後、Astroのdebugplayerが立ち上がり、再生される、はず。もちろんtrace文も表示される、と思う。

ただし、当然のことながらスタンドアロンプレイヤーで再生しているだけなので、プロジェクトをパブリッシュしてもブラウザーからは見られません。でもまあベータ期間のお試し用にはいいかなと思う。

hetemlのFMS(FlashMediaServer)にAS3でビデオキャスト

今月中頃にリモートライブを企画しておりまして、その為の準備として、手始めにhetemlのFMS(FlashMediaServer)でビデオキャストしてみた。そしたら案の定躓いたのでメモ。

hetemlさんの「WEBカメラからの映像配信マニュアル」には親切なことにflaファイルまで含めたサンプルがおいてあるんだけど、残念ながらAS2でコーディングされている。これじゃあ「samplesCallback」とか使えないのでAS3で作ってみた。

ポイントは2カ所。

 nc.objectEncoding = ObjectEncoding.AMF0;
AS2の時は上記の指定は必要なかったけど、AS3だと必須みたいで、明示的に指定しないと接続できない。

 Video.attachNetStream();
こちらはAS2のときは「attachVideo()」でよかったんだけど、AS3では「ストリーミングですよ!」って感じのメソッドに変更されている。



とりあえずはビデオ配信の為だけど、今後色々とFMSを使った企画を考えてみたいと思います。了

参考サイト Flash Media Server 2メモ

ソースはこちら *Sender.asが配信側で Receiver.asが受信側

Sender.as package {
    import flash.display.Sprite;
    import flash.display.StageAlign;
    import flash.display.StageScaleMode;
    import flash.events.*;
    import flash.media.Camera;
    import flash.media.Video;
    import flash.net.NetConnection;
    import flash.net.NetStream;
    import flash.net.ObjectEncoding
    import flash.text.TextField;

    public class Sender extends Sprite {

        //rtmp://サーバー名/アプリ名/{任意}インスタンス名    
        private var PATH_FMS:String = "rtmp://foo.fms.heteml.jp/watch"

        private var camera:Camera
        private var video:Video;
        private var nc:NetConnection;
        private var ns:NetStream

        private var textField:TextField

        public function Sender() {

            stage.scaleMode = StageScaleMode.NO_SCALE;
            stage.align = StageAlign.TOP_LEFT;

            init();

        }


        private function init():void{

            //debug用にテキストフィールド生成
            textField=new TextField();
            textField.text="FMSConnectEx";
            addChild(textField);

            textField.y = 300
            textField.width = 400

            //カメラのセットアップ
            setCamera();

            //ネットワーク接続
            connectFMS();

        }

        //カメラのセットアップ
        private function setCamera():void{

            camera = Camera.getCamera();

            if (camera != null) {
                video = new Video(camera.width, camera.height);
                video.attachCamera(camera);
                addChild(video);
            } 

        }


        //ネットワーク接続
        private function connectFMS():void{

            nc = new NetConnection();

            //AMF設定!
            nc.objectEncoding = ObjectEncoding.AMF0;

            nc.addEventListener(NetStatusEvent.NET_STATUS,onNetStatus);

            nc.connect(PATH_FMS);
        }

        //ネットワーク接続イベント
        private function onNetStatus(e:NetStatusEvent):void {

            textField.text = "" + e.info.code;

            if (e.info.code == "NetConnection.Connect.Success"){
                //ストリーム送信
                sendStream();
            }

        }


        //ストリーム送信
        private function sendStream():void{

            ns = new NetStream(nc)

            ns.attachCamera(camera)
            ns.publish("video")

            ns.addEventListener(NetStatusEvent.NET_STATUS,
                function(e:NetStatusEvent):void{
                    textField.appendText(e.info.code)
                })
        }

    }
}


Render.as package  {

    import flash.display.Sprite;
    import flash.display.StageAlign;
    import flash.display.StageScaleMode;
    import flash.events.*;
    import flash.media.Camera;
    import flash.media.Video;
    import flash.net.NetConnection;
    import flash.net.NetStream;
    import flash.net.ObjectEncoding
    import flash.text.TextField;

    public class Receiver extends Sprite {

        //rtmp://サーバー名/アプリ名/{任意}インスタンス名        
        private var PATH_FMS:String = "rtmp://foo.fms.heteml.jp/watch"

        private var camera:Camera
        private var video:Video;
        private var nc:NetConnection;
        private var ns:NetStream

        private var textField:TextField

        public function Receiver() {

            stage.scaleMode = StageScaleMode.NO_SCALE;
            stage.align = StageAlign.TOP_LEFT;

            init();

        }

        private function init():void {

            textField=new TextField();
            textField.text="FMSConnectEx";
            addChild(textField);

            textField.y = 300
            textField.width = 400

            video = new Video()
            addChild(video)

            //ネットワーク接続
            connectFMS();

        }

        //video受信
        private function receiveVideo():void{

            ns = new NetStream(nc)
            ns.play("video");

            //videoに直接ストリームをattach
            video.attachNetStream(ns)

            ns.addEventListener(NetStatusEvent.NET_STATUS,
                                function(e:NetStatusEvent):void{
                                    textField.appendText(e.info.code)
                                })

        }

        //ネットワーク接続
        private function connectFMS():void{

            nc = new NetConnection();

            nc.objectEncoding = ObjectEncoding.AMF0;
            nc.addEventListener(NetStatusEvent.NET_STATUS,onNetStatus);

            nc.connect(PATH_FMS);
        }

        //ネットワーク接続イベント
        private function onNetStatus(evt:NetStatusEvent):void {
            textField.text = "" + evt.info.code;
            if (evt.info.code == "NetConnection.Connect.Success"){
                //video受信
                receiveVideo();
            }
        }

    }
}

powerd by as2html

Flash縦書き元年

最近、カメラマンの友達に「Flashが遂に縦書き出来るようになったんだよ!!すげーよ。革命とはこのことに違いない!」と大興奮で話したら、「え?何それ。Flashってそんなことも出来ないの。サッブー」と言われてしまった(誇張アリ)。

まあ世間の反応としてはこれが平均値だろう。確かにランタイム上でサウンドの生成やバイナリレベルの処理に加え動体検知なんて事が出来るようになったこのご時世に「縦書き」が実装されるって言うのは何となくアンビバレントな感じがしないでもない。一般的に「縦書き」なんて「出来て当たり前 」だからだ。この話を聴いた彼はひょっとすると、「今まで何の開発してたんだ?」と思ったのかもしれない。

だけど、もう一度考えてみよう。このテキストエンジンの名前は「EastAsianJustifier」、つまり東アジア向けってことなんだ。僕たちが「アタリマエ」と思っている「縦書き」を使う文化圏は必ずしも多数派ではない。むしろ少数派なのだ。Adobeにしてみれば「何でアジアの一部だけの為にこんな実装しなきゃなんねえんだよ」と思ってるかもしれない。


というわけでAstroのflash.text.engine.EastAsianJustifierで縦書きを作ってみた。


http://memo.kappa-lab.com/swf/eastAsianJustifierExample.swf
(要 FlashPlayer10)


公式リファレンスのソースに少し手を加えただけですが、リファレンスを見る限りだと、かなり力業で縦書きにしている様子です。まず、テキストを保持するコンテナ(TextBox)を用意してそこにテキストを格納、そこから一行づつ文章を生成(TextLine)してaddChildeする。行間はTextLineのx座標でコントロール。

う~ん。なんか力業すぎるんじゃないの?
行間がx座標って!

それと、現時点でテキストの選択が出来ないみたい。TextFieldのselectableに相等するプロパティが見つからない。でもって、カギ括弧あたりの字詰めが怪しい。というか崩れている。

当然beta版なのでこれから色々と改良されていくと思いますが、とりあえずFlashの縦書き元年を祝って、乾杯。


more.. "Flash縦書き元年" »

SamplesCallbackEventで音が途切れないように鳴らすメモ

こないだAstroのSamplesCallbackEventで音を鳴らしてみたところ、どうも音切れが発生しているようなので途切れないためのメモ

for ( var c:int=0; c<512; c++ ) {  
        
    amp = (event.position + c) * freq
    
    var sample:Number = Math.sin( amp )  * 0.5
       
    sound.samplesCallbackData.writeFloat(sample);      
    sound.samplesCallbackData.writeFloat(sample);    
    
}


for ( var c:int=1; c <= 512; c++ ) {  
    
    //前回のサンプル末尾に加算
    amp = (c * freq) + ampEnd
    
    var sample:Number = Math.sin(amp) * 0.5
       
    this.samplesCallbackData.writeFloat(sample);      
    this.samplesCallbackData.writeFloat(sample);    
    
}
//サンプルの末尾を保持
ampEnd = amp

修正箇所はampの計算方法の違い。旧版は、byteArrayのポジションから計算してたけど、それだと周波数が変わったときにジャンプしちゃうので新版では前回の数値を保持し、そこに加算する事にした。

DynamicSoundをTweenerで変化

今度はAstroにチャルメラを謳わせてみた。 charumera.png
(要Flash10beta)

作曲方法はTweenerで音階を変化させていくちょっとヘンテコな手法です。
こんな感じ↓↓↓
Tweener.addTween(oto, 
    {frequency:OTO.RE, time:0, delay:.5,transition:"linear"});
Tweener.addTween(oto,
    {frequency:OTO.MI, time:0, delay:1,transition:"linear"});
Tweener.addTween(oto,
    {frequency:OTO.RE, time:0, delay:2,transition:"linear"});
Tweener.addTween(oto,
    {frequency:OTO.DO, time:0, delay:2.5, transition:"linear"});
Tweener.addTween(oto,
    {frequency:OTO.MUTE, time:0, delay:3,transition:"linear"});
Tweener.addTween(oto,
    {frequency:OTO.DO, time:0, delay:3.5, transition:"linear"});
Tweener.addTween(oto,
    {frequency:OTO.RE, time:0, delay:4,transition:"linear"});
Tweener.addTween(oto,
    {frequency:OTO.MI, time:0, delay:4.5,transition:"linear"});
Tweener.addTween(oto,
    {frequency:OTO.RE, time:0, delay:5,transition:"linear"});
Tweener.addTween(oto,
    {frequency:OTO.DO, time:0, delay:5.5, transition:"linear"});
Tweener.addTween(oto,
    {frequency:OTO.RE, time:0, delay:6,transition:"linear"});
Tweener.addTween(oto,
    {frequency:OTO.MI, time:0, delay:7.5,transition:"linear"});
Tweener.addTween(oto,
    {frequency:OTO.RE, time:0, delay:7.7,transition:"linear"});
Tweener.addTween(oto,
    {frequency:OTO.DO, time:0, delay:7.9, transition:"linear"});
Tweener.addTween(oto,
    {frequency:OTO.MUTE, time:0, delay:8.3, transition:"linear"});


実際にシーケンスを組んだり楽曲を組んだりするのはMIDI言語とかを使うのが一番イイと思う。 FlMMLの人とかが作ってくれるんじゃ無いかと激しく期待しています。

Tweenerを使ったやり方は、とりあえずパラメーターを直接いじくって音が変化するのを楽しむことが出来るので、自分のようなサウンドプログラミングとか信号処理をしたことがない人間にとってはやりやすいです。

音の実態をわしづかみにするような、プリミティブな体験と言えばいいすぎだろうか。

ともかくそんなわけで、サンプル周波数をプロパティとして保持するSoundクラスの拡張を作りました。その名も「OTO(音)クラス」
ゆくゆくはOTOライブラリとしてPopforgeに並ぶサウンドライブラリとして確固たる地位を築き、FLARION(cf:tenorion)を開発する所存です。

まあワタシの生産性だと一生、いや二生かけても無理かもしれないけど。


ソースはこちら
OTO.as package  {
    
    import flash.media.Sound;
    import flash.events.SamplesCallbackEvent;
    import flash.media.SoundChannel;
    import flash.media.SoundTransform;

    
    public class OTO extends Sound{
        
        static public const TWELEVE_TONE_SCALE:Array =[220,
                                                    233.08,
                                                    246.94,
                                                    261.63,
                                                    277.18,
                                                    293.67,
                                                    311.13,
                                                    329.63,
                                                    349.23,
                                                    369.99,
                                                    392,
                                                    415.31,
                                                    ]
 
        
        static public const MUTE:Number    = 0;
        
        static public const DO:Number    = TWELEVE_TONE_SCALE[0];
        static public const DOs:Number    = TWELEVE_TONE_SCALE[1];
        static public const RE:Number    = TWELEVE_TONE_SCALE[2];
        static public const REs:Number    = TWELEVE_TONE_SCALE[3];
        static public const MI:Number    = TWELEVE_TONE_SCALE[4];
        static public const FA:Number    = TWELEVE_TONE_SCALE[5];
        static public const FAs:Number    = TWELEVE_TONE_SCALE[6];
        static public const SO:Number    = TWELEVE_TONE_SCALE[7];
        static public const SOs:Number    = TWELEVE_TONE_SCALE[8];
        static public const RA:Number    = TWELEVE_TONE_SCALE[9];
        static public const RAs:Number    = TWELEVE_TONE_SCALE[10];
        static public const SI:Number    = TWELEVE_TONE_SCALE[11];

        static public const A:Number    = TWELEVE_TONE_SCALE[0];
        static public const B:Number    = TWELEVE_TONE_SCALE[1];
        static public const H:Number    = TWELEVE_TONE_SCALE[2];
        static public const C:Number    = TWELEVE_TONE_SCALE[3];
        static public const Cs:Number    = TWELEVE_TONE_SCALE[4];
        static public const D:Number    = TWELEVE_TONE_SCALE[5];
        static public const Ds:Number    = TWELEVE_TONE_SCALE[6];
        static public const E:Number    = TWELEVE_TONE_SCALE[7];
        static public const F:Number    = TWELEVE_TONE_SCALE[8];
        static public const Fs:Number    = TWELEVE_TONE_SCALE[9];
        static public const G:Number    = TWELEVE_TONE_SCALE[10];
        static public const Gs:Number    = TWELEVE_TONE_SCALE[11];
        

        
        private const SAMPLEING_RATE:Number = 44100
        
        private var refreshRate:uint = 4410
        private var herts:Number = 220
        private var _frequency:Number = 220
        private var _volume:Number = .5
        
        private var ampEnd:Number =0
        
        public function OTO() {
            init()    
        }
        
        private function init():void{
                    
            this.addEventListener("samplesCallback",sineWavGenerator);  
            
        }
        public function start(toneScale:Number = 220):SoundChannel{
            this.frequency = toneScale
            return this.play()
        }
        private    function sineWavGenerator(event:SamplesCallbackEvent):void {  
                
            var rate:Number = SAMPLEING_RATE
            var refreshRate:Number = this.refreshRate
            
            var amp:Number
            var freq:Number = (Math.PI * 2) * frequency / 44100;
            
            var volume:Number = this.volume
                                            
            for ( var c:int=1; c <= refreshRate; c++ ) {  
                    
                amp = (c * freq) + ampEnd 
                
                var sample:Number = Math.sin(amp) * volume
                   
                this.samplesCallbackData.writeFloat(sample);      
                this.samplesCallbackData.writeFloat(sample);    
                
            }
            ampEnd = amp
        }  
        
        public function get frequency():Number { return _frequency; }
        public function set frequency(value:Number):void {
            _frequency = value;
        }
        
        public function get volume():Number { return _volume; }        
        public function set volume(value:Number):void {
            _volume = value;
        }


        
    }
    
}

NetStreamで受信したVideoを解析するときのメモ

NetStream経由で受け取ったVideo画像を画像解析するためにはBitmapDataにdrawするのが順当なやり方だと思うが、ちょっとつまずいたのでメモ。
video.attachNetStream( null ); //ここ、試験に出るかも
bmd.draw(video);
video.attachNetStream(ns);

と言う具合にdrawする前に一度attachNetStream(null);してやります。ちなみにNetStream経由でなく、直接webCamからキャプチャするときは単純にbmd.draw(video);だけでビットマップ描画してくれます。
なんでわざわざattachNetStream(null);する必要があるのか解らないけど、おそらく一度ストリームから解放してやらないとDisplayObjectとかIBitmapDrawableとしてニッチもサッチも行かないんだと思う。Adobe的に。


こちらを参考にさせていただきました。
http://flash3d.seesaa.net/article/45743218.html
http://shin-ishimaru.cocolog-nifty.com/blog/2007/06/papervision3dfl_d75a.html

ショッピングカート

このブログでタイトルに「ショッピングカート」と付くからにはECサイトとかUIに関する言及かな? と思ってくれる人はどれくらいいるだろうか。

わからないけどいてくれたらちょっと嬉しい。

けど、今日はそんな話題ではなく、近所のサミットに買い物に行ったとき、4歳児まで乗せてもいいショッピングカートに解っちゃいたけど5歳児を乗せてしまった。しかも嬉しそうに。

たぶん世間ではこういうインモラルな輩のことをモンスターピアレントと呼ぶのだろう!

懺悔。

Flashとライブ

flyer.gif


と、言うわけで今週末6月22日(日)、ライブに出ます。

京都にあるライブハウス、nano(map)にて行われるLiving Special Destiny (lsd) というイベントのちょっとした枠でパフォーマンスします。

お近くにお住まいの方は是非お越しください!インスタレーション、ペインティング、映像、ファッションデザイン、その他盛りだくさんのコンテンツでおもてなしいたします。間違いなく楽しいです。たぶん。


ただし当日、河童研究員はいません。



「え!?ライブでるんやろ!?」と思った貴方、
ご心配なく、出番は21時です。


FlashPlayer10beta(Astro)を使ったリモートライブは、おそらくこれが世界初の試みです。(あくまでも10betaに限った話で、それ以前のFlashを使ったリモートライブは枚挙にいとま無しと思われ)
もう少し具体的な話をすると、まずトーキョーからwebカメラでビデオキャストをします。次にキョウトでビデオキャストを視聴します。視聴用Flashはビデオの内容を画像分析してテルミンライクに音を吐き出します。Image AnalysisとDynamic SoundとVideo Stream の三つ巴。

後は実際どの程度盛り上がるのか(理解してもらえるのか?)が懸案事項です。それと、ライブハウス中にネットワークが詰まらないか、これもかなりハイリスク。

あ、ちなみに本番では東京からの配信ではなくニューヨークからの配信ってことになっているのでネタバレしないでね。

それでは皆さん、kappa-lab初ライブ "Chacca Man Show" にご期待ください。

CMS on LSD

前回告知した、Flash Web ライブ「Chacca Man Show」は無事に終了することができました。
スタッフの皆さん、手伝ってくれた友達、イベントオーガナイザー、お店の店長さん、皆さんどうもありがとう。

DSC_3952.jpg

パフォーマンスの内容はというと「Chacca Man Show」の名前が示すとおり、炎を使った演奏。そしてもちろんストリーミングによるインターネットライブ。

東京からビデオ配信、京都で受信、動画を解析、音声合成という流れをFlashとFlashMediaServerで構築。Astroを使ったネットライブとしては一番乗りなんじゃ無いかと思うけどどうなんだろ。


で、肝心のお客の盛り上がりなんだけど、全く不明。自分的には若干メリハリが悪い部分もあったが、それなり盛り上がったのではないかと思う。というかそうであって欲しい。自己評価としては79点ってところ。

オーガナイザーのカイト氏曰く、「なんかさ~サプライズみたいな感じで良かったね!」とのこと。
自らも出展しかつ設置に協力してくれた50R氏は、「Tenori-onの動きっぽかった、そうとう研究したね!?」とのこと。Tenori-onの音じゃなくて動きってどういう事なんだ?Tenori-onは甲斐性さえあれば今すぐにでも欲しいナンバーワン・アイテムで何度も動画を視聴したけど、動きって言われても...

そんな感じで、そこそこの評価を得たと思って問題はなさそうだが、やはり自分が現場の空気を感じていないのでなんとも不安。そしてなんとなくライブをやったという実感に乏しい。これがリモートライブの宿命と言えばその通りなんだけど、次回があるならそこら辺をもうちょっと違う形で解決したい。

NetStreamでsend()する際にFullScreenが解除される件

ここ最近はFlashMediaServerがらみの処理ばっかりしていたので、ちょっと気になった点をメモ。

NetStreamを使って、送信側Flashから受信側Flashの関数をコールするのにsend()をつかったりするけど、その際受信側FlashのFullScreenが解除される模様。具体的には下記の様な処理を送信側Flashで行うと、

netStream = new NetStream(netConection)
netStream.send("hogeFunc","foo")

受信側のFullScreenモードが解除されてしまう。

そして更に注意が必要なのが、Firefox3、IE7では解除されてしまったが、IE6、Safari1.3では解除されないという点。ブラウザによって挙動が違うようです。Safari2.0以降では試していないので、不明だけどこれは結構やっかい。

ChaccaManShow

あの伝説的ライブ「ChaccaManShow」が大成功を収めて早一週間。あの熱狂も漸く落ち着きを取り戻したようなので、少し映像にまとめてみた。


実際のライブ映像は撮影していないので、これはライブ後にChaccaManShowをスタンドアロンで演奏し、スクリーンキャストしたものを、更に編集している。

見ていただければなんとな~く解ってもらえるかもしれないけど、炎の位置によって音の高低が変化している。技術的には動体検知ではなくハイライトだけを拾う光センサーに近い仕様。なんとなく画像とサウンドが同期が怪しく、「え?インチキくせえな..」と思われるかもしれないが、決してインチキではありません。


オーディエンスの反応は前々回辺りのエントリーにも書いたが、それなりに上々だったみたい。アンビエントとかメディアアート的な解釈をしてくれたみたいでこちらとしてはひと安心。

個人的にはやっぱり線香花火っていいな~、と。


今後の展開としては、やっぱり自分一人だけ自宅にいるのはどうにも面白くないので、会場に行きたい。けどそうしちゃうと「ネット」という属性からはずれてしまうので、二カ所同時ライブがいいのではないかと思う。

つまり、東京と京都で同時にライブを開催して、相互通信でインプロビゼーションするとか。きっとすごく面白いと思う。

いづれ必ず!

RSS + Contuct

  • rss
  • email

Credit

Copyright (C) 2007 kappa-lab.com.
All Rights Reserved.