2016-11-25 8 views
0

Я действительно смущен этим. Я несколько лет назад спросил, как сгенерировать тон с помощью Python, используя что-то вроде playTone (freq, duration) и был ошеломлен сложностью ответов и отсутствием какого-либо простого решения.Команда Python playTone (freq, duration) для обучения и преподавания

Модуль winsound неадекватен, поскольку он перемещается по самому себе после нескольких нот и слишком ограничен другими способами (возможно, 2 примечания в то время были бы хороши или выбор типов волн).

Как учитель, для меня очень важно использовать звук, чтобы проиллюстрировать принципы программирования, такие как циклы и случайность, так как многие люди являются слуховыми учащимися.

Этот вид вещей был невероятно прост с ранними домашними компьютерами, работающими на Basic, где вы могли легко создавать 4-х канальные мастер-фрагменты. Я просто не понимаю, почему такая вещь не легко доступна с Python, которая должна быть настолько хорошо приспособлена для учеников.

JavaScript теперь может сделать это относительно легко с аудиоконференцией и его осцилляторами, но я хочу использовать Python и, в частности, объединить визуальную силу и простоту графики черепахи с слуховым компонентом, который не требует глубины знание компьютерной техники и физики для производства.

Может ли кто-нибудь помочь мне найти простое современное решение (конец 2016 года) для этого, пожалуйста?

ответ

1

Существуют различные способы сделать это. Вот простая реализация с использованием модуля pyaudio.

Вы можете установить pyaudio с помощью
pip install pyaudio окон и # для
sudo apt-get install python-pyaudio # для Линукс

Следующая программа имеет playTone функцию, которая получает два входа; frequency и duarion. Вы можете изменить их, чтобы получить требуемые звуковые частотные тоны и «терпимую» продолжительность.

Если вы планируете создать многоканальный сложный звук, тогда вы можете посмотреть 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)