【问题标题】:Python's winsound.Beep() pause issuesPython 的 winsound.Beep() 暂停问题
【发布时间】:2013-06-29 16:24:30
【问题描述】:

所以我的代码是这样的:

import winsound
import time

length = 250

class Notes():
    def frequency(halfNotesFromA4):
        value = 440 * ((2)**(1.0/12.0))**halfNotesFromA4
        return (int)(value)
    def processNote(note):
        if(note == 'C'):return Notes.frequency(3)
        if(note == 'D'):return Notes.frequency(5)
        if(note == 'E'):return Notes.frequency(7)
        if(note == 'F'):return Notes.frequency(8)
        if(note == 'G'):return Notes.frequency(10)
        if(note == 'A'):return Notes.frequency(12)
        if(note == 'B'):return Notes.frequency(14)

song = "EDCDEEE"
noteList = list(song)
print(noteList)

for note in noteList:
    print("Doing ", note)
    frequency = Notes.processNote(note)
    winsound.Beep(frequency, length)

它工作正常,但我遇到的问题是每次哔哔声之间都有停顿。我希望连续播放声音而没有停顿,这样听起来就像真正的音乐。 winsound.Beep() 库可以做到这一点吗?

【问题讨论】:

  • 也许ASYNC 标志可以提供帮助:docs.python.org/2/library/winsound.html#winsound.SND_ASYNC 顺便说一句:你的笔记不应该是 Notes.frequency(n) 且 n = [3, 5, 7, 8, 10, 12 , 14]?
  • 频率方法返回从 A4(440hz) 设置的频率的四舍五入版本,因此它返回正确的值。另外我正在查找您正在谈论的 ASYNC 标志'
  • 但是你不能用二分音符来获得大音阶。例如。从 C 到 D 有一个完整的音符步骤。
  • 啊哈哈。你的权利,Notes.frequency(5) 将是 D 而不是 E!傻我。此外,我看不到异步标志如何导致 Beep 在最后一次哔声之后立即播放:(

标签: python beep


【解决方案1】:

即使你使用这样的 while 循环:

 import winsound

 while True:
    winsound.Beep(100, 100)

中间还有一小段停顿,听起来不像是一个坚实的音符,而且你不能比这更快

你仍然可以尝试,但我认为你不能让它听起来像一声长哔声,但 winsound 确实有winsound.PlaySound(sound, flags),所以你可以在这里加载声音是Winsound Docs

你可以做的就是使用Pygame,它会做更多的工作,但它可能是一种更好的音乐创作方式

你可以使用Pygame Music 来加载和播放音乐,我相信你可以让它更具交互性,因为你必须从文件中加载每个声音

如果您不想做所有这些,请查看Python In Music 这可能是一个不错的起点

【讨论】:

  • 我注意到无论我如何使用它,winsound 都会出现停顿:(我只是想把我的代码提供给某人以防万一(正如 Johannes Charra 所做的那样),我本可以也举一个像你这样更简单的例子。我希望不必求助于其他图书馆,但我会研究你提到的那个!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-28
相关资源
最近更新 更多