Modding Helper 説明書

プロジェクトメンバー

■ プログラム
Vanity8
■ 検出内容の妥当性確認
komasy

このツールについて

■ 概要
このツールは、ranked譜面を作成する mapper や、modding を行う Beatmap Nominator 向けの osu!taiko modding 支援ツールです。
また、一部には BN evaluation を行う NAT 向けの機能も実装しています。
■ 背景
Ranked譜面を作成する際には、一般的に AiMod、 Mapset Verifier、 Mapset Verifier MVTaikoChecks などのチェックツールを使用します。しかし、これらのツールで検出できる内容は完全ではありません。

例えば Taiko Checklist V1.2 by iRedi を見ると、これらのツールでは検出できないチェック項目も存在することが分かります。

本ツールは、主に Mapset Verifier ではチェックできない項目を自動で確認するためのツールです。
基本的には、Mapset Verifier と本ツールの両方を併用することを想定しているため、Mapset Verifier で検出可能な項目は本ツールでは基本的に検出しません。

また、本ツールには一部の AiMod に近い機能も実装しています。
(⚠ 全てではありませんので最終的な AiMod によるチェックは必須です)
「全diffを一括で確認できる AiMod」のような使い方もできます。
■ 便利な設定
  • 使用しないチェック項目は、画面右上の歯車ボタンから非表示にできます。
  • チェックボックスやタブの表示設定はブラウザに保存されます。
    そのため、次回アクセス時も前回と同じ設定で使用できます。
  • 各タブのチェック結果に応じてタブの色が変化します:警告 / エラー 判定一覧
  • taiko モードの diff のみを読み込みます。
■ 注意事項
  • 本ツールと Mapset Verifier を併用しても、すべての Ranking Criteria 違反を検出できるわけではありません。
  • このツールの snap 判定は beatLength を基準にしており、meter(拍子)は考慮していません。
    そのため、1/1 snap は小節頭ではなく「1拍ごとの位置」を意味します。
  • ブラウザでページを開いたままにしている場合、ツールの更新が自動では反映されないことがあります。
    定期的にページをリロードするか、更新が反映されない場合は Ctrl + F5 で強制リロードしてください。

注意事項 / プライバシー

■ チェック内容について
本ツールの判定は、事前に定義したルールベースのチェックによって行われています。
生成AIなどによる自動推測・自動判定は使用していません。

例:
  • Tag のスペルチェック:内部辞書との比較によって行われます
  • 東方 Source チェック:事前に定義した作品名一覧との一致判定によって行われます
  • snap 判定:BPM line と timing 計算によって行われます
未知の単語・特殊表記・新ジャンルなどについては、正しく判定できない場合があります。
■ アップロードファイルについて
アップロードされた .osu / .osz ファイルは、ブラウザ内でのみ処理されます。

ファイル内容が、私を含む第三者へ送信・公開されることはありません。
また、サーバーへのアップロード・保存なども行っていません。

チェック処理は、すべてクライアント側(JavaScript)で実行されます。

また、本ツールのソースコードは GitHub 上で公開されています: modding-helper
■ アクセス解析について
本ツールでは、利用状況の把握や改善のために Google Analytics を使用しています。

アクセス数・閲覧ページ・利用環境などの匿名統計情報が収集される場合があります。
ただし、アップロードされた .osu / .osz ファイルの内容が送信されることはありません。

収集される情報は、Google Analytics の仕様に基づいて処理されます。
■ 免責事項
本ツールは、osu!taiko の modding / checking を補助するためのツールです。
表示される Warning / Error は補助情報であり、rankability や correctness を保証するものではありません。

本ツールの使用によって発生した問題・不利益・損害などについて、開発者は責任を負いません。
ツールの利用・判定結果の採用については、ご自身の判断と責任で行ってください。

また、本ツールは可能な限り正確な判定を目指していますが、誤検出・未検出・仕様変更への未対応などが発生する可能性があります。
バグの報告・表記方法の改善案の提案・新機能の提案などありましたら開発者までご連絡お願い致します。

Clap / Whistle

■ 背景
Kat には 2種類(Clap / Whistle)があります。
一部のBNは Whistle の音を好まないため、Clap に統一するのが望ましい場合があります。
■ 検出内容
Circle(type=1/5)の hitsound を解析し、Clap / Whistle / 両方 の個数を表示します。

「Whistle のタイムスタンプを表示」or 「Clap のタイムスタンプを表示」チェックボックスを有効にすると、それぞれのタイムポイントも表示されます。
■ 注意点
Whistle 、Whistle + Clap の使用は unrankable ではありません。

1msズレ

■ 背景
60000 / BPM が割り切れない場合、osu!editorでのコピーペーストにより浮動小数誤差が発生し、1 ms のズレが生じることがあります。
1 msズレは SV線の未適用や SR計算の誤差につながるため、なるべく避けたほうが良いです。

Mapset Verifier や AiMod では ±1 ms のズレは表示されません(unrankable ではないため)。
■ 検出内容
対象 snap から外れているノーツ・スライダー・スピナーを検出します。
±1 ms のズレは警告、 unsnapped のオブジェクト がある場合(±2 ms 以上のズレ)はエラーとして検出します。

終点については、スピナー終点に加えてスライダー終点のズレ検出にも対応しています。
スライダー終点は、pixelLength・SliderMultiplier・SV・BPM をもとに近似計算し、四捨五入しています。
一部の譜面では実際の editor 上の終点時刻と完全一致しない可能性があります。

基準として扱う snap は、1/1, 1/2, 1/3, 1/4, 1/6, 1/8, 1/12, 1/16 です。
この対象 snap に乗っていないオブジェクトを unsnapped として検出します。

なお、1/5, 1/7, 1/9 snap は、チェックボックスを有効にした場合のみ検出されます。
■ 検出内容(osu!stable と osu!lazer の違い)
本ツールでは、再スナップ判定とosu!stable グリッド時刻判定を分離して表示します。
再スナップ時刻、グリッド描画時刻、グリッド時刻は別々の計算処理であり、同じ整数msになるとは限りません。

osu!stable または osu!lazer の片方のグリッド時刻にのみ snap している結果は、警告にはせず白文字で表示します。

各処理の計算式、丸め方、osu!stable / osu!lazer間で1 ms差が生じる理由については、次の技術資料を参照してください。
osu!stable / osu!lazer snap時刻の計算

■ 注意点
±1 ms は unrankable ではないため、必ずしも全て修正する必要はありません。

Kiai比較

■ 背景
diffごとに kiai 総時間が異なる場合、どの区間で差があるのか分かりにくいことが多いです。
Mapset Verifier では総時間の比較はできますが、具体的にどの区間が異なるかは確認できません。
■ 検出内容
kiai 状態が一致していない区間を表示します。
Kantan、Futsuu、Muzukashii、Oni、Inner OniのKiaiタイムライン例
Kiai比較グラフの表示例。不一致区間を赤、各diffのKiai ON区間を黄色で表示します。

また、kiai time の終了地点が明示されていない場合も警告を行います(AiModと同一の機能)。
■ 注意点
diffごとに kiai を変えること自体は unrankable ではありません。特に Guest difficulty ではよく見られます。
ただし、同一作者の場合は特別な理由がない限り揃えることが推奨されることが多いです。

Kiaiスナップ

■ 背景
AiMod は unsnapped な kiai timing point を検出できますが、1/4 や 1/8 snap など、snap単位で kiai がズレている場合は検出できません。
■ 検出内容
kiai の ON/OFF が 1/1 snap 以外 に乗っている場合を検出します。

また、unsnapped な kiai line(1/1 snap + 1 ms など)も検出します(AiModと同一の機能)。

二重SV

■ 背景
二重 SV はどちらかが意図しない or 消し忘れであるケースが多いです。
AiMod は同時刻の重複 SV は検出できますが、1 ms ズレの二重 SV は検出できません。
■ 検出内容
指定した間隔(1 ~ 5 ms)以内にある、近すぎる SV line を検出します。

小節線

■ 背景
マルチタイミングの楽曲では、意図しない赤線の1msズレが生じることにより、意図しない「二重小節線」「小節線とノーツの分離」が起こることがあります。

