Unreal EngineでWwiseを使用してマルチチャンネルオーディオのファイル入出力を行う方法 ~再生編~

今回は、Unreal Engineを用いてマルチチャンネルオーディオのファイルを再生/録音する方法を書いていこうと思います。

以下の記事はWindowsのみを対象としています。

Windowsのオーディオデバイス周りはかなり複雑です。 WDM、WASAPI、ASIOなど色々とありますが、オーディオとしてちゃんとやる場合(特にマルチチャンネルオーディオ)ではASIO一択となるかと思います。

しかし、UEからのオーディオ出力はWDM経由でしか出力できないので、スピーカーレイアウトが決まっていたり、最大でも8チャンネルの出力しかできません。

というわけで、マルチチャンネルを出力する場合はUEではない別のオーディオエンジンから出力することが望ましいかと思います。

そこで登場するのがWwiseとなります。

WWiseではプラグインでASIOがサポートされていて、入力・出力ともにASIOから行うことができます。

今回は、WWiseを使用してまずはマルチチャンネルファイルの再生をUEからおこなっていきたいと思います。(一部録音のための設定を含みます。)

WWiseとUEはあらかじめインストールされている状態とします。

プラグインの追加

WWise LauncherでASIOプラグインを使用するWWiseのバージョンにインストールします。

UEのプロジェクトへのWWiseの追加

WWise Launcherを使えば簡単にできます。この時にコピーが行われるので、前段のASIOプラグインの追加を必ずしておいてください。

この時にWWiseプロジェクトを作っていなかったら、下の方のWWise ProjectのプルダウンメニューでNew Projectで新しいプロジェクトを作成してください。

コンフィギュレーションを作成する(オプション)

基本的にチャンネル数のコンフィギュレーションがあるものについては、コンフィギュレーションを使用すれば良いと思います。

ない場合は、以下のパスのxmlファイルを編集することでコンフィギュレーションを追加することができます。

C:\Program Files (x86)\Audiokinetic\Wwise <version>\Authoring\x64\Release\bin\plugins\ASIO.xml

僕はOutput 64ch、Input 64ch欲しかったので以下のように追加しています。

<SinkPlugin Name="ASIO Output" CompanyID="0" PluginID="168" EngineDllName="ASIO" EngineStaticLibName="ASIOSourceSink">
<!-- ... -->
    <Value DisplayName="Anonymous 24">24</Value>
              <Value DisplayName="Anonymous 31">31</Value>
              <Value DisplayName="Anonymous 64">64</Value> <!-- add -->
              <Value DisplayName="Anonymous 128">128</Value> <!-- add -->
            </Enumeration>
          </ValueRestriction>
        </Restrictions>
      </Property>

 <SourcePlugin Name="ASIO Input" CompanyID="0" PluginID="204" EngineDllName="ASIO">
<!-- ... -->
<Value DisplayName="Auro 13.1">803467534</Value>
              <Value DisplayName="LFE">33025</Value>
              <Value DisplayName="Anonymous 24">24</Value>
              <Value DisplayName="Anonymous 31">31</Value>
              <Value DisplayName="Anonymous 64">64</Value> <!-- add -->
            </Enumeration>
          </ValueRestriction>
<!-- ... -->

プラットフォームの選択

さて、WWiseでの作業に入っていきます。

ASIOは近年のmacOSでは使えないですのでPlatform選択でMacを殺しておきます。 Project>Platform Mangerから以下のウィンドウを開き、Windows以外をRemoveしておきます。

再生

WWiseのことがあんまり詳しいわけではないのでアレですが全体の流れとしては、Actor Mixer Hierarchy -> Master Mixer Hierarchy -> Audio Devicesという流れで音が処理されていきます。

出力側から作っていきます。

F5でDesignerレイアウトを開き、Project ExpliorerパネルのAudioタブを選択します。

  1. Audio Devices Audio DevicesのDefault Work Unitを右クリックして New Chile > ASIO Outputを作成します。

