ScriptGrammar
スクリプト文法 †
すべてのAviSynthスクリプトのステートメントは、これらの形式のうちの1つをとります:
- 変数名 = 式
- 式
- return 式
1つ目の場合、式は評価され、結果(つねにビデオクリップ)は変数名にアサイン*1されます。2つ目の場合、式は評価され、結果は特別な変数lastに割り当てられます。3つ目の場合、式は評価され、スクリプトの"戻り値" -- すなわち、AVSを開くアプリケーションによって描かれるビデオクリップとして使われます。
式は、これらの形式のうちの1つをとることができます:
- 数値定数か文字列定数
- 変数名かクリップのプロパティ
- 関数(引数リスト(Args))
- 式.関数(引数リスト(Args))
- 式1 演算子 式2
- bool式 ? 式1 : 式2
1つ目の場合、式の値は定数の値です。2つ目の場合、値はクリップのプロパティかスクリプト変数(これは、前もって初期化されていなければなりません)に相当します。3つ目の場合、値はAVS関数の戻り値です(下記参照)。4つ目の場合は、関数(式, 引数)に相当する、("OOP表記法"と呼ばれる)代替シンタックスです。
最後の2つの場合は、三項演算子を使って条件付きでコードを実行するばかりではなく、int、float、val、boolに関して期待されるように、通常の計算や(C言語からの)論理演算子のすべてを使って、式を操作することができるということを示しています。文字列は'+'を使って連結することができます。また、以下の演算子は、ビデオクリップに関して、次のように定義されます: a + bはUnalignedSplice(a, b)に相当し、a ++ bはAlignedSplice(a, b)に相当する。
AviSynthのスクリプト言語における関数は、概して、ビデオフィルタです(あなた自身のスクリプト関数を定義することもできます)。関数は60個までの引数をとることができ(それで十分足りることを望みます)、戻り値はつねにクリップです。関数は、つねに新しいビデオクリップを生成します。けっして存在するクリップを修正するのではありません。各内蔵フィルタ用の関数呼び出しのシンタックスを見るためには、FiltersByCategoryを見てください。
注釈: 実は関数は、それが選ぶどのようなタイプ(の結果)をも返すことができます。これは、スクリプトの中で再利用するユーティリティ・コードを作成するために役に立つ特徴です。しかしながら、クリップを返さない関数は、つねに、引数としてフィルタ(クリップを返す関数)に渡す、変数の中間処理に限定されます。スクリプトは、いつも、最終的な値として、クリップを返さなければなりません。結局、AviSynthは、ビデオ処理アプリケーションなのです。
引数リスト(Args)は、コンマによって区切られた、関数の引数のリストです。引数リストは、空にすることもできます。各引数は、文字列、整数、浮動小数点数、またはビデオクリップ(すなわち、式)でなければなりません。フィルタ関数が1つ目の引数としてビデオクリップを期待していて、なおかつ、その引数が与えられないとしたら、そのときは、特別なlast変数の中のクリップが使われるでしょう。
AviSynthのフィルタは、名前付きの引数を取ることができます。名前付きの引数は、どんな順番でも、指定することができます。そしてフィルタは、使用するのをやめた引数に対しては、デフォルト値を選びます。たとえば、Subtitle("Hello, World!", 100, 200, 0, 999999, "Arial", 24, $00FF00)の代わりに、Subtitle("Hello, World!", text_color=$00FF00, x=100, y=200)と書くことができます。色は、上記の例のような16進法か10進法で指定することができます。どちらの場合も、たとえクリップ自体がYUVでも、それはRGB値として指定されるべきです。
また、あなたは、たとえば「フィルタ名 引数1 引数2」のように、関数を丸括弧なしで呼び出すこともできます。このような書き方をする主な理由は、古いスクリプトとの互換性を維持するためです。しかし、混乱の可能性がないときに、丸括弧を使用しないことは、時には、便利です。
AviSynthは、#記号から行末までのあらゆるものを無視します。これは、スクリプトにコメントを付け加えるために利用されます。
AviSynthは、大文字と小文字の別を無視します: aViSouRCeは、AVISourceとまったく同じです。
複合的なAviSynthステートメントを一行に記述することは、以下のように、OOP表記法のコンテキストか、フィルタを別の関数のパラメータとして埋め込むことにおいてのみ可能です:
AviSource("c:\video.avi").Trim(0, 499)
または
AudioDub(AviSource("c:\video.avi"), WavSource("c:\audio.wav"))
AviSynthステートメントは、バックスラッシュ("\")*2を、拡張される行の最後の非スペース文字として、もしくは、次の行の最初の非スペース文字として配置することによって、複数行にまたがって分割することができます。
行分割の例(どちらも有効であり、かつ等しい):
Subtitle("Hello, World!", 100, 200, 0, \ 999999, "Arial", 24, $00FF00)
または
Subtitle("Hello, World!", 100, 200, 0, \ 999999, "Arial", 24, $00FF00)
複数の行に渡って分割するとき、あなたは最後の行の終わりにコメントを置くかもしれません。行分割の中間の行でコメントをバックスラッシュと混ぜると、エラーメッセージか、バグをトレースするのが難しい結果が起こるでしょう。
コメントと行分割の不適当な分割によって合図されないバグの例:
ColorBars ShowFrameNumber Trim(0,9) # いくつかのフレームを選択する \ +Trim(20,29)
"\"がその前の#記号によって隠されているため、上記の例は、意図されたようにフレーム[0..9,20..29]を返しません。したがって、行の継続は、けっして起こりません。
AviSynthManualに戻る
註: このページは、http://www.avisynth.nl/ScriptGrammarの日本語訳です。