ADX2 LE SDK Ver.2.10 (2019.2.1)の更新点まとめ

ゲーム向けサウンドミドルウェアADX2の無償版「ADX2 LE」が大型更新となったので、更新点をざっとまとめました。
https://game.criware.jp/products/adx2-le/

※2月5日に「v2.10.01」という修正版が出てます。公開直後にDLした方は再度入手しましょう。

# ツール編

## マルチプラットフォーム化（macOS / Windows両対応）

<img width="1532" alt="macOSでAtomCraftを使う.png" src="https://qiita-image-store.s3.amazonaws.com/0/19010/c438bc6d-84cd-38a5-945a-e360136dbf48.png">

同梱のオーサリングツール「Atom Craft」がmacOSに対応しました。
「Atom Craft」はADX2で再生するデータを作るための専用ツールですが、これまでwin系のライブラリに依存していた都合上macOSに対応していませんでした。
今回、ツール開発環境をQtに乗り換え、中の人曰く全てを作り直したそうです。対応というか新造です。

ゲームで使用できるライブラリのプラットフォームはiOS/Android/Windows/macOSです。こちらは変更ありません。
ゲームエンジンはUnitiy/UE4/Cocos2d-xに対応しています。DirectX等の環境を使用したゲーム開発にも使用できます。

## スタートページ
Ver3系と呼ばれる新ツールでは、ツールを起動したときにスタートページが表示されるようになりました。
最近使ったプロジェクト一覧と、ADX2についての最新tipsを見ることができます。

