[Author Prev][Author Next][Thread Prev][Thread Next][Author Index][Thread Index]

Re: [pygame] Sine Waves



Not limiting the volume argument to something under the threshold for your bit depth is certainly the problem--all those sine wave peaks were getting cut off.  Also, calling pygame.mixer.pre_init with some custom values will let you know for sure what you are working with.  Here a very slightly modified version which gives me a good sounding sine wave output:

import pygame, math
from Numeric import *
SAMPLE_RATE = 22050 ## This many array entries == 1 second of sound.

def SineWave(freq=1000,volume=16000,length=1):
    num_steps = length*SAMPLE_RATE
    s = []
    for n in range(num_steps):
        value = int(math.sin(n * freq * (6.28318/SAMPLE_RATE) * length)*volume)
        s.append( [value,value] )
    x_arr = array(s)
    return x_arr

def SquareWave(freq=1000,volume=100000,length=1):
    length_of_plateau = SAMPLE_RATE / (2*freq)
    s = []
    counter = 0
    state = 1
    for n in range(length*SAMPLE_RATE):
        if state == 1:
            value = volume
        else:
            value = -volume
        s.append( [value,value] )

        counter += 1
        if counter == length_of_plateau:
            counter = 0
            if state == 1:
                state = -1
            else:
                state = 1

    x_arr = array(s)
    return x_arr

def MakeSound(arr):
    return pygame.sndarray.make_sound(arr)

def PlaySquareWave(freq=1000):
    MakeSound(SquareWave(freq)).play()

def PlaySineWave(freq=1000):
    MakeSound(SineWave(freq)).play()


if __name__ == '__main__':
    pygame.init()
    pygame.mixer.pre_init(22050, -16, 2, 1024*2)
    PlaySineWave()
    pygame.time.wait(3000)



On 12/10/05, Peter Nicolai <pnicolai@xxxxxxxxx> wrote:
try limiting the "volume" argument to 32768 or lower (16 bit audio).


On 12/10/05, Kris Schnee <kschnee@xxxxxxxxxx> wrote:
> It's driving me nuts: why is this not producing a sine wave at the
> specified frequency? I get an ugly, rasping beep that doesn't sound at
> all like the sample at
> <http://www.sfu.ca/sonic-studio/handbook/Sine_Wave.html >, and sounds
> like a different frequency than the square waves produced by the
> function below. Calling "SineWave(100)[:220]" seems to show data that
> repeats every 220 cycles, ie. 100 times per second at the specified
> sample rate, yet it still doesn't sound right.
>
> Kris
>
>
>
> import pygame, math
> from Numeric import *
> SAMPLE_RATE = 22050 ## This many array entries == 1 second of sound.
> pygame.init()
>
> def SineWave(freq=1000,volume=100000,length=1):
>      num_steps = length*SAMPLE_RATE
>      s = []
>      for n in range(num_steps):
>          value = int(math.sin (n * freq * (6.28318/SAMPLE_RATE) * length
> )*volume)
>          s.append( [value,value] )
>      x_arr = array(s)
>      return x_arr
>
> def SquareWave(freq=1000,volume=100000,length=1):
>      length_of_plateau = SAMPLE_RATE / (2*freq)
>      s = []
>      counter = 0
>      state = 1
>      for n in range(length*SAMPLE_RATE):
>          if state == 1:
>              value = volume
>          else:
>              value = -volume
>          s.append( [value,value] )
>
>          counter += 1
>          if counter == length_of_plateau:
>              counter = 0
>              if state == 1:
>                  state = -1
>              else:
>                  state = 1
>
>      x_arr = array(s)
>      return x_arr
>
> def MakeSound(arr):
>      return pygame.sndarray.make_sound(arr)
>
> def PlaySquareWave(freq=1000):
>      MakeSound(SquareWave(freq)).play()
>
> def PlaySineWave(freq=1000):
>      MakeSound(SineWave(freq)).play()
>
>



--
David Tweet
__________________
http://davidtweet.com