10 REM **************
   20 REM   Music Star
   30 REM By Tim Surtell
   40 REM **************
   50 REM NC200 Version 2 : 12/96
   60 REM Downloaded from Tim's NC Users' Site
   70 REM http://www.ncus.org.uk
   80 REM Programming by Timothy Surtell
   90 CLS
  100 DIMinfo(7,200),indtit$(200),indart$(200),tit$(100),art$(100),f$(4):f$(1)="CD_IND.MS":f$(2)="TAP_IND.MS":f$(3)="RECS_IND.MS":f$(4)="RECA_IND.MS"
  110 PRINTTAB(0,1);:VDU27,14:PRINTTAB(2,1)CHR$17"Music Star"CHR$18
  120 MOVE0,108:DRAW479,108:MOVE80,108:DRAW80,127
  130 PRINTTAB(0,4)CHR$14" Track/Album title              Artiste(s)      Format Single/Album Side/Track  "CHR$15:MOVE0,95:DRAW0,7:DRAW479,7:DRAW479,95
  140 MOVE189,8:PLOT6,189,95:MOVE285,8:PLOT6,285,95:MOVE327,8:PLOT6,327,95:MOVE405,8:PLOT6,405,95
  150 PRINTTAB(15,1)"Version 2":TIME=0:REPEATUNTILTIME>75:PRINTTAB(15,1)"Programmed by Tim Surtell":TIME=0:REPEATUNTILTIME>75
  160 PRINTTAB(15,1)SPC30TAB(15,1)"Checking files..."
  170 ONERRORGOTO210
  180 N=0:I=1
  190 K=OPENIN(f$(I)):dummy=BGET#K:CLOSE#K
  200 N=N+1
  210 I=I+1:IF I<5 GOTO190
  220 IF N=0 PRINTTAB(15,1)"Creating new files...":FORI=1 TO 4:K=OPENOUT(f$(I)):CLOSE#K:NEXT
  230 PRINTTAB(15,1)"OPTIONS : (S)each the index  (A)dd to the index   (Q)uit         "
  240 ONERRORPROCERROR
  250 G$=GET$
  260 IFG$="S"PROCsearch:GOTO230
  270 IFG$="A"PROCadd:GOTO230
  280 IFG$="Q"CLS:PRINT"Thanks for using MUSICSTAR..."':END
  290 GOTO250
  300 DEF PROCformat
  310 PRINTTAB(15,1)"SEARCH FOR : (C)D's  (T)ape  (R)ecord  (S)ingles  (A)lbums       "
  320 G$=GET$
  330 IFG$="C"serfor=1:file$="1":ENDPROC
  340 IFG$="T"serfor=2:file$="2":ENDPROC
  350 IFG$="R"serfor=4:file$="34":ENDPROC
  360 IFG$="S"serfor=32:PROCfile:ENDPROC 
  370 IFG$="A"serfor=64:PROCfile:ENDPROC
  380 GOTO320
  390 DEF PROCfile
  400 PRINTTAB(15,1)"SEARCH IN : (C)D's  (T)apes  (R)ecords  (A)ll                    "
  410 G$=GET$
  420 IFG$="C"file$="1":ENDPROC
  430 IFG$="T"file$="2":ENDPROC
  440 IFG$="R"ANDserfor=32 file$="3":ENDPROC
  450 IFG$="R"ANDserfor=64 file$="4":ENDPROC
  460 IFG$="R"ANDserfor=0 file$="34":ENDPROC
  470 IFG$="A"ANDserfor=32 file$="123":ENDPROC
  480 IFG$="A"ANDserfor=64 file$="124":ENDPROC
  490 IFG$="A"ANDserfor=0 file$="1234":ENDPROC
  500 GOTO410
  510 DEF PROCscroll1
  520 n=5
  530 FORI=sy TOsy+9
  540   IFI>INFO PRINTTAB(1,n)SPC30TAB(32,n)SPC15TAB(48,n)SPC6TAB(55,n)SPC6TAB(68,n)SPC6:GOTO640
  550   PRINTTAB(1,n)SPC30
  560   IFshow=FALSE ANDLEN(indtit$(I))>30PRINTTAB(1,n)LEFT$(indtit$(I),28);" ";:VDU27,16ELSEIFshow=FALSE PRINTTAB(1,n)indtit$(I)
  570   IFshow=TRUE ANDLEN(indtit$(I))>30 PRINTTAB(1,n);:VDU27,17:PRINT" ";RIGHT$(indtit$(I),28)ELSEIFshow=TRUE PRINTTAB(1,n)indtit$(I)
  580   PRINTTAB(32,n)SPC15
  590   IFshow=FALSE ANDLEN(indart$(I))>15PRINTTAB(32,n)LEFT$(indart$(I),13);" ";:VDU27,16ELSEIFshow=FALSE PRINTTAB(32,n)indart$(I)
  600   IFshow=TRUE ANDLEN(indart$(I))>15PRINTTAB(32,n);:VDU27,17:PRINT" ";RIGHT$(indart$(I),13)ELSEIFshow=TRUE PRINTTAB(32,n)indart$(I)
  610   IFinfo(1,I)AND1PRINTTAB(48,n)"CD    "ELSEIFinfo(1,I)AND2PRINTTAB(48,n)"TAPE  "ELSEPRINTTAB(48,n)"RECORD"
  620   IFinfo(1,I)AND64PRINTTAB(55,n)"Album "ELSEPRINTTAB(55,n)"Single"
  630   IFinfo(6,I)=0PRINTTAB(68,n)SPC10TAB(68,n)CHR$17;info(2,I)*info(3,I)CHR$18 ELSE PRINTTAB(68,n)SPC10TAB(68,n);info(6,I)" / ";info(7,I)
  640   n=n+1
  650 NEXT
  660 ENDPROC
  670 DEF PROCscroll2
  680 n=5
  690 FORI=sy TOsy+9
  700   PRINTTAB(1,n)SPC30TAB(32,n)SPC15TAB(48,n)SPC6TAB(55,n)SPC6TAB(68,n)SPC10
  710   IFI>trklist GOTO820
  720   IFINSTR(tit$(I),sertit$)ORINSTR(art$(I),serart$)VDU17
  730   IFshow=FALSE ANDLEN(tit$(I))>30PRINTTAB(1,n)LEFT$(tit$(I),28);" ";:VDU27,16ELSEIFshow=FALSE PRINTTAB(1,n)tit$(I)
  740   IFshow=TRUE ANDLEN(tit$(I))>30PRINTTAB(1,n);:VDU27,17:PRINT" ";RIGHT$(tit$(I),28)ELSEIFshow=TRUE PRINTTAB(1,n)tit$(I)
  750   PRINTTAB(32,n)SPC15
  760   IFshow=FALSE ANDLEN(art$(I))>15PRINTTAB(32,n)LEFT$(art$(I),13);" ";:VDU27,16ELSEIFshow=FALSE PRINTTAB(32,n)art$(I)
  770   IFshow=TRUE ANDLEN(art$(I))>15PRINTTAB(32,n);:VDU27,17:PRINT" ";RIGHT$(art$(I),13)ELSEIFshow=TRUE PRINTTAB(32,n)art$(I)
  780   IFinfo(1,musnum)AND1PRINTTAB(48,n)"CD    "ELSEIFinfo(1,musnum)AND2PRINTTAB(48,n)"TAPE  "ELSEPRINTTAB(48,n)"RECORD"
  790   IFinfo(1,musnum)AND64PRINTTAB(55,n)"Album "ELSEPRINTTAB(55,n)"Single"
  800   PRINTTAB(68,n)SPC10TAB(68,n);((I-1)DIVinfo(3,musnum))+1;" / ";((I-1)MODinfo(3,musnum))+1
  810   IFINSTR(tit$(I),sertit$)ORINSTR(art$(I),serart$)VDU18
  820   n=n+1
  830 NEXT
  840 ENDPROC
  850 DEF PROCsearch
  860 PRINTTAB(15,1)"SEARCH BY : (T)itle  (A)rtist  (F)ormat   (Q)uit                "
  870 sertit$="":serart$="":serfor=0
  880 G$=GET$
  890 IFG$="T"PRINTTAB(15,1)SPC65TAB(15,1)"SEARCH BY TITLE FOR ";:INPUTLINEsertit$:PROCfile:GOTO940
  900 IFG$="A"PRINTTAB(15,1)SPC65TAB(15,1)"SEARCH BY ARTIST FOR ";:INPUTLINEserart$:PROCfile:GOTO940
  910 IFG$="F"PROCformat:GOTO940
  920 IFG$="Q"GOTO230
  930 GOTO880
  940 INFO=1
  950 PRINTTAB(1,3)SPC65TAB(1,3)"Searching for ";CHR$17;
  960 IFserfor=1PRINT"CD's";ELSEIFserfor=2PRINT"Tapes";ELSEIFserfor=4PRINT"Records";ELSEIFserfor=32PRINT"Singles";ELSEIFserfor=64PRINT"Albums";
  970 IFsertit$<>""PRINTsertit$;ELSE IFserart$<>""PRINTserart$;
  980 PRINTCHR$18;"..."
  990 PRINTTAB(50,3)"Searching...":FORI=1TO200:info(6,I)=0:NEXT
 1000 fpos=1
 1010 REPEAT
 1020   K=OPENIN(f$(VAL(MID$(file$,fpos,1))))
 1030   IF  EOF#K GOTO1160
 1040   PRINTTAB(50,3)f$(VAL(MID$(file$,fpos,1)));"   "
 1050   REPEAT
 1060     info(1,INFO)=BGET#K:info(2,INFO)=BGET#K:info(3,INFO)=BGET#K
 1070     info(4,INFO)=PTR#K:info(5,INFO)=VAL(MID$(file$,fpos,1))
 1080     loop=info(2,INFO)*info(3,INFO)
 1090     IF sertit$<>"" OR serart$<>"" PROCsertitart:GOTO1140
 1100     IFinfo(1,INFO)AND32PROCsingle
 1110     IFinfo(1,INFO)AND64PROCalbum
 1120     FORI=1TOloop:INPUT#K,dummy$:NEXT
 1130     IFinfo(1,INFO)ANDserfor INFO=INFO+1
 1140     MOVE403,99:PLOT102,405,101:PRINTTAB(68,3)SPC12TAB(68,3)"Matched ";CHR$17;INFO-1;CHR$18
 1150   UNTILEOF#K
 1160   CLOSE#0
 1170   fpos=fpos+1
 1180 UNTILfpos=LEN(file$)+1
 1190 INFO=INFO-1
 1200 tottrk=0:FORI=1TOINFO:tottrk=tottrk+(info(2,I)*info(3,I)):NEXT
 1210 IFINFO=0PRINTTAB(1,3)SPC65:ENDPROC
 1220 trklist=0:musnum=0:ay=1:sy=1:gy=80
 1230 IFtrklist=0PRINTTAB(15,1)"OPTIONS : (Up/Down) scroll  (ENTER) track list  (S)ort   (Q)uit  ":PRINTTAB(1,3)SPC67TAB(1,3);CHR$17;:GOTO1270
 1240 PRINTTAB(15,1)"OPTIONS : (Up/Down) scroll  (ENTER) return to list   (Q)uit      ":PRINTTAB(1,3)SPC67TAB(1,3)"Track list : '"CHR$17;
 1250 IFinfo(1,musnum)AND64PRINTatit$CHR$18"'"ELSEPRINTindtit$(musnum)CHR$18"'"
 1260 GOTO1310
 1270 IFserfor=1PRINT"CD";ELSEIFserfor=2PRINT"Tape";ELSEIFserfor=4PRINT"Record";ELSEIFserfor=32PRINT"Singles";ELSEIFserfor=64PRINT"Albums";
 1280 IFserfor>0PRINTCHR$18" catalogue :";
 1290 IFsertit$<>""PRINTCHR$18"Items matching '";CHR$17sertit$CHR$18;"'";ELSEIFserart$<>""PRINTCHR$18"Items matching '";CHR$17serart$CHR$18;"'";
 1300 IFserfor>0PRINT;"    (";tottrk;" tracks)"
 1310 show=FALSE:IFtrklist=0PROCscroll1 ELSEay=1:sy=1:gy=80:PROCscroll2
 1320 MOVE1,gy:PLOT102,478,gy+7
 1330 G=GET
 1340 MOVE1,gy:PLOT102,478,gy+7
 1350 IFtrklist=0ANDG=240ANDgy<80ay=ay-1:gy=gy+8:GOTO1590
 1360 IFtrklist=0ANDG=241ANDgy>8ANDay<INFO ay=ay+1:gy=gy-8:GOTO1590
 1370 IFtrklist=0ANDG=240ANDgy=80ANDay>1sy=sy-1:ay=ay-1:PROCscroll1:GOTO1590
 1380 IFtrklist=0ANDG=241ANDgy=8ANDay<INFO sy=sy+1:ay=ay+1:PROCscroll1:GOTO1590
 1390 IFtrklist>0ANDG=240ANDgy<80ay=ay-1:gy=gy+8:GOTO1590
 1400 IFtrklist>0ANDG=241ANDgy>8ANDay<trklist ay=ay+1:gy=gy-8:GOTO1590
 1410 IFtrklist>0ANDG=240ANDgy=80ANDay>1sy=sy-1:ay=ay-1:PROCscroll2:GOTO1590
 1420 IFtrklist>0ANDG=241ANDgy=8ANDay<trklist sy=sy+1:ay=ay+1:PROCscroll2:GOTO1590
 1430 IFtrklist=0ANDG=248ANDsy>10sy=sy-10:ay=ay-10:PROCscroll1:GOTO1590
 1440 IFtrklist=0ANDG=248ANDsy<10sy=1:ay=1:gy=80:PROCscroll1:GOTO1590
 1450 IFtrklist=0ANDG=249ANDsy+10<INFO sy=sy+10:ay=ay+10:PROCscroll1:GOTO1590
 1460 IFtrklist=0ANDG=249ANDsy+10>=INFO sy=INFO:ay=INFO:gy=80:PROCscroll1:GOTO1590
 1470 IFtrklist>0ANDG=248ANDsy>10sy=sy-10:ay=ay-10:PROCscroll2:GOTO1590
 1480 IFtrklist>0ANDG=248ANDsy<10sy=1:ay=1:gy=80:PROCscroll2:GOTO1590
 1490 IFtrklist>0ANDG=249ANDsy+10<trklist sy=sy+10:ay=ay+10:PROCscroll2:GOTO1590
 1500 IFtrklist>0ANDG=249ANDsy+10>=trklist sy=trklist:ay=trklist:gy=80:PROCscroll2:GOTO1590
 1510 IFG=81ENDPROC
 1520 IFG=13ANDtrklist=0ANDay<=INFO day=ay:dsy=sy:dgy=gy:trklist=info(2,ay)*info(3,ay):musnum=ay:PROCload:GOTO1230
 1530 IFG=13ANDtrklist>0ay=day:sy=dsy:gy=dgy:trklist=0:GOTO1230
 1540 IFG=242ANDtrklist=0show=FALSE:PROCscroll1
 1550 IFG=242ANDtrklist>0show=FALSE:PROCscroll2
 1560 IFG=243ANDtrklist=0show=TRUE:PROCscroll1
 1570 IFG=243ANDtrklist>0show=TRUE:PROCscroll2
 1580 IFG=83ANDtrklist=0PROCsort:PROCscroll1:GOTO1590
 1590 GOTO1320
 1600 END
 1610 DEF PROCsingle
 1620 info(6,INFO)=1:info(7,INFO)=1
 1630 IFinfo(1,INFO)AND8INPUT#K,indart$(INFO),indtit$(INFO):loop=loop-1:ENDPROC
 1640 INPUT#K,indtit$(INFO),indart$(INFO):loop=loop*2-1:ENDPROC
 1650 DEF PROCalbum
 1660 IFinfo(1,INFO)AND8INPUT#K,indtit$(INFO),indart$(INFO):ENDPROC
 1670 INPUT#K,indtit$(INFO):indart$(INFO)="Various":loop=loop*2:ENDPROC
 1680 DEF PROCsertitart
 1690 indart$(INFO)="":indtit$(INFO)=""
 1700 IFinfo(1,INFO)AND32GOTO1730
 1710 IFinfo(1,INFO)AND8INPUT#K,indtit$(INFO),indart$(INFO):GOTO1740
 1720 IFinfo(1,INFO)AND16INPUT#K,indtit$(INFO):indart$(INFO)="Various":GOTO1740
 1730 IFinfo(1,INFO)AND8INPUT#K,indart$(INFO)
 1740 art$=indart$(INFO)
 1750 IFINSTR(indtit$(INFO),sertit$)INFO=INFO+1:FORJ=1TO5:info(J,INFO)=info(J,INFO-1):NEXT
 1760 IFsertit$<>""GOTO1790
 1770 IFinfo(1,INFO)AND8IFinfo(1,INFO)AND32GOTO1790
 1780 IFINSTR(indart$(INFO),serart$)INFO=INFO+1:FORJ=1TO5:info(J,INFO)=info(J,INFO-1):NEXT:GOTO1870
 1790 FORI=1TOinfo(2,INFO)
 1800   FORA=1TOinfo(3,INFO)
 1810     IFinfo(1,INFO)AND8INPUT#K,indtit$(INFO):indart$(INFO)=art$ ELSEINPUT#K,indtit$(INFO),indart$(INFO)
 1820     IFINSTR(indtit$(INFO),sertit$)info(6,INFO)=I:info(7,INFO)=A:INFO=INFO+1:FORJ=1 TO 5:info(J,INFO)=info(J,INFO-1):NEXT
 1830     IFINSTR(indart$(INFO),serart$)info(6,INFO)=I:info(7,INFO)=A:INFO=INFO+1:FORJ=1 TO 5:info(J,INFO)=info(J,INFO-1):NEXT
 1840   NEXT
 1850 NEXT
 1860 ENDPROC
 1870 IFinfo(1,INFO-1)AND16loop=loop*2
 1880 FORI=1TOloop:INPUT#K,dummy$:NEXT
 1890 ENDPROC
 1900 DEF PROCsinalb
 1910 DEF PROCload
 1920 PRINTTAB(50,3)"Loading..."
 1930 K=OPENIN(f$(info(5,musnum)))
 1940 PTR#K=info(4,musnum)
 1950 IFinfo(1,musnum)AND32GOTO1970
 1960 INPUT#K,atit$
 1970 IFinfo(1,musnum)AND8INPUT#K,dummy$
 1980 FORI=1TOtrklist
 1990   IFinfo(1,musnum)AND16INPUT#K,tit$(I),art$(I)ELSEINPUT#K,tit$(I):art$(I)=indart$(musnum)
 2000 NEXT
 2010 CLOSE#0
 2020 PRINTTAB(50,3)SPC10
 2030 ENDPROC
 2040 DEF PROCsort
 2050 PRINTTAB(15,1)"SORT BY : (T)itle  (A)rtist   (Q)uit                             "
 2060 G$=GET$
 2070 IFG$="A"titart=1:GOTO2110
 2080 IFG$="T"titart=2:GOTO2110
 2090 IFG$="Q"ENDPROC
 2100 GOTO2060
 2110 PRINTTAB(50,3)"Sorting..."
 2120 E%=LOG(INFO)/LOG(2)
 2130 F%=2^E%
 2140 FORG%=1TOE%
 2150   F%=F%/2:M%=INFO-F%
 2160   REPEAT:C%=0
 2170     FORN%=1TOM%
 2180       IFtitart=1ANDASC(LEFT$(indart$(N%),1))>ASC(LEFT$(indart$(N%+F%),1))PROCswop:C%=1
 2190       IFtitart=2ANDASC(LEFT$(indtit$(N%),1))>ASC(LEFT$(indtit$(N%+F%),1))PROCswop:C%=1
 2200     NEXT
 2210     M%=M%-1
 2220   UNTILC%=0
 2230 NEXT
 2240 PRINTTAB(50,3)SPC10
 2250 ENDPROC
 2260 DEF PROCswop
 2270 FORI=1TO7:info(I,0)=info(I,N%):info(I,N%)=info(I,N%+F%):info(I,N%+F%)=info(I,0):NEXT
 2280 tit$=indtit$(N%):indtit$(N%)=indtit$(N%+F%):indtit$(N%+F%)=tit$
 2290 art$=indart$(N%):indart$(N%)=indart$(N%+F%):indart$(N%+F%)=art$
 2300 ENDPROC
 2310 DEF PROCadd
 2320 INFO=1
 2330 info(1,0)=0:PRINTTAB(15,1)"FORMAT/FILE : (C)D  (T)ape  (S)ingle record  (A)lbum record"
 2340 G$=GET$
 2350 IFG$="C"info(1,0)=info(1,0)+1:file=1:GOTO2400
 2360 IFG$="T"info(1,0)=info(1,0)+2:file=2:GOTO2400
 2370 IFG$="S"info(1,0)=info(1,0)+4:file=3:GOTO2400
 2380 IFG$="A"info(1,0)=info(1,0)+4:file=4:GOTO2400
 2390 GOTO2340
 2400 PRINTTAB(15,1)"TYPE : (A)lbum  (S)ingle                                        "
 2410 G$=GET$
 2420 IFG$="A"info(1,0)=info(1,0)+64:GOTO2450
 2430 IFG$="S"info(1,0)=info(1,0)+32:GOTO2450
 2440 GOTO2410
 2450 PRINTTAB(15,1)"ARTISTS : (O)ne artist  (C)ompilation                           "
 2460 G$=GET$
 2470 IFG$="O"info(1,0)=info(1,0)+8:GOTO2500
 2480 IFG$="C"info(1,0)=info(1,0)+16:GOTO2500
 2490 GOTO2460
 2500 PRINTTAB(15,1)SPC65TAB(15,1)"NUMBER OF SIDES ";:INPUTinfo(2,0)
 2510 PRINTTAB(15,1)SPC65TAB(15,1)"NUMBER OF TRACKS PER SIDE ";:INPUTinfo(3,0)
 2520 IFinfo(1,0)AND64PRINTTAB(15,1)SPC65TAB(15,1)"Album name ";:INPUTLINEindtit$(0)
 2530 IFinfo(1,0)AND8PRINTTAB(15,1)SPC65TAB(15,1)"Artiste's name ";:INPUTLINEindart$(0)
 2540 FORI=1TOinfo(2,0)
 2550   FORA=1TOinfo(3,0)
 2560     PRINTTAB(15,1)SPC65TAB(15,1)"Side ";I;"/Track ";A;" Title ";:INPUTLINEindtit$(INFO)
 2570     PRINTTAB(0,2)SPC80:MOVE0,108:DRAW479,108:MOVE80,108:DRAW80,127
 2580     IFinfo(1,0)AND16PRINTTAB(15,1)SPC65TAB(15,1)"Side ";I;"/Track ";A;" Artiste ";:INPUTLINEindart$(INFO)
 2590     INFO=INFO+1
 2600   NEXT
 2610 NEXT
 2620 INFO=1
 2630 PRINTTAB(50,3)"Saving index..."
 2640 ONERRORCLOSE#0:K=OPENOUT(f$(file)):GOTO2680
 2650 K=OPENUP(f$(file))
 2660 IF EOF#K GOTO2680
 2670 REPEAT:dummy=BGET#K:UNTILEOF#K
 2680 ONERRORCLOSE#0:END
 2690 BPUT#K,info(1,0):BPUT#K,info(2,0):BPUT#K,info(3,0)
 2700 IFinfo(1,0)AND64PRINT#K,indtit$(0)
 2710 IFinfo(1,0)AND8PRINT#K,indart$(0)
 2720 FORA=1TOinfo(2,0)
 2730   FORJ=1TOinfo(3,0)
 2740     PRINT#K,indtit$(INFO)
 2750     IFinfo(1,0)AND16PRINT#K,indart$(INFO)
 2760     INFO=INFO+1
 2770   NEXT
 2780 NEXT
 2790 CLOSE#0
 2800 PRINTTAB(50,3)SPC15
 2810 ENDPROC
 2820 DEF PROCERROR
 2830 IFERR<>222 CLS:PRINT"An error has occured...Program aborted."''"* Type RUN and press ENTER to re-start the program...":END
 2840 CLS:PRINT"The file '";f$(VAL(MID$(file$,fpos,1)));"' is not in the memory."''"Either load this file from disk now and re-run the program (press FUNCTION-L),"'"or press any other key to re-run the program...":G=GET:RUN