osu!stable / osu!lazerにおける小節線描画位置の生成式、浮動小数点誤差、赤線境界での2重生成については、次の技術資料を参照してください。
osu!stable / osu!lazer 小節線描画位置の計算
■ 検出内容1:2重小節線
osu!stable と osu!lazer の生成方法をそれぞれ再現し、異なる赤線区間から生成された小節線が同時刻、または 1 ms 以内に複数存在するかを確認します。
この判定では小数時刻そのものが重要なため、lazer の生成時刻を整数化せず double のまま比較します。同時刻に複数生成された小節線も重複除去しません。
結果には [osu!stable, osu!lazer]、[osu!stable のみ]、[osu!lazer のみ] のいずれかを表示します。両クライアントで2重になる場合は赤色の Error、片方だけで2重になる場合は警告なしの白文字として表示します。片方だけの結果では、タブにも Warning / Error を付けません。

例:
[osu!lazer のみ] 02:24:992 | 同時刻に 2 本の小節線が生成されます。
■ 検出内容2:マイナス時刻開始による小節線バグ
最初の赤線がマイナス時刻にある場合、その赤線から最初に生成される小節線位置と、次の赤線位置を比較します。
最初に生成される小節線位置が次の赤線と一致する、または次の赤線を超える場合、osu!stable と osu!lazer で小節線の見え方が異なるため Warning として表示します。

次の赤線の状態 Warning 内容
omit first barline 有効 osu!stable では1本の小節線が表示されますが、osu!lazer では小節線が表示されません。
omit first barline 無効 osu!stable では2重小節線が表示されますが、osu!lazer では1本の小節線が表示されます。
■ 検出内容3:ノーツと小節線の分離
各クライアントで実際に生成される小節線の前後 1 ms 以内に Circle・Slider・Spinner の開始位置がある場合、小節線位置とオブジェクト位置の見た目のスクロール速度を比較します。さらに両者が 2 ms 離れていても、その間に赤線または緑線によるスクロール速度境界があり、境界から両者までがそれぞれ 1 ms 以内なら比較対象にします。値が一致しないものを、ノーツと小節線の分離として黄色の Warning で表示します。
小節線より後のオブジェクトについては、そのオブジェクトと同時刻にSV線がある場合、または両者を上記のスクロール速度境界が橋渡ししている場合に対象にします。
lazer が保持する小数の生成時刻も Math.trunc() で整数 ms に変換してから比較します。整数化後の時刻・対象オブジェクト・判定結果が同じ場合は、stable と lazer の結果を1件へ統合します。
omit first barline は各クライアントの生成処理で先に適用されるため、実際には描画されない小節線を基準にした誤検出は行いません。

見た目のスクロール速度は、スプレッド比較の「スクロール速度」サブタブと同じ考え方で、現在の BPM、現在の SV、SliderMultiplier から計算します。

例:
[osu!stable のみ] 02:45:635 小節線: 934.18 px/s | 02:45:636 ノーツ: 935.08 px/s | 差分: +0.9 px/s
■ 計算方法の詳細
osu!stable では osu!.exe の処理に合わせ、倍精度浮動小数点で小節長を反復加算し、描画時に conv.i4 相当の整数変換を行います。赤線境界の切り替え順序と、マイナス時刻から求める最初の候補位置も再現します。
osu!lazer ではソースコードに合わせ、小節線位置を double のまま保持し、整数から 1e-7 ms 以内の場合だけ整数へ補正します。区間の終端判定、赤線境界、omit first barline の処理も lazer の生成手順に従います。
同時刻に2本生成された小節線は重複除去せず、2本として保持します。拍子が読み取れない場合は 4/4 として扱います。

式と境界処理の詳細は、上記の「osu!stable / osu!lazer 小節線描画位置の計算」を参照してください。
■ 注意点
ノーツと小節線の分離は、意図的なギミックである可能性も、修正が必要な配置である可能性もあるため Warning として扱います。
実際に問題があるかどうかは、該当箇所の見た目を確認してください。

ボリューム早入り

■ 背景
HitObject と同時刻に volume変更を置いた場合、プレイヤーが 1 ms 早く叩くと新しい volume が適用されない場合があります。
そのため、volume変化を伴うSV線は、HitObject に対して 5 ms 以上前倒しして設置することが推奨されています(一般的には 5 ms, 1/16 snap, 1/8 snap 程度ズラす事が多いです)。
■ 検出内容
ボリューム変更を伴う SV line が、HitObject と近すぎる場合に警告します(この検出は AiMod や Mapset Verifier では行えません)。

検出閾値は、5 ms(丁度は含まない) 1/16 snap(丁度は含まない)から選択できます。

15% 以上の差のみ表示 を有効にすると、volume 差が 15% 以上の際のみ表示します。

ボリューム比較

■ 検出内容
diff間の赤線・緑線のボリュームを比較し、不一致がある区間を検出します。
(この検出は AiMod や Mapset Verifier では行えません)

5% 以上の差のみ表示 を有効にすると、volume 差が 5% 以上の区間のみを表示します。

50 ms 以上続く区間のみ表示 を有効にすると、50 ms 未満の極端に短い区間を非表示にできます。

各 diff の volume 推移を階段状の線で示すグラフを表示します。
Kantan、Futsuu、Muzukashii、Oni、Inner Oniのボリューム比較グラフ例
ボリューム比較グラフの表示例。赤背景の区間ではdiff間にvolume差があり、背景のない区間では全diffが同じvolumeになっています。

volume 差が条件を満たす区間は背景の帯で強調され、上記2つのチェックボックスの状態にも連動します。

背景オプションでは、volume 差異(赤)・Kiai time(黄)・Break(青)を切り替えられます。
同時に選択できる背景は 1 種類だけです。別の項目を選択すると、それまでの選択は自動的に解除され、選択した背景色がグラフ全体の高さに表示されます。

Kiai time と Break は、表示中の diff のどれか 1 つでも該当する場合に背景を表示します。

グラフ下部のチェックボックスからdiffごとに線の表示・非表示を切り替えられます。 非表示にした diff は、volume 差分・Kiai time・Break の背景を計算する際の対象からも除外されます。

線の色には、Diff の自動整列順を基にした仮想SRカラーを使用します。 Kantan を SR 1、Futsuu を SR 2、Muzukashii を SR 3、Oni を SR 4、Inner Oni を SR 5として扱い、 それ以上の難易度は順番に SR を 1 ずつ加算します。 これは実際の Star Rating を計算したものではありません。

グラフ上でマウスホイールを回すとカーソル位置を中心に拡大・縮小でき、左ドラッグすると表示区間を左右に移動できます。 グラフ上を右クリックすると、そのタイムスタンプを osu!editor で開きます。

SV未適用

■ 背景
SV線(緑線)は、その時刻以降のノーツや小節線に適用されます。
そのため、ノーツや自動生成される小節線の直後にSV線が置かれている場合、そのノーツや小節線には意図したSVが適用されていない可能性があります。

例えば、ノーツが T にあり、SV線が T + 1 ms に置かれている場合、そのノーツ自体はSV変更前のスクロール速度で表示されます。
同様に、小節線生成位置の直後にSV線がある場合、その小節線はSV変更前の速度で生成・表示される可能性があります。
■ 検出内容1:ノーツにSVが適用されていない可能性
各 HitObject の時刻を T として、T + 1 ms から T + 5 ms の範囲にSV線があるかを確認します。
該当するSV線がある場合、ノーツにそのSVが適用されていない可能性があるため、黄色の警告として表示します。

出力例:
00:01:000 ノーツSV x1 | 00:01:003 (+3 ms) 直後SV x1.25 | SV差 +0.25
■ 検出内容2:小節線にSVが適用されていない可能性
osu!stable と osu!lazer で実際に生成される小節線位置を別々に計算し、その時刻を T として、T + 1 ms から T + 5 ms の範囲にSV線があるかを確認します。
この判定では、lazer が保持する小数の生成時刻も Math.trunc() で整数 ms に変換します。整数化後の小節線時刻・対象SV線・判定結果が同じ場合は、stable と lazer の結果を1件へ統合します。
該当するSV線がある場合、小節線にそのSVが適用されていない可能性があるため、黄色の警告として表示します。結果には [osu!stable, osu!lazer]、[osu!stable のみ]、[osu!lazer のみ] のいずれかを表示します。

