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つでもあるキューの場合、動作が少し違います。

DSPバス(ミキサー)は一つを切り替え

DSPバス設定は何に使うのか?

DSPバス設定は、いわゆるミキサーになります。

DSP=DigitalSignalProcess

デジタル信号処理を行うバス(ミックス先)になります。

このバスが複数あって、連結されたものをミキサーと呼びます。

デジタル信号処理=エフェクト

デジタル信号を変化させることで様々な音響エフェクトをかけることができます。

リバーブなどで、空間の広がり感を加えたり、コンプレッサーで音を潰して迫力を増したり、様々なことが可能です。

DSPバス設定(ミキサー)は一つ

DSPバス設定(ミキサー)はADX2実行時通常は一つのみ存在し、切り替えが可能です。

DSPバス設定を切り替えると、音のルーティングががらっと変わります。

キューからはゆるくつながっている

キューはどのバスへどれだけセンドするか?といった設定だけ持っています。

どのDSPバス設定で鳴らすかという情報は持っていません。

例えるなら、キューとミキサーは、ギターとギターアンプのようなもので、ギターアンプの設定を変化させるのがエフェクトの変化のような形です。

ギター側を変化させるのはキューの設定やフィルターをいじっている状態。

スナップショット

ミキサーの設定は各バスの信号の流れや、それぞれのバスの音量、エフェクトのパラメータなどさまざまな設定を持っています。

これらのすべての設定値をスナップショットという形で記録して呼び出すことがよくあります。

スナップショットはなめらかに変化する

スナップショットによる切り替えは、ルーティングは変化しない変わりに、エフェクトのパラメータやボリューム変化を時間をかけてなめらかに変化させることができます。これによる不適切なノイズなどを軽減させることができます。

DSPバス設定を切り替える行為はノイズになりやすい

スナップショットではなくDSPバス設定を変更すると、音のルーティングが変わります。ただし、音が鳴っている状態で、

ギターアンプを違うものに瞬時に置き換えたら、大抵は不適切なノイズが発生します。

なるべく発音中ではないタイミングで切り替えるか、スナップショットでパラメータだけでなんとかするようにします。

実はDSPバス設定を複数使うこともできる

特殊な用途ですが、ASRラックという機能を使うことで複数もたせることもできます。

ASRラック=AtomSoundRendererラック

ラックとは、ミキサーを設置しておく入れ物のようなものです。

ASRはAtom AtomはADX2のモジュール名です。

どんな時に使いますか?

例えば、ゲーム配信用バス、3Dオーディオデバイスバス、パッドスピーカー、複数サウンドボードで個別になど
物理的に別な経路で信号を処理する場合に、別ラックがあります。

ラックの指定方法は?

パラメータパレットでラックを指定することができます。

例えば、パットスピーカーなら、別のDSPバス設定を通してエフェクトをかけて鳴らすといったことができます。

Androidの低遅延再生も「サウンドレンダラー」指定

Androidの低遅延再生は「サウンドレンダラー」でNaitive指定ですが、

ある意味DSPバスを持っていないラックのようなものです。
低遅延優先のため、エフェクトすらかからない、直接ハードのサウンドを叩く。

例えるなら、ラックにぽつんと音源モジュールが落ちていて、そこへ繋いだ感じになります。

 

パラメータパレットって何?

特殊パラメータの拡張設定用途で使うものです。

上記のような、特殊なデバイス指定などに使います。

他にもプレーヤーフェーダーをつけたりといったことができます。

プレーヤーフェーダーを設定するとどうなる?

プレーヤーフェーダーはビート同期で切り替える時にフェーダー処理をかけるといった用途に使います。

もし、プログラムでフェーダーをつけてなかった場合に、データドリブンでフェーダーをつけてくれます。

プレーヤーフェーダーって何?

プレーヤーフェーダーは、本来プログラムで設定する項目で、プレーヤーに対してフェーダーをアタッチすることで、キューを再生するとクロスフェード効果を発生させるものです。クロスフェードのパラメータをプログラムから細かく設定できます。

古いSDKにピンポイントで対応できます!

SDKのバージョン?

SDK = SoftwareDevelopmentKitの略

ゲームエンジン、プラットフォームの組み合わせは多数あります。

これらは、何らかのバージョンがあり、これらが正しくないと動作しません。

