niiyan's blog

niiyanの個人ブログ。

FilterRangePlus

2ちゃんねるAvisynthスレッドで、「FilterRangeを複数指定したいときに、簡単に記述する方法がないか」という話題が出ていたので、ちょっと考えてみました。

本当は2ちゃんねるの方に書き込もうと思ったのですが、説明がかなり長くなってしまったので、ここに書くことにしました。

それに、この話題自体はすでに終わってしまったようですからね(乗り遅れた 笑)。

この関数のメリットとしては、指定する範囲の数を簡単に増やせることでしょうか(デフォルトでは3つだけ)。

逆にデメリットというか、イマイチなところは、設定の仕方がややこしかったり、ちゃんと動作するか自信がないということでしょうか(ぉぃぉぃ)。

個人的にループさせる関数を使ってみたくて作ったという感じなので、テスト版と考えてください。

説明

minamina氏作FilterRange関数を改造して、フィルタを適用できる範囲の数を増やした。
フィルタの適用範囲の数を調節することも可能。

メインのFilterRangePlus関数とサブのRecursiveA, RecursiveB, RecursiveCの3つの関数を
セットで使用します。

書式

FilterRangePlus(clip clip, string "filter", int "times",
\ int "s1", int "e1", int "s2", int "e2", int "s3", int "e3", ...)

パラメータ

  • filter:使用したいフィルタ
  • times:フィルタを適用する範囲の数
  • s*:適用開始点(*は数字)
  • e*:適用終了点(*は数字)

※s*,e*は増やすことが可能(下記「応用」を参照)

使用例

FilterRangePlus("GreyScale()", 3, 21,28, 12,17, 3,6)

[重要]
適用範囲を複数指定する場合、フレーム番号が大きい範囲から順番に指定してください。
たとえば、3-6, 12-17, 21-28の3つの範囲を指定する時は、21-28, 12-17, 3-6の順になります。

×3,6, 12,17, 21,28
○21,28, 12,17, 3,6

やってはいけない

  • フィルタ適用範囲の数(times)が間違っている。多すぎる場合はエラーが出るようにしています。
  • フィルタ適用範囲の順番が小さい番号からになっている(例)6,9, 13,17
  • フィルタ適用範囲がかぶっている(例)12,16, 8,14
  • フィルタ適用範囲が連続している(例)5,9, 3,5→3,9と1つにまとめる

応用(フィルタ適用範囲の数をふやす)

関数の()内に「,int "s*", int "e*"」を追加することで、フィルタ適用範囲の数を

増やすことができます。(*は数字)

(例)5箇所指定できるようにする

function FilterRangePlus(〜 int "e3", int "s4", int "e4", int "s5", int "e5")

メイン関数

function FilterRangePlus(clip clip, string "filter", int "times",
\ int "s1", int "e1", int "s2", int "e2", int "s3", int "e3")
{
Assert(IsInt(Eval("s" + String(times))), "timesが正しくない")
Assert(s1 > s2 && e2 < s1, "範囲指定が正しくない")
d = (Eval("s" + String(times)) < 2) ? clip.Trim(0, -1) :
\ clip.Trim(0, Eval("s" + String(times)) - 1)
Eval(RecursiveA("", times, filter))
Eval(RecursiveB("", times-1))
c0 = (e1 > clip.FrameCount()-2) ? BlankClip(clip,1) : clip.Trim(e1 + 1, 0)
c = (Eval("s" + String(times)) == 0) ? Eval(RecursiveC("", (times*2)-1) + "c0") :
\ d + Eval(RecursiveC("", (times*2)-1) + "c0")
c = (e1 > clip.FrameCount()-2) ? c.Trim(0, clip.FrameCount()-1) : c
return c
}

サブ関数

function RecursiveA(string s, int times, string filter)
{
return (times == 0) ? s :
\ "c" + String(times*2-1) + " = clip.trim(s" + String(times) + ", e" +
\ String(times) + ")." + filter + " " + RecursiveA(s, times-1, filter)
}

function RecursiveB(string s, int times)
{
return (times == 0) ? s :
\ "c" + String(times*2) + " = clip.trim(e" + String(times+1) + "+1, s" +
\ String(times) + "-1)" + " " + RecursiveB(s, times-1)
}

function RecursiveC(string s, int times)
{
return (times == 0) ? s : "c" + String(times) + " + " + RecursiveC(s, times-1)
}