package
{
import flash.display.MovieClip;
import flash.display.Sprite;
import flash.display.StageScaleMode;
import flash.events.Event;
import flash.geom.Point;
import flash.media.Sound;
import flash.media.SoundMixer;
import flash.net.URLRequest;
import flash.utils.ByteArray;
[SWF(width=1200, height=400, backgroundColor=0x000000)]
public class Exp110317_01 extends MovieClip
{
private var loint : Point = new Point(0, 14);
private var meint : Point = new Point(15, 70);
private var hiint : Point = new Point(71, 256);
private var cont : Sprite;
private var lines : Array;
private var sound : Sound;
private var linesNum : int;
public function Exp110317_01()
{
stage.scaleMode = StageScaleMode.NO_SCALE;
cont = new Sprite();
cont.x = 600;
cont.y = 200;
addChild(cont);
lines = [];
linesNum = 123;
for(var i:int = 0; i<linesNum; i++)
{
var wl : WellenLine = new WellenLine();
cont.addChild(wl);
lines.push(wl);
}
sound = new Sound(new URLRequest('44.mp3'));
sound.play(0,999);
addEventListener(Event.ENTER_FRAME, update);
}
private function update(event : Event) : void
{
var arr1:ByteArray = new ByteArray();
var arr2:ByteArray = new ByteArray();
SoundMixer.computeSpectrum(arr1,false);
SoundMixer.computeSpectrum(arr2,true);
var p : Peaks = Analyse.getPeaks(arr2, loint, meint, hiint);
for(var i:int = 0; i<linesNum; i++)
{
var f1 : Number = arr1.readFloat();
arr1.position+=4;
var wl : WellenLine = WellenLine(lines[i]);
wl.moveLine(f1*300);
wl.color = hsv2rgb(f1*150+p.hi*100);
wl.alpha = .2;
}
}
public function hsv2rgb(h:Number, s:Number = 1, v:Number = 1):uint
{
var rgb:uint = 0;
if (s == 0) {
rgb = 0xFF * v << 16 | 0xFF * v << 8 | 0xFF * v << 0;
return rgb;
}
h = h >= 360 ? h % 360 : (h < 0 ? h % 360 + 360 : h);
var i:int = int(h / 60);
var f:Number = h / 60 - i;
var p:Number = v * (1 - s);
var q:Number = v * (1 - s * f);
var t:Number = v * (1 - s * (1 - f));
switch (i) {
case 0: rgb = 0xFF * v << 16 | 0xFF * t << 8 | 0xFF * p << 0; break;
case 1: rgb = 0xFF * q << 16 | 0xFF * v << 8 | 0xFF * p << 0; break;
case 2: rgb = 0xFF * p << 16 | 0xFF * v << 8 | 0xFF * t << 0; break;
case 3: rgb = 0xFF * p << 16 | 0xFF * q << 8 | 0xFF * v << 0; break;
case 4: rgb = 0xFF * t << 16 | 0xFF * p << 8 | 0xFF * v << 0; break;
case 5: rgb = 0xFF * v << 16 | 0xFF * p << 8 | 0xFF * q << 0;
}
return rgb;
}
}
}
import flash.display.Graphics;
import flash.display.Sprite;
import flash.events.Event;
import flash.geom.Point;
import flash.geom.Rectangle;
internal class WellenLine extends Sprite
{
private var points : Array;
private var pointsNum : int;
private var w : int;
private var centerNum : Number;
private var _angle : Number;
private var resultPoints : Array;
private var _color:Number;
public function WellenLine()
{
points = [];
pointsNum = 21;
w = 1200;
centerNum = Math.floor(pointsNum/2);
for (var i : int = 0; i < pointsNum; i++)
{
points.push(new Point(i / (pointsNum-1) * w-w/2, 0));
}
addEventListener(Event.ENTER_FRAME, update);
}
private function update(event : Event) : void
{
graphics.clear();
graphics.lineStyle(.1,color,1);
var prevY : Number = 0.0;
prevY = Point(points[centerNum]).y;
for(var i:int = centerNum-1; i>=0; i-- )
{
var p1 : Point = Point(points[i]);
var p2 : Point = Point(points[(centerNum-i) + centerNum]);
var tmpY : Number = p1.y;
p1.y = prevY;
p2.y = prevY;
prevY = tmpY*.8;
}
drawSmoothLine(points, this.graphics);
}
public function moveLine(y:Number):void
{
Point(points[centerNum]).y = y;
}
public function drawSmoothLine(points:Array, gr:Graphics):void
{
var n:Number = points.length;
var center : Point = new Point();
var start : Point = new Point();
var end : Point = new Point();
var next : Point = new Point();
var cach : Point = new Point();
var p1 : Point = points[0];
var p2 : Point = points[1];
center = points[1];
start = mid(center, points[0]);
end = mid(points[2], center);
for(var i:int = 1; i<=n-2; i++)
{
center = points[i%(n)];
end = mid(points[(i+1)%(n)], center);
gr.moveTo(start.x, start.y);
gr.curveTo(center.x, center.y,end.x, end.y);
start = end;
}
}
public function mid(p1:Point,p2:Point):Point
{
return new Point((p2.x - p1.x) / 2 + p1.x, (p2.y - p1.y) / 2 + p1.y);
}
public function get angle() : Number
{
return _angle;
}
public function set angle(angle : Number) : void
{
_angle = angle;
}
public function get color() : Number
{
return _color;
}
public function set color(color : Number) : void
{
_color = color;
}
}
import flash.geom.Point;
import flash.utils.ByteArray;
class Analyse {
public static function getPeaks(input : ByteArray, lo : Point, me : Point, hi : Point) : Peaks {
var cur : Peaks = new Peaks();
var lowsum : Number = 0;
var medsum : Number = 0;
var hisum : Number = 0;
for (var a : Number = 0; a < 256; a ++) {
if (lo.x < a && a < lo.y) {
lowsum += input.readFloat() * Math.log(a);
}
if (me.x < a && a < me.y) {
medsum += input.readFloat() * Math.log(a);
}
if (hi.x < a && a < hi.y) {
hisum += input.readFloat() * Math.log(a);
}
}
cur.low = lowsum / (lo.y - lo.x);
cur.mid = medsum / (me.y - me.x);
cur.hi = hisum / (hi.y - hi.x);
return cur;
}
}
class Peaks extends Object {
public var low : Number;
public var mid : Number;
public var hi : Number;
public function Peaks(l : Number = 0, m : Number = 0, h : Number = 0) {
low = l;
mid = m;
hi = h;
}
}