見出し画像

【フリー素材配布】動画編集×プログラミングという選択肢

先日、こんなフリー素材を公開しました。

ご覧の通り、0と1だけで構成された文字列がスクロールされます。
こんな単純な素材ですが、案外需要はあるみたいですね。
コンピューター関連の動画作成が想定されます。


【追記】
ご存じの通り、現在ニコニコのサービスが利用できない状態になっているため、臨時に素材を別の場所にアップロードしました。こちらからアクセス&ダウンロードできます。

https://lemon-slime.com/resources/0%E3%81%A81.mp4


それはさておき、当素材説明欄にも記載しておりますが、作成に当たってプログラミング(Lua)を使用しております。
当然です。人力で0と1だけで構成された何千もの文字を作成するのは骨が折れますし、日が暮れてしまいます。
このように、時として「動画編集」と「プログラミング」という一見無関係な両者が結びつき、強力な力を発揮することがあるのです。
それについてはこちらの記事でも触れていますが・・・

今回は、この素材作成の方法を語ることで、同様の機械的な映像制作の方法について指南するとともに、如何に「動画編集」と「プログラミング」の相性が良いかについて述べていきたいと思います。



1,作成方法

いつも通り、編集ソフト「Davinci Resolve」を用います。
最近は個人的に「YMM4」を使うことが増えたのですが、こういったプログラミングを扱うのなら「Davinci Resolve」一択です。異論は認めます。

「Text」のツールを配置していつも通り「エクスプレッション」を設定します。

Textのエクスプレッション

さて、次に内容を書いていきましょう。
内容について、以下の制約があるのでしたね。

その上で、Luaで記述

今回は、0と1だけで構成された文字列を10000字生成してみます。
そのために、10000の文字列を格納する配列(ここではrandomNumber)を宣言します。

local randomNumber = {};

そして、配列の各要素に0または1を10000回入れ続けましょう。
当然、for文の出番ですね。
ランダムな数を代入する場合は、math.random()を使います。
その前に、randomseedの設定も忘れずに。

math.randomseed(0);
for i=1, 10000 do;
randomNumber[i] = math.random(0, 1);
end;

これで10000文字のランダムな文字列が完成しました。
後はこれを出力するだけです。
結果を出力するため、一時的に結果を格納するための変数を宣言します。

result_text = "";

そしてresult_textにrandomNumberの1番目、2番目、3番目・・・を順番に入れれば終わりです。これはfor文で良いですね。
・・・が、一つ問題が発生します。
それは・・・
               改行がない!
ということ。

延々と一行で
「01101・・・・・・・・・・・・・・・・・・・・・・・10011」
と出力することになります。

それを回避するため、50個数字を入れたら改行記号(\n)を挿入することとしましょう。これはif文の出番です。
まとめると、

for i=1, 10000 do;
result_text = result_text .. tostring(randomNumber[i]);
if i%50 == 0 then;
result_text = result_text .. "\n";
end;
end;

とすればよいですね。

(注)"tostring()"は数字を文字列に変換する関数。
   Luaにおいて文字列の合体は 「..」を用いる

最後にresult_textの値を返せば完成です。

return result_text;

結果として、

:math.randomseed(0);
local randomNumber = {};
result_text = "";
for i=1, 10000 do;
randomNumber[i] = math.random(0, 1);
end;
for i=1, 10000 do;
result_text = result_text .. tostring(randomNumber[i]);
if i%50 == 0 then;
result_text = result_text .. "\n";
end;
end;
return result_text;

というコードが完成しました!

前回は時間によって動きを変化させるプログラムを扱いましたが、このようなプログラムの使い道もあるのですね。

ちなみに、今回はrandomseed(0)としましたが、randomseed(time)などとすると、フレームによって表示される数が変わります。ここはお好みで。


【余談】
「配列は0始まりじゃないの?」
とお思いの方、鋭いです。

一般的にプログラミングにおいて配列は0から始まりますが、(何故か)Luaにおいてはその常識は通用しません。1から始まります。
ちょっとしたカルチャーショックかも。


2,応用例

今回扱ったランダムな変数の代入を用いることで、例えば範囲内の任意の(x,y)座標の値を返すこともできます。
下は、テンポを指定して、そのテンポに則ってランダムに座標移動する例です。

:tempo = 60;
range=1.0;
second=time/comp:GetPrefs().Comp.FrameFormat.Rate;
randomseed(floor(second/(60/tempo)));
return Point(range*math.random(),range*math.random());

あるいはデータベースを用意して、ランダムにそのデータベースにアクセスして値を返すこともできますね。
データベースの設定などはこちら。

前回の「時間に応じて映像を変化させる」場合は頑張れば人力で対応可能かもしれません。
しかし、「ランダム性」を扱う場合、どうしても人間による作為性が出てくるため、困難です。そうでなくてもとても骨が折れる作業であることには違いありません。プログラミングを有効に使いましょう。


3,おしまい

こうして、一見無関係であった「動画編集」と「プログラミング」の両者が密接に結びつくわけです。皆さんも試してみてください。
ちなみに、プログラミングを用いた動画編集について、ずんだもんと春日部つむぎが解説した以下の動画があったりします(宣伝)。

このほかにも、動画編集やMinecraft、鉄道についてを中心に多様な記事を執筆しております。宜しければほかの記事もご覧ください。

また、記事を「スキ」していただくと、今後の記事執筆のモチベーションとなりますので、是非お願いします。


いいなと思ったら応援しよう!

この記事が参加している募集