⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 unimod.h

📁 MIDI解码程序(用VC编写)
💻 H
字号:
/*      MikMod sound library   (c) 1998, 1999 Miodrag Vallat and others - see file AUTHORS for   complete list.   This library is free software; you can redistribute it and/or modify   it under the terms of the GNU Library General Public License as   published by the Free Software Foundation; either version 2 of   the License, or (at your option) any later version.   This program is distributed in the hope that it will be useful,   but WITHOUT ANY WARRANTY; without even the implied warranty of   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the   GNU Library General Public License for more details.   You should have received a copy of the GNU Library General Public   License along with this library; if not, write to the Free Software   Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA   02111-1307, USA. *//*==============================================================================  $Id: unimod.h,v 1.35 1999/10/25 16:31:41 miod Exp $  MikMod sound library include file==============================================================================*/#ifndef _UNIMOD_H_#define _UNIMOD_H_#include <stdio.h>#include <stdlib.h>#include "url.h"#ifdef __cplusplusextern "C"{#endif/* *    ========== Platform independent-type definitions */#ifdef __W32__#define WIN32_LEAN_AND_MEAN#include <windows.h>#include <io.h>#elif defined(__OS2__)||defined(__EMX__)#define INCL_DOSSEMAPHORES#include <os2.h>#elsetypedef char CHAR;#endif#if defined(__alpha)/* 64 bit architectures */typedef signed char SBYTE;	/* 1 byte, signed */typedef unsigned char UBYTE;	/* 1 byte, unsigned */typedef signed short SWORD;	/* 2 bytes, signed */typedef unsigned short UWORD;	/* 2 bytes, unsigned */typedef signed int SLONG;	/* 4 bytes, signed */typedef unsigned int ULONG;	/* 4 bytes, unsigned */typedef int BOOL;		/* 0=false, <>0 true */#else/* 32 bit architectures */typedef signed char SBYTE;	/* 1 byte, signed */typedef unsigned char UBYTE;	/* 1 byte, unsigned */typedef signed short SWORD;	/* 2 bytes, signed */typedef unsigned short UWORD;	/* 2 bytes, unsigned */typedef signed long SLONG;	/* 4 bytes, signed */#if !defined(__OS2__)&&!defined(__EMX__)&&!defined(__W32__)typedef unsigned long ULONG;	/* 4 bytes, unsigned */typedef int BOOL;		/* 0=false, <>0 true */#endif#endif/* *    ========== Error handling and error codes */extern int ML_errno;extern char *ML_strerror (int);enum{  MMERR_OPENING_FILE = 1,  MMERR_OUT_OF_MEMORY,  MMERR_DYNAMIC_LINKING,  MMERR_SAMPLE_TOO_BIG,  MMERR_OUT_OF_HANDLES,  MMERR_UNKNOWN_WAVE_TYPE,  MMERR_LOADING_PATTERN,  MMERR_LOADING_TRACK,  MMERR_LOADING_HEADER,  MMERR_LOADING_SAMPLEINFO,  MMERR_NOT_A_MODULE,  MMERR_NOT_A_STREAM,  MMERR_MED_SYNTHSAMPLES,  MMERR_ITPACK_INVALID_DATA,  MMERR_MAX};/*========== Internal module representation (UniMod) interface *//* number of notes in an octave */#define OCTAVE 12extern void UniSetRow (UBYTE *);extern UBYTE UniGetByte (void);extern UWORD UniGetWord (void);extern UBYTE *UniFindRow (UBYTE *, UWORD);extern void UniSkipOpcode (UBYTE);extern void UniReset (void);extern void UniWriteByte (UBYTE);extern void UniWriteWord (UWORD);extern void UniNewline (void);extern UBYTE *UniDup (void);extern BOOL UniInit (void);extern void UniCleanup (void);extern void UniEffect (UWORD, UWORD);#define UniInstrument(x) UniEffect(UNI_INSTRUMENT,x)#define UniNote(x) UniEffect(UNI_NOTE,x)extern void UniPTEffect (UBYTE, UBYTE);extern void UniVolEffect (UWORD, UBYTE);/*========== Module Commands */enum{  /* Simple note */  UNI_NOTE = 1,  /* Instrument change */  UNI_INSTRUMENT,  /* Protracker effects */  UNI_PTEFFECT0,		/* arpeggio */  UNI_PTEFFECT1,		/* porta up */  UNI_PTEFFECT2,		/* porta down */  UNI_PTEFFECT3,		/* porta to note */  UNI_PTEFFECT4,		/* vibrato */  UNI_PTEFFECT5,		/* dual effect 3+A */  UNI_PTEFFECT6,		/* dual effect 4+A */  UNI_PTEFFECT7,		/* tremolo */  UNI_PTEFFECT8,		/* pan */  UNI_PTEFFECT9,		/* sample offset */  UNI_PTEFFECTA,		/* volume slide */  UNI_PTEFFECTB,		/* pattern jump */  UNI_PTEFFECTC,		/* set volume */  UNI_PTEFFECTD,		/* pattern break */  UNI_PTEFFECTE,		/* extended effects */  UNI_PTEFFECTF,		/* set speed */  /* Scream Tracker effects */  UNI_S3MEFFECTA,		/* set speed */  UNI_S3MEFFECTD,		/* volume slide */  UNI_S3MEFFECTE,		/* porta down */  UNI_S3MEFFECTF,		/* porta up */  UNI_S3MEFFECTI,		/* tremor */  UNI_S3MEFFECTQ,		/* retrig */  UNI_S3MEFFECTR,		/* tremolo */  UNI_S3MEFFECTT,		/* set tempo */  UNI_S3MEFFECTU,		/* fine vibrato */  UNI_KEYOFF,		/* note off */  /* Fast Tracker effects */  UNI_KEYFADE,		/* note fade */  UNI_VOLEFFECTS,		/* volume column effects */  UNI_XMEFFECT4,		/* vibrato */  UNI_XMEFFECTA,		/* volume slide */  UNI_XMEFFECTE1,		/* fine porta up */  UNI_XMEFFECTE2,		/* fine porta down */  UNI_XMEFFECTEA,		/* fine volume slide up */  UNI_XMEFFECTEB,		/* fine volume slide down */  UNI_XMEFFECTG,		/* set global volume */  UNI_XMEFFECTH,		/* global volume slide */  UNI_XMEFFECTL,		/* set envelope position */  UNI_XMEFFECTP,		/* pan slide */  UNI_XMEFFECTX1,		/* extra fine porta up */  UNI_XMEFFECTX2,		/* extra fine porta down */  /* Impulse Tracker effects */  UNI_ITEFFECTG,		/* porta to note */  UNI_ITEFFECTH,		/* vibrato */  UNI_ITEFFECTI,		/* tremor (xy not incremented) */  UNI_ITEFFECTM,		/* set channel volume */  UNI_ITEFFECTN,		/* slide / fineslide channel volume */  UNI_ITEFFECTP,		/* slide / fineslide channel panning */  UNI_ITEFFECTT,		/* slide tempo */  UNI_ITEFFECTU,		/* fine vibrato */  UNI_ITEFFECTW,		/* slide / fineslide global volume */  UNI_ITEFFECTY,		/* panbrello */  UNI_ITEFFECTZ,		/* resonant filters */  UNI_ITEFFECTS0,  /* UltraTracker effects */  UNI_ULTEFFECT9,		/* Sample fine offset */  /* OctaMED effects */  UNI_MEDSPEED,  UNI_MEDEFFECTF1,		/* play note twice */  UNI_MEDEFFECTF2,		/* delay note */  UNI_MEDEFFECTF3,		/* play note three times */  UNI_LAST};extern UWORD unioperands[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};/* IT resonant filter information */#define FILT_CUT      0x80#define FILT_RESONANT 0x81typedef struct FILTER{    UBYTE filter, inf;}FILTER;/*========== Instruments *//* 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 NNA_MASK        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        (KEY_OFF|KEY_FADE)#define KICK_ABSENT     0#define KICK_NOTE       1#define KICK_KEYOFF     2#define KICK_ENV        4#define AV_IT           1	/* IT vs. XM vibrato info *//* *    ========== Samples *//* Sample format [loading and in-memory] flags: */#define SF_16BITS       0x0001#define SF_STEREO       0x0002#define SF_SIGNED       0x0004#define SF_BIG_ENDIAN   0x0008#define SF_DELTA        0x0010#define SF_ITPACKED	0x0020#define	SF_FORMATMASK	0x003F/* General Playback flags */#define SF_LOOP         0x0100#define SF_BIDI         0x0200#define SF_REVERSE      0x0400#define SF_SUSTAIN      0x0800#define SF_PLAYBACKMASK	0x0C00/* Module-only Playback Flags */#define SF_OWNPAN	0x1000#define SF_UST_LOOP     0x2000#define SF_EXTRAPLAYBACKMASK	0x3000/* Panning constants */#define PAN_LEFT       0#define PAN_CENTER   128#define PAN_RIGHT    255#define PAN_SURROUND 512	/* panning value for Dolby Surround *//* This stuff is all filled -- it's up to you whether to implement it. */typedef struct SAMPLE{  SWORD panning;		/* panning (0-255 or PAN_SURROUND) */  ULONG speed;		/* Base playing speed/frequency of note */  UBYTE volume;		/* volume 0-64 */  UWORD inflags;		/* sample format on disk */  UWORD flags;		/* sample format in memory */  ULONG length;		/* length of sample (in samples!) */  ULONG loopstart;		/* repeat position (relative to start, in samples) */  ULONG loopend;		/* repeat end */  ULONG susbegin;		/* sustain loop begin (in samples) */  ULONG susend;		/* sustain loop end                */  UBYTE globvol;		/* global volume */  UBYTE vibflags;		/* autovibrato flag stuffs */  UBYTE vibtype;		/* Vibratos moved from INSTRUMENT to SAMPLE */  UBYTE vibsweep;  UBYTE vibdepth;  UBYTE vibrate;  CHAR *samplename;		/* name of the sample */  UWORD id;			/* available for user */  UBYTE divfactor;		/* for sample scaling */  ULONG seekpos;		/* seek position in file -- internal */  SWORD *data;			/* ptr to actual sample data */}SAMPLE;/* *    ========== Internal module representation (UniMod) *//*   Instrument definition - for information only, the only field which may be   of use in user programs is the name field *//* Instrument note count */#define INSTNOTES 120/* Envelope point */typedef struct ENVPT{  SWORD pos;  SWORD val;}ENVPT;/* Envelope point count */#define ENVPOINTS 32/* Instrument structure */typedef struct INSTRUMENT{  CHAR *insname;  UBYTE flags;  UWORD samplenumber[INSTNOTES];  UBYTE samplenote[INSTNOTES];  UBYTE nnatype;  UBYTE dca;		/* duplicate check action */  UBYTE dct;		/* duplicate check type */  UBYTE globvol;  UWORD volfade;  SWORD 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%) */  /* volume envelope */  UBYTE volflg;		/* bit 0: on 1: sustain 2: loop */  UBYTE volpts;  UBYTE volsusbeg;  UBYTE volsusend;  UBYTE volbeg;  UBYTE volend;  ENVPT volenv[ENVPOINTS];  /* panning envelope */  UBYTE panflg;		/* bit 0: on 1: sustain 2: loop */  UBYTE panpts;  UBYTE pansusbeg;  UBYTE pansusend;  UBYTE panbeg;  UBYTE panend;  ENVPT panenv[ENVPOINTS];  /* pitch envelope */  UBYTE pitflg;		/* bit 0: on 1: sustain 2: loop */  UBYTE pitpts;  UBYTE pitsusbeg;  UBYTE pitsusend;  UBYTE pitbeg;  UBYTE pitend;  ENVPT pitenv[ENVPOINTS];}INSTRUMENT;/* Module flags */#define UF_XMPERIODS 0x0001	/* XM periods / finetuning */#define UF_LINEAR    0x0002	/* LINEAR periods (UF_XMPERIODS must be set) */#define UF_INST      0x0004	/* Instruments are used */#define UF_NNA       0x0008	/* IT: NNA used, set numvoices rather than numchn */#define UF_S3MSLIDES 0x0010	/* uses old S3M volume slides */#define UF_BGSLIDES  0x0020	/* continue volume slides in the background */#define UF_HIGHBPM   0x0040	/* MED: can use >255 bpm */#define UF_NOWRAP    0x0080	/* XM-type (i.e. illogical) pattern brk semantics */#define UF_ARPMEM    0x0100	/* IT: need arpeggio memory */#define UF_FT2QUIRKS 0x0200	/* emulate some FT2 replay quirks */typedef struct MODULE{  /* general module information */  CHAR *songname;		/* name of the song */  CHAR *modtype;		/* string type of module loaded */  CHAR *comment;		/* module comments */  UWORD flags;		/* See module 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 numins;		/* number of instruments */  UWORD numsmp;		/* number of samples */  INSTRUMENT *instruments;	/* all instruments */  SAMPLE *samples;		/* all samples */  /* playback settings */  UWORD reppos;		/* restart position */  UBYTE initspeed;		/* initial song speed */  UWORD inittempo;		/* initial song tempo */  UBYTE initvolume;		/* initial global volume (0 - 128) */  UWORD panning[64];	/* 64 panning positions */  UBYTE chanvol[64];	/* 64 channel positions */  UWORD bpm;		/* current beats-per-minute speed */  /* internal module representation */  UWORD numtrk;		/* number of tracks */  UBYTE **tracks;		/* array of numtrk pointers to tracks */  UWORD *patterns;		/* array of Patterns */  UWORD *pattrows;		/* array of number of rows for each pattern */  UWORD *positions;		/* all positions */}  MODULE;/* used to convert c4spd to linear XM periods (IT and IMF loaders). */extern UWORD finetune[];extern UWORD getlinearperiod (UWORD, ULONG);extern UWORD getlogperiod (UWORD note, ULONG fine);extern UWORD getoldperiod (UWORD, ULONG);extern ULONG getfrequency (UBYTE, ULONG);extern ULONG getAmigaPeriod (UBYTE, ULONG);/* *    ========== External interface */extern UWORD finetune[];extern BOOL ML_8bitsamples;extern BOOL ML_monosamples;extern CHAR *ML_InfoLoader (void);extern void ML_RegisterAllLoaders (void);extern BOOL ML_Test (URL);extern MODULE *ML_Load (URL, int, BOOL);extern CHAR *ML_LoadTitle (URL);extern void ML_Free (MODULE *);#ifdef __cplusplus}#endif#endif/* ex:set ts=4: */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -