Я хочу сделать платформу для игры аккордами, как это делает гитара. Например, чтобы сыграть аккорд E, он играет [0, 2, 2, 1, 0, 0] (от струны Low-E к струне High-E).
Я пытаюсь играть аккорды на питоне, одновременно воспроизводя все разные струны (используя потоки).
Проблема в том, что каждый раз, когда я начинаю играть на следующих струнах, кажется, что последняя струна перестает играть, и что ее заменяет новая. Так что все, что я слышу после игры аккорда, это самая высокая струна (последняя).
Я использую темы неправильно? Или это проблема с текущими функциями? Или, может быть, это функция winsound.Beep(), которая не может справиться с такими вещами?
Это мой код:
from winsound import Beep
import threading
import time
def play(freq, dur):
Beep(round(freq), round(dur))
def get_freq(string, fret):
a3_freq = 220
half_tone = 2 ** (1 / 12)
higher_from_a3_by = 5 * (string - 2) + fret
if string > 4:
higher_from_a3_by += 1
return a3_freq * half_tone ** higher_from_a3_by
def strum(string, fret, time):
freq = get_freq(string, fret)
t = threading.Thread(target=play, args=(freq, time))
t.start()
return t
def chord(frets, dur):
threads = []
for i in range(6):
if frets[i] != -1:
threads.append(strum(i + 1, frets[i], dur))
for t in threads:
t.join()
chord((-1, 0, 2, 2, 2, 0), 1000) # plays the A chord for one second, for example.
Из того, что я проверил, функции play() и get_freq() не вызывают никаких проблем.
Так в чем проблема, и как я могу это исправить?
Редактировать:
Я пробовал это на С#, но это тоже не сработало. Это правильный способ запуска потоков в С#?
foreach (Thread t in threads)
t.Start();
foreach (Thread t in threads)
t.Join();
Beep()
звучит как неправильный инструмент для игры аккордами. Рассматривали ли вы вместо этого использование PyAudio? - person blubberdiblub   schedule 29.04.2017