Pythonで正弦波のような単純な音を生成することは可能ですか?
これに使用できるモジュールはありますか? そうでない場合、どのように独自の作成を行いますか?
また、サウンドを再生するためにPythonを実行するための何らかのホスト環境が必要ですか、それとも端末から呼び出すだけで実現できますか?
答えが OS に依存する場合、私は mac を使用しています。
Pythonで正弦波のような単純な音を生成することは可能ですか?
これに使用できるモジュールはありますか? そうでない場合、どのように独自の作成を行いますか?
また、サウンドを再生するためにPythonを実行するための何らかのホスト環境が必要ですか、それとも端末から呼び出すだけで実現できますか?
答えが OS に依存する場合、私は mac を使用しています。
私はこれでゲームに少し遅れていることを知っていますが、これは合成とオーディオ合成のための非常に素晴らしいpythonプロジェクトです: https://github.com/hecanjog/pippi
それはまだ活発に開発されていますが、しばらくの間続いています。
コンパイルできない、または存在しないプロジェクトで時間を無駄にした後、正弦波、方形波、および複合波の単一または複数のチャネルの生成を提供する Python モジュールwavebenderを発見しました。結果は、wavefile または に書き込むことができ、そこからリアルタイムでaplaysys.stdout
によって直接解釈できます。いくつかの有用な例がここで説明されており、プロジェクトのgithub ページに含まれています。
私はPythonで強力なシンセサイザーに取り組んでいます。カスタム関数を使用して、.wav ファイルに直接書き込みました。この目的で使用できる組み込み関数があります。サンプル レート、サンプルあたりのビット数、チャンネル数、および合成時間を反映するように .wav ヘッダーを変更する必要があります。
これは、bytearray を適用した後に wave ファイルのデータ パラメータへの書き込みに適した値のリストを出力する初期バージョンの正弦波ジェネレータです。[編集] bytearray を適用する前に、変換関数でリストをリトル エンディアンの 16 進数値に変換する必要があります。.wav 仕様の詳細については、以下の WAVE PCM サウンドファイル形式のリンクを参照してください。[/編集]
def sin_basic(freq, time=1, amp=1, phase=0, samplerate=44100, bitspersample=16):
bytelist = []
import math
TwoPiDivSamplerate = 2*math.pi/samplerate
increment = TwoPiDivSamplerate * freq
incadd = phase*increment
for i in range(int(samplerate*time)):
if incadd > (2**(bitspersample - 1) - 1):
incadd = (2**(bitspersample - 1) - 1) - (incadd - (2**(bitspersample - 1) - 1))
elif incadd < -(2**(bitspersample - 1) - 1):
incadd = -(2**(bitspersample - 1) - 1) + (-(2**(bitspersample - 1) - 1) - incadd)
bytelist.append(int(round(amp*(2**(bitspersample - 1) - 1)*math.sin(incadd))))
incadd += increment
return bytelist
新しいバージョンでは、波形を使用して、波形パラメータの周波数、振幅、および位相を変調できます。データ形式により、波をブレンドして連結することは簡単です。これが気に入らない場合は、 WAVE PCM サウンドファイル形式を確認してください。
ずんぐりした配列をサウンドとして再生できるPyAudiereが好きです...Matlabのバックグラウンドとうまく調和していると思います。クロスプラットフォームだと思います。scikits.audiolabも同じことをしていて、より最新でサポートが充実していると思います... wavfileとして保存したり、バッファに書き込んだり、Pythonの組み込みサウンドライブラリを使用したりするよりも簡単に思えます。