2016-11-25 9 views
0

私はこれに本当に困惑しています。私はplayTone(freq、duration)のようなものを使ってPythonで音色を生成する方法を数年前に尋ねましたが、レスポンスの複雑さと単純な解決法の欠如に圧倒されました。Python playTone(freq、duration)コマンドの学習と教授のため

winsoundモジュールはいくつかの音符の後にトリップするので不適切であり、他の方法ではあまりにも制限されています(一度に2音符、または波型の選択が多分かもしれません)。

教師として、多くの人が聴覚学習者であるため、音を使ってループやランダム性などのプログラミングの原則を説明するのは非常に意味があります。

このような種類のものは、初期の家庭用コンピュータでは基本的に動作し、4チャンネルのマスターピースを簡単に作成できました。私はPythonでこのようなことを簡単に利用できない理由を理解できません。これは学習者に適していることを意味します。

JavaScriptは、オーディオコンテキストとそのオシレータで比較的簡単に行うことができますが、私はPythonを使用したいと思います。特に、亀のグラフィックの視覚的なパワーとシンプルさを奥行きを必要としない聴覚コンポーネントと組み合わせるコンピュータハードウェアと物理学の知識を生み出す

誰も私にこの簡単な最新(2016年後半)の解決策を教えてもらえますか?

答えて

1

さまざまな方法があります。ここには、pyaudioモジュールを使用した単純な実装があります。

あなたがプログラム次のWindows #for
pip install pyaudio
sudo apt-get install python-pyaudio #Forのlinux

を使用してpyaudioをインストールすることができますが、2つの入力を取得するplayTone機能を持っています。 frequencyおよびduarion。あなたは希望の可聴周波数トーンと "耐えられる"持続時間を得るためにそれらを変えることができます。

マルチチャネルの複雑なオーディオを作成する場合は、pygameを調べるとよいでしょう。それには、あまりにも多くの例があります。

import pyaudio 
import math 




def playTone(freq , length): 

    bit_rate = 16000 #number of frames per second/frameset.  

    frequency = freq #in Hz, waves per second 
    play_time = length #in seconds to play sound 

    if frequency > bit_rate: 
     bit_rate = frequency+100 

    num_frames = int(bit_rate * play_time) 
    total_frames = num_frames % bit_rate 
    wave_info = ''  

    for x in xrange(num_frames): 
    wave_info = wave_info+chr(int(math.sin(x/((bit_rate/frequency)/math.pi))*127+128))  

    for x in xrange(total_frames): 
    wave_info = wave_info+chr(128) 

    p = PyAudio() 
    stream = p.open(format = p.get_format_from_width(1), 
        channels = 1, 
        rate = bit_rate, 
        output = True) 

    stream.write(wave_info) 
    stream.stop_stream() 
    stream.close() 
    p.terminate() 



if __name__ == '__main__': 
    frequency = 1500 #Hz 
    duration = 2 #seconds 

    PyAudio = pyaudio.PyAudio 

    #Function to play frequency for given duration 
    playTone(frequency , duration) 
関連する問題