概要

ここでは、エミュレータを使った動画(movie)の撮り方について解説します。

どのsnesエミュレータを使ったらよいか


執筆現在において、選択肢は2つあります。snes9xとzsnesです。
TASvideosではsnes9xを推奨しています。

  • snes9x

最もポピュラーなsnesエミュレータです。
非常に開発が活発で、どんどん発展しています。
特に、動画撮影の機能がとても充実しています。
特別な理由がない限り、撮影にはこのエミュレータを使うと良いでしょう。

  • zsnes

もう一つのポピュラーなsnesエミュレータです。
こちらもsnes9xと同じく、開発が活発です。
しかしsnes9xに比べると、やや後塵を拝する感じになっています。
GUIが少々特殊で、初めて使う人にとっては少し使いづらくなっています。

エミュレータの入手


動画の撮影には、動画撮影の機能に特化した、TASvideos推奨のエミュレータを使うと良いでしょう。Re-recording Emulator Downloadsのページや、Emulator Resources / Homepageのページから推奨されているバージョンをダウンロードしましょう。先述の通り、現在の主流はsnes9xです。

現在、snes9x-improvementには1.43系と1.51系の2系統があります。どちらも動画の制作に十分な機能と安定性を備えています。

1.51は1.43よりも新しいので、エミュレーションの不具合が修正されていたり、マウス等のデバイスを用いた動画が撮影できるようになっていたり、その他1.43にない機能が少しあったりします。ただ、実機以上にラグが多いと噂されています。

一方、1.43は多少の不具合はありますが、長らく愛用されている系統です。多くの動画が1.43を用いているため、それらに比べて自分が撮影した動画が早いのか遅いのか判断しやすいという利点があります(1.51と1.43では動作に差異があるため、フレーム単位での比較をすることが難しい)。その他、各種外部ツールの対応の良さから1.43を選ぶ人も多いと思われます。

1.43にしろ1.51にしろ、本家snes9xのものは使わないようにしましょう。動画の撮影中に記録タイミングがずれてしまうという致命的な不具合があるからです(Snes9x 1.43 desync実験 - 悟茶辞苑ッ)。

動画の撮り方(smvファイルの作り方)


以下のような手順を踏んで撮影します。

  1. ゲームを再生中に、[file]→[Movie Record..]を選択します。
  2. ムービーファイルの名前をどうするか聞かれるので、適当な名前にします。
  3. 今すぐ撮り始めるか、リセットした直後から撮り始めるか、どちらかを選択します。
  4. OKボタンを押します。
  5. 録画が始まるので、好きなようにプレイをしてください
  6. 撮りたいものが撮れたら、[file]→[Movie Stop]を選択して終了させます。
  7. 動画ファイル(smvファイル)が生成されています。

なお、デフォルトでは自動的にエミュレータ本体が存在するフォルダ内にムービーファイルが生成されます。
好きな場所に生成したいのであれば、手順2の時に[Browse..]を選択して好きなフォルダを選択してください。

動画の再生の仕方


撮った動画を再生するには、以下の手順を踏んで下さい。

  1. ゲームを再生中に、[file]→[Movie Play]を選択。
  2. 再生したいsmvファイルを選択してOKを押す。
  3. 動画が再生されます。

再生の際には、必ずそのsmvファイルが録画されたエミュレータのバージョンで再生してください。
同じsnes9xでもバージョンが違うと、うまく再生されないことが多いです。
再生に失敗すると、どこかでタイミングがずれて動きがおかしくなります。

追記(再録画)をするにはどうしたらいいか


動画を撮っていると、思い通りのプレイが出来なくて失敗することがあります。
そんなときの為、エミュレータには失敗する前から撮り直す機能がついていて、それを追記といいます。
この追記を使えば、成功するまで何度もプレイをトライすることが出来ます。
この機能こそが、エミュレータ動画を完璧にするための最重要ポイントです。

