home *** CD-ROM | disk | FTP | other *** search
/ Fun Online 1996 September / FOL0996.iso / DOUBLE_T / PLAYABLE / AIL.H < prev    next >
Text File  |  1995-01-18  |  42KB  |  1,126 lines

  1. //████████████████████████████████████████████████████████████████████████████
  2. //██                                                                        ██
  3. //██  IBM Audio Interface Library                                           ██
  4. //██                                                                        ██
  5. //██  AIL.H: API function prototypes                                        ██
  6. //██                                                                        ██
  7. //██  Flat-model source compatible with IBM 32-bit ANSI C/C++               ██
  8. //██                                                                        ██
  9. //██  Version 3.00 of 11-Apr-94: Initial version for AIL 3.0                ██
  10. //██          3.01 of 21-Oct-94: Added Watcom/FlashTek support              ██
  11. //██                             AIL_restore_interrupts() changed to void   ██
  12. //██          3.02 of  3-Jan-95: VDI_HDR updated to DDK rev 1.12            ██
  13. //██                             Added AIL_INI structure                    ██
  14. //██                             Added AIL_install_DIG/MDI_INI() functions  ██
  15. //██                                                                        ██
  16. //██  Author: John Miles                                                    ██
  17. //██                                                                        ██
  18. //████████████████████████████████████████████████████████████████████████████
  19. //██                                                                        ██
  20. //██  Copyright (C) 1994-1995 Miles Design, Inc.                            ██
  21. //██                                                                        ██
  22. //██  Miles Design, Inc.                                                    ██
  23. //██  8301 Elander Drive                                                    ██
  24. //██  Austin, TX 78750                                                      ██
  25. //██                                                                        ██
  26. //██  (512) 345-2642 / FAX (512) 338-9630 / BBS (512) 454-9990              ██
  27. //██                                                                        ██
  28. //████████████████████████████████████████████████████████████████████████████
  29.  
  30. #ifndef AIL_VERSION
  31.  
  32. #define AIL_VERSION      "3.02"
  33. #define AIL_VERSION_DATE "18-Jan-95"
  34.  
  35. #endif
  36.  
  37. //
  38. // Watcom/FlashTek support (for library build)
  39. //
  40.  
  41. #ifdef INT21
  42. #ifdef __WATCOMC__
  43. #include "x32.h"
  44. #endif
  45. #endif
  46.  
  47. #ifndef AIL_H
  48. #define AIL_H
  49.  
  50. //
  51. // MetaWare support
  52. //
  53.  
  54. #ifdef __HIGHC__
  55.  
  56. #define cdecl _CC(_REVERSE_PARMS | _NEAR_CALL)
  57. #pragma Global_aliasing_convention("_%r");
  58. #pragma Align_members(1)
  59.  
  60. #ifndef FAR_PTR_DEF
  61. #define FAR_PTR_DEF
  62.  
  63. typedef struct   // Union used to build far pointers under MetaWare
  64. {
  65.    unsigned off;
  66.    unsigned short seg;
  67. }
  68. fp_ovl;
  69.  
  70. typedef union
  71. {
  72.    _Far void *ptr;
  73.    fp_ovl part;
  74. }
  75. FARPTR;
  76.  
  77. #endif
  78. #endif
  79.  
  80. //
  81. // End of MetaWare conditionals
  82. //
  83.  
  84. #ifdef __cplusplus
  85. extern "C" {
  86. #endif
  87.  
  88. //
  89. // Misc. constant definitions  
  90. //
  91.  
  92. #define MAX_DRVRS                16       // Max. # of simultaneous drivers
  93. #define MAX_TIMERS               16       // Max. # of simultaneous timers
  94. #define MAX_NOTES                32       // Max # of notes "on" 
  95. #define FOR_NEST                 4        // # of nested XMIDI FOR loops
  96. #define NUM_CHANS                16       // # of possible MIDI channels
  97. #define MAX_W_VOICES             16       // Max virtual wave synth voice cnt
  98. #define MAX_W_ENTRIES            512      // 512 wave library entries max.
  99.  
  100. #define MIN_CHAN                 ( 1-1)   // Min channel recognized (0-based)
  101. #define MAX_CHAN                 (16-1)   // Max channel recognized
  102. #define MIN_LOCK_CHAN            ( 2-1)   // Min channel available for locking
  103. #define MAX_LOCK_CHAN            ( 9-1)   // Max channel available for locking
  104. #define PERCUSS_CHAN             (10-1)   // Percussion channel (no locking)
  105.  
  106. #define DIG_F_MONO_8             0        // PCM data formats
  107. #define DIG_F_MONO_16            1
  108. #define DIG_F_STEREO_8           2
  109. #define DIG_F_STEREO_16          3
  110.  
  111. #define DIG_PCM_SIGN             0x0001   // PCM flags
  112. #define DIG_PCM_ORDER            0x0002
  113.  
  114. #define DIG_PCM_POLARITY         0x0004   // PCM flags used by driver hardware
  115. #define DIG_PCM_SPLIT            0x0008
  116. #define DIG_BUFFER_SERVICE       0x0010
  117. #define DIG_DUAL_DMA             0x0020   
  118. #define DIG_RECORDING_SUPPORTED  0x8000
  119.  
  120. #define AIL3DIG                  0        // .DIG driver
  121. #define AIL3MDI                  1        // .MDI driver
  122.  
  123. #define DIG_DETECT_8_BIT_ONLY    0x0001   // Detect 8-bit DMA only
  124. #define DIG_DETECT_16_BIT_ONLY   0x0002   // Detect 16-bit DMA only
  125. #define DIG_DETECT_8_AND_16_BITS 0x0003   // Detect both 8- and 16-bit DMA
  126.  
  127. #define DRV_INIT          0x300     // Functions common to .MDI and .DIG 
  128. #define DRV_GET_INFO      0x301     // drivers
  129. #define DRV_SERVE         0x302
  130. #define DRV_PARSE_ENV     0x303
  131. #define DRV_VERIFY_IO     0x304
  132. #define DRV_INIT_DEV      0x305
  133. #define DRV_SHUTDOWN_DEV  0x306
  134.  
  135. #define DIG_HW_VOLUME     0x400     // .DIG driver functions
  136. #define DIG_START_P_CMD   0x401
  137. #define DIG_STOP_P_REQ    0x402
  138. #define DIG_START_R_CMD   0x403
  139. #define DIG_STOP_R_REQ    0x404
  140. #define DIG_VSE           0x405
  141.  
  142. #define MDI_HW_VOLUME     0x500     // .MDI driver functions
  143. #define MDI_INIT_INS_MGR  0x501
  144. #define MDI_MIDI_XMIT     0x502
  145. #define MDI_INSTALL_T_SET 0x503
  146. #define MDI_GET_T_STATUS  0x504
  147. #define MDI_PROT_UNPROT_T 0x505
  148. #define MDI_VSE           0x506
  149.  
  150. //
  151. // Non-specific XMIDI/MIDI controllers and event types
  152. //
  153.  
  154. #define CALLBACK_PFX      108
  155. #define SEQ_BRANCH        109
  156. #define CHAN_LOCK         110
  157. #define CHAN_PROTECT      111
  158. #define VOICE_PROTECT     112
  159. #define TIMBRE_PROTECT    113
  160. #define PATCH_BANK_SEL    114
  161. #define INDIRECT_C_PFX    115
  162. #define FOR_LOOP          116
  163. #define NEXT_LOOP         117
  164. #define CLEAR_BEAT_BAR    118
  165. #define CALLBACK_TRIG     119
  166. #define SEQ_INDEX         120
  167.  
  168. #define MODULATION        1
  169. #define DATA_MSB          6
  170. #define PART_VOLUME       7
  171. #define PANPOT            10
  172. #define EXPRESSION        11
  173. #define DATA_LSB          38
  174. #define SUSTAIN           64
  175. #define REVERB            91
  176. #define CHORUS            93
  177. #define RPN_LSB           100
  178. #define RPN_MSB           101
  179. #define ALL_NOTES_OFF     123
  180.  
  181. #define EV_NOTE_OFF       0x80
  182. #define EV_NOTE_ON        0x90
  183. #define EV_POLY_PRESS     0xa0
  184. #define EV_CONTROL        0xb0
  185. #define EV_PROGRAM        0xc0
  186. #define EV_CHAN_PRESS     0xd0
  187. #define EV_PITCH          0xe0
  188. #define EV_SYSEX          0xf0
  189. #define EV_ESC            0xf7
  190. #define EV_META           0xff
  191.  
  192. #define META_EOT          0x2f
  193. #define META_TEMPO        0x51
  194. #define META_TIME_SIG     0x58
  195.  
  196. //
  197. // SAMPLE.system_data[] usage
  198. //
  199.  
  200. #define SSD_EOD_CALLBACK  0  // Application end-of-data callback if not NULL
  201. #define VOC_BLK_PTR       1  // Pointer to current block                                   
  202. #define VOC_REP_BLK       2  // Pointer to beginning of repeat loop block                  
  203. #define VOC_N_REPS        3  // # of iterations left in repeat loop
  204. #define VOC_MARKER        4  // Marker to search for, or -1 if all
  205. #define VOC_MARKER_FOUND  5  // Desired marker found if 1, else 0
  206. #define SSD_RELEASE       6  // Release sample handle upon termination if >0
  207. #define SSD_TEMP          7  // Temporary storage location for general use
  208.  
  209. //
  210. // SAMPLE.status flag values
  211. //
  212.  
  213. #define SMP_FREE          0x0001    // Sample is available for allocation
  214.  
  215. #define SMP_DONE          0x0002    // Sample has finished playing, or has 
  216.                                     // never been started
  217.  
  218. #define SMP_PLAYING       0x0004    // Sample is playing
  219.  
  220. #define SMP_STOPPED       0x0008    // Sample has been stopped
  221.  
  222. //
  223. // SEQUENCE.status flag values
  224. //
  225.  
  226. #define SEQ_FREE          0x0001    // Sequence is available for allocation
  227.  
  228. #define SEQ_DONE          0x0002    // Sequence has finished playing, or has 
  229.                                     // never been started
  230.  
  231. #define SEQ_PLAYING       0x0004    // Sequence is playing
  232.  
  233. #define SEQ_STOPPED       0x0008    // Sequence has been stopped
  234.  
  235. //
  236. // General type definitions for portability
  237. // 
  238.  
  239. #ifndef TYPEDEFS
  240. #define TYPEDEFS
  241.  
  242. typedef unsigned char  UBYTE;
  243. typedef unsigned short UWORD;
  244. typedef unsigned long  ULONG;
  245. typedef          char  BYTE;
  246. typedef signed   short WORD;
  247. typedef signed   long  LONG;
  248.  
  249. #endif
  250.  
  251. typedef void * CALLBACK;            // Generic callback function prototype
  252.  
  253. typedef ULONG REALFAR;              // Real-mode far pointer type
  254.  
  255. #ifdef __HIGHC__                    // Macro to convert REALFAR to protected *
  256. #else
  257.  
  258. #ifdef _X32_H_INCLUDED
  259.  
  260. #ifndef REALPTR
  261. #define REALPTR(x) ((void *) (ULONG) ((((ULONG) (x))>>16<<4) + ((x) & 0xffff) \
  262.                    + (ULONG) _x32_zero_base_ptr))
  263. #endif
  264.  
  265. #else
  266.  
  267. #ifndef REALPTR
  268. #define REALPTR(x) ((void *) (ULONG) ((((ULONG) (x))>>16<<4) + ((x) & 0xffff)))
  269. #endif
  270.  
  271. #endif
  272.  
  273. #endif
  274.  
  275. #define MIN_VAL 0
  276. #define NOM_VAL 1
  277. #define MAX_VAL 2
  278.  
  279. #ifndef YES
  280. #define YES 1
  281. #endif
  282.  
  283. #ifndef NO
  284. #define NO  0
  285. #endif
  286.  
  287. //
  288. // Preference names and default values
  289. //
  290.  
  291. #define DIG_SERVICE_RATE          0
  292. #define DEFAULT_DSR               200     // DMA buffer-polling rate = 200 Hz
  293.                                   
  294. #define DIG_HARDWARE_SAMPLE_RATE  1
  295. #define DEFAULT_DHSR              NOM_VAL // Use nominal sample rate by default
  296.  
  297. #define DIG_DMA_RESERVE           2
  298. #define DEFAULT_DDR               32768   // Reserve 32K real-mode mem for DMA
  299.  
  300. #define DIG_LATENCY               3
  301. #define DEFAULT_DL                100     // Half-buffer size in ms = 100
  302.  
  303. #define DIG_MIXER_CHANNELS        4     
  304. #define DEFAULT_DMC               16      // 16 allocatable SAMPLE structures
  305.  
  306. #define DIG_DEFAULT_VOLUME        5   
  307. #define DEFAULT_DDV               100     // Default sample volume = 100 (0-127)
  308.  
  309. #define DIG_RESAMPLING_TOLERANCE  6
  310. #define DEFAULT_DRT               655     // Resampling triggered at +/- 1%
  311.                                   
  312. #define DIG_USE_STEREO            7
  313. #define DEFAULT_DUS               NO      // Use mono output only
  314.                                   
  315. #define DIG_USE_16_BITS           8
  316. #define DEFAULT_DU16              NO      // Use 8-bit output by default
  317.                                   
  318. #define DIG_ALLOW_16_BIT_DMA      9
  319. #define DEFAULT_DA16DMA           YES     // OK to use 16-bit DMA if necessary
  320.  
  321. #define MDI_SERVICE_RATE          10
  322. #define DEFAULT_MSR               120     // XMIDI sequencer timing = 120 Hz
  323.  
  324. #define MDI_SEQUENCES             11
  325. #define DEFAULT_MS                8       // 8 sequence handles/driver
  326.  
  327. #define MDI_DEFAULT_VOLUME        12
  328. #define DEFAULT_MDV               127     // Default sequence volume = 127 (0-127)
  329.  
  330. #define MDI_QUANT_ADVANCE         13      
  331. #define DEFAULT_MQA               1       // Beat/bar count +1 interval
  332.  
  333. #define MDI_ALLOW_LOOP_BRANCHING  14      
  334. #define DEFAULT_ALB               NO      // Branches cancel XMIDI FOR loops
  335.  
  336. #define MDI_DEFAULT_BEND_RANGE    15
  337. #define DEFAULT_MDBR              2       // Default pitch-bend range = 2
  338.  
  339. #define AIL_SCAN_FOR_HARDWARE     16
  340. #define DEFAULT_ASH               YES     // Scan for I/O settings if necessary
  341.  
  342. #define AIL_ALLOW_VDM_EXECUTION   17
  343. #define DEFAULT_AVE               YES     // Allow Windows "DOS box" execution
  344.  
  345. #define N_PREFS 18                        // # of preference types
  346.  
  347. //
  348. // Type definitions
  349. //
  350.  
  351. typedef LONG     HTIMER;            // Handle to timer
  352.  
  353. typedef struct                      // I/O parameters structure
  354. {
  355.    WORD IO;
  356.    WORD IRQ;
  357.    WORD DMA_8_bit;
  358.    WORD DMA_16_bit;
  359.    LONG IO_reserved[4];
  360. }
  361. IO_PARMS;
  362.  
  363. typedef struct                      // Standard AIL 3.X VDI driver header
  364. {                                    
  365.    BYTE     ID[8];                  // "AIL3xxx" ID string, followed by ^Z
  366.  
  367.    ULONG    driver_version;
  368.  
  369.    REALFAR  common_IO_configurations;
  370.    UWORD    num_IO_configurations;
  371.  
  372.    REALFAR  environment_string;
  373.    
  374.    IO_PARMS IO;
  375.  
  376.    WORD     service_rate;
  377.  
  378.    UWORD    busy;
  379.  
  380.    UWORD    driver_num;             // Driver number
  381.  
  382.    UWORD    this_ISR;               // Offset of INT 66H dispatcher
  383.    REALFAR  prev_ISR;               // Pointer to previous INT 66H ISR
  384.  
  385.    BYTE     scratch[128];           // Shared scratch workspace
  386.    
  387.    BYTE     dev_name[80];           // Device name (VDI version >= 1.12 only)
  388. }  
  389. VDI_HDR;
  390.  
  391. typedef struct
  392. {
  393.    UWORD minimum_physical_sample_rate;
  394.    UWORD nominal_physical_sample_rate;
  395.    UWORD maximum_physical_sample_rate;
  396.  
  397.    UWORD minimum_DMA_half_buffer_size;
  398.    UWORD maximum_DMA_half_buffer_size;
  399.  
  400.    ULONG flags;
  401. }
  402. DIG_MODE;
  403.  
  404. typedef struct
  405. {
  406.    UBYTE    format_supported[16];
  407.    DIG_MODE format_data[16];
  408. }
  409. DIG_DDT;
  410.  
  411. typedef struct
  412. {
  413.    REALFAR  DMA_buffer_A;
  414.    REALFAR  DMA_buffer_B;
  415.    WORD     active_buffer;
  416. }
  417. DIG_DST;
  418.  
  419. typedef struct
  420. {
  421.    REALFAR  library_environment;
  422.    REALFAR  GTL_suffix;
  423.  
  424.    UWORD    num_voices;
  425.  
  426.    UWORD    max_melodic_channel;
  427.    UWORD    min_melodic_channel;
  428.    UWORD    percussion_channel;
  429. }
  430. MDI_DDT;
  431.  
  432. typedef struct
  433. {
  434.    BYTE     library_directory[128];
  435.    BYTE     GTL_filename[128];
  436.  
  437.    BYTE     MIDI_data[512];
  438. }
  439. MDI_DST;
  440.  
  441. typedef struct                   // Initialization file structure
  442. {
  443.    char     device_name[128];    // Device name
  444.    char     driver_name[128];    // Driver filename
  445.    IO_PARMS IO;                  // I/O parameters for driver
  446. }
  447. AIL_INI;
  448.  
  449. typedef struct                   // Handle to driver
  450. {
  451.    REALFAR  seg;                 // Seg:off pointer to driver (off=0)
  452.    ULONG    sel;                 // Selector for driver (off=0)
  453.    void    *buf;                 // Protected-mode pointer to driver
  454.    VDI_HDR *VHDR;                // Pointer to driver header (same as buf)
  455.    LONG     type;                // AIL3DIG or AIL3MDI (see below)
  456.  
  457.    LONG     initialized;         // 1 if hardware successfully init'd, else 0
  458.  
  459.    LONG     PM_ISR;              // -1 if no PM ISR hooked, else IRQ #
  460.  
  461.    HTIMER   server;              // DRV_SERVE periodic timer, if requested
  462.  
  463.                                  // Vector to high-level destructor, if any
  464.  
  465.    void (cdecl *destructor)(void *); 
  466.  
  467.                                  // High-level descriptor (DIG_ or MDI_DRIVER)
  468.    void        *descriptor;          
  469. }
  470. AIL_DRIVER;
  471.  
  472. struct _DIG_DRIVER;
  473.  
  474. typedef struct _SAMPLE           // Sample instance
  475. {
  476.    struct _DIG_DRIVER *driver;   // Driver for playback
  477.  
  478.    ULONG    status;              // SMP_ flags: _FREE, _DONE, _PLAYING
  479.  
  480.    void    *start[2];            // Sample buffer address (W)
  481.    ULONG    len  [2];            // Sample buffer size in bytes (W)
  482.    ULONG    pos  [2];            // Index to next byte (R/W)
  483.    ULONG    done [2];            // Nonzero if buffer with len=0 sent by app
  484.  
  485.    LONG     current_buffer;      // Buffer # active (0/1)
  486.    LONG     last_buffer;         // Last active buffer (for double-buffering)
  487.           
  488.    LONG     loop_count;          // # of cycles-1 (0=one-shot, -1=indefinite)
  489.           
  490.    LONG     format;              // DIG_F format (8/16 bits, mono/stereo)
  491.    ULONG    flags;               // DIG_PCM_SIGN / DIG_PCM_ORDER (stereo only)
  492.                                  
  493.    LONG     playback_rate;       // Playback rate in hertz
  494.                                  
  495.    LONG     volume;              // Sample volume 0-127
  496.    LONG     pan;                 // Mono panpot/stereo balance (0=L ... 127=R)
  497.  
  498.    LONG     vol_scale[2][256];   // [left/mono=0,right=1][256] channel volume
  499.  
  500.    CALLBACK SOB;                 // Start-of-block callback function
  501.    CALLBACK EOB;                 // End-of-buffer callback function
  502.    CALLBACK EOS;                 // End-of-sample callback function
  503.  
  504.    LONG     user_data  [8];      // Miscellaneous user data
  505.    LONG     system_data[8];      // Miscellaneous system data
  506. }
  507. SAMPLE;
  508.  
  509. typedef SAMPLE * HSAMPLE;        // Handle to sample
  510.  
  511. typedef struct _DIG_DRIVER          // Handle to digital audio driver
  512. {
  513.    AIL_DRIVER *drvr;                // Base driver descriptor
  514.  
  515.    DIG_DDT    *DDT;                 // Protected-mode pointer to DDT
  516.    DIG_DST    *DST;                 // Protected-mode pointer to DST
  517.  
  518.    HTIMER      timer;               // Buffer-polling timer
  519.  
  520.    LONG        half_buffer_size;    // Size of DMA half-buffer
  521.    LONG        DMA_rate;            // Hardware sample rate
  522.    LONG        hw_format;           // DIG_F code in use
  523.    ULONG       hw_mode_flags;       // DIG_PCM_ flags for mode in use
  524.  
  525.    REALFAR     DMA_seg;             // Seg:off pointer to DMA buffers (off=0)
  526.    ULONG       DMA_sel;             // Selector for DMA buffers (off=0)
  527.    void       *DMA_buf;             // Protected-mode pointer to DMA buffers
  528.  
  529.    void       *DMA[2];              // Protected-mode pointers to half-buffers
  530.                                     // (note that DMA[0] may != DMA_buf)
  531.  
  532.    WORD       *buffer_flag;         // Protected-mode pointer to buffer flag
  533.    LONG        last_buffer;         // Last active buffer flag value in driver
  534.  
  535.    LONG        channels_per_sample; // # of channels per sample (1 or 2)
  536.    LONG        bytes_per_channel;   // # of bytes per channel (1 or 2)
  537.    LONG        channels_per_buffer; // # of channels per half-buffer
  538.    LONG        samples_per_buffer;  // # of samples per half-buffer
  539.  
  540.    LONG        build_size;          // # of bytes in build buffer
  541.    LONG       *build_buffer;        // Build buffer (4 * n_samples bytes)
  542.  
  543.    LONG        playing;             // Playback active if non-zero
  544.    LONG        quiet;               // # of consecutive quiet sample periods
  545.  
  546.    SAMPLE     *samples;             // Pointer to list of SAMPLEs
  547.    LONG        n_samples;           // # of SAMPLEs
  548.  
  549.    LONG        n_active_samples;    // # of samples being processed
  550.  
  551.    LONG        system_data[8];      // Miscellaneous system data
  552. }
  553. DIG_DRIVER;
  554.  
  555. typedef struct                      // MIDI status log structure    
  556.    {
  557.    LONG     program   [NUM_CHANS];  // Program Change
  558.    LONG     pitch_l   [NUM_CHANS];  // Pitch Bend LSB
  559.    LONG     pitch_h   [NUM_CHANS];  // Pitch Bend MSB
  560.  
  561.    LONG     c_lock    [NUM_CHANS];  // Channel Lock
  562.    LONG     c_prot    [NUM_CHANS];  // Channel Lock Protection
  563.    LONG     c_v_prot  [NUM_CHANS];  // Voice Protection
  564.    LONG     bank      [NUM_CHANS];  // Patch Bank Select
  565.    LONG     indirect  [NUM_CHANS];  // ICA indirect controller value
  566.    LONG     callback  [NUM_CHANS];  // Callback Trigger
  567.  
  568.    LONG     mod       [NUM_CHANS];  // Modulation
  569.    LONG     vol       [NUM_CHANS];  // Volume
  570.    LONG     pan       [NUM_CHANS];  // Panpot
  571.    LONG     exp       [NUM_CHANS];  // Expression
  572.    LONG     sus       [NUM_CHANS];  // Sustain
  573.    LONG     reverb    [NUM_CHANS];  // Reverb
  574.    LONG     chorus    [NUM_CHANS];  // Chorus
  575.  
  576.    LONG     bend_range[NUM_CHANS];  // Bender Range (data MSB, RPN 0 assumed)
  577.    }
  578. CTRL_LOG;
  579.  
  580. struct _MDI_DRIVER;
  581.  
  582. typedef struct                            // XMIDI sequence state table
  583. {
  584.    struct _MDI_DRIVER *driver;            // Driver for playback
  585.  
  586.    ULONG    status;                       // SEQ_ flags
  587.  
  588.    void    *TIMB;                         // XMIDI IFF chunk pointers
  589.    void    *RBRN;           
  590.    void    *EVNT;           
  591.  
  592.    BYTE    *EVNT_ptr;                     // Current event pointer
  593.  
  594.    BYTE    *ICA;                          // Indirect Controller Array
  595.  
  596.    CALLBACK prefix_callback;              // XMIDI Callback Prefix handler
  597.    CALLBACK trigger_callback;             // XMIDI Callback Trigger handler
  598.    CALLBACK EOS;                          // End-of-sequence callback function
  599.  
  600.    LONG     loop_count;                   // 0=one-shot, -1=indefinite, ...
  601.  
  602.    LONG     interval_count;               // # of intervals until next event
  603.    LONG     interval_num;                 // # of intervals since start
  604.  
  605.    LONG     volume;                       // Sequence volume 0-127
  606.    LONG     volume_target;                // Target sequence volume 0-127
  607.    LONG     volume_accum;                 // Accumulated volume period
  608.    LONG     volume_period;                // Period for volume stepping
  609.  
  610.    LONG     tempo_percent;                // Relative tempo percentage 0-100
  611.    LONG     tempo_target;                 // Target tempo 0-100
  612.    LONG     tempo_accum;                  // Accumulated tempo period
  613.    LONG     tempo_period;                 // Period for tempo stepping
  614.    LONG     tempo_error;                  // Error counter for tempo DDA
  615.  
  616.    LONG     beat_count;                   // Sequence playback position
  617.    LONG     measure_count;  
  618.  
  619.    LONG     time_numerator;               // Sequence timing data
  620.    LONG     time_fraction;  
  621.    LONG     beat_fraction;  
  622.    LONG     time_per_beat;
  623.  
  624.    void    *FOR_ptrs       [FOR_NEST];    // Loop stack
  625.    LONG     FOR_loop_count [FOR_NEST];
  626.  
  627.    LONG     chan_map       [NUM_CHANS];   // Physical channel map for sequence
  628.  
  629.    CTRL_LOG shadow;                       // Controller values for sequence
  630.  
  631.    LONG     note_count;                   // # of notes "on"
  632.                           
  633.    LONG     note_chan      [MAX_NOTES];   // Channel for queued note (-1=free)
  634.    LONG     note_num       [MAX_NOTES];   // Note # for queued note
  635.    LONG     note_time      [MAX_NOTES];   // Remaining duration in intervals
  636.  
  637.    LONG     user_data  [8];               // Miscellaneous user data
  638.    LONG     system_data[8];               // Miscellaneous system data
  639. }
  640. SEQUENCE;
  641.  
  642. typedef SEQUENCE * HSEQUENCE;       // Handle to sequence
  643.  
  644. typedef struct _MDI_DRIVER          // Handle to XMIDI driver
  645. {
  646.    AIL_DRIVER *drvr;                // Base driver descriptor
  647.  
  648.    MDI_DDT    *DDT;                 // Protected-mode pointer to DDT
  649.    MDI_DST    *DST;                 // Protected-mode pointer to DST
  650.  
  651.    HTIMER      timer;               // XMIDI quantization timer
  652.    LONG        interval_time;       // XMIDI quantization timer interval in uS
  653.  
  654.    LONG        disable;             // > 0 to disable XMIDI service
  655.  
  656.    SEQUENCE   *sequences;           // Pointer to list of SEQUENCEs
  657.    LONG        n_sequences;         // # of SEQUENCEs
  658.  
  659.    LONG        lock  [NUM_CHANS];   // 1 if locked, 2 if protected, else 0
  660.    HSEQUENCE   locker[NUM_CHANS];   // HSEQUENCE which locked channel
  661.    HSEQUENCE   owner [NUM_CHANS];   // HSEQUENCE which owned locked channel
  662.    HSEQUENCE   user  [NUM_CHANS];   // Last sequence to use channel
  663.    LONG        state [NUM_CHANS];   // Lock state prior to being locked
  664.  
  665.    LONG        notes [NUM_CHANS];   // # of active notes in channel
  666.  
  667.    CALLBACK    event_trap;          // MIDI event trap callback function
  668.    CALLBACK    timbre_trap;         // MIDI timbre request callback function
  669.  
  670.    LONG        message_count;       // MIDI message count
  671.    LONG        offset;              // MIDI buffer offset
  672.  
  673.    LONG        system_data[8];      // Miscellaneous system data
  674. }
  675. MDI_DRIVER;
  676.  
  677. typedef struct                      // XMIDI TIMB IFF chunk
  678.    {
  679.    BYTE  name[4];
  680.  
  681.    UBYTE msb;
  682.    UBYTE lsb;
  683.    UBYTE lsb2;
  684.    UBYTE lsb3;
  685.  
  686.    UWORD n_entries;
  687.  
  688.    UWORD timbre[1];
  689.    }
  690. TIMB_chunk;
  691.  
  692. typedef struct                      // XMIDI RBRN IFF entry
  693.    {
  694.    WORD  bnum;
  695.    ULONG offset;
  696.    }
  697. RBRN_entry;
  698.  
  699. typedef struct                      // Wave library entry
  700. {
  701.    LONG  bank;                      // XMIDI bank, MIDI patch for sample
  702.    LONG  patch;                     
  703.  
  704.    LONG  root_key;                  // Root MIDI note # for sample (or -1)
  705.  
  706.    ULONG file_offset;               // Offset of wave data from start-of-file
  707.    ULONG size;                      // Size of wave sample in bytes
  708.  
  709.    LONG  format;                    // DIG_F format (8/16 bits, mono/stereo)
  710.    ULONG flags;                     // DIG_PCM_SIGN / DIG_PCM_ORDER (stereo)
  711.    LONG  playback_rate;             // Playback rate in hertz
  712. }
  713. WAVE_ENTRY;
  714.  
  715. typedef struct                      // Virtual "wave synthesizer" descriptor
  716. {
  717.    MDI_DRIVER *mdi;                 // MIDI driver for use with synthesizer
  718.    DIG_DRIVER *dig;                 // Digital driver for use with synthesizer
  719.  
  720.    WAVE_ENTRY *library;             // Pointer to wave library
  721.  
  722.    CALLBACK   *prev_event_fn;       // Previous MIDI event trap function
  723.    CALLBACK   *prev_timb_fn;        // Previous timbre request trap function
  724.  
  725.    CTRL_LOG    controls;            // MIDI controller states
  726.  
  727.    WAVE_ENTRY *wave [NUM_CHANS];    // Pointer to WAVE_ENTRY for each channel
  728.  
  729.    HSAMPLE     S    [MAX_W_VOICES]; // List of HSAMPLE voices
  730.    LONG        n_voices;            // Actual # of voices allocated to synth
  731.  
  732.    LONG        chan [MAX_W_VOICES]; // MIDI channel for each voice, or -1
  733.    LONG        note [MAX_W_VOICES]; // MIDI note number for voice
  734.    LONG        root [MAX_W_VOICES]; // MIDI root note for voice
  735.    LONG        rate [MAX_W_VOICES]; // Playback rate for voice
  736.    LONG        vel  [MAX_W_VOICES]; // MIDI note velocity for voice
  737.    ULONG       time [MAX_W_VOICES]; // Timestamp for voice
  738.  
  739.    ULONG       event;               // Event counter for LRU timestamps
  740. }
  741. WAVE_SYNTH;
  742.  
  743. typedef WAVE_SYNTH * HWAVE;         // Handle to virtual wave synthesizer
  744.  
  745. typedef struct                      // VDI interface register structure
  746. {
  747.    WORD AX;
  748.    WORD BX;
  749.    WORD CX;
  750.    WORD DX;
  751.    WORD SI;
  752.    WORD DI;
  753. }
  754. VDI_CALL;
  755.  
  756. //
  757. // Global preference array
  758. //
  759.  
  760. extern LONG           AIL_preference   [N_PREFS];
  761.  
  762. //
  763. // AIL fatal error type string
  764. //
  765.                                       
  766. extern BYTE           AIL_error        [256];
  767.  
  768. //
  769. // Last IO_PARMS structure used to attempt device detection
  770. //
  771.  
  772. extern IO_PARMS       AIL_last_IO_attempt;
  773.  
  774. //
  775. // High-level support services
  776. //
  777.  
  778. extern void    cdecl  AIL_startup                   (void);
  779. extern void    cdecl  AIL_shutdown                  (void);
  780.  
  781. extern LONG    cdecl  AIL_set_preference            (ULONG       number, 
  782.                                                      LONG        value);
  783. //
  784. // Low-level support services
  785. //
  786.  
  787. extern void    cdecl  AIL_lock                      (void);
  788. extern void    cdecl  AIL_unlock                    (void);
  789.  
  790. extern REALFAR cdecl  AIL_get_real_vect             (ULONG       vectnum);
  791. extern void    cdecl  AIL_set_real_vect             (ULONG       vectnum, 
  792.                                                      REALFAR     real_ptr);
  793.  
  794. extern void    cdecl  AIL_set_USE16_ISR             (LONG        IRQ,
  795.                                                      REALFAR     real_base,
  796.                                                      ULONG       ISR_offset);
  797.  
  798. extern void    cdecl  AIL_restore_USE16_ISR         (LONG        IRQ);
  799.  
  800. extern ULONG   cdecl  AIL_disable_interrupts        (void);
  801. extern void    cdecl  AIL_restore_interrupts        (ULONG       FD_register);
  802.  
  803. extern void    cdecl  AIL_switch_stack              (void       *stack, 
  804.                                                      ULONG       size, 
  805.                                                      ULONG      *SS, 
  806.                                                      void      **ESP, 
  807.                                                      void      **EBP);
  808.  
  809. extern void    cdecl  AIL_restore_stack             (ULONG       SS, 
  810.                                                      void       *ESP, 
  811.                                                      void       *EBP);
  812.  
  813. extern LONG    cdecl  AIL_call_driver               (AIL_DRIVER *drvr, 
  814.                                                      LONG        fn,
  815.                                                      VDI_CALL   *in, 
  816.                                                      VDI_CALL   *out);
  817.  
  818. extern void    cdecl  AIL_delay                     (LONG        intervals);
  819.  
  820. extern LONG    cdecl  AIL_background                (void);
  821.  
  822. extern LONG    cdecl  AIL_read_INI                  (AIL_INI    *INI,
  823.                                                      BYTE       *filename);
  824.  
  825. //                 
  826. // Process services
  827. //
  828.  
  829. extern HTIMER  cdecl  AIL_register_timer            (CALLBACK    callback_fn);
  830.  
  831. extern ULONG   cdecl  AIL_set_timer_user            (HTIMER      timer, 
  832.                                                      ULONG       user);
  833.  
  834. extern void    cdecl  AIL_set_timer_period          (HTIMER      timer, 
  835.                                                      ULONG       microseconds);
  836.  
  837. extern void    cdecl  AIL_set_timer_frequency       (HTIMER      timer, 
  838.                                                      ULONG       hertz);
  839.  
  840. extern void    cdecl  AIL_set_timer_divisor         (HTIMER      timer, 
  841.                                                      ULONG       PIT_divisor);
  842.  
  843. extern ULONG   cdecl  AIL_interrupt_divisor         (void);
  844.  
  845. extern void    cdecl  AIL_start_timer               (HTIMER      timer);
  846. extern void    cdecl  AIL_start_all_timers          (void);
  847.  
  848. extern void    cdecl  AIL_stop_timer                (HTIMER      timer);
  849. extern void    cdecl  AIL_stop_all_timers           (void);
  850.  
  851. extern void    cdecl  AIL_release_timer_handle      (HTIMER      timer);
  852. extern void    cdecl  AIL_release_all_timers        (void);
  853.  
  854. //
  855. // Low-level installation services
  856. //
  857.  
  858. extern IO_PARMS *   cdecl AIL_get_IO_environment    (AIL_DRIVER *drvr);
  859.  
  860. extern AIL_DRIVER * cdecl AIL_install_driver        (UBYTE      *driver_image, 
  861.                                                      ULONG       n_bytes);
  862.  
  863. extern void         cdecl AIL_uninstall_driver      (AIL_DRIVER *drvr);
  864.  
  865. //
  866. // SoundStream(TM) high-level digital services
  867. //
  868.  
  869. extern DIG_DRIVER * cdecl AIL_install_DIG_INI       (void);
  870.  
  871. extern DIG_DRIVER * cdecl AIL_install_DIG_driver_file 
  872.                                                     (BYTE       *filename, 
  873.                                                      IO_PARMS   *IO);
  874.  
  875. extern void         cdecl AIL_uninstall_DIG_driver  (DIG_DRIVER *dig);
  876.  
  877. extern HSAMPLE      cdecl AIL_allocate_sample_handle 
  878.                                                     (DIG_DRIVER *dig);
  879.  
  880. extern HSAMPLE      cdecl AIL_allocate_file_sample  (DIG_DRIVER *dig, 
  881.                                                      void       *file_image, 
  882.                                                      LONG        block);
  883.  
  884. extern void         cdecl AIL_release_sample_handle (HSAMPLE S);
  885.                                                  
  886. extern void         cdecl AIL_init_sample           (HSAMPLE S);
  887.  
  888. extern LONG         cdecl AIL_set_sample_file       (HSAMPLE S,
  889.                                                      void   *file_image,
  890.                                                      LONG    block);
  891.  
  892. extern void         cdecl AIL_set_sample_address    (HSAMPLE S, 
  893.                                                      void   *start, 
  894.                                                      ULONG   len);
  895.                                                  
  896. extern void         cdecl AIL_set_sample_type       (HSAMPLE S, 
  897.                                                      LONG    format, 
  898.                                                      ULONG   flags);
  899.  
  900. extern void         cdecl AIL_start_sample          (HSAMPLE S);
  901. extern void         cdecl AIL_stop_sample           (HSAMPLE S);
  902. extern void         cdecl AIL_resume_sample         (HSAMPLE S);
  903. extern void         cdecl AIL_end_sample            (HSAMPLE S);
  904.  
  905. extern void         cdecl AIL_set_sample_playback_rate 
  906.                                                     (HSAMPLE S, 
  907.                                                      LONG    playback_rate);
  908.  
  909. extern void         cdecl AIL_set_sample_volume     (HSAMPLE S, 
  910.                                                      LONG    volume);
  911.  
  912. extern void         cdecl AIL_set_sample_pan        (HSAMPLE S, 
  913.                                                      LONG    pan);
  914.  
  915. extern void         cdecl AIL_set_sample_loop_count (HSAMPLE S, 
  916.                                                      LONG    loop_count);
  917.  
  918. extern ULONG        cdecl AIL_sample_status         (HSAMPLE S);
  919. extern LONG         cdecl AIL_sample_playback_rate  (HSAMPLE S);
  920. extern LONG         cdecl AIL_sample_volume         (HSAMPLE S);
  921. extern LONG         cdecl AIL_sample_pan            (HSAMPLE S);
  922. extern LONG         cdecl AIL_sample_loop_count     (HSAMPLE S);
  923.  
  924. //
  925. // SoundStream(TM) low-level digital services
  926. //
  927.  
  928. extern DIG_DRIVER * cdecl AIL_install_DIG_driver_image 
  929.                                                     (void     *driver_image,
  930.                                                      ULONG     size,
  931.                                                      IO_PARMS *IO);
  932.  
  933. extern LONG     cdecl AIL_minimum_sample_buffer_size(DIG_DRIVER *dig,
  934.                                                      LONG        playback_rate,
  935.                                                      LONG        format);       
  936.  
  937. extern LONG     cdecl AIL_sample_buffer_ready       (HSAMPLE S);
  938.  
  939. extern void     cdecl AIL_load_sample_buffer        (HSAMPLE S,
  940.                                                      ULONG   buff_num,
  941.                                                      void   *buffer,
  942.                                                      ULONG   len);
  943.  
  944. extern void     cdecl AIL_set_sample_position       (HSAMPLE S, 
  945.                                                      ULONG   pos);
  946.  
  947. extern ULONG    cdecl AIL_sample_position           (HSAMPLE S);
  948.  
  949. extern CALLBACK cdecl AIL_register_SOB_callback     (HSAMPLE S, 
  950.                                                      CALLBACK SOB);
  951.  
  952. extern CALLBACK cdecl AIL_register_EOB_callback     (HSAMPLE S, 
  953.                                                      CALLBACK EOB);
  954.  
  955. extern CALLBACK cdecl AIL_register_EOS_callback     (HSAMPLE S, 
  956.                                                      CALLBACK EOS);
  957.  
  958. extern CALLBACK cdecl AIL_register_EOF_callback     (HSAMPLE S, 
  959.                                                      CALLBACK EOFILE);
  960.  
  961. extern void     cdecl AIL_set_sample_user_data      (HSAMPLE S,
  962.                                                      ULONG   index,
  963.                                                      LONG    value);
  964.  
  965. extern LONG     cdecl AIL_sample_user_data          (HSAMPLE S,
  966.                                                      ULONG   index);
  967.  
  968. extern LONG     cdecl AIL_active_sample_count       (DIG_DRIVER *dig);
  969.  
  970. //
  971. // High-level XMIDI services
  972. //
  973.  
  974. extern MDI_DRIVER * cdecl AIL_install_MDI_INI       (void);
  975.  
  976. extern MDI_DRIVER * cdecl AIL_install_MDI_driver_file 
  977.                                                     (BYTE       *filename, 
  978.                                                      IO_PARMS   *IO);
  979.  
  980. extern void         cdecl AIL_uninstall_MDI_driver  (MDI_DRIVER *mdi);
  981.  
  982. extern HSEQUENCE    cdecl AIL_allocate_sequence_handle 
  983.                                                     (MDI_DRIVER *mdi);
  984.  
  985. extern void         cdecl AIL_release_sequence_handle 
  986.                                                     (HSEQUENCE S);
  987.                                                  
  988. extern LONG         cdecl AIL_init_sequence         (HSEQUENCE S,
  989.                                                      void     *start,
  990.                                                      LONG      sequence_num);
  991.  
  992. extern void         cdecl AIL_start_sequence        (HSEQUENCE S);
  993. extern void         cdecl AIL_stop_sequence         (HSEQUENCE S);
  994. extern void         cdecl AIL_resume_sequence       (HSEQUENCE S);
  995. extern void         cdecl AIL_end_sequence          (HSEQUENCE S);
  996.  
  997. extern void         cdecl AIL_set_sequence_tempo    (HSEQUENCE S, 
  998.                                                      LONG      tempo,
  999.                                                      LONG      milliseconds);
  1000.  
  1001. extern void         cdecl AIL_set_sequence_volume   (HSEQUENCE S, 
  1002.                                                      LONG      volume,
  1003.                                                      LONG      milliseconds);
  1004.  
  1005. extern void         cdecl AIL_set_sequence_loop_count
  1006.                                                     (HSEQUENCE S, 
  1007.                                                      LONG      loop_count);
  1008.  
  1009. extern ULONG        cdecl AIL_sequence_status       (HSEQUENCE S);
  1010.                                                    
  1011. extern LONG         cdecl AIL_sequence_tempo        (HSEQUENCE S);
  1012. extern LONG         cdecl AIL_sequence_volume       (HSEQUENCE S);
  1013. extern LONG         cdecl AIL_sequence_loop_count   (HSEQUENCE S);
  1014.  
  1015. //
  1016. // Low-level XMIDI services
  1017. //
  1018.  
  1019. extern MDI_DRIVER * cdecl AIL_install_MDI_driver_image 
  1020.                                                     (void       *driver_image,
  1021.                                                      ULONG       size,
  1022.                                                      IO_PARMS   *IO);
  1023.  
  1024. extern void     cdecl AIL_set_GTL_filename_prefix   (BYTE       *prefix);
  1025.  
  1026. extern LONG     cdecl AIL_timbre_status             (MDI_DRIVER *mdi,
  1027.                                                      LONG        bank,
  1028.                                                      LONG        patch);
  1029.  
  1030. extern LONG     cdecl AIL_install_timbre            (MDI_DRIVER *mdi,
  1031.                                                      LONG        bank,
  1032.                                                      LONG        patch);
  1033.  
  1034. extern void     cdecl AIL_protect_timbre            (MDI_DRIVER *mdi,
  1035.                                                      LONG        bank,
  1036.                                                      LONG        patch);
  1037.  
  1038. extern void     cdecl AIL_unprotect_timbre          (MDI_DRIVER *mdi,
  1039.                                                      LONG        bank,
  1040.                                                      LONG        patch);
  1041.  
  1042. extern LONG     cdecl AIL_active_sequence_count     (MDI_DRIVER *mdi);
  1043.  
  1044. extern LONG     cdecl AIL_controller_value          (HSEQUENCE S,
  1045.                                                      LONG      channel,
  1046.                                                      LONG      controller_num);
  1047.  
  1048. extern LONG     cdecl AIL_channel_notes             (HSEQUENCE S,
  1049.                                                      LONG      channel);
  1050.  
  1051. extern void     cdecl AIL_sequence_position         (HSEQUENCE S,
  1052.                                                      LONG     *beat,
  1053.                                                      LONG     *measure);
  1054.  
  1055. extern void     cdecl AIL_branch_index              (HSEQUENCE S,
  1056.                                                      ULONG     marker);
  1057.  
  1058. extern CALLBACK cdecl AIL_register_prefix_callback  (HSEQUENCE S,
  1059.                                                      CALLBACK  callback);
  1060.  
  1061. extern CALLBACK cdecl AIL_register_trigger_callback (HSEQUENCE S,
  1062.                                                      CALLBACK  callback);
  1063.  
  1064. extern CALLBACK cdecl AIL_register_sequence_callback
  1065.                                                     (HSEQUENCE S,
  1066.                                                      CALLBACK  callback);
  1067.  
  1068. extern CALLBACK cdecl AIL_register_event_callback   (MDI_DRIVER *mdi,
  1069.                                                      CALLBACK    callback);
  1070.  
  1071. extern CALLBACK cdecl AIL_register_timbre_callback  (MDI_DRIVER *mdi,
  1072.                                                      CALLBACK    callback);
  1073.  
  1074. extern void     cdecl AIL_set_sequence_user_data    (HSEQUENCE S,
  1075.                                                      ULONG     index,
  1076.                                                      LONG      value);
  1077.  
  1078. extern LONG     cdecl AIL_sequence_user_data        (HSEQUENCE S,
  1079.                                                      ULONG     index);
  1080.  
  1081. extern void     cdecl AIL_register_ICA_array        (HSEQUENCE S,
  1082.                                                      BYTE     *array);
  1083.  
  1084. extern LONG     cdecl AIL_lock_channel              (MDI_DRIVER *mdi);
  1085.  
  1086. extern void     cdecl AIL_release_channel           (MDI_DRIVER *mdi,
  1087.                                                      LONG        channel);
  1088.  
  1089. extern void     cdecl AIL_map_sequence_channel      (HSEQUENCE S,
  1090.                                                      LONG      seq_channel,
  1091.                                                      LONG      new_channel);
  1092.  
  1093. extern LONG     cdecl AIL_true_sequence_channel     (HSEQUENCE S,
  1094.                                                      LONG      seq_channel);
  1095.  
  1096. extern void     cdecl AIL_send_channel_voice_message
  1097.                                                     (MDI_DRIVER *mdi,
  1098.                                                      HSEQUENCE   S,
  1099.                                                      LONG        status,
  1100.                                                      LONG        data_1,
  1101.                                                      LONG        data_2);
  1102.  
  1103. extern void     cdecl AIL_send_sysex_message        (MDI_DRIVER *mdi,
  1104.                                                      void       *buffer);
  1105.  
  1106. extern HWAVE    cdecl AIL_create_wave_synthesizer   (DIG_DRIVER *dig,
  1107.                                                      MDI_DRIVER *mdi,
  1108.                                                      void       *wave_lib,
  1109.                                                      LONG        polyphony);
  1110.  
  1111. extern void     cdecl AIL_destroy_wave_synthesizer  (HWAVE W);
  1112.  
  1113. #ifdef __cplusplus
  1114. }
  1115. #endif
  1116.    
  1117. //
  1118. // MetaWare support
  1119. //
  1120.  
  1121. #ifdef __HIGHC__
  1122. #pragma Global_aliasing_convention();
  1123. #endif
  1124.  
  1125. #endif
  1126.