241 lines
10 KiB
D
241 lines
10 KiB
D
|
// autodoc's for stuff that's in the public header files
|
||
|
// @doc EXTERNAL
|
||
|
/*
|
||
|
@struct DMUS_PMSG | DMUS_PMSG structure. This is the base message for all
|
||
|
messages queued to the Performance. DMUS_PMSG's are created by calling
|
||
|
<om IDirectMusicPerformance.AllocPMsg>.
|
||
|
*/
|
||
|
typedef struct DMUS_PMSG
|
||
|
{
|
||
|
void* pvReserved; // @field Reserved for use by the Performance. Do not modify.
|
||
|
DWORD dwSize; // @field Stores the full size of the message. Do not modify.
|
||
|
REFERENCE_TIME rtTime; // @field The message time, in <t REFERENCE_TIME> format.
|
||
|
// This field is considered valid only if the dwFlags
|
||
|
// field has DMUS_PMSGF_REFTIME set.
|
||
|
MUSIC_TIME mtTime; // @field The message time, in <t MUSIC_TIME> format.
|
||
|
// This field is considered valid only if the dwFlags
|
||
|
// field has DMUS_PMSGF_MUSICTIME set.
|
||
|
DWORD dwFlags; // @field Various bits. See <t DMUS_PMSGF_FLAGS>.
|
||
|
DWORD dwPChannel; // @field Performance Channel. The Performance can
|
||
|
// use this to determine the port/channel.
|
||
|
DWORD dwVirtualTrackID; // @field Virtual track ID. This identifies the exact
|
||
|
// <i IDirectMusicTrack> that created this message. May
|
||
|
// be 0 if this message was not created by a Track.
|
||
|
IDirectMusicTool* pTool; // @field <i IDirectMusicTool> pointer. This is normally set
|
||
|
// by calling <om IDirectMusicGraph.StampPMsg>.
|
||
|
IDirectMusicGraph* pGraph; // @field <i IDirectMusicGraph> pointer. This is normally
|
||
|
// set by calling <om IDirectMusicGraph.StampPMsg>.
|
||
|
DWORD dwType; // @field message type. See <t DMUS_PMSGT_TYPES>.
|
||
|
IUnknown* punkUser; // @field User com pointer, auto released upon a call
|
||
|
// to <om IDirectMusicPerformance.FreePMsg>.
|
||
|
} DMUS_PMSG;
|
||
|
/*
|
||
|
@enum DMUS_PMSGF_FLAGS | <t DMUS_PMSGF_FLAGS> are used inside the dwFlags
|
||
|
member of the <t DMUS_PMSG>.
|
||
|
*/
|
||
|
typedef enum enumDMUS_PMSGF_FLAGS
|
||
|
{
|
||
|
DMUS_PMSGF_REFTIME = 1, // @emem Set if rtTime is valid.
|
||
|
DMUS_PMSGF_MUSICTIME = 2, // @emem Set if mtTime is valid.
|
||
|
DMUS_PMSGF_TOOL_IMMEDIATE = 4, // @emem Set if the message should execute right away, regardless of its time-stamp. See
|
||
|
// <om IDirectMusicPerformance.SendPMsg>.
|
||
|
DMUS_PMSGF_TOOL_QUEUE = 8, // @emem Set if the message should execute just prior to its time-stamp. See
|
||
|
// <om IDirectMusicPerformance.SendPMsg>.
|
||
|
DMUS_PMSGF_TOOL_ATTIME = 16 // @emem Set if message should execute exactly at its time-stamp. See
|
||
|
// <om IDirectMusicPerformance.SendPMsg>.
|
||
|
DMUS_PMSGF_TOOL_FLUSH = 32 // @emem Set if the message is being flushed.
|
||
|
} DMUS_PMSGF_FLAGS;
|
||
|
|
||
|
// DMUS_PMSGT_TYPES defines
|
||
|
// @enum DMUS_PMSGT_TYPES | <t DMUS_PMSGT_TYPES> are used inside the dwType
|
||
|
// member of the <t DMUS_PMSG>, and identify the type of message.
|
||
|
typedef enum enumDMUS_PMSGT_TYPES
|
||
|
{
|
||
|
DMUS_PMSGT_MIDI = 0, // @emem MIDI short message
|
||
|
DMUS_PMSGT_NOTE = 1, // @emem Interactive Music Note
|
||
|
DMUS_PMSGT_SYSEX = 2, // @emem MIDI long message (system exclusive message)
|
||
|
DMUS_PMSGT_NOTIFICATION = 3, // @emem Notification message
|
||
|
DMUS_PMSGT_TEMPO = 4, // @emem Tempo message
|
||
|
DMUS_PMSGT_CURVE = 5, // @emem Control change / pitch bend, etc. curve
|
||
|
DMUS_PMSGT_TIMESIG = 6, // @emem Time signature
|
||
|
DMUS_PMSGT_PATCH = 7, // @emem Patch changes
|
||
|
DMUS_PMSGT_USER = 255 // @emem User message
|
||
|
} DMUS_PMSGT_TYPES;
|
||
|
|
||
|
/* The following flags are sent in the IDirectMusicTrack::Play() method */
|
||
|
/* inside the dwFlags parameter */
|
||
|
typedef enum enumDMUS_TRACKF_FLAGS
|
||
|
{
|
||
|
DMUS_TRACKF_SEEK = 1, /* set on a seek */
|
||
|
DMUS_TRACKF_LOOP = 2, /* set on a loop (repeat) */
|
||
|
DMUS_TRACKF_START = 4, /* set on first call to Play */
|
||
|
DMUS_TRACKF_FLUSH = 8 /* set when this call is in response to a flush on the perfomance */
|
||
|
} DMUS_TRACKF_FLAGS;
|
||
|
|
||
|
/*
|
||
|
@struct DMUS_NOTE_PMSG | Based off of <t DMUS_PMSG>, the <t DMUS_NOTE_PMSG>
|
||
|
represents an interactive music note.
|
||
|
*/
|
||
|
typedef struct DMUS_NOTE_PMSG : DMUS_PMSG
|
||
|
{
|
||
|
MUSIC_TIME mtDuration; // @field Duration
|
||
|
WORD wMusicValue; // @field Description of note in chord and key.
|
||
|
WORD wMeasure; // @field Measure in which this note occurs
|
||
|
short nOffset; // @field Offset from grid at which this note occurs
|
||
|
BYTE bBeat; // @field Beat (in measure) at which this note occurs
|
||
|
BYTE bGrid; // @field Grid offset from beat at which this note occurs
|
||
|
BYTE bVelocity; // @field Note velocity
|
||
|
BYTE bFlags; // @field See <t DMNoteEventFlags>
|
||
|
BYTE bTimeRange; // @field Range to randomize time.
|
||
|
BYTE bDurRange; // @field Range to randomize duration.
|
||
|
BYTE bVelRange; // @field Range to randomize velocity.
|
||
|
BYTE bInversionID; // @field Identifies inversion group to which this note belongs
|
||
|
BYTE bPlayModeFlags; // @field Play mode.
|
||
|
BYTE bMidiValue; // @field The MIDI note value, converted from wMusicValue.
|
||
|
} DMUS_NOTE_PMSG;
|
||
|
|
||
|
/*
|
||
|
@enum DMUS_NOTEF_FLAGS | Used in the bFlags field of <t DMUS_NOTE_PMSG>.
|
||
|
Currently there is only one flag, DMUS_NOTEF_NOTEON. If it is set, the <t DMUS_NOTE_PMSG>
|
||
|
represents a MIDI Note On. If it is not set, it represents a MIDI Note Off. When
|
||
|
a <t DMUS_NOTE_PMSG> is first queued via <om IDirectMusicPerformance.SendPMsg>,
|
||
|
this flag should be set. The <t DMUS_NOTE_PMSG> will flow through the <i IDirectMusicGraph>
|
||
|
and any <i IDirectMusicTool>'s in the graph, until it reaches the final MIDI Output Tool.
|
||
|
The final MIDI Output Tool looks at the <t DMUS_NOTE_PMSG>'s bFlags field. When it sees
|
||
|
that DMUS_NOTEF_NOTEON is set, it sends a MIDI Note On message to the correct Port (according to
|
||
|
the <t DMUS_NOTE_PMSG>'s <t DMUS_PMSG>'s dwPChannel. It then clears the DMUS_NOTEF_NOTEON
|
||
|
flag, adds mtDuration to the mtTime, and requeues the message.
|
||
|
*/
|
||
|
typedef enum enumDMUS_NOTEF_FLAGS
|
||
|
{
|
||
|
DMUS_NOTEF_NOTEON = 1, // @emem Set if this is a MIDI Note On. Otherwise, it is MIDI Note Off.
|
||
|
} DMUS_NOTEF_FLAGS;
|
||
|
|
||
|
/*
|
||
|
@struct DMUS_MIDI_PMSG | Based off of <t DMUS_PMSG>, <t DMUS_MIDI_PMSG> performs a standard MIDI message.
|
||
|
*/
|
||
|
typedef struct DMUS_MIDI_PMSG : DMUS_PMSG
|
||
|
{
|
||
|
BYTE bStatus; // @field Standard MIDI status byte.
|
||
|
BYTE bByte1; // @field Standard MIDI message first byte field. Ignored for MIDI
|
||
|
// messages that don't require it.
|
||
|
BYTE bByte2; // @field Standard MIDI message second byte field. Ignored for MIDI
|
||
|
// messages that don't require it.
|
||
|
BYTE bPad[1];
|
||
|
} DMUS_MIDI_PMSG;
|
||
|
|
||
|
/* DMUS_PATCH_PMSG */
|
||
|
typedef struct DMUS_PATCH_PMSG
|
||
|
{
|
||
|
/* begin DMUS_PMSG_PART */
|
||
|
DMUS_PMSG_PART
|
||
|
/* end DMUS_PMSG_PART */
|
||
|
|
||
|
BYTE byInstrument;
|
||
|
BYTE byMSB;
|
||
|
BYTE byLSB;
|
||
|
BYTE byPad[1];
|
||
|
DWORD dwGroup;
|
||
|
DWORD dwMChannel;
|
||
|
} DMUS_PATCH_PMSG;
|
||
|
|
||
|
// DMUS_TEMPO_PMSG
|
||
|
/*
|
||
|
@struct DMUS_TEMPO_PMSG | Based off of <t DMUS_PMSG>, <t DMUS_TEMPO_PMSG> controls the performance's tempo.
|
||
|
*/
|
||
|
typedef struct DMUS_TEMPO_PMSG : DMUS_PMSG
|
||
|
{
|
||
|
double dblTempo; // @field The tempo.
|
||
|
} DMUS_TEMPO_PMSG;
|
||
|
|
||
|
#define TEMPO_MAX 350
|
||
|
#define TEMPO_MIN 10
|
||
|
#define RELTEMPO_MAX 200
|
||
|
#define RELTEMPO_MIN 0
|
||
|
|
||
|
// DMUS_SYSEX_PMSG
|
||
|
/*
|
||
|
@struct DMUS_SYSEX_PMSG | Based off of <t DMUS_PMSG>, <t DMUS_SYSEX_PMSG> represents a System Exclusive message.
|
||
|
*/
|
||
|
typedef struct DMUS_SYSEX_PMSG : DMUS_PMSG
|
||
|
{
|
||
|
DWORD dwLen; // @field Length of the data.
|
||
|
BYTE* abData; // @field Array of data, with length equal to dwLen.
|
||
|
} DMUS_SYSEX_PMSG;
|
||
|
|
||
|
// DMUS_CURVE_PMSG
|
||
|
/*
|
||
|
@struct DMUS_CURVE_PMSG | Based off of <t DMUS_PMSG>, <t DMUS_CURVE_PMSG> represents a curve (e.g., a sequence of
|
||
|
Continuous Controller messages.
|
||
|
*/
|
||
|
typedef struct DMUS_CURVE_PMSG : DMUS_PMSG
|
||
|
{
|
||
|
MUSIC_TIME mtDuration; // @field How long this curve lasts.
|
||
|
MUSIC_TIME mtOriginalStart; // @field Must be set to either zero when this message
|
||
|
// is created or to the original mtTime of the curve.
|
||
|
short nStartValue; // @field The curve's start value.
|
||
|
short nEndValue; // @field The curve's end value.
|
||
|
short nResetValue; // @field The curve's reset value, sent after mtResetDuration or
|
||
|
// upon a flush or invalidation.
|
||
|
WORD wMeasure; // @field Measure in which this curve occurs.
|
||
|
short nOffset; // @field Offset from grid at which this curve occurs.
|
||
|
BYTE bBeat; // @field Beat (in measure) at which this curve occurs.
|
||
|
BYTE bGrid; // @field Grid offset from beat at which this curve occurs.
|
||
|
BYTE bType; // @field Type of curve.
|
||
|
BYTE bCurveShape; // @field Shape of curve.
|
||
|
BYTE bCCData; // @field CC# if this is a control change type.
|
||
|
BYTE bFlags; // @field Set to 1 if the nResetValue must be sent when the
|
||
|
// time is reached or an invalidate occurs because
|
||
|
// of a transition. If 0, the curve stays
|
||
|
// permanently stuck at the new value. All other bits in this field are reserved.
|
||
|
} DMUS_CURVE_PMSG;
|
||
|
|
||
|
// DMUS_TIMESIG_PMSG
|
||
|
/*
|
||
|
@struct DMUS_TIMESIG_PMSG | Based off of <t DMUS_PMSG>, <t DMUS_TIMESIG_PMSG> represents a time signature.
|
||
|
*/
|
||
|
typedef struct DMUS_TIMESIG_PMSG : DMUS_PMSG
|
||
|
{
|
||
|
// Time signatures define how many beats per measure, which note receives
|
||
|
// the beat, and the grid resolution.
|
||
|
BYTE bBeatsPerMeasure; // @field Beats per measure (top of the time signature).
|
||
|
BYTE bBeat; // @field What note receives the beat (bottom of time
|
||
|
// signature).
|
||
|
// We can assume that 0 means 256th note.
|
||
|
WORD wGridsPerBeat; // @field Grids per beat.
|
||
|
} DMUS_TIMESIG_PMSG;
|
||
|
|
||
|
// DMUS_NOTIFICATION_PMSG
|
||
|
/*
|
||
|
@struct DMUS_NOTIFICATION_PMSG | Based off of <t DMUS_PMSG>, <t DMUS_NOTIFICATION_PMSG> represents a notification.
|
||
|
*/
|
||
|
typedef struct DMUS_NOTIFICATION_PMSG : DMUS_PMSG
|
||
|
{
|
||
|
DWORD dwNotifyType; // @field Type of notification.
|
||
|
DWORD dwField1; // @field Extra data specific to the type of notification.
|
||
|
DWORD dwField2; // @field Extra data specific to the type of notification.
|
||
|
} DMUS_NOTIFICATION_PMSG;
|
||
|
|
||
|
/*
|
||
|
GUID_Global_Data | Global Data Guids
|
||
|
GUID_PerfRelTempo | Get/Set relative tempo on the <i IDirectMusicPerformance>.
|
||
|
Relative tempo spans all segments. Valid values range from 0 to 200, with 0 meaning
|
||
|
half-tempo, 100 meaning normal tempo, and 200 meaning double-tempo. The data type
|
||
|
associated with the global value is a DWORD.
|
||
|
GUID_PerfRelVolume | Get/Set relative volume on the <i IDirectMusicPerformance>.
|
||
|
Relative volume spans all segments.
|
||
|
|
||
|
<om IDirectMusicPerformance.GetGlobal>, <om IDirectMusicPerformance.SetGlobal>
|
||
|
*/
|
||
|
|
||
|
GUID_EnableTempo
|
||
|
GUID_DisableTempo
|
||
|
|
||
|
Send these GUID's to SetParam() and IsParamSupported() to disable sending and supporting
|
||
|
Tempo. Note that if a Track has received
|
||
|
GUID_DisableTempo, it will no longer return S_OK for GUID_DisableTempo or GUID_TempoTrack
|
||
|
from IsParamSupported(), but will return S_OK for GUID_EnableTempo. After reenabling, it
|
||
|
will return to its original state of supporting Tempos.
|
||
|
|
||
|
DMUS_E_TYPE_DISABLED will be returned from GetParam() and SetParam()
|
||
|
if the type is currently disabled.
|