5 #include "mtypes.h" /* include atomic mikmod types */
\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
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
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
39 extern SBYTE _mm_read_SBYTE (FILE *fp);
\r
40 extern UBYTE _mm_read_UBYTE (FILE *fp);
\r
42 extern SWORD _mm_read_M_SWORD (FILE *fp);
\r
43 extern SWORD _mm_read_I_SWORD (FILE *fp);
\r
45 extern UWORD _mm_read_M_UWORD(FILE *fp);
\r
46 extern UWORD _mm_read_I_UWORD(FILE *fp);
\r
48 extern SLONG _mm_read_M_SLONG (FILE *fp);
\r
49 extern SLONG _mm_read_I_SLONG (FILE *fp);
\r
51 extern ULONG _mm_read_M_ULONG(FILE *fp);
\r
52 extern ULONG _mm_read_I_ULONG(FILE *fp);
\r
54 extern int _mm_read_str(char *str, int size, FILE *fp);
\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
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
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
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
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
72 extern void _mm_write_SBYTE (SBYTE data,FILE *fp);
\r
73 extern void _mm_write_UBYTE (UBYTE data,FILE *fp);
\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
78 extern void _mm_write_M_UWORD (UWORD data,FILE *fp);
\r
79 extern void _mm_write_I_UWORD (UWORD data,FILE *fp);
\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
84 extern void _mm_write_M_ULONG (ULONG data,FILE *fp);
\r
85 extern void _mm_write_I_ULONG (ULONG data,FILE *fp);
\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
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
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
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
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
103 /**************************************************************************
\r
104 ****** Unitrack stuff: ****************************************************
\r
105 **************************************************************************/
\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
164 /**************************************************************************
\r
165 ****** mikmod types: ******************************************************
\r
166 **************************************************************************/
\r
170 Sample format flags:
\r
173 #define SF_16BITS 1
\r
174 #define SF_SIGNED 2
\r
176 #define SF_BIG_ENDIAN 8
\r
179 #define SF_OWNPAN 64
\r
180 #define SF_REVERSE 128
\r
188 #define EF_SUSTAIN 2
\r
196 #define UF_XMPERIODS 1 /* if set use XM periods/finetuning */
\r
197 #define UF_LINEAR 2 /* if set use LINEAR periods */
\r
200 typedef struct ENVPT{
\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
221 typedef struct INSTRUMENT{
\r
223 UBYTE samplenumber[96];
\r
225 UBYTE volflg; /* bit 0: on 1: sustain 2: loop */
\r
232 UBYTE panflg; /* bit 0: on 1: sustain 2: loop */
\r
251 MikMod UNImod types:
\r
252 ====================
\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
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
277 /**************************************************************************
\r
278 ****** Loader stuff: ******************************************************
\r
279 **************************************************************************/
\r
285 typedef struct LOADER{
\r
286 struct LOADER *next;
\r
289 BOOL (*Init)(void);
\r
290 BOOL (*Test)(void);
\r
291 BOOL (*Load)(void);
\r
292 void (*Cleanup)(void);
\r
297 public loader variables:
\r
301 extern FILE *modfp;
\r
302 extern UWORD finetune[16];
\r
306 main loader prototypes:
\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
317 other loader prototypes: (used by the loader modules)
\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
333 Declare external loaders:
\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
345 /**************************************************************************
\r
346 ****** Wavload stuff: *****************************************************
\r
347 **************************************************************************/
\r
349 SAMPLE *MW_LoadWavFP(FILE *fp);
\r
350 SAMPLE *MW_LoadWavFN(char *filename);
\r
351 void MW_FreeWav(SAMPLE *si);
\r
354 /**************************************************************************
\r
355 ****** Driver stuff: ******************************************************
\r
356 **************************************************************************/
\r
359 max. number of handles a driver has to provide. (not strict)
\r
362 #define MAXSAMPLEHANDLES 128
\r
366 possible mixing mode bits:
\r
369 #define DMODE_STEREO 1
\r
370 #define DMODE_16BITS 2
\r
371 #define DMODE_INTERP 4
\r
378 typedef struct DRIVER{
\r
379 struct DRIVER *next;
\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
398 public driver variables:
\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
411 main driver prototypes:
\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
433 Declare external drivers:
\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
449 /**************************************************************************
\r
450 ****** Player stuff: ******************************************************
\r
451 **************************************************************************/
\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
467 typedef struct AUDTMP{
\r
471 UWORD fadevol; /* fading volume */
\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
481 ULONG start; /* The start byte index in the sample */
\r
483 UBYTE panning; /* panning position */
\r
484 UBYTE pansspd; /* panslide speed */
\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
489 /* You should not have to use the values
\r
490 below in the player routine */
\r
499 UBYTE *row; /* row currently playing on this channel */
\r
501 SBYTE retrig; /* retrig value (0 means don't retrig) */
\r
502 UWORD c2spd; /* what finetune to use */
\r
504 SBYTE tmpvolume; /* tmp volume */
\r
506 UWORD tmpperiod; /* tmp period */
\r
507 UWORD wantedperiod; /* period to slide to (with effect 3 or 5) */
\r
509 UWORD slidespeed; /* */
\r
510 UWORD portspeed; /* noteslide speed (toneportamento) */
\r
512 UBYTE s3mtremor; /* s3m tremor (effect I) counter */
\r
513 UBYTE s3mtronof; /* s3m tremor ontime/offtime */
\r
515 UBYTE s3mvolslide; /* last used volslide */
\r
517 UBYTE s3mrtgspeed; /* last used retrig speed */
\r
518 UBYTE s3mrtgslide; /* last used retrig slide */
\r
520 UBYTE glissando; /* glissando (0 means off) */
\r
521 UBYTE wavecontrol; /* */
\r
523 SBYTE vibpos; /* current vibrato position */
\r
524 UBYTE vibspd; /* "" speed */
\r
525 UBYTE vibdepth; /* "" depth */
\r
527 SBYTE trmpos; /* current tremolo position */
\r
528 UBYTE trmspd; /* "" speed */
\r
529 UBYTE trmdepth; /* "" depth */
\r
531 UWORD soffset; /* last used sample-offset (effect 9) */
\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
541 extern BOOL mp_loop;
\r
542 extern BOOL mp_panning;
\r
543 extern BOOL mp_extspd;
\r
544 extern UBYTE mp_volume;
\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
558 /**************************************************************************
\r
559 ****** Virtual channel stuff: *********************************************
\r
560 **************************************************************************/
\r
562 BOOL VC_Init(void);
\r
563 void VC_Exit(void);
\r
565 void VC_PlayStart(void);
\r
566 void VC_PlayStop(void);
\r
568 SWORD VC_SampleLoad(FILE *fp,ULONG size,ULONG reppos,ULONG repend,UWORD flags);
\r
569 void VC_SampleUnload(SWORD handle);
\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
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