7

pygameを使用して.wavファイルを再生していますが、ゲームの各レベルが進むにつれて、特定の.wavファイルのピッチを変更したいと考えています。説明すると、私のゲームは古いOric1コンピューターのOricMunch Pacmanゲームのコピーに近いものです。このゲームでは、各レベルで数百個の錠剤をむしゃむしゃ食べ、錠剤ごとに短い音を鳴らします。錠剤を食べたりつぶしたりするたびに、音がわずかに増加します。

今ここに私が試したものがあります

1)pythons waveモジュールを使用して、サウンドファイルの複数のコピーを作成しました。新しく作成された各ファイルでは、それぞれのピッチがわずかに増加しています(params()の3番目のパラメーターをフレームレート(サンプル周波数と呼ばれることもあります)を変更することにより) forループのサイクル。これを達成した後、ループ内で複数のサウンドオブジェクトを作成してリストに追加し、リストをインデックスに登録して、各錠剤が食べられるときにサウンドを再生することができます。

問題は、Windows Media Player、またはpythons winsoundモジュールを使用して再生したときに、独自のピッチで完全に再生される数百のファイルを(waveモジュールを使用して)作成できるにもかかわらず、pygameがピッチの違いを解釈しないように見えることです。

興味深いことに、ピッチを変更するオプションがあるPower Sound Editorの無料試用版をダウンロードしたので、テストする.wavファイルをいくつか作成しました。これらは、pygameで再生すると明らかに異なるピッチで再生されます。

観察:forループでパラメーターを印刷すると、フレームレート/周波数が意図したとおりに変化していることがわかります。そのため、WindowsMediaPlayerとWinsoundで意図したとおりにサウンドが再生されるのは明らかです。

pygame内では、異なるピッチで再生されない理由は、周波数パラメーターがデフォルト設定に固定されているか、実際に実験したpygame.mixer.pre_initを使用して固定されているためだと思います。次に、Power Sound Editorによって作成された各.wavファイルのパラメーターを確認しました。ピッチサウンドが変化しても、周波数は同じままであることに気付きました。保存するには3つのオプションのいずれかを選択する必要があるため、まったく驚くことではありません。 22050、44100、96000Hzのいずれかのファイル

それで、同じだと思ったので、特に音に関してピッチと周波数の違いをチェックする時間を考えました。私が見つけたのは、音波には2つの主要な側面があるようです:1)フレームレート/周波数および2)その周波数に基づいて変化する複数の波の振幅。これを明確に理解することはできませんが、Power Sound Editorは、基本周波数を変更するのではなく、上記のポイント2)で複数の波の振幅の変化を操作することによって、サウンドの形状/ピッチを変更する必要があることを認識しています。 。

私はPython、pygame、プログラミング全般の初心者であり、フレームレート/基本周波数を変更せずに徐々にピッチを上げるようにサウンドファイルを変更する簡単な方法を見つけるために一生懸命努力しました。複数の波の振幅を操作してピッチを変更するためにインポートできるモジュールがある場合(通常は22050または44100Hzのフレームレート/サンプル周波数を変更する代わりに)、比較的短時間で済みます。ゲームの速度を落とさないためにオンザフライで行われる場合。潜在的なモジュールが開いて変更し、サウンドファイルをその場で変更するのではなく保存する場合は、サウンドファイルを作成するだけなので、サウンドファイルを作成するだけなので、遅いかどうかは問題ではないと思います。プレイするpygame。

pygameで速度低下を起こさない唯一の方法が、すでに行ったようにサウンドファイルからサウンドオブジェクトを作成し、それらを再生することである場合、Power Sound Editorのようにサウンドファイルを操作する方法が必要です(ここでも強調します)フレームレート/サンプル周波数(通常は22050または44100)を変更してから、変更したファイルを保存するのではありません。

簡単に言えば、Power Sound Editorを魔法のように自動化して、ピッチの変更オプションをクリックして毎回保存することなく、300〜400のサウンドファイルを生成できれば、これは独自のPythonの方法を使用するようなものになると思います。それ。

結論:サウンドファイルからサウンドオブジェクトを作成することがゲームの速度を低下させない唯一の方法であると仮定すると(おそらくそうかもしれませんが)、次のものが必要です。

Python Waveモジュールと同等ですが、Waveモジュールのように基本周波数を変更するのではなく、PowerSoundEditorのようにピッチを変更します。

誰かが私を助けてくれて、方法があれば教えてください。

私はpython3.2.3とpygame1.9.2を使用しています

