|開発環境|Apache [[Flex]] SDK 4.12.1| ||FlashDevelop 4.6.1| |実行環境|Microsoft Windows 8.1 (64bit)| |プロジェクトの種類|ActionScript 3/AS3 Project| |プロジェクト名|WaveForm| #table_zebra(project, #fff, #eee) http://www.maroon.dti.ne.jp/lance/flash/waveform.html 参考 -[[スペクトラムアナライザを表示する - FlashDevelop 用 AS 3 サンプル集>http://hkpr.info/flash/game/sample/s082.php]] Main.as #highlight(actionscript){{ 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; } } } } }}