运行 Python 上的多个 If 循环用于音乐制作?
Running Multiple If-Loops on Python for Music Production?
我正在为 Python 中的最终 class 项目创建一个简单的音乐制作程序,并使用 pyo 进行音频集成。我的目标是让用户能够创建简单的鼓模式,以他们选择的 BPM 播放。
我创建了一个名为 drumMachine() 的函数,它要求用户输入他们想要添加的鼓声集以及他们想要添加的节拍,然后选择相应的 if-loop鼓声并将节拍位置保存到字典中。下面添加了一段代码供参考。
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 节拍。我尝试用不同的节拍填充我的字典条目,但是当我播放声音时,none 的鼓声同时播放。
例如,如果我说我想在 1、2、3、4 上使用底鼓;圈套在 2、4;并且只拍 4,而不是所有东西一起玩,我得到: kick, snare, kick, clap 而不是 kick, kick+ snare, kick, kick+snare+鼓掌.
有什么方法可以同时拥有多个 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
我正在为 Python 中的最终 class 项目创建一个简单的音乐制作程序,并使用 pyo 进行音频集成。我的目标是让用户能够创建简单的鼓模式,以他们选择的 BPM 播放。
我创建了一个名为 drumMachine() 的函数,它要求用户输入他们想要添加的鼓声集以及他们想要添加的节拍,然后选择相应的 if-loop鼓声并将节拍位置保存到字典中。下面添加了一段代码供参考。
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 节拍。我尝试用不同的节拍填充我的字典条目,但是当我播放声音时,none 的鼓声同时播放。
例如,如果我说我想在 1、2、3、4 上使用底鼓;圈套在 2、4;并且只拍 4,而不是所有东西一起玩,我得到: kick, snare, kick, clap 而不是 kick, kick+ snare, kick, kick+snare+鼓掌.
有什么方法可以同时拥有多个 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