added an old version of mikmod for dos
[dosdemo] / libs / oldmik / src / mikmod.h
diff --git a/libs/oldmik/src/mikmod.h b/libs/oldmik/src/mikmod.h
new file mode 100644 (file)
index 0000000..0111ccb
--- /dev/null
@@ -0,0 +1,580 @@
+#ifndef MIKMOD_H\r
+#define MIKMOD_H\r
+\r
+#include <stdio.h>\r
+#include "mtypes.h"                    /* include atomic mikmod types */\r
+\r
+\r
+#define mikbanner \\r
+"=======================================================================\n" \\r
+"MIKMOD v2.10 - Portable version -  Programmed by MikMak of HaRDCoDE '95\n" \\r
+"=======================================================================\n" \\r
+"This program is SHAREWARE - Read MIKMOD.TXT for more info\n" \\r
+"E-Mail : mikmak@stack.urc.tue.nl\n"\r
+\r
+\r
+/*\r
+       error variables:\r
+       ===============\r
+*/\r
+\r
+extern char *ERROR_ALLOC_STRUCT;\r
+extern char *ERROR_LOADING_PATTERN;\r
+extern char *ERROR_LOADING_TRACK;\r
+extern char *ERROR_LOADING_HEADER;\r
+extern char *ERROR_NOT_A_MODULE;\r
+extern char *ERROR_LOADING_SAMPLEINFO;\r
+extern char *ERROR_OUT_OF_HANDLES;\r
+extern char *ERROR_SAMPLE_TOO_BIG;\r
+extern char *myerr;\r
+\r
+\r
+\r
+#define _mm_rewind(x) _mm_fseek(x,0,SEEK_SET)\r
+int  _mm_fseek(FILE *stream,long offset,int whence);\r
+void _mm_setiobase(long iobase);\r
+long _mm_ftell(FILE *stream);\r
+\r
+\r
+extern SBYTE  _mm_read_SBYTE   (FILE *fp);\r
+extern UBYTE _mm_read_UBYTE  (FILE *fp);\r
+\r
+extern SWORD  _mm_read_M_SWORD (FILE *fp);\r
+extern SWORD  _mm_read_I_SWORD (FILE *fp);\r
+\r
+extern UWORD _mm_read_M_UWORD(FILE *fp);\r
+extern UWORD _mm_read_I_UWORD(FILE *fp);\r
+\r
+extern SLONG  _mm_read_M_SLONG (FILE *fp);\r
+extern SLONG  _mm_read_I_SLONG (FILE *fp);\r
+\r
+extern ULONG _mm_read_M_ULONG(FILE *fp);\r
+extern ULONG _mm_read_I_ULONG(FILE *fp);\r
+\r
+extern int _mm_read_str(char *str, int size, FILE *fp);\r
+\r
+extern int _mm_read_SBYTES    (SBYTE  *buffer, int number, FILE *fp);\r
+extern int _mm_read_UBYTES   (UBYTE *buffer, int number, FILE *fp);\r
+\r
+extern int _mm_read_M_SWORDS  (SWORD  *buffer, int number, FILE *fp);\r
+extern int _mm_read_I_SWORDS  (SWORD  *buffer, int number, FILE *fp);\r
+\r
+extern int _mm_read_M_UWORDS (UWORD *buffer, int number, FILE *fp);\r
+extern int _mm_read_I_UWORDS (UWORD *buffer, int number, FILE *fp);\r
+\r
+extern int _mm_read_M_SLONGS  (SLONG  *buffer, int number, FILE *fp);\r
+extern int _mm_read_I_SLONGS  (SLONG  *buffer, int number, FILE *fp);\r
+\r
+extern int _mm_read_M_ULONGS (ULONG *buffer, int number, FILE *fp);\r
+extern int _mm_read_I_ULONGS (ULONG *buffer, int number, FILE *fp);\r
+\r
+\r
+extern void _mm_write_SBYTE            (SBYTE data,FILE *fp);\r
+extern void _mm_write_UBYTE    (UBYTE data,FILE *fp);\r
+\r
+extern void _mm_write_M_SWORD  (SWORD data,FILE *fp);\r
+extern void _mm_write_I_SWORD  (SWORD data,FILE *fp);\r
+\r
+extern void _mm_write_M_UWORD  (UWORD data,FILE *fp);\r
+extern void _mm_write_I_UWORD  (UWORD data,FILE *fp);\r
+\r
+extern void _mm_write_M_SLONG  (SLONG data,FILE *fp);\r
+extern void _mm_write_I_SLONG  (SLONG data,FILE *fp);\r
+\r
+extern void _mm_write_M_ULONG  (ULONG data,FILE *fp);\r
+extern void _mm_write_I_ULONG  (ULONG data,FILE *fp);\r
+\r
+extern void _mm_write_SBYTES           (SBYTE *data,  int number,FILE *fp);\r
+extern void _mm_write_UBYTES   (UBYTE *data, int number,FILE *fp);\r
+\r
+extern void _mm_write_M_SWORDS (SWORD *data,  int number,FILE *fp);\r
+extern void _mm_write_I_SWORDS (SWORD *data,  int number,FILE *fp);\r
+\r
+extern void _mm_write_M_UWORDS (UWORD *data, int number,FILE *fp);\r
+extern void _mm_write_I_UWORDS (UWORD *data, int number,FILE *fp);\r
+\r
+extern void _mm_write_M_SLONGS (SLONG *data,  int number,FILE *fp);\r
+extern void _mm_write_I_SLONGS (SLONG *data,  int number,FILE *fp);\r
+\r
+extern void _mm_write_M_ULONGS (ULONG *data, int number,FILE *fp);\r
+extern void _mm_write_I_ULONGS (ULONG *data, int number,FILE *fp);\r
+\r
+\r
+/**************************************************************************\r
+****** Unitrack stuff: ****************************************************\r
+**************************************************************************/\r
+\r
+/*\r
+       prototypes:\r
+*/\r
+\r
+void   UniSetRow(UBYTE *t);\r
+UBYTE  UniGetByte(void);\r
+UBYTE  *UniFindRow(UBYTE *t,UWORD row);\r
+void           UniReset(void);\r
+void           UniWrite(UBYTE data);\r
+void           UniNewline(void);\r
+void   UniInstrument(UBYTE ins);\r
+void   UniNote(UBYTE note);\r
+void   UniPTEffect(UBYTE eff,UBYTE dat);\r
+UBYTE  *UniDup(void);\r
+void   UniSkipOpcode(UBYTE op);\r
+BOOL   UniInit(void);\r
+void   UniCleanup(void);\r
+UWORD   TrkLen(UBYTE *t);\r
+BOOL    MyCmp(UBYTE *a,UBYTE *b,UWORD l);\r
+\r
+/*\r
+       all known effects:\r
+*/\r
+\r
+enum {\r
+               UNI_NOTE=1,\r
+               UNI_INSTRUMENT,\r
+               UNI_PTEFFECT0,\r
+               UNI_PTEFFECT1,\r
+               UNI_PTEFFECT2,\r
+               UNI_PTEFFECT3,\r
+               UNI_PTEFFECT4,\r
+               UNI_PTEFFECT5,\r
+               UNI_PTEFFECT6,\r
+               UNI_PTEFFECT7,\r
+               UNI_PTEFFECT8,\r
+               UNI_PTEFFECT9,\r
+               UNI_PTEFFECTA,\r
+               UNI_PTEFFECTB,\r
+               UNI_PTEFFECTC,\r
+               UNI_PTEFFECTD,\r
+               UNI_PTEFFECTE,\r
+               UNI_PTEFFECTF,\r
+               UNI_S3MEFFECTA,\r
+               UNI_S3MEFFECTD,\r
+               UNI_S3MEFFECTE,\r
+               UNI_S3MEFFECTF,\r
+               UNI_S3MEFFECTI,\r
+               UNI_S3MEFFECTQ,\r
+               UNI_S3MEFFECTT,\r
+               UNI_XMEFFECTA,\r
+                UNI_XMEFFECTG,\r
+                UNI_XMEFFECTH,\r
+               UNI_XMEFFECTP\r
+};\r
+\r
+\r
+/**************************************************************************\r
+****** mikmod types: ******************************************************\r
+**************************************************************************/\r
+\r
+\r
+/*\r
+       Sample format flags:\r
+*/\r
+\r
+#define SF_16BITS       1\r
+#define SF_SIGNED      2\r
+#define SF_DELTA        4\r
+#define SF_BIG_ENDIAN  8\r
+#define SF_LOOP         16\r
+#define SF_BIDI         32\r
+#define SF_OWNPAN       64\r
+#define SF_REVERSE             128\r
+\r
+\r
+/*\r
+       Envelope flags:\r
+*/\r
+\r
+#define EF_ON           1\r
+#define EF_SUSTAIN      2\r
+#define EF_LOOP         4\r
+\r
+\r
+/*\r
+       Unimod flags\r
+*/\r
+\r
+#define UF_XMPERIODS    1               /* if set use XM periods/finetuning */\r
+#define UF_LINEAR       2               /* if set use LINEAR periods */\r
+\r
+\r
+typedef struct ENVPT{\r
+       SWORD pos;\r
+       SWORD val;\r
+} ENVPT;\r
+\r
+\r
+typedef struct SAMPLE{\r
+       UWORD c2spd;            /* finetune frequency */\r
+       SBYTE transpose;        /* transpose value */\r
+       UBYTE volume;           /* volume 0-64 */\r
+       UBYTE panning;          /* panning */\r
+       ULONG length;           /* length of sample (in samples!) */\r
+       ULONG loopstart;        /* repeat position (relative to start, in samples) */\r
+       ULONG loopend;          /* repeat end */\r
+       UWORD flags;            /* sample format */\r
+       ULONG seekpos;                  /* seek position in file */\r
+       char *samplename;       /* name of the sample */\r
+       SWORD handle;           /* sample handle */\r
+} SAMPLE;\r
+\r
+\r
+typedef struct INSTRUMENT{\r
+       UBYTE numsmp;\r
+       UBYTE samplenumber[96];\r
+\r
+       UBYTE volflg;           /* bit 0: on 1: sustain 2: loop */\r
+       UBYTE volpts;\r
+       UBYTE volsus;\r
+       UBYTE volbeg;\r
+       UBYTE volend;\r
+       ENVPT volenv[12];\r
+\r
+       UBYTE panflg;           /* bit 0: on 1: sustain 2: loop */\r
+       UBYTE panpts;\r
+       UBYTE pansus;\r
+       UBYTE panbeg;\r
+       UBYTE panend;\r
+       ENVPT panenv[12];\r
+\r
+       UBYTE vibtype;\r
+       UBYTE vibsweep;\r
+       UBYTE vibdepth;\r
+       UBYTE vibrate;\r
+\r
+       UWORD volfade;\r
+       char  *insname;\r
+       SAMPLE *samples;\r
+} INSTRUMENT;\r
+\r
+\r
+/*\r
+       MikMod UNImod types:\r
+       ====================\r
+*/\r
+\r
+typedef struct UNIMOD{\r
+       UBYTE           numchn;                 /* number of channels */\r
+       UWORD       numpos;         /* number of positions in this song */\r
+       UWORD           reppos;                 /* restart position */\r
+       UWORD       numpat;         /* number of patterns in this song */\r
+       UWORD       numtrk;         /* number of tracks */\r
+       UWORD       numins;         /* number of samples */\r
+       UBYTE       initspeed;      /* */\r
+       UBYTE       inittempo;      /* */\r
+       UBYTE       positions[256]; /* all positions */\r
+       UBYTE       panning[32];        /* 32 panning positions */\r
+       UBYTE       flags;          /* */\r
+       char       *songname;       /* name of the song */\r
+       char       *modtype;        /* string type of module */\r
+       char       *comment;        /* module comments */\r
+       INSTRUMENT *instruments;    /* all samples */\r
+       UWORD      *patterns;       /* array of PATTERN */\r
+       UWORD      *pattrows;       /* array of number of rows for each pattern */\r
+       UBYTE     **tracks;         /* array of pointers to tracks */\r
+} UNIMOD;\r
+\r
+\r
+/**************************************************************************\r
+****** Loader stuff: ******************************************************\r
+**************************************************************************/\r
+\r
+/*\r
+       loader structure:\r
+*/\r
+\r
+typedef struct LOADER{\r
+       struct LOADER *next;\r
+       char    *type;\r
+       char    *version;\r
+       BOOL    (*Init)(void);\r
+       BOOL    (*Test)(void);\r
+       BOOL    (*Load)(void);\r
+       void    (*Cleanup)(void);\r
+} LOADER;\r
+\r
+\r
+/*\r
+       public loader variables:\r
+*/\r
+\r
+extern UNIMOD of;\r
+extern FILE *modfp;\r
+extern UWORD finetune[16];\r
+\r
+\r
+/*\r
+       main loader prototypes:\r
+*/\r
+\r
+void   ML_InfoLoader(void);\r
+void   ML_RegisterLoader(LOADER *ldr);\r
+UNIMOD *ML_LoadFP(FILE *fp);\r
+UNIMOD *ML_LoadFN(char *filename);\r
+void   ML_Free(UNIMOD *mf);\r
+\r
+\r
+/*\r
+       other loader prototypes: (used by the loader modules)\r
+*/\r
+\r
+BOOL   InitTracks(void);\r
+void   AddTrack(UBYTE *tr);\r
+BOOL   ReadComment(UWORD len);\r
+BOOL   AllocPatterns(void);\r
+BOOL   AllocTracks(void);\r
+BOOL   AllocInstruments(void);\r
+BOOL   AllocSamples(INSTRUMENT *i);\r
+char    *DupStr(char *s,UWORD len);\r
+void   *MyMalloc(size_t size);\r
+void   *MyCalloc(size_t nitems,size_t size);\r
+\r
+\r
+/*\r
+       Declare external loaders:\r
+*/\r
+extern LOADER load_uni;\r
+extern LOADER load_mod;\r
+extern LOADER load_m15;\r
+extern LOADER load_mtm;\r
+extern LOADER load_s3m;\r
+extern LOADER load_stm;\r
+extern LOADER load_ult;\r
+extern LOADER load_xm;\r
+\r
+\r
+/**************************************************************************\r
+****** Wavload stuff: *****************************************************\r
+**************************************************************************/\r
+\r
+SAMPLE *MW_LoadWavFP(FILE *fp);\r
+SAMPLE *MW_LoadWavFN(char *filename);\r
+void MW_FreeWav(SAMPLE *si);\r
+\r
+\r
+/**************************************************************************\r
+****** Driver stuff: ******************************************************\r
+**************************************************************************/\r
+\r
+/*\r
+       max. number of handles a driver has to provide. (not strict)\r
+*/\r
+\r
+#define MAXSAMPLEHANDLES 128\r
+\r
+\r
+/*\r
+       possible mixing mode bits:\r
+*/\r
+\r
+#define DMODE_STEREO    1\r
+#define DMODE_16BITS    2\r
+#define DMODE_INTERP   4\r
+\r
+\r
+/*\r
+       driver structure:\r
+*/\r
+\r
+typedef struct DRIVER{\r
+       struct DRIVER *next;\r
+       char    *Name;\r
+       char    *Version;\r
+       BOOL    (*IsPresent)            (void);\r
+       SWORD   (*SampleLoad)           (FILE *fp,ULONG size,ULONG reppos,ULONG repend,UWORD flags);\r
+       void    (*SampleUnLoad)         (SWORD handle);\r
+       BOOL    (*Init)                 (void);\r
+       void    (*Exit)                 (void);\r
+       void    (*PlayStart)            (void);\r
+       void    (*PlayStop)             (void);\r
+       void    (*Update)               (void);\r
+       void    (*VoiceSetVolume)               (UBYTE voice,UBYTE vol);\r
+       void    (*VoiceSetFrequency)    (UBYTE voice,ULONG frq);\r
+       void    (*VoiceSetPanning)              (UBYTE voice,UBYTE pan);\r
+       void    (*VoicePlay)                    (UBYTE voice,SWORD handle,ULONG start,ULONG size,ULONG reppos,ULONG repend,UWORD flags);\r
+} DRIVER;\r
+\r
+\r
+/*\r
+       public driver variables:\r
+*/\r
+\r
+extern DRIVER *md_driver;\r
+extern UWORD md_device;\r
+extern UWORD md_mixfreq;\r
+extern UWORD md_dmabufsize;\r
+extern UWORD md_mode;\r
+extern UBYTE md_numchn;\r
+extern UBYTE md_bpm;\r
+extern void (*md_player)(void);\r
+\r
+/*\r
+       main driver prototypes:\r
+*/\r
+\r
+void MD_InfoDriver(void);\r
+void MD_RegisterDriver(DRIVER *drv);\r
+void MD_RegisterPlayer(void (*plr)(void));\r
+SWORD MD_SampleLoad(FILE *fp,ULONG size,ULONG reppos,ULONG repend,UWORD flags);\r
+void MD_SampleUnLoad(SWORD handle);\r
+BOOL MD_Init(void);\r
+void MD_Exit(void);\r
+void MD_PlayStart(void);\r
+void MD_PlayStop(void);\r
+void MD_SetBPM(UBYTE bpm);\r
+void MD_Update(void);\r
+void MD_VoiceSetVolume(UBYTE voice,UBYTE ivol);\r
+void MD_VoiceSetFrequency(UBYTE voice,ULONG frq);\r
+void MD_VoiceSetPanning(UBYTE voice,ULONG pan);\r
+void MD_VoicePlay(UBYTE voice,SWORD handle,ULONG start,ULONG size,ULONG reppos,ULONG repend,UWORD flags);\r
+void SL_Init(FILE *fp,UWORD infmt,UWORD outfmt);\r
+void SL_Load(void *buffer,ULONG length);\r
+\r
+/*\r
+       Declare external drivers:\r
+*/\r
+\r
+extern DRIVER drv_gus;         /* gravis ultrasound driver */\r
+extern DRIVER drv_sb;          /* soundblaster DSP driver */\r
+extern DRIVER drv_ss;          /* ensoniq soundscape driver */\r
+extern DRIVER drv_nos;         /* nosound driver */\r
+extern DRIVER drv_raw;         /* file output driver */\r
+extern DRIVER drv_w95;         /* win95 driver */\r
+extern DRIVER drv_awe;         /* experimental SB-AWE driver */\r
+extern DRIVER drv_vox;         /* linux voxware driver */\r
+extern DRIVER drv_af;       /* Dec Alpha AudioFile driver */\r
+extern DRIVER drv_sun;      /* Sun driver */\r
+extern DRIVER drv_os2;      /* Os2 driver */\r
+extern DRIVER drv_tim;          /* timing driver */\r
+\r
+/**************************************************************************\r
+****** Player stuff: ******************************************************\r
+**************************************************************************/\r
+\r
+\r
+typedef struct ENVPR{\r
+       UBYTE flg;          /* envelope flag */\r
+       UBYTE pts;                      /* number of envelope points */\r
+       UBYTE sus;                      /* envelope sustain index */\r
+       UBYTE beg;                      /* envelope loop begin */\r
+       UBYTE end;                      /* envelope loop end */\r
+       SWORD p;                        /* current envelope counter */\r
+       UWORD a;                        /* envelope index a */\r
+       UWORD b;                        /* envelope index b */\r
+       ENVPT *env;                     /* envelope points */\r
+} ENVPR;\r
+\r
+\r
+typedef struct AUDTMP{\r
+       INSTRUMENT      *i;\r
+       SAMPLE      *s;\r
+\r
+        UWORD fadevol;          /* fading volume */\r
+\r
+       ENVPR venv;\r
+       ENVPR penv;\r
+\r
+       UBYTE keyon;            /* if true=key is pressed. */\r
+       UBYTE kick;                     /* if true=sample has to be restarted */\r
+       UBYTE sample;           /* which sample number (0-31) */\r
+       SWORD handle;           /* which sample-handle */\r
+\r
+       ULONG start;            /* The start byte index in the sample */\r
+\r
+       UBYTE panning;          /* panning position */\r
+       UBYTE pansspd;          /* panslide speed */\r
+\r
+       SBYTE volume;           /* amiga volume (0 t/m 64) to play the sample at */\r
+       UWORD period;           /* period to play the sample at */\r
+\r
+       /* You should not have to use the values\r
+          below in the player routine */\r
+\r
+       SBYTE transpose;\r
+\r
+       UBYTE note;                     /* */\r
+\r
+       SWORD ownper;\r
+       SWORD ownvol;\r
+\r
+       UBYTE *row;                     /* row currently playing on this channel */\r
+\r
+       SBYTE retrig;           /* retrig value (0 means don't retrig) */\r
+       UWORD c2spd;            /* what finetune to use */\r
+\r
+       SBYTE tmpvolume;        /* tmp volume */\r
+\r
+       UWORD tmpperiod;        /* tmp period */\r
+       UWORD wantedperiod;     /* period to slide to (with effect 3 or 5) */\r
+\r
+       UWORD slidespeed;       /* */\r
+       UWORD portspeed;        /* noteslide speed (toneportamento) */\r
+\r
+       UBYTE s3mtremor;        /* s3m tremor (effect I) counter */\r
+       UBYTE s3mtronof;        /* s3m tremor ontime/offtime */\r
+\r
+       UBYTE s3mvolslide;      /* last used volslide */\r
+\r
+       UBYTE s3mrtgspeed;      /* last used retrig speed */\r
+       UBYTE s3mrtgslide;      /* last used retrig slide */\r
+\r
+       UBYTE glissando;        /* glissando (0 means off) */\r
+       UBYTE wavecontrol;      /* */\r
+\r
+       SBYTE vibpos;           /* current vibrato position */\r
+       UBYTE vibspd;           /* "" speed */\r
+       UBYTE vibdepth;         /* "" depth */\r
+\r
+       SBYTE trmpos;           /* current tremolo position */\r
+       UBYTE trmspd;           /* "" speed */\r
+       UBYTE trmdepth;         /* "" depth */\r
+\r
+       UWORD soffset;          /* last used sample-offset (effect 9) */\r
+} AUDTMP;\r
+\r
+\r
+extern AUDTMP mp_audio[32];            /* max eight channels */\r
+extern UBYTE  mp_bpm;                  /* beats-per-minute speed */\r
+extern UWORD  mp_patpos;               /* current row number (0-63) */\r
+extern SWORD  mp_sngpos;               /* current song position */\r
+extern UWORD  mp_sngspd;               /* current songspeed */\r
+\r
+extern BOOL  mp_loop;\r
+extern BOOL  mp_panning;\r
+extern BOOL  mp_extspd;\r
+extern UBYTE mp_volume;\r
+\r
+/*\r
+       player prototypes:\r
+*/\r
+\r
+int     MP_Ready(void);\r
+void MP_NextPosition(void);\r
+void MP_PrevPosition(void);\r
+void MP_SetPosition(UWORD pos);\r
+void MP_HandleTick(void);\r
+void MP_Init(UNIMOD *m);\r
+\r
+\r
+/**************************************************************************\r
+****** Virtual channel stuff: *********************************************\r
+**************************************************************************/\r
+\r
+BOOL    VC_Init(void);\r
+void    VC_Exit(void);\r
+\r
+void    VC_PlayStart(void);\r
+void    VC_PlayStop(void);\r
+\r
+SWORD   VC_SampleLoad(FILE *fp,ULONG size,ULONG reppos,ULONG repend,UWORD flags);\r
+void    VC_SampleUnload(SWORD handle);\r
+\r
+void    VC_WriteSamples(SBYTE *buf,UWORD todo);\r
+UWORD   VC_WriteBytes(SBYTE *buf,UWORD todo);\r
+void    VC_SilenceBytes(SBYTE *buf,UWORD todo);\r
+\r
+void   VC_VoiceSetVolume(UBYTE voice,UBYTE vol);\r
+void   VC_VoiceSetFrequency(UBYTE voice,ULONG frq);\r
+void   VC_VoiceSetPanning(UBYTE voice,UBYTE pan);\r
+void   VC_VoicePlay(UBYTE voice,SWORD handle,ULONG start,ULONG size,ULONG reppos,ULONG repend,UWORD flags);\r
+\r
+#endif\r