
さてとりあえずFlashPlayer 10 beta2の開発環境を整えたところで、早速個人的にやりたかったダイナミックサウンド生成を試してみます。
このページを参考に、一つサンプルを作ってみました。
2008.10.28追記
> 最新のFlash Player 10に対応しました。
「ラの音を鳴らす」
AstroDynamicSoundTest1.as
package
{
import flash.display.Sprite;
import flash.events.SampleDataEvent;
import flash.media.Sound;
public class AstroDynamicSoundTest1 extends Sprite
{
private var sound:Sound;
private var A4:Number = 440.000;
public function AstroDynamicSoundTest1()
{
sound = new Sound();
sound.addEventListener(SampleDataEvent.SAMPLE_DATA, onSampleDataHandler);
sound.play();
}
private function onSampleDataHandler(e:SampleDataEvent):void
{
var volume:Number = .2;
var freq:Number = (Math.PI * 2) * A4 / 44100;
for (var c:int = 0; c < 4048; c++)
{
var sample:Number = Math.sin(Number(c + e.position) * freq) * volume;
e.data.writeFloat(sample);
e.data.writeFloat(sample);
}
}
}
}
サンプルデモはこちら。(Flash Player 10 beta2でご覧ください)
ピアノでいう、真ん中のラ(A4)の音は、440Hz。(最近のオーケストラとかシンフォニックとかだと442Hzですが)
「ラ」の音は、よくチューニングとかでも使われていて、オーケストラのコンサートとか行くと、奏者達は演奏する前に一斉に楽器の音を出して、最終調整なんかしたりするわけですが、その音が「ラ」なわけであります。
あと赤ちゃんの産声とかも、全世界共通で、大体「ラ」の音らしいです。。。だから、「基準の音」として使われているとか・・・絶対音階持ってない自分は、今手元のピアノで音をだして比べてみたのですが、ちょっと分かりませんでした。。。
というわけで、「ラ」の音をサイン波で鳴らしてみます。毎サンプル毎に、位相を足し算して(e.position)、単位時間あたりにおける波の数をサンプリングレートで割った値を単振動で表した値freqをかけ算して、最終的にその音のボリューム(波の振幅)をかけ算(0から1)して、サンプル毎の音を決めて、最後にL-Rに割り当てています。多分。(ちょっと自信ない)
音鳴ったよー!!すげー!!
これは楽しい!!
というわけで、ActionScriptで曲を作ってみるのを目標に、ちょっとしばらく音関係を連載してみます。