出力例:
[osu!stable, osu!lazer] 02:33:864 小節線SV x1 | 02:33:865 (+1 ms) 直後SV x0.5 | SV差 -0.5
■ 注意点
対象位置のSVと直後SVの SV差が0 の場合、見た目のスクロール速度は変化しないため検出しません。
判定は表示と同じ小数第3位までの精度で行い、丸めたSV差が 0 になる微小な差も検出対象外として扱います。

赤線 & 緑線の一致

■ 背景
同時刻の赤線(BPM line)と緑線(SV line)は、基本的に同じ設定である必要があります。
■ 検出内容
ボリューム / kiai のオンオフ / サンプルセット の不一致を検出します。

(この検出は AiMod や Mapset Verifier では行えません)
■ 注意点
最初の赤線は、osu!editor の仕様上 kiai ON にすることができません。

osu! Ranking Criteria では、譜面開始地点から kiai を有効にしたい場合、 同時刻に緑線を配置し、その緑線のみを kiai ON にすることが推奨されています。

そのため、このチェックでは「最初の赤線」と「最初の緑線」の kiai 状態が一致しない場合については、 警告を出さないようになっています。

また、最初の赤線と緑線では、意図的に volume を変更している場合があります。 そのタイムポイントより前は赤線の volume が適用され、それ以降は緑線の volume が適用されるためです。

サンプルセット

■ 背景
BPM線(赤線)やSV線(緑線)、および各 HitObject には、sampleset と呼ばれる効果音の種類を割り当てることができます。
sampleset はヒット音の「音色」を決める設定で、主に以下の種類があります:
  • 1: Normal
  • 2: Soft
  • 3: Drum
osu!taiko モードでは、大抵の場合 1: Normal のみを使用するため、それ以外の sampleset が含まれている場合は、意図しない効果音が混入している可能性があります。
■ 検出内容
Normal 以外の sampleset やカスタムヒットサウンドを検出します。
(この検出は AiMod や Mapset Verifier では行えません)

赤線・緑線では、以下を検出します:
  • sampleset ≠ 1 (normal) → 2: Soft / 3: Drum
  • sampleIndex ≠ 0 → カスタムヒットサウンド
ノーツ、スライダー、スピナーでは、以下を検出します:
  • normalSet > 1 → 2: Soft / 3: Drum
  • additionSet > 1 → 2: Soft / 3: Drum
  • sampleIndex ≠ 0 → カスタムヒットサウンド
  • filename が指定されている → カスタム音源
スライダーの各エッジに設定されたヒットサウンドも検出します:
  • edgeSets.normalSet > 1 → 2: Soft / 3: Drum
  • edgeSets.additionSet > 1 → 2: Soft / 3: Drum

スライダー感度・目盛り

■ 背景
taiko モードでは、スライダー感度(SliderMultiplier)は基本的に 1.40 に設定します。

スライダー目盛り(SliderTickRate)は通常 1 を用いますが、
swingリズムの曲では 3 を用います。
■ 検出内容
SliderMultiplier が 1.40 ではない場合に警告します

全ての HitObject の位置から 1/3 snap の割合を計算し、割合が 30% 以上の場合は swingリズムとして扱います(1/3 snap から 1ms ズレしたノーツも考慮しています)。

swingリズムと判定された場合は SliderTickRate = 3、それ以外の場合は SliderTickRate = 1 を推奨値として表示し、実際の値と異なる場合に警告します

(この検出は AiMod や Mapset Verifier では行えません)。
■ 注意点
SliderMultiplier = 1.40 は、osu!taiko ranked map で最も一般的に使用されている値です。

ただし、1.40 以外の値の使用が禁止されている訳ではありません。
例えば:
  • 高 BPM 譜面の low diff において、1.40 より低い SliderMultiplier を使用するケース (参照:Taiko Checklist V1.2 by iRedi)
  • 低 BPM 譜面で、審美性や既存 SV 構造を維持するために、 SV 値を変更せず SliderMultiplier側を調整するケース
  • Swing 楽曲において、SliderMultiplierを上げることで、 1/3・1/6 snap を視覚的に 1/2・1/4 snap に近づけ、 readability や審美性を改善するケース
「1/3 snap の割合が 30% 以上」という基準は、このツール上で便宜的に設定した値です。
そのため、この値を下回っている swing rhythm map や、 この値を上回っている straight rhythm map が存在する可能性があります。

最終的には、曲のリズムや譜面内容を確認した上で判断してください。

プチフリ

■ 背景
osu! では、音源の読み込み時に一瞬のフリーズ(プチフリーズ)が発生する場合があります。

音源開始直後に最初のノーツが配置されていると、ノーツが画面に表示されている最中、または判定枠に近い位置でこのフリーズが発生し、正しいリズムで叩くことが難しくなる可能性があります。

そのため、最初のノーツが音源開始直後に置かれている場合は、音源ファイルの先頭に 500 ~ 1000 ms 程度の無音を挿入することが一般的に推奨されています。
■ 検出内容
最初のノーツが、音源開始時点で画面内のどの位置に表示されているかを推定します。
Circle オブジェクトのみを対象とし、Slider や Spinner は検出対象外です。

BPM と SV から osu!taiko のスクロール速度を推定し、16:9 環境を基準として、ノーツが画面に入ってから判定枠に到達するまでの時間を計算します。

参考: Note Speed Mechanics

結果には、以下の情報を表示します:
  • Visible:ノーツが画面に入ってから判定枠に到達するまでの推定時間
  • Remain:音源開始時点で、判定枠までどの程度残っているかの推定割合
    (音源開始時点でのノーツ位置)
■ 判定基準
  • 警告:Remain ≤ 50%
  • エラー:Remain ≤ 25%
■ 注意点
この判定は、16:9 環境を基準にした推定です。
実際の見え方は、画面比率、スキン、HR の有無、osu!stable / osu!lazer の違い、PC環境などによって変わる可能性があります。

また、プチフリの発生タイミングや強さは環境依存です。
このチェックは「必ず問題が起こる」ことを示すものではなく、音源開始直後のノーツ配置が危険かどうかを確認するための目安として使用してください。

メタデータ:アーティスト

■ 背景
Artist / ArtistUnicode は、mapset内の全diffで基本的に一致している必要があります。

また、feat.、vs.、CV: などの marker は、 Ranking Criteria に沿った標準表記にする必要があります。
■ 検出内容
以下を検出します。
  • 全diffで Artist / ArtistUnicode が一致しているか
  • 特殊記号が推奨Romanised表記に変換されているか
  • feat.、vs.、CV:、VO: などの marker 表記が正しいか
  • カンマの後ろにスペースがあるか
  • 連続する半角スペースや全角スペースが含まれていないか
詳細なチェック対象は、 Metadata チェックリスト を参照してください。

メタデータ:タイトル

■ 背景
Title / TitleUnicode は、mapset内の全diffで基本的に一致している必要があります。

また、(TV Size)、(Short Ver.)、(Game Ver.) などの version marker は、 Ranking Criteria に沿った標準表記にする必要があります。
■ 検出内容
以下を検出します。
  • 全diffで Title / TitleUnicode が一致しているか
  • 特殊記号が推奨Romanised表記に変換されているか
  • (Short Ver.)、(Game Ver.)、(Movie Ver.) などの title marker 表記が正しいか
  • タイトル内の (feat. Artist) 表記が正しいか
  • 連続する半角スペースや全角スペースが含まれていないか
詳細なチェック対象は、 Metadata チェックリスト を参照してください。
■ 注意点
(Extended Edit) or (Extended Ver.) の判断は、公式のExtendedであるか非公式のExtendedであるかに依存します。

このツールでは、主に「既に似た marker があるが標準表記ではない」ケースを検出するだけです。

メタデータ:ソース

■ 背景
東方作品の Source は、一般的に 日本語タイトル + 全角スペース + 全角チルダ + 半角スペース + 英語タイトル + ピリオド
という独特な形式で表記されることが多いです。

例: 東方風神録 ~ Mountain of Faith.
■ 共通チェック
まず、全diffで Source が一致しているかを確認します(Mapset Verifier と同一の機能)。
■ 検出内容 1:東方
Source を東方作品名のリストと照合します。
チェックリスト