追記をするには以下のような手順を踏んでください。

  1. 失敗を予見し、あらかじめ撮り直すポイントを作っておく。これをmovie snapshotという。
  2. movie snapshotを作るには、snes9xでは[Shift + F1 ~ F9]を押します。
  3. 思い通りのプレイが取れなかったら、movie snapshotを作ったファンクションキー(F1 ~ F9のいずれか)を押します。
  4. [movie re-recorded]と表示され、movie snapshotを撮った時点からプレイを再録画できます。

movie snapshotの作り方は、ステートセーブの作り方(いわゆる、「どこでもセーブ」)と同じであることに注意してください。
録画中には、[Shift + F1 ~ F9]を押すとステートセーブではなくmovie snapshotが作られます。

すでに撮影したsmvファイルを、途中から撮り直す or 撮影を再開するには


エミュレータでは、すでに撮った動画を途中から撮り直す or 撮影を再開することも出来ます。
この機能も、エミュレータ動画を完璧にするための最重要ポイントです。

以下のような手順を踏んでください。

  1. 通常通り、smvファイルを再生する(このときRead-onlyの属性にチェックがある場合はチェックをはずす)
  2. 撮り直したい or 撮影を再開したいポイントまできたら、追記と同じように[Shift + F1 ~ F9]を押してmovie snapshotを作る。
  3. smvファイルを再生している途中で、movie snapshotを作ったファンクションキー(F1 ~ F9のいずれか)を押します。
  4. 再生モードが撮影モードに切り替わり、再録画が始まります。

また、[Shift + 8]でRead-onlyの有無を撮影中に切り替えることで、見直しと追記がよりスムーズにおこなえます。

(発展)より完璧な動画を撮るには


エミュレータ動画を撮るための基本はすでに述べました。
しかし、これだけではとてもTASvideosで発表されているような完璧な動画は撮れません。
基本操作に慣れてきたら、ぜひ以下の発展にトライしてみてください。

より完璧な動画を撮るには、以下のような方法があります。

  • ゲーム速度を落として撮影する
  • joy2keyを使って、ゲームを一旦ポーズしてから追記する
  • エミュレータの連射機能を使う
  • コマ送り(Frame Advance)を使う
  • smvファイルを直接編集してより正確にプレイをする
  • ゲーム速度を上げて動画確認を素早く行う
  • 各種情報を表示させる
    • キー入力
    • 再生フレーム数
    • ゲーム内のタイム

ゲーム速度を落として撮影するには


通常のゲーム速度でエミュ動画を撮影しても、プレイヤーの実力以上のモノは撮ることが出来ません。
逆にいえば、ゲーム速度を落としてしまえば、どんなプレイヤーでも実力以上の神動画が作れるということです。

snes9xには、ゲーム速度を変化させる機能がついています。
メニューにはありませんので、ショートカットキーで操作します。
よく使う機能なので、覚えておくと良いです。

snes9x-improvementの場合:
ゲーム速度を半分に落とす 「-」キーを押す(「ほ」のキー)
ゲーム速度を倍に上げる 「+」キーを押す(「れ」のキー)

通常のsnes9xの場合:
ゲーム速度を半分に落とす Shift + 「-」キーを押す
ゲーム速度を倍に上げる Shift + 「+」キーを押す

撮影用に特化したsnes9x-improvementでは、ショートカットキーが簡略化されていることに注意します。

JoyToKeyを使って、ゲームを一旦ポーズしてから追記するには


ただスローダウンしただけでは、うまく完璧な動画を撮ることは出来ません。
というのも、プレイの途中に必ず追記する作業があるからです。

追記するには[Shift + F1 ~ F9]を押さなくてはならず、そのためには一旦ゲームパッドから手を離す必要があります。
その際に、プレイのアイドル状態が出来てしまい、ツギハギのぎこちない動画しか取れません。
これを解消するには、一旦プレイをポーズした上で落ち着いて追記をしなくてはなりません。

ゲームをポーズする [Pause/break]キーを押す

しかし、Pause/breakキーを押すにしてもやはり一旦ゲームパッドから手を離すことに変わりはありません。
このラグを無くすためには、ゲームパッドを握りながらゲームをポーズしなくてはいけません。

