/**
* Copyright Nackybear ( http://wonderfl.net/user/Nackybear )
* MIT License ( http://www.opensource.org/licenses/mit-license.php )
* Downloaded from: http://wonderfl.net/c/1Wcn
*/
package {
import flash.media.SoundTransform;
import flash.display.Sprite;
import flash.display.*;
import flash.net.*;
import flash.text.*;
import flash.events.*;
import flash.events.MouseEvent;
import flash.utils.*;
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:int = 150; //同心円のx座標
private var cey:int = 150; //同心円のy座標
private var r:int = 100;//同心円の半径
private var colortable:Array = new Array(0xabdabc,0xabca00,0x00cabc,0xab00bc,0x772233); //ユーザーオブジェクトの配色設定
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(0x555555,0x33aa33,0x3300ff,0xff00ff,0xdd99dd);//音オブジェクトの配色設定
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:Sprite = new Sprite(); //中心点からつなぐ線
// テキストフィールドオブジェクトを作成する 数値表示用;
private var tf:TextField = new TextField();
private var tf2:TextField = new TextField();
private var tf3:TextField = new TextField();
private var draggedObject:DisplayObjectContainer;
private var old_timer:int = getTimer(); //時間経過用オブジェクト。
// パラメータ(ここはとりあえず仮)
private var sampling:Array = new Array(5);// 1 度に転送するサンプリング数
private var loop:Array = new Array(5);// ループあり
private var loop_begin:Array = new Array(5);// ループ開始地点
private var delay_sampling:Array = new Array(5);// ディレイの時間(サンプリング数)
private var delay_decrease_buf:Array = new Array(5);// ディレイの減衰率 (ディレイバッファに乗算)
private var delay_decrease_src:Array = new Array(5);// ディレイの減衰率(再生ソースに乗算)
//サウンドの指定 読み込む音を配列で示す
private var soundlist:Array = new Array("import/01.mp3","import/02.mp3","import/03.mp3","import/04.mp3","import/05.mp3");
private var url:URLRequest;
private var src_obj:Array = new Array(5);
private var soundchannel:Sprite;
// 出力用サウンドオブジェクト
private var out_obj:Array = new Array(5);
private var channel:Array = new Array(5);
// 波形用ワーク
private var wave:Array = new Array(5);
// ディレイ用ワーク
private var delay:Array = new Array(5);
public function Main() :void {
//中心の円を求める
centercircle.x = 150;
centercircle.y = 150;
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つのオブジェクトとその中心点を求める
for (var j:int=0; j<5; j++)//配列用オブジェクト用 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(20, 20, 20);
object[j].graphics.endFill();
//各オブジェクトの中心点を求める;
ox[j] = object[j].x + object[j].width / 2;
oy[j] = object[j].y + object[j].height / 2;
}
//5つの音発生△とその中心点
for (var t:int=0; t<5; t++)//配列用音発生△用 t
{
sobj[t] = new Sprite();
sobj[t].x = 400;//△の位置x座標
sobj[t].y = 80 * t;//△の位置y座標
addChild(sobj[t]);
//ここで△をつくる
sobj[t].graphics.beginFill(scolortable[t],0.9);
//ここで△をつくる;
sobj[t].graphics.moveTo(25, 0);
sobj[t].graphics.lineTo(0, 50);
sobj[t].graphics.lineTo(50, 50);
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;
//距離計算のファンクション
function calcdistance(x1:int, y1:int, x2:int, y2:int):int
{
return Math.floor(Math.sqrt((x1- x2)*(x1-x2) + (y1-y2)*(y1-y2)));
}
//数値表示イベント
function numberdisplay() :void
{
this.stage.addEventListener(MouseEvent.MOUSE_MOVE)
{
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);
};
}
//ドラッグを始めた時の動作
function startDragging(event:MouseEvent):void
{
draggedObject = DisplayObjectContainer(event.target);
addChild(draggedObject);
event.target.startDrag();
event.target.addEventListener(MouseEvent.MOUSE_UP, stopDragging);
}
//図形を追加 オブジェクトと音△と線
function addobject() :void
{
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 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 (var i:int=0; i<5; i++)
{
ox[i] = object[i].x + object[i].width / 2;
oy[i] = object[i].y + object[i].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 (var j:int=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 (var l:int=0; l<5; l++)
{
if (min > d[l])
{//オブジェクトの中で一番近いものを算出
min = d[l];
minp = l;
}
}
//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]);
for (var t:int=0; t<5; t++)
{
if (event.target == sobj[t])
{
url = new URLRequest(soundlist[t]);
src_obj[t] = null;
src_obj[t] = new Sound(url);
//src_obj[j].play(0,99999);
channel[t]=src_obj[t].play(0,99999);
if(channel[t])
{
var trans:SoundTransform = channel.soundTransform;
trans.volume = min;
channel[t].soundTransform = trans;
}
SoundTransform
}
}
//サウンドを設定する
/////距離が近い音三角をすべてよみこみ、それをすべて再び再生、それ以外は停止 そうすれば、音のズレも解消?
/////でも近いものが二つ以上あると音がだぶる
//url = new URLRequest(soundlist[minp]);
//src_obj[minp]=new Sound(url);
//soundchannel= src_obj[minp].play(0,9999); //9999回再生
}
}
}
}
}