2008年11月07日

プログラム主体のSilverlightの勉強 その6 BGM再生

Silverlightで扱えるオーディオデータは、MP3(.mp3)とWindows Media Audio(.wma)の2種類だけです。WAVE(.wav)やMIDI(.mid)等は使えません。(Silverlight5で追加されたXNAのサウンド機能では逆に.wavだけ使えて.mp3等は使えません)

使い方はスプライトのときとほとんど一緒で、MediaElementコントロールをCanvasの子として登録するだけです。他のコントロール同様XAMLで登録できます。

<Canvas x:Name="LayoutRoot">
    <MediaElement x:Name="Music" Source="music.mp3" AutoPlay="True"/>
</Canvas>

Sourceで再生するファイルはリソースとしてプロジェクトに登録しておく必要があります。その際、ビルドアクションが「埋め込まれたリソース」では駄目で、「Resource」にする必要がありました。(日本語版 Silverlight tools RC0を使用)

AutoPlay="True"は、このページが読み込まれると同時に、自動的に再生を開始する設定です。

BGMとして使用する場合はループ再生させる必要がありますが、何故かMediaElementにはループ設定がなく、MediaEndedイベントを使って自分でループを実装する必要があります。

public Page()
{
    InitializeComponent();
    Music.MediaEnded += new RoutedEventHandler(Music_MediaEnded);
}

void Music_MediaEnded(object sender, EventArgs e)
{
    Music.Position = new TimeSpan(0);
    Music.Play();
}

つなぎ目の無いシームレスなループは無理なようで、ループする際に一瞬音が途切れてしまいます。

MediaEndedイベントを使わずに、ループ終了位置の後ろにループ開始位置のデータを連結したファイルを用意し、Positionがループ終了位置を越えていたらループ開始位置+越えた分に設定しなおすという方法を試しましたが、これでも少し途切れてしまいました。こちらの方が、MediaEndedイベントよりは多少マシで無音部分は1/2〜1/3程度に軽減されました。

短いフレーズをループで繰り返すようなBGMは諦めた方がいいかもしれません。これはBGMよりも、継続的に鳴り続ける効果音で致命的なので、何か対策があればいいのですが。

ところで、主に画像を定義するXAMLでBGMも指定できるというのは、意外と便利そうです。例えばゲームのシーン毎にBGMを指定するのに、従来ならばBGM設定を画像とは別に管理する必要がありましたが、画像と同時に扱えれば管理がとても楽になります。フラグによってBGMが変化するというような柔軟な対応は難しいかもしれませんが、MediaElementに付ける名前の命名規則である程度は対応可能だと思います。

タグ:Silverlight
2008年11月07日 【プログラミング】 | コメント(0) |

この記事へのトラックバックURL


この記事へのトラックバック
この記事へのコメント

コメントを書く
お名前: [必須入力]

メールアドレス:

ホームページアドレス:

コメント: [必須入力]

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。
×

この広告は1年以上新しい記事の投稿がないブログに表示されております。