月別: 2017年11月

AとBの曲をコントロールする12の方法

[難易度:低]
AかBかCかわからないが、再生している時、Bが再生されたら再生中のものをフェードアウトしてほしい場合

  • Aにエンベロープでリリースを設定する。
  • AとBを同じカテゴリにして、カテゴリリミットを1音にする。
    プログラムは任意のタイミングでA,Bをリクエストするだけになる。

[難易度:低]
Aが再生している時、Bが再生されたら、一時的にAを音量を下げて、Bが終わったらAの音量が上がってほしい場合

  • REACTを使う。
  • AとBを別のカテゴリにして、変化カテゴリAとトリガーカテゴリBを設定。
    サンプルプログラムの場所:/cri/pc/samples/criatomex/category_with_react
    プログラムは任意のタイミングでA,Bをリクエストするだけになる。

[難易度:低]
AかBかCかわからないが、再生中の時だけフェード処理をしてほしい場合

  • プログラムでフェーダーをプレーヤーにアタッチする。
    サンプルプログラムの場所:/cri/pc/samples/criatomex/crossfade_playback
    プログラムは任意のタイミングで設定したプレーヤーでA,B,Cをリクエストするだけになる。

[難易度:中]
AとBがクロスフェードの関係にある場合

  • AISACを使う。
  • AとBを同じキューの別トラックに用意し、それぞれ同じAISACでコントロール可能なボリュームカーブを書く。
    サンプルプログラムの場所:/cri/pc/samples/criatomex/control_aisac
    サンプルプログラムの場所:/cri/pc/samples/criatomex/tween
    プログラムではAISACをコントロールすることで、切り替えが可能。

[難易度:中]
AとBとCがクロスフェードの関係にある、且つ、曲の長さが同じで、同じ再生場所にクロスフェードしてほしい場合。

  • セレクタによるトラック遷移を使う。
  • AとBとCを同じキューの別トラックに用意する。(A,B,Cは同じ長さ)
    サンプルプログラムの場所:/cri/pc/samples/criatomex/playback_track_transition_by_selector
    プログラムではセレクタラベルを変更するだけで切り替えが可能。

[難易度:中]
AとBとCがクロスフェードの関係にある場合、且つ、曲の長さが異なっていて、頭出しで良い場合。

  • ブロックを使う。
  • キューにABCブロックを用意する。
    サンプルプログラムの場所:/cri/pc/samples/criatomex/playback_block
    プログラムではブロックのIDを変更するだけで切り替えが可能。

[難易度:中]
Aが再生しているときBを再生したらAをフェードアウトし、Bを止めたらAを再生する場合

  • アクショントラックでB再生時のアクションでAをのボリュームを下げる。
  • Bを止めるアクションで、Aを再生する。
    プログラムはそれぞれのアクションキューをリクエストする。

[難易度:中]
AとBとCがビートに同期して切り替わって欲しい場合

  • セレクタによるトラック遷移を使う。
  • AとBとCを同じキューの別トラックに用意する。(A,B,Cは同じ長さ)
  • ビート同期情報を追加する。
    プログラムではセレクタラベルを変更するだけで切り替えが可能。

[難易度:高]
AとBとCが別のキューだけど、ビートに同期して切り替わって欲しい場合

  • 各キューにビート同期情報を設定する。
  • 各キューを再生するアクションキューを用意する。
    プログラムでは同じプレーヤーでこれらのアクションキューをリクエストするだけで、ビートに同期して切り替わる。

[難易度:低]
Aが再生終わったらB、Bが再生終わったらCと再生する場合

  • キューの再生モードをPlayListに変更する。
  • ABCをトラックに設定する。
    プログラムではキューを再生するだけで、順番に切り替わって再生される。

[難易度:低]
AかBかCか順番が固定ではないが、連続して再生する場合

  • プログラムでシームレス連結再生をする。
    サンプルプログラムの場所:/cri/pc/samples/criatomex/seamless_palyback

[難易度:低]
AかBかCかわからないがそれぞれ個別にボリュームを変えて再生したい場合

  • ABCをカテゴリをそれぞれ別に設定する。
    サンプルプログラムの場所:/cri/pc/samples/criatomex/category
    プログラムではカテゴリに対してボリュームを変更する。

[余談]実際のゲームでの音楽の再生シチュエーションは12のパターンですら網羅できるものではなくもっと多くの組み合わせが存在します。
これらは、プログラムで行う場合やデータ側で制御する場合、両方で使う場合といろいろ考えられます。
より複雑な制御についての考える時に、既存の技術でできないものに対してのみプログラムで行い、
できものはなるべくデータ側で済ませてしまうのが良いかもしれません。

波形解析する

少し音響処理系の話ですが、フィルターコールバックというのを使うことで、波形の解析ができます。スペクトラム解析結果を表示したり、波形を表示したりといったことができます。

詳しくはフィルターコールバックのサンプルやマニュアルを確認してみてください。

