2 Copyright (C) 2010 Paul Davis
4 This program is free software; you can redistribute it and/or modify
5 it under the terms of the GNU General Public License as published by
6 the Free Software Foundation; either version 2 of the License, or
7 (at your option) any later version.
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 GNU General Public License for more details.
14 You should have received a copy of the GNU General Public License
15 along with this program; if not, write to the Free Software
16 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
20 #include <gtkmm/stock.h>
21 #include <gtkmm/table.h>
22 #include "ardour/midi_model.h"
23 #include "edit_note_dialog.h"
24 #include "canvas-note-event.h"
25 #include "midi_region_view.h"
31 * EditNoteDialog constructor.
33 * @param n Note to edit.
36 EditNoteDialog::EditNoteDialog (MidiRegionView
* rv
, Gnome::Canvas::CanvasNoteEvent
* ev
)
37 : ArdourDialog (_("Note"))
40 , _time_clock (X_("notetime"), true, X_("NoteTimeClock"), true, false)
41 , _length_clock (X_("notelength"), true, X_("NoteLengthClock"), true, false, true)
43 Table
* table
= manage (new Table (4, 2));
44 table
->set_spacings (6);
48 Label
* l
= manage (new Label (_("Channel")));
49 l
->set_alignment (0, 0.5);
50 table
->attach (*l
, 0, 1, r
, r
+ 1);
51 table
->attach (_channel
, 1, 2, r
, r
+ 1);
54 _channel
.set_range (1, 16);
55 _channel
.set_increments (1, 2);
56 _channel
.set_value (ev
->note()->channel () + 1);
58 l
= manage (new Label (_("Pitch")));
59 l
->set_alignment (0, 0.5);
60 table
->attach (*l
, 0, 1, r
, r
+ 1);
61 table
->attach (_pitch
, 1, 2, r
, r
+ 1);
64 _pitch
.set_range (0, 127);
65 _pitch
.set_increments (1, 10);
66 _pitch
.set_value (ev
->note()->note ());
68 l
= manage (new Label (_("Velocity")));
69 l
->set_alignment (0, 0.5);
70 table
->attach (*l
, 0, 1, r
, r
+ 1);
71 table
->attach (_velocity
, 1, 2, r
, r
+ 1);
74 _velocity
.set_range (0, 127);
75 _velocity
.set_increments (1, 10);
76 _velocity
.set_value (ev
->note()->velocity ());
78 l
= manage (new Label (_("Time")));
79 l
->set_alignment (0, 0.5);
80 table
->attach (*l
, 0, 1, r
, r
+ 1);
81 table
->attach (_time_clock
, 1, 2, r
, r
+ 1);
84 _time_clock
.set_session (_region_view
->get_time_axis_view().session ());
85 _time_clock
.set_mode (AudioClock::BBT
);
86 _time_clock
.set (_region_view
->time_converter().to (ev
->note()->time ()), true);
88 l
= manage (new Label (_("Length")));
89 l
->set_alignment (0, 0.5);
90 table
->attach (*l
, 0, 1, r
, r
+ 1);
91 table
->attach (_length_clock
, 1, 2, r
, r
+ 1);
94 _length_clock
.set_session (_region_view
->get_time_axis_view().session ());
95 _length_clock
.set_mode (AudioClock::BBT
);
96 _length_clock
.set (_region_view
->time_converter().to (ev
->note()->length ()), true);
98 get_vbox()->pack_start (*table
);
100 add_button (Gtk::Stock::CANCEL
, Gtk::RESPONSE_CANCEL
);
101 add_button (Gtk::Stock::APPLY
, Gtk::RESPONSE_ACCEPT
);
102 set_default_response (Gtk::RESPONSE_ACCEPT
);
108 EditNoteDialog::run ()
110 int const r
= Dialog::run ();
111 if (r
!= RESPONSE_ACCEPT
) {
115 /* These calls mean that if a value is entered using the keyboard
116 it will be returned by the get_value_as_int()s below.
122 _region_view
->start_note_diff_command (_("edit note"));
124 bool had_change
= false;
126 if (_channel
.get_value_as_int() - 1 != _event
->note()->channel()) {
127 _region_view
->change_note_channel (_event
, _channel
.get_value_as_int () - 1);
131 if (_pitch
.get_value_as_int() != _event
->note()->note()) {
132 _region_view
->change_note_note (_event
, _pitch
.get_value_as_int (), false);
136 if (_velocity
.get_value_as_int() != _event
->note()->velocity()) {
137 _region_view
->change_note_velocity (_event
, _velocity
.get_value_as_int (), false);
141 double const t
= _region_view
->time_converter().from (_time_clock
.current_time ());
143 if (t
!= _event
->note()->time()) {
144 _region_view
->change_note_time (_event
, t
);
148 double const d
= _region_view
->time_converter().from (_length_clock
.current_duration ());
150 if (d
!= _event
->note()->length()) {
151 _region_view
->change_note_length (_event
, d
);
156 _region_view
->abort_command ();
159 _region_view
->apply_diff ();
161 _event
->set_selected (_event
->selected()); // change color