BEATWIZと組み合わせる

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

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

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

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

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

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

トラックが32個、つまり5.1chを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 ~」系のエラーも大量にでる場合があります。これは再生時にボイスプールが存在しないために処理が続行できない場合に発生するので、

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

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

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

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

  • レベルメータなどは動作していますでしょうか?
    レベルメータが反応していない場合は、内部でボリューム系が落とされている可能性があります。
    (バスボリューム、カテゴリボリューム、AISACやセレクタ、ランダム、リミット処理、リスナーが遠いなど様々な要因があります。)
    ボリューム処理で音が小さい場合や、トラックが空のシーケンスや、元波形が無音などの場合はエラーも音が出ません。
  • DAWがWASAPI排他モードなどの場合に、DAWが起動中にサウンド処理を奪ってしまう場合など考えられます。
    この場合は排他モードで動作しているDAWを終了していれば問題ないと思われます。
  • 初期化時にエラーが発生しているか?
    バスが足りない、ボイスプールが足りない、ストリーム数が足りない、再生レートが足りない、ACFが何らかの要因でロードできていないなど、バスセンド先が存在しない場合なども音が鳴らない状況があります。この場合、再生時よりもはるか以前の初期化時にエラーが出ている場合があります。
    プレーヤーの3D有効設定、フェーダー設定などプレーヤーに起因するエラーなども考えられます。
  • PCのボリュームが下がっている/Muteになっている/出力デバイスが異なる
    オーディオインターフェースなどの設定でMuteになっていたりしないでしょうか?
    また、チャンネル数が合わないデバイスなどで、サラウンド側の音が鳴らないなども考えられます。

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

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

シーケンスループは、
シーケンスループマーカー(複数トラックで同じ長さのループ)
再生方法を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設定をする必要があります。
カテゴリとかの設定も再生用プレーヤーを用意しプログラムで動的に設定するとか、データだけで解決できない代わりに
プログラムからいろいろできるようになります。

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

[余談]ADX2の姉妹品であるSofdec2など、ムービーなどの再生などはパッキングではなくそのままsofdecのファイル再生をプログラムで行います。(別途ファイルマジックにて複数ファイルのパッキングも可能)
サウンドはとくにファイルの数が多いため、あらかじめパッキングやボリューム調整、エフェクトバスへのルーティングなど設定項目をしたものを渡すことでプログラムでの負担を軽減できています。
が、プログラムでもほとんどのことが可能です。

[余談2]ADX1の時代(DC,PS2,GCなど約20年くらい昔の話)の頃はacbファイル単体で再生するのが主流でした。
(音楽や効果音はハードウェアに内蔵の専用音源チップがありMIDI的な制御で鳴らしていたりしていました。)
せいぜい数本の声(ボイス)の再生のためにストリーム再生とファイルの裏読み込みがやっとといった時代でした。
(今よりもずっと扱う音数は少なく、サイズは小さく、でもメモリも小さかった)
atomでいうとExがついていない関数群などはその名残があります。

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

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

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

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

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

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

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

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

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

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