/* Copyright (C) 1986 by M. J. Shannon, Jr. ** Permission to distribute for non-commercial uses granted as long as this ** notice is retained. Violators will be prosecuted. */ /* Port addresses */ #define MPUP_STAT 0x331 /* RO: status */ #define MPUP_COMD 0x331 /* WO: command */ #define MPUP_DATA 0x330 /* RW: data */ /* Bits in status port */ #define MPUPS_DSR 0x80 /* mpu: ready to send */ #define MPUPS_DRR 0x40 /* mpu: ready to receive */ /* MPU commands */ #define CMD_UART 0x3F /* become a dumb uart */ #define CMD_INTCLOCK 0x80 /* MPU is master clock */ #define CMD_EXTCLOCK 0x82 /* master clock is not MPU */ #define CMD_FSKINT 0x92 /* set FSK sync res. to internal sync res. */ #define CMD_FSKMIDI 0x93 /* set FSK sync res. to MIDI sync res. */ #define CMD_RESET 0xFF /* reset to default state */ /* Initialization switches */ #define SWD_ALLOFF 0x30 /* disable automatic "ALL NOTES OFF" */ #define SWD_REALTIME 0x32 /* disable automatic real time msgs */ #define SWD_THRU 0x33 /* disable "thru" function */ #define SWE_TIME 0x34 /* add timing bytes in "data in stop" mode */ #define SWE_MODE 0x35 /* pass mode messages to host */ #define SWE_TEXCL 0x37 /* pass exclusive msgs from in to out */ #define SWE_COMMON 0x38 /* pass common messages to host */ #define SWE_REALTIME 0x39 /* pass real time messages to host */ #define SWE_FSKSYNC 0x81 /* enable FSK input/output & sync to it */ #define SWE_METRO 0x83 /* metronome on - no accents */ #define SWD_METRO 0x84 /* metronome off */ #define SWE_AMETRO 0x85 /* metronome on - w/accents */ #define SWD_BENDER 0x86 /* disable continuous controller to host */ #define SWE_BENDER 0x87 /* enable continuous controller msgs */ #define SWD_VOXTHRU 0x88 /* disable voice "thru" function */ #define SWE_VOXTHRU 0x89 /* enable voice "thru" function */ #define SWD_DATAINSTOP 0x8A /* disable "data in stop" mode */ #define SWE_DATAINSTOP 0x8B /* enable "data in stop" mode */ #define SWD_MEASEND 0x8C /* disable "measure end" to host */ #define SWE_MEASEND 0x8D /* enable "measure end" to host */ #define SWD_CONDUCT 0x8E /* disable conductor function */ #define SWE_CONDUCT 0x8F /* enable conductor function */ #define SWD_RTAFFECT 0x90 /* disable real time affection */ #define SWE_RTAFFECT 0x91 /* enable real time affection */ #define SWD_CLKHOST 0x94 /* disable "clock to host" msgs */ #define SWE_CLKHOST 0x95 /* enable "clock to host" msgs */ #define SWD_HEXCL 0x96 /* don't pass exclusives to host */ #define SWE_HEXCL 0x97 /* pass exclusives to host */ #define SWD_CRTA 0x98 /* channel reference table A off */ #define SWE_CRTA 0x99 /* channel reference table A on */ #define SWD_CRTB 0x9A /* channel reference table B off */ #define SWE_CRTB 0x9B /* channel reference table B on */ #define SWD_CRTC 0x9C /* channel reference table C off */ #define SWE_CRTC 0x9D /* channel reference table C on */ #define SWD_CRTD 0x9E /* channel reference table D off */ #define SWE_CRTD 0x9F /* channel reference table D on */ /* Information retrieving commands */ #define GET_PC1 0xA0 /* get play counter for track 1 */ #define GET_PC2 0xA1 /* get play counter for track 2 */ #define GET_PC3 0xA2 /* get play counter for track 3 */ #define GET_PC4 0xA3 /* get play counter for track 4 */ #define GET_PC5 0xA4 /* get play counter for track 5 */ #define GET_PC6 0xA5 /* get play counter for track 6 */ #define GET_PC7 0xA6 /* get play counter for track 7 */ #define GET_PC8 0xA7 /* get play counter for track 8 */ #define GET_RC 0xAB /* get record counter (& clear it) */ #define GET_TEMPO 0xAF /* get the tempo */ #define GET_VERSION 0xAC /* get firmware version */ #define GET_REVISION 0xAD /* get firmware revision */ /* Clear functions */ #define CLR_RELTEMPO 0xB1 /* sets relative tempo to 1/1 */ #define CLR_PC 0xB8 /* clears all play counters */ #define CLR_PM 0xB9 /* clears all channel reference tables */ #define CLR_RC 0xBA /* clear the record counter */ /* Set functions (no operands) */ #define SET_TB48 0xC2 /* set timebase to 48 clocks/beat */ #define SET_TB72 0xC3 /* set timebase to 72 clocks/beat */ #define SET_TB96 0xC4 /* set timebase to 96 clocks/beat */ #define SET_TB120 0xC5 /* set timebase to 120 clocks/beat */ #define SET_TB144 0xC6 /* set timebase to 144 clocks/beat */ #define SET_TB168 0xC7 /* set timebase to 168 clocks/beat */ #define SET_TB192 0xC8 /* set timebase to 192 clocks/beat */ /* Set functions (operand follows) */ #define SET_TEMPO 0xE0 /* set tempo */ #define SET_RTEMPO 0xE1 /* set relative tempo */ #define SET_TGRAD 0xE2 /* set tempo graduation */ #define SET_CMBEAT 0xE4 /* set # MIDI clocks / metronome beat */ #define SET_MBMEAS 0xE6 /* set # metronome beats / measure */ #define SET_ICCLOCK 0xE7 /* set # internal clocks (x4) / clock to host */ #define SET_ACTIVE 0xEC /* set active tracks bitmap */ #define SET_PLAYCTRS 0xED /* set play counter bitmap */ #define SET_LACCCH 0xEE /* set lo acceptable tracks bitmap */ #define SET_HACCCH 0xEF /* set hi acceptable tracks bitmap */ /* Request functions */ #define REQ_SCH(n) (0xD0 | ((n) & 0x07)) #define REQ_SCH0 0xD0 /* want to send data on track 0 */ #define REQ_SCH1 0xD1 /* want to send data on track 1 */ #define REQ_SCH2 0xD2 /* want to send data on track 2 */ #define REQ_SCH3 0xD3 /* want to send data on track 3 */ #define REQ_SCH4 0xD4 /* want to send data on track 4 */ #define REQ_SCH5 0xD5 /* want to send data on track 5 */ #define REQ_SCH6 0xD6 /* want to send data on track 6 */ #define REQ_SCH7 0xD7 /* want to send data on track 7 */ #define REQ_SSYS 0xDF /* want to send system message */ #define CMD_ACK 0xFE /* MPU's acknowledement of a command */ /* Interesting MIDI bytes */ #define MIDI_EOX 0xF7 /* End Of eXclusive message */ /* Declarations for routines in mpu.c: */ extern int wait_drr(); extern int wait_dsr(); extern int mpu_get(unsigned char); extern void mpu_put(unsigned char); extern char *mpu_id(); extern void mpu_sexcl(unsigned char *); extern int mpu_read(unsigned char *); extern int mpu_dget(); extern void dxswremt(unsigned char, unsigned char); extern void dxpachng(unsigned char, unsigned char); /* Definitions for various macros */ #define mpu_reset() mpu_put(CMD_RESET)