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