Source file: /~heha/argon/multimed.zip/ADLIB/ADLIB.H

/****************************************************************************
 *
 *   adlib.h
 *
 *   Copyright (c) 1991-1992 Microsoft Corporation.  All Rights Reserved.
 *
 ***************************************************************************/

/* this way we get more symbols for debug */
#ifdef DEBUG
    #define static
#endif

#define DRIVER_VERSION  0x0101;

#define DEF_PORT      0x388              /* default port address */

#define NUMVOICES     (fPercussion?11:9) /* number of voices we have */
#define NUMMELODIC    (fPercussion?6:9)  /* number of melodic voices */
#define NUMPERCUSSIVE (fPercussion?5:0)  /* number of percussive voices */

#define NUMCHANNELS    16                /* number of MIDI channels */
#define DRUMKITCHANNEL 15                /* our drum kit channel */

#define MAXPATCH      180                /* max patch number (>127 for drums) */
#define MAXVOLUME    0x7f
#define NUMLOCPARAM    14                /* number of loc params per voice */

#define FIRSTDRUMNOTE  35
#define LASTDRUMNOTE   81
#define NUMDRUMNOTES   (LASTDRUMNOTE - FIRSTDRUMNOTE + 1)

#define MAX_PITCH    0x3fff         /* maximum pitch bend value */
#define MID_PITCH    0x2000         /* mid pitch bend value (no shift) */
#define NR_STEP_PITCH    25         /* steps per half-tone for pitch bend */
#define MID_C            60         /* MIDI standard mid C */
#define CHIP_MID_C       48         /* sound chip mid C */

#define RT_BANK         256
#define RT_DRUMKIT      257
#define DEFAULTBANK     1
#define DEFAULTDRUMKIT  1

/****************************************************************************/

#define ISSTATUS(bData)         ((bData) & 0x80)
#define FILTERCHANNEL(bStatus)  ((BYTE)((bStatus) & 0xf0))
#define FILTERSTATUS(bStatus)   ((BYTE)((bStatus) & 0x0f))

#define STATUS_NOTEOFF          0x80
#define STATUS_NOTEON           0x90
#define STATUS_POLYPHONICKEY    0xa0
#define STATUS_CONTROLCHANGE    0xb0
#define STATUS_PROGRAMCHANGE    0xc0
#define STATUS_CHANNELPRESSURE  0xd0
#define STATUS_PITCHBEND        0xe0

#define STATUS_SYS              0xf0
#define STATUS_SYSEX            0xf0
#define STATUS_QFRAME           0xf1
#define STATUS_SONGPOINTER      0xf2
#define STATUS_SONGSELECT       0xf3
#define STATUS_F4               0xf4
#define STATUS_F5               0xf5
#define STATUS_TUNEREQUEST      0xf6
#define STATUS_EOX              0xf7
#define STATUS_TIMINGCLOCK      0xf8
#define STATUS_F9               0xf9
#define STATUS_START            0xfa
#define STATUS_CONTINUE         0xfb
#define STATUS_STOP             0xfc
#define STATUS_FD               0xfd
#define STATUS_ACTIVESENSING    0xfe
#define STATUS_SYSTEMRESET      0xff

/****************************************************************************

    definitions of sound chip parameters

 ***************************************************************************/

/* parameters of each voice */
#define prmKsl          0      /* key scale level (KSL) - level controller */
#define prmMulti        1      /* frequency multiplier (MULTI) - oscillator */
#define prmFeedBack     2      /* modulation feedback (FB) - oscillator */
#define prmAttack       3      /* attack rate (AR) - envelope generator */
#define prmSustain      4      /* sustain level (SL) - envelope generator */
#define prmStaining     5      /* sustaining sound (SS) - envelope generator */
#define prmDecay        6      /* decay rate (DR) - envelope generator */
#define prmRelease      7      /* release rate (RR) - envelope generator */
#define prmLevel        8      /* output level (OL) - level controller */
#define prmAm           9      /* amplitude vibrato (AM) - level controller */
#define prmVib          10     /* frequency vibrator (VIB) - oscillator */
#define prmKsr          11     /* envelope scaling (KSR) - envelope generator */
#define prmFm           12     /* fm=0, additive=1 (FM) (operator 0 only) */
#define prmWaveSel      13     /* wave select */

/* global parameters */
#define prmAmDepth      14
#define prmVibDepth     15
#define prmNoteSel      16
#define prmPercussion   17

