home *** CD-ROM | disk | FTP | other *** search
/ Audio 4.94 - Over 11,000 Files / audio-11000.iso / msdos / midi / mpusr2 / mpu.h < prev    next >
Encoding:
C/C++ Source or Header  |  1992-05-24  |  3.6 KB  |  144 lines

  1. #ifndef STD_H
  2. #include "std.h"
  3. #endif
  4.  
  5. #ifndef MPU_H
  6. #define MPU_H
  7. // Manifest constants
  8.  
  9. #define MAX_MPU_TRACK 7    // Maximum number of MPU play tracks available
  10.                                 // NOTE: Mpu supports up to 8 tracks, but track 8
  11.                                 // is used to send unscheduled midi messages, so this
  12.                                 // number can't exceed 7! -rd
  13.  
  14.  
  15. // MPU Module Error Codes
  16. typedef enum {
  17.     MPU_OK = 0,
  18.     MPU_NOMEM,        // Insufficient memory to run
  19.     MPU_EHARDWARE,  // Hardware problem (interrupts?)
  20.     MPU_NOHARDWARE, // Hardware not detected
  21.     MPU_NOINTERRUPTHANDLERS, // Too many open MpuPortT's.
  22.     MPU_OVERRUN,      // Receive overrun
  23. } MpuErrorT;
  24.  
  25. // Error strings to match (PRIVATE)
  26. #ifdef MPU_PRIVATES
  27. PRIVATE char *mpuErrorStrings[] = {
  28.     "Successful",
  29.     "Insufficient memory",
  30.     "MPU-401 Hardware error",
  31.     "Unable to detect MPU-401",
  32.     "Too many installed interrupt handlers",
  33.     "Read overrun"
  34. };
  35. #endif
  36.  
  37. // Mpu Mode bits
  38. #define MPU_VOICES_THRU     0x02
  39. #define MPU_EXCLUSIVE_THRU  0x04
  40. #define MPU_REALTIME_THRU   0x08
  41. #define MPU_COMMON_THRU     0x10
  42.  
  43. #define MPU_DEFAULT_THRU (MPU_VOICES_THRU)
  44. #define MPU_NONE_THRU         0x00
  45.  
  46. #define MPU_RX_EXCLUSIVE        0x20
  47. #define MPU_RX_COMMON           0x40
  48. #define MPU_RX_REALTIME         0x80
  49. #define MPU_RX_BENDER          0x100
  50. #define MPU_RX_MODE            0x200
  51.  
  52. #define MPU_RX_DEFAULT           0x00
  53. #define MPU_RX_ALL               0x3E0
  54.  
  55. typedef enum MpuClockT {
  56.     MPU_INTERNAL_CLOCK,
  57.     MPU_MIDI_CLOCK,
  58.     MPU_FSK_CLOCK
  59. } MpuClockT;
  60.  
  61. typedef enum MpuTimebaseT {
  62.     MPU_TIMEBASE_48,
  63.     MPU_TIMEBASE_72,
  64.     MPU_TIMEBASE_96,
  65.     MPU_TIMEBASE_120,
  66.     MPU_TIMEBASE_144,
  67.     MPU_TIMEBASE_168,
  68.     MPU_TIMEBASE_192
  69. } MpuTimebaseT;
  70.  
  71. typedef enum MpuOperatingModeT {
  72.     RECORD_MODE,    // Read messages w/ timestamps
  73.     PLAY_MODE,        // Write scheduled messages
  74.     RECORDPLAY_MODE, // Read messages w/ timestamps, write scheduled messages
  75.     STOP_MODE       // Stop
  76. } MpuOperatingModeT;
  77.  
  78.  
  79.  
  80. // Mpu Port Control structure
  81. typedef struct MpuPortT {
  82.     int mpuErrno;
  83.     int dataPort;
  84.     int commandPort;
  85.     int statusPort;
  86.     int mpuInterrupt;
  87.     int dataHead;
  88.     int dataTail;
  89.     int bufferSize;
  90.     int currentMode;
  91.     UCHAR *readBuffer;
  92.     void interrupt (*oldInterrupt)();
  93.     int ungetChar;
  94.     long currentTime;
  95.     int lastCommand;
  96.     /* Interrupt handler data */
  97.     BOOL _inSysex;
  98.     void (*trackRequestHandler)(void *,int );
  99.     void *requestHandlerData;
  100.  
  101.     BOOL overrunError;
  102. } MpuPortT;
  103.  
  104. // Function Prototypes
  105.  
  106. int GetMpuStatus(MpuPortT *mpu);
  107. char *MpuErrorString(int mpuErrno);
  108.  
  109. MpuPortT *CreateMpuPort(
  110.     int base_address,        // Mpu Base address (default 0x330)
  111.     int interrupt_number,   // Mpu Interrupt (default 2)
  112.     int buffer_size,        // Receive buffer size (default 1024)
  113.     enum MpuOperatingModeT operating_mode, // Operating mode:
  114.                              // RECORD_MODE,
  115.                              // PLAY_MODE,
  116.                              // READWRITE_MODE
  117.     enum MpuClockT clock_source, //     MPU_INTERNAL_CLOCK
  118.                                  // or    MPU_MIDI_CLOCK
  119.                                  // or    MPU_FSK_CLOCK
  120.     int tempo,                    // Beats per minute
  121.     enum MpuTimebaseT timebase, // Ticks per beat (see MpuTimebaseT in MPU.H)
  122.     int metronome_measure_length, // beats per measure,0-> metronome off
  123.     int mode,                // See DESCRIPTION
  124.     int midi_channel_mask,  // bit n controls midi channel n+1
  125.                             // bit = 0 -> pass through without host intervention
  126.                             // bit = 1 -> record/filter this midi channel
  127.     int *result                // retcode is placed here
  128. );
  129.  
  130. BOOL DestroyMpu(MpuPortT *mpu);
  131.  
  132. int SendCommand(MpuPortT *mpu,UCHAR cmd);
  133. int SendData(MpuPortT *mpu,UCHAR data);
  134.  
  135. int ReadData(MpuPortT *mpu);
  136. void UngetData(MpuPortT *mpu,UCHAR data);
  137.  
  138. void SetMpuOperatingMode(
  139.     MpuPortT *port,
  140.     MpuOperatingModeT operating_mode // e.g. RECORD_MODE, PLAY_MODE, STOP_MODE
  141. );
  142.  
  143. #endif
  144.