チャンネルコンフィギュレーションを選択します。先ほど、チャンネルコンフィギュレーションを作成していれば、出てくるはずです。

Base Channelの値を変更することでスタートのチャンネルを選択することができます。使っているオーディオインターフェースに応じて調整してください。

  1. Master Mixer Hierarchy 次にMaster Audio Busを選択して、Audio Devicesを先ほど作成したASIO Outputに変更します。

変更するとBus StatusのBus Configが先ほど設定したものになってるかと思います。

  1. Actor Mixer Hierarchy まずは、再生したいマルチチャンネルオーディオファイルを用意しましょう。

Project > Import Audio Files...で音源ファイルをWWiseにインポートします。

インポートすると以下のようにSound FXとしてDefault Work Unitの中に作成されると思います。

試しに、Playを押すと右側のMeterが触れてオーディオインターフェースから再生されると思います。

実際に、オーディオインターフェースのソフトウェアでも再生されていることが確認できました。

この時点で再生されていない場合、WWiseエディタでのデバイスの選択が間違っているパターンです。 メニューのAudio > Authoring Audio Preference...からMaster Audio BusのAudio DeviceをAsio_Outputの再生したいオーディオインターフェースに変更します。

  1. Eventの作成

次はUE側からこのオーディオファイルの再生をトリガーするためのEventを作成します。

Project ExplorerのEventsタブを開きEvent > Default Work Unitを右クリックして、New Child > Playを作成します。

作成したEventはTargetのところが空欄になっていると思いますので、Project ExplorerのAudioタブに戻って先ほどインポートしたオーディオファイルをドラッグ&ドロップします。

  1. SoundBankの作成 Project ExplorerのSoundBanksタブを開きSoundBanks > Default Work Unitを右クリックして、New Child > SoundBankを作成します。

メニューのLayoutからSoundbankを選択して、先ほど作成したSoundBankを選択します。

SoundBankのタブのAddのところに、今まで作成してきたオブジェクトをドラッグアンドドロップしていきます。

最後にこの右上の方にあるGenereta AllをクリックしてSoundBankを生成します。

これで、WWise側での作業は終了です。

UE側での設定

まずはProject 設定をいじっていきます。

先ほど作成したSoundBankをUE側で指定します。 Root Output Pathの設定のところに、Wwiseのプロジェクトディレクトリ内にできている、Generated Sound Banksのフォルダを設定します。

次にUnreal Audio RoutingをWwiseSound Engineにします。(Bothでも大丈夫でした) この設定を変更すると再起動を求められますので、UEを再起動します。

再起動したらWWise Browserを開きます。もし正しく開けなかった場合は、ReloadやReconcileをしてみましょう。それでも改善しなければSound Bankで設定しているディレクトリが違ったり、SoundBankが正しく生成できていないので、上記の設定を確認し直してください。

Eventsの中にWwiseで作成した再生イベントがあると思うので、こちらをContent Browserにドラッグ&ドロップしてUEのアセットを作成します。

ここまできたら再生準備は整いました。 あとは、Blueprintから再生するもよし、Sequencerから再生するもよしです。

ちなみに、どのASIOデバイスに出力されるかは、環境変数 WWISEASIODRVで指定します。

あとがき

以上がUEでマルチチャンネルファイルをWWiseを使用して再生するまでの手順になります。本当は録音も一つの記事で行こうと思ってたんですけど、かなり長くなってしまったので一旦ここまでで...

UEのアプリにパッケージしたい時とかやはり便利なことはあるかと思います。 WWiseはライセンス料かかる部分あるので必ずしも使える場面が多いとは思いませんが、本記事がどなたかの参考になれば幸いです。。。

本記事の内容を検証する上でevalaさんに作成いただいたマルチチャンネルファイルを使用いたしました、ありがとうございます。

参考

AK ASIO Output

SharedArrayBufferを使うための環境設定など

何かとSharedArrayBufferを使うことが多いです。

