作者別: ちゃ〜り〜

ワークユニットをマージする

複数のプロジェクトでそれぞれ作られたワークユニットがあったとします。

1つのプロジェクトにワークユニットを配置する

移動先のプロジェクトをCRI Atom Craftで開き、

元のプロジェクトの(エクスプローラ/Finder上)のWorkUnitsフォルダ内にある
ワークユニットフォルダを
CRI Atom Craftのツリー上の「ワークユニットフォルダ」へドロップします。

(Ver.3の場合は、移動先のプロジェクトの(エクスプローラ/Finder上)のWorkUnitsフォルダへコピーし、「未登録ワークユニットの登録」で認識させます。)

ワークユニットを2つ開く

ワークユニットがもし編集対象に含まれていない場合、アイコンがグレーになっているので、
右クリックメニューから「ワークユニットを編集対象に含める」を選択し、編集対象にします。

ワークユニット間でキューシートを移動する

CRI Atom Craftのツリー上のワークユニット内のキューシートをドラッグ&ドロップして、移動すると複製されます。

この時、参照するマテリアル及びマテリアル情報は移動しないため、参照マテリアルを移動しておきます。

マテリアルの移動方法

マテリアルは、右クリックで「エクスプローラで開く…」または「Finderで開く…」とすると、参照しているファイルがあります。
このフォルダ単位で移動するのが楽です。

まず、フォルダごと移動先のワークユニットのMaterialsフォルダにエクスプローラ上でコピーします。
この時、Materialsからのパスがずれないように注意します。

未登録ファイルの登録

コピーしただけでは、CRI Atom Craftが認識していないため、CRI Atom Craftのツリー上のマテリアルルートフォルダを右クリックし、「未登録ファイルの登録」を選択し、Craftに認識させます。

マテリアル情報の移動

元のマテリアルフォルダを右クリックし、「マテリアル情報CSVファイルのエクスポート」し、エンコード設定などの情報をCSV化します。

移動先のマテリアルフォルダを右クリックし、「マテリアル情報CSVファイルのインポート」します。

awbが変化する要因について

awbが変化する要因について

  • マテリアルのエンコード設定を変更した(ストリーム設定、サンプリングレート、ループ範囲、コーデック変更など)
  • マテリアルの参照先の波形の内容が変わった(波形エディタなどで元波形を加工した)
  • キューシートで使用するマテリアルが変化した(キューの削除でマテリアルへの参照がなくなった)
  • 全体設定の多言語化での代替言語を変化させた。(代替言語の参照するマテリアルを参照するように変化する)
  • 全体設定のターゲットコンフィグの設定を変更した。(デフォルトの設定などの変更)
  • トラックでの言語設定を変更した(キューシートに含まれるマテリアルが変化した)言語ビルドで(含む/含まれない)が変化します。
  • マテリアル側のパスを変更した(含まれるフォルダ名などを変更した) パスの名前でソートしてAWBに配置されます。
  • プロジェクトの暗号キーの変更、キューシートの暗号キーのタイプの変更

などが考えられます。

グローバル参照セレクタラベル

グローバル参照セレクタラベルは、

グローバル=全体設定 を参照するセレクタラベルで、セレクタに設定があります。

機能は

  • ACF読み込み時に、ツールで設定したセレクタラベルが使われる
  • プレーヤーでセレクタを設定せずとも、このセレクタを使っているトラックが再生される

ポリフォニックやスイッチなどで、セレクタを使用して、
トラックを選択する場合、再生前にプレーヤーにセレクタをセットする必要がありますが、

このグローバル参照セレクタラベルは、グローバル(全体設定)側を参照するラベルとして機能します。

プレーヤーにセットした場合

プレーヤーにセレクタをセットした場合プレーヤー側の設定が優先されます。

プレーヤーをリセットすると、グローバル参照に戻ります。

グローバル参照セレクタラベルを初期値にする

