Flash10でのサウンド作成機能を使ってみたよ。その3

今度は矩形波ってのを試してみました。
http://moeten.info/flex/20081016_fp10Test/bin-release/test13.html
音出るのでボリューム絞ってからアクセスしてください(^−^)

こっちのほうがファミコンっぽいかなぁ。
ソースはこちら

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute"
    creationComplete="creationCompleteHandler(event)" width="700" height="800"
    backgroundGradientAlphas="[1.0, 1.0]" backgroundGradientColors="[#FFFFFF, #626262]">
<mx:Script>
<![CDATA[
import flash.sampler.Sample;
import flash.display.Sprite;
import flash.events.SampleDataEvent;
import flash.media.Sound;
private var phase:Number = 0;
private var freq:Number = 440;
private const PI2:Number = Math.PI * 2;
private var soundChannelObject:SoundChannel = new SoundChannel();
private var bdC:BitmapData
//初期化
private function creationCompleteHandler(e:Event):void{
    //sin波描画用
    bdC = new BitmapData( myImageC.width , myImageC.height);
    //サウンド作成
    var mySound:Sound = new Sound();
    mySound.addEventListener(SampleDataEvent.SAMPLE_DATA,onSampleData);
    soundChannelObject = mySound.play();
}
private var t:Number = 1;
private var bytes:ByteArray = new ByteArray();
private var spectrum:Array  = new Array(256);
private function onSampleData(e:SampleDataEvent):void
{
    var smpl:Number;
    var w:Number = PI2 * freq / 44100;
    var latency:Number = e.position / 44.1 - soundChannelObject.position;
    bdC.lock();
    var myT:int = slidermyT.value;
    //sin波の作成
    for (var i:int = 0; i < 4096; ++i) {
        phase += w;
        if( i% slidermyT.value > slidermyT.value/2 ){
            smpl = slidermyV.value;
        }else{
            smpl = 0
        }
        if( i % (slidermyT.value/2) == 0 ){
            for( var j:int = 0 ; j < slidermyV.value*100 ; j ++ ){
                bdC.setPixel( i ,j, 0x0000ff );
            }
        }
        bdC.setPixel( i ,smpl * 100, 0x0000ff );
        e.data.writeFloat(smpl);
        e.data.writeFloat(smpl);
    }
    //画像へ表示
    myImageC.source  = new Bitmap( bdC );
}
//キャンバスをクリア
private function onChange():void{
    bdC = new BitmapData( myImageC.width , myImageC.height);
}
]]>
</mx:Script>
<mx:VBox width="100%" height="100%" verticalGap="3">
    <mx:HSlider id="slidermyT" minimum="0" maximum="100" value="80" change="onChange()"
        showTrackHighlight="true" labels="{[0,1]}" snapInterval="1" allowTrackClick="true" liveDragging="true" enabled="true"/>
    <mx:HSlider id="slidermyV" minimum="0" maximum="1" value="0.5" change="onChange()"
        showTrackHighlight="true" labels="{[0,1]}" allowTrackClick="true" liveDragging="true" enabled="true"/>
    <mx:Image id="myImageC" width="100%" height="80"/>
</mx:VBox>
</mx:Application>