Skip to content

Commit

Permalink
fix #42356: Pedal playback remains on if pedal line ends at closing r…
Browse files Browse the repository at this point in the history
…epeat bar. Also fix pedal ending on last tick of score.
  • Loading branch information
lasconic committed Apr 2, 2015
1 parent 3cc995d commit 4f94df8
Show file tree
Hide file tree
Showing 4 changed files with 583 additions and 4 deletions.
13 changes: 9 additions & 4 deletions libmscore/rendermidi.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -629,7 +629,8 @@ void Score::renderSpanners(EventMap* events, int staffIdx)
foreach (const RepeatSegment* rs, *repeatList()) {
int tickOffset = rs->utick - rs->tick;
int utick1 = rs->utick;
int utick2 = utick1 + rs->len;
int tick1 = repeatList()->utick2tick(utick1);
int tick2 = tick1 + rs->len;
std::map<int, std::vector<std::pair<int, bool>>> channelPedalEvents = std::map<int, std::vector<std::pair<int, bool>>>();
for (const auto& sp : _spanner.map()) {
Spanner* s = sp.second;
Expand All @@ -647,16 +648,20 @@ void Score::renderSpanners(EventMap* events, int staffIdx)
else
lastEvent = std::pair<int, bool>(0, true);

if (s->tick() >= utick1 && s->tick() < utick2) {
if (s->tick() >= tick1 && s->tick() < tick2) {
// Handle "overlapping" pedal segments (usual case for connected pedal line)
if (lastEvent.second == false && lastEvent.first >= (s->tick() + tickOffset + 2)) {
channelPedalEvents.at(channel).pop_back();
channelPedalEvents.at(channel).push_back(std::pair<int, bool>(s->tick() + tickOffset + 1, false));
}
channelPedalEvents.at(channel).push_back(std::pair<int, bool>(s->tick() + tickOffset + 2, true));
}
if (s->tick2() >= utick1 && s->tick2() < utick2)
channelPedalEvents.at(channel).push_back(std::pair<int, bool>(s->tick2() + tickOffset + 1, false));
if (s->tick2() >= tick1 && s->tick2() <= tick2) {
int t = s->tick2() + tickOffset + 1;
if (t > repeatList()->last()->utick + repeatList()->last()->len)
t = repeatList()->last()->utick + repeatList()->last()->len;
channelPedalEvents.at(channel).push_back(std::pair<int, bool>(t, false));
}
}

for (const auto& pedalEvents : channelPedalEvents) {
Expand Down
120 changes: 120 additions & 0 deletions mtest/libmscore/midi/testPedal-ref.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,120 @@
Tick = 0 Type = 144 Pitch = 72 Velocity = 80 Channel = 0
Tick = 0 Type = 3 Pitch = 0 Velocity = 0 Channel = 0
Tick = 113 Type = 144 Pitch = 72 Velocity = 0 Channel = 0
Tick = 120 Type = 144 Pitch = 74 Velocity = 80 Channel = 0
Tick = 233 Type = 144 Pitch = 74 Velocity = 0 Channel = 0
Tick = 240 Type = 144 Pitch = 76 Velocity = 80 Channel = 0
Tick = 353 Type = 144 Pitch = 76 Velocity = 0 Channel = 0
Tick = 360 Type = 144 Pitch = 78 Velocity = 80 Channel = 0
Tick = 473 Type = 144 Pitch = 78 Velocity = 0 Channel = 0
Tick = 480 Type = 144 Pitch = 79 Velocity = 80 Channel = 0
Tick = 480 Type = 4 Pitch = 0 Velocity = 0 Channel = 0
Tick = 593 Type = 144 Pitch = 79 Velocity = 0 Channel = 0
Tick = 960 Type = 144 Pitch = 72 Velocity = 80 Channel = 0
Tick = 960 Type = 4 Pitch = 0 Velocity = 0 Channel = 0
Tick = 1073 Type = 144 Pitch = 72 Velocity = 0 Channel = 0
Tick = 1080 Type = 144 Pitch = 74 Velocity = 80 Channel = 0
Tick = 1193 Type = 144 Pitch = 74 Velocity = 0 Channel = 0
Tick = 1200 Type = 144 Pitch = 76 Velocity = 80 Channel = 0
Tick = 1313 Type = 144 Pitch = 76 Velocity = 0 Channel = 0
Tick = 1320 Type = 144 Pitch = 78 Velocity = 80 Channel = 0
Tick = 1433 Type = 144 Pitch = 78 Velocity = 0 Channel = 0
Tick = 1440 Type = 144 Pitch = 79 Velocity = 80 Channel = 0
Tick = 1440 Type = 4 Pitch = 0 Velocity = 0 Channel = 0
Tick = 1553 Type = 144 Pitch = 79 Velocity = 0 Channel = 0
Tick = 1920 Type = 144 Pitch = 72 Velocity = 80 Channel = 0
Tick = 1920 Type = 3 Pitch = 0 Velocity = 0 Channel = 0
Tick = 1922 Type = 176 Pitch = 64 Velocity = 127 Channel = 0
Tick = 2033 Type = 144 Pitch = 72 Velocity = 0 Channel = 0
Tick = 2040 Type = 144 Pitch = 74 Velocity = 80 Channel = 0
Tick = 2153 Type = 144 Pitch = 74 Velocity = 0 Channel = 0
Tick = 2160 Type = 144 Pitch = 76 Velocity = 80 Channel = 0
Tick = 2273 Type = 144 Pitch = 76 Velocity = 0 Channel = 0
Tick = 2280 Type = 144 Pitch = 78 Velocity = 80 Channel = 0
Tick = 2393 Type = 144 Pitch = 78 Velocity = 0 Channel = 0
Tick = 2400 Type = 144 Pitch = 79 Velocity = 80 Channel = 0
Tick = 2400 Type = 4 Pitch = 0 Velocity = 0 Channel = 0
Tick = 2513 Type = 144 Pitch = 79 Velocity = 0 Channel = 0
Tick = 2880 Type = 144 Pitch = 72 Velocity = 80 Channel = 0
Tick = 2880 Type = 4 Pitch = 0 Velocity = 0 Channel = 0
Tick = 2993 Type = 144 Pitch = 72 Velocity = 0 Channel = 0
Tick = 3000 Type = 144 Pitch = 74 Velocity = 80 Channel = 0
Tick = 3113 Type = 144 Pitch = 74 Velocity = 0 Channel = 0
Tick = 3120 Type = 144 Pitch = 76 Velocity = 80 Channel = 0
Tick = 3233 Type = 144 Pitch = 76 Velocity = 0 Channel = 0
Tick = 3240 Type = 144 Pitch = 78 Velocity = 80 Channel = 0
Tick = 3353 Type = 144 Pitch = 78 Velocity = 0 Channel = 0
Tick = 3360 Type = 144 Pitch = 79 Velocity = 80 Channel = 0
Tick = 3360 Type = 4 Pitch = 0 Velocity = 0 Channel = 0
Tick = 3473 Type = 144 Pitch = 79 Velocity = 0 Channel = 0
Tick = 3840 Type = 144 Pitch = 72 Velocity = 80 Channel = 0
Tick = 3840 Type = 3 Pitch = 0 Velocity = 0 Channel = 0
Tick = 3841 Type = 176 Pitch = 64 Velocity = 0 Channel = 0
Tick = 3953 Type = 144 Pitch = 72 Velocity = 0 Channel = 0
Tick = 3960 Type = 144 Pitch = 74 Velocity = 80 Channel = 0
Tick = 4073 Type = 144 Pitch = 74 Velocity = 0 Channel = 0
Tick = 4080 Type = 144 Pitch = 76 Velocity = 80 Channel = 0
Tick = 4193 Type = 144 Pitch = 76 Velocity = 0 Channel = 0
Tick = 4200 Type = 144 Pitch = 78 Velocity = 80 Channel = 0
Tick = 4313 Type = 144 Pitch = 78 Velocity = 0 Channel = 0
Tick = 4320 Type = 144 Pitch = 79 Velocity = 80 Channel = 0
Tick = 4320 Type = 4 Pitch = 0 Velocity = 0 Channel = 0
Tick = 4433 Type = 144 Pitch = 79 Velocity = 0 Channel = 0
Tick = 4800 Type = 144 Pitch = 72 Velocity = 80 Channel = 0
Tick = 4800 Type = 4 Pitch = 0 Velocity = 0 Channel = 0
Tick = 4913 Type = 144 Pitch = 72 Velocity = 0 Channel = 0
Tick = 4920 Type = 144 Pitch = 74 Velocity = 80 Channel = 0
Tick = 5033 Type = 144 Pitch = 74 Velocity = 0 Channel = 0
Tick = 5040 Type = 144 Pitch = 76 Velocity = 80 Channel = 0
Tick = 5153 Type = 144 Pitch = 76 Velocity = 0 Channel = 0
Tick = 5160 Type = 144 Pitch = 78 Velocity = 80 Channel = 0
Tick = 5273 Type = 144 Pitch = 78 Velocity = 0 Channel = 0
Tick = 5280 Type = 144 Pitch = 79 Velocity = 80 Channel = 0
Tick = 5280 Type = 4 Pitch = 0 Velocity = 0 Channel = 0
Tick = 5393 Type = 144 Pitch = 79 Velocity = 0 Channel = 0
Tick = 5760 Type = 144 Pitch = 72 Velocity = 80 Channel = 0
Tick = 5760 Type = 3 Pitch = 0 Velocity = 0 Channel = 0
Tick = 5762 Type = 176 Pitch = 64 Velocity = 127 Channel = 0
Tick = 5873 Type = 144 Pitch = 72 Velocity = 0 Channel = 0
Tick = 5880 Type = 144 Pitch = 74 Velocity = 80 Channel = 0
Tick = 5993 Type = 144 Pitch = 74 Velocity = 0 Channel = 0
Tick = 6000 Type = 144 Pitch = 76 Velocity = 80 Channel = 0
Tick = 6113 Type = 144 Pitch = 76 Velocity = 0 Channel = 0
Tick = 6120 Type = 144 Pitch = 78 Velocity = 80 Channel = 0
Tick = 6233 Type = 144 Pitch = 78 Velocity = 0 Channel = 0
Tick = 6240 Type = 144 Pitch = 79 Velocity = 80 Channel = 0
Tick = 6240 Type = 4 Pitch = 0 Velocity = 0 Channel = 0
Tick = 6353 Type = 144 Pitch = 79 Velocity = 0 Channel = 0
Tick = 6720 Type = 144 Pitch = 72 Velocity = 80 Channel = 0
Tick = 6720 Type = 4 Pitch = 0 Velocity = 0 Channel = 0
Tick = 6833 Type = 144 Pitch = 72 Velocity = 0 Channel = 0
Tick = 6840 Type = 144 Pitch = 74 Velocity = 80 Channel = 0
Tick = 6953 Type = 144 Pitch = 74 Velocity = 0 Channel = 0
Tick = 6960 Type = 144 Pitch = 76 Velocity = 80 Channel = 0
Tick = 7073 Type = 144 Pitch = 76 Velocity = 0 Channel = 0
Tick = 7080 Type = 144 Pitch = 78 Velocity = 80 Channel = 0
Tick = 7193 Type = 144 Pitch = 78 Velocity = 0 Channel = 0
Tick = 7200 Type = 144 Pitch = 79 Velocity = 80 Channel = 0
Tick = 7200 Type = 4 Pitch = 0 Velocity = 0 Channel = 0
Tick = 7313 Type = 144 Pitch = 79 Velocity = 0 Channel = 0
Tick = 7680 Type = 144 Pitch = 72 Velocity = 80 Channel = 0
Tick = 7680 Type = 3 Pitch = 0 Velocity = 0 Channel = 0
Tick = 7681 Type = 176 Pitch = 64 Velocity = 0 Channel = 0
Tick = 7793 Type = 144 Pitch = 72 Velocity = 0 Channel = 0
Tick = 7800 Type = 144 Pitch = 74 Velocity = 80 Channel = 0
Tick = 7913 Type = 144 Pitch = 74 Velocity = 0 Channel = 0
Tick = 7920 Type = 144 Pitch = 76 Velocity = 80 Channel = 0
Tick = 8033 Type = 144 Pitch = 76 Velocity = 0 Channel = 0
Tick = 8040 Type = 144 Pitch = 78 Velocity = 80 Channel = 0
Tick = 8153 Type = 144 Pitch = 78 Velocity = 0 Channel = 0
Tick = 8160 Type = 4 Pitch = 0 Velocity = 0 Channel = 0
Tick = 8640 Type = 4 Pitch = 0 Velocity = 0 Channel = 0
Tick = 9120 Type = 4 Pitch = 0 Velocity = 0 Channel = 0
Tick = 9600 Type = 144 Pitch = 72 Velocity = 80 Channel = 0
Tick = 9600 Type = 3 Pitch = 0 Velocity = 0 Channel = 0
Tick = 9602 Type = 176 Pitch = 64 Velocity = 127 Channel = 0
Tick = 10080 Type = 4 Pitch = 0 Velocity = 0 Channel = 0
Tick = 10560 Type = 4 Pitch = 0 Velocity = 0 Channel = 0
Tick = 11040 Type = 4 Pitch = 0 Velocity = 0 Channel = 0
Tick = 11423 Type = 144 Pitch = 72 Velocity = 0 Channel = 0
Tick = 11520 Type = 176 Pitch = 64 Velocity = 0 Channel = 0
Loading

0 comments on commit 4f94df8

Please sign in to comment.