Я продолжаю получать ValueError: частота должна быть от 37 до 32767 на Python с Winsound

Вот код, который у меня есть:

импорт winsound от myro import *

def main():

    HftM1 = makeSong("REST 1; REST 1; REST 1; REST 1; REST 1; REST 1; REST 1; REST 1; D4 1/6; F4 1/6; D5 2/3; D4 1/6; F4 1/6; D5 2/3; E5 1/2; F5 1/6; E5 1/6; F5 1/6; E5 1/6; C5 1/6; A4 2/3; A4 1/3; D4 1/3; F4 1/6; G4 1/6; A4 1; A4 1/3; D4 1/3; F4 1/6; G4 1/6; E4 1; D4 1/6; F4 1/6; D5 2/3; E5 1/2; F5 1/6; E5 1/6; F5 1/6; E5 1/6; C5 1/6; A4 2/3; A4 1/3; D4 1/3; F4 1/6; G4 1/6; A4 2/3; A4 1/3; D4 1; REST 1; REST 1; REST 1")
    saveSong(HftM1, "WindmillHut.txt", append=1)
    song = readSong("WindmillHut.txt")

    play = []

    for n in range(len(song)):
        play = song[n]
        note = play[0]
        duration = play[1]
        winsound.Beep(int(note), int(duration*2000))
main()

Когда я пытаюсь запустить это, я получаю сообщение об ошибке:

Traceback (most recent call last):
  File "C:/Users/Gerren.Kids-PC/Desktop/Gerren's Files/School/Programming 1/Mod 5/Code/WindmillHut.py", line 23, in -toplevel-
    main()
  File "C:/Users/Gerren.Kids-PC/Desktop/Gerren's Files/School/Programming 1/Mod 5/Code/WindmillHut.py", line 22, in main
    winsound.Beep(int(note), int(duration*2000))
ValueError: frequency must be in 37 thru 32767

Что я делаю не так и на что мне нужно это поменять? Пожалуйста, будьте конкретны.

2 ответа

Решение

Функция winsound.beep - это просто оболочка для функции звукового сигнала API windows. Функция Windows требует, чтобы первый параметр (частота) находился в диапазоне от 37 до 32767. Я подозреваю, что любая частота вне диапазона находится вне диапазона слышимости человека. это также может быть так, потому что старые звуковые карты, для которых предназначена эта функция, поддерживают только этот диапазон.

вы вызываете winsound.beep(), и все, что возвращает int (note), выходит за пределы этого диапазона. Вам, вероятно, следует проверить правильность записи перед тем, как позвонить.

note = int(play[0])
if note > 37 and note < 32767:
    winsound.Beep(note, int(duration*2000))
else:
    print("error in input")

Из документации Winsound:

Параметр частоты указывает частоту звука в герцах и должен находиться в диапазоне от 37 до 32 767.

Вывод myro.makeSong - это не список частот, а список заметок. Вам нужно будет сделать поиск. http://wiki.roboteducation.org/Song_File_Format

Другие вопросы по тегам