Tempo ramps - various bug fixes (meter drag undo, incorrect copy)
This commit is contained in:
parent
58d4889ad3
commit
99efddb050
@ -3156,12 +3156,6 @@ MeterMarkerDrag::motion (GdkEvent* event, bool first_move)
|
||||
char name[64];
|
||||
snprintf (name, sizeof(name), "%g/%g", _marker->meter().divisions_per_bar(), _marker->meter().note_divisor ());
|
||||
|
||||
MeterSection section (_marker->meter());
|
||||
|
||||
if (!section.movable()) {
|
||||
return;
|
||||
}
|
||||
|
||||
_marker = new MeterMarker (
|
||||
*_editor,
|
||||
*_editor->meter_group,
|
||||
@ -3174,7 +3168,6 @@ MeterMarkerDrag::motion (GdkEvent* event, bool first_move)
|
||||
swap_grab (&_marker->the_item(), 0, GDK_CURRENT_TIME);
|
||||
|
||||
if (!_copy) {
|
||||
_editor->begin_reversible_command (_("move meter mark"));
|
||||
TempoMap& map (_editor->session()->tempo_map());
|
||||
/* get current state */
|
||||
before_state = &map.get_state();
|
||||
@ -3203,37 +3196,29 @@ MeterMarkerDrag::finished (GdkEvent* event, bool movement_occurred)
|
||||
return;
|
||||
}
|
||||
|
||||
if (!_marker->meter().movable()) {
|
||||
return;
|
||||
}
|
||||
|
||||
//motion (event, false);
|
||||
|
||||
//Timecode::BBT_Time when;
|
||||
|
||||
TempoMap& map (_editor->session()->tempo_map());
|
||||
//map.bbt_time (_marker->position(), when);
|
||||
|
||||
if (_copy == true) {
|
||||
_editor->begin_reversible_command (_("copy meter mark"));
|
||||
XMLNode &before = map.get_state();
|
||||
|
||||
if (_marker->meter().position_lock_style() == AudioTime) {
|
||||
map.add_meter (_marker->meter(), _marker->position());
|
||||
if (_real_section->position_lock_style() == AudioTime) {
|
||||
map.add_meter (Meter (_real_section->divisions_per_bar(), _real_section->note_divisor()), _real_section->frame());
|
||||
} else {
|
||||
map.add_meter (_marker->meter(), _real_section->pulse(), _real_section->bbt());
|
||||
map.add_meter (Meter (_real_section->divisions_per_bar(), _real_section->note_divisor()), _real_section->pulse(), _real_section->bbt());
|
||||
}
|
||||
|
||||
XMLNode &after = map.get_state();
|
||||
_editor->session()->add_command(new MementoCommand<TempoMap>(map, &before, &after));
|
||||
_editor->commit_reversible_command ();
|
||||
|
||||
} else {
|
||||
_editor->begin_reversible_command (_("move meter mark"));
|
||||
|
||||
/* we removed it before, so add it back now */
|
||||
if (_marker->meter().position_lock_style() == AudioTime) {
|
||||
map.replace_meter (*_real_section, _marker->meter(), _marker->position());
|
||||
if (_real_section->position_lock_style() == AudioTime) {
|
||||
map.replace_meter (*_real_section, Meter (_real_section->divisions_per_bar(), _real_section->note_divisor()), _real_section->frame());
|
||||
} else {
|
||||
map.replace_meter (*_real_section, _marker->meter(), _real_section->bbt());
|
||||
map.replace_meter (*_real_section, Meter (_real_section->divisions_per_bar(), _real_section->note_divisor()), _real_section->bbt());
|
||||
}
|
||||
|
||||
XMLNode &after = map.get_state();
|
||||
|
@ -946,6 +946,10 @@ TempoMap::replace_meter (const MeterSection& ms, const Meter& meter, const frame
|
||||
/* cannot move the first meter section */
|
||||
*static_cast<Meter*>(&first) = meter;
|
||||
first.set_position_lock_style (pl);
|
||||
double paf = pulse_at_frame_locked (_metrics, frame);
|
||||
pair<double, BBT_Time> pulse = make_pair (paf, beats_to_bbt_locked (_metrics, beat_at_pulse_locked (_metrics, paf)));
|
||||
first.set_pulse (pulse);
|
||||
first.set_frame (frame);
|
||||
recompute_map (_metrics);
|
||||
}
|
||||
}
|
||||
@ -1022,9 +1026,7 @@ TempoMap::add_meter_locked (const Meter& meter, framepos_t frame, bool recompute
|
||||
{
|
||||
|
||||
MeterSection* new_meter = new MeterSection (frame, meter.divisions_per_bar(), meter.note_divisor());
|
||||
double paf = pulse_at_frame_locked (_metrics, frame);
|
||||
pair<double, BBT_Time> beat = make_pair (paf, beats_to_bbt_locked (_metrics, beat_at_pulse_locked (_metrics, paf)));
|
||||
new_meter->set_pulse (beat);
|
||||
|
||||
do_insert (new_meter);
|
||||
|
||||
if (recompute) {
|
||||
@ -1048,6 +1050,7 @@ TempoMap::predict_tempo_frame (TempoSection* section, const Tempo& bpm, const BB
|
||||
Metrics future_map;
|
||||
framepos_t ret = 0;
|
||||
TempoSection* new_section = copy_metrics_and_point (future_map, section);
|
||||
|
||||
double const beat = bbt_to_beats_locked (future_map, bbt);
|
||||
if (solve_map (future_map, new_section, bpm, pulse_at_beat_locked (future_map, beat))) {
|
||||
ret = new_section->frame();
|
||||
@ -1177,8 +1180,7 @@ TempoMap::copy_metrics_and_point (Metrics& copy, TempoSection* section)
|
||||
if (m->position_lock_style() == MusicTime) {
|
||||
copy.push_back (new MeterSection (m->pulse(), m->bbt(), m->divisions_per_bar(), m->note_divisor()));
|
||||
} else {
|
||||
copy.push_back (new MeterSection (m->frame(), m->bbt(), m->divisions_per_bar(), m->note_divisor()));
|
||||
|
||||
copy.push_back (new MeterSection (m->frame(), m->divisions_per_bar(), m->note_divisor()));
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -1796,11 +1798,13 @@ TempoMap::frame_at_pulse_locked (const Metrics& metrics, const double& pulse) co
|
||||
TempoSection* t;
|
||||
|
||||
if ((t = dynamic_cast<TempoSection*> (*i)) != 0) {
|
||||
if (prev_ts) {
|
||||
if (t->pulse() > pulse) {
|
||||
return prev_ts->frame_at_pulse (pulse, _frame_rate);
|
||||
if (prev_ts && t->pulse() > pulse) {
|
||||
if (prev_ts->pulse() > pulse) {
|
||||
return 0;
|
||||
}
|
||||
return prev_ts->frame_at_pulse (pulse, _frame_rate);
|
||||
}
|
||||
|
||||
accumulated_pulses = t->pulse();
|
||||
prev_ts = t;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user