Mercurial > ~darius > hgwebdir.cgi > mikmod
diff include/ptform.h @ 10:55420dceb8e0
Initial entry of mikmod into the CVS tree.
author | darius |
---|---|
date | Fri, 23 Jan 1998 16:05:11 +0000 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/include/ptform.h Fri Jan 23 16:05:11 1998 +0000 @@ -0,0 +1,591 @@ +/* + --> 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 +