Flashでメトロノームを作ったけれど
ちょっと思うところあって、Flashでメトロノームを作ってみたのですが、これが思ったように動かず、ちょっとがっかり。一定のテンポを刻む、そのテンポを作るのに、例えばテンポ60なら、60000ミリ秒(1分)を60で割った1000で、テンポ120なら60000ミリ秒を120で割った500を、setInterval()関数のintervalとして渡してやるんだけど、これが遅れる。明らかに遅れてしまうので、正直、メトロノームの精度としては非常に悪いといわざるを得ない。ただ、この遅れの原因がどこにあるのかがわかってないので、途中の処理のせいかも知れないし、あるいはクロック周波数? とかが関係してるのかも知れない。環境によって遅れかたが違うのなら、一律に何パーセント増しで速度を上げるという方法は使えないわけで、正直、困ってしまいました。
別のやりかたをするとしたら、テンポ60なら1000ミリ秒を、テンポ120なら500ミリ秒を、前回クリック音を鳴らした時間に足した時間になるまで、whileでループさせ続けるっていうのしか思いつかないのだけど、これはどう考えても負荷が高すぎるんじゃないだろうか。ええと、実際に試したわけじゃないけど、こんな感じ?
var now:Date = new Date(); var currentTime = now.getTime(); var nextTime = now.getTime() + tempo; while (true) { clicksound.play(); while (currentTime < nextTime) { var now:Date = new Date(); currentTime = now.getTime(); } nextTime = nextTime + tempo; }
tempoには次の音を鳴らすまでの時間(ミリ秒)が、clicksoundはライブラリとして読み込んだクリック音がセットされていると思ってください。
これでやって動くかどうかはわからないけれど、試してみる価値はあるのかなあ。わかりません。