Tempo ramps - copy-drag meters works again.
- meter drags now use mvc style.
This commit is contained in:
parent
3d07cd79e1
commit
3048758369
|
@ -3148,10 +3148,7 @@ MeterMarkerDrag::motion (GdkEvent* event, bool first_move)
|
||||||
|
|
||||||
if (first_move) {
|
if (first_move) {
|
||||||
|
|
||||||
// create a dummy marker for visual representation of moving the
|
// create a dummy marker to catch events, then hide it.
|
||||||
// section, because whether its a copy or not, we're going to
|
|
||||||
// leave or lose the original marker (leave if its a copy; lose if its
|
|
||||||
// not, because we'll remove it from the map).
|
|
||||||
|
|
||||||
char name[64];
|
char name[64];
|
||||||
snprintf (name, sizeof(name), "%g/%g", _marker->meter().divisions_per_bar(), _marker->meter().note_divisor ());
|
snprintf (name, sizeof(name), "%g/%g", _marker->meter().divisions_per_bar(), _marker->meter().note_divisor ());
|
||||||
|
@ -3166,14 +3163,34 @@ MeterMarkerDrag::motion (GdkEvent* event, bool first_move)
|
||||||
|
|
||||||
/* use the new marker for the grab */
|
/* use the new marker for the grab */
|
||||||
swap_grab (&_marker->the_item(), 0, GDK_CURRENT_TIME);
|
swap_grab (&_marker->the_item(), 0, GDK_CURRENT_TIME);
|
||||||
|
_marker->hide();
|
||||||
|
|
||||||
|
TempoMap& map (_editor->session()->tempo_map());
|
||||||
|
/* get current state */
|
||||||
|
before_state = &map.get_state();
|
||||||
|
|
||||||
if (!_copy) {
|
if (!_copy) {
|
||||||
_editor->begin_reversible_command (_("move meter mark"));
|
_editor->begin_reversible_command (_("move meter mark"));
|
||||||
TempoMap& map (_editor->session()->tempo_map());
|
} else {
|
||||||
/* get current state */
|
_editor->begin_reversible_command (_("copy meter mark"));
|
||||||
before_state = &map.get_state();
|
|
||||||
|
Timecode::BBT_Time bbt;
|
||||||
|
map.bbt_time (_marker->position(), bbt);
|
||||||
|
map.round_bbt (bbt, -1);
|
||||||
|
if (_real_section->frame() < adjusted_current_frame (event, false)) {
|
||||||
|
++bbt.bars;
|
||||||
|
} else {
|
||||||
|
--bbt.bars;
|
||||||
|
}
|
||||||
|
const double beat = map.bbt_to_beats (bbt);
|
||||||
|
|
||||||
|
if (_real_section->position_lock_style() == AudioTime) {
|
||||||
|
_real_section = map.add_meter (Meter (_marker->meter().divisions_per_bar(), _marker->meter().note_divisor())
|
||||||
|
, _marker->position(), beat, bbt);
|
||||||
|
} else {
|
||||||
|
_real_section = map.add_meter (Meter (_marker->meter().divisions_per_bar(), _marker->meter().note_divisor()), beat, bbt);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
_marker->hide();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
framepos_t const pf = adjusted_current_frame (event, false);
|
framepos_t const pf = adjusted_current_frame (event, false);
|
||||||
|
@ -3184,6 +3201,7 @@ MeterMarkerDrag::motion (GdkEvent* event, bool first_move)
|
||||||
} else {
|
} else {
|
||||||
_editor->session()->tempo_map().gui_move_meter (_real_section, pf);
|
_editor->session()->tempo_map().gui_move_meter (_real_section, pf);
|
||||||
}
|
}
|
||||||
|
_marker->set_position (pf);
|
||||||
show_verbose_cursor_time (pf);
|
show_verbose_cursor_time (pf);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3200,20 +3218,11 @@ MeterMarkerDrag::finished (GdkEvent* event, bool movement_occurred)
|
||||||
TempoMap& map (_editor->session()->tempo_map());
|
TempoMap& map (_editor->session()->tempo_map());
|
||||||
|
|
||||||
if (_copy == true) {
|
if (_copy == true) {
|
||||||
_editor->begin_reversible_command (_("copy meter mark"));
|
|
||||||
XMLNode &before = map.get_state();
|
|
||||||
|
|
||||||
if (_real_section->position_lock_style() == AudioTime) {
|
|
||||||
map.add_meter (Meter (_real_section->divisions_per_bar(), _real_section->note_divisor()), _real_section->frame(), _real_section->beat(), _real_section->bbt());
|
|
||||||
} else {
|
|
||||||
map.add_meter (Meter (_real_section->divisions_per_bar(), _real_section->note_divisor()), _real_section->beat(), _real_section->bbt());
|
|
||||||
}
|
|
||||||
XMLNode &after = map.get_state();
|
XMLNode &after = map.get_state();
|
||||||
_editor->session()->add_command(new MementoCommand<TempoMap>(map, &before, &after));
|
_editor->session()->add_command(new MementoCommand<TempoMap>(map, before_state, &after));
|
||||||
_editor->commit_reversible_command ();
|
_editor->commit_reversible_command ();
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
/* we removed it before, so add it back now */
|
|
||||||
if (_real_section->position_lock_style() == AudioTime) {
|
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());
|
map.replace_meter (*_real_section, Meter (_real_section->divisions_per_bar(), _real_section->note_divisor()), _real_section->frame());
|
||||||
} else {
|
} else {
|
||||||
|
@ -3283,13 +3292,7 @@ TempoMarkerDrag::motion (GdkEvent* event, bool first_move)
|
||||||
}
|
}
|
||||||
if (first_move) {
|
if (first_move) {
|
||||||
|
|
||||||
// create a dummy marker for visual representation of moving the
|
// mvc drag - create a dummy marker to catch events, hide it.
|
||||||
// section, because whether its a copy or not, we're going to
|
|
||||||
// leave or lose the original marker (leave if its a copy; lose if its
|
|
||||||
// not, because we'll remove it from the map).
|
|
||||||
|
|
||||||
// create a dummy marker for visual representation of moving the copy.
|
|
||||||
// The actual copying is not done before we reach the finish callback.
|
|
||||||
|
|
||||||
char name[64];
|
char name[64];
|
||||||
snprintf (name, sizeof (name), "%.2f", _marker->tempo().beats_per_minute());
|
snprintf (name, sizeof (name), "%.2f", _marker->tempo().beats_per_minute());
|
||||||
|
@ -3390,7 +3393,6 @@ TempoMarkerDrag::finished (GdkEvent* event, bool movement_occurred)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
//motion (event, false);
|
|
||||||
|
|
||||||
TempoMap& map (_editor->session()->tempo_map());
|
TempoMap& map (_editor->session()->tempo_map());
|
||||||
|
|
||||||
|
|
|
@ -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 double& pulse, TempoSection::Type type);
|
||||||
void add_tempo (const Tempo&, const framepos_t& frame, 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);
|
MeterSection* 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 framepos_t& frame, const double& beat, const Timecode::BBT_Time& where);
|
||||||
|
|
||||||
void remove_tempo (const TempoSection&, bool send_signal);
|
void remove_tempo (const TempoSection&, bool send_signal);
|
||||||
void remove_meter (const MeterSection&, 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&, double pulse, bool recompute, TempoSection::Type type);
|
||||||
void add_tempo_locked (const Tempo&, framepos_t frame, 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);
|
MeterSection* 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&, framepos_t frame, double beat, Timecode::BBT_Time where, bool recompute);
|
||||||
|
|
||||||
bool remove_tempo_locked (const TempoSection&);
|
bool remove_tempo_locked (const TempoSection&);
|
||||||
bool remove_meter_locked (const MeterSection&);
|
bool remove_meter_locked (const MeterSection&);
|
||||||
|
|
|
@ -779,7 +779,7 @@ TempoMap::do_insert (MetricSection* section)
|
||||||
|
|
||||||
bool const ipm = insert_meter->position_lock_style() == MusicTime;
|
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()) {
|
if (!meter->movable()) {
|
||||||
|
|
||||||
|
@ -793,7 +793,6 @@ TempoMap::do_insert (MetricSection* section)
|
||||||
need_add = false;
|
need_add = false;
|
||||||
} else {
|
} else {
|
||||||
_metrics.erase (i);
|
_metrics.erase (i);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
@ -817,7 +816,7 @@ TempoMap::do_insert (MetricSection* section)
|
||||||
|
|
||||||
if (meter) {
|
if (meter) {
|
||||||
bool const ipm = insert_meter->position_lock_style() == MusicTime;
|
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;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -948,8 +947,8 @@ TempoMap::replace_meter (const MeterSection& ms, const Meter& meter, const BBT_T
|
||||||
/* cannot move the first meter section */
|
/* cannot move the first meter section */
|
||||||
*static_cast<Meter*>(&first) = meter;
|
*static_cast<Meter*>(&first) = meter;
|
||||||
first.set_position_lock_style (pl);
|
first.set_position_lock_style (pl);
|
||||||
recompute_map (_metrics);
|
|
||||||
}
|
}
|
||||||
|
recompute_map (_metrics);
|
||||||
}
|
}
|
||||||
|
|
||||||
PropertyChanged (PropertyChange ());
|
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_frame (first.frame());
|
||||||
first_t.set_pulse (0.0);
|
first_t.set_pulse (0.0);
|
||||||
first_t.set_position_lock_style (AudioTime);
|
first_t.set_position_lock_style (AudioTime);
|
||||||
|
|
||||||
recompute_map (_metrics);
|
|
||||||
}
|
}
|
||||||
|
recompute_map (_metrics);
|
||||||
}
|
}
|
||||||
PropertyChanged (PropertyChange ());
|
PropertyChanged (PropertyChange ());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void
|
MeterSection*
|
||||||
TempoMap::add_meter (const Meter& meter, const double& beat, const BBT_Time& where)
|
TempoMap::add_meter (const Meter& meter, const double& beat, const BBT_Time& where)
|
||||||
{
|
{
|
||||||
|
MeterSection* m = 0;
|
||||||
{
|
{
|
||||||
Glib::Threads::RWLock::WriterLock lm (lock);
|
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
|
#endif
|
||||||
|
|
||||||
PropertyChanged (PropertyChange ());
|
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)
|
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);
|
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
|
#endif
|
||||||
|
|
||||||
PropertyChanged (PropertyChange ());
|
PropertyChanged (PropertyChange ());
|
||||||
|
|
||||||
|
return m;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
MeterSection*
|
||||||
TempoMap::add_meter_locked (const Meter& meter, double beat, BBT_Time where, bool recompute)
|
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
|
/* 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. */
|
/* new meters *always* start on a beat. */
|
||||||
where.ticks = 0;
|
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());
|
MeterSection* new_meter = new MeterSection (pulse, beat, where, meter.divisions_per_bar(), meter.note_divisor());
|
||||||
do_insert (new_meter);
|
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);
|
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)
|
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);
|
solve_map (_metrics, new_meter, frame);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return new_meter;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -1261,11 +1266,11 @@ TempoMap::recompute_meters (Metrics& metrics)
|
||||||
double pulse = 0.0;
|
double pulse = 0.0;
|
||||||
pair<double, BBT_Time> b_bbt;
|
pair<double, BBT_Time> b_bbt;
|
||||||
if (meter->movable()) {
|
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());
|
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));
|
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->beat()) / prev_m->note_divisor();
|
const double true_pulse = prev_m->pulse() + (ceil_beats / prev_m->note_divisor());
|
||||||
const double pulse_off = true_pulse - ((beats - prev_m->beat()) / prev_m->note_divisor());
|
const double pulse_off = true_pulse - (beats / prev_m->note_divisor());
|
||||||
pulse = true_pulse - pulse_off;
|
pulse = true_pulse - pulse_off;
|
||||||
} else {
|
} else {
|
||||||
b_bbt = make_pair (0.0, BBT_Time (1, 1, 0));
|
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 */
|
/* HOLD THE READER LOCK */
|
||||||
|
|
||||||
const TempoSection* prev_t = 0;
|
const TempoSection* prev_t = 0;
|
||||||
double accumulated_pulses = 0.0;
|
|
||||||
|
|
||||||
for (Metrics::const_iterator i = metrics.begin(); i != metrics.end(); ++i) {
|
for (Metrics::const_iterator i = metrics.begin(); i != metrics.end(); ++i) {
|
||||||
TempoSection* t;
|
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);
|
return prev_t->frame_at_pulse (pulse, _frame_rate);
|
||||||
}
|
}
|
||||||
|
|
||||||
accumulated_pulses = t->pulse();
|
|
||||||
prev_t = t;
|
prev_t = t;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/* must be treated as constant, irrespective of _type */
|
/* 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);
|
double const dtime = pulses_in_section * prev_t->frames_per_pulse (_frame_rate);
|
||||||
|
|
||||||
framecnt_t const ret = (framecnt_t) floor (dtime) + prev_t->frame();
|
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;
|
double pulse = 0.0;
|
||||||
pair<double, BBT_Time> b_bbt;
|
pair<double, BBT_Time> b_bbt;
|
||||||
if (m->movable()) {
|
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());
|
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));
|
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->beat()) / prev_m->note_divisor());
|
const double true_pulse = prev_m->pulse() + (ceil_beats / prev_m->note_divisor());
|
||||||
const double pulse_off = true_pulse - ((beats - prev_m->beat()) / prev_m->note_divisor());
|
const double pulse_off = true_pulse - (beats / prev_m->note_divisor());
|
||||||
pulse = true_pulse - pulse_off;
|
pulse = true_pulse - pulse_off;
|
||||||
} else {
|
} else {
|
||||||
b_bbt = make_pair (0.0, BBT_Time (1, 1, 0));
|
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;
|
double pulse = 0.0;
|
||||||
pair<double, BBT_Time> b_bbt;
|
pair<double, BBT_Time> b_bbt;
|
||||||
if (m->movable()) {
|
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());
|
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));
|
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->beat()) / prev_m->note_divisor();
|
const double true_pulse = prev_m->pulse() + (ceil_beats / prev_m->note_divisor());
|
||||||
const double pulse_off = true_pulse - ((beats - prev_m->beat()) / prev_m->note_divisor());
|
const double pulse_off = true_pulse - (beats / prev_m->note_divisor());
|
||||||
pulse = true_pulse - pulse_off;
|
pulse = true_pulse - pulse_off;
|
||||||
} else {
|
} else {
|
||||||
b_bbt = make_pair (0.0, BBT_Time (1, 1, 0));
|
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 = dynamic_cast<MeterSection*> (*i)) != 0) {
|
||||||
if (m == section){
|
if (m == section){
|
||||||
section->set_frame (frame_at_pulse_locked (imaginary, pulse));
|
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();
|
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);
|
section->set_beat (b_bbt);
|
||||||
prev_m = section;
|
prev_m = section;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (prev_m) {
|
if (prev_m) {
|
||||||
|
double pulse = 0.0;
|
||||||
if (m->position_lock_style() == MusicTime) {
|
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_frame (frame_at_pulse_locked (imaginary, pulse));
|
||||||
m->set_pulse (pulse);
|
|
||||||
} else {
|
} else {
|
||||||
double pulse = 0.0;
|
|
||||||
pair<double, BBT_Time> b_bbt;
|
pair<double, BBT_Time> b_bbt;
|
||||||
if (m->movable()) {
|
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());
|
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));
|
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() + (m->beat() - prev_m->beat()) / prev_m->note_divisor();
|
const double true_pulse = prev_m->pulse() + (ceil_beats / prev_m->note_divisor());
|
||||||
const double pulse_off = true_pulse - ((ceil_beats - prev_m->beat()) / prev_m->note_divisor());
|
const double pulse_off = true_pulse - (beats / prev_m->note_divisor());
|
||||||
pulse = true_pulse - pulse_off;
|
pulse = true_pulse - pulse_off;
|
||||||
} else {
|
} else {
|
||||||
b_bbt = make_pair (0.0, BBT_Time (1, 1, 0));
|
b_bbt = make_pair (0.0, BBT_Time (1, 1, 0));
|
||||||
}
|
}
|
||||||
m->set_beat (b_bbt);
|
m->set_beat (b_bbt);
|
||||||
m->set_pulse (pulse);
|
|
||||||
}
|
}
|
||||||
|
m->set_pulse (pulse);
|
||||||
}
|
}
|
||||||
prev_m = m;
|
prev_m = m;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user