サウンドを途中からループ再生させる

概要

読み込んだ音声ファイルは「MediaPlayer」や「SoundEffect」を使って簡単に再生することができます。また、ループ再生もフラグを変えるだけで繰り返し再生させることもできます。

しかし、イントロ部分を最初に1回だけ再生させて、途中のある位置からある位置までをループ再生させるには「MediaPlayer」や「SoundEffect」ではできません。これらはできる限り簡単に音声を再生できるようにシンプルな構成として作られているからです。音声ファイルを2つに分割して1つ目を1回だけ再生させて、1回目終了と同時に2つめをループ再生させるという方法もありますが、非常に調整が難しいです。

ここでは「XACT」と「Wavosaur」というツールを使って途中位置からのループ再生を実現してみようと思います。

MonoGame は複数のプラットフォームで動作するようにできていますが、今回の内容を検証したのは「Windows 10」と「Windows 8.1 UWP」のプロジェクトのみです。動作確認したプラットフォームは「Windows 10 デスクトップ」「Windows 10 ストア」「Windows Phone 8.1」「Windows 10 Mobile」になります。ほかのプラットフォームでの検証は行っていません。

動作環境

Windows
  • Windows Vista
  • Windows 7
  • Windows 8
  • Windows 8.1
  • Windows 10
Windows Mobile
  • Windows Phone 8.1
  • Windows 10 Mobile
Visual Studio
  • Visual Studio 2010
  • Visual Studio 2012
  • Visual Studio 2013
  • Visual Studio 2015
MonoGame MonoGame 3.4

動作確認環境

Windows Windows 10
Windows Mobile
  • Windows Phone 8.1
  • Windows 10 Mobile
Visual Studio Visual Studio 2015
MonoGame MonoGame 3.4

内容

必要なツール

サウンドの途中からループ再生を行うために、今回は以下の2つのツールを使用します。

  • Wavosaur
  • XACT

Wavosaur のダウンロードとインストール

Wavosaur は音声ファイルの波形データを編集するツールです。Wavosaur は以下のサイトからダウンロードできます。

ページを開いたら、図の赤枠のリンクからファイルをダウンロードしてください。32bit 版と 64bit 版がありますので、実行環境にあったものを使用してください。

Wavosaur のダウンロード

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 を実行

画面が表示されます。

Wavosaur のウィンドウ

用意した音声ファイルを Wavosaur にドラッグ&ドロップします。波形データが表示されます。

音声ファイルをドラッグ&ドロップ

波形データをマウスでドラッグすると範囲選択できます。ループさせたい範囲を選択してください。

ループさせたい範囲を選択

メニューから「Tools」→「Loop」→「Create loop points」を選択します。ツールバーにある「L」ボタンを押しても同じです。

「Create loop points」を選択

すると選択範囲の両脇に「loop start」「loop end」と表示されます。この範囲がループされる範囲となります。

「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 などからインストールした場合はそちらから起動してください。

Microsoft Cross-Platform Audio Creation Tool 3 (XACT3)

起動した直後の画面になります。今回 XACT ではもっとも簡単な作業しか行いませんので、他の使い方を知りたい方は Web などで調べてみてください。途中ループ再生の設定を行った WAVE ファイルを使う場合でも、XACT で特別な操作は必要としません。

XACT 起動画面

最初にプロジェクトを作成します。ツールバーの「Creates a new project」のボタンをクリックします。

プロジェクトを作成

プロジェクトの保存場所を指定します。

プロジェクトの保存場所を指定

プロジェクトを作成したら「Wave Backs」を右クリックして「New Wave Bank」を選択します。

New Wave Bank

「Wave Bank」が作成されたことを確認したら同様に「Sound Banks」を右クリックして「New Sound Bank」を選択します。

New Sound Bank

画面は図のような状態になります。

Wave Bank と Sound Bank 作成後

先ほど作成した WAVE ファイルを「Wave Bank」のウィンドウにドラッグ&ドロップします。

WAVE ファイルを「Wave Bank」のウィンドウにドラッグ&ドロップ

次に Wave Bank に追加されたデータを Sound Bank の左上のエリアにドラッグ&ドロップします。

Sound Bank の左上のエリアにドラッグ&ドロップ

続いて Sound エリアに追加されたデータを、左下の Cue のエリアにドラッグ&ドロップします。

Cue のエリアにドラッグ&ドロップ

Sound ファイルを選択して、左下のプロパティの「Looping」が「Infinite」にチェックされていることを確認します。

「Looping」が「Infinite」にチェック

作業が終わったらツールバーの「Build」ボタンをクリックしてビルドします。

Build

ウィンドウが表示されますが、そのまま「Finish」ボタンを押して完了させます。

Finish

プロジェクトを保存したフォルダに「Win」フォルダが作成され、その中に3つのファイルが作成されていることを確認します。

3つのファイル

ゲームプロジェクトの作成

あとは MonoGame プロジェクトでファイルの登録とプログラムを作成するだけとなります。今回は Windows Project で作成しています。Windows ストアアプリや Windows Mobile でも動作することは確認しています。

Windows Project

プロジェクトを作成したら先ほど XACT で作成した3つのファイルを「Content」フォルダ内に登録します。特別 Content フォルダでないといけないというわけではありません。

Content フォルダに3つのファイルを追加

追加した3つのファイルを選択している状態でプロパティを開きます。

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 を対象にしたツールなので他のプラットフォームで正常に動作するかは未確認です。必要であれば、実際に試していただき採用するかどうか判断してください。

ダウンロード