flash on 2011-3-3

by Nackybear
♥0 | Line 361 | Modified 2011-03-03 20:28:18 | MIT License
play

ActionScript3 source code

/**
 * Copyright Nackybear ( http://wonderfl.net/user/Nackybear )
 * MIT License ( http://www.opensource.org/licenses/mit-license.php )
 * Downloaded from: http://wonderfl.net/c/bcoF
 */

package {
    import flash.display.Sprite;
    import flash.display.Sprite;
    import flash.events.*;
    import org.si.sion.*;
    import org.si.sion.events.*;
    import org.si.sion.effector.*;
    import org.si.sion.utils.SiONPresetVoice;
    import flash.media.Sound;    
    
    public class Main extends Sprite {
       private var centercircle:Sprite = new Sprite();
       private var cx:int; //中心の円のx
       private var cy:int; //中心の円のy
       private var cex = 350; //同心円のx座標
       private var cey = 250; //同心円のy座標
       private var r = 200;//同心円の半径
       private var colortable:Array = new Array(0xabcabc,0xabca00,0x00cabc,0xab00bc,0x777777); //ユーザーオブジェクトの配色設定
       private var object:Array = new Array(5); //5つのユーザーオブジェクト
       private var ox:Array = new Array(5);//各ユーザーオブジェクトのx座標
       private var oy:Array = new Array(5);//各ユーザーオブジェクトのy座標
       private var scolortable:Array = new Array(0x445544,0x337733,0x228855,0x552255,0x119911);//音オブジェクトの配色設定
       private var sobj:Array = new Array(5); //5つの音オブジェクト
       private var sox:Array = new Array(5); //各音オブジェクトのx座標
       private var soy:Array = new Array(5); //各音オブジェクトのy座標
       private var line:Shape = new Shape(); //中心点からつなぐ線
       // テキストフィールドオブジェクトを作成する 数値表示用;
       private var tf = new TextField();
       private var tf2 = new TextField();
       private var tf3 = new TextField();
       private var draggedObject:DisplayObjectContainer;
       
                   
        
        public function Main() {
            //中心の円を求める
            centercircle.x = 330;
            centercircle.y = 230;
            addChild(centercircle);
            centercircle.graphics.beginFill(0x999999,0.9);
            //配色設定のj番目を取る;
            centercircle.graphics.drawCircle(20, 20, 20);
            centercircle.graphics.endFill();
            //中心の円の座標を求める;
            cx = centercircle.x + centercircle.width / 2;
            cy = centercircle.y + centercircle.height / 2;


            //5つのオブジェクトとその中心点を求める
            var j;//配列用オブジェクト用 j
            for (j=0; j<5; j++)
            {//1-5までのオブジェクトを生成
                object[j] = new Sprite();
                object[j].x = cex + r * Math.cos(j * 72 * 2 * Math.PI / 360);//72度づつ各オブジェクトが同心円上に並ぶ x座標
                object[j].y = cey + r * Math.sin(j * 72 * 2 * Math.PI / 360); ;//72度づつ各オブジェクトが同心円上に並ぶ y座標
                addChild(object[j]);
                object[j].graphics.beginFill(colortable[j],0.7);
                //配色設定のj番目を取る;
                object[j].graphics.drawCircle(50, 50, 50);
                object[j].graphics.endFill();
                //各オブジェクトの中心点を求める;
                ox[j] = object[j].x + object[j].width / 2;
                oy[j] = object[j].y + object[j].height / 2;
            }

            //5つの音発生△とその中心点
            var t;//配列用音発生△用 t
            for (t=0; t<5; t++)
            {
                sobj[t]  = new Sprite();
                sobj[t].x = 850;//△の位置x座標
                sobj[t].y = 110 * t;//△の位置y座標  
                addChild(sobj[t]);
                //ここで△をつくる
                sobj[t].graphics.beginFill(scolortable[t],0.9);
                //ここで△をつくる;
                sobj[t].graphics.moveTo(50, 0);
                sobj[t].graphics.lineTo(0, 100);
                sobj[t].graphics.lineTo(100, 100);
                sobj[t].graphics.endFill();
                //各△の中心点を求める;
                sox[t] = object[t].x + object[t].width / 2;
                soy[t] = object[t].y + object[t].height / 2;
            }


            //線を描画 中心点から各オブジェクトへ
            addChild(line);
            line.graphics.lineStyle(6, 0xFF2222, 0.8,false,"horizontal","round");
            line.graphics.moveTo(cx,cy);
            line.graphics.lineTo(ox[0],oy[0]);
            line.graphics.moveTo(cx,cy);
            line.graphics.lineTo(ox[1],oy[1]);
            line.graphics.moveTo(cx,cy);
            line.graphics.lineTo(ox[2],oy[2]);
            line.graphics.moveTo(cx,cy);
            line.graphics.lineTo(ox[3],oy[3]);
            line.graphics.moveTo(cx,cy);
            line.graphics.lineTo(ox[4],oy[4]);



            // 表示リストに登録する
            stage.addChild(tf);
            stage.addChild(tf2);
            stage.addChild(tf3);
            
            // テキストフィールドの設定
            tf.border = true;
            tf.x = 750;
            tf.y = 470;
            tf.width = 50;
            tf.height = 20;
            
            tf2.border = true;
            tf2.x = 750;
            tf2.y = 500;
            tf2.width = 50;
            tf2.height = 20;
            
            tf3.border = true;
            tf3.x = 750;
            tf3.y = 530;
            tf3.width = 50;
            tf3.height = 20;

            //数値表示イベント
            addEventListener(Event.ENTER_FRAME,function(event){;
            tf.text = String(calcdistance(cx,cy,ox[0],oy[0]) * 12);
            tf2.text = String(Math.floor(calcdistance(cx,cy,ox[1],oy[1]) /450*11000));
            tf3.text = String(calcdistance(cx,cy,ox[2],oy[2]) /100*1100);
            });


            
            //図形を追加 オブジェクトと音△と線
            object[0].addEventListener(MouseEvent.MOUSE_DOWN, startDragging);
            object[1].addEventListener(MouseEvent.MOUSE_DOWN, startDragging);
            object[2].addEventListener(MouseEvent.MOUSE_DOWN, startDragging);
            object[3].addEventListener(MouseEvent.MOUSE_DOWN, startDragging);
            object[4].addEventListener(MouseEvent.MOUSE_DOWN, startDragging);
            sobj[0].addEventListener(MouseEvent.MOUSE_DOWN, startDragging);
            sobj[1].addEventListener(MouseEvent.MOUSE_DOWN, startDragging);
            sobj[2].addEventListener(MouseEvent.MOUSE_DOWN, startDragging);
            sobj[3].addEventListener(MouseEvent.MOUSE_DOWN, startDragging);
            sobj[4].addEventListener(MouseEvent.MOUSE_DOWN, startDragging);
            line.addEventListener(MouseEvent.MOUSE_UP, stopDragging);


            //ドラッグを始めた時の動作
            function startDragging(event:MouseEvent):void
            {
                draggedObject = DisplayObjectContainer(event.target);
                addChild(draggedObject);
                event.target.startDrag();
                event.target.addEventListener(MouseEvent.MOUSE_UP, stopDragging);
            }

            //距離計算のファンクション
            function calcdistance(x1:int, y1:int, x2:int, y2:int):int
            {
                return Math.floor(Math.sqrt((x1- x2)*(x1-x2) + (y1-y2)*(y1-y2)));
            }



//サウンドの指定  読み込む音を配列で示す
var soundlist:Array = new Array("import/01.mp3","import/02.mp3","import/03.mp3","import/04.mp3","import/05.mp3");
var url;
var src_obj:Array = new Array(5);
var soundchannel;


//var ss=0;
var old_timer = getTimer();

//ドラッグをし終わった時の動作
function stopDragging(event:MouseEvent):void
{
    event.target.removeEventListener(MouseEvent.MOUSE_DOWN, stopDragging);
    event.target.stopDrag();



    //数値を表示 中心点と各オブジェクトの距離;
    trace( calcdistance(cx,cy,ox[0],oy[0]) *13);
    trace( calcdistance(cx,cy,ox[1],oy[1]) *13);
    trace( calcdistance(cx,cy,ox[2],oy[2]) *13);
    trace( calcdistance(cx,cy,ox[3],oy[3]) /1000);
    trace( calcdistance(cx,cy,ox[4],oy[4]) /80);

    //ディレイに数値を反映
    delay_sampling[j] = 9000 - calcdistance(cx,cy,ox[0],oy[0]) * 13;
    delay_decrease_buf[j] = 0.85 - calcdistance(cx,cy,ox[1],oy[1]) / 1000;
    delay_decrease_src[j] = 9 - calcdistance(cx,cy,ox[2],oy[2]) / 80;


    //ラインをドラッグ後に描画する。中心点から各図形の中心へ 時間がたったら書く

    if (getTimer() - old_timer >= 50)
    {

        //オブジェクトの中心を再定義
        for (j=0; j<5; j++)
        {
            ox[j] = object[j].x + object[j].width / 2;
            oy[j] = object[j].y + object[j].height / 2;
        }

        //線を引く
        line.graphics.clear();
        line.graphics.lineStyle(6, 0xFF2222, 0.8,false,"horizontal","round");
        line.graphics.moveTo(cx,cy);
        line.graphics.lineTo(ox[0],oy[0]);
        line.graphics.moveTo(cx,cy);
        line.graphics.lineTo(ox[1],oy[1]);
        line.graphics.moveTo(cx,cy);
        line.graphics.lineTo(ox[2],oy[2]);
        line.graphics.moveTo(cx,cy);
        line.graphics.lineTo(ox[3],oy[3]);
        line.graphics.moveTo(cx,cy);
        line.graphics.lineTo(ox[4],oy[4]);

        old_timer = getTimer();


    }



    //距離を測って線を引く
    var myx:int,myy:int;///動かしているものの座標
    var d:Array = new Array(5);
    myx = event.target.x + event.target.width / 2;
    myy = event.target.y + event.target.height / 2;
    for (j=0; j<5; j++)
    {
        d[j] = calcdistance(myx,myy,ox[j],oy[j]);//動かしているものと5つのオブジェクトの距離を距離を計算
    }

    var min:int,minp:int;///minは一番小さい数、minpはその場所(j
    min = d[0];
    minp = 0;
    for (j=0; j<5; j++)
    {
        if (min > d[j])
        {//オブジェクトの中で一番近いものを算出
            min = d[j];
            minp = j;
        }
    }

    //var sbank:Array=new Array
    if (min < 200)
    {//minが200以下なら線をつなぐ
        line.graphics.lineStyle(6, 0x22FF22, 0.8,false,"horizontal","round");
        line.graphics.moveTo(myx, myy);
        line.graphics.lineTo(ox[minp],oy[minp]);


        var j;
        for (j=0; j<5; j++)
        {
            if (event.target == sobj[j])
            {
                url = new URLRequest(soundlist[j]);
                src_obj[j] = null;
                src_obj[j] = new Sound(url);
                //src_obj[j].play(0,99999);
                channel[j]=src_obj[j].play(0,99999);
                if(channel[j])
                {
                    var trans = channel.soundTransform;
                    trans.volume = min;
                    channel[j].soundTransform = trans;
                }

            }
        }

    }

    //サウンドを設定する


    /////距離が近い音三角をすべてよみこみ、それをすべて再び再生、それ以外は停止 そうすれば、音のズレも解消?
    /////でも近いものが二つ以上あると音がだぶる
    /////






    //url = new URLRequest(soundlist[minp]);
    //src_obj[minp]=new Sound(url);
    //soundchannel= src_obj[minp].play(0,9999);  //9999回再生

}




//////外部ファイル読み込み/////////
var dtext = new TextField();

stage.addChild(dtext);

dtext.border = true;
dtext.x = 750;
dtext.y = 400;
dtext.width = 50;
dtext.height = 50;

// Unicode以外のコードで保存されたテキストファイルを読み込む
System.useCodePage = true;
var url0:URLRequest = new URLRequest("user/sss.txt");////*ここをどうするか?

// ローダーオブジェクトを作成し配置
var url_loader : URLLoader = new URLLoader();

//soundbを押して読み込み
object[0].addEventListener(MouseEvent.CLICK,function(event){;
url_loader.load(url0);
});

url_loader.addEventListener(Event.OPEN,URLLoaderOpenFunc);
function URLLoaderOpenFunc(event : Event)
{
    trace("読み込みを開始した");
}

url_loader.addEventListener(Event.COMPLETE,URLLoaderCompleteFunc);
function URLLoaderCompleteFunc(event : Event)
{
    trace("読み込みを完了");

    dtext.text = url_loader.data;// テキストとして表示
}

//////外部ファイル読み込み ここまで/////////





var DELAY_SAMPLING_MAX = 20000;// ディレイバッファ上限
// パラメータ
var sampling:Array = new Array(5);// 1 度に転送するサンプリング数
var loop:Array = new Array(5);// ループあり
var loop_begin:Array = new Array(5);// ループ開始地点
var delay_sampling:Array = new Array(5);// ディレイの時間(サンプリング数)
var delay_decrease_buf:Array = new Array(5);// ディレイの減衰率 (ディレイバッファに乗算)
var delay_decrease_src:Array = new Array(5);// ディレイの減衰率(再生ソースに乗算)

// 出力用サウンドオブジェクト
var out_obj:Array = new Array(5);
var channel:Array = new Array(5);


// 波形用ワーク
var wave:Array = new Array(5);


// ディレイ用ワーク
var delay:Array = new Array(5);
var i;
for (j=0; j<5; j++)
{
    sampling[j] = 2048;
    loop[j] = true;
    loop_begin[j] = 0;
    delay_sampling[j] = 1000;
    delay_decrease_buf[j] = 0.8;
    delay_decrease_src[j] = 0.7;
    out_obj[j] = null;
    channel[j] = null;
    wave[j] = {pos:0};

    delay[j] = {pos:0};// バッファ位置
    delay[j].buffer = new ByteArray();
    for (i=0; i < delay_sampling[j]; i++)
    {
        delay[j].buffer.writeFloat(0.0);
        delay[j].buffer.writeFloat(0.0);
    }
}




//////ディレイに関する記述↓//////



// 再生ボタンを押したとき
play_b.addEventListener(MouseEvent.CLICK,function(event){;
for (j=0;j<5;j++){
    out_obj[j] = null;
    out_obj[j]=new Sound();

    out_obj[j].addEventListener(SampleDataEvent.SAMPLE_DATA, SampleDataFunc);

    // 再生開始
    channel[j]=out_obj[j].play();

};
});

// 停止ボタンを押したとき;
stop_b.addEventListener(MouseEvent.CLICK,function(event){;
for (j=0;j<5;j++){;
channel[j].stop();
out_obj[j] = null;
channel[j] = null;
src_obj[j].stop;
soundchannel.stop();

};
});



// サウンドデータ要求時に呼び出されるイベント
function SampleDataFunc(event:SampleDataEvent):void
{
    var copy_sampling:Array = new Array(5);
    var get_sampling:Array = new Array(5);

    var i;
    var j;
    for (j=0; j<5; j++)
    {


        // ソース用と出力用のバッファ  ここだけ改訂はしていない。改訂不要?
        var src_buffer:Array = new Array(5);
        var out_buffer:Array = new Array(5);
        out_buffer[j]= event.data;

        // 開始直後のノイズ対策
        if (event.position == 0)
        {
            for (i=0; i < 4096; i++)
            {
                // 左チャンネル
                out_buffer[j].writeFloat(0.0);
                // 右チャンネル;
                out_buffer[j].writeFloat(0.0);
            }
            return;
        }

        

        // ソースから取得するサンプリング数
        copy_sampling[j] = sampling[j];

        // サウンドデータを取得
        get_sampling[j] = src_obj[j].extract(src_buffer[j],copy_sampling[j],wave[j].pos);

        // サウンドバッファが埋まるまでループを繰り返す
        while (true)
        {
            wave[j].pos +=  get_sampling[j];
            copy_sampling[j] -=  get_sampling[j];
            if (copy_sampling[j] <= 0)
            {
                break;
            }

            if (! loop)
            {
                // ループしないなら空白で埋める
                for (i=0; i < copy_sampling[j]; i++)
                {
                    src_buffer[j].writeFloat(0);
                    src_buffer[j].writeFloat(0);
                }
                break;
            }

            // ループ開始位置をセット
            wave[j].pos = loop_begin[j];


            // サウンドデータを再取得
            get_sampling[j] = src_obj[j].extract(src_buffer[j],copy_sampling[j],wave[j].pos);

            // エラー
            if (! get_sampling[j])
            {
                return;
            }
        }

        // 再生速度に合わせてサウンドデータをコピー
        var data;
        src_buffer.position = 0;
        var src_l:Array = new Array(5);
        var src_r:Array = new Array(5);
        var out_l:Array = new Array(5);
        var out_r:Array = new Array(5);
        var pos:Array = new Array(5);
        for (i=0; i < sampling[j]; i++)
        {

            // ディレイバッファからソースを取得
            delay[j].buffer.position = delay[j].pos * 4 * 2;
            src_l[j] = delay[j].buffer.readFloat();
            src_r[j] = delay[j].buffer.readFloat();

            // 左チャンネル
            data = src_buffer[j].readFloat();
            data = src_l[j] * delay_decrease_buf[j] + data * delay_decrease_src[j];// ディレイソースと再生ソースをブレンド
            out_buffer[j].writeFloat(data);
            out_l[j] = data;

            // 右チャンネル
            data = src_buffer[j].readFloat();
            data = src_r[j] * delay_decrease_buf[j] + data * delay_decrease_src[j];// ディレイソースと再生ソースをブレンド
            out_buffer[j].writeFloat(data);
            out_r[j] = data;

            // 再生したサウンドデータをディレイバッファに格納
            pos[j] = delay[j].pos - 1;
            if (pos[j] < 0)
            {
                pos[j] +=  delay_sampling[j];
            }
            delay[j].buffer.position = pos[j] * 4 * 2;
            delay[j].buffer.writeFloat(out_l[j]);
            delay[j].buffer.writeFloat(out_r[j]);

            // ディレイバッファを進める;
            delay[j].pos++;
            if (delay_sampling[j] <= delay[j].pos)
            {
                delay[j].pos = 0;
            }
        }
    }
}
//////ディレイに関する記述ここまで ↑////////
            
        }
    }
}