初期値として、設定しておくことで、再生時に「セレクタがセットされていないために再生されない」という状態を避けることができます。

  • ゲームエンジンなどで、セレクタラベルの設定が再生前に難しい(プレーヤーが存在しない状態での再生など)

に便利です。

全体へ影響するラベル付き変数として

ゲーム変数と似ている部分

ゲーム変数はグローバル(全体設定、ACF側)に値を持っていますが、
グローバル参照セレクタラベル」もグローバルに値を持っています。

  • 8個以上のセレクタを制御したい

8個以上のセレクタを制御したい場合はかなり特殊なケースですが、
プレーヤー側で操作せずに
プログラムから「グローバル参照セレクタラベル」をセットすることで、動的に切り替える事ができます。

一部キューシートのみインゲームプレビューしたい

インゲーム時のプレビューデーター更新

大量のキューシートがある時にインゲームビルドを行うと、転送にとても時間がかかってしまう場合があります。

その場合は、キューシートの「インゲーム時のプレビューデーター更新」のフラグを下げることで、

インゲームに含まない(実ゲームにあるデータ)でプレビューすることができます。

(次回のACBロード時の動作が変化します)

インゲーム対象のキューシートのみをフラグを有効にすることで、転送処理が省けて高速になります。

The parameter of audio data exceeds the player’s capability.

W2010091302:The parameter of audio data exceeds the player’s capability. (Increase max_sampling_rate of AtomPlayer or VoicePool up to 346015Hz.)

W2010110801:Specified frequency ratio exceeds the player’s capability. (Increase max_sampling_rate of AtomPlayer or VoicePool up to346015Hz.)”

といったワーニングが出る時は、

例えば

  • ピッチが高く再生されている

時に起こります。

特にランダムピッチや、AISACによるピッチ変更、元波形のサンプリングレートが高いなど、意図せず超えてしまう場合も考えられます。

初期化時のサンプリングレートの設定やデータ側の対応により解決できる場合もあります。

以下、SDKのdocumentationフォルダ内にあるCRIエラーマニュアルより抜粋

発生状況

再生しようとしている音声のサンプリングレートが高く、再生可能なボイスが存在しない場合に発生します。
346015Hz(状況により数値は変動)は、実際に再生しようとしたサンプリングレートです。
再生時のサンプリングレートは、音源自体のサンプリングレートと再生ピッチによる倍率の掛け合わせで決定します。
本警告が発生する原因は以下の通りです。

– ツール側で再生ピッチを高く設定している。
– アプリ側で動的に再生ピッチを上げている。
– AISACを使ってピッチ変更を行っている。
– 3Dポジショニング機能のドップラー効果を利用している。

(※1) 本警告が発生しても、音声の再生自体は行われます。ただし、意図したピッチでは再生されていません。
※1:3Dポジショニング機能では、リスナーが音源に近づく速度が大きいと、ドップラー効果により再生ピッチが上がります。

解決方法

ボイスプール作成時にサンプリングレートを高く設定してください。
具体的には、48kHzの音源のピッチを2倍に上げて再生する可能性がある場合、 ボイスプールのサンプリングレートを96kHzと設定します。
また、ツール側、アプリ側で設定に間違いが無いか確認してください。

Voice buffer underrun

W2015080610:Voice buffer underrun.

このメッセージがログに大量に出ている場合、
処理が間に合っていない可能性があります。

例えば、
– HCA-MX再生レートを極端にあげたり
– 高負荷時に極端に遅いメディアからストリーミングする

初期化時のD-BASの設定などにより解決できる場合もあります。

以下、SDKのdocumentationフォルダ内にあるCRIエラーマニュアルより抜粋

発生状況

音声データの供給が間に合わなかった場合に発生します。
具体的には、音声再生中にPCMデータの供給が不足したため、ライブラリ内でサウンドバッファのゼロ埋めが行われたことを示しています。
(出力波形が不連続になるため、ノイズとして聴こえる可能性があります。)

解決方法

