6

PortAudio と Python で遊んでいます。

data = getData()
stream.write( data )

ストリームで、Float32 値で表されるサウンド データを再生したいと考えています。したがって、次の関数を使用します。

def getData():
    data = []
    for i in range( 0, 1024 ):
        data.append( 0.25 * math.sin( math.radians( i ) ) )
    return data

stream.write残念ながら、バッファオブジェクトを渡す必要があるため、これは機能しません:

TypeError: argument 2 must be string or read-only buffer, not list

私の質問は次のとおりです。フロートのリストをバッファオブジェクトに変換するにはどうすればよいですか?

4

3 に答える 3

9
import struct

def getData():
    data = []
    for i in range( 0, 1024 ):
        data.append( 0.25 * math.sin( math.radians( i ) ) )
    return struct.pack('f'*len(data), *data)
于 2009-08-04T19:01:30.933 に答える
2

実際、最も簡単な方法はstructモジュールを使用することです。PythonオブジェクトからCのような「ネイティブ」オブジェクトに変換するように設計されています。

于 2009-08-04T18:49:52.487 に答える
0

おそらく代わりに考えてみてください:

d = [0.25 * math.sin(math.radians(i)) for i in range(0, 1024)]

おそらく、最初にデータをシリアル化するために、pickleのようなパッケージを使用する必要があります。

import pickle
f1 = open("test.dat", "wb")
pickle.dump(d, f1)
f1.close()

次に、それをロードし直します。

f2 = open("test.dat", "rb")
d2 = pickle.Unpickler(f2).load()
f2.close()


d2 == d

Trueを返します

于 2009-08-04T18:49:01.613 に答える