/*      ruckmidi.h

        Defines the RUCKUS library's structs, constants, and prototype

	v1.0d 27-Feb-94

    ***********************************************************************
    * NOTE: RUCKUS is for medium, large, or huge models (do not use tiny, *
    * ---- small, or compact since these allow for only 1 code segment).  *
    ***********************************************************************

    ALL Borland C compilers must use the MIDMEMBC.OBJ module patch for
    RUCKMIDI.LIB. See the BORLAND.ZIP file for more information.

    Struct types must be standard byte packed; do not special align elements
    ** MS-specific #pragma pack(1) and pack() used in this header file **
*/

#pragma pack(1)

int far pascal RUCKMIDI(void far *datapack);

#define SysInfoMidi     0
#define InitMidi        1
#define ExitMidi        2
#define AtExitMidi      3
#define LoadMidi        4
#define PlayMidi        5

#define EndMidi         8
#define PauseMidi       9
#define DeallocMidi     10
#define FastFwdMidi     11
#define OutMsgMidi      12

#define SetAllMidi      20
#define SetVolumeMidi   21
#define SetToneMidi     22
#define SetPatchMidi    23
#define SetChMaskMidi   24

#define SetAllFMSBP     30

/* current highest function is 30 */

struct DeallocMidiPack { /* DMP */
 unsigned Func;
 int Stat;
 unsigned HandSeg;      /* RUCKUS allocates DOS memory */
 unsigned TypeFlag;     /* 0=DOS para */
}; /* 8 */

struct FastFwdMidiPack { /* FFMP */
 unsigned Func;
 int Stat;
 long TickCount;
}; /* 8 */

struct GetDataMidiPack { /* GDMP */
 unsigned Func;
 int Stat;
 unsigned long BytePos; /* current byte relative base ptr */
}; /* 8 */

struct InitMidiPack {   /* IMP */
 unsigned Func;
 int Stat;
 unsigned DeviceID;     /* 0=OPL-2 melodic,1=OPL-2 percussive */
 unsigned IOport;
 unsigned PercCh;       /* percussive channel (0-based) */
 unsigned ChMask;       /* bitmapped */
 unsigned Flags;        /* see Appendix D. */
 void far *InfoPtr;     /* ret:far ptr to RUCKMIDI info */
 void far *MidiExitPtr; /* ret:far ptr to ExitMidi routine */
}; /* 22 */

struct LoadMidiPack {   /* LMP */
 unsigned Func;
 int Stat;
 void far *FilenamePtr;/* far ptr to filenameZ to load */
 unsigned long StartPos; /* offset into file to start load at */
 unsigned long LoadSize; /* number of bytes to load (or 0 for autosize) */
 void far *LoadPtr;    /* ret:DOS seg:offset (offset always 0) */
}; /* 20 */

struct OutMsgMidiPack { /* OMMP */
 unsigned Func;
 int Stat;
 unsigned Mstatus;      /* status byte (8n, 9n, ... En) */
 unsigned Mdata;
}; /* 8 */

struct PlaybackMidiPack { /* PBMP */
 unsigned Func;
 int Stat;
 unsigned Mode;         /* mode (0=interrupt FG,1=BG) */
 void far *LoadPtr;   /* seg:off to start of data to play */
}; /* 10 */

struct PauseMidiPack {  /* PMP */
 unsigned Func;
 int Stat;
 unsigned Pause;        /* 0=unpause else pause */
}; /* 6 */

struct SetPack {        /* SP */
 unsigned Func;
 int Stat;              /* (if volume=0 SB speaker off'ed else on'ed) */
 unsigned Volume;       /* volume (left ch=MSB,right=LSB) (0-127,0-127) */
 unsigned IntRate;      /* playback interrupt rate (5000-23000) */
 unsigned Priority;     /* priority level (0-2, default=1) */
}; /* 10 */

struct SetFMProPack {   /* SFMPP */
 unsigned Func;
 int Stat;
 unsigned IOport;       /* base I/O port (0x220, 0x240) */
 int MasterVol;         /* 0x0F0F=max (low byte=right,hi=left,-1=no change) */
 int Steer;             /* 0=none,1=left,2=right,3=mute,-1=no change */
 unsigned FMvol;        /* as MasterVol but cannot skip (i.e., cannot=-1) */
}; /* 12 */

struct SetMidiPack {     /* SMP */
 unsigned Func;
 int Stat;
 unsigned Channel;      /* channel to set (bit mask of channels 0-15) */
 int Volume;            /* volume adjust */
 int Tone;              /* tone adjust */
 unsigned ChMask;       /* if bit=0 then that channel ignored */
 int PatchMapID;        /* patch map ID */
 void far *PatchMapPtr; /* farptr to alt patch map/ret:addr of PatchMapID */
}; /* 18 */

struct SysInfoMidiPack { /* SIMP */
 unsigned Func;
 int Stat;
 unsigned Device0;    /* =1 if OPL-2 melodic mode available */
 unsigned D0port;     /* 0x388 */
 unsigned D0mask;     /* available channel mask for SMP.ChMask */
 unsigned Device1;    /* =1 if OPL-2 percussive mode available */
 unsigned D1port;
 unsigned D1mask;
}; /* 16 */

struct XitMidiPack {    /* XMP */
 unsigned Func;
 int Stat;
}; /* 4 */


/* MIDI data area structure  PUBLIC MIDIDATA in RUCKMIDI.LIB */

struct MidiDataArea {
 unsigned DeviceID;     /*+0    ;0=AdLib melodic, 1=AdLib percussive... */
 unsigned Flags;        /* 2    ;bit0=1 use background processing */
                        /*      ;bit1=1 disable program change event */
                        /*      ;bit2-7 reserved (low byte used to send */
                        /*      ;while high byte used to return info) */
                        /*      ;bit8-13 reserved */
                        /*      ;bit14=1 then CTMF file playing */
                        /*      ;bit15=1 then AdLib ROL-convert */
 unsigned PercChannel;  /* 4    ;<> 0 percussion channel mapped to here */
 unsigned End;          /* 6    ;=1 end of MIDI (not playing) */
 unsigned MemDOS;       /* 8    ;DOS RAM available */
 unsigned MemUsed;      /* 10   ;K used by last load */
 unsigned TypeMIDI;     /* 12   ;MIDI type (0 or 1) */
 unsigned NoTracks;     /* 14   ;number of tracks */
 unsigned TicksQnote;   /* 16   ;ticks/quarter-note */

 unsigned long uSecsQnote;/* 18   ;micro-secs/quarter-note */
 unsigned long TickCount; /* 22   ;current tick count */

 void far *MusicPtr;  /* 26   ;farptr to current MIDI data byte */
 unsigned CurrTrk;      /* 30   ;current MIDI track */
 char TimeSig[4];       /* 32   ;nm,dn,MIDI clocks/beat,32nd notes/beat */
 char ChPrograms[16];   /* 36   ;channel programs */
 char ChVolumes[16];    /* 52   ;channel volume level (0-127) */
 char ChNotes[16];      /* 68   ;channel note values (0-127) */

 unsigned ChRelVolumes[16];/* 84   ;-128 to +127 range (0=no change) */
 unsigned ChRelNotes[16];  /* 116  ;-128 to +127 range (0=no change) */
};

#pragma pack()

/* end of ruckdac.h */
