MOSTLY-MIDI-MAILING-LIST MEMBERS: Attached is the program listing for "TX8LIB.BAS", a librarian/editor for patches and performances on the YAMAHA TX81Z synthesizer rack. The program runs on an AT&T PC6300 (and compatibles, presumably) and the ROLAND MPU-401 MIDI box (and, again, devices such as the Voyetra OP-4000 which are compatible). The program below is set to run on MIDI channel 0...to change the MIDI channel, alter line 35 below. To use this program, you MAY need to specify the /S: option when invoking GWBASIC to allow random file record lengths up to 129 bytes (the length of the records in the "TX8.PAT" librarian file). The command would be "GWBASIC TX8LIB /S:129". If you have any questions or comments, suggestions for improvement, or new patches that you'd like to share with the MMML folks using this program, please contact: Duane Bowker HO 3B-520 (AT&T Bell Laboratories Crawfords Corner Road, Rm. 3B-520 Holmdel, NJ 07733) (201) 949-2607 ...ihnp4!houdi!dob The companion library files for this program are called "TX8.PAT" (patches) and "TX8.CMB" (performances). Good luck and enjoy. Duane ***************************************************************************** - CUT HERE - ***************************************************************************** 1 REM tx8lib.bas - Patch/Combination Librarian for YAMAHA TX81Z 4 KEY OFF:KEY 10,"system"+CHR$(13) 5 OUT 817,255:OUT 817,63 6 FOR I%=1 TO 700:JUNK%=INP(816):NEXT I% 10 DIM PAR%(200),PARA%(200),PARB%(200) 20 DIM P$(200),PTABL(97,5),CTABL(92,5) 22 DIM NOTES$(12):NOTES$(0)="C":NOTES$(1)="C#":NOTES$(2)="D":NOTES$(3)="D#":NOTES$(4)="E":NOTES$(5)="F":NOTES$(6)="F#":NOTES$(7)="G":NOTES$(8)="G#":NOTES$(9)="A":NOTES$(10)="A#":NOTES$(11)="B" 25 GOSUB 200:REM load ptabl() and ctabl() from DATA statements 30 NULL$=CHR$(0) 35 CHAN%=0:REM MIDI channel for TX81Z (channel 1 on TX81Z display) 50 COLOR 15,1:CLS 60 PRINT"TX8LIB.BAS - Patch Librarian for the YAMAHA TX81Z" 61 COLOR 4,1:PRINT" D.O.Bowker - 5/28/88" 62 PRINT" AT&T Bell Laboratories" 63 PRINT" (201) 949-2607":COLOR 15,1:PRINT 65 WHERE=1:PRINT:PRINT 66 PRINT"show patches in file (a) show performances in file (h)" 67 PRINT"read patch from TX81Z (b) read performance from TX81Z (i)" 68 PRINT"write patch to TX81Z (c) write performance to TX81Z (j)" 69 PRINT"display patch on CRT (d) display performance on CRT (k)" 70 PRINT"rand patch - scratch (e) edit TX81Z performance file (l)" 71 PRINT"rand patch - seed (f) edit TX81Z patch file (m)" 72 PRINT"rand patch - blend (g) QUIT........................(q)" 73 PRINT:PRINT 79 RESP$=INKEY$:IF LEN(RESP$)=0 THEN 79 80 PRINT:GOSUB 400:REM set MX-8 for direct PC <<==>> TX81Z link 85 IF RESP$="u" THEN GOSUB 1200:GOTO 65 86 IF RESP$="g" THEN GOSUB 5000:GOTO 65 87 IF RESP$="k" THEN GOSUB 2000:GOTO 65 88 IF RESP$="m" THEN GOSUB 6000:GOTO 65 89 IF RESP$="l" THEN GOSUB 8000:GOTO 65 90 IF RESP$="a" THEN GOSUB 150:GOTO 65 91 IF RESP$="b" THEN GOSUB 600:GOTO 65 92 IF RESP$="h" THEN GOSUB 100:GOTO 65 93 IF RESP$="e" THEN GOSUB 3000:GOTO 65 94 IF RESP$="i" THEN GOSUB 2600:GOTO 65 95 IF RESP$="c" THEN GOSUB 800:GOTO 65 96 IF RESP$="j" THEN GOSUB 2800:GOTO 65 97 IF RESP$="f" THEN GOSUB 4000:GOTO 65 98 IF RESP$="d" THEN GOSUB 900:GOTO 65 99 IF RESP$="q" THEN GOSUB 500:END ELSE GOTO 79 100 REM LIST PERFORMANCES IN "TX8.CMB" ******************************** 102 PRINT:PRINT"PERFORMANCES IN 'TX8.CMB'" 105 OPEN "R",#1,"TX8.CMB",122:RN=1 110 FOR I%=1 TO 121:FIELD#1,(I%*1) AS OFFSET$,1 AS P$(I%):NEXT I% 111 LRN=CINT(LOF(1)/122):PRINT"Total Performances:";LRN:PRINT 112 RLIM=1+INT(LRN/4) 114 FOR RN=1 TO RLIM 115 FOR CLM=1 TO 4 116 IF(RN+((CLM-1)*RLIM))>LRN THEN GOTO 129 ELSE GET#1,RN+((CLM-1)*RLIM) 120 FOR I%=1 TO 121:PAR%(I%)=CVI(P$(I%)+NULL$):NEXT I% 124 PRINT USING"####";RN+((CLM-1)*RLIM);:PRINT": "; 128 FOR I%=111 TO 120:PRINT CHR$(PAR%(I%));:NEXT I%:PRINT" "; 129 NEXT CLM:PRINT:NEXT RN 130 CLOSE #1 149 RETURN 65 150 REM LIST PATCH FILES IN "TX8.PAT" ********************************** 152 PRINT:PRINT"PATCH FILES IN 'TX8.PAT'" 155 OPEN "R",#1,"TX8.PAT",129:RN=1 160 FOR I%=1 TO 128:FIELD#1,(I%*1) AS OFFSET$,1 AS P$(I%):NEXT I% 161 LRN=CINT(LOF(1)/129):PRINT"Total Patches:";LRN:PRINT 162 RLIM=1+INT(LRN/4) 164 FOR RN=1 TO RLIM 165 FOR CLM=1 TO 4 166 IF(RN+((CLM-1)*RLIM))>LRN THEN GOTO 179 ELSE GET#1,RN+((CLM-1)*RLIM) 170 FOR I%=1 TO 128:PAR%(I%)=CVI(P$(I%)+NULL$):NEXT I% 174 PRINT USING"####";RN+((CLM-1)*RLIM);:PRINT": "; 178 FOR I%=112 TO 121:PRINT CHR$(PAR%(I%));:NEXT I%:PRINT" "; 179 NEXT CLM:PRINT:NEXT RN 180 CLOSE #1 199 IF(WHERE=5)THEN RETURN 1201 ELSE RETURN 65 200 REM data TX81Z patch table 201 DATA 84,99,0,3,15,58,99,0,3,19,71,99,0,3,23,45,99,0,3,27:REM out level 202 DATA 26,1,0,4,15,16,1,0,4,19,21,1,0,4,23,11,1,0,4,27:REM freq.type 203 DATA 27,7,0,5,15,17,7,0,5,19,22,7,0,5,23,12,7,0,5,27:REM fix range 204 DATA 85,63,0,6,15,59,63,0,6,19,72,63,0,6,23,46,63,0,6,27:REM freq.coarse 205 DATA 28,15,0,7,15,18,15,0,7,19,23,15,0,7,23,13,15,0,7,27:REM freq.fine 206 DATA 86,6,-3,8,15,60,6,-3,8,19,73,6,-3,8,23,47,6,-3,8,27:REM detune 207 DATA 29,7,1,9,15,19,7,1,9,19,24,7,1,9,23,14,7,1,9,27:REM waveform 208 DATA 74,31,0,10,15,48,31,0,10,19,61,31,0,10,23,35,31,0,10,27:REM attack rate 209 DATA 75,31,0,11,15,49,31,0,11,19,62,31,0,11,23,36,31,0,11,27:REM decay1 rate 210 DATA 78,15,0,12,15,52,15,0,12,19,65,15,0,12,23,39,15,0,12,27:REM decay1 lvl 211 DATA 76,31,0,13,15,50,31,0,13,19,63,31,0,13,23,37,31,0,13,27:REM decay2 rate 212 DATA 77,15,0,14,15,51,15,0,14,19,64,15,0,14,23,38,15,0,14,27:REM release rat 213 DATA 30,3,0,15,15,20,3,0,15,19,25,3,0,15,23,15,3,0,15,27:REM eg shift 214 DATA 80,3,0,16,15,54,3,0,16,19,67,3,0,16,23,41,3,0,16,27:REM scale rate 215 DATA 79,99,0,17,15,53,99,0,17,19,66,99,0,17,23,40,99,0,17,27:REM scale level 216 DATA 82,1,0,18,15,56,1,0,18,19,69,1,0,18,23,43,1,0,18,27:REM scale on/off 217 DATA 81,7,0,19,15,55,7,0,19,19,68,7,0,19,23,42,7,0,19,27:REM scale eg bias 218 DATA 83,7,0,20,15,57,7,0,20,19,70,7,0,20,23,44,7,0,20,27:REM scale key vel 219 DATA 87,7,1,2,46,88,7,0,3,46,94,3,0,4,46,93,1,0,4,63:REM alg,feed,wave,sync 220 DATA 89,99,0,5,46,90,99,0,5,63,92,99,0,6,46,96,3,0,6,63:REM LFO stuff 221 DATA 91,99,0,7,46,95,7,0,7,63,98,1,0,8,46,97,48,24,8,63:REM LFO, functions 222 DATA 100,1,0,9,46,31,7,0,9,63,101,99,0,10,46,99,12,0,10,63:REM more fnctns 223 DATA 102,99,0,11,46,108,99,0,11,63,32,99,0,12,46,109,99,0,12,63:REM more fs 224 DATA 33,99,0,13,46,111,99,0,13,63,106,99,0,14,46,110,99,-50,14,63:REM more fs 225 DATA 107,99,0,15,46:REM that's all folks! 230 FOR I=1 TO 97:FOR J=1 TO 5:READ PTABL(I,J):NEXT J:NEXT I 250 REM data TX81Z performance table 252 DATA 11,8,0,4,15,23,8,0,4,22,35,8,0,4,29,47,8,0,4,36,59,8,0,4,43,71,8,0,4,50,83,8,0,4,57,95,8,0,4,64:REM max notes 254 DATA 12,159,1,5,15,24,159,1,5,22,36,159,1,5,29,48,159,1,5,36,60,159,1,5,43,72,159,1,5,50,84,159,1,5,57,96,159,1,5,64:REM voice number 256 DATA 14,16,1,6,15,26,16,1,6,22,38,16,1,6,29,50,16,1,6,36,62,16,1,6,43,74,16,1,6,50,86,16,1,6,57,98,16,1,6,64:REM MIDI receive channel 258 DATA 15,127,1,7,15,27,127,1,7,22,39,127,1,7,29,51,127,1,7,36,63,127,1,7,43,75,127,1,7,50,87,127,1,7,57,99,127,1,7,64:REM lower note limit 260 DATA 16,127,1,8,15,28,127,1,8,22,40,127,1,8,29,52,127,1,8,36,64,127,1,8,43,76,127,1,8,50,88,127,1,8,57,100,127,1,8,64:REM upper note limit 262 DATA 17,14,-7,9,15,29,14,-7,9,22,41,14,-7,9,29,53,14,-7,9,36,65,14,-7,9,43,77,14,-7,9,50,89,14,-7,9,57,101,14,-7,9,64:REM detune 264 DATA 18,48,-24,10,15,30,48,-24,10,22,42,48,-24,10,29,54,48,-24,10,36,66,48,-24,10,43,78,48,-24,10,50,90,48,-24,10,57,102,48,-24,10,64:REM note shift 266 DATA 19,99,0,11,15,31,99,0,11,22,43,99,0,11,29,55,99,0,11,36,67,99,0,11,43,79,99,0,11,50,91,99,0,11,57,103,99,0,11,64:REM volume 268 DATA 20,3,0,12,15,32,3,0,12,22,44,3,0,12,29,56,3,0,12,36,68,3,0,12,43,80,3,0,12,50,92,3,0,12,57,104,3,0,12,64:REM output assignments 270 DATA 21,3,0,13,15,33,3,0,13,22,45,3,0,13,29,57,3,0,13,36,69,3,0,13,43,81,3,0,13,50,93,3,0,13,57,105,3,0,13,64:REM LFO select 272 DATA 22,1,0,14,15,34,1,0,14,22,46,1,0,14,29,58,1,0,14,36,70,1,0,14,43,82,1,0,14,50,94,1,0,14,57,106,1,0,14,64:REM microtune on/off 274 DATA 107,12,0,16,15,108,1,0,17,15,109,3,0,17,29,110,11,1,16,29:REM extras 280 FOR I=1 TO 92:FOR J=1 TO 5:READ CTABL(I,J):NEXT J:NEXT I 299 RETURN 400 REM switch MX-8 to correct set-up for TX81Z Librarian 401 RETURN:REM ==> this line added to avoid the MX-8 subroutine <== 410 OUT 817,255:OUT 817,63:FOR I%=1 TO 500:JUNK=INP(816):NEXT I% 430 OUT 816,192+15:OUT 816,19:REM MX-8 is on MIDI chan.15, TX81Z Libr. is prog.19 499 RETURN 500 REM switch MX-8 to set-up for Keyboard to play TX81Z 501 RETURN:REM ==> this line added to avoid the MX-8 sub-routine <== 510 OUT 817,255:OUT 817,63:FOR I%=1 TO 500:JUNK=INP(816):NEXT I% 530 OUT 816,192+15:OUT 816,17:REM MX-8 is on MIDI chan.15, set-up is prog.17 599 RETURN 600 REM ADD PATCH TO "TX8.PAT" ******************************************** 601 OPEN "R",#1,"TX8.PAT",129:FOR I%=1 TO 128:FIELD#1,(I%*1) AS OFFSET$,1 AS P$(I%):NEXT I% 602 GOSUB 660 603 PRINT"please wait..." 604 FOR I=1 TO 500:JUNK=INP(816):NEXT I 605 OUT 817,255:OUT 817,63 610 FOR I=1 TO 1000:JUNK=INP(816):NEXT I 615 PRINT:BEEP:PRINT"SELECT DESIRED PATCH ON SYNTH" 616 IF INP(816)<>240 GOTO 616 617 IF INP(816)<>67 GOTO 616 618 IF INP(816)<>CHAN% GOTO 616 619 IF INP(816)<>126 GOTO 616 620 IF INP(816)<>0 GOTO 616 621 IF INP(816)<>33 GOTO 616 622 FOR I%=1 TO 34 623 PAR%(I%)=INP(816) 624 NEXT I% 625 IF INP(816)<>247 GOTO 647 630 IF INP(816)<>240 GOTO 630 631 IF INP(816)<>67 GOTO 630 632 IF INP(816)<>CHAN% GOTO 630 633 IF INP(816)<>3 GOTO 630 634 IF INP(816)<>0 GOTO 630 635 IF INP(816)<>93 GOTO 630 636 FOR I%=35 TO 128 637 PAR%(I%)=INP(816) 638 NEXT I% 639 IF INP(816)=247 GOTO 650 647 PRINT"NO END OF DATA FROM SYNTH - RETURNING TO MAIN MENU" 648 FOR I%=1 TO 500:NEXT I%:CLOSE #1:RETURN 65 650 FOR I%=1 TO 128:RSET P$(I%)=MKI$(PAR%(I%)):NEXT I% 652 PUT#1,LRN 655 PRINT"Patch Dump Completed...Now ";LRN;" total patches in 'TX8.PAT'":CLOSE #1:RETURN 65 660 REM subroutine to count number of records in "TX8.PAT" 670 LRN=CINT(LOF(1)/129)+1 699 RETURN 700 REM subroutine to calculate two's-compliment checksum for random patches 750 CHSUM0=0:CHSUM1=0 755 FOR I=1 TO 33:CHSUM0=CHSUM0+PAR%(I):NEXT I 760 FOR I=35 TO 127:CHSUM1=CHSUM1+PAR%(I):NEXT I 761 CHSUM0=128*((CHSUM0/128)-(INT(CHSUM0/128))) 762 CHSUM1=128*((CHSUM1/128)-(INT(CHSUM1/128))) 763 CHSUM0=128-CHSUM0:CHSUM1=128-CHSUM1 770 PAR%(34)=CHSUM0:PAR%(128)=CHSUM1 799 RETURN 800 REM WRITE A LIBRARY PATCH TO THE SYNTH************************************* 802 WHERE=0 803 OPEN "R",#1,"TX8.PAT",129:FOR I%=1 TO 128:FIELD#1,(I%*1) AS OFFSET$,1 AS P$(I%):NEXT I% 804 LRN=CINT(LOF(1)/129) 805 PRINT"enter patch record number to write to TX81Z (1 -";LRN;")";:INPUT CODE 806 IF(CODE>0 AND CODE <=LRN)THEN GET #1,CODE ELSE PRINT"VALUE OUT OF RANGE":GOTO 805 807 INPUT"select patch then press return when ready";RESP$ 811 FOR I%=1 TO 128:PAR%(I%)=CVI(P$(I%)+NULL$):NEXT I% 815 GOSUB 1600 816 OUT 817,255 817 OUT 817,63 818 FOR I%=1 TO 1000:JUNK%=INP(816):NEXT I% 828 OUT 816,240:OUT 816,67:OUT 816,CHAN%:OUT 816,126:OUT 816,0:OUT 816,33 830 FOR I%=1 TO 34:OUT 816,PAR%(I%):NEXT I%:OUT 816,247 840 OUT 816,240:OUT 816,67:OUT 816,CHAN%:OUT 816,3:OUT 816,0:OUT 816,93 850 FOR I%=35 TO 128:OUT 816,PAR%(I%):NEXT I%:OUT 816,247 855 IF(WHERE=4 OR WHERE=5)THEN CLOSE#1:RETURN 862 PRINT"Patch Name:"; 863 FOR I%=112 TO 121:PRINT CHR$(PAR%(I%));:NEXT I%:PRINT 864 CLOSE#1:GOSUB 500:REM set MX-8 to keyboard ==>> TX81Z 865 IF WHERE=1 THEN RETURN 3190 875 IF WHERE=2 THEN RETURN 5090 885 IF WHERE=3 THEN RETURN 4190 895 RETURN 65 900 REM subroutine to display patch parameter values ************************* 905 PRINT:PRINT:OPEN "R",#1,"TX8.PAT",129:LRN=CINT(LOF(1)/129) 906 PRINT"enter patch record number for display ( 1 -";LRN;")";:INPUT CODE 907 IF(CODE>0 AND CODE<=LRN)THEN GOTO 908 ELSE PRINT "VALUE OUT OF RANGE":GOTO 906 908 FOR I%=1 TO 128:FIELD#1,(I%*1) AS OFFSET$,1 AS P$(I%):NEXT I% 910 GET #1,CODE 914 FOR I%=1 TO 128:PAR%(I%)=CVI(P$(I%)+NULL$):NEXT I%:CLOSE #1 920 GOSUB 1700:REM draw patch table 930 GOSUB 1750:REM fill in values 1093 LOCATE 21,1:PRINT:COLOR 15,1:PRINT"(any key to continue)"; 1094 X$=INKEY$:IF(LEN(X$)=0)THEN 1094 1095 RETURN 65 1100 REM rotine to transfer patches from one file to "TX8.PAT" 1105 PRINT"enter patch file name for transfer";:INPUT FILE$ 1110 OPEN "R",#1,FILE$,129:FOR I%=1 TO 128:FIELD#1,(I%*1) AS OFFSET$,1 AS P$(I%):NEXT I% 1114 LRN=CINT(LOF(1)/129):PRINT"total patches in";FIL$;" = ";LRN 1115 PRINT"enter patch record number to write to TX81Z (1 -";LRN;")";:INPUT CODE 1116 IF(CODE>0 AND CODE <=LRN)THEN GET #1,CODE ELSE PRINT"VALUE OUT OF RANGE":GOTO 1115 1117 GOSUB 400:GOSUB 807 1118 GOSUB 500 1120 GOTO 3190 1130 REM display patches froma different library file 1135 PRINT"enter patch file name for listing";:INPUT FILE$ 1140 OPEN "R",#1,FILE$,129:FOR I%=1 TO 128:FIELD#1,(I%*1) AS OFFSET$,1 AS P$(I%):NEXT I% 1144 LRN=CINT(LOF(1)/129):PRINT"total patches in";FIL$;" = ";LRN 1145 GOSUB 162 1150 REM display bytes in patch file record 1152 PRINT:PRINT:OPEN "R",#1,"TX8.PAT",129:INPUT"enter patch record number for display";CODE 1154 FOR I=1 TO 128:FIELD#1,(I*1) AS OFFSET$,1 AS P$(I):NEXT I 1156 GET #1,CODE:FOR I=1 TO 128:PAR%(I)=CVI(P$(I)+NULL$):NEXT I:CLOSE #1 1158 CLS:COLOR 4,1:PRINT"Name:";:FOR I=112 TO 121:PRINT CHR$(PAR%(I));:NEXT I:PRINT 1160 FOR I=1 TO 16:LOCATE I+2,1:FOR J=1 TO 8:K=(((I-1)*8)+J):PRINT USING"###";K;:PRINT":";:PRINT USING"###";PAR%(K);:PRINT" ";:NEXT J:NEXT I 1162 PRINT:COLOR 15,1:PRINT"(any key to continue)"; 1164 X$=INKEY$:IF(LEN(X$)=0)THEN 1164 1166 RETURN 1201 1200 CLS:PRINT" UTILITY MENU" 1201 WHERE=5:PRINT:PRINT 1202 PRINT"transfer patch from one library to 'TX8.PAT' (a)" 1204 PRINT"list patches from a different library file (b)" 1206 PRINT"display all bytes in patch (c)" 1218 PRINT"QUIT..........................................(q)" 1220 PRINT:PRINT 1222 RESP$=INKEY$:IF LEN(RESP$)=0 THEN 1222 1225 IF RESP$="a" THEN GOSUB 1100:GOTO 1200 1226 IF RESP$="q" THEN RETURN 65 1227 IF RESP$="b" THEN GOSUB 1130:GOTO 1200 1228 IF RESP$="c" THEN GOSUB 1150:GOTO 1200 1249 GOTO 1200 1600 REM ROUTINE TO FLUSH ACCUMULATED DATA FROM PORT ************************** 1610 FOR I%=1 TO 3000:JUNK%=INP(816):NEXT I% 1620 RETURN 1700 REM subroutine to draw patch table 1718 CLS:LOCATE 1,1 1719 PRINT"Name: "; 1720 COLOR 15,1:LOCATE 2,15:PRINT"op1";:LOCATE 2,19:PRINT"op2";:LOCATE 2,23:PRINT"op3";:LOCATE 2,27:PRINT"op4"; 1721 LOCATE 3,1:PRINT"output level:";:LOCATE 4,4:PRINT"freq.type:";:LOCATE 5,4:PRINT"fix range:";:LOCATE 6,2:PRINT"freq.coarse:";:LOCATE 7,4:PRINT"freq.fine:";:LOCATE 8,7:PRINT"detune:";:LOCATE 9,5:PRINT"waveform:"; 1722 LOCATE 10,2:PRINT"attack rate:";:LOCATE 11,1:PRINT"decay 1 rate:";:LOCATE 12,1:PRINT"decay 1 levl:";:LOCATE 13,1:PRINT"decay 2 rate:";:LOCATE 14,1:PRINT"release rate:";:LOCATE 15,5:PRINT"eg shift:"; 1723 LOCATE 16,3:PRINT"scale rate:";:LOCATE 17,2:PRINT"scale level:";:LOCATE 18,1:PRINT"scale on/off:";:LOCATE 19,1:PRINT"scale egbias:";:LOCATE 20,1:PRINT"scale keyvel:"; 1724 LOCATE 2,35:PRINT"Algorithm:";:LOCATE 3,36:PRINT"Feedback:";:LOCATE 4,32:PRINT"LFO waveform:";:LOCATE 4,57:PRINT"sync:";:LOCATE 5,39:PRINT"speed:";:LOCATE 5,56:PRINT"delay:"; 1725 LOCATE 6,31:PRINT"amp mod.depth:";:LOCATE 6,57:PRINT"sens:";:LOCATE 7,31:PRINT"pch mod.depth:";:LOCATE 7,57:PRINT"sens:";:LOCATE 8,40:PRINT"mode:";:LOCATE 8,56:PRINT"mid C:"; 1726 LOCATE 9,34:PRINT"portamento:";:LOCATE 9,52:PRINT"rvrb rate:";:LOCATE 10,34:PRINT"porta time:";:LOCATE 10,53:PRINT"pb range:";:LOCATE 11,38:PRINT"FC vol:";:LOCATE 11,53:PRINT"BC pitch:"; 1727 LOCATE 12,36:PRINT"FC pitch:";:LOCATE 12,55:PRINT"BC amp:";:LOCATE 13,38:PRINT"FC amp:";:LOCATE 13,52:PRINT"BC egbias:"; 1728 LOCATE 14,36:PRINT"MW pitch:";:LOCATE 14,53:PRINT"BC pbias:";:LOCATE 15,38:PRINT"MW amp:"; 1749 RETURN 1750 REM subroutine to fill in parameter values 1755 LOCATE 1,7:COLOR 4,1:FOR I%=112 TO 121:PRINT CHR$(PAR%(I%));:NEXT I%:PRINT 1760 FOR I=1 TO 4:LOCATE PTABL(I,4),PTABL(I,5):PRINT PAR%(PTABL(I,1))+PTABL(I,3);:NEXT I 1764 FOR I=5 TO 8:LOCATE PTABL(I,4),PTABL(I,5):IF PAR%(PTABL(I,1))=0 THEN PRINT"RTO"; ELSE PRINT"FXD"; 1768 NEXT I 1772 FOR I=9 TO 48:LOCATE PTABL(I,4),PTABL(I,5):PRINT PAR%(PTABL(I,1))+PTABL(I,3);:NEXT I 1773 FOR I=49 TO 52:LOCATE PTABL(I,4),PTABL(I,5) 1774 IF(PAR%(PTABL(I,1))=0)THEN PRINT "off"; 1775 IF(PAR%(PTABL(I,1))=1)THEN PRINT "48 "; 1776 IF(PAR%(PTABL(I,1))=2)THEN PRINT "24 "; 1777 IF(PAR%(PTABL(I,1))=3)THEN PRINT "12 "; 1778 NEXT I:FOR I=53 TO 60:LOCATE PTABL(I,4),PTABL(I,5):PRINT PAR%(PTABL(I,1))+PTABL(I,3);:NEXT I 1779 FOR I=61 TO 64:LOCATE PTABL(I,4),PTABL(I,5):IF PAR%(PTABL(I,1))=0 THEN PRINT"off"; ELSE PRINT"on"; 1780 NEXT I 1784 FOR I=65 TO 74:LOCATE PTABL(I,4),PTABL(I,5):PRINT PAR%(PTABL(I,1))+PTABL(I,3);:NEXT I 1786 LOCATE PTABL(75,4),PTABL(75,5):IF PAR%(PTABL(75,1))=0 THEN PRINT"sin"; 1788 IF PAR%(PTABL(75,1))=1 THEN PRINT"sqr"; 1789 IF PAR%(PTABL(75,1))=2 THEN PRINT"tri"; 1790 IF PAR%(PTABL(75,1))=3 THEN PRINT"s/h"; 1791 LOCATE PTABL(76,4),PTABL(76,5):IF PAR%(PTABL(76,1))=0 THEN PRINT"off"; ELSE PRINT"on"; 1792 FOR I=77 TO 82:LOCATE PTABL(I,4),PTABL(I,5):PRINT PAR%(PTABL(I,1))+PTABL(I,3);:NEXT I 1793 LOCATE PTABL(83,4),PTABL(83,5):IF PAR%(PTABL(83,1))=0 THEN PRINT"PLY"; ELSE PRINT"UNI"; 1794 LOCATE PTABL(85,4),PTABL(85,5):IF PAR%(PTABL(85,1))=0 THEN PRINT"off"; ELSE PRINT"full"; 1795 FOR I=86 TO 97:LOCATE PTABL(I,4),PTABL(I,5):PRINT PAR%(PTABL(I,1))+PTABL(I,3);:NEXT I 1796 LOCATE PTABL(84,4),PTABL(84,5):GURN0=(PAR%(PTABL(84,1)))/12:GURN1=INT(GURN0):GURN2=CINT((GURN0-GURN1)*12):PRINT NOTES$(GURN2);GURN1+1; 1799 RETURN 1800 REM subroutine to draw performance table 1810 CLS:LOCATE 1,1:PRINT"Name:"; 1812 LOCATE 3,16:PRINT"1";:LOCATE 3,23:PRINT"2";:LOCATE 3,30:PRINT"3";:LOCATE 3,37:PRINT"4";:LOCATE 3,44:PRINT"5";:LOCATE 3,51:PRINT"6";:LOCATE 3,58:PRINT"7";:LOCATE 3,65:PRINT"8"; 1814 LOCATE 4,4:PRINT"MAX NOTES:";:LOCATE 5,1:PRINT"VOICE NUMBER:";:LOCATE 6,1:PRINT"MIDI RECEIVE:"; 1816 LOCATE 7,5:PRINT"LOW NOTE:";:LOCATE 8,4:PRINT"HIGH NOTE:";:LOCATE 9,7:PRINT"DETUNE:"; 1818 LOCATE 10,3:PRINT"NOTE SHIFT:";:LOCATE 11,7:PRINT"VOLUME:";:LOCATE 12,7:PRINT"OUTPUT:"; 1820 LOCATE 13,3:PRINT"LFO SELECT:";:LOCATE 14,4:PRINT"MICROTUNE:"; 1822 LOCATE 16,2:PRINT"MICRO TABLE:";:LOCATE 16,24:PRINT"KEY:"; 1824 LOCATE 17,2:PRINT"ASSIGN MODE:";:LOCATE 17,21:PRINT"EFFECT:"; 1849 RETURN 1850 REM subroutine to fill in performance data for display 1855 LOCATE 1,7:COLOR 4,1:FOR I%=111 TO 120:PRINT CHR$(PAR%(I%));:NEXT I%:PRINT 1860 FOR I=1 TO 8:LOCATE CTABL(I,4),CTABL(I,5):PRINT PAR%(CTABL(I,1))+CTABL(I,3);:NEXT I 1862 FOR I=9 TO 16:LOCATE CTABL(I,4),CTABL(I,5) 1863 JUNK=128*(PAR%(CTABL(I,1))):JUNK=JUNK+PAR%(CTABL(I,1)+1):JUNK0=INT(JUNK/32):JUNK=JUNK+1 1864 IF JUNK0=0 THEN CRAP$="I" 1865 IF JUNK0=1 THEN CRAP$="A":JUNK=JUNK-32 1866 IF JUNK0=2 THEN CRAP$="B":JUNK=JUNK-64 1867 IF JUNK0=3 THEN CRAP$="C":JUNK=JUNK-96 1868 IF JUNK0=4 THEN CRAP$="D":JUNK=JUNK-128 1869 PRINT CRAP$;JUNK;:NEXT I 1870 FOR I=17 TO 24:LOCATE CTABL(I,4),CTABL(I,5):IF(PAR%(CTABL(I,1))<16)THEN PRINT PAR%(CTABL(I,1))+CTABL(I,3);:NEXT I ELSE PRINT"omn";:NEXT I 1871 FOR I=25 TO 40:LOCATE CTABL(I,4),CTABL(I,5):JUNK=INT((PAR%(CTABL(I,1)))/12)-2:JUNK0=PAR%(CTABL(I,1))-((JUNK+2)*12):PRINT NOTES$(JUNK0);JUNK;:NEXT I 1874 FOR I=41 TO 64:LOCATE CTABL(I,4),CTABL(I,5):PRINT PAR%(CTABL(I,1))+CTABL(I,3);:NEXT I 1875 FOR I=65 TO 72:LOCATE CTABL(I,4),CTABL(I,5) 1876 IF PAR%(CTABL(I,1))=0 THEN PRINT"off"; 1877 IF PAR%(CTABL(I,1))=1 THEN PRINT" I "; 1878 IF PAR%(CTABL(I,1))=2 THEN PRINT" II"; 1879 IF PAR%(CTABL(I,1))=3 THEN PRINT"bth"; 1880 NEXT I:FOR I=73 TO 80:LOCATE CTABL(I,4),CTABL(I,5) 1881 IF PAR%(CTABL(I,1))=0 THEN PRINT"off"; 1882 IF PAR%(CTABL(I,1))=1 THEN PRINT" 1 "; 1883 IF PAR%(CTABL(I,1))=2 THEN PRINT" 2 "; 1884 IF PAR%(CTABL(I,1))=3 THEN PRINT"vib"; 1885 NEXT I:FOR I=81 TO 88:LOCATE CTABL(I,4),CTABL(I,5) 1887 IF PAR%(CTABL(I,1))=0 THEN PRINT"off"; ELSE PRINT"on "; 1889 NEXT I 1890 LOCATE CTABL(89,4),CTABL(89,5):PRINT PAR%(CTABL(89,1))+CTABL(89,3); 1891 LOCATE CTABL(92,4),CTABL(92,5):PRINT NOTES$(PAR%(CTABL(89,1))); 1892 LOCATE CTABL(90,4),CTABL(90,5) 1893 IF PAR%(CTABL(90,1))=0 THEN PRINT"nrm"; ELSE PRINT"alt"; 1894 LOCATE CTABL(91,4),CTABL(91,5):PRINT PAR%(CTABL(91,1)); 1899 LOCATE 20,1:RETURN 2000 REM DISPLAY PERFORMANCE PARAMETERS ON CRT ******************************** 2004 PRINT:PRINT:OPEN "R",#1,"TX8.CMB",122:LRN=CINT(LOF(1)/122) 2005 PRINT"enter performance record number for display ( 1 -";LRN;")";:INPUT CODE 2006 IF(CODE>0 AND CODE<=LRN)THEN GOTO 2007 ELSE PRINT"VALUE OUT OF RANGE":GOTO 2005 2007 FOR I%=1 TO 121:FIELD#1,(I%*1) AS OFFSET$,1 AS P$(I%):NEXT I% 2010 GET#1,CODE 2014 FOR I%=1 TO 121:PAR%(I%)=CVI(P$(I%)+NULL$):NEXT I%:CLOSE #1 2020 GOSUB 1800:REM draw table 2030 GOSUB 1850:REM fill in data 2195 PRINT:COLOR 15,1:PRINT"(any key to continue)"; 2196 X$=INKEY$:IF(LEN(X$)=0)THEN 2196 2199 RETURN 65 2600 REM ADD PERFORMANCE TO "TX8.CMB" ************************************ 2601 OPEN "R",#1,"TX8.CMB",122:FOR I%=1 TO 121:FIELD#1,(I%*1) AS OFFSET$,1 AS P$(I%):NEXT I% 2602 GOSUB 2660 2603 GOSUB 1600 2605 OUT 817,255:OUT 817,63 2610 GOSUB 1600 2615 PRINT:BEEP:PRINT"SELECT DESIRED PERFORMANCE ON TX81Z" 2616 IF INP(816)<>240 GOTO 2616 2617 IF INP(816)<>67 GOTO 2616 2618 IF INP(816)<>CHAN% GOTO 2616 2619 IF INP(816)<>126 GOTO 2616 2620 IF INP(816)<>0 GOTO 2616 2621 IF INP(816)<>120 GOTO 2616 2622 FOR I%=1 TO 121 2623 PAR%(I%)=INP(816) 2624 NEXT I% 2625 IF INP(816)=247 GOTO 2650 2647 PRINT"NO END OF DATA FROM SYNTH - RETURNING TO MAIN MENU" 2648 FOR I%=1 TO 500:NEXT I%:CLOSE #1:RETURN 65 2650 FOR I%=1 TO 121:RSET P$(I%)=MKI$(PAR%(I%)):NEXT I% 2652 PUT#1,LRN 2655 PRINT"Performance Dump Completed...Now ";LRN;" total performances in 'TX8.CMB'":CLOSE #1:RETURN 65 2660 REM subroutine to count number of records in "TX8.CMB" 2670 LRN=CINT(LOF(1)/122)+1 2699 RETURN 2800 REM WRITE A LIBRARY PERFORMANCE TO THE TX81Z ****************************** 2802 PRINT:PRINT:OPEN "R",#1,"TX8.CMB",122:FOR I%=1 TO 121:FIELD#1,(I%*1) AS OFFSET$,1 AS P$(I%):NEXT I%:LRN=CINT(LOF(1)/122) 2804 PRINT"enter record number of performance to write to TX81Z ( 1 -";LRN;")";:INPUT CODE 2805 IF(CODE>0 AND CODE<=LRN)THEN GOTO 2806 ELSE PRINT"VALUE OUT OF RANGE":GOTO 2804 2806 GET#1,CODE 2807 INPUT"select performance on TX81Z...press return when ready";RESP$ 2814 FOR I%=1 TO 121:PAR%(I%)=CVI(P$(I%)+NULL$):NEXT I%:CLOSE #1 2815 GOSUB 1600 2816 OUT 817,255 2817 OUT 817,63 2818 FOR I%=1 TO 1000:JUNK%=INP(816):NEXT I% 2828 OUT 816,240:OUT 816,67:OUT 816,CHAN%:OUT 816,126:OUT 816,0:OUT 816,120 2830 FOR I%=1 TO 121 2840 OUT 816,PAR%(I%) 2850 NEXT I% 2860 OUT 816,247 2865 IF WHERE=4 THEN RETURN 2870 GOSUB 500:REM set MX-8 to keyboard ==>> TX81Z 2890 PRINT "Performance ";:FOR I=111 TO 120:PRINT CHR$(PAR%(I));:NEXT I:PRINT" written to TX81Z":PRINT 2895 RETURN 65 3000 REM PATCH RANDOMIZER***************************************************** 3012 RANDOMIZE 3018 FOR I%=1 TO 128:PAR%(I%)=0:NEXT I% 3020 REM randomize patch variables 3030 FOR I=1 TO 97 3040 PAR%(PTABL(I,1))=INT(RND*(PTABL(I,2)+1)) 3050 NEXT I 3160 PRINT"enter random patch name";:INPUT FIL$ 3162 FOR I=1 TO 10:JUNK(I)=32:NEXT I 3165 EXTENT=LEN(FIL$) 3166 IF(EXTENT>10)THEN EXTENT=10 3168 TEMP$=FIL$ 3170 FOR I=EXTENT TO 1 STEP -1 3172 JUNK(I)=ASC(RIGHT$(TEMP$,1)) 3174 TEMP$=LEFT$(TEMP$,(I-1)) 3180 NEXT I 3185 FOR I=1 TO 10:PAR%(111+I)=JUNK(I):NEXT I 3186 GOSUB 700:REM calculate checksum for PAR%(34) and PAR%(128) 3188 WHERE=1:GOSUB 815 3190 GOSUB 1700:GOSUB 1750:LOCATE 23,1:COLOR 15,1:PRINT"store in library (y/n)?"; 3192 RESP$=INKEY$:IF(LEN(RESP$)=0)THEN 3192 3193 IF(RESP$<>"n" AND RESP$<>"y")THEN GOTO 3192 3194 IF(RESP$="n"AND WHERE=5)THEN RETURN 1201 3195 IF(RESP$="n")THEN RETURN 65 3210 OPEN "R",#1,"TX8.PAT",129:FOR I%=1 TO 128:FIELD#1,(I%*1) AS OFFSET$,1 AS P$(I%):NEXT I% 3212 GOSUB 660 3220 FOR I%=1 TO 128:RSET P$(I%)=MKI$(PAR%(I%)):NEXT I% 3230 PUT#1,LRN 3240 PRINT"Patch Dump Completed...Now ";LRN;" total patches in 'TX8.PAT'":CLOSE #1:IF(WHERE=1)THEN RETURN 65 ELSE RETURN 1201 4000 REM PATCH RANDOMIZER FROM SEED PATCH************************************* 4001 PRINT:PRINT:OPEN "R",#1,"TX8.PAT",129:FOR I%=1 TO 128:FIELD#1,(I%*1) AS OFFSET$,1 AS P$(I%):NEXT I%:LRN=CINT(LOF(1)/129) 4002 PRINT"enter seed patch record for randomization ( 1 -";LRN;")";:INPUT CODE 4003 IF(CODE>0 AND CODE<=LRN)THEN GOTO 4004 ELSE PRINT"VALUE OUT OF RANGE":GOTO 4002 4004 GET#1,CODE 4005 FOR I%=1 TO 128:PAR%(I%)=CVI(P$(I%)+NULL$):NEXT I%:CLOSE #1 4008 PRINT"Patch Name:";:FOR I%=112 TO 121:PRINT CHR$(PAR%(I%));:NEXT I%:PRINT 4010 INPUT"enter probability of changing any given parameter (0.00 - 1.00)";CHANGE 4011 IF(CHANGE<0! OR CHANGE>1!)THEN PRINT"VALUE OUT OF RANGE":GOTO 4010 4012 RANDOMIZE 4020 FOR I=1 TO 97 4030 IF(RND10)THEN EXTENT=10 4168 TEMP$=FIL$ 4170 FOR I=EXTENT TO 1 STEP -1 4172 JUNK(I)=ASC(RIGHT$(TEMP$,1)) 4174 TEMP$=LEFT$(TEMP$,(I-1)) 4180 NEXT I 4185 FOR I=1 TO 10:PAR%(111+I)=JUNK(I):NEXT I 4186 GOSUB 700:REM calculate checksum for PAR%(34) and PAR%(128) 4188 WHERE=3:GOSUB 815 4190 GOSUB 1700:GOSUB 1750:COLOR 15,1:LOCATE 23,1:PRINT"store in library (y/n)?"; 4192 RESP$=INKEY$:IF(LEN(RESP$)=0)THEN 4192 4194 IF(RESP$="n")THEN RETURN 65 4210 OPEN "R",#1,"TX8.PAT",129:FOR I%=1 TO 128:FIELD#1,(I%*1) AS OFFSET$,1 AS P$(I%):NEXT I% 4212 GOSUB 660 4220 FOR I%=1 TO 128:RSET P$(I%)=MKI$(PAR%(I%)):NEXT I% 4230 PUT#1,LRN 4240 PRINT"Patch Dump Completed...Now ";LRN;" total patches in 'TX8.PAT'":CLOSE #1:RETURN 65 5000 REM RANDOMIZE WITH TWO INPUT PATCHES FORMING PARAMETER BOUNDARIES 5001 PRINT:PRINT:OPEN "R",#1,"TX8.PAT",129:FOR I%=1 TO 128:FIELD#1,(I%*1) AS OFFSET$,1 AS P$(I%):NEXT I% 5002 LRN=CINT(LOF(1)/129) 5003 PRINT"enter first patch record number for blend randomization ( 1 -";LRN;")";:INPUT CODE 5004 IF(CODE>0 AND CODE<=LRN)THEN GOTO 5005 ELSE PRINT"VALUE OUT OF RANGE":GOTO 5003 5005 GET#1,CODE 5006 FOR I%=1 TO 128:PARA%(I%)=CVI(P$(I%)+NULL$):NEXT I% 5007 PRINT"Patch Name:"; 5008 FOR I%=112 TO 121:PRINT CHR$(PARA%(I%));:NEXT I%:PRINT 5009 PRINT"enter second patch record number for blend randomization ( 1 -";LRN;")";:INPUT CODE 5010 IF(CODE>0 AND CODE<=LRN)THEN GOTO 5011 ELSE PRINT"VALUE OUT OF RANGE":GOTO 5009 5011 GET#1,CODE 5012 FOR I%=1 TO 128:PARB%(I%)=CVI(P$(I%)+NULL$):NEXT I%:CLOSE #1 5014 PRINT"Patch Name:"; 5016 FOR I%=112 TO 121:PRINT CHR$(PARB%(I%));:NEXT I%:PRINT 5018 RANDOMIZE 5020 FOR I=1 TO 128 5025 IF(PARA%(I)=PARB%(I))THEN PAR%(I)=PARA%(I) 5030 IF(PARA%(I)>PARB%(I))THEN GOSUB 5200 5035 IF(PARA%(I)10)THEN EXTENT=10 5068 TEMP$=FIL$ 5070 FOR I=EXTENT TO 1 STEP -1 5072 JUNK(I)=ASC(RIGHT$(TEMP$,1)) 5074 TEMP$=LEFT$(TEMP$,(I-1)) 5080 NEXT I 5085 FOR I=1 TO 10:PAR%(111+I)=JUNK(I):NEXT I 5086 GOSUB 700:REM calculate checksum for PAR%(34) and PAR%(128) 5088 WHERE=2:GOSUB 815 5090 GOSUB 1700:GOSUB 1750:COLOR 15,1:LOCATE 23,1:PRINT"store in library (y/n)?"; 5092 RESP$=INKEY$:IF(LEN(RESP$)=0)THEN 5092 5094 IF(RESP$="n")THEN RETURN 65 5110 OPEN "R",#1,"TX8.PAT",129:FOR I%=1 TO 128:FIELD#1,(I%*1) AS OFFSET$,1 AS P$(I%):NEXT I% 5112 GOSUB 660 5120 FOR I%=1 TO 128:RSET P$(I%)=MKI$(PAR%(I%)):NEXT I% 5130 PUT#1,LRN 5140 PRINT"Patch Dump Completed...Now ";LRN;" total patches in 'TX8.PAT'":CLOSE #1:RETURN 65 5200 REM para%(i) is ceiling, parb%(i) is floor 5210 PAR%(I)=PARB%(I)+INT(RND*(PARA%(I)-PARB%(I))) 5299 RETURN 5300 REM para%(i) is floor, parb%(i) is ceiling 5310 PAR%(I)=PARA%(I)+INT(RND*(PARB%(I)-PARA%(I))) 5399 RETURN 6000 REM patch editor 6001 PRINT:PRINT:OPEN "R",#1,"TX8.PAT",129:FOR I%=1 TO 128:FIELD#1,(I%*1) AS OFFSET$,1 AS P$(I%):NEXT I%:LRN=CINT(LOF(1)/129) 6002 PRINT"enter seed patch record number for edit ( 1 -";LRN;")";:INPUT CODE 6003 IF(CODE>0 AND CODE<=LRN)THEN GOTO 6004 ELSE PRINT"VALUE OUT OF RANGE":GOTO 6002 6004 GET#1,CODE 6007 FOR I%=1 TO 128:PAR%(I%)=CVI(P$(I%)+NULL$):NEXT I%:CLOSE #1 6008 PRINT"Patch Name:";:FOR I%=112 TO 121:PRINT CHR$(PAR%(I%));:NEXT I%:PRINT 6010 GOSUB 6200 6039 FOR I%=1 TO 128:PARA%(I%)=PAR%(I%):NEXT I% 6040 GOSUB 1700:GOSUB 1750 6045 COLOR 14,1:LOCATE 17,50:PRINT "MENU";:LOCATE 18,40:PRINT"cursor keys: move cursor";:LOCATE 19,40:PRINT"s: start over r: rename";:LOCATE 20,40:PRINT"l: listen w: write to library"; 6047 LOCATE 21,40:PRINT"c: change n: new patch";:LOCATE 22,40:PRINT "q: quit"; 6080 CRNT=1 6090 IF CRNT<1 THEN CRNT=97 6092 IF CRNT>97 THEN CRNT=1 6100 LOCATE PTABL(CRNT,4),PTABL(CRNT,5)-1:COLOR 30,1:PRINT">"; 6110 RESP$=INKEY$:IF LEN(RESP$)=0 THEN 6110 6115 LOCATE PTABL(CRNT,4),PTABL(CRNT,5)-1:PRINT" "; 6120 IF ASC(RIGHT$(RESP$,1))=77 THEN CRNT=CRNT+1:GOTO 6090 6122 IF ASC(RIGHT$(RESP$,1))=75 THEN CRNT=CRNT-1:GOTO 6090 6124 IF ASC(RIGHT$(RESP$,1))=80 THEN GOSUB 7200:GOTO 6090 6126 IF ASC(RIGHT$(RESP$,1))=72 THEN GOSUB 7300:GOTO 6090 6128 IF RESP$="c" THEN GOSUB 7000:GOTO 6090 6130 IF ASC(RIGHT$(RESP$,1))=71 THEN CRNT=1:GOTO 6090 6132 IF ASC(RIGHT$(RESP$,1))=73 THEN CRNT=73:GOTO 6090 6134 IF ASC(RIGHT$(RESP$,1))=79 THEN CRNT=69:GOTO 6090 6136 IF ASC(RIGHT$(RESP$,1))=81 THEN CRNT=97:GOTO 6090 6138 IF RESP$="s" THEN FOR I%=1 TO 128:PAR%(I%)=PARA%(I%):NEXT I%:COLOR 15,1:GOTO 6040 6140 IF RESP$="q" THEN COLOR 15,1:CLS:RETURN 6142 IF RESP$="r" THEN COLOR 15,1:LOCATE 23,1:GOSUB 6200:LOCATE 23,1:PRINT SPC(40);:COLOR 1,3:LOCATE 1,7:FOR I=112 TO 121:PRINT CHR$(PAR%(I));:NEXT I:GOTO 6090 6144 IF RESP$="l" THEN LOCATE 23,1:COLOR 15,1:PRINT"Writing to TX81Z...please wait";:WHERE=4:GOSUB 400:GOSUB 700:GOSUB 815:GOSUB 500:LOCATE 23,1:PRINT SPC(30);:GOTO 6090 6146 IF RESP$="w" THEN GOSUB 700:GOSUB 6300:GOTO 6090 6148 IF RESP$="n" THEN LOCATE 23,1:COLOR 15,1:GOSUB 6400 6199 GOTO 6100 6200 REM name patch 6210 PRINT"enter new patch name";:INPUT FIL$ 6212 FOR I=1 TO 10:JUNK(I)=32:NEXT I 6215 EXTENT=LEN(FIL$) 6216 IF(EXTENT>10)THEN EXTENT=10 6218 TEMP$=FIL$ 6220 FOR I=EXTENT TO 1 STEP -1 6222 JUNK(I)=ASC(RIGHT$(TEMP$,1)) 6224 TEMP$=LEFT$(TEMP$,(I-1)) 6230 NEXT I 6235 FOR I=1 TO 10:PAR%(111+I)=JUNK(I):NEXT I 6249 RETURN 6300 REM write edited patch to library file 6305 OPEN "R",#1,"TX8.PAT",129:FOR I%=1 TO 128:FIELD#1,(I%*1) AS OFFSET$,1 AS P$(I%):NEXT I% 6310 COLOR 15,1:LOCATE 23,1:PRINT"write patch at end or over old record (e/o)?"; 6315 RESP$=INKEY$:IF LEN(RESP$)=0 THEN 6315 6320 IF(RESP$<>"e" AND RESP$<>"o")THEN 6315 6325 LOCATE 23,1:PRINT SPC(40);:LOCATE 23,1 6330 IF(RESP$="e")THEN LRN=CINT(LOF(1)/129)+1:GOTO 6370 6335 LRN=CINT(LOF(1)/129):PRINT"Enter patch number to write over ( 1 -";LRN;")"; 6340 INPUT CODE:IF(CODE>0 AND CODE<=LRN)THEN 6345 ELSE LOCATE 23,1:PRINT SPC(40);:LOCATE 23,1:PRINT"VALUE OUT OF RANGE";:LOCATE 23,1:GOTO 6335 6345 GET #1,CODE:FOR I%=1 TO 128:PARB%(I%)=CVI(P$(I%)+NULL$):NEXT I% 6350 LOCATE 23,1:PRINT SPC(40);:LOCATE 23,1:PRINT"Old Patch:";:FOR I%=112 TO 121:PRINT CHR$(PARB%(I%));:NEXT I%:PRINT"...are you SURE you want to overwrite (y/n)?"; 6355 RESP$=INKEY$:IF LEN(RESP$)=0 THEN 6355 6360 IF(RESP$<>"y" AND RESP$<>"n")THEN 6355 6362 IF RESP$="y" THEN LRN=CODE:LOCATE 23,1:PRINT SPC(70);:LOCATE 23,1:GOTO 6370 6364 LOCATE 23,1:PRINT SPC(70);:RETURN 6370 FOR I%=1 TO 128:RSET P$(I%)=MKI$(PAR%(I%)):NEXT I% 6375 PUT #1,LRN 6380 PRINT"Patch Dump Completed...Now ";CINT(LOF(1)/129);" total patches in 'TX8.PAT'";:FOR I=1 TO 1000:NEXT I 6385 CLOSE #1:LOCATE 23,1:PRINT SPC(70); 6399 RETURN 6400 REM get new patch 6410 OPEN "R",#1,"tx8.pat",129:FOR I%=1 TO 128:FIELD#1,(I%*1) AS OFFSET$,1 AS P$(I%):NEXT I%:LRN=CINT(LOF(1)/129) 6415 PRINT"enter seed patch for edit ( 1 -";LRN;")";:INPUT CODE 6420 IF(CODE>0 AND CODE<=LRN)THEN GOTO 6422 ELSE LOCATE 23,1:PRINT SPC(50);:LOCATE 23,1:PRINT"VALUE OUT OF RANGE";:FOR I=1 TO 1000:NEXT I:LOCATE 23,1:PRINT SPC(40);:LOCATE 23,1:GOTO 6415 6422 LOCATE 23,1:PRINT SPC(50); 6425 GET#1,CODE:FOR I%=1 TO 128:PAR%(I%)=CVI(P$(I%)+NULL$):PARA%(I%)=PAR%(I%):NEXT I%:CLOSE #1 6430 GOSUB 1700:GOSUB 1750:RETURN 6045 7000 REM set new value 7005 LOCATE PTABL(CRNT,4),PTABL(CRNT,5)-1:COLOR 14,1:PRINT">"; 7006 IF((CRNT>=5 AND CRNT<=8)OR(CRNT>=45 AND CRNT<=52)OR(CRNT>=61 AND CRNT<=64)OR(CRNT=75)OR(CRNT=76)OR(CRNT>=83 AND CRNT<=85))THEN GOTO 7100 7010 LOCATE 23,1:COLOR 15,1:PRINT"enter new parameter value (";PTABL(CRNT,3);"to";PTABL(CRNT,2)+PTABL(CRNT,3);")";:INPUT NVAL 7020 IF (NVAL(PTABL(CRNT,2)+PTABL(CRNT,3)))THEN LOCATE 23,1:PRINT SPC(60);:LOCATE 23,1:PRINT"VALUE OUT OF RANGE";:FOR I=1 TO 1000:NEXT I:LOCATE 23,1:PRINT SPC(60);:GOTO 7010 7030 LOCATE 23,1:PRINT SPC(79); 7040 PAR%(PTABL(CRNT,1))=NVAL-PTABL(CRNT,3):LOCATE PTABL(CRNT,4),PTABL(CRNT,5):COLOR 1,3:PRINT NVAL; 7099 RETURN 7100 REM exclusions for table changes 7110 LOCATE 23,1:COLOR 15,1 7112 IF(CRNT>=5 AND CRNT<=8)THEN GOTO 7140 7114 IF(CRNT>=45 AND CRNT<=48)THEN GOTO 7150 7116 IF(CRNT>=61 AND CRNT<=64)THEN GOTO 7160 7118 IF(CRNT=75)THEN GOTO 7170 7120 IF(CRNT=76)THEN GOTO 7160 7122 IF(CRNT=84)THEN GOTO 7180 7124 IF(CRNT=83)THEN GOTO 7135 7126 IF(CRNT>=49 AND CRNT<=52)THEN GOTO 7190 7130 IF(PAR%(PTABL(CRNT,1))=0)THEN PAR%(PTABL(CRNT,1))=1:R$="full" ELSE PAR%(PTABL(CRNT,1))=0:R$="off " 7132 LOCATE PTABL(CRNT,4),PTABL(CRNT,5):COLOR 1,3:PRINT R$;:RETURN 7135 IF(PAR%(PTABL(CRNT,1))=0)THEN PAR%(PTABL(CRNT,1))=1:R$="UNI" ELSE PAR%(PTABL(CRNT,1))=0:R$="PLY" 7137 LOCATE PTABL(CRNT,4),PTABL(CRNT,5):COLOR 1,3:PRINT R$;:RETURN 7140 IF(PAR%(PTABL(CRNT,1))=0)THEN PAR%(PTABL(CRNT,1))=1:R$="FXD" ELSE PAR%(PTABL(CRNT,1))=0:R$="RTO" 7142 LOCATE PTABL(CRNT,4),PTABL(CRNT,5):COLOR 1,3:PRINT R$;:RETURN 7150 PRINT"enter new parameter value (";PTABL(CRNT,3)+1;"to";PTABL(CRNT,2)+PTABL(CRNT,3);")";:INPUT NVAL 7152 IF (NVAL(PTABL(CRNT,2)+PTABL(CRNT,3)))THEN LOCATE 23,1:PRINT SPC(60);:LOCATE 23,1:PRINT"VALUE OUT OF RANGE";:FOR I=1 TO 1000:NEXT I:LOCATE 23,1:PRINT SPC(60);:LOCATE 23,1:GOTO 7150 7154 GOTO 7030 7160 IF(PAR%(PTABL(CRNT,1))=0)THEN PAR%(PTABL(CRNT,1))=1:R$="on " ELSE PAR%(PTABL(CRNT,1))=0:R$="off" 7162 LOCATE PTABL(CRNT,4),PTABL(CRNT,5):COLOR 1,3:PRINT R$;:RETURN 7170 PRINT"enter new value (0=sin, 1=sqr, 2=tri, 3=s/h)";:INPUT NVAL 7172 IF(NVAL>=0 AND NVAL<=3)THEN GOTO 7174 ELSE LOCATE 23,1:PRINT SPC(60);:LOCATE 23,1:PRINT"VALUE OUT OF RANGE";:LOCATE 23,1:FOR I=1 TO 1000:NEXT I:PRINT SPC(60);:LOCATE 23,1:GOTO 7170 7174 PAR%(PTABL(CRNT,1))=NVAL:LOCATE 23,1:PRINT SPC(60); 7175 IF(NVAL=0)THEN R$="sin" 7176 IF(NVAL=1)THEN R$="sqr" 7177 IF(NVAL=2)THEN R$="tri" 7178 IF(NVAL=3)THEN R$="s/h" 7179 LOCATE PTABL(CRNT,4),PTABL(CRNT,5):COLOR 1,3:PRINT R$;:RETURN 7180 PRINT"enter new value (0-48: 0=C1, 12=C2, 24=C3, 36=C4, 48=C5)";:INPUT NVAL 7182 IF(NVAL>=0 AND NVAL<=48)THEN GOTO 7184 ELSE LOCATE 23,1:PRINT SPC(75);:LOCATE 23,1:PRINT"VALUE OUT OF RANGE";:LOCATE 23,1:FOR I=1 TO 1000:NEXT I:PRINT SPC(40);:LOCATE 23,1:GOTO 7180 7184 PAR%(PTABL(CRNT,1))=NVAL:LOCATE 23,1:PRINT SPC(75);:LOCATE PTABL(CRNT,4),PTABL(CRNT,5):COLOR 1,3 7186 GURN0=(PAR%(PTABL(84,1)))/12:GURN1=INT(GURN0):GURN2=CINT((GURN0-GURN1)*12):PRINT NOTES$(GURN2);GURN1+1;:RETURN 7190 PRINT"enter new value (0=off, 1=48dB, 2=24dB, 3=12dB)";:INPUT NVAL 7192 IF(NVAL>=0 AND NVAL<=3)THEN GOTO 7194 ELSE LOCATE 23,1:PRINT SPC(60);:LOCATE 23,1:PRINT"VALUE OUT OF RANGE";:LOCATE 23,1:FOR I=1 TO 1000:NEXT I:PRINT SPC(60);:LOCATE 23,1:GOTO 7190 7194 PAR%(PTABL(CRNT,1))=NVAL:LOCATE 23,1:PRINT SPC(60); 7195 IF(NVAL=0)THEN R$="off" 7196 IF(NVAL=1)THEN R$="48 " 7197 IF(NVAL=2)THEN R$="24 " 7198 IF(NVAL=3)THEN R$="12 " 7199 LOCATE PTABL(CRNT,4),PTABL(CRNT,5):COLOR 1,3:PRINT R$;:RETURN 7200 REM what to do with down arrow 7210 IF(CRNT>=1 AND CRNT<=68)THEN CRNT=CRNT+4:RETURN 7220 IF(CRNT>=69 AND CRNT<=72)THEN CRNT=73:RETURN 7230 IF(CRNT=73 OR CRNT=74)THEN CRNT=CRNT+1:RETURN 7240 IF(CRNT>=75 AND CRNT<=95)THEN CRNT=CRNT+2:RETURN 7250 IF(CRNT=97)THEN CRNT=1:RETURN 7260 IF(CRNT=96)THEN CRNT=97:RETURN 7300 REM what to do with up arrow 7310 IF(CRNT>=5 AND CRNT<=72)THEN CRNT=CRNT-4:RETURN 7320 IF(CRNT=73)THEN CRNT=69:RETURN 7330 IF(CRNT>=1 AND CRNT<=4)THEN CRNT=97:RETURN 7340 IF(CRNT=74)THEN CRNT=73:RETURN 7350 IF(CRNT=75 OR CRNT=76)THEN CRNT=74:RETURN 7360 IF(CRNT>=77 AND CRNT<=97)THEN CRNT=CRNT-2:RETURN 8000 REM performance editor 8001 PRINT:PRINT:OPEN "R",#1,"TX8.CMB",122:FOR I%=1 TO 121:FIELD#1,(I%*1) AS OFFSET$,1 AS P$(I%):NEXT I%:LRN=CINT(LOF(1)/122) 8002 PRINT"enter seed performance record number for edit ( 1 -";LRN;")";:INPUT CODE 8003 IF(CODE>0 AND CODE<=LRN)THEN GOTO 8004 ELSE PRINT"VALUE OUT OF RANGE":GOTO 8002 8004 GET#1,CODE 8007 FOR I%=1 TO 121:PAR%(I%)=CVI(P$(I%)+NULL$):NEXT I%:CLOSE #1 8008 PRINT"Performance Name:";:FOR I%=111 TO 120:PRINT CHR$(PAR%(I%));:NEXT I%:PRINT 8010 GOSUB 8200 8039 FOR I%=1 TO 121:PARA%(I%)=PAR%(I%):NEXT I% 8040 GOSUB 1800:GOSUB 1850 8045 COLOR 14,1:LOCATE 17,50:PRINT "MENU";:LOCATE 18,40:PRINT"cursor keys: move cursor";:LOCATE 19,40:PRINT"s: start over r: rename";:LOCATE 20,40:PRINT"l: listen w: write to library"; 8047 LOCATE 21,40:PRINT"c: change n: new performance";:LOCATE 22,40:PRINT "q: quit"; 8080 CRNT=1 8090 IF CRNT<1 THEN CRNT=92 8092 IF CRNT>92 THEN CRNT=1 8100 LOCATE CTABL(CRNT,4),CTABL(CRNT,5)-1:COLOR 30,1:PRINT">"; 8110 RESP$=INKEY$:IF LEN(RESP$)=0 THEN 8110 8115 LOCATE CTABL(CRNT,4),CTABL(CRNT,5)-1:PRINT" "; 8120 IF ASC(RIGHT$(RESP$,1))=77 THEN GOSUB 9400:GOTO 8090 8122 IF ASC(RIGHT$(RESP$,1))=75 THEN GOSUB 9500:GOTO 8090 8124 IF ASC(RIGHT$(RESP$,1))=80 THEN GOSUB 9200:GOTO 8090 8126 IF ASC(RIGHT$(RESP$,1))=72 THEN GOSUB 9300:GOTO 8090 8128 IF RESP$="c" THEN GOSUB 9000:GOTO 8090 8130 IF ASC(RIGHT$(RESP$,1))=71 THEN CRNT=1:GOTO 8090 8132 IF ASC(RIGHT$(RESP$,1))=73 THEN CRNT=8:GOTO 8090 8134 IF ASC(RIGHT$(RESP$,1))=79 THEN CRNT=90:GOTO 8090 8136 IF ASC(RIGHT$(RESP$,1))=81 THEN CRNT=88:GOTO 8090 8138 IF RESP$="s" THEN FOR I%=1 TO 121:PAR%(I%)=PARA%(I%):NEXT I%:COLOR 15,1:GOTO 8040 8140 IF RESP$="q" THEN COLOR 15,1:CLS:RETURN 8142 IF RESP$="r" THEN COLOR 15,1:LOCATE 23,1:GOSUB 8200:LOCATE 23,1:PRINT SPC(40);:COLOR 1,3:LOCATE 1,7:FOR I=111 TO 120:PRINT CHR$(PAR%(I));:NEXT I:GOTO 8090 8144 IF RESP$="l" THEN LOCATE 23,1:COLOR 15,1:PRINT"Writing to TX81Z...please wait";:WHERE=4:GOSUB 400:GOSUB 9600:GOSUB 2815:GOSUB 500:LOCATE 23,1:PRINT SPC(30);:GOTO 8090 8146 IF RESP$="w" THEN GOSUB 9600:GOSUB 8300:GOTO 8090 8148 IF RESP$="n" THEN LOCATE 23,1:COLOR 15,1:GOSUB 8400 8199 GOTO 8100 8200 REM name performance 8210 PRINT"enter new performance name";:INPUT FIL$ 8212 FOR I=1 TO 10:JUNK(I)=32:NEXT I 8215 EXTENT=LEN(FIL$) 8216 IF(EXTENT>10)THEN EXTENT=10 8218 TEMP$=FIL$ 8220 FOR I=EXTENT TO 1 STEP -1 8222 JUNK(I)=ASC(RIGHT$(TEMP$,1)) 8224 TEMP$=LEFT$(TEMP$,(I-1)) 8230 NEXT I 8235 FOR I=1 TO 10:PAR%(110+I)=JUNK(I):NEXT I 8249 RETURN 8300 REM write edited performance to library file 8305 OPEN "R",#1,"TX8.CMB",122:FOR I%=1 TO 121:FIELD#1,(I%*1) AS OFFSET$,1 AS P$(I%):NEXT I% 8310 COLOR 15,1:LOCATE 23,1:PRINT"write performance at end or over old record (e/o)?"; 8315 RESP$=INKEY$:IF LEN(RESP$)=0 THEN 8315 8320 IF(RESP$<>"e" AND RESP$<>"o")THEN 8315 8325 LOCATE 23,1:PRINT SPC(40);:LOCATE 23,1 8330 IF(RESP$="e")THEN LRN=CINT(LOF(1)/122)+1:GOTO 8370 8335 LRN=CINT(LOF(1)/122):PRINT"Enter performance number to write over ( 1 -";LRN;")"; 8340 INPUT CODE:IF(CODE>0 AND CODE<=LRN)THEN 8345 ELSE LOCATE 23,1:PRINT SPC(40);:LOCATE 23,1:PRINT"VALUE OUT OF RANGE";:LOCATE 23,1:GOTO 8335 8345 GET #1,CODE:FOR I%=1 TO 121:PARB%(I%)=CVI(P$(I%)+NULL$):NEXT I% 8350 LOCATE 23,1:PRINT SPC(40);:LOCATE 23,1:PRINT"Old Performance:";:FOR I%=111 TO 120:PRINT CHR$(PARB%(I%));:NEXT I%:PRINT"...are you SURE you want to overwrite (y/n)?"; 8355 RESP$=INKEY$:IF LEN(RESP$)=0 THEN 8355 8360 IF(RESP$<>"y" AND RESP$<>"n")THEN 8355 8362 IF RESP$="y" THEN LRN=CODE:LOCATE 23,1:PRINT SPC(70);:LOCATE 23,1:GOTO 8370 8364 LOCATE 23,1:PRINT SPC(70);:RETURN 8370 FOR I%=1 TO 121:RSET P$(I%)=MKI$(PAR%(I%)):NEXT I% 8375 PUT #1,LRN 8380 PRINT"Performance Dump Completed...Now ";CINT(LOF(1)/122);" total performances in 'TX8.CMB'";:FOR I=1 TO 1000:NEXT I 8385 CLOSE #1:LOCATE 23,1:PRINT SPC(70); 8399 RETURN 8400 REM get new performance 8410 OPEN "R",#1,"tx8.cmb",122:FOR I%=1 TO 121:FIELD#1,(I%*1) AS OFFSET$,1 AS P$(I%):NEXT I%:LRN=CINT(LOF(1)/122) 8415 PRINT"enter seed performance for edit ( 1 -";LRN;")";:INPUT CODE 8420 IF(CODE>0 AND CODE<=LRN)THEN GOTO 8422 ELSE LOCATE 23,1:PRINT SPC(50);:LOCATE 23,1:PRINT"VALUE OUT OF RANGE";:FOR I=1 TO 1000:NEXT I:LOCATE 23,1:PRINT SPC(40);:LOCATE 23,1:GOTO 8415 8422 LOCATE 23,1:PRINT SPC(50); 8425 GET#1,CODE:FOR I%=1 TO 121:PAR%(I%)=CVI(P$(I%)+NULL$):PARA%(I%)=PAR%(I%):NEXT I%:CLOSE #1 8430 GOSUB 1800:GOSUB 1850:RETURN 8045 9000 REM set new value 9005 LOCATE CTABL(CRNT,4),CTABL(CRNT,5)-1:COLOR 14,1:PRINT">"; 9006 IF((CRNT>=9 AND CRNT<=40)OR(CRNT>=65 AND CRNT<=88)OR(CRNT=90)OR(CRNT=92))THEN GOTO 9100 9010 LOCATE 23,1:COLOR 15,1:PRINT"enter new parameter value (";CTABL(CRNT,3);"to";CTABL(CRNT,2)+CTABL(CRNT,3);")";:INPUT NVAL 9020 IF (NVAL(CTABL(CRNT,2)+CTABL(CRNT,3)))THEN LOCATE 23,1:PRINT SPC(60);:LOCATE 23,1:PRINT"VALUE OUT OF RANGE";:FOR I=1 TO 1000:NEXT I:LOCATE 23,1:PRINT SPC(60);:GOTO 9010 9030 LOCATE 23,1:PRINT SPC(79); 9040 PAR%(CTABL(CRNT,1))=NVAL-CTABL(CRNT,3):LOCATE CTABL(CRNT,4),CTABL(CRNT,5):COLOR 1,3:PRINT NVAL; 9050 IF(CRNT>8)THEN GOTO 9060 ELSE JUNK=0:FOR I=1 TO 8:JUNK=PAR%(CTABL(I,1))+JUNK:NEXT I 9052 IF(JUNK<=8)THEN GOTO 9060 ELSE LOCATE 23,1:COLOR 1,4:PRINT"BEWARE - MORE THAN 8 NOTES ASSIGNED!!!";:LOCATE CTABL(CRNT,4),CTABL(CRNT,5):COLOR 1,3 9060 IF(CRNT<25 OR CRNT>32)THEN GOTO 9070 ELSE JUNK=PAR%(CTABL(CRNT,1)):JUNK0=PAR%(CTABL(CRNT+8,1)) 9062 IF(JUNK<=JUNK0)THEN GOTO 9070 ELSE LOCATE 23,1:COLOR 1,4:PRINT"BEWARE - LOW LIMIT IS ABOVE HIGH LIMIT!!!";:LOCATE CTABL(CRNT,4),CTABL(CRNT,5):COLOR 1,3 9070 IF(CRNT<33 OR CRNT>40)THEN GOTO 9099 ELSE JUNK0=PAR%(CTABL(CRNT,1)):JUNK=PAR%(CTABL(CRNT-8,1)) 9072 IF(JUNK<=JUNK0)THEN GOTO 9099 ELSE LOCATE 23,1:COLOR 1,4:PRINT"BEWARE - HIGH LIMIT IS BELOW LOW LIMIT LIMIT!!!";:LOCATE CTABL(CRNT,4),CTABL(CRNT,5):COLOR 1,3 9099 RETURN 9100 REM performance exceptions 9105 LOCATE 23,1:COLOR 15,1 9106 PRINT SPC(50);:LOCATE 23,1 9110 IF(CRNT>=9 AND CRNT<=16)THEN GOTO 9120 9111 IF(CRNT=90)THEN GOTO 9170 9112 IF(CRNT>=17 AND CRNT<=24)THEN GOTO 9165 9113 IF(CRNT=92)THEN GOTO 9180 9114 IF(CRNT>=65 AND CRNT<=72)THEN GOTO 9140 9115 IF(CRNT>=25 AND CRNT<=40)THEN GOTO 9190 9116 IF(CRNT>=73 AND CRNT<=80)THEN GOTO 9150 9118 IF(CRNT>=81 AND CRNT<=88)THEN GOTO 9160 9120 PRINT"enter patch bank of voice (a, b, c, d, or i)";:INPUT R$ 9122 LOCATE 23,1:PRINT SPC(50);:IF(R$="a" OR R$="b" OR R$="c" OR R$="d" OR R$="i")THEN GOTO 9124 ELSE LOCATE 23,1:PRINT"VALUE OUT OF RANGE";:LOCATE 23,1:FOR I=1 TO 1000:NEXT I:PRINT SPC(40);:LOCATE 23,1:GOTO 9120 9124 IF R$="i" THEN X=0 9125 IF R$="a" THEN X=32 9126 IF R$="b" THEN X=64 9127 IF R$="c" THEN X=96 9128 IF R$="d" THEN X=128 9130 LOCATE 23,1:PRINT"enter patch number (1-32)";:INPUT NVAL:LOCATE 23,1:PRINT SPC(40); 9131 IF(NVAL>=1 AND NVAL<=32)THEN GOTO 9132 ELSE LOCATE 23,1:PRINT"VALUE OUT OF RANGE";:FOR I=1 TO 1000:NEXT I:LOCATE 23,1:PRINT SPC(40);:GOTO 9130 9132 LOCATE CTABL(CRNT,4),CTABL(CRNT,5):COLOR 1,3:PRINT R$;NVAL;:NVAL=NVAL+X-1 9134 IF(NVAL>=128)THEN PAR%(CTABL(CRNT,1))=1:PAR%(CTABL(CRNT,1)+1)=NVAL-128 ELSE PAR%(CTABL(CRNT,1))=0:PAR%(CTABL(CRNT,1)+1)=NVAL 9139 RETURN 9140 PRINT"enter output assignment (0=off, 1=I, 2=II, 3=I+II)";:INPUT NVAL 9142 LOCATE 23,1:PRINT SPC(50);:IF(NVAL>=0 AND NVAL<=3)THEN GOTO 9144 ELSE PRINT"VALUE OUT OF RANGE";:FOR I=1 TO 1000:NEXT I:LOCATE 23,1:PRINT SPC(40);:LOCATE 23,1:GOTO 9140 9144 PAR%(CTABL(CRNT,1))=NVAL:LOCATE CTABL(CRNT,4),CTABL(CRNT,5):COLOR 1,3 9145 IF NVAL=0 THEN PRINT"off"; 9146 IF NVAL=1 THEN PRINT" I "; 9147 IF NVAL=2 THEN PRINT" II"; 9148 IF NVAL=3 THEN PRINT"bth"; 9149 RETURN 9150 PRINT"enter LFO assignment (0=off, 1=1, 2=2, 3=vib)";:INPUT NVAL 9152 LOCATE 23,1:PRINT SPC(60);:IF(NVAL>=0 AND NVAL<=3)THEN GOTO 9154 ELSE PRINT"VALUE OUT OF RANGE";:FOR I=1 TO 1000:NEXT I:LOCATE 23,1:PRINT SPC(40);:LOCATE 23,1:GOTO 9150 9154 PAR%(CTABL(CRNT,1))=NVAL:LOCATE CTABL(CRNT,4),CTABL(CRNT,5):COLOR 1,3 9155 IF NVAL=0 THEN PRINT"off"; 9156 IF NVAL=1 THEN PRINT" 1 "; 9157 IF NVAL=2 THEN PRINT" 2 "; 9158 IF NVAL=3 THEN PRINT"vib"; 9159 RETURN 9160 IF(PAR%(CTABL(CRNT,1))=0)THEN R$="on ":PAR%(CTABL(CRNT,1))=1 ELSE R$="off":PAR%(CTABL(CRNT,1))=0 9162 LOCATE CTABL(CRNT,4),CTABL(CRNT,5):COLOR 1,3:PRINT R$;:RETURN 9165 PRINT"enter MIDI channel (1-16, 17=omni)";:INPUT NVAL 9166 IF(NVAL>=1 AND NVAL<=17)THEN GOTO 9167 ELSE LOCATE 23,1:PRINT SPC(40);:LOCATE 23,1:PRINT"VALUE OUT OF RANGE";:LOCATE 23,1:FOR I=1 TO 1000:NEXT I:PRINT SPC(40);:LOCATE 23,1:GOTO 9165 9167 LOCATE 23,1:PRINT SPC(40);:COLOR 1,3:LOCATE CTABL(CRNT,4),CTABL(CRNT,5):IF(NVAL<17)THEN PRINT NVAL;:RETURN ELSE PRINT"omn";:RETURN 9170 IF(PAR%(CTABL(CRNT,1))=0)THEN R$="alt":PAR%(CTABL(CRNT,1))=1 ELSE R$="nrm":PAR%(CTABL(CRNT,1))=0 9172 LOCATE CTABL(CRNT,4),CTABL(CRNT,5):COLOR 1,3:PRINT R$;:RETURN 9180 PRINT"enter new key (0-11: 0=c, 1=c#...11=b)";:INPUT NVAL 9182 LOCATE 23,1:PRINT SPC(60);:IF(NVAL>=0 AND NVAL<=11)THEN GOTO 9184 ELSE PRINT"VALUE OUT OF RANGE";:FOR I=1 TO 1000:NEXT I:LOCATE 23,1:PRINT SPC(40);:LOCATE 23,1:GOTO 9180 9184 PAR%(CTABL(CRNT,1))=NVAL:LOCATE CTABL(CRNT,4),CTABL(CRNT,5):COLOR 1,3 9186 PRINT NOTES$(NVAL);:RETURN 9189 RETURN:REM micro-key change 9190 LOCATE 23,1:COLOR 15,1:PRINT"enter note value (1=c, 2=c#...12=b)";:INPUT NVAL 9191 IF (NVAL<1 OR NVAL>12)THEN LOCATE 23,1:PRINT SPC(60);:LOCATE 23,1:PRINT"VALUE OUT OF RANGE";:FOR I=1 TO 1000:NEXT I:LOCATE 23,1:PRINT SPC(60);:GOTO 9190 9192 LOCATE 23,1:PRINT SPC(60);:LOCATE 23,1:PRINT"enter octave value (-2 to 8)";:INPUT NVAL2 9193 IF (NVAL2<-2 OR NVAL2>8)THEN LOCATE 23,1:PRINT SPC(60);:LOCATE 23,1:PRINT"VALUE OUT OF RANGE";:FOR I=1 TO 1000:NEXT I:LOCATE 23,1:PRINT SPC(60);:GOTO 9192 9194 LOCATE 23,1:PRINT SPC(60);:TEMP=NVAL+((NVAL2+2)*12):IF(TEMP<1)THEN TEMP=1:NVAL=1 9195 IF(TEMP>128)THEN TEMP=128:NVAL=8:NVAL2=8 9196 PAR%(CTABL(CRNT,1))=TEMP:LOCATE CTABL(CRNT,4),CTABL(CRNT,5):COLOR 1,3:PRINT NOTES$(NVAL-1);NVAL2;:GOTO 9060 9200 REM what to do with down arrow 9210 IF(CRNT>=1 AND CRNT<=80)THEN CRNT=CRNT+8:RETURN 9220 IF(CRNT>=81 AND CRNT<=88)THEN CRNT=89:RETURN 9230 IF(CRNT=89)THEN CRNT=90:RETURN 9240 IF(CRNT=90 OR CRNT=91)THEN CRNT=1:RETURN 9250 IF(CRNT=92)THEN CRNT=91:RETURN 9300 REM what to do with up arrow 9310 IF(CRNT>=9 AND CRNT<=88)THEN CRNT=CRNT-8:RETURN 9320 IF(CRNT>=1 AND CRNT<=8)THEN CRNT=90:RETURN 9330 IF(CRNT=89)THEN CRNT=81:RETURN 9340 IF(CRNT=90)THEN CRNT=89:RETURN 9350 IF(CRNT=91)THEN CRNT=92:RETURN 9360 IF(CRNT=92)THEN CRNT=81:RETURN 9400 REM what to do with right arrow 9410 IF(CRNT>=1 AND CRNT<=88)THEN CRNT=CRNT+1:RETURN 9420 IF(CRNT=89)THEN CRNT=92:RETURN 9430 IF(CRNT=90)THEN CRNT=91:RETURN 9440 IF(CRNT=91)THEN CRNT=1:RETURN 9450 IF(CRNT=92)THEN CRNT=90:RETURN 9500 REM what to do with left arrow 9510 IF(CRNT>=2 AND CRNT<=89)THEN CRNT=CRNT-1:RETURN 9520 IF(CRNT=1)THEN CRNT=91:RETURN 9530 IF(CRNT=90)THEN CRNT=92:RETURN 9540 IF(CRNT=91)THEN CRNT=90:RETURN 9550 IF(CRNT=92)THEN CRNT=89:RETURN 9600 REM calculate two's-compliment checksum for altered performance records 9610 CHSUM=0:FOR I=1 TO 120:CHSUM=CHSUM+PAR%(I):NEXT I 9620 CHSUM=128*((CHSUM/128)-(INT(CHSUM/128))):CHSUM=128-CHSUM:PAR%(121)=CHSUM 9699 RETURN