mirror of
https://github.com/Ardour/ardour.git
synced 2025-12-06 14:54:56 +01:00
tempo display: during ressaociate markers, update tempo curves as well
This commit is contained in:
parent
9e75235912
commit
320a20cbab
3 changed files with 23 additions and 13 deletions
|
|
@ -127,6 +127,7 @@ Editor::reassociate_metric_marker (TempoMap::SharedPtr const & tmap, TempoMap::M
|
||||||
} else if ((tp = dynamic_cast<Temporal::TempoPoint*>(*m)) != 0) {
|
} else if ((tp = dynamic_cast<Temporal::TempoPoint*>(*m)) != 0) {
|
||||||
if (tm->tempo() == *tp) {
|
if (tm->tempo() == *tp) {
|
||||||
tm->reset_tempo (*tp);
|
tm->reset_tempo (*tp);
|
||||||
|
tm->curve().reset_point (*tp);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -62,19 +62,19 @@ TempoCurve::TempoCurve (PublicEditor& ed, ArdourCanvas::Item& parent, guint32 rg
|
||||||
, _color (rgba)
|
, _color (rgba)
|
||||||
, _min_tempo (temp.note_types_per_minute())
|
, _min_tempo (temp.note_types_per_minute())
|
||||||
, _max_tempo (temp.note_types_per_minute())
|
, _max_tempo (temp.note_types_per_minute())
|
||||||
, _tempo (temp)
|
, _tempo (&temp)
|
||||||
, _start_text (0)
|
, _start_text (0)
|
||||||
, _end_text (0)
|
, _end_text (0)
|
||||||
{
|
{
|
||||||
/* XXX x arg for Duple should probably be marker width, passed in from owner */
|
/* XXX x arg for Duple should probably be marker width, passed in from owner */
|
||||||
group = new ArdourCanvas::Container (&parent, ArdourCanvas::Duple (marker_width, 1));
|
group = new ArdourCanvas::Container (&parent, ArdourCanvas::Duple (marker_width, 1));
|
||||||
#ifdef CANVAS_DEBUG
|
#ifdef CANVAS_DEBUG
|
||||||
group->name = string_compose ("TempoCurve::group for %1", _tempo.note_types_per_minute());
|
group->name = string_compose ("TempoCurve::group for %1", _tempo->note_types_per_minute());
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
_curve = new ArdourCanvas::FramedCurve (group);
|
_curve = new ArdourCanvas::FramedCurve (group);
|
||||||
#ifdef CANVAS_DEBUG
|
#ifdef CANVAS_DEBUG
|
||||||
_curve->name = string_compose ("TempoCurve::curve for %1", _tempo.note_types_per_minute());
|
_curve->name = string_compose ("TempoCurve::curve for %1", _tempo->note_types_per_minute());
|
||||||
#endif
|
#endif
|
||||||
_curve->set_points_per_segment (3);
|
_curve->set_points_per_segment (3);
|
||||||
_curve->set (points);
|
_curve->set (points);
|
||||||
|
|
@ -86,9 +86,9 @@ TempoCurve::TempoCurve (PublicEditor& ed, ArdourCanvas::Item& parent, guint32 rg
|
||||||
_start_text->set_color (RGBA_TO_UINT (255,255,255,255));
|
_start_text->set_color (RGBA_TO_UINT (255,255,255,255));
|
||||||
_end_text->set_color (RGBA_TO_UINT (255,255,255,255));
|
_end_text->set_color (RGBA_TO_UINT (255,255,255,255));
|
||||||
char buf[10];
|
char buf[10];
|
||||||
snprintf (buf, sizeof (buf), "%.3f/%d", _tempo.note_types_per_minute(), _tempo.note_type());
|
snprintf (buf, sizeof (buf), "%.3f/%d", _tempo->note_types_per_minute(), _tempo->note_type());
|
||||||
_start_text->set (buf);
|
_start_text->set (buf);
|
||||||
snprintf (buf, sizeof (buf), "%.3f", _tempo.end_note_types_per_minute());
|
snprintf (buf, sizeof (buf), "%.3f", _tempo->end_note_types_per_minute());
|
||||||
_end_text->set (buf);
|
_end_text->set (buf);
|
||||||
|
|
||||||
set_color_rgba (rgba);
|
set_color_rgba (rgba);
|
||||||
|
|
@ -131,9 +131,9 @@ TempoCurve::set_duration (samplecnt_t duration)
|
||||||
|
|
||||||
ArdourCanvas::Coord duration_pixels = editor.sample_to_pixel (duration);
|
ArdourCanvas::Coord duration_pixels = editor.sample_to_pixel (duration);
|
||||||
|
|
||||||
if (!_tempo.ramped()) {
|
if (!_tempo->ramped()) {
|
||||||
|
|
||||||
const double tempo_at = _tempo.note_types_per_minute();
|
const double tempo_at = _tempo->note_types_per_minute();
|
||||||
const double y_pos = (curve_height) - (((tempo_at - _min_tempo) / (_max_tempo - _min_tempo)) * curve_height);
|
const double y_pos = (curve_height) - (((tempo_at - _min_tempo) / (_max_tempo - _min_tempo)) * curve_height);
|
||||||
|
|
||||||
points.push_back (ArdourCanvas::Duple (0.0, y_pos));
|
points.push_back (ArdourCanvas::Duple (0.0, y_pos));
|
||||||
|
|
@ -145,7 +145,7 @@ TempoCurve::set_duration (samplecnt_t duration)
|
||||||
samplepos_t current_sample = 0;
|
samplepos_t current_sample = 0;
|
||||||
|
|
||||||
while (current_sample < duration) {
|
while (current_sample < duration) {
|
||||||
const double tempo_at = _tempo.note_types_per_minute_at_DOUBLE (timepos_t (current_sample));
|
const double tempo_at = _tempo->note_types_per_minute_at_DOUBLE (timepos_t (current_sample));
|
||||||
const double y_pos = std::max ((curve_height) - (((tempo_at - _min_tempo) / (_max_tempo - _min_tempo)) * curve_height), 0.0);
|
const double y_pos = std::max ((curve_height) - (((tempo_at - _min_tempo) / (_max_tempo - _min_tempo)) * curve_height), 0.0);
|
||||||
|
|
||||||
points.push_back (ArdourCanvas::Duple (editor.sample_to_pixel (current_sample), std::min (y_pos, curve_height)));
|
points.push_back (ArdourCanvas::Duple (editor.sample_to_pixel (current_sample), std::min (y_pos, curve_height)));
|
||||||
|
|
@ -153,7 +153,7 @@ TempoCurve::set_duration (samplecnt_t duration)
|
||||||
current_sample += sample_step;
|
current_sample += sample_step;
|
||||||
}
|
}
|
||||||
|
|
||||||
const double tempo_at = _tempo.note_types_per_minute();
|
const double tempo_at = _tempo->note_types_per_minute();
|
||||||
const double y_pos = std::max ((curve_height) - (((tempo_at - _min_tempo) / (_max_tempo - _min_tempo)) * curve_height), 0.0);
|
const double y_pos = std::max ((curve_height) - (((tempo_at - _min_tempo) / (_max_tempo - _min_tempo)) * curve_height), 0.0);
|
||||||
|
|
||||||
points.push_back (ArdourCanvas::Duple (duration_pixels, std::min (y_pos, curve_height)));
|
points.push_back (ArdourCanvas::Duple (duration_pixels, std::min (y_pos, curve_height)));
|
||||||
|
|
@ -163,10 +163,12 @@ TempoCurve::set_duration (samplecnt_t duration)
|
||||||
|
|
||||||
char buf[10];
|
char buf[10];
|
||||||
|
|
||||||
snprintf (buf, sizeof (buf), "%.3f/%d", _tempo.note_types_per_minute(), _tempo.note_type());
|
snprintf (buf, sizeof (buf), "%.3f/%d", _tempo->note_types_per_minute(), _tempo->note_type());
|
||||||
_start_text->set (buf);
|
_start_text->set (buf);
|
||||||
snprintf (buf, sizeof (buf), "%.3f", _tempo.end_note_types_per_minute());
|
std::cerr << "new start text " << buf << std::endl;
|
||||||
|
snprintf (buf, sizeof (buf), "%.3f", _tempo->end_note_types_per_minute());
|
||||||
_end_text->set (buf);
|
_end_text->set (buf);
|
||||||
|
std::cerr << "new end text " << buf << std::endl;
|
||||||
|
|
||||||
const double ui_scale = UIConfiguration::instance ().get_ui_scale ();
|
const double ui_scale = UIConfiguration::instance ().get_ui_scale ();
|
||||||
|
|
||||||
|
|
@ -210,3 +212,9 @@ TempoCurve::set_color_rgba (uint32_t c)
|
||||||
_curve->set_outline_color (_color);
|
_curve->set_outline_color (_color);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
TempoCurve::reset_point (TempoPoint const & tp)
|
||||||
|
{
|
||||||
|
_tempo = &tp;
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -55,7 +55,8 @@ public:
|
||||||
void hide ();
|
void hide ();
|
||||||
void show ();
|
void show ();
|
||||||
|
|
||||||
Temporal::TempoPoint const & tempo () const { return _tempo; }
|
Temporal::TempoPoint const & tempo () const { return *_tempo; }
|
||||||
|
void reset_point (Temporal::TempoPoint const &);
|
||||||
|
|
||||||
void set_max_tempo (const double& max) { _max_tempo = max; }
|
void set_max_tempo (const double& max) { _max_tempo = max; }
|
||||||
void set_min_tempo (const double& min) { _min_tempo = min; }
|
void set_min_tempo (const double& min) { _min_tempo = min; }
|
||||||
|
|
@ -83,7 +84,7 @@ private:
|
||||||
double _min_tempo;
|
double _min_tempo;
|
||||||
double _max_tempo;
|
double _max_tempo;
|
||||||
|
|
||||||
Temporal::TempoPoint const & _tempo;
|
Temporal::TempoPoint const * _tempo;
|
||||||
ArdourCanvas::Text* _start_text;
|
ArdourCanvas::Text* _start_text;
|
||||||
ArdourCanvas::Text* _end_text;
|
ArdourCanvas::Text* _end_text;
|
||||||
};
|
};
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue