サウンドを途中からループ再生させる
必要なツール
サウンドの途中からループ再生を行うために、今回は以下の2つのツールを使用します。
- Wavosaur
- XACT
Wavosaur のダウンロードとインストール
Wavosaur は音声ファイルの波形データを編集するツールです。Wavosaur は以下のサイトからダウンロードできます。
ページを開いたら、図の赤枠のリンクからファイルをダウンロードしてください。32bit 版と 64bit 版がありますので、実行環境にあったものを使用してください。
Wavosaur は EXE 単体で実行できますのでインストールの必要はありません。任意のフォルダに展開してください。
XACT のダウンロードとインストール
XACT は Windows や Xbox のゲームサウンドを細かく調整してゲーム中に再生できるように編集するツールです。
XACT は単体では配布されておらず、XNA Game Studio や DirectX SDK に付属されています。今回は XNA Game Studio に付属されているほうを使用します。XNA Game Studio は以下のリンク先からダウンロードできます。
ダウンロードしたらインストーラーを実行してインストールしてください。XNA Game Studio は Windows 7 までしか正式に対応していませんが、Windows 10 環境でもインストールされることを確認しています。
Wavosaur でループポイントを設定した WAVE ファイルを作成する
事前にループ再生させたいサウンドファイルを用意しておきます。基本は WAVE ファイルでの編集になりますが、基本となる音声データは MP3 ファイルなどからも読み込めます。(今回サンプルで使用している音声ファイルは「H/MIX GALLERY」様のサイトより「ポックルの大地 (k15.mp3)」ファイルをお借りしています)
Wavosaur を実行して起動します。
画面が表示されます。
用意した音声ファイルを Wavosaur にドラッグ&ドロップします。波形データが表示されます。
波形データをマウスでドラッグすると範囲選択できます。ループさせたい範囲を選択してください。
メニューから「Tools」→「Loop」→「Create loop points」を選択します。ツールバーにある「L」ボタンを押しても同じです。
すると選択範囲の両脇に「loop start」「loop end」と表示されます。この範囲がループされる範囲となります。
メニューから「File」→「Save」を選択して音声データを保存します。
ファイルは基本的に WAVE ファイルとなります。任意のフォルダに保存してください。再度編集したい場合はこの WAVE ファイルを Wavosaur にドロップすると途中から編集できます。
ファイルを保存した状態になります。XACT ではこの WAVE ファイルを使用します。MP3 ファイルをもとに編集した場合は MP3 ファイルはもう使用しません。
XACT で MonoGame のサウンド再生に必要なファイルを作成する
スタートメニューから「Microsoft XNA Game Studio 4.0 Refresh」→「Microsoft Cross-Platform Audio Creation Tool 3 (XACT3)」を選択して起動します。DirectX SDK などからインストールした場合はそちらから起動してください。
起動した直後の画面になります。今回 XACT ではもっとも簡単な作業しか行いませんので、他の使い方を知りたい方は Web などで調べてみてください。途中ループ再生の設定を行った WAVE ファイルを使う場合でも、XACT で特別な操作は必要としません。
最初にプロジェクトを作成します。ツールバーの「Creates a new project」のボタンをクリックします。
プロジェクトの保存場所を指定します。
プロジェクトを作成したら「Wave Backs」を右クリックして「New Wave Bank」を選択します。
「Wave Bank」が作成されたことを確認したら同様に「Sound Banks」を右クリックして「New Sound Bank」を選択します。
画面は図のような状態になります。
先ほど作成した WAVE ファイルを「Wave Bank」のウィンドウにドラッグ&ドロップします。
次に Wave Bank に追加されたデータを Sound Bank の左上のエリアにドラッグ&ドロップします。
続いて Sound エリアに追加されたデータを、左下の Cue のエリアにドラッグ&ドロップします。
Sound ファイルを選択して、左下のプロパティの「Looping」が「Infinite」にチェックされていることを確認します。
作業が終わったらツールバーの「Build」ボタンをクリックしてビルドします。
ウィンドウが表示されますが、そのまま「Finish」ボタンを押して完了させます。
プロジェクトを保存したフォルダに「Win」フォルダが作成され、その中に3つのファイルが作成されていることを確認します。
ゲームプロジェクトの作成
あとは MonoGame プロジェクトでファイルの登録とプログラムを作成するだけとなります。今回は Windows Project で作成しています。Windows ストアアプリや Windows Mobile でも動作することは確認しています。
プロジェクトを作成したら先ほど XACT で作成した3つのファイルを「Content」フォルダ内に登録します。特別 Content フォルダでないといけないというわけではありません。
追加した3つのファイルを選択している状態でプロパティを開きます。
「出力ディレクトリにコピー」から「新しい場合はコピーする」に変更します。
Windows Universal App Project (UAP) の場合は上記の設定では使用できません。代わりに「ビルド アクション」を「コンテンツ」に変更してください。
残りはプログラムだけになります。基本的に XACT を使用したサウンド再生と同じプログラムになります。
使用する名前空間に「Microsoft.Xna.Framework.Audio」を追加します。
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Audio;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
フィールドに以下の3行「AudioEngine」「SoundBank」「WaveBank」を追加します。
GraphicsDeviceManager graphics;
SpriteBatch spriteBatch;
AudioEngine audioEngine;
SoundBank soundBank;
WaveBank waveBank;
LoadContent メソッド内で「AudioEngine」「SoundBank」「WaveBank」のインスタンスをそれぞれ作成しています。それぞれ Content フォルダに追加した3つのファイルに対応していますので、プロジェクトルートのフォルダからの相対パスで指定してください。
ここではすぐに Cue を取得して再生していますが、実際のゲームでは必要な場所で再生してください。
protected override void LoadContent()
{
// Create a new SpriteBatch, which can be used to draw textures.
spriteBatch = new SpriteBatch(GraphicsDevice);
// TODO: use this.Content to load your game content here
audioEngine = new AudioEngine(@"Content/LoopSample.xgs");
soundBank = new SoundBank(audioEngine, "Content/Sound Bank.xsb");
waveBank = new WaveBank(audioEngine, "Content/Wave Bank.xwb");
soundBank.GetCue("k15").Play();
}
この状態で実行し、途中からループ再生されているか確認してください。実際のループ制御は WAVE ファイルや XACT の段階で完了しているので、プログラムで何か特別な設定をする必要はありません。
音声ファイルの圧縮について
XACT では音声ファイルを圧縮してファイルサイズを減らす機能がついています。XNA Game Studio では圧縮されたファイルを再生することができましたが、MonoGame では対応されていないため、再生時に例外が発生、または意図しない音声が流れる場合があります。実質使えるのは無圧縮の WAVE ファイルだけとなります。お分かりかと思いますが、ファイルサイズがかなり大きくなります。
どうしてもファイルサイズを減らしたい場合は WAVE ファイルのサンプリングレートなどを調整する必要があります。
iPhone や Android、Linux、OUYA の対応について
XACT は Windows や Xbox を対象にしたツールなので他のプラットフォームで正常に動作するかは未確認です。必要であれば、実際に試していただき採用するかどうか判断してください。