Как вы проигрываете два разных файла песен на python одновременно?

Я пытаюсь играть song1 и song2 (закомментированную) одновременно, но я не знаю, как это сделать, используя 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()

1 ответ

Решение

Я рекомендую вам использовать PyGame для такого рода работы и проверить этот связанный вопрос. Вы должны использовать модуль микшера.

В общем случае вам придется смешивать данные PCM, используя некоторые математические манипуляции с аудиопотоками (пример обсуждения см. В этом вопросе).


Обновление: Myro (который я никогда не использовал) говорит в документах, что есть способ сделать это, используя beep функция:

звуковой сигнал (собственный, длительность, частота, частота2 = нет): сделать тональный сигнал. Если даны два тона, робот объединит их.

В качестве простого примера, если у вас есть нота A, длительность 1 секунда в первой песне и нота B, длительность 2 секунды во второй песне, которую вы должны будете вызвать beep дважды: сначала сыграть обе ноты A и B одновременно в течение 1 секунды, а затем сыграть только ноту B еще 1 секунду.

Излишне говорить, что этот код будет намного сложнее, чем просто воспроизведение звуков из аудиофайлов с использованием чего-то вроде PyGame и их микширование.

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