* mergeOverlappingNotes merges note events of same pitch that are overlapping in time. * inOutEvents is expected to be sorted. * @param inOutEvents */
| 106 | * @param inOutEvents |
| 107 | */ |
| 108 | static void mergeOverlappingNotesWithSamePitch(std::vector<Notes::Event>& inOutEvents) |
| 109 | { |
| 110 | sortEvents(inOutEvents); |
| 111 | for (int i = 0; i < int(inOutEvents.size()) - 1; i++) { |
| 112 | auto& event = inOutEvents[i]; |
| 113 | for (auto j = i + 1; j < inOutEvents.size(); j++) { |
| 114 | auto& event2 = inOutEvents[j]; |
| 115 | |
| 116 | // If notes don't overlap, break |
| 117 | if (event2.startFrame >= event.endFrame) { |
| 118 | break; |
| 119 | } |
| 120 | |
| 121 | // If notes overlap and have the same pitch: merge them |
| 122 | if (event.pitch == event2.pitch) { |
| 123 | event.endTime = event2.endTime; |
| 124 | event.endFrame = event2.endFrame; |
| 125 | inOutEvents.erase(inOutEvents.begin() + j); |
| 126 | } |
| 127 | } |
| 128 | } |
| 129 | } |
| 130 | |
| 131 | private: |
| 132 | /** |
nothing calls this directly
no outgoing calls
no test coverage detected