IMD 1.17: 24/11/2010 19:47:39 18 workmus  @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ WORKMUS;*Z MUS.B.TEXT"z@MUS.TEXT4y@d MUS.A.TEXT"zO^eB? ST REPLY.'); )WRITELN('YOU MAY ENTER EITHER AN INTERVAL NAME OR SOME OTHER'); )WRITELN('COMMAND. FOR A LIST OF INTERVAL NAMESANSWER='N ') OR (ANSWER='NEXT') THEN /BEGIN 1NEXT:=TRUE; 1DRAW:=FALSE; /END; ,'O': IF (ANSWER='O ') OR (ANSWER='ORDE') , TYPE INFO .'); )QCOUNTER:=QCOUNTER+3; (IF QCOUNTER>19 THEN QCOUNTER:=QCOUNTER+4; 'END; #END; #BEGIN (* QUESTION LOOKS THEN /BEGIN 1UPDOWN:=NOT UPDOWN; 1HARMONIC:=FALSE; 1CHANGEMODE; 1PLAY; /END -ELSE NOPE; ,'A':IF (ANSWER='A ') OR (ANSWFOR COMMANDS OR ANSWERS TO QUESTIONS *) %IF NOT JUSTLOOKING THEN QCOUNTER:=QCOUNTER+1; %IF QCOUNTER>26 THEN 'BEGIN )CLEAR; ER='AGAI') THEN /BEGIN 1PLAY; /END -ELSE NOPE; ,'B':IF (ANSWER='B ') OR (ANSWER='BYE ') THEN /BEGIN 1BYE:=TRUE; 1GRAPH)SETUP; )STAFF(STAFFN); )RETURN; 'END; %IF QCOUNTER=15 THEN 'BEGIN )SETUP; )RETURN; )QCOUNTER:=QCOUNTER+1; 'END; %IF NOT JUSTLOOKING THEN INPUTLN; %IF NOT (((ANSWER[4] IN ['2'..'8','T']) AND (ANSWER[1] IN ['M','P','T'])) %OR ((ANSWER[2] IN ['2'..'8']) AND (ANSWER[1] IN ['P','M','N'])) %OR ((ANSWER[1]='T') AND (ANSWER[2]=' '))) 'THEN BEGIN (* LIST OF COMMANDS  *) )IF ANSWER[1] IN ['A'..'Z'] THEN +CASE ANSWER[1] OF ,'I':IF (ANSWER='I ') OR (ANSWER='INFO') THEN /BEGIN 1WRITELN('FOR GENERAL PROGRAM INFORMATION, TYPE GENERAL .'); 1WRITELN('FOR A LIST OF COMMANDS, TYPE COMMAND .'); 1INPUTLN; 1QCOUNTER:=QCOUNTER+3; 1IF ANSWER[1]='C' THEN HELP:=FALSE 1ELSE HELP:=TRUE; 1INFO(HELP); 1CLEAR; 1SETUP; 1STAFF(STAFFN); 1RETURN; 1)DAY[10],RUNS:8,FANS:12,FTRY:12); )IF FANS>0 THEN WRITE(' ',(WCOUNTER+FANS)/FANS:5:3); )WRITELN; )UNTIL FIDNUM=1; 'EPLAY; /END -ELSE NOPE; ,'U':IF (ANSWER='U ') OR (ANSWER='UNIT') THEN /BEGIN 1UNIT; 1CLEAR; 1SETUP; 1STAFF(STAFFN); 1RND #END; PROCEDURE QUESTION; VAR EXERCISE,KK : INTEGER; SELECT,LOOPER:INTEGER; PROCEDURE NOPE; #BEGIN %IF NOT JUSTLOOKINGETURN; /END -ELSE NOPE; ,'E':IF (ANSWER='E ') OR (ANSWER='EXER') THEN /BEGIN 1WRITELN('HOW MANY EXERCISES WOULD YOU LIKE  THEN 'BEGIN )WRITELN('SORRY, THAT"S NOT A COMMAND. IF'); )WRITELN('YOU WANT MORE HELP, TYPE INFO.'); )WRITELN('OTHERWISE, TO ADVANCE\'); 1EXERCISE:=NUMBERIN; 1WHILE EXERCISE>1 DO 3BEGIN 5ADVANEXER; 5EXERCISE:=EXERCISE-1; 3END; 1NEXT:=TRUE; TRY ANOTHER INTERVAL NAME.'); )QCOUNTER:=QCOUNTER+3; 'END %ELSE 'BEGIN )WRITELN('I"M AFRAID THAT I DON"T UNDERSTAND YOUR LA1DRAW:=FALSE; 1INTDECODE(INTERVAL1,INTERVAL2); 1EXCOUNTER:=EXCOUNTER+1; 1QCOUNTER:=QCOUNTER+2; /END -ELSE NOPE; ,'N':IF ( EGIN 9LOOPER:=LOOPER+1; 9TIME(TIM); 9PUTBYTE(0007B); 9write (chr (19) ); 9write (chr (29) ); 9X:=ROUND(RANDOM*1000); 9Y:=5((ANSWER[1] IN ['P','M','N']) AND (ANSWER[2] IN ['2'..'8'])) 7THEN BEGIN 9INTTEMP:=INTNAME; 9INTDECODE(ANSWER[1],ANSWER[2])ROUND(RANDOM*700); 9MOVE(X,Y+4,UP); 9MOVE(X+4,Y,DOWN); 9MOVE(X-4,Y,DOWN); 9MOVE(X,Y+4,DOWN); 9WRITELN(' '); 9GINPUT; 9ANSWER:=INTNAME; 9INTNAME:=INTTEMP; 7END; 5LOOPER:=0; 5IF ORD(ANSWER[1])<>Q THEN 7BEGIN 9WHILE (ANSWER<>INTNAME) AND ((TRUE,XIN,YIN,CHARACTER); 9TIME(TIM2); 9IF ((ORD(TIM[6])-ZERO)*60+(ORD(TIM[8])-ZERO)*10+ORD(TIM[9])-ZERO+GSPEED> 9(ORD(TIM2[6LOOPER<500) DO )BEGIN 9ADVANEXER; 9INTDECODE(INTERVAL1,INTERVAL2); 9LOOPER:=LOOPER+1; 9END; 9IF LOOPER>500 THEN ;BEGIN =])-ZERO)*60+(ORD(TIM2[8])-ZERO)*10+ORD(TIM2[9])-ZERO) 9AND (SQR(XIN-X)+SQR(YIN-Y)<=100+SQR(GSPEED)) 9THEN ;BEGIN =COUNTER:=CJUSTLOOKING:=TRUE; =QUESTION; =JUSTLOOKING:=FALSE; ;END 9ELSE ;BEGIN =PLAY; =IF ((NOTEVAL>NOTEVAL2) AND (NOT UPDOWN)) OR OUNTER+1; =CLEAR; ;END; 7END; 5CLEAR; 5WRITELN('HITS: ',COUNTER,' RANK:',SQR(LOOPER/COUNTER)+(GSPEED/2)); =((NOTEVALQ DO 7BIT PLAYING EXAMPLES.'); 1WHILE ORD(ANSWER[1])<>Q DO 3BEGIN 5INPUTLN; 5IF ((ANSWER[1]='T') AND (ANSWER[2]=' ')) OR   '); 1WRITE(NOTELETTR,ACCIDENT,OCTIVE:1, 0' ',NOTELETTR2,ACCIDENT2,OCTIVE2:1); 1INTDECODE(INTERVAL1,INTERVAL2); 1WRITEL((TOTALEX>60) AND (UNITN>0)) THEN 'BEGIN )RESETUNIT:=FALSE; )TOTALEX:=0; )IF UNITN>0 THEN N(' ',INTNAME); 1QCOUNTER:=QCOUNTER+1; 1NEXT:=TRUE; /END -ELSE NOPE; ,'X':IF (IDNUM=0) AND ((ANSWER='XREP') OR (ANSWER='X+BEGIN (* REPOSITION MUSDATA TO CORRECT UNIT *) -RESET(MUSDATA); -FOR COUNTER:=12 TO 12*UNITN DO -READLN(MUSDATA); -ADVANEXCLE')) THEN RECORDS -ELSE NOPE; ,'J','K','Q','V','Y','Z':NOPE; +END )ELSE NOPE; 'END %ELSE 'BEGIN (* SEE IF RIGHT INTERER; +END 'END; %ANS:=FALSE; %EXCOUNTER:=EXCOUNTER+1; %IF FORMAL THEN ADVANEXER %ELSE %FOR JJ:=1 TO TRUNC(RANDOM*3 + 2.0) VAL NAME WAS GIVEN *) )IF (ANSWER[2] IN ['1'..'8',' ']) AND (ANSWER[1] IN ['P','M','N','T']) +THEN BEGIN -INTTEMP:=INTNAME; DO ADVANEXER; %INTDECODE(INTERVAL1,INTERVAL2); %PLAY; %WHILE (ANS=FALSE) AND (NEXT=FALSE) %DO QUESTION; %IF ANS THEN ANSCO-INTDECODE(ANSWER[1],ANSWER[2]); -ANSWER:=INTNAME; -INTNAME:=INTTEMP; +END; )IF ANSWER=INTNAME THEN +BEGIN -RIGHT; -ANS:=UNTER:=ANSCOUNTER+1; %SPACER:=SPACER+35; %NEXT:=FALSE; %DRAW:=TRUE; #END; PROCEDURE UPDATE; VAR JJ,FIDNUM,FANS,FTRY,FWCOUNTRUE; -IF DRAW THEN /BEGIN 1IF ((NOTEVAL>NOTEVAL2) AND (NOT UPDOWN)) OR 3((NOTEVALFIDNUM) AND (NOT EOF(MUSREC)) DO 'BEGIN )READLN(MUSREC,FIDNUM,DAY[1],DAY[2],DAY[3], )DAY[4],DAY[5],DAY[6],DAY[OCTIVE2; 5NOTELETTR2:=DUMMY[1]; 5ACCIDENT2:=DUMMY[2]; 5OCTIVE2:=ORD(DUMMY[3]); 3END; 1SETUP; 1ANSWER[1]:=NOTELETTR; 1ANSW7],DAY[8],DAY[9], )DAY[10],RUNS,DUMMY[1],FANS,DUMMY[2],FTRY,DUMMY[3],FWCOUNTER); )IF IDNUM<>FIDNUM THEN )WRITELN(NEWREC,FIDNUER[2]:=ACCIDENT; 1ANSWER[3]:=CHR(OCTIVE+ZERO); 1GRAPHICS; 1IF (DRAW=TRUE) AND (QCOUNTER>0) THEN 4BEGIN 1ANSWER[1]:=NOTELETTM:1,DAY[1],DAY[2],DAY[3], )DAY[4],DAY[5],DAY[6],DAY[7],DAY[8],DAY[9],  ?END; =ANSWER[1]:=NOTELETTR; =ANSWER[2]:=ACCIDENT; =ANSWER[3]:=CHR(OCTIVE+ZERO); =QCOUNTER:=QCOUNTER+1; =SETUP; =GRAPHICR2; 1ANSWER[2]:=ACCIDENT2; 1ANSWER[3]:=CHR(OCTIVE2+ZERO); 1GRAPHICS; -END; 1RETURN; /END; +END )ELSE +BEGIN -IF ANSWERS; =ANSWER[1]:=NOTELETTR2; =ANSWER[2]:=ACCIDENT2; =ANSWER[3]:=CHR(OCTIVE2+ZERO); =GRAPHICS; =RETURN; ;END; 7END; 3END; ='TRIT' THEN ANSWER:='T '; -IF ANSWER[1]='T' THEN ANSWER:='T '; -write (chr (11) ); -WRITE(' '); -IF INTVALUE(A1IF (TOTALEX>60) AND (UNITN>0) THEN 3BEGIN 5RESET(MUSDATA); 5FOR COUNTER:=12 TO 12*UNITN DO 5READLN(MUSDATA); 5ADVANEXER; NSWER[1],ANSWER[4]) < INTVALUE(INTERVAL1,INTERVAL2) -THEN WRITELN('>') -ELSE WRITELN('<'); +END; )WCOUNTER:=WCOUNTER+1; 'EN5TOTALEX:=0; 3END; /END -ELSE NOPE; ,'S':IF (ANSWER='S ') OR (ANSWER='SHOW') THEN /BEGIN 1write (chr (11) ); 1WRITE(' D #END; PROCEDURE SELECT; VAR JJ : INTEGER; #BEGIN (* SELECT PROPER INTERVALS FOR SPECIFIED UNIT *) %IF (RESETUNIT) OR  ILLEGAL STUDENT NUMBER...NO DATA RECORDED.') 'ELSE 'BEGIN )DATE(DAY); )WRITELN(NEWREC,IDNUM:1,DAY[1],DAY[2],DAY[3], )DAY[4],DAY[5],DAY[6],DAY[7],DAY[8],DAY[9], )DAY[10],RUNS+1:1,'/',FANS+ANSCOUNTER:1, ('/',FTRY+EXCOUNTER-1:1,'/',WCOUNTER:1); )WHILE JJ>0 DO +BEGIN -READLN(MUSREC,FIDNUM,DAY[1],DAY[2],DAY[3], -DAY[4],DAY[5],DAY[6],DAY[7],DAY[8],DAY[9], -DAY[10],RUNS,DUMMY[O^1],FANS,DUMMY[2],FTRY,DUMMY[3],FWCOUNTER); -WRITELN(NEWREC,FIDNUM:1,DAY[1],DAY[2],DAY[3], -DAY[4],DAY[5],DAY[6],DAY[7],DAY[8],CDAY[9], -DAY[10],RUNS:1,DUMMY[1],FANS:1,DUMMY[2],FTRY:1,DUMMY[3],FWCOUNTER:1); -JJ:=JJ-1; +END; 'END; #END; #BEGIN (* NOW WE BEGIN THE ACTUAL MUSIC PROGRAM *) %INITIALIZE; %WHILE NOT BYE DO 'BEGIN )WRITELN('DO YOU WANT INFORMATION\'); )INPUTLN; )IF ANSWER[1]='Y' THEN +BEGIN -INFO(TRUE); -INFO(FALSE); +END; )WRITELN('WHAT IS YOUR STUDENT ID NUMBER\'); )IDNUM:=NUMBERIN; )IF IDNUM=0 THEN +BEGIN -UNITN:=1; -NEXT:=FALSE; -LENGTH:=4; -FIRST:=FALSE; -DRAW:=TRUE; +END )ELSE +BEGIN -UNIT; -CLEAR; -SETUP; -STAFF(STAFFN); -RETURN; -FIRST:=FALSE; +END; )WHILE NOT BYE DO SELECT; )WRITELN('WELL,GOODBYE FOR NOW.'); )IF (NORM) AND (IDNUM>0) THEN )UPDATE; 'END #END. %(************************************************* >* * >* M U S I C * >* * >* INTERACTIVE HARMONIC )DAY[10],RUNS:1,DUMMY[1],FANS:1,DUMMY[2],FTRY:1,DUMMY[3],FWCOUNTER:1) (ELSE NOWRITE:=FALSE; 'END; 'IF NOWRITE THEN WRITELN('  ANSWER GIVEN IS CORRECT, THE NOTES ARE * >* DRAWN ON THE STAFF AND THE NEXT INTERVAL * >* IS PLAYED. ER);EXTERN; !PROCEDURE PUTBYTE(BYTE : INTEGER); #BEGIN (* PUTBYTE TAKES 4 DIGITS OF OCTAL AND SENDS THE *) $(* TERMAINAL TWO  * >* FOR A COMPLETE LISTING OF ALL * >* COMMANDS AND OPTIONS, ENTER INFO CHARACTERS WHICH CORRESPOND TO THE TOP *) $(* AND BOTTOM TWO DIGITS OF THE FOUR DIGIT NUMBER *) %OUTPUT' := CHR((BYTE DI * >* INTERVAL DRILL * >* * >*  * >* INSTEAD OF AN INTERVAL NAME WHEN YOU * >* ARE RUNNING THE PROGRAM. *  V1.0 * >* MARVIN MOSER, JULY 1977. * >* >* * >**************************************************) !PROGRAM MUSIC(INPUT * >* * >* MANY THANKS TO JOHN STRAIT OF UCC * >* /+,OUTPUT,MUSDATA,MUSREC,NEWREC); !CONST &HIGH:= 4040B; &LOWX:= 4100B; &LOWY:= 4140B; !TYPE PEN:= (UP,DOWN); &STRING:= PAC FOR THE PROCEDURES PUTBYTE AND MOVE * >* AND TO WILLIAM H. LYNCH AND FRED T. * >* HOFSTETTER OF THE UKED ARRAY[1..4] OF CHAR; &ALPHA:= PACKED ARRAY[1..10] OF CHAR; !VAR LASTHY,LASTLY,LASTHX : INTEGER; &INTERVAL1,INTERVAL2,CHAR. OF DELAWARE FOR * >* THE MUSDATA DATAFILE AND MANY OF THE * >* CONSTANTS USED FOR GRAPHICS. ACTER : CHAR; &WCOUNTER,NOTEVAL,NOTEVAL2:INTEGER; &OCTIVE,OCTIVE2,QCOUNTER,UNITN : INTEGER; &LENGTH,SKEY : INTEGER; &INTNAME * >* * >* MUSIC IS AN INTERACTIVE PROGRAM * ,INTTEMP,ANSWER : STRING; &DUMMY : ALPHA; &DRAW,JUSTLOOKING:BOOLEAN; &TIM,TIM2,DAY : ALPHA; &MUSDATA,MUSREC,NEWREC : TEXT; >* DESIGNED TO DRILL MUSIC STUDENTS ON * >* THE RECOGNITION OF THE BASIC HARMONIC * >* INTERVALS USING&X,Y,YNOTE : INTEGER; &STAFFN,CORRECTY,XIN,YIN,COUNTER2 : INTEGER; &RESTVALUE : INTEGER; &ZERO,TOTALEX,Q : INTEGER; &LL : IN A TEKTRONIX 4010 TERMINAL * >* AND PLATO MUSIC BOX WITH INTERFACE. * >* IN A SAMPLE RUN, THE STUDENT WOULTEGER; &YY,COUNTER : INTEGER; &XSTEM,YSTEM : INTEGER; &FIRST,NORM,SHOWINT : BOOLEAN; &CIS,TOPVOICE,VOL1,VOL2,VOL3,VOL4 : INTD * >* TYPE -MUS, WHICH STARTS A PROCEDURE FILE * >* THAT GETS THE NOTE AND RECORD KEEPING * >* DATA FEGER; &SPACER,GSPEED : INTEGER; &OCNOTE,EXCOUNTER,ANSCOUNTER,IDNUM,RUNS : INTEGER; ILES, EXECUTES THE BINARY OF THIS * >* PROGRAM, AND UPDATES THE RECORD FILES * >* AFTER THE STUDENT IS FINISHE&NOTELETTR,ACCIDENT,NOTELETTR2,ACCIDENT2 : CHAR; &FLAGUP,HELP,HARMONIC,GRAPH,ANS,BYE : BOOLEAN; &NEXT,UPDOWN,FORMAL,RESETUNITD. DURING * >* THE ACTUAL RUN, THE STUDENT IS PLAYED AN * >* INTERVAL AND ASKED IT"S NAME. IF THE * >*  : BOOLEAN; &FUNCTION RANDOM : REAL; EXTERN; !PROCEDURE SETRANDOM(SEED1,SEED2 : INTEGER); EXTERN; !PROCEDURE COMP(VAR X:INTEG O %READ(MUSDATA,NOTELETTR); %READ(MUSDATA,ACCIDENT,OCTIVE,NOTELETTR2, %ACCIDENT2,OCTIVE2,INTERVAL1,INTERVAL2); %TOTALEX:=TOT; !PROCEDURE DOUBLESHARP(X,Y,YNOTE : INTEGER); #BEGIN (* DOUBLE SHARP *) %YY:=606-(Y*150)+YNOTE*8; %MOVE(X-7,YY+7,UP);MOVE(XALEX + 1; #END; !PROCEDURE GCLEFF(Y : INTEGER); #BEGIN (* GCLEFF *) %YY := 630-(Y*150); %MOVE(8,YY-70,UP);MOVE(10,YY-72,DOW+7,YY-7,DOWN);MOVE(X+7,YY+7,UP); %MOVE(X-7,YY-7,DOWN);MOVE(X-7,YY,UP);MOVE(X-7,YY,DOWN); %MOVE(X+7,YY,UP);MOVE(X+7,YY,DOWN);MON);MOVE(11,YY-69,DOWN); %MOVE(8,YY-70,DOWN);MOVE(10,YY-75,DOWN);MOVE(12,YY-77,DOWN); %MOVE(15,YY-75,DOWN);MOVE(17,YY-72,DOWN);VE(X,YY+7,UP); %MOVE(X,YY+7,DOWN);MOVE(X,YY-7,UP);MOVE(X,YY-7,DOWN); #END; !PROCEDURE DOUBLEFLAT(X,Y,YNOTE : INTEGER); #BEGIMOVE(8,YY,DOWN); %MOVE(12,YY+5,DOWN);MOVE(15,YY+7,DOWN);MOVE(18,YY+5,DOWN); N (* DOUBLE FLAT *) %FLAT(X,Y,YNOTE); %FLAT(X-14,Y,YNOTE); #END; !PROCEDURE NATURAL(X,Y,YNOTE : INTEGER); #BEGIN (* NATURAL%MOVE(22,YY,DOWN);MOVE(0,YY-43,DOWN);MOVE(0,YY-50,DOWN); %MOVE(5,YY-56,DOWN);MOVE(15,YY-60,DOWN);MOVE(23,YY-56,DOWN); %MOVE(2 SIGN *) %YY:=606-(Y*150)+(YNOTE*8); %MOVE(X-5,YY+12,UP);MOVE(X-2,YY-8,DOWN);MOVE(X+2,YY+8,UP); %MOVE(X+5,YY-12,DOWN);MOVE(X-V 100B) MOD 100B); %PUT(OUTPUT); %OUTPUT' := CHR(BYTE MOD 100B); %PUT(OUTPUT); #END; !PROCEDURE MOVE(X,Y : INTEGER; PENSTAT5,YY-45,DOWN);MOVE(22,YY-40,DOWN);MOVE(15,YY-38,DOWN); %MOVE(9,YY-42,DOWN);MOVE(10,YY-45,DOWN);MOVE(15,YY-50,DOWN); %MOVE(20,YUS : PEN); !VAR HX,LX,HY,LY : INTEGER; #BEGIN (* MOVE SENDS TEKTRONIC PLOTTING DATA TO MOVE AN *) $(* INVISIBLE 'PEN' TO THE Y-50,DOWN); #END; !PROCEDURE FCLEFF(Y : INTEGER); #BEGIN %YY:=630-(Y*150); %MOVE(5,YY-13,UP);MOVE(6,YY-13,DOWN);MOVE(4,YY-1SPECIFIED X,Y POSITION *) %IF PENSTATUS = UP THEN write (chr (29) ); %HX := X DIV 32 + HIGH; %LX := X MOD 32 + LOWX; %HY := 4,DOWN); %MOVE(11,YY-4,DOWN);MOVE(15,YY-1,DOWN);MOVE(20,YY-2,DOWN); %MOVE(25,YY-4,DOWN);MOVE(30,YY-12,DOWN);MOVE(28,YY-20,DOWNY DIV 32 + HIGH; %LY := Y MOD 32 + LOWY; %IF HY <> LASTHY THEN PUTBYTE(HY); ); %MOVE(1,YY-53,DOWN);MOVE(35,YY-7,UP);MOVE(38,YY-9,DOWN); %MOVE(35,YY-22,UP);MOVE(38,YY-24,DOWN); #END; !PROCEDURE SHARP(X%IF (LY <> LASTLY) OR (HX <> LASTHX) THEN PUTBYTE(LY); %IF HX <> LASTHX THEN PUTBYTE(HX); %PUTBYTE(LX); %LASTHY := HY; %LAS,Y,YNOTE : INTEGER); #BEGIN (* SHARP *) %YY:= 606-(Y*150)+YNOTE*8; %MOVE(X-4,YY+12,UP);MOVE(X-1,YY-16,DOWN);MOVE(X+2,YY+16,UPTLY := LY; %LASTHX := HX #END; !PROCEDURE ADVANEXER; #BEGIN (* ADVANEXER READS THE NOTES OF THE NEXT EXERCISE *) %IF (EOF(); %MOVE(X+5,YY-14,DOWN);MOVE(X-8,YY+3,UP);MOVE(X+8,YY+9,DOWN); %MOVE(X-8,YY-8,UP);MOVE(X+9,YY-2,DOWN); #END; !PROCEDURE FLAMUSDATA)) OR (TOTALEX>500) THEN NOTELETTR:='*' %ELSE READ(MUSDATA,NOTELETTR); %IF NOTELETTR='*' THEN 'BEGIN )RESET(MUSDATA);T(X,Y,YNOTE : INTEGER); #BEGIN (* FLAT *) %YY:=606-(Y*150)+YNOTE*8;  )READLN(MUSDATA); )RESETUNIT:=TRUE; )TOTALEX:=0; )NEXT:=TRUE; )DRAW:=FALSE; 'END; %WHILE NOT (NOTELETTR IN ['A'..'G']) D%MOVE(X-6,YY+30,UP);MOVE(X-6,YY-9,DOWN);MOVE(X+5,YY+2,DOWN); %MOVE(X+7,YY+5,DOWN);MOVE(X,YY+8,DOWN);MOVE(X-6,YY+6,DOWN); #END MOVE(X-8,YY,UP);MOVE(X-3,YY+6,DOWN);MOVE(X+3,YY+6,DOWN); )MOVE(X+8,YY,DOWN);MOVE(X+3,YY-6,DOWN); )MOVE(X-3,YY-6,DOWN);MOVE(X-8%IF (Y=1) AND (YNOTE<-6) THEN 'BEGIN )DASH(X,Y,-7); )IF YNOTE<-8 THEN +BEGIN -DASH(X,Y,-9); -IF YNOTE<-10 THEN DASH(X,Y,-,YY,DOWN); )COUNT:=COUNT+30; 'END %ELSE 'BEGIN (* SOLID NOTE *) )MOVE(X-8,YY-5,UP);MOVE(X+8,YY,DOWN); )MOVE(X-8,YY-2,DOWN11); +END 'END #END; !PROCEDURE RESTFLAG(X,YY : INTEGER); #BEGIN (* FLAGS FOR 1/4 TO 1/32 RESTS *) %MOVE(X-7,YY-15,UP); );MOVE(X+8,YY+3,DOWN); )MOVE(X-8,YY+1,DOWN);MOVE(X+8,YY+6,DOWN); )COUNT:=COUNT+15; 'END; %IF NOTEVALUE>0 THEN %IF FLAGUP TH%MOVE(X+7,YY+15,DOWN); %MOVE(X-4,YY+10,DOWN); %MOVE(X-8,YY+10,DOWN); %MOVE(X-10,YY+12,DOWN); %MOVE(X-9,YY+14,DOWN); %MOVE(XEN 'BEGIN )XSTEM:=X+8; )YSTEM:=YY+40; )MOVE(XSTEM,YY,UP); )MOVE(XSTEM,YSTEM,DOWN); 'END %ELSE 'BEGIN )XSTEM:=X-8; )YST-8,YY+15,DOWN); %MOVE(X-7,YY+14,DOWN); %MOVE(X-10,YY+12,DOWN); #END; !PROCEDURE REST(X,Y,YNOTE,RESTVALUE : INTEGER); #BEGINEM:=YY-40; )MOVE(XSTEM,YY,UP); )MOVE(XSTEM,YSTEM,DOWN); 'END; %IF NOTEVALUE>2 THEN 'BEGIN (* LET"S DRAW SOME FLAGS *)  (* DRAW A REST *) %YY:=606-(Y*150)+YNOTE*8; %IF RESTVALUE=0 THEN 'BEGIN (* WHOLE REST *) )MOVE(X-7,YY,UP);MOVE(X-7,YY)MOVE(XSTEM,YSTEM,UP); )IF FLAGUP THEN MOVE(XSTEM+10,YSTEM-15,DOWN) )ELSE MOVE(XSTEM+12,YSTEM+15,DOWN); )IF NOTEVALUE>3 THEN-8,DOWN); )MOVE(X+7,YY-8,DOWN);MOVE(X+7,YY,DOWN); )MOVE(X-16,YY,UP);MOVE(X+16,YY,DOWN); 'END %ELSE 'BEGIN )IF RESTVALUE=1  (* 1/16 NOTE FLAGS NOW *) +BEGIN /IF FLAGUP THEN BEGIN MOVE(XSTEM,YSTEM-8,UP); /MOVE(XSTEM+10,YSTEM-23,DOWN) END /ELSE BTHEN +BEGIN (* HALF REST *) -MOVE(X-7,YY,UP);MOVE(X-7,YY+8,DOWN); -MOVE(X+7,YY+8,DOWN);MOVE(X+7,YY,DOWN); -MOVE(X-16,YY,UEGIN MOVE(XSTEM,YSTEM+8,UP); /MOVE(XSTEM+12,YSTEM+23,DOWN) END; -IF NOTEVALUE>4 THEN (* 1/32 NOTE FLAGS *) /BEGIN 3IF FLAP);MOVE(X+16,YY,DOWN); +END )ELSE +BEGIN -IF RESTVALUE=2 THEN /BEGIN (* 1/4 REST *) 1MOVE(X,YY-17,UP); 4,YY+6,UP);MOVE(X+2,YY+8,DOWN); %MOVE(X-2,YY-8,UP);MOVE(X+4,YY-6,DOWN); #END; !PROCEDURE DASH(X,Y,YNOTE : INTEGER); #BEGIN GUP THEN BEGIN MOVE(XSTEM,YSTEM-16,UP); 5MOVE(XSTEM+10,YSTEM-31,DOWN) 3END 3ELSE BEGIN MOVE(XSTEM,YSTEM+16,UP); 5MOVE(XSTEM+ (* DRAW DASH FOR NOTES ABOVE AND BELOW STAFF *) %YY:=606-(Y*150)+YNOTE*8; %MOVE(X-16,YY,UP); %MOVE(X+16,YY,DOWN); #END; 12,YSTEM+31,DOWN) 3END; 1IF NOTEVALUE>5 THEN (* 1/64 FLAGS *) 3BEGIN 7IF FLAGUP THEN BEGIN 9MOVE(XSTEM,YSTEM-24,UP); 9MO!PROCEDURE CLEAR; #BEGIN (* CLEAR SCREEN *) %write (chr (33) ); %write (chr (12) ); %WRITELN(' VE(XSTEM+10,YSTEM-39,DOWN); 7END 7ELSE BEGIN 9MOVE(XSTEM,YSTEM+24,UP); 9MOVE(XSTEM+12,YSTEM+37,DOWN); 7END; 3END /END +E '); %QCOUNTER:=0; %SPACER:=140; #END (* CLEAR SCREEN *); !PROCEDURE NOTE(X,Y,YNOTE,NOTEVALUE : INTEGER; FLAGUP : BOOLEAND 'END; %IF (Y=0) AND (YNOTE=-7) THEN %DASH(X,Y,YNOTE); %IF (Y=0) AND (YNOTE>4) THEN 'BEGIN )DASH(X,Y,5); )IF YNOTE>6 THN); !VAR COUNT : INTEGER; #BEGIN (* DRAW A NOTE *) %YY:=606-(Y*150)+YNOTE*8; %IF NOTEVALUE<2 THEN 'BEGIN (* OPEN NOTE *) )EN +BEGIN -DASH(X,Y,7); -IF YNOTE>8 THEN /BEGIN 1DASH(X,Y,9); 1IF YNOTE>10 THEN 1DASH(X,Y,11); /END +END 'END;  17,DOWN); 1MOVE(X-2,YY+3,UP); 1MOVE(X+4,YY+10,DOWN); 1MOVE(X,YY+15,UP); 1MOVE(X,YY,DOWN); 1MOVE(X-3,YY-12,UP); 1MOVE(X,YY- IF AN INTERVAL IS PERFECT, CONSIDER THE LOWER TONE AS THE'); 4,DOWN); /END -ELSE /BEGIN (* 1/8 REST *) 1RESTFLAG(X,YY); 1IF RESTVALUE>3 THEN 3BEGIN (* 1/16 REST *) 5RESTFLAG(X-4,)WRITELN('TONIC OF A MAJOR SCALE. NEXT, INVERT THE INTERVAL AND CONSIDER THE NEW'); )WRITELN('LOWER TONE AS THE TONIC OF A MAYY-8); 5IF RESTVALUE>4 THEN 7BEGIN (* 1/32 REST *) 9RESTFLAG(X-8,YY-16); 9IF RESTVALUE>5 THEN ;BEGIN (* 1/64 REST *) JOR SCALE. IF EACH TONE OF THE INTERVAL'); )WRITELN('OCCURS IN THE MAJOR SCALE OF THE OTHER, IT IS A PERFECT INTERVAL. THERE'=RESTFLAG(X-12,YY-24); =IF RESTVALUE>6 THEN =RESTFLAG(X-16,YY-32); ;END 7END 3END /END +END 'END #END; !PROCEDURE BAR); )WRITELN('ARE THREE PERFECT INTERVALS, PER4,PER5,AND PER8. ALL OTHER INTERVALS'); )WRITELN('ARE EITHER MAJOR,MINOR, OR TRI(X,Y : INTEGER); #BEGIN (* DRAW A BAR TO SEPARATE MEASURES *) %YY:=630-(Y*150); %MOVE(X,YY,UP); %MOVE(X,YY-64,DOWN) #ENDTONE. IF THE INTERVAL CONSISTS OF THREE'); )WRITELN('WHOLE STEPS (AS IN F TO B), IT IS A TRITONE. MAJOR INTERVALS OCCUR'); ); !PROCEDURE DOT(X,Y,YNOTE : INTEGER); #BEGIN (* DRAW A DOT FOR LONGER NOTES *) %YY:=606-(Y*150)+YNOTE*8; WRITELN('WHEN THE TOP TONE IS IN THE MAJOR SCALE WHOSE KEYNOTE IS THE LOWER TONE.'); )WRITELN('MINOR INTERVALS ARE A HALF STEP %MOVE(X+16,YY+2,UP);MOVE(X+16,YY-2,DOWN); %MOVE(X+18,YY+2,UP);MOVE(X+18,YY-2,DOWN); #END; !PROCEDURE INFO(HELP : BOOLEAN); SMALLER THAN A MAJOR INTERVAL.'); )WRITELN; )WRITELN; )WRITELN('IN GENERAL, THIS PROGRAM ACTS AS DRILL. AN INTERVAL WILL BE #BEGIN (* RUN-TIME INFORMATION FOR THE STUDENT *) 'IF HELP THEN BEGIN )CLEAR; )WRITELN('THIS PROGRAM WAS WRITTEN TO HELP YOUPLAYED TO'); )WRITELN('YOU, AND YOU TYPE IN THE NAME OF THAT INTERVAL. IF YOU ARE INCORRECT,'); )WRITELN('I WILL RESPOND WITH RECOGNIZE MUSICAL INTERVALS, WHICH'); )WRITELN('ARE THE DIFFERENCE IN PITCH BETWEEN TWO NOTES. THE SIZE OF AN INTERVAL'); )W A < OR > SYMBOL IF YOU GUESSED TOO HIGH OR TOO LOW,'); RITELN('IS DETERMINED BY THE NUMBER OF STAFF DEGREES INVOLVED, GOING FROM THE'); )WRITELN('LOWER TO THE HIGHER TONE. UNLIKE LI)WRITELN('RESPECTIVELY. IF YOU ARE RIGHT, I"LL SAY SO AND DRAW THE NOTES ON THE'); )WRITELN('STAFF. THEN I WILL PLAY THE NEXNEAR MEASUREMENT, THERE IS NO ''ZERO'''); )WRITELN('TO START AT, SO INSTEAD YOU MUST BEGIN COUNTING AT ''ONE'', FROM THE'); )WT INTERVAL, AND SO ON. WHEN YOU WANT TO'); )WRITELN('QUIT, SIMPLY TYPE IN THE WORD BYE .'); )WRITELN; )WRITELN; )WRITELN('1MOVE(X-5,YY-10,DOWN); 1MOVE(X-4,YY-7,DOWN); 1MOVE(X-1,YY-4,DOWN); 1MOVE(X-5,YY+3,DOWN); 1MOVE(X,YY+12,DOWN); 1MOVE(X,YY+1RITELN('LOWER NOTE. FOR EXAMPLE, D TO F IS AN INTERVAL OF A THIRD BECAUSE THERE'); )WRITELN('ARE THREE DEGREES BETWEEN THEM, N5,UP); 1MOVE(X+5,YY+8,DOWN); 1MOVE(X,YY,DOWN); 1MOVE(X-1,YY-4,DOWN); 1MOVE(X+5,YY-9,DOWN); 1MOVE(X,YY-7,DOWN); 1MOVE(X,YY-AMELY D-E-F.'); )WRITELN; )WRITELN('THERE ARE THREE BASIC KINDS OF INTERVALS: PERFECT, MAJOR, AND MINOR.'); )WRITELN('TO TEST   GETSEG(INPUT); )IF FIRST THEN CLEAR; 'END; #END; !PROCEDURE UNCODE(NOTELETTR,ACCIDENT:CHAR; OCTIVE:INTEGER); !VAR IVAL,JVAWHEN YOU HAVE FINISHED READING THIS, TYPE CONTINUE .'); )IF NOT EOS(INPUT) THEN READLN(INPUT) ELSE GETSEG(INPUT); 'END %ELSL : INTEGER; #BEGIN (* UNCODE TURNS A CONVENTIONAL NOTATION NOTE INTO *) $(* A NUMBER REPRESENTING IT"S FREQUENCY *) E 'BEGIN )CLEAR; )WRITELN('THE ACCEPTED ABBREVIATIONS OF INTERVAL NAMES ARE:'); )WRITELN; )WRITELN('MIN2,MAJ2,MIN3,MAJ3,PER'CASE NOTELETTR OF ('A':JVAL:=9; ('B':JVAL:=11; ('C':JVAL:=0; ('D':JVAL:=2; ('E':JVAL:=4; ('F':JVAL:=5; ('G':JVAL:=7; '4,TRIT,PER5,MIN6,MAJ6,MIN7,MAJ7,PER8'); )WRITELN('(OR EQUIVALENTLY)'); )WRITELN('N2,M2,N3,M3,P4,T,P5,N6,M6,N7,M7,P8'); )WRITEEND; 'CASE ACCIDENT OF ('N':IVAL:=JVAL; ('?':IVAL:=JVAL+1; (''':IVAL:=JVAL-1; ('D':IVAL:=JVAL-2; ('X':IVAL:=JVAL+2; 'END;LN; )WRITELN; )WRITELN('THESE ARE COMMANDS WHICH YOU MAY ENTER AT ANY TIME:'); )WRITELN(' BYE TO STOP THE PROGRAM.');  %OCNOTE:=36+IVAL+(OCTIVE-2)*12; #END; !PROCEDURE QUIET; !VAR K : INTEGER; #BEGIN (* SET MODE TO ALL VOICES, THEN LOAD )WRITELN(' AGAIN TO PLAY THE CURRENT INTERVAL AGAIN.'); )WRITELN(' DRILL TO PRACTICE READING NOTES.'); )WRITELN(' UNPLAYABLE NOTES *) %OUTPUT':=CHR(74B);PUT(OUTPUT); %OUTPUT':=CHR(05B);PUT(OUTPUT); %WRITE('CAA'); 'FOR K:= 1 TO 4 DO BEGIN  LENGTH TO CHANGE THE LENGTH OF THE INTERVALS.'); )WRITELN(' MELODIC FOR MELODIC INTERVALS.'); )OUTPUT':=CHR(74B);PUT(OUTPUT);OUTPUT':=CHR(05B);PUT(OUTPUT); )WRITE('H@A@A'); 'END; #END; !PROCEDURE NOOP; #BEGIN (* NO)WRITELN(' HARMONIC FOR HARMONIC INTERVALS.'); )WRITELN(' CLEAR TO CLEAR THE SCREEN AND REDRAW THE STAFF.'); )WRITELN(OP SENDS A 'NO OPERATION' SIGNAL TO THE BOX. *) %write (chr (17) ); %WRITE('@A@A@A'); #END; !PROCEDURE CONVERT(X:INTEGER); ' SHOW TO SEE THE ANSWERS.'); )WRITELN(' PLAY TO PLAY AN INTERVAL OF YOUR CHOICE.'); )WRITELN(' ORDER CHANGES THE ORDER THE NOTES ARE PLAYED.'); )WRITELN(' GRAPH TO SUPPRESS THE STAFF FOR FASTER DRILL.'); )WRITELN(' QUIT TO RETURN FROM DRILL COMMAND.'); )WRITELN(' UNIT TO CHANGE UNITS.'); )WRITELN(' INFO TO LIST INFORMATION.'); )WRITELO^N(' NEXT TO BYPASS A QUESTION.'); )WRITELN; )WRITELN('ALL COMMANDS MAY BE ABBREVIATED BY USING ONLY THE FIRST LETTER.');*Bz )WRITELN; )WRITELN; )WRITELN('WHEN YOU HAVE FINISHED READING, TYPE CONTINUE .'); )IF NOT EOS(INPUT) THEN READLN(INPUT) ELSE  RT(10B*VOL1+VOL2); %CONVERT(10B*VOL3+VOL4); #END; PROCEDURE PLAY; CONST CRYSTAL = 3872000; VAR NOTEOPER,NOTEOPER2:INTEGER;=FALSE; )HELP:=FALSE; )QCOUNTER:=0; )STAFFN:=1; )UNITN:=-1; )JUSTLOOKING:=FALSE; )FORMAL:=TRUE; )TOTALEX:=0; )RESETUNIT: COUNTER,TOP : INTEGER; FREQ:REAL; #BEGIN %UNCODE(NOTELETTR,ACCIDENT,OCTIVE); %NOTEVAL:=OCNOTE-21; %FREQ:=27.5*EXP(LN(2.0)=TRUE; )NORM:=TRUE; )DRAW:=TRUE; )ANSCOUNTER:=0; )EXCOUNTER:=0; )CIS:=1; )TOPVOICE:=0; )VOL1:=6; )VOL2:=6; )VOL3:=6; )*NOTEVAL/12.0); %NOTEOPER:=ROUND((CRYSTAL/FREQ-2)/4); %UNCODE(NOTELETTR2,ACCIDENT2,OCTIVE2); %NOTEVAL2:=OCNOTE-21; VOL4:=6; )QUIET; )CHANGEMODE; )TIME(TIM); )DATE(DAY); )SETRANDOM(ORD(TIM[9])*100+ORD(DAY[9])*1000,ORD(TIM[8])*10000); )SKE%FREQ:=27.5*EXP(LN(2.0)*NOTEVAL2/12.0); %NOTEOPER2:=ROUND((CRYSTAL/FREQ-2)/4); %IF ((NOTEVAL>NOTEVAL2) AND (NOT UPDOWN)) OR Y:=0; )COMP(SKEY); (* TURN OFF S-KEY INTERRUPT *) )ZERO:=ORD('0'); )Q:=ORD('Q'); 'END #END; FUNCTION INTVALUE(INTE'((NOTEVAL0) AND (X<27) THEN NOOP; %IF HARMONIC THEN FOR COUNTER:=1 TO LENGTH DO NOOP; %write (chr (17) ); %WRITE('H@A@A'); %IF HARMONIC THEN 'BEGIN ) 'BEGIN )OUTPUT':=CHR(X); )PUT(OUTPUT); 'END %ELSE %IF (X>32) AND (X<59) THEN %PUTBYTE(7600B + X - 32) %ELSE 'CASE X OFwrite (chr (17) ); )WRITE('H@A@A'); 'END; %PUTBYTE(7645B); WRITELN; #END; PROCEDURE INITIALIZE; #BEGIN (* INITIALIZE CHE )0:PUTBYTE(7401B); )27:WRITE('['); )28:WRITE('^!'); )29:WRITE(']'); )30:WRITE('''); )31:PUTBYTE(7404B); )32:WRITE(','); CKS DATA FILES AND SETS INITAL VALUES *) %RESET(MUSDATA); %IF EOF(MUSDATA) THEN 'BEGIN )WRITELN('PLEASE GET MUSDATA'); )59:PUTBYTE(7661B); )60:WRITE(':'); )61:PUTBYTE(7662B); )62:WRITE('^''); )63:PUTBYTE(7674B); 'END; #END; PROCEDURE CHANG)BYE:=TRUE; 'END %ELSE 'BEGIN )CLEAR; )WRITELN('WELCOME TO THE HARMONIC INTERVAL PROGRAM.'); )HARMONIC := FALSE; )GRAPH EMODE; #BEGIN (* CALL TO CHANGE THE MODE THE BOX IS IN PRESENTLY. *) %write (chr (17) ); %CONVERT(4*CIS+TOPVOICE); %CONVE:= TRUE; )FIRST:=TRUE; )BYE := FALSE; )ANS := FALSE; )SHOWINT:=TRUE; )LENGTH:=4; )RESET(INPUT); )WCOUNTER := 0; )UPDOWN:  *'M': BEGIN -INTNAME:='MAJ0'; -INTNAME[4]:=INTERVAL2; +END; *'N': BEGIN -INTNAME:='MINO'; -INTNAME[4]:=INTERVAL2; +END; ,',':CONVERT:=12; ,'-':CONVERT:=13; ,'.':CONVERT:=14; ,'/':CONVERT:=15; ,':':CONVERT:=27; ,';':CONVERT:=28; ,'<':CONVERT:'END; #END; PROCEDURE INPUTLN; VAR KK:INTEGER; #BEGIN (* READ ONLY FIRST 4 LETTERS OF INPUT LINE *) %KK:=0; %ANSWER:==29; ,'=':CONVERT:=30; ,'>':CONVERT:=31; ,'\':CONVERT:=32; +END; 'END; #END; #BEGIN (* GINPUT GETS X AND Y CO-ORDINATES' '; %IF NOT EOS(INPUT) THEN 'BEGIN )READLN; )WHILE (NOT EOF(INPUT)) AND (NOT EOLN(INPUT)) DO +BEGIN -KK:=KK+1; -IF K FROM GRAPHIC INPUT MODE *) %PUTBYTE(0007B); %PUTBYTE(4000B); %PUTBYTE(4000B); %IF GIN THEN %PUTBYTE(4033B) (* GRAPHIC INPK<5 THEN ANSWER[KK]:=INPUT'; -GET(INPUT); +END 'END %ELSE 'BEGIN GETSEG(INPUT,0); UT MODE *) %ELSE %PUTBYTE(4005B) (* ALPHA CURSOR POSITION *); %PUTBYTE(4032B); %GET(INPUT); %CHARACT:=INPUT'; %GET(INPUT))WRITELN('PLEASE TYPE SOMETHING BEFORE YOU HIT A CARRAGE RETURN.'); )INPUTLN; )QCOUNTER:=QCOUNTER+1; 'END; #END; FUNCTION ; %HX:=INPUT';GET(INPUT); %LX:=INPUT';GET(INPUT); %HY:=INPUT';GET(INPUT); %LY:=INPUT'; %WHILE NOT EOLN(INPUT) DO GET(INPUT)NUMBERIN:INTEGER; #BEGIN (* NUMBERIN RETURNS THE NUMBER THAT A PERSON TYPES IN *) %INPUTLN; %IF ANSWER[1]=' ' THEN NUMBERIN:=; %X:=32*CONVERT(HX)+CONVERT(LX); %Y:=32*CONVERT(HY)+CONVERT(LY); #END; PROCEDURE SPEED; #BEGIN (* SELECT SPEED OF DICTA0 %ELSE IF ANSWER[2]=' ' THEN NUMBERIN:=ORD(ANSWER[1])-ZERO %ELSE IF ANSWER[3]=' ' THEN %NUMBERIN:=10*(ORD(ANSWER[1])-ZERO) +TION *) %LENGTH:=-1; %WHILE (LENGTH<1) OR (LENGTH>99) DO 'BEGIN )WRITELN('WHAT SPEED DO YOU WANT THE EXERCISE'); RVAL1,INTERVAL2:CHAR):INTEGER; #BEGIN (* INTVALUE PRODUCES A NUMBER WHICH INDICATES HOW FAR APART THE TWO NOTES OF THE INTERVA ORD(ANSWER[2])-ZERO %ELSE IF ANSWER[4]=' ' THEN %NUMBERIN:=100*(ORD(ANSWER[1])-ZERO) %+ 10*(ORD(ANSWER[2])-ZERO) + ORD(ANSWEL ARE. *) 'CASE INTERVAL2 OF ('2': IF INTERVAL1='N' THEN INTVALUE:=1 )ELSE INTVALUE:=2; R[3])-ZERO %ELSE NUMBERIN:=1000*(ORD(ANSWER[1])-ZERO) + %100*(ORD(ANSWER[2])-ZERO) + 10*(ORD(ANSWER[3])-ZERO) %+ ORD(ANSWER[('3': IF INTERVAL1='M' THEN INTVALUE:=4 )ELSE INTVALUE:=3; ('4': INTVALUE:=5; (' ': INTVALUE:=6; ('5': INTVALUE:=7; ('6': 4])-ZERO; #END; PROCEDURE GINPUT(GIN:BOOLEAN;VAR X,Y:INTEGER;VAR CHARACT:CHAR); VAR LX,HX,LY,HY : CHAR; FUNCTION CONVERT(LETIF INTERVAL1='M' THEN INTVALUE:=9 )ELSE INTVALUE:=8; ('7': IF INTERVAL1='M' THEN INTVALUE:=11 )ELSE INTVALUE:=10; ('8': INTVTER : CHAR):INTEGER; #BEGIN (* CONVERT TEKTRONIX CODE TO DECIMAL *) %IF LETTER IN ['0'..'9'] THEN %CONVERT:=ORD(LETTER)-10 ALUE:=12; 'END; #END; PROCEDURE INTDECODE (INTERVAL1,INTERVAL2 : CHAR); #BEGIN (* DECODE INTERVAL NAME FROM THE DATA FILE R%ELSE 'BEGIN )CONVERT:=1; +CASE LETTER OF ,' ':CONVERT:=0; ,'''':CONVERT:=2; ,'?':CONVERT:=3; ,'$':CONVERT:=4; EPRESENTATION *) 'CASE INTERVAL1 OF *'P':BEGIN -INTNAME:='PERF'; -INTNAME[4]:=INTERVAL2; +END; ('T': INTNAME := 'TRIT'; ,'B':CONVERT:=5; ,'_':CONVERT:=6; ,'"':CONVERT:=7; ,'(':CONVERT:=8; ,')':CONVERT:=9; ,'*':CONVERT:=10; ,'+':CONVERT:=11;   INTERVALS COVERED'); )WRITELN; )WRITELN('1 MAJ2,PER4,MAJ7,PER8'); )WRITELN('2 MIN2,MAJ15:WRITELN('5 MIN3,TRIT,PER5,MIN6,MAJ6,MIN7'); 16:WRITELN('6 MIN6,MAJ6,MIN7,MAJ7'); 17:WRITELN('7 MIN2,MAJ23,TRIT,MAJ6'); )WRITELN('3 MIN3,PER5,MIN6,MIN7'); )WRITELN('4 MIN2,MAJ2,MAJ3,PER4,MAJ7,PER,MIN3,MAJ3,PER4,TRIT,PER5,MIN6,MAJ6,MIN7,MAJ7,PER8'); 18:WRITELN('8 MIN2,MAJ2,MIN3,MAJ3,PER4,TRIT,PER5,MIN6,MAJ6,MIN7,MAJ8'); )WRITELN('5 MIN3,TRIT,PER5,MIN6,MAJ6,MIN7'); )WRITELN('6 MIN6,MAJ6,MIN7,MAJ7'); )WRI7,PER8'); 19:WRITELN('9 PER8,PER4,MAJ7,MAJ2,MIN2,MAJ3'); 110:WRITELN('10 MIN3,TRIT,PER5,MIN6,MAJ6,MIN7'); 111:WRITTELN('7 ALL INTERVALS - LEVEL 1'); )WRITELN('8 ALL INTERVALS - LEVEL 2'); )WRITELN('9 ELN('11 MIN2,MAJ2,MIN3,MAJ3,PER4,TRIT,PER5,MIN6,MAJ6,MIN7,MAJ7,PER8'); )WRITELN; )QCOUNTER:=QCOUNTER+18; 'END; %UNITN:= PER8,PER4,MAJ7,MAJ2,MIN2,MAJ3'); )WRITELN('10 MIN3,TRIT,PER5,MIN6,MAJ6,MIN7'); -1; %WHILE (UNITN<0) OR (UNITN>11) DO 'BEGIN )WRITELN('WHICH UNIT 1 THROUGH 11 DO YOU WANT\'); )UNITN:=NUMBERIN; )QCOUNTER:)WRITELN('11 ALL INTERVALS - LEVEL 3'); )WRITELN; )QCOUNTER:=QCOUNTER+18; 'END; %UNITN:=-1; %WHILE (UNITN=QCOUNTER+2; 'END; %RESETUNIT:=TRUE; %IF NOT FIRST THEN NEXT:=TRUE; %FORMAL:=FALSE; #END; PROCEDURE STAFF(STAFFN : INTEGER<0) OR (UNITN>11) DO 'BEGIN )WRITELN('WHICH UNIT 1 THROUGH 11 DO YOU WANT\'); )UNITN:=NUMBERIN; )QCOUNTER:=QCOUNTER+2; 'END); VAR IX : INTEGER; #BEGIN (* DRAW A STAFF *) %IF GRAPH THEN 'BEGIN )SPACER:=140; )FOR Y:=0 TO STAFFN DO +BEGIN -YY :=; %RESETUNIT:=TRUE; %IF NOT FIRST THEN NEXT:=TRUE; %FORMAL:=FALSE; #END; PROCEDURE STAFF(STAFFN : INTEGER); VAR IX : INTEG 550-(Y*150); -FOR IX := 1 TO 5 DO /BEGIN 1MOVE(0,YY+16*IX,UP); 1MOVE(1000,YY+16*IX,DOWN); /END; ER; #BEGIN (* DRAW A STAFF *) %IF GRAPH THEN 'BEGIN )SPACER:=140; )FOR Y:=0 TO STAFFN DO +BEGIN -YY := 550-(Y*150); -FO-IF ODD(Y) THEN FCLEFF(Y) -ELSE GCLEFF(Y); -BAR(0,Y);BAR(1000,Y); -MOVE(0,350,UP); +END; )IF SHOWINT THEN +BEGIN -MOVE(0R IX := 1 TO 5 DO /BEGIN 1MOVE(0,YY+16*IX,UP); 1MOVE(1000,YY+16*IX,DOWN); /END; -IF ODD(Y) THEN FCLEFF(Y) -ELSE GCLEFF(Y);,700,UP); -write (chr (31) ); -WRITE('UNIT '); /CASE UNITN OF 11:WRITELN('1 MAJ2,PER4,MAJ7,PER8'); 12:WRITELN('2 )WRITELN('TO BE PLAYED AT\ USE ANY INTEGER BETWEEN 1 AND 99.'); )LENGTH:=NUMBERIN; )QCOUNTER:=QCOUNTER+3; 'END #END; PROC -BAR(0,Y);BAR(1000,Y); -MOVE(0,350,UP); +END; )IF SHOWINT THEN +BEGIN -MOVE(0,700,UP); -write (chr (31) ); -WRITE('UNITEDURE UNIT; #BEGIN (* SELECT WHICH UNIT TO USE *) %IF FIRST THEN CLEAR; %WRITELN('DO YOU WANT TO SEE YOUR UNIT CHOICES\') '); /CASE UNITN OF 11:WRITELN('1 MAJ2,PER4,MAJ7,PER8'); 12:WRITELN('2 MIN2,MAJ3,TRIT,MAJ6'); 13:WRITELN('3 ; %INPUTLN; %QCOUNTER:=QCOUNTER+2; %IF ANSWER[1]='Y' THEN 'BEGIN )CLEAR; )WRITELN; )WRITELN; )WRITELN('UNIT  MIN3,PER5,MIN6,MIN7'); 14:WRITELN('4 MIN2,MAJ2,MAJ3,PER4,MAJ7,PER8');   MIN2,MAJ3,TRIT,MAJ6'); 13:WRITELN('3 MIN3,PER5,MIN6,MIN7'); 14:WRITELN('4 MIN2,MAJ2,MAJ3,PER4,MAJ7,PER8'); 15:W THEN +BEGIN (* BASS CLEFF *) -Y:=1; -YNOTE:=ORD(ANSWER[1])-5+(((ORD(ANSWER[3])-ZERO)-3)*7); +END )ELSE RITELN('5 MIN3,TRIT,PER5,MIN6,MAJ6,MIN7'); 16:WRITELN('6 MIN6,MAJ6,MIN7,MAJ7'); 17:WRITELN('7 MIN2,MAJ2,MIN3+BEGIN (* TREBLE CLEFF *) -Y:=0; -YNOTE:=ORD(ANSWER[1])-10+(((ORD(ANSWER[3])-ZERO)-4)*7); +END; )FLAGUP:=TRUE; )NOTE(S,MAJ3,PER4,TRIT,PER5,MIN6,MAJ6,MIN7,MAJ7,PER8'); 18:WRITELN('8 MIN2,MAJ2,MIN3,MAJ3,PER4,TRIT,PER5,MIN6,MAJ6,MIN7,MAJ7,PERPACER,Y,YNOTE,NOTEVALUE,FLAGUP); +CASE ANSWER[2] OF ,'N':; ,'?':SHARP(SPACER-12,Y,YNOTE); ,''':FLAT(SPACER-14,Y,YNOTE); ,'X8'); 19:WRITELN('9 PER8,PER4,MAJ7,MAJ2,MIN2,MAJ3'); 110:WRITELN('10 MIN3,TRIT,PER5,MIN6,MAJ6,MIN7'); 111:WRITELN('':DOUBLESHARP(SPACER-10,Y,YNOTE); ,'D':DOUBLEFLAT(SPACER-10,Y,YNOTE); +END; )SPACER:=SPACER+52; (END; 'END; #END; PROCEDU11 MIN2,MAJ2,MIN3,MAJ3,PER4,TRIT,PER5,MIN6,MAJ6,MIN7,MAJ7,PER8'); /END; -PUTBYTE(0007B); -write (chr (19) ); -write (chRE WRONG; VAR SELECT:INTEGER; #BEGIN (* NEGATIVE FEEDBACK TO THE STUDENT *) %SELECT:=TRUNC(1.0+RANDOM*7); 'CASE SELECT OF r (29) ); -MOVE(0,350,UP); +END; 'END #END; PROCEDURE RETURN; VAR JJ : INTEGER; )1:WRITELN('TRY AGAIN.'); )2:WRITELN('NO.'); )3:WRITELN('SORRY, THAT"S WRONG.'); )4:WRITELN('TRY AGAIN.'); )5:WRITELN('MAKE#BEGIN (* RETURN PLACES THE ALPHA CURSOR WHERE IT LEFT OFF AFTER GRAPHICS MODE *) %IF GRAPH THEN 'BEGIN )MOVE(0,350,UP); wr ANOTHER TRY.'); )6:WRITELN('NOT RIGHT, CHOOSE AGAIN.'); )7:WRITELN('I"M AFAID THAT"S NOT RIGHT.'); 'END; %QCOUNTER:=QCOUNTEite (chr (31) ); )WRITELN(' '); )IF QCOUNTER<14 THEN )FOR JJ:=0 TO QCOUNTER )DO WRITELN )ELSE )FOR JJ:=0 TO (QCOUNTR+1; #END; PROCEDURE RIGHT; VAR SELECT:INTEGER; #BEGIN (* POSITIVE FEEDBACK TO THE STUDENT *) %write (chr (11) ); WRITE('ER+20) )DO WRITELN; 'END; #END; PROCEDURE SETUP; #BEGIN (* SETUP PLACES THE TEKTRONIX INTO GRAPHICS MODE *) %IF GRAPH T '); %SELECT := TRUNC(1.0 + RANDOM*9); 'CASE SELECT OF )1:WRITELN('GOOD GOING.'); )2:WRITELN('NICE GOING.'); HEN 'BEGIN )PUTBYTE(0007B); )write (chr (19) ); )write (chr (29) ); 'END; #END; PROCEDURE GRAPHICS; VAR NOTEVALUE : INTE)3:WRITELN('RIGHT ON.'); )4:WRITELN('THAT"S RIGHT.'); )5:WRITELN('CORRECT.'); )6:WRITELN('RIGHT AGAIN.'); )7:WRITELN('KEEP GER; #BEGIN (* KEEP TRACK OF AND DRAW NOTES *) %IF GRAPH AND DRAW THEN 'BEGIN )IF SPACER>950 THEN +BEGIN (* CLEAR THE AUP THE GOOD WORK.'); )8:WRITELN('VERY GOOD.'); )9:WRITELN('GOOD JOB.'); 'END; #END; PROCEDURE DRILL; VAR NOTES:ALPHA; #BELMOST FULL SCREEN *) -CLEAR; -SETUP; -STAFF(STAFFN); +END ELSE %BEGIN )NOTEVALUE:=8 DIV LENGTH; )IF ANSWER[1] IN ['A','GIN (* DRILL THE STUDENT ON READING THE LETTERS OF NOTES *) %SHOWINT:=FALSE; %CLEAR; %WRITELN('NOTE READING DRILL.'); %WB'] THEN ANSWER[3]:=CHR(ORD(ANSWER[3])+1); )IF (ANSWER[3] IN ['1'..'3']) OR )((ANSWER[1] IN ['A','B']) AND (ANSWER[3] = '4')) RITELN('RESPOND PLACE TO POSITION NOTE WITH CROSSHAIRS'); %WRITELN('OR LETTER TO IDENTIFY DRAWN NOTES.'); %INPUTLN;  D (YIN>CORRECTY-202)) -OR (ORD(CHARACTER)=Q) THEN -IF ORD(CHARACTER)<>Q THEN /BEGIN 1ANSWER[1]:=NOTES[COUNTER]; 1ANSWER[2]:CLASS RECORDS... *) )NORM:=FALSE; )WRITELN('CLEAR RECORD FILE ... ENTER PASSWORD'); )INPUTLN; )IF ANSWER='CATS' THEN +BEGIN='N'; 1IF YIN>CORRECTY + 108 THEN 1ANSWER[3]:='6' 1ELSE 1IF YIN>CORRECTY+52 THEN 1ANSWER[3]:='5' 1ELSE  -WRITELN('HOW MANY STUDENTS\'); -JJ:=NUMBERIN; -WHILE JJ>0 DO /BEGIN 1WRITELN(NEWREC,JJ:1,' 00/00/00.000/000/000/000'); 11IF YIN>CORRECTY-4 THEN 1ANSWER[3]:='4' 1ELSE 1IF YIN>CORRECTY-146 THEN 1ANSWER[3]:='3' 1ELSE 1ANSWER[3]:='2'; 1IF ANSWEJJ:=JJ-1; /END; -QCOUNTER:=QCOUNTER+4; +END 'END %ELSE 'BEGIN (* GENERATE INSTRUCTOR"S REPORT *) 'CLEAR; )DATE(DAY);%CLEAR; %IF ANSWER[1]='P' THEN 'BEGIN )CHARACTER:='A'; )WRITELN('TO PLACE A GIVEN NOTE, ADJUST THE CROSSHAIRS ON THE SCREEN'R[1] IN ['A','B'] THEN 1ANSWER[3]:=CHR(ORD(ANSWER[3])-1); 1SETUP; 1GRAPHICS; 1RETURN; 1COUNTER:=COUNTER+1; /END -ELSE -C); )WRITELN('(USING THE DIALS ON THE SIDE OF THE TERMINAL) UNTIL THE'); )WRITELN('HORIZONTAL LINE IS PLACED ON THE STAFF AT THOUNTER:=4 -ELSE /BEGIN 1SETUP; 1RETURN; 1WRONG; /END; +END )UNTIL CHARACTER='Q'; 'END %ELSE 'BEGIN )WRITELN('A NOTE E PROPER PLACE.'); )WRITELN('THEN HIT ANY CHARACTER KEY (EXCEPT A Q) AND THE RETURN KEY.'); )WRITELN('TO QUIT THE DRILL, TYPE WILL BE DRAWN ON THE STAFF, AND YOU ARE'); )WRITELN('TO RESPOND WITH THE LETTER OF THAT NOTE. IF '); )WRITELN('CORRECT, A NEWQ AND A RETURN KEY.'); )SETUP; )STAFFN:=1; )STAFF(STAFFN); )RETURN; )REPEAT )FOR COUNTER2:=1 TO 4 DO  NOTE WILL BE DRAWN. TYPE QUIT TO STOP.'); )SETUP; )STAFFN:=1; )STAFF(STAFFN); )WHILE ORD(ANSWER[1])<>Q DO +BEGIN -ANSWER)NOTES[COUNTER2]:=CHR(TRUNC(RANDOM*7 + 1.0)); )WRITELN('PLEASE PLACE THE FOLLOWING NOTES: ',NOTES[1], (' ',NOTES[2],' [1]:=CHR(TRUNC(RANDOM*7 + 1.0)); -ANSWER[2]:='N'; -ANSWER[3]:=CHR(ZERO+2+TRUNC(RANDOM*5)); -DUMMY[1]:=ANSWER[1]; -GRAPHICS;  ',NOTES[3],' ',NOTES[4]); )QCOUNTER:=QCOUNTER+1; )COUNTER:=1; )WHILE (CHARACTER<>'Q') AND (COUNTER<=4) DO +BEGIN %IF QCO-RETURN; -INPUTLN; -QCOUNTER:=QCOUNTER+1; -WHILE (ORD(ANSWER[1])<>ORD(DUMMY[1])) -AND (ORD(ANSWER[1])<>Q) DO /BEGIN 1QCOUUNTER=0 THEN BEGIN SETUP; RETURN; WRITE('PLEASE PLACE THE FOLLOWING NOTES: '); FOR COUNTER2:=COUNTER TO 4 DO WRITE(NOTES[NTER:=QCOUNTER+1; 1IF ANSWER[1]<>DUMMY[1] THEN 3BEGIN 5write (chr (11) ); 5WRITE(' '); 5QCOUNTER:=QCOUNTER-1; COUNTER2]); WRITELN; QCOUNTER:=1; END; -CORRECTY:=640+(ORD(NOTES[COUNTER])-10)*8; -GINPUT(TRUE,XIN,YIN,CHARACTER); -IF ((Y5WRONG; 3END; 1INPUTLN; /END; -IF ORD(ANSWER[1])<>Q THEN /BEGIN 1RIGHT; 1SETUP; /END +END 'END; %SHOWINT:=TRUE; %CLINCORRECTY-4)) -OR ((YINCORRECTY+52)) -OR ((YINCORRECTY+1EAR; %SETUP; %STAFF(1); %STAFFN:=1; %RETURN; %PLAY; #END; PROCEDURE RECORDS; VAR JJ,FIDNUM,FANS,FTRY : INTEGER; #BEGIN 08)) -OR ((YINCORRECTY-90)) -OR ((YINCORRECTY-146)) -OR ((YIN* INTERVAL DRILL * >* * >*  V1.0 * >* MARVIN MOSER, JULY 1977. * >*  * >* * >* MANY THANKS TO JOHN STRAIT OF UCC * >* O^ FOR THE PROCEDURES PUTBYTE AND MOVE * >* AND TO WILLIAM H. LYNCH AND FRED T. * >* HOFSTETTER OF THE UC(. OF DELAWARE FOR * >* THE MUSDATA DATAFILE AND MANY OF THE * >* CONSTANTS USED FOR GRAPHICS.  * >* * >* MUSIC IS AN INTERACTIVE PROGRAM *  )WRITELN('STUDENT PROGRESS REPORT. ',DAY); )WRITELN; )WRITELN('STUDENT LAST TOTAL TOTAL  TOTAL MEAN ? OF'); )WRITELN('ID ? RUN RUNS RIGHT EXERCISES REPLIES/ANS'); )WRITELN; )RESET(MUSREC); )REPEAT )READLN(MUSREC,FIDNUM,DAY[1],DAY[2],DAY[3], )DAY[4],DAY[5],DAY[6],DAY[7],DAY[8],DAY[9], )DAY[10],RUNS,DUMMY[1],FANS,DUMMY[2],FTRY,DUMMY[3],WCOUNTER); )WRITE(FIDNUM:2,' ',DAY[1],DAY[2],DAY[3], )DAY[4],DAY[5],DAY[6],DAY[7],DAY[8],DAY[9], %(************************************************* >* * >* M U S I C * >* * >* INTERACTIVE HARMONIC  D. DURING * >* THE ACTUAL RUN, THE STUDENT IS PLAYED AN * >* INTERVAL AND ASKED IT"S NAME. IF THE * >*  : BOOLEAN; &FUNCTION RANDOM : REAL; EXTERN; PROCEDURE SETRANDOM(SEED1,SEED2 : INTEGER); EXTERN; PROCEDURE COMP(VAR X:INTEGER ANSWER GIVEN IS CORRECT, THE NOTES ARE * >* DRAWN ON THE STAFF AND THE NEXT INTERVAL * >* IS PLAYED. );EXTERN; PROCEDURE PUTBYTE(BYTE : INTEGER); #BEGIN (* PUTBYTE TAKES 4 DIGITS OF OCTAL AND SENDS THE *) $(* TERMAINAL TWO CHA * >* FOR A COMPLETE LISTING OF ALL * >* COMMANDS AND OPTIONS, ENTER INFO RACTERS WHICH CORRESPOND TO THE TOP *) $(* AND BOTTOM TWO DIGITS OF THE FOUR DIGIT NUMBER *) %OUTPUT' := CHR((BYTE DIV 1 * >* INSTEAD OF AN INTERVAL NAME WHEN YOU * >* ARE RUNNING THE PROGRAM. * 00B) MOD 100B); %PUT(OUTPUT); %OUTPUT' := CHR(BYTE MOD 100B); %PUT(OUTPUT); #END; PROCEDURE MOVE(X,Y : INTEGER; PENSTATUS :>* * >**************************************************) PROGRAM MUSIC(INPUT/ PEN); VAR HX,LX,HY,LY : INTEGER; #BEGIN (* MOVE SENDS TEKTRONIC PLOTTING DATA TO MOVE AN *) $(* INVISIBLE 'PEN' TO THE SPECI+,OUTPUT,MUSDATA,MUSREC,NEWREC); CONST &HIGH:= 4040B; &LOWX:= 4100B; &LOWY:= 4140B; TYPE PEN:= (UP,DOWN); &STRING:= PACKEDFIED X,Y POSITION *) %IF PENSTATUS = UP THEN write (chr (29) ); %HX := X DIV 32 + HIGH; %LX := X MOD 32 + LOWX; %HY := Y DIV ARRAY[1..4] OF CHAR; &ALPHA:= PACKED ARRAY[1..10] OF CHAR; VAR LASTHY,LASTLY,LASTHX : INTEGER; &INTERVAL1,INTERVAL2,CHARACTE 32 + HIGH; %LY := Y MOD 32 + LOWY; %IF HY <> LASTHY THEN PUTBYTE(HY); R : CHAR; &WCOUNTER,NOTEVAL,NOTEVAL2:INTEGER; &OCTIVE,OCTIVE2,QCOUNTER,UNITN : INTEGER; &LENGTH,SKEY : INTEGER; &INTNAME,INT%IF (LY <> LASTLY) OR (HX <> LASTHX) THEN PUTBYTE(LY); %IF HX <> LASTHX THEN PUTBYTE(HX); %PUTBYTE(LX); %LASTHY := HY; %LASTEMP,ANSWER : STRING; &DUMMY : ALPHA; &DRAW,JUSTLOOKING:BOOLEAN; &TIM,TIM2,DAY : ALPHA; &MUSDATA,MUSREC,NEWREC : TEXT; &X,YTLY := LY; %LASTHX := HX #END; PROCEDURE ADVANEXER; #BEGIN (* ADVANEXER READS THE NOTES OF THE NEXT EXERCISE *) %IF (EOF(M>* DESIGNED TO DRILL MUSIC STUDENTS ON * >* THE RECOGNITION OF THE BASIC HARMONIC * >* INTERVALS USING,YNOTE : INTEGER; &STAFFN,CORRECTY,XIN,YIN,COUNTER2 : INTEGER; &RESTVALUE : INTEGER; &ZERO,TOTALEX,Q : INTEGER; &LL : INTEGE A TEKTRONIX 4010 TERMINAL * >* AND PLATO MUSIC BOX WITH INTERFACE. * >* IN A SAMPLE RUN, THE STUDENT WOULR; &YY,COUNTER : INTEGER; &XSTEM,YSTEM : INTEGER; &FIRST,NORM,SHOWINT : BOOLEAN; &CIS,TOPVOICE,VOL1,VOL2,VOL3,VOL4 : INTEGERD * >* TYPE -MUS, WHICH STARTS A PROCEDURE FILE * >* THAT GETS THE NOTE AND RECORD KEEPING * >* DATA F; &SPACER,GSPEED : INTEGER; &OCNOTE,EXCOUNTER,ANSCOUNTER,IDNUM,RUNS : INTEGER; ILES, EXECUTES THE BINARY OF THIS * >* PROGRAM, AND UPDATES THE RECORD FILES * >* AFTER THE STUDENT IS FINISHE&NOTELETTR,ACCIDENT,NOTELETTR2,ACCIDENT2 : CHAR; &FLAGUP,HELP,HARMONIC,GRAPH,ANS,BYE : BOOLEAN; &NEXT,UPDOWN,FORMAL,RESETUNIT )READLN(MUSDATA); )RESETUNIT:=TRUE; )TOTALEX:=0; )NEXT:=TRUE; )DRAW:=FALSE; 'END; %WHILE NOT (NOTELETTR IN ['A'..'G']) DO%MOVE(X-6,YY+30,UP);MOVE(X-6,YY-9,DOWN);MOVE(X+5,YY+2,DOWN); %MOVE(X+7,YY+5,DOWN);MOVE(X,YY+8,DOWN);MOVE(X-6,YY+6,DOWN); #END %READ(MUSDATA,NOTELETTR); %READ(MUSDATA,ACCIDENT,OCTIVE,NOTELETTR2, %ACCIDENT2,OCTIVE2,INTERVAL1,INTERVAL2); %TOTALEX:=TOTA; PROCEDURE DOUBLESHARP(X,Y,YNOTE : INTEGER); #BEGIN (* DOUBLE SHARP *) %YY:=606-(Y*150)+YNOTE*8; %MOVE(X-7,YY+7,UP);MOVE(X+LEX + 1; #END; PROCEDURE GCLEFF(Y : INTEGER); #BEGIN (* GCLEFF *) %YY := 630-(Y*150); %MOVE(8,YY-70,UP);MOVE(10,YY-72,DOWN)7,YY-7,DOWN);MOVE(X+7,YY+7,UP); %MOVE(X-7,YY-7,DOWN);MOVE(X-7,YY,UP);MOVE(X-7,YY,DOWN); %MOVE(X+7,YY,UP);MOVE(X+7,YY,DOWN);MOV;MOVE(11,YY-69,DOWN); %MOVE(8,YY-70,DOWN);MOVE(10,YY-75,DOWN);MOVE(12,YY-77,DOWN); %MOVE(15,YY-75,DOWN);MOVE(17,YY-72,DOWN);MOE(X,YY+7,UP); %MOVE(X,YY+7,DOWN);MOVE(X,YY-7,UP);MOVE(X,YY-7,DOWN); #END; PROCEDURE DOUBLEFLAT(X,Y,YNOTE : INTEGER); #BEGIN VE(8,YY,DOWN); %MOVE(12,YY+5,DOWN);MOVE(15,YY+7,DOWN);MOVE(18,YY+5,DOWN); (* DOUBLE FLAT *) %FLAT(X,Y,YNOTE); %FLAT(X-14,Y,YNOTE); #END; PROCEDURE NATURAL(X,Y,YNOTE : INTEGER); #BEGIN (* NATURAL SI%MOVE(22,YY,DOWN);MOVE(0,YY-43,DOWN);MOVE(0,YY-50,DOWN); %MOVE(5,YY-56,DOWN);MOVE(15,YY-60,DOWN);MOVE(23,YY-56,DOWN); %MOVE(2GN *) %YY:=606-(Y*150)+(YNOTE*8); %MOVE(X-5,YY+12,UP);MOVE(X-2,YY-8,DOWN);MOVE(X+2,YY+8,UP); %MOVE(X+5,YY-12,DOWN);MOVE(X-4,Y5,YY-45,DOWN);MOVE(22,YY-40,DOWN);MOVE(15,YY-38,DOWN); %MOVE(9,YY-42,DOWN);MOVE(10,YY-45,DOWN);MOVE(15,YY-50,DOWN); %MOVE(20,YY+6,UP);MOVE(X+2,YY+8,DOWN); %MOVE(X-2,YY-8,UP);MOVE(X+4,YY-6,DOWN); #END; PROCEDURE DASH(X,Y,YNOTE : INTEGER); #BEGIN (* Y-50,DOWN); #END; PROCEDURE FCLEFF(Y : INTEGER); #BEGIN %YY:=630-(Y*150); %MOVE(5,YY-13,UP);MOVE(6,YY-13,DOWN);MOVE(4,YY-14 DRAW DASH FOR NOTES ABOVE AND BELOW STAFF *) %YY:=606-(Y*150)+YNOTE*8; %MOVE(X-16,YY,UP); %MOVE(X+16,YY,DOWN); #END; ,DOWN); %MOVE(11,YY-4,DOWN);MOVE(15,YY-1,DOWN);MOVE(20,YY-2,DOWN); %MOVE(25,YY-4,DOWN);MOVE(30,YY-12,DOWN);MOVE(28,YY-20,DOWN) PROCEDURE CLEAR; #BEGIN (* CLEAR SCREEN *) %write (chr (33) ); %write (chr (12) ); %WRITELN(' ; %MOVE(1,YY-53,DOWN);MOVE(35,YY-7,UP);MOVE(38,YY-9,DOWN); %MOVE(35,YY-22,UP);MOVE(38,YY-24,DOWN); #END; PROCEDURE SHARP(X,Y '); %QCOUNTER:=0; %SPACER:=140; #END (* CLEAR SCREEN *); PROCEDURE NOTE(X,Y,YNOTE,NOTEVALUE : INTEGER; FLAGUP : BOOLEAN),YNOTE : INTEGER); #BEGIN (* SHARP *) %YY:= 606-(Y*150)+YNOTE*8; %MOVE(X-4,YY+12,UP);MOVE(X-1,YY-16,DOWN);MOVE(X+2,YY+16,UP);; VAR COUNT : INTEGER; #BEGIN (* DRAW A NOTE *) %YY:=606-(Y*150)+YNOTE*8; %IF NOTEVALUE<2 THEN 'BEGIN (* OPEN NOTE *) )MOV %MOVE(X+5,YY-14,DOWN);MOVE(X-8,YY+3,UP);MOVE(X+8,YY+9,DOWN); %MOVE(X-8,YY-8,UP);MOVE(X+9,YY-2,DOWN); #END; PROCEDURE FLAT(XE(X-8,YY,UP);MOVE(X-3,YY+6,DOWN);MOVE(X+3,YY+6,DOWN); )MOVE(X+8,YY,DOWN);MOVE(X+3,YY-6,DOWN); )MOVE(X-3,YY-6,DOWN);MOVE(X-8,YYUSDATA)) OR (TOTALEX>500) THEN NOTELETTR:='*' %ELSE READ(MUSDATA,NOTELETTR); %IF NOTELETTR='*' THEN 'BEGIN )RESET(MUSDATA); ,Y,YNOTE : INTEGER); #BEGIN (* FLAT *) %YY:=606-(Y*150)+YNOTE*8;  EN +BEGIN -DASH(X,Y,7); -IF YNOTE>8 THEN /BEGIN 1DASH(X,Y,9); 1IF YNOTE>10 THEN 1DASH(X,Y,11); /END +END 'END; YY-8); 5IF RESTVALUE>4 THEN 7BEGIN (* 1/32 REST *) 9RESTFLAG(X-8,YY-16); 9IF RESTVALUE>5 THEN ;BEGIN (* 1/64 REST *) %IF (Y=1) AND (YNOTE<-6) THEN 'BEGIN )DASH(X,Y,-7); )IF YNOTE<-8 THEN +BEGIN -DASH(X,Y,-9); -IF YNOTE<-10 THEN DASH(X,Y,-=RESTFLAG(X-12,YY-24); =IF RESTVALUE>6 THEN =RESTFLAG(X-16,YY-32); ;END 7END 3END /END +END 'END #END; PROCEDURE BAR(,DOWN); )COUNT:=COUNT+30; 'END %ELSE 'BEGIN (* SOLID NOTE *) )MOVE(X-8,YY-5,UP);MOVE(X+8,YY,DOWN); )MOVE(X-8,YY-2,DOWN);M11); +END 'END #END; PROCEDURE RESTFLAG(X,YY : INTEGER); #BEGIN (* FLAGS FOR 1/4 TO 1/32 RESTS *) %MOVE(X-7,YY-15,UP); %OVE(X+8,YY+3,DOWN); )MOVE(X-8,YY+1,DOWN);MOVE(X+8,YY+6,DOWN); )COUNT:=COUNT+15; 'END; %IF NOTEVALUE>0 THEN %IF FLAGUP THEN MOVE(X+7,YY+15,DOWN); %MOVE(X-4,YY+10,DOWN); %MOVE(X-8,YY+10,DOWN); %MOVE(X-10,YY+12,DOWN); %MOVE(X-9,YY+14,DOWN); %MOVE(X-'BEGIN )XSTEM:=X+8; )YSTEM:=YY+40; )MOVE(XSTEM,YY,UP); )MOVE(XSTEM,YSTEM,DOWN); 'END %ELSE 'BEGIN )XSTEM:=X-8; )YSTEM:8,YY+15,DOWN); %MOVE(X-7,YY+14,DOWN); %MOVE(X-10,YY+12,DOWN); #END; PROCEDURE REST(X,Y,YNOTE,RESTVALUE : INTEGER); #BEGIN =YY-40; )MOVE(XSTEM,YY,UP); )MOVE(XSTEM,YSTEM,DOWN); 'END; %IF NOTEVALUE>2 THEN 'BEGIN (* LET"S DRAW SOME FLAGS *) (* DRAW A REST *) %YY:=606-(Y*150)+YNOTE*8; %IF RESTVALUE=0 THEN 'BEGIN (* WHOLE REST *) )MOVE(X-7,YY,UP);MOVE(X-7,YY-8)MOVE(XSTEM,YSTEM,UP); )IF FLAGUP THEN MOVE(XSTEM+10,YSTEM-15,DOWN) )ELSE MOVE(XSTEM+12,YSTEM+15,DOWN); )IF NOTEVALUE>3 THEN,DOWN); )MOVE(X+7,YY-8,DOWN);MOVE(X+7,YY,DOWN); )MOVE(X-16,YY,UP);MOVE(X+16,YY,DOWN); 'END %ELSE 'BEGIN )IF RESTVALUE=1 TH (* 1/16 NOTE FLAGS NOW *) +BEGIN /IF FLAGUP THEN BEGIN MOVE(XSTEM,YSTEM-8,UP); /MOVE(XSTEM+10,YSTEM-23,DOWN) END /ELSE BEN +BEGIN (* HALF REST *) -MOVE(X-7,YY,UP);MOVE(X-7,YY+8,DOWN); -MOVE(X+7,YY+8,DOWN);MOVE(X+7,YY,DOWN); -MOVE(X-16,YY,UP)EGIN MOVE(XSTEM,YSTEM+8,UP); /MOVE(XSTEM+12,YSTEM+23,DOWN) END; -IF NOTEVALUE>4 THEN (* 1/32 NOTE FLAGS *) /BEGIN 3IF FLA;MOVE(X+16,YY,DOWN); +END )ELSE +BEGIN -IF RESTVALUE=2 THEN /BEGIN (* 1/4 REST *) 1MOVE(X,YY-17,UP); GUP THEN BEGIN MOVE(XSTEM,YSTEM-16,UP); 5MOVE(XSTEM+10,YSTEM-31,DOWN) 3END 3ELSE BEGIN MOVE(XSTEM,YSTEM+16,UP); 5MOVE(XSTEM+1MOVE(X-5,YY-10,DOWN); 1MOVE(X-4,YY-7,DOWN); 1MOVE(X-1,YY-4,DOWN); 1MOVE(X-5,YY+3,DOWN); 1MOVE(X,YY+12,DOWN); 1MOVE(X,YY+112,YSTEM+31,DOWN) 3END; 1IF NOTEVALUE>5 THEN (* 1/64 FLAGS *) 3BEGIN 7IF FLAGUP THEN BEGIN 9MOVE(XSTEM,YSTEM-24,UP); 9MO5,UP); 1MOVE(X+5,YY+8,DOWN); 1MOVE(X,YY,DOWN); 1MOVE(X-1,YY-4,DOWN); 1MOVE(X+5,YY-9,DOWN); 1MOVE(X,YY-7,DOWN); 1MOVE(X,YY-VE(XSTEM+10,YSTEM-39,DOWN); 7END 7ELSE BEGIN 9MOVE(XSTEM,YSTEM+24,UP); 9MOVE(XSTEM+12,YSTEM+37,DOWN); 7END; 3END /END +E17,DOWN); 1MOVE(X-2,YY+3,UP); 1MOVE(X+4,YY+10,DOWN); 1MOVE(X,YY+15,UP); 1MOVE(X,YY,DOWN); 1MOVE(X-3,YY-12,UP); 1MOVE(X,YY-ND 'END; %IF (Y=0) AND (YNOTE=-7) THEN %DASH(X,Y,YNOTE); %IF (Y=0) AND (YNOTE>4) THEN 'BEGIN )DASH(X,Y,5); )IF YNOTE>6 TH4,DOWN); /END -ELSE /BEGIN (* 1/8 REST *) 1RESTFLAG(X,YY); 1IF RESTVALUE>3 THEN 3BEGIN (* 1/16 REST *) 5RESTFLAG(X-4, MELY D-E-F.'); )WRITELN; )WRITELN('THERE ARE THREE BASIC KINDS OF INTERVALS: PERFECT, MAJOR, AND MINOR.'); )WRITELN('TO TEST E 'BEGIN )CLEAR; )WRITELN('THE ACCEPTED ABBREVIATIONS OF INTERVAL NAMES ARE:'); )WRITELN; )WRITELN('MIN2,MAJ2,MIN3,MAJ3,PERIF AN INTERVAL IS PERFECT, CONSIDER THE LOWER TONE AS THE'); 4,TRIT,PER5,MIN6,MAJ6,MIN7,MAJ7,PER8'); )WRITELN('(OR EQUIVALENTLY)'); )WRITELN('N2,M2,N3,M3,P4,T,P5,N6,M6,N7,M7,P8'); )WRITE)WRITELN('TONIC OF A MAJOR SCALE. NEXT, INVERT THE INTERVAL AND CONSIDER THE NEW'); )WRITELN('LOWER TONE AS THE TONIC OF A MALN; )WRITELN; )WRITELN('THESE ARE COMMANDS WHICH YOU MAY ENTER AT ANY TIME:'); )WRITELN(' BYE TO STOP THE PROGRAM.'); JOR SCALE. IF EACH TONE OF THE INTERVAL'); )WRITELN('OCCURS IN THE MAJOR SCALE OF THE OTHER, IT IS A PERFECT INTERVAL. THERE')WRITELN(' AGAIN TO PLAY THE CURRENT INTERVAL AGAIN.'); )WRITELN(' DRILL TO PRACTICE READING NOTES.'); )WRITELN(' ); )WRITELN('ARE THREE PERFECT INTERVALS, PER4,PER5,AND PER8. ALL OTHER INTERVALS'); )WRITELN('ARE EITHER MAJOR,MINOR, OR TRI LENGTH TO CHANGE THE LENGTH OF THE INTERVALS.'); )WRITELN(' MELODIC FOR MELODIC INTERVALS.'); X,Y : INTEGER); #BEGIN (* DRAW A BAR TO SEPARATE MEASURES *) %YY:=630-(Y*150); %MOVE(X,YY,UP); %MOVE(X,YY-64,DOWN) #END;TONE. IF THE INTERVAL CONSISTS OF THREE'); )WRITELN('WHOLE STEPS (AS IN F TO B), IT IS A TRITONE. MAJOR INTERVALS OCCUR'); ) PROCEDURE DOT(X,Y,YNOTE : INTEGER); #BEGIN (* DRAW A DOT FOR LONGER NOTES *) %YY:=606-(Y*150)+YNOTE*8; WRITELN('WHEN THE TOP TONE IS IN THE MAJOR SCALE WHOSE KEYNOTE IS THE LOWER TONE.'); )WRITELN('MINOR INTERVALS ARE A HALF STEP %MOVE(X+16,YY+2,UP);MOVE(X+16,YY-2,DOWN); %MOVE(X+18,YY+2,UP);MOVE(X+18,YY-2,DOWN); #END; PROCEDURE INFO(HELP : BOOLEAN); #SMALLER THAN A MAJOR INTERVAL.'); )WRITELN; )WRITELN; )WRITELN('IN GENERAL, THIS PROGRAM ACTS AS DRILL. AN INTERVAL WILL BE BEGIN (* RUN-TIME INFORMATION FOR THE STUDENT *) 'IF HELP THEN BEGIN )CLEAR; )WRITELN('THIS PROGRAM WAS WRITTEN TO HELP YOU PLAYED TO'); )WRITELN('YOU, AND YOU TYPE IN THE NAME OF THAT INTERVAL. IF YOU ARE INCORRECT,'); )WRITELN('I WILL RESPOND WITHRECOGNIZE MUSICAL INTERVALS, WHICH'); )WRITELN('ARE THE DIFFERENCE IN PITCH BETWEEN TWO NOTES. THE SIZE OF AN INTERVAL'); )WR A < OR > SYMBOL IF YOU GUESSED TOO HIGH OR TOO LOW,'); ITELN('IS DETERMINED BY THE NUMBER OF STAFF DEGREES INVOLVED, GOING FROM THE'); )WRITELN('LOWER TO THE HIGHER TONE. UNLIKE LIN)WRITELN('RESPECTIVELY. IF YOU ARE RIGHT, I"LL SAY SO AND DRAW THE NOTES ON THE'); )WRITELN('STAFF. THEN I WILL PLAY THE NEXEAR MEASUREMENT, THERE IS NO ''ZERO'''); )WRITELN('TO START AT, SO INSTEAD YOU MUST BEGIN COUNTING AT ''ONE'', FROM THE'); )WRT INTERVAL, AND SO ON. WHEN YOU WANT TO'); )WRITELN('QUIT, SIMPLY TYPE IN THE WORD BYE .'); )WRITELN; )WRITELN; )WRITELN('ITELN('LOWER NOTE. FOR EXAMPLE, D TO F IS AN INTERVAL OF A THIRD BECAUSE THERE'); )WRITELN('ARE THREE DEGREES BETWEEN THEM, NAWHEN YOU HAVE FINISHED READING THIS, TYPE CONTINUE .'); )IF NOT EOS(INPUT) THEN READLN(INPUT) ELSE GETSEG(INPUT); 'END %ELS  )WRITELN; )WRITELN; )WRITELN('WHEN YOU HAVE FINISHED READING, TYPE CONTINUE .'); )IF NOT EOS(INPUT) THEN READLN(INPUT) ELSE GETSEG(INPUT); )IF FIRST THEN CLEAR; 'END; #END; PROCEDURE UNCODE(NOTELETTR,ACCIDENT:CHAR; OCTIVE:INTEGER); VAR IVAL,JVAL : INTEGER; #BEGIN (* UNCODE TURNS A CONVENTIONAL NOTATION NOTE INTO *) $(* A NUMBER REPRESENTING IT"S FREQUENCY *) 'CASE NOTELETTR OF ('A':JVAL:=9; ('B':JVAL:=11; ('C':JVAL:=0; ('D':JVAL:=2; ('E':JVAL:=4; ('F':JVAL:=5; ('G':JVAL:=7; 'END; 'CASE ACCIDENT OF ('N':IVAL:=JVAL; ('?':IVAL:=JVAL+1; (''':IVAL:=JVAL-1; ('D':IVAL:=JVAL-2; ('X':IVAL:=JVAL+2; 'END; %OCNOTE:=36+IVAL+(OCTIVE-2)*12; #END; PROCEDURE QUIET; VAR K : INTEGER; #BEGIN (* SET MODE TO ALL VOICES, THEN LOAD UNPLAYABLE NOTES *) %OUTPUT':=CHR(74B);PUT(OUTPUT); %OUTPUT':=CHR(05B);PUT(OUTPUT); %WRITE('CAA'); 'FOR K:= 1 TO 4 DO BEGIN )#BEGIN (* CONVERT X INTO AN ASCII CODE WITH BIT 1 CSET AND THE REMAINING BITS EQUAL IN VALUE TO X*) %IF (X>0) AND (X<27) THENOUTPUT':=CHR(74B);PUT(OUTPUT);OUTPUT':=CHR(05B);PUT(OUTPUT); )WRITE('H@A@A'); 'END; #END; PROCEDURE NOOP; #BEGIN (* NOOP  'BEGIN )OUTPUT':=CHR(X); )PUT(OUTPUT); 'END %ELSE %IF (X>32) AND (X<59) THEN %PUTBYTE(7600B + X - 32) %ELSE 'CASE X OF)WRITELN(' HARMONIC FOR HARMONIC INTERVALS.'); )WRITELN(' CLEAR TO CLEAR THE SCREEN AND REDRAW THE STAFF.'); )WRITELN(SENDS A 'NO OPERATION' SIGNAL TO THE BOX. *) %write (chr (17) ); %WRITE('@A@A@A'); #END; PROCEDURE CONVERT(X:INTEGER); ' SHOW TO SEE THE ANSWERS.'); )WRITELN(' PLAY TO PLAY AN INTERVAL OF YOUR CHOICE.'); )WRITELN(' ORDER CHANGES THE ORDER THE NOTES ARE PLAYED.'); )WRITELN(' GRAPH TO SUPPRESS THE STAFF FOR FASTER DRILL.'); )WRITELN(' QUIT TO RETURN FROM DRILL COMMAND.'); )WRITELN(' UNIT TO CHANGE UNITS.'); )WRITELN(' INFO TO LIST INFORMATION.'); )WRITELO^N(' NEXT TO BYPASS A QUESTION.'); )WRITELN; )WRITELN('ALL COMMANDS MAY BE ABBREVIATED BY USING ONLY THE FIRST LETTER.');B EMODE; #BEGIN (* CALL TO CHANGE THE MODE THE BOX IS IN PRESENTLY. *) %write (chr (17) ); %CONVERT(4*CIS+TOPVOICE); %CONVE:= TRUE; )FIRST:=TRUE; )BYE := FALSE; )ANS := FALSE; )SHOWINT:=TRUE; )LENGTH:=4; )RESET(INPUT); )WCOUNTER := 0; )UPDOWN:RT(10B*VOL1+VOL2); %CONVERT(10B*VOL3+VOL4); #END; PROCEDURE PLAY; CONST CRYSTAL = 3872000; VAR NOTEOPER,NOTEOPER2:INTEGER;=FALSE; )HELP:=FALSE; )QCOUNTER:=0; )STAFFN:=1; )UNITN:=-1; )JUSTLOOKING:=FALSE; )FORMAL:=TRUE; )TOTALEX:=0; )RESETUNIT: COUNTER,TOP : INTEGER; FREQ:REAL; #BEGIN %UNCODE(NOTELETTR,ACCIDENT,OCTIVE); %NOTEVAL:=OCNOTE-21; %FREQ:=27.5*EXP(LN(2.0)=TRUE; )NORM:=TRUE; )DRAW:=TRUE; )ANSCOUNTER:=0; )EXCOUNTER:=0; )CIS:=1; )TOPVOICE:=0; )VOL1:=6; )VOL2:=6; )VOL3:=6; )*NOTEVAL/12.0); %NOTEOPER:=ROUND((CRYSTAL/FREQ-2)/4); %UNCODE(NOTELETTR2,ACCIDENT2,OCTIVE2); %NOTEVAL2:=OCNOTE-21; VOL4:=6; )QUIET; )CHANGEMODE; )TIME(TIM); )DATE(DAY); )SETRANDOM(ORD(TIM[9])*100+ORD(DAY[9])*1000,ORD(TIM[8])*10000); )SKE%FREQ:=27.5*EXP(LN(2.0)*NOTEVAL2/12.0); %NOTEOPER2:=ROUND((CRYSTAL/FREQ-2)/4); %IF ((NOTEVAL>NOTEVAL2) AND (NOT UPDOWN)) OR Y:=0; )COMP(SKEY); (* TURN OFF S-KEY INTERRUPT *) )ZERO:=ORD('0'); )Q:=ORD('Q'); 'END #END; FUNCTION INTVALUE(INTE'((NOTEVAL':CONVERT:=31; ,'\':CONVERT:=32; +END; 'END; #END; #BEGIN (* GINPUT GETS X AND Y CO-ORDINATES' '; %IF NOT EOS(INPUT) THEN 'BEGIN )READLN; )WHILE (NOT EOF(INPUT)) AND (NOT EOLN(INPUT)) DO +BEGIN -KK:=KK+1; -IF K FROM GRAPHIC INPUT MODE *) %PUTBYTE(0007B); %PUTBYTE(4000B); %PUTBYTE(4000B); %IF GIN THEN %PUTBYTE(4033B) (* GRAPHIC INPK<5 THEN ANSWER[KK]:=INPUT'; -GET(INPUT); +END 'END %ELSE 'BEGIN GETSEG(INPUT,0); UT MODE *) %ELSE %PUTBYTE(4005B) (* ALPHA CURSOR POSITION *); %PUTBYTE(4032B); %GET(INPUT); %CHARACT:=INPUT'; %GET(INPUT))WRITELN('PLEASE TYPE SOMETHING BEFORE YOU HIT A CARRAGE RETURN.'); )INPUTLN; )QCOUNTER:=QCOUNTER+1; 'END; #END; FUNCTION ; %HX:=INPUT';GET(INPUT); %LX:=INPUT';GET(INPUT); %HY:=INPUT';GET(INPUT); %LY:=INPUT'; %WHILE NOT EOLN(INPUT) DO GET(INPUT)NUMBERIN:INTEGER; #BEGIN (* NUMBERIN RETURNS THE NUMBER THAT A PERSON TYPES IN *) %INPUTLN; %IF ANSWER[1]=' ' THEN NUMBERIN:=; %X:=32*CONVERT(HX)+CONVERT(LX); %Y:=32*CONVERT(HY)+CONVERT(LY); #END; PROCEDURE SPEED; #BEGIN (* SELECT SPEED OF DICTA0 %ELSE IF ANSWER[2]=' ' THEN NUMBERIN:=ORD(ANSWER[1])-ZERO %ELSE IF ANSWER[3]=' ' THEN %NUMBERIN:=10*(ORD(ANSWER[1])-ZERO) +TION *) %LENGTH:=-1; %WHILE (LENGTH<1) OR (LENGTH>99) DO 'BEGIN )WRITELN('WHAT SPEED DO YOU WANT THE EXERCISE');  ORD(ANSWER[2])-ZERO %ELSE IF ANSWER[4]=' ' THEN %NUMBERIN:=100*(ORD(ANSWER[1])-ZERO) %+ 10*(ORD(ANSWER[2])-ZERO) + ORD(ANSWE)WRITELN('TO BE PLAYED AT\ USE ANY INTEGER BETWEEN 1 AND 99.'); )LENGTH:=NUMBERIN; )QCOUNTER:=QCOUNTER+3; 'END #END; PROCR[3])-ZERO %ELSE NUMBERIN:=1000*(ORD(ANSWER[1])-ZERO) + %100*(ORD(ANSWER[2])-ZERO) + 10*(ORD(ANSWER[3])-ZERO) %+ ORD(ANSWER[EDURE UNIT; #BEGIN (* SELECT WHICH UNIT TO USE *) %IF FIRST THEN CLEAR; %WRITELN('DO YOU WANT TO SEE YOUR UNIT CHOICES\')4])-ZERO; #END; PROCEDURE GINPUT(GIN:BOOLEAN;VAR X,Y:INTEGER;VAR CHARACT:CHAR); VAR LX,HX,LY,HY : CHAR; FUNCTION CONVERT(LET; %INPUTLN; %QCOUNTER:=QCOUNTER+2; %IF ANSWER[1]='Y' THEN 'BEGIN )CLEAR; )WRITELN; )WRITELN; )WRITELN('UNIT TER : CHAR):INTEGER; #BEGIN (* CONVERT TEKTRONIX CODE TO DECIMAL *) %IF LETTER IN ['0'..'9'] THEN %CONVERT:=ORD(LETTER)-10  INTERVALS COVERED'); )WRITELN; )WRITELN('1 MAJ2,PER4,MAJ7,PER8'); )WRITELN('2 MIN2,MAJ%ELSE 'BEGIN )CONVERT:=1; +CASE LETTER OF ,' ':CONVERT:=0; ,'''':CONVERT:=2; ,'?':CONVERT:=3; ,'$':CONVERT:=4; 3,TRIT,MAJ6'); )WRITELN('3 MIN3,PER5,MIN6,MIN7'); )WRITELN('4 MIN2,MAJ2,MAJ3,PER4,MAJ7,PER  MIN3,PER5,MIN6,MIN7'); 14:WRITELN('4 MIN2,MAJ2,MAJ3,PER4,MAJ7,PER8'); ,MAJ3,PER4,TRIT,PER5,MIN6,MAJ6,MIN7,MAJ7,PER8'); 18:WRITELN('8 MIN2,MAJ2,MIN3,MAJ3,PER4,TRIT,PER5,MIN6,MAJ6,MIN7,MAJ7,PER15:WRITELN('5 MIN3,TRIT,PER5,MIN6,MAJ6,MIN7'); 16:WRITELN('6 MIN6,MAJ6,MIN7,MAJ7'); 17:WRITELN('7 MIN2,MAJ28'); 19:WRITELN('9 PER8,PER4,MAJ7,MAJ2,MIN2,MAJ3'); 110:WRITELN('10 MIN3,TRIT,PER5,MIN6,MAJ6,MIN7'); 111:WRITELN(',MIN3,MAJ3,PER4,TRIT,PER5,MIN6,MAJ6,MIN7,MAJ7,PER8'); 18:WRITELN('8 MIN2,MAJ2,MIN3,MAJ3,PER4,TRIT,PER5,MIN6,MAJ6,MIN7,MAJ11 MIN2,MAJ2,MIN3,MAJ3,PER4,TRIT,PER5,MIN6,MAJ6,MIN7,MAJ7,PER8'); /END; -PUTBYTE(0007B); -write (chr (19) ); -write (ch7,PER8'); 19:WRITELN('9 PER8,PER4,MAJ7,MAJ2,MIN2,MAJ3'); 110:WRITELN('10 MIN3,TRIT,PER5,MIN6,MAJ6,MIN7'); 111:WRITr (29) ); -MOVE(0,350,UP); +END; 'END #END; PROCEDURE RETURN; VAR JJ : INTEGER; TELN('7 ALL INTERVALS - LEVEL 1'); )WRITELN('8 ALL INTERVALS - LEVEL 2'); )WRITELN('9 ELN('11 MIN2,MAJ2,MIN3,MAJ3,PER4,TRIT,PER5,MIN6,MAJ6,MIN7,MAJ7,PER8'); )WRITELN; )QCOUNTER:=QCOUNTER+18; 'END; %UNITN:= PER8,PER4,MAJ7,MAJ2,MIN2,MAJ3'); )WRITELN('10 MIN3,TRIT,PER5,MIN6,MAJ6,MIN7'); -1; %WHILE (UNITN<0) OR (UNITN>11) DO 'BEGIN )WRITELN('WHICH UNIT 1 THROUGH 11 DO YOU WANT\'); )UNITN:=NUMBERIN; )QCOUNTER:)WRITELN('11 ALL INTERVALS - LEVEL 3'); )WRITELN; )QCOUNTER:=QCOUNTER+18; 'END; %UNITN:=-1; %WHILE (UNITN=QCOUNTER+2; 'END; %RESETUNIT:=TRUE; %IF NOT FIRST THEN NEXT:=TRUE; %FORMAL:=FALSE; #END; PROCEDURE STAFF(STAFFN : INTEGER<0) OR (UNITN>11) DO 'BEGIN )WRITELN('WHICH UNIT 1 THROUGH 11 DO YOU WANT\'); )UNITN:=NUMBERIN; )QCOUNTER:=QCOUNTER+2; 'END); VAR IX : INTEGER; #BEGIN (* DRAW A STAFF *) %IF GRAPH THEN 'BEGIN )SPACER:=140; )FOR Y:=0 TO STAFFN DO +BEGIN -YY :=; %RESETUNIT:=TRUE; %IF NOT FIRST THEN NEXT:=TRUE; %FORMAL:=FALSE; #END; PROCEDURE STAFF(STAFFN : INTEGER); VAR IX : INTEG 550-(Y*150); -FOR IX := 1 TO 5 DO /BEGIN 1MOVE(0,YY+16*IX,UP); 1MOVE(1000,YY+16*IX,DOWN); /END; ER; #BEGIN (* DRAW A STAFF *) %IF GRAPH THEN 'BEGIN )SPACER:=140; )FOR Y:=0 TO STAFFN DO +BEGIN -YY := 550-(Y*150); -FO-IF ODD(Y) THEN FCLEFF(Y) -ELSE GCLEFF(Y); -BAR(0,Y);BAR(1000,Y); -MOVE(0,350,UP); +END; )IF SHOWINT THEN +BEGIN -MOVE(0R IX := 1 TO 5 DO /BEGIN 1MOVE(0,YY+16*IX,UP); 1MOVE(1000,YY+16*IX,DOWN); /END; -IF ODD(Y) THEN FCLEFF(Y) -ELSE GCLEFF(Y);,700,UP); -write (chr (31) ); -WRITE('UNIT '); /CASE UNITN OF 11:WRITELN('1 MAJ2,PER4,MAJ7,PER8'); 12:WRITELN('2  -BAR(0,Y);BAR(1000,Y); -MOVE(0,350,UP); +END; )IF SHOWINT THEN +BEGIN -MOVE(0,700,UP); -write (chr (31) ); -WRITE('UNIT MIN2,MAJ3,TRIT,MAJ6'); 13:WRITELN('3 MIN3,PER5,MIN6,MIN7'); 14:WRITELN('4 MIN2,MAJ2,MAJ3,PER4,MAJ7,PER8'); 15:W '); /CASE UNITN OF 11:WRITELN('1 MAJ2,PER4,MAJ7,PER8'); 12:WRITELN('2 MIN2,MAJ3,TRIT,MAJ6'); 13:WRITELN('3 RITELN('5 MIN3,TRIT,PER5,MIN6,MAJ6,MIN7'); 16:WRITELN('6 MIN6,MAJ6,MIN7,MAJ7'); 17:WRITELN('7 MIN2,MAJ2,MIN3 B'] THEN ANSWER[3]:=CHR(ORD(ANSWER[3])+1); )IF (ANSWER[3] IN ['1'..'3']) OR )((ANSWER[1] IN ['A','B']) AND (ANSWER[3] = '4')) RITELN('RESPOND PLACE TO POSITION NOTE WITH CROSSHAIRS'); %WRITELN('OR LETTER TO IDENTIFY DRAWN NOTES.'); %INPUTLN;  THEN +BEGIN (* BASS CLEFF *) -Y:=1; -YNOTE:=ORD(ANSWER[1])-5+(((ORD(ANSWER[3])-ZERO)-3)*7); +END )ELSE %CLEAR; %IF ANSWER[1]='P' THEN 'BEGIN )CHARACTER:='A'; )WRITELN('TO PLACE A GIVEN NOTE, ADJUST THE CROSSHAIRS ON THE SCREEN'+BEGIN (* TREBLE CLEFF *) -Y:=0; -YNOTE:=ORD(ANSWER[1])-10+(((ORD(ANSWER[3])-ZERO)-4)*7); +END; )FLAGUP:=TRUE; )NOTE(S); )WRITELN('(USING THE DIALS ON THE SIDE OF THE TERMINAL) UNTIL THE'); )WRITELN('HORIZONTAL LINE IS PLACED ON THE STAFF AT THPACER,Y,YNOTE,NOTEVALUE,FLAGUP); +CASE ANSWER[2] OF ,'N':; ,'?':SHARP(SPACER-12,Y,YNOTE); ,''':FLAT(SPACER-14,Y,YNOTE); ,'XE PROPER PLACE.'); )WRITELN('THEN HIT ANY CHARACTER KEY (EXCEPT A Q) AND THE RETURN KEY.'); )WRITELN('TO QUIT THE DRILL, TYPE ':DOUBLESHARP(SPACER-10,Y,YNOTE); ,'D':DOUBLEFLAT(SPACER-10,Y,YNOTE); +END; )SPACER:=SPACER+52; (END; 'END; #END; PROCEDUQ AND A RETURN KEY.'); )SETUP; )STAFFN:=1; )STAFF(STAFFN); )RETURN; )REPEAT )FOR COUNTER2:=1 TO 4 DO RE WRONG; VAR SELECT:INTEGER; #BEGIN (* NEGATIVE FEEDBACK TO THE STUDENT *) %SELECT:=TRUNC(1.0+RANDOM*7); 'CASE SELECT OF )NOTES[COUNTER2]:=CHR(TRUNC(RANDOM*7 + 1.0)); )WRITELN('PLEASE PLACE THE FOLLOWING NOTES: ',NOTES[1], (' ',NOTES[2],' )1:WRITELN('TRY AGAIN.'); )2:WRITELN('NO.'); )3:WRITELN('SORRY, THAT"S WRONG.'); )4:WRITELN('TRY AGAIN.'); )5:WRITELN('MAKE ',NOTES[3],' ',NOTES[4]); )QCOUNTER:=QCOUNTER+1; )COUNTER:=1; )WHILE (CHARACTER<>'Q') AND (COUNTER<=4) DO +BEGIN %IF QCO#BEGIN (* RETURN PLACES THE ALPHA CURSOR WHERE IT LEFT OFF AFTER GRAPHICS MODE *) %IF GRAPH THEN 'BEGIN )MOVE(0,350,UP); wr ANOTHER TRY.'); )6:WRITELN('NOT RIGHT, CHOOSE AGAIN.'); )7:WRITELN('I"M AFAID THAT"S NOT RIGHT.'); 'END; %QCOUNTER:=QCOUNTEite (chr (31) ); )WRITELN(' '); )IF QCOUNTER<14 THEN )FOR JJ:=0 TO QCOUNTER )DO WRITELN )ELSE )FOR JJ:=0 TO (QCOUNTR+1; #END; PROCEDURE RIGHT; VAR SELECT:INTEGER; #BEGIN (* POSITIVE FEEDBACK TO THE STUDENT *) %write (chr (11) ); WRITE('ER+20) )DO WRITELN; 'END; #END; PROCEDURE SETUP; #BEGIN (* SETUP PLACES THE TEKTRONIX INTO GRAPHICS MODE *) %IF GRAPH T '); %SELECT := TRUNC(1.0 + RANDOM*9); 'CASE SELECT OF )1:WRITELN('GOOD GOING.'); )2:WRITELN('NICE GOING.'); HEN 'BEGIN )PUTBYTE(0007B); )write (chr (19) ); )write (chr (29) ); 'END; #END; PROCEDURE GRAPHICS; VAR NOTEVALUE : INTE)3:WRITELN('RIGHT ON.'); )4:WRITELN('THAT"S RIGHT.'); )5:WRITELN('CORRECT.'); )6:WRITELN('RIGHT AGAIN.'); )7:WRITELN('KEEP GER; #BEGIN (* KEEP TRACK OF AND DRAW NOTES *) %IF GRAPH AND DRAW THEN 'BEGIN )IF SPACER>950 THEN +BEGIN (* CLEAR THE AUP THE GOOD WORK.'); )8:WRITELN('VERY GOOD.'); )9:WRITELN('GOOD JOB.'); 'END; #END; PROCEDURE DRILL; VAR NOTES:ALPHA; #BELMOST FULL SCREEN *) -CLEAR; -SETUP; -STAFF(STAFFN); +END ELSE %BEGIN )NOTEVALUE:=8 DIV LENGTH; )IF ANSWER[1] IN ['A','GIN (* DRILL THE STUDENT ON READING THE LETTERS OF NOTES *) %SHOWINT:=FALSE; %CLEAR; %WRITELN('NOTE READING DRILL.'); %W 08)) -OR ((YINCORRECTY-90)) -OR ((YINCORRECTY-146)) -OR ((YINCORRECTY-202)) -OR (ORD(CHARACTER)=Q) THEN -IF ORD(CHARACTER)<>Q THEN /BEGIN 1ANSWER[1]:=NOTES[COUNTER]; 1ANSWER[2]:CLASS RECORDS... *) )NORM:=FALSE; )WRITELN('CLEAR RECORD FILE ... ENTER PASSWORD'); )INPUTLN; )IF ANSWER='CATS' THEN +BEGIN='N'; 1IF YIN>CORRECTY + 108 THEN 1ANSWER[3]:='6' 1ELSE 1IF YIN>CORRECTY+52 THEN 1ANSWER[3]:='5' 1ELSE  -WRITELN('HOW MANY STUDENTS\'); -JJ:=NUMBERIN; -WHILE JJ>0 DO /BEGIN 1WRITELN(NEWREC,JJ:1,' 00/00/00.000/000/000/000'); 11IF YIN>CORRECTY-4 THEN 1ANSWER[3]:='4' 1ELSE 1IF YIN>CORRECTY-146 THEN 1ANSWER[3]:='3' 1ELSE 1ANSWER[3]:='2'; 1IF ANSWEJJ:=JJ-1; /END; -QCOUNTER:=QCOUNTER+4; +END 'END %ELSE 'BEGIN (* GENERATE INSTRUCTOR"S REPORT *) 'CLEAR; )DATE(DAY);R[1] IN ['A','B'] THEN 1ANSWER[3]:=CHR(ORD(ANSWER[3])-1); 1SETUP; 1GRAPHICS; 1RETURN; 1COUNTER:=COUNTER+1; /END -ELSE -C )WRITELN('STUDENT PROGRESS REPORT. ',DAY); )WRITELN; )WRITELN('STUDENT LAST TOTAL TOTAL OUNTER:=4 -ELSE /BEGIN 1SETUP; 1RETURN; 1WRONG; /END; +END )UNTIL CHARACTER='Q'; 'END %ELSE 'BEGIN )WRITELN('A NOTE  TOTAL MEAN ? OF'); )WRITELN('ID ? RUN RUNS RIGHT EXERCISES REPLIES/ANS'); WILL BE DRAWN ON THE STAFF, AND YOU ARE'); )WRITELN('TO RESPOND WITH THE LETTER OF THAT NOTE. IF '); )WRITELN('CORRECT, A NEW)WRITELN; )RESET(MUSREC); )REPEAT )READLN(MUSREC,FIDNUM,DAY[1],DAY[2],DAY[3], )DAY[4],DAY[5],DAY[6],DAY[7],DAY[8],DAY[9],  NOTE WILL BE DRAWN. TYPE QUIT TO STOP.'); )SETUP; )STAFFN:=1; )STAFF(STAFFN); )WHILE ORD(ANSWER[1])<>Q DO +BEGIN -ANSWER)DAY[10],RUNS,DUMMY[1],FANS,DUMMY[2],FTRY,DUMMY[3],WCOUNTER); )WRITE(FIDNUM:2,' ',DAY[1],DAY[2],DAY[3], )DAY[4],DAY[[1]:=CHR(TRUNC(RANDOM*7 + 1.0)); -ANSWER[2]:='N'; -ANSWER[3]:=CHR(ZERO+2+TRUNC(RANDOM*5)); -DUMMY[1]:=ANSWER[1]; -GRAPHICS; 5],DAY[6],DAY[7],DAY[8],DAY[9], -RETURN; -INPUTLN; -QCOUNTER:=QCOUNTER+1; -WHILE (ORD(ANSWER[1])<>ORD(DUMMY[1])) -AND (ORD(ANSWER[1])<>Q) DO /BEGIN 1QCOUUNTER=0 THEN BEGIN SETUP; RETURN; WRITE('PLEASE PLACE THE FOLLOWING NOTES: '); FOR COUNTER2:=COUNTER TO 4 DO WRITE(NOTES[NTER:=QCOUNTER+1; 1IF ANSWER[1]<>DUMMY[1] THEN 3BEGIN 5write (chr (11) ); 5WRITE(' '); 5QCOUNTER:=QCOUNTER-1; COUNTER2]); WRITELN; QCOUNTER:=1; END; -CORRECTY:=640+(ORD(NOTES[COUNTER])-10)*8; -GINPUT(TRUE,XIN,YIN,CHARACTER); -IF ((Y5WRONG; 3END; 1INPUTLN; /END; -IF ORD(ANSWER[1])<>Q THEN /BEGIN 1RIGHT; 1SETUP; /END +END 'END; %SHOWINT:=TRUE; %CLINCORRECTY-4)) -OR ((YINCORRECTY+52)) -OR ((YINCORRECTY+1EAR; %SETUP; %STAFF(1); %STAFFN:=1; %RETURN; %PLAY; #END; PROCEDURE RECORDS; VAR JJ,FIDNUM,FANS,FTRY : INTEGER; #BEGIN        ! " # $ % & ' ( ) * + , - . / PUTBYTE BYTE MOVE X Y PENSTATUHX LX HY LY ADVANEXEGCLEFF Y FCLEFF Y SHARP X Y YNOTE FLAT X Y  YNOTE DOUBLESHX Y YNOTE DOUBLEFLX Y YNOTE NATURAL X Y YNOTE DASH X Y YNOTE 0 1 (GCLEFF (Y !FCLEFF (Y !SHARP (X !Y !YNOTE !FLAT (X !Y PUTBYTE (BYTE !MOVE (X !Y !PENSTATU%HX !LX !HY !LY !ADVANEXE2  !YNOTE !DOUBLESH(X !Y !YNOTE !DOUBLEFL(X !Y !YNOTE !NATURAL (X !Y !YNOTE !DASH (X !Y !YNOTE !CLEAR (NOTE (X !Y !YNOTE !FLAGUP $NOTEVALU!COUNT !RESTFLAG(X !YY !REST (X !Y !YNOTE !RESTVALU!BAR (X !Y !DOT (X !Y !YNOTE !INFO (HELP $3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@K L