diff options
author | nick_m <mainsbridge@gmail.com> | 2016-04-03 01:41:27 +1100 |
---|---|---|
committer | nick_m <mainsbridge@gmail.com> | 2016-05-27 23:38:13 +1000 |
commit | 304875836916ebef7b691f975b4892a18526c6af (patch) | |
tree | ccfe83500dacec57faad476b1ea0959d9452d6b4 /libs | |
parent | 3d07cd79e17f1bdda370f54c9ecece559af4d5f9 (diff) |
Tempo ramps - copy-drag meters works again.
- meter drags now use mvc style.
Diffstat (limited to 'libs')
-rw-r--r-- | libs/ardour/ardour/tempo.h | 8 | ||||
-rw-r--r-- | libs/ardour/tempo.cc | 80 |
2 files changed, 45 insertions, 43 deletions
diff --git a/libs/ardour/ardour/tempo.h b/libs/ardour/ardour/tempo.h index 5ab4056c5e..98c6e82c16 100644 --- a/libs/ardour/ardour/tempo.h +++ b/libs/ardour/ardour/tempo.h @@ -376,8 +376,8 @@ class LIBARDOUR_API TempoMap : public PBD::StatefulDestructible void add_tempo (const Tempo&, const double& pulse, TempoSection::Type type); void add_tempo (const Tempo&, const framepos_t& frame, TempoSection::Type type); - void add_meter (const Meter&, const double& beat, const Timecode::BBT_Time& where); - void add_meter (const Meter&, const framepos_t& frame, const double& beat, const Timecode::BBT_Time& where); + MeterSection* add_meter (const Meter&, const double& beat, const Timecode::BBT_Time& where); + MeterSection* add_meter (const Meter&, const framepos_t& frame, const double& beat, const Timecode::BBT_Time& where); void remove_tempo (const TempoSection&, bool send_signal); void remove_meter (const MeterSection&, bool send_signal); @@ -492,8 +492,8 @@ private: void add_tempo_locked (const Tempo&, double pulse, bool recompute, TempoSection::Type type); void add_tempo_locked (const Tempo&, framepos_t frame, bool recompute, TempoSection::Type type); - void add_meter_locked (const Meter&, double beat, Timecode::BBT_Time where, bool recompute); - void add_meter_locked (const Meter&, framepos_t frame, double beat, Timecode::BBT_Time where, bool recompute); + MeterSection* add_meter_locked (const Meter&, double beat, Timecode::BBT_Time where, bool recompute); + MeterSection* add_meter_locked (const Meter&, framepos_t frame, double beat, Timecode::BBT_Time where, bool recompute); bool remove_tempo_locked (const TempoSection&); bool remove_meter_locked (const MeterSection&); diff --git a/libs/ardour/tempo.cc b/libs/ardour/tempo.cc index 9c40b25919..4915c42e8a 100644 --- a/libs/ardour/tempo.cc +++ b/libs/ardour/tempo.cc @@ -779,7 +779,7 @@ TempoMap::do_insert (MetricSection* section) bool const ipm = insert_meter->position_lock_style() == MusicTime; - if ((ipm && meter->pulse() == insert_meter->pulse()) || (!ipm && meter->frame() == insert_meter->frame())) { + if ((ipm && meter->beat() == insert_meter->beat()) || (!ipm && meter->frame() == insert_meter->frame())) { if (!meter->movable()) { @@ -793,7 +793,6 @@ TempoMap::do_insert (MetricSection* section) need_add = false; } else { _metrics.erase (i); - } break; @@ -817,7 +816,7 @@ TempoMap::do_insert (MetricSection* section) if (meter) { bool const ipm = insert_meter->position_lock_style() == MusicTime; - if ((ipm && meter->pulse() > insert_meter->pulse()) || (!ipm && meter->frame() > insert_meter->frame())) { + if ((ipm && meter->beat() > insert_meter->beat()) || (!ipm && meter->frame() > insert_meter->frame())) { break; } } @@ -948,8 +947,8 @@ TempoMap::replace_meter (const MeterSection& ms, const Meter& meter, const BBT_T /* cannot move the first meter section */ *static_cast<Meter*>(&first) = meter; first.set_position_lock_style (pl); - recompute_map (_metrics); } + recompute_map (_metrics); } PropertyChanged (PropertyChange ()); @@ -980,20 +979,20 @@ TempoMap::replace_meter (const MeterSection& ms, const Meter& meter, const frame first_t.set_frame (first.frame()); first_t.set_pulse (0.0); first_t.set_position_lock_style (AudioTime); - - recompute_map (_metrics); } + recompute_map (_metrics); } PropertyChanged (PropertyChange ()); } -void +MeterSection* TempoMap::add_meter (const Meter& meter, const double& beat, const BBT_Time& where) { + MeterSection* m = 0; { Glib::Threads::RWLock::WriterLock lm (lock); - add_meter_locked (meter, beat, where, true); + m = add_meter_locked (meter, beat, where, true); } @@ -1004,14 +1003,17 @@ TempoMap::add_meter (const Meter& meter, const double& beat, const BBT_Time& whe #endif PropertyChanged (PropertyChange ()); + dump (_metrics, std::cerr); + return m; } -void +MeterSection* TempoMap::add_meter (const Meter& meter, const framepos_t& frame, const double& beat, const Timecode::BBT_Time& where) { + MeterSection* m = 0; { Glib::Threads::RWLock::WriterLock lm (lock); - add_meter_locked (meter, frame, beat, where, true); + m = add_meter_locked (meter, frame, beat, where, true); } @@ -1022,9 +1024,11 @@ TempoMap::add_meter (const Meter& meter, const framepos_t& frame, const double& #endif PropertyChanged (PropertyChange ()); + + return m; } -void +MeterSection* TempoMap::add_meter_locked (const Meter& meter, double beat, BBT_Time where, bool recompute) { /* a new meter always starts a new bar on the first beat. so @@ -1040,8 +1044,7 @@ TempoMap::add_meter_locked (const Meter& meter, double beat, BBT_Time where, boo } /* new meters *always* start on a beat. */ where.ticks = 0; - double pulse = pulse_at_beat_locked (_metrics, beat); - + const double pulse = pulse_at_beat_locked (_metrics, beat); MeterSection* new_meter = new MeterSection (pulse, beat, where, meter.divisions_per_bar(), meter.note_divisor()); do_insert (new_meter); @@ -1049,9 +1052,10 @@ TempoMap::add_meter_locked (const Meter& meter, double beat, BBT_Time where, boo solve_map (_metrics, new_meter, pulse); } + return new_meter; } -void +MeterSection* TempoMap::add_meter_locked (const Meter& meter, framepos_t frame, double beat, Timecode::BBT_Time where, bool recompute) { @@ -1066,6 +1070,7 @@ TempoMap::add_meter_locked (const Meter& meter, framepos_t frame, double beat, T solve_map (_metrics, new_meter, frame); } + return new_meter; } void @@ -1261,11 +1266,11 @@ TempoMap::recompute_meters (Metrics& metrics) double pulse = 0.0; pair<double, BBT_Time> b_bbt; if (meter->movable()) { - const double beats = ((pulse_at_frame_locked (metrics, meter->frame()) - prev_m->pulse()) * prev_m->note_divisor()) - prev_m->beat(); + const double beats = ((pulse_at_frame_locked (metrics, meter->frame()) - prev_m->pulse()) * prev_m->note_divisor()); const double ceil_beats = beats - fmod (beats, prev_m->divisions_per_bar()); - b_bbt = make_pair (ceil_beats, BBT_Time ((ceil_beats / prev_m->divisions_per_bar()) + prev_m->bbt().bars, 1, 0)); - const double true_pulse = prev_m->pulse() + (ceil_beats - prev_m->beat()) / prev_m->note_divisor(); - const double pulse_off = true_pulse - ((beats - prev_m->beat()) / prev_m->note_divisor()); + b_bbt = make_pair (ceil_beats + prev_m->beat(), BBT_Time ((ceil_beats / prev_m->divisions_per_bar()) + prev_m->bbt().bars, 1, 0)); + const double true_pulse = prev_m->pulse() + (ceil_beats / prev_m->note_divisor()); + const double pulse_off = true_pulse - (beats / prev_m->note_divisor()); pulse = true_pulse - pulse_off; } else { b_bbt = make_pair (0.0, BBT_Time (1, 1, 0)); @@ -1465,7 +1470,6 @@ TempoMap::frame_at_pulse_locked (const Metrics& metrics, const double& pulse) co /* HOLD THE READER LOCK */ const TempoSection* prev_t = 0; - double accumulated_pulses = 0.0; for (Metrics::const_iterator i = metrics.begin(); i != metrics.end(); ++i) { TempoSection* t; @@ -1478,12 +1482,11 @@ TempoMap::frame_at_pulse_locked (const Metrics& metrics, const double& pulse) co return prev_t->frame_at_pulse (pulse, _frame_rate); } - accumulated_pulses = t->pulse(); prev_t = t; } } /* must be treated as constant, irrespective of _type */ - double const pulses_in_section = pulse - accumulated_pulses; + double const pulses_in_section = pulse - prev_t->pulse(); double const dtime = pulses_in_section * prev_t->frames_per_pulse (_frame_rate); framecnt_t const ret = (framecnt_t) floor (dtime) + prev_t->frame(); @@ -2007,11 +2010,11 @@ TempoMap::solve_map (Metrics& imaginary, MeterSection* section, const framepos_t double pulse = 0.0; pair<double, BBT_Time> b_bbt; if (m->movable()) { - const double beats = ((pulse_at_frame_locked (imaginary, frame) - prev_m->pulse()) * prev_m->note_divisor()) - prev_m->beat(); + const double beats = ((pulse_at_frame_locked (imaginary, frame) - prev_m->pulse()) * prev_m->note_divisor()); const double ceil_beats = beats - fmod (beats, prev_m->divisions_per_bar()); - b_bbt = make_pair (ceil_beats, BBT_Time ((ceil_beats / prev_m->divisions_per_bar()) + prev_m->bbt().bars, 1, 0)); - const double true_pulse = prev_m->pulse() + ((ceil_beats - prev_m->beat()) / prev_m->note_divisor()); - const double pulse_off = true_pulse - ((beats - prev_m->beat()) / prev_m->note_divisor()); + b_bbt = make_pair (ceil_beats + prev_m->beat(), BBT_Time ((ceil_beats / prev_m->divisions_per_bar()) + prev_m->bbt().bars, 1, 0)); + const double true_pulse = prev_m->pulse() + (ceil_beats / prev_m->note_divisor()); + const double pulse_off = true_pulse - (beats / prev_m->note_divisor()); pulse = true_pulse - pulse_off; } else { b_bbt = make_pair (0.0, BBT_Time (1, 1, 0)); @@ -2030,11 +2033,11 @@ TempoMap::solve_map (Metrics& imaginary, MeterSection* section, const framepos_t double pulse = 0.0; pair<double, BBT_Time> b_bbt; if (m->movable()) { - const double beats = ((pulse_at_frame_locked (imaginary, m->frame()) - prev_m->pulse()) * prev_m->note_divisor()) - prev_m->beat(); + const double beats = ((pulse_at_frame_locked (imaginary, m->frame()) - prev_m->pulse()) * prev_m->note_divisor()); const double ceil_beats = beats - fmod (beats , prev_m->divisions_per_bar()); - b_bbt = make_pair (ceil_beats, BBT_Time ((ceil_beats / prev_m->divisions_per_bar()) + prev_m->bbt().bars, 1, 0)); - const double true_pulse = prev_m->pulse() + (ceil_beats - prev_m->beat()) / prev_m->note_divisor(); - const double pulse_off = true_pulse - ((beats - prev_m->beat()) / prev_m->note_divisor()); + b_bbt = make_pair (ceil_beats + prev_m->beat(), BBT_Time ((ceil_beats / prev_m->divisions_per_bar()) + prev_m->bbt().bars, 1, 0)); + const double true_pulse = prev_m->pulse() + (ceil_beats / prev_m->note_divisor()); + const double pulse_off = true_pulse - (beats / prev_m->note_divisor()); pulse = true_pulse - pulse_off; } else { b_bbt = make_pair (0.0, BBT_Time (1, 1, 0)); @@ -2071,34 +2074,33 @@ TempoMap::solve_map (Metrics& imaginary, MeterSection* section, const double& pu if ((m = dynamic_cast<MeterSection*> (*i)) != 0) { if (m == section){ section->set_frame (frame_at_pulse_locked (imaginary, pulse)); - const double beats = ((pulse - prev_m->pulse()) * prev_m->note_divisor()) - prev_m->beat(); + const double beats = ((pulse - prev_m->pulse()) * prev_m->note_divisor()); const int32_t bars = (beats + 1) / prev_m->divisions_per_bar(); - pair<double, BBT_Time> b_bbt = make_pair (beats, BBT_Time (bars + 1, 1, 0)); + pair<double, BBT_Time> b_bbt = make_pair (beats + prev_m->beat(), BBT_Time (bars + prev_m->bbt().bars, 1, 0)); section->set_beat (b_bbt); prev_m = section; continue; } if (prev_m) { + double pulse = 0.0; if (m->position_lock_style() == MusicTime) { - const double pulse = prev_m->pulse() + (m->beat() - prev_m->beat()) / prev_m->note_divisor(); + pulse = prev_m->pulse() + (m->beat() - prev_m->beat()) / prev_m->note_divisor(); m->set_frame (frame_at_pulse_locked (imaginary, pulse)); - m->set_pulse (pulse); } else { - double pulse = 0.0; pair<double, BBT_Time> b_bbt; if (m->movable()) { - const double beats = ((pulse_at_frame_locked (imaginary, m->frame()) - prev_m->pulse()) * prev_m->note_divisor()) - prev_m->beat(); + const double beats = ((pulse_at_frame_locked (imaginary, m->frame()) - prev_m->pulse()) * prev_m->note_divisor()); const double ceil_beats = beats - fmod (beats, prev_m->divisions_per_bar()); - b_bbt = make_pair (ceil_beats, BBT_Time ((ceil_beats / prev_m->divisions_per_bar()) + prev_m->bbt().bars, 1, 0)); - const double true_pulse = prev_m->pulse() + (m->beat() - prev_m->beat()) / prev_m->note_divisor(); - const double pulse_off = true_pulse - ((ceil_beats - prev_m->beat()) / prev_m->note_divisor()); + b_bbt = make_pair (ceil_beats + prev_m->beat(), BBT_Time ((ceil_beats / prev_m->divisions_per_bar()) + prev_m->bbt().bars, 1, 0)); + const double true_pulse = prev_m->pulse() + (ceil_beats / prev_m->note_divisor()); + const double pulse_off = true_pulse - (beats / prev_m->note_divisor()); pulse = true_pulse - pulse_off; } else { b_bbt = make_pair (0.0, BBT_Time (1, 1, 0)); } m->set_beat (b_bbt); - m->set_pulse (pulse); } + m->set_pulse (pulse); } prev_m = m; } |