AviSynthの文法
Avisynthでは次のような記述の仕方が認められています。
1.変数名 = 式 2.式 3.return 式 |
マニュアルの最初のほうに書いてあるやつです。
といっても、じつはこの記事を書くまでは、私はまともに読んだことがありませんでした。今もちゃんと読んだわけではないです、ハイ(汗)
みなさん、マニュアルはちゃんと読みましょうね(笑)
文法というだけで引いてしまう人もいるかもしれませんが、前回に引き続き、次のスクリプトを使用して、なるべく具体的に説明していきたいと思います。
といっても、じつはこの記事を書くまでは、私はまともに読んだことがありませんでした。今もちゃんと読んだわけではないです、ハイ(汗)
みなさん、マニュアルはちゃんと読みましょうね(笑)
文法というだけで引いてしまう人もいるかもしれませんが、前回に引き続き、次のスクリプトを使用して、なるべく具体的に説明していきたいと思います。
これです。 カラーバーを上下反転させるスクリプトでしたね。 |
では、順に見ていきましょう。
1.変数名 = 式
式というのは「ColorBars(320,240)」や「FlipVertical()」などのことです。要するにフィルタに関する命令文です。これは各フィルタの書式に従って記述されなければならないということは、すでに述べましたね。
また、式は式の結果も同時に表します。そして、式の結果は必ずビデオクリップになります。
つまり、「ColorBars(320,240)」で320x240サイズのカラーバーというクリップが作られ、「FlipVertical()」でカラーバーはこれを上下反転させたクリップになり、次に別のフィルタをかければ、さらにそのフィルタをかけたクリップになり・・・と、どんどん別のビデオクリップに変化していくわけです。
そして、この式(つまりビデオクリップ)は任意の変数に代入することができます。
変数とは、一時的にビデオクリップを入れておく「容れ物」のようなもので、ビデオクリップは、この容れ物(変数)の中に入れることができるのです。
変数の名前は50文字以内の半角英数字( _ (アンダースコア)含む)であれば何でもかまいません。videoでもaudioでもniiyanでも(笑)
ただし、数字から始まる名前は使えないので注意してください。
また、式は式の結果も同時に表します。そして、式の結果は必ずビデオクリップになります。
つまり、「ColorBars(320,240)」で320x240サイズのカラーバーというクリップが作られ、「FlipVertical()」でカラーバーはこれを上下反転させたクリップになり、次に別のフィルタをかければ、さらにそのフィルタをかけたクリップになり・・・と、どんどん別のビデオクリップに変化していくわけです。
そして、この式(つまりビデオクリップ)は任意の変数に代入することができます。
変数とは、一時的にビデオクリップを入れておく「容れ物」のようなもので、ビデオクリップは、この容れ物(変数)の中に入れることができるのです。
変数の名前は50文字以内の半角英数字( _ (アンダースコア)含む)であれば何でもかまいません。videoでもaudioでもniiyanでも(笑)
ただし、数字から始まる名前は使えないので注意してください。
VirtualDubModのスクリプト・エディタでは数字から始まる文字列は赤くマーキングされます。このような表示になった場合、エラーが出る可能性が高いです。 アンダースコア( _ )を先頭につけたり、アルファベットから始まる変数名なら、どのような名前でもOKです。 |
ためしに、さきほどのスクリプトの「ColorBars(320,240)」をclipという名前(そのままですね)に置き換えてみましょう。
「ColorBars(320,240)」という式(ビデオクリップ)をclipという名前の変数にあてはめるわけですから、
「ColorBars(320,240)」という式(ビデオクリップ)をclipという名前の変数にあてはめるわけですから、
clip = ColorBars(320,240) |
とすることができます。
そしてこのclipをFlipVerticalの引数(カッコの中にいれる値のことでしたね)として指定することができます。
そしてこのclipをFlipVerticalの引数(カッコの中にいれる値のことでしたね)として指定することができます。
つまり、左のように記述することができるわけです。 |
一行目で320x240サイズのカラーバーを作成し、このカラーバーをclipという変数に置き換えています。これ以降、カラーバーを別のフィルタで使いたいときには、clipで表すことができるようになります。
実際に上の例では、二行目のFlipVerticalフィルタの引数として、この変数clip(つまりカラーバー)を指定しています。
ちなみにこのclipという変数名はデータ型clipとも引数名clipとも別物です(結果的に引数名=変数名となるわけですが)。
たまたま名前を一緒にしてしまったのでややこしくなってしまいましたが、もしわかりにくいようならば別の名前にしてもかまいません。
では変数の指定を省略した場合はどうなるのでしょうか?
それが2の「式」になります。
実際に上の例では、二行目のFlipVerticalフィルタの引数として、この変数clip(つまりカラーバー)を指定しています。
ちなみにこのclipという変数名はデータ型clipとも引数名clipとも別物です(結果的に引数名=変数名となるわけですが)。
たまたま名前を一緒にしてしまったのでややこしくなってしまいましたが、もしわかりにくいようならば別の名前にしてもかまいません。
では変数の指定を省略した場合はどうなるのでしょうか?
それが2の「式」になります。
2.式
じつは、これは今までやってきた書き方のことです。
単に「Version()」とか「ColorBars(320,240)」とか書く方法です。
ここで覚えておきたいのは、「変数名 =」の部分を省略した場合、ビデオクリップは変数lastに割り当てられるということです。
変数指定が省略された場合のために、最後に処理したクリップを意味するlastという特別な変数が予約されているのです。
このため、単に「ColorBars(320,240)」と書いただけの場合には、
単に「Version()」とか「ColorBars(320,240)」とか書く方法です。
ここで覚えておきたいのは、「変数名 =」の部分を省略した場合、ビデオクリップは変数lastに割り当てられるということです。
変数指定が省略された場合のために、最後に処理したクリップを意味するlastという特別な変数が予約されているのです。
このため、単に「ColorBars(320,240)」と書いただけの場合には、
last = ColorBars(320,240) |
と、カラーバーのビデオクリップが自動的にlastという変数に代入されている(のと同じ)ことになります。
ですから、最初のスクリプトは左のように、まず「ColorBars(320,240)」をlastという変数に指定し、次にそのlastをFlipVerticalの引数としたのと同じになります。 |
ん?ちょっと待てよ。二行目の「FlipVertical(last)」もlastに置き換えられるんじゃないのか?
そのとおりです。
「FlipVertical(last)」はビデオクリップであり、このスクリプトの最後に処理したクリップになります。そして、「変数名 =」の部分を省略した場合、ビデオクリップは特別な変数lastに割り当てられるのですから、「FlipVertical(last)」もlastに代入されることになります。
そのとおりです。
「FlipVertical(last)」はビデオクリップであり、このスクリプトの最後に処理したクリップになります。そして、「変数名 =」の部分を省略した場合、ビデオクリップは特別な変数lastに割り当てられるのですから、「FlipVertical(last)」もlastに代入されることになります。
つまり、こうなるわけです。 lastが3つもあって混乱するかもしれませんが、一行目のlastと二行目のFlipVerticalのカッコの中のlastは同じカラーバーのビデオクリップを表しています。 二行目の先頭のlastはFlipVerticalフィルタを適用し、上下反転させたあとのクリップになります。 |
ただし、このスクリプトを実行するとエラーが出ます。
|
戻り値(返り値ともいう)とは、関数が実行された結果として別の関数やプログラムに渡される(戻される)値のことです。
ん〜少しわかりにくいですね。どこかの文章をそのまま引用しただけみたいです(笑)
そこで、これをAviSynthスクリプトに限定して言い換えてみることにします。
戻り値とは、あるビデオクリップにフィルタ処理を行った結果として別のフィルタやアプリケーションに渡されるビデオクリップのことです(式の結果はビデオクリップでしたね)。
先ほどのスクリプトでは320x240サイズのカラーバーを上下反転させたビデオクリップ(以下、「反転カラーバー」と呼ぶことにします)を作り出しました。これはFlipVerticalフィルタに引数last(この場合、元のカラーバーのこと)を渡して処理した結果できたビデオクリップでした。
このスクリプトはこれでおしまいです。これ以上、フィルタはかけません。
ということは、あとはこの反転カラーバーをAVSファイルに対応したアプリケーション(VirtualDubModなど)に渡せばいいことになります。
そのためには、ここで「戻り値のビデオクリップは反転カラーバーですよ」と宣言してやらなければなりません。
そうしないと、AviSynthはどのビデオクリップをアプリケーションに渡していいのかわかりません。さきほどのエラーは、このために生じたエラーでした。
そして、この戻り値を宣言する記述法が、次の「return 式」です。
ん〜少しわかりにくいですね。どこかの文章をそのまま引用しただけみたいです(笑)
そこで、これをAviSynthスクリプトに限定して言い換えてみることにします。
戻り値とは、あるビデオクリップにフィルタ処理を行った結果として別のフィルタやアプリケーションに渡されるビデオクリップのことです(式の結果はビデオクリップでしたね)。
先ほどのスクリプトでは320x240サイズのカラーバーを上下反転させたビデオクリップ(以下、「反転カラーバー」と呼ぶことにします)を作り出しました。これはFlipVerticalフィルタに引数last(この場合、元のカラーバーのこと)を渡して処理した結果できたビデオクリップでした。
このスクリプトはこれでおしまいです。これ以上、フィルタはかけません。
ということは、あとはこの反転カラーバーをAVSファイルに対応したアプリケーション(VirtualDubModなど)に渡せばいいことになります。
そのためには、ここで「戻り値のビデオクリップは反転カラーバーですよ」と宣言してやらなければなりません。
そうしないと、AviSynthはどのビデオクリップをアプリケーションに渡していいのかわかりません。さきほどのエラーは、このために生じたエラーでした。
そして、この戻り値を宣言する記述法が、次の「return 式」です。
3.return 式
「return 式」(return文)で、式の結果としてのビデオクリップを戻り値として返します。
たとえば左のスクリプトの場合は、320x240サイズのカラーバーをアプリケーションに渡します。 |
反転カラーバーの場合はどうでしょう。
反転カラーバーには最後に処理したビデオクリップ(last)という変数名が与えられていますので、return文を使って「戻り値はlastです」と言えばいいことになります。
反転カラーバーには最後に処理したビデオクリップ(last)という変数名が与えられていますので、return文を使って「戻り値はlastです」と言えばいいことになります。
左の図のように、スクリプトの最後(にしたい場所)にreturn lastと書けばいいのです。 |
これで、このスクリプトにおける戻り値はlast(反転カラーバー)であるということになり、test.avsをアプリケーションで開くと、反転カラーバー(last)が表示されるようになります(プレビュー可能なアプリケーションの場合)。
ここで話は元に戻ります。
ここで話は元に戻ります。
まとめ
左がオリジナルのスクリプト、右が今回解説した変数lastとreturn文を使ったスクリプトです。
この2つのスクリプトがまったく同じ処理内容を表していることは、おわかりいただけますでしょうか。
前回まで「バージョン表示」、「カラーバー」、そして「反転カラーバー」と、左のスクリプトのように記述する方法を紹介してきました。いわゆる「2.式」の文法です。
一方で変数名の指定を省略した場合、ビデオクリップにはlastという特別な変数が割り当てられるということを、今回、紹介しました。
ですから、変数名の指定を省略した左のスクリプト(「2.式」)は、変数lastとreturn文を使って右のスクリプト(「1.変数名 = 式」と「3.return 式」)のように書き換えることができるのです。
あるいは、左のスクリプトを実行した場合、AviSynthの内部では右のスクリプトと同等の処理を行っていると言うこともできるでしょう。
この2つのスクリプトがまったく同じ処理内容を表していることは、おわかりいただけますでしょうか。
前回まで「バージョン表示」、「カラーバー」、そして「反転カラーバー」と、左のスクリプトのように記述する方法を紹介してきました。いわゆる「2.式」の文法です。
一方で変数名の指定を省略した場合、ビデオクリップにはlastという特別な変数が割り当てられるということを、今回、紹介しました。
ですから、変数名の指定を省略した左のスクリプト(「2.式」)は、変数lastとreturn文を使って右のスクリプト(「1.変数名 = 式」と「3.return 式」)のように書き換えることができるのです。
あるいは、左のスクリプトを実行した場合、AviSynthの内部では右のスクリプトと同等の処理を行っていると言うこともできるでしょう。
また、左の図のように任意の変数名を指定することもできます(ただし数字から始まる変数名はNG)。 |
実際にみなさんがスクリプトを書くときには、いずれの方法で記述してもかまいません。
今後、「スクリプト入門」では煩雑さ避けるために変数名の指定を省略することが多くなるでしょうが、変数とreturn文を使った記述方法についても覚えておいてください。将来的には自分でオリジナルの関数を作る方法についても紹介したいと考えていますが、自分で関数を作る場合には後者の記述法が必須となります。
さて、文法について長々と書いてきましたが、理解できましたでしょうか?
私も文法についてよく知らなくても何とかやってきましたので(汗)、たとえ今回の話がよく理解できなくてもあきらめる必要はありません。
念のために、次回は復習もかねて、これまで紹介しきれなかった事柄を補足しておきたいと思います。それをふまえて、より実践的なステップへと進んで行きましょう。
次回こそは、ちゃんとクイズの答えを紹介します・・・きっと。
今後、「スクリプト入門」では煩雑さ避けるために変数名の指定を省略することが多くなるでしょうが、変数とreturn文を使った記述方法についても覚えておいてください。将来的には自分でオリジナルの関数を作る方法についても紹介したいと考えていますが、自分で関数を作る場合には後者の記述法が必須となります。
さて、文法について長々と書いてきましたが、理解できましたでしょうか?
私も文法についてよく知らなくても何とかやってきましたので(汗)、たとえ今回の話がよく理解できなくてもあきらめる必要はありません。
念のために、次回は復習もかねて、これまで紹介しきれなかった事柄を補足しておきたいと思います。それをふまえて、より実践的なステップへと進んで行きましょう。
次回こそは、ちゃんとクイズの答えを紹介します・・・きっと。
前のページ | 次のページ |