巻乃もなかボイスで学ぶ、ADX2のコンボシーケンシャル機能

#はじめに

この記事は もなふわすい～とる～む Advent Calendar 2020 - Adventar 12/22の記事です。
https://adventar.org/calendars/5183

## ADX2とは
CRI ADX2は、ゲーム向け統合型サウンドミドルウェアです。ゲーム開発におけるサウンド演出の便利なライブラリと、その設定を行う専用ツールがセットになっています。

専用ツールで「音の鳴り方」をあらかじめデータ側に埋め込んでおくことで、プログラム側で利用するときのコーディング量を減らすことができます。

UnityやUE4など、さまざまなゲーム開発環境に対応しています。

![](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F19010%2Fec39eab7-d089-d6c4-975b-7cd57944d655.png?ixlib=rb-1.2.2&auto=format&gif-q=60&q=75&s=bfac1c67a8c8db32293533a6d3687453)

たとえばUnityでは、「サウンドのフェードイン・フェードアウト処理をしよう」と考えた場合、音量を経過時間で変化させるプログラムコードを書く必要があります。
ADX2にはライブラリにフェードの処理が実装されています。コードで処理を書くのではなく、音データ側に「この音はフェードインする」という設定を埋め込むアプローチになります。
ADX2のシステムでは、各種サウンド演出を埋め込んだ音の単位を「キュー」と呼びます。このキュー単位で、プログラムから再生リクエストを行います。

![ADX2キューの概念図.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19010/adc394e5-5872-d2b5-5862-a2c827614653.jpeg)

ADX2は各種ゲーム機やVR・ブラウザゲームに対応した製品版「ADX2」のほか、個人クリエイターが利用できる無料版の「ADX2 LE」があります。
無料版はiOS, Android, PC, Macに対応しています。

**ADX2 LE**
https://game.criware.jp/products/adx2-le/

サウンドミドルウェアADX2の基礎知識や、各エンジンの組み込み方については以下をご覧ください。

**Unity: Unityのサウンド機能をADX2で強化する**
https://qiita.com/Takaaki_Ichijo/items/16e6501fc07f5b3b3377

**UE4: ADX2 for UE4の導入で、一歩上のサウンド表現を（導入編）**
https://qiita.com/SigRem/items/4250925f6d66a4fd287a

## 巻乃もなかさんとボイス素材について
巻乃もなかさんは、バーチャルタレントププロジェクト、AVATAR2.0 Projectの１期生です。
おもにShowroom配信で活動されています。生活リズムガタガタ部に所属されているそうです。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">SHOWROOMVのアプリをアップデートしたら<br>前も可愛かったけどもっと可愛く動くようになった気がします！！😊💕<br><br>アプリだけで指動かせるのすごくない！？😳<a href="https://twitter.com/hashtag/SHOWROOMV?src=hash&amp;ref_src=twsrc%5Etfw">#SHOWROOMV</a><br><br>💭アップデートはここから<a href="https://t.co/MwUQ4t0QLa">https://t.co/MwUQ4t0QLa</a> <a href="https://t.co/U0fWquGzKS">pic.twitter.com/U0fWquGzKS</a></p>&mdash; 巻乃もなか✨ (@monaka_0_0_7) <a href="https://twitter.com/monaka_0_0_7/status/1337426324470697984?ref_src=twsrc%5Etfw">December 11, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

どういう経緯か、巻乃もなかさんはIT/ゲーム開発クラスタで非常に話題になっています。配信を見ていても、来場者はエンジニアだらけです。ご本人もUnityを使って自作衣装の制作なども行っているそうです。

さて、巻乃もなかさんはそんなエンジニア職のファンに向けて、ボイス集を公開しています（通称「新しいフォルダー (2)」、ファイルを解凍するとそう書いてあるため）。

**素材用ショートボイス集（voiceer用ボイス集）**
https://www.fanbox.cc/@makinomonaka/posts/768804

これは、「Voiceer」というUnity用のエディタ拡張で使えるボイスとして用意されいます。Unityで色々と操作をするたびに音声を再生するものです。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">VTuberがあなたの開発を応援してくれるEditor拡張、「Voiceer」を作りました！😊<br>コンパイルが終わった時、セーブした時、ビルドが成功した時…その他いろんな場面で声で応援してくれます！！<br>これでVTuber大好きUnityエンジニアを無限に働かせることが可能！！！！<br><br>声：結目ユイさん(<a href="https://twitter.com/musubimeyui?ref_src=twsrc%5Etfw">@musubimeyui</a> ) <a href="https://t.co/oomONF6X29">pic.twitter.com/oomONF6X29</a></p>&mdash; ねぎぽよ❣️／ニアちゃん👉 (@CST_negi) <a href="https://twitter.com/CST_negi/status/1214500926326628352?ref_src=twsrc%5Etfw">January 7, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