また、新しいものは機能が増える傾向があり、古いものにはバグが潜んでいる場合があります。

古いSDKでバージョンを固定する場合がある

よくある話で、開発開始時にこれらのバージョンを固定して開発をすることがよくあります。

これは、新しいものが必ずしもプロジェクトが求めているものではないことがあったり、
すでに運用中のものは無用にバージョンをあげることを避ける傾向があります。

SDKの新しいものを使うのが良いのですが・・・

基本的には新しいものを使うのが良いのですが、そうはいかない場合もあります。

そんな時は気軽にお問い合わせください。

たとえば、古いSDKであったり、古いプラットフォームバージョンであったとしても、対応可能な場合や、対処方や回避策などがある場合があります。

初めてミドルウェアや、ゲームエンジンを使うなど

初めて使うゲームエンジンであったり、新しいプラットフォーム、前例のないシステムでサウンドの扱いをどうすべきかなど、
この端末ではどうなのか?このミドルウェアと組み合わせるとどうなるかなどといった
何か困ったことや調査が必要あればCRIが可能限りサポートします。

何か、使い方がよくわからない、独自のシステムで問い合わせるべきか悩むようであれば、とりあえずご一報ください。

みなさまと一緒に、開発の一員と思ってミドルウェアを活用していただければ幸いです。

問い合わせ先

https://www.criware.jp/support/index.htm

ボリューム0のボイス消費を減らしつつ復帰させる

AISACでボリュームを0にしても発音している?

AISACなどでボリュームを0にした時など、音が聞こえなくなる状態になった場合でも、内部的には無音で再生が行われ続けています。

デコード処理

音声圧縮する=エンコード

音声を展開する=デコード

エンコードはツールでデータを作る時に行っていて、デコードはゲーム上で再生時にリアルタイムに行われます。

ボリューム0でもデコードやボイスの監視処理はし続ける

圧縮波形のデコード処理やボイスの消費は行われ続ける意味になります。

音量が0で聞こえない音が鳴っている

デコードした結果に対してボリューム0が掛け合わされて音が聞こえていないという状態です。(いつでもすぐにボリュームが上がったら鳴らせる準備をし続けています。毎オーディオ処理)

音は聞こえていないのに、デコードをし続けているのはCPUの負荷がかかって勿体無いと感じる時があるかと思います。

ボイス処理も行われている

聞こえていない音であっても、ボイスリソースを確保しているので、ボイス数やボイスリミット(プライオリティの低い音は消える)などは維持し続けています。

仮想ボイスで回避する

そんな時は、ボイスビヘイビアから「仮想ボイス」を選択することで、ボイスの処理負荷を軽減することができます。

とくにボリューム0になるような演出が多い時に設定しておくと良いでしょう。

20150311VirtualVoice

通常モードは、何もしない

何もしないということは、ボリューム0でも音がなり続けます。

ボイス数も使い続けます。

ボイス停止

ボリュームが0になったらボイス停止をしてボイスリソースを解放してくれます。

  • オートメーションのボリュームで音が小さくなって消えたり。
  • 距離減衰で音が小さくなって、ある距離で止める。

停止してしまうので、復帰はできません。

遠ざかって、音が聞こえなくなって消えてしまって構わないような音に使います。

仮想ボイス

ボリュームが0になると音が止まり、その後にボリュームが上がると時間経過したところから再生復帰します。

仮想ボイス時はボイスリソースを解放してくれます。

厳密に同期ではなくなる

注意点として、復帰する時に再度再生する形(眠りから目覚める形)となるのでタイミングが若干ずれてしまう場合があります。

これは、シークして再生をするのですが、再生には若干のずれが発生する場合があります。

  • 厳密に音楽などが同期がとれていないと不自然なもの
  • 口パクなどずれていると微妙なもの

には使えません。厳密同期したい場合は「通常モード」で、音量0で鳴らし続けて、音量をあげる方が良いです。

仮想ボイスリトリガー

ボリュームが0になったらボイス停止をして、その後にボリュームがあがると、頭から再生しなおします。

  • 距離減衰などで0で止まるけど、もういちど近くにきたら鳴ってほしいけど、また頭から再生しても問題ない音

などにつかいます。

オーサリングツールを使わないコンバート(コマンドラインからビルドする)