何らかの理由によりストリーミング用音声データの供給が途切れた場合に本警告が発生します。
ストリーミング再生が途切れる要因としては、D-BAS作成時に指定したビットレート(CriAtomExDbasConfig::max_bps)を超えたストリーミングが行われているケース等が挙げられます。
https://www.criware.jp/support/criwarefaqs/print_qa.php?qid=61

本警告は「サーバ処理内で1V分の音声データを生成できなかったケース」のみが通知されます。
サーバ処理の呼び出し頻度自体が低いケースでは、音が途切れる場合でも本警告は発生しません。
(サーバ処理の間隔が1.5Vよりも開いた場合、本警告は出ませんが、データ供給自体が不足するため音が途切れる可能性があります。)

マテリアルCSVインポートの利用方法

マテリアルCSVインポートは、マテリアル情報をCSV出力/入力することができます。

主な用途は、新規にファイルを追加した時に、設定情報をCSVで用意することで、自動化などの応用や、外部テキストツールによる設定の一括置換などができます。

マテリアルルートフォルダは特殊

マテリアルルートフォルダをエクスポートしても
「インポート先がマテリアルルートフォルダ」になり、元のフォルダ「MaterialRootFolder」が展開されるので、
少し混乱するかと思います。

運用例

CSVとしては、マテリアルルートフォルダいかに目的別のフォルダをまず用意

例:BGMフォルダ

このBGMフォルダを出力して、インポートすることで正しく読み込めます。

マテリアルを管理するフォルダを作る

運用としては、マテリアルルートフォルダ直下にファイルを追加するのではなく、

フォルダを作成し、エクスポート/インポートするとうまくいきます。

Unity情報ファイルについて

2015年10月よりも前のADX2及びUnityプラグインのバージョンで

CriAtomProjInfo_Unity.csを利用したワークフローがありましたが、現在では廃止されています。

CriAtomProjInfo_Unity.csを使用しないように修正

 AtomWindowのキューの一覧などの情報表示処理が変わります。

 Assets\Plugins\Criware\CriAtomProjInfo\CriAtomProjInfo_Unity.cs廃止。

 ・主な変更理由

  • シンプルな構成(1つのフォルダで出力)では問題ないが、CRI Atom Craft Ver.2以降追加されたワークユニットなど多人数開発や、フォルダ階層の対応ができない。
  • マルチターゲット(iOS/Androidで別acf/acb/awbなど)対応ができない。

    →AtomWindowで表示するキューリストの情報取得するための任意フォルダが指定できるように変更されます。

    →「AtomCraftのACFビルド時のInfo.csからの情報取得」から「実行時に情報取得」に変更されます。

 補足:上記のような複雑な構成の場合は、通常、アプリ側でacf,acb,awbを管理しLoadもスクリプトで行われます。
シンプルなケースではAtomWindowは初回ユーザーや導入の流れでは今まで通りAtomWindowは使用することができます。

  • ツールバージョンとの依存性を下げることができ、Plugin側での拡張が容易になる。(ツールと合わせてしか内容が更新ができないためメンテナンスが煩雑になるため)

    →SDK2.17のツールより、C#ファイルの情報がCのヘッダーファイルと同様の情報が取得できるようになります。これにより、実行時でなくともビルド時のキュー名の取得が容易になります。

【旧仕様】

CRI Atom Windowを開いた時に
CRI Atom CraftでUnityを有効にしてビルドした時のAssets/Plugin/CriWare/CriAtom/CriAtomProjInfo_Unity.csを利用しキューリストの表示を行っていた。

【新仕様】 

【キューリスト取得方法】

CriWareLibraryInitializerの含まれるシーンを実行中AtomWindowの「Reload Info」ボタンを押すことで情報を取得します。

【フォルダを指定して表示する】

AtomWindowのユーザー任意のフォルダ(SearchPath)内にあるacf,acbファイルから情報を取得して表示します。
初期状態では今まで同様Assets.streamingAssetsを参照しています。

リミット処理のかかる順番と音が聞こえない条件

キューのリミット

