2009-11-26

ActionScriptのSoundとSoundChannel

そろそろ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();
	}
    }
}