Skip to content

Commit

Permalink
fix #33126 Pedal segment starting on same note where previous pedal s…
Browse files Browse the repository at this point in the history
…egment ends does not continue pedal playback
  • Loading branch information
CombatCube committed Sep 19, 2014
1 parent 1514034 commit d8385c8
Showing 1 changed file with 32 additions and 8 deletions.
40 changes: 32 additions & 8 deletions libmscore/rendermidi.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -961,26 +961,50 @@ void Score::renderMidi(EventMap* events)
//
int utick1 = rs->utick;
int utick2 = utick1 + rs->len;

std::map<int, std::vector<std::pair<int, bool>>> channelPedalEvents = std::map<int, std::vector<std::pair<int, bool>>>();
for (std::pair<int,Spanner*> sp : _spanner.map()) {
Spanner* s = sp.second;
if (s->type() != Element::Type::PEDAL)
continue;

int idx = s->staff()->channel(s->tick(), 0);
int channel = s->staff()->part()->instr(s->tick())->channel(idx).channel;
if (s->tick() >= utick1 && s->tick() < utick2) {
NPlayEvent event(ME_CONTROLLER, channel, CTRL_SUSTAIN, 127);
events->insert(std::pair<int,NPlayEvent>(s->tick() + tickOffset, event));
channelPedalEvents.emplace(channel, std::vector<std::pair<int, bool>>());
std::vector<std::pair<int, bool>> pedalEventList = channelPedalEvents.at(channel);
std::pair<int, bool> lastEvent;

if (!pedalEventList.empty())
lastEvent = pedalEventList.back();
else
lastEvent = std::pair<int, bool>(0, true);

if (s->tick() >= utick1 && s->tick() < utick2)
{
// 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() >= utick1 && s->tick2() < utick2) {
NPlayEvent event(ME_CONTROLLER, channel, CTRL_SUSTAIN, 0);
events->insert(std::pair<int,NPlayEvent>(s->tick2() + tickOffset, event));
for (std::pair<int, std::vector<std::pair<int, bool>>> pedalEvents : channelPedalEvents)
{
int channel = pedalEvents.first;
for (std::pair<int, bool> pe : pedalEvents.second)
{
NPlayEvent event;
if (pe.second == true)
event = NPlayEvent(ME_CONTROLLER, channel, CTRL_SUSTAIN, 127);
else
event = NPlayEvent(ME_CONTROLLER, channel, CTRL_SUSTAIN, 0);
events->insert(std::pair<int,NPlayEvent>(pe.first, event));
}
}
}
}

}

0 comments on commit d8385c8

Please sign in to comment.