VDMX5でどうにかビデオスイッチャーライクな挙動を実現したかった話
本記事は、#VJアドベントカレンダー2024 Advent Calendar 2024の参加記事です
この記事のまとめ
(2024/12/03加筆)こういうことができます
#VJアドベントカレンダー のネタ
— メジエド(M/EDJed) (@m1edjed) December 2, 2024
現物を見ないと中々ピンと来なさそうなので使用中の様子を撮るなどしてみました pic.twitter.com/XNcJmqMItd
APC40 mk2を使っていますが
ClipStopボタンの5-8を押すと表示しているレイヤーの切り替え、
A-Bの横フェーダーで控えレイヤーと表示レイヤーの切り替え、
ClipStopボタンの1-4を押すと控えレイヤーの切り替え、
という仕掛けになっています。
個人的に重要なポイントとして、横フェーダーがいずれの位置であっても、
ClipStopボタンの5-8が表示レイヤーの切り替え、
ClipStopボタンの1-4が控えレイヤーの切り替え
となるようになっています。
自己紹介
メジエドと申します。
主に都内を中心に、
ノンタイアップA-pop中心DJmix配信イベント、A面打破
中庸をテーマにハウス、テクノを中心にお送りするイベントWARAHOUSE
といったイベントのVJをやらせてただいてまして、
ご縁もあってオールジャンルなイベントやその他のパーティでもVJをさせていただいております。
この記事におけるスイッチャー/ミキサーの定義
市販されているビデオミキサー/スイッチャーにおいても機能が必ずしも同じ基準で使い分けがされていると言えない気がするため、今回の記事においてビデオスイッチャー/ミキサーとはどういうものとして取り扱っているかを便宜的に説明しておきます。
ビデオスイッチャー
PGM(本線として機器から出力される映像を直接操作する列)と、
PRV(Tバーやボタンを操作して送り出す、待機中の映像を操作する列)とが
上下で明確に切り分けられている機器
ビデオミキサー
2つ以上の映像入力が可能で、入力した映像をA/Bの二つのスロットに割り当ててAからB、BからAへの切り替えを行うことが可能な機器
PGM/PRVの概念はないが、再生器などの入力ソースがミキサーの左右にあるなどの場合はむしろ直感的に操作しやすいというメリットがある
※余談
例えばVJの現場においてよく見かける
RolandのV1-HD(商品ページではビデオスイッチャーと表記)は、
個人的にはここでいうミキサーとしての使用例が多いと思っています。
なお、設定の[A/B MODE]という項目でPGM/PSTモードに切り替えれば、
今回の定義でいうスイッチャーのような挙動に設定できたりします。
やりたかったこと
短縮版
V1-HDのA/B MODEみたいに上段か下段、どっちが出力されてるかが一々目視しないとわからない構成だとミスるので、上段を押せばPGMの切り替え、下段を叩けばPRVの切り替えというように目的別でボタンを固定したい
細かい意図含めた詳細版(飛ばしてもいいです)
ぼくはこれまでの経験を活用する目的で、mixするという機能はなるべく一つのフェーダーだけで納めたいと思っています。
大まかなイメージとしてはDJミキサーでいうところの4chミキサーの縦フェーダーで素材の比率を変えるようなVJではなく、横フェーダーだけで切り替えたい、かつ、横フェーダーそれぞれに必要に応じて任意のデッキを割り当てたい、そう考えています。
大まかに図にするとこのようなものになります。

任意の素材を格納するlayer1~4、
この4つのレイヤーから任意の一つを指定できるA/Bという二つのレイヤー、
この二つのレイヤーを任意の比率で混ぜるミキサー
という構成を組み、
Outputとして出力されていないA/Bのいずれかで次の素材として出すlayerを切り替える
場合によってはlayerに紐づくMediaBinから直接素材を切り替える
急ぐ場合はOutputとして指定されているAレイヤーの大元のLayer1の素材を切り替えることでサクサクと映像を切り替える
という使い方をしています。
ただ、これを普通に組むと大きな課題が発生します。

