開発環境 Apache Flex SDK 4.12.1
FlashDevelop 4.6.1
実行環境 Microsoft Windows 8.1 (64bit)
プロジェクトの種類 ActionScript 3/AS3 Project
プロジェクト名 WaveForm


参考

Main.as
package 
{
    import flash.display.Graphics;
    import flash.display.Sprite;
    import flash.events.Event;
    import flash.events.MouseEvent;
    import flash.events.SampleDataEvent;
    import flash.media.Sound;
    import flash.media.SoundChannel;
    import flash.media.SoundMixer;
    import flash.media.SoundTransform;
    import flash.text.TextField;
    import flash.utils.ByteArray;
 
    public class Main extends Sprite 
    {
        private var wflist:Array = new Array;
        private var targetwf:Array;
        private var sound:Sound = new Sound;
        private var soundChannel:SoundChannel = null;
 
        public function Main():void 
        {
            if (stage) init();
            else addEventListener(Event.ADDED_TO_STAGE, init);
        }
 
        private function init(e:Event = null):void 
        {
            removeEventListener(Event.ADDED_TO_STAGE, init);
            // entry point
 
            var name:Array = new Array;
            var wf:Array;
            var i:int;
            var t:Number;
 
            name.push("サイン波");
            wf = new Array(100);
            for (i = 0; i < 100; i++) 
            {
                t = i / 100;
                wf[i] = Math.sin(2 * Math.PI * t);
            }
            wflist.push(wf);
 
            name.push("三角波");
            wf = new Array(100);
            for (i = 0; i < 100; i++) 
            {
                t = i / 100;
                if (t < 0.25) wf[i] = t * 4;
                else if (t < 0.75) wf[i] = 2 - t * 4;
                else wf[i] = t * 4 - 4;
            }
            wflist.push(wf);
 
            name.push("ノコギリ波");
            wf = new Array(100);
            for (i = 0; i < 100; i++) 
            {
                t = i / 100;
                if (t < 0.5) wf[i] = t * 2;
                else wf[i] = t * 2 - 2;
            }
            wflist.push(wf);
 
            name.push("矩形波 duty=0.5");
            wf = new Array(100);
            for (i = 0; i < 100; i++) 
            {
                t = i / 100;
                wf[i] = (t < 0.5) ? 1 : -1;
            }
            wflist.push(wf);
 
            name.push("矩形波 duty=0.25");
            wf = new Array(100);
            for (i = 0; i < 100; i++) 
            {
                t = i / 100;
                wf[i] = (t < 0.25) ? 1 : -1;
            }
            wflist.push(wf);
 
            name.push("矩形波 duty=0.125");
            wf = new Array(100);
            for (i = 0; i < 100; i++) 
            {
                t = i / 100;
                wf[i] = (t < 0.125) ? 1 : -1;
            }
            wflist.push(wf);
 
            for (var r:int = 0; r < wflist.length; r++) 
            {
                var tf:TextField = new TextField;
                tf.x = 10;
                tf.y = 130 + 60 * r;
                tf.width = 100;
                tf.height = 50;
                tf.text = name[r];
                tf.border = true;
                addChild(tf);
 
                var sp:Sprite = new Sprite;
                sp.name = r.toString();
                sp.x = 120;
                sp.y = tf.y;
                sp.addEventListener(MouseEvent.MOUSE_DOWN, onMouseDown);
                sp.addEventListener(MouseEvent.MOUSE_UP, onMouseUp);
                addChild(sp);
 
                var g:Graphics = sp.graphics;
                g.clear();
                g.beginFill(0xeeeeee);
                g.drawRect(0, 0, 100, 50);
                g.endFill();
                g.lineStyle(1);
                g.moveTo(100, 25);
                g.lineTo(0, 25);
                g.lineStyle(1, 0xff0000);
                wf = wflist[r];
                for (i = 0; i < 100; i++) 
                {
                    g.lineTo(i, 25 - 25 * wf[i]);
                }
            }
 
            sound.addEventListener(SampleDataEvent.SAMPLE_DATA, onSampleData);
            addEventListener(Event.ENTER_FRAME, onEnterFrame);
        }
 
        private function onEnterFrame(e:Event):void 
        {
            var byteArray:ByteArray = new ByteArray;
            SoundMixer.computeSpectrum(byteArray, true, 0);
            byteArray.position = 0;
 
            graphics.clear();
            graphics.lineStyle(1, 0x0000ff);
 
            var i:int;
            var y:Number;
 
            // Left
            graphics.moveTo(10, 60);
            for (i = 0; i < 256; i++) 
            {
                y = 60 - byteArray.readFloat() * 50;
                graphics.lineTo(10 + i, y);
            }
 
            // Right
            graphics.moveTo(10, 120);
            for (i = 0; i < 256; i++) 
            {
                y = 120 - byteArray.readFloat() * 50;
                graphics.lineTo(10 + i, y);
            }
        }
 
        private function onSampleData(e:SampleDataEvent):void 
        {
            for (var i:int = 0; i < 8192; i++) 
            {
                var t:int = (e.position + i) % 100;
                var value:Number = targetwf[t];
                e.data.writeFloat(value);
                e.data.writeFloat(value);
            }
        }
 
        private function onMouseDown(e:MouseEvent):void 
        {
            var i:int = parseInt(e.target.name);
            targetwf = wflist[i];
 
            var st:SoundTransform = new SoundTransform;
            st.volume = 0.2;
            soundChannel = sound.play(0, 0, st);
        }
 
        private function onMouseUp(e:MouseEvent):void 
        {
            if (soundChannel != null)
            {
                soundChannel.stop();
                soundChannel = null;
            }
        }
 
    }
 
}
 
最終更新:2014年06月28日 10:55