Mercurial > ~darius > hgwebdir.cgi > mikmod
view include/ptform.h @ 16:e5529b6e3b1c
Inistal commit of the Cheesy Mod Player (tm)
author | darius |
---|---|
date | Thu, 23 Apr 1998 07:35:49 +0000 |
parents | 55420dceb8e0 |
children |
line wrap: on
line source
/* --> The Protracker Enums -> For MikMod 3.0 */ #ifndef _PTFORM_H_ #define _PTFORM_H_ #ifdef __cplusplus extern "C" { #endif extern UWORD mytab[12],logtab[104]; extern UBYTE VibratoTable[32],avibtab[128]; extern SBYTE PanbrelloTable[256]; extern ULONG lintab[768]; /************************************************************************** ****** Unitrack stuff: **************************************************** **************************************************************************/ // The UniTrack stuff is generally for internal use only, but would be // required in making a tracker or a module player tha scrolls pattern // data. // prototypes: extern void UniSetRow(UBYTE *t); extern UBYTE UniGetByte(void); extern UBYTE *UniFindRow(UBYTE *t,UWORD row); extern void UniReset(void); extern void UniWrite(UBYTE data); extern void UniNewline(void); extern UBYTE *UniDup(void); extern void UniSkipOpcode(UBYTE op); extern BOOL UniInit(void); extern void UniCleanup(void); extern UWORD TrkLen(UBYTE *t); extern BOOL MyCmp(UBYTE *a, UBYTE *b, UWORD l); extern void UniInstrument(UBYTE ins); extern void UniNote(UBYTE note); extern void UniPTEffect(UBYTE eff, UBYTE dat); extern void UniVolEffect(UWORD eff, UBYTE dat); // Enumaerated UniMod Commands 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_S3MEFFECTR, UNI_S3MEFFECTT, UNI_S3MEFFECTU, UNI_KEYOFF, UNI_KEYFADE, UNI_VOLEFFECTS, UNI_XMEFFECT4, UNI_XMEFFECTA, UNI_XMEFFECTE1, UNI_XMEFFECTE2, UNI_XMEFFECTEA, UNI_XMEFFECTEB, UNI_XMEFFECTG, UNI_XMEFFECTH, UNI_XMEFFECTL, UNI_XMEFFECTP, UNI_XMEFFECTX1, UNI_XMEFFECTX2, UNI_ITEFFECTG, // Porta to Note .. no kick=0; UNI_ITEFFECTH, // IT specific Vibrato UNI_ITEFFECTI, // IT tremor (xy not incremeneted) UNI_ITEFFECTM, // Set Channel Volume UNI_ITEFFECTN, // Slide / Fineslide Channel Volume UNI_ITEFFECTP, // Slide / Fineslide Channel Panning UNI_ITEFFECTU, // IT fine vibrato UNI_ITEFFECTW, // Slide / Fineslide Global volume UNI_ITEFFECTY, // The Satanic Panbrello UNI_ITEFFECTS0, UNI_LAST }; // IT / S3M Extended SS effects: enum { SS_GLISSANDO = 1, SS_FINETUNE, SS_VIBWAVE, SS_TREMWAVE, SS_PANWAVE, SS_FRAMEDELAY, SS_S7EFFECTS, SS_PANNING, SS_SURROUND, SS_HIOFFSET, SS_PATLOOP, SS_NOTECUT, SS_NOTEDELAY, SS_PATDELAY }; // IT Volume column effects enum { VOL_VOLUME = 1, VOL_PANNING, VOL_VOLSLIDE, VOL_PITCHSLIDEDN, VOL_PITCHSLIDEUP, VOL_PORTAMENTO, VOL_VIBRATO }; /************************************************************************** ****** Instrument stuff: ************************************************** **************************************************************************/ // Instrument format flags #define IF_OWNPAN 1 #define IF_PITCHPAN 2 // Envelope flags: #define EF_ON 1 #define EF_SUSTAIN 2 #define EF_LOOP 4 #define EF_VOLENV 8 // New Note Action Flags #define NNA_CUT 0 #define NNA_CONTINUE 1 #define NNA_OFF 2 #define NNA_FADE 3 #define DCT_OFF 0 #define DCT_NOTE 1 #define DCT_SAMPLE 2 #define DCT_INST 3 #define DCA_CUT 0 #define DCA_OFF 1 #define DCA_FADE 2 #define KEY_KICK 0 #define KEY_OFF 1 #define KEY_FADE 2 #define KEY_KILL 3 #define AV_IT 1 // IT vs. XM vibrato info typedef struct ENVPT { SWORD pos; SWORD val; } ENVPT; typedef struct INSTRUMENT { UBYTE flags; UBYTE samplenumber[120]; UBYTE samplenote[120]; UBYTE nnatype; UBYTE dca; // duplicate check action UBYTE dct; // duplicate check type UBYTE globvol; UWORD panning; // instrument-based panning var UBYTE pitpansep; // pitch pan separation (0 to 255) UBYTE pitpancenter; // pitch pan center (0 to 119) UBYTE rvolvar; // random volume varations (0 - 100%) UBYTE rpanvar; // random panning varations (0 - 100%) UWORD volfade; UBYTE volflg; // bit 0: on 1: sustain 2: loop UBYTE volpts; UBYTE volsusbeg; UBYTE volsusend; UBYTE volbeg; UBYTE volend; ENVPT volenv[32]; UBYTE panflg; // bit 0: on 1: sustain 2: loop UBYTE panpts; UBYTE pansusbeg; UBYTE pansusend; UBYTE panbeg; UBYTE panend; ENVPT panenv[32]; UBYTE pitflg; // bit 0: on 1: sustain 2: loop UBYTE pitpts; UBYTE pitsusbeg; UBYTE pitsusend; UBYTE pitbeg; UBYTE pitend; ENVPT pitenv[32]; // UBYTE vibtype; // UBYTE vibsweep; // UBYTE vibdepth; // UBYTE vibrate; CHAR *insname; } INSTRUMENT; /************************************************************************** ****** Player stuff: ****************************************************** **************************************************************************/ typedef struct ENVPR { UBYTE flg; // envelope flag UBYTE pts; // number of envelope points UBYTE susbeg; // envelope sustain index begin UBYTE susend; // envelope sustain index end 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; // Struct MP_VOICE - Used by NNA only player (audio control. AUDTMP is // used for full effects control). typedef struct MP_VOICE { INSTRUMENT *i; SAMPLE *s; UBYTE sample; // which instrument number SWORD volume; // output volume (vol + sampcol + instvol) UWORD panning; // panning position SBYTE chanvol; // channel's "global" volume UWORD fadevol; // fading volume rate UWORD period; // period to play the sample at UBYTE volflg; // volume envelope settings UBYTE panflg; // panning envelope settings UBYTE pitflg; // pitch envelope settings UBYTE keyoff; // if true = fade out and stuff UBYTE kick; // if true = sample has to be restarted UBYTE note; // the audible note (as heard, direct rep of period) UBYTE nna; // New note action type + master/slave flags SWORD handle; // which sample-handle SLONG start; // The start byte index in the sample // ---------------------------------- // Below here is info NOT in MP_CONTROL!! // ---------------------------------- ENVPR venv; ENVPR penv; ENVPR cenv; UWORD avibpos; // autovibrato pos UWORD aswppos; // autovibrato sweep pos ULONG totalvol; // total volume of channel (before global mixings) BOOL mflag; SWORD masterchn; struct MP_CONTROL *master;// index of "master" effects channel } MP_VOICE; typedef struct MP_CONTROL { INSTRUMENT *i; SAMPLE *s; UBYTE sample; // which sample number UBYTE note; // the audible note (as heard, direct rep of period) SWORD outvolume; // output volume (vol + sampcol + instvol) SBYTE chanvol; // channel's "global" volume UWORD fadevol; // fading volume rate UWORD panning; // panning position UBYTE kick; // if true = sample has to be restarted UBYTE muted; // if set, channel not played UWORD period; // period to play the sample at UBYTE nna; // New note action type + master/slave flags UBYTE volflg; // volume envelope settings UBYTE panflg; // panning envelope settings UBYTE pitflg; // pitch envelope settings UBYTE keyoff; // if true = fade out and stuff SWORD handle; // which sample-handle UBYTE notedelay; // (used for note delay) SLONG start; // The starting byte index in the sample struct MP_VOICE *slave;// Audio Slave of current effects control channel UBYTE slavechn; // Audio Slave of current effects control channel UBYTE anote; // the note that indexes the audible (note seen in tracker) SWORD ownper; SWORD ownvol; UBYTE dca; // duplicate check action UBYTE dct; // duplicate check type UBYTE *row; // row currently playing on this channel SBYTE retrig; // retrig value (0 means don't retrig) ULONG speed; // what finetune to use SWORD volume; // amiga volume (0 t/m 64) to play the sample at SBYTE tmpvolume; // tmp volume UWORD tmpperiod; // tmp period UWORD wantedperiod; // period to slide to (with effect 3 or 5) UBYTE pansspd; // panslide speed 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 UBYTE fslideupspd; UBYTE fslidednspd; UBYTE fportupspd; // fx E1 (extra fine portamento up) data UBYTE fportdnspd; // fx E2 (extra fine portamento dn) data UBYTE ffportupspd; // fx X1 (extra fine portamento up) data UBYTE ffportdnspd; // fx X2 (extra fine portamento dn) data ULONG hioffset; // last used high order of sample offset UWORD soffset; // last used low order of sample-offset (effect 9) UBYTE sseffect; // last used Sxx effect UBYTE ssdata; // last used Sxx data info UBYTE chanvolslide; // last used channel volume slide UBYTE panbwave; // current panbrello waveform UBYTE panbpos; // current panbrello position SBYTE panbspd; // "" speed UBYTE panbdepth; // "" depth UWORD newsamp; // set to 1 upon a sample / inst change UBYTE voleffect; // Volume Column Effect Memory as used by Impulse Tracker UBYTE voldata; // Volume Column Data Memory } MP_CONTROL; /****************************************************** ******** MikMod UniMod type: ************************** *******************************************************/ // UniMod flags #define UF_XMPERIODS 1 // XM periods / finetuning #define UF_LINEAR 2 // LINEAR periods (UF_XMPERIODS must be set as well) #define UF_INST 4 // Instruments are used #define UF_NNA 8 // New Note Actions used (set numvoices rather than numchn) typedef struct UNIMOD { // This section of elements are all file-storage related. // all of this information can be found in the UNIMOD disk format. // For further details about there variables, see the MikMod Docs. UWORD flags; // See UniMod Flags above UBYTE numchn; // number of module channels UBYTE numvoices; // max # voices used for full NNA playback UWORD numpos; // number of positions in this song UWORD numpat; // number of patterns in this song UWORD numtrk; // number of tracks UWORD numins; // number of instruments UWORD numsmp; // number of samples UWORD reppos; // restart position UBYTE initspeed; // initial song speed UBYTE inittempo; // initial song tempo UBYTE initvolume; // initial global volume (0 - 128) UWORD panning[64]; // 64 panning positions UBYTE chanvol[64]; // 64 channel positions CHAR *songname; // name of the song CHAR *composer; // name of the composer CHAR *comment; // module comments UBYTE **tracks; // array of numtrk pointers to tracks UWORD *patterns; // array of Patterns [pointers to tracks for each channel]. UWORD *pattrows; // array of number of rows for each pattern UWORD *positions; // all positions INSTRUMENT *instruments; // all instruments SAMPLE *samples; // all samples // following are the player-instance variables. They are in no way file // storage related - they are for internal replay use only. // All following variables can be modified at any time. CHAR *modtype; // string type of module loaded UBYTE bpm; // current beats-per-minute speed UWORD sngspd; // current song speed SWORD volume; // song volume (0-128) (or user volume) BOOL extspd; // extended speed flag (default enabled) BOOL panflag; // panning flag (default enabled) BOOL loop; // loop module ? (default disabled) BOOL forbid; // if true, no player update! // The following variables are considered useful for reading, and should // should not be directly modified by the end user. MP_CONTROL *control; // Effects Channel information (pf->numchn alloc'ed) MP_VOICE *voice; // Audio Voice information (md_numchn alloc'ed) UWORD numrow; // number of rows on current pattern UWORD vbtick; // tick counter (counts from 0 to sngspd) UWORD patpos; // current row number SWORD sngpos; // current song position. This should not // be modified directly. Use MikMod_NextPosition, // MikMod_PrevPosition, and MikMod_SetPosition. // The following variables should not be modified, and have information // that is pretty useless outside the internal player, so just ignore :) UBYTE globalslide; // global volume slide rate UWORD pat_reppos; // patternloop position UWORD pat_repcnt; // times to loop UWORD patbrk; // position where to start a new pattern UBYTE patdly; // patterndelay counter (command memory) UBYTE patdly2; // patterndelay counter (real one) SWORD posjmp; // flag to indicate a position jump is needed... // changed since 1.00: now also indicates the // direction the position has to jump to: // 0: Don't do anything // 1: Jump back 1 position // 2: Restart on current position // 3: Jump forward 1 position } UNIMOD; /*************************************************** ****** Loader stuff: ******************************* ****************************************************/ // loader structure: typedef struct MLOADER { struct MLOADER *next; CHAR *type; CHAR *version; BOOL (*Init)(void); BOOL (*Test)(void); BOOL (*Load)(void); void (*Cleanup)(void); CHAR *(*LoadTitle)(void); } MLOADER; // public loader variables: extern FILE *modfp; extern UWORD finetune[16]; extern UNIMOD of; // static unimod loading space extern UWORD npertab[60]; // used by the original MOD loaders // main loader prototypes: void ML_InfoLoader(void); void ML_RegisterLoader(MLOADER *ldr); UNIMOD *MikMod_LoadSongFP(FILE *fp, int maxchan); UNIMOD *MikMod_LoadSong(CHAR *filename, int maxchan); void MikMod_FreeSong(UNIMOD *mf); // other loader prototypes: (used by the loader modules) BOOL InitTracks(void); void AddTrack(UBYTE *tr); BOOL ReadComment(UWORD len); BOOL AllocPositions(int total); BOOL AllocPatterns(void); BOOL AllocTracks(void); BOOL AllocInstruments(void); BOOL AllocSamples(void); CHAR *DupStr(CHAR *s, UWORD len); // Declare external loaders: extern MLOADER load_uni; // Internal UniMod Loader (Current version of UniMod only) extern MLOADER load_mod; // Standard 31-instrument Module loader (Protracker, StarTracker, FastTracker, etc) extern MLOADER load_m15; // 15-instrument (SoundTracker and Ultimate SoundTracker) extern MLOADER load_mtm; // Multi-Tracker Module (by Renaissance) extern MLOADER load_s3m; // ScreamTracker 3 (by Future Crew) extern MLOADER load_stm; // ScreamTracker 2 (by Future Crew) extern MLOADER load_ult; // UltraTracker extern MLOADER load_xm; // FastTracker 2 (by Trition) extern MLOADER load_it; // Impulse Tracker (by Jeffrey Lim) extern MLOADER load_669; // 669 and Extended-669 (by Tran / Renaissance) extern MLOADER load_dsm; // DSIK internal module format extern MLOADER load_med; // MMD0 and MMD1 Amiga MED modules (by OctaMED) extern MLOADER load_far; // Farandole Composer Module // used to convert c4spd to linear XM periods (IT loader). extern UWORD getlinearperiod(UBYTE note, ULONG fine); extern ULONG getfrequency(UBYTE flags, ULONG period); #define MP_HandleTick Player_HandleTick #define ML_LoadFN(x,y) MikMod_LoadSong(x,y) #define ML_LoadFP(x,y) MikMod_LoadSongFP(x,y) #define MP_PlayStart(x) Player_Start(x) #define MP_PlayStop Player_Stop // MikMod Player Prototypes: // =========================================================== // This batch of prototypes affects the currently ACTIVE module // set with MikMod_PlayStart) extern void Player_Start(UNIMOD *mf); extern BOOL Player_Active(void); extern void Player_Stop(void); extern void Player_TogglePause(void); extern void Player_NextPosition(void); extern void Player_PrevPosition(void); extern void Player_SetPosition(UWORD pos); extern void Player_Mute(SLONG arg1, ...); extern void Player_UnMute(SLONG arg1, ...); extern void Player_ToggleMute(SLONG arg1, ...); extern BOOL Player_Muted(int chan); extern void Player_HandleTick(void); extern void Player_SetVolume(int volume); extern UNIMOD *Player_GetUnimod(void); extern BOOL Player_Init(UNIMOD *mf); // internal use only [by loader] extern void Player_Exit(UNIMOD *mf); // internal use only [by loader] // This batch of prototypes adheres closely to the old MikMod 2.10 // naming, and affects ANY specified module (need not be active, // only loaded and initialized) extern BOOL MP_Playing(UNIMOD *mf); extern void MP_TogglePause(UNIMOD *mf); extern void MP_NextPosition(UNIMOD *mf); extern void MP_PrevPosition(UNIMOD *mf); extern void MP_SetPosition(UNIMOD *mf, UWORD pos); extern void MP_Mute(UNIMOD *mf, SLONG arg1, ...); extern void MP_UnMute(UNIMOD *mf, SLONG arg1, ...); extern void MP_ToggleMute(UNIMOD *mf, SLONG arg1, ...); extern BOOL MP_Muted(UNIMOD *mf, int chan); #ifdef __cplusplus } #endif #endif