はじめに
WwiseでRTPC駆動型の複雑なイベントを設定する際、それを試すことが容易でないというジレンマに直面することがよくあります。
複数のパラメータをマウスで制御することは実際には難しく、MIDIコントローラにパラメータをマッピングしたり、MIDIオートメーションを利用したりすることは可能ですが、必ずしも理想的ではありません。
直接ゲーム内でテストしたいと思っても、途中をスキップしてテストしたいものやシナリオに到り着くためのショートカットがなかったり、デザイン中のオーディオの対象システムがまだ完全に実装されていなかったり、それが存在さえしていなかったりするなど、テストに手間取ることによりイテレーションに時間がかかってしまうかもしれません。
このような時、Cycling74のMaxが役に立つのではないかと思います。NodeJSはWAAPI経由でWwiseに直接接続する方法を提供し、イベントを呼び出したりRTPCを更新したりできます。
カーブ(曲線)、スライダー、ボタン、ダイアルなどの図式化された便利なUIオブジェクトも多数揃っています。さまざまなパラメータの設定を保存するためのスナップショット保存機能が組み込まれているほか、時間と共に並行して変化するパラメータをシミュレーションすることができます。すばやくプロトタイプを作成したい時に最適な環境です。
手順を紹介する前にお知らせです。この記事の最後に本プロジェクトのある私のgithubへのリンクを掲載していますので、ぜひご覧ください : )
セットアップ
この記事を読みながら最大限に活用していただくために、準備していただきたいものがあります:
- このサンプルプロジェクトを含む最近のWwiseがインストールされていること
- Max 8(理論上はトライアル版で動くはずですが、私は確認していません)
- Maxの基本を理解していること
- javascriptプログラミングの適度な知識を有すること
スクリーンショットはすべてOSXで作成したものですが、Windowsの手順も全く同じです。
まずMaxプロジェクトを作成する必要がありますが、なぜシンプルなMax Patcherにしないかというと、すべてを自身のフォルダに入れたいからです。Maxプロジェクトフォルダでcodeサブディレクトリを作成し、以下にあるhello-wwise-node-wampプロジェクト例のコンテンツをそこにコピーします:
<WwiseInstallationPath>/SDK/samples/WwiseAuthoringAPI/js/
さらに以下にあるwwise.jsファイルをコピーして、
<WwiseInstallationPath>/SDK/include/js/
それを私たちのMaxプロジェクトのcodeフォルダに入れ、簡単にindex.jsスクリプトから参照できるようにします。
次にnode.scriptオブジェクトをパッチャーに追加し、それをhello-wwise-node-wampの例と一緒にあるindex.jsファイルにポイントさせ、オブジェクトヘルプパッチャーを開き(Maxオブジェクト上で、ALT+クリック)、 ノードデバッグツールを私たちのパッチにコピーします。
ちなみにjsファイルはデフォルトで、機能的ではありますが限定的なMaxの内蔵テキストエディタで開かれます。私のようにVSCodeやほかのエディタの方が使いやすい方は、Maxのプリファレンスで変更してください。
最後にnode.scriptにscript npm installメッセージを送信します。これでpackages.jsonファイルにリスト化されているすべてのノードモジュールがインストールされます。
ここでWAAPIがWwiseプロジェクトで有効になっていることを、WwiseのUser Preferencesで確認する必要があります。
次にCTRL+ダブルクリックでindex.jsを開き、wwise.jsファイルのパスをローカルコピーのパスに更新し、max-apiモジュールを入れ、最後にconsole.log()コールをMax.post()コールに置き換えてMaxコンソールにプリントするようにします。
いよいよ接続テストです。Wwiseでキャプチャを有効にし、ProfilerビューでログウィンドウのWAAPIセクションまで移動し、接続をテストするためにscript startメッセージをMaxのノードオブジェクトに送信します。
すべてうまくいけば、MaxコンソールはHelloメッセージ、Wwiseのバージョン、Wwise Logを出力するはずです。
SDKサンプルで提供されるindex.jsでは、接続がすぐにまた閉じられます。
これを変更するためにはonopen()関数を修正してakSessionをキャッシュするようにし、さらにノードスクリプトが停止された時にWAAPI接続をノードプロセスで閉じるためのエグジットハンドラを追加します。
次にUUIDでイベントをポストしてRTPCを更新するためのMaxHandlerを追加します。私はRTPCを名前でポストした時に少し問題があったため、あえてUUIDを使います。
次にMaxから呼び出すイベントやRTPCのUUIDが必要です。ありがたいことにWwiseがWAQLという洗練されたクエリランゲージを提供しているため、とても簡単にできます。後で必要に応じてUUIDをアクセスできるよう、パッチャーに恒久的に組み込むMaxディクショナリをMaxノードオブジェクトの最初の出力に接続し、すべてのイベントやRTPCを返すMaxハンドラを2つ追加してそこに送信するようにします。
UUIDが入手できるようになり、ようやく最初のイベントをポストできるようになりました。私はNYC(ニューヨーク)アンビエンスイベントを使用してテストしています。私たちのpostEvent()ハンドラは、3つの引数、1つのイベント名、1つのUUID、1つのオブジェクトIDを使います。
このオブジェクトIDはのちに重要となり、play/stopイベントだけでなく、後から送信されるRTPC更新に一致させるためにも必要です。これが欠けるとWwiseはstop/RTPC更新が関連していないと思い込んでしまい、うまく作動しません。
以下は前述のプロジェクト例が、Wwise SampleProjectのNYCアンビエンスのTimeやRain_Intensityパラメータを駆動する様子を示した動画です。
以下がgithubにあるサンプルプロジェクトへのリンクです。.zipとしてダウンロードし、Max 8で開いてください。
これからについて
もちろんMaxパッチでWwiseイベントをセットアップするためには、まだまだ多くの手作業の設定が必要ですが、Maxはjavascriptを通したパッチスクリプトにも対応しており、オブジェクトをプログラミングで作成すること等ができるため、これらをすべて自動化することができます。
私はイベントボタンなどを自動的に作成する方法を研究しはじめたところですが、うまくいけばいずれ小さなMaxパッケージとなるかもしれません。
みなさんもパッチ作成を楽しんでください!
コメント