Skip to content

Commit

Permalink
Merge pull request musescore#24171 from bakajikara/midi-lyrics-repeat
Browse files Browse the repository at this point in the history
Fix musescore#24168: Correctly export repeat lyrics
  • Loading branch information
RomanPudashkin committed Aug 26, 2024
2 parents 23d17b7 + c86ffbe commit f03025c
Showing 1 changed file with 26 additions and 19 deletions.
45 changes: 26 additions & 19 deletions src/importexport/midi/internal/midiexport/exportmidi.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -373,25 +373,32 @@ bool ExportMidi::write(QIODevice* device, bool midiExpandRepeats, bool exportRPN
}

// Export lyrics
SegmentType st = SegmentType::ChordRest;
for (Segment* seg = m_score->firstMeasure()->first(st); seg; seg = seg->next1(st)) {
for (track_idx_t i = part->startTrack(); i < part->endTrack(); ++i) {
ChordRest* cr = toChordRest(seg->element(i));
if (cr) {
for (const auto& lyric : cr->lyrics()) {
muse::ByteArray lyricText = lyric->plainText().toUtf8();
size_t len = lyricText.size() + 1;
unsigned char* data = new unsigned char[len];

memcpy(data, lyricText.constData(), len);

MidiEvent ev;
ev.setType(ME_META);
ev.setMetaType(META_LYRIC);
ev.setEData(data);
ev.setLen(static_cast<int>(len));

track.insert(cr->tick().ticks(), ev);
for (const RepeatSegment* rs : m_score->repeatList()) {
int startTick = rs->tick;
int endTick = startTick + rs->len();
int tickOffset = rs->utick - rs->tick;

SegmentType st = SegmentType::ChordRest;
for (Segment* seg = rs->firstMeasure()->first(st); seg && seg->tick().ticks() < endTick; seg = seg->next1(st)) {
for (track_idx_t i = part->startTrack(); i < part->endTrack(); ++i) {
ChordRest* cr = toChordRest(seg->element(i));
if (cr) {
for (const auto& lyric : cr->lyrics()) {
muse::ByteArray lyricText = lyric->plainText().toUtf8();
size_t len = lyricText.size() + 1;
unsigned char* data = new unsigned char[len];

memcpy(data, lyricText.constData(), len);

MidiEvent ev;
ev.setType(ME_META);
ev.setMetaType(META_LYRIC);
ev.setEData(data);
ev.setLen(static_cast<int>(len));

int tick = cr->tick().ticks() + tickOffset;
track.insert(CompatMidiRender::tick(context, tick), ev);
}
}
}
}
Expand Down

0 comments on commit f03025c

Please sign in to comment.