home *** CD-ROM | disk | FTP | other *** search
/ Computer Music Interactif…cial Edition 1999 Winter / cd 3.iso / mac / Mac / Shares / Midishare™1.68 / Development Tools / Sources Examples / Other MidiShare Examples / midiplay / MidiFile.h < prev    next >
Encoding:
C/C++ Source or Header  |  1992-05-14  |  7.1 KB  |  190 lines  |  [TEXT/MPS ]

  1. /*
  2.  *    Midifile.h
  3.  *    Midi Files    version 1.00
  4.  *    define et structures des données
  5.  *
  6.  *    GRAME
  7.  *    25/08/89    D. Fober    : Version sur ATARI
  8.  *    01/10/91    GRAME            B. MERLIER     : transcription sur MacIntosh
  9.  *    Janvier 92    refonte et redéfinition des routines de base       D.F.
  10.  *  Mars    92  intégration des événements MidiFile dans MidiShare D.F.
  11.  *    Avril    92  ajout des fonction de lecture/écriture d'un événement
  12.  *              ouverture, fermeture et création de piste          D.F.
  13.  */
  14.  
  15. #ifndef __MIDIFILE_H__
  16. #define __MIDIFILE_H__
  17.  
  18. #include <midishare.h>
  19. #include <stdio.h>
  20.  
  21.  
  22. /*--------------------------------------------------------------------------*/
  23. extern int MidiFile_errno;        /* d'usage similaire à errno                */
  24.                                 /* à ne consulter qu'en cas d'erreur, s'il    */
  25.                                 /* le code vaut MidiFileNoErr, se référer     */
  26.                                 /* à errno    */
  27.  
  28. #define isMidiFileError( fd) (MidiFile_errno!=MidiFileNoErr || ferror(fd->fd) || feof(fd->fd))
  29.  
  30. /*--------------------------------------------------------------------------*/
  31. /* les types de fichiers implémentés                                         */
  32.  
  33. enum { midifile0= 0, midifile1, midifile2};
  34.  
  35.  
  36. /*--------------------------------------------------------------------------*/
  37. /* les modes d'ouverture des fichiers existants                                */
  38. #define MidiFileRead    0            /* lecture d'un fichier                    */
  39. #define MidiFileAppend    1            /* ajout à un fichier existant            */
  40.  
  41.  
  42. /*--------------------------------------------------------------------------*/
  43. /* définition du temps                                                        */
  44.  
  45. #define TicksPerQuarterNote    0
  46. #define Smpte24                24
  47. #define Smpte25                25
  48. #define Smpte29                29
  49. #define Smpte30                30
  50.  
  51.  
  52. /*--------------------------------------------------------------------------*/
  53. /* les types des méta événements                                             */
  54. #define    META            0xFF        /* code entête d'un méta-evt            */
  55.  
  56. #define MDF_NumSeq        0            /* numéro de séquence                    */
  57. #define MDF_Texte        1            /* événement texte                        */
  58. #define MDF_Copyright    2            /* message copyright                    */
  59. #define MDF_SeqName        3            /* nom de séquence ou de piste            */
  60. #define MDF_InstrName    4            /* nom d'instrument                        */
  61. #define MDF_Lyric        5            /* paroles déstinées à etre chantées    */
  62. #define MDF_Mark        6            /* marqueur                                */
  63. #define MDF_CuePt        7            /* cue point                            */
  64. #define MDF_ChanPref    0x20        /* Midi Channel Prefix                    */
  65. #define MDF_EndTrk        0x2F        /* fin de piste                            */
  66. #define MDF_Tempo        0x51        /* changement de tempo                    */
  67. #define MDF_Offset        0x54        /* offset smpte                            */
  68. #define MDF_Meas        0x58        /* indication de mesure                    */
  69. #define MDF_Ton            0x59        /* signature tonale                        */
  70. #define MDF_Extra        0x7F        /* méta evt spécifique à un séquenceur    */
  71.  
  72. /* longueurs des différents méta événements                                    */
  73. #define MDF_NumSeqLen    2
  74. #define MDF_ChanPrefLen 1
  75. #define MDF_EndTrkLen    0
  76. #define MDF_TempoLen    3
  77. #define MDF_OffsetLen    5
  78. #define MDF_MeasLen        4
  79. #define MDF_TonLen        2
  80.  
  81. /*--------------------------------------------------------------------------*/
  82. /* les structures de données                                                 */
  83. /*--------------------------------------------------------------------------*/
  84.  
  85. typedef struct MDF_Header{            /* les données du paquet d'en_tete        */
  86.     char     id[4];                    /* id de l'en tete                        */
  87.     long    len;                    /* longueur des données ( = 6 )            */
  88.     short    format;                    /* le format du fichier                    */
  89.     unsigned short ntrks;            /* le nbre de pistes                    */
  90.     short    time;                    /* représentation du temps                */
  91. }MDF_Header;
  92.  
  93.  
  94. typedef struct MDF_Trk{                /* les données d'un paquet de piste        */
  95.     char id[4];                        /* id de l'en tete                        */
  96.     unsigned long    len;            /* longueur des données                    */
  97. }MDF_Trk;
  98.  
  99. typedef struct midiFILE{            /* descripteur d'un fichier MidiFile    */
  100.     short     format;                    /* format du fichier                    */
  101.     unsigned short ntrks;            /* le nbre de pistes                    */
  102.     short    time;                    /* représentation du temps :            */
  103.                     /* si temps mesuré : nbre de pas d'horloge par noire    */
  104.                     /* si temps smpte  : b. 15 = 1                            */
  105.                     /*             b.8-14 = nbre frames par seconde            */
  106.                     /*               b.0-7  = nbre de pas d'horloge par frame    */
  107.     FILE     *fd;                    /* descripteur standard du fichier        */    
  108.     fpos_t  trkHeadOffset;            /* offset de l'en tête de piste            */
  109.                                     /* null si la piste n'est pas ouverte    */
  110.     long    _cnt;                    /* compteur pour fin de piste            */
  111.     MidiSeqPtr keyOff;                /* seq des keyOff provenant d'evts note    */
  112.     long     curDate;                /* la date courante                        */
  113.     Boolean mode;                    /* 0/1 : lecture/écriture                */
  114. }midiFILE;
  115.  
  116. typedef struct MDF_versions{
  117.     short    src;                    /* version des sources                    */
  118.     short     MidiFile;                /* version du standard MidiFile            */
  119. }MDF_versions;
  120.  
  121.  
  122. /*--------------------------------------------------------------------------*/
  123. /* les codes d'erreur de lecture d'un fichier                                 */
  124.  
  125. #define MidiFileNoErr        0        /* tout s'est bien passé                    */
  126. #define MidiFileErrFrmt        (-1)    /* erreur de format interne des informations*/
  127. #define MidiFileErrEvs        (-2)    /* plus d'événement disponible                */
  128. #define MidiFileErrNoTrack    (-3)    /* piste inexistante                        */
  129. #define MidiFileErrAdd0        (-4)    /* essai d'ajout à un fichier MIDI format 0    */
  130. #define MidiFileErrMode        (-5)    /* mode d'ouverture du fichier incorrect    */
  131. #define MidiFileErrUnknow    (-6)    /* événement de type inconnu                */
  132. #define MidiFileErrReset    (-7)    /* événement reset en écriture                */
  133.  
  134. #define MidiFileErrTrackClose    (-8)    /* piste fermée                            */
  135.  
  136. /*--------------------------------------------------------------------------*/
  137. /* quelques macros                                                            */
  138.  
  139. #ifdef __cplusplus
  140. inline Boolean isTrackOpen( midiFILE *fd) { return (fd->trkHeadOffset > 0); }
  141.  
  142. inline short smpte(MDF_Header *f)                    { return ((f)->time & 0x8000); }
  143. inline short frame_par_sec(MDF_Header *f)            { return (((f)->time & 0x8000) >> 8); }
  144. inline short ticks_par_frame(MDF_Header *f)            { return ((f)->time & 0xFF); }
  145. inline short ticks_par_quarterNote(MDF_Header *f)    { return (f)->time; }
  146. #else
  147. #define isTrackOpen(fd)    (fd->trkHeadOffset > 0)
  148.  
  149. #define smpte(f)                    ((f)->time & 0x8000)
  150. #define frame_par_sec(f)            (((f)->time & 0x8000) >> 8)
  151. #define ticks_par_frame(f)            ((f)->time & 0xFF)
  152. #define ticks_par_quarterNote(f)    (f)->time
  153. #endif
  154.  
  155.  
  156. /*--------------------------------------------------------------------------*/
  157. /* déclaration des fonctions                                                */
  158.  
  159. #ifdef __cplusplus
  160. extern "C" {
  161. #endif
  162.  
  163. const MDF_versions *MidiFileGetVersion(void);
  164.  
  165. /*--------------------------------- ouverture/fermeture d'un fichier ------*/
  166. midiFILE  *MidiFileOpen( const char *filename, short mode);
  167. midiFILE  *MidiFileCreate( const char *filename, short format, short timeDef, short ticks);
  168. Boolean    MidiFileClose( register midiFILE *fd);
  169.  
  170. /*------------------------------------ gestion des pistes du fichier ------*/
  171. Boolean    MidiFileOpenTrack( midiFILE *fd);
  172. Boolean    MidiFileNewTrack( midiFILE *fd);
  173. Boolean    MidiFileCloseTrack( midiFILE *fd);
  174. Boolean    MidiFileChooseTrack( midiFILE *fd, short numPiste);
  175.  
  176. /*----------------------------------------- les fonctions de lecture ------*/
  177. MidiEvPtr  MidiFileReadEv( midiFILE *fd);
  178. MidiSeqPtr MidiFileReadTrack( midiFILE *fd);
  179.  
  180. /*----------------------------------------- les fonctions d'écriture ------*/
  181. Boolean    MidiFileWriteEv( midiFILE *fd, MidiEvPtr ev);
  182. Boolean    MidiFileWriteTrack( midiFILE *fd, MidiSeqPtr seq);
  183.  
  184. #ifdef __cplusplus
  185. }
  186. #endif
  187.  
  188. #endif
  189. /*********************************** fin ************************************/
  190.