Hatena::ブログ(Diary)

PHP,MySQL,Flex,JSな日々+イラストとか このページをアンテナに追加 RSSフィード Twitter

2008年10月23日

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

音声には三角波っていうのがあるらしくそれはファミコンなどの音に近いようです。

ってことでちょっと試してみました。

http://moeten.info/flex/20081016_fp10Test/bin-release/test11.html

音出るのでボリューム絞ってからアクセスしてください(^−^)

f:id:haru-komugi:20081023183356p:image

参考リンク

正弦波

ソースはこちら

<?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 (phase > PI2) {
            phase -= PI2;
        }
        if( i%(myT*2) >= myT ){
            smpl = i%myT;
        }else{
            smpl = myT- i%myT;
        }
        bdC.setPixel( i ,smpl, 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:Image id="myImageC" width="100%" height="80"/>
</mx:VBox>
</mx:Application>

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

トラックバック - http://d.hatena.ne.jp/haru-komugi/20081023/1224754466
Connection: close