X-Git-Url: http://4ch.mooo.com/gitweb/?a=blobdiff_plain;f=16%2Fv2%2Fsource%2Fverge%2FENGINE%2FMIKMOD.H;fp=16%2Fv2%2Fsource%2Fverge%2FENGINE%2FMIKMOD.H;h=0111ccb3cc3e60257e26b46890c64ddc28ee098a;hb=3b3eab57721d856c06fd21d62cb7f0c42fbdd4f0;hp=0000000000000000000000000000000000000000;hpb=8510447fda06825df6c1b92a3238922b9893f424;p=16.git diff --git a/16/v2/source/verge/ENGINE/MIKMOD.H b/16/v2/source/verge/ENGINE/MIKMOD.H new file mode 100644 index 00000000..0111ccb3 --- /dev/null +++ b/16/v2/source/verge/ENGINE/MIKMOD.H @@ -0,0 +1,580 @@ +#ifndef MIKMOD_H +#define MIKMOD_H + +#include +#include "mtypes.h" /* include atomic mikmod types */ + + +#define mikbanner \ +"=======================================================================\n" \ +"MIKMOD v2.10 - Portable version - Programmed by MikMak of HaRDCoDE '95\n" \ +"=======================================================================\n" \ +"This program is SHAREWARE - Read MIKMOD.TXT for more info\n" \ +"E-Mail : mikmak@stack.urc.tue.nl\n" + + +/* + error variables: + =============== +*/ + +extern char *ERROR_ALLOC_STRUCT; +extern char *ERROR_LOADING_PATTERN; +extern char *ERROR_LOADING_TRACK; +extern char *ERROR_LOADING_HEADER; +extern char *ERROR_NOT_A_MODULE; +extern char *ERROR_LOADING_SAMPLEINFO; +extern char *ERROR_OUT_OF_HANDLES; +extern char *ERROR_SAMPLE_TOO_BIG; +extern char *myerr; + + + +#define _mm_rewind(x) _mm_fseek(x,0,SEEK_SET) +int _mm_fseek(FILE *stream,long offset,int whence); +void _mm_setiobase(long iobase); +long _mm_ftell(FILE *stream); + + +extern SBYTE _mm_read_SBYTE (FILE *fp); +extern UBYTE _mm_read_UBYTE (FILE *fp); + +extern SWORD _mm_read_M_SWORD (FILE *fp); +extern SWORD _mm_read_I_SWORD (FILE *fp); + +extern UWORD _mm_read_M_UWORD(FILE *fp); +extern UWORD _mm_read_I_UWORD(FILE *fp); + +extern SLONG _mm_read_M_SLONG (FILE *fp); +extern SLONG _mm_read_I_SLONG (FILE *fp); + +extern ULONG _mm_read_M_ULONG(FILE *fp); +extern ULONG _mm_read_I_ULONG(FILE *fp); + +extern int _mm_read_str(char *str, int size, FILE *fp); + +extern int _mm_read_SBYTES (SBYTE *buffer, int number, FILE *fp); +extern int _mm_read_UBYTES (UBYTE *buffer, int number, FILE *fp); + +extern int _mm_read_M_SWORDS (SWORD *buffer, int number, FILE *fp); +extern int _mm_read_I_SWORDS (SWORD *buffer, int number, FILE *fp); + +extern int _mm_read_M_UWORDS (UWORD *buffer, int number, FILE *fp); +extern int _mm_read_I_UWORDS (UWORD *buffer, int number, FILE *fp); + +extern int _mm_read_M_SLONGS (SLONG *buffer, int number, FILE *fp); +extern int _mm_read_I_SLONGS (SLONG *buffer, int number, FILE *fp); + +extern int _mm_read_M_ULONGS (ULONG *buffer, int number, FILE *fp); +extern int _mm_read_I_ULONGS (ULONG *buffer, int number, FILE *fp); + + +extern void _mm_write_SBYTE (SBYTE data,FILE *fp); +extern void _mm_write_UBYTE (UBYTE data,FILE *fp); + +extern void _mm_write_M_SWORD (SWORD data,FILE *fp); +extern void _mm_write_I_SWORD (SWORD data,FILE *fp); + +extern void _mm_write_M_UWORD (UWORD data,FILE *fp); +extern void _mm_write_I_UWORD (UWORD data,FILE *fp); + +extern void _mm_write_M_SLONG (SLONG data,FILE *fp); +extern void _mm_write_I_SLONG (SLONG data,FILE *fp); + +extern void _mm_write_M_ULONG (ULONG data,FILE *fp); +extern void _mm_write_I_ULONG (ULONG data,FILE *fp); + +extern void _mm_write_SBYTES (SBYTE *data, int number,FILE *fp); +extern void _mm_write_UBYTES (UBYTE *data, int number,FILE *fp); + +extern void _mm_write_M_SWORDS (SWORD *data, int number,FILE *fp); +extern void _mm_write_I_SWORDS (SWORD *data, int number,FILE *fp); + +extern void _mm_write_M_UWORDS (UWORD *data, int number,FILE *fp); +extern void _mm_write_I_UWORDS (UWORD *data, int number,FILE *fp); + +extern void _mm_write_M_SLONGS (SLONG *data, int number,FILE *fp); +extern void _mm_write_I_SLONGS (SLONG *data, int number,FILE *fp); + +extern void _mm_write_M_ULONGS (ULONG *data, int number,FILE *fp); +extern void _mm_write_I_ULONGS (ULONG *data, int number,FILE *fp); + + +/************************************************************************** +****** Unitrack stuff: **************************************************** +**************************************************************************/ + +/* + prototypes: +*/ + +void UniSetRow(UBYTE *t); +UBYTE UniGetByte(void); +UBYTE *UniFindRow(UBYTE *t,UWORD row); +void UniReset(void); +void UniWrite(UBYTE data); +void UniNewline(void); +void UniInstrument(UBYTE ins); +void UniNote(UBYTE note); +void UniPTEffect(UBYTE eff,UBYTE dat); +UBYTE *UniDup(void); +void UniSkipOpcode(UBYTE op); +BOOL UniInit(void); +void UniCleanup(void); +UWORD TrkLen(UBYTE *t); +BOOL MyCmp(UBYTE *a,UBYTE *b,UWORD l); + +/* + all known effects: +*/ + +enum { + UNI_NOTE=1, + UNI_INSTRUMENT, + UNI_PTEFFECT0, + UNI_PTEFFECT1, + UNI_PTEFFECT2, + UNI_PTEFFECT3, + UNI_PTEFFECT4, + UNI_PTEFFECT5, + UNI_PTEFFECT6, + UNI_PTEFFECT7, + UNI_PTEFFECT8, + UNI_PTEFFECT9, + UNI_PTEFFECTA, + UNI_PTEFFECTB, + UNI_PTEFFECTC, + UNI_PTEFFECTD, + UNI_PTEFFECTE, + UNI_PTEFFECTF, + UNI_S3MEFFECTA, + UNI_S3MEFFECTD, + UNI_S3MEFFECTE, + UNI_S3MEFFECTF, + UNI_S3MEFFECTI, + UNI_S3MEFFECTQ, + UNI_S3MEFFECTT, + UNI_XMEFFECTA, + UNI_XMEFFECTG, + UNI_XMEFFECTH, + UNI_XMEFFECTP +}; + + +/************************************************************************** +****** mikmod types: ****************************************************** +**************************************************************************/ + + +/* + Sample format flags: +*/ + +#define SF_16BITS 1 +#define SF_SIGNED 2 +#define SF_DELTA 4 +#define SF_BIG_ENDIAN 8 +#define SF_LOOP 16 +#define SF_BIDI 32 +#define SF_OWNPAN 64 +#define SF_REVERSE 128 + + +/* + Envelope flags: +*/ + +#define EF_ON 1 +#define EF_SUSTAIN 2 +#define EF_LOOP 4 + + +/* + Unimod flags +*/ + +#define UF_XMPERIODS 1 /* if set use XM periods/finetuning */ +#define UF_LINEAR 2 /* if set use LINEAR periods */ + + +typedef struct ENVPT{ + SWORD pos; + SWORD val; +} ENVPT; + + +typedef struct SAMPLE{ + UWORD c2spd; /* finetune frequency */ + SBYTE transpose; /* transpose value */ + UBYTE volume; /* volume 0-64 */ + UBYTE panning; /* panning */ + ULONG length; /* length of sample (in samples!) */ + ULONG loopstart; /* repeat position (relative to start, in samples) */ + ULONG loopend; /* repeat end */ + UWORD flags; /* sample format */ + ULONG seekpos; /* seek position in file */ + char *samplename; /* name of the sample */ + SWORD handle; /* sample handle */ +} SAMPLE; + + +typedef struct INSTRUMENT{ + UBYTE numsmp; + UBYTE samplenumber[96]; + + UBYTE volflg; /* bit 0: on 1: sustain 2: loop */ + UBYTE volpts; + UBYTE volsus; + UBYTE volbeg; + UBYTE volend; + ENVPT volenv[12]; + + UBYTE panflg; /* bit 0: on 1: sustain 2: loop */ + UBYTE panpts; + UBYTE pansus; + UBYTE panbeg; + UBYTE panend; + ENVPT panenv[12]; + + UBYTE vibtype; + UBYTE vibsweep; + UBYTE vibdepth; + UBYTE vibrate; + + UWORD volfade; + char *insname; + SAMPLE *samples; +} INSTRUMENT; + + +/* + MikMod UNImod types: + ==================== +*/ + +typedef struct UNIMOD{ + UBYTE numchn; /* number of channels */ + UWORD numpos; /* number of positions in this song */ + UWORD reppos; /* restart position */ + UWORD numpat; /* number of patterns in this song */ + UWORD numtrk; /* number of tracks */ + UWORD numins; /* number of samples */ + UBYTE initspeed; /* */ + UBYTE inittempo; /* */ + UBYTE positions[256]; /* all positions */ + UBYTE panning[32]; /* 32 panning positions */ + UBYTE flags; /* */ + char *songname; /* name of the song */ + char *modtype; /* string type of module */ + char *comment; /* module comments */ + INSTRUMENT *instruments; /* all samples */ + UWORD *patterns; /* array of PATTERN */ + UWORD *pattrows; /* array of number of rows for each pattern */ + UBYTE **tracks; /* array of pointers to tracks */ +} UNIMOD; + + +/************************************************************************** +****** Loader stuff: ****************************************************** +**************************************************************************/ + +/* + loader structure: +*/ + +typedef struct LOADER{ + struct LOADER *next; + char *type; + char *version; + BOOL (*Init)(void); + BOOL (*Test)(void); + BOOL (*Load)(void); + void (*Cleanup)(void); +} LOADER; + + +/* + public loader variables: +*/ + +extern UNIMOD of; +extern FILE *modfp; +extern UWORD finetune[16]; + + +/* + main loader prototypes: +*/ + +void ML_InfoLoader(void); +void ML_RegisterLoader(LOADER *ldr); +UNIMOD *ML_LoadFP(FILE *fp); +UNIMOD *ML_LoadFN(char *filename); +void ML_Free(UNIMOD *mf); + + +/* + other loader prototypes: (used by the loader modules) +*/ + +BOOL InitTracks(void); +void AddTrack(UBYTE *tr); +BOOL ReadComment(UWORD len); +BOOL AllocPatterns(void); +BOOL AllocTracks(void); +BOOL AllocInstruments(void); +BOOL AllocSamples(INSTRUMENT *i); +char *DupStr(char *s,UWORD len); +void *MyMalloc(size_t size); +void *MyCalloc(size_t nitems,size_t size); + + +/* + Declare external loaders: +*/ +extern LOADER load_uni; +extern LOADER load_mod; +extern LOADER load_m15; +extern LOADER load_mtm; +extern LOADER load_s3m; +extern LOADER load_stm; +extern LOADER load_ult; +extern LOADER load_xm; + + +/************************************************************************** +****** Wavload stuff: ***************************************************** +**************************************************************************/ + +SAMPLE *MW_LoadWavFP(FILE *fp); +SAMPLE *MW_LoadWavFN(char *filename); +void MW_FreeWav(SAMPLE *si); + + +/************************************************************************** +****** Driver stuff: ****************************************************** +**************************************************************************/ + +/* + max. number of handles a driver has to provide. (not strict) +*/ + +#define MAXSAMPLEHANDLES 128 + + +/* + possible mixing mode bits: +*/ + +#define DMODE_STEREO 1 +#define DMODE_16BITS 2 +#define DMODE_INTERP 4 + + +/* + driver structure: +*/ + +typedef struct DRIVER{ + struct DRIVER *next; + char *Name; + char *Version; + BOOL (*IsPresent) (void); + SWORD (*SampleLoad) (FILE *fp,ULONG size,ULONG reppos,ULONG repend,UWORD flags); + void (*SampleUnLoad) (SWORD handle); + BOOL (*Init) (void); + void (*Exit) (void); + void (*PlayStart) (void); + void (*PlayStop) (void); + void (*Update) (void); + void (*VoiceSetVolume) (UBYTE voice,UBYTE vol); + void (*VoiceSetFrequency) (UBYTE voice,ULONG frq); + void (*VoiceSetPanning) (UBYTE voice,UBYTE pan); + void (*VoicePlay) (UBYTE voice,SWORD handle,ULONG start,ULONG size,ULONG reppos,ULONG repend,UWORD flags); +} DRIVER; + + +/* + public driver variables: +*/ + +extern DRIVER *md_driver; +extern UWORD md_device; +extern UWORD md_mixfreq; +extern UWORD md_dmabufsize; +extern UWORD md_mode; +extern UBYTE md_numchn; +extern UBYTE md_bpm; +extern void (*md_player)(void); + +/* + main driver prototypes: +*/ + +void MD_InfoDriver(void); +void MD_RegisterDriver(DRIVER *drv); +void MD_RegisterPlayer(void (*plr)(void)); +SWORD MD_SampleLoad(FILE *fp,ULONG size,ULONG reppos,ULONG repend,UWORD flags); +void MD_SampleUnLoad(SWORD handle); +BOOL MD_Init(void); +void MD_Exit(void); +void MD_PlayStart(void); +void MD_PlayStop(void); +void MD_SetBPM(UBYTE bpm); +void MD_Update(void); +void MD_VoiceSetVolume(UBYTE voice,UBYTE ivol); +void MD_VoiceSetFrequency(UBYTE voice,ULONG frq); +void MD_VoiceSetPanning(UBYTE voice,ULONG pan); +void MD_VoicePlay(UBYTE voice,SWORD handle,ULONG start,ULONG size,ULONG reppos,ULONG repend,UWORD flags); +void SL_Init(FILE *fp,UWORD infmt,UWORD outfmt); +void SL_Load(void *buffer,ULONG length); + +/* + Declare external drivers: +*/ + +extern DRIVER drv_gus; /* gravis ultrasound driver */ +extern DRIVER drv_sb; /* soundblaster DSP driver */ +extern DRIVER drv_ss; /* ensoniq soundscape driver */ +extern DRIVER drv_nos; /* nosound driver */ +extern DRIVER drv_raw; /* file output driver */ +extern DRIVER drv_w95; /* win95 driver */ +extern DRIVER drv_awe; /* experimental SB-AWE driver */ +extern DRIVER drv_vox; /* linux voxware driver */ +extern DRIVER drv_af; /* Dec Alpha AudioFile driver */ +extern DRIVER drv_sun; /* Sun driver */ +extern DRIVER drv_os2; /* Os2 driver */ +extern DRIVER drv_tim; /* timing driver */ + +/************************************************************************** +****** Player stuff: ****************************************************** +**************************************************************************/ + + +typedef struct ENVPR{ + UBYTE flg; /* envelope flag */ + UBYTE pts; /* number of envelope points */ + UBYTE sus; /* envelope sustain index */ + UBYTE beg; /* envelope loop begin */ + UBYTE end; /* envelope loop end */ + SWORD p; /* current envelope counter */ + UWORD a; /* envelope index a */ + UWORD b; /* envelope index b */ + ENVPT *env; /* envelope points */ +} ENVPR; + + +typedef struct AUDTMP{ + INSTRUMENT *i; + SAMPLE *s; + + UWORD fadevol; /* fading volume */ + + ENVPR venv; + ENVPR penv; + + UBYTE keyon; /* if true=key is pressed. */ + UBYTE kick; /* if true=sample has to be restarted */ + UBYTE sample; /* which sample number (0-31) */ + SWORD handle; /* which sample-handle */ + + ULONG start; /* The start byte index in the sample */ + + UBYTE panning; /* panning position */ + UBYTE pansspd; /* panslide speed */ + + SBYTE volume; /* amiga volume (0 t/m 64) to play the sample at */ + UWORD period; /* period to play the sample at */ + + /* You should not have to use the values + below in the player routine */ + + SBYTE transpose; + + UBYTE note; /* */ + + SWORD ownper; + SWORD ownvol; + + UBYTE *row; /* row currently playing on this channel */ + + SBYTE retrig; /* retrig value (0 means don't retrig) */ + UWORD c2spd; /* what finetune to use */ + + SBYTE tmpvolume; /* tmp volume */ + + UWORD tmpperiod; /* tmp period */ + UWORD wantedperiod; /* period to slide to (with effect 3 or 5) */ + + UWORD slidespeed; /* */ + UWORD portspeed; /* noteslide speed (toneportamento) */ + + UBYTE s3mtremor; /* s3m tremor (effect I) counter */ + UBYTE s3mtronof; /* s3m tremor ontime/offtime */ + + UBYTE s3mvolslide; /* last used volslide */ + + UBYTE s3mrtgspeed; /* last used retrig speed */ + UBYTE s3mrtgslide; /* last used retrig slide */ + + UBYTE glissando; /* glissando (0 means off) */ + UBYTE wavecontrol; /* */ + + SBYTE vibpos; /* current vibrato position */ + UBYTE vibspd; /* "" speed */ + UBYTE vibdepth; /* "" depth */ + + SBYTE trmpos; /* current tremolo position */ + UBYTE trmspd; /* "" speed */ + UBYTE trmdepth; /* "" depth */ + + UWORD soffset; /* last used sample-offset (effect 9) */ +} AUDTMP; + + +extern AUDTMP mp_audio[32]; /* max eight channels */ +extern UBYTE mp_bpm; /* beats-per-minute speed */ +extern UWORD mp_patpos; /* current row number (0-63) */ +extern SWORD mp_sngpos; /* current song position */ +extern UWORD mp_sngspd; /* current songspeed */ + +extern BOOL mp_loop; +extern BOOL mp_panning; +extern BOOL mp_extspd; +extern UBYTE mp_volume; + +/* + player prototypes: +*/ + +int MP_Ready(void); +void MP_NextPosition(void); +void MP_PrevPosition(void); +void MP_SetPosition(UWORD pos); +void MP_HandleTick(void); +void MP_Init(UNIMOD *m); + + +/************************************************************************** +****** Virtual channel stuff: ********************************************* +**************************************************************************/ + +BOOL VC_Init(void); +void VC_Exit(void); + +void VC_PlayStart(void); +void VC_PlayStop(void); + +SWORD VC_SampleLoad(FILE *fp,ULONG size,ULONG reppos,ULONG repend,UWORD flags); +void VC_SampleUnload(SWORD handle); + +void VC_WriteSamples(SBYTE *buf,UWORD todo); +UWORD VC_WriteBytes(SBYTE *buf,UWORD todo); +void VC_SilenceBytes(SBYTE *buf,UWORD todo); + +void VC_VoiceSetVolume(UBYTE voice,UBYTE vol); +void VC_VoiceSetFrequency(UBYTE voice,ULONG frq); +void VC_VoiceSetPanning(UBYTE voice,UBYTE pan); +void VC_VoicePlay(UBYTE voice,SWORD handle,ULONG start,ULONG size,ULONG reppos,ULONG repend,UWORD flags); + +#endif