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

ViewSoundWaveLR

初wonderflです、普段はFlashを使って制作しています。
コードの書き方は我流なので見辛かったらすみません。
wonderflにはいつもお世話になっています。
動くサンプルのコードが見れるなんて素晴らしいの一言です。
最近仕事で音関係をFlashで弄る機会があり、皆さんのコードを参考に作ってみました。

本当はボタンとか置いて色々弄れるようにしたいけど、コードだけだど色々大変ですね(笑)
何か良いライブラリやswc等があれば教えて頂けると助かります。

追記:ちょっと修正して、コメント増し増しにしてみた。
追記:波形を描く所で間違っていた箇所を修正しました。
追記:WAVE_STEPを修正しました。
追記:バージョンUP版→http://wonderfl.net/c/uYmx
Get Adobe Flash player
by snowsunny 14 Apr 2011
/**
 * Copyright snowsunny ( http://wonderfl.net/user/snowsunny )
 * MIT License ( http://www.opensource.org/licenses/mit-license.php )
 * Downloaded from: http://wonderfl.net/c/l6gF
 */

package 
{
    import flash.media.Sound;
    import flash.display.Sprite;
    import flash.utils.ByteArray;
    import flash.net.URLRequest;
    import flash.events.Event;
    public class SoundWave extends Sprite
    {
        public function SoundWave()
        {
            //必要データ作成&設定&イベント登録---------------------------------------------↓
            //~.mp3へのパス           
            var SoundPass:String = "http://sunny-experience.com/wonderfl/BGM_House.mp3";
            
            //mp3をロードするSound
            var TargetSound:Sound = new Sound();
            TargetSound.addEventListener(Event.COMPLETE, COMP_SoundLoad);
            TargetSound.load(new URLRequest(SoundPass));
            
            //左音源の波形生成用Sprite
            var LineSpriteL:Sprite = new Sprite();
            LineSpriteL.x = 0;
            LineSpriteL.y = stage.stageHeight / 4;
            LineSpriteL.graphics.lineStyle(1, 0x6666cc);
            addChild(LineSpriteL);
            
            //右音源の波形生成用Sprite
            var LineSpriteR:Sprite = new Sprite();
            LineSpriteR.x = 0;
            LineSpriteR.y = stage.stageHeight - stage.stageHeight / 4;
            LineSpriteR.graphics.lineStyle(1, 0xcc6666);
            addChild(LineSpriteR);
            
            //TargetSoundから抽出した生の音データを格納するByteArray
            var SoundArray:ByteArray = new ByteArray();
            //必要データ作成&設定&イベント登録---------------------------------------------↑
            
            //Soundのロードが終わった後、データを抽出&ラインデータ作成&10回ループで再生する関数
            function COMP_SoundLoad(e:Event):void
            {
                //TargetSoundから秒数*44100(Hz)の音データを抽出、SoundArrayに格納
                TargetSound.extract(SoundArray, TargetSound.length/1000 * 44100);
                
                CreateLineData();
                TargetSound.play(0, 10);
            }
            
            //DrawLineに送るラインデータを作成する関数
            function CreateLineData():void
            {
                //波形の高さ(最大値):x(px) / 2(±補正用計算)
                var WAVE_HEIGHT:Number = 128 / 2;
                
                //波形の刻み:x(sec) * 8(左右の音データ一つ分) * 44100(Hz)
                var WAVE_STEP:int = Math.round(0.01 * 8 * 44100);
                
                //左右の波形データを保存するArray
                var LineData_L:Array = [], LineData_R:Array = [];
                               
                for(var i:Number = 0; i < SoundArray.length; i += WAVE_STEP)
                {
                    SoundArray.position = i;
                    
                    //SoundArrayから左右の音データをreadFloatを使って4Byteずつ取得
                    LineData_L.push(SoundArray.readFloat() * WAVE_HEIGHT);
                    LineData_R.push(SoundArray.readFloat() * WAVE_HEIGHT);
                }
                //最後の音データを挿入
                SoundArray.position = SoundArray.length - 8;
                LineData_L.push(SoundArray.readFloat() * WAVE_HEIGHT);
                LineData_R.push(SoundArray.readFloat() * WAVE_HEIGHT);
                
                //DrawLineに左右のLineDataと、ステージの横幅ぴったりになる様な値を渡す
                DrawLine(LineData_L, LineData_R, stage.stageWidth / (SoundArray.length/WAVE_STEP));
            }
            
            //引数で受け取ったデータを使ってラインを描く関数
            function DrawLine(LD:Array, RD:Array, X_STEP:Number):void
            {
                //ラインを描くX,Y用変数
                var MoveX:Number = 0, MoveY:Number = 0;
                
                //受け取ったデータの数だけラインを描く
                for (var i:int = 0; i < LD.length; i++)
                {
                    MoveY = LD[i];
                    LineSpriteL.graphics.lineTo(MoveX, MoveY);
                    MoveY = RD[i];
                    LineSpriteR.graphics.lineTo(MoveX, MoveY);
                    MoveX += X_STEP;
                }
            }
        }
    }
}