| 1 |
package samples |
|---|
| 2 |
{ |
|---|
| 3 |
import flash.display.Sprite; |
|---|
| 4 |
import flash.events.SampleDataEvent; |
|---|
| 5 |
import flash.media.Sound; |
|---|
| 6 |
import flash.media.SoundChannel; |
|---|
| 7 |
public class SineSample extends Sprite |
|---|
| 8 |
{ |
|---|
| 9 |
private var phase:Number = 0; |
|---|
| 10 |
private var freq:Number = 440; |
|---|
| 11 |
private const PI2:Number = Math.PI * 2; |
|---|
| 12 |
private var soundChannelObject:SoundChannel = new SoundChannel(); |
|---|
| 13 |
public function SineSample() |
|---|
| 14 |
{ |
|---|
| 15 |
var soundObj:Sound = new Sound(); |
|---|
| 16 |
//まずはSAMPLE_DATAイベントにリスナー登録 |
|---|
| 17 |
soundObj.addEventListener(SampleDataEvent.SAMPLE_DATA, onSampleData); |
|---|
| 18 |
//mp3などの音声を割り当てずにそのままplay()で再生開始すると、 |
|---|
| 19 |
//音のバッファが空になるたびにSAMPLE_DATAイベントが発生します。 |
|---|
| 20 |
soundChannelObject = soundObj.play(); |
|---|
| 21 |
} |
|---|
| 22 |
private function onSampleData(e:SampleDataEvent):void |
|---|
| 23 |
{ |
|---|
| 24 |
var smpl:Number; |
|---|
| 25 |
var w:Number = PI2 * freq / 44100; |
|---|
| 26 |
|
|---|
| 27 |
//レイテンシの計測【※1】 |
|---|
| 28 |
var latency:Number = e.position / 44.1 - soundChannelObject.position; |
|---|
| 29 |
|
|---|
| 30 |
//一度のイベントごとに2048~8192サンプル×左右2チャンネル分のデータを書き込みます。 |
|---|
| 31 |
for (var i:int = 0; i < 4096; ++i) { |
|---|
| 32 |
//波形データを生成【※2】 |
|---|
| 33 |
phase += w; |
|---|
| 34 |
if (phase > PI2) { |
|---|
| 35 |
phase -= PI2; |
|---|
| 36 |
} |
|---|
| 37 |
smpl = Math.sin(phase); |
|---|
| 38 |
|
|---|
| 39 |
//SampleDataEvent.dataにwriteFloat()で波形データを書き込む【※2】 |
|---|
| 40 |
e.data.writeFloat(smpl); |
|---|
| 41 |
e.data.writeFloat(smpl); |
|---|
| 42 |
} |
|---|
| 43 |
} |
|---|
| 44 |
} |
|---|
| 45 |
} |
|---|