home *** CD-ROM | disk | FTP | other *** search
- ' "Grids"
- ' by David Matthews
- ' freely distributable
- ' simple AmigaBasic pgm.
- ' have fun with sound waveshapes (timbre)
- ' and amplitude envelopes (ADSR...attack,decay,sustain,release)
-
-
-
-
- WINDOW 2,"TIMBRE",(60,53)-(600,186),6
- WINDOW 3,"ADSR" ,(330,0)-(630,49),6
- DEFINT a-z
- x = 0
-
- REM your tune here
- FOR t = 1 TO 5 : READ tune(t) : NEXT t
- DATA 261.63,293.66,233.47,116.73,174.61
-
- DIM smooth.timbre% (255)
- DIM timbre% (255)
- DIM adsr% (40)
- DIM smooth.adsr% (40)
-
- WINDOW OUTPUT 1
- PRINT "Click left mouse button to draw grid...."
- PRINT "Hold left button and drag to draw graph."
- PRINT "Drag off right edge to enter data......."
- PRINT "Press any key to hear it................"
-
- a$ = " mouse a graph from left to right "
- WINDOW OUTPUT 3
- PRINT : PRINT : PRINT
- PRINT a$
- WINDOW OUTPUT 2
- PRINT : PRINT : PRINT
- PRINT a$
-
-
- ON MOUSE GOSUB top
-
- WHILE 1
- GOSUB makeSound
- MOUSE ON
- WEND
-
-
- top:
- MOUSE OFF
- IF WINDOW(0) = 2 THEN GOSUB TIMBREtop
- IF WINDOW(0) = 3 THEN GOSUB ADSRtop
- RETURN
-
-
- TIMBREtop:
- WINDOW 2 : CLS
- GOSUB drawTIMBREgrid
- GOSUB initTIMBREarray
- x = MOUSE(1)
- GOSUB TIMBREmouse
- RETURN
-
- TIMBREmouse:
- IF MOUSE(0) = 0 THEN TIMBREmouse
- IF MOUSE(0) <> 0 THEN
- IF MOUSE(1) => 10 AND MOUSE(1) <= 521 THEN
- IF MOUSE(2) =< 125 AND MOUSE(2) => 1 THEN GOSUB TIMBREdot
- END IF
- END IF
- IF MOUSE(1) < 522 THEN TIMBREmouse
- GOSUB TIMBREread
- RETURN
-
- TIMBREdot:
- x = MOUSE(1) : y = MOUSE(2)
- n = INT ((x-10)/2 )
- timbre(n)=y
- PSET(x,y),3
- RETURN
-
- TIMBREread:
- FOR x = 10 TO 521 STEP 2
- y = ((x-10)\2)
- z = timbre(y) * 2 - 128
- IF z = -128 AND y > 0 THEN z = smooth.timbre(y-1)
- smooth.timbre(y) = z
- PSET (x,129),3
- NEXT x
- WAVE 0,smooth.timbre
- RETURN
-
- initTIMBREarray:
- FOR i = 0 TO 255
- timbre(i)=0
- NEXT i
- RETURN
-
- drawTIMBREgrid:
- x = 0 : y =1 : y1 = 126
- FOR i = 2 TO 59
- x = x + 9
- IF i = 31 THEN c = 1 ELSE c = 2
- LINE (x,y)-(x,y1),c
- NEXT i
- x = 10 : y= 1 : x1 = 521
- FOR i = 1 TO 26
- IF i = 13 THEN c = 1 ELSE c = 2
- LINE (x,y)-(x1,y),c
- y = y + 5
- NEXT i
- RETURN
-
-
- ADSRtop:
- WINDOW 3 : CLS
- GOSUB drawADSRgrid
- GOSUB initADSRarray
- x = MOUSE(1)
- GOSUB ADSRmouse
- RETURN
-
- ADSRmouse:
- IF MOUSE(0) = 0 THEN ADSRmouse
- IF MOUSE(0) <> 0 THEN
- IF MOUSE(1) => 20 AND MOUSE(1) <=260 THEN
- IF MOUSE(2) =< 40 AND MOUSE(2) => 1 THEN GOSUB ADSRdot
- END IF
- END IF
- IF MOUSE(1) < 261 THEN ADSRmouse
- GOSUB ADSRread
- RETURN
-
- ADSRdot:
- x = MOUSE(1) : y = MOUSE(2)
- n = INT ((x-20) / 6)
- adsr(n)=y
- PSET(x,y),3
- RETURN
-
- ADSRread:
- FOR x = 0 TO 39
- z = 240 - adsr(x) * 6
- IF z = 240 AND x > 0 THEN z = smooth.adsr(x-1)
- smooth.adsr(x) = z
- PSET ((x*6)+20,43),3
- NEXT
- RETURN
-
- drawADSRgrid:
- x = 10 : y =1 : y1 = 40
- FOR i = 1 TO 25
- x = x + 10
- IF i = 1 THEN c = 1 ELSE c = 2
- LINE (x,y)-(x,y1),c
- NEXT i
- x = 20 : y= 1 : x1 = 260
- FOR i = 1 TO 9
- IF i = 9 THEN c = 1 ELSE c = 2
- LINE (x,y)-(x1,y),c
- y = y + 5
- NEXT i
- RETURN
-
- initADSRarray:
- FOR i = 0 TO 39
- adsr(i)=0
- NEXT i
- RETURN
-
-
- makeSound:
- IF INKEY$ = "" THEN RETURN
- MOUSE OFF
- FOR t = 1 TO 5
- n = tune(t)
- FOR i = 0 TO 39
- SOUND n,.2,(smooth.adsr(i)),0
- NEXT i
- NEXT t
- RETURN
-
-