Flashで使う、メトロノームのクラス

Flashで作るメトロノームのクラスが書けたので公開します。

クリック音は外部から与えてやる必要があるので、使うときにはちょっと注意ですね。これがCS4なら、自分でサウンドを生成して、みたいにできたのかも知れないけど、自分の持っているのはCS3なので、こうしたことはできない? できるのかも知れないけど、まあ今はこれで使えるから問題ありません。

メトロノームの針を動かすようなアニメーションを制御したい場合は、クリック音が鳴るたびにイベントを発生させるか、あるいはアニメーションの動作をさせる関数を渡してクリックの度に実行してもらうか、どっちかかと思いますが、まあそれは今後の課題にしたいと思います。

package {
	import flash.display.Sprite;
	import flash.media.Sound;
	import flash.media.SoundChannel;
	import flash.utils.*;
	public class Metronome extends Sprite {
		private var downbeat_sound:Sound;
		private var beat_sound:Sound;
		private var i:Number = 0;
		private var 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 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();
				i = 0;
			} else {
				beat_sound.play();
			}
			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;
		}
	}
}