allbery@uunet.UU.NET (Brandon S. Allbery - comp.sources.misc) (05/15/89)
Posting-number: Volume 6, Issue 106 Submitted-by: lee@uhccux.uhcc.Hawaii.Edu (Greg Lee ) Archive-name: glib/part05 #! /bin/sh # This is a shell archive. Remove anything before this line, then unpack # it by saving it into a file and typing "sh file". To overwrite existing # files, type "sh file -c". You can also feed this as standard input via # unshar, or by typing "sh <file", e.g.. If this archive is complete, you # will see the following message at the end: # "End of archive 5 (of 15)." # Contents: d10tra.mnu dw8000.mnu k5single.mnu vis.c # Wrapped by lee@uhccux on Sun May 7 00:40:12 1989 PATH=/bin:/usr/bin:/usr/ucb ; export PATH if test -f 'd10tra.mnu' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'d10tra.mnu'\" else echo shar: Extracting \"'d10tra.mnu'\" \(10615 characters\) sed "s/^X//" >'d10tra.mnu' <<'END_OF_FILE' X/* $Id: d10tra.mnu,v 1.6 89/05/06 17:13:17 lee Exp $ X * GLIB - a Generic LIBrarian and editor for synths X * X * D10 Rhythm Track Librarian X * X * Code started 2 FEB 89 -- Michael R. Kesti mrk@gvgspd.GVG.TEK.COM X * modified by Greg Lee X * $Log: d10tra.mnu,v $ X * Revision 1.6 89/05/06 17:13:17 lee X * rel. to comp.sources.misc X * X */ X X#include "glib.h" X#include "vis.h" X X#define D10TRASIZE 502 X#define TRABASEADDR 0x0c0000 X#define RESERVESIZE 20 X Xchar *visnum(), *visonoff(); X X X/* This array contains arbitrary screen labels */ Xstruct labelinfo Ldtra[] = { X#MENU X X X X X X X X X X X X X No Rhythm Track editing is supported. X X X X X X X X X X X Press SPACE BAR to sound note % at volume % for duration % on channel % . X#END X-1,-1,NULL X}; X Xstruct paraminfo Pdtra[] = { X/* XNAME TYPE POS MAX OFFSET MASK SHIFT ADHOC X */ X#O autopitch num %% 127 -60 X#O autovol num %% 127 -63 X#O autodur num %% 20 -5 *5 X#O autochan num %% 16 -1 *5 XNULL,NULL,-1,-1,-1,-1,visnum,0,0,0,0 X}; X X/* X * dtranum X * X * Convert a voice number (0) to the string displayed in the X * librarian (ie. 1). X */ X Xchar * Xdtranum(n) X{ X if ( n != 0 ) X return("??"); X return("01"); X} X X/* X * dnumtra X * X * Convert a display-style voice number (1) to internal X * format (0). X */ X Xdnumtra(n) Xint n; X{ X if(n != 1) { X return(-1); X } else { X return(0); X } X} X X/* X * dtradin X * X * Take library bank 'data' and stuff values in the P array, by using X * the setval function. X */ X Xdtradin(data) Xchar *data; X{ X /* The first RESERVESIZE bytes are reserved (arbitrarily) for the voice name */ X} X X/* X * dtradout X * X * Take (possibly changed) parameters values out of the P array and X * put them back into the library bank 'data'. X */ X Xdtradout(data) Xchar *data; X{ X} X X/* X * dtrasedit X * X * Send a single voice to the edit buffer of the D10. This will be whatever X * voice is currently selected. X */ X Xdtrasedit(data) Xchar *data; X{ X} X X/* X * dtranof X * X * Return a pointer to the voice name buried in library bank data. X */ Xchar * Xdtranof(data) Xchar *data; X{ X static char buf[12]; X int n; X X for(n = 0; n < D10TRASIZE; n++) X if ( data[n + RESERVESIZE] != 0 ) break; X if ( n != D10TRASIZE ) { X n = data[RESERVESIZE + 0] + (data[RESERVESIZE + 1] << 7); X sprintf(buf, "%d patterns", n); X } else X strcpy(buf, " "); X return(buf); X} X X/* X * dtrasnof X * X * Set the voice name buried in data to name. X */ Xdtrasnof(data,name) Xchar *data; Xchar *name; X{ X} X X/* dtrasone - send a single voice to the D10 */ Xdtrasone(iv, data) Xint iv; Xchar *data; X{ X int n; X int cksum; X long curadd; X int addbyte; X X curadd = TRABASEADDR; X X sendmidi(0xf0); X sendmidi(0x41); X sendmidi(0x10); X sendmidi(0x16); X sendmidi(0x12); /* DT1 - Data set 1 command */ X X addbyte = ((curadd >> 16) & 0x7f); /* address msb */ X sendmidi(addbyte); X cksum = addbyte; X addbyte = ((curadd >> 8) & 0x7f); X sendmidi(addbyte); X cksum += addbyte; X addbyte = (curadd & 0x7f); /* address lsb */ X sendmidi(addbyte); X cksum += addbyte; X X for(n = 0; n < 256; n++) { X sendmidi(data[n + RESERVESIZE] & 0x7f); X cksum += data[n + RESERVESIZE] & 0x7f; X } X X sendmidi((-cksum) & 0x7f); /* checksum */ X sendmidi(EOX); X X curadd = 0x0c0200; X X sendmidi(0xf0); X sendmidi(0x41); X sendmidi(0x10); X sendmidi(0x16); X sendmidi(0x12); /* DT1 - Data set 1 command */ X X addbyte = ((curadd >> 16) & 0x7f); /* address msb */ X sendmidi(addbyte); X cksum = addbyte; X addbyte = ((curadd >> 8) & 0x7f); X sendmidi(addbyte); X cksum += addbyte; X addbyte = (curadd & 0x7f); /* address lsb */ X sendmidi(addbyte); X cksum += addbyte; X X for(n = 256; n < 512; n++) { X sendmidi(data[n + RESERVESIZE] & 0x7f); X cksum += data[n + RESERVESIZE] & 0x7f; X } X X sendmidi((-cksum) & 0x7f); /* checksum */ X sendmidi(EOX); X X curadd = 0x0c0400; X X sendmidi(0xf0); X sendmidi(0x41); X sendmidi(0x10); X sendmidi(0x16); X sendmidi(0x12); /* DT1 - Data set 1 command */ X X addbyte = ((curadd >> 16) & 0x7f); /* address msb */ X sendmidi(addbyte); X cksum = addbyte; X addbyte = ((curadd >> 8) & 0x7f); X sendmidi(addbyte); X cksum += addbyte; X addbyte = (curadd & 0x7f); /* address lsb */ X sendmidi(addbyte); X cksum += addbyte; X X for(n = 512; n < (D10TRASIZE - 512); n++) { X sendmidi(data[n + RESERVESIZE] & 0x7f); X cksum += data[n + RESERVESIZE] & 0x7f; X } X X sendmidi((-cksum) & 0x7f); /* checksum */ X sendmidi(EOX); X X return(0); X} X X/* dtragbulk - Request and read a bulk dump from the D10 */ Xdtragbulk(data) Xchar *data; X{ X static char Buff[BUFSIZ]; X int n, v, b2, ret = 1; X long begin, toolong; X long curadd; X int addbyte; X int cksum; X X sprintf(Buff,"\n"); X windstr(Buff); X X curadd = TRABASEADDR; X X for(v = 0; v < Nvoices; v++) { X X flushmidi(); X X if(v % 10 != 0) { X sprintf(Buff, "."); X } else { X sprintf(Buff,"%d", (v / 10)); X } X windstr(Buff); X X /* request the voice */ X sendmidi(0xf0); X sendmidi(0x41); X sendmidi(0x10); X sendmidi(0x16); X sendmidi(0x11); /* RQ1 - Data request 1 command */ X X addbyte = ((curadd >> 16) & 0x7f); /* address msb */ X sendmidi(addbyte); X cksum = addbyte; X addbyte = ((curadd >> 8) & 0x7f); X sendmidi(addbyte); X cksum += addbyte; X addbyte = (curadd & 0x7f); /* address lsb */ X sendmidi(addbyte); X cksum += addbyte; X X sendmidi(0x00); /* length msb */ X cksum += 0x00; X sendmidi(0x03); /* should be D10TRASIZE */ X cksum += 0x03; X sendmidi(0x76); /* length lsb */ X cksum += 0x76; X X sendmidi((-cksum) & 0x7f); /* checksum */ X sendmidi(EOX); X X /* set up timeout */ X begin = milliclock(); X toolong = begin + (1000 * TIMEOUT); X X /* read header */ X for(n = 0; n < 8; ) { X if ( STATMIDI ) { X b2 = (getmidi() & 0xff); X /* burn active sensing and timing clock */ X if((b2 != 0xfe) && (b2 != 0xf8)) X n++; X } else { X if ( milliclock() > toolong ) { X Reason = "Timeout waiting for header"; X goto getout; X } X } X } X X /* read data */ X for(n = 0; n < 256; ) { X if ( STATMIDI ) { X b2 = (getmidi() & 0xff); X /* burn active sensing and timing clock */ X if((b2 != 0xfe) && (b2 != 0xf8)) { X VOICEBYTE(data,v,n + RESERVESIZE) = b2; X n++; X } X } else { X if ( milliclock() > toolong ) { X Reason = "Timeout reading data"; X goto timeout0; X } X } X } X X timeout0: X if ( n != 256 ) { X Reason = "Timeout reading data!"; X goto getout; X } X X /* read checksum */ X for(n = 0; n < 1; ) { X if ( STATMIDI ) { X b2 = (getmidi() & 0xff); X /* burn active sensing and timing clock */ X if((b2 != 0xfe) && (b2 != 0xf8)) X n++; X } else { X if ( milliclock() > toolong ) { X Reason = "Timeout reading checksum"; X goto getout; X } X } X } X X /* read EOX */ X for(n = 0; n < 1; ) { X if ( STATMIDI ) { X b2 = (getmidi() & 0xff); X /* burn active sensing and timing clock */ X if((b2 != 0xfe) && (b2 != 0xf8)) X if ( b2 != EOX ) { X sprintf(Buff,"EOX not received (%X)\n", b2); X Reason = Buff; X goto getout; X } X n++; X } else { X if ( milliclock() > toolong ) { X Reason = "Timeout reading EOX"; X goto getout; X } X } X } X X /* read header */ X for(n = 0; n < 8; ) { X if ( STATMIDI ) { X b2 = (getmidi() & 0xff); X /* burn active sensing and timing clock */ X if((b2 != 0xfe) && (b2 != 0xf8)) X n++; X } else { X if ( milliclock() > toolong ) { X Reason = "Timeout waiting for header"; X goto getout; X } X } X } X X /* read data */ X for(n = 0; n < 246; ) { X if ( STATMIDI ) { X b2 = (getmidi() & 0xff); X /* burn active sensing and timing clock */ X if((b2 != 0xfe) && (b2 != 0xf8)) { X VOICEBYTE(data,v,n + RESERVESIZE + 256) = b2; X n++; X } X } else { X if ( milliclock() > toolong ) { X Reason = "Timeout reading data"; X goto timeout1; X } X } X } X X timeout1: X if ( n != 246 ) { X Reason = "Timeout reading data!"; X goto getout; X } X X /* read checksum */ X for(n = 0; n < 1; ) { X if ( STATMIDI ) { X b2 = (getmidi() & 0xff); X /* burn active sensing and timing clock */ X if((b2 != 0xfe) && (b2 != 0xf8)) X n++; X } else { X if ( milliclock() > toolong ) { X Reason = "Timeout reading checksum"; X goto getout; X } X } X } X X /* read EOX */ X for(n = 0; n < 1; ) { X if ( STATMIDI ) { X b2 = (getmidi() & 0xff); X /* burn active sensing and timing clock */ X if((b2 != 0xfe) && (b2 != 0xf8)) X if ( b2 != EOX ) { X sprintf(Buff,"EOX not received (%X)\n", b2); X Reason = Buff; X goto getout; X } X n++; X } else { X if ( milliclock() > toolong ) { X Reason = "Timeout reading EOX"; X goto getout; X } X } X } X X curadd += 0x376; /* D10TRASIZE */ X X if((curadd & 0x80) != 0) { X curadd &= 0x7fff7f; X curadd += 0x100; X } X if((curadd & 0x8000) != 0) { X curadd &= 0x7f7f7f; X curadd += 0x10000; X } X } /* go back for another voice */ X X Reason = ""; X ret = 0; /* all's well */ X Xgetout: X return(ret); X} X X/* dtrasbulk - send a bulk dump to the D10 */ Xdtrasbulk(data) Xchar *data; X{ X int n; X int cksum; X long curadd; X int addbyte; X X curadd = TRABASEADDR; X X sendmidi(0xf0); X sendmidi(0x41); X sendmidi(0x10); X sendmidi(0x16); X sendmidi(0x12); /* DT1 - Data set 1 command */ X X addbyte = ((curadd >> 16) & 0x7f); /* address msb */ X sendmidi(addbyte); X cksum = addbyte; X addbyte = ((curadd >> 8) & 0x7f); X sendmidi(addbyte); X cksum += addbyte; X addbyte = (curadd & 0x7f); /* address lsb */ X sendmidi(addbyte); X cksum += addbyte; X X for(n = 0; n < 256; n++) { X sendmidi(data[n + RESERVESIZE] & 0x7f); X cksum += data[n + RESERVESIZE] & 0x7f; X } X X sendmidi((-cksum) & 0x7f); /* checksum */ X sendmidi(EOX); X X curadd = 0x0c0200; X X sendmidi(0xf0); X sendmidi(0x41); X sendmidi(0x10); X sendmidi(0x16); X sendmidi(0x12); /* DT1 - Data set 1 command */ X X addbyte = ((curadd >> 16) & 0x7f); /* address msb */ X sendmidi(addbyte); X cksum = addbyte; X addbyte = ((curadd >> 8) & 0x7f); X sendmidi(addbyte); X cksum += addbyte; X addbyte = (curadd & 0x7f); /* address lsb */ X sendmidi(addbyte); X cksum += addbyte; X X for(n = 256; n < 512; n++) { X sendmidi(data[n + RESERVESIZE] & 0x7f); X cksum += data[n + RESERVESIZE] & 0x7f; X } X X sendmidi((-cksum) & 0x7f); /* checksum */ X sendmidi(EOX); X X curadd = 0x0c0400; X X sendmidi(0xf0); X sendmidi(0x41); X sendmidi(0x10); X sendmidi(0x16); X sendmidi(0x12); /* DT1 - Data set 1 command */ X X addbyte = ((curadd >> 16) & 0x7f); /* address msb */ X sendmidi(addbyte); X cksum = addbyte; X addbyte = ((curadd >> 8) & 0x7f); X sendmidi(addbyte); X cksum += addbyte; X addbyte = (curadd & 0x7f); /* address lsb */ X sendmidi(addbyte); X cksum += addbyte; X X for(n = 512; n < (D10TRASIZE - 512); n++) { X sendmidi(data[n + RESERVESIZE] & 0x7f); X cksum += data[n + RESERVESIZE] & 0x7f; X } X X sendmidi((-cksum) & 0x7f); /* checksum */ X sendmidi(EOX); X X return(0); X} X X/* end */ END_OF_FILE if test 10615 -ne `wc -c <'d10tra.mnu'`; then echo shar: \"'d10tra.mnu'\" unpacked with wrong size! fi # end of 'd10tra.mnu' fi if test -f 'dw8000.mnu' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'dw8000.mnu'\" else echo shar: Extracting \"'dw8000.mnu'\" \(10982 characters\) sed "s/^X//" >'dw8000.mnu' <<'END_OF_FILE' X/* $Id: dw8000.mnu,v 1.6 89/05/06 17:13:21 lee Exp $ X * GLIB - a Generic LIBrarian and editor for synths X * X * DW8000 Librarian X * X * Code completed 8/24/87 -- Steven A. Falco moss!saf X * modifications: Greg Lee X * $Log: dw8000.mnu,v $ X * Revision 1.6 89/05/06 17:13:21 lee X * rel. to comp.sources.misc X * X */ X X#define OVERLAY2 X X#include "glib.h" X X#define DW8VSIZE 51 X Xchar *visnum(), *visd8wave(), *visd8oct(), *visd8trk(); Xchar *visd8ival(), *visd8detu(), *visdasel(), *dw8vnum(), *visdamod(); Xchar *visdmgw(), *visdmode(), *visd8pol(),*visd8sem(), *visonoff(); X X#define RESERVESIZE 20 X X#define visdw8vnum dw8vnum X/* This array contains arbitrary screen labels */ Xstruct labelinfo Ldw800[] = { X#MENU X X X+----------------------------------+----------------+------------------+------+ X| Osc 1 Osc 2 Noise| ModGen| AutoBend| Mode | X|Octave % % |Waveform % |Select % |% | X|Waveform % % |Frequency % |Mode % | | X|Level % % % |Delay % |Time % | | X|Interval % |Osc % |Intensity % | | X|Detune % |VCF % | | | X+------------------+---------------+----------------+------------------+------+ X| VCF VCA| Delay| Joystick | Portamento |Key | X|Attack % % |Time % |Osc % |Time % |Param | X|Decay % % |Factor % |VCF % | |% | X|Break Pt. % % |Feedback % +----------------+------------------+------+ X|Slope % % |Frequency % | X|Sustain % % |Intensity % | +-------------------------+--------------+ X|Release % % |Eff.Level % | |Space = Play Note | Auto-Note | X|V.Sensitv % % +---------------+ | | | X|Cutoff % | AftTouch| |h = left q = quit |Pitch % | X|Resonance % |Osc.MG % | |j = down N = Set Name |Duration % | X|Tracking % |VCF % | |k = up J = Decrement |Volume % | X|Polarity % |VCA % | |l = right K = Increment |Channel % | X|EG.Intens % | | | | | X+------------------+---------------+ +-------------------------+--------------+ X#END X-1,-1,NULL X}; X X/* This array defines all the editable parameters. */ Xstruct paraminfo Pdw800[] = { X/* XNAME TYPE POS MAX OFFSET MASK SHIFT ADHOC X */ X#O o1oct d8oct %% 3 0 X#O o2oct d8oct %% 3 7 X#O mgwave dmgw %% 3 34 X#O abndsel dasel %% 3 3 X#O mode dmode %% 3 13 X#O o1wave d8wave %% 15 1 X#O o2wave d8wave %% 15 8 X#O mgfrew num %% 31 35 X#O abndmod damod %% 1 4 X#O o1lev num %% 31 2 X#O o2lev num %% 31 9 X#O noise num %% 31 12 X#O mgdela num %% 31 36 X#O abndtim num %% 31 5 X#O o2ival d8ival %% 7 10 X#O mgosc num %% 31 37 X#O abndins num %% 31 6 X#O o2detu d8detu %% 7 11 X#O mgvcf num %% 31 38 X#O fatt num %% 31 20 X#O aatt num %% 31 27 X#O dtim num %% 7 41 X#O joyosc d8sem %% 15 39 X#O portam num %% 31 47 X#O fdec num %% 31 21 X#O adec num %% 31 28 X#O dfact num %% 15 42 X#O joyvcf onoff %% 1 40 X#O vnumb dw8vnum %% 63 14 X#O fbrk num %% 31 22 X#O abrk num %% 31 29 X#O dfeed num %% 15 43 X#O fslp num %% 31 23 X#O aslp num %% 31 30 X#O dfreq num %% 31 44 X#O fsus num %% 31 24 X#O asus num %% 31 31 X#O dintns num %% 31 45 X#O frel num %% 31 25 X#O arel num %% 31 32 X#O deff num %% 15 46 X#O asens num %% 7 33 X#O fsens num %% 7 26 X#O fcut num %% 63 15 X#O autopitch num %% 127 -60 X#O fres num %% 31 16 X#O autovol num %% 127 -63 X#O atosc num %% 3 48 X#O ftrk d8trk %% 3 17 X#O autodur num %% 20 -5 *5 X#O atvcf num %% 3 49 X#O fpol d8pol %% 1 18 X#O autochan num %% 16 -1 *5 X#O atvca num %% 3 50 X#O fegi num %% 31 19 XNULL,NULL,-1,-1,-1,-1,visnum,0,0,0,0 X}; X X X/* X * dw8vnum X * X * Convert a voice number (0 to 63) to the string displayed in the X * librarian (ie. 11 to 88). X */ X/* added vis to beginning of this name -- gl */ Xchar * Xdw8vnum(n) X{ X static char v[3]; X X if ( n < 0 || n > 63 ) X return("??"); X X v[0] = n/8 + '1'; X v[1] = n%8 + '1'; X v[2] = '\0'; X return(v); X} X X/* X * dw8numv X * X * Convert a display-style voice number (11 to 88) to internal X * format (0 - 63). X */ X Xdw8numv(n) Xint n; X{ X int ld, rd; X X /* crack out the digits as octal codes */ X ld = (n / 10) - 1; /* left digit */ X rd = (n % 10) - 1; /* right digit */ X X if(ld < 0 || ld > 7 || rd < 0 || rd > 7) { X return(-1); X } else { X return(ld * 8 + rd); /* combine as octal */ X } X} X X/* X * dw8din X * X * Take library bank 'data' and stuff values in the P array, by using X * the setval function. X */ X Xdw8din(data) Xchar *data; X{ X /* The first 20 bytes are reserved (arbitrarily) for the voice name */ X#SETVAL X /* We set the 'auto-note' channel upon entry */ X setval("autochan",Channel); X} X X/* X * dw8dout X * X * Take (possibly changed) parameters values out of the P array and X * put them back into the library bank 'data'. X */ X Xdw8dout(data) Xchar *data; X{ X#GETVAL X /* If the autochan parameter has changed, update Channel */ X Channel = getval("autochan"); X} X X/* X * dw8sedit X * X * Send a single voice to the edit buffer of the DW8000. This will be whatever X * voice is currently selected. X */ X Xdw8sedit(data) Xchar *data; X{ X int n; X X sendmidi(0xf0); X sendmidi(0x42); X sendmidi(0x30 | (Channel - 1)); X sendmidi(0x03); X sendmidi(0x40); X for(n = 0; n < DW8VSIZE; n++) { X sendmidi(data[n + 20] & 0x7f); X } X sendmidi(EOX); X} X X/* X * dw8nof X * X * Return a pointer to the voice name buried in library bank data. X */ Xchar * Xdw8nof(data) Xchar *data; X{ X static char currbuff[17]; X char *p; X int m; X X p = currbuff; X for ( m=0; m<16; m++ ) X *p++ = data[m]; X *p = '\0'; X return(currbuff); X} X X/* X * dw8snof X * X * Set the voice name buried in data to name. X */ Xdw8snof(data,name) Xchar *data; Xchar *name; X{ X char *p; X int m; X X for ( p=name,m=0; *p!='\0' && m<16; p++,m++ ) X data[m] = *p; X for ( ; m<16; m++ ) X data[m] = ' '; X} X X/* dw8sone - send a single voice to the DW8000 */ Xdw8sone(iv, data) Xint iv; Xchar *data; X{ X int c, b2, ret = 1; X long begin, toolong; X X /* select voice n */ X sendmidi(0xc0 | (Channel - 1)); X sendmidi(iv); X X /* send data */ X dw8sedit(data); X X /* request write */ X sendmidi(0xf0); X sendmidi(0x42); X sendmidi(0x30 | (Channel - 1)); X sendmidi(0x03); X sendmidi(0x11); /* write request */ X sendmidi(iv); /* the now-current voice */ X sendmidi(EOX); X X /* read the ack/nack - set up for timeout */ X begin = milliclock(); X toolong = begin + 1000 * TIMEOUT; X X /* wait for the 0x03 byte (dw8000 ID byte) */ X while ( milliclock() < toolong ) { X if ( STATMIDI && (c=(getmidi() & 0xff)) == 0x03 ) X break; X } X if ( c != 0x03 ) { X Reason = "Timeout waiting for 0x03"; X goto getout; X } X X /* next byte is the result code */ X while((b2 = getmidi() & 0xff) == 0xfe) X ; /* burn active sensing */ X if(b2 != 0x21) { X Reason = "Write failed - check protect switch!"; X goto getout; X } X X while((b2 = getmidi() & 0xff) == 0xfe) X ; /* want EOX - burn active sensing */ X if ( b2 != EOX ) X Reason = "EOX not received"; X else { X Reason = ""; X ret = 0; /* all's well */ X } X Xgetout: X return(ret); X} X X/* dw8gbulk - Request and read a bulk dump from the DW8000 */ Xdw8gbulk(data) Xchar *data; X{ X int c, n, v, b2, ret = 1; X long begin, toolong; X X flushmidi(); X X for(v = 0; v < Nvoices; v++) { X /* select voice */ X sendmidi(0xc0 | (Channel - 1)); X sendmidi(v); X X /* request the voice */ X sendmidi(0xf0); X sendmidi(0x42); X sendmidi(0x30 | (Channel-1)); /* Channel # */ X sendmidi(0x03); X sendmidi(0x10); X sendmidi(EOX); X X /* set up for timeout */ X begin = milliclock(); X toolong = begin + 1000 * TIMEOUT; X X /* wait for the x40 byte starting the dump */ X while ( milliclock() < toolong ) { X if ( STATMIDI && (c=(getmidi() & 0xff)) == 0x40 ) X break; X } X if ( c != 0x40 ) { X Reason = "Timeout waiting for 0x40"; X goto getout; X } X X /* now read 51 bytes of voice data */ X for(n = 0; n < DW8VSIZE; n++) { X /* twiddle your thumbs, but not forever */ X while ( ! STATMIDI ) { X if ( milliclock() > toolong ) X goto timeout; /* the end of an era */ X } X while((b2 = getmidi() & 0xff) == 0xfe) X ; /* burn active sensing */ X VOICEBYTE(data,v,n + 20) = b2; X } X X timeout: X if ( n != DW8VSIZE ) { X Reason = "Timeout while reading!"; X goto getout; X } X while((b2 = getmidi() & 0xff) == 0xfe) X ; /* want EOX - burn active sensing */ X if ( b2 != EOX ) X Reason = "EOX not received"; X else { X Reason = ""; X ret = 0; /* all's well */ X } X } /* go back for another voice */ X Xgetout: X return(ret); X} X X/* X * Below are functions used for display of parameter values X */ X Xchar * Xvisd8wave(v) X{ X switch (v) { X case 0: return("ramp"); X case 1: return("square"); X case 2: return("ac. piano"); X case 3: return("el. piano"); X case 4: return("hd. piano"); X case 5: return("clavinet"); X case 6: return("organ"); X case 7: return("brass"); X case 8: return("sax"); X case 9: return("violin"); X case 10: return("a. guitar"); X case 11: return("d. guitar"); X case 12: return("el. bass"); X case 13: return("dg. bass"); X case 14: return("bell"); X case 15: return("sine"); X } X return("*"); X} X Xchar * Xvisd8oct(v) X{ X switch(v) { X case 0: return("16"); X case 1: return("8"); X case 2: return("4"); X case 3: return("*"); X } X return("*"); X} X Xchar * Xvisd8ival(v) X{ X switch(v) { X case 0: return("unison"); X case 1: return("min 3rd"); X case 2: return("maj 3rd"); X case 3: return("4th"); X case 4: return("5th"); X case 5: case 6: case 7: return("*"); X } X return("*"); X} X Xchar * Xvisd8detu(v) X{ X switch(v) { X case 0: return("in tune"); X case 1: return("1 cent"); X case 2: return("2 cents"); X case 3: return("3 cents"); X case 4: return("4 cents"); X case 5: return("5 cents"); X case 6: return("6 cents"); X case 7: return("*"); X } X return("*"); X} X Xchar *Semicode[] = { X "none", X "1 semitone", X "2 semitones", X "3 semitones", X "4 semitones", X "5 semitones", X "6 semitones", X "7 semitones", X "8 semitones", X "9 semitones", X "10 semitones", X "11 semitones", X "1 octave" X}; X Xchar * Xvisd8sem(v) X{ X if(v >= 0 && v <= 12) { X return(Semicode[v]); X } X return("*"); X} X Xchar * Xvisdasel(v) X{ X switch(v) { X case 0: return("off"); X case 1: return("Osc 1"); X case 2: return("Osc 2"); X case 3: return("Osc 1+2"); X } X return("*"); X} X Xchar * Xvisdamod(v) X{ X switch(v) { X case 0: return("Up"); X case 1: return("Down"); X } X return("*"); X} X Xchar * Xvisd8pol(v) X{ X switch(v) { X case 0: return("/-\\"); X case 1: return("\\_/"); X } X return("*"); X} X Xchar * Xvisdmode(v) X{ X switch(v) { X case 0: return("Poly 1"); X case 1: return("Poly 2"); X case 2: return("Uni 1"); X case 3: return("Uni 2"); X } X return("*"); X} X Xchar * Xvisdmgw(v) X{ X switch(v) { X case 0: return("/\\"); X case 1: return("|\\"); X case 2: return("/|"); X case 3: return("_|-|"); X } X return("*"); X} X Xchar * Xvisd8trk(v) X{ X switch(v) { X case 0: return("0"); X case 1: return("1/4"); X case 2: return("1/2"); X case 3: return("1"); X } X return("*"); X} X X/* end */ END_OF_FILE if test 10982 -ne `wc -c <'dw8000.mnu'`; then echo shar: \"'dw8000.mnu'\" unpacked with wrong size! fi # end of 'dw8000.mnu' fi if test -f 'k5single.mnu' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'k5single.mnu'\" else echo shar: Extracting \"'k5single.mnu'\" \(10747 characters\) sed "s/^X//" >'k5single.mnu' <<'END_OF_FILE' X/* $Id: k5single.mnu,v 1.6 89/05/06 17:13:30 lee Exp $ X * GLIB - a Generic LIBrarian and editor for synths X * X * Kawai K-5 Librarian - handles SINGLE (and MULTI) patches. X * Functions are annotated if they work for SINGLE, MULTI, or both kinds. X * Full editing not implemented - there are zillions of parameters, X * and the huge LCD on the K-5 is actually quite easy to read and use. X * X * Alan Bland - att!druwy!mab X * mod. Greg Lee X * $Log: k5single.mnu,v $ X * Revision 1.6 89/05/06 17:13:30 lee X * rel. to comp.sources.misc X * X */ X X#define OVERLAY2 X X#include "glib.h" X#ifdef BSD X#include <ctype.h> X#endif X X#define K5SINGLE 0 X#define K5MULTI 1 X#define K5MAGIC 0x5a3c X X#define NERRS 5 X#define RESERVESIZE 0 X Xextern char *visnum(); X X/* This array contains arbitrary screen labels (SINGLE) */ Xstruct labelinfo Lk5s[] = { X#MENU X X X X Sorry, no edit capability implemented for the K-5 yet. X X X X X X X X X X X X +-------------------------+--------------+ X |Space = Play Note | Auto-Note | X | | | X |h = left q = quit |Pitch % | X |j = down N = Set Name |Volume % | X |k = up J = Decrement |Duration % | X |l = right K = Increment |Channel % | X | | | X +-------------------------+--------------+ X#END X-1,-1,NULL X}; X Xstruct paraminfo Pk5s[] = { X/* XNAME TYPE POS MAX OFFSET MASK SHIFT ADHOC X */ X#O autopitch num %% 127 -60 X#O autovol num %% 127 -63 X#O autodur num %% 20 -5 *5 X#O autochan num %% 16 -1 *5 XNULL,NULL,-1,-1,-1,-1,visnum,0,0,0,0 X}; X X X X/* X * k5vnum X * X * Convert a voice number (0 to 47) to the string displayed in the X * librarian (A1-D12) (SINGLE and MULTI) X */ Xchar * Xk5vnum(n) Xregister int n; X{ X static char v[4]; X X if ( n < 0 || n > 47 ) X return("??"); X X sprintf(v, "%c%d", n/12 + 'A', n%12 + 1); X return(v); X} X X/* X * k5numv X * X * Convert an alphanumeric voice number (A1-D12) to internal X * format (0 - 47). (SINGLE and MULTI) X */ Xk5numv(n) Xregister char *n; X{ X register int v,j; X X /* first better be [a-dA-D] */ X *n = toupper(*n); X if (*n == 'A' || *n == 'B' || *n == 'C' || *n == 'D') { X v = 12 * (*n - 'A'); X } else { X return(-1); X } X X /* followed by 1-12 */ X j = atoi(++n); X if (j<1 || j>12) return(-1); X return v + j - 1; X} X X/* X * k5sdin X * X * Take library bank 'data' and stuff values in the P array, by using X * the setval function. X */ Xk5sdin(data) Xchar *data; X{ X /* We set the 'auto-note' channel upon entry */ X setval("autochan",Channel); X} X X/* X * k5sdout X * X * Take (possibly changed) parameters values out of the P array and X * put them back into the library bank 'data'. X */ Xk5sdout(data) Xchar *data; X{ X /* If the autochan parameter has changed, update Channel */ X Channel = getval("autochan"); X} X X/* X * k5mdin X * X * Take library bank 'data' and stuff values in the P array, by using X * the setval function. X */ Xk5mdin(data) Xchar *data; X{ X /* We set the 'auto-note' channel upon entry */ X setval("autochan",Channel); X} X X/* X * k5mdout X * X * Take (possibly changed) parameters values out of the P array and X * put them back into the library bank 'data'. X */ Xk5mdout(data) Xchar *data; X{ X /* If the autochan parameter has changed, update Channel */ X Channel = getval("autochan"); X} X X/* X * k5snof X * X * Return a pointer to the voice name buried in library bank data. (SINGLE) X */ Xchar * Xk5snof(data) Xregister char *data; X{ X static char currbuff[9]; X register char *p; X register int m; X X p = currbuff; X for ( m=0; m<16; m+=2 ) X *p++ = (data[m]<<4) | data[m+1]; X *p = '\0'; X return(currbuff); X} X X/* X * k5nameok X * X * Convert an ascii string to the ascii subset used for K5 names. X */ Xchar* Xk5nameok(name) Xchar *name; X{ X static char okname[9]; X register int m; X X for (m=0; m<9 && name[m]; ++m) { X okname[m] = toupper(name[m]); X if (!isalnum(okname[m])) { X switch (okname[m]) { X case '-': case ':': case '/': case '*': case '?': X case '!': case '#': case '&': case '(': case ')': X case '"': case '+': case '.': case '=': case ' ': X break; X default: X okname[m] = ' '; X break; X } X } X } X okname[m] = '\0'; X return okname; X} X X/* X * k5ssnof X * X * Set the voice name buried in data to name. (SINGLE) X */ Xk5ssnof(data,name) Xchar *data; Xchar *name; X{ X register char *p; X register int m; X X for ( p=k5nameok(name),m=0; *p!='\0' && m<17; p++,m+=2 ) { X data[m] = (*p & 0xf0) >> 4; X data[m+1] = *p & 0x0f; X } X for ( ; m<17; m+=2 ) { X data[m] = (' ' & 0xf0) >> 4; X data[m+1] = ' ' & 0x0f; X } X} X/* X * k5mnof X * X * Return a pointer to the voice name buried in library bank data. (MULTI) X */ Xchar * Xk5mnof(data) Xchar *data; X{ X static char currbuff[9]; X register char *p; X register int m; X X p = currbuff; X for ( m=0; m<16; m+=2 ) X *p++ = (data[m+330]<<4) | data[m+331]; X *p = '\0'; X return(currbuff); X} X X/* X * k5msnof X * X * Set the voice name buried in data to name. (MULTI) X */ Xk5msnof(data,name) Xchar *data; Xchar *name; X{ X char *p; X int m; X X for ( p=k5nameok(name),m=0; *p!='\0' && m<17; p++,m+=2 ) { X data[m+330] = (*p & 0xf0) >> 4; X data[m+331] = *p & 0x0f; X } X for ( ; m<17; m+=2 ) { X data[m+330] = (' ' & 0xf0) >> 4; X data[m+331] = ' ' & 0x0f; X } X} X X/* X * k5sbulk X * X * common function to send all voices to the K-5 (SINGLE and MULTI) X */ Xk5sbulk(data, which) Xchar *data; Xint which; /* K5SINGLE or K5MULTI */ X{ X int n, err = 0; X message(""); X for (n=0; n<Nvoices; ++n) { X for (err=0; err<NERRS; ++err) { X if (k5sone(n, &(VOICEBYTE(data,n,0)), which ) == 0 ) { X windputc('+'); X windrefresh(); X break; X } X windputc('-'); X windrefresh(); X } X if (err == NERRS) return(1); X } X return(0); X} X X/* X * k5ssbulk X * X * send all voices to the K-5 (SINGLE) X */ Xk5ssbulk(data) Xchar *data; X{ X return k5sbulk(data, K5SINGLE); X} X X/* X * k5msbulk X * X * send all voices to the K-5 (MULTI) X */ Xk5msbulk(data) Xchar *data; X{ X return k5sbulk(data, K5MULTI); X} X X/* X * k5ssone X * X * send one voice to the K-5 (SINGLE) X */ Xk5ssone(iv, data) Xint iv; Xchar *data; X{ X return k5sone(iv, data, K5SINGLE); X} X X/* X * k5msone X * X * send one voice to the K-5 (MULTI) X */ Xk5msone(iv, data) X{ X return k5sone(iv, data, K5MULTI); X} X X/* X * k5sone X * X * common function to send a SINGLE or MULTI voice to the K-5. X */ Xk5sone(iv, data, which) Xint iv; Xregister char *data; Xint which; /* K5SINGLE or K5MULTI */ X{ X register int i, sum; X int length; X int c = 0, ret = 1; X long begin, toolong; X X flushmidi(); X X length = (which == K5SINGLE) ? 984 : 352; X X /* calculate checksum */ X for (sum=0, i=0; i<length-4; ) { X sum += data[i++] << 4; X sum += data[i++]; X sum += data[i++] << 12; X sum += data[i++] << 8; X } X X sum = K5MAGIC - sum; X data[length-4] = (sum & 0x00f0) >> 4; X data[length-3] = (sum & 0x000f); X data[length-2] = (sum & 0xf000) >> 12; X data[length-1] = (sum & 0x0f00) >> 8; X X sendmidi(0xf0); X sendmidi(0x40); X sendmidi(Channel-1); X sendmidi(0x20); X sendmidi(0x00); X sendmidi(0x02); X sendmidi(which); X sendmidi(iv); X X for (i=0; i<length; i++) sendmidi(data[i]); X X sendmidi(EOX); X X /* read the ack/nack - set up for timeout */ X begin = milliclock(); X toolong = begin + 1000 * TIMEOUT; X X /* wait for the acknowledgement */ X while ( milliclock() < toolong ) { X if ( STATMIDI && (c=(getmidi() & 0xff)) == 0xf0 ) X break; X } X if ( c != 0xf0 ) { X Reason = "Timeout waiting for K-5 response"; X goto getout; X } X X /* third byte after the sysex begin is the result */ X for (i=0; i<3; ) { X /* wait for midi byte or timeout */ X while ( ! STATMIDI ) { X if ( milliclock() > toolong ) { X Reason = "Timeout waiting for K-5 response"; X goto getout; X } X } X /* ignore active sensing */ X if ((c = getmidi() & 0xff) != 0xfe) { X ++i; X } X } X X /* check the result */ X switch (c) { X case 0x40: X ret = 0; X Reason = ""; X break; X case 0x41: X Reason = "K-5 write error"; X break; X case 0x42: X Reason = "K-5 write error (protected)"; X break; X case 0x43: X Reason = "K-5 write error (no card)"; X break; X default: X Reason = "Wierd response (is that really a K-5 you have?)"; X break; X } X Xgetout: X return(ret); X} X Xk5ssedit() X{ X} X Xk5msedit() X{ X} X X/* X * k5sgbulk X * X * get all internal SINGLE voices from K-5. X */ Xk5sgbulk(data) Xchar *data; X{ X return k5gbulk(data, K5SINGLE); X} X X/* X * k5mgbulk X * X * get all internal MULTI voices from K-5. X */ Xk5mgbulk(data) Xchar *data; X{ X return k5gbulk(data, K5MULTI); X} X X/* X * k5gbulk X * X * common routine - get all SINGLE or MULTI voices from K-5. X */ Xk5gbulk(data, which) Xregister char *data; Xint which; /* K5SINGLE or K5MULTI */ X{ X int c, v, sumerr = 0; X register int n, i, sum; X long begin, toolong; X X message(""); X flushmidi(); X X for(v = 0; v < Nvoices; v++) { X Xretry: X if (which == K5MULTI) { X /* i don't know if this is a K-5 or Amiga problem */ X /* but multi patch download seems to need this delay */ X millisleep(500); X } X /* request the voice */ X sendmidi(0xf0); X sendmidi(0x40); X sendmidi(Channel-1); X sendmidi(0x00); X sendmidi(0x00); X sendmidi(0x02); X sendmidi(which); X sendmidi(v); X sendmidi(EOX); X X /* set up for timeout */ X begin = milliclock(); X toolong = begin + 1000 * TIMEOUT; X X /* wait for the xf0 byte starting the dump */ X while ( milliclock() < toolong ) { X if ( STATMIDI && (c=(getmidi() & 0xff)) == 0xf0 ) X break; X } X if ( c != 0xf0 ) { X Reason = "Timeout waiting for dump from K-5"; X return 1; X } X/*printf("%02x ", c);*/ X /* skip the next 7 bytes (remainder of sysex header) */ X for (i=0; i<7; ) { X /* wait for midi byte or timeout */ X while ( ! STATMIDI ) { X if ( milliclock() > toolong ) X goto timeout; X } X /* ignore active sensing */ X if ((c = getmidi() & 0xff) != 0xfe) { X ++i; X/*printf("%02x ", c);*/ X } X } X X /* read voice data until EOX */ X n = 0; X while (1) { X /* wait for midi byte or timeout */ X while ( ! STATMIDI ) { X if ( milliclock() > toolong ) X goto timeout; X } X if ((c = getmidi() & 0xff) == 0xfe) { X /* ignore active sensing */ X continue; X } else if (c == EOX) { X /* finished */ X break; X } else { X /* got a data byte */ X VOICEBYTE(data,v,n) = c; X ++n; X } X } X/*printf("got block n=%d\n", n);*/ X /* verify the checksum */ X for (sum=0, i=0; i<n-4; ) { X sum += data[i++] << 4; X sum += data[i++]; X sum += data[i++] << 12; X sum += data[i++] << 8; X } X X sum = K5MAGIC - sum; X if ((data[n-4] == (sum & 0x00f0) >> 4) && X (data[n-3] == (sum & 0x000f)) && X (data[n-2] == (sum & 0xf000) >> 12) && X (data[n-1] == (sum & 0x0f00) >> 8)) { X sumerr = 0; X windputc('+'); X } else { X /* retry a few times if checksum failed */ X windputc('-'); X if (sumerr++ >= NERRS) { X Reason = "Too many checksum errors!"; X return(1); X } X goto retry; X } X windrefresh(); X X } /* go back for another voice */ X Reason = ""; X return(0); X Xtimeout: X Reason = "Timeout while reading!"; X return(1); X} X END_OF_FILE if test 10747 -ne `wc -c <'k5single.mnu'`; then echo shar: \"'k5single.mnu'\" unpacked with wrong size! fi # end of 'k5single.mnu' fi if test -f 'vis.c' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'vis.c'\" else echo shar: Extracting \"'vis.c'\" \(10248 characters\) sed "s/^X//" >'vis.c' <<'END_OF_FILE' X/* $Id: vis.c,v 1.6 89/05/06 17:13:46 lee Exp $ X * GLIB - a Generic LIBrarian and editor for synths X * X * Data Display Routines X * X * Code started 16 JAN 89 -- Michael R. Kesti mrk@gvgspd.GVG.TEK.COM X * $Log: vis.c,v $ X * Revision 1.6 89/05/06 17:13:46 lee X * rel. to comp.sources.misc X * X */ X X#include <stdio.h> X X Xchar * Xvispan(v) X{ X switch (v) { X case 0: return("7>"); X case 1: return("6>"); X case 2: return("5>"); X case 3: return("4>"); X case 4: return("3>"); X case 5: return("2>"); X case 6: return("1>"); X case 7: return("><"); X case 8: return("<1"); X case 9: return("<2"); X case 10: return("<3"); X case 11: return("<4"); X case 12: return("<5"); X case 13: return("<6"); X case 14: return("<7"); X } X return("*"); X} X Xchar * Xvisreverbtype(v) X{ X switch (v) { X case 0: return("ROOM 1"); X case 1: return("ROOM 2"); X case 2: return("HALL 1"); X case 3: return("HALL 2"); X case 4: return("PLATE"); X case 5: return("DELAY 1"); X case 6: return("DELAY 2"); X case 7: return("DELAY 3"); X case 8: return("OFF"); X } X return("*"); X} X Xchar *visreverbtime(v) X{ Xstatic char visreverbtimebuf[2]; X X if((v >= 0) && (v <= 7)) { X sprintf(visreverbtimebuf,"%d",v + 1); X return(visreverbtimebuf); X } else { X return("*"); X } X} X Xchar *visreverblevel(v) X{ Xstatic char visreverblevelbuf[2]; X X if((v >= 0) && (v <= 7)) { X sprintf(visreverblevelbuf,"%d",v); X return(visreverblevelbuf); X } else { X return("*"); X } X} X Xchar *vispatchlevel(v) X{ Xstatic char vispatchlevelbuf[4]; X X if((v >= 0) && (v <= 100)) { X sprintf(vispatchlevelbuf,"%d",v); X return(vispatchlevelbuf); X } else { X return("*"); X } X} X Xchar * Xviskeymode(v) X{ X switch (v) { X case 0: return("WHOLE"); X case 1: return("DUAL"); X case 2: return("SPLIT"); X } X return("*"); X} X Xstatic char *split_table[] = { X "C", X "C#", X "D", X "D#", X "E", X "F", X "F#", X "G", X "G#", X "A", X "A#", X "B" X}; X Xchar * Xvissplit(v) X{ Xstatic char vissplitbuf[4]; X X if((v >= 0) && (v <= 61)) { X strcpy(vissplitbuf, split_table[v % 12]); X if(strlen(vissplitbuf) == 1) { X vissplitbuf[1] = (((v / 12) + 2) + '0'); X vissplitbuf[2] = 0; X } else { X vissplitbuf[2] = (((v / 12) + 2) + '0'); X vissplitbuf[3] = 0; X } X return(vissplitbuf); X } else { X return("*"); X } X} X Xchar * Xvistonegroup(v) X{ X switch (v) { X case 0: return("A"); X case 1: return("B"); X case 2: return("I"); X case 3: return("R"); X } X return("*"); X} X Xchar * Xvisrtone(v) X{ Xstatic char visrtonebuf[4]; X if(v >= 0 && v <= 127) { X if(v < 64) { X sprintf(visrtonebuf,"% 02d",v + 1); X visrtonebuf[0] = 'I'; X } else { X if(v == 127) { X strcpy(visrtonebuf, "OFF"); X } else { X v -= 64; X sprintf(visrtonebuf," %02d",v + 1); X visrtonebuf[0] = 'R'; X } X } X return(visrtonebuf); X } X return("*"); X} X Xchar *vistonenum(v) X{ Xstatic char vistonenumbuf[3]; X X if((v >= 0) && (v <= 63)) { X sprintf(vistonenumbuf,"%02d",v + 1); X return(vistonenumbuf); X } else { X return("*"); X } X} X Xchar *viskeyshift(v) X{ Xstatic char viskeyshiftbuf[4]; X X if((v >= 0) && (v <= 23)) { X sprintf(viskeyshiftbuf,"-%d",abs(v - 24)); X return(viskeyshiftbuf); X } else if(v == 24) { X sprintf(viskeyshiftbuf,"0"); X return(viskeyshiftbuf); X } else if((v >= 25) && (v <= 48)) { X sprintf(viskeyshiftbuf,"+%d", (v - 24)); X return(viskeyshiftbuf); X } else { X return("*"); X } X} X Xchar *visfinetune(v) X{ Xstatic char visfinetunebuf[4]; X X if((v >= 0) && (v <= 49)) { X sprintf(visfinetunebuf,"-%d",abs(v - 50)); X return(visfinetunebuf); X } else if(v == 50) { X sprintf(visfinetunebuf,"0"); X return(visfinetunebuf); X } else if((v >= 51) && (v <= 100)) { X sprintf(visfinetunebuf,"+%d",(v - 50)); X return(visfinetunebuf); X } else { X return("*"); X } X} X Xchar *visbendrange(v) X{ Xstatic char visbendrangebuf[3]; X X if((v >= 0) && (v <= 24)) { X sprintf(visbendrangebuf,"%d",v); X return(visbendrangebuf); X } else { X return("*"); X } X} X Xchar *visassignmode(v) X{ Xstatic char visassignmodebuf[2]; X X if((v >= 0) && (v <= 3)) { X sprintf(visassignmodebuf,"%d",v); X return(visassignmodebuf); X } else { X return("*"); X } X} X Xchar *vistonebal(v) X{ Xstatic char vistonebalbuf[30]; Xstatic char vistonebalbuf1[30]; Xint n; X X if((v >= 0) && (v <= 100)) { X sprintf(vistonebalbuf,"%d", v); X for(n = 0 ; n < (30 - strlen(vistonebalbuf)) ; n++) X strcat(vistonebalbuf, " "); X sprintf(vistonebalbuf1,"%d", abs(v - 100)); X strcat(vistonebalbuf, vistonebalbuf1); X return(vistonebalbuf); X } else { X return("*"); X } X} X Xchar * Xvisstruct(v) X{ X if((v >= 0) && (v <= 12)) { X switch(v) { X case 0: X return("~l~l~u~u~u __|_ ~d~l~l~l~l~l~l| |~d~l~l~l~l~l~l| |~d~l~l~l~l~l~lS 1 S"); X break; X case 1: X return("~l~l~u~u~u __| ~d~l~l~l~l~l~l| RM ~d~l~l~l~l~l~l|/ \\ ~d~l~l~l~l~l~lS 2 S"); X break; X case 2: X return("~l~l~u~u~u __|_ ~d~l~l~l~l~l~l| |~d~l~l~l~l~l~l| |~d~l~l~l~l~l~lP 3 S"); X break; X case 3: X return("~l~l~u~u~u __| ~d~l~l~l~l~l~l| RM ~d~l~l~l~l~l~l|/ \\ ~d~l~l~l~l~l~lP 4 S"); X break; X case 4: X return("~l~l~u~u~u __| ~d~l~l~l~l~l~l| RM ~d~l~l~l~l~l~l|/ \\ ~d~l~l~l~l~l~lS 5 P"); X break; X case 5: X return("~l~l~u~u~u __|_ ~d~l~l~l~l~l~l| |~d~l~l~l~l~l~l| |~d~l~l~l~l~l~lP 6 P"); X break; X case 6: X return("~l~l~u~u~u __| ~d~l~l~l~l~l~l| RM ~d~l~l~l~l~l~l|/ \\ ~d~l~l~l~l~l~lP 7 P"); X break; X case 7: X return("~l~l~u~u~u| |~d~l~l~l~l~l~l| |~d~l~l~l~l~l~l| |~d~l~l~l~l~l~lS 8 S"); X break; X case 8: X return("~l~l~u~u~u| |~d~l~l~l~l~l~l| |~d~l~l~l~l~l~l| |~d~l~l~l~l~l~lP 9 P"); X break; X case 9: X return("~l~l~u~u~u | ~d~l~l~l~l~l~l RM ~d~l~l~l~l~l~l / \\ ~d~l~l~l~l~l~lS 10 S"); X break; X case 10: X return("~l~l~u~u~u | ~d~l~l~l~l~l~l RM ~d~l~l~l~l~l~l / \\ ~d~l~l~l~l~l~lP 11 S"); X break; X case 11: X return("~l~l~u~u~u | ~d~l~l~l~l~l~l RM ~d~l~l~l~l~l~l / \\ ~d~l~l~l~l~l~lS 12 P"); X break; X case 12: X return("~l~l~u~u~u | ~d~l~l~l~l~l~l RM ~d~l~l~l~l~l~l / \\ ~d~l~l~l~l~l~lP 13 P"); X break; X } X } else { X return("*"); X } X} X Xchar * Xvispmute(v) X{ X switch (v) { X case 0: return("_ _ _ _"); X case 1: return("1 _ _ _"); X case 2: return("_ 2 _ _"); X case 3: return("1 2 _ _"); X case 4: return("_ _ 3 _"); X case 5: return("1 _ 3 _"); X case 6: return("_ 2 3 _"); X case 7: return("1 2 3 _"); X case 8: return("_ _ _ 4"); X case 9: return("1 _ _ 4"); X case 10: return("_ 2 _ 4"); X case 11: return("1 2 _ 4"); X case 12: return("_ _ 3 4"); X case 13: return("1 _ 3 4"); X case 14: return("_ 2 3 4"); X case 15: return("1 2 3 4"); X } X return("*"); X} X Xchar * Xvisenvmode(v) X{ X switch (v) { X case 0: return("NORMAL"); X case 1: return("NO SUSTAIN"); X } X return("*"); X} X Xstatic char *cpitch_table[] = { X "C", X "C#", X "D", X "D#", X "E", X "F", X "F#", X "G", X "G#", X "A", X "A#", X "B" X}; X Xchar * Xviscpitch(v) X{ Xstatic char viscpitchbuf[4]; X X if((v >= 0) && (v <= 96)) { X strcpy(viscpitchbuf, cpitch_table[v % 12]); X if(strlen(viscpitchbuf) == 1) { X viscpitchbuf[1] = (((v / 12) + 1) + '0'); X viscpitchbuf[2] = 0; X } else { X viscpitchbuf[2] = (((v / 12) + 1) + '0'); X viscpitchbuf[3] = 0; X } X return(viscpitchbuf); X } else { X return("*"); X } X} X Xchar * Xvispkeyfol(v) X{ X switch (v) { X case 0: return("-1"); X case 1: return("-1/2"); X case 2: return("-1/4"); X case 3: return("0"); X case 4: return("1/8"); X case 5: return("1/4"); X case 6: return("3/8"); X case 7: return("1/2"); X case 8: return("5/8"); X case 9: return("3/4"); X case 10: return("7/8"); X case 11: return("1"); X case 12: return("5/4"); X case 13: return("3/2"); X case 14: return("2"); X case 15: return("s1"); X case 16: return("s2"); X } X return("*"); X} X Xchar * Xvistkeyfol(v) X{ X switch (v) { X case 0: return("-1"); X case 1: return("-1/2"); X case 2: return("-1/4"); X case 3: return("0"); X case 4: return("1/8"); X case 5: return("1/4"); X case 6: return("3/8"); X case 7: return("1/2"); X case 8: return("5/8"); X case 9: return("3/4"); X case 10: return("7/8"); X case 11: return("1"); X case 12: return("5/4"); X case 13: return("3/2"); X case 14: return("2"); X } X return("*"); X} X Xchar *viswavebank(v) X{ X switch (v) { X case 0: return("SQU1"); X case 1: return("SAW1"); X case 2: return("SQU2"); X case 3: return("SAW2"); X } X return("*"); X} X Xchar *vispcmnum(v) X{ Xstatic char vispcmnumbuf[3]; X X if((v >= 0) && (v <= 127)) { X sprintf(vispcmnumbuf,"%d",v + 1); X return(vispcmnumbuf); X } else { X return("*"); X } X} X Xchar *visvelsens(v) X{ Xstatic char visvelsensbuf[3]; X X if((v >= 0) && (v <= 6)) { X sprintf(visvelsensbuf,"-%d",abs(v - 7)); X return(visvelsensbuf); X } else if(v == 7) { X sprintf(visvelsensbuf,"0"); X return(visvelsensbuf); X } else if((v >= 8) && (v <= 14)) { X sprintf(visvelsensbuf,"+%d",abs(v - 7)); X return(visvelsensbuf); X } else { X return("*"); X } X} X Xchar *visenvlev(v) X{ Xstatic char visenvlevbuf[4]; X X if((v >= 0) && (v <= 49)) { X sprintf(visenvlevbuf,"-%d",abs(v - 50)); X return(visenvlevbuf); X } else if(v == 50) { X sprintf(visenvlevbuf,"0"); X return(visenvlevbuf); X } else if((v >= 51) && (v <= 100)) { X sprintf(visenvlevbuf,"+%d",abs(v - 50)); X return(visenvlevbuf); X } else { X return("*"); X } X} X Xchar *visbiaslev(v) X{ Xstatic char visbiaslevbuf[3]; X X if((v >= 0) && (v <= 6)) { X sprintf(visbiaslevbuf,"-%d",abs(v - 7)); X return(visbiaslevbuf); X } else if(v == 7) { X sprintf(visbiaslevbuf,"0"); X return(visbiaslevbuf); X } else if((v >= 8) && (v <= 14)) { X sprintf(visbiaslevbuf,"+%d",abs(v - 7)); X return(visbiaslevbuf); X } else { X return("*"); X } X} X Xstatic char *bpitch_table[] = { X "A", X "A#", X "B", X "C", X "C#", X "D", X "D#", X "E", X "F", X "F#", X "G", X "G#" X}; X Xchar * Xvisbiaspd(v) X{ Xstatic char visbiaspdbuf[5]; Xstatic char visbiaspdbuf1[2]; X X if((v >= 0) && (v <= 127)) { X if(v >= 64) { X strcpy(visbiaspdbuf, ">"); X v -= 64; X } else { X strcpy(visbiaspdbuf, "<"); X } X strcat(visbiaspdbuf, bpitch_table[v % 12]); X v += 9; X sprintf(visbiaspdbuf1, "%d", (v / 12) + 1); X strcat(visbiaspdbuf, visbiaspdbuf1); X return(visbiaspdbuf); X } else { X return("*"); X } X} X Xchar *vistvablev(v) X{ Xstatic char vistvablevbuf[4]; X X if((v >= 0) && (v <= 12)) { X if(v == 12) { X return("0"); X } else { X sprintf(vistvablevbuf,"-%d",abs(v - 12)); X return(vistvablevbuf); X } X } else { X return("*"); X } X} X X/* end */ END_OF_FILE if test 10248 -ne `wc -c <'vis.c'`; then echo shar: \"'vis.c'\" unpacked with wrong size! fi # end of 'vis.c' fi echo shar: End of archive 5 \(of 15\). cp /dev/null ark5isdone MISSING="" for I in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ; do if test ! -f ark${I}isdone ; then MISSING="${MISSING} ${I}" fi done if test "${MISSING}" = "" ; then echo You have unpacked all 15 archives. rm -f ark[1-9]isdone ark[1-9][0-9]isdone else echo You still need to unpack the following archives: echo " " ${MISSING} fi ## End of shell archive. exit 0