VMDSoundMixer
久しぶりの動画以外でのBlog更新です。
えっちな動画を作成していると、ピストン音、テコキ音、チュパ音などの効果音を動画編集時に後付けで付けることが多いのですが、音声素材をそのまま使用すると動画とタイミングが合わない事が殆どです。
最初はタイミング合っているように思っていても、シーンが長くなると徐々に動画とズレていってしまい、微妙な修正が必要になります。
これが結構面倒くさいのです。
そこで私は、モーションに合わせて効果音を合成するプログラムを以前に書いたのですが、先日動画を作成する際に久しぶりに使用して思い出したので、自分以外でもある程度使えるようにユーザインタフェースを追加してまとめました。
(ふだんは自分さえ使えればいいので、その都度パラメータを書き換えてビルドするような使い方をしています)

ほんとうは、キーフレームに合わせて鳴らすのではなく、ボーンが一定の閾値を通過したら鳴らすプログラムだったのですが、説明が難しいのでキーフレームを打つ方式に変えました。
DownloadはBowlroll様より → https://bowlroll.net/file/245620
えっちな動画を作成していると、ピストン音、テコキ音、チュパ音などの効果音を動画編集時に後付けで付けることが多いのですが、音声素材をそのまま使用すると動画とタイミングが合わない事が殆どです。
最初はタイミング合っているように思っていても、シーンが長くなると徐々に動画とズレていってしまい、微妙な修正が必要になります。
これが結構面倒くさいのです。
そこで私は、モーションに合わせて効果音を合成するプログラムを以前に書いたのですが、先日動画を作成する際に久しぶりに使用して思い出したので、自分以外でもある程度使えるようにユーザインタフェースを追加してまとめました。
(ふだんは自分さえ使えればいいので、その都度パラメータを書き換えてビルドするような使い方をしています)

ほんとうは、キーフレームに合わせて鳴らすのではなく、ボーンが一定の閾値を通過したら鳴らすプログラムだったのですが、説明が難しいのでキーフレームを打つ方式に変えました。
DownloadはBowlroll様より → https://bowlroll.net/file/245620
BookMarkボーン
モーションを作成する際のTIPSのご紹介です。
私はモーション作成に使用するモデルに、3つのダミーボーンを追加しています。

これだけです。
ボーンとしては特になんの機能も持ちませんが、モーションを作成する際にそれぞれへ意味を持たせます。
たとえば、私はそれぞれのボーンに次の意味を持たせています。
BM1 …… シーンやモーションを大きく変えるタイミングに使用する。
BM2 …… 1つの繰り返しのタイミングで使用する。
BM3 …… 汎用。曲に合わせるモーションの場合は拍子のタイミングで使用する等。
要するにBookMarkとして使用するボーンです。BMボーンと呼んでます。
具体例としては以前、投稿したゆかりさんの動画の場合。

後ろから突くシーン、5310フレームと5365フレームにBM1へキーフレームが打たれていますが、この区間はお尻を掴まれて挿入の体制になるまでのモーションになります。

そして5365フレームから本格的に後ろから突かれ始めるのですが、一回のピストンモーションであるBM2からBM2のモーションがしばらく繰り返し続ます(厳密にはちょっとずつ変化を付けています)。
あとはこのピストンの繰り返しが終わるフレームにBM1のキーフレームを打ち、そこからフィニッシュのモーションが開始しています。
この単純な目印のためのボーンでしが、効果はいくつかあります。
1.シーンの区切り目が分かりやすくなる
2.BMボーンにカーソルを置いて、CTRL+←→ で目的のシーンにカンタンにジャンプできる
3.繰り返しモーションをコピペする際、BMボーンにカーソルを置いてペーストするとCTRL+→、CTRL+V の繰り返し操作で簡単にペーストできる。
4.BMボーンのモーションをコピーし他のモデル(だいたい竿役)にペーストすることで、タイミングを合わせる目安になる
他、まだ何かあったかも?
モーションを作成されている方は、同じようなこと/もっと良い方法を使われていたりするでしょうけれど、私の一例としてご紹介まで。
私はモーション作成に使用するモデルに、3つのダミーボーンを追加しています。

これだけです。
ボーンとしては特になんの機能も持ちませんが、モーションを作成する際にそれぞれへ意味を持たせます。
たとえば、私はそれぞれのボーンに次の意味を持たせています。
BM1 …… シーンやモーションを大きく変えるタイミングに使用する。
BM2 …… 1つの繰り返しのタイミングで使用する。
BM3 …… 汎用。曲に合わせるモーションの場合は拍子のタイミングで使用する等。
要するにBookMarkとして使用するボーンです。BMボーンと呼んでます。
具体例としては以前、投稿したゆかりさんの動画の場合。

後ろから突くシーン、5310フレームと5365フレームにBM1へキーフレームが打たれていますが、この区間はお尻を掴まれて挿入の体制になるまでのモーションになります。