例えばV-1HDのA/B MODEでも同じことが起きるのですが、
A/Bモードでは光っている色と出ている映像、もしくはTバーの位置で、
どちらが出力されている映像(PGM)で、どちらがプレビュー(PRV)映像かを判断しなければなりません。
これはオペレーション上大きな課題と思っていて、レイヤーの切り替えのために一々目視で
A/Bいずれのレイヤーが出ているのか
それを踏まえて直接出力レイヤーを切り替えるならどのボタンを押せばいいか
プレビューを切り替えたいならどのボタンを押せばいいか
みたいなものを都度々々考えなければなりません。
DJを例に挙げるなら、
再生中のデッキを目視で確認する
再生中でないデッキに次の曲をロードする
次の曲を適切なタイミングで再生開始を押す
再生開始の前後で適切にフェーダーやEQを操作する
ということになります。
この操作自体は違和感がないかもしれませんが、
それでミスが起こり得ないかどうかについてはどうでしょうか
実際にやったことがあるかないかはともかく、
少なくとも間違えて再生中のデッキを停止する可能性は十分あると言っていいと思っています。
なので、もうボタンの位置をVJアプリ上のMIDIコン割り当て基準でなく、
目的に応じた操作基準で割り当てて
上段のボタンを切り替えれば出力されている映像が直接切り替わる
下段のボタンを切り替えればTバーで切り替える予定の映像が差し替えになる
というようにしたいんです。
これが実現すれば、少なくとも下段のボタンを押している限りは出力ミスのリスクが減りますし、急ぎの場合は上段のボタンを押しまくればいいです。
ただ、VJのアプリケーション上用意がないことをやりますので、この問題を以降で解説することにします。
補足:VJが複数いる現場にいてV1-HDがA/Bモードであることは望ましいと思います。
Tバーの位置でいずれのVJの映像が出ているのかが判定しやすかったり、各ソースが誰のPCからの出力かを判断するなどでは便利だからです。
やっていること
ざっと図解するとこのような動きをしています

このスイッチャーを実現するために
Layer_cover:横フェーダー操作に合わせて不透明度が減少するレイヤー
Layer_base:横フェーダー操作の初動でスイッチし、Layer_cover不透明度が下がるにつれて見えるようになる切り替え先のレイヤー
Layer_A:横フェーダーがAの位置にある時に表示されているレイヤー
Layer_B:横フェーダーがBの位置にある時に表示されているレイヤー
という四つのレイヤーを使っています。
また、素材選択のためにさらに別の4レイヤーを用意しており、
これらを任意にAやBに振り向けることができるようになっています。
以下でもう少し細かく実際の設定について説明していきます。
プラグインの組み方
使用しているControl Sarfaceは最低限五つ、これにMidiコンのボタンと1:1で対応するControl Sarface一つの組み合わせを使っています。
APC40 mk2のボタンと1:1で対応するControl Sarface(以下CS)については割愛してもよかろうかと思いますんで、今回の仕掛けに必要な五つだけ順番に説明を入れます。
1.フェーダーの動きに合わせてLayer_coverおよびLayer_baseのレイヤー選択と、フェーダーの動きを保管するためのCS(CS_FEDERCONTROL)
持たせているUIは以下のようなものです
MIDIフェーダーの値をそのまま反映させるスライダー(Slider)
Sliderの動きをそのまま反映させているスライダー(Slider_2)
Sliderの動きを反転させているスライダー(Slider_3)
フェーダーの動き出しに合わせて叩くように設定されたボタン(X/Y)
Layer_coverのレイヤーがA/Bいずれかを決めるためのボタン(TA/TB)
X/Yに反応してLayer_baseのレイヤーがA/Bいずれかを決めるボタン(A/B)
※後述のCS_PRVCONTROL/AorBに紐づけ
2.同一プリセットだけで処理すると切り替えが難しいボタンを迂回するためのCS(CS_PRVCONTROL)
持たせているUI Itemは以下のようなものです
CS_FEDERCONTROL/XorYに反応してLayer_baseのレイヤーがA/Bいずれかを決めるボタン(A/B)
Aという名前のToggle button、およびBという名前のToggle buttonをつくっておき、
AだけがONになっているプリセット1
BだけがONになっているプリセット2
を用意したうえで、プリセットをCS_FEDERCONTROL/XorYに紐づけます・
3.フェーダーが左右どちらにあっても一方通行でLayer_coverの表示率を下げるためのCS(CS_FEDERRESET)
持たせているアイテムは一つだけ、プリセットが2つ切り替え式になっています。
フェーダーの動きをA→B、B→Aいずれの場合でも、0.00→1.00に上がっていくスライダー(Slider)
これを
CS_FEDERCONTROL/TAが叩かれたときはSlider_2と紐づけ
CS_FEDERCONTROL/TBが叩かれたときはSlider_3と紐づけ
というようにプリセット切り替えさせることで、
一方通行でLayer_coverの不透明度が下がるフェーダーが作れるはずです。
フェーダーを下げ切った時にはLayer_coverはLayer_baseと同じレイヤーに表示率100%で表示され、またフェーダーが操作されれば不透明度が下がります。
4.Layer_A/Layer_BにLayer_1-4のいずれを割り当てるかを設定するCS(CS_ABPush)
これ自体はここまでのCSと比較すればシンプルです。
最終的にVJをする以上、MediaBinとの接続をどこかで行わねばなりません。
そのため、MediaBinを四つ、対応したLayer1-4を用意しておき、
CS_ABPushで押されたボタンに応じて、
Aは今どの1-4のうちどのレイヤーが選択されているか
Bは今どの1-4のうちどのレイヤーが選択されているか
を決められるようにしておきます。
ここまでの整理
概ねできてきました。
中間の処理に必要なものを飛ばしてまとめると、図のようになります

