Microsoft DirectX 8.0 (C++) |
ここでは、セグメントの演奏のタイミングに関するさまざまな面について説明する。
セグメントのタイムとパフォーマンスのタイムとの関係を明確にするために、ここでは次の用語を使用する。
注 開始マーカーおよび演奏マーカーは、オーサーによってセグメントのマーカー トラックに配置され、アプリケーションで変更することはできない。ただし、GUID_Valid_Start_Time および GUID_Play_Marker パラメータを使用して取得できる。
セグメントは、通常、最初から演奏される。IDirectMusicSegment8::SetStartPoint メソッドを使用して、別のポイントからセグメントを開始することもできる。新しい開始ポイントは、変更されるまで有効である。
IDirectMusicSegment8::SetRepeats を使ってリピート回数を設定した場合、IDirectMusicSegment8::SetLoopPoints を呼び出してループを定義しなければ、セグメント全体がその回数だけ反復される。
演奏タイムは、IDirectMusicPerformance8::PlaySegment または IDirectMusicPerformance8::PlaySegmentEx メソッドの 2 つのパラメータによって決定される。
セグメントの開始タイムを制御セグメントの次のグリッド、拍、または小節に揃える代わりに、セグメントの演奏をすぐに開始し、現在のセグメントのリズムに合わせたい場合がある。このようにするには、セグメントの開始ポイントのキューを既に経過したリズム境界に与える。キューを与えたセグメントのリズムは、現在のセグメントに揃えられ、新しいセグメントは直ちに演奏を開始できる。
過去のセグメントにキューを与えるには、DMUS_SEGF_ALIGN フラグを使用する。適切なリズム境界でセグメントの開始ポイントにキューを与えるには、DMUS_SEGF_GRID、DMUS_SEGF_BEAT、または DMUS_SEGF_MEASURE のいずれかを追加する。この代わりに、DMUS_SEGF_MARKER を使用して、開始ポイントを制御セグメントの最後に演奏された演奏マーカーに揃えることもできる。
開始ポイントが過去である場合、セグメントの開始タイムが現在または将来になるように調整しなければならない。パフォーマンスは、次の規則に従って、セグメントの開始タイムを決定する。いずれの場合も、"次" とは "次に可能" であることを意味する。つまり、セグメントの、過去ではない部分にあるという意味である。
演奏マーカーと開始マーカーによって、セグメント、特にモチーフに柔軟にキューを与えることができる。モチーフが、プライマリ セグメントの小節の先頭で演奏を開始するときに最適に演奏されるように作成されているとする。このモチーフに DMUS_SEGF_MEASURE フラグでキューを与えると、次の小節境界に達して、モチーフが演奏されるまでに大幅な遅延が発生する場合がある。しかし、DMUS_SEGF_ALIGN フラグを追加すると、リズムを乱すことなく、すぐにモチーフの演奏を開始できる。DMUS_SEGF_MARKER フラグを追加すると、小節、拍、またはグリッドだけでなく、制御セグメント内の適切な境界でモチーフを演奏できるようになる。
テンポの変更によってセグメントの開始タイムが受ける影響については、「クロック タイムとミュージック タイム」を参照すること。
次の図は、DMUS_SEGF_MEASURE、DMUS_SEGF_ALIGN、および DMUS_SEGF_VALID_START_BEAT の各フラグを使ってキューに入れられたセグメントのタイミングを決定する過程を示している。縦の実線は小節の境界を示し、点線は拍の境界を示す。セグメントの開始ポイントは、現在のプライマリ セグメントの前にある小節境界に揃えられる。セグメントの開始タイムは、未解決の演奏タイムの後に挿入されているセグメントの最初の拍になる。
一部のイベントは、論理的なタイムと実際のタイムの両方を持っている。実際のタイムはイベントが発生するときであり、論理的なタイムはイベントが属する音楽的な位置を表す。
たとえば、セグメントは、拍の開始に属するプログラム チェンジを含む場合がある。この拍の開始は論理的なタイムである。しかし、拍のノートが演奏される前にプログラム チェンジが行われるようにしたいので、これよりも少し早い物理的なタイムを割り当てる。
セグメントが論理的なタイム (同じ拍の開始) にループする場合、プログラム チェンジも行われる。