'=========================================================================== ' Subject: ELECTRONIC PIANO FOR PC SPEAKER Date: 09-27-98 (03:55) ' Author: Hensley Bass Code: QB, QBasic, PDS ' Origin: hbass@intnet.mu Packet: SOUND.ABC '=========================================================================== DECLARE SUB orgue () DECLARE SUB backdisplay (k!, l!, kinc!, linc!, fkol!, bkol!, bd$) DECLARE SUB instructiontouser () DECLARE SUB orguerestorediese (pn!, bck!) DECLARE SUB orguerestorenote (pn!, bck!) DECLARE SUB textbutton (x!, y!, xinc!, yinc!, gbbg!, bs!, ds!, typ$, tk!) DECLARE SUB orgueplay () 'ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ' ' ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ' ' ³ °±² ORGUE v1.0 ²±° ³ ' ' ÆÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ͵ ' ' ³ Electronic Piano for the pc-speaker ³ ' ' ³ Copyright (c)Hensley Bass March 1995 ³ ' ' ³ ³ ' ' ³ Author: Hensley Bass ³ ' ' ³ Email: hbass@intnet.mu ³ ' ' ³ Home Page: http//pages.intnet.mu/jhbpage ³ ' ³ ' ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ ' 'ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ' 'Note:- ' ' Runs under Qbasic, Quickbasic, vbdos and maybe other compatible ' ' environments. If you are using Quick basic type QB /L QB smpl_op.bas ' ' For VbDOS users type VBDOS /L VBDOS smpl_op.bas ' ' ' 'ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ' CLS CALL orgue COLOR 7, 0 CLS SUB backdisplay (k, l, kinc, linc, fkol, bkol, bd$) COLOR fkol, bkol FOR x = k TO k + kinc LOCATE x, l: PRINT STRING$(linc, bd$); NEXT END SUB SUB instructiontouser DEFINT C, L, R COLOR 7, 0 vb = 7 vc = 3 CALL backdisplay(1, 1, 23, 80, 0, 3, "Î") CALL textbutton(2, 4, 20, 74, vb, vb + 8, 0, "³", 4) CALL textbutton(4, 8, 15, 67, vc, vc + 8, 0, "³", 1) COLOR 15, vc LOCATE 5, 35: PRINT "Orgue v1.1" COLOR 0 LOCATE 7, 9: PRINT " From " + CHR$(34) + "z" + CHR$(34) + " to " + CHR$(34) + "," + CHR$(34); TAB(55); "FIRST OCTAVE." LOCATE 8, 9: PRINT " From " + CHR$(34) + "a" + CHR$(34) + " to " + CHR$(34) + "k" + CHR$(34); TAB(55); "SECOND OCTAVE." LOCATE 9, 9: PRINT " From " + CHR$(34) + "q" + CHR$(34) + " to " + CHR$(34) + "i" + CHR$(34); TAB(55); "THIRD OCTAVE." LOCATE 10, 9: PRINT " From " + CHR$(34) + "1" + CHR$(34) + " to " + CHR$(34) + "8" + CHR$(34); TAB(55); "FOURTH OCTAVE." LOCATE 11, 9: PRINT " From " + CHR$(34) + "8" + CHR$(34) + " to " + CHR$(34) + "F2" + CHR$(34); TAB(55); "FIFTH OCTAVE." LOCATE 12, 9: PRINT " Use the (SHIFT Key) to play a sharp note." LOCATE 13, 9: PRINT " Use the (Space bar) to cut off the sound." COLOR 0 LOCATE 15, 10 PRINT STRING$(62, 196) LOCATE 16, 13 PRINT "Author: Hensley Bass" LOCATE 17, 13 PRINT "Email: hbass@intnetmu" LOCATE 18, 13 PRINT "Homepage: http://pages.intnet.mu/jhbpage" COLOR 0, 7 LOCATE 25, 1: PRINT SPACE$(80); LOCATE 25, 30: PRINT "Press any key to play."; END SUB DEFSNG C, L, R SUB orgue DEFINT C, L, R instructiontouser DO LOOP WHILE INKEY$ = "" COLOR , 0 CLS PALETTE 1, 24: PALETTE 6, 14: PALETTE 3, 3: PALETTE 5, 24: PALETTE 4, 3 COLOR 6, 5 CLS orgueb = 3 orguea = 6 orguec = 0 CALL textbutton(2, 13, 9, 56, 5, orguec, orgueb, "³", 0): CALL textbutton(3, 15, 7, 52, 5, orgueb, orguec, "³", 0): COLOR orguea, 1 LOCATE 4, 23: PRINT " ÛÛÛÛ ÛÛ ÛÛÛ ÛÛÛ ÛÛ ÛÛ ÛÛ ÛÛÛÛ" LOCATE 5, 23: PRINT "ÛÛ ÛÛ ÛÛÛ ÛÛ ÛÛ ÛÛ ÛÛ ÛÛ ÛÛ ÛÛ" LOCATE 6, 23: PRINT "ÛÛ ÛÛ ÛÛ ÛÛ ÛÛ ÛÛ ÛÛ ÛÛÛÛÛÛ" LOCATE 7, 23: PRINT "ÛÛ ÛÛ ÛÛ ÛÛÛÛÛ ÛÛ ÛÛ ÛÛ " LOCATE 8, 23: PRINT " ÛÛÛÛ ÛÛ ÛÛ ÛÛÛ ÛÛ ÛÛÛÛÛ" LOCATE 9, 39: PRINT "ÛÛÛÛÛ" COLOR 6, 0 LOCATE 13, 5: PRINT " ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ " COLOR 12 LOCATE 13, 76: PRINT CHR$(22) COLOR 10 LOCATE 13, 74: PRINT CHR$(22) COLOR 4 LOCATE 14, 3: PRINT " ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ» " LOCATE 15, 3: PRINT " º"; : COLOR 15: PRINT " Û Û ÛÝÛ Û Û ÛÝÛ Û ÛÝÛ Û Û ÛÝÛ Û ÛÝÛ Û Û ÛÝÛ Û ÛÝÛ Û Û ÛÝÛ Û ÛÝÛ Û Û ÛÝÛ "; : COLOR 4: PRINT "º " LOCATE 16, 3: PRINT " º"; : COLOR 15: PRINT " Û Û ÛÝÛ Û Û ÛÝÛ Û ÛÝÛ Û Û ÛÝÛ Û ÛÝÛ Û Û ÛÝÛ Û ÛÝÛ Û Û ÛÝÛ Û ÛÝÛ Û Û ÛÝÛ "; : COLOR 4: PRINT "º " LOCATE 17, 3: PRINT " º"; : COLOR 15: PRINT " ÛÝÛÝÛÝÛÝÛÝÛÝÛÝÛÝÛÝÛÝÛÝÛÝÛÝÛÝÛÝÛÝÛÝÛÝÛÝÛÝÛÝÛÝÛÝÛÝÛÝÛÝÛÝÛÝÛÝÛÝÛÝÛÝÛÝÛÝÛÝÛÝ"; : COLOR 4: PRINT "º " LOCATE 18, 3: PRINT " º"; : COLOR 15: PRINT " ÛÝÛÝÛÝÛÝÛÝÛÝÛÝÛÝÛÝÛÝÛÝÛÝÛÝÛÝÛÝÛÝÛÝÛÝÛÝÛÝÛÝÛÝÛÝÛÝÛÝÛÝÛÝÛÝÛÝÛÝÛÝÛÝÛÝÛÝÛÝÛÝ"; : COLOR 4: PRINT "º " LOCATE 19, 3: PRINT " ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ " COLOR 6 LOCATE 20, 4: PRINT " "; STRING$(53, 223); " " FOR x = 1 TO 25 LOCATE x, 1: PRINT " "; NEXT CALL textbutton(22, 67, 2, 12, 5, orgueb, orguec, "³", 0): COLOR 6 LOCATE 23, 69: PRINT "F3: Exit"; COLOR 7, 0 CALL orgueplay END SUB DEFSNG C, L, R SUB orgueplay DEFINT C, L, R music = -1 sustain = -1 DO s = INP(&H60) IF s > 128 THEN IF s = t + 128 THEN t = 0: pc = -1 ELSE pc = 0 END IF stroke$ = INKEY$ SELECT CASE (stroke$) CASE "z", "Z" pn = 6: a$ = "o0c": GOSUB noteplayed CASE "x", "X" pn = 8: a$ = "o0d": GOSUB noteplayed CASE "c" pn = 10: a$ = "o0e": GOSUB noteplayed CASE "C" pn = 12: a$ = "o0f": GOSUB notetoplay CASE "v", "V" pn = 12: a$ = "o0f": GOSUB noteplayed CASE "b", "B" pn = 14: a$ = "o0g": GOSUB noteplayed CASE "n", "N" pn = 16: a$ = "o0a": GOSUB noteplayed CASE "m" pn = 18: a$ = "o0b": GOSUB noteplayed CASE "M" pn = 20: a$ = "o1c": GOSUB notetoplay CASE "<", "A" pn = 20: a$ = "o1c": GOSUB diese CASE ",", "a" pn = 20: a$ = "o1c": GOSUB noteplayed CASE ">", "S" pn = 22: a$ = "o1d": GOSUB diese CASE ".", "s" pn = 22: a$ = "o1d": GOSUB noteplayed CASE "/", "d" pn = 24: a$ = "o1e": GOSUB noteplayed CASE "D" pn = 26: a$ = "o1f": GOSUB notetoplay CASE "f", "?", "F" pn = 26: a$ = "o1f": GOSUB noteplayed CASE "g", "G" pn = 28: a$ = "o1g": GOSUB noteplayed CASE "h", "H" pn = 30: a$ = "o1a": GOSUB noteplayed CASE "j" pn = 32: a$ = "o1b": GOSUB noteplayed CASE "J" pn = 34: a$ = "o2c": GOSUB notetoplay CASE "k", "q", "K", "Q" pn = 34: a$ = "o2c": GOSUB noteplayed CASE "l", "w", "L", "W" pn = 36: a$ = "o2d": GOSUB noteplayed CASE ";", "e" pn = 38: a$ = "o2e": GOSUB noteplayed CASE "E" pn = 40: a$ = "o2f": GOSUB notetoplay CASE "'", "r", ":", "R" pn = 40: a$ = "o2f": GOSUB noteplayed CASE CHR$(34) pn = 40: a$ = "o2f": GOSUB diese CASE "t", "T" pn = 42: a$ = "o2g": GOSUB noteplayed CASE "y", "Y" pn = 44: a$ = "o2a": GOSUB noteplayed CASE "U" pn = 48: a$ = "o3C": GOSUB notetoplay CASE "u" pn = 46: a$ = "o2b": GOSUB noteplayed CASE "!" pn = 48: a$ = "o3c": GOSUB diese CASE "i", "1", "I" pn = 48: a$ = "o3c": GOSUB noteplayed CASE "@" pn = 50: a$ = "o3d": GOSUB diese CASE "o", "2", "O" pn = 50: a$ = "o3d": GOSUB noteplayed CASE "p", "3" pn = 52: a$ = "o3e": GOSUB noteplayed CASE "P" pn = 54: a$ = "o3f": GOSUB notetoplay CASE "{", "$" pn = 54: a$ = "o3f": GOSUB diese CASE "[", "4", "#" pn = 54: a$ = "o3f": GOSUB noteplayed CASE "]", "5" pn = 56: a$ = "o3g": GOSUB noteplayed CASE "}", "%" pn = 56: a$ = "o3g": GOSUB diese CASE "^" pn = 58: a$ = "o3a": GOSUB diese CASE "6" pn = 58: a$ = "o3a": GOSUB noteplayed CASE "7" pn = 60: a$ = "o3b": GOSUB noteplayed CASE "8", "&" pn = 62: a$ = "o4c": GOSUB noteplayed CASE "*" pn = 62: a$ = "o4c": GOSUB diese CASE "(" pn = 64: a$ = "o4d": GOSUB diese CASE "9" pn = 64: a$ = "o4d": GOSUB noteplayed CASE "0" pn = 66: a$ = "o4e": GOSUB noteplayed CASE "0" pn = 66: a$ = "o4e": GOSUB noteplayed CASE "_" pn = 68: a$ = "o4f": GOSUB diese CASE "-", ")" pn = 68: a$ = "o4f": GOSUB noteplayed CASE "+" pn = 70: a$ = "o4g": GOSUB diese CASE "=" pn = 70: a$ = "o4g": GOSUB noteplayed CASE "|" pn = 72: a$ = "o4a": GOSUB diese CASE "\" pn = 72: a$ = "o4a": GOSUB noteplayed CASE CHR$(0) + ";" pn = 74: a$ = "o4b": GOSUB noteplayed CASE CHR$(0) + "<", CHR$(0) + "T" pn = 76: a$ = "o5c": GOSUB noteplayed CASE CHR$(0) + "U" pn = 76: a$ = "o5c": GOSUB diese CASE "" IF INP(&H60) > 128 AND firsttime = -1 AND pc = -1 THEN CALL orguerestorenote(mn, 15) CALL orguerestorediese(mnd, 0) END IF IF TIMER - TIM > 1 AND firsttime = -1 THEN SOUND 100, 0: END IF IF sustain = 0 AND INP(&H60) > 128 AND TIMER - TIM > .4 THEN SOUND 100, 0: END IF CASE " " IF firsttime = -1 THEN CALL orguerestorenote(mn, 15) CALL orguerestorediese(mnd, 0) SOUND 100, 0 END IF END SELECT LOOP UNTIL stroke$ = CHR$(0) + "=" SOUND 100, 0 PLAY "mf" EXIT SUB noteplayed: IF ASC(stroke$) > 64 AND ASC(stroke$) < 91 THEN GOTO diese: notetoplay: IF s = t THEN TIM = TIMER: RETURN t = INP(&H60) IF firsttime = 0 THEN mn = pn: mnd = pn: firsttime = -1 CALL orguerestorediese(mnd, 0) CALL orguerestorenote(mn, 15) SOUND 100, 0 CALL orguerestorenote(pn, 7) IF music = -1 THEN PLAY "mbmlt32l1" + LEFT$(a$, 2) + STRING$(1, RIGHT$(a$, 1)) TIM = TIMER mn = pn RETURN diese: IF s = t THEN TIM = TIMER: RETURN t = INP(&H60) IF firsttime = 0 THEN mn = pn: mnd = pn: firsttime = -1 CALL orguerestorenote(mn, 15) CALL orguerestorediese(mnd, 0) SOUND 100, 0 a$ = a$ + "#" CALL orguerestorediese(pn, 6) IF music = -1 THEN PLAY "mbmlt32l1" + LEFT$(a$, 3) + RIGHT$(a$, 1) TIM = TIMER mnd = pn RETURN END SUB DEFSNG C, L, R SUB orguerestorediese (pn, bck) COLOR 15, bck LOCATE 15, pn + 1: PRINT CHR$(SCREEN(15, pn + 1)); LOCATE 16, pn + 1: PRINT CHR$(SCREEN(16, pn + 1)); END SUB SUB orguerestorenote (pn, bck) COLOR bck, 0 LOCATE 15, pn: PRINT CHR$(SCREEN(15, pn)); CHR$(SCREEN(15, pn + 1)); LOCATE 16, pn: PRINT CHR$(SCREEN(16, pn)); CHR$(SCREEN(16, pn + 1)); LOCATE 17, pn: PRINT CHR$(SCREEN(17, pn)); CHR$(SCREEN(17, pn + 1)); LOCATE 18, pn: PRINT CHR$(SCREEN(18, pn)); CHR$(SCREEN(18, pn + 1)); END SUB SUB textbutton (x, y, xinc, yinc, gbbg, bs, ds, typ$, tk) IF tk = 4 OR tk = 1 THEN thk$ = "ÿ" SELECT CASE typ$ CASE "³" ul$ = "Ú" uhoz$ = "Ä" lhoz$ = "Ä" ur$ = "¿" vert$ = "³" ll$ = "À" lr$ = "Ù" CASE "º" ul$ = "É" uhoz$ = "Í" lhoz$ = "Í" ur$ = "»" vert$ = "º" ll$ = "È" lr$ = "¼" CASE "Û" ul$ = "Û" uhoz$ = "ß" lhoz$ = "Ü" ur$ = "Û" vert$ = "Û" ll$ = "Û" lr$ = "Û" CASE "ÿ" ul$ = " " uhoz$ = " " lhoz$ = " " ur$ = " " vert$ = " " ll$ = " " lr$ = " " END SELECT SELECT CASE tk CASE 0, 1 COLOR bs, gbbg LOCATE x, y - tk: PRINT thk$ + ul$ + STRING$(yinc - 2, uhoz$); : COLOR ds: PRINT ur$; thk$ FOR hob = x + 1 TO x + xinc - 1 COLOR bs: LOCATE hob, y - tk: PRINT thk$; vert$; STRING$(yinc - 2, " "); COLOR ds: LOCATE hob, y + yinc - 1: PRINT vert$; thk$; NEXT COLOR bs LOCATE x + xinc, y - tk: PRINT thk$; ll$; : COLOR ds: PRINT STRING$(yinc - 2, lhoz$); : COLOR ds: PRINT lr$; thk$; IF typ$ = "Û" AND bs <> ds THEN COLOR bs, gbbg LOCATE x + xinc, y: PRINT "ß"; COLOR ds LOCATE x, y + yinc - 1: PRINT "Ü"; END IF CASE 2 COLOR bs, gbbg LOCATE x, y: PRINT thk$ + ul$ + STRING$(yinc - 2, uhoz$); : COLOR ds: PRINT ur$; thk$ FOR hob = x + 1 TO x + xinc - 1 COLOR bs, 2: LOCATE hob, y: PRINT thk$; vert$; COLOR ds: LOCATE hob, y + yinc - 1: PRINT vert$; thk$; : COLOR 8, 6: PRINT "°°"; NEXT COLOR bs, 2 LOCATE x + xinc, y: PRINT thk$; ll$; : COLOR ds: PRINT STRING$(yinc - 2, lhoz$); : COLOR ds: PRINT lr$; thk$; : : COLOR 8, 6: PRINT "°°"; LOCATE x + xinc + 1, y + 2: PRINT STRING$(yinc, "°"); CASE 3 COLOR bs, gbbg LOCATE x, y: PRINT thk$ + ul$ + STRING$(yinc - 2, uhoz$); : PRINT ur$; thk$ FOR hob = x + 1 TO x + xinc - 1 COLOR bs, gbbg: LOCATE hob, y: PRINT thk$; vert$; COLOR ds, gbbg: LOCATE hob, y + yinc - 1: PRINT vert$; thk$; NEXT LOCATE x + xinc, y: PRINT thk$; ll$; : PRINT STRING$(yinc - 2, lhoz$); : PRINT lr$; thk$; : : CASE 4 COLOR bs, gbbg LOCATE x, y: PRINT thk$ + ul$ + STRING$(yinc - 3, uhoz$); : COLOR ds: PRINT ur$; thk$ FOR hob = x + 1 TO x + xinc - 1 COLOR bs, gbbg: LOCATE hob, y: PRINT thk$; vert$; STRING$(yinc - 2, " "); COLOR ds, gbbg: LOCATE hob, y + yinc - 1: PRINT vert$; thk$; COLOR 8, 0: PRINT CHR$(SCREEN(CSRLIN, POS(0 + 1))); CHR$(SCREEN(CSRLIN, POS(0 + 2))); NEXT COLOR bs, gbbg LOCATE x + xinc, y: PRINT thk$; ll$; : COLOR ds: PRINT STRING$(yinc - 3, lhoz$); : COLOR ds: PRINT lr$; thk$; : COLOR 8, 0: PRINT CHR$(SCREEN(CSRLIN, POS(0 + 1))); CHR$(SCREEN(CSRLIN, POS(0 + 1))); FOR nm = y + 1 TO y + yinc + 1 LOCATE x + xinc + 1, nm + 1: PRINT CHR$(SCREEN(CSRLIN, POS(0 + 1))); NEXT IF typ$ = "Û" AND bs <> ds THEN COLOR bs, gbbg LOCATE x + xinc, y: PRINT "ß"; COLOR ds LOCATE x, y + yinc - 1: PRINT "Ü"; END IF CASE 5 COLOR bs, gbbg LOCATE x, y: PRINT thk$ + ul$ + STRING$(yinc - 2, uhoz$); : PRINT ur$; thk$ FOR hob = x + 1 TO x + xinc - 1 COLOR bs, gbbg: LOCATE hob, y: PRINT thk$; vert$; STRING$(yinc - 2, " "); COLOR ds, gbbg: LOCATE hob, y + yinc - 1: PRINT vert$; thk$; NEXT LOCATE x + xinc, y: PRINT thk$; ll$; : PRINT STRING$(yinc - 2, lhoz$); : PRINT lr$; thk$; : : END SELECT END SUB DEFDBL A-Z SUB timing (duration) TIM# = TIMER DO LOOP UNTIL (TIMER - TIM + 86400) - (INT((TIMER - TIM + 86400) / 86400) * 86400) > duration END SUB