キューを再生した時、そのキューがリミットされて再生されない条件はデータ側にあります。
このデータの設定は以下の順番で行われます。

  1. 多重再生禁止時間
  2. キューリミット
  3. カテゴリキューリミット

ボイスのリミット

ボイスが再生される時、そのボイスがリミットされて再生されない条件はデータ側にあります。

このデータの設定は以下の順番で行われます。

  1. ボイスリミットグループ設定のリミット
  2. ボイスプール数リミット

自動停止する機能

データ側でのリミット制御

  • 多重再生禁止時間でのリミット
  • キューのリミット
  • カテゴリキューのリミット、プライリティの優先度
  • ボイスリミットグループでのリミット

プログラム側でのリミット

  • ボイスプール数
  • ストリーム最大数

他に特殊なケースでデータ側設定で停止する例

  • トラックのMonoモード
  • ブロックの遷移時停止(ブロックを遷移させたタイミング)
  • ボイスビヘイビアのVol0時ボイス停止(ボリュームを0にした、AISACで0になった、ボリュームランダムで0になったなど)
  • セレクタによるトラック遷移の遷移時の停止(セレクタを切り替えたタイミング)
  • アクションによる停止(プレーヤー間、サウンドオブジェクトスコープ間)
  • オートメーションのボリューム0
  • キュー、トラック、ウェーブフォームリージョンのボリュームが0

再生される/されないが状況で変わる例

  • トラックに設定されたセレクタによる分岐(ポリフォニック、スイッチ)
  • トラックに設定された言語設定による分岐(ビルド時に含まれる/含まれないが決まる)
  • シーケンスタイプがランダム(トラックがランダムに選ばれる、空のトラックが含まれるなど)
  • キュー、トラック、ボイスの再生確率設定が100以下
  • ランダムの重み付けが100以下
  • スイッチでのゲーム変数が範囲外での再生
  • スイッチでのセレクタの設定が未設定での再生
  • トラックやウェーブフォームリージョンでのフィルター設定(フィルターがかかって聞こえない)
  • シーケンススタートマーカーを複数設定した時のランダムスタート(開始位置が再生時間よりうしろだと再生されない)
  • 外部キューリンクで、リンク先のキューが見つからない(外部キューリンク先のACBがロードされている/いない)
  • ブロックのタイミングで再度リピートするタイミングによるブロック切り替え(ぎりぎりのタイミングだと次の遷移機会に流れる)
  • ブロック再生による遷移先がランダム設定
  • AISACのランダムでボリュームが0など(鳴っているが聞こえない)
  • 距離減衰設定の最大距離が0
  • 距離減衰AISAC/角度AISACによるボリュームが0
  • 3Dポジショニング設定で最大距離より離れたソース
  • バスセンド先指定でバスが無いDSPバス設定に切り替えた
  • バスセンド先指定でマスターのセンド量が0(AISACやオートメーションも)
  • バスセンド先のエフェクトの設定でゲインが下げられている(フィルター要因など)
  • REACTでダッキングされた状態
  • ランタイムのエラー発生後に継続できない場合(ファイルシステムやリソース不足など警告やエラーが発生後など)

ランタイム側の処理で停止する(再生されない)例

  • ボイスプールが1つしか無いものの再生時(ボイスプール数によるリミット、リモコンや特殊デバイスなど)
  • フェーダーのアタッチされたプレーヤーで再生(前回再生音が停止)
  • 再生中のACBを解放した
  • 存在しないキューを再生した(キューが見つからない)
  • オーディオデバイスが切り替わった(ヘッドフォンをさした、HDMIポートのオーディオ出力に切り替わった)
  • BGMカテゴリの再生で、カテゴリ設定が鳴らなくなる(BGMカテゴリはランタイムでの設定)
  • ASRラックの指定(配信不可能サウンドなど)
  • DSPバス設定切り替え、スナップショット切り替え(停止はしないがエフェクトの種類によってはノイズになる可能性あり、ディレイ系など)
  • ボイスプールが用意されていない(再生時に警告あり)

