MIDI Program Changes: Fix some thinkos in patch-change flag locations

Program Changes are stored as an offset from the 'source' start, and must be translated to/from region time.

Better locating of patches wrt the grid:
You can't assume time_to_pixel is steady across the timeline
* calculate position of the patch-change flag
* calculate region start position, and set flag's x offset from there

also: consolidate patch-location code into display_patch_changes()
This commit is contained in:
Ben Loftis 2021-11-22 16:52:39 -06:00
parent c27bfde045
commit 60e522f4ee
1 changed files with 9 additions and 17 deletions

View File

@ -1250,12 +1250,15 @@ MidiRegionView::display_patch_changes_on_channel (uint8_t channel, bool active_c
if ((p = find_canvas_patch_change (*i)) != 0) {
const timepos_t region_time = _region->source_beats_to_region_time ((*i)->time());
if (region_time < timepos_t() || region_time >= _region->length()) {
p->hide();
} else {
const double x = trackview.editor().time_to_pixel (region_time);
p->canvas_item()->set_position (ArdourCanvas::Duple (x, 1.0));
const timepos_t flag_time = _region->source_beats_to_absolute_time ((*i)->time());
const double flag_x = trackview.editor().time_to_pixel (flag_time);
const double region_x = trackview.editor().time_to_pixel (_region->position());
p->canvas_item()->set_position (ArdourCanvas::Duple (flag_x-region_x, 1.0));
p->update_name ();
p->show();
@ -1861,9 +1864,7 @@ MidiRegionView::step_sustain (Temporal::Beats beats)
void
MidiRegionView::add_canvas_patch_change (MidiModel::PatchChangePtr patch)
{
timepos_t patch_time = _region->source_beats_to_absolute_time (patch->time());
const double x = trackview.editor().time_to_pixel (patch_time);
const double x = 0;
double const height = midi_stream_view()->contents_height();
// CAIROCANVAS: active_channel info removed from PatcChange constructor
@ -1879,18 +1880,9 @@ MidiRegionView::add_canvas_patch_change (MidiModel::PatchChangePtr patch)
_patch_change_fill)
);
if (patch_change->item().width() < _pixel_width) {
// Show unless patch change is beyond the region bounds
if (patch_time < _region->position() || patch_time >= _region->nt_last()) {
patch_change->hide();
} else {
patch_change->show();
}
} else {
patch_change->hide ();
}
_patch_changes.insert (make_pair (patch, patch_change));
display_patch_changes();
}
void