DECLARE SUB SongPlayNote (num AS INTEGER) DECLARE SUB SongWrite (num AS INTEGER, ishigh AS INTEGER) DECLARE SUB AddNota (text AS STRING) DECLARE SUB GetSong (notas AS STRING) DECLARE SUB MenuSelect (num AS INTEGER) DECLARE SUB MenuLow (num AS INTEGER) DECLARE SUB MenuHigh (num AS INTEGER) DECLARE SUB Menu () DECLARE SUB MenuPrint (num AS INTEGER, ishigh AS INTEGER) DECLARE SUB Center (l AS INTEGER, text AS STRING) DECLARE SUB myplay (lista AS STRING) CONST songfname = "songs.txt" CONST MPrev = 1, MNext = 2, MReplay = 3, MStop = 4, MCont = 5, MAuto = 6, MGoTo = 7, MQuit = 8 CONST High = 1, Low = 0 TYPE tNote nota AS STRING * 1 oitava AS STRING * 1 duracao AS STRING * 2 sustenido AS STRING * 1 END TYPE DIM FilePos AS LONG DIM Title AS STRING DIM Song AS STRING DIM SHARED Notes(1 TO 49) AS tNote DIM SHARED NNotes AS INTEGER DIM CurNote AS INTEGER DIM Playing AS INTEGER DIM i AS INTEGER DIM Tecla AS STRING DIM togo AS STRING * 1 DIM Auto AS INTEGER OPEN songfname FOR INPUT AS #1 CLS LOCATE 1, 1 COLOR 15, 1 Center 1, "Siemens Key Notes Player" LOCATE 2, 1 COLOR 0, 7 PRINT SPACE$(80) LOCATE 2, 1 Menu Auto = 1 Tecla = "" PLAY "MF" DO WHILE Tecla <> "Q" AND Tecla <> CHR$(27) IF NOT EOF(1) THEN FilePos = SEEK(1) LINE INPUT #1, Title LINE INPUT #1, Song END IF COLOR 7, 0 FOR i = 4 TO 24 LOCATE i, 1 PRINT SPACE$(80); NEXT i COLOR 9, 0: Center 4, Title GetSong Song FOR i = 1 TO NNotes SongWrite i, Low NEXT i Playing = Auto CurNote = 1 DO IF Playing = 1 THEN i = CurNote - 1 IF (i < 1) THEN i = 1 SongWrite i, High SongPlayNote CurNote SongWrite i, Low CurNote = CurNote + 1 IF CurNote > NNotes THEN CurNote = 1 Playing = 0 END IF END IF Tecla = UCASE$(INKEY$) SELECT CASE Tecla CASE "P" IF FilePos > 1 THEN MenuSelect MPrev Playing = 0 i = 0 FilePos = FilePos - 1 DO WHILE FilePos > 0 AND i < 3 SEEK #1, FilePos IF INPUT$(1, #1) = CHR$(10) THEN i = i + 1 FilePos = FilePos - 1 LOOP IF FilePos = 0 THEN FilePos = 1: SEEK #1, FilePos EXIT DO END IF CASE "N", CHR$(13), " " MenuSelect MNext Playing = 0 EXIT DO CASE "R" MenuSelect MReplay CurNote = 1 Playing = 1 CASE "S" MenuSelect MStop Playing = 0 CASE "C" MenuSelect MCont Playing = 1 CASE "A" MenuSelect MAuto IF Auto = 1 THEN Auto = 0 ELSE Auto = 1 CASE "G" MenuSelect MGoTo LOCATE 20, 1 COLOR 7, 0 PRINT "Para que letra pretende ir? "; togo = UCASE$(INPUT$(1)) PRINT togo; IF (togo >= "A" AND togo <= "Z") OR (togo >= "0" AND togo <= "9") THEN Playing = 0 FilePos = 1 SEEK #1, 1 DO WHILE LEFT$(Title, 1) <> togo AND NOT EOF(1) FilePos = SEEK(1) LINE INPUT #1, Title LINE INPUT #1, Song LOOP SEEK #1, FilePos EXIT DO ELSE LOCATE 20, 1 PRINT SPACE$(80); END IF CASE "Q", CHR$(27) MenuSelect MQuit Playing = 0 END SELECT LOOP WHILE Tecla <> "Q" AND Tecla <> CHR$(27) LOOP CLOSE #1 SYSTEM SUB AddNota (substr AS STRING) DIM nota AS tNote nota.nota = LEFT$(substr, 1) IF nota.nota = "P" THEN nota.duracao = MID$(substr, 5, LEN(substr) - 5) ELSE IF MID$(substr, 2, 2) = "IS" THEN nota.oitava = MID$(substr, 4, 1) nota.duracao = MID$(substr, 8, LEN(substr) - 8) nota.sustenido = "#" ELSE nota.oitava = MID$(substr, 2, 1) nota.duracao = MID$(substr, 6, LEN(substr) - 6) nota.sustenido = " " END IF END IF Notes(NNotes) = nota END SUB SUB Center (l AS INTEGER, text AS STRING) DIM i AS INTEGER DIM c AS INTEGER i = LEN(text) IF (i >= 80) THEN c = 1 ELSE c = (80 - i) / 2 LOCATE l, 1: PRINT SPACE$(80); LOCATE l, c: PRINT text; END SUB SUB GetSong (notas AS STRING) DIM curpos AS INTEGER DIM begpos AS INTEGER DIM curchar AS STRING * 1 NNotes = 0 curpos = 1 DO WHILE curpos <= LEN(notas) AND NNotes < 50 curchar = MID$(notas, curpos, 1) IF curchar <> " " THEN begpos = curpos curpos = curpos + 1 DO curchar = MID$(notas, curpos, 1) curpos = curpos + 1 LOOP WHILE curpos <= LEN(notas) AND curchar <> " " AND curchar <> ")" IF curchar = " " THEN curpos = curpos - 1 NNotes = NNotes + 1 AddNota UCASE$(MID$(notas, begpos, curpos - begpos)) END IF curpos = curpos + 1 LOOP END SUB SUB Menu DIM i AS INTEGER FOR i = MPrev TO MQuit MenuLow i NEXT i END SUB SUB MenuHigh (num AS INTEGER) MenuPrint num, High END SUB SUB MenuLow (num AS INTEGER) MenuPrint num, Low END SUB SUB MenuPrint (num AS INTEGER, ishigh AS INTEGER) DIM text AS STRING SELECT CASE num CASE MPrev text = "Prev" CASE MNext text = "Next" CASE MReplay text = "Replay" CASE MStop text = "Stop" CASE MCont text = "Cont" CASE MAuto text = "Auto" CASE MGoTo text = "GoTo" CASE MQuit text = "Quit" END SELECT LOCATE 2, ((num - 1) * 10) + 1 IF ishigh = High THEN COLOR 7, 0: PRINT LEFT$(text, 1); COLOR 8: PRINT RIGHT$(text, LEN(text) - 1); ELSE COLOR 0, 7: PRINT LEFT$(text, 1); COLOR 8: PRINT RIGHT$(text, LEN(text) - 1); END IF END SUB SUB MenuSelect (num AS INTEGER) DIM i AS LONG DIM j AS LONG FOR j = 1 TO 4 MenuHigh num FOR i = 1 TO 220000: NEXT i MenuLow num FOR i = 1 TO 220000: NEXT i NEXT j END SUB SUB SongPlayNote (num AS INTEGER) DIM nota AS tNote DIM text AS STRING nota = Notes(num) IF nota.nota = "P" THEN text = "P" + RTRIM$(nota.duracao) ELSE IF nota.nota = "H" THEN nota.nota = "B" text = "O" + nota.oitava + "L" + nota.duracao + nota.nota IF nota.sustenido = "#" THEN text = text + "#" END IF PLAY text END SUB SUB SongWrite (num AS INTEGER, ishigh AS INTEGER) DIM text AS STRING DIM nota AS tNote DIM n AS INTEGER nota = Notes(num) n = num - 1 LOCATE 6 + (n \ 7), 2 + ((n MOD 7) * 11) IF ishigh = High THEN COLOR 7, 1 ELSE COLOR 7, 0 text = nota.nota IF nota.nota = "P" THEN text = "P(1/" + RTRIM$(nota.duracao) + ")" ELSE IF nota.sustenido = "#" THEN text = text + "is" text = text + nota.oitava + "(1/" + RTRIM$(nota.duracao) + ")" END IF PRINT text END SUB