Shared Array Bufferとは、ブラウザ上でマルチスレッドを行う際にメモリ上にデータを載せてやりとりする時に使います。

自分は、AudioWorkletとかWasm、Web Worker周りで使うことがあります。

Scrollingというブラウザ上でスクラッチができるWebサイトを作った際には、Audio Workletを使用してカスタムのWavプレイヤーを作成したときにShared Array Bufferを使用しました。

(Audio Workletはメインのレンダリングスレッドに影響を与えないように、別スレッドで実行されます)

scrolling.73ch.work

ただその性質上、脆弱性となりやすいため、セキュリティが厳しめでAPIを使用するためにいくつか設定しなければ使えません。この辺もSpectreが見つかったことによるものだと思うと意外に最近ですし、ニュースで見たようなことが現実に影響してるなと思うと共に、セキュリティ意識の重要性を感じます。

今回は、Shared Array Bufferの使い方は省いて、Shared Array Bufferを使うための一種の環境設定について書いておきたいと思います。

本記事の内容については以下の記事にも一部書いてあり、また使用方法も書かれていたりしてわかりやすいです。

note.affi-sapo-sv.com

やらなければならないこと

  • cross origin isolationを行う
  • (https化を行う)

Cross Origin Isolation

Cross Origin Isolationをするためには、COOP(Cross Origin Opener Policy)とCOEP(Cross Origin Embedder Policy)、CORP(Cross Origin Resource Policy)を設定する必要があります。

基本的には、コンテキストを分離することをCOOPで宣言して、各リソース(img, js...)に対してCORPを設定し、最後に全てのドキュメント(HTML)にCOEPを設定します。

ブラウザからは以下でクロスオリジン分離ができているかを確認することができます。

window.crossOriginIsolated

Cross Origin IsolationやCOOP、COEPについては以下の記事が詳しいです。 web.dev

なお、お気づきの方もいるかもしれませんがCOEPは伝染するので、一つのドキュメントでCOOPやCOEPCOEPを設定する必要があるとiframeなどを通して関連する全てのドキュメントに設定する必要があるため、とても大変です。(つまり、全てのCORSリソースに対してCORPを設定する必要が出てきます。)

HTTPS化

localhostで開発を行うだけならいいのですが、モバイルでデバッグする時などLAN内で通信した場合には当たり前のようにHTTPSが求められます。 ローカルでオレオレ認証局を立ててHTTPS化するだけで済むならいいのですが、基本的にこの辺の機能に関してはちゃんとして認証チェーンに乗ったちゃんとしたHTTPS化が求められます。

ローカル開発

ローカルで開発したい場合、2通りのやり方があります。

ChromeのオプションでShared Array Bufferを有効化する

これが一番シンプルかもしれません。

Chromeコマンドラインから起動し、オプションとして以下を設定する方法です。

--enable-features=SharedArrayBuffer

自分は、Chrome自体は開発中の調べ物に使用するので、Canaryにこのフラグをつけて起動しています。

"/Applications/Google\\ Chrome\\ Canary.app/Contents/MacOS/Google\\ Chrome\\ Canary --enable-features=SharedArrayBuffer"

しかし、この方法はおそらくChromeでしか使えない(Safariなどに同様のオプションあるのか不明)ですし、モバイル端末でPCに立てたサーバーを見に行く際などにとても不便です(自分はこのケースがとても多い)

devServerでもヘッダーを使用する

まあ、基本的にHTTP Headerを付けるだけではあるので、そこまで難しくないかと思います。 以下のヘッダをつけてあげれば大丈夫です。

Cross-Origin-Opener-Policy: same-origin
Cross-Origin-Embedder-Policy: require-corp

もし、そのサイトで出てきたCORSリソースなどは以下のヘッダをつけてあげると良いです。

Cross-Origin-Resource-Policy: cross-origin

viteを使用する場合

vite-plugin-cross-origin-isolationを使用すると楽に行けます github.com

HTTPS化

これは、ngrokが早いです。

ngrok.com

