再生速度の変更

ピッチ変更・・・ 音程も変化する速度変化。 アナログテープの速度変化やレコードの回転数を変えたような変化になる。

タイムラインの再生速度・・・ ここでは、シーケンスの再生速度の変化。

シーケンス・・・ タイムラインのイベント(音を鳴らす、止める、音量変化など)をキューの再生からの時刻で指定しているデータ。

ADX2ではキューで再生されるすべてのデータがこのタイムライン(シーケンス)で再生されます。

この速度を変化させることができます。 ピッチ変化とかではなくて、再生/停止/音量変化/フィルターなど様々なものの速度を変更できます。

これで何ができるかはアイデア次第です。

20150325再生レート変更

AISACに「再生レート」を追加することで、シーケンスの速度をインタラクティブに変化させるサウンドが実現できます。

この動画では、ピッチの上がり下がりをオートメーションで用意し、

PlayList再生にして、シーケンスエンドまでをループ再生しています。

AISACで再生レートを変更するグラフを用意し、変化速度をリアルタイムに変化させています。

ADX2のチューニング

ADX2は様々な再生機能が備わっていますが、それぞれ初期設定でカスタマイズすることができます。

これにより、動作時のメモリを削減したり、より多くのコントロールを同時使用したりといったことができます。
同時発音数、再生チャンネル数、最大再生ピッチなど、再生遅延チューニングなどスペックに応じて調整する場合もあります。

また
各パッケージ毎のSDKのcri/documentationフォルダには、その機種での固有情報が別マニュアルとして書かれています。

設定時に参考にしてみてください。

[参考]PCの情報
(要アカウント) https://www.criware.jp/support/adx2/pc/docs/jpn/criatom_tuning.html

機種固有の追加情報について

BEATWIZと組み合わせる

ADX2でBEATWIZのリアルタイム解析を連携させることができます。

ADX2のフィルターコールバックで、AtomEXプレーヤやバスなどで解析することで、ビートをリアルタイムに解析して結果を出すといったことができます。

[余談]BEATWIZはバッチ処理での超高速、高精度のビート解析や、楽曲の盛り上がり度、ドラムの発音タイミング検出など楽曲に対しての様々な解析処理が入っています。携帯ゲーム機や組み込み用機器など限定された計算資源しかもたないハードでも動作できるように設計されています。

ムービーで5.1ch再生や言語別再生やAmbisonics再生する

CRI Sofdec2を使うと、音声トラックにHCAやADXを選ぶことができます。
HCAは品質も指定できます。

5.1chトラックを複数含めて、再生時に切り替えたり、
センターのチャンネルだけ言語別に持つといったことも可能です。

トラックが32個、つまり5.1chを1トラック(1つのオーディオストリーム)として切り替えが可能です。

また、オーディオトラックとしてAmbisonicsにも対応しています。

ムービーとADX2のオーディオ同期、シーク再生、アルファ再生、シームレス連結再生、再生速度変更、複数再生などさまざまなゲームで行う特殊再生にも対応しています。

ADX2LEからADX2へのデータ移行

ADX2LEとADX2のデータ移行は、CRI Atom Craft上で、ビルド時のターゲットコンフィグPublicからPCに変更するだけでできます。

また、すでに運用中などの既存のADX2LEデータを再生することもできます。(要問い合わせ)

ADX2でADX2LEのデータを出力する場合はPublicで出力をすることで、継続してADX2LEフォーマットを利用することもできます。

[余談] ライセンスは変わってもADX2LEを使い続けるという選択もあります。

Invalid parameter エラーと大量エラー発生

Invalid parameter というエラーが大量に出る時があります。

これは、「無効なパラメータ」というもので、パラメータの解析処理時に想定外の範囲などが設定されていた場合に起こります。
通常は発生しないのですが、例えば未来のフォーマットのデータなどを読み込むと発生する可能性があります。

おそらく、データの読み込み時などに原因となるワーニングが発生しているので確認してみてください。

似ているものに 「No voice pool ~」系のエラーも大量にでる場合があります。これは再生時にボイスプールが存在しないために処理が続行できない場合に発生するので、

  • 文字通りボイスプールが存在しないデータフォーマットのボイスを再生しようとした場合
  • そもそもボイスプールが生成できない要因が初期化段階で起きている

