home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD1.mdf / basic / library / qb_pds / sound / tandysnd / complex.bas next >
Encoding:
BASIC Source File  |  1991-12-28  |  3.5 KB  |  168 lines

  1. 'This QuickBASIC 4.5 program contains subroutines that control Tandy's
  2. 'sn76496n complex sound generator. Refer to COMPLEX.DOC for more information.
  3. 'By Rich Geldreich December 27, 1991
  4. 'Of course, if you don't have a Tandy 1000 this program won't do anything!
  5. DEFINT A-Z
  6.  
  7. DECLARE SUB Volume (Channel, Amplitude)
  8. DECLARE SUB NoiseSet (Shift, FB)
  9. DECLARE SUB SoundOff ()
  10. DECLARE SUB SoundOn ()
  11. DECLARE SUB Tone (Channel, Count)
  12. DECLARE FUNCTION GetFrequency (Hertz)
  13.  
  14. 'Here are some examples...
  15. SoundOn
  16.  
  17. Volume 1, 0
  18. Volume 2, 0
  19. Volume 3, 0
  20.  
  21. Tone 1, 1000
  22. Tone 2, 2000
  23. Tone 3, 3000
  24. FOR Times = 1 TO 10
  25.     FOR A = 1 TO 3
  26.         FOR B = 0 TO 1023
  27.             Tone A, B
  28.         NEXT
  29.         Tone A, RND * 1000
  30.     NEXT
  31. NEXT
  32. FOR A = 0 TO 15
  33.     FOR B = 1 TO 3
  34.         Volume B, A
  35.     NEXT
  36.     FOR C = 1 TO 3000: NEXT
  37. NEXT
  38.  
  39. NoiseSet 3, 1
  40. Volume 3, 0
  41. Volume 4, 0
  42. FOR Times = 1 TO 10
  43.     FOR A = 0 TO 130
  44.         Tone 3, A
  45.         FOR B = 1 TO 150: NEXT
  46.     NEXT
  47. NEXT
  48. FOR A = 0 TO 15
  49.     FOR B = 3 TO 4
  50.         Volume B, A
  51.     NEXT
  52.     FOR C = 1 TO 3000: NEXT
  53. NEXT
  54. Volume 1, 0
  55. Volume 2, 2
  56. Volume 3, 2
  57. Volume 4, 0
  58. FOR A = 1023 TO 0 STEP -1
  59.     Tone 1, A
  60.     Tone 2, RND * 1000
  61.     Tone 3, RND * 1000
  62.     FOR C = 1 TO 500: NEXT
  63. NEXT
  64.  
  65. SLEEP 1
  66.  
  67. FOR A = 0 TO 15
  68.     FOR B = 1 TO 4
  69.         Volume B, A
  70.     NEXT
  71.     FOR C = 1 TO 3000: NEXT
  72. NEXT
  73.  
  74. Tone 3, 33
  75. NoiseSet 3, 1
  76. FOR Times = 1 TO 7
  77.     FOR A = 12 TO 0 STEP -1
  78.         Volume 4, A
  79.         FOR B = 1 TO 8000: NEXT
  80.     NEXT
  81.     FOR A = 1 TO 4000: NEXT
  82.     FOR A = 0 TO 12
  83.         Volume 4, A
  84.         FOR B = 1 TO 8400: NEXT
  85.     NEXT
  86. NEXT
  87.  
  88. D = 1
  89. FOR A = 0 TO 2000
  90.     IF A < 16 THEN Volume 4, 15 - A: FOR B = 1 TO 800: NEXT
  91.     IF A > 1984 THEN Volume 4, A - 1985: FOR B = 1 TO 1000: NEXT
  92.     Tone 3, 512 + 511 * SIN(F!): F! = F! + D / 57.29577
  93.     IF F! > 360 / 57.29577 THEN D = D + 1: F! = 0
  94.     FOR B = 1 TO 200: NEXT
  95. NEXT
  96. Volume 1, 0
  97. Volume 2, 15
  98. Tone 1, 123
  99. D! = 1: R = 0
  100. DO
  101.     FOR A = 1 TO R: NEXT
  102.     Volume 1, 15
  103.     FOR A = 1 TO R: NEXT
  104.     Volume 1, 0
  105.     R = (R + 1) MOD D!: D! = D! + .01
  106. LOOP UNTIL D! > 100
  107. FOR A = 0 TO 15
  108.     Volume 1, A
  109.     FOR B = 1 TO 3000: NEXT
  110. NEXT
  111. SoundOff
  112.  
  113. FUNCTION GetFrequency (Hertz)
  114.     GetFrequency = 3579545 \ (32 * CLNG(Hertz))
  115. END FUNCTION
  116.  
  117. 'This subprogram controls the noise register.
  118. 'Ranges: Shift 0-3 FB 0-1
  119. SUB NoiseSet (Shift, FB)
  120.     OUT &HC0, &HE0 + Shift + FB * 4
  121. END SUB
  122.  
  123. 'This subprogram turns all sound off.
  124. SUB SoundOff
  125.     FOR A = 1 TO 4
  126.         Volume A, 15
  127.     NEXT
  128. END SUB
  129.  
  130. 'This subprogram turns on Tandy sound.
  131. SUB SoundOn
  132.     OUT &H61, &H6C
  133. END SUB
  134.  
  135. 'This subprogram programs the frequency of a channel.
  136. 'Ranges Channel 1-3 Count 0-1023 1023 being lowest frequency
  137. SUB Tone (Channel, Count)
  138.    
  139.     Count = Count AND 1023
  140.     Low = (Count AND &HF): High = Count \ 16
  141.  
  142.     SELECT CASE Channel
  143.         CASE 1
  144.             OUT &HC0, &H80 + Low: OUT &HC0, High
  145.         CASE 2
  146.             OUT &HC0, &HA0 + Low: OUT &HC0, High
  147.         CASE 3
  148.             OUT &HC0, &HC0 + Low: OUT &HC0, High
  149.     END SELECT
  150. END SUB
  151.  
  152. 'This subprogram controls the amplitude(volume) of a channel.
  153. 'Ranges: Channel 1-4 Amplitude 0-15 (0 being loudest)
  154. SUB Volume (Channel, Amplitude)
  155.     Amplitude = Amplitude AND 15
  156.     SELECT CASE Channel
  157.         CASE 1
  158.             OUT &HC0, &H90 + Amplitude
  159.         CASE 2
  160.             OUT &HC0, &HB0 + Amplitude
  161.         CASE 3
  162.             OUT &HC0, &HD0 + Amplitude
  163.         CASE 4
  164.             OUT &HC0, &HF0 + Amplitude
  165.     END SELECT
  166. END SUB
  167.  
  168.