forked from: soundtest16
forked from soundtest16 (diff: 103)
step or gap changed time for tween changed
ActionScript3 source code
/**
* Copyright aobyrne ( http://wonderfl.net/user/aobyrne )
* MIT License ( http://www.opensource.org/licenses/mit-license.php )
* Downloaded from: http://wonderfl.net/c/mobR
*/
package
{
import caurina.transitions.properties.ColorShortcuts;
import caurina.transitions.Tweener;
import com.bit101.components.CheckBox;
import com.bit101.components.HUISlider;
import com.bit101.components.VBox;
import flash.display.Graphics;
import flash.display.Shape;
import flash.display.Sprite;
import flash.display.StageScaleMode;
import flash.events.Event;
import flash.events.MouseEvent;
import flash.media.SoundMixer;
import flash.text.TextField;
import flash.utils.ByteArray;
/**
* ...
* @author gaina
*/
[SWF(width="465",height="465",frameRate="30")]
public class SoundTest16Bis extends Sprite
{
private var QTY:int = 8;
private var _array:Array;
private var _sp:Sprite;
private var _sp_switch:Boolean = true;
private var _line:Array;
private var _line_switch:Boolean = true;
private var _blend_swicth:Boolean = true;
private var gapChkBx:CheckBox;
private var _isGap:Boolean;
private var gap:Number;
private var tweenTime:HUISlider;
private var thresholdFactor:Number;
private var hasDrawn:Boolean;
private var sprite:Sprite;
public function SoundTest16Bis():void
{
if (stage) init();
else addEventListener(Event.ADDED_TO_STAGE, init);
}
private function init(e:Event = null):void
{
removeEventListener(Event.ADDED_TO_STAGE, init);
stage.scaleMode = StageScaleMode.NO_SCALE;
ColorShortcuts.init();
_line = LineCircles();
_array = Circles();
var _sound:PlaySound = new PlaySound("http://www.takasumi-nagai.com/soundfiles/sound007.mp3");
_sp = new Sprite();
_sp.graphics.beginFill(0xFF0000);
_sp.graphics.drawRect(0, 0, stage.stageWidth, stage.stageHeight);
_sp.graphics.endFill();
addChild(_sp);
_sp.blendMode = "invert";
_sp.addEventListener(MouseEvent.CLICK, BlendSwitch);
addEventListener(Event.ENTER_FRAME, loop);
var vbox:VBox = new VBox(this, 0, 0);
tweenTime = new HUISlider(vbox, 0, 0, 'tween time');
tweenTime.value = 0.5;
tweenTime.maximum = 2;
gapChkBx = new CheckBox(vbox, 0, 0, '64/128',onGap);
gapChkBx.selected = isGap = false; gapChkBx.label = '128';
//gapChkBx.selected =isGap = true;gapChkBx.label = '64';
sprite = addChild(new Sprite) as Sprite;
setChildIndex(sprite, 0);
}
private function onGap(e:Event):void
{
isGap = CheckBox(e.target).selected;
CheckBox(e.target).label = isGap?'64': '128';
hasDrawn = false;
while (sprite.numChildren)
{
sprite.removeChildAt(sprite.numChildren - 1);
}
sprite.graphics.clear();
}
private function loop(e:Event):void
{
var factor:Number = 0.40;
var _byte:ByteArray = new ByteArray();
SoundMixer.computeSpectrum(_byte, true, 0);
var amount:int = 32;
//4 per float, 4 floats per coordinate and 2 coordinates per loop
var bytesReadPerLoop:int = 4 * 1 * 1;
var bytesRead:int = bytesReadPerLoop * amount;
for (var i:int = 0; i < QTY; i++) {
var ini:int =_byte.position = i * gap;
//trace( "_byte.position : " + _byte.position );
var p:Number = 0;
var q:Number = 0;
for (var j:int = 0; j < amount; j++) {
p += _byte.readFloat();
if (i == 0) {
q = Math.max(0.3, p / 14);
}else {
q = Math.max(0.3, p / 4);
}
if (i == 6 && p > thresholdFactor*3.5) {
SwitchColor();
}
if (i == 7 && p > thresholdFactor*3) {
VisibleSwicth();
}
}
var number:Number = QTY * bytesRead;
trace( "number : " + number );
//trace( "_byte.position : " + _byte.position );
//trace( "----------------------------------- ");
Tweener.addTween(_array[i] as Sprite, { scaleX:q, scaleY:q, time:tweenTime.value } );
Tweener.addTween(_line[i] as Sprite, { scaleX:q, scaleY:q, time:tweenTime.value } );
if (!hasDrawn) {
var lineSize:Number = 110;
var g:Graphics = sprite.graphics;
g.lineStyle(0);
g.beginFill(0xffffff * Math.random(), 0.62);
var xx:Number = 10 + 50 * (i % 2);
var yy:Number = ini * factor;
var xxgap:Number = 4 * Math.random() - 8;
g.drawRect(xx + xxgap, yy + 2, 20 + Math.random() * 10 - 2 * xxgap, bytesRead * factor - 4);
trace( "bytesRead : " + bytesRead );
var textField:TextField = new TextField;
textField.text = i.toString();
textField.x = xx;
textField.y = yy;
textField.selectable = false;
sprite.addChild(textField);
g.lineStyle(2);
g.endFill();
g.moveTo(0, yy);
g.lineTo(lineSize, yy);
trace( "_byte.position : " + _byte.position );
trace( "range : " + (_byte.position -ini));
var number1:Number = 16 * 32;
g.lineStyle(NaN)
g.beginFill(0);
g.drawRect(lineSize, 0, 10, 1024 * factor);
g.endFill();
}
}
hasDrawn = true;
//removeEventListener(Event.ENTER_FRAME, loop);
}
private function SwitchColor():void
{
if (_sp_switch) {
Tweener.addTween(_sp, {_color:0x000000 } );
_sp_switch = false;
} else {
Tweener.addTween(_sp, {_color:Math.random()*0xFFFFFF } );
_sp_switch = true;
}
}
private function VisibleSwicth():void
{
if (_line_switch) {
for (var i:int = 0; i < QTY; i++) {
_array[i].visible = false;
_line[i].visible = true;
}
_line_switch = false;
} else {
for (var j:int = 0; j < QTY; j++) {
_array[j].visible = true;
_line[j].visible = false;
}
_line_switch = true;
}
}
private function BlendSwitch(e:MouseEvent):void
{
if (_blend_swicth) {
_sp.blendMode = "screen";
_blend_swicth = false;
} else {
_sp.blendMode = "invert";
_blend_swicth = true;
}
}
private function Circles():Array
{
var _arr:Array = [];
for (var i:int = 0; i < QTY; i++)
{
var _radius:Number = 465 - 465 / QTY * i;
var _circle:Sprite = new Sprite();
_circle.graphics.beginFill(0);
_circle.graphics.lineStyle(2, 0xFFFFFF);
_circle.graphics.drawCircle(0, 0, _radius);
_circle.graphics.endFill();
_circle.x = stage.stageWidth / 2;
_circle.y = stage.stageHeight / 2;
addChild(_circle);
_arr.push(_circle);
}
return _arr;
}
private function LineCircles():Array
{
var _arr:Array = [];
for (var i:int = 0; i < QTY; i++)
{
var _radius:Number = 465 - 465 / QTY * i;
var _circle:Sprite = new Sprite();
_circle.graphics.lineStyle(2, 0);
_circle.graphics.drawCircle(0, 0, _radius);
_circle.graphics.endFill();
_circle.x = stage.stageWidth / 2;
_circle.y = stage.stageHeight / 2;
addChild(_circle);
_arr.push(_circle);
}
return _arr;
}
public function get isGap():Boolean
{
return _isGap;
}
public function set isGap(value:Boolean):void
{
gap = value?64:128;
thresholdFactor = value?1:0.1;
tweenTime.value = value?1:2;
_isGap = value;
}
}
}
import flash.events.Event;
import flash.media.Sound;
import flash.media.SoundLoaderContext;
import flash.media.SoundTransform;
import flash.net.URLRequest;
class PlaySound
{
private var sound:Sound;
public function PlaySound(url:String)
{
sound = new Sound();
var _context:SoundLoaderContext = new SoundLoaderContext(1000, true);
sound.addEventListener(Event.COMPLETE, SoundLoadeComplete);
sound.load(new URLRequest(url), _context);
}
private function SoundLoadeComplete(e:Event):void
{
sound.play(0, 10, new SoundTransform(0.3, 0));
}
}