BMSイベントダイジェスト動画の作り方

https://www.youtube.com/playlist?list=PLOzANRT4wc1QJq0uflYyQuN0jsQit3uaeyoutube.com

BOF系のBMSイベントダイジェスト動画を作る上での、自分なりの手順と知識をまとめました。
ほぼ自己流ですが、少しでもBMSのダイジェスト動画を作りたい人の参考になればいいなと思います。

最初に作ったG2R2018の時はほぼ手作業でしたが、めちゃくちゃ手間がかかる上にミスが多発するので、できる範囲で自動化しています。
自動化は自作のプログラム(Golang製)によって行っています。
自作のプログラムは、一部を除いてGitHubソースコードと実行ファイルをアップロードしてあります。使用する工程にそれぞれリンクを貼っていますので、参考にしてください。使い方も一応GitHubのREADMEに書いてあります。

目次

作成環境,使用ツール

  • Windows10,11: ゲーム画面録画にゲームバーのキャプチャ機能を使用。
  • beatoraja: BMSプレイヤー。bmson再生可能。一部を改造したものを使用。
  • AviUtl: フリーの動画編集ソフト。制御文字とオブジェクトのインポート/エクスポートが便利。
  • Googleスプレッドシート: 動画に表示する文字データをまとめるために使用。
  • IntelliJ IDEA: Java統合開発環境。beatorajaのソースコード編集とビルドに使用。
  • Visual Studio Code: コードエディタ。プログラム作成に使用。
  • Windows PowerShell などのコマンドラインツール: 自作プログラムの実行に使用。

1. BMSを集める

1-1. イベントBMSをダウンロードする

まずは必要なBMSをダウンロードしていきます。

イベントBMSを集めるには2つ方法があります。一つ一つ手作業でダウンロードする方法と、イベントパッケージでまとめてダウンロードする方法です。
基本的にはパッケージをダウンロードすればいいと思いますが、パッケージによっては譜面やBGAなどの追加修正が適用されていない場合があるので、そこが気になる場合は個別にダウンロードしましょう。

また、高品質/低品質やLR2用/beatoraja用などでバージョン分けされているBMSの好きな方を選んでダウンロードしたい場合も、個別にダウンロードしましょう。
自分は最新状態+高品質+beatoraja用のBMSを動画に使用したいので、プログラムを使った半自動で一つ一つダウンロードしています。

1-2. BMSを整理する

BMSをダウンロードしたら、フォルダにまとめます。登録番号やチーム別でフォルダ分けすると後から探しやすいです。

登録番号順で整理

自分は隠し譜面の情報も動画に載せたいので、プログラムで隠し譜面を探して再生できる状態にしておきます。[⇒プログラム: findhiddenbms]

2. 作品情報をまとめる

2-1. スプレッドシートを作る

動画に載せるBMS作品の情報(登録番号、タイトル、ジャンル、アーティスト、スコア、順位、譜面難易度など)をまとめるためのGoogleスプレッドシートを作成します。

2-2. 作品情報をイベント会場から取得する

イベント会場の作品一覧ページから情報をまるごとコピペします。
このとき、タイトル、ジャンル、アーティスト、チーム名を張り付けるセルは、事前に書式なしテキストに変更しておきましょう。数字や式で構成された名前が勝手に数値に変換されるのを防げます。

(BOF:ET以降のBOFではリザルトのマニアックデータがそのまま活用できます。ただしクオーテーションマーク(")などの括弧で囲まれているタイトルは括弧が削除されていることがあるので注意しましょう。)
(BMS Search会場では作品情報リストをCSVでダウンロードできるので、これをそのままシートにインポートするといいでしょう。)

BOF:NTのマニアックデータをコピペしたシート

順位は基本的にリザルトに載っているものを参照し、リザルトに載っていないものはRANK関数などで生成します。
また、順位の数値にthみたいなやつを付けて序数にしたいので、スプレッドシート関数を使って作ります。

=SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(<セル> & "th", "1th", "1st"), "11st", "11th"), "2th", "2nd"), "12nd", "12th"), "3th", "3rd"), "13rd", "13th")

偽名を使用しているアーティスト名は偽名(本名義)という表記にして、偽名は灰色で表示したいので、スプレッドシート関数とAviUtlの制御文字を使って以下のように加工します。

