ごちゃログぴこっ

はなまるデジタル創作紀行(DTM、TAS、いろいろな技術)

「忙しい人のためのカービィボウルTAS」とスクリプトによる自動カット編集

「忙しい人のためのカービィボウルTAS」と題して、過去作であるカービィボウルTASの編集版をアップロードしました。

※TAS関連でいろいろあったときに動画は削除しちゃいました。許してヒヤシンス! カービィが移動している瞬間だけをトリムして結合した感じの動画でした。
カービィが移動している瞬間を切り貼りしたノンストップ仕様です。動画の説明文にもあるとおり、この動画はスクリプトNonStopKirbysDreamCourse.lua)を使って作られました。スクリプトSnes9x rerecording 1.43 v17で動きます*1エミュレータの本体はDownloadセクションからダウンロードできます。

さて、せっかくなのでここからはちょっとした制作の裏話をしましょう。

制作動機

わたしの大好きなゲーム「スーパーメトロイド」の動画には、しばしば部屋の移動やアイテム取得のシーンがカットされて掲載されているものがありました。それらがどういう方法で編集されているのかわかりませんが、気にせずに「ひとりでできるもん!なんとかなるよ!絶対大丈夫だよ!」と考えて細かなシーンカットを実現したのが今回の試みでした。ところでこれは余談ですが、Luaを用いたスーパーメトロイドの素晴らしい編集として、こんな動画を紹介しておきます。


動作の仕組み

スクリプトを実行すると、Luaウィンドウやスクリプト中で指定されたavsファイルに、AviSynthスクリプトが出力されます。

AviSynthというのは、ビデオ編集をおこなうことができるスクリプトです。詳細はAviSynth Wikiなどに譲って簡単に書きますと、たとえば、適当なAVIファイルを読み込んで、特定のフレームを切り取ってつなげるには次のように書けます。

# a.aviの映像を読み込む
AviSource("a.avi")
# 100,500,800フレーム目から100フレーム切り取り、順に貼り付ける
Trim(100,200)+Trim(500,600)+Trim(800,900)

ムービー再生開始前の状態でエミュレータを一時停止させ、普段通りにAVIファイルの記録をスタンバイします。その一方で、Luaスクリプトの実行もいっしょにスタンバイして、それから動画を再生します。すると、ノーカットのAVIファイルが出力される一方で、上記の例と似たようなスクリプトが自動的に出力されます。出力を追えたら記録を停止して、AviSynthスクリプトを読み込めば、スクリプトの処理によってカットされた映像が手に入ります。ハラショー! ヾ(〃ヮ〃)ノシ ちなみに、エミュレータ上ではカットされるフレームは青っぽく塗りつぶされます。

省略するフレームとしないフレームの区別には、メモリの値を見て条件判定をしています。ゲームのロジックを詳細に解析して厳密な条件判定を施せるならそれに越したことはありませんが、実際にはそこまでする必要はありません。改造コードを探す要領で、特定のシーンで一定の値を示す領域さえ探せれば、それで判定はできます。その領域はゲーム全体の状態を示すものかもしれません。あるいはキャラクターの状態か、画像データか、音声に関わるデータか、いずれにしても確固たる厳密性を求めるわけでないなら、気にする必要はないのです。ただ、さすがにあまりにもいい加減ですと、目的外のシーンにヒットする「誤爆」が起こります。ですが、ある程度候補を絞り込んだうえで、信頼のおけそうな領域を複数ピックアップするようにすれば、まず間違うことはないかと思います。

そんなわけで、このような手順により、エンコードも含めてたった一日でこの動画は作られました。自動処理なので、ほかの動画に適用したり、条件を変えて再出力したりすることも簡単です。使ってみたい方はご自由にご利用ください。

*1:1.43 v17の実行ファイルは、このスクリプトを書き上げた後に新しいものに差し替えられました。これはLuaスクリプト実行とAVI記録を同時実行すると、AVIの最初の1フレームが欠けてしまう問題があったためです。なお、このバグが1.51にも同様に存在するかどうかは未確認です。