diff --git a/src/importexport/midi/internal/midiexport/exportmidi.cpp b/src/importexport/midi/internal/midiexport/exportmidi.cpp index 47191ba47b7bc..bd67353ef5d07 100644 --- a/src/importexport/midi/internal/midiexport/exportmidi.cpp +++ b/src/importexport/midi/internal/midiexport/exportmidi.cpp @@ -27,6 +27,7 @@ #include "engraving/dom/masterscore.h" #include "engraving/dom/note.h" #include "engraving/dom/part.h" +#include "engraving/dom/rehearsalmark.h" #include "engraving/dom/repeatlist.h" #include "engraving/dom/sig.h" #include "engraving/dom/staff.h" @@ -372,12 +373,13 @@ bool ExportMidi::write(QIODevice* device, bool midiExpandRepeats, bool exportRPN } } - // Export lyrics + // Export lyrics and RehearsalMarks as Meta events for (const RepeatSegment* rs : m_score->repeatList()) { int startTick = rs->tick; int endTick = startTick + rs->len(); int tickOffset = rs->utick - rs->tick; + // export Lyrics 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) { @@ -402,6 +404,33 @@ bool ExportMidi::write(QIODevice* device, bool midiExpandRepeats, bool exportRPN } } } + + // export RehearsalMarks only for first track + if (staffIdx == 0) { + for (Segment* seg = rs->firstMeasure()->first(Segment::CHORD_REST_OR_TIME_TICK_TYPE); + seg && seg->tick().ticks() < endTick; + seg = seg->next1(Segment::CHORD_REST_OR_TIME_TICK_TYPE)) { + for (EngravingItem* e : seg->annotations()) { + if (e->isRehearsalMark()) { + RehearsalMark* r = toRehearsalMark(e); + muse::ByteArray 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(CompatMidiRender::tick(context, tick), ev); + } + } + } + } } ++staffIdx; }