RANGE0$="C3" RANGE1$="B3" N0=0 N1=0 O0=0 O1=0 CALL DECODEINPUT(RANGE0$,N0,O0) CALL DECODEINPUT(RANGE1$,N1,O1) VR0=N0+O0*12 VR1=N1+O1*12 VS=MIN(VR1,VR0) VD=ABS(VR1-VR0) SUB DECODEINPUT(V$,N,O) O$=RIGHT$(V$,1) O=VAL(O$) IF O$="0" OR O<>0 THEN L=LEN(V$) V0$=LEFT$(V$,MAX(1,L-1)) ELSE V0$=V$ O=-1 END IF CALL STRINGNOTE(N,V0$) END SUB SUB PLAYSHIFT(N) FOR I=0 TO 7 PLAY 0,1+N+I*12 WAIT 20 NEXT I STOP WAIT 20 END SUB ENVELOPE 0,1,5,3,9 RANDOMIZE TIMER NOTE0$="" FOR I=0 TO 11 CALL NOTESTRING(I,NOTE0$) PRINT NOTE0$,""; NO=0 OO=0 'CALL DECODEINPUT(NOTE0$+"1",NO,OO) CALL STRINGNOTE(NO,NOTE0$) 'PRINT NO,""; NEXT I PRINT "" CLS PRINT "NOTE TRAINER" CALL PLAYSHIFT(0) DO PAL 0 'V=RND(95) V=VS+RND(VD) OCTAVE0=V\12 NOTE0=(V MOD 12) CALL NOTESTRING(NOTE0,NOTE0$) 'INPUT "OCTAVE ";OCTAVE DO PLAY 0,V+1,10 INPUT "NOTE ";NOTE$ IF LEFT$(NOTE$,1)="P" THEN NO=0 N$= MID$(NOTE$,2,2) IF N$<>"" THEN AN=ASC(N$) ELSE AN=0 END IF IF N$="E#" THEN PAL 1 PRINT "E# DOESN'T EXIST" PAL 0 ELSE IF N$="B#" THEN PAL 1 PRINT "B# DOESN'T EXIST" PAL 0 ELSE IF AN>=ASC("A") AND AN<=ASC("G") THEN CALL STRINGNOTE(NO,N$) CALL PLAYSHIFT(NO) ELSE PAL 1 PRINT "ONLY THESE NOTES EXIST" 'PRINT "C,C#,D,D#,E,F,F#,G,G#,A,A#,B" PRINT " C# D# F# G# A#" PRINT " C D E F G A B" 'PRINT " " PAL 0 END IF ELSE EXIT END IF LOOP 'PAL 1+ABS(OCTAVE=OCTAVE0) 'PRINT OCTAVE0 PAL 1+ABS(NOTE$=NOTE0$) PRINT NOTE0$ 'PRINT V+1 LOOP SUB NOTESTRING(N0,N$) N=N0 IF N>=5 THEN INC N N1=((N\2)+2) N1=N1 MOD 7 S=N MOD 2 N$=CHR$(N1+ASC("A"))+CHR$(S*ASC("#")) END SUB SUB STRINGNOTE(N,V$) N$=LEFT$(V$,1) S$=RIGHT$(V$,1) N=(ASC(N$)-ASC("C"))*2 IF S$="#" THEN INC N END IF IF N>=6 THEN DEC N IF N<0 THEN ADD N,13 END SUB #1:MAIN PALETTES 003F2A1500302010000C0804003F3C00 003F2A15003F2A15003F2A15003F2A15