といった可能性があります。
処理によっては毎フレームエラーになり続けるため、エラーのログが流れてしまう場合があります。
これらの発生する前の段階でワーニングやエラーが発生していないか確認する必要があります。

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

エラーもでずに音が鳴らない

  • レベルメータなどは動作していますでしょうか?
    レベルメータが反応していない場合は、内部でボリューム系が落とされている可能性があります。
    (バスボリューム、カテゴリボリューム、AISACやセレクタ、ランダム、リミット処理、リスナーが遠いなど様々な要因があります。)
    ボリューム処理で音が小さい場合や、トラックが空のシーケンスや、元波形が無音などの場合はエラーも音が出ません。
  • DAWがWASAPI排他モードなどの場合に、DAWが起動中にサウンド処理を奪ってしまう場合など考えられます。
    この場合は排他モードで動作しているDAWを終了していれば問題ないと思われます。
  • 初期化時にエラーが発生しているか?
    バスが足りない、ボイスプールが足りない、ストリーム数が足りない、再生レートが足りない、ACFが何らかの要因でロードできていないなど、バスセンド先が存在しない場合なども音が鳴らない状況があります。この場合、再生時よりもはるか以前の初期化時にエラーが出ている場合があります。
    プレーヤーの3D有効設定、フェーダー設定などプレーヤーに起因するエラーなども考えられます。
  • PCのボリュームが下がっている/Muteになっている/出力デバイスが異なる
    オーディオインターフェースなどの設定でMuteになっていたりしないでしょうか?
    また、チャンネル数が合わないデバイスなどで、サラウンド側の音が鳴らないなども考えられます。
  • 距離減衰の設定が最大0になっている > ボイスのパンタイプが「3Dポジショニング」で、キューの距離減衰が、初期状態の(最小0.最大0)となっているとリスナーとソースが同じ位置にある時にしか鳴らない
  • キュー、トラック、ウェーブフォームリージョンの「再生確率」が100以下に設定されている。
  • キューのシーケンスタイプが「ポリフォニック」でセレクタ設定されていて且つセレクタがプレーヤーにセットされていない
  • awbに対応するacbが異なる。(awbまたはacbが古いなど。この場合正しく再生されない)リビルドすることで解決する。

 

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

ループとランダムを組み合わせて=無限をつくる

シーケンスループに、ランダムなリージョンを入れたり
ランダムな振る舞いをするサブシーケンスを挟むことにより
カオスな振る舞いをする音源を作ることができます。

シーケンスループは、
シーケンスループマーカー(複数トラックで同じ長さのループ)
再生方法をPlayList (トラックごとに長さのことなるループ)
自動繰り返し機能 (ウェーブフォームリージョンごとに再生間隔指定、ランダムなど)
が選べます。(番外:ブロック再生もある種のループ機構)

[余談]どんな音が作れるか? 波、風、雨、水滴が落ちる音、岩が崩れる音、群衆の声など

デモプロジェクトを聴いてみよう

LFOしよう、Modulationしよう

AISACオートモジュレーションを使うと、自動でパラメータの時間変化が加えられます。
ループにするとそれを繰り返します。

AISACはほぼすべての音色に関わるパラメータをグラフで変更できます。

これをモジュレーションしたら・・・ 可能性が無限に広がります。

フィルター、ピッチ、ボリューム、パン、センド、再生速度、リリース、再生確率(プラオリティ)、さらには他のAISACグラフまで(つまりFMっぽいものまで)

音色作りに飽きた時など、試してみると何か新しい発見があるかもしれません。

[余談]FM = Frequency Modulation 主に周波数を変化させるもの。ループの周期を多重にかけることで、変化カーブの速度が歪むことにより、より複雑な変化を発生させることができる。うまくすると、風の音や波の音、自然に存在するカオスな振る舞いな音を作り出すこともできるかもしれません。

デモプロジェクトを聴いてみよう

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がついていない、無印の関数群などはその名残があります。

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

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

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

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

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

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