デプロイ

基本的にローカルと変わらないです。

静的サイトホスティング系のサービスだと、Netrifyは昔やった時に行けなかったイメージがあります。

Vercelだとできたので、以降Vercelを使用するようにしています。

vercel.com

Safari対応

はい、厄介です。ここでもか、と。

基本的に、上記の設定をすれば使えるはずなのですが、Safariはややこしい問題が起きます。

症状としては、1回目見た時にはうまく行くのですが、2回目以降アクセスするとうまくいかなくなります。

いや、これはどういうことなんだと思っていたのですが、以下のブログに行き当たりました。

predr.ag

記事をざっと要約すると、この症状はSafariのWebのキャッシュ周りの実装が悪さをしています。

キャッシュがヒットした場合に、CORPなどのヘッダを返した時のように振る舞わないというのが問題になります。

細かい部分は、上記のブログにお任せするとして、いかに簡単に対応を示します。

これもHTTP HeaderでCacheをしないように設定すればよく以下のヘッダを設定します。

Cache-Control: no-store

まとめ

以上になります。とても厄介でなんだかんだ調べるのにとても時間がかかっていたりするのですが、対応自体は意外にシンプルだったりしたり、、、

ただ、結構理解するためにはWebに関する細かい知識が必要だったりするので、調べつつなかなか勉強になりますね。

本記事がどなたかの役に立てば幸いです。

新しめのMacでオーディオドライバーがインストールができないときに疑うこと

Mac OSのMojaveかCatalina以降は、セキュリティが厳しくなったのでドライバがうまく入らなかったり、動作が不安定になることが増えたような気がします。

オーディオドライバは基本的にカーネル拡張によって実現されており、Macの場合kextです。

セキュリティが厳しくなったことで、このkextをインストールするときにユーザーアクションが必要になったのですが、kextがインストールされるタイミング、ロードされるタイミング、ユーザーによって許可が降りるタイミングなどの問題により、インストールしてもなかなか起動してくれないパターンがあります。

そのケースでは、手動でkextをロードすることで改善することがあり、以下のコマンドで手動でkextを読み込むことができます。

sudo kextload /System/Library/Extensions/XXXXX.kext

これを実行するとうまくいく場合があります。

なお、上記はIntel Macでセキュリティとプライバシーの項目で許可のボタンが出てこない場合に有効性があり、M1/M2 Macでは以下の記事を参考にリカバリーモードでカーネル拡張機能をそもそも有効化する手順等を踏む必要があります。

www.rme-audio.de

LOWWでのevala | Score of Presenceの展示のインストールについての雑記

先日、大岡山のLOWWというギャラリーでevalaさんの展示があり、主に機材側のインストールを協力させていただいたので、そのメモを書いておきたいと思います。

展示は、ギャラリーでちゃんとしたスピーカーは持ち込んでいないものの、ちゃんとサウンドインスタレーションとして完成されていてすごい良かったと思います。

SbYEの新しい展示形態という感じで非常にポテンシャルを感じました。

できたところ

ケーブル配線

これが天職なんじゃないかなと。

ケーブルの選定

今回は、ギャラリーの雰囲気が割と落ち着いていてカチッとしていたので、ケーブルもそれなりに綺麗にするのが良いかなと思いました。

施工方法とそれによる印象の考え方として以下のようなものが考えられると思います。

  1. ケーブルを隠蔽する→ケーブルが作品の構成要素としていらない(絵画から音が出ている不思議感、絵画の存在感、空間全体としての音場感)
  2. ケーブルを気にならなくする→作品の補助要素として、作品の鑑賞の邪魔にならない(今回)
  3. ケーブルを見せる→作品の視覚要素としてケーブルも組み込まれる

今回はギャラリーが空間としてしまっていたのと、ケーブルを完全に隠蔽にすることは無理であることがわかっていたので2の気にならなくするという方向を選択しようと思いました。

使用したのはCANAREの4S6の黒で、壁の深緑に"そこそこ"馴染むような感じがいいかなと思いました。

