ScriptGrammar のバックアップの現在との差分(No.10)


  • 追加された行はこの色です。
  • 削除された行はこの色です。
*スクリプト文法 [#xab250fc]

すべてのAviSynthスクリプトのステートメントは、これらの形式のうちの1つをとります:

+変数名 = 式
+式
+return 式
+end
+''return'' 式

1つ目の場合、式は評価され、結果(つねにビデオクリップ)は変数名にアサイン((割り当てる、という意味。))されます。2つ目の場合、式は評価され、結果は特別な変数lastに割り当てられます。3つ目の場合、式は評価され、スクリプトの"戻り値" -- すなわち、AVSを開くアプリケーションによって描かれるビデオクリップとして使われます。4つ目の場合は、return lastに相当します。
1つ目の場合、式は評価され、結果(つねにビデオクリップ)は変数名にアサイン((割り当てる、という意味。))されます。2つ目の場合、式は評価され、結果は特別な変数''last''に割り当てられます。3つ目の場合、式は評価され、スクリプトの"戻り値" -- すなわち、AVSを開くアプリケーションによって描かれるビデオクリップとして使われます。

式は、これらの形式のうちの1つをとることができます:

+数値定数か文字列定数
+変数名かクリップのプロパティ
+関数([[Args>#args]])
+式.関数([[Args>#args]])
+式1 演算子 式2
+関数([[引数リスト(Args)>#args]])
+式.関数([[引数リスト(Args)>#args]])
+式1 ''演算子'' 式2
+bool式 ? 式1 : 式2

1つ目の場合、式の値は定数の値です。2つ目の場合、値は[[クリップのプロパティ>ClipProperties]]か[[スクリプト変数>ScriptVariables]](これは、前もって初期化されていなければなりません)に相当します。3つ目の場合、値はAVS関数の戻り値です(下記参照)。4つ目の場合は、関数(式, 引数)に相当する、("OOP表記法"と呼ばれる)代替シンタックスです。

最後の2つの場合は、三項演算子を使って条件付きでコードを実行するばかりではなく、int、float、val、boolに関して期待されるように、通常の計算や(C言語からの)[[論理演算子>LogicalOperators]]のすべてを使って、式を操作することができるということを示しています。文字列は'+'を使って連結することができます。また、以下の演算子は、ビデオクリップに関して、次のように定義されます:a + bは[[UnalignedSplice>Splice]](a, b)に相当し、a ++ bは[[AlignedSplice>Splice]](a, b)に相当する。
最後の2つの場合は、三項演算子を使って条件付きでコードを実行するばかりではなく、int、float、val、boolに関して期待されるように、通常の計算や(C言語からの)[[論理演算子>LogicalOperators]]のすべてを使って、式を操作することができるということを示しています。文字列は'+'を使って連結することができます。また、以下の演算子は、ビデオクリップに関して、次のように定義されます: ''a + b''は''[[UnalignedSplice>Splice]]''('''a''', '''b''')に相当し、''a ++ b''は''[[AlignedSplice>Splice]]''('''a''', '''b''')に相当する。

AviSynthのスクリプト言語における関数は、概して、ビデオフィルタです(あなた自身の[[スクリプト関数>ScriptFunctions]]を定義することもできます)。関数は60個までの引数をとることができ(それで十分足りることを望みます)、戻り値はつねにクリップです。関数は、つねに新しいビデオクリップを生成します。けっして存在するクリップを修正するのではありません。各内蔵フィルタ用の関数呼び出しのシンタックスを見るためには、FiltersByCategoryを見てください。
AviSynthのスクリプト言語における関数は、概して、ビデオフィルタです(あなた自身の[[スクリプト関数>ScriptFunctions]]を定義することもできます)。関数は60個までの引数をとることができ(それで十分足りることを望みます)、戻り値はつねに'''クリップ'''です。関数は、つねに新しいビデオクリップを生成します。けっして存在するクリップを修正するのではありません。各内蔵フィルタ用の関数呼び出しのシンタックスを見るためには、FiltersByCategoryを見てください。

''注釈:'' 実は関数は、それが選ぶどのようなタイプ(の結果)をも返すことができます。これは、スクリプトの中で再利用するユーティリティ・コードを作成するために役に立つ特徴です。しかしながら、''クリップ''を返さ'''ない'''関数は、つねに、引数としてフィルタ(クリップを返す関数)に渡す、変数の中間処理に限定されます。スクリプトは、いつも、最終的な値として、クリップを返さなければなりません。結局、AviSynthは、ビデオ処理アプリケーションなのです。

&aname(args);Argsは、コンマによって区切られた、関数の引数のリストです。引数リストは、空にすることもできます。各引数は、文字列、整数、浮動小数点数、またはビデオクリップ(すなわち、式)でなければなりません。フィルタ関数が1つ目の引数としてビデオクリップを期待していて、なおかつ、その引数が与えられないとしたら、そのときは、特別なlast変数の中のクリップが使われるでしょう。
&aname(args);引数リスト(Args)は、コンマによって区切られた、関数の引数のリストです。引数リストは、空にすることもできます。各引数は、文字列、整数、浮動小数点数、またはビデオクリップ(すなわち、式)でなければなりません。フィルタ関数が1つ目の引数としてビデオクリップを期待していて、なおかつ、その引数が与えられないとしたら、そのときは、特別なlast変数の中のクリップが使われるでしょう。

AviSynthのフィルタは、名前付きの引数を取ることができます。名前付きの引数は、どんな順番でも、指定することができます。そしてフィルタは、使用するのをやめた引数に対しては、デフォルト値を選びます。たとえば、
 Subtitle("Hello, World!", 100, 200, 0, 999999, "Arial", 24, $00FF00)
の代わりに、
 Subtitle("Hello, World!", text_color=$00FF00, x=100, y=200)
と書くことができます。[[色>Colors]]は、上記の例のような16進法か10進法で指定することができます。どちらの場合も、たとえクリップ自体がYUVでも、それはRGB値として指定されるべきです。
AviSynthのフィルタは、名前付きの引数を取ることができます。名前付きの引数は、どんな順番でも、指定することができます。そしてフィルタは、使用するのをやめた引数に対しては、デフォルト値を選びます。たとえば、''Subtitle("Hello, World!", 100, 200, 0, 999999, "Arial", 24, $00FF00)''の代わりに、''Subtitle("Hello, World!", text_color=$00FF00, x=100, y=200)''と書くことができます。[[色>Colors]]は、上記の例のような16進法か10進法で指定することができます。どちらの場合も、たとえクリップ自体がYUVでも、それはRGB値として指定されるべきです。

また、あなたは、関数を、丸括弧なしで呼び出すこともできます。たとえば、以下のように。
 フィルタ名 引数1 引数2
このような書き方をする主な理由は、古いスクリプトとの互換性を維持するためです。しかし、混乱の可能性がないときに、丸括弧を使用しないことは、時には、便利です。
また、あなたは、たとえば「''フィルタ名'' '''引数1''' '''引数2'''」のように、関数を丸括弧なしで呼び出すこともできます。このような書き方をする主な理由は、古いスクリプトとの互換性を維持するためです。しかし、混乱の可能性がないときに、丸括弧を使用しないことは、時には、便利です。

AviSynthは、#記号から行末までのあらゆるものを無視します。これは、スクリプトにコメントを付け加えるために利用されます。

AviSynthは、大文字と小文字の別を無視します: aViSouRCeは、AVISourceとまったく同じです。

複合的なAviSynthステートメントを一行に記述することは、以下のように、OOP表記法のコンテキストか、フィルタを別の関数のパラメータとして埋め込むことにおいてのみ可能です:

 AviSource("c:\video.avi").Trim(0, 499)
#pre{{
AviSource("c:\video.avi").Trim(0, 499)
}}

または

 AudioDub(AviSource("c:\video.avi"), WavSource("c:\audio.wav"))
#pre{{
AudioDub(AviSource("c:\video.avi"), WavSource("c:\audio.wav"))
}}

AviSynthステートメントは、バックスラッシュ("\")を、拡張される行の最後の非スペース文字として、もしくは、次の行の最初の非スペース文字として配置することによって、複数行にまたがって分割することができます。
AviSynthステートメントは、バックスラッシュ("\")((訳者註: 日本語環境では、半角の円記号(¥)。))を、拡張される行の最後の非スペース文字として、もしくは、次の行の最初の非スペース文字として配置することによって、複数行にまたがって分割することができます。

行分割の例(どちらも有効であり、かつ等しい):

 Subtitle("Hello, World!", 100, 200, 0, \
 999999, "Arial", 24, $00FF00)
#pre{{
Subtitle("Hello, World!", 100, 200, 0, \
999999, "Arial", 24, $00FF00)
}}

または

 Subtitle("Hello, World!", 100, 200, 0,
 \ 999999, "Arial", 24, $00FF00)
#pre{{
Subtitle("Hello, World!", 100, 200, 0,
\ 999999, "Arial", 24, $00FF00)
}}

複数の行に渡って分割するとき、あなたは最後の行の終わりにコメントを置くかもしれません。行分割の中間の行でコメントをバックスラッシュと混ぜると、エラーメッセージか、バグをトレースするのが難しい結果が起こるでしょう。

コメントと行分割の不適当な分割によって合図されないバグの例:

#pre{{
ColorBars
ShowFrameNumber
Trim(0,9) # いくつかのフレームを選択する  \
+Trim(20,29)
}}

"\"がその前の#記号によって隠されているため、上記の例は、意図されたようにフレーム[0..9,20..29]を返しません。したがって、行の継続は、けっして起こりません。

''AviSynthManualに戻る''

#hr
註: このページは、http://www.avisynth.org/ScriptGrammarの日本語訳です。
註: このページは、http://www.avisynth.nl/ScriptGrammarの日本語訳です。