開発環境 |
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