Microsoft DirectX 8.0 (C++) |
バンド セグメントを演奏するときに重要な問題となるのは、スタイル トラックで演奏されるノートのタイミングのばらつきである。たとえば、小節 1 の 1 拍目のノートが、実際の拍の境界よりわずかに進んだり遅れたりする場合がある。バンド セグメントではこの状況を認識していないので、いくつかのノートが間違った音色で演奏される場合がある。
この問題を避けるために、アプリケーションはバンド セグメントを早めにキューに格納するべきである。たとえば、スタイル セグメントの pStyleSeg とバンド セグメントの pBandSeg があるときに、パフォーマンス (pPerf) の次の小節境界で、スタイル セグメントとバンド セグメントの両方を演奏する場合を考える。スタイルには、セグメントの開始タイムよりも、最大 30 ティック (ミュージック タイムで) 早く開始される可能性のあるノートが含まれていることがわかっている。次のサンプル コードでは、バンド セグメントがスタイル セグメントよりも 31 ティック前に演奏されることが保証されている。したがって、すべての音色は、ノートが演奏される前に適切に設定される。
// まず、次の小節のタイムを取得して、 // ミュージック タイムに変換する。 REFERENCE_TIME rtResolved; MUSIC_TIME mtResolved; pPerf->GetResolvedTime( 0, &rtResolved, DMUS_TIME_RESOLVE_MEASURE ); pPerf->ReferenceToMusicTime( rtResolved, &mtResolved ); // バンド セグメントを、小節境界の 31 ティック前に演奏する。 mtResolved -= 31; pPerf->PlaySegment(pBandSeg, 0, mtResolved, NULL); // スタイル セグメントを小節境界で演奏する。 pPerf->PlaySegment(pStyleSeg, DMUS_TIME_RESOLVE_MEASURE, 0, NULL);
注 セグメントで演奏されるノートにばらつきがない場合 (たとえば、MIDI ファイルからロードされたセグメントの場合) は、同時に演奏されるバンド セグメントのタイミングについて注意する必要はない。デフォルトでは、すべてのバンド セグメントは 1 ティック早く開始される。