完全一致する場合は OK として表示します。

東方作品と思われる Source で、既知の作品名と表記が微妙に異なる場合は、スペルミスやスペースの全角 / 半角ミスの可能性があるため警告します。
その場合、推奨表記と参照リンクを表示します。

また、東方 や Touhou などの汎用的な表記のみの場合も、具体的な作品名が不足している可能性があるため確認対象として表示します。
■ 検出内容 2:ソースの表記チェック
東方作品名のチェックとは別に、次のSource表記候補を表示します。
  • ブルーアーカイブ または Blue Archive:ブルーアーカイブ -Blue Archive-
  • プロジェクトセカイ を含む、または大文字小文字を問わず Project Sekai を含む:プロジェクトセカイ カラフルステージ!
  • ウマ娘 を含む:ウマ娘 プリティーダービー
正規表記と完全一致している場合は候補を表示しません。
■ 注意点
このチェックは、特定作品の Source 表記を補助的に確認するための機能です。
東方チェックの検出対象に該当しない Source は、東方作品名チェックの対象外として扱います。

また、未知の東方作品名や、ゲーム作品以外の東方関連作品、特殊な表記については正しく判定できない場合があります。その場合は、表示された結果だけで判断せず、公式サイトや beatmap submission の内容を確認してください。

メタデータ:タグ

■ 背景
Tag と Tag の間は、半角スペース1つ で区切る必要があります。

2つ以上の半角スペース や全角スペース が含まれている場合、AiMod や Mapset Verifier では、検知できません。
■ 検出内容
まず、全diffで Tags が一致しているかを確認します(Mapset Verifier と同一の機能)。

その後、各diffの Tags に対して、以下の問題を検出します:
  • Tag と Tag の間に、2つ以上の半角スペースが含まれている場合
  • Tag と Tag の間に、全角スペースが含まれている場合
  • 同じ tag が2つ以上含まれている場合
  • Title / Artist / Source に含まれる語が Tags にも含まれている場合
  • スペルミスの可能性がある tag
  • 関連 tag / abbreviation の追加候補
重複タグチェックでは、Tags 内に同じ tag が複数含まれている場合に警告します。
また、Title / TitleUnicode / Artist / ArtistUnicode / Source を半角スペース区切りで tag のように扱い、そこに含まれる語が Tags にも含まれている場合も確認対象として表示します。

スペルチェックでは、主にジャンル名や mapping 関連の tag を対象に、1文字違い・1文字抜け・1文字多い可能性がある tag を検出します。
例:hardcroe → hardcore, vocaliod → vocaloid

関連tag / abbreviation 候補では、特定の tag が含まれている場合に、併記されることが多い tag を追加候補として表示します。
例:jpop → j-pop, pop / tiebreaker → tb

Tagのチェックリスト

この検出は AiMod や Mapset Verifier では行えません。
■ 注意点
スペルチェックや関連tag候補は、必ず修正・追加が必要なエラーではありません。
特にジャンル名や abbreviation は譜面内容や楽曲情報によって適切な tag が変わるため、最終的には mapper / modder / BN が内容を確認して判断してください。

また、対応している tag の種類は限定的であり、全てのスペルミスや関連tagを検出できるわけではありません。

メタデータ:コンテンツ使用許可

■ 背景
osu! では、アーティスト・レーベル・作品によって、使用やアップロードが禁止または制限されている場合があります。

このチェックは、osu!official の Content usage permissions、 権利者による利用ガイドライン、 過去の DMCA 申立て情報などをもとに、 使用・アップロード時に注意が必要なコンテンツを検出します。

詳細な対応一覧・ガイドライン・DMCA 原文リンクは、 Content Permission Check 一覧 を参照してください。
■ 検出内容
各 difficulty の metadata から、以下の項目を確認します。

  • Artist
  • ArtistUnicode
  • Title
  • TitleUnicode
  • Source
  • Tags
これらの項目に、使用禁止・条件付き許可・利用制限・過去の DMCA 申立てに関連するキーワードが含まれている場合、 warning または error として表示します。

一部のブランド・レーベルでは、代表的な楽曲タイトルも検出対象に含まれています。
■ 注意点
このチェックは、使用・アップロード前の確認を補助するためのものです。
警告が出た場合でも、必ずしも使用不可であるとは限りません。

特に、Featured Artist や個別許諾などにより、例外的に使用できる場合があります。
warning が出た場合は、リンク先のガイドラインや DMCA 原文を確認し、現在の権利状況を確認してください。

また、楽曲タイトルを複数記載している項目は、代表例を挙げているものであり、網羅的な一覧ではありません。

その他:プレビューポイント

■ 背景
mapset 全体のオフセットを変更した場合、HitObject や TimingPoint は修正していても、PreviewTime の変更を忘れることがあります。

また、diff ごとに異なる PreviewTime が設定されていたり、 一部 difficulty のみ PreviewTime が未設定になっている場合があります。

さらに、audio file が mp3 かつ可変ビットレート(VBR)の場合、 osu-web 上でプレビューポイントの再生位置が意図した位置からずれることがあります。
これは ogg の可変ビットレートでは通常問題にならない一方で、 mp3 の可変ビットレートでは osu-web 側の再生位置計算と相性が悪く、 PreviewTime 自体が正しく設定されていても、web 上のプレビュー開始位置だけがずれて見える場合があるためです。
■ 検出内容
PreviewTime が snap からずれている場合、warning として表示します
(この検出は AiMod や Mapset Verifier では行えません)。
snap時刻は、osu!stable の「すべてのノーツを再スナップする」と同じ計算方法で判定します。
タイムライングリッドの時刻は別の計算方法で生成されるため、判定結果がタイムライングリッドと一致しない場合があります。

また、以下の内容も検出します:
  • diff 間で PreviewTime が一致していない → error
  • PreviewTime が設定されていない → error
  • .osz 内の mp3 が可変ビットレート(VBR)である → warning
■ 検出内容:mp3の可変ビットレート判定
.osz ファイルを読み込んだ場合、譜面で参照されている mp3 の実ファイルを確認し、 可変ビットレート(VBR)である可能性がある場合は warning として表示します。

判定では、Xing / VBRI などの VBR ヘッダや、 複数の mp3 フレーム間でビットレートが変化しているかを確認します。
単体の .osu ファイルのみを読み込んだ場合は audio file 本体を確認できないため、この判定は行えません。

ogg の可変ビットレートは、このチェックでは warning にしません。
問題になるのは主に mp3 の可変ビットレートであり、 osu-web 上でプレビューポイントがずれてしまう可能性があるため、 warning が出た場合は固定ビットレート(CBR)の mp3 を使用することを検討してください。
■ 注意点
PreviewTime が snap 上にないことは、必ずしも unrankable を意味するわけではありません。

ただし、オフセット変更後の修正漏れを見つける手がかりになるため、warning が出た場合は意図した位置かどうか確認してください。

mp3 の可変ビットレート warning は、譜面上の PreviewTime が間違っているという意味ではありません。
osu!stable や editor 上では問題なく聞こえても、osu-web 上のプレビュー再生だけが意図しない位置になる可能性があるため、 web 上での確認や固定ビットレートへの変換を検討してください。

その他:BG

■ 背景
[Events] セクション内の background event では、背景画像のファイル名と表示位置のオフセットを指定できます。

例:
[Events]
//Background and Video events
0,0,"BG.jpg",0,40
background event は、以下の形式で記述されます:
0,0,filename,xOffset,yOffset

xOffset / yOffset が 0,0 の場合、記述は省略されることがあります。
■ 検出内容1:BGのオフセット差分
mapset 内の各 difficulty について background event を読み取り、同じ背景画像ファイルを使用している difficulty 間で xOffset / yOffset が一致しているかを確認します。

同じ background file を使用しているにもかかわらず、diff 間で offset が異なる場合は warning として表示します。

この検出は AiMod や Mapset Verifier では行えません。
■ 検出内容2:背景画像形式
background event で参照されている背景画像ファイルの拡張子を確認し、 .jpg / .jpeg / .png を識別します。
背景画像に .png が使用されている場合は、容量削減の観点から .jpg 形式が推奨されるため warning として表示します。

