見出し画像

DaVinciResolveのFusionマクロ関連の最近の知見

まえがき

しばらく遊んでて全然スクリプト開発してませんでした。
火注ゆかなです。

今はボイロ連携ツールからいったん離れて、PSDファイルからDavinciResolveのマクロテンプレートを作成するスクリプトを組んでいます。
ただ、既に上位互換スクリプトを組んでる方たちが現れたため、今はもう作る必要がなくなりました。

他の方のPSD立ち絵テンプレート作成ツールが気になる方はこちら。

先駆者様のPSD立ち絵テンプレート作成ツール紹介

ぬろく様作 (2022/8/14時点では動作確認者募集中)
DaVinciResolve_PSDFusionGenerator_v0.1.1

てけと様作 (自動生成ではなく、あくまで作成の補助ツール)
【DaVinci Resolve】立ち絵 補助ツール を作った【Fusion】

https://nico.ms/sm40785019

なお、私自身は上記ツールを実際に試したわけではありません。
悪しからず。
(それでも紹介するのは、そもそもDavinciResolveでボイロ立ち絵を取り込むスクリプトが全くないからなので、ここに書いておけば1人でも多くの人の目に触れるだろうという考えだからです。)

ぬろく様のツールと異なり、てけと様のツールは自動生成ではなく、あくまでテンプレート作成を補助するもののようです。
自分で色々弄りたい方はこちらの方が良いのかもしれません。
また、てけと様はVOICE VOXを中心にソフトウェアトーク関連機能をまとめたツール群を開発されてます。凄いですね。
やっぱり私が頑張る理由ありませんよこれ。

上記ツールの登場で私が立ち絵テンプレート作成スクリプトを組む理由はなくなったのですが、それでも自作継続しているのは完全に趣味です。
ちょっとした気づきがあると面白いんですよね。

今回は最近得た知見をまとめていきます。


Fusionでマクロを取り込めない原因と対処法

マクロについての簡単な説明

DavinciResolveのFusionページでは、ノードを組み合わせて色々な画像処理が可能です。
また、それらノードをひとまとめにして、一つのノードとして扱うことができます。この複数ノードを組み合わせたノードを「マクロ」と呼びます。

ザっと簡単に述べると
①Fusion画面でマクロにまとめたいノードを選択
②右クリックして「Macro」→「Create Macro」で保存画面を開く
③マクロ名と、インスペクタ(Edit画面でアイテム選択時、右側に出る各種値の編集画面)に表示するコントロールを選択
で作成可能です。

まあ、本題から逸れるのでマクロの詳しい作成方法はここでは説明しません。Googleで検索すれば色々出てきますし……。

複数ノードを選択→右クリック→Create Macroで作成可能
マクロ名や、マクロ選択時のインスペクタ(UI)表示するコントロールも指定して保存可能
Edit画面の右に表示されるタイムラインアイテムの編集画面部分がインスペクタ

出力したマクロは「Text+」テンプレートのようにEdit画面のテンプレート一覧に追加することも可能です。
色んなプロジェクトで使いまわすものは追加しておくと色々楽かも。

テンプレ―ト一覧に追加したい場合は以下のフォルダにマクロファイルをコピーすればOK。

C:\(アカウント名)\AppData\Roaming\Blackmagic Design\DaVinci Resolve\Support\Fusion\Templates\Edit\(テンプレ―トの種類毎のフォルダ)

フォルダに追加されたマクロがテンプレート一覧に表示される

この記事における立ち絵テンプレ―ト作成というのも、
①PSDファイル、もしくはそれらを分解出力したPNGファイルのフォルダを読み込み
②マクロとして出力
という一連の流れを指します。

ちなみにこのマクロ(というかFusionノード)はテキストエディタで閲覧するだけでなく編集も可能です。
Fusion画面では直接弄ることができない or 面倒臭い設定もテキストエディタなら簡単にできたりします。

マクロを含めたFusionノードはテキストエディタで編集可能

……というか、Editコントロール(インスペクタ部分)の並び順の入れ替えとかはテキストエディタじゃないとやってられません。

マクロを取り込めない原因

で、ようやく本題なのですが。
プログラムなどで自動生成したマクロや、テキストエディタで編集した後のマクロをFusionへ取り込めないことがあります。

立ち絵マクロを自動生成するにあたってFusionに取り込めない(反映されない)状態にひどく悩まされたものですが、この原因がわかりました。

今のところわかっているもので、マクロが取り込めない原因は2つ。
・属性を区切るための半角カンマ(",")が足りない
・括弧("{}[]")の数が合わない

逆に、以下のような要素は含まれていてもマクロ自体は取り込めました。
(無視して読み込まれるだけなので、数式やノード接続など動作の整合性はまた別)
・半角カンマが多い
・存在しない属性を設定している
・存在する属性だが変な値(整数値の属性に文字列etc)を設定している

