In case Flash no longer exists; a copy of this site is included in the Flashpoint archive's "ultimate" collection.

Dead Code Preservation :: Archived AS3 works from wonderfl.net

forked from: サウンド波形 extract

Get Adobe Flash player
by akkey.guitar 16 Sep 2011
    Embed
/**
 * Copyright akkey.guitar ( http://wonderfl.net/user/akkey.guitar )
 * MIT License ( http://www.opensource.org/licenses/mit-license.php )
 * Downloaded from: http://wonderfl.net/c/A09K
 */

// forked from hacker_szoe51ih's サウンド波形 extract
/*
音源はこちらから頂きました。http://www.mp3.com/free-music/
*/

package 
{
    import flash.display.Bitmap;
    import flash.display.BitmapData;
    import flash.display.Graphics;
    import flash.display.JointStyle;
    import flash.display.Sprite;
    import flash.events.*;
    import flash.geom.ColorTransform;
    import flash.geom.Matrix;
    import flash.media.Sound;
    import flash.media.SoundChannel;
    import flash.net.URLRequest;
    import flash.utils.ByteArray;
    
    
     [SWF(width=465,height=465,backgroundColor=0x0,frameRate=45)]
    public class Main extends Sprite
    {
        
        public var pass:String = "http://custom-base.oops.jp/demo/wonderfl/sound/kflay-2weak.mp3";
        public var dummySound:Sound;
        public var sound1:Sound;
        public var soundCh:SoundChannel;
        public var soundSp:Sprite;
        public var byteArray:ByteArray;
        
        public var onoff:Boolean = true;
        
        public var leftCol:uint=0xffffff;
        
        public var W:Number = stage.stageWidth;
        public var H:Number = stage.stageHeight;
        
        
        public function Main() {
            
                init();
            
            }
            
            public function init():void {
                dummySound = new Sound();
                //波形データを表示する用
                soundSp = new Sprite();
                soundSp.x = 0;
                soundSp.y = H / 2;
                addChild(soundSp);
                
                //soundを読み込む
                sound1 = new Sound();
                sound1.addEventListener(Event.COMPLETE, loadComplete);
                sound1.load(new URLRequest(pass));
            }
            
            public function loadComplete(e:Event):void {
                dummySound.addEventListener(SampleDataEvent.SAMPLE_DATA, writeSoundData);
                soundCh=dummySound.play();//サウンドデータを読み込んでいないsoundインスタンスでplay()を呼び出すと、SampleDataEvent.SAMPLE_DATAが送出される
                stage.addEventListener(MouseEvent.CLICK, onClick);
            }
            
            public function writeSoundData(e:SampleDataEvent):void {
                byteArray = new ByteArray();
                sound1.extract(byteArray, 3600);//sound1のサウンドデータを抽出してbyteArrayに書き込む
                createImage(byteArray);
                e.data.writeBytes(byteArray);//dummySoundのSampleDataEvent.SAMPLE_DATAにbyteArrayを1バイトを8bitの符号付き整数として書き込む    
            }
            
            public function createImage(byteArray:ByteArray):void {
                //波形の画像を作成
                byteArray.position = 0;
                
                //描画初期化
                soundSp.graphics.clear();
                soundSp.graphics.lineStyle(1,0xffffff);
                soundSp.graphics.moveTo(0, 0);
                
                //パラメーターセット
                var moveX:int = 0;
                var count:int = 1;
                var leftArray:Array = new Array();
                
                //byteArrayの長さだけ繰り返す
                while (byteArray.bytesAvailable > 0) {
                    
                    leftArray.push(byteArray.readFloat() * H / 2);//byteArrayから浮動小数値をreadFloatで取得してleftArrayに入れる
                    
                    //countを8で割った余りが0のときのみcreateLineを実行(1にすると重たくて動かなくなる)
                    if (count%16==0) {
                        createLine(moveX, leftArray);
                        moveX++;
                        leftArray = new Array();//新しいleftArrayインスタンスを作る
                        count=1;
                    }
                    count++;
                }
                
            }
            
            public function createLine(moveX:int, arr:Array):void {
                var moveY:Number=0;
                for (var i:int = 0; i < arr.length ;i++ ) {
                    moveY += arr[i];
                }
                moveY /= arr.length;//そのままだと波形の振り幅が大きすぎるので適当な値で割っている
                soundSp.transform.colorTransform = rgb();
                soundSp.graphics.lineTo(moveX, moveY);
        
            }
            
            //on off
            public function onClick(e:MouseEvent):void {
                if (onoff) {
                    soundCh.stop();
                    onoff = false;
                }else {
                    soundCh = dummySound.play();
                    onoff = true;
                }
            }
            
            public function rgb():ColorTransform {
                var cltf:ColorTransform = soundSp.transform.colorTransform;
                cltf.redMultiplier =(Math.random()*2)+0.01;
                cltf.greenMultiplier=(Math.random()*2)+0.01;
                cltf.blueMultiplier=(Math.random()*2)+0.01;
                soundSp.transform.colorTransform = cltf;
                return soundSp.transform.colorTransform;
            }
        
            
            
    }
    
    
}