そして5365フレームから本格的に後ろから突かれ始めるのですが、一回のピストンモーションであるBM2からBM2のモーションがしばらく繰り返し続ます(厳密にはちょっとずつ変化を付けています)。
あとはこのピストンの繰り返しが終わるフレームにBM1のキーフレームを打ち、そこからフィニッシュのモーションが開始しています。
この単純な目印のためのボーンでしが、効果はいくつかあります。
1.シーンの区切り目が分かりやすくなる
2.BMボーンにカーソルを置いて、CTRL+←→ で目的のシーンにカンタンにジャンプできる
3.繰り返しモーションをコピペする際、BMボーンにカーソルを置いてペーストするとCTRL+→、CTRL+V の繰り返し操作で簡単にペーストできる。
4.BMボーンのモーションをコピーし他のモデル(だいたい竿役)にペーストすることで、タイミングを合わせる目安になる
他、まだ何かあったかも?
モーションを作成されている方は、同じようなこと/もっと良い方法を使われていたりするでしょうけれど、私の一例としてご紹介まで。
サイバースペース風実験
作成中の動画の演出に使えないかと、昨日のお仕事中に思いついたので実験です。
昔のCG映画やアニメで見る演出ですが、ローポリ風の緑色のポリゴンで構成されたステージ。
攻殻機動隊やMATRIXで見かけるかもしれません。

こういう感じの映像です。
テストとしてはこにわ様が販売されているカスタム少女用の病室ステージを使ってみましょう。

まず最初に思いついたのが、MMEの Grid

これはこれでカッコイイのですが、メッシュがちょっと目立ちすぎて目的とは違った感じですね。
設定で減らせるのかな?
次に思いつくのは、動画編集側での単色化。

うん。違いますね。
このステージは綺麗なテクスチャが貼られているのですが、それが邪魔しているようです。
ここまでは、だいたい予想通りでした。
そして、昨日思いついたのは、テクスチャを単色で塗りつぶしてしまったらどうなるかな?です。

こんな感じ。使えそうです。
少し、透明度を上げてみましょう。

おお、もう一息といったとこですね。
エッジを描画すればよくなりそうに思います。
解説としては、以下の方法でモデル改造をしています。
1.材質に含まれる面を取得する
2.面がマッピングされている画像を調べて、平均の色を取得する
3.求めた平均の色を16諧調のグレースケール変換し、別途用意した16諧調の材質にマッピングしなおす

カーテンのところを見ればわかりますけど、隣り合った面なのにガッツリと色が変わってますね。
これは平均の求め方が悪いのか、作ったスクリプトにどこかにバグがあるのか。
動画に使えそうかな?
使いものになりそうであれば、プラグイン化したいところですが、いくつか課題はあるのでコスト面であまり割に合わないかも。
昔のCG映画やアニメで見る演出ですが、ローポリ風の緑色のポリゴンで構成されたステージ。
攻殻機動隊やMATRIXで見かけるかもしれません。

こういう感じの映像です。
テストとしてはこにわ様が販売されているカスタム少女用の病室ステージを使ってみましょう。

まず最初に思いついたのが、MMEの Grid

これはこれでカッコイイのですが、メッシュがちょっと目立ちすぎて目的とは違った感じですね。
設定で減らせるのかな?
次に思いつくのは、動画編集側での単色化。

うん。違いますね。
このステージは綺麗なテクスチャが貼られているのですが、それが邪魔しているようです。
ここまでは、だいたい予想通りでした。
そして、昨日思いついたのは、テクスチャを単色で塗りつぶしてしまったらどうなるかな?です。

こんな感じ。使えそうです。
少し、透明度を上げてみましょう。

おお、もう一息といったとこですね。
エッジを描画すればよくなりそうに思います。
解説としては、以下の方法でモデル改造をしています。
1.材質に含まれる面を取得する
2.面がマッピングされている画像を調べて、平均の色を取得する
3.求めた平均の色を16諧調のグレースケール変換し、別途用意した16諧調の材質にマッピングしなおす

カーテンのところを見ればわかりますけど、隣り合った面なのにガッツリと色が変わってますね。
これは平均の求め方が悪いのか、作ったスクリプトにどこかにバグがあるのか。
動画に使えそうかな?
使いものになりそうであれば、プラグイン化したいところですが、いくつか課題はあるのでコスト面であまり割に合わないかも。
VMDSpectrum対応ステージの実験
ふと思付いたミニ動画を作成しようと、ダンスステージを探していました。
探していたのは VMDSpectrum で音に合わせて派手に明滅するステージ。
そうして見つけたのが、くうわんこ様の「ダンスステージ」です。
バックスクリーンがキラキラと輝く素敵なステージです。

まさに探していた通りのステージです。カッコイイ。
さて早速、VMDSpectrumで音データからVMDデータを作成し、読み込ませてみると・・・・

