added an old version of mikmod for dos
[dosdemo] / libs / oldmik / src / mikmod.h
1 #ifndef MIKMOD_H\r
2 #define MIKMOD_H\r
3 \r
4 #include <stdio.h>\r
5 #include "mtypes.h"                     /* include atomic mikmod types */\r
6 \r
7 \r
8 #define mikbanner \\r
9 "=======================================================================\n" \\r
10 "MIKMOD v2.10 - Portable version -  Programmed by MikMak of HaRDCoDE '95\n" \\r
11 "=======================================================================\n" \\r
12 "This program is SHAREWARE - Read MIKMOD.TXT for more info\n" \\r
13 "E-Mail : mikmak@stack.urc.tue.nl\n"\r
14 \r
15 \r
16 /*\r
17         error variables:\r
18         ===============\r
19 */\r
20 \r
21 extern char *ERROR_ALLOC_STRUCT;\r
22 extern char *ERROR_LOADING_PATTERN;\r
23 extern char *ERROR_LOADING_TRACK;\r
24 extern char *ERROR_LOADING_HEADER;\r
25 extern char *ERROR_NOT_A_MODULE;\r
26 extern char *ERROR_LOADING_SAMPLEINFO;\r
27 extern char *ERROR_OUT_OF_HANDLES;\r
28 extern char *ERROR_SAMPLE_TOO_BIG;\r
29 extern char *myerr;\r
30 \r
31 \r
32 \r
33 #define _mm_rewind(x) _mm_fseek(x,0,SEEK_SET)\r
34 int  _mm_fseek(FILE *stream,long offset,int whence);\r
35 void _mm_setiobase(long iobase);\r
36 long _mm_ftell(FILE *stream);\r
37 \r
38 \r
39 extern SBYTE  _mm_read_SBYTE   (FILE *fp);\r
40 extern UBYTE _mm_read_UBYTE  (FILE *fp);\r
41 \r
42 extern SWORD  _mm_read_M_SWORD (FILE *fp);\r
43 extern SWORD  _mm_read_I_SWORD (FILE *fp);\r
44 \r
45 extern UWORD _mm_read_M_UWORD(FILE *fp);\r
46 extern UWORD _mm_read_I_UWORD(FILE *fp);\r
47 \r
48 extern SLONG  _mm_read_M_SLONG (FILE *fp);\r
49 extern SLONG  _mm_read_I_SLONG (FILE *fp);\r
50 \r
51 extern ULONG _mm_read_M_ULONG(FILE *fp);\r
52 extern ULONG _mm_read_I_ULONG(FILE *fp);\r
53 \r
54 extern int _mm_read_str(char *str, int size, FILE *fp);\r
55 \r
56 extern int _mm_read_SBYTES    (SBYTE  *buffer, int number, FILE *fp);\r
57 extern int _mm_read_UBYTES   (UBYTE *buffer, int number, FILE *fp);\r
58 \r
59 extern int _mm_read_M_SWORDS  (SWORD  *buffer, int number, FILE *fp);\r
60 extern int _mm_read_I_SWORDS  (SWORD  *buffer, int number, FILE *fp);\r
61 \r
62 extern int _mm_read_M_UWORDS (UWORD *buffer, int number, FILE *fp);\r
63 extern int _mm_read_I_UWORDS (UWORD *buffer, int number, FILE *fp);\r
64 \r
65 extern int _mm_read_M_SLONGS  (SLONG  *buffer, int number, FILE *fp);\r
66 extern int _mm_read_I_SLONGS  (SLONG  *buffer, int number, FILE *fp);\r
67 \r
68 extern int _mm_read_M_ULONGS (ULONG *buffer, int number, FILE *fp);\r
69 extern int _mm_read_I_ULONGS (ULONG *buffer, int number, FILE *fp);\r
70 \r
71 \r
72 extern void _mm_write_SBYTE             (SBYTE data,FILE *fp);\r
73 extern void _mm_write_UBYTE     (UBYTE data,FILE *fp);\r
74 \r
75 extern void _mm_write_M_SWORD   (SWORD data,FILE *fp);\r
76 extern void _mm_write_I_SWORD   (SWORD data,FILE *fp);\r
77 \r
78 extern void _mm_write_M_UWORD   (UWORD data,FILE *fp);\r
79 extern void _mm_write_I_UWORD   (UWORD data,FILE *fp);\r
80 \r
81 extern void _mm_write_M_SLONG   (SLONG data,FILE *fp);\r
82 extern void _mm_write_I_SLONG   (SLONG data,FILE *fp);\r
83 \r
84 extern void _mm_write_M_ULONG   (ULONG data,FILE *fp);\r
85 extern void _mm_write_I_ULONG   (ULONG data,FILE *fp);\r
86 \r
87 extern void _mm_write_SBYTES            (SBYTE *data,  int number,FILE *fp);\r
88 extern void _mm_write_UBYTES    (UBYTE *data, int number,FILE *fp);\r
89 \r
90 extern void _mm_write_M_SWORDS  (SWORD *data,  int number,FILE *fp);\r
91 extern void _mm_write_I_SWORDS  (SWORD *data,  int number,FILE *fp);\r
92 \r
93 extern void _mm_write_M_UWORDS  (UWORD *data, int number,FILE *fp);\r
94 extern void _mm_write_I_UWORDS  (UWORD *data, int number,FILE *fp);\r
95 \r
96 extern void _mm_write_M_SLONGS  (SLONG *data,  int number,FILE *fp);\r
97 extern void _mm_write_I_SLONGS  (SLONG *data,  int number,FILE *fp);\r
98 \r
99 extern void _mm_write_M_ULONGS  (ULONG *data, int number,FILE *fp);\r
100 extern void _mm_write_I_ULONGS  (ULONG *data, int number,FILE *fp);\r
101 \r
102 \r
103 /**************************************************************************\r
104 ****** Unitrack stuff: ****************************************************\r
105 **************************************************************************/\r
106 \r
107 /*\r
108         prototypes:\r
109 */\r
110 \r
111 void    UniSetRow(UBYTE *t);\r
112 UBYTE   UniGetByte(void);\r
113 UBYTE  *UniFindRow(UBYTE *t,UWORD row);\r
114 void    UniReset(void);\r
115 void    UniWrite(UBYTE data);\r
116 void    UniNewline(void);\r
117 void    UniInstrument(UBYTE ins);\r
118 void    UniNote(UBYTE note);\r
119 void    UniPTEffect(UBYTE eff,UBYTE dat);\r
120 UBYTE  *UniDup(void);\r
121 void    UniSkipOpcode(UBYTE op);\r
122 BOOL    UniInit(void);\r
123 void    UniCleanup(void);\r
124 UWORD   TrkLen(UBYTE *t);\r
125 BOOL    MyCmp(UBYTE *a,UBYTE *b,UWORD l);\r
126 \r
127 /*\r
128         all known effects:\r
129 */\r
130 \r
131 enum {\r
132                 UNI_NOTE=1,\r
133                 UNI_INSTRUMENT,\r
134                 UNI_PTEFFECT0,\r
135                 UNI_PTEFFECT1,\r
136                 UNI_PTEFFECT2,\r
137                 UNI_PTEFFECT3,\r
138                 UNI_PTEFFECT4,\r
139                 UNI_PTEFFECT5,\r
140                 UNI_PTEFFECT6,\r
141                 UNI_PTEFFECT7,\r
142                 UNI_PTEFFECT8,\r
143                 UNI_PTEFFECT9,\r
144                 UNI_PTEFFECTA,\r
145                 UNI_PTEFFECTB,\r
146                 UNI_PTEFFECTC,\r
147                 UNI_PTEFFECTD,\r
148                 UNI_PTEFFECTE,\r
149                 UNI_PTEFFECTF,\r
150                 UNI_S3MEFFECTA,\r
151                 UNI_S3MEFFECTD,\r
152                 UNI_S3MEFFECTE,\r
153                 UNI_S3MEFFECTF,\r
154                 UNI_S3MEFFECTI,\r
155                 UNI_S3MEFFECTQ,\r
156                 UNI_S3MEFFECTT,\r
157                 UNI_XMEFFECTA,\r
158                 UNI_XMEFFECTG,\r
159                 UNI_XMEFFECTH,\r
160                 UNI_XMEFFECTP\r
161 };\r
162 \r
163 \r
164 /**************************************************************************\r
165 ****** mikmod types: ******************************************************\r
166 **************************************************************************/\r
167 \r
168 \r
169 /*\r
170         Sample format flags:\r
171 */\r
172 \r
173 #define SF_16BITS       1\r
174 #define SF_SIGNED       2\r
175 #define SF_DELTA        4\r
176 #define SF_BIG_ENDIAN   8\r
177 #define SF_LOOP         16\r
178 #define SF_BIDI         32\r
179 #define SF_OWNPAN       64\r
180 #define SF_REVERSE              128\r
181 \r
182 \r
183 /*\r
184         Envelope flags:\r
185 */\r
186 \r
187 #define EF_ON           1\r
188 #define EF_SUSTAIN      2\r
189 #define EF_LOOP         4\r
190 \r
191 \r
192 /*\r
193         Unimod flags\r
194 */\r
195 \r
196 #define UF_XMPERIODS    1               /* if set use XM periods/finetuning */\r
197 #define UF_LINEAR       2               /* if set use LINEAR periods */\r
198 \r
199 \r
200 typedef struct ENVPT{\r
201         SWORD pos;\r
202         SWORD val;\r
203 } ENVPT;\r
204 \r
205 \r
206 typedef struct SAMPLE{\r
207         UWORD c2spd;            /* finetune frequency */\r
208         SBYTE transpose;        /* transpose value */\r
209         UBYTE volume;           /* volume 0-64 */\r
210         UBYTE panning;          /* panning */\r
211         ULONG length;           /* length of sample (in samples!) */\r
212         ULONG loopstart;        /* repeat position (relative to start, in samples) */\r
213         ULONG loopend;          /* repeat end */\r
214         UWORD flags;            /* sample format */\r
215         ULONG seekpos;                  /* seek position in file */\r
216         char *samplename;       /* name of the sample */\r
217         SWORD handle;           /* sample handle */\r
218 } SAMPLE;\r
219 \r
220 \r
221 typedef struct INSTRUMENT{\r
222         UBYTE numsmp;\r
223         UBYTE samplenumber[96];\r
224 \r
225         UBYTE volflg;           /* bit 0: on 1: sustain 2: loop */\r
226         UBYTE volpts;\r
227         UBYTE volsus;\r
228         UBYTE volbeg;\r
229         UBYTE volend;\r
230         ENVPT volenv[12];\r
231 \r
232         UBYTE panflg;           /* bit 0: on 1: sustain 2: loop */\r
233         UBYTE panpts;\r
234         UBYTE pansus;\r
235         UBYTE panbeg;\r
236         UBYTE panend;\r
237         ENVPT panenv[12];\r
238 \r
239         UBYTE vibtype;\r
240         UBYTE vibsweep;\r
241         UBYTE vibdepth;\r
242         UBYTE vibrate;\r
243 \r
244         UWORD volfade;\r
245         char  *insname;\r
246         SAMPLE *samples;\r
247 } INSTRUMENT;\r
248 \r
249 \r
250 /*\r
251         MikMod UNImod types:\r
252         ====================\r
253 */\r
254 \r
255 typedef struct UNIMOD{\r
256         UBYTE           numchn;                 /* number of channels */\r
257         UWORD       numpos;         /* number of positions in this song */\r
258         UWORD           reppos;                 /* restart position */\r
259         UWORD       numpat;         /* number of patterns in this song */\r
260         UWORD       numtrk;         /* number of tracks */\r
261         UWORD       numins;         /* number of samples */\r
262         UBYTE       initspeed;      /* */\r
263         UBYTE       inittempo;      /* */\r
264         UBYTE       positions[256]; /* all positions */\r
265         UBYTE       panning[32];        /* 32 panning positions */\r
266         UBYTE       flags;          /* */\r
267         char       *songname;       /* name of the song */\r
268         char       *modtype;        /* string type of module */\r
269         char       *comment;        /* module comments */\r
270         INSTRUMENT *instruments;    /* all samples */\r
271         UWORD      *patterns;       /* array of PATTERN */\r
272         UWORD      *pattrows;       /* array of number of rows for each pattern */\r
273         UBYTE     **tracks;         /* array of pointers to tracks */\r
274 } UNIMOD;\r
275 \r
276 \r
277 /**************************************************************************\r
278 ****** Loader stuff: ******************************************************\r
279 **************************************************************************/\r
280 \r
281 /*\r
282         loader structure:\r
283 */\r
284 \r
285 typedef struct LOADER{\r
286         struct LOADER *next;\r
287         char    *type;\r
288         char    *version;\r
289         BOOL    (*Init)(void);\r
290         BOOL    (*Test)(void);\r
291         BOOL    (*Load)(void);\r
292         void    (*Cleanup)(void);\r
293 } LOADER;\r
294 \r
295 \r
296 /*\r
297         public loader variables:\r
298 */\r
299 \r
300 extern UNIMOD of;\r
301 extern FILE *modfp;\r
302 extern UWORD finetune[16];\r
303 \r
304 \r
305 /*\r
306         main loader prototypes:\r
307 */\r
308 \r
309 void    ML_InfoLoader(void);\r
310 void    ML_RegisterLoader(LOADER *ldr);\r
311 UNIMOD  *ML_LoadFP(FILE *fp);\r
312 UNIMOD  *ML_LoadFN(char *filename);\r
313 void    ML_Free(UNIMOD *mf);\r
314 \r
315 \r
316 /*\r
317         other loader prototypes: (used by the loader modules)\r
318 */\r
319 \r
320 BOOL    InitTracks(void);\r
321 void    AddTrack(UBYTE *tr);\r
322 BOOL    ReadComment(UWORD len);\r
323 BOOL    AllocPatterns(void);\r
324 BOOL    AllocTracks(void);\r
325 BOOL    AllocInstruments(void);\r
326 BOOL    AllocSamples(INSTRUMENT *i);\r
327 char    *DupStr(char *s,UWORD len);\r
328 void    *MyMalloc(size_t size);\r
329 void    *MyCalloc(size_t nitems,size_t size);\r
330 \r
331 \r
332 /*\r
333         Declare external loaders:\r
334 */\r
335 extern LOADER load_uni;\r
336 extern LOADER load_mod;\r
337 extern LOADER load_m15;\r
338 extern LOADER load_mtm;\r
339 extern LOADER load_s3m;\r
340 extern LOADER load_stm;\r
341 extern LOADER load_ult;\r
342 extern LOADER load_xm;\r
343 \r
344 \r
345 /**************************************************************************\r
346 ****** Wavload stuff: *****************************************************\r
347 **************************************************************************/\r
348 \r
349 SAMPLE *MW_LoadWavFP(FILE *fp);\r
350 SAMPLE *MW_LoadWavFN(char *filename);\r
351 void MW_FreeWav(SAMPLE *si);\r
352 \r
353 \r
354 /**************************************************************************\r
355 ****** Driver stuff: ******************************************************\r
356 **************************************************************************/\r
357 \r
358 /*\r
359         max. number of handles a driver has to provide. (not strict)\r
360 */\r
361 \r
362 #define MAXSAMPLEHANDLES 128\r
363 \r
364 \r
365 /*\r
366         possible mixing mode bits:\r
367 */\r
368 \r
369 #define DMODE_STEREO    1\r
370 #define DMODE_16BITS    2\r
371 #define DMODE_INTERP    4\r
372 \r
373 \r
374 /*\r
375         driver structure:\r
376 */\r
377 \r
378 typedef struct DRIVER{\r
379         struct DRIVER *next;\r
380         char    *Name;\r
381         char    *Version;\r
382         BOOL    (*IsPresent)            (void);\r
383         SWORD   (*SampleLoad)           (FILE *fp,ULONG size,ULONG reppos,ULONG repend,UWORD flags);\r
384         void    (*SampleUnLoad)         (SWORD handle);\r
385         BOOL    (*Init)                 (void);\r
386         void    (*Exit)                 (void);\r
387         void    (*PlayStart)            (void);\r
388         void    (*PlayStop)             (void);\r
389         void    (*Update)               (void);\r
390         void    (*VoiceSetVolume)               (UBYTE voice,UBYTE vol);\r
391         void    (*VoiceSetFrequency)    (UBYTE voice,ULONG frq);\r
392         void    (*VoiceSetPanning)              (UBYTE voice,UBYTE pan);\r
393         void    (*VoicePlay)                    (UBYTE voice,SWORD handle,ULONG start,ULONG size,ULONG reppos,ULONG repend,UWORD flags);\r
394 } DRIVER;\r
395 \r
396 \r
397 /*\r
398         public driver variables:\r
399 */\r
400 \r
401 extern DRIVER *md_driver;\r
402 extern UWORD md_device;\r
403 extern UWORD md_mixfreq;\r
404 extern UWORD md_dmabufsize;\r
405 extern UWORD md_mode;\r
406 extern UBYTE md_numchn;\r
407 extern UBYTE md_bpm;\r
408 extern void (*md_player)(void);\r
409 \r
410 /*\r
411         main driver prototypes:\r
412 */\r
413 \r
414 void MD_InfoDriver(void);\r
415 void MD_RegisterDriver(DRIVER *drv);\r
416 void MD_RegisterPlayer(void (*plr)(void));\r
417 SWORD MD_SampleLoad(FILE *fp,ULONG size,ULONG reppos,ULONG repend,UWORD flags);\r
418 void MD_SampleUnLoad(SWORD handle);\r
419 BOOL MD_Init(void);\r
420 void MD_Exit(void);\r
421 void MD_PlayStart(void);\r
422 void MD_PlayStop(void);\r
423 void MD_SetBPM(UBYTE bpm);\r
424 void MD_Update(void);\r
425 void MD_VoiceSetVolume(UBYTE voice,UBYTE ivol);\r
426 void MD_VoiceSetFrequency(UBYTE voice,ULONG frq);\r
427 void MD_VoiceSetPanning(UBYTE voice,ULONG pan);\r
428 void MD_VoicePlay(UBYTE voice,SWORD handle,ULONG start,ULONG size,ULONG reppos,ULONG repend,UWORD flags);\r
429 void SL_Init(FILE *fp,UWORD infmt,UWORD outfmt);\r
430 void SL_Load(void *buffer,ULONG length);\r
431 \r
432 /*\r
433         Declare external drivers:\r
434 */\r
435 \r
436 extern DRIVER drv_gus;          /* gravis ultrasound driver */\r
437 extern DRIVER drv_sb;           /* soundblaster DSP driver */\r
438 extern DRIVER drv_ss;           /* ensoniq soundscape driver */\r
439 extern DRIVER drv_nos;          /* nosound driver */\r
440 extern DRIVER drv_raw;          /* file output driver */\r
441 extern DRIVER drv_w95;          /* win95 driver */\r
442 extern DRIVER drv_awe;          /* experimental SB-AWE driver */\r
443 extern DRIVER drv_vox;          /* linux voxware driver */\r
444 extern DRIVER drv_af;       /* Dec Alpha AudioFile driver */\r
445 extern DRIVER drv_sun;      /* Sun driver */\r
446 extern DRIVER drv_os2;      /* Os2 driver */\r
447 extern DRIVER drv_tim;          /* timing driver */\r
448 \r
449 /**************************************************************************\r
450 ****** Player stuff: ******************************************************\r
451 **************************************************************************/\r
452 \r
453 \r
454 typedef struct ENVPR{\r
455         UBYTE flg;          /* envelope flag */\r
456         UBYTE pts;                      /* number of envelope points */\r
457         UBYTE sus;                      /* envelope sustain index */\r
458         UBYTE beg;                      /* envelope loop begin */\r
459         UBYTE end;                      /* envelope loop end */\r
460         SWORD p;                        /* current envelope counter */\r
461         UWORD a;                        /* envelope index a */\r
462         UWORD b;                        /* envelope index b */\r
463         ENVPT *env;                     /* envelope points */\r
464 } ENVPR;\r
465 \r
466 \r
467 typedef struct AUDTMP{\r
468         INSTRUMENT      *i;\r
469         SAMPLE      *s;\r
470 \r
471         UWORD fadevol;          /* fading volume */\r
472 \r
473         ENVPR venv;\r
474         ENVPR penv;\r
475 \r
476         UBYTE keyon;            /* if true=key is pressed. */\r
477         UBYTE kick;                     /* if true=sample has to be restarted */\r
478         UBYTE sample;           /* which sample number (0-31) */\r
479         SWORD handle;           /* which sample-handle */\r
480 \r
481         ULONG start;            /* The start byte index in the sample */\r
482 \r
483         UBYTE panning;          /* panning position */\r
484         UBYTE pansspd;          /* panslide speed */\r
485 \r
486         SBYTE volume;           /* amiga volume (0 t/m 64) to play the sample at */\r
487         UWORD period;           /* period to play the sample at */\r
488 \r
489         /* You should not have to use the values\r
490            below in the player routine */\r
491 \r
492         SBYTE transpose;\r
493 \r
494         UBYTE note;                     /* */\r
495 \r
496         SWORD ownper;\r
497         SWORD ownvol;\r
498 \r
499         UBYTE *row;                     /* row currently playing on this channel */\r
500 \r
501         SBYTE retrig;           /* retrig value (0 means don't retrig) */\r
502         UWORD c2spd;            /* what finetune to use */\r
503 \r
504         SBYTE tmpvolume;        /* tmp volume */\r
505 \r
506         UWORD tmpperiod;        /* tmp period */\r
507         UWORD wantedperiod;     /* period to slide to (with effect 3 or 5) */\r
508 \r
509         UWORD slidespeed;       /* */\r
510         UWORD portspeed;        /* noteslide speed (toneportamento) */\r
511 \r
512         UBYTE s3mtremor;        /* s3m tremor (effect I) counter */\r
513         UBYTE s3mtronof;        /* s3m tremor ontime/offtime */\r
514 \r
515         UBYTE s3mvolslide;      /* last used volslide */\r
516 \r
517         UBYTE s3mrtgspeed;      /* last used retrig speed */\r
518         UBYTE s3mrtgslide;      /* last used retrig slide */\r
519 \r
520         UBYTE glissando;        /* glissando (0 means off) */\r
521         UBYTE wavecontrol;      /* */\r
522 \r
523         SBYTE vibpos;           /* current vibrato position */\r
524         UBYTE vibspd;           /* "" speed */\r
525         UBYTE vibdepth;         /* "" depth */\r
526 \r
527         SBYTE trmpos;           /* current tremolo position */\r
528         UBYTE trmspd;           /* "" speed */\r
529         UBYTE trmdepth;         /* "" depth */\r
530 \r
531         UWORD soffset;          /* last used sample-offset (effect 9) */\r
532 } AUDTMP;\r
533 \r
534 \r
535 extern AUDTMP mp_audio[32];             /* max eight channels */\r
536 extern UBYTE  mp_bpm;                   /* beats-per-minute speed */\r
537 extern UWORD  mp_patpos;                /* current row number (0-63) */\r
538 extern SWORD  mp_sngpos;                /* current song position */\r
539 extern UWORD  mp_sngspd;                /* current songspeed */\r
540 \r
541 extern BOOL  mp_loop;\r
542 extern BOOL  mp_panning;\r
543 extern BOOL  mp_extspd;\r
544 extern UBYTE mp_volume;\r
545 \r
546 /*\r
547         player prototypes:\r
548 */\r
549 \r
550 int      MP_Ready(void);\r
551 void MP_NextPosition(void);\r
552 void MP_PrevPosition(void);\r
553 void MP_SetPosition(UWORD pos);\r
554 void MP_HandleTick(void);\r
555 void MP_Init(UNIMOD *m);\r
556 \r
557 \r
558 /**************************************************************************\r
559 ****** Virtual channel stuff: *********************************************\r
560 **************************************************************************/\r
561 \r
562 BOOL    VC_Init(void);\r
563 void    VC_Exit(void);\r
564 \r
565 void    VC_PlayStart(void);\r
566 void    VC_PlayStop(void);\r
567 \r
568 SWORD   VC_SampleLoad(FILE *fp,ULONG size,ULONG reppos,ULONG repend,UWORD flags);\r
569 void    VC_SampleUnload(SWORD handle);\r
570 \r
571 void    VC_WriteSamples(SBYTE *buf,UWORD todo);\r
572 UWORD   VC_WriteBytes(SBYTE *buf,UWORD todo);\r
573 void    VC_SilenceBytes(SBYTE *buf,UWORD todo);\r
574 \r
575 void    VC_VoiceSetVolume(UBYTE voice,UBYTE vol);\r
576 void    VC_VoiceSetFrequency(UBYTE voice,ULONG frq);\r
577 void    VC_VoiceSetPanning(UBYTE voice,UBYTE pan);\r
578 void    VC_VoicePlay(UBYTE voice,SWORD handle,ULONG start,ULONG size,ULONG reppos,ULONG repend,UWORD flags);\r
579 \r
580 #endif\r