新しいフォルダー(2)にも、「コンパイルおわったよ～！」などのシステムボイスが収録されています。

ちなみにUnreal Engine 4向けには同様のプラグインとして「UE4 Voiceer4U」があります。https://papersloth.hatenablog.com/entry/2020/10/28/211434

今回はこちらのボイス集を使って、サウンドミドルウェアADX2の機能を紹介します。

## ゲームにおけるキャラクターボイスの演出で活躍するADX2

ADX2はゲームに関する様々なサウンドの演出を設定できます。BGMや効果音の制御に使うことも非常に有効ですが、キャラクターのボイスの制御にも重宝します。

たとえば、音にタグ付けを行ってタグ情報で音量をコントロールするカテゴリ分け機能や、ボイスに文字データを埋め込んでゲーム側で利用するなど、活用方法は多岐にわたります。
ボイスデータの活用については、以下の記事でまとめています。

**ゲーム開発におけるボイスデータの効率的な管理 with CRI ADX2 (前編)**
https://qiita.com/Takaaki_Ichijo/items/9cd16a14c907c8793e72

# コンボシーケンシャルとは

「コンボシーケンシャル」とは、ADX2の機能のひとつです。
あるゲーム内の動作が一定間隔以内に連続で発生し、そこに音をつけるときに、連続しているときだけ特定の音を鳴らす演出に使います。
たとえば、以下のような場面で使います。

* 格闘ゲームの連続ヒットで、短い間に攻撃を連続ヒットしているときだけ食らったときのボイスが変わっていく
* プレイヤーが武器を連射をしたいるときだけ別の音声データを使う
* 落ちものパズルでコンボがつながった時だけ声が変わっていく

## コンボシーケンシャル設定のキューを作成する

実際にコンボシーケンシャル機能を使ってみましょう。
まずは、目的となるボイスデータを並べたキューを作成します。

巻乃もなかさんの「新しいフォルダ(2)」はmp3で配布されていますので、あらかじめ波形編集ソフトでwavファイル変換、ノーマライズ、ノイズ除去、空白部分の詰めを行っています。

こちらは巻乃もなかさんの音声の波形となります。推しの波形は目で見ても楽しいですね。
![がんばれ～1 2020-12-21 15.24.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19010/1b472741-07dc-38b8-3f82-67b68ec186ae.png)
※ちなみにゲームではボイスデータをモノラル化することがほとんどですが、今回は巻乃もなかさんのボイスを100%楽しむためにあえてステレオデータのまま圧縮します。

さて、今回はボイス素材の中から、「おつもな～」→「がんばれ～」→「その調子！」→「コンパイル終わり！」の順でつながっていく音データを作ってみましょう。
まずは空のキューを作成し、4つの音声データをトラックに配置します。

![monanaADX2_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19010/4fe40446-94f0-db4c-2a94-9d88bd0e3742.png)

デフォルトでは、キューはすべてのトラックの音声を同時に再生します。この状態でキューのプレビュー再生を行うと、4人分の巻乃もなか音声が同時に流れます。これはこれで健康に良いのですが、今回のケースでは順番に鳴らしたいです。
そこで、キュータイプを同時再生の「ポリフォニック」から「コンボシーケンシャル」に変更します。

![monanaADX2_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19010/22ad2e85-c778-1282-5edc-8aa9553e40c5.png)

現在は何も設定していないので、プレビュー再生を行っても、一番上に配置した「おつもな～」しか聞こえません。かわいいですね。
コンボシーケンシャルの機能を使うためには、「コンボが有効になる間隔」を設定します。単位はミリ秒になります。

![Snapshot 2020-12-21 17.58.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19010/867deba7-9ec1-b9f7-c0aa-8d5566191fb4.png)

今回は「1200」を設定して、1.2秒以内にこのキューが再度呼ばれた場合のみ下段のトラックに遷移する演出にしてみます。
キューをプレビュー再生すると、以下の動画のように1.2秒以内に次を再生した場合だけ、ボイスが変わっていきます。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">コンボシーケンシャル：パズルゲーでコンボが決まっているときのボイス演出や、格ゲーの音によるコンボ演出などで使える機能。一定時間以内に再度キューが呼ばれた場合のみ、下段のトラックに遷移していきます。あしたQiitaで記事公開。 <a href="https://twitter.com/hashtag/ADX2?src=hash&amp;ref_src=twsrc%5Etfw">#ADX2</a><br><br>音声素材: <a href="https://twitter.com/monaka_0_0_7?ref_src=twsrc%5Etfw">@monaka_0_0_7</a> さん　<a href="https://t.co/wjybB8olOX">https://t.co/wjybB8olOX</a> <a href="https://t.co/NMLv83YvB9">pic.twitter.com/NMLv83YvB9</a></p>&mdash; ichijo (@Takaaki_Ichijo) <a href="https://twitter.com/Takaaki_Ichijo/status/1340952960457605121?ref_src=twsrc%5Etfw">December 21, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