伊草ハルカ<#999999>(NIKANON // BGA. 空読無 白眼)<#>

偽名アーティストの表示例
たまに間違えて本名義を偽名欄にも入力している人がいるので、それは除外します。

他にも、二次登録作品の登録番号の色を制御文字で変えたり、アーティスト名にBGA作者の名前をアーティスト名 (mov:BGA作者名)の形式で連結させたりします。

2-3. 譜面難易度情報をBMSファイルから取得する

自分は動画に譜面の難易度一覧を載せるので、BMSファイルからプログラムで取得します。[⇒プログラム: findlevel]
BMSをまとめて入れているフォルダをプログラムで指定すると譜面情報のCSVが出力されるので、これをスプレッドシートにコピペします。

譜面情報を書き加えたシート

譜面情報の記述はAviUtlの制御文字を使用して以下のようにしています。

5KEY <p64,+0><#f6962b>☆8 <#a049ff>☆0 <#>
10KEY <p76,+0><#f6962b>☆9 <#>
7KEY <p64,+0><#24fb5d>☆2 <#00ccff>☆5 <#f6962b>☆9 
<p64,+0><#ff3014>☆11 <#>
14KEY <p76,+0><#00ccff>☆6 <#f6962b>☆10 <#ff3014>☆12 <#>
9KEY <p64,+0><#00ccff>Lv33 <#f6962b>Lv43 <#ff3014>Lv48 <#>
24KEY <p76,+0><#00ccff>☆6 <#f6962b>☆9 <#>

動画で表示するとこんな感じ
7KEYじゃなくて7KEYSの方が正しい気がするが、スペースを節約したくてこうなっている

3. オートプレイ動画を用意する

beatorajaを使ってオートプレイ動画を撮ります。

3-1. beatorajaを改造する

撮影にはbeatorajaのコースモードを使用します。

デフォルトのbeatorajaだとコースの曲間でコンボ数が引き継がれてしまい、コンボ数が不自然に大きくなって見栄えが悪いです。そこで、beatorajaのソースコードをいじってステージ間でコンボ数がリセットされるようにします。

ソースコード変更部分:

play/JudgeManager.javainit()メソッド内の

setCourseCombo(resource.getCombo())

の部分を

setCourseCombo(0)

に書き換えます。

これをビルドしたものを使用します。

開発環境の導入やビルドのやり方については下記の記事を参考にしてみてください。自分は開発環境にIntelliJ IDEAを使用しています。
excln.hatenablog.com
www.ukitouchtypist.org

3-2. beatorajaのスキンを設定する

スキンは見やすくてシンプルなものを選ぶといいと思います。
自分は5keys、7keysは自作のGenericThemeを、その他はmnpy様のsimple-skinを使用しています。

表示設定については好みですが、自分は以下のような設定を行っています。

  • キービームを短くする
  • ボムを変更する
  • レーン背景を暗くする
  • GenericThemeで、コースのSTAGE表記を通常のbeatoraja表記に変更する改変をする
  • simple-skinで、14keysなどでBGAが大きく表示されるようにレーンやBGAの位置とサイズを調整する
  • simple-skinで、GenericThemeと同じ判定文字や色味にする

3-3. 撮影用コースを作成する

コース作成はbeatorajaランチャーのTableタブで行えます。
しかしBOFの場合は作品数が多くて手間がかかるので、プログラムを使って作ります。[⇒プログラム: dcmake]

自分の動画はAnother譜面を優先して使用しているので、プログラムの譜面探索もAnother譜面を優先するようになっています。

3-4. オートプレイ動画を録画する

作成したコースをbeatorajaでオートプレイで再生して動画を録画します。

自分はWindowsのゲームバーの録画機能を使って録画しています。
録画は50曲ずつ行っています。ゲームバーの録画は最長4時間までで、さらに一度に全部録画すると録画ミスや音ズレが発生した時に手戻りが多くなってしまうからです。
曲数が多いと時間がかかるので、睡眠中などPCを使用しない時間を利用して録画しましょう。

また、録画時の音量はメモして統一できるようにしておきましょう。
音量は気持ち大きめに録画しておくのがオススメです。音量を後から小さくするのは割と簡単ですが、後から大きくするのは大変です。
自分の場合、Windowsのマスター音量が30、Windowsミキサーでのbeatoraja音量が43、beatoaja本体内での音量が100(最大)になっています。

