2012-10-07 12:58:52 +00:00
/************************************************************************
* *
* dmusicf . h - - This module defines the DirectMusic file formats *
* *
* Copyright ( c ) 1998 - 1999 Microsoft Corporation
* *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
# ifndef _DMUSICF_
# define _DMUSICF_
# include <windows.h>
# define COM_NO_WINDOWS_H
# include <objbase.h>
# include <mmsystem.h>
# include <pshpack8.h>
# ifdef __cplusplus
extern " C " {
# endif
interface IDirectMusicCollection ;
# ifndef __cplusplus
typedef interface IDirectMusicCollection IDirectMusicCollection ;
# endif
/* Common chunks */
# define DMUS_FOURCC_GUID_CHUNK mmioFOURCC('g','u','i','d')
# define DMUS_FOURCC_INFO_LIST mmioFOURCC('I','N','F','O')
# define DMUS_FOURCC_UNFO_LIST mmioFOURCC('U','N','F','O')
# define DMUS_FOURCC_UNAM_CHUNK mmioFOURCC('U','N','A','M')
# define DMUS_FOURCC_UART_CHUNK mmioFOURCC('U','A','R','T')
# define DMUS_FOURCC_UCOP_CHUNK mmioFOURCC('U','C','O','P')
# define DMUS_FOURCC_USBJ_CHUNK mmioFOURCC('U','S','B','J')
# define DMUS_FOURCC_UCMT_CHUNK mmioFOURCC('U','C','M','T')
# define DMUS_FOURCC_CATEGORY_CHUNK mmioFOURCC('c','a','t','g')
# define DMUS_FOURCC_VERSION_CHUNK mmioFOURCC('v','e','r','s')
/* The following structures are used by the Tracks, and are the packed structures */
/* that are passed to the Tracks inside the IStream. */
typedef struct _DMUS_IO_SEQ_ITEM
{
MUSIC_TIME mtTime ;
MUSIC_TIME mtDuration ;
DWORD dwPChannel ;
short nOffset ;
BYTE bStatus ;
BYTE bByte1 ;
BYTE bByte2 ;
} DMUS_IO_SEQ_ITEM ;
typedef struct _DMUS_IO_CURVE_ITEM
{
MUSIC_TIME mtStart ;
MUSIC_TIME mtDuration ;
MUSIC_TIME mtResetDuration ;
DWORD dwPChannel ;
short nOffset ;
short nStartValue ;
short nEndValue ;
short nResetValue ;
BYTE bType ;
BYTE bCurveShape ;
BYTE bCCData ;
BYTE bFlags ;
/* Following was added for DX8. */
WORD wParamType ; /* RPN or NRPN parameter number. */
WORD wMergeIndex ; /* Allows multiple parameters to be merged (pitchbend, volume, and expression.) */
} DMUS_IO_CURVE_ITEM ;
typedef struct _DMUS_IO_TEMPO_ITEM
{
MUSIC_TIME lTime ;
double dblTempo ;
} DMUS_IO_TEMPO_ITEM ;
typedef struct _DMUS_IO_SYSEX_ITEM
{
MUSIC_TIME mtTime ;
DWORD dwPChannel ;
DWORD dwSysExLength ;
} DMUS_IO_SYSEX_ITEM ;
typedef DMUS_CHORD_KEY DMUS_CHORD_PARAM ; /* DMUS_CHORD_KEY defined in dmusici.h */
typedef struct _DMUS_RHYTHM_PARAM
{
DMUS_TIMESIGNATURE TimeSig ;
DWORD dwRhythmPattern ;
} DMUS_RHYTHM_PARAM ;
typedef struct _DMUS_TEMPO_PARAM
{
MUSIC_TIME mtTime ;
double dblTempo ;
} DMUS_TEMPO_PARAM ;
typedef struct _DMUS_MUTE_PARAM
{
DWORD dwPChannel ;
DWORD dwPChannelMap ;
BOOL fMute ;
} DMUS_MUTE_PARAM ;
/* Style chunks */
# define DMUS_FOURCC_STYLE_FORM mmioFOURCC('D','M','S','T')
# define DMUS_FOURCC_STYLE_CHUNK mmioFOURCC('s','t','y','h')
# define DMUS_FOURCC_PART_LIST mmioFOURCC('p','a','r','t')
# define DMUS_FOURCC_PART_CHUNK mmioFOURCC('p','r','t','h')
# define DMUS_FOURCC_NOTE_CHUNK mmioFOURCC('n','o','t','e')
# define DMUS_FOURCC_CURVE_CHUNK mmioFOURCC('c','r','v','e')
# define DMUS_FOURCC_MARKER_CHUNK mmioFOURCC('m','r','k','r')
# define DMUS_FOURCC_RESOLUTION_CHUNK mmioFOURCC('r','s','l','n')
# define DMUS_FOURCC_ANTICIPATION_CHUNK mmioFOURCC('a','n','p','n')
# define DMUS_FOURCC_PATTERN_LIST mmioFOURCC('p','t','t','n')
# define DMUS_FOURCC_PATTERN_CHUNK mmioFOURCC('p','t','n','h')
# define DMUS_FOURCC_RHYTHM_CHUNK mmioFOURCC('r','h','t','m')
# define DMUS_FOURCC_PARTREF_LIST mmioFOURCC('p','r','e','f')
# define DMUS_FOURCC_PARTREF_CHUNK mmioFOURCC('p','r','f','c')
# define DMUS_FOURCC_STYLE_PERS_REF_LIST mmioFOURCC('p','r','r','f')
# define DMUS_FOURCC_MOTIFSETTINGS_CHUNK mmioFOURCC('m','t','f','s')
/* Flags used by variations: these make up the DWORDs in dwVariationChoices. */
/* These flags determine the types of chords supported by a given variation in DirectMusic */
/* mode. The first seven flags (bits 1-7) are set if the variation supports major chords */
/* rooted in scale positions, so, e.g., if bits 1, 2, and 4 are set, the variation */
/* supports major chords rooted in the tonic, second, and fourth scale positions. The */
/* next seven flags serve the same purpose, but for minor chords, and the following seven */
/* flags serve the same purpose for chords that are not major or minor (e.g., SUS 4 */
/* chords). Bits 22, 23, and 24 are set if the variation supports chords rooted in the */
/* scale, chords rooted sharp of scale tones, and chords rooted flat of scale tones, */
/* respectively. For example, to support a C# minor chord in the scale of C Major, */
/* bits 8 (for tonic minor) and 24 (for sharp) need to be set. Bits 25, 26, an 27 handle */
/* chords that are triads, 6th or 7th chords, and chords with extensions, respectively. */
/* bits 28 and 29 handle chords that are followed by tonic and dominant chords, */
/* respectively. */
# define DMUS_VARIATIONF_MAJOR 0x0000007F /* Seven positions in the scale - major chords. */
# define DMUS_VARIATIONF_MINOR 0x00003F80 /* Seven positions in the scale - minor chords. */
# define DMUS_VARIATIONF_OTHER 0x001FC000 /* Seven positions in the scale - other chords. */
# define DMUS_VARIATIONF_ROOT_SCALE 0x00200000 /* Handles chord roots in the scale. */
# define DMUS_VARIATIONF_ROOT_FLAT 0x00400000 /* Handles flat chord roots (based on scale notes). */
# define DMUS_VARIATIONF_ROOT_SHARP 0x00800000 /* Handles sharp chord roots (based on scale notes). */
# define DMUS_VARIATIONF_TYPE_TRIAD 0x01000000 /* Handles simple chords - triads. */
# define DMUS_VARIATIONF_TYPE_6AND7 0x02000000 /* Handles simple chords - 6 and 7. */
# define DMUS_VARIATIONF_TYPE_COMPLEX 0x04000000 /* Handles complex chords. */
# define DMUS_VARIATIONF_DEST_TO1 0x08000000 /* Handles transitions to 1 chord. */
# define DMUS_VARIATIONF_DEST_TO5 0x10000000 /* Handles transitions to 5 chord. */
# define DMUS_VARIATIONF_DEST_OTHER 0x40000000 /* Handles transitions to chords other than 1 . */
/* legacy mask for variation modes */
# define DMUS_VARIATIONF_MODES 0xE0000000
/* Bits 29 and 31 of the variation flags are the Mode bits. If both are 0, it's IMA. */
/* If bit 29 is 1, it's Direct Music. */
# define DMUS_VARIATIONF_MODES_EX (0x20000000 | 0x80000000)
# define DMUS_VARIATIONF_IMA25_MODE 0x00000000
# define DMUS_VARIATIONF_DMUS_MODE 0x20000000
/* Set this if the part uses marker events */
# define DMUS_PARTF_USE_MARKERS 0x1
/* Set this if the part is allowed to switch only on chord-aligned markers */
# define DMUS_PARTF_ALIGN_CHORDS 0x2
/* These specify if the marker event signals whether to stop a variation or start a
pattern / variation ( or both ) , and whether new variations must align with a chord */
# define DMUS_MARKERF_START 0x1
# define DMUS_MARKERF_STOP 0x2
# define DMUS_MARKERF_CHORD_ALIGN 0x4
/* if this flag is set, variation settings in a playing pattern-based track's state data will
persist in the track after it stops playing */
# define DMUS_PATTERNF_PERSIST_CONTROL 0x1
/* These specify possible values for DMUS_IO_PARTREF.bRandomVariation
all but DMUS_VARIATIONT_SEQUENTIAL and DMUS_VARIATIONT_RANDOM are dx8 . */
typedef enum enumDMUS_VARIATIONT_TYPES
{
DMUS_VARIATIONT_SEQUENTIAL = 0 , /* Play sequential starting with variation 1. */
DMUS_VARIATIONT_RANDOM = 1 , /* Play randomly. */
DMUS_VARIATIONT_RANDOM_START = 2 , /* Play sequential starting with a random variation. */
DMUS_VARIATIONT_NO_REPEAT = 3 , /* Play randomly, but don't play the same variation twice. */
DMUS_VARIATIONT_RANDOM_ROW = 4 /* Play randomly as a row: don't repeat any variation until all have played. */
} DMUS_VARIATIONT_TYPES ;
# pragma pack(2)
typedef struct _DMUS_IO_TIMESIG
{
/* Time signatures define how many beats per measure, which note receives */
/* the beat, and the grid resolution. */
BYTE bBeatsPerMeasure ; /* beats per measure (top of time sig) */
BYTE bBeat ; /* what note receives the beat (bottom of time sig.) */
/* we can assume that 0 means 256th note */
WORD wGridsPerBeat ; /* grids per beat */
} DMUS_IO_TIMESIG ;
typedef struct _DMUS_IO_STYLE
{
DMUS_IO_TIMESIG timeSig ; /* Styles have a default Time Signature */
double dblTempo ;
} DMUS_IO_STYLE ;
typedef struct _DMUS_IO_VERSION
{
DWORD dwVersionMS ; /* Version # high-order 32 bits */
DWORD dwVersionLS ; /* Version # low-order 32 bits */
} DMUS_IO_VERSION ;
typedef struct _DMUS_IO_PATTERN
{
DMUS_IO_TIMESIG timeSig ; /* Patterns can override the Style's Time sig. */
BYTE bGrooveBottom ; /* bottom of groove range */
BYTE bGrooveTop ; /* top of groove range */
WORD wEmbellishment ; /* Fill, Break, Intro, End, Normal, Motif */
WORD wNbrMeasures ; /* length in measures */
BYTE bDestGrooveBottom ; /* bottom of groove range for next pattern */
BYTE bDestGrooveTop ; /* top of groove range for next pattern */
DWORD dwFlags ; /* various flags */
} DMUS_IO_PATTERN ;
typedef struct _DMUS_IO_STYLEPART
{
DMUS_IO_TIMESIG timeSig ; /* can override pattern's */
DWORD dwVariationChoices [ 32 ] ; /* MOAW choice bitfield */
GUID guidPartID ; /* identifies the part */
WORD wNbrMeasures ; /* length of the Part */
BYTE bPlayModeFlags ; /* see PLAYMODE flags */
BYTE bInvertUpper ; /* inversion upper limit */
BYTE bInvertLower ; /* inversion lower limit */
BYTE bPad [ 3 ] ; /* for DWORD alignment */
DWORD dwFlags ; /* various flags */
} DMUS_IO_STYLEPART ;
typedef struct _DMUS_IO_PARTREF
{
GUID guidPartID ; /* unique ID for matching up with parts */
WORD wLogicalPartID ; /* corresponds to port/device/midi channel OBSOLETE */
BYTE bVariationLockID ; /* parts with the same ID lock variations. */
/* high bit is used to identify master Part */
BYTE bSubChordLevel ; /* tells which sub chord level this part wants */
BYTE bPriority ; /* 256 priority levels. Parts with lower priority */
/* aren't played first when a device runs out of */
/* notes */
BYTE bRandomVariation ; /* when set, matching variations play in random order */
/* when clear, matching variations play sequentially */
WORD wPad ; /* not used */
DWORD dwPChannel ; /* replaces wLogicalPartID */
} DMUS_IO_PARTREF ;
typedef struct _DMUS_IO_STYLENOTE
{
MUSIC_TIME mtGridStart ; /* when this note occurs */
DWORD dwVariation ; /* variation bits */
MUSIC_TIME mtDuration ; /* how long this note lasts */
short nTimeOffset ; /* offset from mtGridStart */
WORD wMusicValue ; /* Position in scale. */
BYTE bVelocity ; /* Note velocity. */
BYTE bTimeRange ; /* Range to randomize start time. */
BYTE bDurRange ; /* Range to randomize duration. */
BYTE bVelRange ; /* Range to randomize velocity. */
BYTE bInversionID ; /* Identifies inversion group to which this note belongs */
BYTE bPlayModeFlags ; /* Can override part */
/* Following exists only under DX8 and on */
BYTE bNoteFlags ; /* values from DMUS_NOTEF_FLAGS */
} DMUS_IO_STYLENOTE ;
typedef struct _DMUS_IO_STYLECURVE
{
MUSIC_TIME mtGridStart ; /* when this curve occurs */
DWORD dwVariation ; /* variation bits */
MUSIC_TIME mtDuration ; /* how long this curve lasts */
MUSIC_TIME mtResetDuration ; /* how long after the end of the curve to reset the curve */
short nTimeOffset ; /* offset from mtGridStart */
short nStartValue ; /* curve's start value */
short nEndValue ; /* curve's end value */
short nResetValue ; /* the value to which to reset the curve */
BYTE bEventType ; /* type of curve */
BYTE bCurveShape ; /* shape of curve */
BYTE bCCData ; /* CC# */
BYTE bFlags ; /* Bit 1=TRUE means to send nResetValue. Otherwise, don't.
Other bits are reserved . */
/* Following was added for DX8. */
WORD wParamType ; /* RPN or NRPN parameter number. */
WORD wMergeIndex ; /* Allows multiple parameters to be merged (pitchbend, volume, and expression.) */
} DMUS_IO_STYLECURVE ;
typedef struct _DMUS_IO_STYLEMARKER
{
MUSIC_TIME mtGridStart ; /* when this marker occurs */
DWORD dwVariation ; /* variation bits */
WORD wMarkerFlags ; /* how the marker is used */
} DMUS_IO_STYLEMARKER ;
typedef struct _DMUS_IO_STYLERESOLUTION
{
DWORD dwVariation ; /* variation bits */
WORD wMusicValue ; /* Position in scale. */
BYTE bInversionID ; /* Identifies inversion group to which this note belongs */
BYTE bPlayModeFlags ; /* Can override part */
} DMUS_IO_STYLERESOLUTION ;
typedef struct _DMUS_IO_STYLE_ANTICIPATION
{
MUSIC_TIME mtGridStart ; /* when this anticipation occurs */
DWORD dwVariation ; /* variation bits */
short nTimeOffset ; /* offset from mtGridStart */
BYTE bTimeRange ; /* Range to randomize start time. */
} DMUS_IO_STYLE_ANTICIPATION ;
typedef struct _DMUS_IO_MOTIFSETTINGS
{
DWORD dwRepeats ; /* Number of repeats. By default, 0. */
MUSIC_TIME mtPlayStart ; /* Start of playback. By default, 0. */
MUSIC_TIME mtLoopStart ; /* Start of looping portion. By default, 0. */
MUSIC_TIME mtLoopEnd ; /* End of loop. Must be greater than mtLoopStart. Or, 0, indicating loop full motif. */
DWORD dwResolution ; /* Default resolution. */
} DMUS_IO_MOTIFSETTINGS ;
# pragma pack()
/*
RIFF
(
' DMST ' // Style
< styh - ck > // Style header chunk
< guid - ck > // Every Style has a GUID
[ < UNFO - list > ] // Name, author, copyright info., comments
[ < vers - ck > ] // version chunk
< part - list > . . . // Array of parts in the Style, used by patterns
< pttn - list > . . . // Array of patterns in the Style
< DMBD - form > . . . // Array of bands in the Style
[ < prrf - list > ] . . . // Optional array of chord map references in the Style
)
// <styh-ck>
styh
(
< DMUS_IO_STYLE >
)
// <guid-ck>
guid
(
< GUID >
)
// <vers-ck>
vers
(
< DMUS_IO_VERSION >
)
// <part-list>
LIST
(
' part '
< prth - ck > // Part header chunk
[ < UNFO - list > ] // Name, author, copyright info., comments
[ < note - ck > ] // Optional chunk containing an array of notes in Part
[ < crve - ck > ] // Optional chunk containing an array of curves in Part
[ < mrkr - ck > ] // Optional chunk containing an array of markers in Part
[ < rsln - ck > ] // Optional chunk containing an array of variation resolutions in Part
[ < anpn - ck > ] // Optional chunk containing an array of resolution anticipations in Part
)
// <orth-ck>
prth
(
< DMUS_IO_STYLEPART >
)
// <note-ck>
' note '
(
// sizeof DMUS_IO_STYLENOTE:DWORD
< DMUS_IO_STYLENOTE > . . .
)
// <crve-ck>
' crve '
(
// sizeof DMUS_IO_STYLECURVE:DWORD
< DMUS_IO_STYLECURVE > . . .
)
// <mrkr-ck>
' mrkr '
(
// sizeof DMUS_IO_STYLEMARKER:DWORD
< DMUS_IO_STYLEMARKER > . . .
)
// <rsln-ck>
' rsln '
(
// sizeof DMUS_IO_STYLERESOLUTION:DWORD
< DMUS_IO_STYLERESOLUTION > . . .
)
// <anpn-ck>
' anpn '
(
// sizeof DMUS_IO_STYLE_ANTICIPATION:DWORD
< DMUS_IO_STYLE_ANTICIPATION > . . .
)
// <pttn-list>
LIST
(
' pttn '
< ptnh - ck > // Pattern header chunk
< rhtm - ck > // Chunk containing an array of rhythms for chord matching
[ < UNFO - list > ] // Name, author, copyright info., comments
[ < mtfs - ck > ] // Motif settings chunk
[ < DMBD - form > ] // Optional band to be associated with the pattern (for motifs)
< pref - list > . . . // Array of part reference id's
)
// <ptnh-ck>
ptnh
(
< DMUS_IO_PATTERN >
)
// <rhtm-ck>
' rhtm '
(
// DWORD's representing rhythms for chord matching based on number
// of measures in the pattern
)
// pref-list
LIST
(
' pref '
< prfc - ck > // part ref chunk
)
// <prfc-ck>
prfc
(
< DMUS_IO_PARTREF >
)
// <mtfs-ck>
mtfs
(
< DMUS_IO_MOTIFSETTINGS >
)
// <prrf-list>
LIST
(
' prrf '
< DMRF - list > . . . // Array of Chordmap references
)
*/
/* Pattern chunk, for use in Pattern tracks */
# define DMUS_FOURCC_PATTERN_FORM mmioFOURCC('D','M','P','T')
/*
RIFF
(
' DMPT ' // Pattern
< styh - ck > // Style header chunk
< pttn - list > // The pattern, in single pattern format (includes DMUS_FOURCC_PART_LIST chunks)
)
*/
/* Chord and command file formats */
/* These specify possible values for DMUS_IO_COMMAND.bRepeatMode (dx8) */
typedef enum enumDMUS_PATTERNT_TYPES
{
DMUS_PATTERNT_RANDOM = 0 , /* Play randomly. (dx7 behavior) */
DMUS_PATTERNT_REPEAT = 1 , /* Repeat last pattern. */
DMUS_PATTERNT_SEQUENTIAL = 2 , /* Play sequential starting with first matching pattern. */
DMUS_PATTERNT_RANDOM_START = 3 , /* Play sequential starting with a random pattern. */
DMUS_PATTERNT_NO_REPEAT = 4 , /* Play randomly, but don't play the same pattern twice. */
DMUS_PATTERNT_RANDOM_ROW = 5 /* Play randomly as a row: don't repeat any pattern until all have played. */
} DMUS_PATTERNT_TYPES ;
# define DMUS_FOURCC_CHORDTRACK_LIST mmioFOURCC('c','o','r','d')
# define DMUS_FOURCC_CHORDTRACKHEADER_CHUNK mmioFOURCC('c','r','d','h')
# define DMUS_FOURCC_CHORDTRACKBODY_CHUNK mmioFOURCC('c','r','d','b')
# define DMUS_FOURCC_COMMANDTRACK_CHUNK mmioFOURCC('c','m','n','d')
typedef struct _DMUS_IO_CHORD
{
WCHAR wszName [ 16 ] ; /* Name of the chord */
MUSIC_TIME mtTime ; /* Time of this chord */
WORD wMeasure ; /* Measure this falls on */
BYTE bBeat ; /* Beat this falls on */
BYTE bFlags ; /* Various flags */
} DMUS_IO_CHORD ;
typedef struct _DMUS_IO_SUBCHORD
{
DWORD dwChordPattern ; /* Notes in the subchord */
DWORD dwScalePattern ; /* Notes in the scale */
DWORD dwInversionPoints ; /* Where inversions can occur */
DWORD dwLevels ; /* Which levels are supported by this subchord */
BYTE bChordRoot ; /* Root of the subchord */
BYTE bScaleRoot ; /* Root of the scale */
} DMUS_IO_SUBCHORD ;
typedef struct _DMUS_IO_COMMAND
{
MUSIC_TIME mtTime ; /* Time of this command */
WORD wMeasure ; /* Measure this falls on */
BYTE bBeat ; /* Beat this falls on */
BYTE bCommand ; /* Command type (see #defines below) */
BYTE bGrooveLevel ; /* Groove level (0 if command is not a groove) */
BYTE bGrooveRange ; /* Groove range */
BYTE bRepeatMode ; /* Used to control selection of patterns with same groove level */
} DMUS_IO_COMMAND ;
/*
// <cord-list>
LIST
(
' cord '
< crdh - ck >
< crdb - ck > // Chord body chunk
)
// <crdh-ck>
crdh
(
// Scale: dword (upper 8 bits for root, lower 24 for scale)
)
// <crdb-ck>
crdb
(
// sizeof DMUS_IO_CHORD:dword
< DMUS_IO_CHORD >
// # of DMUS_IO_SUBCHORDS:dword
// sizeof DMUS_IO_SUBCHORDS:dword
// a number of <DMUS_IO_SUBCHORD>
)
// <cmnd-list>
' cmnd '
(
//sizeof DMUS_IO_COMMAND: DWORD
< DMUS_IO_COMMAND > . . .
)
*/
/* File io for DirectMusic Tool and ToolGraph objects
*/
/* RIFF ids: */
# define DMUS_FOURCC_TOOLGRAPH_FORM mmioFOURCC('D','M','T','G')
# define DMUS_FOURCC_TOOL_LIST mmioFOURCC('t','o','l','l')
# define DMUS_FOURCC_TOOL_FORM mmioFOURCC('D','M','T','L')
# define DMUS_FOURCC_TOOL_CHUNK mmioFOURCC('t','o','l','h')
/* io structures: */
typedef struct _DMUS_IO_TOOL_HEADER
{
GUID guidClassID ; /* Class id of tool. */
long lIndex ; /* Position in graph. */
DWORD cPChannels ; /* Number of items in channels array. */
FOURCC ckid ; /* chunk ID of tool's data chunk if 0 fccType valid. */
FOURCC fccType ; /* list type if NULL ckid valid. */
DWORD dwPChannels [ 1 ] ; /* Array of PChannels, size determined by cPChannels. */
} DMUS_IO_TOOL_HEADER ;
/*
RIFF
(
' DMTG ' // DirectMusic ToolGraph chunk
[ < guid - ck > ] // GUID for ToolGraph
[ < vers - ck > ] // Optional version info
[ < UNFO - list > ] // Name, author, copyright info., comments
< toll - list > // List of Tools
)
// <guid-ck>
' guid '
(
< GUID >
)
// <vers-ck>
vers
(
< DMUS_IO_VERSION >
)
// <toll-list>
LIST
(
' toll ' // Array of tools
< DMTL - form > . . . // Each tool is encapsulated in a RIFF chunk
)
// <DMTL-form> Tools are embedded in a graph. Theoretically, they can be saved as individual files too.
RIFF
(
' DMTL '
< tolh - ck >
[ < data > ] // Tool data. Must be a RIFF readable chunk.
)
// <tolh-ck> // Tool header chunk
(
' tolh '
< DMUS_IO_TOOL_HEADER > // Tool header
)
*/
/* The AudioPath file carries everything for describing a specific audio path,
including Tool Graph and Buffer Descriptor .
This can even be used for configuring a complete performance .
*/
# define DMUS_FOURCC_AUDIOPATH_FORM mmioFOURCC('D','M','A','P')
/*
RIFF
(
' DMAP ' // DirectMusic AudioPath chunk
[ < guid - ck > ] // GUID for this Audio Path configuration
[ < vers - ck > ] // Optional version info
[ < UNFO - list > ] // Name, author, copyright info., comments
[ < DMTG - form > ] // Optional ToolGraph
[ < pcsl - list > ] // Optional list of port configurations
[ < dbfl - list > ] . . . // Optional array of Dsound buffer descriptors
)
*/
# define DMUS_FOURCC_PORTCONFIGS_LIST mmioFOURCC('p','c','s','l')
# define DMUS_FOURCC_PORTCONFIG_LIST mmioFOURCC('p','c','f','l')
# define DMUS_FOURCC_PORTCONFIG_ITEM mmioFOURCC('p','c','f','h')
# define DMUS_FOURCC_PORTPARAMS_ITEM mmioFOURCC('p','p','r','h')
# define DMUS_FOURCC_DSBUFFER_LIST mmioFOURCC('d','b','f','l')
# define DMUS_FOURCC_DSBUFFATTR_ITEM mmioFOURCC('d','d','a','h')
# define DMUS_FOURCC_PCHANNELS_LIST mmioFOURCC('p','c','h','l')
# define DMUS_FOURCC_PCHANNELS_ITEM mmioFOURCC('p','c','h','h')
typedef struct _DMUS_IO_PORTCONFIG_HEADER
{
GUID guidPort ; /* GUID of requested port. */
DWORD dwPChannelBase ; /* PChannel that this should start on. */
DWORD dwPChannelCount ; /* How many channels. */
DWORD dwFlags ; /* Various flags. */
} DMUS_IO_PORTCONFIG_HEADER ;
# define DMUS_PORTCONFIGF_DRUMSON10 1 /* This port configured for drums on channel 10. */
# define DMUS_PORTCONFIGF_USEDEFAULT 2 /* Use the default port. */
/* Each portconfig has one or more pchannel to buffer mappings. Each buffer
is identified by a guid . Each pchannel can map to one or more buffers .
This is defined with one or more DMUS_IO_PCHANNELTOBUFFER_HEADER
structures . Each defines a range of PChannels and the set of buffers
that they connect to .
*/
typedef struct _DMUS_IO_PCHANNELTOBUFFER_HEADER
{
DWORD dwPChannelBase ; /* PChannel that this should start on. */
DWORD dwPChannelCount ; /* How many PChannels. */
DWORD dwBufferCount ; /* How many buffers do these connect to. */
DWORD dwFlags ; /* Various flags. Currently reserved for future use. Must be 0. */
} DMUS_IO_PCHANNELTOBUFFER_HEADER ;
/* Each buffer is represented by an DSBC form. This is wrapped by the
DMUS_IO_BUFFER_ATTRIBUTES_HEADER which identifies how to use the
buffer . In particular , it indicates whether this gets dynamically duplicated
or all references to this should share the same instance .
To resolve references , the unique GUID of the buffer is also stored
in this structure .
*/
typedef struct _DMUS_IO_BUFFER_ATTRIBUTES_HEADER
{
GUID guidBufferID ; /* Each buffer config has a unique ID. */
DWORD dwFlags ; /* Various flags. */
} DMUS_IO_BUFFER_ATTRIBUTES_HEADER ;
/* DMUS_IO_BUFFER_ATTRIBUTES_HEADER.dwFlags: */
# define DMUS_BUFFERF_SHARED 1 /* Share this with other audio paths, instead of creating unique copies. */
# define DMUS_BUFFERF_DEFINED 2 /* Use one of the standard predefined buffers (see GUID_Buffer... in dmusici.h.) */
# define DMUS_BUFFERF_MIXIN 8 /* This is a mixin buffer. */
/*
LIST
(
' pcsl ' // Array of port configurations
< pcfl - list > . . . // One or more port configurations, each in a list chunk
)
LIST
(
' pcfl ' // List container for one port configuration.
< pcfh - ck > // Portconfig header chunk.
< pprh - ck > // Port params, to be used to create the port.
[ < dbfl - list > ] . . . // Optional array of Dsound buffer descriptors
[ < pchl - list > ] // Optional list of pchannel to buffer assignments
)
// <pcfh-ck> // Port config header chunk
(
' pcfh '
< DMUS_IO_PORTCONFIG_HEADER > // Port config header
)
// <pprh-ck> // Port params header chunk
(
' pprh '
< DMUS_PORTPARAMS8 > // Port params header
)
LIST
(
' pchl ' // List container for one or more pchannel to buffer assignments.
< pchh - ck > . . . // One or more pchannel to buffer assignment headers and data.
// <pchh-ck>
(
' pchh '
< DMUS_IO_PCHANNELTOBUFFER_HEADER > // Description of PChannels
< GUID > . . . // Array of GUIDs defining the buffers they all connect to.
)
)
LIST
(
' dbfl ' // List container for one buffer and buffer attributes header.
< ddah - ck > // Buffer attributes header.
[ < DSBC - form > ] // Buffer configuration. Not required when header uses a predefined buffer type.
// <ddah-ck>
(
' ddah '
< DMUS_IO_BUFFER_ATTRIBUTES_HEADER > // Buffer attributes.
)
)
*/
/* File io for DirectMusic Band Track object */
/* RIFF ids: */
# define DMUS_FOURCC_BANDTRACK_FORM mmioFOURCC('D','M','B','T')
# define DMUS_FOURCC_BANDTRACK_CHUNK mmioFOURCC('b','d','t','h')
# define DMUS_FOURCC_BANDS_LIST mmioFOURCC('l','b','d','l')
# define DMUS_FOURCC_BAND_LIST mmioFOURCC('l','b','n','d')
# define DMUS_FOURCC_BANDITEM_CHUNK mmioFOURCC('b','d','i','h')
# define DMUS_FOURCC_BANDITEM_CHUNK2 mmioFOURCC('b','d','2','h')
/* io structures */
typedef struct _DMUS_IO_BAND_TRACK_HEADER
{
BOOL bAutoDownload ; /* Determines if Auto-Download is enabled. */
} DMUS_IO_BAND_TRACK_HEADER ;
typedef struct _DMUS_IO_BAND_ITEM_HEADER
{
MUSIC_TIME lBandTime ; /* Position in track list. */
} DMUS_IO_BAND_ITEM_HEADER ;
typedef struct _DMUS_IO_BAND_ITEM_HEADER2
{
MUSIC_TIME lBandTimeLogical ; /* Position in track list. Time in the music with which band change is associated. */
MUSIC_TIME lBandTimePhysical ; /* Precise time band change will take effect. Should be close to logical time. */
} DMUS_IO_BAND_ITEM_HEADER2 ;
/*
RIFF
(
' DMBT ' // DirectMusic Band Track form-type
[ < bdth - ck > ] // Band track header
[ < guid - ck > ] // GUID for band track
[ < vers - ck > ] // Optional version info
[ < UNFO - list > ] // Name, author, copyright info., comments
< lbdl - list > // List of Band items
)
// <bnth-ck>
' bdth '
(
< DMUS_IO_BAND_TRACK_HEADER >
)
// <guid-ck>
' guid '
(
< GUID >
)
// <vers-ck>
vers
(
< DMUS_IO_VERSION >
)
// <lbdl-list>
LIST
(
' lbdl '
< lbnd - list > . . . // Array of bands, each encapsulated in a list chunk
)
// <lbnd-list>
LIST
(
' lbnd '
< bdih - ck > or < bd2h - ck > // bdih is a legacy format. bd2h is preferred for new content.
< DMBD - form > // Band
)
// <bdih-ck> or <bd2h-ck> // band item header
(
< DMUS_IO_BAND_ITEM_HEADER > or < DMUS_IO_BAND_ITEM_HEADER2 > // Band item header
)
*/
/* File io for DirectMusic Band object
*/
/* RIFF ids: */
# define DMUS_FOURCC_BAND_FORM mmioFOURCC('D','M','B','D')
# define DMUS_FOURCC_INSTRUMENTS_LIST mmioFOURCC('l','b','i','l')
# define DMUS_FOURCC_INSTRUMENT_LIST mmioFOURCC('l','b','i','n')
# define DMUS_FOURCC_INSTRUMENT_CHUNK mmioFOURCC('b','i','n','s')
/* Flags for DMUS_IO_INSTRUMENT
*/
# define DMUS_IO_INST_PATCH (1 << 0) /* dwPatch is valid. */
# define DMUS_IO_INST_BANKSELECT (1 << 1) /* dwPatch contains a valid Bank Select MSB and LSB part */
# define DMUS_IO_INST_ASSIGN_PATCH (1 << 3) /* dwAssignPatch is valid */
# define DMUS_IO_INST_NOTERANGES (1 << 4) /* dwNoteRanges is valid */
# define DMUS_IO_INST_PAN (1 << 5) /* bPan is valid */
# define DMUS_IO_INST_VOLUME (1 << 6 ) /* bVolume is valid */
# define DMUS_IO_INST_TRANSPOSE (1 << 7) /* nTranspose is valid */
# define DMUS_IO_INST_GM (1 << 8) /* Instrument is from GM collection */
# define DMUS_IO_INST_GS (1 << 9) /* Instrument is from GS collection */
# define DMUS_IO_INST_XG (1 << 10) /* Instrument is from XG collection */
# define DMUS_IO_INST_CHANNEL_PRIORITY (1 << 11) /* dwChannelPriority is valid */
# define DMUS_IO_INST_USE_DEFAULT_GM_SET (1 << 12) /* Always use the default GM set for this patch, */
/* don't rely on the synth caps stating GM or GS in hardware. */
# define DMUS_IO_INST_PITCHBENDRANGE (1 << 13) /* nPitchBendRange is valid */
/* io structures */
typedef struct _DMUS_IO_INSTRUMENT
{
DWORD dwPatch ; /* MSB, LSB and Program change to define instrument */
DWORD dwAssignPatch ; /* MSB, LSB and Program change to assign to instrument when downloading */
DWORD dwNoteRanges [ 4 ] ; /* 128 bits; one for each MIDI note instrument needs to able to play */
DWORD dwPChannel ; /* PChannel instrument plays on */
DWORD dwFlags ; /* DMUS_IO_INST_ flags */
BYTE bPan ; /* Pan for instrument */
BYTE bVolume ; /* Volume for instrument */
short nTranspose ; /* Number of semitones to transpose notes */
DWORD dwChannelPriority ; /* Channel priority */
short nPitchBendRange ; /* Number of semitones shifted by pitch bend */
} DMUS_IO_INSTRUMENT ;
/*
// <DMBD-form> bands can be embedded in other forms
RIFF
(
' DMBD ' // DirectMusic Band chunk
[ < guid - ck > ] // GUID for band
[ < vers - ck > ] // Optional version info
[ < UNFO - list > ] // Name, author, copyright info., comments
< lbil - list > // List of Instruments
)
// <guid-ck>
' guid '
(
< GUID >
)
// <vers-ck>
vers
(
< DMUS_IO_VERSION >
)
// <lbil-list>
LIST
(
' lbil ' // Array of instruments
< lbin - list > . . . // Each instrument is encapsulated in a list
)
// <lbin-list>
LIST
(
' lbin '
< bins - ck >
[ < DMRF - list > ] // Optional reference to DLS Collection file.
)
// <bins-ck> // Instrument chunk
(
' bins '
< DMUS_IO_INSTRUMENT > // Instrument header
)
*/
/* This RIFF id and io struct have been added to allow wave files (and the wave object) to
differentiate between streaming and one - shot waves , and to give a prefetch for streaming
waves */
# define DMUS_FOURCC_WAVEHEADER_CHUNK mmioFOURCC('w','a','v','h')
typedef struct _DMUS_IO_WAVE_HEADER
{
REFERENCE_TIME rtReadAhead ; /* How far ahead in the stream wave data will be read (in REFERENCE_TIME). Ignored for one-shot waves. */
DWORD dwFlags ; /* Various flags, including whether this is a streaming wave and whether it can be invalidated. */
} DMUS_IO_WAVE_HEADER ;
/* File io for Wave track */
/* RIFF ids: */
# define DMUS_FOURCC_WAVETRACK_LIST mmioFOURCC('w','a','v','t')
# define DMUS_FOURCC_WAVETRACK_CHUNK mmioFOURCC('w','a','t','h')
# define DMUS_FOURCC_WAVEPART_LIST mmioFOURCC('w','a','v','p')
# define DMUS_FOURCC_WAVEPART_CHUNK mmioFOURCC('w','a','p','h')
# define DMUS_FOURCC_WAVEITEM_LIST mmioFOURCC('w','a','v','i')
# define DMUS_FOURCC_WAVE_LIST mmioFOURCC('w','a','v','e')
# define DMUS_FOURCC_WAVEITEM_CHUNK mmioFOURCC('w','a','i','h')
/* This flag is included in DMUS_IO_WAVE_TRACK_HEADER.dwFlags. If set, the track will get its
variations from a pattern track , via GetParam ( GUID_Variations ) . */
# define DMUS_WAVETRACKF_SYNC_VAR 0x1
/* This is also included in DMUS_IO_WAVE_TRACK_HEADER.dwFlags. If set, variation control
information will persist from one playback instance to the next . */
# define DMUS_WAVETRACKF_PERSIST_CONTROL 0x2
typedef struct _DMUS_IO_WAVE_TRACK_HEADER
{
long lVolume ; /* Gain, in 1/100th of dB, to be applied to all waves. Note: All gain values should be negative. */
DWORD dwFlags ; /* Flags, including whether this track syncs to a pattern track for its variations. */
} DMUS_IO_WAVE_TRACK_HEADER ;
typedef struct _DMUS_IO_WAVE_PART_HEADER
{
long lVolume ; /* Gain, in 1/100th of dB, to be applied to all waves in wave part. Note: All gain values should be negative. */
DWORD dwVariations ; /* Variation mask for which of 32 variations */
DWORD dwPChannel ; /* PChannel */
DWORD dwLockToPart ; /* Part ID to lock to. */
DWORD dwFlags ; /* Flags, including stuff for managing how variations are chosen (in low-order nibble) */
DWORD dwIndex ; /* Index for distinguishing multiple parts on the same PChannel*/
} DMUS_IO_WAVE_PART_HEADER ;
typedef struct _DMUS_IO_WAVE_ITEM_HEADER
{
long lVolume ; /* Gain, in 1/100th of dB. Note: All gain values should be negative. */
long lPitch ; /* Pitch offset in 1/100th of a semitone. */
DWORD dwVariations ; /* Variation flags for which of 32 variations this wave belongs to. */
REFERENCE_TIME rtTime ; /* Start time, in REFERENCE_TIME, if clock time track, or MUSIC_TIME for music time track. */
REFERENCE_TIME rtStartOffset ; /* Distance into wave to start playback, in reference time units. */
REFERENCE_TIME rtReserved ; /* Reserved field. */
REFERENCE_TIME rtDuration ; /* Duration, in REFERENCE_TIME or MUSIC_TIME, depending on track timing format. */
MUSIC_TIME mtLogicalTime ; /* If in music track format, this indicates the musical boundary where this belongs. Otherwise, ignored. */
DWORD dwLoopStart ; /* Start point for a looping wave. */
DWORD dwLoopEnd ; /* End point for a looping wave. */
DWORD dwFlags ; /* Various flags, including whether this is a streaming wave and whether it can be invalidated. */
} DMUS_IO_WAVE_ITEM_HEADER ;
/*
LIST
{
' wavt ' // Wave track chunk
< wath - ck > // Wave track header
< wavp - list > . . . // Array of Wave Parts
}
// <wath-ck>
' wath '
{
< DMUS_IO_WAVE_TRACK_HEADER >
}
// <wavp-list>
LIST
{
' wavp '
< waph - ck > // Wave Part Header
< wavi - list > // List of wave items
}
// <waph-ck>
' waph '
{
< DMUS_IO_WAVE_PART_HEADER >
}
// <wavi-list>
LIST
{
' wavi '
< wave - list > . . . // Array of waves; each wave is encapsulated in a list
}
// <wave-list>
LIST
{
' wave '
< waih - ck > // Wave item header
< DMRF - list > // Reference to wave object
}
// <waih-ck>
' waih '
{
< DMUS_IO_WAVE_ITEM_HEADER >
}
*/
/* File io for DirectMusic Container file. This embeds a set of related files. And,
in turn , it can be embedded within a segment or script file .
*/
# define DMUS_FOURCC_CONTAINER_FORM mmioFOURCC('D','M','C','N')
# define DMUS_FOURCC_CONTAINER_CHUNK mmioFOURCC('c','o','n','h')
# define DMUS_FOURCC_CONTAINED_ALIAS_CHUNK mmioFOURCC('c','o','b','a')
# define DMUS_FOURCC_CONTAINED_OBJECT_CHUNK mmioFOURCC('c','o','b','h')
# define DMUS_FOURCC_CONTAINED_OBJECTS_LIST mmioFOURCC('c','o','s','l')
# define DMUS_FOURCC_CONTAINED_OBJECT_LIST mmioFOURCC('c','o','b','l')
typedef struct _DMUS_IO_CONTAINER_HEADER
{
DWORD dwFlags ; /* Flags. */
} DMUS_IO_CONTAINER_HEADER ;
# define DMUS_CONTAINER_NOLOADS (1 << 1) / * Contained items are not loaded when the container is loaded.
Entries will be created in the loader ( via SetObject ) but
the actual objects will not be created until they are
specifically loaded at a later time . */
typedef struct _DMUS_IO_CONTAINED_OBJECT_HEADER
{
GUID guidClassID ; /* Class id of object. */
DWORD dwFlags ; /* Flags, for example DMUS_CONTAINED_OBJF_KEEP. */
FOURCC ckid ; /* chunk ID of track's data chunk if 0 fccType valid. */
FOURCC fccType ; /* list type if NULL ckid valid */
/* Note that LIST:DMRF may be used for ckid and fccType in order to reference an
object instead of embedding it within the container . */
} DMUS_IO_CONTAINED_OBJECT_HEADER ;
# define DMUS_CONTAINED_OBJF_KEEP 1 /* Keep the object cached in the loader after the container is released. */
/*
RIFF
(
' DMCN ' // DirectMusic Container chunk
< conh - ck > // Container header chunk
[ < guid - ck > ] // GUID for container
[ < vers - ck > ] // Optional version info
[ < UNFO - list > ] // Name, author, copyright info., comments
< cosl - list > // List of objects.
)
// <conh-ck>
' conh '
(
< DMUS_IO_CONTAINER_HEADER >
)
// <guid-ck>
' guid '
(
< GUID >
)
// <vers-ck>
vers
(
< DMUS_IO_VERSION >
)
LIST
(
' cosl ' // Array of embedded objects.
< cobl - list > . . . // Each object is encapsulated in a LIST chunk
)
// <cobl-list> // Encapsulates one object
LIST
(
' cobl '
[ < coba - ck > ] // Alias. An alternative name by which this object is known
// within the container.
< cobh - ck > // Required header, includes CLASS ID for object.
[ < data > ] or < DMRF > // Object data of the type specified in <cobh-ck>.
// If DMRF, it is a reference of where to find the object.
// Otherwise, it could be any RIFF readable chunk in the
// exact same format as a file. The object will load
// itself from this data.
)
// <coba-ck>
' coba '
(
// Alias, stored as NULL terminated string of WCHARs
)
// <cobh-ck>
' cobh '
(
< DMUS_IO_CONTAINED_OBJECT_HEADER >
)
*/
/* File io for DirectMusic Segment object */
/* RIFF ids: */
# define DMUS_FOURCC_SEGMENT_FORM mmioFOURCC('D','M','S','G')
# define DMUS_FOURCC_SEGMENT_CHUNK mmioFOURCC('s','e','g','h')
# define DMUS_FOURCC_TRACK_LIST mmioFOURCC('t','r','k','l')
# define DMUS_FOURCC_TRACK_FORM mmioFOURCC('D','M','T','K')
# define DMUS_FOURCC_TRACK_CHUNK mmioFOURCC('t','r','k','h')
# define DMUS_FOURCC_TRACK_EXTRAS_CHUNK mmioFOURCC('t','r','k','x')
/* io structures:*/
typedef struct _DMUS_IO_SEGMENT_HEADER
{
DWORD dwRepeats ; /* Number of repeats. By default, 0. */
MUSIC_TIME mtLength ; /* Length, in music time. */
MUSIC_TIME mtPlayStart ; /* Start of playback. By default, 0. */
MUSIC_TIME mtLoopStart ; /* Start of looping portion. By default, 0. */
MUSIC_TIME mtLoopEnd ; /* End of loop. Must be greater than dwPlayStart. Or, 0, indicating loop full segment. */
DWORD dwResolution ; /* Default resolution. */
/* Following added for DX8: */
REFERENCE_TIME rtLength ; /* Length, in reference time (overrides music time length.) */
DWORD dwFlags ;
DWORD dwReserved ; /* Reserved. */
} DMUS_IO_SEGMENT_HEADER ;
# define DMUS_SEGIOF_REFLENGTH 1 /* Use the time in rtLength for the segment length. */
typedef struct _DMUS_IO_TRACK_HEADER
{
GUID guidClassID ; /* Class id of track. */
DWORD dwPosition ; /* Position in track list. */
DWORD dwGroup ; /* Group bits for track. */
FOURCC ckid ; /* chunk ID of track's data chunk. */
FOURCC fccType ; /* list type if ckid is RIFF or LIST */
} DMUS_IO_TRACK_HEADER ;
/* Additional parameters for the track header chunk, introduced in DX8 and
on , are stored in a separate chunk . */
typedef struct _DMUS_IO_TRACK_EXTRAS_HEADER
{
DWORD dwFlags ; /* DX8 Added flags for control tracks. */
DWORD dwPriority ; /* Priority for composition. */
} DMUS_IO_TRACK_EXTRAS_HEADER ;
/*
RIFF
(
' DMSG ' // DirectMusic Segment chunk
< segh - ck > // Segment header chunk
[ < guid - ck > ] // GUID for segment
[ < vers - ck > ] // Optional version info
[ < UNFO - list > ] // Name, author, copyright info., comments
[ < DMCN - form > ] // Optional container of objects embedded in file. Must precede tracklist.
< trkl - list > // List of Tracks
[ < DMTG - form > ] // Optional ToolGraph
[ < DMAP - form > ] // Optional Audio Path
)
// <segh-ck>
' segh '
(
< DMUS_IO_SEGMENT_HEADER >
)
// <guid-ck>
' guid '
(
< GUID >
)
// <vers-ck>
vers
(
< DMUS_IO_VERSION >
)
// <trkl-list>
LIST
(
' trkl ' // Array of tracks
< DMTK - form > . . . // Each track is encapsulated in a RIFF chunk
)
// <DMTK-form> // Tracks can be embedded in a segment or stored as separate files.
RIFF
(
' DMTK '
< trkh - ck >
[ < trkx - ck > ] // Optional track flags.
[ < guid - ck > ] // Optional GUID for track object instance (not to be confused with Class id in track header)
[ < vers - ck > ] // Optional version info
[ < UNFO - list > ] // Optional name, author, copyright info., comments
[ < data > ] // Track data. Must be a RIFF readable chunk.
)
// <trkh-ck> // Track header chunk
(
' trkh '
< DMUS_IO_TRACK_HEADER > // Track header
)
// <trkx-ck> // Track flags chunk
(
' trkx '
< DMUS_IO_TRACK_EXTRAS_HEADER > // DX8 Track flags header
)
*/
/* File io for DirectMusic Song object */
/* Note: Song file format is not supported in DX8. */
/* RIFF ids: */
# define DMUS_FOURCC_SONG_FORM mmioFOURCC('D','M','S','O') /* Entire song. */
# define DMUS_FOURCC_SONG_CHUNK mmioFOURCC('s','n','g','h') /* Song header info. */
# define DMUS_FOURCC_SONGSEGMENTS_LIST mmioFOURCC('s','e','g','l') /* List of embedded segments. */
# define DMUS_FOURCC_SONGSEGMENT_LIST mmioFOURCC('s','s','g','l') /* Container for a segment or segment reference. */
# define DMUS_FOURCC_TOOLGRAPHS_LIST mmioFOURCC('t','l','g','l') /* List of embedded tool graphs. */
# define DMUS_FOURCC_SEGREFS_LIST mmioFOURCC('s','r','s','l') /* List of segment references. */
# define DMUS_FOURCC_SEGREF_LIST mmioFOURCC('s','g','r','l') /* Container for a segment reference. */
# define DMUS_FOURCC_SEGREF_CHUNK mmioFOURCC('s','g','r','h') /* Segment reference header. */
# define DMUS_FOURCC_SEGTRANS_CHUNK mmioFOURCC('s','t','r','h') /* Set of transitions to this segment. */
# define DMUS_FOURCC_TRACKREFS_LIST mmioFOURCC('t','r','s','l') /* Set of track references within the segment reference. */
# define DMUS_FOURCC_TRACKREF_LIST mmioFOURCC('t','k','r','l') /* Container for a track reference. */
# define DMUS_FOURCC_TRACKREF_CHUNK mmioFOURCC('t','k','r','h') /* Track reference header. */
/* io structures:*/
typedef struct _DMUS_IO_SONG_HEADER
{
DWORD dwFlags ;
DWORD dwStartSegID ; /* Id of the segment that starts playback. */
} DMUS_IO_SONG_HEADER ;
typedef struct _DMUS_IO_SEGREF_HEADER
{
DWORD dwID ; /* Each has a unique ID. Must be less than DMUS_SONG_MAXSEGID. */
DWORD dwSegmentID ; /* Optional segment to link to. */
DWORD dwToolGraphID ; /* Optional tool graph to use for processing. */
DWORD dwFlags ; /* Various control flags. Currently reserved for future use. Must be 0. */
DWORD dwNextPlayID ; /* ID of next segment, to chain segments into a song. */
} DMUS_IO_SEGREF_HEADER ;
typedef struct _DMUS_IO_TRACKREF_HEADER
{
DWORD dwSegmentID ; /* Which segment to find this in. */
DWORD dwFlags ; /* Reference control flags. */
} DMUS_IO_TRACKREF_HEADER ;
/* Transition definition chunk defines a transition, using an optional transition template
segment .
*/
typedef struct _DMUS_IO_TRANSITION_DEF
{
DWORD dwSegmentID ; /* Segment the transition goes to. */
DWORD dwTransitionID ; /* Template segment to use for the transition. */
DWORD dwPlayFlags ; /* Flags to use for transition. */
} DMUS_IO_TRANSITION_DEF ;
# define DMUS_SONG_MAXSEGID 0x7FFFFFFF /* Segment ids can not go higher than this. */
# define DMUS_SONG_ANYSEG 0x80000000 /* Special ID to indicate any segment. */
# define DMUS_SONG_NOSEG 0xFFFFFFFF /* Special ID to indicate no segment. */
# define DMUS_SONG_NOFROMSEG 0x80000001 /* Special ID for dwSegmentID to indicate transition from nothing (or outside the song) into this segment. */
/*
RIFF
(
' DMSO ' // DirectMusic Song chunk
< sngh - ck > // Song header chunk
[ < guid - ck > ] // GUID for song
[ < vers - ck > ] // Optional version info
[ < UNFO - list > ] // Name, author, copyright info., comments
[ < DMCN - form > ] // Optional container of objects embedded in file. Must precede segment list.
< segl - list > // List of Segments
[ < tlgl - list > ] // Optional list of ToolGraphs
[ < DMAP - form > ] // Optional Audio Path - to be shared by all segments in song.
< srsl - list > // List of segment references.
)
// <sngh-ck>
' sngh '
(
< DMUS_IO_SONG_HEADER >
)
// <segl-list>
LIST
(
' segl ' // Array of segments
< ssgl - list > . . . // Each segment is wrapped in this.
)
// <ssgl-list>
LIST
(
' ssgl ' // Segment container.
[ DMSG - form ] // Each segment is either a full embedded segment RIFF form.
[ DMRF - list ] // Or a reference to an external segment.
)
// <tlgl-list>
LIST
(
' tlgl ' // Array of toolgraphs
< DMTG - form > . . . // Each toolgraph is a full RIFF form.
)
// <srsl-list>
LIST
(
' srsl ' // Array of segment references
< sgrl - list > . . . // Each segment reference is contained in a RIFF list.
)
// <sgrl-list> // Segment reference container.
LIST
(
' sgrl '
< sgrh - ck > // Segment reference header chunk.
< segh - ck > // Segment header chunk. Defines the segment.
< UNFO - list > // Name, author, etc. Primarily for name, though, which is required for Song->GetSegment().
[ < strh - ck > ] // Segment transition chunk. Defines how to do transitions from other segments.
[ < trsl - list > ] // List of track references, to create a segment from tracks in multiple segments.
)
// <sgrh-ck> // Segment reference header chunk
(
' sgrh '
< DMUS_IO_SEGREF_HEADER > // Segment reference header
)
// <strh-ck> // Segment transition chunk.
(
' strh '
< DMUS_IO_TRANSITION_DEF > // Default transition.
< DMUS_IO_TRANSITION_DEF > . . . // Additional transitions.
)
// <trsl-list> // Array of track references
(
' trsl '
< tkrl - list > . . . // Each track reference is multiple chunks in a tkrl list.
)
// <tkrl-list> // Track reference container
(
' tkrl '
< tkrh - ck > // Track reference header chunk.
< trkh - ck > // Normal track header chunk.
[ < trkx - ck > ] // Optional track flags.
)
// <tkrh-ck> // Track reference header chunk
(
' tkrh '
< DMUS_IO_TRACKREF_HEADER > // Track reference header
)
*/
/* File io for DirectMusic reference chunk.
This is used to embed a reference to an object .
*/
/* RIFF ids: */
# define DMUS_FOURCC_REF_LIST mmioFOURCC('D','M','R','F')
# define DMUS_FOURCC_REF_CHUNK mmioFOURCC('r','e','f','h')
# define DMUS_FOURCC_DATE_CHUNK mmioFOURCC('d','a','t','e')
# define DMUS_FOURCC_NAME_CHUNK mmioFOURCC('n','a','m','e')
# define DMUS_FOURCC_FILE_CHUNK mmioFOURCC('f','i','l','e')
typedef struct _DMUS_IO_REFERENCE
{
GUID guidClassID ; /* Class id is always required. */
DWORD dwValidData ; /* Flags. */
} DMUS_IO_REFERENCE ;
/*
LIST
(
' DMRF ' // DirectMusic Reference chunk
< refh - ck > // Reference header chunk
[ < guid - ck > ] // Optional object GUID.
[ < date - ck > ] // Optional file date.
[ < name - ck > ] // Optional name.
[ < file - ck > ] // Optional file name.
[ < catg - ck > ] // Optional category name.
[ < vers - ck > ] // Optional version info.
)
// <refh-ck>
' refh '
(
< DMUS_IO_REFERENCE >
)
// <guid-ck>
' guid '
(
< GUID >
)
// <date-ck>
date
(
< FILETIME >
)
// <name-ck>
name
(
// Name, stored as NULL terminated string of WCHARs
)
// <file-ck>
file
(
// File name, stored as NULL terminated string of WCHARs
)
// <catg-ck>
catg
(
// Category name, stored as NULL terminated string of WCHARs
)
// <vers-ck>
vers
(
< DMUS_IO_VERSION >
)
*/
/* Chord Maps */
/* runtime chunks */
# define DMUS_FOURCC_CHORDMAP_FORM mmioFOURCC('D','M','P','R')
# define DMUS_FOURCC_IOCHORDMAP_CHUNK mmioFOURCC('p','e','r','h')
# define DMUS_FOURCC_SUBCHORD_CHUNK mmioFOURCC('c','h','d','t')
# define DMUS_FOURCC_CHORDENTRY_CHUNK mmioFOURCC('c','h','e','h')
# define DMUS_FOURCC_SUBCHORDID_CHUNK mmioFOURCC('s','b','c','n')
# define DMUS_FOURCC_IONEXTCHORD_CHUNK mmioFOURCC('n','c','r','d')
# define DMUS_FOURCC_NEXTCHORDSEQ_CHUNK mmioFOURCC('n','c','s','q')
# define DMUS_FOURCC_IOSIGNPOST_CHUNK mmioFOURCC('s','p','s','h')
# define DMUS_FOURCC_CHORDNAME_CHUNK mmioFOURCC('I','N','A','M')
/* runtime list chunks */
# define DMUS_FOURCC_CHORDENTRY_LIST mmioFOURCC('c','h','o','e')
# define DMUS_FOURCC_CHORDMAP_LIST mmioFOURCC('c','m','a','p')
# define DMUS_FOURCC_CHORD_LIST mmioFOURCC('c','h','r','d')
# define DMUS_FOURCC_CHORDPALETTE_LIST mmioFOURCC('c','h','p','l')
# define DMUS_FOURCC_CADENCE_LIST mmioFOURCC('c','a','d','e')
# define DMUS_FOURCC_SIGNPOSTITEM_LIST mmioFOURCC('s','p','s','t')
# define DMUS_FOURCC_SIGNPOST_LIST mmioFOURCC('s','p','s','q')
/* values for dwChord field of DMUS_IO_PERS_SIGNPOST */
/* DMUS_SIGNPOSTF_ flags are also used in templates (DMUS_IO_SIGNPOST) */
# define DMUS_SIGNPOSTF_A 1
# define DMUS_SIGNPOSTF_B 2
# define DMUS_SIGNPOSTF_C 4
# define DMUS_SIGNPOSTF_D 8
# define DMUS_SIGNPOSTF_E 0x10
# define DMUS_SIGNPOSTF_F 0x20
# define DMUS_SIGNPOSTF_LETTER (DMUS_SIGNPOSTF_A | DMUS_SIGNPOSTF_B | DMUS_SIGNPOSTF_C | DMUS_SIGNPOSTF_D | DMUS_SIGNPOSTF_E | DMUS_SIGNPOSTF_F)
# define DMUS_SIGNPOSTF_1 0x100
# define DMUS_SIGNPOSTF_2 0x200
# define DMUS_SIGNPOSTF_3 0x400
# define DMUS_SIGNPOSTF_4 0x800
# define DMUS_SIGNPOSTF_5 0x1000
# define DMUS_SIGNPOSTF_6 0x2000
# define DMUS_SIGNPOSTF_7 0x4000
# define DMUS_SIGNPOSTF_ROOT (DMUS_SIGNPOSTF_1 | DMUS_SIGNPOSTF_2 | DMUS_SIGNPOSTF_3 | DMUS_SIGNPOSTF_4 | DMUS_SIGNPOSTF_5 | DMUS_SIGNPOSTF_6 | DMUS_SIGNPOSTF_7)
# define DMUS_SIGNPOSTF_CADENCE 0x8000
/* values for dwFlags field of DMUS_IO_CHORDMAP */
# define DMUS_CHORDMAPF_VERSION8 1 /* Chordmap is version 8 or above. */
/* values for dwChord field of DMUS_IO_PERS_SIGNPOST */
# define DMUS_SPOSTCADENCEF_1 2 /* Use the first cadence chord. */
# define DMUS_SPOSTCADENCEF_2 4 /* Use the second cadence chord. */
/* run time data structs */
typedef struct _DMUS_IO_CHORDMAP
{
WCHAR wszLoadName [ 20 ] ;
DWORD dwScalePattern ;
DWORD dwFlags ; /* Various flags. Only lower 16 bits are significant. */
} DMUS_IO_CHORDMAP ;
typedef struct _DMUS_IO_CHORDMAP_SUBCHORD
{
DWORD dwChordPattern ;
DWORD dwScalePattern ;
DWORD dwInvertPattern ;
BYTE bChordRoot ;
BYTE bScaleRoot ;
WORD wCFlags ;
DWORD dwLevels ; /* parts or which subchord levels this chord supports */
} DMUS_IO_CHORDMAP_SUBCHORD ;
/* Legacy name... */
typedef DMUS_IO_CHORDMAP_SUBCHORD DMUS_IO_PERS_SUBCHORD ;
typedef struct _DMUS_IO_CHORDENTRY
{
DWORD dwFlags ;
WORD wConnectionID ; /* replaces runtime "pointer to this" */
} DMUS_IO_CHORDENTRY ;
typedef struct _DMUS_IO_NEXTCHORD
{
DWORD dwFlags ;
WORD nWeight ;
WORD wMinBeats ;
WORD wMaxBeats ;
WORD wConnectionID ; /* points to an ioChordEntry */
} DMUS_IO_NEXTCHORD ;
typedef struct _DMUS_IO_CHORDMAP_SIGNPOST
{
DWORD dwChords ; /* 1bit per group */
DWORD dwFlags ;
} DMUS_IO_CHORDMAP_SIGNPOST ;
/* Legacy name... */
typedef DMUS_IO_CHORDMAP_SIGNPOST DMUS_IO_PERS_SIGNPOST ;
/*
RIFF
(
' DMPR '
< perh - ck > // Chord map header chunk
[ < guid - ck > ] // guid chunk
[ < vers - ck > ] // version chunk (two DWORDS)
[ < UNFO - list > ] // Unfo chunk
< chdt - ck > // subchord database
< chpl - list > // chord palette
< cmap - list > // chord map
< spsq - list > // signpost list
)
< cmap - list > : : = LIST ( ' cmap ' < choe - list > )
< choe - list > : : = LIST ( ' choe '
< cheh - ck > // chord entry data
< chrd - list > // chord definition
< ncsq - ck > // connecting(next) chords
)
< chrd - list > : : = LIST ( ' chrd '
< INAM - ck > // name of chord in wide char format
< sbcn - ck > // list of subchords composing chord
)
< chpl - list > : : = LIST ( ' chpl '
< chrd - list > . . . // chord definition
)
< spsq - list > : : = = LIST ( ' spsq ' < spst - list > . . . )
< spst - list > : : = LIST ( ' spst '
< spsh - ck >
< chrd - list >
[ < cade - list > ]
)
< cade - list > : : = LIST ( ' cade ' < chrd - list > . . . )
< perh - ck > : : = perh ( < DMUS_IO_CHORDMAP > )
< chdt - ck > : : = chdt ( < cbChordSize : : WORD >
< DMUS_IO_PERS_SUBCHORD > . . . )
< cheh - ck > : : = cheh ( < DMUS_IO_CHORDENTRY > )
< sbcn - ck > : : = sbcn ( < cSubChordID : WORD > . . . )
< ncsq - ck > : : = ncsq ( < wNextChordSize : WORD >
< DMUS_IO_NEXTCHORD > . . . )
< spsh - ck > : : = spsh ( < DMUS_IO_PERS_SIGNPOST > )
*/
/* File io for DirectMusic Script object */
/* RIFF ids: */
# define DMUS_FOURCC_SCRIPT_FORM mmioFOURCC('D','M','S','C')
# define DMUS_FOURCC_SCRIPT_CHUNK mmioFOURCC('s','c','h','d')
# define DMUS_FOURCC_SCRIPTVERSION_CHUNK mmioFOURCC('s','c','v','e')
# define DMUS_FOURCC_SCRIPTLANGUAGE_CHUNK mmioFOURCC('s','c','l','a')
# define DMUS_FOURCC_SCRIPTSOURCE_CHUNK mmioFOURCC('s','c','s','r')
/* io structures:*/
typedef struct _DMUS_IO_SCRIPT_HEADER
{
DWORD dwFlags ; /* DMUS_SCRIPTIOF_ flags */
} DMUS_IO_SCRIPT_HEADER ;
# define DMUS_SCRIPTIOF_LOAD_ALL_CONTENT (1 << 0)
/* If set, when the script loads it will also load all the content in its container. */
# define DMUS_SCRIPTIOF_DOWNLOAD_ALL_SEGMENTS (1 << 1)
/* If set and LOAD_ALL_CONTENT is also set, when the script initializes it will also download all the segments in its container.
If set and LOAD_ALL_CONTENT is not set , when the script calls segment . Load on a segment then the segment will also be downloaded .
If not set , the script must manually download and unload by calling segment . DownloadSoundData and segment . UnloadSoundData . */
/*
RIFF
(
' DMSC ' // DirectMusic Script chunk
< schd - ck > // Script header chunk
[ < guid - ck > ] // GUID for script
[ < vers - ck > ] // Optional version info
[ < UNFO - list > ] // Name, author, copyright info., comments
< scve - ck > // Version of DirectMusic this script was authored to run against
< DMCN - form > // Container of content referenced by the script.
< scla - ck > // ActiveX scripting language in which the script is written
< scsr - ck > or < DMRF > // The script's source code.
// If scsr-ck, the source is embedding in the chunk.
// If DMRF, it is a reference of where to find a text file with the source.
// Class id (guidClassID in DMUS_IO_REFERENCE) must be GUID_NULL because
// this text file is not a DirectMusic object in its own right.
)
// <schd-ck>
' schd '
(
< DMUS_FOURCC_SCRIPT_CHUNK >
)
// <guid-ck>
' guid '
(
< GUID >
)
// <vers-ck>
vers
(
< DMUS_IO_VERSION >
)
// <scve-ck>
scve
(
< DMUS_IO_VERSION >
)
' scla '
(
// Language name, stored as NULL terminated string of WCHARs
)
' scsr '
(
// Source code, stored as NULL terminated string of WCHARs
)
*/
/* Signpost tracks */
# define DMUS_FOURCC_SIGNPOST_TRACK_CHUNK mmioFOURCC( 's', 'g', 'n', 'p' )
typedef struct _DMUS_IO_SIGNPOST
{
MUSIC_TIME mtTime ;
DWORD dwChords ;
WORD wMeasure ;
} DMUS_IO_SIGNPOST ;
/*
// <sgnp-list>
' sgnp '
(
//sizeof DMUS_IO_SIGNPOST: DWORD
< DMUS_IO_SIGNPOST > . . .
)
*/
# define DMUS_FOURCC_MUTE_CHUNK mmioFOURCC('m','u','t','e')
typedef struct _DMUS_IO_MUTE
{
MUSIC_TIME mtTime ;
DWORD dwPChannel ;
DWORD dwPChannelMap ;
} DMUS_IO_MUTE ;
/*
// <mute-list>
' mute '
(
//sizeof DMUS_IO_MUTE:DWORD
< DMUS_IO_MUTE > . . .
)
*/
/* Used for both style and chord map tracks */
# define DMUS_FOURCC_TIME_STAMP_CHUNK mmioFOURCC('s', 't', 'm', 'p')
/* Style tracks */
# define DMUS_FOURCC_STYLE_TRACK_LIST mmioFOURCC('s', 't', 't', 'r')
# define DMUS_FOURCC_STYLE_REF_LIST mmioFOURCC('s', 't', 'r', 'f')
/*
// <sttr-list>
LIST ( ' sttr '
(
< strf - list > . . . // Array of Style references
)
// <strf-list>
LIST ( ' strf '
(
< stmp - ck >
< DMRF >
)
// <stmp-ck>
' stmp '
(
// time:DWORD
)
*/
/* Chord map tracks */
# define DMUS_FOURCC_PERS_TRACK_LIST mmioFOURCC('p', 'f', 't', 'r')
# define DMUS_FOURCC_PERS_REF_LIST mmioFOURCC('p', 'f', 'r', 'f')
/*
// <pftr-list>
LIST ( ' pftr '
(
< pfrf - list > . . . // Array of Chord map references
)
// <pfrf-list>
LIST ( ' pfrf '
(
< stmp - ck >
< DMRF >
)
// <stmp-ck>
' stmp '
(
// time:DWORD
)
*/
# define DMUS_FOURCC_TEMPO_TRACK mmioFOURCC('t','e','t','r')
/*
// tempo array
' tetr '
(
// sizeof DMUS_IO_TEMPO_ITEM: DWORD
< DMUS_IO_TEMPO_ITEM > . . .
)
*/
# define DMUS_FOURCC_SEQ_TRACK mmioFOURCC('s','e','q','t')
# define DMUS_FOURCC_SEQ_LIST mmioFOURCC('e','v','t','l')
# define DMUS_FOURCC_CURVE_LIST mmioFOURCC('c','u','r','l')
/*
// sequence track
' seqt '
(
// sequence array
' evtl '
(
// sizeof DMUS_IO_SEQ_ITEM: DWORD
< DMUS_IO_SEQ_ITEM > . . .
)
// curve array
' curl '
(
// sizeof DMUS_IO_CURVE_ITEM: DWORD
< DMUS_IO_CURVE_ITEM > . . .
)
)
*/
# define DMUS_FOURCC_SYSEX_TRACK mmioFOURCC('s','y','e','x')
/*
// sysex track
' syex '
(
{
< DMUS_IO_SYSEX_ITEM >
< BYTE > . . . // Array of bytes, length defined in the DMUS_IO_SYSEXITEM structure
} . . .
)
*/
# define DMUS_FOURCC_TIMESIGNATURE_TRACK mmioFOURCC('t','i','m','s')
typedef struct _DMUS_IO_TIMESIGNATURE_ITEM
{
MUSIC_TIME lTime ;
BYTE bBeatsPerMeasure ; /* beats per measure (top of time sig) */
BYTE bBeat ; /* what note receives the beat (bottom of time sig.) */
/* we can assume that 0 means 256th note */
WORD wGridsPerBeat ; /* grids per beat */
} DMUS_IO_TIMESIGNATURE_ITEM ;
/* DX6 time signature track
' tims '
(
// size of DMUS_IO_TIMESIGNATURE_ITEM : DWORD
< DMUS_IO_TIMESIGNATURE_ITEM > . . .
)
*/
/* DX8 Time signature track. The track has been updated from DX7 to support a list of
RIFF chunks . This will allow the time signature track to expand in the future .
*/
# define DMUS_FOURCC_TIMESIGTRACK_LIST mmioFOURCC('T','I','M','S')
# define DMUS_FOURCC_TIMESIG_CHUNK DMUS_FOURCC_TIMESIGNATURE_TRACK
/*
LIST
(
' TIMS ' // Time Signature Track list-type
< tims - ck > // Chunk containing an array of time signatures
)
' tims '
(
// size of DMUS_IO_TIMESIGNATURE_ITEM : DWORD
< DMUS_IO_TIMESIGNATURE_ITEM > . . .
)
*/
/* DX8 Marker track. This is used to store valid start points and other
flow control parameters that may come later . For example , if we want
to implement more sophisticated looping and branching constructs , they
would live in this track .
*/
# define DMUS_FOURCC_MARKERTRACK_LIST mmioFOURCC('M','A','R','K')
# define DMUS_FOURCC_VALIDSTART_CHUNK mmioFOURCC('v','a','l','s')
# define DMUS_FOURCC_PLAYMARKER_CHUNK mmioFOURCC('p','l','a','y')
/* io structures */
typedef struct _DMUS_IO_VALID_START
{
MUSIC_TIME mtTime ; /* Time of a legal start. */
} DMUS_IO_VALID_START ;
typedef struct _DMUS_IO_PLAY_MARKER
{
MUSIC_TIME mtTime ; /* Time of a next legal play point marker. */
} DMUS_IO_PLAY_MARKER ;
/*
LIST
(
' MARK ' // Marker Track list-type
[ < vals - ck > ] // Chunk containing an array of start points
[ < play - ck > ] // Chunk containing an array of play start markers
)
' vals '
(
// size of DMUS_IO_VALID_START : DWORD
< DMUS_IO_VALID_START > . . .
)
' play '
(
// size of DMUS_IO_PLAY_MARKER : DWORD
< DMUS_IO_PLAY_MARKER > . . .
)
*/
/* segment trigger tracks */
/* RIFF ids: */
# define DMUS_FOURCC_SEGTRACK_LIST mmioFOURCC('s','e','g','t')
# define DMUS_FOURCC_SEGTRACK_CHUNK mmioFOURCC('s','g','t','h')
# define DMUS_FOURCC_SEGMENTS_LIST mmioFOURCC('l','s','g','l')
# define DMUS_FOURCC_SEGMENT_LIST mmioFOURCC('l','s','e','g')
# define DMUS_FOURCC_SEGMENTITEM_CHUNK mmioFOURCC('s','g','i','h')
# define DMUS_FOURCC_SEGMENTITEMNAME_CHUNK mmioFOURCC('s','n','a','m')
/* io structures */
typedef struct _DMUS_IO_SEGMENT_TRACK_HEADER
{
DWORD dwFlags ; /* Reserved leave as 0. */
} DMUS_IO_SEGMENT_TRACK_HEADER ;
typedef struct _DMUS_IO_SEGMENT_ITEM_HEADER
{
MUSIC_TIME lTimeLogical ; /* Position in track list. Time in the music with which the event is associated. */
MUSIC_TIME lTimePhysical ; /* Precise time event will be triggered. Should be close to logical time. */
DWORD dwPlayFlags ; /* Flags for PlaySegment(). */
DWORD dwFlags ; /* Flags. */
} DMUS_IO_SEGMENT_ITEM_HEADER ;
/* values for dwflags field of DMUS_IO_SEGMENT_ITEM_HEADER */
# define DMUS_SEGMENTTRACKF_MOTIF 1 /* interpret DMRF as link to style, and use snam as the name of a motif within the style */
/*
LIST
(
' segt ' // DirectMusic Segment Trigger Track form-type
[ < sgth - ck > ] // Segment track header
< lsgl - list > // List of Segment Lists
)
// <sgth-ck>
' sgth '
(
< DMUS_IO_SEGMENT_TRACK_HEADER >
)
// <lsgl-list>
LIST
(
' lsgl ' // Array of segments
< lseg - list > . . . // Each segment is encapsulated in a list (that way it can still be riff parsed.)
)
// <lseg-list>
LIST
(
' lseg '
< sgih - ck >
< DMRF - list > // Link to a segment or style file.
[ < snam - ck > ] // Name field. Used with DMUS_SEGMENTTRACKF_MOTIF flag.
)
// <sgih-ck> // segment item header
(
< DMUS_IO_SEGMENT_ITEM_HEADER > // Segment item header
)
// <snam-ck>
(
// Name, stored as NULL terminated string of WCHARs
)
*/
/* Script track. */
/* RIFF ids: */
# define DMUS_FOURCC_SCRIPTTRACK_LIST mmioFOURCC('s','c','r','t')
# define DMUS_FOURCC_SCRIPTTRACKEVENTS_LIST mmioFOURCC('s','c','r','l')
# define DMUS_FOURCC_SCRIPTTRACKEVENT_LIST mmioFOURCC('s','c','r','e')
# define DMUS_FOURCC_SCRIPTTRACKEVENTHEADER_CHUNK mmioFOURCC('s','c','r','h')
# define DMUS_FOURCC_SCRIPTTRACKEVENTNAME_CHUNK mmioFOURCC('s','c','r','n')
/* Flags for DMUS_IO_SCRIPTTRACK_TIMING
*/
# define DMUS_IO_SCRIPTTRACKF_PREPARE (1 << 0) /* Fire event in advance of time stamp, at Prepare time. This is the default because it leaves the script time to change the music happening at the target time. */
# define DMUS_IO_SCRIPTTRACKF_QUEUE (1 << 1) /* Fire event just before time stamp, at Queue time. */
# define DMUS_IO_SCRIPTTRACKF_ATTIME (1 << 2) /* Fire event right at the time stamp. */
typedef struct _DMUS_IO_SCRIPTTRACK_EVENTHEADER
{
DWORD dwFlags ; /* various bits (see DMUS_IO_SCRIPTTRACKF_*) */
MUSIC_TIME lTimeLogical ; /* Position in track list. Time in the music with which the event is associated. */
MUSIC_TIME lTimePhysical ; /* Precise time event will be triggered. Should be close to logical time. */
} DMUS_IO_SCRIPTTRACK_EVENTHEADER ;
/*
// Script Track
// <scrt-list>
LIST
(
< scrl - list > // List of script events
)
// <scrl-list>
LIST
(
< scre - list > . . . // Array of event descriptions
)
// <scre-list>
LIST
(
< scrh - ck > // Event header chunk
< DMRF >
< scrn - ck > // Routine name
)
' scrh '
(
< DMUS_IO_SCRIPTTRACK_EVENTHEADER >
)
' scrn '
(
// Name, stored as NULL terminated string of WCHARs
)
*/
/* Lyrics/Notification track. */
/* RIFF ids: */
# define DMUS_FOURCC_LYRICSTRACK_LIST mmioFOURCC('l','y','r','t')
# define DMUS_FOURCC_LYRICSTRACKEVENTS_LIST mmioFOURCC('l','y','r','l')
# define DMUS_FOURCC_LYRICSTRACKEVENT_LIST mmioFOURCC('l','y','r','e')
# define DMUS_FOURCC_LYRICSTRACKEVENTHEADER_CHUNK mmioFOURCC('l','y','r','h')
# define DMUS_FOURCC_LYRICSTRACKEVENTTEXT_CHUNK mmioFOURCC('l','y','r','n')
typedef struct _DMUS_IO_LYRICSTRACK_EVENTHEADER
{
DWORD dwFlags ; /* Reserved leave as 0. */
DWORD dwTimingFlags ; /* Combination DMUS_PMSGF_TOOL_* flags. Determines the precise timing of when the notification happens. Invalid with the flag DMUS_PMSGF_REFTIME, DMUS_PMSGF_MUSICTIME, DMUS_PMSGF_TOOL_FLUSH, or DMUS_PMSGF_LOCKTOREFTIME. */
MUSIC_TIME lTimeLogical ; /* Position in track list. Time in the music with which the event is associated. */
MUSIC_TIME lTimePhysical ; /* Precise time event will be triggered. Should be close to logical time. */
} DMUS_IO_LYRICSTRACK_EVENTHEADER ;
/*
// Lyrics/Notification Track
// <lyrt-list>
LIST
(
< lyrl - list > // List of notification events
)
// <lyrl-list>
LIST
(
< lyre - list > . . . // Array of event descriptions
)
// <lyre-list>
LIST
(
< lyrh - ck > // Event header chunk
< lyrn - ck > // Notification text
)
' lyrh '
(
< DMUS_IO_LYRICSTRACK_EVENTHEADER >
)
' lyrn '
(
// Name, stored as NULL terminated string of WCHARs
)
*/
/* Parameter control track */
/* RIFF ids: */
# define DMUS_FOURCC_PARAMCONTROLTRACK_TRACK_LIST mmioFOURCC('p','r','m','t')
# define DMUS_FOURCC_PARAMCONTROLTRACK_OBJECT_LIST mmioFOURCC('p','r','o','l')
# define DMUS_FOURCC_PARAMCONTROLTRACK_OBJECT_CHUNK mmioFOURCC('p','r','o','h')
# define DMUS_FOURCC_PARAMCONTROLTRACK_PARAM_LIST mmioFOURCC('p','r','p','l')
# define DMUS_FOURCC_PARAMCONTROLTRACK_PARAM_CHUNK mmioFOURCC('p','r','p','h')
# define DMUS_FOURCC_PARAMCONTROLTRACK_CURVES_CHUNK mmioFOURCC('p','r','c','c')
typedef struct _DMUS_IO_PARAMCONTROLTRACK_OBJECTHEADER
{
DWORD dwFlags ; /* Reserved. Must be zero. */
GUID guidTimeFormat ; /* Time format to set the object to. Must be GUID_TIME_REFERNCE or GUID_TIME_MUSIC from medparam.h. */
/* Path for finding the object. These fields correspond to the first five parameters of IDirectMusicSegmentState::GetObjectInPath. */
DWORD dwPChannel ;
DWORD dwStage ;
DWORD dwBuffer ;
GUID guidObject ;
DWORD dwIndex ;
} DMUS_IO_PARAMCONTROLTRACK_OBJECTHEADER ;
typedef struct _DMUS_IO_PARAMCONTROLTRACK_PARAMHEADER
{
DWORD dwFlags ; /* Reserved. Must be zero. */
DWORD dwIndex ; /* Index number of the parameter on the object */
} DMUS_IO_PARAMCONTROLTRACK_PARAMHEADER ;
typedef struct _DMUS_IO_PARAMCONTROLTRACK_CURVEINFO
{
MUSIC_TIME mtStartTime ;
MUSIC_TIME mtEndTime ;
float fltStartValue ;
float fltEndValue ;
DWORD dwCurveType ; /* One of the items from the MP_CURVE_TYPE enum in medparam.h */
DWORD dwFlags ; /* A combination of the MPF_ENVLP_* constants in medparam.h */
} DMUS_IO_PARAMCONTROLTRACK_CURVEINFO ;
/*
// <prmt-list>
LIST
(
< prol - list > . . . // one for each object
)
// <prol-list>
LIST
(
< proh - ck > // object header chunk
< prpl - list > . . . // one for each parameter
)
// <proh-ck>
proh
(
< DMUS_IO_PARAMCONTROLTRACK_OBJECTHEADER >
)
// <prpl-list>
LIST
(
< prph - ck > // parameter header chunk
< prcc - ck > // chunk containing an array of curves
)
// <prph-ck>
prph
(
< DMUS_IO_PARAMCONTROLTRACK_PARAMHEADER >
)
// <prcc-ck>
prcc
(
// sizeof DMUS_IO_PARAMCONTROLTRACK_CURVEINFO:DWORD
< DMUS_IO_PARAMCONTROLTRACK_CURVEINFO > . . . // curves, sorted in order of mtTime
)
*/
/* Melody formulation track */
/* Note: Melody formulation file format is not supported in DX8. */
typedef DMUS_CONNECTION_RULE DMUS_IO_CONNECTION_RULE ; /* defined in dmusici.h */
typedef DMUS_MELODY_FRAGMENT DMUS_IO_MELODY_FRAGMENT ; /* defined in dmusici.h */
# define DMUS_FOURCC_MELODYFORM_TRACK_LIST mmioFOURCC( 'm', 'f', 'r', 'm' )
# define DMUS_FOURCC_MELODYFORM_HEADER_CHUNK mmioFOURCC( 'm', 'l', 'f', 'h' )
# define DMUS_FOURCC_MELODYFORM_BODY_CHUNK mmioFOURCC( 'm', 'l', 'f', 'b' )
typedef struct _DMUS_IO_MELFORM
{
DWORD dwPlaymode ; /* NOT CURRENTLY USED - MUST BE 0 */
} DMUS_IO_MELFORM ;
/*
// <mfrm-list>
LIST
(
' mfrm '
< mlfh - ck > // Melody formulation header chunk
< mlfb - ck > // Melody formulation body chunk
)
// <mlfb-ck>
' mlfb '
(
< DMUS_IO_MELFORM >
)
// <mlfb-ck>
' mlfb '
(
//sizeof DMUS_IO_MELODY_FRAGMENT: DWORD
< DMUS_IO_MELODY_FRAGMENT > . . .
)
*/
# if (DIRECTSOUND_VERSION >= 0x0800)
/* DirectSoundBufferConfig FX Map */
/* RIFF ids: */
# define DMUS_FOURCC_DSBC_FORM mmioFOURCC('D','S','B','C')
# define DMUS_FOURCC_DSBD_CHUNK mmioFOURCC('d','s','b','d')
# define DMUS_FOURCC_BSID_CHUNK mmioFOURCC('b','s','i','d')
# define DMUS_FOURCC_DS3D_CHUNK mmioFOURCC('d','s','3','d')
# define DMUS_FOURCC_DSBC_LIST mmioFOURCC('f','x','l','s')
# define DMUS_FOURCC_DSFX_FORM mmioFOURCC('D','S','F','X')
# define DMUS_FOURCC_DSFX_CHUNK mmioFOURCC('f','x','h','r')
# define DMUS_FOURCC_DSFX_DATA mmioFOURCC('d','a','t','a')
/* io structures */
typedef struct _DSOUND_IO_DSBUFFERDESC
{
DWORD dwFlags ; /* DirectSound buffer creation flags */
WORD nChannels ; /* No. of channels (rest of buffer format is determined by owning sink) */
LONG lVolume ; /* Initial pan; only used if CTRLVOLUME is specified */
LONG lPan ; /* Initial pan; only used if CTRLPAN is specified */
DWORD dwReserved ; /* Reserved - must be 0 */
} DSOUND_IO_DSBUFFERDESC ;
typedef struct _DSOUND_IO_DSBUSID
{
DWORD busid [ 1 ] ; /* Array size determined from chunk size */
} DSOUND_IO_DSBUSID ;
typedef struct _DSOUND_IO_3D
{
GUID guid3DAlgorithm ; /* GUID identifying the 3D algorithm to use (defined in dsound.h) */
DS3DBUFFER ds3d ; /* Initial 3D parameters */
} DSOUND_IO_3D ;
typedef struct _DSOUND_IO_DXDMO_HEADER
{
DWORD dwEffectFlags ; /* Effect creation flags - equivalent to DSEFFECTDESC::dwFlags */
GUID guidDSFXClass ; /* GUID identifying the effect to use - corresponds to a COM CLSID */
GUID guidReserved ; /* Reserved - must be the null GUID */
GUID guidSendBuffer ; /* GUID identifying the buffer to send to if this is a send effect */
DWORD dwReserved ; /* Reserved - must be 0 */
} DSOUND_IO_DXDMO_HEADER ;
typedef struct _DSOUND_IO_DXDMO_DATA
{
DWORD data [ 1 ] ; /* Array size determined by the DMO involved */
} DSOUND_IO_DXDMO_DATA ;
/*
RIFF
(
' DSBC ' // DirectSoundBufferConfig chunk
[ < guid - ck > ] // GUID identifier for this DirectSoundBufferConfig
[ < vers - ck > ] // Optional version info
[ < UNFO - list > ] // Name, author, copyright info., comments
< dsbd - ck > // DirectSound Buffer descriptor chunk
[ < bsid - ck > ] // Optional bus id array
[ < ds3d - ck > ] // Optional 3d Parameters
[ < fxls - list > ] // Optional list of FX descriptors
)
// <guid-ck>
' guid '
(
< GUID >
)
// <vers-ck>
' vers '
(
< DMUS_IO_VERSION >
)
// <dsbd-ck>
' dsbd '
(
< DSOUND_IO_DSBUFFERDESC > // Creation parameters and initial settings for the buffer
)
// <bsid-ck>
' bsid '
(
< DSOUND_IO_DSBUSID > // The size of DSOUND_IO_DSBUSID is determined by the chunk size
)
// <ds3d-ck>
' ds3d '
(
< DSOUND_IO_3D > // Initial 3D buffer parameters: position, etc.
)
// <fx-list>
LIST
(
' fxls ' // Array of DMO creation parameter blocks
< DSFX - form > . . . // Each DMO is encapsulated in a RIFF chunk
)
// <DSFX-form> // DMOs can be embedded in a buffer configuration or stored as separate files
RIFF
(
' DSFX '
< fxhr - ck > // FX header chunk
[ < data - ck > ] // FX initial settings chunk
)
// <fxhr-ck>
' fxhr '
(
< DSOUND_IO_DXDMO_HEADER >
)
// <data-ck>
' data '
(
< DSOUND_IO_DXDMO_DATA > // Opaque data block used by the DMO to load itself.
// For our standard included DMOs, this is simply the structure accepted by
// the DMO's SetAllParameters() method - e.g. struct DSFXChorus for Chorus.
)
*/
# endif
# ifdef __cplusplus
} ; /* extern "C" */
# endif
# include <poppack.h>
# endif /* #ifndef _DMUSICF_ */