'2+ wrote:

> it says
> Wave_write.writeframes(data)
> will that mean
> "from array import array"
> is a must?
> 
> this does the job:
> 
> import oil
> import wave
> from array import array
> 
> a = oil.Sa()
> 
> w = wave.open("current.wav", "w")
> w.setnchannels(2)
> w.setsampwidth(2)
> w.setframerate(44100)
> 
> data = array('h')
> 
> for gas in range(44100 * 5):
>     a.breath()
>     r = int(32767 * (a.pulse(1) + a.pulse(2) + a.pulse(3)) / 3.0)
>     l = int(32767 * (a.pulse(4) + a.pulse(5) + a.pulse(6)) / 3.0)
>     data.append(r)
>     data.append(l)
> 
> w.writeframes(data.tostring())
> w.close()
> 
> don't like array becoming so huge so tested this and it was also okay:
> 
> for gas in range(44100 * 5):
>     a.breath()
>     data = array('h')
>     r = int(32767 * (a.pulse(1) + a.pulse(2) + a.pulse(3)) / 3.0)
>     l = int(32767 * (a.pulse(4) + a.pulse(5) + a.pulse(6)) / 3.0)
>     data.append(r)
>     data.append(l)
>     w.writeframes(data.tostring())
> 
> but without array .. it becomes 15secs(3 times longer than was
> intended to be) of wav file:
> 
> for gas in range(44100 * 5):
>     a.breath()
>     r = int(32767 * (a.pulse(1) + a.pulse(2) + a.pulse(3)) / 3.0)
>     l = int(32767 * (a.pulse(4) + a.pulse(5) + a.pulse(6)) / 3.0)
>     w.writeframes(hex(r))
>     w.writeframes(hex(l))

Doesn't it sound strange, too? You are writing bogus bytes to the file. 
Compare:
 
>>> import array
>>> array.array("h", [42]).tostring()
'*\x00'
>>> hex(42)
'0x2a'

Not only do they differ in length, the contents are different, too. If 
you're unfamiliar with string escape codes, here's a way to see the bytes:

>>> map(ord, array.array("h", [42]).tostring())
[42, 0]
>>> map(ord, hex(42))
[48, 120, 50, 97]

> should i just be happy with depennding on using array?
> or is there a solution to make the last one work properly?

There is a way to make the last one work: use struct.pack("h", r) instead of 
hex(r). I'm of course assuming that the first version does give you the 
desired result. You should not continue before you have verified that.

I still recommend array for performance reasons. If memory usage is an issue 
you can adopt a hybrid approach:

# untested
from itertools import islice
from array import array

def gen_data():
    for gas in xrange(44100 * 5): # range --> xrange
        a.breath()
        r = int(32767 * (a.pulse(1) + a.pulse(2) + a.pulse(3)) / 3.0)
        l = int(32767 * (a.pulse(4) + a.pulse(5) + a.pulse(6)) / 3.0)
        yield r
        yield l

data = gen_data()
N = 2**20
while True:
    chunk = array('h')
    chunk.extend(islice(data, N))
    if not chunk:
        break
    w.writeframes(chunk.tostring())

This will limit the array size to 4N bytes.

Peter

-- 
http://mail.python.org/mailman/listinfo/python-list

Reply via email to