//-----------------------------------------------------------------------------
//
// Sample Name: VB PlayMotif Sample
//
// Copyright (C) 1999-2001 Microsoft Corporation. All rights reserved.
//
// GM/GS® Sound Set Copyright ©1996, Roland Corporation U.S.
//
//-----------------------------------------------------------------------------
Description
===========
The PlayMotif sample demonstrates how a motif played as a secondary
segment can be aligned to the rhythm of the primary segment in various ways.
Path
====
Source: DXSDK\Samples\Multimedia\VBSamples\DirectMusic\PlayMotif
Executable: DXSDK\Samples\Multimedia\VBSamples\DirectMusic\Bin
User's Guide
============
Play the default segment, or load another DirectMusic Producer segment
that contains motifs. Select one of the patterns in the list box and
one of the Align Option buttons, and then click Play Motif. Note how
the motif does not begin playing until an appropriate boundary in the
primary segment has been reached.
Programming Notes
=================
The PlayMotif sample is very similar in form to the PlayAudio sample. For
detailed programming notes on the basics this sample, refer to Programming
Notes section of the PlayAudio sample.
The PlayMotif differs by letting the user play any of motifs contained
inside the segment. Here's how:
* When loading the file it does the same steps as the PlayAudio
sample, but also:
1. It loops thru each style in the segment, searching it for
motifs. It calls DirectMusicSegment8.GetStyle passing
an increasing style index to get each of the styles. When
this returns error then there are no more styles.
2. For each style, it calls DirectMusicStyle.GetMotifCount.
It then loops through each Motif, and stores the motif name
in the list box.
3. With the motif name it calls DirectMusicStyle::GetMotif
to get a DirectMusicSegment pointer to the motif, and
stores this for later use.
* When "Play Motif" is clicked. See cmdPlayMotif_Click().
1. It gets the desired alignment option from the UI.
2. It gets the selected motif from our interal list.
3. It calls DirectMusicPerformance::PlaySegmentEx passing in
the motif's DirectMusicSegment and flags which have
DMUS_SEGF_SECONDARY as well as any alignment option.
* When DirectMusic notifications occur, it is similar to PlayAudio but
now the app also takes note of any motif starting or stopping and
updates the play count. If the play count is greater than zero then
it updates the UI to show that the motif is playing. Most games
would not need this functionality, but here's how its done:
See DirectXEvent8_DXCallback.
- Call DirectMusicPerformance8::GetNotificationPMsg.
- Check if the pPMsg->lNotificationOption.
- If it is a DMUS_NOTIFICATION_SEGSTART. This tells
us that a segment has ended. It may be for a motif or the primary
or some embedded segment in the primary segment.
- If it is a DMUS_NOTIFICATION_SEGEND. This tells
us that a segment has ended. It may be for a motif or the primary
or some embedded segment in the primary segment.
- For either SEGSTART or SEGEND the code is similar:
1. Get a DirectMusicSegmentState8 from pPMsg.User.
2. Using the IDirectMusicSegmentState8, call GetSegment to
get a DirectMusicSegment of the segment it refers to.
This call may fail is the segment may have gone away before this
notification was handled.
4. Compare this segment to the primary segment to see if this was
the primary segment. If it was, then update the UI. If its not
then compare it to each of the motif's segments. If a match is
found update the UI accordingly.
5. Cleanup all the interfaces.