そろそろSoundまわりに手を付けてみますかね。ということで、開発ガイドやリファレンスに目を通してみました。うーん、なかなかお手軽に使えそうですね。
//Test.as
package{
import flash.display.*;
import flash.media.Sound;
import flash.net.URLRequest;
public class Test extends Sprite
{
public function Test()
{
new Sound(new URLRequest("nyandaful.mp3")).play();
}
}
}
最低限再生するだけならこのくらいでOK。エラーに備えてEvent.IO_ERRORくらいは補足した方が良さそうですが。
playメソッドでは開始位置やリピート回数を指定することも出来るみたいです。ただ、ループ区間を指定することは出来ないみたいなのが残念。
サウンドを止めるためにSoundにstopメソッドがあるのかな、と思ったらそうではなく、play()の戻り値であるSoundChannelにstopメソッドがあります。Soundオブジェクトは今鳴っている音そのものを表すのではなく、あくまで一つの音の種類というか、データソースというか、一つの音源を表すみたいです。今鳴っている音自体はSoundChannelオブジェクトで表されます。だから、Soundのplay()でSoundChannelオブジェクトが生まれ、stop()でその役目を終える。再度再生したい場合はSoundのplay()でまた新たなSoundChannelオブジェクトを作る。ボリュームやパンニングは再生中の音に対する属性だから、SoundChannelのsoundTransformプロパティで制御する。そういった考え方のようです。
こういう設計だから、一つの音源を同時に複数鳴らすことも簡単にできます。Soundのplay()メソッドを何回も呼べば、呼んだ分だけSoundChannelオブジェクトが作られ、同時に再生されます。
//Test.as [PLAY]の文字をクリックするとmp3を再生する例。何回もクリックすると、その分音が重なっていく。
package{
import flash.display.*;
import flash.text.*;
import flash.media.Sound;
import flash.net.URLRequest;
import flash.events.*;
public class Test extends Sprite
{
private var snd:Sound = new Sound(new URLRequest("nyandaful.mp3"));
private var tf:TextField = new TextField;
public function Test()
{
tf.text = "[PLAY]";
tf.autoSize = TextFieldAutoSize.LEFT;
addChild(tf);
tf.addEventListener(MouseEvent.CLICK, onClick);
}
private function onClick(e:MouseEvent):void
{
snd.play();
}
}
}