DEFAULT_INSTRUMENT = "ScaleSynth EvenTempered 528" DEFAULT_SPEED = 120 if __name__ == "__main__": parser = argparse.ArgumentParser(description='MSP homework 9') parser.add_argument('score', type=str) parser.add_argument('-i', '--instrument', type=str, default=DEFAULT_INSTRUMENT) parser.add_argument('-s', '--speed', type=int, default=DEFAULT_SPEED) namespace = parser.parse_args() dac = DAC(bufferSize=2 ** 10, rate=44100) dac.start() try: sequencer = Sequencer(buffer_size=dac.bufferSize, sample_rate=dac.getSamplerate(), speed=namespace.speed) dac.connect(sequencer.callback) instrument = instruments.parse(namespace.instrument.split(), buffer_size=dac.bufferSize, sample_rate=dac.getSamplerate()) sequencer.add_instrument(instrument) file = open(namespace.score, 'r') score_string = file.read() file.close() score = Sequencer.parse_mono_score(score_string) sequencer.play(score=score)
DEFAULT_SCORE_FILE = "./scores/score_sample_blank.txt" if __name__ == "__main__": parser = argparse.ArgumentParser(description="Koshka - MSP project") parser.add_argument("score", nargs="?", type=str, default=DEFAULT_SCORE_FILE) parser.add_argument("--no_gui", type=bool, default=False, const=True, nargs="?") parser.add_argument("-l", "--loop", type=int, default=0, const=GridSequencer.INFINIT_LOOP, nargs="?") namespace = parser.parse_args() if namespace.no_gui: dac = DAC() dac.start() try: sequencer = GridSequencer(namespace.score, buffer_size=dac.bufferSize, sample_rate=dac.getSamplerate()) dac.connect(sequencer.callback) sequencer.play(namespace.loop) while sequencer.running: sleep(0.1) finally: dac.stop() else: from gui.main_window import MainWindow window = MainWindow(namespace) window.mainloop()
class MainWindow(Tk): def __init__(self, namespace): Tk.__init__(self, className="Koshka") self.dac = DAC() self.dac.start() self.score_path = namespace.score self.sequencer = None self.sequencer_frame = None self.mixer_window = None self.scale_window = None self._open_score(self.score_path) menu = Menu(self) self.config(menu=menu) filemenu = Menu(menu) menu.add_cascade(label="File", menu=filemenu) filemenu.add_command(label="Open...", command=self.open, accelerator="meta-o") filemenu.add_command(label="Save", command=self.save, accelerator="meta-s") filemenu.add_command(label="Save As...", command=self.save_as, accelerator="meta-shift-s") filemenu.add_separator() filemenu.add_command(label="Exit", command=self.quit) menu.add_cascade(label="Help", menu=filemenu) filemenu.add_command(label="Online Help...", command=lambda: webbrowser.open_new_tab(URL_HELP_DOC)) # Note: This is only implemented and tested for Mac OS self.bind_all("<Command-o>", self.open) self.bind_all("<Command-s>", self.save) self.bind_all("<Command-Shift-s>", self.save_as) self.bind_all("<Meta-o>", self.open) self.bind_all("<Meta-s>", self.save) self.bind_all("<Meta-Shift-s>", self.save_as) # self.wm_attributes("-titlepath",'What is this?') def __delete__(self, instance): print "__delete__" self._quit() def quit(self): print "tk quit" Tk.quit(self) pass def _quit(self): print "_quit" self.dac.stop() self.destroy() self.quit() def _open_sequencer(self, sequencer): print "\nMainWindow: _open_sequencer" # print("Stop DAC...") self.dac.stop() # print("Stop DAC...done") if self.sequencer_frame: self.sequencer_frame.destroy() if self.mixer_window: self.mixer_window.destroy() if self.scale_window is not None: self.scale_window.destroy() # print("Reset sequencer...") if self.sequencer is not None: self.sequencer.stop() self.sequencer.remove_all_observers() for i in self.sequencer.instruments: i.remove_all_observers() # print("Reset sequencer...done") # print("Connect sequencder...") self.sequencer = sequencer self.dac.connect(self.sequencer.callback) # print("Connect sequencder...done") for i in sequencer.instruments: i.id_variable = StringVar() i.id_variable.set(i.name_id) self.sequencer_frame = SequencerFrame(self, self.sequencer) self.sequencer_frame.pack() self.mixer_window = mixer_gui.MixerWindow(self, self.sequencer) self.scale_window = keyboard.ScaleWindow(self) for i in sequencer.instruments: self.scale_window.add_instrument(i) self.dac.start() pass def _open_score(self, score_path): self.score_path = score_path sequencer = GridSequencer(score_path, buffer_size=self.dac.bufferSize, sample_rate=self.dac.getSamplerate()) self._open_sequencer(sequencer) def open(self, val=Tkinter.Event()): score_path = tkFileDialog.askopenfilename(filetypes=[("Text file", ".txt")]) if score_path: self._open_score(score_path) def save(self, val=None): self.sequencer.save(self.score_path) # self.wm_attributes("-modified", 0) def save_as(self, val=None): self.score_path = tkFileDialog.asksaveasfilename(filetypes=[("Text file", ".txt")]) self.save()