/**
* 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;
}
}
}
}
//////ディレイに関する記述ここまで ↑////////
}
}
}