home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Spezial / SPEZIAL2_97.zip / SPEZIAL2_97.iso / ANWEND / MULTIMED / MIKMOS2 / mikmod.h < prev    next >
Text File  |  1996-12-31  |  16KB  |  574 lines

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