在Python上为音乐制作运行多个If循环?

在Python上为音乐制作运行多个If循环?,python,pyo,Python,Pyo,我正在用Python为最后一个课程项目创建一个简单的音乐制作程序,并使用pyo进行音频集成。我的目标是让用户能够创建简单的鼓模式,在他们选择的BPM中播放 我创建了一个名为drumMachine()的函数,它要求用户输入他们想要添加的鼓声集和他们想要添加的节拍,然后为鼓声选择相应的if循环,并将节拍位置保存到字典中。在下面添加了一段代码供参考 if drumMachine_userInput == 1: #KICK DRUMS #ask for drum beats ki

我正在用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以选定的节拍播放鼓的声音。现在,为了测试我的程序,我只在beat1、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循环同时运行?或者,有没有其他方法可以编写一次运行多个鼓循环的代码,而我只是没有看到?希望这是有意义的


提前感谢大家的帮助

我找到了一些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
从pyo.lib.players导入SfPlayer
从pyo导入服务器
从时间上导入睡眠
s=Server().boot()
s、 开始()
乐器节拍={
“踢”:[1,2,3,4],
“圈套”:[2,4],
“鼓掌”:[4],
}
波形文件={
“kick”:“kick.wav”,
“陷阱”:“snare.wav”,
“拍手”:“拍手,拍手”,
}
计数器=0
measureCounter=0
当测量计数器<5时:
计数器+=1
如果计数器>4:
计数器=1
测量计数器+=1
玩家=[]
对于乐器,乐器中的节拍\u beats.items()
如果计数器在拍中:
append(SfPlayer(波形文件[instrument],速度=1,循环=False).out())
睡眠(0.5)#节拍延迟

我不知道如何理解您的条件:
如果kick\u列表中的counter==1:
。我不认为它做了你认为它在做的事。另外,如果通过两个SfPlayer.out()函数运行wav文件,那么第一个函数是在第二个函数之前运行完成的,还是并行运行的?如果是并行的,您如何设置节拍计时?回答您的第一个问题:我的逻辑是计数器将我的时间计数到节拍4,然后重置,因此如果计数器在节拍1中,并且该节拍在鼓点列表中,那么它将与计数器同时播放。这样做不对吗?回答你的第二个问题:如果我运行两个wav文件,只运行第一个调用的wav文件,就这样——我还没有找到一种并行运行它们的方法,这就是我要做的。很抱歉,我将所有这些问题捆绑在一条评论中。至于if语句,它将从左到右求值:
计数器==1
将返回
False
True
,然后下一部分将测试
在kick_list中是否为False
或在kick_list中是否为True,我认为这不是您的意图。你要找的是
如果kick_列表中的计数器:
,你只需要其中一个。没问题,哈哈。啊!!明白了。这是有道理的,谢谢你解释这一区别。你有什么关于并行播放声音的建议吗?我很快看了一下pyo,看起来声音会并行播放。我没有要测试的.wave文件,但我创建了一个答案,可以满足您的需要。非常感谢!这很有帮助。