0

这是我的代码:

从 myro 导入 winsound *

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

我做错了什么,我需要将其更改为什么?请具体。

4

2 回答 2

3

winsound.beep 函数只是windows api beep 函数的包装。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")
于 2012-10-18T19:30:48.287 回答
0

winsound 文档

频率参数指定声音的频率,以赫兹为单位,并且必须在 37 到 32,767 的范围内。

myro.makeSong 的输出不是频率列表,而是音符列表。您需要进行查找。http://wiki.roboteducation.org/Song_File_Format

于 2012-10-18T19:36:27.040 回答