/* percussive voice numbers (0-5 are melodic voices, 12 op): */
#define BD              6         /* bass drum (2 op) */
#define SD              7         /* snare drum (1 op) */
#define TOM             8         /* tom-tom (1 op) */
#define CYMB            9         /* cymbal (1 op) */
#define HIHAT           10        /* hi-hat (1 op) */

/* In percussive mode, the last 4 voices (SD TOM HH CYMB) are created
 * using melodic voices 7 & 8. A noise generator uses channels 7 & 8
 * frequency information for creating rhythm instruments. Best results
 * are obtained by setting TOM two octaves below mid C and SD 7 half-tones
 * above TOM. In this implementation, only the TOM pitch may vary, with the
 * SD always set 7 half-tones above.
 */
#define TOM_PITCH        24      /* best frequency, in range of 0 to 95 */
#define TOM_TO_SD        7       /* 7 half-tones between voice 7 & 8 */
#define SD_PITCH         (TOM_PITCH + TOM_TO_SD)

/****************************************************************************

    bank file support

 ***************************************************************************/

#define BANK_SIG_LEN        6
#define BANK_FILLER_SIZE    8

typedef BYTE huge *HPBYTE;

/* instrument bank file header */
typedef struct {
    char      majorVersion;
    char      minorVersion;
    char      sig[BANK_SIG_LEN];          /* signature: "ADLIB-" */
    WORD      nrDefined;                  /* number of list entries used */
    WORD      nrEntry;                    /* number of total entries in list */
    long      offsetIndex;                /* offset of start of list of names */
    long      offsetTimbre;               /* offset of start of data */
    char      filler[BANK_FILLER_SIZE];   /* must be zero */
} BANKHDR, NEAR *NPBANKHDR, FAR *LPBANKHDR;

/****************************************************************************

    typedefs

 ***************************************************************************/

typedef BYTE NEAR * NPBYTE;
typedef WORD NEAR * NPWORD;

typedef struct {
    BYTE ksl;            /* KSL */
    BYTE freqMult;       /* MULTI */
    BYTE feedBack;       /* FB */
    BYTE attack;         /* AR */
    BYTE sustLevel;      /* SL */
    BYTE sustain;        /* SS */
    BYTE decay;          /* DR */
    BYTE release;        /* RR */
    BYTE output;         /* OL */
    BYTE am;             /* AM */
    BYTE vib;            /* VIB */
    BYTE ksr;            /* KSR */
    BYTE fm;             /* FM */
} OPERATOR, NEAR *NPOPERATOR, FAR *LPOPERATOR;

typedef struct {
    BYTE      mode;             /* 0 = melodic, 1 = percussive */
    BYTE      percVoice;        /* if mode == 1, voice number to be used */
    OPERATOR  op0;
    OPERATOR  op1;
    BYTE      wave0;            /* waveform for operator 0 */
    BYTE      wave1;            /* waveform for operator 1 */
} TIMBRE, NEAR *NPTIMBRE, FAR *LPTIMBRE;

typedef struct drumpatch_tag {
    BYTE patch;                 /* the patch to use */
    BYTE note;                  /* the note to play  */
} DRUMPATCH;

/* client information structure */
typedef struct synthalloc_tag {
    HANDLE       hMidiOut;      /* handle for our parent in MMSYSTEM */
    DWORD        dwCallback;    /* callback for client */
    DWORD        dwInstance;    /* DWORD of reference data from client */
    DWORD        dwFlags;       /* allocation flags */
} SYNTHALLOC, NEAR *NPSYNTHALLOC;

typedef struct _MIDIMSG {
    BYTE ch;                    /* channel number */
    BYTE b1;                    /* first data byte */
    BYTE b2;                    /* second data byte */
    BYTE pad;                   /* not used */
} MIDIMSG, FAR *LPMIDIMSG;

/****************************************************************************

    prototypes and extern variable declarations

 ***************************************************************************/

/****************************************************************************

    midic.c

 ***************************************************************************/

extern DWORD FAR PASCAL _loadds modMessage(WORD id, WORD msg, DWORD dwUser, DWORD dwParam1, DWORD dwParam2);
extern BYTE bCurrentLen;
extern BYTE status;

/****************************************************************************

    midimain.c

 ***************************************************************************/

extern void NEAR PASCAL synthMidiData(HPBYTE lpBuf, DWORD dwLength);
extern void NEAR PASCAL synthAllNotesOff(void);

/****************************************************************************

    adlib.c

 ***************************************************************************/

