Microsoft DirectX 8.0 (C++)

カーブ

カーブは、MIDI コントローラの一連の変更で構成され、値がなめらかにトランジションする。たとえば、ボリュームのフェードアウトまたはフェードインがある。

DMUS_CURVE_PMSG 型の 1 つのパフォーマンス メッセージを送信することによってカーブを実行できる。この構造体を使用すると、カーブの開始時と終了時の値、期間、および形状を設定できる。オプションで、コントローラが無効の場合に返されるリセット値を設定することもできる。

このメッセージ構造体の wMeasurenOffsetbBeatbGrid、および mtOriginalStart メンバは、情報提供だけを目的としており、メッセージのタイミングには影響しない。これらは、DirectMusic Producer セグメントによって送信されたメッセージ内に設定され、ツールで使用される。通常、アプリケーションではこれらのメンバを 0 に設定できる。

wMergeIndex メンバは、変更が累積であるかオーバーライドであるかを示す。マージ インデックスが異なる場合、2 つのカーブ メッセージは累積される。マージ インデックスが同じ場合は、前のメッセージによる設定が新しいメッセージによって順次オーバーライドされる。

bCCData メンバは、コントローラの変更の対象となる MIDI コントローラ番号を含み、空の場合は無視される。コントローラ番号については、MIDI の仕様を参照すること。

次のサンプル コードでは、現在の値からボリュームを下げて 5 秒後に 0 になるようにしている。この時間内に、現在再生中のセグメントがほかのセグメントに置き換えられてコントローラが無効になった場合は、最大ボリュームが復元される。

DMUS_CURVE_PMSG *pCurveMsg;
HRESULT hr = g_pPerf->AllocPMsg(sizeof(DMUS_CURVE_PMSG), 
        (DMUS_PMSG**) &pCurveMsg);
ZeroMemory(pCurveMsg, sizeof(DMUS_CURVE_PMSG));

pCurveMsg->dwSize = sizeof(DMUS_CURVE_PMSG);
pCurveMsg->rtTime = 0;
pCurveMsg->dwFlags = DMUS_PMSGF_DX8 | DMUS_PMSGF_REFTIME
        | DMUS_PMSGF_LOCKTOREFTIME;  
pCurveMsg->dwPChannel = DMUS_PCHANNEL_BROADCAST_PERFORMANCE;
pCurveMsg->dwType = DMUS_PMSGT_CURVE;
pCurveMsg->dwGroupID = 0xFFFFFFF;
pCurveMsg->mtDuration = 5000;
pCurveMsg->nEndValue = 0;
pCurveMsg->bCurveShape = DMUS_CURVES_LINEAR;
pCurveMsg->bCCData = 7;
pCurveMsg->bFlags = DMUS_CURVE_RESET | DMUS_CURVE_START_FROM_CURRENT;
pCurveMsg->bType = DMUS_CURVET_CCCURVE ;

pCurveMsg->mtResetDuration = 0;
pCurveMsg->nResetValue = 127;

g_pPerf->SendPMsg((DMUS_PMSG*) pCurveMsg);

  より簡単にボリュームのフェードを実装するには、IDirectMusicAudioPath8::SetVolume を使用する。このメソッドでは、常に、カーブに平行なシェイプを使用する。