Platform SDK: DirectX |
ここでは、C++ でのアプリケーション開発について説明する。Visual Basic については、「DirectMusic Visual Basic チュートリアル」を参照すること。
サンプル アプリケーション DMDonuts 内の DirectMusic の 1 回限りの初期化はここまでで完了した。setup_game 関数内で行われるこれ以降の初期化は、ゲームのスタート時、またはプレーヤーが次のレベルへ進むたびに実施される。
setup_game 関数は、最初に ComposeNewSegments 関数を呼び出す。この関数は現在のゲーム レベルに基づいてスタイルとコード マップを選択し、それまでに作成したセグメントを解放する。続いて、これまでにファイルからロードしたテンプレートに基づいて 2 つの新しいセグメントを作成する。これらのセグメントのうち、1 つはアステロイド (小惑星) が衝突するまで演奏される導入のテーマであり、もう 1 つはその時点からプレーヤーのレベルが上がるまで演奏される。変数 snSubLevel は、現在のレベルでどのパートを使っているか追跡し、ほかの場所では、F7 キーを押して音楽を切り替えるよう指示されたときにどのセグメントを演奏すべきか決定するために使われる。
snSubLevel = 1; snLastTempo = 0; gnLastStyle = gnCurrentStyle; gnLastChordMap = gnCurrentChordMap; gnCurrentStyle = level % NUM_STYLES; gnCurrentChordMap = ((level - 1) / 2) % NUM_CHORDMAP; HRESULT hr = S_OK; MUSIC_TIME mtSegmentLength; if (gapSegment[SEGMENT_1]) { gapSegment[SEGMENT_1]->Release(); } hr = gpComposer->ComposeSegmentFromTemplate( gapStyle[gnCurrentStyle], gpIntroTemplate, 0, gapChordMap[gnCurrentStyle][gnCurrentChordMap], &gapSegment[SEGMENT_1] ); if (!SUCCEEDED(hr)) { CleanupAndExit("Segment 1 composition failed"); }
ここで、このテンプレートの最後の小節にサイン ポストがあり、それが最初の小節のサイン ポストと一致していることに気づく。これは自然なループを実現するためである。セグメントを作成した後で、最後の小節はループから外される。MEASURE_LENGTH の値が、「ステップ 1 : define とグローバル」で (DMUS_PPQ * 4)、つまりミュージック タイムの 4 分音符として計算される点に注意すること。拍子記号が 4/4 であるので、これは有効である。
gapSegment[SEGMENT_1]->GetLength(&mtSegmentLength); gapSegment[SEGMENT_1]->SetLength( mtSegmentLength - MEASURE_LENGTH);
最後に、このセグメントがループを繰り返すように設定される。
gapSegment[SEGMENT_1]->SetRepeats(999);
gpGameTemplate に基づく 2 番目のセグメントの作成と設定も同じ方法で行われる。