Darkside(リンクエラー修正しました)

<< 前のページ

2018年9月17日(月) 19:58

見切り発車

 拡張編集では、トラックバーとチェックマーク以外の独自パラメーター(中点座標など)を抱えることができない。
 正確に言えば、抱えることは可能だが1セットしか抱えられない。同一フィルターを複数個所で使用しても、すべて同一のトーンカーブが適用されてしまう。
 トーンカーブを何種類か定義しておけるように作り、トラックバーで切り替えるという手法も考えられる。だが、操作が煩雑化するという以前に、独自 Window の生成が無理。以前の記事に書いた通り、拡張編集でトラックバーに付随するボタンを押して特定の設定を行った場合、アプリケーションエラーが出る。回避方法は不明。

 かくして拡張編集対応断念に傾いたのだが、filter.h を再確認して「もしかすると手があるかもしれない」と思い直した。
 まず、トラックバーのボタンによる設定が致命的エラーを発生させる件。これは、パラメーターを適切に扱うことで解消できる可能性がある。というより、解消できないとおかしい。

 次に、独自パラメーターはトラックバーで保持できる。中点のX座標Y座標をトラックバーで指定できるようにすれば、複数スクリプトで別々の中点座標セットを保持できる。
 もちろんそのままでは直感的操作ができず使い物にならない。しかし、1つだけ生成した独自 Window 上でトーンカーブをいじり、そのパラメーターをトラックバーの位置に反映させれば良い。
 これを行うには、人間操作ではなくプラグイン側からトラックバーの値を変更可能でなければならない。

 トリッックの限りを尽くして強引に拡張編集で使えるようにしなくても良いと言えば良いのだが、仮に皮算用がうまく行けば「トーンカーブのトラジション」などの上位機能が実現できる。
 TAS製作同様に、ソフト製作には「カネが掛からない」という大きなメリットがある。いましばし、こだわってみても良いだろう。

 そう考えたものの、プラグイン側からトラックバーの値を操作することは出来なかった。
 こうして、希望は絶たれた。
 トラックバー操作でトーンカーブの中点を動かす、などという鬱陶しい操作を強いられるのであれば、トーンカーブ調整プラグインを新造する意味などない。他を使ってくれ、という感じだ。

 そこであくまで自分が欲しい操作性を実現させる、という観点から基本編集専用プラグインだけ製作することにした。
 どうせなら、とn次関数によるトーンカーブ表示を試す。

 すると、滑らかさに関しては申し分ないものの、想像以上に扱い難いものになった。というのも、中間点を動かすことにより形状変更が全体に及ぶのだ。
 左端の中間点を動かしただけで、曲線の右端が動く。これは、厄介だ。
 まとめてみよう。

・ベジエ曲線
 中間点を通らないので論外。
・スプライン曲線
 中間点のちょっとした配置の妙で極端な部分形状が生じる。
・3次曲線のリレー
 中間点が少ないと折れ目が目立つ。
・n次曲線
 遠方に影響が及び過ぎる。

 総合的に、3次曲線のリレーが一番扱い易いと判断した。しかし、一般に見掛けるトーンカーブ機能は、更に素直で扱い易い挙動に感じる。一体どうやって曲線を描いているのだろうか?
 離散点を滑らかな曲線で接続するという命題はありふれていて、いろいろな手法が工夫されているようだ。だが、結局このまま3次曲線のリレーで行くことにした。

 測定データーを曲線でつなぐような場合であれば、ベターな仕上がりを追求することに大いに意味がある。だが、トーンカーブ調整ツールの場合、点は自由に追加・削除・移動ができる。与件ではない。
 ならば、不自然な曲線は運用回避すれば良い。実際に操作してみて、十分実用的に希望の曲線を作れることは分かっている。

 プラグインのダウンロードは、こちらから可能。

written by higashino [カメラ] [この記事のURL] [コメントを書く] [コメント(0)] [TB(0)]

この記事へのトラックバックPingURL

2018年9月16日(日) 19:32

無理だ

 拡張編集では、トラックバーとチェックマーク以外の独自パラメーター(中点座標など)を抱えることができない。
 正確に言えば、抱えることは可能だが1セットしか抱えられない。同一フィルターを複数個所で使用しても、すべて同一のトーンカーブが適用されてしまう。
 トーンカーブを何種類か定義しておけるように作り、トラックバーで切り替えるという手法も考えられる。だが、操作が煩雑化するという以前に、独自