停止しない機能

他のシステムなどでは1音のみ再生だったりするものもあるので補足

  • 初期状態でのプレーヤーによるキューの再生(ボイスプールがある限り、リミット処理がかからない限り多重再生)

フェーダーをつけたりしない限り、一つのプレーヤーで複数の音を再生可能です。

停止要因の確認について

プロファイラーを使うことで、直前に再生されたキューなどから、ある程度の要因がつかめます。

 

エラーもなく音が鳴らない5つの要因

HCAの再生時間を知りたい

エンコード済みのHCAを単体再生させるなどの用途にて、HCAの再生時刻を知りたい時があります。

CriAtomEncoder.exeに読み込むことで内容を確認できます。

音声ファイルリストを出力すると、CSV形式(テキスト)で情報を取得できます。

距離減衰の最大、最小の最適な値は?

3Dポジショニングで再生する

ボイスのパンタイプが「3Dポジションニング」または「オート」にして、キューの距離減衰設定を設定することで、リスナー位置と向き(通常はカメラ位置にプログラムでセットする)から自動で、減衰と音源方向が設定されます。

なお、
プログラムで3Dソースをプレーヤーにアタッチして、毎フレーム更新するといった操作が必要です。

ゲームエンジンの場合は、3Dのフラグをインスペクタで指定すると内部で自動で座標更新などが行われます。

音量の場合

  • 距離減衰の最小= 設定の音量でなる距離
  • 距離減衰の最大= 音量が0になる距離

3Dポジションのソースの位置から、どれくらい遠いかでボリュームの減衰が決まります。

距離減衰ASIACの場合

  • 距離減衰の最小= AISACコントロール値0.000の設定
  • 距離減衰の最大= AISACコントロール値1.000の設定

3Dポジションのソースの位置から、どれくらい遠いかでAISACの効果が決まります。

距離によって好きなカーブがかけるため、近くの音が小さいとかもできます。
AISACなので、音量だけでなく、遠くだけBusセンドレベルをあげて、リバーブをかけるなどもできます。

AISAC範囲 0.00~1.00, 減衰距離最小(開始距離)~ 減衰距離最大(無音になる距離)

距離減衰の最大、最小の最適な値は?

一概に決められない。ゲームによってさまざまです。

ゲームのスケール感に合わせるのが都合が良いです。

例えば、ゲーム内でみわたした時、見えているのに音がしないと不自然な場合があります。

適当に最小距離を1(メートル)、最大距離を30(メートル)といった設定から初めて、

ゲームで動かしつつ調整する。

実際(リアル)の距離減衰は?

何もない空間で、距離が離れると音が小さくなります。

これは、物理的なカーブが想定できます。

実際には、床や壁など反射するものが多くあります。聞いている人の体や耳の形でも反射します。耳をむけた方向によって音も変化します。

ものが多くある部屋などでは減衰を感じとれない場合があります。

また、よくある比較ですが「蚊の飛ぶ音」と「ジェット機のエンジンの音」など、距離が離れていても聞こえ続ける音か、そうでないかは、元の音の音量に依存するのですが、デジタルの表現ではダイナミックレンジに限界があります。

現状では、ゲームの状況に応じて手心でパラメータを調整するのが良いでしょう。

距離減衰開始距離

通常は

  • 音源のパンの明瞭度(インテリアパン)が1.0=距離減衰開始距離

になるのですが、

  • インテリア距離よりも近くから減衰を開始させたり
  • インテリア距離よりも遠くから減衰を開始させたり

といった調整が可能です。

(なお、現状ではプログラムだけでの設定になります。)

向きに応じて音を変化させる

距離と同様に向きによっても音が変化します。

前からなる音、真横、真上、真後ろなど変化。

これは

  • リスナー基準角度=リスナーからみて音源がどの角度にあるかによる音の変化
  • 音源基準角度=リスナーに対して音源が向いている方向による音の変化

を組み合わせて設定します。

リスナー基準角度AISAC

