0
|
1 /************************************************************************
|
|
2 * *
|
|
3 * dmusicf.h -- This module defines the DirectMusic file formats *
|
|
4 * *
|
|
5 * Copyright (c) Microsoft Corporation. All rights reserved. *
|
|
6 * *
|
|
7 ************************************************************************/
|
|
8
|
|
9 #ifndef _DMUSICF_
|
|
10 #define _DMUSICF_
|
|
11
|
|
12
|
|
13 #include <windows.h>
|
|
14
|
|
15 #define COM_NO_WINDOWS_H
|
|
16 #include <objbase.h>
|
|
17
|
|
18 #include <mmsystem.h>
|
|
19
|
|
20 #include <pshpack8.h>
|
|
21
|
|
22 #ifdef __cplusplus
|
|
23 extern "C" {
|
|
24 #endif
|
|
25
|
|
26 interface IDirectMusicCollection;
|
|
27 #ifndef __cplusplus
|
|
28 typedef interface IDirectMusicCollection IDirectMusicCollection;
|
|
29 #endif
|
|
30
|
|
31 /* Common chunks */
|
|
32
|
|
33 #define DMUS_FOURCC_GUID_CHUNK mmioFOURCC('g','u','i','d')
|
|
34 #define DMUS_FOURCC_INFO_LIST mmioFOURCC('I','N','F','O')
|
|
35 #define DMUS_FOURCC_UNFO_LIST mmioFOURCC('U','N','F','O')
|
|
36 #define DMUS_FOURCC_UNAM_CHUNK mmioFOURCC('U','N','A','M')
|
|
37 #define DMUS_FOURCC_UART_CHUNK mmioFOURCC('U','A','R','T')
|
|
38 #define DMUS_FOURCC_UCOP_CHUNK mmioFOURCC('U','C','O','P')
|
|
39 #define DMUS_FOURCC_USBJ_CHUNK mmioFOURCC('U','S','B','J')
|
|
40 #define DMUS_FOURCC_UCMT_CHUNK mmioFOURCC('U','C','M','T')
|
|
41 #define DMUS_FOURCC_CATEGORY_CHUNK mmioFOURCC('c','a','t','g')
|
|
42 #define DMUS_FOURCC_VERSION_CHUNK mmioFOURCC('v','e','r','s')
|
|
43
|
|
44 /* The following structures are used by the Tracks, and are the packed structures */
|
|
45 /* that are passed to the Tracks inside the IStream. */
|
|
46
|
|
47
|
|
48 typedef struct _DMUS_IO_SEQ_ITEM
|
|
49 {
|
|
50 MUSIC_TIME mtTime;
|
|
51 MUSIC_TIME mtDuration;
|
|
52 DWORD dwPChannel;
|
|
53 short nOffset;
|
|
54 BYTE bStatus;
|
|
55 BYTE bByte1;
|
|
56 BYTE bByte2;
|
|
57 } DMUS_IO_SEQ_ITEM;
|
|
58
|
|
59
|
|
60 typedef struct _DMUS_IO_CURVE_ITEM
|
|
61 {
|
|
62 MUSIC_TIME mtStart;
|
|
63 MUSIC_TIME mtDuration;
|
|
64 MUSIC_TIME mtResetDuration;
|
|
65 DWORD dwPChannel;
|
|
66 short nOffset;
|
|
67 short nStartValue;
|
|
68 short nEndValue;
|
|
69 short nResetValue;
|
|
70 BYTE bType;
|
|
71 BYTE bCurveShape;
|
|
72 BYTE bCCData;
|
|
73 BYTE bFlags;
|
|
74 /* Following was added for DirectX8. */
|
|
75 WORD wParamType; /* RPN or NRPN parameter number. */
|
|
76 WORD wMergeIndex; /* Allows multiple parameters to be merged (pitchbend, volume, and expression.) */
|
|
77 } DMUS_IO_CURVE_ITEM;
|
|
78
|
|
79
|
|
80 typedef struct _DMUS_IO_TEMPO_ITEM
|
|
81 {
|
|
82 MUSIC_TIME lTime;
|
|
83 double dblTempo;
|
|
84 } DMUS_IO_TEMPO_ITEM;
|
|
85
|
|
86
|
|
87 typedef struct _DMUS_IO_SYSEX_ITEM
|
|
88 {
|
|
89 MUSIC_TIME mtTime;
|
|
90 DWORD dwPChannel;
|
|
91 DWORD dwSysExLength;
|
|
92 } DMUS_IO_SYSEX_ITEM;
|
|
93
|
|
94 typedef DMUS_CHORD_KEY DMUS_CHORD_PARAM; /* DMUS_CHORD_KEY defined in dmusici.h */
|
|
95
|
|
96 typedef struct _DMUS_RHYTHM_PARAM
|
|
97 {
|
|
98 DMUS_TIMESIGNATURE TimeSig;
|
|
99 DWORD dwRhythmPattern;
|
|
100 } DMUS_RHYTHM_PARAM;
|
|
101
|
|
102 typedef struct _DMUS_TEMPO_PARAM
|
|
103 {
|
|
104 MUSIC_TIME mtTime;
|
|
105 double dblTempo;
|
|
106 } DMUS_TEMPO_PARAM;
|
|
107
|
|
108
|
|
109 typedef struct _DMUS_MUTE_PARAM
|
|
110 {
|
|
111 DWORD dwPChannel;
|
|
112 DWORD dwPChannelMap;
|
|
113 BOOL fMute;
|
|
114 } DMUS_MUTE_PARAM;
|
|
115
|
|
116 /* Style chunks */
|
|
117
|
|
118 #define DMUS_FOURCC_STYLE_FORM mmioFOURCC('D','M','S','T')
|
|
119 #define DMUS_FOURCC_STYLE_CHUNK mmioFOURCC('s','t','y','h')
|
|
120 #define DMUS_FOURCC_PART_LIST mmioFOURCC('p','a','r','t')
|
|
121 #define DMUS_FOURCC_PART_CHUNK mmioFOURCC('p','r','t','h')
|
|
122 #define DMUS_FOURCC_NOTE_CHUNK mmioFOURCC('n','o','t','e')
|
|
123 #define DMUS_FOURCC_CURVE_CHUNK mmioFOURCC('c','r','v','e')
|
|
124 #define DMUS_FOURCC_MARKER_CHUNK mmioFOURCC('m','r','k','r')
|
|
125 #define DMUS_FOURCC_RESOLUTION_CHUNK mmioFOURCC('r','s','l','n')
|
|
126 #define DMUS_FOURCC_ANTICIPATION_CHUNK mmioFOURCC('a','n','p','n')
|
|
127 #define DMUS_FOURCC_PATTERN_LIST mmioFOURCC('p','t','t','n')
|
|
128 #define DMUS_FOURCC_PATTERN_CHUNK mmioFOURCC('p','t','n','h')
|
|
129 #define DMUS_FOURCC_RHYTHM_CHUNK mmioFOURCC('r','h','t','m')
|
|
130 #define DMUS_FOURCC_PARTREF_LIST mmioFOURCC('p','r','e','f')
|
|
131 #define DMUS_FOURCC_PARTREF_CHUNK mmioFOURCC('p','r','f','c')
|
|
132 #define DMUS_FOURCC_STYLE_PERS_REF_LIST mmioFOURCC('p','r','r','f')
|
|
133 #define DMUS_FOURCC_MOTIFSETTINGS_CHUNK mmioFOURCC('m','t','f','s')
|
|
134
|
|
135 /* Flags used by variations: these make up the DWORDs in dwVariationChoices. */
|
|
136
|
|
137 /* These flags determine the types of chords supported by a given variation in DirectMusic */
|
|
138 /* mode. The first seven flags (bits 1-7) are set if the variation supports major chords */
|
|
139 /* rooted in scale positions, so, e.g., if bits 1, 2, and 4 are set, the variation */
|
|
140 /* supports major chords rooted in the tonic, second, and fourth scale positions. The */
|
|
141 /* next seven flags serve the same purpose, but for minor chords, and the following seven */
|
|
142 /* flags serve the same purpose for chords that are not major or minor (e.g., SUS 4 */
|
|
143 /* chords). Bits 22, 23, and 24 are set if the variation supports chords rooted in the */
|
|
144 /* scale, chords rooted sharp of scale tones, and chords rooted flat of scale tones, */
|
|
145 /* respectively. For example, to support a C# minor chord in the scale of C Major, */
|
|
146 /* bits 8 (for tonic minor) and 24 (for sharp) need to be set. Bits 25, 26, an 27 handle */
|
|
147 /* chords that are triads, 6th or 7th chords, and chords with extensions, respectively. */
|
|
148 /* bits 28 and 29 handle chords that are followed by tonic and dominant chords, */
|
|
149 /* respectively. */
|
|
150 #define DMUS_VARIATIONF_MAJOR 0x0000007F /* Seven positions in the scale - major chords. */
|
|
151 #define DMUS_VARIATIONF_MINOR 0x00003F80 /* Seven positions in the scale - minor chords. */
|
|
152 #define DMUS_VARIATIONF_OTHER 0x001FC000 /* Seven positions in the scale - other chords. */
|
|
153 #define DMUS_VARIATIONF_ROOT_SCALE 0x00200000 /* Handles chord roots in the scale. */
|
|
154 #define DMUS_VARIATIONF_ROOT_FLAT 0x00400000 /* Handles flat chord roots (based on scale notes). */
|
|
155 #define DMUS_VARIATIONF_ROOT_SHARP 0x00800000 /* Handles sharp chord roots (based on scale notes). */
|
|
156 #define DMUS_VARIATIONF_TYPE_TRIAD 0x01000000 /* Handles simple chords - triads. */
|
|
157 #define DMUS_VARIATIONF_TYPE_6AND7 0x02000000 /* Handles simple chords - 6 and 7. */
|
|
158 #define DMUS_VARIATIONF_TYPE_COMPLEX 0x04000000 /* Handles complex chords. */
|
|
159 #define DMUS_VARIATIONF_DEST_TO1 0x08000000 /* Handles transitions to 1 chord. */
|
|
160 #define DMUS_VARIATIONF_DEST_TO5 0x10000000 /* Handles transitions to 5 chord. */
|
|
161 #define DMUS_VARIATIONF_DEST_OTHER 0x40000000 /* Handles transitions to chords other than 1 . */
|
|
162
|
|
163 /* legacy mask for variation modes */
|
|
164 #define DMUS_VARIATIONF_MODES 0xE0000000
|
|
165 /* Bits 29 and 31 of the variation flags are the Mode bits. If both are 0, it's IMA. */
|
|
166 /* If bit 29 is 1, it's Direct Music. */
|
|
167 #define DMUS_VARIATIONF_MODES_EX (0x20000000 | 0x80000000)
|
|
168 #define DMUS_VARIATIONF_IMA25_MODE 0x00000000
|
|
169 #define DMUS_VARIATIONF_DMUS_MODE 0x20000000
|
|
170
|
|
171 /* Set this if the part uses marker events */
|
|
172 #define DMUS_PARTF_USE_MARKERS 0x1
|
|
173 /* Set this if the part is allowed to switch only on chord-aligned markers */
|
|
174 #define DMUS_PARTF_ALIGN_CHORDS 0x2
|
|
175
|
|
176 /* These specify if the marker event signals whether to stop a variation or start a
|
|
177 pattern/variation (or both), and whether new variations must align with a chord */
|
|
178 #define DMUS_MARKERF_START 0x1
|
|
179 #define DMUS_MARKERF_STOP 0x2
|
|
180 #define DMUS_MARKERF_CHORD_ALIGN 0x4
|
|
181
|
|
182 /* if this flag is set, variation settings in a playing pattern-based track's state data will
|
|
183 persist in the track after it stops playing */
|
|
184 #define DMUS_PATTERNF_PERSIST_CONTROL 0x1
|
|
185
|
|
186 /* These specify possible values for DMUS_IO_PARTREF.bRandomVariation
|
|
187 all but DMUS_VARIATIONT_SEQUENTIAL and DMUS_VARIATIONT_RANDOM are DirectX8. */
|
|
188 typedef enum enumDMUS_VARIATIONT_TYPES
|
|
189 {
|
|
190 DMUS_VARIATIONT_SEQUENTIAL = 0, /* Play sequential starting with variation 1. */
|
|
191 DMUS_VARIATIONT_RANDOM = 1, /* Play randomly. */
|
|
192 DMUS_VARIATIONT_RANDOM_START = 2, /* Play sequential starting with a random variation. */
|
|
193 DMUS_VARIATIONT_NO_REPEAT = 3, /* Play randomly, but don't play the same variation twice. */
|
|
194 DMUS_VARIATIONT_RANDOM_ROW = 4 /* Play randomly as a row: don't repeat any variation until all have played. */
|
|
195 } DMUS_VARIATIONT_TYPES;
|
|
196
|
|
197 /* These specify possible values for DMUS_IO_PATTERN.wEmbellishment (DirectX8) */
|
|
198 typedef enum enumDMUS_EMBELLISHT_TYPES
|
|
199 {
|
|
200 DMUS_EMBELLISHT_NORMAL = 0,
|
|
201 DMUS_EMBELLISHT_FILL = 1,
|
|
202 DMUS_EMBELLISHT_BREAK = 2,
|
|
203 DMUS_EMBELLISHT_INTRO = 4,
|
|
204 DMUS_EMBELLISHT_END = 8,
|
|
205 DMUS_EMBELLISHT_MOTIF = 16,
|
|
206 DMUS_EMBELLISHT_ALL = 0xFFFF
|
|
207 } DMUS_EMBELLISHT_TYPES;
|
|
208
|
|
209 #pragma pack(2)
|
|
210
|
|
211 typedef struct _DMUS_IO_TIMESIG
|
|
212 {
|
|
213 /* Time signatures define how many beats per measure, which note receives */
|
|
214 /* the beat, and the grid resolution. */
|
|
215 BYTE bBeatsPerMeasure; /* beats per measure (top of time sig) */
|
|
216 BYTE bBeat; /* what note receives the beat (bottom of time sig.) */
|
|
217 /* we can assume that 0 means 256th note */
|
|
218 WORD wGridsPerBeat; /* grids per beat */
|
|
219 } DMUS_IO_TIMESIG;
|
|
220
|
|
221 typedef struct _DMUS_IO_STYLE
|
|
222 {
|
|
223 DMUS_IO_TIMESIG timeSig; /* Styles have a default Time Signature */
|
|
224 double dblTempo;
|
|
225 } DMUS_IO_STYLE;
|
|
226
|
|
227 typedef struct _DMUS_IO_VERSION
|
|
228 {
|
|
229 DWORD dwVersionMS; /* Version # high-order 32 bits */
|
|
230 DWORD dwVersionLS; /* Version # low-order 32 bits */
|
|
231 } DMUS_IO_VERSION;
|
|
232
|
|
233 typedef struct _DMUS_IO_PATTERN
|
|
234 {
|
|
235 DMUS_IO_TIMESIG timeSig; /* Patterns can override the Style's Time sig. */
|
|
236 BYTE bGrooveBottom; /* bottom of groove range */
|
|
237 BYTE bGrooveTop; /* top of groove range */
|
|
238 WORD wEmbellishment; /* Fill, Break, Intro, End, Normal, Motif */
|
|
239 WORD wNbrMeasures; /* length in measures */
|
|
240 BYTE bDestGrooveBottom; /* bottom of groove range for next pattern */
|
|
241 BYTE bDestGrooveTop; /* top of groove range for next pattern */
|
|
242 DWORD dwFlags; /* various flags */
|
|
243 } DMUS_IO_PATTERN;
|
|
244
|
|
245 typedef struct _DMUS_IO_STYLEPART
|
|
246 {
|
|
247 DMUS_IO_TIMESIG timeSig; /* can override pattern's */
|
|
248 DWORD dwVariationChoices[32]; /* MOAW choice bitfield */
|
|
249 GUID guidPartID; /* identifies the part */
|
|
250 WORD wNbrMeasures; /* length of the Part */
|
|
251 BYTE bPlayModeFlags; /* see PLAYMODE flags */
|
|
252 BYTE bInvertUpper; /* inversion upper limit */
|
|
253 BYTE bInvertLower; /* inversion lower limit */
|
|
254 BYTE bPad[3]; /* for DWORD alignment */
|
|
255 DWORD dwFlags; /* various flags */
|
|
256 } DMUS_IO_STYLEPART;
|
|
257
|
|
258 typedef struct _DMUS_IO_PARTREF
|
|
259 {
|
|
260 GUID guidPartID; /* unique ID for matching up with parts */
|
|
261 WORD wLogicalPartID; /* corresponds to port/device/midi channel OBSOLETE */
|
|
262 BYTE bVariationLockID; /* parts with the same ID lock variations. */
|
|
263 /* high bit is used to identify master Part */
|
|
264 BYTE bSubChordLevel; /* tells which sub chord level this part wants */
|
|
265 BYTE bPriority; /* 256 priority levels. Parts with lower priority */
|
|
266 /* aren't played first when a device runs out of */
|
|
267 /* notes */
|
|
268 BYTE bRandomVariation; /* when set, matching variations play in random order */
|
|
269 /* when clear, matching variations play sequentially */
|
|
270 WORD wPad; /* not used */
|
|
271 DWORD dwPChannel; /* replaces wLogicalPartID */
|
|
272 } DMUS_IO_PARTREF;
|
|
273
|
|
274 typedef struct _DMUS_IO_STYLENOTE
|
|
275 {
|
|
276 MUSIC_TIME mtGridStart; /* when this note occurs */
|
|
277 DWORD dwVariation; /* variation bits */
|
|
278 MUSIC_TIME mtDuration; /* how long this note lasts */
|
|
279 short nTimeOffset; /* offset from mtGridStart */
|
|
280 WORD wMusicValue; /* Position in scale. */
|
|
281 BYTE bVelocity; /* Note velocity. */
|
|
282 BYTE bTimeRange; /* Range to randomize start time. */
|
|
283 BYTE bDurRange; /* Range to randomize duration. */
|
|
284 BYTE bVelRange; /* Range to randomize velocity. */
|
|
285 BYTE bInversionID; /* Identifies inversion group to which this note belongs */
|
|
286 BYTE bPlayModeFlags; /* Can override part */
|
|
287 /* Following exists only under DirectX8 and on */
|
|
288 BYTE bNoteFlags; /* values from DMUS_NOTEF_FLAGS */
|
|
289 } DMUS_IO_STYLENOTE;
|
|
290
|
|
291 typedef struct _DMUS_IO_STYLECURVE
|
|
292 {
|
|
293 MUSIC_TIME mtGridStart; /* when this curve occurs */
|
|
294 DWORD dwVariation; /* variation bits */
|
|
295 MUSIC_TIME mtDuration; /* how long this curve lasts */
|
|
296 MUSIC_TIME mtResetDuration;/* how long after the end of the curve to reset the curve */
|
|
297 short nTimeOffset; /* offset from mtGridStart */
|
|
298 short nStartValue; /* curve's start value */
|
|
299 short nEndValue; /* curve's end value */
|
|
300 short nResetValue; /* the value to which to reset the curve */
|
|
301 BYTE bEventType; /* type of curve */
|
|
302 BYTE bCurveShape; /* shape of curve */
|
|
303 BYTE bCCData; /* CC# */
|
|
304 BYTE bFlags; /* Bit 1=TRUE means to send nResetValue. Otherwise, don't.
|
|
305 Other bits are reserved. */
|
|
306 /* Following was added for DirectX8. */
|
|
307 WORD wParamType; /* RPN or NRPN parameter number. */
|
|
308 WORD wMergeIndex; /* Allows multiple parameters to be merged (pitchbend, volume, and expression.) */
|
|
309 } DMUS_IO_STYLECURVE;
|
|
310
|
|
311 typedef struct _DMUS_IO_STYLEMARKER
|
|
312 {
|
|
313 MUSIC_TIME mtGridStart; /* when this marker occurs */
|
|
314 DWORD dwVariation; /* variation bits */
|
|
315 WORD wMarkerFlags; /* how the marker is used */
|
|
316 } DMUS_IO_STYLEMARKER;
|
|
317
|
|
318 typedef struct _DMUS_IO_STYLERESOLUTION
|
|
319 {
|
|
320 DWORD dwVariation; /* variation bits */
|
|
321 WORD wMusicValue; /* Position in scale. */
|
|
322 BYTE bInversionID; /* Identifies inversion group to which this note belongs */
|
|
323 BYTE bPlayModeFlags; /* Can override part */
|
|
324 } DMUS_IO_STYLERESOLUTION;
|
|
325
|
|
326 typedef struct _DMUS_IO_STYLE_ANTICIPATION
|
|
327 {
|
|
328 MUSIC_TIME mtGridStart; /* when this anticipation occurs */
|
|
329 DWORD dwVariation; /* variation bits */
|
|
330 short nTimeOffset; /* offset from mtGridStart */
|
|
331 BYTE bTimeRange; /* Range to randomize start time. */
|
|
332 } DMUS_IO_STYLE_ANTICIPATION;
|
|
333
|
|
334 typedef struct _DMUS_IO_MOTIFSETTINGS
|
|
335 {
|
|
336 DWORD dwRepeats; /* Number of repeats. By default, 0. */
|
|
337 MUSIC_TIME mtPlayStart; /* Start of playback. By default, 0. */
|
|
338 MUSIC_TIME mtLoopStart; /* Start of looping portion. By default, 0. */
|
|
339 MUSIC_TIME mtLoopEnd; /* End of loop. Must be greater than mtLoopStart. Or, 0, indicating loop full motif. */
|
|
340 DWORD dwResolution; /* Default resolution. */
|
|
341 } DMUS_IO_MOTIFSETTINGS;
|
|
342
|
|
343 #pragma pack()
|
|
344
|
|
345
|
|
346 /*
|
|
347 RIFF
|
|
348 (
|
|
349 'DMST' // Style
|
|
350 <styh-ck> // Style header chunk
|
|
351 <guid-ck> // Every Style has a GUID
|
|
352 [<UNFO-list>] // Name, author, copyright info., comments
|
|
353 [<vers-ck>] // version chunk
|
|
354 <part-list>... // Array of parts in the Style, used by patterns
|
|
355 <pttn-list>... // Array of patterns in the Style
|
|
356 <DMBD-form>... // Array of bands in the Style
|
|
357 [<prrf-list>]...// Optional array of chord map references in the Style
|
|
358 )
|
|
359
|
|
360 // <styh-ck>
|
|
361 styh
|
|
362 (
|
|
363 <DMUS_IO_STYLE>
|
|
364 )
|
|
365
|
|
366 // <guid-ck>
|
|
367 guid
|
|
368 (
|
|
369 <GUID>
|
|
370 )
|
|
371
|
|
372 // <vers-ck>
|
|
373 vers
|
|
374 (
|
|
375 <DMUS_IO_VERSION>
|
|
376 )
|
|
377
|
|
378 // <part-list>
|
|
379 LIST
|
|
380 (
|
|
381 'part'
|
|
382 <prth-ck> // Part header chunk
|
|
383 [<UNFO-list>] // Name, author, copyright info., comments
|
|
384 [<note-ck>] // Optional chunk containing an array of notes in Part
|
|
385 [<crve-ck>] // Optional chunk containing an array of curves in Part
|
|
386 [<mrkr-ck>] // Optional chunk containing an array of markers in Part
|
|
387 [<rsln-ck>] // Optional chunk containing an array of variation resolutions in Part
|
|
388 [<anpn-ck>] // Optional chunk containing an array of resolution anticipations in Part
|
|
389 )
|
|
390
|
|
391 // <orth-ck>
|
|
392 prth
|
|
393 (
|
|
394 <DMUS_IO_STYLEPART>
|
|
395 )
|
|
396
|
|
397 // <note-ck>
|
|
398 'note'
|
|
399 (
|
|
400 // sizeof DMUS_IO_STYLENOTE:DWORD
|
|
401 <DMUS_IO_STYLENOTE>...
|
|
402 )
|
|
403
|
|
404 // <crve-ck>
|
|
405 'crve'
|
|
406 (
|
|
407 // sizeof DMUS_IO_STYLECURVE:DWORD
|
|
408 <DMUS_IO_STYLECURVE>...
|
|
409 )
|
|
410
|
|
411 // <mrkr-ck>
|
|
412 'mrkr'
|
|
413 (
|
|
414 // sizeof DMUS_IO_STYLEMARKER:DWORD
|
|
415 <DMUS_IO_STYLEMARKER>...
|
|
416 )
|
|
417
|
|
418 // <rsln-ck>
|
|
419 'rsln'
|
|
420 (
|
|
421 // sizeof DMUS_IO_STYLERESOLUTION:DWORD
|
|
422 <DMUS_IO_STYLERESOLUTION>...
|
|
423 )
|
|
424
|
|
425 // <anpn-ck>
|
|
426 'anpn'
|
|
427 (
|
|
428 // sizeof DMUS_IO_STYLE_ANTICIPATION:DWORD
|
|
429 <DMUS_IO_STYLE_ANTICIPATION>...
|
|
430 )
|
|
431
|
|
432 // <pttn-list>
|
|
433 LIST
|
|
434 (
|
|
435 'pttn'
|
|
436 <ptnh-ck> // Pattern header chunk
|
|
437 <rhtm-ck> // Chunk containing an array of rhythms for chord matching
|
|
438 [<UNFO-list>] // Name, author, copyright info., comments
|
|
439 [<mtfs-ck>] // Motif settings chunk
|
|
440 [<DMBD-form>] // Optional band to be associated with the pattern (for motifs)
|
|
441 <pref-list>... // Array of part reference id's
|
|
442 )
|
|
443
|
|
444 // <ptnh-ck>
|
|
445 ptnh
|
|
446 (
|
|
447 <DMUS_IO_PATTERN>
|
|
448 )
|
|
449
|
|
450 // <rhtm-ck>
|
|
451 'rhtm'
|
|
452 (
|
|
453 // DWORD's representing rhythms for chord matching based on number
|
|
454 // of measures in the pattern
|
|
455 )
|
|
456
|
|
457
|
|
458 // pref-list
|
|
459 LIST
|
|
460 (
|
|
461 'pref'
|
|
462 <prfc-ck> // part ref chunk
|
|
463 )
|
|
464
|
|
465 // <prfc-ck>
|
|
466 prfc
|
|
467 (
|
|
468 <DMUS_IO_PARTREF>
|
|
469 )
|
|
470
|
|
471 // <mtfs-ck>
|
|
472 mtfs
|
|
473 (
|
|
474 <DMUS_IO_MOTIFSETTINGS>
|
|
475 )
|
|
476
|
|
477 // <prrf-list>
|
|
478 LIST
|
|
479 (
|
|
480 'prrf'
|
|
481 <DMRF-list>... // Array of Chordmap references
|
|
482 )
|
|
483 */
|
|
484
|
|
485 /* Pattern chunk, for use in Pattern tracks */
|
|
486
|
|
487 #define DMUS_FOURCC_PATTERN_FORM mmioFOURCC('D','M','P','T')
|
|
488
|
|
489 /*
|
|
490 RIFF
|
|
491 (
|
|
492 'DMPT' // Pattern
|
|
493 <styh-ck> // Style header chunk
|
|
494 <pttn-list> // The pattern, in single pattern format (includes DMUS_FOURCC_PART_LIST chunks)
|
|
495 )
|
|
496 */
|
|
497
|
|
498
|
|
499 /* Chord and command file formats */
|
|
500
|
|
501 /* These specify possible values for DMUS_IO_COMMAND.bRepeatMode (DirectX8) */
|
|
502 typedef enum enumDMUS_PATTERNT_TYPES
|
|
503 {
|
|
504 DMUS_PATTERNT_RANDOM = 0, /* Play randomly. (DirectX7 behavior) */
|
|
505 DMUS_PATTERNT_REPEAT = 1, /* Repeat last pattern. */
|
|
506 DMUS_PATTERNT_SEQUENTIAL = 2, /* Play sequential starting with first matching pattern. */
|
|
507 DMUS_PATTERNT_RANDOM_START = 3, /* Play sequential starting with a random pattern. */
|
|
508 DMUS_PATTERNT_NO_REPEAT = 4, /* Play randomly, but don't play the same pattern twice. */
|
|
509 DMUS_PATTERNT_RANDOM_ROW = 5 /* Play randomly as a row: don't repeat any pattern until all have played. */
|
|
510 } DMUS_PATTERNT_TYPES;
|
|
511
|
|
512
|
|
513 #define DMUS_FOURCC_CHORDTRACK_LIST mmioFOURCC('c','o','r','d')
|
|
514 #define DMUS_FOURCC_CHORDTRACKHEADER_CHUNK mmioFOURCC('c','r','d','h')
|
|
515 #define DMUS_FOURCC_CHORDTRACKBODY_CHUNK mmioFOURCC('c','r','d','b')
|
|
516
|
|
517 #define DMUS_FOURCC_COMMANDTRACK_CHUNK mmioFOURCC('c','m','n','d')
|
|
518
|
|
519 typedef struct _DMUS_IO_CHORD
|
|
520 {
|
|
521 WCHAR wszName[16]; /* Name of the chord */
|
|
522 MUSIC_TIME mtTime; /* Time of this chord */
|
|
523 WORD wMeasure; /* Measure this falls on */
|
|
524 BYTE bBeat; /* Beat this falls on */
|
|
525 BYTE bFlags; /* Various flags */
|
|
526 } DMUS_IO_CHORD;
|
|
527
|
|
528 typedef struct _DMUS_IO_SUBCHORD
|
|
529 {
|
|
530 DWORD dwChordPattern; /* Notes in the subchord */
|
|
531 DWORD dwScalePattern; /* Notes in the scale */
|
|
532 DWORD dwInversionPoints; /* Where inversions can occur */
|
|
533 DWORD dwLevels; /* Which levels are supported by this subchord */
|
|
534 BYTE bChordRoot; /* Root of the subchord */
|
|
535 BYTE bScaleRoot; /* Root of the scale */
|
|
536 } DMUS_IO_SUBCHORD;
|
|
537
|
|
538 typedef struct _DMUS_IO_COMMAND
|
|
539 {
|
|
540 MUSIC_TIME mtTime; /* Time of this command */
|
|
541 WORD wMeasure; /* Measure this falls on */
|
|
542 BYTE bBeat; /* Beat this falls on */
|
|
543 BYTE bCommand; /* Command type (see #defines below) */
|
|
544 BYTE bGrooveLevel; /* Groove level (0 if command is not a groove) */
|
|
545 BYTE bGrooveRange; /* Groove range */
|
|
546 BYTE bRepeatMode; /* Used to control selection of patterns with same groove level */
|
|
547 } DMUS_IO_COMMAND;
|
|
548
|
|
549
|
|
550 /*
|
|
551
|
|
552 // <cord-list>
|
|
553 LIST
|
|
554 (
|
|
555 'cord'
|
|
556 <crdh-ck>
|
|
557 <crdb-ck>... // Chord body chunks
|
|
558 )
|
|
559
|
|
560 // <crdh-ck>
|
|
561 crdh
|
|
562 (
|
|
563 // Scale: dword (upper 8 bits for root, lower 24 for scale)
|
|
564 )
|
|
565
|
|
566 // <crdb-ck>
|
|
567 crdb
|
|
568 (
|
|
569 // sizeof DMUS_IO_CHORD:dword
|
|
570 <DMUS_IO_CHORD>
|
|
571 // # of DMUS_IO_SUBCHORDS:dword
|
|
572 // sizeof DMUS_IO_SUBCHORDS:dword
|
|
573 // a number of <DMUS_IO_SUBCHORD>
|
|
574 )
|
|
575
|
|
576
|
|
577 // <cmnd-list>
|
|
578 'cmnd'
|
|
579 (
|
|
580 //sizeof DMUS_IO_COMMAND: DWORD
|
|
581 <DMUS_IO_COMMAND>...
|
|
582 )
|
|
583
|
|
584 */
|
|
585
|
|
586 /* File io for DirectMusic Tool and ToolGraph objects
|
|
587 */
|
|
588
|
|
589 /* RIFF ids: */
|
|
590
|
|
591 #define DMUS_FOURCC_TOOLGRAPH_FORM mmioFOURCC('D','M','T','G')
|
|
592 #define DMUS_FOURCC_TOOL_LIST mmioFOURCC('t','o','l','l')
|
|
593 #define DMUS_FOURCC_TOOL_FORM mmioFOURCC('D','M','T','L')
|
|
594 #define DMUS_FOURCC_TOOL_CHUNK mmioFOURCC('t','o','l','h')
|
|
595
|
|
596 /* io structures: */
|
|
597
|
|
598 typedef struct _DMUS_IO_TOOL_HEADER
|
|
599 {
|
|
600 GUID guidClassID; /* Class id of tool. */
|
|
601 long lIndex; /* Position in graph. */
|
|
602 DWORD cPChannels; /* Number of items in channels array. */
|
|
603 FOURCC ckid; /* chunk ID of tool's data chunk if 0 fccType valid. */
|
|
604 FOURCC fccType; /* list type if NULL ckid valid. */
|
|
605 DWORD dwPChannels[1]; /* Array of PChannels, size determined by cPChannels. */
|
|
606 } DMUS_IO_TOOL_HEADER;
|
|
607
|
|
608 /*
|
|
609 RIFF
|
|
610 (
|
|
611 'DMTG' // DirectMusic ToolGraph chunk
|
|
612 [<guid-ck>] // GUID for ToolGraph
|
|
613 [<vers-ck>] // Optional version info
|
|
614 [<UNFO-list>] // Name, author, copyright info., comments
|
|
615 <toll-list> // List of Tools
|
|
616 )
|
|
617
|
|
618 // <guid-ck>
|
|
619 'guid'
|
|
620 (
|
|
621 <GUID>
|
|
622 )
|
|
623
|
|
624 // <vers-ck>
|
|
625 vers
|
|
626 (
|
|
627 <DMUS_IO_VERSION>
|
|
628 )
|
|
629
|
|
630 // <toll-list>
|
|
631 LIST
|
|
632 (
|
|
633 'toll' // Array of tools
|
|
634 <DMTL-form>... // Each tool is encapsulated in a RIFF chunk
|
|
635 )
|
|
636
|
|
637 // <DMTL-form> Tools are embedded in a graph. Theoretically, they can be saved as individual files too.
|
|
638 RIFF
|
|
639 (
|
|
640 'DMTL'
|
|
641 <tolh-ck>
|
|
642 [<data>] // Tool data. Must be a RIFF readable chunk.
|
|
643 )
|
|
644
|
|
645 // <tolh-ck> // Tool header chunk
|
|
646 (
|
|
647 'tolh'
|
|
648 <DMUS_IO_TOOL_HEADER> // Tool header
|
|
649 )
|
|
650 */
|
|
651
|
|
652 /* The AudioPath file carries everything for describing a specific audio path,
|
|
653 including Tool Graph and Buffer Descriptor.
|
|
654 This can even be used for configuring a complete performance.
|
|
655 */
|
|
656
|
|
657 #define DMUS_FOURCC_AUDIOPATH_FORM mmioFOURCC('D','M','A','P')
|
|
658
|
|
659 /*
|
|
660 RIFF
|
|
661 (
|
|
662 'DMAP' // DirectMusic AudioPath chunk
|
|
663 [<guid-ck>] // GUID for this Audio Path configuration
|
|
664 [<vers-ck>] // Optional version info
|
|
665 [<UNFO-list>] // Name, author, copyright info., comments
|
|
666 [<DMTG-form>] // Optional ToolGraph
|
|
667 [<pcsl-list>] // Optional list of port configurations
|
|
668 [<dbfl-list>]...// Optional array of DirectSound buffer descriptors
|
|
669 )
|
|
670 */
|
|
671
|
|
672 #define DMUS_FOURCC_PORTCONFIGS_LIST mmioFOURCC('p','c','s','l')
|
|
673 #define DMUS_FOURCC_PORTCONFIG_LIST mmioFOURCC('p','c','f','l')
|
|
674 #define DMUS_FOURCC_PORTCONFIG_ITEM mmioFOURCC('p','c','f','h')
|
|
675 #define DMUS_FOURCC_PORTPARAMS_ITEM mmioFOURCC('p','p','r','h')
|
|
676 #define DMUS_FOURCC_DSBUFFER_LIST mmioFOURCC('d','b','f','l')
|
|
677 #define DMUS_FOURCC_DSBUFFATTR_ITEM mmioFOURCC('d','d','a','h')
|
|
678 #define DMUS_FOURCC_PCHANNELS_LIST mmioFOURCC('p','c','h','l')
|
|
679 #define DMUS_FOURCC_PCHANNELS_ITEM mmioFOURCC('p','c','h','h')
|
|
680
|
|
681 typedef struct _DMUS_IO_PORTCONFIG_HEADER
|
|
682 {
|
|
683 GUID guidPort; /* GUID of requested port. */
|
|
684 DWORD dwPChannelBase; /* PChannel that this should start on. */
|
|
685 DWORD dwPChannelCount; /* How many channels. */
|
|
686 DWORD dwFlags; /* Various flags. */
|
|
687 } DMUS_IO_PORTCONFIG_HEADER;
|
|
688
|
|
689 #define DMUS_PORTCONFIGF_DRUMSON10 1 /* This port configured for drums on channel 10. */
|
|
690 #define DMUS_PORTCONFIGF_USEDEFAULT 2 /* Use the default port. */
|
|
691
|
|
692 /* Each portconfig has one or more pchannel to buffer mappings. Each buffer
|
|
693 is identified by a guid. Each pchannel can map to one or more buffers.
|
|
694 This is defined with one or more DMUS_IO_PCHANNELTOBUFFER_HEADER
|
|
695 structures. Each defines a range of PChannels and the set of buffers
|
|
696 that they connect to.
|
|
697 */
|
|
698
|
|
699 typedef struct _DMUS_IO_PCHANNELTOBUFFER_HEADER
|
|
700 {
|
|
701 DWORD dwPChannelBase; /* PChannel that this should start on. */
|
|
702 DWORD dwPChannelCount; /* How many PChannels. */
|
|
703 DWORD dwBufferCount; /* How many buffers do these connect to. */
|
|
704 DWORD dwFlags; /* Various flags. Currently reserved for future use. Must be 0. */
|
|
705 } DMUS_IO_PCHANNELTOBUFFER_HEADER;
|
|
706
|
|
707 /* Each buffer is represented by an DSBC form. This is wrapped by the
|
|
708 DMUS_IO_BUFFER_ATTRIBUTES_HEADER which identifies how to use the
|
|
709 buffer. In particular, it indicates whether this gets dynamically duplicated
|
|
710 or all references to this should share the same instance.
|
|
711 To resolve references, the unique GUID of the buffer is also stored
|
|
712 in this structure.
|
|
713 */
|
|
714
|
|
715 typedef struct _DMUS_IO_BUFFER_ATTRIBUTES_HEADER
|
|
716 {
|
|
717 GUID guidBufferID; /* Each buffer config has a unique ID. */
|
|
718 DWORD dwFlags; /* Various flags. */
|
|
719 } DMUS_IO_BUFFER_ATTRIBUTES_HEADER;
|
|
720
|
|
721 /* DMUS_IO_BUFFER_ATTRIBUTES_HEADER.dwFlags: */
|
|
722 #define DMUS_BUFFERF_SHARED 1 /* Share this with other audio paths, instead of creating unique copies. */
|
|
723 #define DMUS_BUFFERF_DEFINED 2 /* Use one of the standard predefined buffers (see GUID_Buffer... in dmusici.h.) */
|
|
724 #define DMUS_BUFFERF_MIXIN 8 /* This is a mixin buffer. */
|
|
725
|
|
726 /*
|
|
727
|
|
728 LIST
|
|
729 (
|
|
730 'pcsl' // Array of port configurations
|
|
731 <pcfl-list>... // One or more port configurations, each in a list chunk
|
|
732 )
|
|
733
|
|
734 LIST
|
|
735 (
|
|
736 'pcfl' // List container for one port configuration.
|
|
737 <pcfh-ck> // Portconfig header chunk.
|
|
738 <pprh-ck> // Port params, to be used to create the port.
|
|
739 [<dbfl-list>]...// Optional array of DirectSound buffer descriptors
|
|
740 [<pchl-list>] // Optional list of pchannel to buffer assignments
|
|
741
|
|
742 )
|
|
743
|
|
744 // <pcfh-ck> // Port config header chunk
|
|
745 (
|
|
746 'pcfh'
|
|
747 <DMUS_IO_PORTCONFIG_HEADER> // Port config header
|
|
748 )
|
|
749
|
|
750 // <pprh-ck> // Port params header chunk
|
|
751 (
|
|
752 'pprh'
|
|
753 <DMUS_PORTPARAMS8> // Port params header
|
|
754 )
|
|
755
|
|
756 LIST
|
|
757 (
|
|
758 'pchl' // List container for one or more pchannel to buffer assignments.
|
|
759 <pchh-ck>... // One or more pchannel to buffer assignment headers and data.
|
|
760
|
|
761 // <pchh-ck>
|
|
762 (
|
|
763 'pchh'
|
|
764 <DMUS_IO_PCHANNELTOBUFFER_HEADER> // Description of PChannels
|
|
765 <GUID>... // Array of GUIDs defining the buffers they all connect to.
|
|
766 )
|
|
767 )
|
|
768
|
|
769 LIST
|
|
770 (
|
|
771 'dbfl' // List container for one buffer and buffer attributes header.
|
|
772 <ddah-ck> // Buffer attributes header.
|
|
773 [<DSBC-form>] // Buffer configuration. Not required when header uses a predefined buffer type.
|
|
774
|
|
775 // <ddah-ck>
|
|
776 (
|
|
777 'ddah'
|
|
778 <DMUS_IO_BUFFER_ATTRIBUTES_HEADER> // Buffer attributes.
|
|
779 )
|
|
780 )
|
|
781 */
|
|
782
|
|
783 /* File io for DirectMusic Band Track object */
|
|
784
|
|
785
|
|
786 /* RIFF ids: */
|
|
787 #define DMUS_FOURCC_BANDTRACK_FORM mmioFOURCC('D','M','B','T')
|
|
788 #define DMUS_FOURCC_BANDTRACK_CHUNK mmioFOURCC('b','d','t','h')
|
|
789 #define DMUS_FOURCC_BANDS_LIST mmioFOURCC('l','b','d','l')
|
|
790 #define DMUS_FOURCC_BAND_LIST mmioFOURCC('l','b','n','d')
|
|
791 #define DMUS_FOURCC_BANDITEM_CHUNK mmioFOURCC('b','d','i','h')
|
|
792 #define DMUS_FOURCC_BANDITEM_CHUNK2 mmioFOURCC('b','d','2','h')
|
|
793
|
|
794 /* io structures */
|
|
795 typedef struct _DMUS_IO_BAND_TRACK_HEADER
|
|
796 {
|
|
797 BOOL bAutoDownload; /* Determines if Auto-Download is enabled. */
|
|
798 } DMUS_IO_BAND_TRACK_HEADER;
|
|
799
|
|
800 typedef struct _DMUS_IO_BAND_ITEM_HEADER
|
|
801 {
|
|
802 MUSIC_TIME lBandTime; /* Position in track list. */
|
|
803 } DMUS_IO_BAND_ITEM_HEADER;
|
|
804
|
|
805 typedef struct _DMUS_IO_BAND_ITEM_HEADER2
|
|
806 {
|
|
807 MUSIC_TIME lBandTimeLogical; /* Position in track list. Time in the music with which band change is associated. */
|
|
808 MUSIC_TIME lBandTimePhysical; /* Precise time band change will take effect. Should be close to logical time. */
|
|
809 } DMUS_IO_BAND_ITEM_HEADER2;
|
|
810
|
|
811 /*
|
|
812 RIFF
|
|
813 (
|
|
814 'DMBT' // DirectMusic Band Track form-type
|
|
815 [<bdth-ck>] // Band track header
|
|
816 [<guid-ck>] // GUID for band track
|
|
817 [<vers-ck>] // Optional version info
|
|
818 [<UNFO-list>] // Name, author, copyright info., comments
|
|
819 <lbdl-list> // List of Band items
|
|
820 )
|
|
821
|
|
822 // <bnth-ck>
|
|
823 'bdth'
|
|
824 (
|
|
825 <DMUS_IO_BAND_TRACK_HEADER>
|
|
826 )
|
|
827
|
|
828 // <guid-ck>
|
|
829 'guid'
|
|
830 (
|
|
831 <GUID>
|
|
832 )
|
|
833
|
|
834 // <vers-ck>
|
|
835 vers
|
|
836 (
|
|
837 <DMUS_IO_VERSION>
|
|
838 )
|
|
839
|
|
840 // <lbdl-list>
|
|
841 LIST
|
|
842 (
|
|
843 'lbdl'
|
|
844 <lbnd-list>... // Array of bands, each encapsulated in a list chunk
|
|
845 )
|
|
846
|
|
847 // <lbnd-list>
|
|
848 LIST
|
|
849 (
|
|
850 'lbnd'
|
|
851 <bdih-ck> or <bd2h-ck> // bdih is a legacy format. bd2h is preferred for new content.
|
|
852 <DMBD-form> // Band
|
|
853 )
|
|
854
|
|
855 // <bdih-ck> or <bd2h-ck> // band item header
|
|
856 (
|
|
857 <DMUS_IO_BAND_ITEM_HEADER> or <DMUS_IO_BAND_ITEM_HEADER2> // Band item header
|
|
858 )
|
|
859 */
|
|
860
|
|
861
|
|
862 /* File io for DirectMusic Band object
|
|
863 */
|
|
864
|
|
865 /* RIFF ids: */
|
|
866
|
|
867 #define DMUS_FOURCC_BAND_FORM mmioFOURCC('D','M','B','D')
|
|
868 #define DMUS_FOURCC_INSTRUMENTS_LIST mmioFOURCC('l','b','i','l')
|
|
869 #define DMUS_FOURCC_INSTRUMENT_LIST mmioFOURCC('l','b','i','n')
|
|
870 #define DMUS_FOURCC_INSTRUMENT_CHUNK mmioFOURCC('b','i','n','s')
|
|
871
|
|
872 /* Flags for DMUS_IO_INSTRUMENT
|
|
873 */
|
|
874 #define DMUS_IO_INST_PATCH (1 << 0) /* dwPatch is valid. */
|
|
875 #define DMUS_IO_INST_BANKSELECT (1 << 1) /* dwPatch contains a valid Bank Select MSB and LSB part */
|
|
876 #define DMUS_IO_INST_ASSIGN_PATCH (1 << 3) /* dwAssignPatch is valid */
|
|
877 #define DMUS_IO_INST_NOTERANGES (1 << 4) /* dwNoteRanges is valid */
|
|
878 #define DMUS_IO_INST_PAN (1 << 5) /* bPan is valid */
|
|
879 #define DMUS_IO_INST_VOLUME (1 << 6 ) /* bVolume is valid */
|
|
880 #define DMUS_IO_INST_TRANSPOSE (1 << 7) /* nTranspose is valid */
|
|
881 #define DMUS_IO_INST_GM (1 << 8) /* Instrument is from GM collection */
|
|
882 #define DMUS_IO_INST_GS (1 << 9) /* Instrument is from GS collection */
|
|
883 #define DMUS_IO_INST_XG (1 << 10) /* Instrument is from XG collection */
|
|
884 #define DMUS_IO_INST_CHANNEL_PRIORITY (1 << 11) /* dwChannelPriority is valid */
|
|
885 #define DMUS_IO_INST_USE_DEFAULT_GM_SET (1 << 12) /* Always use the default GM set for this patch, */
|
|
886 /* don't rely on the synth caps stating GM or GS in hardware. */
|
|
887 #define DMUS_IO_INST_PITCHBENDRANGE (1 << 13) /* nPitchBendRange is valid */
|
|
888
|
|
889 /* io structures */
|
|
890 typedef struct _DMUS_IO_INSTRUMENT
|
|
891 {
|
|
892 DWORD dwPatch; /* MSB, LSB and Program change to define instrument */
|
|
893 DWORD dwAssignPatch; /* MSB, LSB and Program change to assign to instrument when downloading */
|
|
894 DWORD dwNoteRanges[4]; /* 128 bits; one for each MIDI note instrument needs to able to play */
|
|
895 DWORD dwPChannel; /* PChannel instrument plays on */
|
|
896 DWORD dwFlags; /* DMUS_IO_INST_ flags */
|
|
897 BYTE bPan; /* Pan for instrument */
|
|
898 BYTE bVolume; /* Volume for instrument */
|
|
899 short nTranspose; /* Number of semitones to transpose notes */
|
|
900 DWORD dwChannelPriority; /* Channel priority */
|
|
901 short nPitchBendRange; /* Number of semitones shifted by pitch bend */
|
|
902 } DMUS_IO_INSTRUMENT;
|
|
903
|
|
904 /*
|
|
905 // <DMBD-form> bands can be embedded in other forms
|
|
906 RIFF
|
|
907 (
|
|
908 'DMBD' // DirectMusic Band chunk
|
|
909 [<guid-ck>] // GUID for band
|
|
910 [<vers-ck>] // Optional version info
|
|
911 [<UNFO-list>] // Name, author, copyright info., comments
|
|
912 <lbil-list> // List of Instruments
|
|
913 )
|
|
914
|
|
915 // <guid-ck>
|
|
916 'guid'
|
|
917 (
|
|
918 <GUID>
|
|
919 )
|
|
920
|
|
921 // <vers-ck>
|
|
922 vers
|
|
923 (
|
|
924 <DMUS_IO_VERSION>
|
|
925 )
|
|
926
|
|
927 // <lbil-list>
|
|
928 LIST
|
|
929 (
|
|
930 'lbil' // Array of instruments
|
|
931 <lbin-list>... // Each instrument is encapsulated in a list
|
|
932 )
|
|
933
|
|
934 // <lbin-list>
|
|
935 LIST
|
|
936 (
|
|
937 'lbin'
|
|
938 <bins-ck>
|
|
939 [<DMRF-list>] // Optional reference to DLS Collection file.
|
|
940 )
|
|
941
|
|
942 // <bins-ck> // Instrument chunk
|
|
943 (
|
|
944 'bins'
|
|
945 <DMUS_IO_INSTRUMENT> // Instrument header
|
|
946 )
|
|
947 */
|
|
948
|
|
949 /* This RIFF id and io struct have been added to allow wave files (and the wave object) to
|
|
950 differentiate between streaming and one-shot waves, and to give a prefetch for streaming
|
|
951 waves */
|
|
952
|
|
953 #define DMUS_FOURCC_WAVEHEADER_CHUNK mmioFOURCC('w','a','v','h')
|
|
954
|
|
955 typedef struct _DMUS_IO_WAVE_HEADER
|
|
956 {
|
|
957 REFERENCE_TIME rtReadAhead; /* How far ahead in the stream wave data will be read (in REFERENCE_TIME). Ignored for one-shot waves. */
|
|
958 DWORD dwFlags; /* Various flags, including whether this is a streaming wave and whether it can be invalidated. */
|
|
959 } DMUS_IO_WAVE_HEADER;
|
|
960
|
|
961
|
|
962 /* File io for Wave track */
|
|
963
|
|
964 /* RIFF ids: */
|
|
965
|
|
966 #define DMUS_FOURCC_WAVETRACK_LIST mmioFOURCC('w','a','v','t')
|
|
967 #define DMUS_FOURCC_WAVETRACK_CHUNK mmioFOURCC('w','a','t','h')
|
|
968 #define DMUS_FOURCC_WAVEPART_LIST mmioFOURCC('w','a','v','p')
|
|
969 #define DMUS_FOURCC_WAVEPART_CHUNK mmioFOURCC('w','a','p','h')
|
|
970 #define DMUS_FOURCC_WAVEITEM_LIST mmioFOURCC('w','a','v','i')
|
|
971 #define DMUS_FOURCC_WAVE_LIST mmioFOURCC('w','a','v','e')
|
|
972 #define DMUS_FOURCC_WAVEITEM_CHUNK mmioFOURCC('w','a','i','h')
|
|
973
|
|
974 /* This flag is included in DMUS_IO_WAVE_TRACK_HEADER.dwFlags. If set, the track will get its
|
|
975 variations from a pattern track, via GetParam(GUID_Variations). */
|
|
976 #define DMUS_WAVETRACKF_SYNC_VAR 0x1
|
|
977 /* This is also included in DMUS_IO_WAVE_TRACK_HEADER.dwFlags. If set, variation control
|
|
978 information will persist from one playback instance to the next.*/
|
|
979 #define DMUS_WAVETRACKF_PERSIST_CONTROL 0x2
|
|
980
|
|
981 typedef struct _DMUS_IO_WAVE_TRACK_HEADER
|
|
982 {
|
|
983 long lVolume; /* Gain, in 1/100th of dB, to be applied to all waves. Note: All gain values should be negative. */
|
|
984 DWORD dwFlags; /* Flags, including whether this track syncs to a pattern track for its variations. */
|
|
985 } DMUS_IO_WAVE_TRACK_HEADER;
|
|
986
|
|
987 typedef struct _DMUS_IO_WAVE_PART_HEADER
|
|
988 {
|
|
989 long lVolume; /* Gain, in 1/100th of dB, to be applied to all waves in wave part. Note: All gain values should be negative. */
|
|
990 DWORD dwVariations; /* Variation mask for which of 32 variations */
|
|
991 DWORD dwPChannel; /* PChannel */
|
|
992 DWORD dwLockToPart; /* Part ID to lock to. */
|
|
993 DWORD dwFlags; /* Flags, including stuff for managing how variations are chosen (in low-order nibble) */
|
|
994 DWORD dwIndex; /* Index for distinguishing multiple parts on the same PChannel*/
|
|
995 } DMUS_IO_WAVE_PART_HEADER;
|
|
996
|
|
997 typedef struct _DMUS_IO_WAVE_ITEM_HEADER
|
|
998 {
|
|
999 long lVolume; /* Gain, in 1/100th of dB. Note: All gain values should be negative. */
|
|
1000 long lPitch; /* Pitch offset in 1/100th of a semitone. */
|
|
1001 DWORD dwVariations; /* Variation flags for which of 32 variations this wave belongs to. */
|
|
1002 REFERENCE_TIME rtTime; /* Start time, in REFERENCE_TIME, if Timer time track, or MUSIC_TIME for music time track. */
|
|
1003 REFERENCE_TIME rtStartOffset; /* Distance into wave to start playback, in reference time units. */
|
|
1004 REFERENCE_TIME rtReserved; /* Reserved field. */
|
|
1005 REFERENCE_TIME rtDuration; /* Duration, in REFERENCE_TIME or MUSIC_TIME, depending on track timing format. */
|
|
1006 MUSIC_TIME mtLogicalTime; /* If in music track format, this indicates the musical boundary where this belongs. Otherwise, ignored. */
|
|
1007 DWORD dwLoopStart; /* Start point for a looping wave. */
|
|
1008 DWORD dwLoopEnd; /* End point for a looping wave. */
|
|
1009 DWORD dwFlags; /* Various flags, including whether this is a streaming wave and whether it can be invalidated. */
|
|
1010 WORD wVolumeRange; /* Random range for volume. */
|
|
1011 WORD wPitchRange; /* Random range for pitch. */
|
|
1012 } DMUS_IO_WAVE_ITEM_HEADER;
|
|
1013
|
|
1014 /*
|
|
1015 LIST
|
|
1016 {
|
|
1017 'wavt' // Wave track chunk
|
|
1018 <wath-ck> // Wave track header
|
|
1019 <wavp-list>... // Array of Wave Parts
|
|
1020 }
|
|
1021 // <wath-ck>
|
|
1022 'wath'
|
|
1023 {
|
|
1024 <DMUS_IO_WAVE_TRACK_HEADER>
|
|
1025 }
|
|
1026
|
|
1027 // <wavp-list>
|
|
1028 LIST
|
|
1029 {
|
|
1030 'wavp'
|
|
1031 <waph-ck> // Wave Part Header
|
|
1032 <wavi-list> // List of wave items
|
|
1033 }
|
|
1034
|
|
1035 // <waph-ck>
|
|
1036 'waph'
|
|
1037 {
|
|
1038 <DMUS_IO_WAVE_PART_HEADER>
|
|
1039 }
|
|
1040
|
|
1041 // <wavi-list>
|
|
1042 LIST
|
|
1043 {
|
|
1044 'wavi'
|
|
1045 <wave-list>... // Array of waves; each wave is encapsulated in a list
|
|
1046 }
|
|
1047
|
|
1048 // <wave-list>
|
|
1049 LIST
|
|
1050 {
|
|
1051 'wave'
|
|
1052 <waih-ck> // Wave item header
|
|
1053 <DMRF-list> // Reference to wave object
|
|
1054 }
|
|
1055
|
|
1056 // <waih-ck>
|
|
1057 'waih'
|
|
1058 {
|
|
1059 <DMUS_IO_WAVE_ITEM_HEADER>
|
|
1060 }
|
|
1061
|
|
1062 */
|
|
1063
|
|
1064 /* File io for DirectMusic Container file. This embeds a set of related files. And,
|
|
1065 in turn, it can be embedded within a segment or script file.
|
|
1066 */
|
|
1067
|
|
1068 #define DMUS_FOURCC_CONTAINER_FORM mmioFOURCC('D','M','C','N')
|
|
1069 #define DMUS_FOURCC_CONTAINER_CHUNK mmioFOURCC('c','o','n','h')
|
|
1070 #define DMUS_FOURCC_CONTAINED_ALIAS_CHUNK mmioFOURCC('c','o','b','a')
|
|
1071 #define DMUS_FOURCC_CONTAINED_OBJECT_CHUNK mmioFOURCC('c','o','b','h')
|
|
1072 #define DMUS_FOURCC_CONTAINED_OBJECTS_LIST mmioFOURCC('c','o','s','l')
|
|
1073 #define DMUS_FOURCC_CONTAINED_OBJECT_LIST mmioFOURCC('c','o','b','l')
|
|
1074
|
|
1075 typedef struct _DMUS_IO_CONTAINER_HEADER
|
|
1076 {
|
|
1077 DWORD dwFlags; /* Flags. */
|
|
1078 } DMUS_IO_CONTAINER_HEADER;
|
|
1079
|
|
1080 #define DMUS_CONTAINER_NOLOADS (1 << 1) /* Contained items are not loaded when the container is loaded.
|
|
1081 Entries will be created in the loader (via SetObject) but
|
|
1082 the actual objects will not be created until they are
|
|
1083 specifically loaded at a later time. */
|
|
1084
|
|
1085 typedef struct _DMUS_IO_CONTAINED_OBJECT_HEADER
|
|
1086 {
|
|
1087 GUID guidClassID; /* Class id of object. */
|
|
1088 DWORD dwFlags; /* Flags, for example DMUS_CONTAINED_OBJF_KEEP. */
|
|
1089 FOURCC ckid; /* chunk ID of track's data chunk if 0 fccType valid. */
|
|
1090 FOURCC fccType; /* list type if NULL ckid valid */
|
|
1091 /* Note that LIST:DMRF may be used for ckid and fccType in order to reference an
|
|
1092 object instead of embedding it within the container. */
|
|
1093 } DMUS_IO_CONTAINED_OBJECT_HEADER;
|
|
1094
|
|
1095 #define DMUS_CONTAINED_OBJF_KEEP 1 /* Keep the object cached in the loader after the container is released. */
|
|
1096
|
|
1097 /*
|
|
1098 RIFF
|
|
1099 (
|
|
1100 'DMCN' // DirectMusic Container chunk
|
|
1101 <conh-ck> // Container header chunk
|
|
1102 [<guid-ck>] // GUID for container
|
|
1103 [<vers-ck>] // Optional version info
|
|
1104 [<UNFO-list>] // Name, author, copyright info., comments
|
|
1105 <cosl-list> // List of objects.
|
|
1106 )
|
|
1107
|
|
1108 // <conh-ck>
|
|
1109 'conh'
|
|
1110 (
|
|
1111 <DMUS_IO_CONTAINER_HEADER>
|
|
1112 )
|
|
1113
|
|
1114 // <guid-ck>
|
|
1115 'guid'
|
|
1116 (
|
|
1117 <GUID>
|
|
1118 )
|
|
1119
|
|
1120 // <vers-ck>
|
|
1121 vers
|
|
1122 (
|
|
1123 <DMUS_IO_VERSION>
|
|
1124 )
|
|
1125
|
|
1126 LIST
|
|
1127 (
|
|
1128 'cosl' // Array of embedded objects.
|
|
1129 <cobl-list>... // Each object is encapsulated in a LIST chunk
|
|
1130 )
|
|
1131
|
|
1132 // <cobl-list> // Encapsulates one object
|
|
1133 LIST
|
|
1134 (
|
|
1135 'cobl'
|
|
1136 [<coba-ck>] // Alias. An alternative name by which this object is known
|
|
1137 // within the container.
|
|
1138 <cobh-ck> // Required header, includes CLASS ID for object.
|
|
1139 [<data>] or <DMRF> // Object data of the type specified in <cobh-ck>.
|
|
1140 // If DMRF, it is a reference of where to find the object.
|
|
1141 // Otherwise, it could be any RIFF readable chunk in the
|
|
1142 // exact same format as a file. The object will load
|
|
1143 // itself from this data.
|
|
1144 )
|
|
1145
|
|
1146 // <coba-ck>
|
|
1147 'coba'
|
|
1148 (
|
|
1149 // Alias, stored as NULL terminated string of WCHARs
|
|
1150 )
|
|
1151
|
|
1152 // <cobh-ck>
|
|
1153 'cobh'
|
|
1154 (
|
|
1155 <DMUS_IO_CONTAINED_OBJECT_HEADER>
|
|
1156 )
|
|
1157 */
|
|
1158
|
|
1159 /* File io for DirectMusic Segment object */
|
|
1160
|
|
1161 /* RIFF ids: */
|
|
1162
|
|
1163 #define DMUS_FOURCC_SEGMENT_FORM mmioFOURCC('D','M','S','G')
|
|
1164 #define DMUS_FOURCC_SEGMENT_CHUNK mmioFOURCC('s','e','g','h')
|
|
1165 #define DMUS_FOURCC_TRACK_LIST mmioFOURCC('t','r','k','l')
|
|
1166 #define DMUS_FOURCC_TRACK_FORM mmioFOURCC('D','M','T','K')
|
|
1167 #define DMUS_FOURCC_TRACK_CHUNK mmioFOURCC('t','r','k','h')
|
|
1168 #define DMUS_FOURCC_TRACK_EXTRAS_CHUNK mmioFOURCC('t','r','k','x')
|
|
1169
|
|
1170 /* io structures:*/
|
|
1171
|
|
1172 typedef struct _DMUS_IO_SEGMENT_HEADER
|
|
1173 {
|
|
1174 DWORD dwRepeats; /* Number of repeats. By default, 0. */
|
|
1175 MUSIC_TIME mtLength; /* Length, in music time. */
|
|
1176 MUSIC_TIME mtPlayStart; /* Start of playback. By default, 0. */
|
|
1177 MUSIC_TIME mtLoopStart; /* Start of looping portion. By default, 0. */
|
|
1178 MUSIC_TIME mtLoopEnd; /* End of loop. Must be greater than dwPlayStart. Or, 0, indicating loop full segment. */
|
|
1179 DWORD dwResolution; /* Default resolution. */
|
|
1180 /* Following added for DirectX8: */
|
|
1181 REFERENCE_TIME rtLength; /* Length, in reference time (overrides music time length.) */
|
|
1182 DWORD dwFlags;
|
|
1183 DWORD dwReserved; /* Reserved. */
|
|
1184 /* Added for DirectX9: */
|
|
1185 REFERENCE_TIME rtLoopStart; /* Timer time loop start. */
|
|
1186 REFERENCE_TIME rtLoopEnd; /* Timer time loop end. */
|
|
1187 REFERENCE_TIME rtPlayStart; /* Start of playback in Timer time. */
|
|
1188 } DMUS_IO_SEGMENT_HEADER;
|
|
1189
|
|
1190 #define DMUS_SEGIOF_REFLENGTH 1 /* Use the time in rtLength for the segment length. */
|
|
1191 #define DMUS_SEGIOF_CLOCKTIME 2 /* This is a Timer time segment. */
|
|
1192
|
|
1193 typedef struct _DMUS_IO_TRACK_HEADER
|
|
1194 {
|
|
1195 GUID guidClassID; /* Class id of track. */
|
|
1196 DWORD dwPosition; /* Position in track list. */
|
|
1197 DWORD dwGroup; /* Group bits for track. */
|
|
1198 FOURCC ckid; /* chunk ID of track's data chunk. */
|
|
1199 FOURCC fccType; /* list type if ckid is RIFF or LIST */
|
|
1200 } DMUS_IO_TRACK_HEADER;
|
|
1201
|
|
1202 /* Additional parameters for the track header chunk, introduced in DirectX8 and
|
|
1203 on, are stored in a separate chunk. */
|
|
1204
|
|
1205 typedef struct _DMUS_IO_TRACK_EXTRAS_HEADER
|
|
1206 {
|
|
1207 DWORD dwFlags; /* DirectX8 Added flags for control tracks. */
|
|
1208 DWORD dwPriority; /* Priority for composition. */
|
|
1209 } DMUS_IO_TRACK_EXTRAS_HEADER;
|
|
1210
|
|
1211 /*
|
|
1212 RIFF
|
|
1213 (
|
|
1214 'DMSG' // DirectMusic Segment chunk
|
|
1215 <segh-ck> // Segment header chunk
|
|
1216 [<guid-ck>] // GUID for segment
|
|
1217 [<vers-ck>] // Optional version info
|
|
1218 [<UNFO-list>] // Name, author, copyright info., comments
|
|
1219 [<DMCN-form>] // Optional container of objects embedded in file. Must precede tracklist.
|
|
1220 <trkl-list> // List of Tracks
|
|
1221 [<DMTG-form>] // Optional ToolGraph
|
|
1222 [<DMAP-form>] // Optional Audio Path
|
|
1223 )
|
|
1224
|
|
1225 // <segh-ck>
|
|
1226 'segh'
|
|
1227 (
|
|
1228 <DMUS_IO_SEGMENT_HEADER>
|
|
1229 )
|
|
1230
|
|
1231 // <guid-ck>
|
|
1232 'guid'
|
|
1233 (
|
|
1234 <GUID>
|
|
1235 )
|
|
1236
|
|
1237 // <vers-ck>
|
|
1238 vers
|
|
1239 (
|
|
1240 <DMUS_IO_VERSION>
|
|
1241 )
|
|
1242
|
|
1243 // <trkl-list>
|
|
1244 LIST
|
|
1245 (
|
|
1246 'trkl' // Array of tracks
|
|
1247 <DMTK-form>... // Each track is encapsulated in a RIFF chunk
|
|
1248 )
|
|
1249
|
|
1250 // <DMTK-form> // Tracks can be embedded in a segment or stored as separate files.
|
|
1251 RIFF
|
|
1252 (
|
|
1253 'DMTK'
|
|
1254 <trkh-ck>
|
|
1255 [<trkx-ck>] // Optional track flags.
|
|
1256 [<guid-ck>] // Optional GUID for track object instance (not to be confused with Class id in track header)
|
|
1257 [<vers-ck>] // Optional version info
|
|
1258 [<UNFO-list>] // Optional name, author, copyright info., comments
|
|
1259 [<data>] // Track data. Must be a RIFF readable chunk.
|
|
1260 )
|
|
1261
|
|
1262 // <trkh-ck> // Track header chunk
|
|
1263 (
|
|
1264 'trkh'
|
|
1265 <DMUS_IO_TRACK_HEADER> // Track header
|
|
1266 )
|
|
1267
|
|
1268 // <trkx-ck> // Track flags chunk
|
|
1269 (
|
|
1270 'trkx'
|
|
1271 <DMUS_IO_TRACK_EXTRAS_HEADER> // DirectX8 Track flags header
|
|
1272 )
|
|
1273 */
|
|
1274
|
|
1275 /* File io for DirectMusic reference chunk.
|
|
1276 This is used to embed a reference to an object.
|
|
1277 */
|
|
1278
|
|
1279 /* RIFF ids: */
|
|
1280
|
|
1281 #define DMUS_FOURCC_REF_LIST mmioFOURCC('D','M','R','F')
|
|
1282 #define DMUS_FOURCC_REF_CHUNK mmioFOURCC('r','e','f','h')
|
|
1283 #define DMUS_FOURCC_DATE_CHUNK mmioFOURCC('d','a','t','e')
|
|
1284 #define DMUS_FOURCC_NAME_CHUNK mmioFOURCC('n','a','m','e')
|
|
1285 #define DMUS_FOURCC_FILE_CHUNK mmioFOURCC('f','i','l','e')
|
|
1286
|
|
1287 typedef struct _DMUS_IO_REFERENCE
|
|
1288 {
|
|
1289 GUID guidClassID; /* Class id is always required. */
|
|
1290 DWORD dwValidData; /* Flags. */
|
|
1291 } DMUS_IO_REFERENCE;
|
|
1292
|
|
1293 /*
|
|
1294 LIST
|
|
1295 (
|
|
1296 'DMRF' // DirectMusic Reference chunk
|
|
1297 <refh-ck> // Reference header chunk
|
|
1298 [<guid-ck>] // Optional object GUID.
|
|
1299 [<date-ck>] // Optional file date.
|
|
1300 [<name-ck>] // Optional name.
|
|
1301 [<file-ck>] // Optional file name.
|
|
1302 [<catg-ck>] // Optional category name.
|
|
1303 [<vers-ck>] // Optional version info.
|
|
1304 )
|
|
1305
|
|
1306 // <refh-ck>
|
|
1307 'refh'
|
|
1308 (
|
|
1309 <DMUS_IO_REFERENCE>
|
|
1310 )
|
|
1311
|
|
1312 // <guid-ck>
|
|
1313 'guid'
|
|
1314 (
|
|
1315 <GUID>
|
|
1316 )
|
|
1317
|
|
1318 // <date-ck>
|
|
1319 date
|
|
1320 (
|
|
1321 <FILETIME>
|
|
1322 )
|
|
1323
|
|
1324 // <name-ck>
|
|
1325 name
|
|
1326 (
|
|
1327 // Name, stored as NULL terminated string of WCHARs
|
|
1328 )
|
|
1329
|
|
1330 // <file-ck>
|
|
1331 file
|
|
1332 (
|
|
1333 // File name, stored as NULL terminated string of WCHARs
|
|
1334 )
|
|
1335
|
|
1336 // <catg-ck>
|
|
1337 catg
|
|
1338 (
|
|
1339 // Category name, stored as NULL terminated string of WCHARs
|
|
1340 )
|
|
1341
|
|
1342 // <vers-ck>
|
|
1343 vers
|
|
1344 (
|
|
1345 <DMUS_IO_VERSION>
|
|
1346 )
|
|
1347 */
|
|
1348
|
|
1349 /* Chord Maps */
|
|
1350
|
|
1351 /* runtime chunks */
|
|
1352 #define DMUS_FOURCC_CHORDMAP_FORM mmioFOURCC('D','M','P','R')
|
|
1353 #define DMUS_FOURCC_IOCHORDMAP_CHUNK mmioFOURCC('p','e','r','h')
|
|
1354 #define DMUS_FOURCC_SUBCHORD_CHUNK mmioFOURCC('c','h','d','t')
|
|
1355 #define DMUS_FOURCC_CHORDENTRY_CHUNK mmioFOURCC('c','h','e','h')
|
|
1356 #define DMUS_FOURCC_SUBCHORDID_CHUNK mmioFOURCC('s','b','c','n')
|
|
1357 #define DMUS_FOURCC_IONEXTCHORD_CHUNK mmioFOURCC('n','c','r','d')
|
|
1358 #define DMUS_FOURCC_NEXTCHORDSEQ_CHUNK mmioFOURCC('n','c','s','q')
|
|
1359 #define DMUS_FOURCC_IOSIGNPOST_CHUNK mmioFOURCC('s','p','s','h')
|
|
1360 #define DMUS_FOURCC_CHORDNAME_CHUNK mmioFOURCC('I','N','A','M')
|
|
1361
|
|
1362 /* runtime list chunks */
|
|
1363 #define DMUS_FOURCC_CHORDENTRY_LIST mmioFOURCC('c','h','o','e')
|
|
1364 #define DMUS_FOURCC_CHORDMAP_LIST mmioFOURCC('c','m','a','p')
|
|
1365 #define DMUS_FOURCC_CHORD_LIST mmioFOURCC('c','h','r','d')
|
|
1366 #define DMUS_FOURCC_CHORDPALETTE_LIST mmioFOURCC('c','h','p','l')
|
|
1367 #define DMUS_FOURCC_CADENCE_LIST mmioFOURCC('c','a','d','e')
|
|
1368 #define DMUS_FOURCC_SIGNPOSTITEM_LIST mmioFOURCC('s','p','s','t')
|
|
1369
|
|
1370 #define DMUS_FOURCC_SIGNPOST_LIST mmioFOURCC('s','p','s','q')
|
|
1371
|
|
1372 /* values for dwChord field of DMUS_IO_PERS_SIGNPOST */
|
|
1373 /* DMUS_SIGNPOSTF_ flags are also used in templates (DMUS_IO_SIGNPOST) */
|
|
1374 #define DMUS_SIGNPOSTF_A 1
|
|
1375 #define DMUS_SIGNPOSTF_B 2
|
|
1376 #define DMUS_SIGNPOSTF_C 4
|
|
1377 #define DMUS_SIGNPOSTF_D 8
|
|
1378 #define DMUS_SIGNPOSTF_E 0x10
|
|
1379 #define DMUS_SIGNPOSTF_F 0x20
|
|
1380 #define DMUS_SIGNPOSTF_LETTER (DMUS_SIGNPOSTF_A | DMUS_SIGNPOSTF_B | DMUS_SIGNPOSTF_C | DMUS_SIGNPOSTF_D | DMUS_SIGNPOSTF_E | DMUS_SIGNPOSTF_F)
|
|
1381 #define DMUS_SIGNPOSTF_1 0x100
|
|
1382 #define DMUS_SIGNPOSTF_2 0x200
|
|
1383 #define DMUS_SIGNPOSTF_3 0x400
|
|
1384 #define DMUS_SIGNPOSTF_4 0x800
|
|
1385 #define DMUS_SIGNPOSTF_5 0x1000
|
|
1386 #define DMUS_SIGNPOSTF_6 0x2000
|
|
1387 #define DMUS_SIGNPOSTF_7 0x4000
|
|
1388 #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)
|
|
1389 #define DMUS_SIGNPOSTF_CADENCE 0x8000
|
|
1390
|
|
1391 /* values for dwFlags field of DMUS_IO_CHORDMAP */
|
|
1392 #define DMUS_CHORDMAPF_VERSION8 1 /* Chordmap is version 8 or above. */
|
|
1393
|
|
1394 /* values for dwChord field of DMUS_IO_PERS_SIGNPOST */
|
|
1395 #define DMUS_SPOSTCADENCEF_1 2 /* Use the first cadence chord. */
|
|
1396 #define DMUS_SPOSTCADENCEF_2 4 /* Use the second cadence chord. */
|
|
1397
|
|
1398 /* run time data structs */
|
|
1399 typedef struct _DMUS_IO_CHORDMAP
|
|
1400 {
|
|
1401 WCHAR wszLoadName[20];
|
|
1402 DWORD dwScalePattern;
|
|
1403 DWORD dwFlags; /* Various flags. Only lower 16 bits are significant. */
|
|
1404 } DMUS_IO_CHORDMAP;
|
|
1405
|
|
1406 typedef struct _DMUS_IO_CHORDMAP_SUBCHORD
|
|
1407 {
|
|
1408 DWORD dwChordPattern;
|
|
1409 DWORD dwScalePattern;
|
|
1410 DWORD dwInvertPattern;
|
|
1411 BYTE bChordRoot;
|
|
1412 BYTE bScaleRoot;
|
|
1413 WORD wCFlags;
|
|
1414 DWORD dwLevels; /* parts or which subchord levels this chord supports */
|
|
1415 } DMUS_IO_CHORDMAP_SUBCHORD;
|
|
1416
|
|
1417 /* Legacy name... */
|
|
1418 typedef DMUS_IO_CHORDMAP_SUBCHORD DMUS_IO_PERS_SUBCHORD;
|
|
1419
|
|
1420 typedef struct _DMUS_IO_CHORDENTRY
|
|
1421 {
|
|
1422 DWORD dwFlags;
|
|
1423 WORD wConnectionID; /* replaces runtime "pointer to this" */
|
|
1424 } DMUS_IO_CHORDENTRY;
|
|
1425
|
|
1426 typedef struct _DMUS_IO_NEXTCHORD
|
|
1427 {
|
|
1428 DWORD dwFlags;
|
|
1429 WORD nWeight;
|
|
1430 WORD wMinBeats;
|
|
1431 WORD wMaxBeats;
|
|
1432 WORD wConnectionID; /* points to an ioChordEntry */
|
|
1433 } DMUS_IO_NEXTCHORD;
|
|
1434
|
|
1435 typedef struct _DMUS_IO_CHORDMAP_SIGNPOST
|
|
1436 {
|
|
1437 DWORD dwChords; /* 1bit per group */
|
|
1438 DWORD dwFlags;
|
|
1439 } DMUS_IO_CHORDMAP_SIGNPOST;
|
|
1440
|
|
1441 /* Legacy name... */
|
|
1442 typedef DMUS_IO_CHORDMAP_SIGNPOST DMUS_IO_PERS_SIGNPOST;
|
|
1443
|
|
1444 /*
|
|
1445 RIFF
|
|
1446 (
|
|
1447 'DMPR'
|
|
1448 <perh-ck> // Chord map header chunk
|
|
1449 [<guid-ck>] // guid chunk
|
|
1450 [<vers-ck>] // version chunk (two DWORDS)
|
|
1451 [<UNFO-list>] // Unfo chunk
|
|
1452 <chdt-ck> // subchord database
|
|
1453 <chpl-list> // chord palette
|
|
1454 <cmap-list> // chord map
|
|
1455 <spsq-list> // signpost list
|
|
1456 )
|
|
1457
|
|
1458 <cmap-list> ::= LIST('cmap' <choe-list> )
|
|
1459
|
|
1460 <choe-list> ::= LIST('choe'
|
|
1461 <cheh-ck> // chord entry data
|
|
1462 <chrd-list> // chord definition
|
|
1463 <ncsq-ck> // connecting(next) chords
|
|
1464 )
|
|
1465
|
|
1466 <chrd-list> ::= LIST('chrd'
|
|
1467 <INAM-ck> // name of chord in wide char format
|
|
1468 <sbcn-ck> // list of subchords composing chord
|
|
1469 )
|
|
1470
|
|
1471 <chpl-list> ::= LIST('chpl'
|
|
1472 <chrd-list> ... // chord definition
|
|
1473 )
|
|
1474
|
|
1475 <spsq-list> ::== LIST('spsq' <spst-list> ... )
|
|
1476
|
|
1477 <spst-list> ::= LIST('spst'
|
|
1478 <spsh-ck>
|
|
1479 <chrd-list>
|
|
1480 [<cade-list>]
|
|
1481 )
|
|
1482
|
|
1483 <cade-list> ::= LIST('cade' <chrd-list> ...)
|
|
1484
|
|
1485 <perh-ck> ::= perh(<DMUS_IO_CHORDMAP>)
|
|
1486
|
|
1487 <chdt-ck> ::= chdt(<cbChordSize::WORD>
|
|
1488 <DMUS_IO_PERS_SUBCHORD> ... )
|
|
1489
|
|
1490 <cheh-ck> ::= cheh(<DMUS_IO_CHORDENTRY>)
|
|
1491
|
|
1492 <sbcn-ck> ::= sbcn(<cSubChordID:WORD> ...)
|
|
1493
|
|
1494 <ncsq-ck> ::= ncsq(<wNextChordSize:WORD>
|
|
1495 <DMUS_IO_NEXTCHORD>...)
|
|
1496
|
|
1497 <spsh-ck> ::= spsh(<DMUS_IO_PERS_SIGNPOST>)
|
|
1498
|
|
1499 */
|
|
1500
|
|
1501 /* File io for DirectMusic Script object */
|
|
1502
|
|
1503 /* RIFF ids: */
|
|
1504
|
|
1505 #define DMUS_FOURCC_SCRIPT_FORM mmioFOURCC('D','M','S','C')
|
|
1506 #define DMUS_FOURCC_SCRIPT_CHUNK mmioFOURCC('s','c','h','d')
|
|
1507 #define DMUS_FOURCC_SCRIPTVERSION_CHUNK mmioFOURCC('s','c','v','e')
|
|
1508 #define DMUS_FOURCC_SCRIPTLANGUAGE_CHUNK mmioFOURCC('s','c','l','a')
|
|
1509 #define DMUS_FOURCC_SCRIPTSOURCE_CHUNK mmioFOURCC('s','c','s','r')
|
|
1510
|
|
1511 /* io structures:*/
|
|
1512
|
|
1513 typedef struct _DMUS_IO_SCRIPT_HEADER
|
|
1514 {
|
|
1515 DWORD dwFlags; /* DMUS_SCRIPTIOF_ flags */
|
|
1516 } DMUS_IO_SCRIPT_HEADER;
|
|
1517
|
|
1518 #define DMUS_SCRIPTIOF_LOAD_ALL_CONTENT (1 << 0)
|
|
1519 /* If set, when the script loads it will also load all the content in its container. */
|
|
1520 #define DMUS_SCRIPTIOF_DOWNLOAD_ALL_SEGMENTS (1 << 1)
|
|
1521 /* If set and LOAD_ALL_CONTENT is also set, when the script initializes it will also download all the segments in its container.
|
|
1522 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.
|
|
1523 If not set, the script must manually download and unload by calling segment.DownloadSoundData and segment.UnloadSoundData. */
|
|
1524
|
|
1525 /*
|
|
1526 RIFF
|
|
1527 (
|
|
1528 'DMSC' // DirectMusic Script chunk
|
|
1529 <schd-ck> // Script header chunk
|
|
1530 [<guid-ck>] // GUID for script
|
|
1531 [<vers-ck>] // Optional version info
|
|
1532 [<UNFO-list>] // Name, author, copyright info., comments
|
|
1533 <scve-ck> // Version of DirectMusic this script was authored to run against
|
|
1534 <DMCN-form> // Container of content referenced by the script.
|
|
1535 <scla-ck> // ActiveX scripting language in which the script is written
|
|
1536 <scsr-ck> or <DMRF> // The script's source code.
|
|
1537 // If scsr-ck, the source is embedding in the chunk.
|
|
1538 // If DMRF, it is a reference of where to find a text file with the source.
|
|
1539 // Class id (guidClassID in DMUS_IO_REFERENCE) must be GUID_NULL because
|
|
1540 // this text file is not a DirectMusic object in its own right.
|
|
1541 )
|
|
1542
|
|
1543 // <schd-ck>
|
|
1544 'schd'
|
|
1545 (
|
|
1546 <DMUS_FOURCC_SCRIPT_CHUNK>
|
|
1547 )
|
|
1548
|
|
1549 // <guid-ck>
|
|
1550 'guid'
|
|
1551 (
|
|
1552 <GUID>
|
|
1553 )
|
|
1554
|
|
1555 // <vers-ck>
|
|
1556 vers
|
|
1557 (
|
|
1558 <DMUS_IO_VERSION>
|
|
1559 )
|
|
1560
|
|
1561 // <scve-ck>
|
|
1562 scve
|
|
1563 (
|
|
1564 <DMUS_IO_VERSION>
|
|
1565 )
|
|
1566
|
|
1567 'scla'
|
|
1568 (
|
|
1569 // Language name, stored as NULL terminated string of WCHARs
|
|
1570 )
|
|
1571
|
|
1572 'scsr'
|
|
1573 (
|
|
1574 // Source code, stored as NULL terminated string of WCHARs
|
|
1575 )
|
|
1576 */
|
|
1577
|
|
1578 /* Signpost tracks */
|
|
1579
|
|
1580 #define DMUS_FOURCC_SIGNPOST_TRACK_CHUNK mmioFOURCC( 's', 'g', 'n', 'p' )
|
|
1581
|
|
1582
|
|
1583 typedef struct _DMUS_IO_SIGNPOST
|
|
1584 {
|
|
1585 MUSIC_TIME mtTime;
|
|
1586 DWORD dwChords;
|
|
1587 WORD wMeasure;
|
|
1588 } DMUS_IO_SIGNPOST;
|
|
1589
|
|
1590 /*
|
|
1591
|
|
1592 // <sgnp-list>
|
|
1593 'sgnp'
|
|
1594 (
|
|
1595 //sizeof DMUS_IO_SIGNPOST: DWORD
|
|
1596 <DMUS_IO_SIGNPOST>...
|
|
1597 )
|
|
1598
|
|
1599 */
|
|
1600
|
|
1601 #define DMUS_FOURCC_MUTE_CHUNK mmioFOURCC('m','u','t','e')
|
|
1602
|
|
1603 typedef struct _DMUS_IO_MUTE
|
|
1604 {
|
|
1605 MUSIC_TIME mtTime;
|
|
1606 DWORD dwPChannel;
|
|
1607 DWORD dwPChannelMap;
|
|
1608 } DMUS_IO_MUTE;
|
|
1609
|
|
1610 /*
|
|
1611
|
|
1612 // <mute-list>
|
|
1613 'mute'
|
|
1614 (
|
|
1615 //sizeof DMUS_IO_MUTE:DWORD
|
|
1616 <DMUS_IO_MUTE>...
|
|
1617 )
|
|
1618
|
|
1619
|
|
1620 */
|
|
1621
|
|
1622 /* Used for both style and chord map tracks */
|
|
1623
|
|
1624 #define DMUS_FOURCC_TIME_STAMP_CHUNK mmioFOURCC('s', 't', 'm', 'p')
|
|
1625
|
|
1626 /* Style tracks */
|
|
1627
|
|
1628 #define DMUS_FOURCC_STYLE_TRACK_LIST mmioFOURCC('s', 't', 't', 'r')
|
|
1629 #define DMUS_FOURCC_STYLE_REF_LIST mmioFOURCC('s', 't', 'r', 'f')
|
|
1630
|
|
1631 /*
|
|
1632
|
|
1633 // <sttr-list>
|
|
1634 LIST('sttr'
|
|
1635 (
|
|
1636 <strf-list>... // Array of Style references
|
|
1637 )
|
|
1638
|
|
1639 // <strf-list>
|
|
1640 LIST('strf'
|
|
1641 (
|
|
1642 <stmp-ck>
|
|
1643 <DMRF>
|
|
1644 )
|
|
1645
|
|
1646 // <stmp-ck>
|
|
1647 'stmp'
|
|
1648 (
|
|
1649 // time:DWORD
|
|
1650 )
|
|
1651
|
|
1652 */
|
|
1653
|
|
1654 /* Chord map tracks */
|
|
1655
|
|
1656 #define DMUS_FOURCC_PERS_TRACK_LIST mmioFOURCC('p', 'f', 't', 'r')
|
|
1657 #define DMUS_FOURCC_PERS_REF_LIST mmioFOURCC('p', 'f', 'r', 'f')
|
|
1658
|
|
1659 /*
|
|
1660
|
|
1661 // <pftr-list>
|
|
1662 LIST('pftr'
|
|
1663 (
|
|
1664 <pfrf-list>... // Array of Chord map references
|
|
1665 )
|
|
1666
|
|
1667 // <pfrf-list>
|
|
1668 LIST('pfrf'
|
|
1669 (
|
|
1670 <stmp-ck>
|
|
1671 <DMRF>
|
|
1672 )
|
|
1673
|
|
1674 // <stmp-ck>
|
|
1675 'stmp'
|
|
1676 (
|
|
1677 // time:DWORD
|
|
1678 )
|
|
1679
|
|
1680 */
|
|
1681
|
|
1682 #define DMUS_FOURCC_TEMPO_TRACK mmioFOURCC('t','e','t','r')
|
|
1683
|
|
1684 /*
|
|
1685 // tempo array
|
|
1686 'tetr'
|
|
1687 (
|
|
1688 // sizeof DMUS_IO_TEMPO_ITEM: DWORD
|
|
1689 <DMUS_IO_TEMPO_ITEM>...
|
|
1690 )
|
|
1691 */
|
|
1692
|
|
1693 #define DMUS_FOURCC_SEQ_TRACK mmioFOURCC('s','e','q','t')
|
|
1694 #define DMUS_FOURCC_SEQ_LIST mmioFOURCC('e','v','t','l')
|
|
1695 #define DMUS_FOURCC_CURVE_LIST mmioFOURCC('c','u','r','l')
|
|
1696
|
|
1697 /*
|
|
1698 // sequence track
|
|
1699 'seqt'
|
|
1700 (
|
|
1701 // sequence array
|
|
1702 'evtl'
|
|
1703 (
|
|
1704 // sizeof DMUS_IO_SEQ_ITEM: DWORD
|
|
1705 <DMUS_IO_SEQ_ITEM>...
|
|
1706 )
|
|
1707 // curve array
|
|
1708 'curl'
|
|
1709 (
|
|
1710 // sizeof DMUS_IO_CURVE_ITEM: DWORD
|
|
1711 <DMUS_IO_CURVE_ITEM>...
|
|
1712 )
|
|
1713 )
|
|
1714 */
|
|
1715
|
|
1716 #define DMUS_FOURCC_SYSEX_TRACK mmioFOURCC('s','y','e','x')
|
|
1717
|
|
1718 /*
|
|
1719 // sysex track
|
|
1720 'syex'
|
|
1721 (
|
|
1722 {
|
|
1723 <DMUS_IO_SYSEX_ITEM>
|
|
1724 <BYTE>... // Array of bytes, length defined in the DMUS_IO_SYSEXITEM structure
|
|
1725 }...
|
|
1726 )
|
|
1727 */
|
|
1728
|
|
1729 #define DMUS_FOURCC_TIMESIGNATURE_TRACK mmioFOURCC('t','i','m','s')
|
|
1730
|
|
1731 typedef struct _DMUS_IO_TIMESIGNATURE_ITEM
|
|
1732 {
|
|
1733 MUSIC_TIME lTime;
|
|
1734 BYTE bBeatsPerMeasure; /* beats per measure (top of time sig) */
|
|
1735 BYTE bBeat; /* what note receives the beat (bottom of time sig.) */
|
|
1736 /* we can assume that 0 means 256th note */
|
|
1737 WORD wGridsPerBeat; /* grids per beat */
|
|
1738 } DMUS_IO_TIMESIGNATURE_ITEM;
|
|
1739
|
|
1740 /* DirectX6 time signature track
|
|
1741
|
|
1742 'tims'
|
|
1743 (
|
|
1744 // size of DMUS_IO_TIMESIGNATURE_ITEM : DWORD
|
|
1745 <DMUS_IO_TIMESIGNATURE_ITEM>...
|
|
1746 )
|
|
1747 */
|
|
1748
|
|
1749 /* DirectX8 Time signature track. The track has been updated from DirectX7 to support a list of
|
|
1750 RIFF chunks. This will allow the time signature track to expand in the future.
|
|
1751 */
|
|
1752
|
|
1753 #define DMUS_FOURCC_TIMESIGTRACK_LIST mmioFOURCC('T','I','M','S')
|
|
1754 #define DMUS_FOURCC_TIMESIG_CHUNK DMUS_FOURCC_TIMESIGNATURE_TRACK
|
|
1755
|
|
1756 /*
|
|
1757 LIST
|
|
1758 (
|
|
1759 'TIMS' // Time Signature Track list-type
|
|
1760 <tims-ck> // Chunk containing an array of time signatures
|
|
1761 )
|
|
1762
|
|
1763 'tims'
|
|
1764 (
|
|
1765 // size of DMUS_IO_TIMESIGNATURE_ITEM : DWORD
|
|
1766 <DMUS_IO_TIMESIGNATURE_ITEM>...
|
|
1767 )
|
|
1768
|
|
1769 */
|
|
1770
|
|
1771 /* DirectX8 Marker track. This is used to store valid start points and other
|
|
1772 flow control parameters that may come later. For example, if we want
|
|
1773 to implement more sophisticated looping and branching constructs, they
|
|
1774 would live in this track.
|
|
1775 */
|
|
1776
|
|
1777 #define DMUS_FOURCC_MARKERTRACK_LIST mmioFOURCC('M','A','R','K')
|
|
1778 #define DMUS_FOURCC_VALIDSTART_CHUNK mmioFOURCC('v','a','l','s')
|
|
1779 #define DMUS_FOURCC_PLAYMARKER_CHUNK mmioFOURCC('p','l','a','y')
|
|
1780
|
|
1781 /* io structures */
|
|
1782 typedef struct _DMUS_IO_VALID_START
|
|
1783 {
|
|
1784 MUSIC_TIME mtTime; /* Time of a legal start. */
|
|
1785 } DMUS_IO_VALID_START;
|
|
1786
|
|
1787 typedef struct _DMUS_IO_PLAY_MARKER
|
|
1788 {
|
|
1789 MUSIC_TIME mtTime; /* Time of a next legal play point marker. */
|
|
1790 } DMUS_IO_PLAY_MARKER;
|
|
1791
|
|
1792 /*
|
|
1793 LIST
|
|
1794 (
|
|
1795 'MARK' // Marker Track list-type
|
|
1796 [<vals-ck>] // Chunk containing an array of start points
|
|
1797 [<play-ck>] // Chunk containing an array of play start markers
|
|
1798 )
|
|
1799
|
|
1800 'vals'
|
|
1801 (
|
|
1802 // size of DMUS_IO_VALID_START : DWORD
|
|
1803 <DMUS_IO_VALID_START>...
|
|
1804 )
|
|
1805
|
|
1806 'play'
|
|
1807 (
|
|
1808 // size of DMUS_IO_PLAY_MARKER : DWORD
|
|
1809 <DMUS_IO_PLAY_MARKER>...
|
|
1810 )
|
|
1811
|
|
1812 */
|
|
1813
|
|
1814 /* segment trigger tracks */
|
|
1815
|
|
1816 /* RIFF ids: */
|
|
1817 #define DMUS_FOURCC_SEGTRACK_LIST mmioFOURCC('s','e','g','t')
|
|
1818 #define DMUS_FOURCC_SEGTRACK_CHUNK mmioFOURCC('s','g','t','h')
|
|
1819 #define DMUS_FOURCC_SEGMENTS_LIST mmioFOURCC('l','s','g','l')
|
|
1820 #define DMUS_FOURCC_SEGMENT_LIST mmioFOURCC('l','s','e','g')
|
|
1821 #define DMUS_FOURCC_SEGMENTITEM_CHUNK mmioFOURCC('s','g','i','h')
|
|
1822 #define DMUS_FOURCC_SEGMENTITEMNAME_CHUNK mmioFOURCC('s','n','a','m')
|
|
1823
|
|
1824 /* io structures */
|
|
1825 typedef struct _DMUS_IO_SEGMENT_TRACK_HEADER
|
|
1826 {
|
|
1827 DWORD dwFlags; /* Reserved leave as 0. */
|
|
1828 } DMUS_IO_SEGMENT_TRACK_HEADER;
|
|
1829
|
|
1830 typedef struct _DMUS_IO_SEGMENT_ITEM_HEADER
|
|
1831 {
|
|
1832 MUSIC_TIME lTimeLogical; /* Position in track list. Time in the music with which the event is associated. */
|
|
1833 MUSIC_TIME lTimePhysical; /* Precise time event will be triggered. Should be close to logical time. */
|
|
1834 DWORD dwPlayFlags; /* Flags for PlaySegment(). */
|
|
1835 DWORD dwFlags; /* Flags. */
|
|
1836 } DMUS_IO_SEGMENT_ITEM_HEADER;
|
|
1837
|
|
1838 /* values for dwflags field of DMUS_IO_SEGMENT_ITEM_HEADER */
|
|
1839 #define DMUS_SEGMENTTRACKF_MOTIF 1 /* interpret DMRF as link to style, and use snam as the name of a motif within the style */
|
|
1840
|
|
1841 /*
|
|
1842 LIST
|
|
1843 (
|
|
1844 'segt' // DirectMusic Segment Trigger Track form-type
|
|
1845 [<sgth-ck>] // Segment track header
|
|
1846 <lsgl-list> // List of Segment Lists
|
|
1847 )
|
|
1848
|
|
1849 // <sgth-ck>
|
|
1850 'sgth'
|
|
1851 (
|
|
1852 <DMUS_IO_SEGMENT_TRACK_HEADER>
|
|
1853 )
|
|
1854
|
|
1855 // <lsgl-list>
|
|
1856 LIST
|
|
1857 (
|
|
1858 'lsgl' // Array of segments
|
|
1859 <lseg-list>... // Each segment is encapsulated in a list (that way it can still be riff parsed.)
|
|
1860 )
|
|
1861
|
|
1862 // <lseg-list>
|
|
1863 LIST
|
|
1864 (
|
|
1865 'lseg'
|
|
1866 <sgih-ck>
|
|
1867 <DMRF-list> // Link to a segment or style file.
|
|
1868 [<snam-ck>] // Name field. Used with DMUS_SEGMENTTRACKF_MOTIF flag.
|
|
1869 )
|
|
1870
|
|
1871 // <sgih-ck> // segment item header
|
|
1872 (
|
|
1873 <DMUS_IO_SEGMENT_ITEM_HEADER> // Segment item header
|
|
1874 )
|
|
1875
|
|
1876 // <snam-ck>
|
|
1877 (
|
|
1878 // Name, stored as NULL terminated string of WCHARs
|
|
1879 )
|
|
1880 */
|
|
1881
|
|
1882 /* Script track. */
|
|
1883
|
|
1884 /* RIFF ids: */
|
|
1885 #define DMUS_FOURCC_SCRIPTTRACK_LIST mmioFOURCC('s','c','r','t')
|
|
1886 #define DMUS_FOURCC_SCRIPTTRACKEVENTS_LIST mmioFOURCC('s','c','r','l')
|
|
1887 #define DMUS_FOURCC_SCRIPTTRACKEVENT_LIST mmioFOURCC('s','c','r','e')
|
|
1888 #define DMUS_FOURCC_SCRIPTTRACKEVENTHEADER_CHUNK mmioFOURCC('s','c','r','h')
|
|
1889 #define DMUS_FOURCC_SCRIPTTRACKEVENTNAME_CHUNK mmioFOURCC('s','c','r','n')
|
|
1890
|
|
1891 /* Flags for DMUS_IO_SCRIPTTRACK_TIMING
|
|
1892 */
|
|
1893 #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. */
|
|
1894 #define DMUS_IO_SCRIPTTRACKF_QUEUE (1 << 1) /* Fire event just before time stamp, at Queue time. */
|
|
1895 #define DMUS_IO_SCRIPTTRACKF_ATTIME (1 << 2) /* Fire event right at the time stamp. */
|
|
1896
|
|
1897 typedef struct _DMUS_IO_SCRIPTTRACK_EVENTHEADER
|
|
1898 {
|
|
1899 DWORD dwFlags; /* various bits (see DMUS_IO_SCRIPTTRACKF_*) */
|
|
1900 MUSIC_TIME lTimeLogical; /* Position in track list. Time in the music with which the event is associated. */
|
|
1901 MUSIC_TIME lTimePhysical; /* Precise time event will be triggered. Should be close to logical time. */
|
|
1902 } DMUS_IO_SCRIPTTRACK_EVENTHEADER;
|
|
1903
|
|
1904 /*
|
|
1905 // Script Track
|
|
1906
|
|
1907 // <scrt-list>
|
|
1908 LIST
|
|
1909 (
|
|
1910 <scrl-list> // List of script events
|
|
1911 )
|
|
1912
|
|
1913 // <scrl-list>
|
|
1914 LIST
|
|
1915 (
|
|
1916 <scre-list>... // Array of event descriptions
|
|
1917 )
|
|
1918
|
|
1919 // <scre-list>
|
|
1920 LIST
|
|
1921 (
|
|
1922 <scrh-ck> // Event header chunk
|
|
1923 <DMRF>
|
|
1924 <scrn-ck> // Routine name
|
|
1925 )
|
|
1926
|
|
1927 'scrh'
|
|
1928 (
|
|
1929 <DMUS_IO_SCRIPTTRACK_EVENTHEADER>
|
|
1930 )
|
|
1931
|
|
1932 'scrn'
|
|
1933 (
|
|
1934 // Name, stored as NULL terminated string of WCHARs
|
|
1935 )
|
|
1936 */
|
|
1937
|
|
1938 /* Lyrics/Notification track. */
|
|
1939
|
|
1940 /* RIFF ids: */
|
|
1941 #define DMUS_FOURCC_LYRICSTRACK_LIST mmioFOURCC('l','y','r','t')
|
|
1942 #define DMUS_FOURCC_LYRICSTRACKEVENTS_LIST mmioFOURCC('l','y','r','l')
|
|
1943 #define DMUS_FOURCC_LYRICSTRACKEVENT_LIST mmioFOURCC('l','y','r','e')
|
|
1944 #define DMUS_FOURCC_LYRICSTRACKEVENTHEADER_CHUNK mmioFOURCC('l','y','r','h')
|
|
1945 #define DMUS_FOURCC_LYRICSTRACKEVENTTEXT_CHUNK mmioFOURCC('l','y','r','n')
|
|
1946
|
|
1947 typedef struct _DMUS_IO_LYRICSTRACK_EVENTHEADER
|
|
1948 {
|
|
1949 DWORD dwFlags; /* Reserved leave as 0. */
|
|
1950 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. */
|
|
1951 MUSIC_TIME lTimeLogical; /* Position in track list. Time in the music with which the event is associated. */
|
|
1952 MUSIC_TIME lTimePhysical; /* Precise time event will be triggered. Should be close to logical time. */
|
|
1953 } DMUS_IO_LYRICSTRACK_EVENTHEADER;
|
|
1954
|
|
1955 /*
|
|
1956 // Lyrics/Notification Track
|
|
1957
|
|
1958 // <lyrt-list>
|
|
1959 LIST
|
|
1960 (
|
|
1961 <lyrl-list> // List of notification events
|
|
1962 )
|
|
1963
|
|
1964 // <lyrl-list>
|
|
1965 LIST
|
|
1966 (
|
|
1967 <lyre-list>... // Array of event descriptions
|
|
1968 )
|
|
1969
|
|
1970 // <lyre-list>
|
|
1971 LIST
|
|
1972 (
|
|
1973 <lyrh-ck> // Event header chunk
|
|
1974 <lyrn-ck> // Notification text
|
|
1975 )
|
|
1976
|
|
1977 'lyrh'
|
|
1978 (
|
|
1979 <DMUS_IO_LYRICSTRACK_EVENTHEADER>
|
|
1980 )
|
|
1981
|
|
1982 'lyrn'
|
|
1983 (
|
|
1984 // Name, stored as NULL terminated string of WCHARs
|
|
1985 )
|
|
1986 */
|
|
1987
|
|
1988 /* Parameter control track */
|
|
1989
|
|
1990 /* RIFF ids: */
|
|
1991 #define DMUS_FOURCC_PARAMCONTROLTRACK_TRACK_LIST mmioFOURCC('p','r','m','t')
|
|
1992 #define DMUS_FOURCC_PARAMCONTROLTRACK_OBJECT_LIST mmioFOURCC('p','r','o','l')
|
|
1993 #define DMUS_FOURCC_PARAMCONTROLTRACK_OBJECT_CHUNK mmioFOURCC('p','r','o','h')
|
|
1994 #define DMUS_FOURCC_PARAMCONTROLTRACK_PARAM_LIST mmioFOURCC('p','r','p','l')
|
|
1995 #define DMUS_FOURCC_PARAMCONTROLTRACK_PARAM_CHUNK mmioFOURCC('p','r','p','h')
|
|
1996 #define DMUS_FOURCC_PARAMCONTROLTRACK_CURVES_CHUNK mmioFOURCC('p','r','c','c')
|
|
1997
|
|
1998 typedef struct _DMUS_IO_PARAMCONTROLTRACK_OBJECTHEADER
|
|
1999 {
|
|
2000 DWORD dwFlags; /* Reserved. Must be zero. */
|
|
2001 GUID guidTimeFormat; /* Time format to set the object to. Must be GUID_TIME_REFERNCE or GUID_TIME_MUSIC from medparam.h. */
|
|
2002 /* Path for finding the object. These fields correspond to the first five parameters of IDirectMusicSegmentState::GetObjectInPath. */
|
|
2003 DWORD dwPChannel;
|
|
2004 DWORD dwStage;
|
|
2005 DWORD dwBuffer;
|
|
2006 GUID guidObject;
|
|
2007 DWORD dwIndex;
|
|
2008 } DMUS_IO_PARAMCONTROLTRACK_OBJECTHEADER;
|
|
2009
|
|
2010 typedef struct _DMUS_IO_PARAMCONTROLTRACK_PARAMHEADER
|
|
2011 {
|
|
2012 DWORD dwFlags; /* Reserved. Must be zero. */
|
|
2013 DWORD dwIndex; /* Index number of the parameter on the object */
|
|
2014 } DMUS_IO_PARAMCONTROLTRACK_PARAMHEADER;
|
|
2015
|
|
2016 typedef struct _DMUS_IO_PARAMCONTROLTRACK_CURVEINFO
|
|
2017 {
|
|
2018 MUSIC_TIME mtStartTime;
|
|
2019 MUSIC_TIME mtEndTime;
|
|
2020 float fltStartValue;
|
|
2021 float fltEndValue;
|
|
2022 DWORD dwCurveType; /* One of the items from the MP_CURVE_TYPE enum in medparam.h */
|
|
2023 DWORD dwFlags; /* A combination of the MPF_ENVLP_* constants in medparam.h */
|
|
2024 } DMUS_IO_PARAMCONTROLTRACK_CURVEINFO;
|
|
2025
|
|
2026 /*
|
|
2027 // <prmt-list>
|
|
2028 LIST
|
|
2029 (
|
|
2030 <prol-list>... // one for each object
|
|
2031 )
|
|
2032
|
|
2033 // <prol-list>
|
|
2034 LIST
|
|
2035 (
|
|
2036 <proh-ck> // object header chunk
|
|
2037 <prpl-list>... // one for each parameter
|
|
2038 )
|
|
2039
|
|
2040 // <proh-ck>
|
|
2041 proh
|
|
2042 (
|
|
2043 <DMUS_IO_PARAMCONTROLTRACK_OBJECTHEADER>
|
|
2044 )
|
|
2045
|
|
2046 // <prpl-list>
|
|
2047 LIST
|
|
2048 (
|
|
2049 <prph-ck> // parameter header chunk
|
|
2050 <prcc-ck> // chunk containing an array of curves
|
|
2051 )
|
|
2052
|
|
2053 // <prph-ck>
|
|
2054 prph
|
|
2055 (
|
|
2056 <DMUS_IO_PARAMCONTROLTRACK_PARAMHEADER>
|
|
2057 )
|
|
2058
|
|
2059 // <prcc-ck>
|
|
2060 prcc
|
|
2061 (
|
|
2062 // sizeof DMUS_IO_PARAMCONTROLTRACK_CURVEINFO:DWORD
|
|
2063 <DMUS_IO_PARAMCONTROLTRACK_CURVEINFO>... // curves, sorted in order of mtTime
|
|
2064 )
|
|
2065 */
|
|
2066
|
|
2067 #if (DIRECTSOUND_VERSION >= 0x0800)
|
|
2068
|
|
2069 /* DirectSoundBufferConfig FX Map */
|
|
2070
|
|
2071 /* RIFF ids: */
|
|
2072
|
|
2073 #define DMUS_FOURCC_DSBC_FORM mmioFOURCC('D','S','B','C')
|
|
2074 #define DMUS_FOURCC_DSBD_CHUNK mmioFOURCC('d','s','b','d')
|
|
2075 #define DMUS_FOURCC_BSID_CHUNK mmioFOURCC('b','s','i','d')
|
|
2076 #define DMUS_FOURCC_DS3D_CHUNK mmioFOURCC('d','s','3','d')
|
|
2077 #define DMUS_FOURCC_DSBC_LIST mmioFOURCC('f','x','l','s')
|
|
2078 #define DMUS_FOURCC_DSFX_FORM mmioFOURCC('D','S','F','X')
|
|
2079 #define DMUS_FOURCC_DSFX_CHUNK mmioFOURCC('f','x','h','r')
|
|
2080 #define DMUS_FOURCC_DSFX_DATA mmioFOURCC('d','a','t','a')
|
|
2081
|
|
2082 /* io structures */
|
|
2083
|
|
2084 typedef struct _DSOUND_IO_DSBUFFERDESC
|
|
2085 {
|
|
2086 DWORD dwFlags; /* DirectSound buffer creation flags */
|
|
2087 WORD nChannels; /* No. of channels (rest of buffer format is determined by owning sink) */
|
|
2088 LONG lVolume; /* Initial pan; only used if CTRLVOLUME is specified */
|
|
2089 LONG lPan; /* Initial pan; only used if CTRLPAN is specified */
|
|
2090 DWORD dwReserved; /* Reserved - must be 0 */
|
|
2091 } DSOUND_IO_DSBUFFERDESC;
|
|
2092
|
|
2093 typedef struct _DSOUND_IO_DSBUSID
|
|
2094 {
|
|
2095 DWORD busid[1]; /* Array size determined from chunk size */
|
|
2096 } DSOUND_IO_DSBUSID;
|
|
2097
|
|
2098 typedef struct _DSOUND_IO_3D
|
|
2099 {
|
|
2100 GUID guid3DAlgorithm; /* GUID identifying the 3D algorithm to use (defined in dsound.h) */
|
|
2101 DS3DBUFFER ds3d; /* Initial 3D parameters */
|
|
2102 } DSOUND_IO_3D;
|
|
2103
|
|
2104 typedef struct _DSOUND_IO_DXDMO_HEADER
|
|
2105 {
|
|
2106 DWORD dwEffectFlags; /* Effect creation flags - equivalent to DSEFFECTDESC::dwFlags */
|
|
2107 GUID guidDSFXClass; /* GUID identifying the effect to use - corresponds to a COM CLSID */
|
|
2108 GUID guidReserved; /* Reserved - must be the null GUID */
|
|
2109 GUID guidSendBuffer; /* GUID identifying the buffer to send to if this is a send effect */
|
|
2110 DWORD dwReserved; /* Reserved - must be 0 */
|
|
2111 } DSOUND_IO_DXDMO_HEADER;
|
|
2112
|
|
2113 typedef struct _DSOUND_IO_DXDMO_DATA
|
|
2114 {
|
|
2115 DWORD data[1]; /* Array size determined by the DMO involved */
|
|
2116 } DSOUND_IO_DXDMO_DATA;
|
|
2117
|
|
2118 /*
|
|
2119 RIFF
|
|
2120 (
|
|
2121 'DSBC' // DirectSoundBufferConfig chunk
|
|
2122 [<guid-ck>] // GUID identifier for this DirectSoundBufferConfig
|
|
2123 [<vers-ck>] // Optional version info
|
|
2124 [<UNFO-list>] // Name, author, copyright info., comments
|
|
2125 <dsbd-ck> // DirectSound Buffer descriptor chunk
|
|
2126 [<bsid-ck>] // Optional bus id array
|
|
2127 [<ds3d-ck>] // Optional 3d Parameters
|
|
2128 [<fxls-list>] // Optional list of FX descriptors
|
|
2129 )
|
|
2130
|
|
2131 // <guid-ck>
|
|
2132 'guid'
|
|
2133 (
|
|
2134 <GUID>
|
|
2135 )
|
|
2136
|
|
2137 // <vers-ck>
|
|
2138 'vers'
|
|
2139 (
|
|
2140 <DMUS_IO_VERSION>
|
|
2141 )
|
|
2142
|
|
2143 // <dsbd-ck>
|
|
2144 'dsbd'
|
|
2145 (
|
|
2146 <DSOUND_IO_DSBUFFERDESC> // Creation parameters and initial settings for the buffer
|
|
2147 )
|
|
2148
|
|
2149 // <bsid-ck>
|
|
2150 'bsid'
|
|
2151 (
|
|
2152 <DSOUND_IO_DSBUSID> // The size of DSOUND_IO_DSBUSID is determined by the chunk size
|
|
2153 )
|
|
2154
|
|
2155 // <ds3d-ck>
|
|
2156 'ds3d'
|
|
2157 (
|
|
2158 <DSOUND_IO_3D> // Initial 3D buffer parameters: position, etc.
|
|
2159 )
|
|
2160
|
|
2161 // <fx-list>
|
|
2162 LIST
|
|
2163 (
|
|
2164 'fxls' // Array of DMO creation parameter blocks
|
|
2165 <DSFX-form>... // Each DMO is encapsulated in a RIFF chunk
|
|
2166 )
|
|
2167
|
|
2168 // <DSFX-form> // DMOs can be embedded in a buffer configuration or stored as separate files
|
|
2169 RIFF
|
|
2170 (
|
|
2171 'DSFX'
|
|
2172 <fxhr-ck> // FX header chunk
|
|
2173 [<data-ck>] // FX initial settings chunk
|
|
2174 )
|
|
2175
|
|
2176 // <fxhr-ck>
|
|
2177 'fxhr'
|
|
2178 (
|
|
2179 <DSOUND_IO_DXDMO_HEADER>
|
|
2180 )
|
|
2181
|
|
2182 // <data-ck>
|
|
2183 'data'
|
|
2184 (
|
|
2185 <DSOUND_IO_DXDMO_DATA> // Opaque data block used by the DMO to load itself.
|
|
2186 // For our standard included DMOs, this is simply the structure accepted by
|
|
2187 // the DMO's SetAllParameters() method - e.g. struct DSFXChorus for Chorus.
|
|
2188 )
|
|
2189 */
|
|
2190
|
|
2191 #endif
|
|
2192
|
|
2193 #ifdef __cplusplus
|
|
2194 }; /* extern "C" */
|
|
2195 #endif
|
|
2196
|
|
2197 #include <poppack.h>
|
|
2198
|
|
2199 #endif /* #ifndef _DMUSICF_ */
|