mirror of
https://github.com/Ardour/ardour.git
synced 2026-01-04 20:55:48 +01:00
Tempo ramps - clean up tempo dragging.
This commit is contained in:
parent
6309807bc7
commit
43922a1fe1
3 changed files with 31 additions and 77 deletions
|
|
@ -3293,54 +3293,18 @@ TempoMarkerDrag::motion (GdkEvent* event, bool first_move)
|
|||
TempoMap& map (_editor->session()->tempo_map());
|
||||
/* get current state */
|
||||
before_state = &map.get_state();
|
||||
|
||||
if (!_copy) {
|
||||
_editor->begin_reversible_command (_("move tempo mark"));
|
||||
|
||||
} else {
|
||||
const framepos_t frame = adjusted_current_frame (event) + 1;
|
||||
|
||||
_editor->begin_reversible_command (_("copy tempo mark"));
|
||||
framepos_t frame;
|
||||
bool use_snap = false;
|
||||
|
||||
if (!_editor->snap_musical()) {
|
||||
frame = adjusted_current_frame (event);
|
||||
} else {
|
||||
frame = adjusted_current_frame (event, false);
|
||||
if (ArdourKeyboard::indicates_snap (event->button.state)) {
|
||||
if (_editor->snap_mode() == Editing::SnapOff) {
|
||||
use_snap = true;
|
||||
} else {
|
||||
use_snap = false;
|
||||
}
|
||||
} else {
|
||||
if (_editor->snap_mode() == Editing::SnapOff) {
|
||||
use_snap = false;
|
||||
} else {
|
||||
use_snap = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Timecode::BBT_Time bbt;
|
||||
map.bbt_time (frame, bbt);
|
||||
|
||||
/* add new tempo section to map, ensuring we don't refer to existing tempos for snap */
|
||||
|
||||
if (_real_section->position_lock_style() == MusicTime) {
|
||||
if (use_snap && _editor->snap_type() == SnapToBar) {
|
||||
map.round_bbt (bbt, -1, (frame > _real_section->frame()) ? RoundUpMaybe : RoundDownMaybe);
|
||||
} else if (use_snap) {
|
||||
map.round_bbt (bbt, _editor->get_grid_beat_divisions (0), RoundNearest);
|
||||
}
|
||||
double const pulse = map.predict_tempo_position (_real_section, bbt).first;
|
||||
_real_section = map.add_tempo (_marker->tempo(), pulse, 0, _real_section->type(), MusicTime);
|
||||
_real_section = map.add_tempo (_marker->tempo(), map.pulse_at_frame (frame), 0, _real_section->type(), MusicTime);
|
||||
} else {
|
||||
if (use_snap && _editor->snap_type() == SnapToBar) {
|
||||
map.round_bbt (bbt, -1, (frame > _real_section->frame()) ? RoundUpMaybe : RoundDownMaybe);
|
||||
} else if (use_snap) {
|
||||
map.round_bbt (bbt, _editor->get_grid_beat_divisions (0), RoundNearest);
|
||||
}
|
||||
if (use_snap) {
|
||||
frame = map.predict_tempo_position (_real_section, bbt).second;
|
||||
}
|
||||
_real_section = map.add_tempo (_marker->tempo(), 0.0, frame, _real_section->type(), AudioTime);
|
||||
}
|
||||
}
|
||||
|
|
@ -3359,45 +3323,34 @@ TempoMarkerDrag::motion (GdkEvent* event, bool first_move)
|
|||
show_verbose_cursor_text (strs.str());
|
||||
|
||||
} else if (_movable && !_real_section->locked_to_meter()) {
|
||||
TempoMap& map (_editor->session()->tempo_map());
|
||||
const bool was_music = _real_section->position_lock_style() == MusicTime;
|
||||
|
||||
pf = adjusted_current_frame (event);
|
||||
|
||||
if (!_editor->snap_musical()) {
|
||||
/* snap normally (this is not self-referential).*/
|
||||
pf = adjusted_current_frame (event);
|
||||
|
||||
if (was_music) {
|
||||
_real_section->set_position_lock_style (AudioTime);
|
||||
}
|
||||
|
||||
map.gui_move_tempo (_real_section, pf);
|
||||
|
||||
if (was_music) {
|
||||
_real_section->set_position_lock_style (MusicTime);
|
||||
}
|
||||
|
||||
} else {
|
||||
/* but this is.
|
||||
we can't use the map for anything related to tempo,
|
||||
so we round bbt using meters, which have no dependency
|
||||
on pulse for this kind of thing.
|
||||
*/
|
||||
TempoMap& map (_editor->session()->tempo_map());
|
||||
Timecode::BBT_Time when;
|
||||
bool use_snap;
|
||||
|
||||
if (ArdourKeyboard::indicates_snap (event->button.state)) {
|
||||
if (_editor->snap_mode() == Editing::SnapOff) {
|
||||
use_snap = true;
|
||||
} else {
|
||||
use_snap = false;
|
||||
}
|
||||
} else {
|
||||
if (_editor->snap_mode() == Editing::SnapOff) {
|
||||
use_snap = false;
|
||||
} else {
|
||||
use_snap = true;
|
||||
}
|
||||
if (!was_music) {
|
||||
_real_section->set_position_lock_style (MusicTime);
|
||||
}
|
||||
|
||||
pf = adjusted_current_frame (event);
|
||||
map.bbt_time (pf, when);
|
||||
|
||||
if (use_snap && _editor->snap_type() == SnapToBar) {
|
||||
map.round_bbt (when, -1, (pf > _real_section->frame()) ? RoundUpMaybe : RoundDownMaybe);
|
||||
map.gui_move_tempo (_real_section, pf);
|
||||
|
||||
if (!was_music) {
|
||||
_real_section->set_position_lock_style (AudioTime);
|
||||
}
|
||||
const pair<double, framepos_t> future_pos = map.predict_tempo_position (_real_section, when);
|
||||
map.gui_move_tempo (_real_section, future_pos);
|
||||
|
||||
}
|
||||
|
||||
show_verbose_cursor_time (_real_section->frame());
|
||||
|
|
|
|||
|
|
@ -399,7 +399,7 @@ class LIBARDOUR_API TempoMap : public PBD::StatefulDestructible
|
|||
|
||||
std::pair<double, framepos_t> predict_tempo_position (TempoSection* section, const Timecode::BBT_Time& bbt);
|
||||
|
||||
void gui_move_tempo (TempoSection*, const std::pair<double, framepos_t>& pulse);
|
||||
void gui_move_tempo (TempoSection*, const framepos_t& frame);
|
||||
void gui_move_meter (MeterSection*, const framepos_t& frame);
|
||||
|
||||
bool gui_change_tempo (TempoSection*, const Tempo& bpm);
|
||||
|
|
|
|||
|
|
@ -2395,7 +2395,7 @@ TempoMap::predict_tempo_position (TempoSection* section, const BBT_Time& bbt)
|
|||
}
|
||||
|
||||
void
|
||||
TempoMap::gui_move_tempo (TempoSection* ts, const pair<double, framepos_t>& pulse)
|
||||
TempoMap::gui_move_tempo (TempoSection* ts, const framepos_t& frame)
|
||||
{
|
||||
Metrics future_map;
|
||||
|
||||
|
|
@ -2403,8 +2403,9 @@ TempoMap::gui_move_tempo (TempoSection* ts, const pair<double, framepos_t>& puls
|
|||
{
|
||||
Glib::Threads::RWLock::WriterLock lm (lock);
|
||||
TempoSection* tempo_copy = copy_metrics_and_point (_metrics, future_map, ts);
|
||||
if (solve_map_pulse (future_map, tempo_copy, pulse.first)) {
|
||||
solve_map_pulse (_metrics, ts, pulse.first);
|
||||
const double pulse = pulse_at_frame_locked (future_map, frame);
|
||||
if (solve_map_pulse (future_map, tempo_copy, pulse)) {
|
||||
solve_map_pulse (_metrics, ts, pulse);
|
||||
recompute_meters (_metrics);
|
||||
}
|
||||
}
|
||||
|
|
@ -2414,8 +2415,8 @@ TempoMap::gui_move_tempo (TempoSection* ts, const pair<double, framepos_t>& puls
|
|||
{
|
||||
Glib::Threads::RWLock::WriterLock lm (lock);
|
||||
TempoSection* tempo_copy = copy_metrics_and_point (_metrics, future_map, ts);
|
||||
if (solve_map_frame (future_map, tempo_copy, pulse.second)) {
|
||||
solve_map_frame (_metrics, ts, pulse.second);
|
||||
if (solve_map_frame (future_map, tempo_copy, frame)) {
|
||||
solve_map_frame (_metrics, ts, frame);
|
||||
recompute_meters (_metrics);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue