数学といってもかんたんですが。
最近Web向けのBMS Playerを開発しています。
そこで気になったことがあったのでメモ。
1小節の長さってどう計算するんだろう?
ここに細い計算式が書いてあります。
で、計算してみました。
n [Beats/Min] // BPM
m [Beats/Bar] // 一小節の拍数
f [Frames/Sec] // FPS
h [px] // 目に見えるレーンの高さ
a // 速度倍率 (無次元)
まず、n BPM、b 拍、f FPS の時、1小節の
演奏時間をフレームの数として算出します。
bar_frame = m [Beats/Bar] * f [Frames/Sec] / (n [Beats/Min] / 60)
bar_frame = m [Beats/Bar] * f [Frames/Sec] / (n / 60 [Beats/Sec])
bar_frame = fm / (n / 60) [Beats/Bar * Frames/Sec / (Beats/Sec)]
bar_frame = 60fm / n [Beats/Bar * Frames/Sec * Sec/Beats]
bar_frame = 60fm / n [Frames/Bar]
となります。
次に速度を計算するために視認時間を割り出します。
IIDXではBPM100の時、1秒でノーツが判定に到達します。
つまり
100 * 29 * 60 = 174000 [Beats/Min * Frames/Min * Sec]
100 * 29 * 60 = 174000 [Beats*Frame/Min^2 * Sec]
この速度定数から n BPM、b 拍、f FPS の時の
視認可能フレーム数を算出します。
visible_frame = 174000 [Beats*Frame/Min^2 * Sec] / 29 [Frames/Sec] * f [Frames/Sec] / n [Beats/Min] / a
visible_frame = 174000 / 29 [Beats*Frame/Min^2 / Frames/Sec * Sec] * f [Frames/Sec] / n [Beats/Min] / a
visible_frame = 6000 [Beats/Min^2 * Sec * Sec] * f [Frames/Sec] / n [Beats/Min] / a
visible_frame = 100 [Beats/Min 1/Sec * Sec * Sec] * f [Frames/Sec] / n [Beats/Min] / a
visible_frame = 100 [Beats/Min * Sec] * f [Frames/Sec] / n [Beats/Min] / a
visible_frame = 100f [Beats/Min * Frames/Sec * Sec] / n [Beats/Min] / a
visible_frame = 100f / n [Beats/Min * Frames/Sec / Beats/Min * Sec] / a
visible_frame = 100f / n [Frames/Sec * Sec] / a
visible_frame = 100f / an [Frames]
ここで、bar_frame を1小節に限定します、すると
h [px] * (60bf / n [Frames/Bar] * 1 [Bar]) / (100f / na [Frames])
h * (b * f * 60 * na) / (100 * f * n) [px]
h * b * a 60 / 100 [px]
3abh/5 [px]
以上によって示されることは以下の二点で
1. 小節の高さは、レーン長・拍数・速度倍率に正比例する。
2. 小節の高さは、bpm/fps によらず不変である。
ということです。