def __init__(self, track, sequencer): gtk.VBox.__init__(self) self.grid = MsqNoteGridWidget(track, sequencer) self.setting = self.grid.setting track_info = get_track_info(track) self.setting.chan_num = track_info.channels[0] if len(track_info.channels) else 0 self.hbar = MsqHBarTimeWidget(self.grid) self.vbar = MsqVBarNoteWidget(self.setting) self.setting.vadj.connect("value-changed", self.vadj_value_cb) self.grid.connect("motion_notify_event", self.handle_motion, self.hbar, self.vbar) self.grid.set_tooltip_text("""\ * Left button to select notes * Right button to enter in edit mode then in edit mode press left button to write notes (do not release the button to increase size) * Middle button to change note size * Suppr to delete selected notes * Ctrl-a Select all notes * Ctrl-c Copy selected * Ctrl-v Paste copied notes""") self.grid.get_settings().set_long_property("gtk-tooltip-timeout", 3000, "midilooper:gridvp") self.grid.connect("leave-notify-event", self.handle_leave_notify, self.hbar, self.vbar) hsb = gtk.HScrollbar(self.setting.hadj) vsb = gtk.VScrollbar(self.setting.vadj) table = gtk.Table(3, 2) table.attach(self.hbar, 1, 2, 0, 1, gtk.FILL, 0) table.attach(self.vbar, 0, 1, 1, 2, 0, gtk.FILL) table.attach(self.grid, 1, 2, 1, 2, gtk.EXPAND|gtk.FILL, gtk.EXPAND|gtk.FILL) table.attach(vsb, 2, 3, 1, 2, 0, gtk.FILL) self.val_list = gtk.ListStore(int, str) chan_key = "%i" % self.setting.chan_num if track_info.ctrl_chan.has_key(chan_key): ctrl_list = track_info.ctrl_chan[chan_key] else: ctrl_list = [] if track_info.note_chan.has_key(chan_key): self.val_list.append([9, "Note on *"]) else: self.val_list.append([9, "Note on"]) if track_info.pitch_chan.has_key(chan_key): self.val_list.append([14, "Pitch Bend *"]) else: self.val_list.append([14, "Pitch Bend"]) for idx in range(128): self.val_list.append([idx, "Ctrl %i *" % idx if idx in ctrl_list else "Ctrl %i" % idx]) valuetype_cbbox = gtk.ComboBox(self.val_list) valuetype_cbbox.set_active(0) cell = gtk.CellRendererText() valuetype_cbbox.pack_start(cell, True) valuetype_cbbox.add_attribute(cell, 'text', 1) valuetype_cbbox.connect("changed", self.valuetype_changed) value_adjwgt = gtk.VScale() value_adjwgt.set_inverted(True) value_adjwgt.set_draw_value(False) value_box = gtk.HBox() value_box.pack_start(valuetype_cbbox) value_box.pack_start(value_adjwgt, expand=False, fill=False) value_box.set_size_request(self.vbar.width, -1) self.value_wgt = MsqValueWidget(self.setting, value_adjwgt) self.value_wgt.connect("leave-notify-event", self.handle_leave_notify, self.hbar, self.vbar) self.grid.value_wgt = self.value_wgt self.value_wgt.grid = self.grid self.zx_adj = gtk.Adjustment(15.0, 1.0, 25.0, 1.0) self.zx_adj.connect("value_changed", self.handle_zoom_x) zoom_x = gtk.HScale(self.zx_adj) zoom_x.set_draw_value(False) zoom_x.set_update_policy(gtk.UPDATE_DISCONTINUOUS) table2 = gtk.Table(2, 2) table2.attach(value_box, 0, 1, 0, 1, gtk.FILL, gtk.EXPAND|gtk.FILL) table2.attach(self.value_wgt, 1, 2, 0, 1, gtk.EXPAND|gtk.FILL, gtk.EXPAND|gtk.FILL) table2.attach(zoom_x, 0, 1, 1, 2, gtk.FILL, 0) table2.attach(hsb, 1, 2, 1, 2, gtk.FILL, 0) self.hbar.connect("scroll-event", self.scroll_adj_cb, self.setting) self.vbar.connect("scroll-event", self.scroll_adj_cb, self.setting) self.grid.connect("scroll-event", self.scroll_adj_cb, self.setting) paned_tables = gtk.VPaned() paned_tables.pack1(table, resize=False, shrink=False) paned_tables.pack2(table2, resize=False, shrink=False) grid_setting_frame = gtk.Frame("Grid setting") grid_setting_frame.add(GridSettingTable(self, track_info.channels)) setting_box = gtk.HBox() setting_box.pack_start(grid_setting_frame, expand=False) self.pack_start(setting_box, expand=False) self.pack_start(paned_tables) debug_hbox = gtk.HBox() button_misc = gtk.Button("Redraw") button_misc.connect("clicked", self.debug_grid1, self.setting.track) debug_hbox.pack_start(button_misc) button_misc = gtk.Button("Dump track") button_misc.connect("clicked", self.debug_grid2, self.setting.track) debug_hbox.pack_start(button_misc) debug_frame = gtk.Frame("Note grid debug") debug_frame.add(debug_hbox) self.pack_end(debug_frame, expand=False) self.draw_all()
class ChannelEditor(gtk.VBox): def vadj_value_cb(self, adj): self.vbar.draw_all() self.grid.draw_all() def vadj_value_cb(self, adj): self.hbar.draw_all() self.grid.draw_all() self.value_wgt.draw_all() def scroll_adj_cb(self, widget, event, setting): if is_mask_to_bypass(event.state): return inc_mult = 4 if event.direction == gdk.SCROLL_DOWN: if event.state & gtk.gdk.SHIFT_MASK: xinc = setting.qnxsz * inc_mult inc_adj(setting.hadj, xinc) elif event.state & gtk.gdk.CONTROL_MASK: step = self.zx_adj.get_step_increment() val = self.zx_adj.get_value() - step if val >= self.zx_adj.get_lower(): self.zx_adj.set_value(val) else: yinc = setting.noteysz * inc_mult inc_adj(setting.vadj, yinc) elif event.direction == gdk.SCROLL_UP: if event.state & gtk.gdk.SHIFT_MASK: xinc = setting.qnxsz * inc_mult dec_adj(setting.hadj, xinc) elif event.state & gtk.gdk.CONTROL_MASK: step = self.zx_adj.get_step_increment() val = self.zx_adj.get_value() + step if val <= self.zx_adj.get_upper(): self.zx_adj.set_value(val) else: yinc = setting.noteysz * inc_mult dec_adj(setting.vadj, yinc) elif event.direction == gdk.SCROLL_RIGHT: xinc = setting.qnxsz * inc_mult inc_adj(setting.hadj, xinc) elif event.direction == gdk.SCROLL_LEFT: xinc = setting.qnxsz * inc_mult dec_adj(setting.hadj, xinc) def draw_all(self): self.hbar.draw_all() self.grid.draw_all() self.value_wgt.draw_all() def debug_grid1(self, button, track): self.draw_all() def debug_grid2(self, button, track): track._dump() def handle_motion(self, widget, event, hbar, vbar): # tick = self.grid.xpos2tick(event.x) note = vbar.ypos2note(int(event.y)) # hbar.show_tick(tick) vbar.show_note(note) def handle_leave_notify(self, widget, event, hbar, vbar): vbar.clear_note() def handle_zoom_x(self, adj): zval = adj.get_value() old_qnxsz = self.setting.qnxsz old_pos = self.setting.hadj.get_value() if zval <= 16.0: self.setting.qnxsz = int(MIN_QNOTE_XSZ + ((DEFAULT_QNOTE_XSZ - MIN_QNOTE_XSZ) * zval / 16.0)) else: self.setting.qnxsz = int(DEFAULT_QNOTE_XSZ + ((MAX_QNOTE_XSZ - DEFAULT_QNOTE_XSZ) * (zval - 16) / 16.0)) self.setting.hadj.set_upper(self.setting.getmaxwidth()) pos = old_pos * self.setting.qnxsz / old_qnxsz self.setting.hadj.set_value(pos) self.draw_all() def valuetype_changed(self, combobox): value_list = combobox.get_model() # Refreshing midivalue type list track_info = get_track_info(self.setting.track) update_value_list(value_list, track_info, self.setting.chan_num) # Updating "Value widget" mode and window list_idx = combobox.get_active() if list_idx >= 0: value = value_list[list_idx][0] if list_idx == 0: self.value_wgt.set_note_mode() elif list_idx == 1: self.value_wgt.set_pitch_mode() else: if list_idx > 1: self.value_wgt.set_ctrl_mode(list_idx - 2) self.value_wgt.draw_all() def __init__(self, track, sequencer): gtk.VBox.__init__(self) self.grid = MsqNoteGridWidget(track, sequencer) self.setting = self.grid.setting track_info = get_track_info(track) self.setting.chan_num = track_info.channels[0] if len(track_info.channels) else 0 self.hbar = MsqHBarTimeWidget(self.grid) self.vbar = MsqVBarNoteWidget(self.setting) self.setting.vadj.connect("value-changed", self.vadj_value_cb) self.grid.connect("motion_notify_event", self.handle_motion, self.hbar, self.vbar) self.grid.set_tooltip_text("""\ * Left button to select notes * Right button to enter in edit mode then in edit mode press left button to write notes (do not release the button to increase size) * Middle button to change note size * Suppr to delete selected notes * Ctrl-a Select all notes * Ctrl-c Copy selected * Ctrl-v Paste copied notes""") self.grid.get_settings().set_long_property("gtk-tooltip-timeout", 3000, "midilooper:gridvp") self.grid.connect("leave-notify-event", self.handle_leave_notify, self.hbar, self.vbar) hsb = gtk.HScrollbar(self.setting.hadj) vsb = gtk.VScrollbar(self.setting.vadj) table = gtk.Table(3, 2) table.attach(self.hbar, 1, 2, 0, 1, gtk.FILL, 0) table.attach(self.vbar, 0, 1, 1, 2, 0, gtk.FILL) table.attach(self.grid, 1, 2, 1, 2, gtk.EXPAND|gtk.FILL, gtk.EXPAND|gtk.FILL) table.attach(vsb, 2, 3, 1, 2, 0, gtk.FILL) self.val_list = gtk.ListStore(int, str) chan_key = "%i" % self.setting.chan_num if track_info.ctrl_chan.has_key(chan_key): ctrl_list = track_info.ctrl_chan[chan_key] else: ctrl_list = [] if track_info.note_chan.has_key(chan_key): self.val_list.append([9, "Note on *"]) else: self.val_list.append([9, "Note on"]) if track_info.pitch_chan.has_key(chan_key): self.val_list.append([14, "Pitch Bend *"]) else: self.val_list.append([14, "Pitch Bend"]) for idx in range(128): self.val_list.append([idx, "Ctrl %i *" % idx if idx in ctrl_list else "Ctrl %i" % idx]) valuetype_cbbox = gtk.ComboBox(self.val_list) valuetype_cbbox.set_active(0) cell = gtk.CellRendererText() valuetype_cbbox.pack_start(cell, True) valuetype_cbbox.add_attribute(cell, 'text', 1) valuetype_cbbox.connect("changed", self.valuetype_changed) value_adjwgt = gtk.VScale() value_adjwgt.set_inverted(True) value_adjwgt.set_draw_value(False) value_box = gtk.HBox() value_box.pack_start(valuetype_cbbox) value_box.pack_start(value_adjwgt, expand=False, fill=False) value_box.set_size_request(self.vbar.width, -1) self.value_wgt = MsqValueWidget(self.setting, value_adjwgt) self.value_wgt.connect("leave-notify-event", self.handle_leave_notify, self.hbar, self.vbar) self.grid.value_wgt = self.value_wgt self.value_wgt.grid = self.grid self.zx_adj = gtk.Adjustment(15.0, 1.0, 25.0, 1.0) self.zx_adj.connect("value_changed", self.handle_zoom_x) zoom_x = gtk.HScale(self.zx_adj) zoom_x.set_draw_value(False) zoom_x.set_update_policy(gtk.UPDATE_DISCONTINUOUS) table2 = gtk.Table(2, 2) table2.attach(value_box, 0, 1, 0, 1, gtk.FILL, gtk.EXPAND|gtk.FILL) table2.attach(self.value_wgt, 1, 2, 0, 1, gtk.EXPAND|gtk.FILL, gtk.EXPAND|gtk.FILL) table2.attach(zoom_x, 0, 1, 1, 2, gtk.FILL, 0) table2.attach(hsb, 1, 2, 1, 2, gtk.FILL, 0) self.hbar.connect("scroll-event", self.scroll_adj_cb, self.setting) self.vbar.connect("scroll-event", self.scroll_adj_cb, self.setting) self.grid.connect("scroll-event", self.scroll_adj_cb, self.setting) paned_tables = gtk.VPaned() paned_tables.pack1(table, resize=False, shrink=False) paned_tables.pack2(table2, resize=False, shrink=False) grid_setting_frame = gtk.Frame("Grid setting") grid_setting_frame.add(GridSettingTable(self, track_info.channels)) setting_box = gtk.HBox() setting_box.pack_start(grid_setting_frame, expand=False) self.pack_start(setting_box, expand=False) self.pack_start(paned_tables) debug_hbox = gtk.HBox() button_misc = gtk.Button("Redraw") button_misc.connect("clicked", self.debug_grid1, self.setting.track) debug_hbox.pack_start(button_misc) button_misc = gtk.Button("Dump track") button_misc.connect("clicked", self.debug_grid2, self.setting.track) debug_hbox.pack_start(button_misc) debug_frame = gtk.Frame("Note grid debug") debug_frame.add(debug_hbox) self.pack_end(debug_frame, expand=False) self.draw_all()