【问题标题】:pygame.mixer can't play more than 8 notespygame.mixer 不能演奏超过 8 个音符
【发布时间】:2018-05-23 23:19:28
【问题描述】:

我正在尝试创建一个小程序,该程序将读取我在文本文件中编写的音符并将其作为钢琴音乐播放。

我正在使用 pygame 并使用混音器播放 .aiff 声音文件。一切正常,只是它不会播放超过 8 个音符。有人对这个有了解吗?我尝试过使用不同的文件和音符,它总是在第 8 个音符之后停止,但它会完整地播放那个音符。

以下是部分代码:

lines = f.readlines()

while lines[x] != '':
    line = lines[x]
    readingframe = line[b:b+4]
    for t in times:
        if t in readingframe:
            c = line.index(t,b)
            note = line[b:c]
            sound = mixer.Sound('C:/Python27/piano/' + note +'.aiff')
            sound.play()
            time.sleep(timeCorrespondence[t])
            b = c+1

这是我用来测试的样本音乐之一(加拿大):

a4hc5qc5if4hg4qa4qbb4qc5qdb5qg4wz 

之所以使用“z”是因为我设置的阅读框是 4,有些片段以一个只有三个字母 (abc) 的白键结尾,其中 a 是音符,b 表示位置,c 表示长度。

【问题讨论】:

  • 在您的问题中包含一些代码可以帮助人们更好地理解问题。 (stackoverflow.com/help/how-to-ask)
  • 好的,抱歉。将立即编辑
  • 好的,首先看起来您的框架捕获了 4 个字符 (line[b:b+4]),而不是您描述的 3 个。
  • 例如,'ab4q' 是作为四分音符演奏的第四个八度音阶的降 A,而 a4q 是作为四分音符演奏的第四个八度音阶的 A。所以有时我需要它来读取 4 个字符,有时是 3 个字符。通过使用 4 的阅读框,它将捕获这两种情况,并且由于音符的持续时间始终彼此相距至少 3 个字符,因此阅读框永远不会捕获超过一个持续时间。
  • 现在很清楚了,您的代码每行只读取n 注释,其中ntimes 的大小。 (for t in times)

标签: audio pygame mixer


【解决方案1】:

这个小修复应该可以解决您的问题:

lines = f.readlines()

while lines[x] != '':
    line = lines[x]
    readingframe = line[b:b+4]

    while b < len(readingframe):
        for t in times:
            if t in readingframe:
                c = line.index(t,b)
                note = line[b:c]
                maxTime = timeCorrespondence[t] * 1000
                sound = mixer.Sound('C:/Python27/piano/' + note +'.aiff')
                sound.play(maxtime=maxTime)
                b = c+1
                break

希望对您有所帮助。

【讨论】:

  • 嗯,当我使用你的代码时,它只播放 2 个音符。我想知道为什么,但我还没有弄清楚。
  • @Tony 你能验证程序是否正在读取所有笔记,在获取 aiff 文件之前添加print note
  • 是的,它绝对可以很好地阅读所有笔记。请输入文件名'let it all out' c5 bb4 a4 f5 c5 a4 bb4 f5 f5 g5 f5 c5 c5 bb4 bb4 a4 bb4 c5 c5 e4
  • @Tony 我编辑了我的答案,现在应该可以了,唯一的条件是声音的持续时间必须高于整个音符的持续时间。您可能会遇到延迟问题,如果是这种情况,请尝试在开始解析音符之前加载所有声音。
  • 可能是这样,我再次查看了 pygame 混音器的文档,发现它的默认设置是 8 通道。可能是 8 个音符占据了所有通道。我现在要看看你的答案
【解决方案2】:

Pygame 默认有 8 个通道。

混音器默认支持 8 个同步声音文件。您可以随时使用 set_num_channels() 函数更改可用声道的数量。

https://www.pygame.org/docs/ref/mixer.html#pygame.mixer.get_busy

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-18
    • 1970-01-01
    • 2017-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多