どうも、やまそうです。最近巷で「音ゲーをプレーする際の、仕様で発生する内部的な誤差」が話題になっているようなので、思い立ってブログを書いてみる事にしました。
主なテーマは「3600族」について。これは主にmaimaiプレイヤーの間で使用される用語で、「BPMが3600の約数になっている楽曲はBREAKが光りやすい」という事実から、BPMが3600の約数になっている楽曲を総称して呼ぶ言葉です。今回の記事では、「何故『3600族』は光りやすいのか?」から出発し、3600族をより拡張した概念を考えたり、等間隔にノーツが降ってくる譜面における平均的なズレについて計算で求めたりしてみます。

・基本的な用語の説明
FPS: Frames Per Secondの略。音ゲーで流されている映像は、実際にはパラパラ漫画のように高速で画面を切り替える事によって成立している。その1秒辺りの切り替えの回数がFPSである。例えばオンゲキのような60FPS筐体では、1秒間に60回画面が切り替わる事を示している。
BPM: Beats Per Minuteの略。1分間で4分音符を何回叩く速さであるかを表す。例えばBPM=60であれば1分間で4分音符が60回来る速度、すなわち1ノーツ/sである事を意味する。これを基準にすると、BPM=の
分音符は
(notes/s)となる。
これをフレーム単位に換算するとノーツごとのフレーム間隔は、
(F/notes)(60FPS筐体の場合)……①
(F/notes)(120FPS筐体の場合)……②
となる。
※以下、ここでは特別な記載のない限り60FPS筐体の場合を考える
・何故ズレが生じるのか?
音ゲーの判定処理はフレームレートに合わせて行われる。例えば60FPSの筐体であれば1sに60回判定タイミングがあるという事になる。しかし、実際には全てのノーツが1/60s単位の判定上に乗っかっているとは限らない。
具体例として、BPM200の16分でリズムを刻み続ける譜面を考えてみよう。ノーツ間隔は①より(F)となるため、実際のリズムは4.5F、9F、13.5Fとなる事から2ノーツに1度0.5Fズレているノーツが存在する事になる!
・3600族の魔法
ここで、実際のリズムと筐体上の判定がズレない場合がどのような場合か考えてみると、①よりが整数になれば良い。特に
、すなわち4分音符の場合、
が整数になれば良い事になる。つまり、
3600族とは、そのBPMの4分でフレームによるズレが発生しない
という事を意味する。ここで、8分や12分や16分についてはどうだろうか?これはを代入すれば良いだけであり、
:
が整数
:
が整数
:
が整数
であればズレが発生しない事が分かる。ここで、などは上記全ての条件を満たすため、これらのBPMは3600族の中でも特に光りやすいと言える。
余談だが、IIDXやボルテなど120FPSの場合を考えてみよう。これは②と上記の議論から60FPSにおける3600族に該当するのは7200の約数である事が分かる。具体的な値を挙げると、BPM160や288は120FPSになるとズレがなくなるため、120FPS化の恩恵を強く得られるBPMと言えるだろう。
・ズレの平均値を求める
あるBPMの16分交互が延々と続く譜面を考える(BPMは整数値を取るものとする)。この譜面における、1ノーツ当たりの描画によって発生するズレの平均値を求めたい。なお、1F単位でないもののズレは、小数第一位で四捨五入したものを基準とし、それとのズレを考えるものとする。*1
例: 3.3F→3Fから0.3Fずれ 4.5F→4Fから0.5Fずれ 6.7F→7Fから0.3Fずれ

以下、楽曲の開始タイミング、すなわちノーツ目が降ってくるタイミングを
Fと定める。
の
分交互は①より
(F)単位でノーツが交互に来る事になる。ここで、全ノーツの平均のズレというのは
ノーツ目~
ノーツ目までを合計したズレの平均値で表せそうである。何故なら、
ノーツ目では
と必ず整数になるため、
ノーツ目以降のズレ量は
ノーツ目からの"繰り返し"になるからである。この議論を応用すると、
を既約分数にした
において、考える必要があるのは
ノーツ目~
ノーツ目まで、という事になる。……③
ここで、関数を以下のように定義する。
……④
すると、求めたいズレの平均値は以下のように表される。
(ズレの平均値)=……⑤
⑤の値を求めるにあたって、まずは四捨五入より簡単にの小数部分について考えてみよう。この値は以下の計算式のように表される。
(の小数部分)=
……⑥
また、と
が互いに素な事から
の小数部分は
のいずれかの値を取る。……⑦
ここで、以下の定理が成り立つ。
定理: において
の小数部分は
のいずれかの相異なる値を取る。……⑧
証明: からある
において、
の小数部分が等しくなったと仮定する。この時、
が整数値を取る事になる。
と
は互いに素なため、これが整数になるには
が
の倍数である必要があるが、
のためこれが
で割り切れる事はありえず、矛盾する。以上より背理法からは
は全て相異なる値を取り、⑦の議論から
のいずれかの値を取る。
では、小数部分の挙動が分かったのでここからは四捨五入した際のズレを考える。ここではが奇数/偶数で場合分けが発生する。
は
を既約分数にしたものであった。
であるため、
が偶数であるには
が
の素因数を
つ以上持っていれば良い、すなわち
が
の倍数であれば良い。……⑨
(i)が奇数の場合(=
が
の倍数ではない場合)
~
までの
個は
未満、それ以外の
個は
より大きい。これより、
(ズレの平均値)={0+1/p+2/p+……(p-1)/2p+(1-(p+1)/2p)+(1-(p+3)/2p)+……(1-(p-1)/p)}/p
=+
=
=……⑨
と求められた。
(ii)pが偶数の場合(=が
の倍数の場合)
~
までの
個は
未満、それ以外の
個は
以上である。これより、
(ズレの平均値)={0+1/p+2/p+……(p-2)/2p}+(1-1/2)+(1-(p+2)/2p)+……(1-(p-1)/p}/p
=+
=
=……⑩
と求められた。
以上(i)(ii)の結果より、「60FPSの音楽ゲームにおいては、平均しておおよそフレーム
のズレが発生する」という結論が得られた。いわゆるAP・理論値ゲー*2における猶予判定が33.3ms~50ms程度、即ちゲーム内部によって発生し得るズレの10倍程度に設定されているのはズレを考慮した十分な判定幅を持たせられている、と言えるだろう。
・あとがき
TeXを使った事がないまま大学生活を終えてしまったので、数式を書くのが大変でした