Generating sin/square waves sound

Discussion in 'Python' started by Paulo da Silva, Dec 30, 2011.

  1. Hi,
    Sorry if this is a FAQ, but I have googled and didn't find any
    satisfatory answer.

    Is there a simple way, preferably multiplataform (or linux), of
    generating sinusoidal/square waves sound in python?

    Thanks for any answers/suggestions.
    Paulo da Silva, Dec 30, 2011
    #1
    1. Advertising

  2. Please check PYGAME and Simple Directmedia library.

    Python is used as the director like role and functions in SDL
    do most of the jobs in Pygame.
    88888 Dihedral, Dec 30, 2011
    #2
    1. Advertising

  3. Paulo da Silva

    Dave Angel Guest

    On 12/30/2011 02:17 AM, Paulo da Silva wrote:
    > Hi,
    > Sorry if this is a FAQ, but I have googled and didn't find any
    > satisfatory answer.
    >
    > Is there a simple way, preferably multiplataform (or linux), of
    > generating sinusoidal/square waves sound in python?
    >
    > Thanks for any answers/suggestions.

    If you're willing to be Linux-only, then I believe you can do it without
    any extra libraries.

    You build up a string (8 bit char, on Python 2.x) of samples, and write
    it to "/dev/audio". When i experimented, I was only interested in a
    few seconds, so a single write was all I needed.

    Note that the samples are 8 bits, and they are offset by 128. So a zero
    signal would be a string of 128 values. A very quiet square wave might
    be a bunch of 126, followed by a bunch of 130. and so on. And the
    loudest might be a bunch of 2's followed by a bunch of 253's.

    You'll have to experiment with data rate; The data is sent out at a
    constant rate from your string, but I don't know what that rate is.


    --

    DaveA
    Dave Angel, Dec 30, 2011
    #3
  4. Paulo da Silva

    mblume Guest

    Am Fri, 30 Dec 2011 07:17:13 +0000 schrieb Paulo da Silva:

    > Hi,
    > Sorry if this is a FAQ, but I have googled and didn't find any
    > satisfatory answer.
    >
    > Is there a simple way, preferably multiplataform (or linux), of
    > generating sinusoidal/square waves sound in python?
    >
    > Thanks for any answers/suggestions.


    Have a look at the wave module, available under Windows and Linux,
    which operates on .WAV files. The following snippet might get you going:

    #!/usr/bin/python
    import math, wave, struct

    def signal(t, freq):
    return math.sin(2.0*math.pi*freq*t)


    wout = wave.open("sample.wav", "wb")
    nchan = 1
    sampwidth = 2
    framerate = 8000
    nframes = 7 * framerate
    comptype = "NONE"
    compname = "no compression"


    wout.setparams((nchan, sampwidth, framerate, nframes, comptype, compname))

    ts = 1.0 / framerate
    t = 0.0
    n = 0
    data = []
    vals = []
    while n < nframes:
    vals.append(signal(t, 517.0))
    n = n + 1
    t = t + ts

    mx = max((abs(x) for x in vals))
    vals = [ x/mx for x in vals ]
    data = ""
    for v in vals:
    data = data + struct.pack("<h", int(v*32766.0))
    wout.writeframes(data)
    wout.close()


    Alternatively you might just generate (t,signal) samples, write them to
    a file and convert them using "sox" (under Linux, might also be available
    under Windows) to another format.

    HTH
    Martin
    mblume, Dec 30, 2011
    #4
  5. On 12/29/11 23:17 , Paulo da Silva wrote:
    > Hi,
    > Sorry if this is a FAQ, but I have googled and didn't find any
    > satisfatory answer.
    >
    > Is there a simple way, preferably multiplataform (or linux), of
    > generating sinusoidal/square waves sound in python?
    >
    > Thanks for any answers/suggestions.


    I just posted on this elsewhere. Look for a thread titled: "Which
    library for audio playback ?"

    --rich
    K Richard Pixley, Dec 31, 2011
    #5
  6. Em 30-12-2011 10:05, Dave Angel escreveu:
    > On 12/30/2011 02:17 AM, Paulo da Silva wrote:
    >> Hi,
    >> Sorry if this is a FAQ, but I have googled and didn't find any
    >> satisfatory answer.
    >>
    >> Is there a simple way, preferably multiplataform (or linux), of
    >> generating sinusoidal/square waves sound in python?
    >>
    >> Thanks for any answers/suggestions.

    > If you're willing to be Linux-only, then I believe you can do it without
    > any extra libraries.
    >
    > You build up a string (8 bit char, on Python 2.x) of samples, and write
    > it to "/dev/audio". When i experimented, I was only interested in a
    > few seconds, so a single write was all I needed.
    >
    > Note that the samples are 8 bits, and they are offset by 128. So a zero
    > signal would be a string of 128 values. A very quiet square wave might
    > be a bunch of 126, followed by a bunch of 130. and so on. And the
    > loudest might be a bunch of 2's followed by a bunch of 253's.
    >
    > You'll have to experiment with data rate; The data is sent out at a
    > constant rate from your string, but I don't know what that rate is.
    >
    >

    This sounds nice, but then is 8 bits the limit for /dev/audio? What
    about stereo? I don't need this one ... just for curiosity.
    Thanks.
    Paulo da Silva, Jan 2, 2012
    #6
  7. Em 30-12-2011 11:23, mblume escreveu:
    > Am Fri, 30 Dec 2011 07:17:13 +0000 schrieb Paulo da Silva:

    ....

    > Alternatively you might just generate (t,signal) samples, write them to
    > a file and convert them using "sox" (under Linux, might also be available
    > under Windows) to another format.
    >

    As much as I could understand at a 1st look you are writing to a wav
    file and then play the file.
    It would be nice if I could play directly the samples.
    Anyway I'll take a look at the wave module.
    Thanks
    Paulo da Silva, Jan 2, 2012
    #7
  8. Em 31-12-2011 01:19, K Richard Pixley escreveu:
    > On 12/29/11 23:17 , Paulo da Silva wrote:
    >> Hi,
    >> Sorry if this is a FAQ, but I have googled and didn't find any
    >> satisfatory answer.
    >>
    >> Is there a simple way, preferably multiplataform (or linux), of
    >> generating sinusoidal/square waves sound in python?
    >>
    >> Thanks for any answers/suggestions.

    >
    > I just posted on this elsewhere. Look for a thread titled: "Which
    > library for audio playback ?"
    >
    > --rich


    Thank you. I have just seen it using google and saved the bookmark of
    the link. It's too late now but I'll read it tomorrow.
    Paulo da Silva, Jan 2, 2012
    #8
  9. Paulo da Silva

    Dave Angel Guest

    On 01/02/2012 02:24 AM, Paulo da Silva wrote:
    > Em 30-12-2011 10:05, Dave Angel escreveu:
    >> On 12/30/2011 02:17 AM, Paulo da Silva wrote:
    >>> Hi,
    >>> Sorry if this is a FAQ, but I have googled and didn't find any
    >>> satisfatory answer.
    >>>
    >>> Is there a simple way, preferably multiplataform (or linux), of
    >>> generating sinusoidal/square waves sound in python?
    >>>
    >>> Thanks for any answers/suggestions.

    >> If you're willing to be Linux-only, then I believe you can do it without
    >> any extra libraries.
    >>
    >> You build up a string (8 bit char, on Python 2.x) of samples, and write
    >> it to "/dev/audio". When i experimented, I was only interested in a
    >> few seconds, so a single write was all I needed.
    >>
    >> Note that the samples are 8 bits, and they are offset by 128. So a zero
    >> signal would be a string of 128 values. A very quiet square wave might
    >> be a bunch of 126, followed by a bunch of 130. and so on. And the
    >> loudest might be a bunch of 2's followed by a bunch of 253's.
    >>
    >> You'll have to experiment with data rate; The data is sent out at a
    >> constant rate from your string, but I don't know what that rate is.
    >>
    >>

    > This sounds nice, but then is 8 bits the limit for /dev/audio? What
    > about stereo? I don't need this one ... just for curiosity.
    > Thanks.

    I don't even remember where I got the information, but it sufficed for
    my needs. I wanted to be able to generate arbitrary tones at a high
    volume, bypassing any volume control system settings. I assume there's
    some way (ioctl ?) to tell the device to interpret differently. It's
    even possible that it's already stereo (left/right samples stored in
    adjacent 16bit locations -- it wouldn't change the effect I hear, except
    for the frequency being cut in half.

    Interesting link from1991, it's from Guido, but doesn't mention Python
    http://wiretap.area.com/Gopher/Library/Techdoc/Misc/audiofor.faq
    Also, a lot has changed since then.

    Now I wonder whether I should be sending u-law values, rather than
    linear ones. I'm generating sine waves, and they don't really sound
    flutelike.

    This link probably has all our answers.
    http://www.faqs.org/docs/Linux-HOWTO/Sound-HOWTO.html

    I suspect that my approach will simply use the latest setup values (eg.
    sampling rate) and thus runs the risk of sometimes not working. That
    hasn't been my experience, The only problem I see is that sometimes the
    device is "busy". When that happens, other programs don't seem to work
    either. I need to find the rogue process which is hogging the device,
    using fuser.

    --

    DaveA
    Dave Angel, Jan 2, 2012
    #9
  10. Em 30-12-2011 07:17, Paulo da Silva escreveu:
    > Hi,
    > Sorry if this is a FAQ, but I have googled and didn't find any
    > satisfatory answer.
    >
    > Is there a simple way, preferably multiplataform (or linux), of
    > generating sinusoidal/square waves sound in python?
    >
    > Thanks for any answers/suggestions.


    Thank you very much to all who responded.
    There is enough material here to spend some time searching for the best
    solution for me.
    In the meanwhile I also found http://www.speech.kth.se/snack.
    May be it could also be useful.

    Thank you.
    Paulo da Silva, Jan 2, 2012
    #10
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. viswanath

    mixing sampled sine waves

    viswanath, May 11, 2004, in forum: VHDL
    Replies:
    1
    Views:
    2,035
    Allan Herriman
    May 12, 2004
  2. Replies:
    0
    Views:
    1,202
  3. Replies:
    7
    Views:
    449
    tom_usenet
    Sep 9, 2003
  4. Alexander Stippler

    why do I need ::sin, not std::sin?

    Alexander Stippler, Jun 4, 2004, in forum: C++
    Replies:
    14
    Views:
    831
    Pete Becker
    Jun 5, 2004
  5. pillip

    generating waves

    pillip, Feb 6, 2004, in forum: C Programming
    Replies:
    8
    Views:
    538
Loading...

Share This Page