diff --git a/gtk2_ardour/beatbox_gui.cc b/gtk2_ardour/beatbox_gui.cc index 658a5d4be1..94f7996cba 100644 --- a/gtk2_ardour/beatbox_gui.cc +++ b/gtk2_ardour/beatbox_gui.cc @@ -71,26 +71,15 @@ BBGUI::BBGUI (boost::shared_ptr bb) , mode_pitch_button (_("Pitch")) , mode_octave_button (_("Octave")) , mode_group_button (_("Group")) + , mode_duration_button (_("Gate")) { _canvas_viewport = new GtkCanvasViewport (horizontal_adjustment, vertical_adjustment); _canvas = _canvas_viewport->canvas(); - _canvas->set_background_color (UIConfiguration::instance().color ("gtk_bright_color")); _canvas->use_nsglview (); - no_scroll_group = new ArdourCanvas::Container (_canvas->root()); - - step_indicator_box = new ArdourCanvas::Container (no_scroll_group); - - step_indicator_bg = new ArdourCanvas::Rectangle (step_indicator_box); - step_indicator_bg->set_fill_color (UIConfiguration::instance().color ("gtk_lightest")); - step_indicator_bg->set_outline (false); - - v_scroll_group = new ScrollGroup (_canvas->root(), ScrollGroup::ScrollsVertically); - _canvas->add_scroller (*v_scroll_group); - - _sequencer = new SequencerGrid (bbox->sequencer(), v_scroll_group); + _sequencer = new SequencerGrid (bbox->sequencer(), _canvas); _sequencer->set_position (Duple (0, _step_dimen)); _sequencer->set_fill_color (UIConfiguration::instance().color ("gtk_contrasting_indicator")); @@ -101,6 +90,7 @@ BBGUI::BBGUI (boost::shared_ptr bb) mode_box.pack_start (mode_velocity_button); mode_box.pack_start (mode_pitch_button); + mode_box.pack_start (mode_duration_button); mode_box.pack_start (mode_octave_button); mode_box.pack_start (mode_group_button); @@ -108,6 +98,7 @@ BBGUI::BBGUI (boost::shared_ptr bb) mode_pitch_button.signal_clicked.connect (sigc::bind (sigc::mem_fun (*this, &BBGUI::mode_clicked), SequencerGrid::Pitch)); mode_octave_button.signal_clicked.connect (sigc::bind (sigc::mem_fun (*this, &BBGUI::mode_clicked), SequencerGrid::Octave)); mode_group_button.signal_clicked.connect (sigc::bind (sigc::mem_fun (*this, &BBGUI::mode_clicked), SequencerGrid::Group)); + mode_duration_button.signal_clicked.connect (sigc::bind (sigc::mem_fun (*this, &BBGUI::mode_clicked), SequencerGrid::Duration)); get_vbox()->set_spacing (12); get_vbox()->pack_start (mode_box, false, false); @@ -298,27 +289,26 @@ BBGUI::sequencer_changed (PropertyChange const &) */ _canvas_viewport->set_size_request (_width, _height + _step_dimen); - - step_indicator_bg->set (Rect (0, 0, _width, _step_dimen)); - step_indicator_box->clear (true); /* delete all existing step indicators */ - - /* indicator row */ - - for (size_t n = 0; n < nsteps; ++n) { - SequencerStepIndicator* ssi = new SequencerStepIndicator (step_indicator_box, n+1); - ssi->set (Rect (n * _step_dimen, 0, (n+1) * _step_dimen, _step_dimen)); - ssi->set_position (Duple (n * _step_dimen, 0.0)); - ssi->set_fill_color (random()); - } } /**/ -SequencerGrid::SequencerGrid (StepSequencer& s, Item *parent) - : Rectangle (parent) +SequencerGrid::SequencerGrid (StepSequencer& s, Canvas* c) + : Rectangle (c) , _sequencer (s) , _mode (Velocity) { + no_scroll_group = new ArdourCanvas::Container (_canvas->root()); + step_indicator_box = new ArdourCanvas::Container (no_scroll_group); + + step_indicator_bg = new ArdourCanvas::Rectangle (step_indicator_box); + step_indicator_bg->set_fill_color (UIConfiguration::instance().color ("gtk_lightest")); + step_indicator_bg->set_outline (false); + + v_scroll_group = new ScrollGroup (_canvas->root(), ScrollGroup::ScrollsVertically); + _canvas->add_scroller (*v_scroll_group); + v_scroll_group->add (this); + _sequencer.PropertyChanged.connect (sequencer_connection, invalidator (*this), boost::bind (&SequencerGrid::sequencer_changed, this, _1), gui_context()); { @@ -339,6 +329,17 @@ SequencerGrid::sequencer_changed (PropertyChange const &) set (Rect (0, 0, _width, _height)); + step_indicator_bg->set (Rect (0, 0, _width, _step_dimen)); + step_indicator_box->clear (true); /* delete all existing step indicators */ + + /* indicator row */ + + for (size_t n = 0; n < nsteps; ++n) { + SequencerStepIndicator* ssi = new SequencerStepIndicator (step_indicator_box, n+1); + ssi->set (Rect (n * _step_dimen, 0, (n+1) * _step_dimen, _step_dimen)); + ssi->set_position (Duple (n * _step_dimen, 0.0)); + ssi->set_fill_color (random()); + } /* step views, one per step per sequence */ clear (true); @@ -346,7 +347,8 @@ SequencerGrid::sequencer_changed (PropertyChange const &) for (size_t s = 0; s < nsequences; ++s) { for (size_t n = 0; n < nsteps; ++n) { - StepView* sv = new StepView (*this, _sequencer.sequence (s).step (n), Item::parent()); + StepView* sv = new StepView (*this, _sequencer.sequence (s).step (n), v_scroll_group); + /* sequence row is 1-row down ... because of the step indicator row */ sv->set_position (Duple (n * _step_dimen, (s+1) * _step_dimen)); sv->set (Rect (1, 1, _step_dimen - 2, _step_dimen - 2)); _step_views.push_back (sv); @@ -483,6 +485,7 @@ StepView::view_mode_changed () text->set_position (Duple (_step_dimen/2 - (w/2), _step_dimen/2 - (h/2))); } else if (_seq.mode() == SequencerGrid::Group) { + text->set (std::string()); text->show (); } else { text->hide (); @@ -508,6 +511,11 @@ StepView::render (ArdourCanvas::Rect const & area, Cairo::RefPtr const Duple origin = item_to_window (Duple (0, 0)); context->rectangle (origin.x + 2, origin.y + (_step_dimen - height - 2), _step_dimen - 4, height); context->fill (); + } else if (_seq.mode() == SequencerGrid::Duration) { + const double height = (_step_dimen - 4) * (_step.duration()); + const Duple origin = item_to_window (Duple (0, 0)); + context->rectangle (origin.x + 2, origin.y + (_step_dimen - height - 2), _step_dimen - 4, height); + context->fill (); } /* now deal with any children (e.g. text) */ @@ -585,6 +593,9 @@ StepView::scroll_event (GdkEventScroll* ev) } else if (_seq.mode() == SequencerGrid::Velocity) { cerr << "adjust velocity by " << amt << endl; adjust_step_velocity (amt); + } else if (_seq.mode() == SequencerGrid::Duration) { + cerr << "adjust velocity by " << amt << endl; + adjust_step_duration (amt/32.0); /* adjust by 1/32 of the sequencer step size */ } else if (_seq.mode() == SequencerGrid::Octave) { adjust_step_octave (amt); } else if (_seq.mode() == SequencerGrid::Group) { @@ -610,3 +621,9 @@ StepView::adjust_step_octave (int amt) { _step.adjust_octave (amt); } + +void +StepView::adjust_step_duration (double amt) +{ + _step.adjust_duration (amt); +} diff --git a/gtk2_ardour/beatbox_gui.h b/gtk2_ardour/beatbox_gui.h index 31709f9522..225d65258b 100644 --- a/gtk2_ardour/beatbox_gui.h +++ b/gtk2_ardour/beatbox_gui.h @@ -88,6 +88,7 @@ class StepView : public ArdourCanvas::Rectangle, public sigc::trackable { void adjust_step_pitch (int amt); void adjust_step_velocity (int amt); + void adjust_step_duration (double); void adjust_step_octave (int amt); void step_changed (PBD::PropertyChange const &); @@ -101,11 +102,12 @@ class SequencerGrid : public ArdourCanvas::Rectangle, public sigc::trackable { enum Mode { Velocity, Pitch, + Duration, Octave, Group, }; - SequencerGrid (ARDOUR::StepSequencer&, ArdourCanvas::Item* parent); + SequencerGrid (ARDOUR::StepSequencer&, ArdourCanvas::Canvas*); Mode mode() const { return _mode; } void set_mode (Mode m); @@ -119,6 +121,10 @@ class SequencerGrid : public ArdourCanvas::Rectangle, public sigc::trackable { double _width; double _height; Mode _mode; + ArdourCanvas::ScrollGroup* v_scroll_group; + ArdourCanvas::Container* no_scroll_group; + ArdourCanvas::Rectangle* step_indicator_bg; + ArdourCanvas::Container* step_indicator_box; void sequencer_changed (PBD::PropertyChange const &); @@ -156,12 +162,8 @@ class BBGUI : public ArdourDialog { ArdourCanvas::GtkCanvasViewport* _canvas_viewport; ArdourCanvas::GtkCanvas* _canvas; - ArdourCanvas::ScrollGroup* v_scroll_group; - ArdourCanvas::Container* no_scroll_group; SequencerGrid* _sequencer; - ArdourCanvas::Rectangle* step_indicator_bg; - ArdourCanvas::Container* step_indicator_box; ArdourWidgets::ArdourButton start_button; void toggle_play (); @@ -185,6 +187,7 @@ class BBGUI : public ArdourDialog { ArdourWidgets:: ArdourButton mode_pitch_button; ArdourWidgets::ArdourButton mode_octave_button; ArdourWidgets::ArdourButton mode_group_button; + ArdourWidgets::ArdourButton mode_duration_button; void mode_clicked (SequencerGrid::Mode);