Posts: 22
Threads: 9
Joined: Mar 2004
Here's some question about the PLAY command
1. How do I make pauses between notes?
2. What is the difference betweeen play music in foreground or background, I can't here any difference? Maybe I type the command wrong how is it?
That's it I guess maybe I'll add some more later
Posts: 3,616
Threads: 287
Joined: Jan 2003
1) Use the "P" letter, followed by a number which represents number of quarternotes to pause for.
2) Foreground music, I believe, pauses your program and play the music. Background, however, starts playing, and moves on, so that the program runs while music is playing.
f only life let you press CTRL-Z.
--------------------------------------
Freebasic is like QB, except it doesn't suck.
Posts: 3,279
Threads: 170
Joined: Nov 2003
Only thing you gotta watch out for when it's set in the background is the PLAY buffer expiring...you have to fill it again when it's empty. I believe there is an event for that, but I haven't legitimately used PLAY since the old Monolith prototypes I wrote back in 1994...
I'd knock on wood, but my desk is particle board.
Posts: 6,419
Threads: 74
Joined: Mar 2002
ON PLAY stuff, I believe. I always disliked PLAY. Even for the speaker, there're better options (two channel, interlaced music anyone? ).
Trust me, don't use PLAY.
Hrm... I think I should go and code a Two-Channel tracker for the speaker. I had one, but I lost it.
EDIT: Aw, I found it:
Code: DECLARE SUB centra (y!, t$)
DECLARE SUB box (x1!, y1!, x2!, y2!)
TYPE canales
nota1 AS INTEGER
nota2 AS INTEGER
END TYPE
' nota? = n£mero de 0 a 60
paso = 0
DIM maxtrack AS INTEGER
maxtrack = 0
DIM tracks(99, 31) AS canales
DIM portapapeles(31) AS INTEGER
DIM nota$(11): RESTORE notas: FOR i = 0 TO 11: READ nota$(i): NEXT i
DIM pitch(11): RESTORE pitchs: FOR i = 0 TO 11: READ pitch(i): NEXT i
DIM tecla$(11): RESTORE teclas: FOR i = 0 TO 11: READ tecla$(i): NEXT i
FOR i = 0 TO 99: FOR j = 0 TO 31: tracks(i, j).nota1 = 0: tracks(i, j).nota2 = 0: NEXT j, i
SCREEN 0
WIDTH 40, 50
DEF SEG = &HB800
FOR i = 0 TO 4000 STEP 2
POKE i, 176
POKE i + 1, 7 * 16 + 1
NEXT i
DEF SEG
COLOR 15, 1
box 1, 1, 40, 3
COLOR 14, 1
centra 2, "BEEPER TRAKKER"
octava = 2
track = 0
posicion = 0
canal = 0
COLOR 15, 1
box 1, 5, 12, 38
FOR i = 0 TO 31
IF i MOD 8 = 0 THEN COLOR 15, 1 ELSE COLOR 7, 0
LOCATE 6 + i, 5: PRINT "..."
LOCATE 6 + i, 9: PRINT "..."
COLOR 15, 2: LOCATE 6 + i, 2: PRINT USING "##"; i
NEXT
GOSUB posiciones
COLOR 15, 1
box 3, 40, 37, 47
COLOR 14
LOCATE 41, 4
PRINT "+, - : Go Forw/Go Backw. track."
LOCATE 42, 4
PRINT "*, / : Incr./decr. octave."
COLOR 0, 3
box 12, 43, 28, 46
COLOR 7, 0
LOCATE 44, 15: PRINT "S": LOCATE 44, 17: PRINT "D"
LOCATE 44, 21: PRINT "G": LOCATE 44, 23: PRINT "H": LOCATE 44, 25: PRINT "J"
COLOR 0, 7
LOCATE 45, 14: PRINT "Z": LOCATE 45, 16: PRINT "X": LOCATE 45, 18: PRINT "C"
LOCATE 45, 20: PRINT "V": LOCATE 45, 22: PRINT "B"
LOCATE 45, 24: PRINT "N": LOCATE 45, 26: PRINT "M"
'centra 46, "By JLC - WOPR 99"
COLOR 15, 1
box 18, 20, 38, 38
COLOR 14
LOCATE 21, 19: PRINT "Wúú> Save song"
LOCATE 23, 19: PRINT "Eúú> Load song"
LOCATE 25, 19: PRINT "Rúú> Copy channel"
LOCATE 27, 19: PRINT "Túú> Paste channel"
LOCATE 29, 19: PRINT "Yúú> Erase channel"
LOCATE 31, 19: PRINT "ENT> Uú> track"
LOCATE 33, 19: PRINT "ESCúúú> Stop!"
LOCATE 35, 19: PRINT "0úú> Exit to DOS"
COLOR 10
LOCATE 37, 19: PRINT "->by JLC@WOPR2K'99!<-"
LOCATE 6 + posicion, 4 * canal + 4: COLOR 12, 0: PRINT ">"
DO
paso = NOT paso
IF paso THEN COLOR 10 ELSE COLOR 12
LOCATE 37, 19: PRINT "->"
LOCATE 37, 36: PRINT "<-"
k$ = INKEY$
GOSUB posiciones2
IF LEN(k$) = 1 THEN k$ = LCASE$(k$)
SELECT CASE k$
CASE CHR$(0) + "H" ' Arriba
LOCATE 6 + posicion, 4 * canal + 4: COLOR , 1: PRINT " "
posicion = posicion - 1: IF posicion = -1 THEN posicion = 31
LOCATE 6 + posicion, 4 * canal + 4: COLOR 12, 0: PRINT ">"
CASE CHR$(0) + "P"
LOCATE 6 + posicion, 4 * canal + 4: COLOR , 1: PRINT " "
posicion = (posicion + 1) MOD 32
LOCATE 6 + posicion, 4 * canal + 4: COLOR 12, 0: PRINT ">"
CASE CHR$(0) + "K"
LOCATE 6 + posicion, 4 * canal + 4: COLOR , 1: PRINT " "
canal = canal - 1: IF canal = -1 THEN canal = 1
LOCATE 6 + posicion, 4 * canal + 4: COLOR 12, 0: PRINT ">"
CASE CHR$(0) + "M"
LOCATE 6 + posicion, 4 * canal + 4: COLOR , 1: PRINT " "
canal = (canal + 1) MOD 2
LOCATE 6 + posicion, 4 * canal + 4: COLOR 12, 0: PRINT ">"
CASE "/"
octava = octava - 1: IF octava = 0 THEN octava = 6
CASE "*"
octava = octava + 1: IF octava = 7 THEN octava = 1
CASE "+"
IF track < 99 THEN
track = track + 1
GOSUB pintatrack
END IF
CASE "-"
IF track > 0 THEN
track = track - 1
GOSUB pintatrack
END IF
CASE "z", "s", "x", "d", "c", "v", "g", "b", "h", "n", "j", "m"
FOR ntecla = 0 TO 11
IF k$ = tecla$(ntecla) THEN EXIT FOR
NEXT ntecla
SOUND pitch(ntecla) * 2 ^ (octava - 2), 1
IF canal = 0 THEN
tracks(track, posicion).nota1 = 1 + 12 * octava + ntecla
ELSE
tracks(track, posicion).nota2 = 1 + 12 * octava + ntecla
END IF
GOSUB pintatrack
LOCATE 6 + posicion, 4 * canal + 4: COLOR , 1: PRINT " "
IF posicion < 31 THEN posicion = posicion + 1
LOCATE 6 + posicion, 4 * canal + 4: COLOR 12, 0: PRINT ">"
IF track > maxtrack THEN maxtrack = track
CASE "0": SYSTEM
CASE "w"
PCOPY 0, 1
LOCATE 48, 1: COLOR 14, 1: INPUT "¨NOMBRE"; n$
OPEN n$ FOR BINARY AS #1
PUT #1, , maxtrack
FOR i = 0 TO maxtrack
FOR j = 0 TO 31
PUT #1, , tracks(i, j)
NEXT j
NEXT i
CLOSE 1
PCOPY 1, 0
CASE "e"
PCOPY 0, 1
LOCATE 48, 1: COLOR 14, 1: INPUT "¨NOMBRE"; n$
OPEN n$ FOR BINARY AS #1
IF LOF(1) = 0 THEN
CLOSE #1
KILL n$
PLAY "o1c"
PCOPY 1, 0
ELSE
FOR i = 0 TO 99
FOR j = 0 TO 31
tracks(i, j).nota1 = 0
tracks(i, j).nota2 = 0
NEXT j, i
GET #1, , maxtrack
FOR i = 0 TO maxtrack
FOR j = 0 TO 31
GET #1, , tracks(i, j)
NEXT j
NEXT i
END IF
GOSUB pintatrack
CLOSE 1
CASE CHR$(13), "u" ' Tocar
FOR i = 0 TO 31
IF i MOD 8 = 0 THEN COLOR 15, 1 ELSE COLOR 7, 0
LOCATE 6 + i, 5: PRINT "..."
LOCATE 6 + i, 9: PRINT "..."
COLOR 15, 2: LOCATE 6 + i, 2: PRINT USING "##"; i
NEXT
remember = track
IF k$ = "u" THEN
inicio = track
fin = track
ELSE
inicio = 0
fin = maxtrack
END IF
DO
FOR i = inicio TO fin
track = i: GOSUB pintatrack
FOR j = 0 TO 31
COLOR 14, 1
LOCATE 6, 21: PRINT USING "TRACKúú##"; i
LOCATE 8, 21: PRINT USING "CANALúú##"; canal
LOCATE 10, 21: PRINT USING "OCTAVAú##"; octava
LOCATE 12, 21: PRINT USING "POSIC.ú##"; j
LOCATE 6 + j, 2: COLOR 15, 6: PRINT USING "##"; j
IF j = 0 THEN aj = 31 ELSE aj = j - 1
LOCATE 6 + aj, 2: COLOR 15, 2: PRINT USING "##"; aj
IF tracks(i, j).nota1 <> 0 THEN
oc1 = (tracks(i, j).nota1 - 1) \ 12
nt1 = (tracks(i, j).nota1 - 1) MOD 12
n1 = pitch(nt1) * 2 ^ (oc1 - 2)
ELSE
n1 = 0
END IF
IF tracks(i, j).nota2 <> 0 THEN
oc2 = (tracks(i, j).nota2 - 1) \ 12
nt2 = (tracks(i, j).nota2 - 1) MOD 12
n2 = pitch(nt2) * 2 ^ (oc2 - 2)
ELSE
n2 = 0
END IF
t = TIMER
DO
IF INKEY$ = CHR$(27) THEN track = remember: GOSUB pintatrack: GOTO alcarajo
IF n1 <> 0 THEN
SOUND n1, .5
END IF
IF n2 <> 0 THEN
SOUND n2, .5
END IF
LOOP WHILE t + .0625 > TIMER
NEXT j
NEXT i
LOOP
CASE "."
IF canal = 0 THEN
tracks(track, posicion).nota1 = 0
ELSE
tracks(track, posicion).nota2 = 0
END IF
GOSUB pintatrack
LOCATE 6 + posicion, 4 * canal + 4: COLOR , 1: PRINT " "
IF posicion < 31 THEN posicion = posicion + 1
LOCATE 6 + posicion, 4 * canal + 4: COLOR 12, 0: PRINT ">"
CASE "r"
FOR i = 0 TO 31
IF canal = 0 THEN
portapapeles(i) = tracks(track, i).nota1
ELSE
portapapeles(i) = tracks(track, i).nota2
END IF
NEXT i
CASE "t"
FOR i = 0 TO 31
IF canal = 0 THEN
tracks(track, i).nota1 = portapapeles(i)
ELSE
tracks(track, i).nota2 = portapapeles(i)
END IF
NEXT i
GOSUB pintatrack
CASE "y"
FOR i = 0 TO 31
IF canal = 0 THEN
tracks(track, i).nota1 = 0
ELSE
tracks(track, i).nota2 = 0
END IF
NEXT i
GOSUB pintatrack
END SELECT
alcarajo:
LOOP
END
posiciones:
COLOR 15, 1
box 20, 5, 30, 15
posiciones2:
COLOR 14, 1
LOCATE 6, 21: PRINT USING "TRACKúú##"; track
LOCATE 8, 21: PRINT USING "CANALúú##"; canal
LOCATE 10, 21: PRINT USING "OCTAVAú##"; octava
LOCATE 12, 21: PRINT USING "POSIC.ú##"; posicion
LOCATE 14, 21: PRINT USING "MAX.úúú##"; maxtrack
RETURN
pintatrack:
FOR ji = 0 TO 31
LOCATE 6 + ji, 5
IF ji MOD 8 = 0 THEN COLOR 15, 1 ELSE COLOR 7, 0
IF tracks(track, ji).nota1 = 0 THEN
PRINT "..."
ELSE
oct = (tracks(track, ji).nota1 - 1) \ 12
nt = (tracks(track, ji).nota1 - 1) MOD 12
PRINT USING "#"; oct; : PRINT nota$(nt)
END IF
LOCATE 6 + ji, 9
IF ji MOD 8 = 0 THEN COLOR 15, 1 ELSE COLOR 7, 0
IF tracks(track, ji).nota2 = 0 THEN
PRINT "..."
ELSE
oct = (tracks(track, ji).nota2 - 1) \ 12
nt = (tracks(track, ji).nota2 - 1) MOD 12
PRINT USING "#"; oct; : PRINT nota$(nt)
END IF
NEXT ji
RETURN
notas:
DATA " C","#C"," D","#D"," E"," F"
DATA "#F"," G","#G"," A","bB"," B"
pitchs:
DATA 262,277,294,310,330,349,370,392,415,440,465,494
teclas:
DATA "z", "s", "x", "d", "c", "v", "g", "b", "h", "n", "j", "m"
SUB box (x1, y1, x2, y2)
DEF SEG = &HB800
ancho = x2 - x1 - 1
alto = y2 - y1 - 1
LOCATE y1, x1: PRINT "Ã"; STRING$(ancho, "Ã"); "¿"
FOR n = y1 + 1 TO y2 - 1
LOCATE n, x1: PRINT "³"; SPACE$(ancho); "³"
IF (x2 < 80) THEN
POKE 80 * (n - 1) + 2 * x2 + 1, 8
END IF
NEXT
LOCATE y2, x1: PRINT "Ã"; STRING$(ancho, "Ã"); "Ã"
IF (x2 < 80) THEN
POKE 80 * (y2 - 1) + 2 * x2 + 1, 8
END IF
FOR i = x1 TO x2: POKE 80 * y2 + 2 * i + 1, 8: NEXT i
DEF SEG
END SUB
SUB centra (y, t$)
LOCATE y, 21 - LEN(t$) / 2: PRINT t$
END SUB
But it is so sucky that I'll end writing another one with comments and a special routine to play the tunes. And with arpeggio effects, of course
Aw I sucked at coding in 1999 !!!
|