ガーン。めったに見ない制限にかかってしまいました。
このステージのバックスクリーンは、シンメトリ版で173のバンド数から成るので、20000÷173=156フレームしか光らせることができない計算になります。
2フレーム置きに光らせたとしても、231フレームしか動画が作成できないことに。
本当なんでしょうか。
VMDSpectrumでステージを光らせる動画はソコソコ見かけるように思いますので、私が勘違いしている可能性が高いです。
数百フレームごとに動画を分割して出力しているとは、ちょっと信じられないので何かテクニックがあるのかもしれません。
ともかく、この制限にひっかかったことによって思いついた実験です。
このステージはバックのライトの1つ1つが材質に分かれていて、それぞれに設定された材質モーフを動かすことで個別に発光させる仕組みになっています。

こんなかんじ。
これを材質モーフではなく、screen.bmp による背景AVIで発光させることはできないか?というのが実験主旨です。
これならモーションを読み込ませる必要が無いので、登録ポイント数の限界の問題は解消されます。
まず第一段階。
バックスクリーンにある無数のライトをUV展開します。
本当はキッチリと展開する必要もないのですが、将来を考えてそれなりにUV展開することにします。
手作業でやっていると大変なので、スクリプトを書いて展開します。

こんな感じに、敷き詰めて展開します。
そして第二段階。
VMDSpectrumで出力したVMDファイルに基づいて、背景AVIファイルを作成します。
第一段階でUV展開された各ライトと対応するUV位置に、モーションの値に基づいた輝度を出力していきます。

こんな感じのAVIになります。
そしてバックスクリーンをscreen.bmpにUV展開したステージモデルと、背景AVIを読み込んで再生!

あるぇぇ・・・・光ってくれない。
MMDではPMXモデルにscreen.bmpは使えませんので、CVN68Nimitz様のDummyScreenCopyを使用しています。
一応、目論見通り、背景AVIの各部分が対応するバックスクリーンのライトに当たっている・・・ような気がしますが、ライトは薄暗く光るだけです。
AutoLuminousの仕組みはよくわかっていないのですが、うまくすれば光ってくれるかなと思っていたのですが。
ちょっと調べてみないとわからないですが、なんだかうまくいかなさそう。
他にも課題はあるので、実験は失敗かも?
探していたのは VMDSpectrum で音に合わせて派手に明滅するステージ。
そうして見つけたのが、くうわんこ様の「ダンスステージ」です。
バックスクリーンがキラキラと輝く素敵なステージです。

まさに探していた通りのステージです。カッコイイ。
さて早速、VMDSpectrumで音データからVMDデータを作成し、読み込ませてみると・・・・

ガーン。めったに見ない制限にかかってしまいました。
このステージのバックスクリーンは、シンメトリ版で173のバンド数から成るので、20000÷173=156フレームしか光らせることができない計算になります。
2フレーム置きに光らせたとしても、231フレームしか動画が作成できないことに。
本当なんでしょうか。
VMDSpectrumでステージを光らせる動画はソコソコ見かけるように思いますので、私が勘違いしている可能性が高いです。
数百フレームごとに動画を分割して出力しているとは、ちょっと信じられないので何かテクニックがあるのかもしれません。
ともかく、この制限にひっかかったことによって思いついた実験です。
このステージはバックのライトの1つ1つが材質に分かれていて、それぞれに設定された材質モーフを動かすことで個別に発光させる仕組みになっています。

こんなかんじ。
これを材質モーフではなく、screen.bmp による背景AVIで発光させることはできないか?というのが実験主旨です。
これならモーションを読み込ませる必要が無いので、登録ポイント数の限界の問題は解消されます。
まず第一段階。
バックスクリーンにある無数のライトをUV展開します。
本当はキッチリと展開する必要もないのですが、将来を考えてそれなりにUV展開することにします。
手作業でやっていると大変なので、スクリプトを書いて展開します。

こんな感じに、敷き詰めて展開します。
そして第二段階。
VMDSpectrumで出力したVMDファイルに基づいて、背景AVIファイルを作成します。
第一段階でUV展開された各ライトと対応するUV位置に、モーションの値に基づいた輝度を出力していきます。

こんな感じのAVIになります。
そしてバックスクリーンをscreen.bmpにUV展開したステージモデルと、背景AVIを読み込んで再生!

あるぇぇ・・・・光ってくれない。
MMDではPMXモデルにscreen.bmpは使えませんので、CVN68Nimitz様のDummyScreenCopyを使用しています。
一応、目論見通り、背景AVIの各部分が対応するバックスクリーンのライトに当たっている・・・ような気がしますが、ライトは薄暗く光るだけです。
AutoLuminousの仕組みはよくわかっていないのですが、うまくすれば光ってくれるかなと思っていたのですが。
ちょっと調べてみないとわからないですが、なんだかうまくいかなさそう。
他にも課題はあるので、実験は失敗かも?