Soundオブジェクトのpositionプロパティはリアルタイムな値が返ってくるとは限りません。 少し高めのfpsに設 定して、フレームごとに値をトレースするとわかりますが、同じ値が返ってきたりします。

今回は

  • 同じメロディで異なるbpsの音源を用意
  • ユーザのアクションにより、音源を切り替える
  • 切り替えを繰り返してもメロディが途切れないようにする

ということを試みました。

考えた方法は

考えた方法は

  • 音源再生時にpositionプロパティとdurationプロパティから再生割合を出しておく
  • 音源切り替え時に再生割合から次の音源の再生開始位置を出す

というものです。

作成したコードは以下のようなものです。

my_sound = new Sound(); my_sound.loadSound("my_sound", false); percentage = 0; my_sound.start(); ・ ・ ・ ・ my_sound.stop(); percentage = my_sound.position / my_sound.duration; my_sound.start(percentage * my_sound.duration / 1000);

これを実行すると切り替わり時にずれて、うまくいきませんでした。

代替案として、getTimer関数を用いて再生時間を測定するタイマーを別に用意しました。 コードは以下のような感じです。

て、切り替え時に再生割合から次の音源の positionプロパティをイベントのトリガーにして、

再生時間測定タイマー実装する改善案

my_sound = new Sound(); my_sound.loadSound("my_sound", false); percentage = 0; my_sound.start(); startTime = getTimer(); time = getTimer() - startTime; ・ ・ ・ ・ my_sound.stop(); percentage = time / my_sound.duration; my_sound.start(percentage * my_sound.duration /1000);

この方法によりpositionプロパティよりはかなり改善が見られました。

音と動きを関連付ける際に、positionプロパティをイベントのトリガーなどに使うと信頼できそうにないのでやめておいたほうがいいと思います。

HTML5飯