気分的に先送りにしていた現在位置の表示(プログレスバーと経過時間表示)を実装してみた。この前も書いたけど、一時停止した後の演奏時間の再計算が多少問題になる。プログレスバーはStoryboardを使って実装しているけど、経過時間の表示(とステップカウントの表示)にはDispatcherTimerを使っている。というのは、これらはTextBlockのTextを変更するものなので、DoubleAnimationのような便利なものが無いからだ。まあそれでも概ね問題なく実装できた。
実はステップカウントの表示の部分に多少問題があって、プレイヤで保持されている、楽曲中の「現在の」ステップカウントが、次の命令が来ない限り先に進まないのを無視して、これを表示している。そうするとCodaなどで全音符が並んでいるだけの部分では、ステップカウントが全く先に進まないということになる。時間で計算しても良いのだけど、この表示はそれはそれで便利なので、このままにしてみることにした。
ついでに早送りも実装してみた。本当は後回しにするつもりだったのだけど、先に出来てしまいそうだったので試しにやってみた。そしたら案の定ハマるハマる。テンポが変わったときは、Storyboardの初期値も変化時間も再設定しなければならない。演奏時間の表示のセマンティクスも自明ではない。少なくとも、(一時停止中を除いて)演奏開始からの時間を保持するか(時間としての正しい表示)、倍速再生中は時間の経過も倍速にするか(演奏位置としての正しい表示)の二択がある。前者はあまり意味が無いので、後者を選ぶことにした。この辺に選択の余地があったので、プレイヤ上に演奏開始からの時間を保持するのはやめた。(そもそもタイマを内部的に保持しなければならないことになるので、プレイヤ側で実装するのはあまり賢くない選択肢に思えた、ということもある。)
演奏時間を表示するようになって気づいたのだけど、このプレイヤ、それなりに遅延している。設計上軽くはならないので仕方ないが、そのうち最適化しなければならなくなるだろう。
Leave a comment