LivePaintwithSound input
曲は夢幻のオルゴール工房さんにて配布されているmp3ファイルを使用しています
http://www.dream-orgel.net/diary.cgi?no=120&continue=on
/**
* Copyright HaraMakoto ( http://wonderfl.net/user/HaraMakoto )
* MIT License ( http://www.opensource.org/licenses/mit-license.php )
* Downloaded from: http://wonderfl.net/c/l1iG
*/
package {
import caurina.transitions.Equations;
import caurina.transitions.Tweener;
import caurina.transitions.properties.DisplayShortcuts;
import com.bit101.components.ColorChooser;
import com.bit101.components.PushButton;
import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.display.Loader;
import flash.display.Sprite;
import flash.events.Event;
import flash.events.MouseEvent;
import flash.geom.Point;
import flash.geom.Rectangle;
import flash.media.Sound;
import flash.media.SoundChannel;
import flash.media.SoundLoaderContext;
import flash.media.SoundMixer;
import flash.media.SoundTransform;
import flash.net.URLRequest;
import flash.system.Security;
import flash.utils.ByteArray;
import flash.utils.getTimer;
/**
* 曲は夢幻のオルゴール工房さんにて配布されているmp3ファイルを使用しています
* http://www.dream-orgel.net/diary.cgi?no=120&continue=on
*/
[SWF(width="465", height="465", backgroundColor="#000000", frameRate=30)]
public class LineWriter extends Sprite
{
private var _field:Sprite = new Sprite();
private var _paintField:Sprite = new Sprite();
private var _uiField:Sprite = new Sprite();
private var _stopUiField:Sprite = new Sprite();
private var _startField:Sprite = new Sprite();
//Clearエフェクト
private var _clearEffBmp:Bitmap = new Bitmap();
private var _clearBmd:BitmapData = new BitmapData(465,465,true,0);
//座標リスト
private var _pointListList:Array = new Array();
private var _currentListIndex:int = 0;
private var _actionFlg:Boolean = true;
/**
* params
*/
private var _col:Number = 0xFFFFFF;
/**
* Sound parts
*/
private var player:Object = new Object();
private var loader:Loader = new Loader();
private var bA:ByteArray;
private var spectrum:Array;
public static var lowVal:Number=0;
public static var middleVal:Number=0;
public static var highVal:Number = 0;
private var sound:Sound;
private var _ch:SoundChannel;
/**
* UI
*/
private var _colSelector:ColorSelector;
private var _colChooser:ColorChooser;
/**
* RECORD
*/
private var _rec:DrawRecoder = new DrawRecoder();
private var _player:DrawPlayer = new DrawPlayer();
/**
* TIMER
*/
private var _startTime:int;
public function LineWriter()
{
init();
setupDisplay();
}
public function init():void {
DisplayShortcuts.init();
Security.loadPolicyFile("http://swimmingbird.heteml.jp/crossdomain.xml");
_field.graphics.clear();
_field.graphics.beginFill(0xCCCCCC,0);
_field.graphics.drawRect(0,0,465,465);
_field.graphics.endFill();
//UI Starting
var _startButton:PushButton = new PushButton(_startField,20,20,"start", startHandler);
//UI Playing
// var _actionBtn:PushButton = new PushButton(_uiField,20,20,"action",actionHandler);
// var _noActionBtn:PushButton = new PushButton(_uiField,20,45,"noAction",noActionHandler);
var _clearBtn:PushButton = new PushButton(_uiField,20,20,"clear",clearHandler);
var _plotBtn:PushButton = new PushButton(_uiField,20,45,"plot",plotHandler);
// var _stopBtn:PushButton = new PushButton(_uiField,20,120,"stop",stopHandler);
//UI Stop
var _playDataBtn:PushButton = new PushButton(_stopUiField,20,20,"play data",playDataHandler);
var _stopDrawBtn:PushButton = new PushButton(_stopUiField,20,45,"stop",stopDrawHandler);
_colSelector = new ColorSelector();
// _colChooser = new ColorChooser(_uiField,20,145);
//Effect Init
_clearEffBmp.bitmapData = _clearBmd;
_clearEffBmp.visible = false;
_clearEffBmp.alpha = 0;
// sound = new Sound(new URLRequest("data/stars_long.mp3"), new SoundLoaderContext(10000, true));
sound = new Sound(new URLRequest("http://swimmingbird.heteml.jp/wonderfl/sounds/stars_long.mp3"), new SoundLoaderContext(10000, true));
}
private function musicStart():void {
// sound = new Sound(new URLRequest("http://level0.kayac.com/images/murai/DJ%20Dolores%20-%20Oslodum%202004.mp3"), new SoundLoaderContext(10000, true));
// sound = new Sound(new URLRequest("data/stars.mp3"), new SoundLoaderContext(10000, true));
_ch = sound.play();
bA = new ByteArray();
// stage.quality = StageQuality.LOW;
stage.fullScreenSourceRect=new Rectangle(0,0,465,465);
addEventListener(Event.ENTER_FRAME, updateSpectrum);
//timer start
_startTime = getTimer();
/**
* action setup
*/
_field.addEventListener(MouseEvent.MOUSE_DOWN, _fieldDownHandler);
_field.addEventListener(MouseEvent.MOUSE_UP, _fieldUpHandler);
_field.addEventListener(Event.ENTER_FRAME, _enterFrameHandler);
//Play Draw
_player.addEventListener(DrawPlayer.DO_ROOT, _rootEventHandler);
_player.addEventListener(DrawPlayer.DO_NODE, _nodeEventHandler);
_player.addEventListener(DrawPlayer.DO_CLEAR, _clearEventHandler);
}
public function setupDisplay():void {
addChild(_paintField);
addChild(_field);
addChild(_clearEffBmp);
addChild(_uiField);
addChild(_stopUiField);
addChild(_startField);
_uiField.addChild(_colSelector);
_colSelector.x = 20;
_colSelector.y = 85;
_stopUiField.visible = false;
_uiField.visible = false;
_stopUiField.alpha = 0;
}
/**
* mouse Action
*/
private function _fieldDownHandler(event:MouseEvent):void {
addRoot();
_col = _colSelector.currentColor;
_field.addEventListener(MouseEvent.MOUSE_MOVE, _fieldMoveHandler);
var currentTime:int = getTimer() - _startTime;
var id:int=0;
_rec.startLineRec(id,mouseX,mouseY,_colSelector.currentColor,currentTime);
}
private function _fieldUpHandler(event:MouseEvent):void {
//今書いたものにベクトル情報追加
_field.removeEventListener(MouseEvent.MOUSE_MOVE, _fieldMoveHandler);
}
private function _fieldMoveHandler(event:MouseEvent):void {
addNode(_field.mouseX, _field.mouseY);
//rec
var currentTime:int = getTimer() - _startTime;
_rec.addPoint(_field.mouseX, _field.mouseY, currentTime);
}
/**
* play Action
*/
private function _rootEventHandler(event:Event):void {
addRoot();
_col = _player.cur_Col;
}
private function _nodeEventHandler(event:Event):void {
addNode(_player.cur_x, _player.cur_y);
}
private function _clearEventHandler(event:Event):void {
clear();
}
/**
* node Action
*/
private function addRoot():void {
_currentListIndex = _pointListList.length;
_pointListList.push(new Array());
}
private function addNode(px:Number, py:Number):void {
var _list:Array = _pointListList[_currentListIndex];
_list.push(new LinePoint(px, py));
var i:int = _list.length-1;
_list[i].color = _col;
if(_list[i-1]) {
var _pt:LinePoint = _list[i];
var _dx:Number = _list[i].x - _list[i-1].x;
var _dy:Number = _list[i].y - _list[i-1].y;
var _distance:Number = Math.sqrt(_dx*_dx+_dy*_dy);
_pt.vx = _list[i].x - _list[i-1].x;
_pt.vy = _list[i].y - _list[i-1].y;
// _pt.vx = _dx/_distance;
// _pt.vy = _dy/_distance;
_pt.genRotation();
}
}
private function _enterFrameHandler(event:Event):void {
var i:int;
var len:int = _pointListList.length;
_paintField.graphics.clear();
_paintField.graphics.lineStyle(1,0xFFFFFF);
var _list:Array;
var j:int;
var _listlen:int;
var nx:Number;
var ny:Number;
var dist:Number;
if(_actionFlg) {
for(i=0; i<len; i++) {
_list = _pointListList[i];
_listlen = _list.length;
if(_listlen>0) {
_paintField.graphics.lineStyle(1,_list[0].color);
_paintField.graphics.moveTo(_list[0].x, _list[0].y);
//スペクトラムずらす
for(j=_listlen-1;j>0;j--) {
_list[j].spectrum = _list[j-1].spectrum;
}
_list[0].spectrum = spectrum[10];
for(j=0;j<_listlen;j++) {
// _paintField.graphics.moveTo(_list[j].x, _list[j].y);
if(_list[j].r){
nx = -(_list[j].vy);
ny = _list[j].vx;
dist = Math.sqrt(nx*nx+ny*ny);
// _list[j].spectrum = spectrum[j];//スペクトラム直でまっぴんぐ
_paintField.graphics.lineTo(_list[j].x+nx*_list[j].spectrum*7, _list[j].y+ny*_list[j].spectrum*7);
// _paintField.graphics.lineTo(_list[j].x+_list[j].spectrum*2*nx/dist, _list[j].y+40*_list[j].spectrum*2*ny/dist);
}
}
}
}
} else {
for(i=0; i<len; i++) {
_list = _pointListList[i];
_listlen = _list.length;
if(_listlen>0) {
_paintField.graphics.moveTo(_list[0].x, _list[0].y);
for(j=0;j<_listlen;j++) {
_paintField.graphics.lineTo(_list[j].x, _list[j].y);
}
}
}
}
}
private function updateSpectrum(e:Event):void {
SoundMixer.computeSpectrum(bA,false,0);
spectrum = [];
var i:int;
for(i=0; i<256; i++){
spectrum[i] = bA.readFloat();
}
for(i=256; i<512; i++){
spectrum[i] = bA.readFloat();
}
bA.position=0;
lowVal = spectrum[0];
middleVal = spectrum[1];
highVal = spectrum[2];
}
/**
* ui Action
*/
private function startHandler(event:MouseEvent):void {
_startField.visible = false;
_uiField.visible = true;
musicStart();
}
private function actionHandler(event:MouseEvent):void {
_actionFlg = true;
}
private function noActionHandler(event:MouseEvent):void {
_actionFlg = false;
}
private function clearHandler(event:MouseEvent):void {
_rec.addClear(getTimer()-_startTime)
clear();
}
private function plotHandler(event:MouseEvent):void {
_rec.outPut();
}
private function stopHandler(event:MouseEvent):void {
_ch.stop();
clear();
_player.setCommandList(_rec.commandList);
Tweener.addTween(_uiField, {_autoAlpha:0, time:0.5, transition:Equations.easeOutQuint});
Tweener.addTween(_stopUiField, {_autoAlpha:1, time:0.5, transition:Equations.easeOutQuint});
}
private function playDataHandler(event:MouseEvent):void {
_ch = sound.play(0);
_player.playStart();
}
private function stopDrawHandler(event:MouseEvent):void {
clear();
_ch.stop();
_player.playStop();
}
public var clearCnt:Number = 0;
private function clear():void {
_clearBmd.fillRect(new Rectangle(0,0,465,465),0);
_clearBmd.draw(_paintField);
_clearEffBmp.visible = true;
_clearEffBmp.alpha = 1;
_clearEffBmp.scaleX = _clearEffBmp.scaleY = 1;
Tweener.addTween(_clearEffBmp, {/*scaleX:2, scaleY:2, */_autoAlpha:0, time:1, transition:Equations.easeOutQuint});
clearComp();
// var i:int;
// var len:int = _pointListList.length;
// var _list:Array;
// var _listlen:int;
// var j:int;
// var nx:int, ny:int;
// for(i=0; i<len; i++) {
// _list = _pointListList[i];
// _listlen = _list.length;
// for(j=0;j<_listlen;j++) {
// _list[j].endAction();
// }
// }
// Tweener.addTween(this, {clearCnt:10, time:0.8, transition:Equations.easeOutQuint, onComplete:clearComp});
}
private function clearComp():void {
var i:int;
var len:int = _pointListList.length;
var _list:Array;
var _listlen:int;
var j:int;
var nx:int, ny:int;
for(i=0; i<len; i++) {
_list = _pointListList[i];
_listlen = _list.length;
for(j=0;j<_listlen;j++) {
_list[j] = null;
}
}
for(i=0; i<len; i++) {
_list = _pointListList[i];
_list.length = 0;
_list = null;
}
_pointListList.length = 0;
_pointListList = new Array();
}
}
}
import caurina.transitions.Equations;
import caurina.transitions.Tweener;
import com.adobe.serialization.json.JSON;
import flash.display.Sprite;
import flash.events.Event;
import flash.events.MouseEvent;
import flash.events.TimerEvent;
import flash.external.ExternalInterface;
import flash.geom.Point;
import flash.utils.Timer;
import flash.utils.getTimer;
import org.osmf.events.TimeEvent;
class LinePoint extends Point {
public var vx:Number, vy:Number, r:Number;
public var spectrum:Number = 0;
public var color:Number;
public function LinePoint(x:Number=0, y:Number=0) {
super(x,y);
}
public function genRotation():void {
r = Math.atan2(vy, vx);
}
public function endAction():void {
var _targetSp:Number = spectrum * 20;
Tweener.addTween(this, {spectrum:_targetSp, time:0.5, transition:Equations.easeOutQuint});
}
}
class ColorSelector extends Sprite {
public var colorList:Array = new Array();
public var currentColor:Number = 0xFFFF32;
private var _colTotal:int = 5;
private var _selectedColor:Sprite = new Sprite();
public function ColorSelector() {
init();
setupDisplay();
}
public function init():void {
var i:int;
for(i=0; i<_colTotal; i++) {
var block:Sprite = new Sprite();
// block.name = String(0xFF0000*Math.random());
block.addEventListener(MouseEvent.CLICK, selectedHandler);
colorList.push(block);
}
colorList[0].name = String(0xFFFF32);
colorList[1].name = String(0xFFFF99);
colorList[2].name = String(0xFFFFCD);
colorList[3].name = String(0xFFCC32);
colorList[4].name = String(0xFFCC00);
for(i=0; i<_colTotal; i++) {
colorList[i].graphics.clear();
colorList[i].graphics.beginFill(Number(colorList[i].name));
colorList[i].graphics.drawRect(0,0,10,10);
colorList[i].graphics.endFill();
}
currentColor = Number(colorList[0].name);
_selectedColor.graphics.beginFill(currentColor);
_selectedColor.graphics.drawRect(0,0,19,19);
_selectedColor.graphics.endFill();
}
public function setupDisplay():void {
addChild(_selectedColor);
for(var i:int=0; i<_colTotal; i++) {
addChild(colorList[i]);
colorList[i].x = i*(colorList[i].width+1);
colorList[i].y = 20;
}
}
private function selectedHandler(event:MouseEvent):void {
_selectedColor.graphics.clear();
currentColor = Number(event.target.name);
_selectedColor.graphics.beginFill(currentColor);
_selectedColor.graphics.drawRect(0,0,19,19);
_selectedColor.graphics.endFill();
}
}
class DrawPlayer extends Sprite {
public static const DO_ROOT:String = "DoRoot";
public static const DO_NODE:String = "DoNode";
public static const DO_CLEAR:String = "DoClear";
private var _commandList:Array;
private var _timer:Timer = new Timer(1);
private var _rootIndex:int = 0;
private var _nodeIndex:int = 0;
private var _counter:int = 0;
private var _watchTarget:int = 0; //0:親, 1:子
//現在の命令
public var cur_Command:int = 0; //0:親, 1:子
public var cur_Col:Number;
public var cur_x:Number;
public var cur_y:Number;
//timer
private var _startTime:Number;
public function DrawPlayer() {
super();
}
public function setCommandList(list:Array):void {
_commandList = list;
}
public function playStart():void {
_counter = 0;
_rootIndex = 0;
_nodeIndex = 0;
_startTime = getTimer();
addEventListener(Event.ENTER_FRAME, _commandCheckHandler);
}
public function playStop():void {
removeEventListener(Event.ENTER_FRAME, _commandCheckHandler);
}
private function _commandCheckHandler(event:Event):void {
_counter = getTimer()-_startTime;
//まだ終わってなかったら終わる
if(_rootIndex == _commandList.length) {
if(hasEventListener(Event.ENTER_FRAME))removeEventListener(Event.ENTER_FRAME, _commandCheckHandler);
return;
}
if(_watchTarget==0) {
if(_commandList[_rootIndex].time<=_counter) {
switch(_commandList[_rootIndex].type) {
case "clear":
_watchTarget = 0;
dispatchEvent(new Event(DO_CLEAR));
_rootIndex++;
break;
case "draw":
cur_Col = _commandList[_rootIndex].col;
cur_x = _commandList[_rootIndex].fx;
cur_y = _commandList[_rootIndex].fy;
dispatchEvent(new Event(DO_ROOT));
_watchTarget = 1;
break;
}
}
} else {
var obj:Object = _commandList[_rootIndex][_nodeIndex];
//マウス動かなかった時は親にそのまま向ける
if(!_commandList[_rootIndex].childlist[_nodeIndex]){
_rootIndex++;
_nodeIndex=0;
_watchTarget=0;
return;
}
if(_commandList[_rootIndex].childlist[_nodeIndex].time<=_counter) {
cur_x = _commandList[_rootIndex].childlist[_nodeIndex].x;
cur_y = _commandList[_rootIndex].childlist[_nodeIndex].y;
dispatchEvent(new Event(DO_NODE));
_nodeIndex++;
//最後尾到達で親監視に切り替え
if(_nodeIndex==_commandList[_rootIndex].length-1) {
//親も最後尾なら終了
if(_rootIndex==_commandList.length-1) {
_timer.removeEventListener(TimerEvent.TIMER, _commandCheckHandler);
_timer.stop();
return;
} else {
_watchTarget = 0;
_rootIndex++;
}
}
}
}
}
private function _commandCheck():void{
}
}
class DrawRecoder extends Sprite {
private var _commandList:Array = new Array();
public function get commandList():Array {
return _commandList;
}
public function DrawRecoder() {
}
public function startLineRec(_id:int,_mx:Number,_my:Number,_col:Number, _time:Number):void {
_commandList.push({type:"draw", id:_id,fx:_mx, fy:_my, col:_col, time:_time, childlist:new Array()});
}
public function addPoint(_mx:Number, _my:Number, _time:Number):void {
var _currentList:Array = _commandList[_commandList.length-1].childlist;
_currentList.push({x:_mx, y:_my, time:_time});
}
public function addClear(_time:Number):void {
_commandList.push({type:"clear", time:_time});
}
public function endLineRec():void {
}
public function outPut():void {
var i:int;
var j:int;
// ExternalInterface.call("console.log",Dumper.parse(_commandList));
ExternalInterface.call("console.log",JSON.encode(_commandList));
// trace(Dumper.parse(_commandList));
}
}