.osz ファイルを読み込んだ場合は、画像ファイル本体のシグネチャも確認します。 拡張子が .jpg / .jpeg なのに実体が PNG、または 拡張子が .png なのに実体が JPEG の場合は error として表示します。

複数の background event がある場合は、それぞれの画像ファイル名と形式を一覧で表示します。
■ 注意点
異なる background file を使用している difficulty 同士は比較対象外です。

例えば、Kantan では BG.jpg、Muzukashii では BG2.jpg を使用している場合、 それぞれ別の背景画像として扱うため、offset が異なっていても warning にはしません。

また、同じ background file で offset が異なる場合でも、意図的な演出である可能性があります。
warning が出た場合は、修正漏れか意図的な差分かを確認してください。

その他:点滅・てんかん警告

■ 背景
osu! では、繰り返しのストロボ発光や高速な点滅演出が含まれる storyboard / video / kiai effect を使用する場合、 epilepsy warning の表示が必要になる場合があります。

特に osu!taiko の kiai effect では:
  • hit object flash
  • star fountain
  • 画面側面の flash
などの演出が BPM に応じて高速化するため、 高BPM や短時間の kiai flash を多用した譜面では、視覚的刺激が強くなる可能性があります。

本機能は、そのような「高頻度の点滅演出」の可能性を補助的に確認するための機能です。
■ 検出内容1:Kiai Flash 頻度
Kiai の OFF → ON 切り替え頻度を解析し、 短時間に繰り返される Kiai flash を検出します。

このチェックでは:
  • 2 Hz 以上:Caution
  • 3 Hz 以上:Warning
として表示します。

例えば:
ON 100ms
OFF 233ms
ON 100ms
OFF 233ms
ON 100ms
のように、短時間で繰り返し Kiai が ON になる場合は、 高頻度 flash として確認対象になります。

Kiai flash は、Kiai の OFF → ON 切り替え間隔から推定しています。
一般的に、3 Hz 以上の点滅は photosensitive epilepsy の観点から注意対象とされているため、 本ツールでは 1秒間に3回以上の Kiai ON が発生する場合を Warning として扱います。
■ 検出内容2:高BPM Kiai
Kiai 中の BPM を解析し、 高BPM による高速な kiai flash の可能性を確認します。

osu!taiko の kiai effect は BPM に応じて flash 頻度が増加するため、 高BPM の Kiai は視覚的刺激が強くなる場合があります。

本ツールでは:
  • 300 BPM (5 Hz) 以上:Caution
  • 360 BPM (6 Hz) 以上:Warning
として表示します。

表示では、以下の情報を出力します:
  • BPM:その Kiai 区間の BPM
  • Hz:推定 flash frequency(BPM / 60)
  • start - end:該当区間
一般的に、3 Hz 以上の点滅は photosensitive epilepsy の観点から注意対象とされています。
ただし、osu!taiko の kiai effect は fullscreen strobe ではないため、 本ツールではより高い BPM を基準として確認対象を表示しています。
■ 注意点
表示された結果が、そのまま warning 必須・unrankable を意味するわけではありません。

epilepsy warning はビデオ・ストーリーボード用のものであるため、Kiaiフラッシュの検出結果だけを理由に toggle を ON にする必要はありません。

実際の視覚刺激の強さは:
  • flash の面積
  • brightness / contrast
  • flash の継続時間
  • storyboard / video の内容
  • プレイヤー環境
などによって大きく変化します。

特に storyboard や video の flash は、本ツールでは解析していません。
最終的には実際のプレイ映像や storyboard 内容を確認した上で判断してください。

スプレッド比較:Diff順

■ 背景
mapset 内の複数 difficulty が適切な難易度順・難易度差で構成されているかを確認するための機能です。
主に、低難易度から高難易度に向かって、OD / HP、ノーツ数などが自然に変化しているかを一覧で確認することを目的としています。
■ 検出内容
Diff順は、difficulty 名から自動推定されます。

自動推定できない difficulty は Unknown として表示されます。
Unknown は必ず手動確認が必要なため、Diff順タブでは赤色で表示されます。

Diff順は、以下の方法で手動調整できます:
  • カテゴリのプルダウンから、Kantan / Futsuu / Muzukashii 等を選択する
  • ↑ / ↓ ボタンで同カテゴリ内の順番を微調整する
この手動調整後の順番は、OD / HP、ノーツ数、フィニッシャーの各表示にも反映されます。
■ 注意点
Guest difficulty やカスタム難易度名が含まれる場合、Diff 順の自動推定が完全ではないため、Diff順やカテゴリは手動で調整する必要があります。

Spread チェックは、自動的に unrankable を断定する機能ではありません。
特に、Guest difficulty が含まれる場合は spread gap が許容されやすいことには注意が必要です。

また、ノーツ数、OD / HP、フィニッシャー配置は spread の一部の要素に過ぎません。
実際の難易度差は、リズム、密度、BPM、SV、パターン、hand usage、stream / burst の長さなどにも大きく影響されます。

最終的には譜面内容を確認した上で判断してください。

スプレッド比較:OD・HP

■ 検出内容
各 difficulty の OverallDifficulty と HPDrainRate を一覧表示します。
また、前の difficulty からの差分として Delta OD と Delta HP も表示します。

OD / HP が osu!taiko Ranking Criteria のルールから外れている場合は Warning として表示します。
(Mapset Verifier と同様の機能)。

また、差分については以下の場合に Warning として表示します:
  • Delta OD ≤ 0:上位 difficulty で OD が上がっていない場合
  • Delta HP > 0:上位 difficulty で HP が上がっている場合
※ ノーツ数が多い場合や曲が長い場合は、HPを下げる必要があります。

スプレッド比較:ノーツ数

■ 検出内容
各 difficulty のノーツ数を一覧表示します。Slider と Spinner はノーツ数には含めません。

表示される項目は以下の通りです:
  • Notes:Circle の総数
  • Δ prev:前の difficulty からのノーツ数差分
  • Ratio:前の difficulty に対する倍率(例:x1.80)
difficulty pair ごとの Ratio が適切であるかを 以下の表のに基づき判定します。

低難易度では Ratio が大きく出やすく、逆に高難易度では Ratio が小さく出やすいため、一律の閾値ではなく、spread の種類ごとに別々の基準を使用しています。
■ 警告条件
黄色:警告
赤色:エラー
ペア ギャップ小 ギャップ小 ギャップ大 ギャップ大
Kantan → Futsuu < 1.55 1.55 – 1.60 2.15 – 2.30 ≥ 2.30
Futsuu → Muzukashii < 1.20 1.20 – 1.27 1.58 – 1.65 ≥ 1.65
Muzukashii → Oni < 1.13 1.13 – 1.17 1.48 – 1.55 ≥ 1.55
Oni → Inner Oni+ < 1.00 1.00 – 1.10 1.45 – 1.55 ≥ 1.55
Inner Oni+ → Above < 1.00 1.00 – 1.02 1.32 – 1.50 ≥ 1.50
■ 補足(Ratio の基準について)
この Ratio の判定基準は、本ツールを用いて集計した 2026年 ranked osu!taiko mapset 100件の統計傾向を参考に、 便宜的に設定した目安です。

統計ページ: Spread Ratio Statistics

Ratio という概念は、Chromoxx 氏によるこちらのフォーラムを参考にしています:
BNになれるmod力を身に着けよう!(osu!taiko)

Warning や Error が表示された場合でも、それ自体が unrankable を意味するわけではありません。

また、Ratio は「ノーツ数の倍率」による簡易評価であり、 実際の difficulty spread を完全に表すものではありません。

特に:
  • 低難易度では Ratio が過大評価されやすい
  • 高難易度では Ratio が過小評価されやすい
  • Guest difficulty や特殊 spread では大きく外れる場合がある
傾向があります。

最終的な判断は Ratio の数値だけでなく、 ノーツ数差分・配置密度・パターン難易度なども含めて総合的に行ってください。

スプレッド比較:ノーツ密度

■ 背景
総ノーツ数が難易度順に増えていても、曲中の一部区間では、下位 difficulty の方が上位 difficulty よりもノーツ密度が高くなっている場合があります。

