Метроном Python с витой: как передать параметр для итерации? - PullRequest
0 голосов
/ 08 мая 2018

Я хотел построить метроном в Python.

У меня есть 2 звуковых файла. Каждую секунду должен воспроизводиться первый звуковой файл, а каждую четвертую секунду должен воспроизводиться второй звуковой файл.

Я нашел витой модуль, но не мог понять, как передать параметр и выполнить его итерацию. Итак, у меня есть счетчик переменных, который я хочу перебрать, но он не работает со следующим кодом:

import simpleaudio as sa
from twisted.internet import task
from twisted.internet import reactor


def beat(bpm, counter):
    timeout = 60/bpm
    l = task.LoopingCall(play_beat, counter=counter)
    l.start(timeout)
    reactor.run()


def play_beat(counter):
    counter += 1
    print(counter) #This prints always 2, I am expecting an iteration like 2, 3, 4, 5, 6 ...
    if counter % 4 == 0:
        wave_obj = sa.WaveObject.from_wave_file("wav/beat_end.wav")
    else:
        wave_obj = sa.WaveObject.from_wave_file("wav/beat_start.wav")
    play_obj = wave_obj.play()
    play_obj.wait_done()
    pass

beat(60, 1)

1 Ответ

0 голосов
/ 09 мая 2018

Вот еще одно решение.

import simpleaudio as sa
from twisted.internet import task
from twisted.internet import reactor

def beat(bpm, wave_obj):
    timeout = 60.0 / bpm
    l = task.LoopingCall(play_beat, wave_obj)
    l.start(timeout)

def play_beat(wave_obj):
    wave_obj.play()

beat_start = sa.WaveObject.from_wave_file(...)
beat_end = sa.WaveObject.from_wave_file(...)

bpm = 60.0
bps = bpm / 60
reactor.callLater(0 / bps, beat, bpm / 4, beat_start)
reactor.callLater(1 / bps, beat, bpm / 4, beat_start)
reactor.callLater(2 / bps, beat, bpm / 4, beat_start)
reactor.callLater(3 / bps, beat, bpm / 4, beat_end)
reactor.run()

Может быть примечательно, что я удалил вызов wait_done. Если вы блокируете поток реактора таким образом, вы можете ожидать менее надежного планирования событий на основе времени.

...