AviSynthPlus/while のバックアップソース(No.1)

* このページについて [#s336c2d6]

このページでは、while 文を使ったループについて説明します。while 文は、AviSynth+ で利用可能です。 

なお、AviSynth+ 公式のヘルプで while 文に関する説明を確認できなかったため、以下の説明は元になった GScript プラグインの説明を参考に作成しました(下記の「参考」欄を参照)。

** オリジナル版 AviSynth では ... [#x1b4ed0f]

なお、オリジナル版の AviSynth では while 文を使った条件分岐はできませんが、GScript プラグインを使うことによって、同等のことが実現可能となります。その際、以下のように while 文全体を GScript() の中に入れてやる必要があります。

#pre{{
GScript("""
# while 文
""")
}}

また、再帰を使ってループを行うことも可能です(少し難しいので、ここでの説明はしません)。

* while 文の書き方 [#pe1b3c79]

#pre{{
while ( condition ) {
  statements
}
}}

-condition: 条件。この条件が真の間、以下の statements が実行される。
-statements: 文。while 文内で繰り返し実行したいスクリプトを書く。複数行可。

* while 文が実行されるときの流れ [#obc9a569]

+まず、condition が真か否か判定される。
+次に、
--condition が真なら、statements が実行される。
--condition が偽なら、statements は実行されず、ループを抜ける。
+最初に戻る。

なお、最初から condition が偽なら、statements は 1 回も実行されません。

* while 文の使用例 [#cbe3ed5b]

** 使用例 1 [#ha117dec]

#pre{{
# 空のクリップをソースとして使用
BlankClip(width=320, height=240)
# カウンタの初期化
i = 0
# i が 10 未満ならブロックの中を実行。
while (i<10) {
    Subtitle(String(i), y=i*15) # i*15 ずつずらして、i を表示、
    i = i + 1 # カウンタに 1 を足す
    last # 返り値をクリップにしないとエラーが出るので、last を指定
}
}}

#ref(after1.png)

0 から 9 まで計 10 個の数字が表示されている。i が 10 になると条件を満たさなくなるため、ループを抜けた。

** 使用例 2 [#r9635144]

#pre{{
# AviSynth のバージョンを表示するクリップをソースとして使用
Version()
# カウンタの初期化
i = 0
# i が 10 未満ならブロックの中を実行。
while (i<10) {
    Blur(1) # ぼかす(ここでは引数は 1 に固定している)
    i = i + 1 # カウンタに 1 を足す
    last # クリップを返す
}
}}

#ref(before2.png)

ぼかす前のクリップ。

#ref(after2.png)

ぼかしを while 文で 10 回繰り返した後のクリップ。

** 使用例 3 [#fa18219c]

#pre{{
Version() # 元となるクリップ
c = last # このクリップを下に積み込む。c = Version() と同じ
h = 500 # 高さの上限
i = 0 # カウンタの初期化(動作確認用)
# Height(last) が h より小さい間は、ブロック内を繰り返し実行。
while (Height(last) < h) {
    # 最初のループの時だけ、以下を実行(動作確認用)
    if (i == 0) {
        Subtitle(String(Height(last))) # クリップの高さを表示
    }
    # 最後に処理したクリップと c を縦に積む。
    StackVertical(last, c) # 繰り返されるだけ、クリップの高さは増えていく。
    i = i + 1 # カウンタを 1 増やす(動作確認用)
    last.Subtitle(String(Height(last)), y=i*128) # クリップの高さを表示(動作確認用)
}
}}

#ref(after3.png)

[[Version]] フィルタによって生成されたクリップが、条件を満たす間は下に積み込まれていった。

なお、コメントで動作確認用と書かれた部分は説明を補足するためのものであり、while 文の動作には直接関係ありません。

* 参考 [#x44427a6]

-[[GScript - language extensions for Avisynth - Doom9's Forum:http://forum.doom9.org/showthread.php?t=147846]]
-[[サンプルスクリプト]]