このチェックは、そのような局所的なノーツ密度の逆転を確認するための機能です。
■ 検出内容
各 difficulty について、1小節ごとの Circle ノーツ数(Slider / Spinner は含めません)を計算し、隣接する difficulty 間で比較します。

同じ小節内で、下位 difficulty のノーツ数が上位 difficulty のノーツ数を上回っている場合、確認対象として表示します。

各 diff の小節ごとのノーツ密度を階段状の線で示すグラフを表示します。
Kantan、Futsuu、Muzukashii、Oni、Inner Oniのノーツ密度グラフ例
ノーツ密度グラフの表示例。赤背景の区間では、下位 difficulty のノーツ密度が上位 difficulty を上回っています。

密度逆転の条件を満たす小節は背景の帯で強調され、ノーツ密度の逆転を表示 のチェックボックスに連動します。
また、表示オプションが有効なときは、問題があるdiffのみが自動的に表示されます。問題がないdiffは非表示になります。
■ 注意点
このチェックは、局所的なノーツ密度の逆転を確認するための補助機能です。
表示された結果が、そのまま unrankable や問題を意味するわけではありません。

以下のような理由で、一時的に下位 difficulty の方が高密度になる場合があります。
  • 上位 difficulty で休符を作り、別区間で密度を上げている場合
  • 下位 difficulty が主旋律を取り、上位 difficulty が別の音取りをしている場合
  • Guest difficulty が含まれている場合
そのため、表示された小節については、実際の音取りや譜面構成を確認した上で判断してください。

また、小節境界付近の 1 ms 程度のズレによって、ノーツが前後の小節に誤って分類されることを防ぐため、小節境界から ±3 ms 以内のノーツは境界側に補正して扱います。

スプレッド比較:Rest moment

■ 検出内容
MapsetVerifier の Taiko Compose / Rest moment を参考に、Kantan / Futsuu / Muzukashii / Oni の continuous mapping が長すぎる区間を検出します。
実装は MapsetVerifier の CheckRestMoments.cs を参考にしています。

gap の計算方法は基本的に MapsetVerifier と同じです。rest moment として扱う gap の判定では、実際の gap に 2 ms の許容幅を足して必要な長さに届くかを確認します。例えば 1/1 の rest が必要な場合、実際の gap が 1/1 ちょうどから最大 2 ms 短い程度であれば、タイミング誤差として rest moment として扱います。

Difficulty 必要な休憩として扱う gap Warning Error
Kantan 3/1 以上 36/1 超過 44/1 超過
Futsuu 2/1 以上 36/1 超過 44/1 超過
Muzukashii 3/2 以上、または 1/1 以上の gap が3回連続 36/1 超過 44/1 超過
Oni 1/1 以上 20/1 超過 32/1 超過
■ 注意点
デフォルトでは、270 BPM 以上の区間は 0.5倍、110 BPM 以下の区間は 2倍 に変換します。これらの閾値と倍率は手動で調整できます。
再計算時にスライダーやスピナーを無視することもできます。

しきい値表では、基準しきい値と補正後しきい値を表示します。補正後しきい値は、変換後の dominant BPM を使い、180 BPM を基準として計算します。

Rest moment 計算オプションでは、gap 計算としきい値計算をそれぞれ ms 基準に切り替えることもできます。ms 判定では 180 BPM の拍長を基準にし、1/1 = 333.333 ms、2/1 = 666.667 ms、3/2 = 500 ms、3/1 = 1000 ms として扱います。
gap 計算を ms で判定する を有効にすると、BPM 変換オプションは無効になります。しきい値を ms で判定する を有効にすると、BPM 補正後のしきい値は無効になります。しきい値表の gap 欄と Warning / Error 欄も、選択中の判定方法に合わせて ms 表示へ切り替わります。

MapsetVerifier とは BPM の変換方法が異なります。MapsetVerifier 側の BPM 正規化は TaikoUtils.cs の GetNormalizedMsPerBeat() を参考にしてください。
項目 MapsetVerifier modding-helper
BPM 270 以上 rest 判定用の snap 間隔を 1/2 倍にします。 デフォルトでは、BPM を 0.5 倍に変換して rest moment 判定と長さ計算に使います。
BPM 130 以上 rest 判定用の snap 間隔を 1.5 倍にします。 デフォルトでは、この条件による変換は行いません。
BPM 110 以下 rest 判定用の snap 間隔を 2 倍にします。 デフォルトでは、BPM を 2 倍に変換して rest moment 判定と長さ計算に使います。
continuous mapping の長さ計算 36/1 などの長さ計算には、変換後ではなく元の BPM を使います。 変換後 BPM を使います。倍取り譜面などで、実際に見たい拍長に合わせて検出するためです。
調整方法 MapsetVerifier 側の固定ロジックです。 高BPM / 低BPM の変換条件と倍率を、Rest moment 計算オプションから手動で調整できます。

スプレッド比較:フィニッシャー

■ 検出内容
全 difficulty の Finisher 配置を比較し、Finisher が付いているタイムポイントを一覧表示します(1ms ズレは同一時刻として扱っています)。

表示では、以下の記号を使用します:
  • D:Don の Finisher
  • K:Kat の Finisher
  • -:ノーツがない or 小ノーツ or スライダー or スピナー
Finisher の表は、以下の3種類に分けて表示されます:
  • フィニッシャー欠損:一部の difficulty に Finisher が存在しない
  • D/K 不一致:全 difficulty で Finisher ではあるが、D / K の種類が一致していない
  • 完全一致:全 difficulty で Finisher であり、D / K の種類も一致している
このタブでは警告判定は行わず、比較しやすい形で情報を表示することを目的としています。

スプレッド比較:スクロール速度

■ 背景
osu!taiko Ranking Criteria では、 低難易度である Kantan / Futsuu / Muzukashii において、急激な Slider Velocity 変化や読み取りにくいスクロール変化を避けるべきとされています。

低難易度で視認性を損なうような急激なスクロール速度変化がないかを確認します。

また、スプレッド全体としてのスクロール速度も解析し、以下のような事項も確認します。
  • difficulty が上がるにつれて、スクロール速度が不自然に逆転していないか
  • 同じ時間帯のスクロール変化が、difficulty ごとに大きく矛盾していないか(加速 or 減速等)
■ 検出内容 1:スクロール速度
単純な SV 値だけでは、BPM や SliderMultiplier の影響を考慮できないため、
このチェックでは実際の見た目に近いスクロール速度を比較するために、有効スクロール速度(effective scroll speed, eSV )を使用します。
effective scroll speed = 175 × SliderMultiplier × SV × BPM / 60
有効スクロール速度は、「ノーツが1秒間に画面上を何ピクセル移動するか」を表す値です。
このチェックの検出対象は、通常ノーツに加えて、スライダーとスピナーの開始位置も含みます。
単位は px/s(pixels per second)です。
また、SM 1.4・SV x1.0 と仮定した場合の 見た目BPM に換算して表示することもできます。

グラフに表示する内容
Kantan、Futsuu、Muzukashii、Oni、Inner Oniのスクロール速度グラフ例
スクロール速度グラフの表示例。各diffの有効スクロール速度を階段状の線で表示します。
Kantan、Futsuu、Muzukashii、Oni、Inner Oniのスクロール速度変化量グラフ例
スクロール速度変化量グラフの表示例。隣接するノーツ・スライダー・スピナー間で発生した速度変化を点で表示します。

グラフは2種類あります。どちらのグラフも、Diff順に基づく仮想SRカラーで線や点を色分けします。
この色分けは実際のStar Ratingを計算したものではありません。

1つ目の「スクロール速度グラフ」では、各ノーツ・スライダー・スピナーの開始時点で有効なスクロール速度を階段状の線で表示します。
縦軸は px/s または 見た目BPM に切り替えられます。
カーソルを合わせると、その時点のスクロール速度・BPM・SV・SliderMultiplierを確認できます。

2つ目の「スクロール速度変化量グラフ」では、隣接するノーツ・スライダー・スピナー間で発生した速度変化を点で表示します。
値は 変化後の速度 - 変化前の速度 で、縦軸は Δ px/s または Δ 見た目BPM に切り替えられます。
加速はゼロ線より上、減速は下に表示され、細い線は変化の推移を見るための補助線です。
カーソルを点の近くに合わせると、変化前後の速度・変化量・倍率・隣接オブジェクト間隔を確認できます。

