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; } } }