これでお気づきいただけたかは不明なんですが、
MIDIコンのボタンでPGMをLayer1にしたいとボタンを押しても、
現行の仕掛けでは思ったように動かない箇所があります。
これはCS_ABPushがLayer_A/Bを操作するためのCSであるためです。
PGM/PRVがABいずれかはフェーダーの位置次第で変わるため、
MIDIコンで同じ操作をしても、
状況次第で反映される先が違ってしまいます。

そんなわけで最後のCSです
5.APC40 mk2の特定のボタンを叩いた時に、CS_ABPushのどのボタンが押されるべきかを指定するためのCS(CS_ABtoPGMPRV)
これまでの経緯を踏まえ、下記のようなCSになっています。
PGM_1A-4A&PRV1-4Bのボタンを用意したプリセット1
PGM_1A-4B&PRV1-4Aのボタンを用意したプリセット2
これらを
CS_FEDERCONTROL/TA反応時→プリセット1
CS_FEDERCONTROL/TB反応時→プリセット2
というように設定して
それぞれに噛み合うよう
CS_ABPushのA1ボタンが、CS_ABtoPGMPRVのプリセット1,2双方のA1と書かれたボタンに反応するようにしておきます。
さっきの図にプリセットと中間の処理を埋める形にするとこんな感じ。

これによりMIDIコン側で特に意識しなくても、
PGMを操作したい場合はこの場所のボタン、
PRVを操作したい場合には別の場所のボタン、
と目的に応じて押すべきボタンを固定することができるようになるはずです。たぶん
細かい説明が必要そうな設定箇所
CS_FEDERCONTROL:フェーダーの動き出しに合わせて叩くように設定されたボタン(X/Y)

スライダーの値をInvertで反転させ、Threoldの値を1に持っていくことで、
ちょっとフェーダーが動くだけで反応するようにしつつ、
PreventRepeatsでいったり来たりが一々反応しないようにしています。
CS_FEDERCONTROL:Layer_coverのレイヤーがA/Bいずれかを決めるためのボタン(TA/TB)

CS_FEDERCONTROL/XorYと概ねやってることは変わりません。
違いを説明すると
TA/TBは押しっぱなしであることが望ましいので、
Toggle buttonが有効になっています。
反対にCS_FEDERCONTROL/XorYはプリセットの切り替え用のため押しっぱなしが望ましくないため、Toggle buttonではないようになっています。
また、Toggle buttonになっているTA/TBおよびA/Bはmutually exclusive with group namedでグループ単位でくくることで相互排他になるようにしています。
CS_PRVCONTROL:CS_FEDERCONTROL/XorYに反応してLayer_baseのレイヤーがA/Bいずれかを決めるボタン(A/B)
プリセット1or2の切り替えを仕込まねばならないのですが、
概ねこんな感じです。

Xが叩かれれば1に、Yが叩かれれば2にするだけです。
その他なんかいりそうな個所があれば追加するかもしれません。
できたもの
大まかにこんな感じのものが出来上がりました。

割り当てとしては
APC40 mk2のClipStopボタンの
5-8をPGMの切り替え
1-4をPRVの切り替え
に使っています。
一段下のBARSを選択するボタンの方は
1-4はMediaBinでの操作に割り当てるレイヤー選択用
5-8はSOLOボタン(押してる間だけ指定レイヤーを出力)
として使っています。この辺はお好みで割り当てを決めてください。
Layer1-4は機能上不透明度を0にしていますが、割り当ての都合でしかないので出しても構いません。
スイッチャーとして組んだ諸々を敢えて非表示にして一時的に4chミキサーにするなどの切り替えも可能ですし、ステップシーケンサーなどを絡めて出しても面白いと思います。
おわりに
組むだけ組んでみましたが、まあまあにやりやすさが増して楽しく扱っています。
仕組み上もう少しマシな作り方がある気がしないでもないですが、
一旦手元で楽しく動いているので良しとします。
大量のプラグインとレイヤーを使ってやることかどうかは皆さまのご判断次第かと思いますが、お役に立つ情報であれば嬉しいです
実写素材やモーションCGなんかを使い、BPMは0-200くらいまでジャンル無関係にVJさせていただきますので、VJ見てみたい方などはお気軽にお声掛けくださいませ