読者です 読者をやめる 読者になる 読者になる

tmytのらくがき

個人の日記レベルです

クリスマスなのでXAMLでBGM流してみる

XAML Advent Calender 25日目の記事です。

ついにやってきました。待ちに待ったクリスマスです!みなさん今日はもう大忙しですよね!

さて、そんなことはどうでもよくて、これまで人は数々のXAMLの限界に挑戦してきました。

f:id:tmyt:20131225000800p:plain

- http://grabacr.net/archives/795

  • まず、XAMLはお絵かきツールではありません。
  • 次に、XAMLはアニメを作るツールではありません。

ここに足りないものは何でしょうか。そう、音楽です。絵やアニメが作れてもそこにBGMがなければ作品は完成しないのです。 ということで、今回はXAMLで音楽を再生してみようと思いました。

まず、XAMLで音を再生するにはこのように書けばとりあえずなります。

<MediaElement Source="path/to/media.mp3" />

ところでこれ、なんかずるくないですか。だってこれ、MediaElementだし、音声ファイルそもそもMP3だし、 なによりXAMLっぽくないし。 ということで、考えました。XAMLで音楽を表現するにはどうすれば…

ここでひらめいたのがこれです。

<Track>
    <Tone Scale="C4" Length="EighthNote"/>
    <Tone Scale="D4" Length="EighthNote"/>
    <Tone Scale="E4" Length="QuarterNote"/>
</Track>

どうです、どこからみてもXAMLです。XAMLでButtonやPathやStoryboardが表現できるのであれば、 XAMLで楽譜が表現できてもおかしくないはずです。

そうして出来上がったのがこちら。

https://github.com/tmyt/XamlSynthesizer

実際にどんなのが再生されるかは各自のPCでお試しください。*1

技術的なおはなし

なんかこれだけでおわるとぐらばくさん*2に怒られそうなので技術的なお話を少し。

今回のこれは、結局XAMLとか言いつつも楽譜データを構築するクラスを作っただけです。 内部的には大まかに次の3つに分かれます。

  • Micro Xylph (波形合成ソフトウェア)
  • XAudio2での音声再生
  • XAMLで利用可能な楽譜表現およびビヘイビア

また、これらを使用してアプリケーションとして仕立てあげているSample.exeというのもありますがまぁXAMLが書いてあるだけなので割愛。

Micro Xylphについてはnanase氏のものをWinRTでビルドできるようにしただけのものをソースコード含めてそのまま使用しています。 波形生成まで作る気力がありませんでした。

次にXAudio2でも音声再生ですが、WinRTにおいてメモリ上で生成した波形を再生するには以下に挙げるいくつかの手法があります。

  • MemoryStreamにRIFFを構築してMediaElementで再生
  • C++でXAudio2をたたいて再生

これらの違いはC#でたたけるか。と、ストリーム再生ができるか。といったところでしょうか。 MediaElementでもストリーム再生することもできるはずですが、わりとめんどくさかった気がします。

今回は、もともとMicro XylphがOpenALを使用して再生されていたので その箇所をまるまるXAudio2で置き換えたような形になっています。 といってもXAudio2で再生するコードはほぼサンプルそのままですし、 特に難しいことはしていません。エラー処理も全然やってないのであまりよくない例です。

最後にXAMLで表現可能な楽譜表現およびビヘイビアですが、 特に書くこともないです。XAMLで表現したときにきもちわるくないように クラス化し、XAMLで表現してみただけです。

せっかくXAMLなのでPlaySongActionとかつくって、PlaySoundActionみたいなふりはしてみました。 といっても別段特筆することもありませんね。

と、XAMLでBGM鳴らしてみただけなのに裏側ではこういう感じで実装されていたのでした。

Special thanks

今回、XAMLで音を再生するにあたりMicro Xylphを使用させていただきました。ありがとうございます。

余談

みんなで楽しんだAdvent Calendarもいよいよ明日で最後!一番最後を締めくくるのは、XAML ACのボスであるぐらばくさんです。ぐらばくさんすっげぇやつおねがいします!!

f:id:tmyt:20131225001638p:plain

*1:諸事情でモノフォニックになってしまいました。

*2:XAML ACのボス