[余談] イコライザー表示とかレベル表示したいなどといった場合にもADX2ならプレーヤーやバスでこのフィルターコールバックという機能を使うことができます。簡易な口パク制御とかにも応用できます。 他にも波形をメモリに書き出したり、転送したり、ゲーム内で生成したプロシージャルな音を混ぜ合わせてみたりといった用途にも使えるかもしれません。

adxやhcaのまま再生する

昔ながらの再生(データ直接再生)

単純に、adxやhcaのまま再生もできます。

ただし、プログラムでのセットアップが少し必要になります。

初期化時に再生用のボイスプール用意し発音数や最大再生レート、
どのバスへ流すかなどConfig設定をする必要があります。
カテゴリとかの設定も再生用プレーヤーを用意しプログラムで動的に設定するとか、データだけで解決できない代わりに
プログラムからいろいろできるようになります。

ただし、すべてプログラムで再生となると、初期設定が膨大になります。
エフェクトの設定など、最低限のDSP設定(バスルーティング)などCRI Atom Craftで作成し、コンバートしたACFなどで設定したものと組み合わせるのが良いかもしれません。

モダンな機能(ダッキングとかエフェクトとか)も使いたい場合

1キューシート1キュー(1acb1キュー)みたいな形で使っている例もあります。
必要な時にキューシートでロードして、不要になると破棄など
そのロードや破棄はアプリ側で他のアセットとかと同様に管理しているので、
サウンド的に負担が増えるわけではない場合など、サウンド側ではあえてパッキングしないというやり方もあります。
キューシートにする理由は、ボリューム調整やカテゴリなどの設定をデータ側で行う目的があります。

特にカテゴリは、プログラムと、データ側とで共有のボリュームであるため、プログラムでいじるか、データでいじるかをあらかじめ決めておくと良いです。(キューにはカテゴリを多重登録できます)

Sofdec2にみるパッキング例

ADX2の姉妹品であるSofdec2など、ムービーなどの再生などはパッキングではなくそのままsofdecのファイル再生をプログラムで行います。(別途ファイルマジックにて複数ファイルのパッキングも可能)

ADX2ではどちらも可能

サウンドはとくにファイルの数が多いため、あらかじめパッキングやボリューム調整、エフェクトバスへのルーティングなど設定項目をしたものを渡すことでプログラムでの負担を軽減できています。
が、プログラムでもほとんどのことが可能です。

昔話

ADX1の時代(DC,PS2,GCなど約20年くらい昔の話)の頃はacbファイル単体で再生するのが主流でした。
(音楽や効果音はハードウェアに内蔵の専用音源チップがありMIDI的な制御で鳴らしていたりしていました。)


せいぜい数本の声(ボイス)の再生のためにストリーム再生とファイルの裏読み込みがやっとといった時代でした。
(今よりもずっと扱う音数は少なく、サイズは小さく、でもメモリも小さかった)

atomでいうとExがついていない、無印の関数群などはその名残があります。

短時間に破壊する音を作る

短時間に破壊される音が、同じ音でも良いのですが、フランジャーのエフェクトのような音になったりします。

ランダムで回避もある程度可能ですが、全く異なる音を鳴らした方が都合が良い場合もあります。

「シーケンシャル」を使うとよいです。

「シーケンシャル」はリクエストのたびにトラックを順番に鳴らしていくことができます。

連続ヒット音をデザインする

キューをドロップする場所によってできるデータが変化する

波形をドロップする場所によって、出来上がるデータが変化します。
キューシートにドロップすればキューとして登録される。
ワークユニットフォルダ(キューシートのあるフォルダ)にドロップすれば1キューシートに1キューとして登録されます。

1アクションでデータが作れる

キューにドロップすれば、トラックを複数持った形で登録でき、そのままポリフォニック再生やランダム再生に切り替えたりといった作り方ができます。

異なるバージョンでの再生について

エラーが無いか全音再生してログを確認する

出力したバイナリ(ACF,ACB)は、基本的に最新のランタイムバージョンでロード、再生が可能です。
CRI Atom Viewerでロードして、再生した時に問題がある場合は警告がログに出力されるので確認ができます。

そもそも音がおかしい

音がキュルキュルと鳴る

オートメーションでAR,RRをセットする?

オートメーションとは?

タイムラインに合わせてパラメータを自動で変化させる機能です。
もともとはデジタルミキサーなどでのフェーダー操作などをレコードしておくなどの機能で、DAWなどではよく使われます。

AR,RRとは?

AtackRate (アタックレート)= 立ち上がりの音量変化
ReleaseRate (リリースレート)= 終わりの減衰の変化

シンセサイザーなどで、音のなり始めや終わりに「ブツッ」といった音が鳴らないようにするために、また、音色の変化としてのパラメータとして使われます。

AR,RRで音色作り

音色の例では、リリースを長くすることで、空間の広がりや余韻感を出したり、
立ち上がりを遅くすることで、ストリングスのようなアタックのやわらかい表現ができます。
立ち上がりの早い音と組み合わせるなどで、うまくバランスをとることができます。

