📄 dmusicf.h
字号:
/************************************************************************
* *
* 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
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -