home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 1998 June B / Pcwk6b98.iso / Mpeg3 / Dos / MP3 / MPG12304.EXE / MIKMOD.H < prev    next >
C/C++ Source or Header  |  1995-12-12  |  16KB  |  581 lines

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