/********************************************
*
* MIDI Tool Set
*
* Copyright Apple Computer, Inc.1986-90
* All Rights Reserved
*
* Copyright 1992, Byte Works, Inc.
*
********************************************/

#ifndef __TYPES__
#include <TYPES.h>
#endif

#ifndef __MIDI__
#define __MIDI__

/* MIDI */
#define miToolNum 0x0020                /* the tool number of the MIDI Tool Set */
#define miDrvrFileType 0x00BB           /* filetype of MIDI device driver */
#define miNSVer 0x0102                  /* minimum version of Note Synthesizer required by MIDI Tool Set */
#define miSTVer 0x0203                  /* minimum version of Sound Tools needed by MIDI Tool Set */
#define miDrvrAuxType 0x0300            /* aux type of MIDI device driver */

/* Error Codes */
#define miStartUpErr 0x2000             /* MIDI Tool Set is not started  */
#define miPacketErr 0x2001              /* incorrect length for a received MIDI command */
#define miArrayErr 0x2002               /* a designated array had an insufficient or illegal size */
#define miFullBufErr 0x2003             /* input buffer overflow */
#define miToolsErr 0x2004               /* the required tools were not started up or had insufficient versions */
#define miOutOffErr 0x2005              /* MIDI output must first be enabled */
#define miNoBufErr 0x2007               /* no buffer is currently allocated */
#define miDriverErr 0x2008              /* the designated file is not a legal MIDI device driver */
#define miBadFreqErr 0x2009             /* the MIDI clock cannot attain the requested frequency */
#define miClockErr 0x200A               /* the MIDI clock value wrapped to zero */
#define miConflictErr 0x200B            /* conflicting processes for MIDI input */
#define miNoDevErr 0x200C               /* no MIDI device driver loaded */
#define miDevNotAvail 0x2080            /* the requested device is not available */
#define miDevSlotBusy 0x2081            /* requested slot is already in use */
#define miDevBusy 0x2082                /* the requested device is already in use */
#define miDevOverrun 0x2083             /* device overrun by incoming MIDI data */
#define miDevNoConnect 0x2084           /* no connection to MIDI */
#define miDevReadErr 0x2085             /* framing error in received MIDI data */
#define miDevVersion 0x2086             /* ROM version is incompatible with device driver */
#define miDevIntHndlr 0x2087            /* conflicting interrupt handler is installed */

/* MidiClock */
#define miSetClock 0x0000               /* set time stamp clock */
#define miStartClock 0x0001             /* start time stamp clock */
#define miStopClock 0x0002              /* stop time stamp clock */
#define miSetFreq 0x0003                /* set clock frequency */

/* MidiControl */
#define miRawMode 0x00000000L           /* raw mode for MIDI input and output */
#define miSetRTVec 0x0000               /* set real-time message vector */
#define miPacketMode 0x00000001L        /* packet mode for MIDI input and output */
#define miSetErrVec 0x0001              /* set real-time error vector */
#define miStandardMode 0x00000002L      /* standard mode for MIDI input and output */
#define miSetInBuf 0x0002               /* set input buffer information */
#define miSetOutBuf 0x0003              /* set output buffer information */
#define miStartInput 0x0004             /* start MIDI input */
#define miStartOutput 0x0005            /* start MIDI output */
#define miStopInput 0x0006              /* stop MIDI input */
#define miStopOutput 0x0007             /* stop MIDI output */
#define miFlushInput 0x0008             /* discard contents of input buffer */
#define miFlushOutput 0x0009            /* discard contents of output buffer */
#define miFlushPacket 0x000A            /* discard next input packet */
#define miWaitOutput 0x000B             /* wait for output buffer to empty */
#define miSetInMode 0x000C              /* set input mode */
#define miSetOutMode 0x000D             /* set output mode */
#define miClrNotePad 0x000E             /* clear all notes marked on in the note pad */
#define miSetDelay 0x000F               /* set minimum delay between output packets */
#define miOutputStat 0x0010             /* enable/disable output of running-status */
#define miIgnoreSysEx 0x0011            /* ignore system exclusive input */

/* MidiDevice */
#define miSelectDrvr 0x0000             /* display device driver selection dialog */
#define miLoadDrvr 0x0001               /* load and initialize device driver */
#define miUnloadDrvr 0x0002             /* shutdown MIDI device, unload driver */

/* MidiInfo */
#define miNextPktLen 0x0000             /* return length of next packet */
#define miInputChars 0x0001             /* return number of characters in input buffer */
#define miOutputChars 0x0002            /* return number of characters in output buffer */
#define miMaxInChars 0x0003             /* return maximum number of characters in input buffer */
#define miMaxOutChars 0x0004            /* return maximum number of characters in output buffer */
#define miRecordAddr 0x0005             /* return current MidiRecordSeq address */
#define miPlayAddr 0x0006               /* return current MidiPlaySeq address */
#define miClockValue 0x0007             /* return current time stamp clock value */
#define miClockFreq 0x0008              /* return number of clock ticks per second */
#define midiInputPoll 0x00E101B2L       /* MidiInputChannel - vector to poll MIDI input channel */

struct MiBufInfo {
   Word bufSize;                        /* size of buffer (0 for default) */
   Pointer address;                     /* address of buffer (0 for auto-allocation) */
   };
typedef struct MiBufInfo MiBufInfo;

struct MiDriverInfo {
   Word slot;                           /* device slot */
   Word external;                       /* slot internal (=0) / external (=1) */
   Byte pathname[65];                   /* device driver pathname */
   };
typedef struct MiDriverInfo MiDriverInfo, *MiDriverInfoPtr;

extern pascal void MidiBootInit(void) inline(0x0120,dispatcher);
extern pascal void MidiStartUp(Word, Word) inline(0x0220,dispatcher);
extern pascal void MidiShutDown(void) inline(0x0320,dispatcher);
extern pascal Word MidiVersion(void) inline(0x0420,dispatcher);
extern pascal void MidiReset(void) inline(0x0520,dispatcher);
extern pascal Boolean MidiStatus(void) inline(0x0620,dispatcher);
extern pascal void MidiClock(Word, Long) inline(0x0B20,dispatcher);
extern pascal void MidiControl(Word, Long) inline(0x0920,dispatcher);
extern pascal void MidiDevice(Word, Pointer) inline(0x0A20,dispatcher);
extern pascal LongWord MidiInfo(Word) inline(0x0C20,dispatcher);
#define MidiInputPoll() asm {jsl 0xE101B2} /* Not a true tool call. Made through its own vector */
extern pascal Word MidiReadPacket(Pointer, Word) inline(0x0D20,dispatcher);
extern pascal Word MidiWritePacket(Pointer) inline(0x0E20,dispatcher);

#endif