-- 例:ノードから一部抜粋 (半角ハイフン2つの後はコメント扱いになる)
UserControls = ordered() {
    ImageID = {
        ICS_ControlPage = "Controls",
        LINKS_Name = "ImageID"       -- ←ここのカンマが抜けていると取り込めない
        LINKID_DataType = "Number",
        INPID_InputControl = "SliderControl",
        INP_Integer = true,
        INP_MaxScale = 99,
        INP_MinScale = 0,
        INP_Default = nil,    -- 変な値は無視され、指定がないものとみなされる(適当な初期値が当てられる)
        INP_MaxAllowed = 1000000,
        INP_MinAllowed = -1000000,
        IC_Steps = 1,,        -- ←余計なカンマがあっても特に問題なし
        Test_Value = "これは存在しない属性です"    -- ←存在しない属性は無視される
        }   -- ←このように閉じ括弧が一つ多かったりして対称が取れていないと取り込めない
    }
}

つまり、マクロを取り込む際には文法が正しいかどうかが重要のということのようです。

マクロファイルをFusion画面へドラッグしたり、マクロファイルの文字列をFusion画面へコピペしても取り込めない……。
と言う場合には、カンマや括弧の位置や数がちゃんと合っている確認しましょう。


Fusionノード名は記号が使えない

まんまです。
Fusionノード名には全角を含め、ほとんどの記号が使えません。まともに使えるのは半角アンダーバー("_")ぐらいです。
ノード名に記号を含めて設定した場合、エラーは出ません。
記号を除外した文字列部分だけが反映されます。

テキストエディタで編集しても同様です。Fusionに取り込むときに記号を除外したノード名になります。

全角でも半角でも、記号は全て無視される(半角アンダーバー「_」は使える)

手動でノードを設定していくなら途中で気づくでしょうし、特に問題ありません。
しかし、これを知らないままスクリプトでマクロを自動生成しようとすると、参照するノード名が違ってて数式が機能しなかったり、ノードの接続が切れるという問題が起こります。

ひとえに私のFusionへの理解が足りないのが悪いのですが、私と同じようにスクリプトでノードを操作しようとする人は意外とハマるかもしれません。


EditコントロールのLabelNestの活用法

LabelControlの基本

EditコントロールでLabelControlというものがあります。
文字通りラベル(文字列を表示するだけ)なのですが、ネストという入れ子構造オプションが付いています。
「Hide Next」に値を設定すると、LabelControlの後に続くコントロールを隠すことができます。
「2」と設定したなら、後に続くコントロール2つの表示、非表示を切り替えられます。

LabelControlの設定(Hide Next = 2)

上手く使えば、普段はあまり設定しない項目はまとめて非表示にして、インスペクタの表示項目を少なくしておけます。
ここまでは誰でも思いつく、というか普通に想定されている使われ方でしょう。

LabelControlをCheckBox代わりにする

さて、本題に入ります。
このLabelControlのNestですが、他のコントロールのExpressionで参照すると開閉状態が「1(開いている)、0(閉じている)」で取得できます。
つまり、LabelControlはCheckBoxの役割を兼ねることができます。

上手く使えばインスペクタの表示を見やすくしたうえでCheckBoxコントロールを減らすことも可能でしょう。
その代わり、CheckBoxのようにキーフレームごとに値を指定することはできません。細かくON/OFFするような操作には不向きなので、その場合は素直にLabelControlとCheckBoxの両方を分けて記述した方が良いと思います。

ExpressionでLabelControlのコントロール名を設定するだけで連動する

LabelControlで表示領域を動的に変更する

ExpressionでLabelControlの開閉状態を参照できるということは、逆にLabelControlの開閉状態を別のコントロールから操作できるということでもあります。
例えば、SliderやComboBoxの値と連動するようにすれば、「設定したい項目群だけ表示して、それ以外は非表示にする」という操作をワンアクションで実行できるということです。

百聞は一見に如かず、ということで実際にSliderで切り替えられるようにしたのがこちら。

数式を設定すると手動で開閉できなくなりますが、操作ミスを防ぐという点ではむしろ良いことでしょう。
設定する必要がない項目は表示しないに限ります。

注意点として、LabelControlに数式を追加するためにはテキストエディタで編集する必要があります。
というのも、インスペクタ上のコントロールは右クリック→「Expression」を選択することで数式を設定できるのですが、LabelControlは数式の入力欄が表示されないからです。

通常はSliderControlのように下段に数式欄が表示されるが、LabelControlは表示されない

立ち絵ファイルは入れ子構造(上半身/服装/ポーズ……etc)になっていることもあるので、そういう「入れ子構造だけれど、服装1のポーズ編集中は服装2や服装3の下位レイヤー項目は非表示にしておきたいし、すぐ切り替えたりもしたい」みたいな需要を満たせると思います。


おわり

とりあえず、最近の知見はこんな感じでした。
スクリプトと違ってFusion関連情報は色んな所にあふれているので書く必要あるかなあと思いつつ、備忘録も兼ねまして。

でも今回の(特にLabelControl)、調べようと思っても検索に引っ掛けるにはかなり難しい気がしますね……どうやって検索すれば、というか検索するためにどういう知識が必要なんでしょう?
そもそもDavinciResolveのFusionを弄る人で、LabelControlをCheckBox代わりにしようという発想する人がどれだけいるのやら……。

まあ、この情報がお役に立てば幸いです。

サポートしていただけるとその分の価値を提供できてるんだなって励みになります。