Skip to content

Commit

Permalink
Add RehearsalMark to MIDI export as Markers
Browse files Browse the repository at this point in the history
Backport of musescore#26196
  • Loading branch information
heavy-matill authored and Jojo-Schmitz committed Jan 22, 2025
1 parent ee84a67 commit 94ae69a
Showing 1 changed file with 24 additions and 1 deletion.
25 changes: 24 additions & 1 deletion audio/exports/exportmidi.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
#include "libmscore/lyrics.h"
#include "libmscore/measure.h"
#include "libmscore/part.h"
#include "libmscore/rehearsalmark.h"
#include "libmscore/repeatlist.h"
#include "libmscore/score.h"
#include "libmscore/sig.h"
Expand Down Expand Up @@ -371,14 +372,15 @@ bool ExportMidi::write(QIODevice* device, bool midiExpandRepeats, bool exportRPN
}
}

// Export lyrics
// Export lyrics and rehearsal marks
for (const RepeatSegment* rs : cs->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)) {
// Export lyrics
for (int i = part->startTrack(); i < part->endTrack(); ++i) {
ChordRest* cr = toChordRest(seg->element(i));
if (cr) {
Expand All @@ -400,6 +402,27 @@ bool ExportMidi::write(QIODevice* device, bool midiExpandRepeats, bool exportRPN
}
}
}
// Export RehearsalMarks as Markers
for (Element* e : seg->annotations()) {
if (e->isRehearsalMark()) {
RehearsalMark* r = toRehearsalMark(e);
QByteArray rText = r->plainText().toUtf8();
size_t len = rText.size() + 1;
unsigned char *data = new unsigned char[len];

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

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

int tick = r->segment()->tick().ticks() + tickOffset;
track.insert(tick, ev);
}
}

}
}
++staffIdx;
Expand Down

0 comments on commit 94ae69a

Please sign in to comment.