/**
* Copyright kappa-lab ( http://wonderfl.net/user/kappa-lab )
* MIT License ( http://www.opensource.org/licenses/mit-license.php )
* Downloaded from: http://wonderfl.net/c/sbqd
*/
package
{
import caurina.transitions.Tweener;
import com.bit101.components.*;
import flash.display.*;
import flash.events.*;
import flash.media.*;
import flash.utils.ByteArray;
/**
* ...
* @author gk
*/
public class Main2 extends Sprite
{
private var _mic:Microphone;
private var _cam:Camera;
private var _vid:Video;
private var _g:Graphics;
private var _recorders:Vector.<RecUnit>;
private var _vjCnt:Sprite
public function Main2()
{
if (stage) init();
addEventListener(Event.ADDED_TO_STAGE,init)
}
private function init(e:Event=null):void
{
removeEventListener(Event.ADDED_TO_STAGE, init);
stage.scaleMode = "noScale";
stage.align = "topLeft";
_mic = Microphone.getMicrophone();
_mic.rate = 44;
_mic.setSilenceLevel(0);
_cam = Camera.getCamera();
_vid = new Video(_cam.width, _cam.height);
_vid.attachCamera(_cam);
addChild(_vid);
_recorders = new Vector.<RecUnit>();
logger = new Text(this, 600);
_cam.addEventListener(ActivityEvent.ACTIVITY, onActivity);
}
private function onActivity(e:ActivityEvent):void
{
log(e);
_cam.removeEventListener(ActivityEvent.ACTIVITY, onActivity);
Tweener.addCaller(this, { time:1, count:1, onComplete:startRecordUnits } );
}
private function startRecordUnits():void
{
var scale:Number = 1
var ru:RecUnit = new RecUnit();
_recorders.push(ru)
ru.addEventListener(Event.COMPLETE, onRecorded)
ru.record(_mic, _vid);
var count:int = _recorders.length;
ru.scaleX = ru.scaleY = scale;
addChild(ru).y = 300 + (_vid.height * scale + 10) * (count - 1);
}
private function onRecorded(e:Event):void
{
//RecUnit(e.target).playImage(true);
//RecUnit(e.target).playSound();
if (_recorders.length <= 2) {
startRecordUnits();
}else {
_vjCnt = addChild(new Sprite()) as Sprite;
_vjCnt.x = 200;
_vjCnt.scaleX = _vjCnt.scaleY = 2;
master = new Master(_recorders)
master.initVJ(_vjCnt);
master.play()
}
}
}
}
import caurina.transitions.Tweener;
import com.bit101.components.Text;
import flash.display.*;
import flash.events.*;
import flash.media.*;
import flash.net.URLRequest;
import flash.utils.ByteArray;
internal var logger:Text
internal function log(...arg):void
{
var str:String=""
for each(var p:* in arg) str += p.toString() + ", "
logger.text = str
}
class RecUnit extends Sprite
{
private var _mic:Microphone;
private var _vid:Video;
public var original:Vector.<Number>;
public var detects:Vector.<Vector.<Number>>;
public var imageQue:Vector.<Vector.<int>>;
public var compless:Vector.<Number>;
public var strech:Vector.<Number>;
public var reverse:Vector.<Number>;
public var images:Vector.<DisplayObject>;
public var imgCnt:Sprite;
public var scope:Shape;
private static var _totalRec:int = 0;
private var _id:int;
private var _indexImage:int;
private var _totalImage:int;
private var _lastImage:DisplayObject;
private var _g:Graphics;
private var _loopImage:Boolean;
private var _loopSound:Boolean;
public const REC_DURATION:Number = 3;
private var _endImage:int;
private var _startImage:int;
public function RecUnit()
{
_id = _totalRec;
_totalRec++;
_indexImage = 0;
imgCnt = addChild(new Sprite()) as Sprite;
scope = addChild(new Shape()) as Shape;
scope.scaleX = .005;
_g = scope.graphics;
_g.lineStyle(1, 0xFF0000);
_g.lineTo(REC_DURATION*44100,0)
_g.lineStyle(1, 0);
_g.moveTo(0, 0);
}
public function record(mic:Microphone, vid:Video):void
{
_mic = mic;
_vid = vid;
log("REC START:" + _id);
original = new Vector.<Number>();
detects = new Vector.<Vector.<Number>>();
imageQue = new Vector.<Vector.<int>>();
compless = new Vector.<Number>();
strech = new Vector.<Number>();
images = new Vector.<DisplayObject>();
mic.addEventListener(SampleDataEvent.SAMPLE_DATA, recSound);
vid.addEventListener(Event.EXIT_FRAME, recImage);
scope.x = vid.width;
scope.y = vid.height * .5;
}
private function recordComplete():void
{
//reverse = original.slice(0, len - 1).reverse();
//reverse.fixed = true;
compless.fixed = true;
analizeSound()
_totalImage = images.length;
log("REC FINISH:" + _id);
dispatchEvent(new Event(Event.COMPLETE));
}
public function playSound(loop:Boolean=false):void
{
var s:Sound = new Sound();
s.addEventListener(SampleDataEvent.SAMPLE_DATA, writeData);
var i:int = 0;
var sampleLegth:int = original.length;
var len:int = 0;
function writeData(se:SampleDataEvent):void {
len += 8192;
if (len >= sampleLegth) {
len = sampleLegth;
if (!_loopSound) {
s.removeEventListener(SampleDataEvent.SAMPLE_DATA, writeData)
}else {
}
}
for (i; i < len; i++){
var smp:Number = original[i];
se.data.writeFloat(smp);
se.data.writeFloat(smp);
}
}
s.play();
}
public function stopSound():void
{
}
public function hideAll():void
{
for each(var img:DisplayObject in images) img.visible = false;
}
public function playImage(loop:Boolean=false):void
{
hideAll();
_lastImage = images[_indexImage];
_loopImage = loop
addEventListener(Event.ENTER_FRAME,onPlayImage)
}
private function onPlayImage(e:Event):void
{
_lastImage.visible = false;
images[_indexImage].visible = true;
_lastImage = images[_indexImage];
_indexImage = (++_indexImage) % _totalImage;
if (_indexImage >= _totalImage-1 && !_loopImage) stop();
}
public function playImageByRage(start:int, end:int):void
{
_startImage = _indexImage = start;
_endImage = end;
hideAll();
_lastImage = images[_indexImage];
addEventListener(Event.ENTER_FRAME,onPlayImageByRage)
}
private function onPlayImageByRage(e:Event):void
{
_lastImage.visible = false;
images[_indexImage].visible = true;
_lastImage = images[_indexImage];
_indexImage++;
if (_indexImage >= _endImage )stop();
}
public function playDetects(index:int):void
{
master.addVoice(detects[index]);
//playImage();
playImageByRage(imageQue[index][0], imageQue[index][1]);
}
public function stop():void
{
removeEventListener(Event.ENTER_FRAME, onPlayImage);
removeEventListener(Event.ENTER_FRAME, onPlayImageByRage);
}
private function recImage(e:Event):void
{
var v:Video = e.target as Video
var bmd:BitmapData = new BitmapData(v.width, v.height, true, 0);
bmd.draw(v)
var bm:Bitmap = new Bitmap(bmd);
images.push(bm);
imgCnt.addChild(bm);
}
private function recSound(e:SampleDataEvent):void
{
var len:int = e.data.length/4;
var i:int;
var offset:int = original.length;
for (i = 0; i < len ; i++) {
var smp:Number = e.data.readFloat()
original.push(smp);
if (i % 2 == 0) compless.push(smp);
_g.lineTo((offset + i), smp * 30);
}
if(offset+i > REC_DURATION*44100){
_mic.removeEventListener(SampleDataEvent.SAMPLE_DATA, recSound);
_vid.removeEventListener(Event.EXIT_FRAME, recImage);
recordComplete();
}
}
private function analizeSound():void
{
//_g.lineStyle(NaN);
var len:int = original.length;
var pre:Number = 0;
var p1:int = 0;
var p2:int = 0;
var thresh:Number = 0.03;
var d:Vector.<Number>;
var img:Vector.<int>;
var c:int = 0;
var i:int = 0;
for (i; i < len; i++)
{
var smp:Number = original[i];
strech.push((smp - pre) * .5 + pre);
strech.push(smp);
pre = smp;
if (p1 == 0 && (smp > thresh || smp < -thresh)) {
p1 = i;
d = new Vector.<Number>();
img = new Vector.<int>();
img.push(int(i / len * images.length));
}else if(p1 > 0 && p2==0 && (smp < thresh || smp > -thresh)){
p2 = i;
}else if(p2 > 0 && (smp > thresh || smp < -thresh)){
p2 = 0;
}else if (p2 > 0 && i - p2 > 1000) {
if(i-p1 > 2000) close();
p1 = p2 = 0;
}else if (p1>0 && i - p1 > 10000) {
p2 = i;
close();
p1 = p2 = 0;
}
if (d) d.push(smp);
}
function close():void
{
_g.beginFill(0xFF0000, .5);
_g.drawRect(p1, -30, p2-p1, 60);
_g.endFill()
img.push(int(i / len * images.length));
imageQue.push(img)
detects.push(d);
c++;
}
if (p1 > 0) {
p2 = len - 1;
close();
}
if (c == 0) {
p1 = 0;
p2 = i = 3000;
d = original.slice(0,i);
img = new Vector.<int>();
img.push(int(p1));
close()
}
trace("c",c)
}
public function get id():int { return _id; }
}
internal var master:Master;
class Master
{
public var latency:int = 8000;
private var _position:int;
private var _sound:Sound;
private var _stack:Vector.<Vector.<Number>>;
private var _callback:Function;
private var _units:Vector.<RecUnit>;
private var _voice:Vector.<Vector.<Number>>;
private var _count:int;
private var _loop:int;
private var _metro:Vector.<Number>;
private var _metro2:Vector.<Number>;
private var _score:Array;
public function Master(units:Vector.<RecUnit>,callback:Function=null)
{
_count = 0;
_units = units;
_callback = callback;
_metro = new Vector.<Number>();
_metro2 = new Vector.<Number>();
for (var i:int = 0; i < 1000; i++) {
_metro.push(Math.sin(i * .5)*.01);
_metro2.push(Math.sin(i * .2)*.01);
}
_stack = new Vector.<Vector.<Number>>();
_sound = new Sound();
_sound.addEventListener(SampleDataEvent.SAMPLE_DATA, onSampleData);
makeScore();
}
public function play():void
{
_sound.play();
}
public function initVJ(container:DisplayObjectContainer):void
{
for each(var u:RecUnit in _units)
{
container.addChild(u.imgCnt)
u.imgCnt.visible
}
}
public function makeScore():void
{
trace("makescore")
_score =
[
[[15, .3, .4]],
[[3, .3, .4]],
[[2, .3, .4]],
[[1, .3, .4]],
[[5, .3, .4]],
[[8, .3, .4]],
[[10, .3, .4]],
[[12, .3, .4]],
[[15, .3, .4]],
[[11, .3, .4]],
[[9, .3, .4]],
[[7, .3, .4]],
[[6, .3, .4]],
[[18, .3, .4]],
[[19, .3, .4]],
[[13, .3, .4]]
];
//return
_score = [];
for (var i:int = 0; i < 16; i++)
{
_score[i] = [];
for (var i2:int = 0; i2 < 3; i2++)
{
if (Math.random() > .4) {
var unit:int = Math.random() * _units.length
var detect:int = Math.random() * _units[unit].detects.length;
_score[i].push([unit, detect])
}
}
trace(i,_score[i]);
}
}
public function addVoice(v:Vector.<Number>):Number
{
return _stack.push(v.slice(0,v.length-1).reverse());
}
private function onSampleData(e:SampleDataEvent):void
{
nextQue();
var len:int = _stack.length;
var i2:int = 0
for (var i:int = 0; i < latency; i++)
{
var smp:Number = 0;
for (i2 = 0; i2 < len; i2++)
{
var v:Vector.<Number> = _stack[i2];
if(v.length>0)smp += v.pop()
}
e.data.writeFloat(smp);
e.data.writeFloat(smp);
}
var v2:Vector.<Vector.<Number>> = new Vector.<Vector.<Number>>()
for (i2 = 0; i2 < len; i2++)
{
v = _stack[i2];
if (v.length > 0)v2.push(v)
}
_stack = v2;
_count++;
_loop++;
if (_loop >= 16 * 11) {
_loop = 0;
makeScore();
}
}
private function nextQue():void
{
if (_count % 8 == 0) {
addVoice(_metro);
}
if (_count % 32 == 0) {
addVoice(_metro2);
}
if (_loop < 32 && _count % 8 != 0) return;
if (_loop < 64 && _count % 4 != 0) return;
if (_loop < 128 && _count % 2 != 0) return;
var ary:Array = _score[_count % 16];
for each(var p:Array in ary) {
var unit:int = p[0];
var detect:int = p[1];
_units[unit].playDetects(detect);
}
if (ary.length != 0) {
for each(var r:RecUnit in _units) {
r.imgCnt.visible = false;
}
}
if (ary.length == 1) {
_units[ary[0][0]].imgCnt.visible = true;
_units[ary[0][0]].imgCnt.scaleX = 1;
_units[ary[0][0]].imgCnt.x = 0;
}else if (ary.length == 2) {
_units[ary[0][0]].imgCnt.visible = true;
_units[ary[0][0]].imgCnt.scaleX = .5;
_units[ary[0][0]].imgCnt.x = 0;
_units[ary[1][0]].imgCnt.visible = true;
_units[ary[1][0]].imgCnt.scaleX = .5;
_units[ary[1][0]].imgCnt.x = _units[ary[1][0]].imgCnt.width;
}else if (ary.length == 3) {
_units[ary[0][0]].imgCnt.visible = true;
_units[ary[0][0]].imgCnt.scaleX = .33;
_units[ary[0][0]].imgCnt.x = 0;
_units[ary[1][0]].imgCnt.visible = true;
_units[ary[1][0]].imgCnt.scaleX = .33;
_units[ary[1][0]].imgCnt.x = _units[ary[1][0]].imgCnt.width;
_units[ary[2][0]].imgCnt.visible = true;
_units[ary[2][0]].imgCnt.scaleX = .33;
_units[ary[2][0]].imgCnt.x = _units[ary[2][0]].imgCnt.width;
}
}
private function nextQue2():void
{
if (_count % 4 == 0) {
addVoice(_metro);
}
if (_count % 16 == 0) {
addVoice(_metro2);
}
//if (_count % 10 == 0) addVoice(_units[2].original.slice(0,200));
var r:Number
if (_count % 8 == 0) {
r = Math.random()
if(r<.2)addVoice(_units[0].compless)
else if(r<.4)addVoice(_units[1].compless)
else if(r<.6)addVoice(_units[2].compless)
else if(r<.8)addVoice(_units[3].compless)
else if (r < 1) addVoice(_units[4].compless);
//addVoice(_voice[int(Math.random()*_voice.length)]);
}
if (_count % 16 == 15) {
r = Math.random()
if(r<.2)addVoice(_units[0].original)
else if(r<.4)addVoice(_units[1].original)
else if(r<.6)addVoice(_units[2].original)
else if(r<.8)addVoice(_units[3].original)
else if (r < 1) addVoice(_units[4].original);
//addVoice(_voice[int(Math.random()*_voice.length)]);
}
//if (_count % 40 == 10) addVoice(_units[3].strech);
//if (_count % 40 == 20) addVoice(_units[3].compless);
if (_count % 40 == 24) addVoice(_units[3].strech);
//if (_count % 20 == 19) addVoice(_units[4].reverse);
//if (_count % 20 == 0) addVoice(_units[0].original);
}
}