Generating sin/square waves sound

Dave Angel d at davea.name
Mon Jan 2 12:12:32 EST 2012


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




More information about the Python-list mailing list