CIツールやJenkins、バッチ処理など、コマンドラインから起動してビルドができます。

Windows Ver.2の場合

  • CriAtomCraft.exeに引数を指定する。 (ログの文字コードがUTF-8)
  • CriAtomCraftC.exeに引数を指定する。 (ログの文字コードがShift-Jis)

マニュアル(要アカウント)

Mac Ver.3の場合

  • CriAtomCraft.app/Contents/MacOS/CriAtomCraftに引数を指定する。

コンバートのための設定

あらかじめプロジェクトを用意する必要があります。

  • 全体設定(ACFに書かれる設定、DSPバスルーティング、カテゴリやAISACコントロールなど)
  • 波形ファイル(ACBの参照する波形ファイル、マテリアルのフォルダ下に用意する)
  • ワークユニット(最低でも一つ必要。通常は生成されている。)

すでにGUI(通常起動版)上で生成されていれば、CUI(コンソール、コマンドライン)からでもビルドが可能です。

 

以下の情報はテキストから生成可能です

  • キューシートCSV(ワークユニットへ追加可能。カテゴリ設定やキューの設定など。省略は不可。)
  • マテリアル情報CSV(マテリアル情報を追加可能。マテリアル情報は圧縮設定など。省略は不可。)

これらの設定情報と、マテリアルの参照する波形を用意することで、ある程度自動的にデータを追加することが可能です。

あらかじめGUI上でキューシートやマテリアルを作成していない場合でも、上の情報と波形ファイルを用意できれば、
GUIを起動せずにコンバートが可能になります。

 

ADX,HCAを直接再生もできます

キューシートやキューなどのパッケージ化をせずに、昔ながらの直接データ再生も可能です。
(一長一短ですが)

すべての管理をプログラムで行った場合の方がスマートな場合など、直接再生するのも手です。

adxやhcaのまま再生する

Androidでターゲットプレビューする

Android版のSDKでは、CRI Atom Craftでの実機プレビューのためのプレビューアプリを、以下の場所にapkファイルとして収録しています。

  • \cri\tools\criatomex\TargetViewer\android\AtomPreviewer_ANDROID.apk <- このフォルダはターゲット別のSDKに含まれています。

プレビュー手順

  1. AtomPreviewer_ANDROID.apk を対象の端末にインストールして「AtomPreviewer」を実行してください。
  2. CRI Atom Craftを開きます。
  3. プロジェクトを読み込むか、新規作成します。
  4. 「ツール」メニューの「プロパティ」から、Androidのプレビュー設定に適切なIPアドレスを設定します。
  5. GUI画面右上の「プレビューターゲット」を「Android」に変更します。
  6. プレビュー再生を実行すると、Android開発機上で音が再生されます。

iOSでターゲットプレビューする

iOS版のSDKでは、CRI Atom Craftでの実機プレビューのためのプレビューアプリを、以下のディレクトリにXcodeプロジェクト(AtomPreviewer.xcodeproj )として収録しています。
(プレビュワーアプリは以下のディレクトリのみでビルドできるようになっています。)

  • cri/tools/criatomex/TargetViewer/ios <- このフォルダはターゲット別のSDKに含まれています。

プレビュー手順

  1. プレビューアプリのXcodeプロジェクト(AtomPreviewer.xcodeproj )を開いて、通常のアプリ開発と同様の方法でプレビューアプリ起動してください。
  2. CRI Atom Craftを開きます。
  3. プロジェクトを読み込むか、新規作成します。
  4. 「ツール」メニューの「プロパティ」から、iPhoneのプレビュー設定に適切なIPアドレスを設定します。
    (プレビュワーアプリに表示されているIPアドレスを参考にしてください。)
  5. GUI画面右上の「プレビューターゲット」を「iPhone」に変更します。
  6. プレビュー再生を実行すると、iOS開発機上で音が再生されます。

プレービュー時のIPアドレス設定について

プレビューは同じネットワークであればWindowsでもつながります。

Xcodeでのビルドについて

XcodeでiOSビルドし端末にインストールするところはいろいろ大変なので、プログラマさんにお願いすると良いです。

ADX2での再生方法

ADX2では基本的に「プレーヤー」で再生します。

再生手順

  • プレーヤーにキューをセットする
  • プレーヤーをスタートする

