02.回す!

前回でとりあえず鳴るようにはなりましたが、鳴らすだけ鳴らしてハイ終わりなんて寂しすぎるじゃありませんか!
DirectXが主に対象にしているゲームでは、多くの場合音楽は一回だけ流れるのではなく、ずーっと繰り返し繰り返し流れ続けます。
DirectMusicには繰り返し演奏の機能が付いていますので、それを使って繰り返し演奏をします。
変数名などは前回と同じにします。

SetRepeatsメソッド

繰り返しはリピートだからこれです。そのまんまですね。
次のようにして繰り返し回数を指定します。

dmSegment.SetRepeats (繰り返し回数)

ものすごくわかりやすい書き方ですね。
ただし、書き方は簡単ですが、気をつけることがいくつかあります。
まず、「繰り返し回数」の意味です。
実際に少ない回数で繰り返すとわかりますが、実際に演奏されるのは最初の1回+繰り返し回数分なので、実際に演奏される回数は1回多くなります。
次に、ゲーム音楽でよくある無限ループの方法です。
要するに聞き終るまでは演奏終了にならなければいいのですから、とにかく大きな数を入れれば問題ないのですが、実際には-1を指定すると無限ループになるようです。
面倒ならTrue・Falseで指定するのもありかも。

SetLoopPointsメソッド

ただMIDIを何度も何度も演奏するだけだったらDirectMusicなんていらねえっつーの。
今の状態では、言ってみれば音楽は始まって終わって始まって終わって始まって終わって・・・・を繰り返していることになります。
やっぱり途中で一旦音楽が途切れて前奏がまた入るというのは気持ち悪い気がするので、キレイにループできる場所でループできるように設定します。

dmSegment.SetLoopPoints (ループ開始位置), (ループ終了位置)

さて、これまたわかりやすい文ですが、ループ位置とはどういうことでしょう。
要するに楽譜上でどの位置にあるかということですが、その単位はミュージックタイムであり、四分音符1個分が768になります。
例えば、次のような曲があったとします。
2小節目の始めから3小節目の終わりまでループする4/4拍子の曲
この場合、ループ開始位置まで四分音符4つ分ですので、768を掛けて3072、終了位置までは四分音符12個分なので、9216が、それぞれのループ位置のミュージックタイムになります。
ちなみに、最後から最初の部分に滑らかに繋がる曲であれば、両方に0を指定して全体をループさせるようにすればよいでしょう。

サンプル(2.26kilobyte)