--- /dev/null
+#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