Platform SDK: DirectX

確実なタイミングでのバンド チェンジ

バンド セグメントを演奏するときに重要な問題となるのは、スタイル トラックで演奏される音符のタイミングのばらつきである。たとえば、小節 1 の 1 拍目の音符が、実際の拍の境界よりわずかに進んだり遅れたりする場合がある。バンド セグメントではこの状況を承知していないので、いくつかの音符が間違った音色で演奏される場合がある。

[C++]

この問題を避けるために、アプリケーションはバンド セグメントを早めにキューに格納するべきである。たとえば、スタイル セグメントの 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);
[Visual Basic]

この問題を避けるために、アプリケーションはバンド セグメントを早めにキューに格納するべきである。たとえば、スタイル セグメントの styleSeg とバンド セグメントの bandSeg があり、パフォーマンス (perf) の次の小節境界で、スタイル セグメントとバンド セグメントの両方を演奏する場合を考える。スタイルには、セグメントの開始タイムよりも、最大 30 ティック (ミュージック タイムで) 早く開始される可能性のある音符が含まれていることがわかっている。次のコード例では、バンド セグメントがスタイル セグメントよりも 31 ティック前に演奏されることが保証されている。したがって、すべての音色は、音符が演奏される前に適切に設定される。

'まず、次の小節のタイムを取得して、
' ミュージック タイムに変換する。
 
Dim ctResolved As Long
Dim mtResolved As Long
 
ctResolved = perf.GetResolvedTime(ctResolved, DMUS_SEGF_MEASURE)
mtResolved = perf.ClockToMusicTime(ctResolved)
 
' バンド セグメントを、小節境界の 31 ティック前に演奏する。
 
mtResolved = mtResolved - 31 
Call perf.PlaySegment(bandSeg, 0, mtResolved)
 
' スタイル セグメントを小節境界で演奏する。
 
Call perf.PlaySegment(styleSeg, DMUS_SEGF_MEASURE, 0 )

 :  セグメントで演奏される音符にばらつきがない場合 (たとえば、MIDI ファイルに基づくセグメントの場合) は、同時に演奏されるバンド セグメントのタイミングについて注意する必要はない。デフォルトでは、すべてのバンド セグメントは 1 ティック早く開始される。