![スタートページ.png](https://qiita-image-store.s3.amazonaws.com/0/19010/6d8d8091-616f-8694-1307-13f8296df8f2.png)

## レイアウト機能
macOS対応のほかレイアウトが自由にできるようになったり、ツールを使うシーンに合わせてレイアウトを切り替えできるようになりました。便利。

![レイアウト機能.png](https://qiita-image-store.s3.amazonaws.com/0/19010/1cebd216-fe71-e720-404c-d4b548bcecb4.png)

ウィンドウのパーツを自在に外したり配置することができるようになったため、マルチモニター環境などで特に真価を発揮します。

![IMG_1669.JPG](https://qiita-image-store.s3.amazonaws.com/0/19010/50db779c-eb3e-1738-f920-b32348128737.jpeg)

ちょっと極端ですが、外部モニターの右にUnity Editor、左側にAtom CraftのレベルメーターとミキサーだけWindowを切り離して表示してみました。
手元のモニターにはAtom Craftの本体が表示されています。

## 動作環境
旧Atom Craftは.NETフレームワークとDirectXエンドユーザーランタイムのインストールが必要でしたが、 **不要** になりました。
Qt移行のおかげか、動作も全体的に軽くなった気がします。

根本的な話ですが、Unity Editorではアセットに何か作業するとすぐ再インポートになります。
ADX2の場合は色々設定してからパックファイルをビルドドン、とするのでツールが読み込み状態で待つみたいなシーンがほとんどありませんのでワークフローの改善につながります。

# Unity プラグイン編

## CRI Profiler
ADX2プラグインはUnityからオーディオ周りの処理をごっそり外部ライブラリで巻き取るので、標準のProfilerにはオーディオ処理が表示されなくなります。

そこで、プロファイリングはAtom Craft側のプロファイラを使用する...が定例だったのですが、プロファイラがUnity Editor側にも搭載されました。やったぜ。

![profiler.png](https://qiita-image-store.s3.amazonaws.com/0/19010/14148c3a-ccea-79b6-93be-4b06412b6e98.png)

CPU負荷、再生数、ラウドネスあたりが見れます。このへんはEditorでゲームを動かしつつ見たいので素直に便利。
なお、CRI Profilerを使う場合は CriWareLibraryInitializer(CriWareInitializerコンポーネント)のインスペクターにて「Uses In Game Preview」をオンにする必要があります。

![UsesInGamePreviewをオンにする.png](https://qiita-image-store.s3.amazonaws.com/0/19010/0808580b-747d-3fba-7333-e7e0bbfe3d55.png)

もともとこのオプションは、動作中のゲームとAtom Craftを接続してパラメーター調整やプロファイリングを行うためのものです。
その場合はAtom Craftからデータをビルドする際、インゲームプレビュー用のデータを出力し、Unityプロジェクトにインポートする必要があります。

CRI Profilerを使用する場合は、インゲームプレビュー用のデータは必要ありませんが、このオプションをオンにすることだけ必要です。

## API

### CriAtomExPlayback.GetBeatSyncInfo
**GetBeatSyncInfo** ですよ奥さん！！！
再生しているキューのビート同期情報を取得できるようになりました。
これは面白いことができそうなので、追って調査します。

### CriAtomPlugin.IsLibraryInitialized

ライブラリが初期化済みかどうかを判断できるようになりました。
ゲーム起動時に初期化せずロード画面とかを表示するようなシーン構成の場合、CriAtom.CueSheetsAreLoadingの様子を見たり
数秒待ったりしていたのですが、これで初期化されたかどうかすぐとれるようになりました。

### CriWareInitializer.Shutdown
CRIWAREに関するシステムをスクリプトから終了させることもできるようになりました。

### CriAtomExPlayer.SetPreDelayTime
プレーヤにプリディレイタイムを設定できるようになりました。 

### 出力波形の録音
CriAtomExOutputAnalyzerをつかって録音ができるようになりました。
CriAtomExOutputAnalyzer.SetPcmCaptureCallbackとCriAtomExOutputAnalyzer.ExecutePcmCaptureCallbackでpcmデータが取れるようになったので、Unity Recoderとかに対応できるようになるかも...？調査します。

## エディタ

CriAtomSourceコンポーネントのインスペクタにプレビュー再生機能が追加されています。
ツールに戻らなくてもエディタでキューの中身を再生確認することができるようになりました！

![プレビューボタン.png](https://qiita-image-store.s3.amazonaws.com/0/19010/7755c726-7214-542b-69c2-4fbc1c623bc6.png)

~~...のですが、現在このプレビュー機能を使ったあとにUnity Editorでゲームを実行すると[CRIWARE] ERROR: FileSystem library is already finalized.とエラーが出ます。プレビュー再生する際のファイル読み込み周りで何か起きているようです。
再生や実行は問題ないので、多分ファイルシステム初期化を管理しているカウンタの数え間違いっぽいです。~~

v2.10.01で修正されました。
https://criware.info/adx2-le-v210/

>   (a) CriAtomSourceコンポーネントのインスペクタ上でキューを再生した後、
      Unity Editor でゲームシーンをプレビュー実行すると、CRI FileSystem 
      ライブラリの終了処理が多重に実行されてしまう問題を修正しました。

### エラーログ出力周りの仕様変更

> ネイティブプラグイン内でのエラーがアプリケーションのメインスレッドにおいて発生した場合に、CriWareErrorHandler によるログ出力をネイティブプラグインからのコールバック経由で行うようにしました。
>これにより、ログ出力部分にブレイクポイントを設定することで、エラーの原因となった C# レイヤの関数呼び出しがスタックトレースから参照可能になりました。

やや細かい話になるのですが、エラーログの改善で原因特定がやりやすくなりました。のようです。

## 今後Unity Pluginに期待したいこと

* データのホットリロード
Atom Craftで生成したデータをUnity Editorに持ち込むとき、CRI Atom Windowでキューの中身などを表示する際に一度Editor上でゲームを実行して読み込ませる動作が必要です。これが自動化すると嬉しい

* namespace切って！！
　クラス名がCri~~なのであんまり被ることは無いですが、プラグイン系はやはりnamespace切ってほしいところ。IDEの機能でやっちゃえば問題ないですが

* Assembly Definition対応
　自力対応が大きな労力でない & 古いバージョンではサポートされないので未来方向

* Package対応
　こちらも未来に向けてはあるといいな～という気持ちです。

# まとめ

macOS対応という超デカイトピックがあったためADX2 LEを使うことができるクリエイターはかなり広がったと思います。
それ以外にも、Unityプラグインの使い勝手が良くなってきているようです。

ADX2の効能については、先日行われた「UnityAudio完全に理解した」勉強会にてこちらの発表を行っていますので、併せてごらんください。

サウンド実装の手間を省くための CRI ADX2 
https://www.slideshare.net/takaakiichijo/cri-adx2-unityaudio