1

我正在尝试同时播放歌曲 1 和歌曲 2(被注释掉的歌曲),但我不知道如何使用 myro 或 winsound 或其他任何方式来做到这一点。有人建议使用线程,但我也不知道该怎么做,因为我只是一个非常初级的程序员。有人可以帮我解决这个问题和/或详细解释如何做到这一点吗?这是我到目前为止所拥有的:

import winsound
from myro import *
def main():

    HftM1 = makeSong("Db4 3/8; C4 3/8; Bb3 1/4; Bb3 3/8; Ab3 3/8; Gb3 3/8; Ab3 1/16; C4 3/8; Bb3 3/8; Ab3 1/8; Eb3 1/16; F3 1/16; Ab3 3/8; G3 3/8; F3 3/8; C4 1/16; Db4 3/8; C4 3/8; Bb3 1/8; F3 1/16; Gb3 1/16; Bb3 3/8; Ab3 3/8; Gb3 3/8; C4 3/8; Bb3 3/8; Ab3 1/8; Eb3 1/16; F3 1/16; Ab3 3/8; G3 3/8; F3 3/8")

    saveSong(HftM1, "HymnfortheMissing1.txt", append=1)

    HftM2 = makeSong("Bb2 1/8; F3 1/8; Bb3 1/4; Bb2 1/8; F3 3/8; Gb2 1/8; Db3 1/8; Gb3 1/4; Gb2 1/8; Db3 3/8; Ab2 1/8; Eb3 1/8; Ab3 1/4; Ab2 1/8; Eb3 3/8; F2 1/8; C3 1/8; F3 1/4; F2 1/8; C3 3/8; Bb2 1/8; F3 1/8; Bb3 1/4; Bb2 1/8; F3 3/8; Gb2 1/8; Db3 1/8; Gb3 1/4; Gb2 1/8; Db3 3/8; Ab2 1/8; Eb3 1/8; Ab3 1/4; Ab2 1/8; Eb3 3/8; F2 1/8; C3 1/8; F3 1/4; F2 1/8; C3 3/8")

    saveSong(HftM2, "HymnfortheMissing2.txt", append=1)

    song1 = readSong("HymnfortheMissing1.txt")

    #song2 = readSong("HymnfortheMissing2.txt") #This part of the song is supposed to be played at the same time as the first part, but I don't know how to do that so...

    play = []

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

1 回答 1

3

我建议您使用PyGame进行此类工作,并查看此相关问题。您必须使用混音器模块。

一般来说,您必须对音频流使用一些数学操作来混合 PCM 数据(有关示例讨论,请参见此问题)。


更新:Myro(我从未使用过)在文档中说有一种方法可以使用该beep函数来做到这一点:

beep(self, duration, frequency, frequency2 = None):发出声音。如果给出两个音调,机器人会将它们组合起来。

举个简单的例子,如果您在第一首歌曲中有音符 A,持续时间为 1 秒,而在第二首歌曲中有音符 B,持续时间为 2 秒,您将必须调用beep两次:首先同时播放音符 A 和 B 1 秒,然后只演奏音符 B 1 秒钟。

不用说,这段代码比使用 PyGame 之类的播放音频文件中的声音并混合它们要复杂得多。

于 2012-10-15T19:11:53.793 回答