ゲームプログラムからは、このキューを呼ぶだけで自動的に時間の判定を行い、ボイスが変化してくれるわけです。もななはかわいいですね。

## コンボMAX時は最後のボイスを繰り返し再生する

某落ちモノパズルゲームのように、コンボがある程度まで進行した後は最後のボイスをずっと繰り返し再生する演出があります。

コンボシーケンシャル機能においては、「キューの再生が下段まで行ったときにどのキューに遷移するか」という指定ができます。それが「コンボ戻り」です。コンボ戻りはトラックの番号で指定します。

今回は4つ目の「コンパイル終わり！」を繰り返したいので、「3」を指定します。（上から、0番、1番...と指定されています）
そうすると、ずっとこのキューを呼び出し続けた場合、「コンパイル終わり！」を永久に連呼してくれます。皆さんも永久に聞き続けてくださいね。

## コンボMAX時のボイスをランダムに切り替える

さて、コンボMAXの場合に特定のボイスを繰り返し再生するとき、そのボイスもバリエーションの中からランダムに切り替えたいと考えます。

コンボシーケンシャルはキューが入れ子になっている状態でも利用できますので、まずはランダムで音声を再生するキューを作り、そのキューをコンボシーケンシャルを適用したキューの一番下に配置します。

「新しいフォルダ(2)」にはありがたいことに「コンパイル終わり！」ボイスが4パターンもあるので、これを活用していきます。まずは新規のキューを作成し、「コンパイル終わり！」の4種類のボイスデータをトラックに並べ、キューのタイプを「ランダムノーリピート」にしましょう。

![monanaADX2_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19010/bea81b3e-872b-1610-2dda-14e3fc1fb28d.png)

ランダムノーリピートは、キューが再生リクエストをされるたびにトラックからランダムで選択して再生、かつ同じものを繰り返さない設定です。
加えて、ランダムの選択確立も変更しましょう。一番下の「コンパイル終わり～！その調子～！」は、5%の確率で再生されるレアなものにします。

![monanaADX2_4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19010/2e77421b-9258-2373-7ea8-5bf11ff332b4.png)

この設定で、次のようにランダムかつレアなボイスもある演出にできました。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">ランダムノーリピートと重みづけ：1つの音声データに4種類のボイスデータを仕込み、再生リクエストがあるたびにランダムかつ繰り返しなしで再生。4段目のトラックは低確率(5%)で再生されます。あしたQiitaで記事公開。 <a href="https://twitter.com/hashtag/ADX2?src=hash&amp;ref_src=twsrc%5Etfw">#ADX2</a><br><br>音声素材: <a href="https://twitter.com/monaka_0_0_7?ref_src=twsrc%5Etfw">@monaka_0_0_7</a> さん　<a href="https://t.co/wjybB8olOX">https://t.co/wjybB8olOX</a> <a href="https://t.co/V7wdNuHzpb">pic.twitter.com/V7wdNuHzpb</a></p>&mdash; ichijo (@Takaaki_Ichijo) <a href="https://twitter.com/Takaaki_Ichijo/status/1341026986240606208?ref_src=twsrc%5Etfw">December 21, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

このキューを先ほどのコンボシーケンシャルのトラックに配置します。
「コンパイル終わり」のトラックを削除し、かわりに今作ったランダム再生のキューを設置します。

![monanaADX2_5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19010/c1786cf9-90b8-8415-ea4d-7d570f663171.png)

キューをプレビュー再生してみましょう。最終的に次のような演出になりました。

* この音を1.2秒以内に連続再生した場合のみ、ボイスが切り替わっていく
* 3回変わった後、連続再生が続く限り、「コンパイル終わり！」を繰り返し再生する
* 「コンパイル終わり！」は4種類のボイスがランダムに再生される
* 「コンパイル終わり～！その調子～！」は低確率で再生される

ここまで練り込まれた音声の演出を、プログラム側は「このキューを再生」とするだけで得られるわけです。
巻乃もなかさんは凄いですね。

# まとめ
ADX2は、ボイスデータの演出制作に活用することで多くのバリエーションを持たせることができます。
その上、プログラム側からの音声再生処理は非常にシンプルになります。
ぜひ、Showroomの「巻乃もなか」の配信を一度見てみてください。
https://www.showroom-live.com/monaka-007