SOUND: Difference between revisions

From QB64 Phoenix Edition Wiki
Jump to navigation Jump to search
No edit summary
(Add documentation for {{Parameter|volume#}}][, {{Parameter|panning#}}][, {{Parameter|waveform&}}])
Line 1: Line 1:
'''SOUND''' sets frequency and duration of sounds from the internal PC speaker if the computer has one or the sound card in QB64.
[[SOUND]] sets frequency and duration of sounds from the internal PC speaker if the computer has one or the sound card in QB64.




{{PageSyntax}}
{{PageSyntax}}
: SOUND ''frequency'', ''duration''
: [[SOUND]] {{Parameter|frequency#}}, {{Parameter|duration#}}[, {{Parameter|volume#}}][, {{Parameter|panning#}}][, {{Parameter|waveform&}}]




{{PageDescription}}
{{PageDescription}}
* ''Frequency'' is any literal or variable value from 37 to 32767, but 0 is allowed for delays.
* {{Parameter|frequency#}} is any literal or variable value from 37 to 32767, but 0 is allowed for delays.
* ''Duration'' is any literal or variable number of [[TIMER (function)|TIMER]] ticks with a duration of 1/18th second. 18 = one second.
* Just like QuickBASIC 4.5 frequencies on or above 20000 produces silence.
* In '''QB64''' the sound comes from the soundcard and the volume can be adjusted through the OS.
* {{Parameter|duration#}} is any literal or variable number of [[TIMER (function)|TIMER]] ticks with a duration of 1/18th second. 18 = one second.
* Optional parameter {{Parameter|volume#}} should be between 0.0 (muted) to 1.0 (full volume).
* Optional parameter {{Parameter|panning#}} should be between -1.0 (hard left) to 1.0 (hard right). 0.0 being center.
* Optional parameter {{Parameter|waveform&}} can be one of the following:
** '''1''' for square waveform
** '''2''' for sawtooth waveform
** '''3''' for triangle waveform (default)
** '''4''' for sine waveform
** '''5''' for white noise
* More waveform types may be introduced in the future.
* '''Note:''' The last volume, panning and waveform settings will apply to subsequent calls to [[SOUND]] (when used without the optional parameters) and [[PLAY]].


=== Errors ===
=== Errors ===
* Low ''frequency'' values between 0 and 37 will create an [[ERROR Codes|Illegal Function call error]].
* Low ''frequency'' values between 0 and 37 will create an [[ERROR Codes|Illegal Function call error]].
* '''Warning:''' SOUND may not work when the program is not in focus. Use SOUND 0, 0 at sound procedure start to set focus.
* Out of range values for {{Parameter|volume#}}, {{Parameter|panning#}} and {{Parameter|waveform&}} will create an [[ERROR Codes|Illegal Function call error]].
* '''Note:''' SOUND 0, 0 will not stop previous '''QB64''' sounds like it did in QBasic!
* All audio related statements and function works even if the program is not in focus. However, depending on the operating system and environment, this may not always be the case.
* SOUND may have clicks or pauses between the sounds generated. [[PLAY]] can be used for musical sounds.
* '''Note:''' [[SOUND]] 0, 0 will not stop previous '''QB64''' sounds like it did in QBasic!
* [[SOUND]] may have clicks or pauses between the sounds generated.
* [[PLAY]] can be used for musical sounds.
 
{{FixedStart}}
{{FixedStart}}
         '''                    The Seven Music Octaves '''
         '''                    The Seven Music Octaves '''
Line 50: Line 63:
                                 '''# denotes sharp'''
                                 '''# denotes sharp'''
{{FixedEnd}}
{{FixedEnd}}
{{PageAvailability}}
<!-- QB64 = a version or none, QBPE = a version or all, Platforms = yes or no -->
<gallery widths="48px" heights="48px" mode="nolines">
File:Qb64.png|'''all'''
File:Qbpe.png|'''all'''
File:Apix.png
File:Win.png|'''yes'''
File:Lnx.png|'''yes'''
File:Osx.png|'''yes'''
</gallery>
<!-- additional availability notes go below here -->
* Support for {{Parameter|volume#}}, {{Parameter|panning#}}, {{Parameter|waveform&}} was added in '''QB64-PE v.3.7.1'''.




Line 127: Line 154:
{{CodeEnd}}
{{CodeEnd}}
{{Small|Code adapted by Ted Weissgerber from code [http://www.amazon.com/Running-MS-DOS-QBASIC-Michael-Halvorson/dp/1556153406 "Running MS-DOS QBasic"] by Microsoft Press}}
{{Small|Code adapted by Ted Weissgerber from code [http://www.amazon.com/Running-MS-DOS-QBASIC-Michael-Halvorson/dp/1556153406 "Running MS-DOS QBasic"] by Microsoft Press}}
''Example 3:'' Playing sound effects using the new QB64-PE [[SOUND]] extensions.
{{CodeStart}}
{{Cl|Option}} {{Cl|_Explicit}}
{{Cl|Dim}} Q {{Cl|As}} {{Cl|String}}
{{Text|<nowiki>' Sound effects menu</nowiki>|#919191}}
{{Cl|Do}}
    {{Cl|Cls}}
    {{Cl|Print}} {{Text|<nowiki>"Sound effects"</nowiki>|#FFB100}}: {{Cl|Print}}
    {{Cl|Color}} {{Text|14|#F580B1}}, {{Text|0|#F580B1}}: {{Cl|Print}} {{Text|<nowiki>"  B"</nowiki>|#FFB100}};: {{Cl|Color}} {{Text|7|#F580B1}}, {{Text|0|#F580B1}}: {{Cl|Print}} {{Text|<nowiki>"ouncing"</nowiki>|#FFB100}}
    {{Cl|Color}} {{Text|14|#F580B1}}, {{Text|0|#F580B1}}: {{Cl|Print}} {{Text|<nowiki>"  F"</nowiki>|#FFB100}};: {{Cl|Color}} {{Text|7|#F580B1}}, {{Text|0|#F580B1}}: {{Cl|Print}} {{Text|<nowiki>"alling"</nowiki>|#FFB100}}
    {{Cl|Color}} {{Text|14|#F580B1}}, {{Text|0|#F580B1}}: {{Cl|Print}} {{Text|<nowiki>"  K"</nowiki>|#FFB100}};: {{Cl|Color}} {{Text|7|#F580B1}}, {{Text|0|#F580B1}}: {{Cl|Print}} {{Text|<nowiki>"laxon"</nowiki>|#FFB100}}
    {{Cl|Color}} {{Text|14|#F580B1}}, {{Text|0|#F580B1}}: {{Cl|Print}} {{Text|<nowiki>"  S"</nowiki>|#FFB100}};: {{Cl|Color}} {{Text|7|#F580B1}}, {{Text|0|#F580B1}}: {{Cl|Print}} {{Text|<nowiki>"iren"</nowiki>|#FFB100}}
    {{Cl|Color}} {{Text|14|#F580B1}}, {{Text|0|#F580B1}}: {{Cl|Print}} {{Text|<nowiki>"  Q"</nowiki>|#FFB100}};: {{Cl|Color}} {{Text|7|#F580B1}}, {{Text|0|#F580B1}}: {{Cl|Print}} {{Text|<nowiki>"uit"</nowiki>|#FFB100}}
    {{Cl|Print}}: {{Cl|Print}} {{Text|<nowiki>"Select: "</nowiki>|#FFB100}};
    {{Text|<nowiki>' Get valid key</nowiki>|#919191}}
    {{Cl|Do}}
        Q = {{Cl|UCase$}}({{Cl|Input$}}({{Text|1|#F580B1}}))
    {{Cl|DO...LOOP|Loop While}} {{Cl|InStr}}({{Text|<nowiki>"BFKSQ"</nowiki>|#FFB100}}, Q) = {{Text|0|#F580B1}}
    {{Text|<nowiki>' Take action based on key</nowiki>|#919191}}
    {{Cl|Cls}}
    {{Cl|Select Case}} Q
        {{Cl|Case}} {{Cl|Is}} = {{Text|<nowiki>"B"</nowiki>|#FFB100}}
            {{Cl|Print}} {{Text|<nowiki>"Bouncing . . . "</nowiki>|#FFB100}}
            {{Text|Bounce|#55FF55}} {{Text|32767|#F580B1}}, {{Text|246|#F580B1}} {{Text|<nowiki>' the 32767 will make the PSG generate silence (exactly like QB45 does)</nowiki>|#919191}}
        {{Cl|Case}} {{Cl|Is}} = {{Text|<nowiki>"F"</nowiki>|#FFB100}}
            {{Cl|Print}} {{Text|<nowiki>"Falling . . . "</nowiki>|#FFB100}}
            {{Text|Fall|#55FF55}} {{Text|2000|#F580B1}}, {{Text|550|#F580B1}}, {{Text|500|#F580B1}}
        {{Cl|Case}} {{Cl|Is}} = {{Text|<nowiki>"S"</nowiki>|#FFB100}}
            {{Cl|Print}} {{Text|<nowiki>"Wailing . . ."</nowiki>|#FFB100}}
            {{Cl|Print}} {{Text|<nowiki>" . . . press any key to end."</nowiki>|#FFB100}}
            {{Text|Siren|#55FF55}} {{Text|780|#F580B1}}, {{Text|650|#F580B1}}
        {{Cl|Case}} {{Cl|Is}} = {{Text|<nowiki>"K"</nowiki>|#FFB100}}
            {{Cl|Print}} {{Text|<nowiki>"Oscillating . . ."</nowiki>|#FFB100}}
            {{Cl|Print}} {{Text|<nowiki>" . . . press any key to end."</nowiki>|#FFB100}}
            {{Text|Klaxon|#55FF55}} {{Text|987|#F580B1}}, {{Text|329|#F580B1}}
        {{Cl|Case}} {{Cl|Else}}
    {{Cl|End Select}}
{{Cl|DO...LOOP|Loop Until}} Q = {{Text|<nowiki>"Q"</nowiki>|#FFB100}}
{{Cl|End}}
{{Text|<nowiki>' Loop two sounds down at decreasing time intervals</nowiki>|#919191}}
{{Cl|Sub}} {{Text|Bounce|#55FF55}} (Hi {{Cl|As}} {{Cl|Long}}, Low {{Cl|As}} {{Cl|Long}})
    {{Cl|Dim}} count {{Cl|As}} {{Cl|Long}}
    {{Cl|Play}} {{Text|<nowiki>"Q0"</nowiki>|#FFB100}} {{Text|<nowiki>' turn off volume ramping</nowiki>|#919191}}
    {{Cl|For}} count = {{Text|60|#F580B1}} {{Cl|To}} {{Text|1|#F580B1}} {{Cl|Step}} {{Text|-2|#F580B1}}
        {{Cl|Sound}} Low - count / {{Text|2|#F580B1}}, count / {{Text|20|#F580B1}}, {{Text|1.0!|#F580B1}}, {{Text|0.0!|#F580B1}}, {{Text|1|#F580B1}}
        {{Cl|Sound}} Hi, count / {{Text|15|#F580B1}}
    {{Cl|Next}}
{{Cl|End Sub}}
{{Text|<nowiki>' Loop down from a high sound to a low sound</nowiki>|#919191}}
{{Cl|Sub}} {{Text|Fall|#55FF55}} (Hi {{Cl|As}} {{Cl|Long}}, Low {{Cl|As}} {{Cl|Long}}, Del {{Cl|As}} {{Cl|Long}})
    {{Cl|Dim}} vol {{Cl|As}} {{Cl|Single}}
    {{Cl|Dim}} count {{Cl|As}} {{Cl|Long}}
    {{Cl|Play}} {{Text|<nowiki>"Q3"</nowiki>|#FFB100}} {{Text|<nowiki>' enable 3ms volume ramping</nowiki>|#919191}}
    {{Cl|For}} count = Hi {{Cl|To}} Low {{Cl|Step}} {{Text|-10|#F580B1}}
        vol = {{Text|1.0!|#F580B1}} - vol
        {{Cl|Sound}} count, Del / count, vol, {{Text|0.0!|#F580B1}}, {{Text|3|#F580B1}} {{Text|<nowiki>' triangle wave</nowiki>|#919191}}
    {{Cl|Next}}
{{Cl|End Sub}}
{{Text|<nowiki>' Alternate two sounds until a key is pressed</nowiki>|#919191}}
{{Cl|Sub}} {{Text|Klaxon|#55FF55}} (Hi {{Cl|As}} {{Cl|Long}}, Low {{Cl|As}} {{Cl|Long}})
    {{Cl|Play}} {{Text|<nowiki>"Q5"</nowiki>|#FFB100}} {{Text|<nowiki>' enable 5ms volume ramping</nowiki>|#919191}}
    {{Cl|DO...LOOP|Do While}} {{Cl|InKey$}} = {{Text|<nowiki>""</nowiki>|#FFB100}}
        {{Cl|Sound}} Hi, {{Text|5!|#F580B1}}, {{Text|1.0!|#F580B1}}, {{Text|-1.0!|#F580B1}}, {{Text|4|#F580B1}}
        {{Cl|Sound}} Low, {{Text|5!|#F580B1}}, {{Text|1.0!|#F580B1}}, {{Text|1.0!|#F580B1}}, {{Text|4|#F580B1}}
    {{Cl|Loop}}
{{Cl|End Sub}}
{{Text|<nowiki>' Loop a sound from low to high to low</nowiki>|#919191}}
{{Cl|Sub}} {{Text|Siren|#55FF55}} (Hi {{Cl|As}} {{Cl|Long}}, Range {{Cl|As}} {{Cl|Long}})
    {{Cl|Dim}} count {{Cl|As}} {{Cl|Long}}, pan {{Cl|As}} {{Cl|Single}}
    {{Cl|Dim}} dir {{Cl|As}} {{Cl|Single}}: dir = {{Text|0.01!|#F580B1}}
    {{Cl|Play}} {{Text|<nowiki>"Q0"</nowiki>|#FFB100}} {{Text|<nowiki>' disable volume ramping</nowiki>|#919191}}
    {{Cl|DO...LOOP|Do While}} {{Cl|InKey$}} = {{Text|<nowiki>""</nowiki>|#FFB100}}
        {{Cl|For}} count = Range {{Cl|To}} -Range {{Cl|Step}} {{Text|-4|#F580B1}}
            pan = pan + dir
            {{Cl|If}} pan <= {{Text|-1.0!|#F580B1}} {{Cl|Then}} dir = {{Text|0.01!|#F580B1}}: pan = {{Text|-1.0!|#F580B1}}
            {{Cl|If}} pan >= {{Text|1.0!|#F580B1}} {{Cl|Then}} dir = {{Text|-0.01!|#F580B1}}: pan = {{Text|1.0!|#F580B1}}
            {{Cl|Sound}} Hi - {{Cl|Abs}}(count), {{Text|0.3!|#F580B1}}, {{Text|1.0!|#F580B1}}, pan, {{Text|4|#F580B1}} {{Text|<nowiki>' sine wave</nowiki>|#919191}}
            count = count - {{Text|2|#F580B1}} / Range
        {{Cl|Next}}
    {{Cl|Loop}}
{{Cl|End Sub}}
{{CodeEnd}}





Revision as of 07:18, 13 June 2023

SOUND sets frequency and duration of sounds from the internal PC speaker if the computer has one or the sound card in QB64.


Syntax

SOUND frequency#, duration#[, volume#][, panning#][, waveform&]


Description

  • frequency# is any literal or variable value from 37 to 32767, but 0 is allowed for delays.
  • Just like QuickBASIC 4.5 frequencies on or above 20000 produces silence.
  • duration# is any literal or variable number of TIMER ticks with a duration of 1/18th second. 18 = one second.
  • Optional parameter volume# should be between 0.0 (muted) to 1.0 (full volume).
  • Optional parameter panning# should be between -1.0 (hard left) to 1.0 (hard right). 0.0 being center.
  • Optional parameter waveform& can be one of the following:
    • 1 for square waveform
    • 2 for sawtooth waveform
    • 3 for triangle waveform (default)
    • 4 for sine waveform
    • 5 for white noise
  • More waveform types may be introduced in the future.
  • Note: The last volume, panning and waveform settings will apply to subsequent calls to SOUND (when used without the optional parameters) and PLAY.

Errors

  • Low frequency values between 0 and 37 will create an Illegal Function call error.
  • Out of range values for volume#, panning# and waveform& will create an Illegal Function call error.
  • All audio related statements and function works even if the program is not in focus. However, depending on the operating system and environment, this may not always be the case.
  • Note: SOUND 0, 0 will not stop previous QB64 sounds like it did in QBasic!
  • SOUND may have clicks or pauses between the sounds generated.
  • PLAY can be used for musical sounds.
                             The Seven Music Octaves 

         Note     Frequency      Note     Frequency      Note      Frequency
       1* D#1 ...... 39           G3 ....... 196          A#5 ...... 932
          E1 ....... 41           G#3 ...... 208          B5 ....... 988
          F1 ....... 44           A3 ....... 220       6* C6 ....... 1047
          F#1 ...... 46           A#3 ...... 233          C#6 ...... 1109
          G1 ....... 49           B3 ....... 247          D6 ....... 1175
          G#1 ...... 51        4* C4 ....... 262          D#6 ...... 1245
          A1 ....... 55           C#4 ...... 277          E6 ....... 1318
          A#1 ...... 58           D4 ....... 294          F6 ....... 1397
          B1 ....... 62           D#4 ...... 311          F#6 ...... 1480
       2* C2 ....... 65           E4 ....... 330          G6 ....... 1568
          C#2 ...... 69           F4 ....... 349          G# ....... 1661
          D2 ....... 73           F#4 ...... 370          A6 ....... 1760
          D#2 ...... 78           G4 ....... 392          A#6 ...... 1865
          E2 ....... 82           G#4 ...... 415          B6 ....... 1976
          F2 ....... 87           A4 ....... 440       7* C7 ....... 2093
          F#2 ...... 92           A# ....... 466          C#7 ...... 2217
          G2 ....... 98           B4 ....... 494          D7 ....... 2349
          G#2 ...... 104       5* C5 ....... 523          D#7 ...... 2489
          A2 ....... 110          C#5 ...... 554          E7 ....... 2637
          A#2 ...... 117          D5 ....... 587          F7 ....... 2794
          B2 ....... 123          D#5 ...... 622          F#7 ...... 2960
       3* C3 ....... 131          E5 ....... 659          G7 ....... 3136
          C#3 ...... 139          F5 ....... 698          G#7 ...... 3322
          D3 ....... 147          F#5 ...... 740          A7 ....... 3520
          D#3 ...... 156          G5 ....... 784          A#7 ...... 3729
          E3 ....... 165          G#5 ...... 831          B7 ....... 3951
          F3 ....... 175          A5 ....... 880       8* C8 ....... 4186
          F#3 ...... 185
                                 # denotes sharp


Availability

  • Support for volume#, panning#, waveform& was added in QB64-PE v.3.7.1.


Examples

Example 1: Playing the seven octaves based on the base note DATA * 2 ^ (octave - 1).

notes$ = "C C#D D#E F F#G G#A A#B "
COLOR 9:LOCATE 5, 20: PRINT "Select an octave (1 - 7) to play (8 quits):"
DO
  DO: octa$ = INKEY$
    IF octa$ <> "" THEN
      IF ASC(octa$) > 48 AND ASC(octa$) < 58 THEN octave% = VAL(octa$): EXIT DO
    END IF
  LOOP UNTIL octave% > 7
  IF octave% > 0 AND octave% < 8 THEN
    LOCATE 15, 6: PRINT SPACE$(70)
    LOCATE 16, 6: PRINT SPACE$(70)
    COLOR 14: LOCATE 15, 6: PRINT "Octave"; octave%; ":";
    RESTORE Octaves
    FOR i = 1 TO 12
      READ note!
      snd% = CINT(note! * (2 ^ (octave% - 1)))  'calculate note frequency
      COLOR 14: PRINT STR$(snd%);
      c0l = POS(0)
      COLOR 11: LOCATE 16, c0l - 2: PRINT MID$(notes$, 1 + (2 * (i - 1)), 2)
      LOCATE 15, c0l
      IF snd% > 36 THEN SOUND snd%, 12  'error if sound value is < 36
      _DELAY .8
    NEXT
  END IF
LOOP UNTIL octave% > 7
END

Octaves:
DATA 32.7,34.65,36.71,38.9,41.2,43.65,46.25,49,51.91,55,58.27,61.74
Code adapted by Ted Weissgerber from code in "Running MS-DOS QBasic" by Microsoft Press


Example 2: Playing a song called "Bonnie" with SOUND frequencies.

SCREEN 13
_FULLSCREEN
OUT &H3C8, 0: OUT &H3C9, 0: OUT &H3C9, 0: OUT &H3C9, 20
COLOR 1
FOR i% = 1 TO 21
  LOCATE 2 + i%, 2: PRINT CHR$(178)
  LOCATE 2 + i%, 39: PRINT CHR$(178)
NEXT i%
FOR i% = 2 TO 39
  LOCATE 2, i%: PRINT CHR$(223)
  LOCATE 23, i%: PRINT CHR$(220)
NEXT i%
COLOR 9
LOCATE 3, 16: PRINT CHR$(34); "MY BONNIE"; CHR$(34)
SLEEP 3
FOR i% = 1 TO 34
  SELECT CASE i%
    CASE 1: LOCATE 5, 5
    CASE 10: LOCATE 10, 5
    CASE 18: LOCATE 15, 5
    CASE 27: LOCATE 20, 5
  END SELECT
  READ note%, duration%, word$
  SOUND note%, duration%: PRINT word$;
NEXT i%
SLEEP 2
LOCATE 23, 16: PRINT "Thank You!"
SLEEP 4
SYSTEM

DATA 392,8,"My ",659,8,"Bon-",587,8,"nie ",523,8,"lies ",587,8,"O-",523,8,"Ver ",440,8,"the "
DATA 392,8,"O-",330,32,"cean ",392,8,"My ",659,8,"Bon-",587,8,"nie ",523,8,"lies "
DATA 523,8,"O-",494,8,"ver ",523,8,"the ",587,40,"sea ",392,8,"My ",659,8,"Bon-",587,8,"nie"
DATA 523,8," lies ",587,8,"O-",523,8,"ver ",440,8,"the ",392,8,"O-",330,32,"cean ",392,8,"Oh "
DATA 440,8,"bring ",587,8,"back ",523,8,"my ",494,8,"Bon-",440,8,"nie ",494,8,"to ",523,32,"me..!"
Code adapted by Ted Weissgerber from code "Running MS-DOS QBasic" by Microsoft Press


Example 3: Playing sound effects using the new QB64-PE SOUND extensions.

Option _Explicit

Dim Q As String

' Sound effects menu
Do
    Cls
    Print "Sound effects": Print
    Color 14, 0: Print "  B";: Color 7, 0: Print "ouncing"
    Color 14, 0: Print "  F";: Color 7, 0: Print "alling"
    Color 14, 0: Print "  K";: Color 7, 0: Print "laxon"
    Color 14, 0: Print "  S";: Color 7, 0: Print "iren"
    Color 14, 0: Print "  Q";: Color 7, 0: Print "uit"
    Print: Print "Select: ";

    ' Get valid key
    Do
        Q = UCase$(Input$(1))
    Loop While InStr("BFKSQ", Q) = 0

    ' Take action based on key
    Cls
    Select Case Q
        Case Is = "B"
            Print "Bouncing . . . "
            Bounce 32767, 246 ' the 32767 will make the PSG generate silence (exactly like QB45 does)
        Case Is = "F"
            Print "Falling . . . "
            Fall 2000, 550, 500
        Case Is = "S"
            Print "Wailing . . ."
            Print " . . . press any key to end."
            Siren 780, 650
        Case Is = "K"
            Print "Oscillating . . ."
            Print " . . . press any key to end."
            Klaxon 987, 329
        Case Else
    End Select
Loop Until Q = "Q"
End

' Loop two sounds down at decreasing time intervals
Sub Bounce (Hi As Long, Low As Long)
    Dim count As Long

    Play "Q0" ' turn off volume ramping

    For count = 60 To 1 Step -2
        Sound Low - count / 2, count / 20, 1.0!, 0.0!, 1
        Sound Hi, count / 15
    Next
End Sub

' Loop down from a high sound to a low sound
Sub Fall (Hi As Long, Low As Long, Del As Long)
    Dim vol As Single
    Dim count As Long

    Play "Q3" ' enable 3ms volume ramping

    For count = Hi To Low Step -10
        vol = 1.0! - vol
        Sound count, Del / count, vol, 0.0!, 3 ' triangle wave
    Next
End Sub

' Alternate two sounds until a key is pressed
Sub Klaxon (Hi As Long, Low As Long)
    Play "Q5" ' enable 5ms volume ramping

    Do While InKey$ = ""
        Sound Hi, 5!, 1.0!, -1.0!, 4
        Sound Low, 5!, 1.0!, 1.0!, 4
    Loop
End Sub

' Loop a sound from low to high to low
Sub Siren (Hi As Long, Range As Long)
    Dim count As Long, pan As Single
    Dim dir As Single: dir = 0.01!

    Play "Q0" ' disable volume ramping

    Do While InKey$ = ""
        For count = Range To -Range Step -4
            pan = pan + dir
            If pan <= -1.0! Then dir = 0.01!: pan = -1.0!
            If pan >= 1.0! Then dir = -0.01!: pan = 1.0!

            Sound Hi - Abs(count), 0.3!, 1.0!, pan, 4 ' sine wave

            count = count - 2 / Range
        Next
    Loop
End Sub


See also



Navigation:
Main Page with Articles and Tutorials
Keyword Reference - Alphabetical
Keyword Reference - By usage
Report a broken link