extern BOOL FAR PASCAL vadlibdGetEntryPoint( void );
extern WORD FAR PASCAL vadlibdAcquireAdLibSynth( void );
extern WORD FAR PASCAL vadlibdReleaseAdLibSynth( void );

extern void FAR PASCAL SetSlotParam(BYTE slot, NPBYTE param, BYTE waveSel);
extern void FAR PASCAL SetFreq(BYTE voice, BYTE pitch, BYTE keyOn);
extern void FAR PASCAL SndSAmVibRhythm(void);
extern void FAR PASCAL SndSNoteSel(void);
extern void NEAR PASCAL SndSKslLevel(BYTE slot);
extern void NEAR PASCAL SetVoiceTimbre(BYTE voice, NPOPERATOR pOper0);
extern void NEAR PASCAL SetVoicePitch(BYTE voice, WORD pitchBend);
extern void NEAR PASCAL SetVoiceVolume(BYTE voice, BYTE volume);
extern void NEAR PASCAL NoteOn(BYTE voice, BYTE pitch);
extern void NEAR PASCAL NoteOff(BYTE voice);

extern BYTE slotRelVolume[18];    /* relative volume of slots */
extern BYTE percBits;             /* control bits of percussive voices */
extern BYTE amDepth;              /* chip global parameters ... */
extern BYTE vibDepth;             /* ... */
extern BYTE noteSel;              /* ... */
extern BYTE modeWaveSel;          /* != 0 if used with 'wave-select' parms */
extern BOOL fPercussion;          /* percussion mode parameter */
extern int  pitchRangeStep;       /* == pitchRange * NR_STEP_PITCH */
extern WORD   fNumNotes[NR_STEP_PITCH] [12];
extern NPWORD fNumFreqPtr[11];    /* lines of fNumNotes table (one per voice) */
extern int  halfToneOffset[11];   /* one per voice */
extern BYTE noteDIV12[96];        /* table of (0..95) DIV 12 */
extern BYTE noteMOD12[96];        /* table of (0..95) MOD 12 */
extern BYTE offsetSlot[];         /* offset of each slot */
extern BYTE operSlot[];           /* operator (0 or 1) in each slot */

extern BYTE gbMidiLengths[];
extern BYTE gbSysLengths[];

#define MIDILENGTH(bStatus)     (gbMidiLengths[((bStatus) & 0x70) >> 4])
#define SYSLENGTH(bStatus)      (gbSysLengths[(bStatus) & 0x07])


/****************************************************************************

    init.c

 ***************************************************************************/

extern BOOL NEAR PASCAL Enable(void);
extern void NEAR PASCAL Disable(void);
extern int NEAR PASCAL LibMain(HANDLE hInstance, WORD wHeapSize, LPSTR lpCmdLine);

extern WORD      wPort;                    /* card's port address */
extern WORD      wDebugLevel;              /* debug level */
extern BOOL      fEnabled;                 /* have we successfully enabled? */
extern TIMBRE    patches[MAXPATCH];        /* melodic patch information */
extern DRUMPATCH drumpatch[NUMDRUMNOTES];  /* drumkit patch information */

/****************************************************************************

    adliba.asm

 ***************************************************************************/

extern BYTE FAR PASCAL inport(void);
extern void FAR PASCAL SndOutput(BYTE addr, BYTE dataVal);

/****************************************************************************

    strings

 ***************************************************************************/

#ifndef NOSTR
extern char far aszDriverName[];
extern char far aszProductName[];
extern char far aszAdlibDelay[];
extern char far aszSystemIni[];
  #ifdef DEBUG
  extern char far aszAdlib[];
  extern char far aszMMDebug[];
  #endif
#endif /* NOSTR */

/****************************************************************************

       Debug output

 ***************************************************************************/

#ifdef DEBUG
   #define D1(sz) if (wDebugLevel >= 1) (OutputDebugStr("\r\nADLIB: "),OutputDebugStr(sz))
   #define D2(sz) if (wDebugLevel >= 2) (OutputDebugStr(" "),OutputDebugStr(sz))
   #define D3(sz) if (wDebugLevel >= 3) (OutputDebugStr(" "),OutputDebugStr(sz))
   #define D4(sz) if (wDebugLevel >= 4) (OutputDebugStr(" "),OutputDebugStr(sz))

#else
   #define D1(sz) 0
   #define D2(sz) 0
   #define D3(sz) 0
   #define D4(sz) 0
#endif
Detected encoding: ASCII (7 bit)2