【Lua × Davinci Resolve】スクリプトで映像のリズムを制御するプログラミング入門

はじめに

今回解説するのは、タイトルの通りです。百聞は一見に如かず、まずは、下の映像をご覧ください。

(使用曲「ルマ」については非商用目的に限り使用可である旨、確認済)

正方形・円がリズムに合わせて変化しているのが分かるかと思います。今回、曲のテンポが154なので、60/154秒を一周期として振動させています。

では、一体どうやってこのような映像を作るのか?流石に手作業で行うわけにはいきませんよね?

以下では、編集ソフト「Davinci Resolve」を用いた方法について解説します。

Character
ちなみに、投稿者は「Davinci Resolve」を愛用しています。無料なのに高性能。皆さんも使ってみて~

本題

先ほどの映像、手作業で作ってもいいのですが、人間の手でやると、多少の誤差が出てしまうもの。テンポが分かっているのなら、それを用いてプログラムしたほうが正確ですよね。

そこでカギになるのが、「エクスプレッション」。

簡単に言うと、プログラミング(Lua言語)を用いてやってほしい内容を指示すること。

まずは、「エクスプレッション」の使い方を見ていきましょう。

Character
こんなの常識だよ、と思う方は次へ Let’s Go~!

「エクスプレッション」の使い方

まずは、「Fusion」を選択した後、「Transform」などのツールを配置して選択します。

その後、インスペクタの項目を右クリックすると「エクスプレッション」という文字が現れます。

これを選択すればOK。

エクスプレッションを選択して表示された枠内にプログラムを記述していきます。

プログラムの書き方

原則として、以下のようなルールがあります。

  • プログラムは「:」で始める
  • 改行時は「;」を用いる
  • 「return」を用いて返り値を取得

また、以下の変数はよく使うので覚えておきましょう。

そのクリップにおける時間(単位は「フレーム」)
time
1秒当たりのフレーム数
comp:GetPrefs().Comp.FrameFormat.Rate

いくつか例を見ていきましょう。

例1:一定値を返す

以下をそのままエクスプレッションに入れてみましょう:

Copied!
:return 0

これは、常に0を返すものです。

Character
これに関しては、ぶっちゃけエクスプレッションを使う意味があまりないです(笑)

例2:現在の秒数の表示

続いて、同様に以下をエクスプレッションに入れてみましょう:

Copied!
:second=time/comp:GetPrefs().Comp.FrameFormat.Rate;
return second;

「second」という変数を宣言し、その値を出力しています。ご覧の通り、time[フレーム]をcomp:GetPrefs().Comp.FrameFormat.Rate[フレーム/秒]で割ることで、そのクリップにおける時間[秒]を定義しています。

Character
例えば3秒経過していたら3が出力されるし、10秒経過していたら10が出力されます

(現在の経過時間[秒]をテキストとして出力している)

例3:カウントダウン

スクリプトはこちらです:

Copied!
:max_time=10;
second=time/comp:GetPrefs().Comp.FrameFormat.Rate;
return max_time-floor(second);

先ほどの応用で、カウントダウンを行います。

floorは、小数点以下を切り捨てる関数。例えば、floor(2.5)=2です。

「テキスト」に「エクスプレッション」を適用して上のように記述すると、下のようになります。

Character
max_timeの値は好きなように変えてね!

テンポに合わせて映像を変化させる方法

さて、以上のプログラムを用いて、テンポに合わせて映像を変化させる方法を考えてみましょう。

想定される状況は以下の2種類あるかと思います。

  • テンポに合わせて1(true)か0(false)かで変化する
  • テンポに合わせてなめらかに振動する

それぞれについて考えていきます。

まず、前者ですが、例えばif文を用いて次のように表せます。

Copied!
:tempo=154;
second=time/comp:GetPrefs().Comp.FrameFormat.Rate;
if second%(120/tempo)<=60/tempo then;
return 1;
else return 0 end;

映像にするとこんな感じですね。

音MADでよく見る、一定時間周期で左右反転するプログラムです。

ちなみに、一定時間周期で左右反転させるには、「Transform」の「反転」についてエクスプレッションを適用し、上のプログラムを書けばOK。

Character
テンポは自由に変えてね!

後者の「テンポに合わせてなめらかに振動する」ですが、具体的にどのように動かしたいのかによって用いる関数が異なります。例えば、曲線的に動かしたいならサインやコサイン(三角関数)を使えばよいですし、直線的に動かしたいならそのような数式を使えばよいですね。必要に応じて絶対値も使いましょう。

下にサンプルを置いておきます。

Copied!
:tempo=154;
difference=0.2;
second=time/comp:GetPrefs().Comp.FrameFormat.Rate;
return 1+difference*abs(sin(second*tempo*pi/60+pi/2));

これを「Trasition」の「Size」について適用すると、次のようになります。

直線的に変化するのならまだしも、曲線的に変化する映像を手作業で作るのは骨が折れるので、「エクスプレッション」を積極的に活用しましょう!

Character
オリジナルの数式を作って君も音MAD職人になろう!

最新情報をチェックしよう!