1

我正在为 Python 中的最终课程项目创建一个简单的音乐制作程序,并使用pyo进行音频集成。我的目标是让用户能够创建以他们选择的 BPM 播放的简单鼓模式。

我创建了一个名为drumMachine() 的函数,它要求用户输入他们想要添加的鼓声集以及他们想要添加的节拍,然后为鼓声选择相应的if循环并保存将展示位置放入字典中。在下面添加了一段代码供参考。

if drumMachine_userInput == 1: #KICK DRUMS
        #ask for drum beats
    kick_input = input("Which beat(s) do you want to place your kick drums?")
        #split str into list
    kick_list = kick_input.split()
        #convert str list into int list, replacing old list
    kick_list = [int(i) for i in kick_list]
        #add result to dictionary
    instrument_dict['kicks'].append(kick_list)

然后程序进入一个 While 循环,通过查看字典中是否存在鼓的节拍位置,以选定的 BPM 以选定的节拍播放鼓声。现在为了测试我的程序,我只实现了在节拍 1、2、3 或 4 上执行此操作的能力,顺便说一句。

   while True:
    counter += 1

    if counter > 4:
        counter = 1
        measureCounter += 1

    if 'kicks' in instrument_dict:
        if counter == 1 in kick_list:
            sf = SfPlayer('kick.wav', speed=1, loop=False).out()
        elif counter == 2 in kick_list:
            sf = SfPlayer('kick.wav', speed=1, loop=False).out()
        elif counter == 3 in kick_list:
            sf = SfPlayer('kick.wav', speed=1, loop=False).out()
        elif counter == 4 in kick_list:
            sf = SfPlayer('kick.wav', speed=1, loop=False).out()

现在,我遇到的问题是我不确定我能做些什么来让用户能够在该循环之上添加另一层鼓。例如,如果用户想要在底鼓之上添加小鼓到节拍 2 和 4。我尝试用不同的节拍填充我的字典条目,但是当我播放声音时,没有一个鼓声同时播放。

例如,如果我说我要在 1、2、3、4 上打底鼓;2、4 上的圈套;并且只拍4个,而不是所有东西一起演奏,我得到:踢,圈套,踢,拍而不是踢,踢+圈套,踢,踢+圈套+拍。

有什么办法可以同时运行多个 if 循环?或者有没有其他方法能够编码一次运行多个鼓循环的能力,而我只是没有看到?希望这是有道理的。

提前感谢大家的帮助!

4

1 回答 1

1

我挖了一些 wav 文件并修改了我之前的答案以创建一个正在运行的示例程序:

from pyo.lib.players import SfPlayer
from pyo import Server
from time import sleep
s = Server().boot()
s.start()
instrument_beats =  {
    "kicks": [1,2,3,4],
    "snares": [2,4],
    "claps": [4],
}
wave_file = {
    "kicks": "kick.wav",
    "snares": "snare.wav",
    "claps": "clap.wav",
}
counter = 0
measureCounter = 0
while measureCounter < 5:
    counter += 1
    if counter > 4:
        counter = 1
        measureCounter += 1
    players = []
    for instrument,beats in instrument_beats.items():
        if counter in beats:
            players.append(SfPlayer(wave_file[instrument], speed=1, loop=False).out())
    sleep(0.5) # beat delay
于 2020-12-04T05:02:44.007 回答