From 23f27bc3402da75c41c9c20297b32988428eed76 Mon Sep 17 00:00:00 2001 From: heavy-matill Date: Wed, 22 Jan 2025 15:09:14 +0100 Subject: [PATCH] Add RehearsalMark to MIDI export as Markers Backport of #26196 --- audio/exports/exportmidi.cpp | 26 +++++++++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/audio/exports/exportmidi.cpp b/audio/exports/exportmidi.cpp index 20c4d07a760d9..008f43179dc5e 100644 --- a/audio/exports/exportmidi.cpp +++ b/audio/exports/exportmidi.cpp @@ -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" @@ -371,7 +372,7 @@ bool ExportMidi::write(QIODevice* device, bool midiExpandRepeats, bool exportRPN } } - // Export lyrics + // Export lyrics and RehearsalMarks as Meta events for (const RepeatSegment* rs : cs->repeatList()) { int startTick = rs->tick; int endTick = startTick + rs->len(); @@ -379,6 +380,7 @@ bool ExportMidi::write(QIODevice* device, bool midiExpandRepeats, bool exportRPN 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) { @@ -400,6 +402,28 @@ bool ExportMidi::write(QIODevice* device, bool midiExpandRepeats, bool exportRPN } } } + // export RehearsalMarks only for first track + if (staffIdx == 0) { + 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(len)); + + int tick = r->segment()->tick().ticks() + tickOffset; + track.insert(tick, ev); + } + } + } } } ++staffIdx;