我想做一个平台来像吉他一样演奏和弦。例如 - 要演奏 E 和弦,它会演奏 [0, 2, 2, 1, 0, 0](从 Low-E 弦到 High-E 弦)。
我试图通过同时播放所有不同的字符串(通过使用线程)在 python 上播放和弦。
问题是每次我开始演奏下一根弦时,似乎最后一根琴弦停止演奏,而新的一根弦取代了它。所以我在弹奏一个和弦后听到的都是最高的弦(最后一个)。
我没有正确使用线程吗?还是当前功能有问题?或者也许是无法处理这类事情的 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() 函数没有任何问题。
那么问题是什么,我该如何解决?
编辑:
我已经在 C# 中尝试过,但它也没有工作。这是在 C# 中启动线程的正确方法吗?
foreach (Thread t in threads)
t.Start();
foreach (Thread t in threads)
t.Join();