どちらのグラフも、マウスホイールでカーソル位置を中心に拡大・縮小でき、左ドラッグで表示区間を左右に移動できます。右クリックするとそのタイムポイントをosu!editorで開けます。
また、ホバー情報を詳細表示 を有効にすると、簡易表示よりも詳しい情報を確認できます。

グラフには以下の4つの表示オプションがあります。
  • 速すぎるスクロール速度の目安値を破線で表示:該当するdiffの目安値を、Diffカラーの破線で表示します。
  • 急激な速度変化を表示:既存の警告条件を満たす区間を、速度グラフでは半透明背景、変化量グラフでは強調点で表示します。
  • 不自然なスクロール速度Progressionを表示:Diff順に対してスクロール速度の推移が不自然な箇所を強調します。
  • スクロール変化の整合性問題を表示:低難易度側の変化が強すぎる箇所や、変化方向が逆になっている箇所を強調します。
これら4つの表示オプションは同時に有効にできません。別の項目を有効にすると、それまでの選択は自動的に解除されます。
また、表示オプションが有効なときは、問題があるdiffのみが自動的に表示されます。問題がないdiffは非表示になります。

表に表示する内容
表では、各diffのスクロール速度の概要と、検出された確認対象をテキストで表示します。
主な表示内容は以下の通りです。
  • Min px/s:そのdiff内で最も遅い有効スクロール速度
  • Max px/s:そのdiff内で最も速い有効スクロール速度
  • Delta:最大速度と最小速度の差
  • Ratio:最大速度 / 最小速度
  • SV range:そのdiff内で使用されているSVの範囲
  • 急激な速度変化:隣接するノーツ・スライダー・スピナー間でスクロール速度が急激に変化している箇所
  • スクロール速度Progression:Diff順に対してスクロール速度の推移が不自然な箇所
  • スクロール変化の整合性:同じ時間帯の速度変化がdiff間で大きく矛盾している箇所

実際にノーツ・スライダー・スピナーが存在する区間のスクロール速度のみを対象としています。
ノーツ・スライダー・スピナーが存在しない区間のSV変更は、演出用SVなどによる誤検出を防ぐため無視されます。

■ 警告条件 1
下位 difficulty において、急激なスクロール速度変化が発生している箇所を検出します。
  • eSV差:eSV after - eSV before
  • eSV倍率:eSV after / eSV before
  • ノーツ間隔:変化前後のノーツ・スライダー・スピナー間の時間差
Difficulty eSV差 eSV倍率 ノーツ間隔 判定
Kantan 以下 / Kantan ≥ 80 px/s ≥ x1.15 ≤ 1500 ms Warning
Futsuu ≥ 80 px/s ≥ x1.15 ≤ 1250 ms Warning
Muzukashii ≥ 160 px/s ≥ x1.25 ≤ 1000 ms Warning
Oni / Inner Oni 以上 - - - 対象外
上記の3条件をすべて満たした場合のみ Warning として表示します。

eSV差とeSV倍率は、それぞれ異なる種類の急変を検出するために使用します。
例えば、eSV差が大きくてもeSV倍率が小さい場合は「高速帯での微調整」である可能性があり、
逆にeSV倍率が大きくてもeSV差が小さい場合は「低速帯での小変化」である可能性があります。

そのため、このチェックでは「eSV差」と「eSV倍率」の両方を満たした場合のみ Warning として扱います。

ノーツ・スライダー・スピナー間隔は、「どれくらい急激に速度が変化したか」を判定するために使用します。
例えば、同じ速度差でも、数秒かけてゆっくり変化している場合は Warning になりません。

この機能のアイデアは、Hivie による MVTaikoChecks の feature request を参考にしています。
参考: Add a drastic SV change warning for lower difficulties

この feature request では、Hivie が数名の BN と相談した結果として、 lower difficulty における急激な SV 変化の目安に以下の値が挙げられています:
  • Kantan / Futsuu:SV差 > 0.1
  • Muzukashii:SV差 > 0.2
  • Oni:SV差 > 0.3
ただし、本ツールでは Ranking Criteria の改定により、Oni 以上の difficulty はこのチェックの対象外としています。

例えば BPM 180 、SliderMultiplier 1.4 の場合、 SV 差 0.1 は約 73.5 px/s、 SV 差 0.2 は約 147 px/s に相当します。
そのため、本ツールではそれらに近い実用的な値として、 Kantan / Futsuu では 80 px/s、 Muzukashii では 160 px/s を使用しています。

maxGapMs については、difficulty が上がるほど一般的にオブジェクト間隔が短くなるため、 Kantan = 1500 ms、 Futsuu = 1250 ms、 Muzukashii = 1000 ms というように、段階的に短くしています。
■ 注意点
この判定は、本ツール上で便宜的に設定した目安です。
Warning が表示された場合でも、それ自体が unrankable を意味するわけではありません。

スクロール速度変化が曲の展開・音取り・休憩・演出に対応している場合は、問題ない可能性があります。
最終的には、実際の譜面内容とプレイ時の読みやすさを確認して判断してください。

また、Oni 以上では大きなSV変化が演出や難易度表現として使われることが多いため、このチェックでは Warning 対象外としています。
■ 警告条件 2
有効スクロール速度の不自然な Progression を検出します 有効スクロール速度が difficulty 順に一方向へ増加・減少、または同じ値のまま進行している場合は問題なしとします。

例えば、以下のような progression は問題なしとして扱います。
  • 520 → 610 → 720 → 800:difficulty が上がるにつれて速度が上がっている
  • 800 → 720 → 610 → 520:difficulty が上がるにつれて速度が下がっている
  • 640 → 640 → 640 → 640:全 difficulty で同じ速度
一方で、以下のように途中で進行方向が反転する場合は確認対象として表示します。
  • 610 → 750 → 680 → 820:増加した後に一度減少している
  • 800 → 700 → 760 → 650:減少した後に一度増加している
difficulty ごとにノーツ配置や timing が完全一致しない場合があるため、±10 ms 以内に発生したスクロール速度変化を、同じタイミングの変化として扱います。

この機能のアイデアは、Nostril による MVTaikoChecks の feature request を参考にしています。
参考: MVTaikoChecks issue #32
■ 検出内容 2:スクロール変化の整合性
各 difficulty において、隣接するノーツ・スライダー・スピナー間の有効スクロール速度(eSV)の変化量を計算し、difficulty 間で比較します。

この機能は:
  • 下位 difficulty の方が上位 difficulty より強い局所スクロール変化を持っていないか
  • 同じタイミング付近で、difficulty ごとにスクロール変化の方向が不自然に異なっていないか
を確認するための補助機能です。

表示内容は以下の通りです。
  • Δ px/s:隣接するノーツ・スライダー・スピナー間で発生した eSV の変化量(eSV after - eSV before)
  • Speed Multiplier:eSV の変化前後の値と倍率。
    例:420 → 735 (x1.75)
  • Note Interval:eSV 変化が発生した2つの隣接するノーツ・スライダー・スピナー間の時間差
例えば、下位 difficulty では 420 → 735 のような大きな加速がある一方で、上位 difficulty では同じタイミング付近の変化が小さい場合、確認対象として表示されます。

また、同じタイミング付近で、一方の difficulty は加速、もう一方の difficulty は減速している場合も確認対象になります。
■ 警告条件 3
下位 difficulty の方が、上位 difficulty より強い局所スクロール変化を持っているパターンを検出します。

このチェックでは、隣接するノーツ・スライダー・スピナー間で発生した有効スクロール速度変化(Δ px/s)を difficulty 間で比較します。
下位 difficulty の eSV 変化量が、上位 difficulty より明らかに大きい場合に確認対象として表示します。
項目 条件 内容
同一タイミング判定 ±10 ms 近いタイミングで発生したスクロール変化を、同じタイミングの変化として扱います。
比較対象 隣接する difficulty Diff順に並べたうえで、隣同士の difficulty を比較します。
小さい変化の除外 |Δ px/s| < 80 非常に小さい eSV 変化は、微小な SV 調整によるノイズを避けるため比較対象から除外します。
下位 difficulty の変化が大きすぎる場合 lower |Δ| ≥ higher |Δ| × 1.5
かつ lower |Δ| - higher |Δ| ≥ 120 px/s
下位 difficulty の局所スクロール変化が、上位 difficulty より明らかに強い場合に表示します。
■ 警告条件 4
同じタイミング付近において、difficulty ごとにスクロール速度変化の方向が一致していないパターンを検出します。

