home *** CD-ROM | disk | FTP | other *** search
- /*
- * Midifile.h
- * Midi Files version 1.00
- * define et structures des données
- *
- * GRAME
- * 25/08/89 D. Fober : Version sur ATARI
- * 01/10/91 GRAME B. MERLIER : transcription sur MacIntosh
- * Janvier 92 refonte et redéfinition des routines de base D.F.
- * Mars 92 intégration des événements MidiFile dans MidiShare D.F.
- * Avril 92 ajout des fonction de lecture/écriture d'un événement
- * ouverture, fermeture et création de piste D.F.
- */
-
- #ifndef __MIDIFILE_H__
- #define __MIDIFILE_H__
-
- #include <midishare.h>
- #include <stdio.h>
-
-
- /*--------------------------------------------------------------------------*/
- extern int MidiFile_errno; /* d'usage similaire à errno */
- /* à ne consulter qu'en cas d'erreur, s'il */
- /* le code vaut MidiFileNoErr, se référer */
- /* à errno */
-
- #define isMidiFileError( fd) (MidiFile_errno!=MidiFileNoErr || ferror(fd->fd) || feof(fd->fd))
-
- /*--------------------------------------------------------------------------*/
- /* les types de fichiers implémentés */
-
- enum { midifile0= 0, midifile1, midifile2};
-
-
- /*--------------------------------------------------------------------------*/
- /* les modes d'ouverture des fichiers existants */
- #define MidiFileRead 0 /* lecture d'un fichier */
- #define MidiFileAppend 1 /* ajout à un fichier existant */
-
-
- /*--------------------------------------------------------------------------*/
- /* définition du temps */
-
- #define TicksPerQuarterNote 0
- #define Smpte24 24
- #define Smpte25 25
- #define Smpte29 29
- #define Smpte30 30
-
-
- /*--------------------------------------------------------------------------*/
- /* les types des méta événements */
- #define META 0xFF /* code entête d'un méta-evt */
-
- #define MDF_NumSeq 0 /* numéro de séquence */
- #define MDF_Texte 1 /* événement texte */
- #define MDF_Copyright 2 /* message copyright */
- #define MDF_SeqName 3 /* nom de séquence ou de piste */
- #define MDF_InstrName 4 /* nom d'instrument */
- #define MDF_Lyric 5 /* paroles déstinées à etre chantées */
- #define MDF_Mark 6 /* marqueur */
- #define MDF_CuePt 7 /* cue point */
- #define MDF_ChanPref 0x20 /* Midi Channel Prefix */
- #define MDF_EndTrk 0x2F /* fin de piste */
- #define MDF_Tempo 0x51 /* changement de tempo */
- #define MDF_Offset 0x54 /* offset smpte */
- #define MDF_Meas 0x58 /* indication de mesure */
- #define MDF_Ton 0x59 /* signature tonale */
- #define MDF_Extra 0x7F /* méta evt spécifique à un séquenceur */
-
- /* longueurs des différents méta événements */
- #define MDF_NumSeqLen 2
- #define MDF_ChanPrefLen 1
- #define MDF_EndTrkLen 0
- #define MDF_TempoLen 3
- #define MDF_OffsetLen 5
- #define MDF_MeasLen 4
- #define MDF_TonLen 2
-
- /*--------------------------------------------------------------------------*/
- /* les structures de données */
- /*--------------------------------------------------------------------------*/
-
- typedef struct MDF_Header{ /* les données du paquet d'en_tete */
- char id[4]; /* id de l'en tete */
- long len; /* longueur des données ( = 6 ) */
- short format; /* le format du fichier */
- unsigned short ntrks; /* le nbre de pistes */
- short time; /* représentation du temps */
- }MDF_Header;
-
-
- typedef struct MDF_Trk{ /* les données d'un paquet de piste */
- char id[4]; /* id de l'en tete */
- unsigned long len; /* longueur des données */
- }MDF_Trk;
-
- typedef struct midiFILE{ /* descripteur d'un fichier MidiFile */
- short format; /* format du fichier */
- unsigned short ntrks; /* le nbre de pistes */
- short time; /* représentation du temps : */
- /* si temps mesuré : nbre de pas d'horloge par noire */
- /* si temps smpte : b. 15 = 1 */
- /* b.8-14 = nbre frames par seconde */
- /* b.0-7 = nbre de pas d'horloge par frame */
- FILE *fd; /* descripteur standard du fichier */
- fpos_t trkHeadOffset; /* offset de l'en tête de piste */
- /* null si la piste n'est pas ouverte */
- long _cnt; /* compteur pour fin de piste */
- MidiSeqPtr keyOff; /* seq des keyOff provenant d'evts note */
- long curDate; /* la date courante */
- Boolean mode; /* 0/1 : lecture/écriture */
- }midiFILE;
-
- typedef struct MDF_versions{
- short src; /* version des sources */
- short MidiFile; /* version du standard MidiFile */
- }MDF_versions;
-
-
- /*--------------------------------------------------------------------------*/
- /* les codes d'erreur de lecture d'un fichier */
-
- #define MidiFileNoErr 0 /* tout s'est bien passé */
- #define MidiFileErrFrmt (-1) /* erreur de format interne des informations*/
- #define MidiFileErrEvs (-2) /* plus d'événement disponible */
- #define MidiFileErrNoTrack (-3) /* piste inexistante */
- #define MidiFileErrAdd0 (-4) /* essai d'ajout à un fichier MIDI format 0 */
- #define MidiFileErrMode (-5) /* mode d'ouverture du fichier incorrect */
- #define MidiFileErrUnknow (-6) /* événement de type inconnu */
- #define MidiFileErrReset (-7) /* événement reset en écriture */
-
- #define MidiFileErrTrackClose (-8) /* piste fermée */
-
- /*--------------------------------------------------------------------------*/
- /* quelques macros */
-
- #ifdef __cplusplus
- inline Boolean isTrackOpen( midiFILE *fd) { return (fd->trkHeadOffset > 0); }
-
- inline short smpte(MDF_Header *f) { return ((f)->time & 0x8000); }
- inline short frame_par_sec(MDF_Header *f) { return (((f)->time & 0x8000) >> 8); }
- inline short ticks_par_frame(MDF_Header *f) { return ((f)->time & 0xFF); }
- inline short ticks_par_quarterNote(MDF_Header *f) { return (f)->time; }
- #else
- #define isTrackOpen(fd) (fd->trkHeadOffset > 0)
-
- #define smpte(f) ((f)->time & 0x8000)
- #define frame_par_sec(f) (((f)->time & 0x8000) >> 8)
- #define ticks_par_frame(f) ((f)->time & 0xFF)
- #define ticks_par_quarterNote(f) (f)->time
- #endif
-
-
- /*--------------------------------------------------------------------------*/
- /* déclaration des fonctions */
-
- #ifdef __cplusplus
- extern "C" {
- #endif
-
- const MDF_versions *MidiFileGetVersion(void);
-
- /*--------------------------------- ouverture/fermeture d'un fichier ------*/
- midiFILE *MidiFileOpen( const char *filename, short mode);
- midiFILE *MidiFileCreate( const char *filename, short format, short timeDef, short ticks);
- Boolean MidiFileClose( register midiFILE *fd);
-
- /*------------------------------------ gestion des pistes du fichier ------*/
- Boolean MidiFileOpenTrack( midiFILE *fd);
- Boolean MidiFileNewTrack( midiFILE *fd);
- Boolean MidiFileCloseTrack( midiFILE *fd);
- Boolean MidiFileChooseTrack( midiFILE *fd, short numPiste);
-
- /*----------------------------------------- les fonctions de lecture ------*/
- MidiEvPtr MidiFileReadEv( midiFILE *fd);
- MidiSeqPtr MidiFileReadTrack( midiFILE *fd);
-
- /*----------------------------------------- les fonctions d'écriture ------*/
- Boolean MidiFileWriteEv( midiFILE *fd, MidiEvPtr ev);
- Boolean MidiFileWriteTrack( midiFILE *fd, MidiSeqPtr seq);
-
- #ifdef __cplusplus
- }
- #endif
-
- #endif
- /*********************************** fin ************************************/
-