オートプレイ撮影時のbeatorajaの解像度は1280×720にしています。これは自分の動画自体の解像度が1280×720だからです。  動画編集時には80%に縮小して使用しています。
動画の解像度をフルHDにしない理由は、録画の容量が非常に大きくなってしまうのと、AviUtlの動作が遅くなってしまうおそれがあるからです。

3-5. オートプレイ動画を素材用に分割・エンコードする

撮影したコースのオートプレイ動画を、1曲ずつ個別の動画に分割します。
Aviutlに長時間の動画を読み込むと、動作が重くなってしまうからです。
また、ゲームバーで録画された動画はVFR(可変フレームレート)で保存されるので、そのままAviutlに読み込むと音ズレします。そのため、事前にCFR(固定フレームレート)にエンコードしておく必要があります。
この分割&再エンコードはプログラムで行います。[⇒プログラム: bvcut]

分割された動画ファイルはタイトルが連番になっているので、判別しやすくするために一括リネームします。 [⇒プログラム: outputrename]
スプレッドシートでリネーム用データを作ってCSVをダウンロードして使用しています。

分割・リネームした素材用動画

4. 動画を作成する

AviUtl上でダイジェスト動画を編集していきます。

AviUtlの導入や使い方は下記のサイトが参考になります。
aviutl.info

4-1. レイアウトを作る

作品紹介画面のレイアウトを決めます。
先人が作ったダイジェスト動画やメドレー動画がたくさんあるので、そこから参考にしていくといいでしょう。

自分は見やすさ優先で、スマホでもはっきり読めるような文字サイズ、文字色にすることを意識しています。
また、長いタイトル・アーティスト名・ジャンル名・チーム名や、大量の譜面情報など、起こりうるイレギュラーになるべく対応できるようにしておくと良いです。

レイアウト例

クリックすると使用フォント一覧が見れます

ニコ角: IMPRE/TOTAL/MEDIAN/AVERAGE/CHARTS
源真ゴシック:
  P Normal: GENRE/ARTIST/TEAM
  Medium: TITLE
  等福 Medium: No/FS
  Bold: 点数(999 (999th))/(一時停止推奨)/全曲ダイジェスト(サムネ)/アイキャッチ出展
  P Light: 表示例説明文
  Normal: 動画説明文(~計n曲のダイジェストです)/エンドロール(登録チーム数等)
MS UI Gothic: PLAY SCREEN
Nirmala UI Semilight: 譜面情報(7KEY ☆9)
Ariel: アイキャッチ順位数字(100→1)
Segoe UI Emoji: アイキャッチ順位矢印

4-2. 素材動画を編集して並べる

素材のオートプレイ動画をAviUtlにインポートしてカットして並べていき、ダイジェスト形式にしていきます。

自分の場合、以下の工程で作業します。

  1. オートプレイ動画全体を再生して切り取りたい箇所を探す
  2. 所要時間内(7~10.4秒)で収まるように切り取る
  3. 候補が複数個ある場合は聴き比べて1つに絞る
  4. 前後の曲と並べて繋ぎの滑らかさなどを確認する

1曲の所要時間は、BOFは曲数が多いので7~10秒と決めています。ちょっとはみ出すときは10.4秒くらいまで。
曲によって所要時間に差があり過ぎると不公平感が出てしまう気がするので、厳しめにカットしていきます。
カットは小節線を境界にして行うと良い感じになりやすいです。また、BPMや拍子によって何小節分切り取るかを判断します。

4拍子の場合(目安):

  • 95~139BPM : 4小節
  • 140~189BPM : 6小節
  • 190~279BPM : 8小節

切り取る場所は、曲のサビやメインフレーズ、曲を象徴するような箇所を選びます。
たまに盛り上がりが複数回あったり、途中で曲調が大きく変わったりして、どこを切ればいいか悩むような曲がありますが、あまり悩んでも結論は出ないので適度に妥協します。
(ボーカルメインの曲はできるだけボーカル部分を入れたいというこだわりがありますが、そうならないこともあります。)
また、長さが足りなかったり中途半端だったりする場合、サビに入る前のフレーズを入れると良い感じになる場合が結構あります。