個人的な考え方ですが、気にならなくするというのは頭で考えるまでもなく受け入れられるのが理想と思っています。

なので、壁の深緑に合わせて深緑のケーブルにするという選択肢もあるとは思うのですが、今回は近くで見るのでケーブルが壁の凹凸として認識されうるので気になっちゃうような気もします。(本質的には凹凸によって壁に影ができる、僕は結構気になるタイプです)

さらにいうならば、音が鳴るというのに対してケーブルが接続されているというのは古くから当たり前のことでむしろないのに音が鳴っていることが気になることさえあると思います。

ケーブルの支持方法

最初はケーブル裏に両面テープによる固定を検討していたのですが、やはりケーブル・壁面と両面テープの相性の関係上はがれが発生してしまったので、変更してケーブルステップルによる固定としました。

また、ケーブルがそのまま壁にピシッとついているとそれはそれで違和感があるような気がしていて、何点かステップルで止められている方が個人的には気にならないんじゃないかと思います(場合による)

ケーブル配線方法

支持点は絵画内部の壁面に3点、露出部に3点で固定しました。

絵画内部で余裕を持たせているのは、絵画を壁にかける際の作業性・絵画の位置変更のしやすさ・ケーブルが引っ張られた時に絵画が落下しないようにするためです。

絵画内部と露出部では支持材を変えており、絵画内部は両面テープ式の強度の強いもの、露出部ではステップルにプラの抑えがついたものを使用しています。

これは絵画内部の部分はケーブルの自重がかかり強度が求められるのに対し、露出部は見栄え重視・壁面から離れないようにするためこのような選定にしています。

ケーブルステップルに関しては複数のステップルを比較して選定しています。

MOTUのドライバーインストール

Mac OSのMojaveかCatalina以降は、セキュリティが厳しくなったのでドライバがうまく入らなかったり、動作が不安定になることが増えたような気がします。

オーディオドライバは基本的にカーネル拡張によって実現されており、Macの場合kextです。

セキュリティが厳しくなったことで、このkextをインストールするときにユーザーアクションが必要になったのですが、kextがインストールされるタイミング、ロードされるタイミング、ユーザーによって許可が降りるタイミングなどの問題により、インストールしてもなかなか起動してくれないパターンがあります。

そのケースでは、手動でkextをロードすることで改善することがあり、以下のコマンドで手動でkextを読み込むことができます。

sudo kextload /System/Library/Extensions/XXXXX.kext

これを実行するとうまくいく場合があります。

なお、上記はIntel Macでセキュリティとプライバシーの項目で許可のボタンが出てこない場合に有効性があり、M1/M2 Macでは以下の記事を参考にリカバリーモードでカーネル拡張機能をそもそも有効化する手順等を踏む必要があります。

www.rme-audio.de

そのほかやったこと
  • ケーブルの端子あげ
  • 動線部の保護
  • 目立たない配線ルートの選定
  • タント1台の後部座席部分に作品・機材が全て収まるような形で運搬
  • evalaさんの誕生日祝い

できていなかったところ

絵画としてではなくスピーカーとして

全体として、作品を絵画作品としてしか見られていなかったです。

この作品の特徴としてスピーカーとしての役割があり、その部分を本質的にはあまり意識できていなかったのではないかと思います。

例えば、今回は壁掛けで展示する形を想定していましたが、ケーブルの都合上作品下部を壁から少しふかす必要がありました。これにより、スピーカーとしての周波数特性は大きく変わることが予想されます。

実際、スピーカーで考えるならエンクロージャーが変わっているようなものと考えられる気がします。

今回で言うとevalaさんは一旦音が出るようになってしまえばものすごい調整能力と空間構成能力で仕上がってしまう(本当にすごい)ので問題にはならなかったですが、今後は設計の時点で考慮しておきたいですね...

