class MelodyPlayer(): def __init__(self, speed=0.1): self.melody = None self.speed = speed self.static_start_note = 28 self.transpose = 0 self.pd = PdSender(settings["PD_HOST"], settings["PD_PORT"]) def play(self, real_scale, start=0): """plays the melody given in the self.melody attribute by sending the necessary messages to the roqba-sound-engine""" if not self.melody: raise RuntimeError("Impossible Request: no melody given") start_note = (self.static_start_note + self.melody['start_note']) current_note = start_note self.pd.send("sound 1") for counter, note in enumerate(self.melody['melody']): move = note[0] modifier = None if type(move) == str: move, modifier = extract_modified_move(move) modifier = (modifier == '-' and -1 or 1) next_note = current_note + move next_real_note = real_scale[next_note] if modifier: next_real_note += modifier print(next_real_note + self.transpose, end=' ') if counter >= start: self.pd.send(["voice", 1, "dur", self.speed * note[1] * 1000]) self.pd.send(["voice", 1, next_real_note + self.transpose]) time.sleep(self.speed * note[1]) current_note = next_note
def __init__(self, speed=0.1): self.melody = None self.speed = speed self.static_start_note = 28 self.transpose = 0 self.pd = PdSender(settings["PD_HOST"], settings["PD_PORT"])