mirror of
https://github.com/Ardour/ardour.git
synced 2025-12-17 12:16:30 +01:00
use TempoMapChange to manage all feasible tempo map editing operations
This commit is contained in:
parent
21a05f539b
commit
97a544390d
4 changed files with 29 additions and 117 deletions
|
|
@ -63,6 +63,7 @@
|
||||||
#include "audio_time_axis.h"
|
#include "audio_time_axis.h"
|
||||||
#include "midi_time_axis.h"
|
#include "midi_time_axis.h"
|
||||||
#include "session_import_dialog.h"
|
#include "session_import_dialog.h"
|
||||||
|
#include "tempo_map_change.h"
|
||||||
#include "gui_thread.h"
|
#include "gui_thread.h"
|
||||||
#include "interthread_progress_window.h"
|
#include "interthread_progress_window.h"
|
||||||
#include "mouse_cursors.h"
|
#include "mouse_cursors.h"
|
||||||
|
|
@ -284,19 +285,14 @@ Editor::import_smf_tempo_map (Evoral::SMF const & smf, timepos_t const & pos)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* we have to create this in order to start the update process, but
|
TempoMapChange tmc (*this, _("import SMF tempo map"));
|
||||||
we're going to throw it away by creating our own new map and
|
|
||||||
populating it. This will go out of scope when we return from this
|
|
||||||
method.
|
|
||||||
*/
|
|
||||||
|
|
||||||
TempoMap::SharedPtr ignore (TempoMap::write_copy());
|
|
||||||
|
|
||||||
/* cannot create an empty TempoMap, so create one with "default" single
|
/* cannot create an empty TempoMap, so create one with "default" single
|
||||||
values for tempo and meter, then overwrite them.
|
values for tempo and meter, then overwrite them.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
TempoMap::WritableSharedPtr new_map (new TempoMap (Tempo (120, 4), Meter (4, 4)));
|
TempoMap::WritableSharedPtr new_map (new TempoMap (Tempo (120, 4), Meter (4, 4)));
|
||||||
|
|
||||||
Meter last_meter (4.0, 4.0);
|
Meter last_meter (4.0, 4.0);
|
||||||
bool have_initial_meter = false;
|
bool have_initial_meter = false;
|
||||||
|
|
||||||
|
|
@ -334,7 +330,7 @@ Editor::import_smf_tempo_map (Evoral::SMF const & smf, timepos_t const & pos)
|
||||||
last_meter = meter;
|
last_meter = meter;
|
||||||
}
|
}
|
||||||
|
|
||||||
TempoMap::update (new_map);
|
tmc.use_new_map (new_map);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
|
|
||||||
|
|
@ -118,6 +118,7 @@
|
||||||
#include "selection_templates.h"
|
#include "selection_templates.h"
|
||||||
#include "streamview.h"
|
#include "streamview.h"
|
||||||
#include "strip_silence_dialog.h"
|
#include "strip_silence_dialog.h"
|
||||||
|
#include "tempo_map_change.h"
|
||||||
#include "time_axis_view.h"
|
#include "time_axis_view.h"
|
||||||
#include "timers.h"
|
#include "timers.h"
|
||||||
#include "transpose_dialog.h"
|
#include "transpose_dialog.h"
|
||||||
|
|
@ -8281,6 +8282,7 @@ Editor::insert_time (
|
||||||
bool in_command = false;
|
bool in_command = false;
|
||||||
|
|
||||||
TrackViewList ts = selection->tracks.filter_to_unique_playlists ();
|
TrackViewList ts = selection->tracks.filter_to_unique_playlists ();
|
||||||
|
TempoMapChange tmc (*this, _("insert time"), true, false);
|
||||||
|
|
||||||
for (TrackViewList::iterator x = ts.begin(); x != ts.end(); ++x) {
|
for (TrackViewList::iterator x = ts.begin(); x != ts.end(); ++x) {
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -57,6 +57,7 @@
|
||||||
#include "tempo_dialog.h"
|
#include "tempo_dialog.h"
|
||||||
#include "rgb_macros.h"
|
#include "rgb_macros.h"
|
||||||
#include "gui_thread.h"
|
#include "gui_thread.h"
|
||||||
|
#include "tempo_map_change.h"
|
||||||
#include "time_axis_view.h"
|
#include "time_axis_view.h"
|
||||||
#include "grid_lines.h"
|
#include "grid_lines.h"
|
||||||
#include "region_view.h"
|
#include "region_view.h"
|
||||||
|
|
@ -479,20 +480,8 @@ Editor::mouse_add_new_tempo_event (timepos_t pos)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pos.beats() > Beats()) {
|
if (pos.beats() > Beats()) {
|
||||||
|
TempoMapChange tmc (*this, _("add tempo mark"));
|
||||||
begin_reversible_command (_("add tempo mark"));
|
tmc.map().set_tempo (tmc.map().tempo_at (pos), pos);
|
||||||
|
|
||||||
TempoMap::WritableSharedPtr map (TempoMap::write_copy());
|
|
||||||
|
|
||||||
XMLNode &before = map->get_state();
|
|
||||||
|
|
||||||
/* add music-locked ramped (?) tempo using the bpm/note type at sample*/
|
|
||||||
|
|
||||||
map->set_tempo (map->tempo_at (pos), pos);
|
|
||||||
XMLNode &after = map->get_state();
|
|
||||||
_session->add_command (new Temporal::TempoCommand (_("add tempo"), &before, &after));
|
|
||||||
TempoMap::update (map);
|
|
||||||
commit_reversible_command ();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//map.dump (cerr);
|
//map.dump (cerr);
|
||||||
|
|
@ -514,7 +503,6 @@ Editor::mouse_add_new_meter_event (timepos_t pos)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
TempoMap::WritableSharedPtr map (TempoMap::write_copy());
|
|
||||||
|
|
||||||
double bpb = meter_dialog.get_bpb ();
|
double bpb = meter_dialog.get_bpb ();
|
||||||
bpb = max (1.0, bpb); // XXX is this a reasonable limit?
|
bpb = max (1.0, bpb); // XXX is this a reasonable limit?
|
||||||
|
|
@ -524,20 +512,10 @@ Editor::mouse_add_new_meter_event (timepos_t pos)
|
||||||
Temporal::BBT_Time requested;
|
Temporal::BBT_Time requested;
|
||||||
meter_dialog.get_bbt_time (requested);
|
meter_dialog.get_bbt_time (requested);
|
||||||
|
|
||||||
begin_reversible_command (_("add meter mark"));
|
|
||||||
|
|
||||||
XMLNode &before = map->get_state();
|
TempoMapChange tmc (*this, _("add time signature"));
|
||||||
|
pos = timepos_t (tmc.map().quarters_at (requested));
|
||||||
pos = timepos_t (map->quarters_at (requested));
|
tmc.map().set_meter (Meter (bpb, note_type), pos);
|
||||||
|
|
||||||
map->set_meter (Meter (bpb, note_type), pos);
|
|
||||||
|
|
||||||
_session->add_command (new Temporal::TempoCommand (_("add time signature"), &before, &map->get_state()));
|
|
||||||
|
|
||||||
TempoMap::update (map);
|
|
||||||
commit_reversible_command ();
|
|
||||||
|
|
||||||
//map.dump (cerr);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
|
@ -571,20 +549,10 @@ Editor::mouse_add_bbt_marker_event (timepos_t pos)
|
||||||
bbt = marker_dialog.bbt_value ();
|
bbt = marker_dialog.bbt_value ();
|
||||||
name = marker_dialog.name();
|
name = marker_dialog.name();
|
||||||
|
|
||||||
begin_reversible_command (_("add BBT marker"));
|
TempoMapChange tmc (*this, _("add BBT marker"));
|
||||||
|
tmc.map().set_bartime (bbt, marker_dialog.position(), name);
|
||||||
TempoMap::WritableSharedPtr map (TempoMap::write_copy());
|
|
||||||
XMLNode &before = map->get_state();
|
|
||||||
|
|
||||||
map->set_bartime (bbt, marker_dialog.position(), name);
|
|
||||||
|
|
||||||
_session->add_command (new Temporal::TempoCommand (_("add BBT marker"), &before, &map->get_state()));
|
|
||||||
|
|
||||||
TempoMap::update (map);
|
|
||||||
commit_reversible_command ();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
Editor::remove_bbt_marker (ArdourCanvas::Item* item)
|
Editor::remove_bbt_marker (ArdourCanvas::Item* item)
|
||||||
{
|
{
|
||||||
|
|
@ -646,20 +614,8 @@ Editor::edit_meter_section (Temporal::MeterPoint& section)
|
||||||
Temporal::BBT_Time when;
|
Temporal::BBT_Time when;
|
||||||
meter_dialog.get_bbt_time (when);
|
meter_dialog.get_bbt_time (when);
|
||||||
|
|
||||||
TempoMap::WritableSharedPtr tmap (TempoMap::write_copy());
|
TempoMapChange tmc (*this, _("edit time signature"));
|
||||||
|
tmc.map().set_meter (meter, when);
|
||||||
reassociate_metric_markers (tmap);
|
|
||||||
|
|
||||||
begin_reversible_command (_("Edit Time Signature"));
|
|
||||||
XMLNode &before = tmap->get_state();
|
|
||||||
|
|
||||||
tmap->set_meter (meter, when);
|
|
||||||
|
|
||||||
XMLNode &after = tmap->get_state();
|
|
||||||
_session->add_command (new Temporal::TempoCommand (_("edit time signature"), &before, &after));
|
|
||||||
|
|
||||||
TempoMap::update (tmap);
|
|
||||||
commit_reversible_command ();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
|
@ -682,20 +638,9 @@ Editor::edit_bbt (MusicTimePoint& point)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
TempoMap::WritableSharedPtr tmap (TempoMap::write_copy());
|
TempoMapChange tmc (*this, _("edit tempo"));
|
||||||
reassociate_metric_markers (tmap);
|
tmc.map().remove_bartime (point);
|
||||||
|
tmc.map().set_bartime (dialog.bbt_value(), dialog.position(), dialog.name());
|
||||||
begin_reversible_command (_("Edit Tempo"));
|
|
||||||
XMLNode &before = tmap->get_state();
|
|
||||||
|
|
||||||
tmap->remove_bartime (point);
|
|
||||||
tmap->set_bartime (dialog.bbt_value(), dialog.position(), dialog.name());
|
|
||||||
|
|
||||||
XMLNode &after = tmap->get_state();
|
|
||||||
_session->add_command (new Temporal::TempoCommand (_("edit tempo"), &before, &after));
|
|
||||||
|
|
||||||
TempoMap::update (tmap);
|
|
||||||
commit_reversible_command ();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
|
@ -717,22 +662,11 @@ Editor::edit_tempo_section (TempoPoint& section)
|
||||||
|
|
||||||
const Tempo tempo (bpm, end_bpm, nt);
|
const Tempo tempo (bpm, end_bpm, nt);
|
||||||
|
|
||||||
TempoMap::WritableSharedPtr tmap (TempoMap::write_copy());
|
|
||||||
reassociate_metric_markers (tmap);
|
|
||||||
|
|
||||||
Temporal::BBT_Time when;
|
Temporal::BBT_Time when;
|
||||||
tempo_dialog.get_bbt_time (when);
|
tempo_dialog.get_bbt_time (when);
|
||||||
|
|
||||||
begin_reversible_command (_("Edit Tempo"));
|
TempoMapChange tmc (*this, _("edit tempo"));
|
||||||
XMLNode &before = tmap->get_state();
|
tmc.map().set_tempo (tempo, when);
|
||||||
|
|
||||||
tmap->set_tempo (tempo, when);
|
|
||||||
|
|
||||||
XMLNode &after = tmap->get_state();
|
|
||||||
_session->add_command (new Temporal::TempoCommand (_("edit tempo"), &before, &after));
|
|
||||||
|
|
||||||
TempoMap::update (tmap);
|
|
||||||
commit_reversible_command ();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
|
@ -756,30 +690,16 @@ Editor::edit_bbt_marker (BBTMarker& bm)
|
||||||
gint
|
gint
|
||||||
Editor::real_remove_bbt_marker (MusicTimePoint const * point)
|
Editor::real_remove_bbt_marker (MusicTimePoint const * point)
|
||||||
{
|
{
|
||||||
begin_reversible_command (_("remove BBT marker"));
|
TempoMapChange tmc (*this, _("remove BBT marker"));
|
||||||
TempoMap::WritableSharedPtr tmap (TempoMap::write_copy());
|
tmc.map().remove_bartime (*point);
|
||||||
XMLNode &before = tmap->get_state();
|
|
||||||
tmap->remove_bartime (*point);
|
|
||||||
XMLNode &after = tmap->get_state();
|
|
||||||
_session->add_command (new Temporal::TempoCommand (_("remove BBT marker"), &before, &after));
|
|
||||||
|
|
||||||
TempoMap::update (tmap);
|
|
||||||
commit_reversible_command ();
|
|
||||||
|
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
gint
|
gint
|
||||||
Editor::real_remove_tempo_marker (TempoPoint const * section)
|
Editor::real_remove_tempo_marker (TempoPoint const * section)
|
||||||
{
|
{
|
||||||
begin_reversible_command (_("remove tempo mark"));
|
TempoMapChange tmc (*this, _("remove tempo change"));
|
||||||
TempoMap::WritableSharedPtr tmap (TempoMap::write_copy());
|
tmc.map().remove_tempo (*section);
|
||||||
XMLNode &before = tmap->get_state();
|
|
||||||
tmap->remove_tempo (*section);
|
|
||||||
XMLNode &after = tmap->get_state();
|
|
||||||
_session->add_command (new Temporal::TempoCommand (_("remove tempo change"), &before, &after));
|
|
||||||
TempoMap::update (tmap);
|
|
||||||
commit_reversible_command ();
|
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -807,15 +727,8 @@ Editor::remove_meter_marker (ArdourCanvas::Item* item)
|
||||||
gint
|
gint
|
||||||
Editor::real_remove_meter_marker (Temporal::MeterPoint const * section)
|
Editor::real_remove_meter_marker (Temporal::MeterPoint const * section)
|
||||||
{
|
{
|
||||||
begin_reversible_command (_("remove tempo mark"));
|
TempoMapChange tmc (*this, _("remove tempo mark"));
|
||||||
TempoMap::WritableSharedPtr tmap (TempoMap::write_copy());
|
tmc.map().remove_meter (*section);
|
||||||
XMLNode &before = tmap->get_state();
|
|
||||||
tmap->remove_meter (*section);
|
|
||||||
XMLNode &after = tmap->get_state();
|
|
||||||
_session->add_command (new Temporal::TempoCommand (_("remove time signature change"), &before, &after));
|
|
||||||
TempoMap::update (tmap);
|
|
||||||
commit_reversible_command ();
|
|
||||||
|
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -841,7 +754,7 @@ Editor::abort_tempo_map_edit ()
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
Editor::commit_tempo_map_edit (TempoMap::WritableSharedPtr& new_map, bool with_update)
|
Editor::_commit_tempo_map_edit (TempoMap::WritableSharedPtr& new_map, bool with_update)
|
||||||
{
|
{
|
||||||
if (!with_update) {
|
if (!with_update) {
|
||||||
PBD::Unwinder<bool> uw (ignore_map_change, true);
|
PBD::Unwinder<bool> uw (ignore_map_change, true);
|
||||||
|
|
|
||||||
|
|
@ -301,6 +301,7 @@ gtk2_ardour_sources = [
|
||||||
'tempo_curve.cc',
|
'tempo_curve.cc',
|
||||||
'tempo_dialog.cc',
|
'tempo_dialog.cc',
|
||||||
'grid_lines.cc',
|
'grid_lines.cc',
|
||||||
|
'tempo_map_change.cc',
|
||||||
'time_axis_view.cc',
|
'time_axis_view.cc',
|
||||||
'time_axis_view_item.cc',
|
'time_axis_view_item.cc',
|
||||||
'time_fx_dialog.cc',
|
'time_fx_dialog.cc',
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue