月別: 2014年7月

キューを名前順にする

キューを名前順にするとは?

ツリー上でのキューの並び順は、「標準」では作成順となっています。
「標準」状態ではドラッグしてキューの位置を移動できます。
キューシートを右クリックしコンテクストメニューから
「キューシート以下のキューを全て整列」>「名前」とすると名前順にすることができます。
20140730キューの整列

発音数に制限をかける

発音数に制限をかけるとは?

用途はいろいろありますが、例えば、

「音のリクエストが多すぎて音が重なりすぎてしまう場合」や
「同じ声優が二重でしゃべってしまう」とか
「CPU負荷をあまり上げたくないので音数を減らしたいけど、音のリクエストはあまり意識したくない」
などあります。

ADX2では、ボイスリミットグループによる発音数制限、キューの発音数制限、
同一カテゴリ内でのキューの発音数の3つのリミットがデザインできます。

他にランタイムの初期化設定により、コーデック毎の発音最大数として
ボイスプールの設定、ストリーム再生のためのストリーム最大数などが発音数に影響します。

キューリミットとボイスリミットの違いとは?

キューリミット:キューの再生数を制限する機能
ボイスリミット:ボイスの再生数を制限する機能

簡潔にはどちらも再生数の制限に関わるのですが、音の鳴り方に大きな違いがあります。

キューリミットはエンベロープのリリースが残る。
ボイスリミットはエンベロープのリリースが残らない。

キューリミットとボイスリミットどちらを使うのが良いのか?

これはケースバイケースなのですが、一例を上げますと、

「ハード的に発音数が極端に少ない」
「昔ながらの厳密な音数の管理をしたい」
「ストリーム負荷などが無視できない」
→ボイスリミットを使う

ハード的に発音数には余裕がある
→キューリミットを使う

発音数制限の他の方法について

ボイスリミット、キューリミット以外にも発音数を制限する方法があります。

これらも用途によるのですが、
「ボイスプールを使う」・・・コーデックごとのボイス最大数が制限されます。
「トラックMonoを使う」・・・トラックで単音しか鳴らさないようにできます。

リミットの範囲を決める

ボイスリミットには、ボイスリミットグループ
キューリミットには、カテゴリキューリミット
があります。
上位のグループやカテゴリなどでリミット最大数を決めておく事で
特定のグループの発音数制限を行えます。

例えば、BGMは2音、SEは8音などといった具合です。

リミット時の振る舞いを決める

リミットがかかった時、どう動作するか?たいていは、音が鳴らなかったり、ワーニングが発生しますが、ボイスリミットやキューリミットの場合、プライオリティというものが設定できます。

このプライオリティを上げておく事で、音が消えにくい状況を作り出す事ができます。

例えば、消えて困る音(BGMや主役の台詞とか)は高めにします。
消えてもさほど影響を受けない短い音など(足音とか)は低めにしておきます。

ランダムのかかるタイミング

ランダムのかかるタイミングとは?

音にピッチのランダムを設定した場合に、再生中にうにょうにょ変わってしまうと困る場合があります。
基本的には再生開始時にランダムのピッチが決まり、そのピッチの値で鳴り続けます。

次の発音があった場合にもランダムのピッチが更新されますが、既になっている音には影響しません。

「どのサウンド」「どのように」鳴らすか?
といった「サウンドの情報」をデザインし、「キュー」に詰め込みます。

「キュー」の中にはパラメータをグループで制御するための「トラック」を持つことができ、
「トラック」の中には波形の情報となる「ウェーブフォーム」を持つことができます。

単純に波形を再生する場合を考えると、複雑に見えますが、
再生時にパラメータが変化して再生される場合、波形のパラメータとは別のレイヤーを持てる事で、
よりコントロールがしやすくなっています。

例えば、サウンドの音量調整時に、それぞれ個別のレイヤーのボリュームを変えるのではなく、
マスターであるキューのボリューム調整することで、全てのバランスを保ったまま調整できます。(なぜこうなるかは後述する「基本的なルール・パラメータの伝播」参照)

シンプルなケースでは上記の方法で問題ないのですが、より込み入ったデータを作成している場合
個々の波形に対してさらに個別に微調整したい場合があります。

例えば、「どのように」の部分で、「ランダムノーリピート」や「シャッフル」で「トラック」を鳴らすといった事ができます。

【基本的な構造】

ADX2のキューは最小の基本構成で以下の階層構造を持ちます。

「キュー」、「トラック」、「ウェーブフォーム」

20140710キューのツリータイムライン
ツリーとタイムラインで見え方は異なりますが同じものを表示変えています。

【基本的なルール・パラメータの伝播】

階層化された構造は、基本的に親フォルダの設定に従います。
それぞれの階層(レイヤー)で設定が可能で且つどの階層でも有効なパラメータは、足し合わせや掛け合わせが行われます。

20140710キューのパラメータ大量にあるパラメータ

【基本的なルール・再生制御系】

再生制御系の仕組みは、親フォルダから処理されます。例えば「再生確率」はキューで評価された段階で再生しなかった場合、「トラック」の「再生確率」は評価されません。

ボリュームなども掛け合わせであるため、親から処理していって、どこかでボリュームが0になった時点で音が出なくなります。

ピッチは足し合わされます。全体のピッチを「キュー」で設定して、「トラック」側でピッチを微調整したりできます。

【サイコロについて】

ADX2ではリアルタイムの制御が自動で行われることで、プログラムの負荷を大きく軽減することができます。

プログラム側でランダムに音を揺らす事も可能ですが、データ側で適当に振ってくれるだけで、プログラムはリクエストのみで済むようになります。

【基本的なルール・トラックのサイコロ】

「キュー」のタイプが「ポリフォニック」以外の場合、「トラック」は個々のパラメータを持つ事に大きな意味があります。

例えば、「トラック」のランダムパラメータなどのサイコロがどのタイミングで振られるか?
といった問題があります。

ADX2では基本的に再生開始時に全てが決まります。

「トラック」内に複数のウェーブフォームがあった場合でも、再生初回のランダムの値で一律に決まります。

「トラック」の値はランダムで、中の要素に同様に反映している形になります。

20140715WAV両方同じ

【基本的なルール・ウェーブフォームのサイコロ】

「ウェーブフォーム」はタイムラインが通過する直前にサイコロが振られます。

例えば、シーケンスのループなどで「ウェーブフォーム」を囲んだ場合に、「ウェーブフォーム」側でランダムを行う事で毎度異なるランダム値が得られます。(「トラック」や「キュー」でサイコロを振るのと少し違うのです)

「ウェーブフォーム」側でそれぞれランダム設定をする必要があります。

20140715WAV側でランダム

【基本的なルール・AISACのサイコロ】

AISACのランダムは例外的な動作で、「ウェーブフォーム」の再生のタイミングでそれぞれ個別のサイコロが振られた結果が割り当てられます。

これは、「キュー」や「トラック」、あるいは「カテゴリ」やランタイム時のプレーヤなどのAISACからのコントロールを受けた時、上位のレイヤーでランダム値が固定されると、下層の全ての値が同期して、とても不自然になります。

ランダムの目的は不自然な偏りのないものが理想とされますが、階層構造での決定タイミングとは相性が良くないため、AISACランダムの時だけ例外になります。

AISACは再生中でも変化する特性があるため、「ウェーブフォーム」の再生時にサイコロが振られ、パラメータが決定されるものとなります。

20140715WAV側別々ランダム

AISAC側のレイヤーは「キュー」についていても、それぞれの階層でサイコロを振ります。

ADX2の木

【ADX2の木とは?】

ADX2では多くのデータを扱います。データの管理はコンピュータ上のファイルの管理に似ています。
フォルダにファイルを入れて管理します。

フォルダは親子関係を持っていて、親子の関係を階層と呼びます。
例えば、一階層上とは親フォルダを示します。

階層を上へ上へと
ずっとたどって行くとそれ以上、上に行けない大親のフォルダがあります。

親からみると、さまざまなフォルダに枝分かれしていく形に見えます。

枝分かれ・・・木の枝が伸びて先に葉っぱがあるイメージです。

ADX2ではこれらのデータを「ツリー構造」と呼びます。

「プロジェクトツリー」という大木(たいぼく)で、AtomCraftでは枝や葉っぱを作って行く作業を行います。

20140709ADX2Tree20140709プロジェクトツリー

【特別な機能をもったフォルダ】

ADX2ではフォルダに特別な機能が備わっていて、機能ごとに置けるものが決まっています。
ただ単純にデータを好きな場所におけるだけではありません。

まず、プロジェクトの下には「全体設定」と「ワークユニット」があります。

「全体設定」は名前のとおり全体に関わる設定があります。

「ワークユニット」は「仕事」の「単位」で分けられるという意味があります。
仕事は、人単位や、ゲームの部分などに分けられます。

「ワークユニット」の下には「キューシート」が置けます。

「キューシート」は、「合図」の集まった「紙」。この紙をプログラマとやりとりします。

「キュー」は「合図」。この合図はプログラムから呼ばれます。

「トラック」は「競技場のトラック」を思い浮かべてみてください。

「トラック」には競技者である「ウェーブフォーム」が居ます。

「ウェーブフォーム」は「波形」で、音の情報をデジタル化した塊です。

【装飾された木】

クリスマスツリーのように、枝から枝へ飾りのリボンがかかっているように、それぞれの葉っぱの部分が他の葉と結びつけられているものもあります。

例えば、
「カテゴリ」は「全体設定」の下にありますが、「キュー」と強く結びついています。

このような葉っぱ同士の関係性が分かると、より深いADX2の理解へと繋がります。

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

【連続ヒット音とは?】

連続でヒット(攻撃がうまく当たったなど)した時、音が盛り上がって行く演出があります。

通常は、キューを複数用意してプログラムで呼び分ける方法があります。 音ごとにコンボの管理、再生時刻の管理などが必要で手間がかかります。

上記のようにプログラムで行えば何でもできるのですが、音の鳴り方、重なり方などかなりの面でサウンドデザインの領域です。

基本的に、コンボの間隔と、変化する音を用意するだけで良い「シンプルな条件」であればADX2独自の機能「コンボシーケンシャル」を使うという手があります。

「コンボシーケンシャル」を使うだけで、プログラム側は一切変更せずに派手な変化をするサウンドの演出効果が期待できます。

【コンボシーケンシャルとは?】

20140701コンボシーケンシャル

コンボとは、格闘ゲームなどで連続ヒットした時の事を意味します。 キュータイプの「シーケンシャル」は、再生リクエストに応じて、次々とトラックを切り替えて再生する機能です。

2つの要素をもつ「コンボシーケンシャル」は「ある一定時間内にリクエストされた時のみ、シーケンシャルとして動作する」キューのタイプです。

例えば、樽が短時間で連続で破壊された時、「ランダムノーリピート」などを使う事が考えられます。 しかし、ランダムの場合、毎回音が変化してしまいます。

「コンボシーケンシャル」を使うと、ある一定時間を経過した場合は、必ず同じ音が再生されます。

再生間隔がまばらな場合は、記号的な音。

再生間隔が詰まっている時はランダムな音。

と変化をつけられます。

ユーザーの動作によって変化するリクエスト間隔に、音の変化をつけることで飽きさせない効果をだしつつ、サウンドを賑やかにすることができます。

音程感のある音などにも効果的です。

音程感があるものなら、音程を音楽的変化させることで、
音の重なった時の「濁り」や「不協和音」を意図的に減らせます。

目立つ音が短期間で鳴った場合、重なってしまう時に リミット行うのとは別の方法での演出ができます。

連続ヒットがうまくいっている時に「より達成感のある音」が鳴るといった演出も可能です。(逆に連続ダメージ時にダウンな音を鳴らすなども)

【作り方】

20140701コンボシーケンシャルタイムライン

1.キューを作成。

2.キュータイプを「コンボシーケンシャル」にする。

3.トラックを複数用意し、トラックに波形を配置。

4.キューのプロパティから、「コンボ間隔」の時間を設定。
1000とすると1秒以内のリクエストでシーケンシャルに変化します。

5.キューのプロパティから、「コンボ戻り」を指定します。
0にすると、コンボが繋がった時にトラックの最初に戻ります。

【確認】

それぞれ、トラックに音階「ド」「レ」「ミ」とつけたとして、

間を置きながら再生すると (「、」が1秒間隔)

ド、 ド、 ド、

と先頭のもののみ鳴ります。

間を置かずに再生を行うと、全体がシーケンシャルに切り替わります。

ドレミドレミドレミ

しばらく間を置いて再生すると最初の音が鳴ります。

ドレミ、 ドレ、 ド、 ド、

「コンボ戻り」を「2」にすると、最後のトラックの音が鳴ります。

ドレミミミミミ

「コンボ戻り」を「1」にすると、最後のトラックと一つ前のトラックの音が交互に鳴ります。

ドレミレミレミ

となります。

【応用】

デバッグ用途ですが、短時間に大量にリクエストされているなどのチェックにも使えるかもしれません。