INCLUDE "D1:SYSLIB.ACT"› INCLUDE "D1:SYSIO.ACT"› INCLUDE "D1:SYSMISC.ACT"› INCLUDE "D1:SYSBLK.ACT"› INCLUDE "D1:SYSSTR.ACT"›; AMS II TO MMS File Converter›; (supports AMS dynamics)›; ACTION! version by Bruce Smith›;› MODULE› BYTE POKMSK=$10,› IRQEN=$D20E,› OPOKMSK,› ERRORFLAG› BYTE ARRAY Xd(16),› FILENMd(16),› Sd(12),› Td(16), › MEASd(1876),› XNOTE1d(7501)=18000,› XVEL1d(7501)=25501,› XNOTE2d(15001)=33002,› DYN › INT A,B,C,I,II,J,K,L,M,N,V,X,› Z=[15000],NUM,NUMVCS,NUMM,› DURERROR,TEMPO,OLDVEL,BYTES› CARD ARRAY ADDR(9)› INT ARRAY MEASV(5),› XNOTEV(5),› XXNOTEV(5),› NUMVEL(5),› MIDIVEL(9)=[› 0 43 52 62 72 82 92 102 111],› AMSTEMPO=[9999› 9999 9999 9999 9999 9999 9999 9999 9999› 9999 6750 6125 5604 5163 4785 4458 4171› 3918 3694 3493 3312 3148 2999 2863 2738› 2624 2518 2420 2329 2244 2165 2091 2022› 1957 1896 1838 1783 1732 1683 1636 1592› 1550 1510 1472 1436 1401 1368 1336 1306› 1276 1248 1221 1195 1170 1146 1123 1101› 1079 1059 1038 1019 1000 982 964 947› 931 915 899 884 870 855 841 828› 815 802 790 778 766 755 743 732› 722 712 701 692 682 673 663 654› 646 637 629 620 612 604 597 589› 582 575 567 561 554 547 541 534› 528 522 516 510 504 498 492 487› 481 476 471 466 461 456 451 446› 441 437 432 427 423 419 414 410› 406 402 398 394 390 386 382 378› 375 371 368 364 361 357 354 350› 347 344 341 337 334 331 328 325› 322 319 317 314 311 308 305 303› 300 297 295 292 290 287 285 282› 280 277 275 273 270 268 266 264› 261 259 257 255 253 251 249 247› 245 243 241 239 237 235 233 231› 229 227 225 224 222 220 218 217› 215 213 212 210 208 207 205 203› 202 200 199 197 196 194 193 191› 190 188 187 185 184 183 181 180› 178 177 176 174 173 172 171 169› 168 167 165 164 163 162 161 159› 158 157 156 155 154 152 151 150› 149 148 147 146 145 144 143 141› 140 139 138 137 136 135 134 133› 132 131 130 129 128 128 127 126› 125 124 123 122 121 120 119 118› 118 117 116 115 114 113 112 112› 111 110]› CARD HOLDERROR›;›; CIO PROCEDURE›;› PROC CIO=$E456(BYTE areg,xreg)››;›; REPLACEMENT ERROR ROUTINE›;› PROC ERRORHANDLER(BYTE ERRCODE)› ERRORFLAG=ERRCODE› RETURN›;›; REPLACE SYSTEM ERROR ROUTINE›;› PROC SETERROR()› HOLDERROR=ERROR› ERROR=ERRORHANDLER› RETURN›;›; REINSTALL SYSTEM ERROR ROUTINE›;› PROC FREEERROR()› ERROR=HOLDERROR› RETURN›;›; PROMPT FOR DISK INSERTION›;› PROC DISKSWAP(BYTE D)› PRINTF("%EInsert %S disk in drive # %I,%Epress any key%E",Sd,D)› A=GETD(4)› RETURN›;›; PROMPT FOR A FILE NAME›; › PROC GETFILENAME()› SCOPY(Xd,"D1:")› INPUTS(FILENMd)› A=0› IF FILENMd(0)>2 THEN› DO› IF FILENMd(2)=': THEN› A=2› EXIT› FI› IF FILENMd(3)=': THEN› A=3› EXIT› FI› EXIT› OD› FI› IF A>0 THEN› IF FILENMd(A-1)>'1 AND› FILENMd(A-1)<'9 THEN› Xd(2)=FILENMd(A-1)› FI› FI› I=4 › FOR J=A+1 TO FILENMd(0) › DO› Xd(I)=FILENMd(J)› I==+1› OD› Xd(0)=I-1› RETURN›;›; WRITE A NEW MEASURE MARKER›;› PROC NEWMEASURE()› PUTD(2,250)› PUTD(2,0)› PUTD(2,0)› BYTES==+3› RETURN›;›; WRITE A WORD IN LSB/MSB FORMAT›;› PROC PUTWORD(CARD D)› CARD DD› DD=D/256› PUTD(2,D)› PUTD(2,DD)› BYTES==+2› RETURN›;›; READ IN THE AMS II FILE›;› PROC READAMS2FILE()› INT A,B› BYTE IOCB1CMD=$352› CARD IOCB1BUF=$354› CARD IOCB1LEN=$358› NUMVCS=4› NUMM=0› FOR I=1 TO NUMVCS› DO› A=INPUTID(1)› B=INPUTID(1)› MEASV(I)=A› XNOTEV(I)=B› XXNOTEV(I)=B› NUMM==+A› OD › TEMPO=INPUTID(1)› A=INPUTID(1)› IF NUMM>Z/8 OR XNOTEV(NUMVCS)>Z THEN› PRINTE("ýNOT ENOUGH RAM")› PRINTF("%I %I%E%E",NUMM,XNOTEV(NUMVCS)) › BREAK()› FI›; › IOCB1CMD=7 › IOCB1BUF=MEASd+1› IOCB1LEN=NUMM › CIO(0,$10)›;› IOCB1CMD=7 › IOCB1BUF=XNOTE2d+1› IOCB1LEN=XNOTEV(NUMVCS)› CIO(0,$10)›;› II=1› FOR I=1 TO XNOTEV(NUMVCS)/2› DO› XNOTE1d(I)=XNOTE2d(II)› II==+1› XVEL1d(I)=XNOTE2d(II)&15› II==+1› OD›;› IOCB1CMD=7 › IOCB1BUF=XNOTE2d+1› IOCB1LEN=XNOTEV(NUMVCS)› CIO(0,$10)› CLOSE(1)› RETURN›;›; PROMPT FOR MMS FILE NAME›;› PROC NEWFILENAME()› SETERROR()› DO› PRINTE("")› PRINT("Type new file name: ")› GETFILENAME()› FOR A=1 TO Xd(0)› DO› IF Xd(A)=46 THEN EXIT FI ; "."› OD› SASSIGN(Xd,".MUS",A,A+3)› SCOPY(Sd,"destination")› DISKSWAP(Xd(2)-48)› PRINTF("%EWriting %S ...%E%E",Xd)› CLOSE(2)› ERRORFLAG=0› OPEN(2,Xd,8,0)› IF ERRORFLAG>0› THEN› PRINTF("ERROR %I OPENING OUTPUT FILE%E%E",ERRORFLAG)› ELSE› EXIT› FI› OD› FREEERROR()› RETURN›;›; WRITE OUT STANDARD HEADER DATA›;› PROC PUTHEADERDATA()› PUTD(2,1)› PUTD(2,0)› PUTD(2,0)› BYTES=3› PUTWORD(TEMPO)› PUTD(2,0)› PUTD(2,4)› FOR I=1 TO 7› DO› PUTD(2,0)› OD› PUTD(2,6)› PUTD(2,'0)› PUTD(2,'#)› BYTES==+12› RETURN›;›; ROUTINE TO COUNT NUMBER OF VELOCITY›; CHANGES PER VOICE›;› PROC VELOCITY() › I=1› II=1› FOR K=1 TO NUMVCS› DO› N=0› OLDVEL=9999› IF K<>1 THEN › NUM=XNOTEV(K)-XNOTEV(K-1)› ELSE› NUM=XNOTEV(K)› FI› FOR J=1 TO NUM/2› DO› V=XVEL1d(I)› B=XNOTE1d(I)› A=XNOTE2d(II)+› 256*XNOTE2d(II+1)› IF V>8 THEN› V=8› XVEL1d(I)=8› FI› IF V<>OLDVEL AND V>0 AND B<>128 AND A>0 THEN› N==+1› OLDVEL=V› ELSE › XVEL1d(I)=0› FI› I==+1› II==+2› OD› NUMVEL(K)=N› OD› RETURN›;›; WRITE OUT # BYTES VOICE›;›; (3 * # MEASURES + 3 * # NOTES +›; 3 * # VELOCITY CHANGES)›; SUM IS CUMULATIVE ACROSS ALL VOICES›;› PROC PUTMEASUREDATA()› N=0› FOR I=1 TO NUMVCS› DO› IF MEASV(I)=0 THEN M=1 ELSE M=0 FI› N==+3*(MEASV(I)+M+NUMVEL(I))› A=XNOTEV(I)/2*3+N› PUTWORD(A)› OD› FOR I=NUMVCS+1 TO 99› DO› A==+3› PUTWORD(A)› OD› RETURN›;›; WRITE OUT THE ACTUAL NOTE DATA›;› PROC PUTNOTEDATA()› MEASV(0)=0› I=1› II=1› J=0› K=J› NUM=J› DURERROR=J› DO› DO› K==+1› IF K>NUMVCS THEN EXIT FI› IF MEASV(K)=0 THEN› NEWMEASURE()› EXIT› FI› NUM==+MEASV(K)› OLDVEL=9999› DO› IF J+1>NUM THEN EXIT FI› NEWMEASURE()› J==+1› FOR N=1 TO MEASd(J)› DO› DO› V=XVEL1d(I)› B=XNOTE1d(I)› A=XNOTE2d(II)+› 256*XNOTE2d(II+1) › IF V<>OLDVEL AND V>0 THEN› OLDVEL=V› PUTD(2,247)› BYTES==+1› V=MIDIVEL(V)› PUTWORD(V)› FI› I==+1› II==+2› IF A>0 THEN EXIT FI› OD› IF B=67 THEN B=0 FI› IF B<>128 THEN› C=A› A=A/5› IF 5*A<>C THEN› DURERROR==+1› PRINTF("DURATION ERROR: VOICE %I, MEASURE %I%E",K,J-(NUM-MEASV(K)))› FI› FI› IF B=128 THEN › FOR TEMPO=10 TO 290› DO› IF A>=AMSTEMPO(TEMPO) THEN› EXIT› FI› OD› IF TEMPO>290 THEN TEMPO=290 FI› A=TEMPO› B=240› FI› PUTD(2,B)› BYTES==+1› PUTWORD(A)› OD› OD› OD› IF K>NUMVCS THEN EXIT FI› OD› FOR I=NUMVCS+1 TO 99› DO› NEWMEASURE()› OD› CLOSE(2)› PRINTF("%E# duration translation errors: %I%E%E",DURERROR)› PRINTF("# bytes in file=%I%E",BYTES)› RETURN›;›; PROGRAM INITIALIZATION›;› PROC INIT()› PRINTE("")› PRINTE("Select function:")› PRINTE("1) AMS II -> MMS")› PRINTE("2) Quit")› RETURN›; ›; THIS ROUTINE ORGANIZES THE CALLS›; NEEDED TO CONVERT AMS II TO MMS›;› PROC AMS2TOMMS()› READAMS2FILE()› VELOCITY()› NEWFILENAME()› PUTHEADERDATA()› PUTMEASUREDATA()› PUTNOTEDATA()› RETURN›;›; THE MAINLINE PROGRAM›; › PROC MAIN()› OPOKMSK=POKMSK› POKMSK=64› IRQEN=64 › PRINTE("}AMS II TO MMS FILE CONVERTER")› DO› INIT()› CLOSE(4)› OPEN(4,"K:",4,0)› X=0› WHILE X=0› DO› X=GETD(4)› X==-48› IF X<0 OR X>2 THEN X=0 FI› OD› PRINTE("")› IF X=2 THEN EXIT FI› PRINTE("ENTER APPROPRIATE VELOCITIES")› ADDR(1)="PPP"› ADDR(2)=" PP"› ADDR(3)=" P"› ADDR(4)=" MP"› ADDR(5)=" MF"› ADDR(6)=" F"› ADDR(7)=" FF"› ADDR(8)="FFF"› FOR I=1 TO 8› DO› DYN=ADDR(I)› PRINTF("%S (DEFAULT=%I): ",DYN,MIDIVEL(I))› X=INPUTI()› IF X>0 THEN MIDIVEL(I)=X FI› OD› SETERROR()› DO› PRINTE("")› PRINT("Type old file name: ") › GETFILENAME()› SCOPY(Sd,"source")› DISKSWAP(Xd(2)-48)› PRINTF("%EReading %S ...%E%E",Xd)› CLOSE(1)› ERRORFLAG=0› OPEN(1,Xd,4,0)› IF ERRORFLAG>0› THEN› PRINTF("ERROR %I OPENING FILE%E%E",ERRORFLAG)› ELSE› EXIT› FI› OD› FREEERROR()› AMS2TOMMS()› OD› PRINTE("")› PRINTE("Done!")› CLOSE(4)› POKMSK=OPOKMSK› IRQEN=OPOKMSK› RETURN›››