 /*

     dls.h

     Description:

     Interface defines and structures for the Instrument Collection Form
     RIFF DLS.

     Written by Sonic Foundry 1996.  Released for public use.

 */

 #ifndef _INC_DLS
 #define _INC_DLS

 /*

    Layout of an instrument collection:


    RIFF [] 'DLS ' [colh,INSTLIST,WAVEPOOL,INFOLIST]

    INSTLIST
    LIST [] 'lins'
                  LIST [] 'ins ' [insh,RGNLIST,ARTLIST,INFOLIST]
                  LIST [] 'ins ' [insh,RGNLIST,ARTLIST,INFOLIST]
                  LIST [] 'ins ' [insh,RGNLIST,ARTLIST,INFOLIST]

    RGNLIST
    LIST [] 'lrgn'
                  LIST [] 'rgn '  [rgnh,wsmp,wlnk,ARTLIST]
                  LIST [] 'rgn '  [rgnh,wsmp,wlnk,ARTLIST]
                  LIST [] 'rgn '  [rgnh,wsmp,wlnk,ARTLIST]

    ARTLIST
    LIST [] 'lart'
            'art1' level 1 Articulation connection graph
            'art2' level 2 Articulation connection graph
            '3rd1' Possible 3rd party articulation structure 1
            '3rd2' Possible 3rd party articulation structure 2 .... and so on

    WAVEPOOL
    ptbl [] [pool table]
    LIST [] 'wvpl'
                  [path],
                  [path],
                  LIST [] 'wave',RIFFWAVE
                  LIST [] 'wave',RIFFWAVE
                  LIST [] 'wave',RIFFWAVE
                  LIST [] 'wave',RIFFWAVE
                  LIST [] 'wave',RIFFWAVE

    INFOLIST
    LIST [] 'INFO'
                  'icmt' 'One of those crazy comments.'
                  'icop' 'Copyright (C) 1996 Sonic Foundry'

 */


 /*
    FOURCC's used in the DLS file
 */
/* shree */
//#define FAR