作業時間は1曲当たり4~5分くらいです。
曲数が多いBOFの場合、この過程が一番時間と労力を必要とします。月単位でじっくりやるつもりで気長にコツコツ取り組みましょう。

果てしない作業

4-3. 作品情報を動画内にテキストとして配置する

動画をダイジェスト形式に並べ終えたら、並べた動画オブジェクトの並びを元に作品データのテキストを生成し、動画に載せます。
テキストの生成にはプログラムを使用します。[⇒プログラム: csvtoexo]

並べた動画オブジェクトを別シーンにコピーして、オブジェクトをエクスポートします。これは生成するテキストの時間位置を設定するのに使います。また、レイアウト用のオブジェクトもエクスポートします。エクスポートしたファイルの拡張子は.exoになっています。
作品データはスプレッドシートからcsvでダウンロードします。
これらのexoとcsvをプログラムに渡して、作品データの動画用テキストオブジェクトを生成します。

オブジェクトファイル(output.exo)が出力されたら、AviUtlにドラッグ&ドロップでインポートします。
項目数が多い場合、完了するまでに少し時間がかかります。インポートが完了したら、テキストオブジェクトを並べた動画オブジェクトに合わせて配置します。
テキストは作品ごとにグループ化されているのでまとめて移動できます。

4-4. OP、ED、アイキャッチを入れる

各自の好みで作りましょう。自分はアイキャッチにはその年のBMSイベントの優勝曲を使っています。

ここまでで必要な情報が揃った状態のAviUtl画面
IMPREやらTOTALやらでレイヤーがサンドイッチされているがこんなことする必要はない

4-5. 音量調整をする

どうしてもBMSによって音量差があるので、急な爆音で視聴者をビックリさせないように音量調整をしています。
方針としては、音が大きすぎる場合はガッツリ下げて、音が小さすぎる場合はすこし上げます。
だいたい110~70%位の範囲で音量を変更します。

音量の大小を判別するために、AviUtlの音量測定用プラグインloudness.auf」を入れておくと便利です。

www.nicovideo.jp

このプラグインで動画全体と瞬間のラウドネス値を測定できるので、数値を元にした音量調整が可能になります。
自分の場合、-9LUFS~-21LUFSに収めるという指標でやっています。-9LUFSより音量が大きい曲は、-9LUFS以下に収まるように音量を下げます。
また、音量が範囲に収まっていても、キンキンした音などで耳が痛く感じる場合は、少し多めに音量を落とす場合があります。

音量調整前の動画全体のラウドネス

音量調整後
-9LUFSより大きい箇所は重点的に下げる

4-6. その他調整やチェックをする

作品のタイトルやジャンル名やアーティスト名、チーム名がとても長い場合、レイアウトによってははみ出してしまうので、個別に横幅の倍率やフォントサイズなどを調整します。
スプレッドシート関数などを使って文字数チェックをすると発見しやすいです。

中国語や韓国語、環境依存文字など、使用しているフォントが対応していなくて表示されない文字がある場合があるので、AviUtlの制御文字を使用して部分的に別フォントを適用します。
フォント対応外の文字の特定にはプログラムを使用します。[⇒プログラム: fonthas]

同率順位の曲や、タイトルが同じ曲は、作品情報が入れ替わりがちなので適宜確認します。

たまに音飛びしたり、BGAの再生がバグってうまくいっていないことがあるので、見つけたら都度再撮影して差し替えます。

4-7. エンコードする

編集が終わったら動画をエンコードします。
設定は各自の好みですが、自分は音声コーデックをqaac、品質を4にしています。
時間が数時間単位でかかるのでゆっくり待ちましょう。

4-8. 投稿する

タイトルや概要欄の文書、サムネイル画像などを用意して投稿します。イベント会場へのリンクも忘れず貼っておきましょう。
YouTubeに投稿する場合は、海外の視聴者向けに英語のタイトルや概要欄も用意するといいと思います。

ダイジェスト動画は情報量が多く、ミスの発生を避けるのが難しいです。そのため、アップロード後はすぐ公開状態にせず、非公開にしておいて自分で動画をフル視聴してチェックすることをオススメします。
公開後にミスを見つけても簡単に修正できませんが、公開前なら修正して再アップロードすれば済みます。
動画サイト側による再エンコード後の音量なども確認しておきましょう。