これは、例えば、後ろ側に音がまわったら音量を下げたり、フィルターでこもらせたり、真横なら明瞭度をあげる、

カメラの画角よりはなれたらこもらせるなど演出的なものなど、さまざまな設定が可能です。

AISAC範囲 0.00~1.00,角度-180~180

音源基準角度AISAC

音源(ソース)が向いている方向が大きく、後ろ向きなら小さくといった設定が可能です。

AISAC範囲 0.00~1.00, 角度0~180

キャラごとにアクションを発行したい

アクション機能

CRI Atom Craftでアクショントラックを作り、トラックへキューをドロップすることで、キューに対する操作(アクション)をタイムラインで実行する機能があります。

再生中のキューすべてにアクションがかかる

アクションは、再生中のキューに対して操作を行います。

基本的には、再生中のすべてのキューに対して同じ効果が発動します。

キャラクターごとにかけたい場合

アクショントラックで「スコープ」を「全体」にするか「サウンドオブジェクト」にするかを選べます。

サウンドオブジェクトは、プログラム上で「プレーヤー」を紐付けることができます。

プレーヤー

プレーヤーはキューをセットして再生するもので、キャラクターごとに作ると良い。

(他にBGM用プレーヤーとかあってもよい)

UE4でいうところの「アクター」やUnityでいうところの「GameObject」的なもの。

サウンドオブジェクト

サウンドオブジェクトで関連付けられたプレーヤー同士でアクションを反映させることができます。

サウンドオブジェクトとキャラクター用プレーヤーを1対1で用意します。

これで、キャラクターで再生するアクションのスコープが「サウンドオブジェクト」となっていれば
他のキャラクターに影響せずにすることができます。

他のキャラクターに影響するとまずい例

例えば武器のギミックで、チェーンソーみたいな音をアクション経由で操作する場合、

  • チェーンソー再生
  • チェーンソー停止&停止サウンド再生

といったアクションを持つキューがあった場合、

2人以上のチェーンソーを持った人が現れた場合などに、取り合いになる。

まとめ

サウンドオブジェクトとプレーヤーをキャラクターごとにもたせて、キューを再生すると
そのサウンドオブジェクトのスコープでキューのアクションが有効になります。

エラー出力がたくさんでてきたら、先頭のエラーをまず確認しよう

エラーやワーニングが何行も連続してログにでている

エラーメッセージがいくつも連続して出力される場合があります。

このような時は、最初におこったエラーから芋づる式にエラーが発生している可能性があります。

たとえば、

  • 最初のエラーでファイルアクセスに失敗したりして、その後のセットアップでのエラーが続出したり、
  • ファイルのフォーマットが異なるものを読み込み、失敗したりして、

といった感じで、実は後段のエラーを解決しても意味がない場合があります。

まず、時系列で最初に起こったエラーの解決をすることが重要です。

波形をドロップする先で配置場所がいろいろ変わる

CRI Atom Craftのドラッグ&ドロップ操作

マテリアルとは?

マテリアルツリーに登録されている波形のことをマテリアルと呼んでいます。

このマテリアルのドロップ場所によっていろいろ動作が違います。

マテリアルをキューシートへドロップするとキューが作成できます。

ツリーのキューシートへドロップするとマテリアル名でキューが生成される。

マテリアルをトラックへドロップすると先頭に配置されます。

トラックの先頭にウェーブフォームリージョンが配置される。

波形の出だしに登録することはよくあるので、この操作はおすすめ。

マテリアルをタイムラインへドロップすると、ドロップしたタイミングの位置へ配置されます。

タイムラインの任意の時刻へ配置される。

タイムラインの拡大率や、タイム設定などに依存してスナップします。
Ctr+ドラッグで、スナップなしで配置もできます。

キューへドロップすると、トラックとウェーブフォームリージョンが追加されます。

トラックがなかったら追加します。

ブロックのあるキューへドロップすると波形の長さでブロックが作成されます。

ブロックが1つでもあるキューの場合、動作が少し違います。