ミュージックビデオなど、音楽が前提になる映像をつくる機会が少しずついただけるようになった。実際にopenFrameworksをメインの映像生成として、AbletonLiveとMax for Live若干の外部ソフトでつくった。以下のような映像が成果物。
複数のソフトを組み合わせることは、リアルタイム演出と映像演出の行き来を楽にしたり、ソフトごとの関心の分離と組み合わせの自由度を上げうる。リアルタイムレンダリングと画面キャプチャが前提にはなってしまうものの、映像制作の中でのAbleton LiveとMax for Liveの役割について書く。正直大したことはしていないし目新しくも無いネタではあるものの気づきのメモをまとめる意味も含めて残しておく。
動機
通常、映像を作るときはフレーム番号や経過時間でキーフレーム(アニメーションの区切りとなるタイミング)を設け、アニメーションや変化の発火をさせたり変容させたりする。音に合わせるようなコンテンツの場合は、キーフレームは音符と同期させたいと考えるのが基本的なニーズだと思う。よってキーフレームを打っていくときは音楽的な区切りでスナップさせたい。もっというと譜面に併記できるような音符のようにキーフレームが打てると良い。というか譜面を書くようにタイムラインをつくれるということが追い求めるところではる。
リアルタイムレンダリングをキャプチャする方式の場合、タイムラインを外部ソフトに頼ってサブスクライブするだけ、という方式が可能になる。外部でタイムラインを組んで映像出力ソフトに同期させるという発想はMV制作というよりは、リアルタイム演出系の現場で応用が効くと思われる。プリレンダ系においても、外部ツールで作成したMIDIクリップを読み込んで同期をとるといった方法は様々なDCCツールで有効な方法である。
ビート検出程度なら映像編集・CGソフト内で完結できるとは思うが、キーフレームの編集に4分音符や16分音符にスナップさせたいといったニーズを叶えるには、DTMソフトのUIでキーフレームを打つのが早いと思われる(慣れもあるが自分はその方が早そうな気がした)。ついでに特定位置をループさせたり頭出しするといったことも、音楽的な単位(例えばAメロを頭からみたいな)でやりたいし、それをやるならDTMソフトが良かろうということになる。
ゲームエンジンやそれに類するソフトでは優れたタイムライン管理の機能を備えているものの、音ハメの多いタイムラインをつくるにはまだ面倒くさい開発を要すると思われる。(Td、UE4やUnityでタイムライン上で音符にスナップできるような機能があれば教えて欲しい…。)Ableton Liveはパフォーマンスに特化したMIDIコン連携やわかりやすい操作感で、総合的なインターフェースとして優れていることに加え、Maxというビジュアルプログラミングの環境と結合できるため、プログラマーにとっても非常にフレンドリーな環境であると言える。
BPMを検出する
アーティストから頂いた音源をオーディオクリップに配置すれば、BPMを自動で計算してくれるので楽。オーディオサンプルのWarpに表示されたBPMをプロジェクト全体に適用した上で、オーディオサンプルもタイムライン(アレンジメントビュー)に配置すると、基本的な小節線、4分音符にスナップが効き、音と同期させることができるようになる。
ロケーターでシーンの頭出しをおこなう
映像を作る際に音楽に合わせてシーン/カットを切りたいときにロケーターが役立つ。自分はあまりコンテを書かない代わりに、音源をもらったときにまずはロケーターでシーンを区切っていく。要素ごとに分割するというのが、視覚的にUI上に表現できるのがいいし、「Bメロ」「サビ」みたいな単位で即座に頭出しができるのは役に立つだろう。ロケータの中にメモも書けるので活用すると色々捗りそうではある。UI関連では、ループ機能も役立つ。
MIDIクリップをつくる
映像制作作業を譜面を書くように行えるという点で、この方式のメリットが大きく出る部分。MIDIでは基本的には、8ビットの符号無し整数(0-127)のMIDIナンバーおよび同型のベロシティの2つの値をセットで送れる。シーンの切り替えといった明示的な変化を起こしたい場合、任意のMIDIを送り、映像操作系のソフトでMIDIナンバーに応じた変化を加えられるようにする。
気づきポイントとしては、
- DTMソフトは12音階(12進数的)なので12(Cn-Bn)ずつで単位を区切るとまとめやすい。0-11(C-2 – B-2), 12-23(C-1 – B-1), 24-35(C0 – B0), … という区切りで用途を分けると良さそう
- MIDIノートの終点でベロシティが0のMIDIが発生するので、ベロシティ判定が無いときに唐突なMIDI受信に一瞬とまどう。終点を明示的に使うか、起点のみしか使わないとするかは最初に決めておくべきだろう
MIDIクリップの生成も、映像編集のような尺の中で変化を固定していく作業では手打ちで良いだろうが、VJのような即興性が問われる演出時はAbleton Liveのアルペジエーターでいい感じのシーケンスを周期しつつ変化させられるような仕組みがあると役立つかもしれない。上述のビートシンクとあわせれば、BPMに同期してMIDI番号をいい感じ生成してくれるだろう。この機能はインスタレーションで利用したことがある。このときは、MaxからMIDIをおくり、Ableton上のアルペジエータのMIDIクリップを発火させたりした。
Max for Liveで送信器をつくる
Maxのインターフェースを用いてUDP通信上のOSCの送信器をつくり他のアプリケーションの同期を実現する。パケロスの可能性はあるが、ローカルで送受信する分にはクリティカルな問題がないので[udpsend]ノードでおこなう。UDP以外の選択肢としてはそのままのMIDIをマシン内外でパイプして使ってもよいかもしれない。パケロスがクリティカルな場合はTuio、tcpClientやJavaScriptのsocket.ioを利用した通信を検討すると良さそう。これらの方式は、ゲームエンジンなどリアルタイムの映像制御ソフトでの受け口の実装の先例がほぼ確実に見つかる。
フォーマットについては、適当に値を[pack]して[udpsend]に突っ込むとOSCの形式(アドレスと型付きのパラメータ群のセット)を自動で作成するようになっている。アドレスは手動でふれるため、例えばクリップ毎にアドレスを変えて追加したり、シーンごとにアドレスを変えるなどの運用が考えられる。ちなみに自分はアドレスは一意にした。というのもトリガーでMIDIの限界である128種類もつかわなかったからだ。
アニメーション(オートメーション)は難しい
Ableton Live内でフェーダや様々なつまみの値を自動で上げ下げする機能をオートメーションという。Ableton Liveではミディコントローラ操作のレコーディングができたり、手打ちでもキーフレームが打てる。キーフレーム同士の補完はリニアしかできないんだろうな~と思って作業を初めてドキュメントを読んだら、カーブが実現できる他、ADSRモデルや波形(サイン、矩形、のこぎり)が一発でだせるというように、意外と映像編集ソフトでもほしい機能が実現できる。アニメーションさせるパラメータはM4LのUIオブジェクトを使うと可視化もすぐできるので良い。マウス操作でカーブの緩急(おそらくpow関数による)をつけることができるが、CGソフトでおなじみのベジェハンドルがないのは経験者には痛いかもしれない。
この方式の根本的な問題として、値が映像制御側とフレーム同期を前提としていない点がある。値のカクつきを前提として考えなければならない。繊細かつ見栄えの影響が大きい重要な値(例えばカメラ行列など)のアニメーションは映像制御側で計算するのが良い。カクついてもそんなにばれない値(パーティクルのタービュランスなど)は雑に制御できるので良いかもしれない。MIDI自体は8bitだが、M4L上であれば浮動小数点数のパラメータも作れる。ベクトルや行列といったCG系で多用されるパラメータは、複数のパラメータをPackすれば実現できるが、非現実的なので、スカラーの値のみを送るのが良さそう。とはいえ、アニメーションカーブをまるまるAbleton Liveからリアルタイム送信するのは難があるというのが現状の結論。