/* shree

 #define FOURCC_DLS   mmioFOURCC('D','L','S',' ')
 #define FOURCC_COLH  mmioFOURCC('c','o','l','h')
 #define FOURCC_WVPL  mmioFOURCC('w','v','p','l')
 #define FOURCC_PTBL  mmioFOURCC('p','t','b','l')
 #define FOURCC_PATH  mmioFOURCC('p','a','t','h')
 #define FOURCC_wave  mmioFOURCC('w','a','v','e')
 #define FOURCC_LINS  mmioFOURCC('l','i','n','s')
 #define FOURCC_INS   mmioFOURCC('i','n','s',' ')
 #define FOURCC_INSH  mmioFOURCC('i','n','s','h')
 #define FOURCC_LRGN  mmioFOURCC('l','r','g','n')
 #define FOURCC_RGN   mmioFOURCC('r','g','n',' ')
 #define FOURCC_RGNH  mmioFOURCC('r','g','n','h')
 #define FOURCC_LART  mmioFOURCC('l','a','r','t')
 #define FOURCC_ART1  mmioFOURCC('a','r','t','1')
 #define FOURCC_WLNK  mmioFOURCC('w','l','n','k')
 #define FOURCC_WSMP  mmioFOURCC('w','s','m','p')
 #define FOURCC_VERS  mmioFOURCC('v','e','r','s')
*/
 /*
    Articulation connection graph definitions
 */

 /* Generic Sources */
 #define CONN_SRC_NONE              0x0000
 #define CONN_SRC_LFO               0x0001
 #define CONN_SRC_KEYONVELOCITY     0x0002
 #define CONN_SRC_KEYNUMBER         0x0003
 #define CONN_SRC_EG1               0x0004
 #define CONN_SRC_EG2               0x0005
 #define CONN_SRC_PITCHWHEEL        0x0006

 /* Midi Controllers 0-127 */
 #define CONN_SRC_CC1               0x0081
 #define CONN_SRC_CC7               0x0087
 #define CONN_SRC_CC10              0x008a
 #define CONN_SRC_CC11              0x008b

 /* Registered Parameter Numbers */
 #define CONN_SRC_RPN0             0x0100
 #define CONN_SRC_RPN1             0x0101
 #define CONN_SRC_RPN2             0x0102

 /* Generic Destinations */
 #define CONN_DST_NONE              0x0000
 #define CONN_DST_ATTENUATION       0x0001
 #define CONN_DST_RESERVED          0x0002
 #define CONN_DST_PITCH             0x0003
 #define CONN_DST_PAN               0x0004

 /* LFO Destinations */
 #define CONN_DST_LFO_FREQUENCY     0x0104
 #define CONN_DST_LFO_STARTDELAY    0x0105

 /* EG1 Destinations */
 #define CONN_DST_EG1_ATTACKTIME    0x0206
 #define CONN_DST_EG1_DECAYTIME     0x0207
 #define CONN_DST_EG1_RESERVED      0x0208
 #define CONN_DST_EG1_RELEASETIME   0x0209
 #define CONN_DST_EG1_SUSTAINLEVEL  0x020a

 /* EG2 Destinations */
 #define CONN_DST_EG2_ATTACKTIME    0x030a
 #define CONN_DST_EG2_DECAYTIME     0x030b
 #define CONN_DST_EG2_RESERVED      0x030c
 #define CONN_DST_EG2_RELEASETIME   0x030d
 #define CONN_DST_EG2_SUSTAINLEVEL  0x030e

 #define CONN_TRN_NONE              0x0000
 #define CONN_TRN_CONCAVE           0x0001

 typedef struct _DLSVERSION {
   DWORD    dwVersionMS;
   DWORD    dwVersionLS;
 }DLSVERSION, FAR *LPDLSVERSION;


 typedef struct _CONNECTION {
   USHORT   usSource;
   USHORT   usControl;
   USHORT   usDestination;
   USHORT   usTransform;
   LONG     lScale;
   }CONNECTION, FAR *LPCONNECTION;


 /* Level 1 Articulation Data */

 typedef struct _CONNECTIONLIST {
   ULONG    cbSize;            /* size of the connection list structure */
   ULONG    cConnections;      /* count of connections in the list */
   } CONNECTIONLIST, FAR *LPCONNECTIONLIST;



 /*
    Generic type defines for regions and instruments
 */

 typedef struct _RGNRANGE {
   USHORT usLow;
   USHORT usHigh;
 }RGNRANGE, FAR * LPRGNRANGE;

 #define F_INSTRUMENT_DRUMS      0x80000000

 typedef struct _MIDILOCALE {
   ULONG ulBank;
   ULONG ulInstrument;
 }MIDILOCALE, FAR *LPMIDILOCALE;

 /*
    Header structures found in an DLS file for collection, instruments, and
    regions.
 */

 #define F_RGN_OPTION_SELFNONEXCLUSIVE  0x0001

 typedef struct _RGNHEADER {
   RGNRANGE RangeKey;            /* Key range */
   RGNRANGE RangeVelocity;       /* Velocity Range */
   USHORT   fusOptions;          /* Synthesis options for this range */
   USHORT   usKeyGroup;          /* Key grouping for non simultaneous play
                                    0 = no group, 1 up is group
                                    for Level 1 only groups 1-15 are allowed */
 }RGNHEADER, FAR *LPRGNHEADER;

 typedef struct _INSTHEADER {
   ULONG      cRegions;          /* Count of regions in this instrument */
   MIDILOCALE Locale;            /* Intended MIDI locale of this instrument */
 }INSTHEADER, FAR *LPINSTHEADER;

 typedef struct _DLSHEADER {
   ULONG      cInstruments;      /* Count of instruments in the collection */
 }DLSHEADER, FAR *LPDLSHEADER;

 /*
    definitions for the Wave link structure
 */

 /*****  For level 1 only WAVELINK_CHANNEL_MONO is valid  ****
   ulChannel allows for up to 32 channels of audio with each bit position
   specifiying a channel of playback */

 #define WAVELINK_CHANNEL_LEFT    0x0001
 #define WAVELINK_CHANNEL_RIGHT   0x0002

 #define F_WAVELINK_PHASE_MASTER  0x0001

 typedef struct _WAVELINK { /* any paths or links are stored right after struct */
   USHORT   fusOptions;     /* options flags for this wave */
   USHORT   usPhaseGroup;   /* Phase grouping for locking channels */
   ULONG    ulChannel;      /* channel placement */
   ULONG    ulTableIndex;   /* index into the wave pool table, 0 based */
 }WAVELINK, FAR *LPWAVELINK;

 #define POOL_CUE_NULL  0xffffffff

 typedef struct _POOLCUE {
 //  ULONG    ulEntryIndex;   /* Index entry in the list */
   ULONG    ulOffset;       /* Offset to the entry in the list */
 }POOLCUE, FAR *LPPOOLCUE;

 typedef struct _POOLTABLE {
   ULONG    cbSize;            /* size of the pool table structure */
   ULONG    cCues;             /* count of cues in the list */
   } POOLTABLE, FAR *LPPOOLTABLE;

 /*
    Structures for the "wsmp" chunk
 */

 #define F_WSMP_NO_TRUNCATION     0x0001
 #define F_WSMP_NO_COMPRESSION    0x0002


 typedef struct _rwsmp {
   ULONG   cbSize;
   USHORT  usUnityNote;         /* MIDI Unity Playback Note */
   SHORT   sFineTune;           /* Fine Tune in log tuning */
   LONG    lAttenuation;        /* Overall Attenuation to be applied to data */
   ULONG   fulOptions;          /* Flag options */
   ULONG   cSampleLoops;        /* Count of Sample loops, 0 loops is one shot */
   } WSMPL, FAR *LPWSMPL;


 /* This loop type is a normal forward playing loop which is continually
    played until the envelope reaches an off threshold in the release
    portion of the volume envelope */

 #define WLOOP_TYPE_FORWARD   0

 typedef struct _rloop {
   ULONG cbSize;
   ULONG ulType;              /* Loop Type */
   ULONG ulStart;             /* Start of loop in samples */
   ULONG ulLength;            /* Length of loop in samples */
 } WLOOP, FAR *LPWLOOP;

 #endif /* _INC_DLS */
