Flashで使うメトロノームのクラスを手直し

d:id:imait:20090628:1246196655でちょっと公開した、ActionScriptで書いたメトロノームのクラス。これを使って、アニメーションの制御をするにはどうしたらいいだろうといってましたが、結局イベントを発生させることにしました。

強拍ではDOWNBEATイベント、通常の拍ではBEATイベントを発生させることにしたので、イベントリスナーを定義してやれば、アニメーションの制御も自由自在です。

イベントうんぬんの他は、MINを変数から定数に変更しました。まあ、別にこれはそんなに大きな違いではないと思います。

package {
	import flash.display.Sprite;
	import flash.media.Sound;
	import flash.media.SoundChannel;
	import flash.utils.getTimer;
	import flash.utils.setInterval;
	import flash.utils.clearInterval;
	import flash.events.Event;

	public class Metronome extends Sprite {
		private var downbeat_sound:Sound;
		private var beat_sound:Sound;
		private var i:Number = 0;
		private static const MIN:Number = 60000;
		private var tempo:Number = 120;
		private var interval:Number = MIN / tempo;
		private var time:Number = 2;
		private var current_time:Number = getTimer();
		private var next_time:Number = getTimer() + interval;
		private var int_id;
		private var working:Boolean = false;

		public static const DOWNBEAT:String = "downbeat";
		public static const BEAT:String = "beat";

		public function Metronome() {

		}
		public function start():void {
			if (! working) {
				working = true;
				i = 0;
				next_time = getTimer() + interval;
				int_id = setInterval(checkTime, 1);
			}
		}
		public function stop():void {
			if (working) {
				working = false;
				clearInterval(int_id);
			}
		}
		private function checkTime():void {
			current_time = getTimer();
			if (current_time > next_time) {
				beating();
				next_time = next_time + interval;
			}
		}
		private function beating() {
			if (i % time == 0) {
				downbeat_sound.play();
				dispatchEvent(new Event(DOWNBEAT));
				i = 0;
			} else {
				beat_sound.play();
				dispatchEvent(new Event(BEAT));
			}
			i++;
		}
		public function setTime(t:Number):void {
			if (t > 0) {
				time = t;
			}
		}
		public function getTime():Number {
			return time;
		}
		public function setTempo(t:Number):void {
			tempo = t;
			interval = MIN / tempo;
		}
		public function getTempo():Number {
			return tempo;
		}
		public function setDownbeat(d:Sound) {
			downbeat_sound = d;
		}
		public function setBeat(b:Sound) {
			beat_sound = b;
		}
	}
}