これを実現するのが、JoyToKeyというソフトです。
このソフトは、ゲームパッドのボタン入力をキーボードのキーに置き換えることが出来ます。
これを使い、ゲームパッドの使っていないボタン(例えばR2 or L2)に[Pause/break]キーを割り当ててしまいます。
こうすれば、ゲームパッドを握りながらゲームをポーズすることが出来ます。

管理人は、 L2 ボタンに[Pause/break]キーを、 R2 ボタンに[tab]キーを割り当てています。

なお、現在のsnes9xなら、ジョイパッドのキーをショートカットに割り当てることも可能です。

エミュレータの連射機能を使うには


snes9xにはエミュレータ自身に、ボタンの連射機能が付いています。
非常に高速で正確なので、例えばミサイルの連射を最速で発射するにはとても便利です。
また、LRダッシュを使うときにもこれを利用すると便利です。
ちなみに、コントローラ側で連射すると、微妙にラグが生じて最速で連射することが出来ません。

連射に関して、snes9xは以下のショートカットキーを持っています。

Aボタンの連射 Shift + PageDown
Bボタンの連射 Shift + End
Yボタンの連射 Shift + Home
Xボタンの連射 Shift + PageUp
Lボタンの連射 Shift + Insert
Rボタンの連射 Shift + Delete

なおsnes9x-improvementの場合、これ以外のボタンにも連射機能を持たせることができます。

コマ送り(Frame Advance)を使うには


スローは正確にプレイする強力な武器です。
しかし、「ここのジャストタイミングで~をする」という時には不十分です。
スローのみを使っている限り、あてずっぽうでボタンを押し「~になってくれることを願う」感は否めません。

そういう時のため、コマ送り(Frame Advance)を使います。

コマ送り ポーズ中に[ / ]ボタン(Backspaceの左)を押す

望みのキーを押しながらこの機能を使えば、次のフレームに望みの動きを作ることが出来ます。

smvファイルを直接編集してより正確にプレイをするには


smvファイルがただ単にキー入力を保存しているだけなら、直接smvファイルを弄って完璧にすればいいじゃない、という発想があります。
実際にロックマンのTASでは、おそらくこのような方法を用いて最適な動きを実現しています。

これはよくhex editing(バイナリ編集)と呼ばれる方法で、その名の通りバイナリエディタでムービーを編集します。しかし、最近はムービー編集用のツールもいろいろあるので、それらを使う方がより効率的でしょう。Re-recording Emulator Downloadsのページからどんなものがあるのか探してみるといいでしょう。有名なもののひとつにTAS Movie Editorがあります。

ゲーム速度を上げて動画確認を素早く行うには


smvファイルはシークサーチが出来ません。
これは、smvファイルがただ単にキーの入力だけを記録している、という理由によります。
つまり、始めっから順番に再生しない限り、見たいところまで進まないということです。

見たいところが随分先で、その前のプレイは見たくない。
そんなときは、早送り(Fast-Forward)機能を使います。
これは、ゲームの速度を最大限まで上げ、見たくないところをすっ飛ばしてくれる機能(要は早送り)です。

早送り(Fast-Forward)モードにする [Tab]キーを押す

早送りの速度は、[Option]→[Settings]から変えることが出来ます。
また、[Tab]キーをトグルにするかどうかも変えることが出来ます。

キー入力を表示させるには


他の人が作ったsmv動画を見ているとき、「ココの部分はどんなキーを入れてこの動きを作っているんだろう」と思うときがあります。そんなときに便利なのがこのキー入力表示機能です。
入力キーを画面に表示したいときは[,](カンマ)キーを押します。

キー入力を表示させる [,](カンマ)キーを押す

再生フレーム数を表示させるには


動画の再生フレームは、動画のある場面を指定するときに便利です。
例えば「25000フレーム辺りではこのようなことをしているが、なんの意味があるのか」というように話すことが出来ます。

再生フレーム数を表示させるには、[.](ピリオド)キーを押します。

再生フレーム数を表示させる [.](ピリオド)キーを押す

ただし、このフレーム表示はゲーム内時間とは全く関係がないことに注意してください。
この数字を元に、「この方法の方が~フレーム速い」という風に比べても意味がありません。
プレイのスピードを比べるにはゲーム内時間で比較する必要があります。