Window の生成が無理。以前の記事に書いた通り、拡張編集でトラックバーに付随するボタンを押して特定の設定を行った場合、アプリケーションエラーが出る。回避方法は不明。

 かくして拡張編集対応断念に傾いたのだが、filter.h を再確認して「もしかすると手があるかもしれない」と思い直した。
 まず、トラックバーのボタンによる設定が致命的エラーを発生させる件。これは、パラメーターを適切に扱うことで解消できる可能性がある。というより、解消できないとおかしい。

 次に、独自パラメーターはトラックバーで保持できる。中点のX座標Y座標をトラックバーで指定できるようにすれば、複数スクリプトで別々の中点座標セットを保持できる。
 もちろんそのままでは直感的操作ができず使い物にならない。しかし、1つだけ生成した独自 Window 上でトーンカーブをいじり、そのパラメーターをトラックバーの位置に反映させれば良い。
 これを行うには、人間操作ではなくプラグイン側からトラックバーの値を変更可能でなければならない。

 トリッックの限りを尽くして強引に拡張編集で使えるようにしなくても良いと言えば良いのだが、仮に皮算用がうまく行けば「トーンカーブのトラジション」などの上位機能が実現できる。
 TAS製作同様に、ソフト製作には「カネが掛からない」という大きなメリットがある。いましばし、こだわってみても良いだろう。

 そう考えたものの、プラグイン側からトラックバーの値を操作することは出来なかった。
 こうして、希望は絶たれた。
 トラックバー操作でトーンカーブの中点を動かす、などという鬱陶しい操作を強いられるのであれば、トーンカーブ調整プラグインを新造する意味などない。他を使ってくれ、という感じだ。

 そこであくまで自分が欲しい操作性を実現させる、という観点から基本編集専用プラグインだけ製作することにした。

written by higashino [カメラ] [この記事のURL] [コメントを書く] [コメント(0)] [TB(0)]

この記事へのトラックバックPingURL

2018年9月15日(土) 21:48

難題

 誤動作する場合、プログラムコードを出来るだけシンプルにして誤動作しない状態を作るのが常道である。
 誤動作しなくなったら、プログラムコードを少しずつ追加して何が障害を発生させているかを調べる。

 その結果、トラックバーとチェックボックスは異なることが判明した。
 チェックボックスが1つだけの場合、誤動作させないプログラム記述は可能である。別種のスクリプトと合体させ、そのスクリプトのボタンを押しても普通に動作する。


 しかし同じプログラムコードでトラックバーが1つだけのものの場合、一見正常に動作するようで「補間移動」か「回転」を選んだ場合のみアプリケーションエラーが発生するのだ。原因は分からない。
 拡張プラグインから強引に呼び出されている訳で、その手法の証左が不明である以上、手探りしかない。謎な動作は、謎としか言えないのだ。
 これはやはり、通常編集用プラグインと拡張編集用プラグインの2つを公開すべきだ。とはいえ、拡張編集用プラグインが実現可能かどうかは分からない。

 厄介なのは、拡張編集では複数の同じプラグインが同時動作可能なこと。
 グローバル変数に重要な値を格納して使っていると、同時動作で変数が共有されてしまい、独立した設定動作ができない。
 これは、設定用 Window を自前で生成する場合、大きな問題となる。

 このように、タイムラインにトーンカーブ調整プラグインを2つ配置した場合・・・

 「開始時に呼ばれる関数」は1回しか実行されないし、この2つを切り替えても「設定ウィンドウにウィンドウメッセージが来た時に呼ばれる関数」に入ってくる fp->hwnd の値は変わらない。
 これでプラグインを作成すると、どこか1箇所で調整したトーンカーブがそれ以外の全箇所に反映されてしまう。

 aviutl プラグインの標準仕様に含まれているトラックバーとチェックボックスだけを使用するのであれば、別箇所に配置したプラグインには独立したトラックバー値とチェックボックス状態が支給される(はずだ)。しかし、独自に Window を開こうとすれば、複数配置されたプラグインのうちどれが編集対象になっているか?を独自に判断せねばならなくなる。

 この根本的問題が解決できないのであれば、標準編集専用としてプラグインをリリースするしかない。

written by higashino [カメラ] [この記事のURL] [コメントを書く] [コメント(0)] [TB(0)]

この記事へのトラックバックPingURL

2018年9月14日(金) 21:46