このチェックでは、隣接するノーツ・スライダー・スピナー間で発生した eSV 変化(Δ px/s)を difficulty 間で比較します。
同じタイミング付近で、一方の difficulty は加速、もう一方の difficulty は減速している場合に確認対象として表示します。
項目 条件 内容
同一タイミング判定 ±10 ms 近いタイミングで発生したスクロール変化を、同じタイミングの変化として扱います。
比較対象 隣接する difficulty Diff順に並べたうえで、隣同士の difficulty を比較します。
変化方向の不一致 両方の |Δ px/s| ≥ 120
かつ Δ の符号が逆
同じタイミング付近で、一方は加速、もう一方は減速している場合に表示します。
「変化方向の不一致」では、体感差の小さい微小変化を除外するため、両方の eSV 変化量が十分大きい場合のみ比較対象としています。
■ 注意点
この判定は、本ツール上で便宜的に設定した目安です。

スクロール変化の整合性チェックは、同じ時間帯の変化イベントを自動的に対応付けて比較します。
そのため、diffごとにSV変更の位置が大きく異なる場合、意図した比較にならない可能性があります。

また、下位 difficulty の方が強い局所スクロール変化を持っている場合でも、演出・音取り・休憩配置などの理由で妥当な場合があります。
表示された結果は Warning ではなく、確認対象として扱ってください。
■ 検出内容 3:速すぎるスクロール速度
低難易度でスクロール速度が速すぎる場合、初心者がノーツを十分に認識できない可能性があります。
このチェックでは、各 difficulty のノーツ・スライダー・スピナーの開始位置における有効スクロール速度を計算し、 その上位 90% px/s が difficulty ごとの目安を超えていないかを確認します。

このチェックでは、単純な最大値ではなく 90% px/s を使用しています。
これは、譜面中に一瞬だけ存在する高速ギミックを過剰に警告せず、 ある程度まとまった範囲で高速スクロールが続くケースを検出するためです。

判定基準は、SV = 1.0、SliderMultiplier = 1.4 の状態で、 各 difficulty において以下の BPM 相当の速度を超えるかどうかを目安にしています。

Difficulty 基準 px/s 目安 判定
Kantan / below Kantan BPM 200, SV 1.0, SM 1.4 約 820 px/s Warning
Futsuu BPM 250, SV 1.0, SM 1.4 約 1020 px/s Warning
Muzukashii BPM 300, SV 1.0, SM 1.4 約 1225 px/s Warning
Oni BPM 300, SV 1.0, SM 1.4 約 1225 px/s Warning

例えば、Kantan の 90% px/s が 820 を超えている場合、 「Kantan としてはスクロール速度が速すぎる可能性がある」として Warning を表示します。
■ 注意点
この判定は、本ツール上で便宜的に設定した目安です。

Warning が表示された場合は、90% px/s を目安値以下に抑えることを検討してください。
具体的には、BPM を変更するのではなく、SV や SliderMultiplier の調整によって 視認性を改善できる場合があります。

隠し機能:音声波形

■ 背景
読み込んだ .osu で指定されている音声ファイルを Web Audio API でデコードし、音声波形を表示する機能です。
同時に、[TimingPoints] の赤線から生成した小節線を波形上に重ねて表示します。

タブ自体は隠し機能として扱っていますが、音声の立ち上がりと小節線の位置関係を視覚的に確認するための補助ビューとして利用できます。
■ 波形表示の仕様
波形表示は osu!lazer のエディタ内波形表示を参考にしています。主に以下の実装を参照しています。
modding-helper では、音声を 1 ms 単位の点列に変換し、左右チャンネルそれぞれの最大振幅を保持します。
描画時には表示範囲と canvas 幅に合わせて点列を再サンプリングし、ガウシアン重み付きの平均で滑らかに縮約します。
また、osu!lazer の Waveform / WaveformGraph と同じ考え方で、低域・中域・高域の強さを低域通過フィルタから近似しています。
現在の表示では、高域や中域の塗り分けは使わず、ベースの水色波形と内部の濃い水色を中心に表示しています。
■ 小節線とクリック推定
小節線は [TimingPoints] の赤線時刻、beatLength、拍子から生成します。
赤線から次の赤線までの範囲では、その赤線の BPM と拍子を使って小節長を計算し、音声波形上に生成小節線として描画します。

波形上でマウスホイールを回すとカーソル位置を中心に拡大・縮小でき、左ドラッグすると表示区間を左右に移動できます。右クリックした位置を「選択したピーク」として扱い、最も近い生成小節線との差を表示します。
推奨オフセット位置は クリックしたピーク - 28.7 ms として計算し、現在の小節線との差分も表示します。

この -28.7 ms という考え方は、 statementreply 氏による Timing Analyzer v0.32.4 の仕様から着想を得ています。
■ 注意点
この機能は、音声ピークと小節線の位置関係を確認するための補助機能です。
クリックした位置が必ず正しい音楽的ピークとは限らず、推奨オフセットの推定も必ずしも正しいとは限りません。
最終的なオフセット判断は、実際のプレーを元に行ってください。

隠し機能:タイムライン

■ 背景
読み込んだ mapset の各 diff を、小節単位のタイムラインとして表示する機能です。
通常のテキスト一覧では把握しづらい配置の流れ、diff 間の密度差、Kiai 区間の見え方をまとめて確認できます。
■ 表示内容
各 HitObject を小節内の snap 位置に配置し、通常ノーツ、フィニッシャー、スライダー、スピナーを記号として表示します。
ノーツは d / k / D / K、スライダーは slider、スピナーは spinner として扱います。

小節は基準 diff の赤線から生成します。赤線の beatLength と拍子を使って小節範囲を作り、各 diff のオブジェクトを同じ小節グリッド上に並べます。
スライダーとスピナーは開始位置から終了位置までを範囲として表示します。スライダー終端は BPM、SV、SliderMultiplier、リピート数、ピクセル長から推定します。
■ snap 幅の決定
各小節ごとに、1/1、1/2、1/3、1/4、1/6、1/8、1/12、1/16、1/24、1/48 の候補から、配置を表現できる最小の snap を選びます。
表示上は最低でも 1/4 相当の解像度を確保し、拍子に応じて小節内のセル数を決めます。
snap 判定には 2 ms の許容幅を設けています。候補 snap のどれにも収まらないオブジェクトがある場合、その小節は未対応として扱います。

BN評価

■ 背景
一部の BN / NAT 専用の機能です。

BN evaluation において、mod適用前の .osz と mod適用後の .osz を比較し、どこが変更されたかを確認するための機能です。
diff名が変更されている場合もあるため、読み込み後に Before / After の diff を手動で対応付けてから比較します。
■ 検出内容
以下の5種類の情報を比較します。
  • ノーツ情報:ノーツの追加、削除、種類変更、スライダー / スピナーの追加・削除、スライダー / スピナーのテール移動を表示します。
  • タイムライン: 変更がある小節のみをタイムライン形式で表示します。
    小節内の最小 snap に応じて自動的にグリッド幅を変更します。
  • Timing情報:BPM / SV の追加・削除・変更、Volume の相違区間、Kiai の相違区間を表示します。
  • メタデータ情報: メタデータの変更点を表示します。
  • OD / HP:OD /HP の変更を表形式で表示します。
ノーツについては、 d / k / D / K / Slider / S / Spinner / S の差分を表示します。

なお、1 msズレのノーツ移動は表示しない仕様です。
ただし、1 msズレていても d → k のように内容が変更されている場合は、変更として表示されます。
■ 注意点
Before / After で全体のオフセットが変わる場合は、赤線を元にオフセット補正 を使用できます。
この機能では Before と After の最初の赤線の位置を比較し、その差分を offset として計算します。

ただし、NC rest の追加などにより赤線の位置が 1/1 拍単位などでずれる場合は対応できません。
その場合は、最初の赤線の位置を揃えてから再度比較してください。