オートメーションでAR,RRをセット

オートメーションを使って、ボイスにかかるエンベロープのAR(アタック時間)RR(リリース時間)を設定するといったことができます。

キューにかけると下位にあるトラック内のボイス全てにAR,RRが影響します。

シンセ(楽器的)なAR,RRの設定値について

AR=AttackRateで、アタックにかかる再生レートという意味で一般的なシンセでは扱われていますが、
ADX2でのエンベロープは再生時間指定で、時間は固定時間になります。(再生ピッチなどに連動しない方式)
ピアノのような打楽器をシミュレートして、高い音は減衰を早くなどといった場合は、このリリース時間をピッチと連動するAISACなどで変更させ
るなどで良いでしょう。

足音の変化にも使える

リリースなどを状況に応じて変化させる理由の一つとして、バリエーションを増やす役目もあります。足音など当たり方によって音の減衰がランダムに変化するなど自然現象をシミュレーションする方法としても使えるかもしれません。

UE4やUnityで大量の音声を扱う(効率の良い呼び出し方)

UE4

UE4ではUnrealEngineEditor上で使いたいキューシートだけインポートすると良いです。

大量の音声などの場合はC++から呼び出すと良いです。
キューシートはContentsフォルダ内に置いてロードして再生します。
この時CriWareApiといったエントリなどから呼び出す必要があります。詳しくはマニュアルを参照してください。

 

Unity

Unityでもシーンで使いたいもののみAtomWindowでGameObject生成すると良いです。
大量の音声などの場合は
C#のスクリプトからAtomSourceに対してキュー名を指定して再生します。

[余談]ゲームには様々なサウンドがあり、単純にシーンに配置するだけで発音するものや、プログラムから自動的に呼び出したいといったものがあります。ゲームエンジンを使うことのメリットとして、誰でもモデルやサウンドのレベル配置などの調整ができることが挙げられます。
それぞれのゲーム内容に応じて、担当者が使いやすい形でカスタマイズしモジュール化することで大幅な作業工数の削減が可能となります。
サウンドの再生についてもどのようなものなのか改めて分類しておき、プログラマ、デザイナ、プランナなどそれぞれの得意な部分で活用すると良いでしょう。

ゲームエンジンでプロファイラーを使う

UE4の場合は、UE4Editorの編集からプロジェクト設定>CriWareの「In Game Preview」をチェック(後、Editorを再起動)

Unityの場合は、CriWareInitializeのインスペクタの「In Game Preview」をチェック

ゲームを実行し、
CRI Atom Craftで、プロジェクトを作成し、
表示メニュー>プロファイラで、プロファイラウィンドウを表示し、Startを押し、インゲーム接続しますか?のダイアログで「はい」を選択します。

どのキューがリクエストされたかのログや、再生状況、エラー、ラウドネスなどを確認できます。

[余談]ADX2ではインゲームプレビューを有効にした場合にのみ他ツールとの連携のための通信処理がゲームに組み込まれます。これを利用してプロファイラは情報のやりとりを行います。
インゲームと名前がついていて紛らわしいのですが、データは通常のデータで構いません。プロファイルするだけならインゲーム用のデータを用意する必要はありません。

キューの順番

CRI Atom Craftでの表示は作成順番で並んでおり、後からツリー上でドラッグで入れ替えることができます。

ビルドしたデータでは
キューは格納された順番(通常は名前ソートされている)で記録されていてIndexでアクセスできます。

また、キューIDという飛び番号を許したユーザー任意の番号を持つことができます。
キューIDを使うことで、永久欠番などの扱いができるようになり、ゲーム作成のワークフローにあわせて利用するこが期待できます。

[余談]ほとんどの場合では名前順ですが、リンクや構造が複雑なデータの場合は名前順と異なる場合もあります。

音が鳴らない時は2つのツールでチェックしてみよう

プロファイラーでチェックする

音が鳴らない原因はいろいろあるので、プロファイラーで見てみましょう。
何かしらエラーが確認できるかもしれません。

ゲームエンジンでプロファイラーを使う

CRI Atom Viewerでチェックする

または、CRI Atom Viewerで確かめてみるのも手です。
初期化時の設定により再生ができないなどのエラーの確認ができる場合があります。

バイナリファイルのプレビュー

HCAを途中から再生したい

CRI Atom Craftを使って再生

タイムラインのルーラを動かすことで再生開始位置を変更できます。

CRI Atom Viewerを使って再生

ビルド後のデータで
長いBGMなどでループの確認など、HCA素材を途中から再生したい場合、

CRI Atom Viewerで.hcaを開いて、「シーク再生」に再生開始時刻を設定すると途中から再生します。(30秒から=30000msec)

HCAとADXのコーデック違いによるシーク動作の違いについて

ADXの場合途中から再生を行うとノイズが混じることがあります。
ADXの場合は、なるべく無音のところでシークするなどの対応が必要です。

HCAの場合はシーク位置が無音でなくとも問題なく再生が可能です。