SMFI.H
上传用户:bangxh
上传日期:2007-01-31
资源大小:42235k
文件大小:5k
源码类别:

Windows编程

开发平台:

Visual C++

  1. //==========================================================================;
  2. //
  3. //  THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
  4. //  ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED
  5. //  TO THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR
  6. //  A PARTICULAR PURPOSE.
  7. //
  8. //  Copyright (C) 1993 - 1997 Microsoft Corporation. All Rights Reserved.
  9. //
  10. //--------------------------------------------------------------------------;
  11. #ifndef _SMFI_
  12. #define _SMFI_
  13. /* Handle structure for HSMF
  14. */ 
  15. #define SMF_TF_EOT          0x00000001L
  16. #define SMF_TF_INVALID      0x00000002L
  17. typedef struct tag_tempomapentry
  18. {
  19.     TICKS           tkTempo;           
  20.     DWORD           msBase;            
  21.     DWORD           dwTempo;           
  22. }   TEMPOMAPENTRY,
  23.     *PTEMPOMAPENTRY;
  24. typedef struct tag_smf *PSMF;
  25. typedef struct tag_track
  26. {
  27.     PSMF            pSmf;
  28.     DWORD           idxTrack;          
  29.     
  30.     TICKS           tkPosition;        
  31.     DWORD           cbLeft;            
  32.     HPBYTE          hpbImage;          
  33.     BYTE            bRunningStatus;    
  34.     
  35.     DWORD           fdwTrack;          
  36.     struct
  37.     {
  38.         TICKS       tkLength;
  39.         DWORD       cbLength;
  40.     }
  41.     smti;                              
  42. }   TRACK,
  43.     *PTRACK;
  44. #define SMF_F_EOF               0x00000001L
  45. #define SMF_F_INSERTSYSEX       0x00000002L
  46. #define C_TEMPO_MAP_CHK     16
  47. typedef struct tag_smf
  48. {
  49.     char            szName[128];
  50.     HPBYTE          hpbImage;
  51.     DWORD           cbImage;
  52.     HTASK           htask;
  53.     TICKS           tkPosition;
  54.     TICKS           tkLength;
  55.     DWORD           dwFormat;
  56.     DWORD           dwTracks;
  57.     DWORD           dwTimeDivision;
  58.     DWORD           fdwSMF;
  59.     DWORD           cTempoMap;
  60.     DWORD           cTempoMapAlloc;
  61.     HLOCAL          hTempoMap;
  62.     PTEMPOMAPENTRY  pTempoMap;
  63.     DWORD           dwPendingUserEvent;
  64.     DWORD           cbPendingUserEvent;
  65.     HPBYTE          hpbPendingUserEvent;
  66.     
  67.     TRACK           rTracks[];
  68. }   SMF;
  69. typedef struct tagEVENT
  70. {
  71.     TICKS           tkDelta;           
  72.     BYTE            abEvent[3];        
  73.                                        
  74.                                        
  75.                                        
  76.     DWORD           cbParm;            
  77.     HPBYTE          hpbParm;           
  78. }   EVENT,
  79.     BSTACK *SPEVENT;
  80. #define EVENT_TYPE(event)       ((event).abEvent[0])
  81. #define EVENT_CH_B1(event)      ((event).abEvent[1])
  82. #define EVENT_CH_B2(event)      ((event).abEvent[2])
  83. #define EVENT_META_TYPE(event)  ((event).abEvent[1])
  84. SMFRESULT FNLOCAL smfBuildFileIndex(
  85.     PSMF BSTACK *       ppsmf);
  86. DWORD FNLOCAL smfGetVDword(
  87.     HPBYTE              hpbImage,
  88.     DWORD               dwLeft,                                
  89.     DWORD BSTACK *      pdw);
  90. SMFRESULT FNLOCAL smfGetNextEvent(
  91.     PSMF                psmf,
  92.     SPEVENT             pevent,
  93.     TICKS               tkMax);
  94. /*
  95. ** Useful macros when dealing with hi-lo format integers
  96. */
  97. #define DWORDSWAP(dw) 
  98.     ((((dw)>>24)&0x000000FFL)|
  99.     (((dw)>>8)&0x0000FF00L)|
  100.     (((dw)<<8)&0x00FF0000L)|
  101.     (((dw)<<24)&0xFF000000L))
  102. #define WORDSWAP(w) 
  103.     ((((w)>>8)&0x00FF)|
  104.     (((w)<<8)&0xFF00))
  105. #define FOURCC_RMID     mmioFOURCC('R','M','I','D')
  106. #define FOURCC_data     mmioFOURCC('d','a','t','a')
  107. #define FOURCC_MThd     mmioFOURCC('M','T','h','d')
  108. #define FOURCC_MTrk     mmioFOURCC('M','T','r','k')
  109. typedef struct tag_chunkhdr
  110. {
  111.     FOURCC  fourccType;
  112.     DWORD   dwLength;
  113. }   CHUNKHDR,
  114.     *PCHUNKHDR;
  115. #pragma pack(1) // override cl32 default packing, to match disk file.
  116. typedef struct tag_filehdr
  117. {
  118.     WORD    wFormat;
  119.     WORD    wTracks;
  120.     WORD    wDivision;
  121. }   FILEHDR,
  122.     *PFILEHDR;
  123. #pragma pack()
  124. /* NOTE: This is arbitrary and only used if there is a tempo map but no
  125. ** entry at tick 0.
  126. */
  127. #define MIDI_DEFAULT_TEMPO      (500000L)
  128. #define MIDI_MSG                ((BYTE)0x80)
  129. #define MIDI_NOTEOFF            ((BYTE)0x80)
  130. #define MIDI_NOTEON             ((BYTE)0x90)
  131. #define MIDI_POLYPRESSURE       ((BYTE)0xA0)
  132. #define MIDI_CONTROLCHANGE      ((BYTE)0xB0)
  133. #define MIDI_PROGRAMCHANGE      ((BYTE)0xC0)
  134. #define MIDI_CHANPRESSURE       ((BYTE)0xD0)
  135. #define MIDI_PITCHBEND          ((BYTE)0xE0)
  136. #define MIDI_META               ((BYTE)0xFF)
  137. #define MIDI_SYSEX              ((BYTE)0xF0)
  138. #define MIDI_SYSEXEND           ((BYTE)0xF7)
  139. #define MIDI_META_TRACKNAME     ((BYTE)0x03)
  140. #define MIDI_META_EOT           ((BYTE)0x2F)
  141. #define MIDI_META_TEMPO         ((BYTE)0x51)
  142. #define MIDI_META_TIMESIG       ((BYTE)0x58)
  143. #define MIDI_META_KEYSIG        ((BYTE)0x59)
  144. #define MIDI_META_SEQSPECIFIC   ((BYTE)0x7F)
  145. #endif