ただ、今思うと音の抜け方的には下に抜けていくような形になるので、天井2発のスピーカーとちょっと下に抜ける6発の絵スピーカーでバランスとしては悪くなかったのかもしれません。

ここまで検討・測定・調整などをして作品インストールできるようになりたいなあ。

ケーブルを逃すためのふかしによる絵画の見栄えの変化

上記と同様に壁からのふかしの部分で問題になったのがもう一つ。

今回の作品は、構造色のように見る角度によって色彩が変化するのが作品の魅力の一つです。そのため、ケーブルを通すためにふかしたことで若干の見栄えの変化が出てしまいました。

本来、絵画作品は垂直もしくは斜め下を向いていることが多い(照明が反射しやすく見にくくなるため)ですが、ケーブルを下から出したので若干斜め上を向くようになってしまいました。

今回の場合であれば、ギャラリーの規模感だったので多少の角度のずれで問題になることはなかったですが、大きなスペースだったりディスプレイなどが混在して展示されるような環境では注意する必要がありそうです。

以上の2点を考えると、もう少し径の細いケーブルやフラットタイプのケーブル、より柔らかいケーブルを選定してもよかったかもしれないです。(予算の都合もありますが)

MOTUのインターフェースIN/OUT

これはもうマジでギャグなのですが、インターフェースのIN・OUTを間違えて刺してて、なんか2chしかならないとかずっと言ってましたw