また、私はpythons IDLEを使用しているだけで、他のエディターの使用に慣れていません。

また、Numpyやさまざまなサウンドモジュールについては知っていますが、使い方がわかりません。また、潜在的なモジュールは、上記のバージョンのpythonおよびpygameで動作する必要があります。

前もって感謝します。

ゲイリータウンゼント。

Andbdrewからの最初の回答に対する私の返信は以下のとおりです。

ご協力いただきありがとうございます。

ウェーブファイルのパラメータではなく、ウェーブファイルのデータを変更するように聞こえます。参考までに、複数のファイルを作成するために使用したコードを次に示します。

framerate = 44100 #Original .wav file framerate/sample frequency

for x in range(0, 25):    
   file = wave.open ('MunchEatPill3Amp.wav')   
   nFrames = file.getnframes()
   wdata = file.readframes(nFrames) 
   params = file.getparams()     
   file.close()

   n = list(params)   
   n[0] = 2 
   n[2] = framerate

   framerate += 500 

   params = tuple(n)    
   name = 'PillSound' + str(x) + '.wav'     

   file = wave.open(name, 'wb')
   file.setparams(params)
   print(params)
   file.writeframes(wdata)
   file.close()

異なるデータを書き込むことは、PowerSoundEditorがピッチを変更する方法と同等または類似しているように聞こえます。

それで、params()でサンプルレートを変更するのではなく、ピッチを効果的に変更するためにwdataを変更/操作する方法を知っているかどうか教えてください。これは、.wavファイルから読み取った後にwdataに適用される比較的単純な操作を意味しますか?(私は本当にそう願っています)numpy配列を使用することを聞いたことがありますが、これらの使用方法がわかりません。

上記のコードで変更された.wavファイルは、実際には、winsoundを使用してPythonで再生するか、Windows Media Playerで再生し、意図したとおりにピッチを上げます。彼らがそうしないのはPygameだけです。

前述したように、Pygameには周波数が設定されているため(この周波数もサンプルレートだと思います)、ピッチがまったく増加していないかのように同じように聞こえるのはこのためかもしれません。一方、Windows Media Playerなどで再生した場合、サンプルレートを変更すると、サウンドのピッチが高くなります。

ファイルのパラメータではなく、ファイルのデータを変更することで、同じピッチサウンドの増加を実現する必要があると思います。方法を知っているかどうか教えてください。

これを手伝ってくれてありがとう。

私の最初の質問を全体的に要約すると、ここに再びあります:

Power Sound Editorなどの別のソフトウェアプログラムではなく、Pythonプログラミング言語を使用して、フレームレート/サンプル周波数を変更せずに.wavファイルのピッチを変更するにはどうすればよいですか?

ありがとうございました。

4

2 に答える 2

1

複数のファイルを作成したいだけで、Linux を使用している場合は、SoXを試してください。

#!/bin/bash
for i in `seq -20 10 20`; do
    sox 'input.wav' 'output_'$i'.wav' pitch $i;
done
于 2014-01-22T06:41:07.280 に答える
1

サンプルレートを変更する代わりに、サンプルの波の周波数を変更する必要があります。Python がすべての wave ファイルを同じサンプル レートで再生しているように見えるので (これは良いことです)、変更が反映されていません。

サンプル レートは、サウンド ファイルのメタ情報のようなものです。http://en.m.wikipedia.org/wiki/Sampling_rate#mw-mf-searchでそれについて読んでください。

連続波形を離散波形に変換するときのサンプル間の時間を示します。それを(乱用して)使用するのはクールですが、異なるファイルに異なる周波数のサウンドをすべて同じサンプルレートでエンコードすることで、より良いサービスが得られます。

Wave モジュールのドキュメント ( http://docs.python.org/3.3/library/wave.html ) を見てみましたが、呼び出すときにオーディオ ファイルに別のデータを書き込むだけでよいようです。

 Wave_write.writeframes(data)

これは、実際にオーディオ データをオーディオ ファイルに書き込む方法です。

あなたが説明した方法は、オーディオデータの内容ではなく、オーディオファイル自体に関する情報を書き込む責任があります。

 Wave_write.setparams(tuple)

「...タプルが必要な場所(nchannels、sampwidth、framerate、nframes、comptype、compname)、set*()メソッドに有効な値。すべてのパラメーターを設定します...」(ドキュメントからも)

コードを投稿していただければ、修正できるかもしれません。

于 2012-11-18T08:52:06.140 に答える