スナップショットを撮るには


撮影には直接関係ありませんが、結構ワンシーンを画像として保存したいときがあるはずです。そういうときにはスナップショット機能を使いましょう。幸い、snes9xには一発ショートカットがプリセットされています。
スナップショットを撮るには[F12]キーを押します。画像はROMのあるフォルダに、PNG形式で直接保存されます。

スナップショットを撮る [F12]キーを押す

ゲーム内のタイムを表示させるには


前述の通り、プレイのスピードを比べるにはゲーム内時間で比較する必要があります。
ではゲーム内時間を任意のときに見るにはどうすればよいのでしょうか。

ゲーム内時間というものはメモリ上に記録されており、リアルタイムで変化しています。
ということは、メモリ内を覗いてゲーム内時間を直接見ればいいわけです。
しかし、これを覗くにはかなりのスキルが必要で、実は管理人も良く分かっていません。
ただ、最近簡単にゲーム内時間を見る方法が見つかったので、それについて書きます。

ゲーム内時間は以下のアドレスに記録されています。

  • 7E09E0 - Hours
  • 7E09DE - Minutes
  • 7E09DC - Seconds
  • 7E09DA - Frame Count

スーパーメトロイドの場合、1時間を越えることはまずないので、残りの三つの数値が重要になります。
そして、それぞれの数値をリアルタイムでsnes9xの画面に表示する方法があります。
手順は以下の通り

  1. [Cheat]→[Search for New Cheats]を選択
  2. スクロールをして、表示したい数値のアドレスを探す
  3. 見つかったら、それをクリックで選択し、[Watch]ボタンを押す
  4. 複数表示したければ、同様のことを繰り返す
  5. OKを押すと、画面内に希望の数値がリアルタイムで表示されます。

外部のMemory Watchツールを使うと、ゲームごとに監視する変数を設定したり、変数に対するコメントをつけたりすることもできます。また、2008年7月現在snes9x内蔵のMemory Watchに存在している、1フレームの表示ラグに悩まされることもありません。

snes9x-improvement のショートカットキー一覧


前述のものと重複するかもしれませんが、snes9x-improvement のショートカットキー一覧を書いておきます。
なお、これらのショートカットキーはユーザー側で自由に変えることが可能です。

===========================
準備中…
===========================

TAS動画の作り方講座


ニコニコ動画に良いTAS動画の作り方講座があったので転載。



動画サイトで公開するには


1.動画をファイルに出力する方法
2.出力したものを、エンコードする環境
これらについての注意事項、例えば、どのようなツールを使用すれば良いか等を記述しておけば、
後々、作業がはかどると思われます。

ごく簡単に書いてしまえば、

  1. AVIzlib、Huffyuv、Lagarithなど、可逆圧縮コーデックを用いてaviを出力
  2. 必要ならばリサイズ(ニコニコ動画等、オンライン掲載の際によく用いられる)やSub挿入をおこなう(ツール例: AviSynth)
  3. AviUtlやVirtualDubなどのオーサリングツールから、H.264やVP6等、ターゲットとするコーデックにて適当にエンコード

ちなみにTASvideosは、可逆出力後の作業はすべてMEncoderで処理しています。Emulator Resources / Making AVI

===========================
準備中…
===========================

lua script

カットシーン(ドア、アイテム、イントロ)を全部スキップするlua script

-- てりまらんど http://terimaland.com/ より
 
a=0
i=0
j=0
while true do
	b=memory.readbyte(0x7E09DA)
	op=memory.readbyte(0x7E0DA0)
	ed=memory.readbyte(0x7E1425)
 
	if (op == 0) then
			snes9x.speedmode("turbo")
			j=0
	end
 
	if (ed == 1) then
			snes9x.speedmode("normal")	
	end
 
	if (a == b) then
		i=i+1
		j=j+1
		if (i == 10) then
			snes9x.speedmode("turbo")
			i=0
		end
	end
 
	if (j == 40) then
		snes9x.speedmode("normal")
		j=0
	end
 
	if (a ~= b) then
		snes9x.speedmode("normal")
	end
 
	a=b
snes9x.frameadvance()
end