でも、言い訳したくてMOTU ultralite hybrid mk3って背面のレイアウトがやばくて、OUT1・2の横にINの3~8が並ぶっていう...(コリャネーゼ

2bit大先生が遊びに来てくれなかったら音でてなかったかもしれないです。

MOTU ultralite hybrid mk3

終えて

ケーブル配線本当に楽しくてずっとできるんです。そんな仕事お待ちしてます。

ケーブル配線褒められると嬉しいんですが、今回の展示としてはケーブルが目立たないことを目標にしているので複雑な気持ちにはなります...w

まあ、ケーブル配線の部分を見てる時点で同業者か変態なわけでその人たちを気にしすぎてたらいい展示にはならないでしょうがw

お疲れ様でした。

axiosで送信元IPアドレスをIPv4で指定したい場合

めっちゃ小ネタなんですが、備忘録として書いておく。

状況としては、Azure Functionをローカルで動かしてたときに、テストを自動化したくてaxiosで検証用アプリを作ってた時の話。

ブラウザだとうまくいく(この時は400エラーを返すようにしてたけどw)、axiosだと何故かECONNREFUSEDを返すと。

wiresharkで見てみると、ブラウザは127.0.0.1でアクセスしてたんだけど、axiosは::1でアクセスしようとしてることがわかった。

なんで、この状況になるのかよくわかってないけど、axiosはIPv6を優先してるのかな...?(まあ、Azure FunctionがIPv6でのアクセスに対応してないってのが問題かもしれんが、クラウド側の事情とかあるとそうもいかんのか?)

とりあえず、axiosにIPv4を強制させたいときのコード

const agent = new http.Agent({ family: 4 });
const instance = axios.create({ httpAgent: agent });
await instance.post(info.host, request);

ファイ。

DavinciのTransformのpositionが難しい話

今回は、Davinci Resolveを使うときの小ネタの話を書いていきたいと思います。

Davinci Resolve便利でいいと思います。

しかし、納品フォーマットの都合や素材の合成などでピクセル単位で揃えたい時に何度か困ったことになったのでブログとしてまとめておきたいと思います。

内容としては以下のツイートの詳細とFXで移動させる方法の検証になります。

位置の値の単位ってなんだ?

基本的には以下の記事に書いてある通りです。

asteriscus.jp

移動させた時に、これってなんの値なんだってなりません...?

この値の単位が以下の計算式になっているので、ピクセル単位で合わせたい時に毎回複雑になります。

(タイムライン解像度/画面上でのクリップの表示解像度)*ピクセル単位の移動=設定する移動量

これを100x100pxの赤い四角をx:150px,y:150pxに持ってくるケースを例に、手順を追って説明していきたいと思います。

今回はIllustratorで100x100pxの赤い四角の画像と、テンプレートとなるFullHDにx:150,y:150pxの位置に枠を設置した画像を用意しました。

位置の基準位置は左上とし、枠のストロークはAlignOutsideでの1mmで作成しました。なので、最終的にはテンプレートの灰色の部分が赤色になって枠線の黒部分が残っていれば成功ということになります。

1. タイムライン上でのクリップの表示解像度

Davinciではクリップのスケーリングを設定することができます。 プロジェクトのデフォルト設定とクリップごとの設定の二つがあります。

プロジェクト設定でのスケーリングの設定
インスペクタウィンドウでのスケーリングの設定

値としては以下のような対応になります。 * Crop: スケーリングしない * Fit: 長辺をタイムラインに合わせる * Fill: 短辺をタイムラインに合わせる * Streach: 角の4点をタイムラインに合わせる

今回はスケーリングしたくないのでCropを使用します。

このスケーリングの値によってタイムライン上でのクリップの表示解像度が決まります。(スケーリングされた後の解像度が必要) Cropであれば画像の解像度そのままでStreachであればタイムライン解像度そのままですが、FitやFillはタイムラインに合っていない方の辺は計算で求める必要があります。

2. ピクセル単位の移動量を計算する

Davinciでの座標の基準点はタイムラインのセンターで、移動の基準点もクリップのセンターになります。

そして、x軸が右方向に正、y軸が上方向に正です。

なので、今回のケースであれば以下のような計算になります。

x: (-960+150)+50=-760
y: (540-150)-50=340

3. 式に当てはめてる

あとは難しくないですね。以下の式に当てはめていきます。

(タイムライン解像度/画面上でのクリップの表示解像度)*ピクセル単位の移動=設定する移動量

x: (1920/100)-760=-14,592 y: (1080/100)340=3,672

さてここで問題が発生します。

Xが行って欲しいところまで行かない

そう、このインスペクタで設定できる位置の値には上限があるのです...

どうやら、タイムライン解像度の-4〜4倍の値までのようです。

今回のケースのように小さな画像を大きなタイムラインで移動させようと思った時に問題が生じます。

それ以外のケース、タイムライン解像度の-4〜4倍の移動に収まるような移動であればこのやり方で問題なく行えます。 今回で言うとY座標の方は概ね正しい位置に表示されているのはわかるかと思います。

エフェクトを使った移動のやり方

インスペクタを使ったやり方ではなく、Effectを使ったやり方だとこの問題を回避しやすいです。

クリップに対して、Open FXのResolve FX TransformのTransformエフェクトを適用します。

こちらのエフェクトでは、Position XとPosition Yでパラメータを設定することができます。

こちらの値の基準はタイムラインでのクリップの表示解像度を1として-100~100まで移動することができます。

今回であれば、設定する値は以下のようになります

x: -760/100=-7.6
y: 340/100=3.4

いけてそうですね。拡大しても問題なさそうです。

これでもいけない時

例えば、素材がそもそも2pxとかしかなかったら100倍したとしても200pxしかありません。 このような時は本当に困ってしまいそうです。

そんな時は、一旦中くらいの解像度のタイムラインを作ってそれで合わせてから、そのタイムラインを本ちゃんのタイムラインに乗せてあげる必要がありそうです。

一応10x10pxでやった時の画像を添付しておきます。

半分の解像度のタイムラインでの作業
本ちゃんのタイムラインでの作業
実際に書き出したピクセルパーフェクトな10x10pxを配置した画像

まとめ

Davinciしんどいよって感じの内容でしたが、今回はクリップをピクセルパーフェクトに移動したい時のTipsでした。

ただ、このやり方であんまり納得していないので、もっと簡単にできるような気もするんですがやり方ご存知の方いないですかね...?

Unreal Engineで外部入力のLTCでSequencerを制御する

今回は、UEでLTCを入力してSequencerをコントロールするところまでやってみたいと思います。

下準備(Reaperでタイムコードを出力する)

今回は、説明の簡略化のためにオーディオデバイスを外部にせずにReaperからVoiceMeter Bananaを用いてループバックすることで入力としたいと思います。 実際にオーディオインターフェースなどで行う場合は、この作業はいりません。

メニューバーのInsertからTimecode Generatorを選択

すると、Timecodeトラックが生成されます。

トラックを右クリックしてSource Propertiesを選択

使いたいフレームレートおよびスタートタイムコードを指定します。

右上のオーディオデバイス情報が記載されているところをクリックするとオーディオ設定が開けます。

今回はVoiceMeter Bananaを用いるのでVoideMeter Virtual ASIOを選択します。

VoiceMeterのインターフェースでちゃんと出力されていることを確認します。

オーディオ入力の確認

LTCが入ってくるオーディオ入力はWindowsのシステムの入力のデフォルトのデバイスが使用されます。 UE側でASIOなどで特定のデバイスの特定のチャンネルを指定する方法はないように思われます。

今回はVoiceMeterからの出力を使いたいのでVoiceMeter Outputを選択します。

UEでの設定

さて、下準備が整ったのでUEでの設定に入っていきたいとおもいます。

プラグインの有効化

プラグイン設定を開きます。

以下の5つのプラグインを有効化します。

  • Audio Capture
  • Audio Capture Timecode Provider
  • Timed Data Monitor
  • Media Framework Utilities
  • Media IO Framework

Timecode ProviderとTimed Data Monitorのウィンドウを表示する

メニューバーのWindow>Virtual ProductionからTimecode ProviderとTimed Data Monitorを選択して開きます。

開くとデフォルトのシステムタイムコードプロバイダが動作していることが確認できます。

Media ProfileおよびAudio Capture Timecode Providerの作成

BluePrintの作成から、Audio Capture Timecode Providerを継承したクラスを作成します。

クラスの設定は以下のようにします。使いたいタイムコードのフレームレートを選択します。Auto Detectのチェックボックスを有効化すると、フレームレートが自動で識別されます。

Media Profileを作成します。

作成すると警告がでますが、Configure Nowでできたダイアログ通りに作成してしまっても問題ないです。(Proxyが作成されます)

Media Profileは以下のような設定にします。ポイントとしてはProject Setting Overrideのチェックボックスを有効化して、Timecode Providerを先ほど作成したものに置き換えます。

タイムコードを受けれるようになったことがわかります。 youtu.be

このままだと、プロジェクトを開きなおすたびにMedia Profileの設定が戻ってしまうので、Project SettingsでStartup Media Profileを作成したものにしておきます。 なお、都度変えたい場合はMedia Profileを開いてセーブなどするとProfileが有効化されます。

タイムコード経由でSequencerを制御する

テキトーにSequencerでCubeが平行移動するアニメーションを作ってみました。Sequenceを作成する部分は今回は省略します。

SequencerのFPSが書いてあるところをクリックして、Show Time AsをNDF Timecode、Clock SourceをTimecodeにします。

Reaperを再生し、Sequencerも再生すると、Sequencerが入力タイムコードに同期して動くようになります。

youtu.be

おわり

以上がUEでLTCを入力にSequencerを動かすところまでになります。

基本的にむずかしいところはないかと思いますが、個人的にはオーディオ入力がWindowsのデフォルトデバイスになってしまうところがややこしい気がしました。

UEではBMDやAJAのデバイスでTimecode・Genlockの出し受けができるので、そちらも有用かと思います。基本的な手順はかわらずTimecode ProviderやCustom Time Stepなどを作成することでコントロールすることができます。

BMDやAJAでタイムコードやGenlockの設定をする方法は公式のドキュメントがあるのでそちらを参照してください。

docs.unrealengine.com

LTCのドキュメントがなくちょっと詰まったため、本記事を作成したしだいです。

本記事がどなたかのご参考になれば幸いです。