ボイスの確保タイミング

プレーヤーにキューをセットしても、名前だけがセットされているだけの状態で、
実際のボイスの確保はプレーヤースタート時に行われます。

プレーヤーとキューとボイス

  • プレーヤー = 再生機器
  • キュー = メディア(楽譜)
  • ボイス = キューから複製(インスタンス)された演奏音

プレーヤーのセットアップ

  • セット(キューをセット)

プレーヤーのコントロール

  • スタート(キューをスタート)
  • ストップ(キューを停止)
  • ポーズ(キューを一時停止)
  • ポーズを解除(キューの一時停止状態を解除)

プレーヤーのコントロールは即時に反映されます。

プレーヤーのパラメータの制御

  • ボリュームをセット
  • ピッチをセット
  • AISACコントロール値をセット
  • アップデート(積んでいた設定を更新し、すでに再生済みの音に影響させる)

といった感じで、アップデートで再生中の音にも影響を与えます。

キューをセットしても、再生中の音が瞬時に切り替わるわけではないのと似ています。

プレーヤーは多重再生がデフォルト

ゲームエンジンなどプレーヤーとは異なり、一つのプレーヤーで複数再生が可能です。

ただし、フェーダーをアタッチしたりした場合は、切り替え式に再生されます。(一時的に2音までの基本1音再生)

リソース確保の遅延を最小にしたい

もし、ストリームなどの準備の遅延を最小限にしたい場合のテクニックとして、

  • プレーヤーをポーズして、スタート (スタート状態の先頭で止まった状態)
  • プレーヤーのポーズを解除

といった技もあります。

エンベロープと発音制限

停止時のノイズを避ける

発音制限が行われると、音が「ブツ切れ」になることがあります。
こんな時に、サンプラーなどにあるような、エンベロープのリリースがあると便利です。

ADX2ではボイスレイヤーにADSR相当のボリュームエンベロープの機能があります。
(キューには無いので注意)

これは、音が停止した際に、リリース時間をかけて、音が自動で減衰していく処理などがおこなえます。

音が止まる時の発音数

この音が止まる時の発音数としては

  • ボイスの制限数に達した場合
  • キューの発音リミットに達した場合
  • ボイスリミットグループの制限に達した場合

などが考えられます。

キューの発音リミット数に達した場合でも、ボイスのリリース時の発音は重なりが多い場合、ボイス数が枯渇してしまう場合があります。

つまり、オーバーラップ分の制御も必要になります。

ボイスのリミットと、キューのリミットの関係

ボイスのリミットと、キューのリミットの関係を今一度検討する必要がでてきます。

  • ボイスのリミット = ボイスプールの数、ボイスリミットグループのリミット数
  • キューのリミット = キューのリミット数、キューの所属するカテゴリのキューリミット数

ざっくりと、

キューリミットで、全体の発音数を設定(これ以上ならなくて良いという演出上のアバウトな設定)
ボイスリミットで確実なリソース数の制限(ストリーム数や処理負荷など処理スペック要因でのリミット)

を行います。

設定例

例えば、曲再生などで、少し長めのリリースなどがある場合には、

  • BGMカテゴリのキューリミット数を1(制御として1曲だけ鳴らしたい)
  • ボイスリミット数を2、ストリーム数を2(リリース分含めて)

こうすると、プログラムから再生リクエストがきた時、自動でリリース付きで停止しつつ、次の発音開始が入り、
一時的に2音再生している時に対応しつつ、演出上の発音数を1に抑えることができます。

間違った設定例

ボイスリミットが1で、キューリミットが2といった場合、
ボイスの後着優先で、前の音がブツ切れ(リリースなし)で奪い取られてしまう。

AISACコントロールの強弱関係

AISACコントロールには強弱関係があります。

カテゴリにあるAISACコントロール > プレーヤーのAISACコントロール > キューのタイムラインにあるAISACコントロールのオートメーション

これらは、一度でもプログラムから設定をしてしまうとその設定がずっと有効になります。

カテゴリ

特にカテゴリへの設定はとても強いため、AISACコントロール名(値)をカテゴリ専用にしておくことをお勧めします。

例)距離減衰用AISACコントロール DistanceForCategory

プレーヤー

プレーヤーの場合は、プレーヤーをリセットすることで解除できます。