問題はガワ

 既製品の Window が使い物にならないなら、勝手に CreateWindow してその中で編集すれば良いのでは?

 設定ウインドーが発生する際のイベントは、拡張編集でも発生する。その中で CreateWindow して表示や編集だ。
 しかし、概念は単純だが実装は容易ではない。ただでさえ、プラグインがプラグインを強引に呼び出している拡張編集である。それが更に別の Window を開いて中であれこれやるのだ。更に、拡張編集は複数可能。同じトーンカーブ調整プラグインが、同時に複数動作することもある。そんな編集やっていて、トラブルを発生させることなく動作できなければならない。

 トーンカーブ調整機能の中身は、既に完成している。やることは変わらない。つまり、ガワを作成できるかどうかが勝負だ。
 aviutl の実行寿命において1回ずつのみ実行される、DLL初期処理と DLL終了処理。その中で、RegisterClass と UnregisterClass を実行する。

 まずは、チェックボックス1つだけのプラグインを定義する。そして、フィルター実行関数の中でチェックボックスの値を確認し、1なら CreateWindow する。
 これが、一番良いタイミングで Window を生成できる。

 希望のタイミングで自動的に CreateWindow を実行させるためには、これしかない。他のイベントを使うと、余計なタイミングで実行されてしまう。
 しかし、チェックボックスは手動で外すこともできる。そのために、配慮すべき例外が増える。
 ならば、見た目は悪くなるがトラックバーはどうか。最大値と最小値がいずれも1というトラックバーを1つだけ定義すると、手動で値を変えることはできなくなる。

 これは、一見すると期待通りに動作する。ところが、中央のボタンを押すとアプリがハングアップする。無反応になる。このボタンは、トラックバーが定義されていると拡張編集プラグインが勝手に生成してしまう。
 1分ぐらい放置すると、操作可能になる。だが、これでは使い物にならない。

 止むを得ずチェックボックス1つのタイプを使用し、手動でチェックが外されるなど嫌な場合はどうリカバーするかを考える。しかし、どんな操作でもトラブルが起きないかどうかを確認するのは容易ではない。
 トラックバーを持った他スクリプトと併用すると、他スクリプトに存在するボタンを押したときにアウト。やはり1分ぐらい応答なしになってしまう。

 つまり、チェックボックス化では回避できない。トラックバーのボタンを押しても問題ないような実装を行わねばならない。果たして、それは可能なのだろうか?
 だが、可能でさえあればトーンカープ調整プラグインでもトラックバーが使えるから、チェックマークが手動で外される問題も同時に解決する。

written by higashino [カメラ] [この記事のURL] [コメントを書く] [コメント(0)] [TB(0)]

この記事へのトラックバックPingURL

2018年9月13日(木) 21:17

拡張編集

 残念ながら、話はこれで終わりではない。

 aviutl には拡張編集というものがあり、普通に動画編集する場合はそちらが利用される。
 自分は拡張ではない編集でもそれなりに便利に使っている。数秒の単一クリップを公開することが多いため、別に困らない。しかし、長い動画を作ろうとすると、標準編集ではできないことが多発する。

 だが、拡張編集では使えないプラグインも多い。
 そもそも拡張編集自体が、プラグインである。aviutl のメニューでは、他のプラグインに混じって同等の立場で出現する。すなわち、拡張編集でプラグインを使うというのは、プラグインの中から別のプラグインを使うというイレギュラーな話なのだ。それを実現するため無理矢理なことを行っており、そのため使用可能なプラグインに制限がある。

 例えば、ラジオボタンモードを使っているとアウト。

 ラジオボタンモードとは、見た目はチェックボックスだがそのうち1つしかチェックできないというモードである。トーンカーブ適用対象を選ぶにあたり、当然のごとく使用している。
 だから、トーンカーブ調整プラグインは、拡張編集では使えない。プラグイン選択で、リストに表示されない。

 それだけなら、トラックバーに置換することもできる。
 ところが、拡張編集ではボタンも使えない。表示されるが、押しても反応しない。「設定ウィンドウにウィンドウメッセージが来た時に呼ばれる関数」は、拡張編集においても呼ばれているようだ。しかし、WM_COMMAND は受け取れない。恐らく拡張編集プラグインが受け取ってしまい、一部のメッセージだけプラグインを再呼び出ししているのだろう。

 これも最悪、トラックバーにできないわけじゃない。2値のトラックバーは、もちろん可能だ。いちいち手動で一往復させねばならないが。

 この時点で、かなり使い勝手が悪化する。でも、致命傷ではない。
 致命的なのは、そもそも画面描画できないこと。WM_PAINT まで受け取れなくなっているので、ヒストグラムもトーンカーブも描けない。マウスクリックも拾えないので(略)。

 これでは、どうしようもない。

written by higashino [カメラ] [この記事のURL] [コメントを書く] [コメント(0)] [TB(0)]

この記事へのトラックバックPingURL

<< 前のページ

Darkside(リンクエラー修正しました)

Generated by MySketch GE 1.4.1

Remodelling origin is MySketch 2.7.4