From bfc801c9f4759f6bffe9ad67fcc085d1e8f90fb5 Mon Sep 17 00:00:00 2001 From: Krzysztof Foltman Date: Mon, 4 Mar 2013 22:24:27 +0000 Subject: [PATCH] Improve Python wrappers for engines. Update more GUI code to use new APIs. --- example.py | 2 +- py/cbox.py | 39 ++++++++++++++++++++++++++++----------- py/instr_gui.py | 10 +++++----- 3 files changed, 34 insertions(+), 17 deletions(-) diff --git a/example.py b/example.py index 2a28bd5..64b5a29 100644 --- a/example.py +++ b/example.py @@ -484,7 +484,7 @@ class MainWindow(Gtk.Window): self.nb.remove_page(self.nb.get_n_pages() - 1) def update(self): - cbox.do_cmd("/on_idle", None, []) + cbox.call_on_idle() master = cbox.GetThings("/master/status", ['pos', 'pos_ppqn', 'tempo', 'timesig', 'sample_rate'], []) if master.tempo is not None: self.master_info.set_markup('%s (%s)' % (master.pos, master.pos_ppqn)) diff --git a/py/cbox.py b/py/cbox.py index 6d6fff9..44302c8 100644 --- a/py/cbox.py +++ b/py/cbox.py @@ -209,10 +209,22 @@ class SetterMaker(): self.path = path def set(self, value): self.obj.cmd(self.path, None, value) + def set2(self, key, value): + self.obj.cmd(self.path, None, key, value) class NonDocObj(object): - def __init__(self, path): + def __init__(self, path, status_field_list): self.path = path + self.status_fields = [] + for sf in status_field_list: + if sf.startswith("="): + sf = sf[1:] + if sf.startswith("%"): + sf2 = sf[1:] + self.__dict__['set_' + sf2] = SetterMaker(self, "/" + sf2).set2 + else: + self.__dict__['set_' + sf] = SetterMaker(self, "/" + sf).set + self.status_fields.append(sf) def cmd(self, cmd, fb = None, *args): do_cmd(self.path + cmd, fb, list(args)) @@ -236,14 +248,8 @@ class NonDocObj(object): class DocObj(NonDocObj): def __init__(self, uuid, status_field_list): - NonDocObj.__init__(self, Document.uuid_cmd(uuid, '')) + NonDocObj.__init__(self, Document.uuid_cmd(uuid, ''), status_field_list) self.uuid = uuid - self.status_fields = [] - for sf in status_field_list: - if sf.startswith("="): - sf = sf[1:] - self.__dict__['set_' + sf] = SetterMaker(self, "/" + sf).set - self.status_fields.append(sf) def delete(self): self.cmd("/delete") @@ -352,7 +358,8 @@ class DocLayer(DocObj): Document.classmap['cbox_layer'] = DocLayer class SamplerEngine(NonDocObj): - status_fields = ['polyphony', 'active_voices', '%volume', '%patch', '%pan'] + def __init__(self, path): + NonDocObj.__init__(self, path, ['polyphony', 'active_voices', '%volume', '%patch', '%pan']) def load_patch_from_cfg(self, patch_no, cfg_section, display_name): return self.cmd_makeobj("/load_patch", int(patch_no), cfg_section, display_name) def load_patch_from_string(self, patch_no, sample_dir, sfz_data, display_name): @@ -372,7 +379,8 @@ class SamplerEngine(NonDocObj): return status class FluidsynthEngine(NonDocObj): - status_fields = ['polyphony', 'soundfont', '%patch'] + def __init__(self, path): + NonDocObj.__init__(self, path, ['polyphony', 'soundfont', '%patch']) def load_soundfont(self, filename): return self.cmd_makeobj("/load_soundfont", filename) def set_patch(self, channel, patch_no): @@ -386,6 +394,8 @@ class FluidsynthEngine(NonDocObj): return status class StreamPlayerEngine(NonDocObj): + def __init__(self, path): + NonDocObj.__init__(self, path, ['filename', 'pos', 'length', 'playing']) def play(self): self.cmd('/play') def stop(self): @@ -397,10 +407,17 @@ class StreamPlayerEngine(NonDocObj): def unload(self, filename, loop_start = -1): self.cmd('/unload') +class TonewheelOrganEngine(NonDocObj): + def __init__(self, path): + NonDocObj.__init__(self, path, ['=%upper_drawbar', '=%lower_drawbar', '=%pedal_drawbar', + '=upper_vibrato', '=lower_vibrato', '=vibrato_mode', '=vibrato_chorus', + '=percussion_enable', '=percussion_3rd']) + engine_classes = { 'sampler' : SamplerEngine, 'fluidsynth' : FluidsynthEngine, - 'stream_player' : StreamPlayerEngine + 'stream_player' : StreamPlayerEngine, + 'tonewheel_organ' : TonewheelOrganEngine, } class DocInstrument(DocObj): diff --git a/py/instr_gui.py b/py/instr_gui.py index 5151a2d..cc973cb 100644 --- a/py/instr_gui.py +++ b/py/instr_gui.py @@ -12,7 +12,7 @@ class StreamWindow(Gtk.VBox): self.filebutton = Gtk.FileChooserButton("Streamed file") self.filebutton.set_action(Gtk.FileChooserAction.OPEN) self.filebutton.set_local_only(True) - self.filebutton.set_filename(cbox.GetThings("%s/status" % self.path, ['filename'], []).filename) + self.filebutton.set_filename(self.engine.status().filename) self.filebutton.add_filter(standard_filter(["*.wav", "*.WAV", "*.ogg", "*.OGG", "*.flac", "*.FLAC"], "All loadable audio files")) self.filebutton.add_filter(standard_filter(["*.wav", "*.WAV"], "RIFF WAVE files")) self.filebutton.add_filter(standard_filter(["*.ogg", "*.OGG"], "OGG container files")) @@ -252,7 +252,7 @@ class TonewheelOrganWindow(Gtk.VBox): model.append((oval, oname)) combo = standard_combo(model, column = 1) self.hboxes[row].pack_start(combo, False, False, 5) - combo.update_handler = combo.connect('changed', lambda w, path: cbox.do_cmd(path, None, [w.get_model()[w.get_active()][0]]), path + '/' + flag) + combo.update_handler = combo.connect('changed', lambda w, setter: setter(w.get_model()[w.get_active()][0]), getattr(self.engine, 'set_' + flag)) self.combos[flag] = combo panel.pack_start(self.hboxes[1], False, False, 5) panel.pack_start(self.hboxes[2], False, False, 5) @@ -263,18 +263,18 @@ class TonewheelOrganWindow(Gtk.VBox): slider.props.digits = 0 table.attach(slider, i + 1, i + 2, 0, 1) self.drawbars['u%d' % i] = slider.get_adjustment() - slider.get_adjustment().connect('value-changed', lambda adj, path, drawbar: cbox.do_cmd(path + '/upper_drawbar', None, [drawbar, int(adj.get_value())]), self.path, i) + slider.get_adjustment().connect('value-changed', lambda adj, drawbar: self.engine.set_upper_drawbar(drawbar, int(adj.get_value())), i) slider = Gtk.VScale(adjustment = Gtk.Adjustment(0, 0, 8, 1, 1)) slider.props.digits = 0 table.attach(slider, i + 1, i + 2, 1, 2) self.drawbars['l%d' % i] = slider.get_adjustment() - slider.get_adjustment().connect('value-changed', lambda adj, path, drawbar: cbox.do_cmd(path + '/lower_drawbar', None, [drawbar, int(adj.get_value())]), self.path, i) + slider.get_adjustment().connect('value-changed', lambda adj, drawbar: self.engine.set_lower_drawbar(drawbar, int(adj.get_value())), i) panel.add(table) self.add(panel) self.refresh() def refresh(self): - attribs = cbox.GetThings("%s/status" % self.path, ['%upper_drawbar', '%lower_drawbar', '%pedal_drawbar'], []) + attribs = self.engine.status() for i in range(9): self.drawbars['u%d' % i].set_value(attribs.upper_drawbar[i]) self.drawbars['l%d' % i].set_value(attribs.lower_drawbar[i]) -- 2.11.4.GIT