2016-11-25 1 views
0

나는 이것에 대해 정말로 당황 스럽다. 나는 몇 년 전에 playTone (freq, duration)과 같은 것을 사용하여 파이썬으로 톤을 생성하는 방법을 물었고 응답의 복잡성과 간단한 해결책의 부족에 압도 당했다.Python playTone (freq, duration) 학습 및 교습을위한 명령어

winsound 모듈은 몇 음표 뒤에 자체적으로 이동하므로 부적절하며 다른 방식으로는 너무 제한됩니다 (한 번에 2 음표가 좋을 수도 있고 웨이브 유형을 선택할 수도 있음).

선생님으로서 많은 사람들이 청각 학습자이기 때문에 소리를 사용하여 루프 및 임의성과 같은 프로그래밍 원칙을 설명하는 것은 큰 의미가 있습니다.

이런 종류의 일은 4 채널 마스터 피스를 쉽게 만들 수있는 Basic을 실행하는 초기 가정용 컴퓨터로는 매우 간단했습니다. 필자는 파이썬에서 왜 그런 것을 쉽게 사용할 수 없는지 이해하지 못합니다. 이것은 학습자들에게 매우 적합합니다.

JavaScript는 오디오 컨텍스트 및 해당 오실레이터와 함께 비교적 쉽게 할 수 있지만 파이썬을 사용하고 싶습니다. 특히 거북 그래픽의 시각적 인 힘과 단순함을 심층적으로 요구하지 않는 청각 구성 요소와 결합하고 싶습니다. 생산할 컴퓨터 하드웨어 및 물리학에 대한 지식

누구에게도이 최신 버전의 간단한 (2016 년 후반) 해결책을 알려 드릴 수 있습니까?

답변

1

다양한 방법이 있습니다. 다음은 모듈 pyaudio을 사용한 간단한 구현입니다.

당신은 프로그램에 따라 창 #for
pip install pyaudio
sudo apt-get install python-pyaudio #For 리눅스

를 사용하여 pyaudio를 설치할 수는 두 개의 입력을 얻을 수 playTone 기능을 가지고있다; frequencyduarion. 원하는 가청 주파수 톤과 "견딜 수있는"지속 시간을 얻기 위해 이들을 변경할 수 있습니다.

다중 채널 복잡한 오디오를 만들려는 경우 pygame을 살펴볼 수 있습니다. SO에 대한 충분한 예제가 있습니다.

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)