summaryrefslogtreecommitdiff
path: root/libs
diff options
context:
space:
mode:
authornick_m <mainsbridge@gmail.com>2016-04-03 01:41:27 +1100
committernick_m <mainsbridge@gmail.com>2016-05-27 23:38:13 +1000
commit304875836916ebef7b691f975b4892a18526c6af (patch)
treeccfe83500dacec57faad476b1ea0959d9452d6b4 /libs
parent3d07cd79e17f1bdda370f54c9ecece559af4d5f9 (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.h8
-rw-r--r--libs/ardour/tempo.cc80
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;
}