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"
30 * EditNoteDialog constructor.
32 * @param n Note to edit.
35 EditNoteDialog::EditNoteDialog (MidiRegionView
* rv
, Gnome::Canvas::CanvasNoteEvent
* ev
)
36 : ArdourDialog (_("Note"))
39 , _time_clock (X_("notetime"), true, X_("NoteTimeClock"), true, false)
40 , _length_clock (X_("notelength"), true, X_("NoteLengthClock"), true, false, true)
42 Table
* table
= manage (new Table (4, 2));
43 table
->set_spacings (6);
47 Label
* l
= manage (new Label (_("Channel")));
48 l
->set_alignment (0, 0.5);
49 table
->attach (*l
, 0, 1, r
, r
+ 1);
50 table
->attach (_channel
, 1, 2, r
, r
+ 1);
53 _channel
.set_range (1, 16);
54 _channel
.set_increments (1, 2);
55 _channel
.set_value (ev
->note()->channel () + 1);
57 l
= manage (new Label (_("Pitch")));
58 l
->set_alignment (0, 0.5);
59 table
->attach (*l
, 0, 1, r
, r
+ 1);
60 table
->attach (_pitch
, 1, 2, r
, r
+ 1);
63 _pitch
.set_range (0, 127);
64 _pitch
.set_increments (1, 10);
65 _pitch
.set_value (ev
->note()->note ());
67 l
= manage (new Label (_("Velocity")));
68 l
->set_alignment (0, 0.5);
69 table
->attach (*l
, 0, 1, r
, r
+ 1);
70 table
->attach (_velocity
, 1, 2, r
, r
+ 1);
73 _velocity
.set_range (0, 127);
74 _velocity
.set_increments (1, 10);
75 _velocity
.set_value (ev
->note()->velocity ());
77 l
= manage (new Label (_("Time")));
78 l
->set_alignment (0, 0.5);
79 table
->attach (*l
, 0, 1, r
, r
+ 1);
80 table
->attach (_time_clock
, 1, 2, r
, r
+ 1);
83 _time_clock
.set_session (_region_view
->get_time_axis_view().session ());
84 _time_clock
.set_mode (AudioClock::BBT
);
85 _time_clock
.set (_region_view
->time_converter().to (ev
->note()->time ()), true);
87 l
= manage (new Label (_("Length")));
88 l
->set_alignment (0, 0.5);
89 table
->attach (*l
, 0, 1, r
, r
+ 1);
90 table
->attach (_length_clock
, 1, 2, r
, r
+ 1);
93 _length_clock
.set_session (_region_view
->get_time_axis_view().session ());
94 _length_clock
.set_mode (AudioClock::BBT
);
95 _length_clock
.set (_region_view
->time_converter().to (ev
->note()->length ()), true);
97 get_vbox()->pack_start (*table
);
99 add_button (Gtk::Stock::CANCEL
, Gtk::RESPONSE_CANCEL
);
100 add_button (Gtk::Stock::APPLY
, Gtk::RESPONSE_ACCEPT
);
101 set_default_response (Gtk::RESPONSE_ACCEPT
);
107 EditNoteDialog::run ()
109 int const r
= Dialog::run ();
110 if (r
!= RESPONSE_ACCEPT
) {
114 /* These calls mean that if a value is entered using the keyboard
115 it will be returned by the get_value_as_int()s below.
121 _region_view
->start_note_diff_command (_("edit note"));
123 bool had_change
= false;
125 if (_channel
.get_value_as_int() - 1 != _event
->note()->channel()) {
126 _region_view
->change_note_channel (_event
, _channel
.get_value_as_int () - 1);
130 if (_pitch
.get_value_as_int() != _event
->note()->note()) {
131 _region_view
->change_note_note (_event
, _pitch
.get_value_as_int (), false);
135 if (_velocity
.get_value_as_int() != _event
->note()->velocity()) {
136 _region_view
->change_note_velocity (_event
, _velocity
.get_value_as_int (), false);
140 double const t
= _region_view
->time_converter().from (_time_clock
.current_time ());
142 if (t
!= _event
->note()->time()) {
143 _region_view
->change_note_time (_event
, t
);
147 double const d
= _region_view
->time_converter().from (_length_clock
.current_duration ());
149 if (d
!= _event
->note()->length()) {
150 _region_view
->change_note_length (_event
, d
);
155 _region_view
->abort_command ();
158 _region_view
->apply_diff ();
160 _event
->set_selected (_event
->selected()); // change color