LCOV - code coverage report
Current view: top level - src/importexport/ove/internal - importove.cpp Coverage Total Hit
Test: filtered_coverage.info Lines: 37.8 % 1615 611
Test Date: 2026-11-05 04:07:02

            Line data    Source code
       1              : /*
       2              :  * SPDX-License-Identifier: GPL-3.0-only
       3              :  * MuseScore-Studio-CLA-applies
       4              :  *
       5              :  * MuseScore Studio
       6              :  * Music Composition & Notation
       7              :  *
       8              :  * Copyright (C) 2021 MuseScore Limited and others
       9              :  *
      10              :  * This program is free software: you can redistribute it and/or modify
      11              :  * it under the terms of the GNU General Public License version 3 as
      12              :  * published by the Free Software Foundation.
      13              :  *
      14              :  * This program is distributed in the hope that it will be useful,
      15              :  * but WITHOUT ANY WARRANTY; without even the implied warranty of
      16              :  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
      17              :  * GNU General Public License for more details.
      18              :  *
      19              :  * You should have received a copy of the GNU General Public License
      20              :  * along with this program.  If not, see <https://www.gnu.org/licenses/>.
      21              :  */
      22              : 
      23              : #include "ove.h"
      24              : 
      25              : #include <QFile>
      26              : #include <QtMath>
      27              : 
      28              : #include "engraving/engravingerrors.h"
      29              : 
      30              : #include "engraving/dom/factory.h"
      31              : #include "engraving/dom/sig.h"
      32              : #include "engraving/dom/arpeggio.h"
      33              : #include "engraving/dom/articulation.h"
      34              : #include "engraving/dom/box.h"
      35              : #include "engraving/dom/bracket.h"
      36              : #include "engraving/dom/breath.h"
      37              : #include "engraving/editing/editstaffbrackets.h"
      38              : #include "engraving/dom/chord.h"
      39              : #include "engraving/dom/clef.h"
      40              : #include "engraving/dom/drumset.h"
      41              : #include "engraving/dom/dynamic.h"
      42              : #include "engraving/dom/hairpin.h"
      43              : #include "engraving/dom/harmony.h"
      44              : #include "engraving/dom/glissando.h"
      45              : #include "engraving/dom/keysig.h"
      46              : #include "engraving/dom/layoutbreak.h"
      47              : #include "engraving/dom/lyrics.h"
      48              : #include "engraving/dom/measure.h"
      49              : #include "engraving/dom/note.h"
      50              : #include "engraving/dom/accidental.h"
      51              : #include "engraving/dom/ottava.h"
      52              : #include "engraving/dom/part.h"
      53              : #include "engraving/dom/pedal.h"
      54              : #include "engraving/dom/pitchspelling.h"
      55              : #include "engraving/dom/measurerepeat.h"
      56              : #include "engraving/dom/rest.h"
      57              : #include "engraving/dom/masterscore.h"
      58              : #include "engraving/dom/segment.h"
      59              : #include "engraving/dom/slur.h"
      60              : #include "engraving/dom/tie.h"
      61              : #include "engraving/dom/staff.h"
      62              : #include "engraving/dom/tempotext.h"
      63              : #include "engraving/dom/text.h"
      64              : #include "engraving/types/constants.h"
      65              : #include "engraving/dom/timesig.h"
      66              : #include "engraving/dom/tuplet.h"
      67              : #include "engraving/dom/tremolosinglechord.h"
      68              : #include "engraving/dom/volta.h"
      69              : #include "engraving/dom/chordlist.h"
      70              : #include "engraving/dom/rehearsalmark.h"
      71              : #include "engraving/dom/marker.h"
      72              : #include "engraving/dom/jump.h"
      73              : #include "engraving/dom/bracketitem.h"
      74              : #include "engraving/editing/transpose.h"
      75              : 
      76              : #include "modularity/ioc.h"
      77              : #include "importexport/ove/ioveconfiguration.h"
      78              : 
      79              : #include "global/realfn.h"
      80              : 
      81              : #include "log.h"
      82              : 
      83              : namespace ove {
      84            4 : static std::shared_ptr<mu::iex::ove::IOveConfiguration> configuration()
      85              : {
      86            8 :     return muse::modularity::globalIoc()->resolve<mu::iex::ove::IOveConfiguration>("iex_ove");
      87              : }
      88              : }
      89              : 
      90              : using namespace mu::engraving;
      91              : 
      92              : class MeasureToTick
      93              : {
      94              : public:
      95              :     MeasureToTick();
      96              :     ~MeasureToTick();
      97              : 
      98              : public:
      99              :     void build(ovebase::OveSong* ove, int quarter);
     100              : 
     101              :     int getTick(int measure, int tick_pos);
     102              :     static int unitToTick(int unit, int quarter);
     103              : 
     104              :     struct TimeTick {
     105              :         int m_numerator;
     106              :         int m_denominator;
     107              :         int m_measure;
     108              :         int m_tick;
     109              :         bool m_isSymbol;
     110              : 
     111           56 :         TimeTick()
     112           56 :             : m_numerator(4), m_denominator(4), m_measure(0), m_tick(0), m_isSymbol(false) {}
     113              :     };
     114              :     QList<TimeTick> getTimeTicks() const;
     115              : 
     116              : private:
     117              :     int m_quarter;
     118              :     ovebase::OveSong* m_ove;
     119              :     QList<TimeTick> m_tts;
     120              : };
     121              : 
     122           56 : int getMeasureTick(int quarter, int num, int den)
     123              : {
     124           56 :     return quarter * 4 * num / den;
     125              : }
     126              : 
     127            2 : MeasureToTick::MeasureToTick()
     128              : {
     129            2 :     m_quarter = 480;
     130            2 :     m_ove = 0;
     131            2 : }
     132              : 
     133            2 : MeasureToTick::~MeasureToTick()
     134              : {
     135            2 : }
     136              : 
     137            2 : void MeasureToTick::build(ovebase::OveSong* ove, int quarter)
     138              : {
     139              :     unsigned int i;
     140            2 :     int currentTick = 0;
     141            2 :     unsigned int measureCount = ove->getMeasureCount();
     142              : 
     143            2 :     m_quarter = quarter;
     144            2 :     m_ove = ove;
     145            2 :     m_tts.clear();
     146              : 
     147           11 :     for (i = 0; i < measureCount; ++i) {
     148            9 :         ovebase::Measure* measure = m_ove->getMeasure(i);
     149            9 :         ovebase::TimeSignature* time = measure->getTime();
     150            9 :         TimeTick tt;
     151            9 :         bool change = false;
     152              : 
     153            9 :         tt.m_tick = currentTick;
     154            9 :         tt.m_numerator = time->getNumerator();
     155            9 :         tt.m_denominator = time->getDenominator();
     156            9 :         tt.m_measure = i;
     157            9 :         tt.m_isSymbol = time->getIsSymbol();
     158              : 
     159            9 :         if (i == 0) {
     160            2 :             change = true;
     161              :         } else {
     162            7 :             ovebase::TimeSignature* previousTime = m_ove->getMeasure(i - 1)->getTime();
     163              : 
     164            7 :             if (time->getNumerator() != previousTime->getNumerator()
     165            7 :                 || time->getDenominator() != previousTime->getDenominator()) {
     166            0 :                 change = true;
     167            7 :             } else if (time->getIsSymbol() != previousTime->getIsSymbol()) {
     168            0 :                 change = true;
     169              :             }
     170              :         }
     171              : 
     172            9 :         if (change) {
     173            2 :             m_tts.push_back(tt);
     174              :         }
     175              : 
     176            9 :         currentTick += getMeasureTick(m_quarter, tt.m_numerator, tt.m_denominator);
     177              :     }
     178            2 : }
     179              : 
     180           47 : int MeasureToTick::getTick(int measure, int tick_pos)
     181              : {
     182           47 :     TimeTick tt;
     183              : 
     184           47 :     for (int i = 0; i < m_tts.size(); ++i) {
     185           47 :         if (measure >= m_tts[i].m_measure && (i == m_tts.size() - 1 || measure < m_tts[i + 1].m_measure)) {
     186           94 :             int measuresTick = (measure - m_tts[i].m_measure) * getMeasureTick(m_quarter, m_tts[i].m_numerator,
     187           47 :                                                                                m_tts[i].m_denominator);
     188           47 :             return m_tts[i].m_tick + measuresTick + tick_pos;
     189              :         }
     190              :     }
     191              : 
     192            0 :     return 0;
     193              : }
     194              : 
     195            0 : int MeasureToTick::unitToTick(int unit, int quarter)
     196              : {
     197              :     // 0x100 correspond to quarter tick
     198            0 :     float ratio = (float)unit / (float)256.0;
     199            0 :     int tick = ratio * quarter;
     200            0 :     return tick;
     201              : }
     202              : 
     203            2 : QList<MeasureToTick::TimeTick> MeasureToTick::getTimeTicks() const
     204              : {
     205            2 :     return m_tts;
     206              : }
     207              : 
     208              : class OveToMScore
     209              : {
     210              : public:
     211              :     OveToMScore();
     212              :     ~OveToMScore();
     213              : 
     214              : public:
     215              :     void convert(ovebase::OveSong* oveData, Score* score);
     216              : 
     217              : private:
     218              :     void createStructure();
     219              :     void convertHeader();
     220              :     void convertGroups();
     221              :     void convertTrackHeader(ovebase::Track* track, Part* part);
     222              :     void convertTrackElements(int track);
     223              :     void convertLineBreak();
     224              :     void convertSignatures();
     225              :     void convertMeasures();
     226              :     void convertMeasure(Measure* measure);
     227              :     void convertMeasureMisc(Measure* measure, int part, int staff, int track);
     228              :     void convertNotes(Measure* measure, int part, int staff, int track);
     229              :     void convertArticulation(Measure* measure, Chord* cr, int track, int absTick, ovebase::Articulation* art);
     230              :     void convertLyrics(Measure* measure, int part, int staff, int track);
     231              :     void convertHarmonies(Measure* measure, int part, int staff, int track);
     232              :     void convertRepeats(Measure* measure, int part, int staff, int track);
     233              :     void convertDynamics(Measure* measure, int part, int staff, int track);
     234              :     void convertExpressions(Measure* measure, int part, int staff, int track);
     235              :     void convertLines(Measure* measure);
     236              :     void convertSlurs(Measure* measure, int part, int staff, int track);
     237              :     void convertGlissandos(Measure* measure, int part, int staff, int track);
     238              :     void convertWedges(Measure* measure, int part, int staff, int track);
     239              :     void convertOctaveShifts(Measure* measure, int part, int staff, int track);
     240              : 
     241              :     ovebase::NoteContainer* getContainerByPos(int part, int staff, const ovebase::MeasurePos& pos);
     242              :     // ovebase::MusicData* getMusicDataByUnit(int part, int staff, int measure, int unit, ovebase::MusicDataType type);
     243              :     ovebase::MusicData* getCrossMeasureElementByPos(int part, int staff, const ovebase::MeasurePos& pos, int voice,
     244              :                                                     ovebase::MusicDataType type);
     245              :     ChordRest* findChordRestByPos(int absTick, int track);
     246              : 
     247              :     void clearUp();
     248              : 
     249              : private:
     250              :     ovebase::OveSong* m_ove;
     251              :     Score* m_score;
     252              :     MeasureToTick* m_mtt;
     253              : 
     254              :     Pedal* m_pedal;
     255              : };
     256              : 
     257            2 : OveToMScore::OveToMScore()
     258              : {
     259            2 :     m_ove = 0;
     260            2 :     m_mtt = new MeasureToTick();
     261            2 :     m_pedal = 0;
     262            2 : }
     263              : 
     264            2 : OveToMScore::~OveToMScore()
     265              : {
     266            2 :     delete m_mtt;
     267            2 : }
     268              : 
     269            2 : void OveToMScore::convert(ovebase::OveSong* ove, Score* score)
     270              : {
     271            2 :     m_ove = ove;
     272            2 :     m_score = score;
     273            2 :     m_mtt->build(m_ove, m_ove->getQuarter());
     274              : 
     275            2 :     convertHeader();
     276            2 :     createStructure();
     277            2 :     convertGroups();
     278            2 :     convertSignatures();
     279              :     // convertLineBreak();
     280              : 
     281            2 :     int staffCount = 0;
     282            4 :     for (int i = 0; i < m_ove->getPartCount(); ++i) {
     283            2 :         int partStaffCount = m_ove->getStaffCount(i);
     284            2 :         Part* part = m_score->parts().at(i);
     285              : 
     286            4 :         for (int j = 0; j < partStaffCount; ++j) {
     287            2 :             ovebase::Track* track = m_ove->getTrack(i, j);
     288              : 
     289            2 :             convertTrackHeader(track, part);
     290              :         }
     291              : 
     292            2 :         staffCount += partStaffCount;
     293              :     }
     294              : 
     295            2 :     convertMeasures();
     296              : 
     297              :     // convert elements by ove track sequence
     298            2 :     staffCount = 0;
     299            4 :     for (int i = 0; i < m_ove->getPartCount(); ++i) {
     300            2 :         int partStaffCount = m_ove->getStaffCount(i);
     301              : 
     302            4 :         for (int j = 0; j < partStaffCount; ++j) {
     303            2 :             int trackIndex = staffCount + j;
     304              : 
     305            2 :             convertTrackElements(trackIndex);
     306              :         }
     307              : 
     308            2 :         staffCount += partStaffCount;
     309              :     }
     310              : 
     311            2 :     clearUp();
     312            2 : }
     313              : 
     314            2 : void OveToMScore::createStructure()
     315              : {
     316              :     int i;
     317            4 :     for (i = 0; i < m_ove->getPartCount(); ++i) {
     318            2 :         int partStaffCount = m_ove->getStaffCount(i);
     319            2 :         Part* part = new Part(m_score);
     320              : 
     321            4 :         for (int j = 0; j < partStaffCount; ++j) {
     322              :             //ovebase::Track* track = m_ove->getTrack(i, j);
     323            2 :             Staff* staff = Factory::createStaff(part);
     324            2 :             m_score->appendStaff(staff);
     325              :         }
     326              : 
     327            2 :         m_score->appendPart(part);
     328            2 :         part->setStaves(partStaffCount);
     329              :     }
     330              : 
     331           11 :     for (i = 0; i < m_ove->getMeasureCount(); ++i) {
     332            9 :         Measure* measure  = Factory::createMeasure(m_score);
     333            9 :         int tick = m_mtt->getTick(i, 0);
     334            9 :         measure->setTick(Fraction::fromTicks(tick));
     335            9 :         measure->setMeasureNumber(i);
     336            9 :         m_score->measures()->append(measure);
     337              :     }
     338            2 : }
     339              : 
     340            2 : void OveToMScore::clearUp()
     341              : {
     342            2 :     if (m_pedal != NULL) {
     343            0 :         delete m_pedal;
     344            0 :         m_pedal = 0;
     345              :     }
     346            2 : }
     347              : 
     348            2 : ovebase::Staff* getStaff(const ovebase::OveSong* ove, int track)
     349              : {
     350            2 :     if (ove->getLineCount() > 0) {
     351            2 :         ovebase::Line* line = ove->getLine(0);
     352            2 :         if (line != 0 && line->getStaffCount() > 0) {
     353            2 :             ovebase::Staff* staff = line->getStaff(track);
     354            2 :             return staff;
     355              :         }
     356              :     }
     357              : 
     358            0 :     return 0;
     359              : }
     360              : 
     361              : namespace ove {
     362            6 : void addText(VBox*& vbox, Score* s, QString strTxt, TextStyleType stl)
     363              : {
     364            6 :     if (!strTxt.isEmpty()) {
     365            6 :         if (vbox == 0) {
     366            2 :             vbox = Factory::createVBox(s);
     367              :         }
     368            6 :         Text* text = Factory::createText(vbox, stl);
     369            6 :         text->setPlainText(strTxt);
     370            6 :         vbox->add(text);
     371              :     }
     372            6 : }
     373              : }
     374              : 
     375            2 : void OveToMScore::convertHeader()
     376              : {
     377            2 :     VBox* vbox = 0;
     378            2 :     QList<QString> titles = m_ove->getTitles();
     379            2 :     if (!titles.empty() && !titles[0].isEmpty()) {
     380            2 :         QString title = titles[0];
     381            2 :         m_score->setMetaTag(u"movementTitle", title);
     382            2 :         ove::addText(vbox, m_score, title, TextStyleType::TITLE);
     383            2 :     }
     384              : 
     385            2 :     QList<QString> copyrights = m_ove->getCopyrights();
     386            2 :     if (!copyrights.empty() && !copyrights[0].isEmpty()) {
     387            2 :         QString copyright = copyrights[0];
     388            2 :         m_score->setMetaTag(u"copyright", copyright);
     389            2 :     }
     390              : 
     391            2 :     QList<QString> annotates = m_ove->getAnnotates();
     392            2 :     if (!annotates.empty() && !annotates[0].isEmpty()) {
     393            2 :         QString annotate = annotates[0];
     394            2 :         ove::addText(vbox, m_score, annotate, TextStyleType::LYRICIST);
     395            2 :     }
     396              : 
     397            2 :     QList<QString> writers = m_ove->getWriters();
     398            2 :     if (!writers.empty()) {
     399            2 :         QString composer = writers[0];
     400            2 :         m_score->setMetaTag(u"composer", composer);
     401            2 :         ove::addText(vbox, m_score, composer, TextStyleType::COMPOSER);
     402            2 :     }
     403              : 
     404            2 :     if (writers.size() > 1) {
     405            0 :         QString lyricist = writers[1];
     406            0 :         ove::addText(vbox, m_score, lyricist, TextStyleType::LYRICIST);
     407            0 :     }
     408              : 
     409            2 :     if (vbox) {
     410            2 :         vbox->setTick(Fraction(0, 1));
     411            2 :         m_score->measures()->append(vbox);
     412              :     }
     413            2 : }
     414              : 
     415            2 : void OveToMScore::convertGroups()
     416              : {
     417              :     int i;
     418            2 :     int staffCount = 0;
     419            2 :     const std::vector<Part*>& parts = m_score->parts();
     420            4 :     for (i = 0; i < m_ove->getPartCount(); ++i) {
     421            2 :         int partStaffCount = m_ove->getStaffCount(i);
     422              :         //if(parts == 0)
     423              :         //  continue;
     424            2 :         Part* part = parts.at(i);
     425            2 :         if (part == 0) {
     426            0 :             continue;
     427              :         }
     428              : 
     429            4 :         for (int j = 0; j < partStaffCount; ++j) {
     430            2 :             int staffIndex = staffCount + j;
     431            2 :             Staff* staff = m_score->staff(staffIndex);
     432            2 :             if (staff == 0) {
     433            0 :                 continue;
     434              :             }
     435              : 
     436              :             // brace
     437            2 :             if (j == 0 && partStaffCount == 2) {
     438            0 :                 EditStaffBrackets::setBracketType(m_score, staffIndex, 0, BracketType::BRACE);
     439            0 :                 EditStaffBrackets::setBracketSpan(m_score, staffIndex, 0, 2);
     440            0 :                 staff->setBarLineSpan(true);
     441              :             }
     442              : 
     443              :             // bracket
     444            2 :             ovebase::Staff* staffPtr = getStaff(m_ove, staffIndex);
     445            2 :             if (staffPtr != 0 && staffPtr->getGroupType() == ovebase::GroupType::Bracket) {
     446            0 :                 int span = staffPtr->getGroupStaffCount() + 1;
     447            0 :                 int endStaff = staffIndex + span;
     448            0 :                 if (span > 0 && endStaff >= staffIndex && endStaff <= m_ove->getTrackCount()) {
     449            0 :                     EditStaffBrackets::addBracket(m_score, staffIndex,
     450            0 :                                                   Factory::createBracketItem(m_score->dummy(), BracketType::NORMAL, span));
     451            0 :                     staff->setBarLineSpan(static_cast<bool>(span));
     452              :                 }
     453              :             }
     454              :         }
     455              : 
     456            2 :         staffCount += partStaffCount;
     457              :     }
     458            2 : }
     459              : 
     460            2 : ClefType OveClefToClef(ovebase::ClefType type)
     461              : {
     462            2 :     ClefType clef = ClefType::G;
     463            2 :     switch (type) {
     464            2 :     case ovebase::ClefType::Treble: {
     465            2 :         clef = ClefType::G;
     466            2 :         break;
     467              :     }
     468            0 :     case ovebase::ClefType::Bass: {
     469            0 :         clef = ClefType::F;
     470            0 :         break;
     471              :     }
     472            0 :     case ovebase::ClefType::Alto: {
     473            0 :         clef = ClefType::C3;
     474            0 :         break;
     475              :     }
     476            0 :     case ovebase::ClefType::UpAlto: {
     477            0 :         clef = ClefType::C4;
     478            0 :         break;
     479              :     }
     480            0 :     case ovebase::ClefType::DownDownAlto: {
     481            0 :         clef = ClefType::C1;
     482            0 :         break;
     483              :     }
     484            0 :     case ovebase::ClefType::DownAlto: {
     485            0 :         clef = ClefType::C2;
     486            0 :         break;
     487              :     }
     488            0 :     case ovebase::ClefType::UpUpAlto: {
     489            0 :         clef = ClefType::C5;
     490            0 :         break;
     491              :     }
     492            0 :     case ovebase::ClefType::Treble8va: {
     493            0 :         clef = ClefType::G8_VA;
     494            0 :         break;
     495              :     }
     496            0 :     case ovebase::ClefType::Bass8va: {
     497            0 :         clef = ClefType::F_8VA;
     498            0 :         break;
     499              :     }
     500            0 :     case ovebase::ClefType::Treble8vb: {
     501            0 :         clef = ClefType::G8_VB;
     502            0 :         break;
     503              :     }
     504            0 :     case ovebase::ClefType::Bass8vb: {
     505            0 :         clef = ClefType::F8_VB;
     506            0 :         break;
     507              :     }
     508            0 :     case ovebase::ClefType::Percussion1: {
     509            0 :         clef = ClefType::PERC;
     510            0 :         break;
     511              :     }
     512            0 :     case ovebase::ClefType::Percussion2: {
     513            0 :         clef = ClefType::PERC2;
     514            0 :         break;
     515              :     }
     516            0 :     case ovebase::ClefType::TAB: {
     517            0 :         clef = ClefType::TAB;
     518            0 :         break;
     519              :     }
     520            0 :     default:
     521            0 :         break;
     522              :     }
     523            2 :     return clef;
     524              : }
     525              : 
     526            6 : NoteHeadGroup getHeadGroup(ovebase::NoteHeadType type)
     527              : {
     528            6 :     NoteHeadGroup headGroup = NoteHeadGroup::HEAD_NORMAL;
     529            6 :     switch (type) {
     530            6 :     case ovebase::NoteHeadType::Standard: {
     531            6 :         headGroup = NoteHeadGroup::HEAD_NORMAL;
     532            6 :         break;
     533              :     }
     534            0 :     case ovebase::NoteHeadType::Invisible: {
     535            0 :         break;
     536              :     }
     537            0 :     case ovebase::NoteHeadType::Rhythmic_Slash: {
     538            0 :         headGroup = NoteHeadGroup::HEAD_SLASH;
     539            0 :         break;
     540              :     }
     541            0 :     case ovebase::NoteHeadType::Percussion: {
     542            0 :         headGroup = NoteHeadGroup::HEAD_XCIRCLE;
     543            0 :         break;
     544              :     }
     545            0 :     case ovebase::NoteHeadType::Closed_Rhythm: {
     546            0 :         headGroup = NoteHeadGroup::HEAD_CROSS;
     547            0 :         break;
     548              :     }
     549            0 :     case ovebase::NoteHeadType::Open_Rhythm: {
     550            0 :         headGroup = NoteHeadGroup::HEAD_CROSS;
     551            0 :         break;
     552              :     }
     553            0 :     case ovebase::NoteHeadType::Closed_Slash: {
     554            0 :         headGroup = NoteHeadGroup::HEAD_SLASH;
     555            0 :         break;
     556              :     }
     557            0 :     case ovebase::NoteHeadType::Open_Slash: {
     558            0 :         headGroup = NoteHeadGroup::HEAD_SLASH;
     559            0 :         break;
     560              :     }
     561            0 :     case ovebase::NoteHeadType::Closed_Do: {
     562            0 :         headGroup = NoteHeadGroup::HEAD_DO;
     563            0 :         break;
     564              :     }
     565            0 :     case ovebase::NoteHeadType::Open_Do: {
     566            0 :         headGroup = NoteHeadGroup::HEAD_DO;
     567            0 :         break;
     568              :     }
     569            0 :     case ovebase::NoteHeadType::Closed_Re: {
     570            0 :         headGroup = NoteHeadGroup::HEAD_RE;
     571            0 :         break;
     572              :     }
     573            0 :     case ovebase::NoteHeadType::Open_Re: {
     574            0 :         headGroup = NoteHeadGroup::HEAD_RE;
     575            0 :         break;
     576              :     }
     577            0 :     case ovebase::NoteHeadType::Closed_Mi: {
     578            0 :         headGroup = NoteHeadGroup::HEAD_MI;
     579            0 :         break;
     580              :     }
     581            0 :     case ovebase::NoteHeadType::Open_Mi: {
     582            0 :         headGroup = NoteHeadGroup::HEAD_MI;
     583            0 :         break;
     584              :     }
     585            0 :     case ovebase::NoteHeadType::Closed_Fa: {
     586            0 :         headGroup = NoteHeadGroup::HEAD_FA;
     587            0 :         break;
     588              :     }
     589            0 :     case ovebase::NoteHeadType::Open_Fa: {
     590            0 :         headGroup = NoteHeadGroup::HEAD_FA;
     591            0 :         break;
     592              :     }
     593            0 :     case ovebase::NoteHeadType::Closed_Sol: {
     594            0 :         break;
     595              :     }
     596            0 :     case ovebase::NoteHeadType::Open_Sol: {
     597            0 :         break;
     598              :     }
     599            0 :     case ovebase::NoteHeadType::Closed_La: {
     600            0 :         headGroup = NoteHeadGroup::HEAD_LA;
     601            0 :         break;
     602              :     }
     603            0 :     case ovebase::NoteHeadType::Open_La: {
     604            0 :         headGroup = NoteHeadGroup::HEAD_LA;
     605            0 :         break;
     606              :     }
     607            0 :     case ovebase::NoteHeadType::Closed_Ti: {
     608            0 :         headGroup = NoteHeadGroup::HEAD_TI;
     609            0 :         break;
     610              :     }
     611            0 :     case ovebase::NoteHeadType::Open_Ti: {
     612            0 :         headGroup = NoteHeadGroup::HEAD_TI;
     613            0 :         break;
     614              :     }
     615            0 :     default: {
     616            0 :         break;
     617              :     }
     618              :     }
     619              : 
     620            6 :     return headGroup;
     621              : }
     622              : 
     623            2 : void OveToMScore::convertTrackHeader(ovebase::Track* track, Part* part)
     624              : {
     625            2 :     if (track == 0 || part == 0) {
     626            0 :         return;
     627              :     }
     628              : 
     629            2 :     QString longName = track->getName();
     630            2 :     if (longName != QString() && track->getShowName()) {
     631            0 :         part->setPlainLongName(longName);
     632              :     }
     633              : 
     634            2 :     QString shortName = track->getBriefName();
     635            2 :     if (shortName != QString() && track->getShowBriefName()) {
     636            0 :         part->setPlainShortName(shortName);
     637              :     }
     638              : 
     639            2 :     part->setMidiProgram(track->getPatch());
     640              : 
     641            2 :     if (m_ove->getShowTransposeTrack() && track->getTranspose() != 0) {
     642            0 :         mu::engraving::Interval interval = part->instrument()->transpose();
     643            0 :         interval.diatonic = -track->getTranspose();
     644            0 :         part->instrument()->setTranspose(interval);
     645              :     }
     646              : 
     647              :     // DrumSet
     648            2 :     if (track->getStartClef() == ovebase::ClefType::Percussion1 || track->getStartClef() == ovebase::ClefType::Percussion2) {
     649              :         // use overture drumset
     650            0 :         Drumset* drumset = new Drumset();
     651            0 :         for (int i = 0; i < DRUM_INSTRUMENTS; ++i) {
     652            0 :             drumset->drum(i).name     = smDrumset->drum(i).name;
     653            0 :             drumset->drum(i).notehead = smDrumset->drum(i).notehead;
     654            0 :             drumset->drum(i).line     = smDrumset->drum(i).line;
     655            0 :             drumset->drum(i).stemDirection = smDrumset->drum(i).stemDirection;
     656            0 :             drumset->drum(i).voice     = smDrumset->drum(i).voice;
     657            0 :             drumset->drum(i).shortcut = smDrumset->drum(i).shortcut;
     658            0 :             drumset->drum(i).panelRow = smDrumset->drum(i).panelRow;
     659            0 :             drumset->drum(i).panelColumn = smDrumset->drum(i).panelColumn;
     660              :         }
     661            0 :         QList<ovebase::Track::DrumNode> nodes = track->getDrumKit();
     662            0 :         for (int i = 0; i < nodes.size(); ++i) {
     663            0 :             int pitch = nodes[i].m_pitch;
     664            0 :             ovebase::Track::DrumNode node = nodes[i];
     665            0 :             if (pitch < DRUM_INSTRUMENTS) {
     666            0 :                 drumset->drum(pitch).line = node.m_line;
     667            0 :                 drumset->drum(pitch).notehead = getHeadGroup(ovebase::NoteHeadType(node.m_headType));
     668            0 :                 drumset->drum(pitch).voice = node.m_voice;
     669              :             }
     670              :         }
     671              : 
     672            0 :         part->instrument()->channel(0)->setBank(128);
     673            0 :         part->setMidiProgram(0);
     674            0 :         part->instrument()->setDrumset(smDrumset);
     675            0 :         part->instrument()->setDrumset(drumset);
     676            0 :     }
     677            2 : }
     678              : 
     679            0 : static OttavaType OctaveShiftTypeToInt(ovebase::OctaveShiftType type)
     680              : {
     681            0 :     OttavaType subtype = OttavaType::OTTAVA_8VA;
     682            0 :     switch (type) {
     683            0 :     case ovebase::OctaveShiftType::OS_8: {
     684            0 :         subtype = OttavaType::OTTAVA_8VA;
     685            0 :         break;
     686              :     }
     687            0 :     case ovebase::OctaveShiftType::OS_15: {
     688            0 :         subtype = OttavaType::OTTAVA_15MA;
     689            0 :         break;
     690              :     }
     691            0 :     case ovebase::OctaveShiftType::OS_Minus_8: {
     692            0 :         subtype = OttavaType::OTTAVA_8VB;
     693            0 :         break;
     694              :     }
     695            0 :     case ovebase::OctaveShiftType::OS_Minus_15: {
     696            0 :         subtype = OttavaType::OTTAVA_15MB;
     697            0 :         break;
     698              :     }
     699            0 :     default:
     700            0 :         break;
     701              :     }
     702              : 
     703            0 :     return subtype;
     704              : }
     705              : 
     706            2 : void OveToMScore::convertTrackElements(int track)
     707              : {
     708            2 :     Ottava* ottava = 0;
     709              : 
     710           11 :     for (int i = 0; i < m_ove->getTrackBarCount(); ++i) {
     711            9 :         ovebase::MeasureData* measureData = m_ove->getMeasureData(track, i);
     712            9 :         if (measureData == 0) {
     713            0 :             continue;
     714              :         }
     715              : 
     716              :         // octave shift
     717            9 :         QList<ovebase::MusicData*> octaves = measureData->getMusicDatas(ovebase::MusicDataType::OctaveShift_EndPoint);
     718            9 :         for (int j = 0; j < octaves.size(); ++j) {
     719            0 :             ovebase::OctaveShiftEndPoint* octave = static_cast<ovebase::OctaveShiftEndPoint*>(octaves[j]);
     720            0 :             int absTick = m_mtt->getTick(i, octave->getTick());
     721              : 
     722            0 :             if (octave->getOctaveShiftPosition() == ovebase::OctaveShiftPosition::Start) {
     723            0 :                 if (ottava == 0) {
     724            0 :                     ottava = Factory::createOttava(m_score->dummy());
     725            0 :                     ottava->setTrack(track * VOICES);
     726            0 :                     ottava->setOttavaType(OctaveShiftTypeToInt(octave->getOctaveShiftType()));
     727              : 
     728            0 :                     int y_off = 0;
     729            0 :                     switch (octave->getOctaveShiftType()) {
     730            0 :                     case ovebase::OctaveShiftType::OS_8:
     731              :                     case ovebase::OctaveShiftType::OS_15: {
     732            0 :                         y_off = -3;
     733            0 :                         break;
     734              :                     }
     735            0 :                     case ovebase::OctaveShiftType::OS_Minus_8:
     736              :                     case ovebase::OctaveShiftType::OS_Minus_15: {
     737            0 :                         y_off = 8;
     738            0 :                         break;
     739              :                     }
     740            0 :                     default: {
     741            0 :                         break;
     742              :                     }
     743              :                     }
     744              : 
     745            0 :                     if (y_off != 0) {
     746            0 :                         ottava->setOffset(muse::PointF(0, y_off * m_score->style().spatium()));
     747              :                     }
     748              : 
     749            0 :                     ottava->setTick(Fraction::fromTicks(absTick));
     750              :                 } else {
     751            0 :                     LOGD("overlapping octave-shift not supported");
     752            0 :                     delete ottava;
     753            0 :                     ottava = 0;
     754              :                 }
     755            0 :             } else if (octave->getOctaveShiftPosition() == ovebase::OctaveShiftPosition::Stop) {
     756            0 :                 if (ottava != 0) {
     757            0 :                     ottava->setTick2(Fraction::fromTicks(absTick));
     758            0 :                     m_score->addSpanner(ottava);
     759            0 :                     ottava->staff()->updateOttava();
     760            0 :                     ottava = 0;
     761              :                 } else {
     762            0 :                     LOGD("octave-shift stop without start");
     763              :                 }
     764              :             }
     765              :         }
     766            9 :     }
     767            2 : }
     768              : 
     769            0 : void OveToMScore::convertLineBreak()
     770              : {
     771            0 :     for (MeasureBase* mb = m_score->measures()->first(); mb; mb = mb->next()) {
     772            0 :         if (!mb->isMeasure()) {
     773            0 :             continue;
     774              :         }
     775            0 :         Measure* measure = toMeasure(mb);
     776              : 
     777            0 :         for (int i = 0; i < m_ove->getLineCount(); ++i) {
     778            0 :             ovebase::Line* line = m_ove->getLine(i);
     779            0 :             if (measure->measureNumber() > 0) {
     780            0 :                 if ((int)line->getBeginBar() + (int)line->getBarCount() - 1 == measure->measureNumber()) {
     781            0 :                     LayoutBreak* lb = Factory::createLayoutBreak(measure);
     782            0 :                     lb->setTrack(0);
     783            0 :                     lb->setLayoutBreakType(LayoutBreakType::LINE);
     784            0 :                     measure->add(lb);
     785              :                 }
     786              :             }
     787              :         }
     788              :     }
     789            0 : }
     790              : 
     791            2 : void OveToMScore::convertSignatures()
     792              : {
     793              :     int i;
     794              :     int j;
     795              :     int k;
     796              : 
     797              :     // Time
     798            2 :     const QList<MeasureToTick::TimeTick> tts = m_mtt->getTimeTicks();
     799            4 :     for (i = 0; i < (int)tts.size(); ++i) {
     800            2 :         MeasureToTick::TimeTick tt = tts[i];
     801            2 :         Fraction f(tt.m_numerator, tt.m_denominator);
     802              : 
     803            2 :         TimeSigMap* sigmap = m_score->sigmap();
     804            2 :         sigmap->add(tt.m_tick, f);
     805              : 
     806            2 :         Measure* measure = m_score->tick2measure(Fraction::fromTicks(tt.m_tick));
     807            2 :         if (measure) {
     808            4 :             for (size_t staffIdx = 0; staffIdx < m_score->nstaves(); ++staffIdx) {
     809            2 :                 TimeSigType subtype = TimeSigType::NORMAL;
     810            2 :                 if (tt.m_numerator == 4 && tt.m_denominator == 4 && tt.m_isSymbol) {
     811            0 :                     subtype = TimeSigType::FOUR_FOUR;
     812            2 :                 } else if (tt.m_numerator == 2 && tt.m_denominator == 2 && tt.m_isSymbol) {
     813            0 :                     subtype = TimeSigType::ALLA_BREVE;
     814              :                 }
     815              : 
     816            2 :                 Segment* seg = measure->getSegment(SegmentType::TimeSig, Fraction::fromTicks(tt.m_tick));
     817            2 :                 TimeSig* ts = Factory::createTimeSig(seg);
     818            2 :                 ts->setTrack(static_cast<int>(staffIdx) * VOICES);
     819            2 :                 ts->setSig(Fraction(tt.m_numerator, tt.m_denominator), subtype);
     820            2 :                 seg->add(ts);
     821              :             }
     822              :         }
     823              :     }
     824              : 
     825              :     // Key
     826            2 :     int staffCount = 0;
     827            2 :     bool createKey = false;
     828            4 :     for (i = 0; i < m_ove->getPartCount(); ++i) {
     829            2 :         int partStaffCount = m_ove->getStaffCount(i);
     830              : 
     831            4 :         for (j = 0; j < partStaffCount; ++j) {
     832            2 :             Staff& staff = *m_score->staff(staffCount + j);
     833           11 :             for (k = 0; k < m_ove->getMeasureCount(); ++k) {
     834            9 :                 ovebase::MeasureData* measureData = m_ove->getMeasureData(i, j, k);
     835              : 
     836            9 :                 if (measureData != 0) {
     837            9 :                     ovebase::Key* keyPtr = measureData->getKey();
     838              : 
     839            9 :                     if (k == 0 || keyPtr->getKey() != keyPtr->getPreviousKey()) {
     840            2 :                         Fraction tick = Fraction::fromTicks(m_mtt->getTick(k, 0));
     841            2 :                         int keyValue = keyPtr->getKey();
     842            2 :                         Measure* measure = m_score->tick2measure(tick);
     843            2 :                         if (measure) {
     844            2 :                             KeySigEvent ke;
     845            2 :                             Key key = Key(keyValue);
     846            2 :                             Key cKey = key;
     847            2 :                             Interval v = staff.part()->instrument(tick)->transpose();
     848            2 :                             if (!v.isZero() && !m_score->style().styleB(Sid::concertPitch)) {
     849            0 :                                 cKey = Transpose::transposeKey(key, v);
     850              :                                 // if there are more than 6 accidentals in transposing key, it cannot be PreferSharpFlat::AUTO
     851            0 :                                 if ((key > 6 || key < -6) && staff.part()->preferSharpFlat() == PreferSharpFlat::AUTO) {
     852            0 :                                     staff.part()->setPreferSharpFlat(PreferSharpFlat::NONE);
     853              :                                 }
     854              :                             }
     855            2 :                             ke.setConcertKey(cKey);
     856            2 :                             ke.setKey(key);
     857            2 :                             staff.setKey(tick, ke);
     858              : 
     859            2 :                             Segment* s = measure->getSegment(SegmentType::KeySig, tick);
     860            2 :                             KeySig* keysig = Factory::createKeySig(s);
     861            2 :                             keysig->setTrack((staffCount + j) * VOICES);
     862            2 :                             keysig->setKeySigEvent(ke);
     863            2 :                             s->add(keysig);
     864              : 
     865            2 :                             createKey = true;
     866            2 :                         }
     867              :                     }
     868              :                 }
     869              :             }
     870              :         }
     871              : 
     872            2 :         staffCount += partStaffCount;
     873              :     }
     874              : 
     875            2 :     if (!createKey) {
     876            0 :         staffCount = 0;
     877            0 :         for (i = 0; i < m_ove->getPartCount(); ++i) {
     878            0 :             int partStaffCount = m_ove->getStaffCount(i);
     879              : 
     880            0 :             for (j = 0; j < partStaffCount; ++j) {
     881            0 :                 Measure* measure = m_score->tick2measure(Fraction::fromTicks(m_mtt->getTick(0, 0)));
     882            0 :                 if (measure) {
     883            0 :                     Segment* s = measure->getSegment(SegmentType::KeySig, Fraction(0, 1));
     884            0 :                     KeySig* keysig = Factory::createKeySig(s);
     885            0 :                     keysig->setTrack((staffCount + j) * VOICES);
     886            0 :                     keysig->setKeySigEvent(KeySigEvent());
     887            0 :                     s->add(keysig);
     888              :                 }
     889              :             }
     890            0 :             staffCount += partStaffCount;
     891              :         }
     892              :     }
     893              : 
     894              :     // Clef
     895            2 :     staffCount = 0;
     896            4 :     for (i = 0; i < m_ove->getPartCount(); ++i) {
     897            2 :         int partStaffCount = m_ove->getStaffCount(i);
     898            4 :         for (j = 0; j < partStaffCount; ++j) {
     899              :             // start clef
     900            2 :             Staff* staff = m_score->staff(staffCount + j);
     901            2 :             if (staff) {
     902            2 :                 ovebase::Track* track = m_ove->getTrack(i, j);
     903            2 :                 ClefType clefType = OveClefToClef(track->getStartClef());
     904            2 :                 Measure* measure = m_score->tick2measure(Fraction(0, 1));
     905              :                 // staff->setClef(0, clefType);
     906              : 
     907              :                 // note: also generate symbol for tick 0
     908              :                 // was not necessary before 0.9.6
     909            2 :                 Segment* s = measure->getSegment(SegmentType::HeaderClef, Fraction(0, 1));
     910            2 :                 Clef* clef = Factory::createClef(s);
     911            2 :                 clef->setClefType(clefType);
     912            2 :                 clef->setTrack((staffCount + j) * VOICES);
     913            2 :                 s->add(clef);
     914              :             }
     915              : 
     916              :             // clef in measure
     917           11 :             for (k = 0; k < m_ove->getMeasureCount(); ++k) {
     918            9 :                 ovebase::MeasureData* measureData = m_ove->getMeasureData(i, j, k);
     919            9 :                 QList<ovebase::MusicData*> clefs = measureData->getMusicDatas(ovebase::MusicDataType::Clef);
     920            9 :                 Measure* measure = m_score->tick2measure(Fraction::fromTicks(m_mtt->getTick(k, 0)));
     921              : 
     922            9 :                 for (int l = 0; l < clefs.size(); ++l) {
     923            0 :                     if (measure != 0) {
     924            0 :                         ovebase::Clef* clefPtr = static_cast<ovebase::Clef*>(clefs[l]);
     925            0 :                         int absTick = m_mtt->getTick(k, clefPtr->getTick());
     926            0 :                         ClefType clefType = OveClefToClef(clefPtr->getClefType());
     927              : 
     928            0 :                         Segment* s = measure->getSegment(SegmentType::Clef, Fraction::fromTicks(absTick));
     929            0 :                         Clef* clef = Factory::createClef(s);
     930            0 :                         clef->setClefType(clefType);
     931            0 :                         clef->setTrack((staffCount + j) * VOICES);
     932            0 :                         s->add(clef);
     933              :                     }
     934              :                 }
     935            9 :             }
     936              :         }
     937              : 
     938            2 :         staffCount += partStaffCount;
     939              :     }
     940              : 
     941              :     // Tempo
     942            2 :     std::map<int, double> tempos;
     943            4 :     for (i = 0; i < m_ove->getPartCount(); ++i) {
     944            2 :         int partStaffCount = m_ove->getStaffCount(i);
     945              : 
     946            4 :         for (j = 0; j < partStaffCount; ++j) {
     947           11 :             for (k = 0; k < m_ove->getMeasureCount(); ++k) {
     948            9 :                 ovebase::Measure* measure = m_ove->getMeasure(k);
     949            9 :                 ovebase::MeasureData* measureData = m_ove->getMeasureData(i, j, k);
     950            9 :                 QList<ovebase::MusicData*> tempoPtrs = measureData->getMusicDatas(ovebase::MusicDataType::Tempo);
     951              : 
     952            9 :                 if (k == 0
     953            9 :                     || (k > 0 && qAbs(measure->getTypeTempo() - m_ove->getMeasure(k - 1)->getTypeTempo()) > 0.01)) {
     954            2 :                     int tick = m_mtt->getTick(k, 0);
     955            2 :                     tempos[tick] = measure->getTypeTempo();
     956              :                 }
     957              : 
     958           11 :                 for (int l = 0; l < tempoPtrs.size(); ++l) {
     959            2 :                     ovebase::Tempo* ptr = static_cast<ovebase::Tempo*>(tempoPtrs[l]);
     960            2 :                     int tick = m_mtt->getTick(measure->getBarNumber()->getIndex(), ptr->getTick());
     961            2 :                     double tempo = ptr->getQuarterTempo() > 0 ? ptr->getQuarterTempo() : 1.0;
     962              : 
     963            2 :                     tempos[tick] = tempo;
     964              :                 }
     965            9 :             }
     966              :         }
     967              :     }
     968              : 
     969            2 :     std::map<int, double>::iterator it;
     970            2 :     double lastTempo = 0.0;
     971            5 :     for (it=tempos.begin(); it != tempos.end(); ++it) {
     972            3 :         if (it == tempos.begin() || !muse::RealIsEqual((*it).second, lastTempo)) {
     973            2 :             const double tpo = ((*it).second) / 60.0;
     974            2 :             const bool isDefault = it == tempos.begin() && muse::RealIsEqual(tpo, Constants::DEFAULT_TEMPO.val);
     975              : 
     976            2 :             if (!isDefault) {
     977            2 :                 Fraction tick = Fraction::fromTicks((*it).first);
     978            2 :                 Measure* measure = m_score->tick2measure(tick);
     979            2 :                 if (measure) {
     980            2 :                     Segment* s = measure->getSegment(SegmentType::ChordRest, tick);
     981            2 :                     TempoText* t = Factory::createTempoText(s);
     982            2 :                     t->setXmlText(String(u"<sym>metNoteQuarterUp</sym> = %1").arg(qRound(tpo * 60.0)));
     983            2 :                     t->setTempo(tpo);
     984            2 :                     t->setVisible(false);
     985            2 :                     t->setTrack(0);
     986            2 :                     s->add(t);
     987              :                 }
     988              :             }
     989              :         }
     990              : 
     991            3 :         lastTempo = (*it).second;
     992              :     }
     993            2 : }
     994              : 
     995            0 : int ContainerToTick(ovebase::NoteContainer* container, int quarter)
     996              : {
     997            0 :     int tick = ovebase::NoteTypeToTick(container->getNoteType(), quarter);
     998              : 
     999            0 :     int dotLength = tick;
    1000            0 :     for (int i = 0; i < container->getDot(); ++i) {
    1001            0 :         dotLength /= 2;
    1002              :     }
    1003            0 :     dotLength = tick - dotLength;
    1004              : 
    1005            0 :     if (container->getTuplet() > 0) {
    1006            0 :         tick = tick * container->getSpace() / container->getTuplet();
    1007              :     }
    1008              : 
    1009            0 :     tick += dotLength;
    1010              : 
    1011            0 :     return tick;
    1012              : }
    1013              : 
    1014            0 : const ovebase::Tuplet* getTuplet(const QList<ovebase::MusicData*>& tuplets, int unit)
    1015              : {
    1016            0 :     for (int i = 0; i < tuplets.size(); ++i) {
    1017            0 :         const ovebase::MusicData* data = tuplets[i];
    1018            0 :         if (unit >= data->start()->getOffset() && unit <= data->stop()->getOffset()) {
    1019            0 :             const ovebase::Tuplet* tuplet = static_cast<ovebase::Tuplet*>(tuplets[i]);
    1020            0 :             return tuplet;
    1021              :         }
    1022              :     }
    1023            0 :     return 0;
    1024              : }
    1025              : 
    1026           16 : TDuration OveNoteType_To_Duration(ovebase::NoteType noteType)
    1027              : {
    1028           16 :     TDuration d;
    1029           16 :     switch (noteType) {
    1030            0 :     case ovebase::NoteType::Note_DoubleWhole: {
    1031            0 :         d.setType(DurationType::V_BREVE);
    1032            0 :         break;
    1033              :     }
    1034            0 :     case ovebase::NoteType::Note_Whole: {
    1035            0 :         d.setType(DurationType::V_WHOLE);
    1036            0 :         break;
    1037              :     }
    1038            0 :     case ovebase::NoteType::Note_Half: {
    1039            0 :         d.setType(DurationType::V_HALF);
    1040            0 :         break;
    1041              :     }
    1042           14 :     case ovebase::NoteType::Note_Quarter: {
    1043           14 :         d.setType(DurationType::V_QUARTER);
    1044           14 :         break;
    1045              :     }
    1046            2 :     case ovebase::NoteType::Note_Eight: {
    1047            2 :         d.setType(DurationType::V_EIGHTH);
    1048            2 :         break;
    1049              :     }
    1050            0 :     case ovebase::NoteType::Note_Sixteen: {
    1051            0 :         d.setType(DurationType::V_16TH);
    1052            0 :         break;
    1053              :     }
    1054            0 :     case ovebase::NoteType::Note_32: {
    1055            0 :         d.setType(DurationType::V_32ND);
    1056            0 :         break;
    1057              :     }
    1058            0 :     case ovebase::NoteType::Note_64: {
    1059            0 :         d.setType(DurationType::V_64TH);
    1060            0 :         break;
    1061              :     }
    1062            0 :     case ovebase::NoteType::Note_128: {
    1063            0 :         d.setType(DurationType::V_128TH);
    1064            0 :         break;
    1065              :     }
    1066            0 :     case ovebase::NoteType::Note_256: {
    1067            0 :         d.setType(DurationType::V_256TH);
    1068            0 :         break;
    1069              :     }
    1070              : //  case ovebase::NoteType::Note_512: {
    1071              : //      d.setType(DurationType::V_512TH);
    1072              : //      break;
    1073              : //  }
    1074              : //  case ovebase::NoteType::Note_1024: {
    1075              : //      d.setType(DurationType::V_1024TH);
    1076              : //      break;
    1077              : //  }
    1078            0 :     default:
    1079            0 :         d.setType(DurationType::V_QUARTER);
    1080            0 :         break;
    1081              :     }
    1082              : 
    1083           16 :     return d;
    1084              : }
    1085              : 
    1086            6 : int accidentalToAlter(ovebase::AccidentalType type)
    1087              : {
    1088            6 :     int alter = 0;
    1089              : 
    1090            6 :     switch (type) {
    1091            6 :     case ovebase::AccidentalType::Normal:
    1092              :     case ovebase::AccidentalType::Natural:
    1093              :     case ovebase::AccidentalType::Natural_Caution: {
    1094            6 :         alter = 0;
    1095            6 :         break;
    1096              :     }
    1097            0 :     case ovebase::AccidentalType::Sharp:
    1098              :     case ovebase::AccidentalType::Sharp_Caution: {
    1099            0 :         alter = 1;
    1100            0 :         break;
    1101              :     }
    1102            0 :     case ovebase::AccidentalType::Flat:
    1103              :     case ovebase::AccidentalType::Flat_Caution: {
    1104            0 :         alter = -1;
    1105            0 :         break;
    1106              :     }
    1107            0 :     case ovebase::AccidentalType::DoubleSharp:
    1108              :     case ovebase::AccidentalType::DoubleSharp_Caution: {
    1109            0 :         alter = 2;
    1110            0 :         break;
    1111              :     }
    1112            0 :     case ovebase::AccidentalType::DoubleFlat:
    1113              :     case ovebase::AccidentalType::DoubleFlat_Caution: {
    1114            0 :         alter = -2;
    1115            0 :         break;
    1116              :     }
    1117            0 :     default:
    1118            0 :         break;
    1119              :     }
    1120              : 
    1121            6 :     return alter;
    1122              : }
    1123              : 
    1124            6 : void getMiddleToneOctave(ovebase::ClefType clef, ovebase::ToneType& tone, int& octave)
    1125              : {
    1126            6 :     tone = ovebase::ToneType::B;
    1127            6 :     octave = 4;
    1128              : 
    1129            6 :     switch (clef) {
    1130            6 :     case ovebase::ClefType::Treble: {
    1131            6 :         tone = ovebase::ToneType::B;
    1132            6 :         octave = 4;
    1133            6 :         break;
    1134              :     }
    1135            0 :     case ovebase::ClefType::Treble8va: {
    1136            0 :         tone = ovebase::ToneType::B;
    1137            0 :         octave = 5;
    1138            0 :         break;
    1139              :     }
    1140            0 :     case ovebase::ClefType::Treble8vb: {
    1141            0 :         tone = ovebase::ToneType::B;
    1142            0 :         octave = 3;
    1143            0 :         break;
    1144              :     }
    1145            0 :     case ovebase::ClefType::Bass: {
    1146            0 :         tone = ovebase::ToneType::D;
    1147            0 :         octave = 3;
    1148            0 :         break;
    1149              :     }
    1150            0 :     case ovebase::ClefType::Bass8va: {
    1151            0 :         tone = ovebase::ToneType::D;
    1152            0 :         octave = 4;
    1153            0 :         break;
    1154              :     }
    1155            0 :     case ovebase::ClefType::Bass8vb: {
    1156            0 :         tone = ovebase::ToneType::D;
    1157            0 :         octave = 2;
    1158            0 :         break;
    1159              :     }
    1160            0 :     case ovebase::ClefType::Alto: {
    1161            0 :         tone = ovebase::ToneType::C;
    1162            0 :         octave = 4;
    1163            0 :         break;
    1164              :     }
    1165            0 :     case ovebase::ClefType::UpAlto: {
    1166            0 :         tone = ovebase::ToneType::A;
    1167            0 :         octave = 3;
    1168            0 :         break;
    1169              :     }
    1170            0 :     case ovebase::ClefType::DownDownAlto: {
    1171            0 :         tone = ovebase::ToneType::G;
    1172            0 :         octave = 4;
    1173            0 :         break;
    1174              :     }
    1175            0 :     case ovebase::ClefType::DownAlto: {
    1176            0 :         tone = ovebase::ToneType::E;
    1177            0 :         octave = 4;
    1178            0 :         break;
    1179              :     }
    1180            0 :     case ovebase::ClefType::UpUpAlto: {
    1181            0 :         tone = ovebase::ToneType::F;
    1182            0 :         octave = 3;
    1183            0 :         break;
    1184              :     }
    1185            0 :     case ovebase::ClefType::Percussion1: {
    1186            0 :         tone = ovebase::ToneType::A;
    1187            0 :         octave = 3;
    1188            0 :         break;
    1189              :     }
    1190            0 :     case ovebase::ClefType::Percussion2: {
    1191            0 :         tone = ovebase::ToneType::A;
    1192            0 :         octave = 3;
    1193            0 :         break;
    1194              :     }
    1195            0 :     case ovebase::ClefType::TAB: {
    1196            0 :         break;
    1197              :     }
    1198            0 :     default:
    1199            0 :         break;
    1200              :     }
    1201            6 : }
    1202              : 
    1203            6 : ovebase::ClefType getClefType(ovebase::MeasureData* measure, int tick)
    1204              : {
    1205            6 :     ovebase::ClefType type = measure->getClef()->getClefType();
    1206            6 :     QList<ovebase::MusicData*> clefs = measure->getMusicDatas(ovebase::MusicDataType::Clef);
    1207              : 
    1208            6 :     for (int i = 0; i < clefs.size(); ++i) {
    1209            0 :         if (tick < clefs[i]->getTick()) {
    1210            0 :             break;
    1211              :         }
    1212            0 :         if (tick >= clefs[i]->getTick()) {
    1213            0 :             ovebase::Clef* clef = static_cast<ovebase::Clef*>(clefs[i]);
    1214            0 :             type = clef->getClefType();
    1215              :         }
    1216              :     }
    1217              : 
    1218            6 :     return type;
    1219            6 : }
    1220              : 
    1221            2 : void OveToMScore::convertMeasures()
    1222              : {
    1223           13 :     for (MeasureBase* mb = m_score->measures()->first(); mb; mb = mb->next()) {
    1224           11 :         if (!mb->isMeasure()) {
    1225            2 :             continue;
    1226              :         }
    1227            9 :         Measure* measure = toMeasure(mb);
    1228            9 :         int tick = measure->tick().ticks();
    1229            9 :         measure->setTicks(m_score->sigmap()->timesig(tick).timesig());
    1230            9 :         measure->setTimesig(m_score->sigmap()->timesig(tick).timesig());     //?
    1231            9 :         convertMeasure(measure);
    1232              :     }
    1233              : 
    1234              :     //  convert based on notes
    1235           13 :     for (MeasureBase* mb = m_score->measures()->first(); mb; mb = mb->next()) {
    1236           11 :         if (!mb->isMeasure()) {
    1237            2 :             continue;
    1238              :         }
    1239            9 :         Measure* measure = toMeasure(mb);
    1240              : 
    1241            9 :         convertLines(measure);
    1242              :     }
    1243            2 : }
    1244              : 
    1245            9 : void OveToMScore::convertMeasure(Measure* measure)
    1246              : {
    1247            9 :     int staffCount = 0;
    1248            9 :     int measureCount = m_ove->getMeasureCount();
    1249              : 
    1250           18 :     for (int i = 0; i < m_ove->getPartCount(); ++i) {
    1251            9 :         int partStaffCount = m_ove->getStaffCount(i);
    1252              : 
    1253           18 :         for (int j = 0; j < partStaffCount; ++j) {
    1254            9 :             int measureID = measure->measureNumber();
    1255              : 
    1256            9 :             if (measureID >= 0 && measureID < measureCount) {
    1257            9 :                 int trackIndex = (staffCount + j) * VOICES;
    1258              : 
    1259            9 :                 convertMeasureMisc(measure, i, j, trackIndex);
    1260            9 :                 convertNotes(measure, i, j, trackIndex);
    1261            9 :                 convertLyrics(measure, i, j, trackIndex);
    1262            9 :                 convertHarmonies(measure, i, j, trackIndex);
    1263            9 :                 convertRepeats(measure, i, j, trackIndex);
    1264            9 :                 convertDynamics(measure, i, j, trackIndex);
    1265            9 :                 convertExpressions(measure, i, j, trackIndex);
    1266              :             }
    1267              :         }
    1268              : 
    1269            9 :         staffCount += partStaffCount;
    1270              :     }
    1271            9 : }
    1272              : 
    1273            9 : void OveToMScore::convertLines(Measure* measure)
    1274              : {
    1275            9 :     int staffCount = 0;
    1276            9 :     int measureCount = m_ove->getMeasureCount();
    1277              : 
    1278           18 :     for (int i = 0; i < m_ove->getPartCount(); ++i) {
    1279            9 :         int partStaffCount = m_ove->getStaffCount(i);
    1280              : 
    1281           18 :         for (int j = 0; j < partStaffCount; ++j) {
    1282            9 :             int measureID = measure->measureNumber();
    1283              : 
    1284            9 :             if (measureID >= 0 && measureID < measureCount) {
    1285            9 :                 int trackIndex = (staffCount + j) * VOICES;
    1286              : 
    1287            9 :                 convertSlurs(measure, i, j, trackIndex);
    1288            9 :                 convertGlissandos(measure, i, j, trackIndex);
    1289            9 :                 convertWedges(measure, i, j, trackIndex);
    1290              :             }
    1291              :         }
    1292              : 
    1293            9 :         staffCount += partStaffCount;
    1294              :     }
    1295            9 : }
    1296              : 
    1297            9 : void OveToMScore::convertMeasureMisc(Measure* measure, int part, int staff, int track)
    1298              : {
    1299            9 :     ovebase::Measure* measurePtr = m_ove->getMeasure(measure->measureNumber());
    1300            9 :     ovebase::MeasureData* measureData = m_ove->getMeasureData(part, staff, measure->measureNumber());
    1301            9 :     if (measurePtr == 0 || measureData == 0) {
    1302            0 :         return;
    1303              :     }
    1304              : 
    1305              :     // pickup
    1306            9 :     if (measurePtr->getIsPickup()) {
    1307            0 :         measure->setExcludeFromNumbering(true);
    1308              :     }
    1309              : 
    1310              :     // multiple measure rest
    1311            9 :     if (measurePtr->getIsMultiMeasureRest()) {
    1312            0 :         measure->setBreakMultiMeasureRest(true);
    1313              :     }
    1314              : 
    1315              :     // barline
    1316            9 :     BarLineType bartype = BarLineType::NORMAL;
    1317              : 
    1318            9 :     switch (measurePtr->getRightBarline()) {
    1319            6 :     case ovebase::BarLineType::Default: {
    1320            6 :         bartype = BarLineType::NORMAL;
    1321            6 :         break;
    1322              :     }
    1323            0 :     case ovebase::BarLineType::Double: {
    1324            0 :         bartype = BarLineType::DOUBLE;
    1325            0 :         break;
    1326              :     }
    1327            0 :     case ovebase::BarLineType::Final: {
    1328            0 :         bartype = BarLineType::END;
    1329            0 :         break;
    1330              :     }
    1331            0 :     case ovebase::BarLineType::Null: {
    1332            0 :         bartype = BarLineType::NORMAL;
    1333            0 :         break;
    1334              :     }
    1335            0 :     case ovebase::BarLineType::RepeatLeft: {
    1336            0 :         bartype = BarLineType::START_REPEAT;
    1337            0 :         measure->setRepeatStart(true);
    1338            0 :         break;
    1339              :     }
    1340            3 :     case ovebase::BarLineType::RepeatRight: {
    1341            3 :         bartype = BarLineType::END_REPEAT;
    1342            3 :         measure->setRepeatEnd(true);
    1343            3 :         break;
    1344              :     }
    1345            0 :     case ovebase::BarLineType::Dashed: {
    1346            0 :         bartype = BarLineType::BROKEN;
    1347            0 :         break;
    1348              :     }
    1349            0 :     default:
    1350            0 :         break;
    1351              :     }
    1352              : 
    1353            9 :     if (bartype != BarLineType::NORMAL && bartype != BarLineType::END_REPEAT && bartype != BarLineType::START_REPEAT
    1354            0 :         && bartype != BarLineType::END_START_REPEAT && bartype != BarLineType::END) {
    1355            0 :         measure->setEndBarLineType(bartype, 0);
    1356              :     }
    1357              : 
    1358            9 :     if (bartype == BarLineType::END_REPEAT) {
    1359            3 :         measure->setRepeatEnd(true);
    1360              :     }
    1361              : 
    1362            9 :     if (measurePtr->getLeftBarline() == ovebase::BarLineType::RepeatLeft) {
    1363              :         //bartype = BarLineType::START_REPEAT;
    1364            0 :         measure->setRepeatStart(true);
    1365              :     }
    1366              : 
    1367              :     // rehearsal
    1368              :     int i;
    1369           18 :     QList<ovebase::MusicData*> texts = measureData->getMusicDatas(ovebase::MusicDataType::Text);
    1370            9 :     for (i = 0; i < texts.size(); ++i) {
    1371            0 :         ovebase::Text* textPtr = static_cast<ovebase::Text*>(texts[i]);
    1372            0 :         if (textPtr->getTextType() == ovebase::Text::Type::Rehearsal) {
    1373            0 :             Segment* s = measure->getSegment(SegmentType::ChordRest,
    1374            0 :                                              Fraction::fromTicks(m_mtt->getTick(measure->measureNumber(), 0)));
    1375            0 :             RehearsalMark* text = Factory::createRehearsalMark(s);
    1376            0 :             text->setPlainText(textPtr->getText());
    1377            0 :             text->setTrack(track);
    1378            0 :             s->add(text);
    1379              :         }
    1380              :     }
    1381              : 
    1382              :     // tempo
    1383           18 :     QList<ovebase::MusicData*> tempos = measureData->getMusicDatas(ovebase::MusicDataType::Tempo);
    1384           11 :     for (i = 0; i < tempos.size(); ++i) {
    1385            2 :         ovebase::Tempo* tempoPtr = static_cast<ovebase::Tempo*>(tempos[i]);
    1386            2 :         int absTick = m_mtt->getTick(measure->measureNumber(), tempoPtr->getTick());
    1387            2 :         Segment* s = measure->getSegment(SegmentType::ChordRest, Fraction::fromTicks(absTick));
    1388            2 :         TempoText* t = new TempoText(s);
    1389            2 :         double tpo = (tempoPtr->getQuarterTempo()) / 60.0;
    1390              : 
    1391            2 :         t->setTempo(tpo);
    1392            2 :         QString durationTempoL;
    1393            2 :         QString durationTempoR;
    1394            2 :         if (static_cast<int>(tempoPtr->getLeftNoteType())) {
    1395            2 :             durationTempoL = TempoText::duration2tempoTextString(OveNoteType_To_Duration(tempoPtr->getLeftNoteType()));
    1396              :         }
    1397            2 :         if (static_cast<int>(tempoPtr->getRightNoteType())) {
    1398            2 :             durationTempoR = TempoText::duration2tempoTextString(OveNoteType_To_Duration(tempoPtr->getRightNoteType()));
    1399              :         }
    1400            2 :         QString textTempo;
    1401            2 :         if (tempoPtr->getShowBeforeText()) {
    1402            0 :             textTempo += (tempoPtr->getLeftText()).toHtmlEscaped();
    1403              :         }
    1404            2 :         if (tempoPtr->getShowMark()) {
    1405            0 :             if (!textTempo.isEmpty()) {
    1406            0 :                 textTempo += " ";
    1407              :             }
    1408            0 :             if (tempoPtr->getShowParenthesis()) {
    1409            0 :                 textTempo += "(";
    1410              :             }
    1411            0 :             textTempo += durationTempoL;
    1412            0 :             if (tempoPtr->getLeftNoteDot()) {
    1413            0 :                 textTempo += "<sym>space</sym><sym>metAugmentationDot</sym>";
    1414              :             }
    1415            0 :             textTempo += " = ";
    1416            0 :             switch (tempoPtr->getRightSideType()) {
    1417            0 :             case 1:
    1418            0 :                 textTempo += durationTempoR;
    1419            0 :                 if (tempoPtr->getRightNoteDot()) {
    1420            0 :                     textTempo += "<sym>space</sym><sym>metAugmentationDot</sym>";
    1421              :                 }
    1422            0 :                 break;
    1423            0 :             case 2:
    1424            0 :                 textTempo += (tempoPtr->getRightText()).toHtmlEscaped();
    1425            0 :                 break;
    1426            0 :             case 3:
    1427            0 :                 textTempo += QString::number(qFloor(tempoPtr->getTypeTempo()));
    1428            0 :                 break;
    1429            0 :             case 0:
    1430              :             default:
    1431            0 :                 textTempo += QString::number(tempoPtr->getTypeTempo());
    1432            0 :                 break;
    1433              :             }
    1434            0 :             if (tempoPtr->getShowParenthesis()) {
    1435            0 :                 textTempo += ")";
    1436              :             }
    1437              :         }
    1438            2 :         if (textTempo.isEmpty()) {
    1439            2 :             textTempo = durationTempoL;
    1440            2 :             if (tempoPtr->getLeftNoteDot()) {
    1441            0 :                 textTempo += "<sym>space</sym><sym>metAugmentationDot</sym>";
    1442              :             }
    1443            2 :             textTempo += " = " + QString::number(tempoPtr->getTypeTempo());
    1444            2 :             t->setVisible(false);
    1445              :         }
    1446            2 :         t->setXmlText(textTempo);
    1447            2 :         t->setTrack(track);
    1448              : 
    1449            2 :         s->add(t);
    1450            2 :     }
    1451              : }
    1452              : 
    1453              : // beam in grace
    1454            0 : int getGraceLevel(const QList<ovebase::NoteContainer*>& containers, int tick, int unit)
    1455              : {
    1456            0 :     int level = 0; // normal chord rest
    1457              : 
    1458            0 :     for (int i = 0; i < containers.size(); ++i) {
    1459            0 :         ovebase::NoteContainer* container = containers[i];
    1460            0 :         if (container->getTick() > tick) {
    1461            0 :             break;
    1462              :         }
    1463              : 
    1464            0 :         if (container->getIsGrace() && container->getTick() == tick
    1465            0 :             && unit <= container->start()->getOffset()) {
    1466            0 :             ++level;
    1467              :         }
    1468              :     }
    1469              : 
    1470            0 :     return level;
    1471              : }
    1472              : 
    1473            6 : bool isRestDefaultLine(ovebase::Note* rest, ovebase::NoteType noteType)
    1474              : {
    1475            6 :     bool isDefault = true;
    1476            6 :     switch (noteType) {
    1477            6 :     case ovebase::NoteType::Note_DoubleWhole:
    1478              :     case ovebase::NoteType::Note_Whole:
    1479              :     case ovebase::NoteType::Note_Half:
    1480              :     case ovebase::NoteType::Note_Quarter: {
    1481            6 :         if (rest->getLine() != 0) {
    1482            0 :             isDefault = false;
    1483              :         }
    1484            6 :         break;
    1485              :     }
    1486            0 :     case ovebase::NoteType::Note_Eight: {
    1487            0 :         if (rest->getLine() != 1) {
    1488            0 :             isDefault = false;
    1489              :         }
    1490            0 :         break;
    1491              :     }
    1492            0 :     case ovebase::NoteType::Note_Sixteen:
    1493              :     case ovebase::NoteType::Note_32: {
    1494            0 :         if (rest->getLine() != -1) {
    1495            0 :             isDefault = false;
    1496              :         }
    1497            0 :         break;
    1498              :     }
    1499            0 :     case ovebase::NoteType::Note_64: {
    1500            0 :         if (rest->getLine() != -3) {
    1501            0 :             isDefault = false;
    1502              :         }
    1503            0 :         break;
    1504              :     }
    1505            0 :     case ovebase::NoteType::Note_128: {
    1506            0 :         if (rest->getLine() != -4) {
    1507            0 :             isDefault = false;
    1508              :         }
    1509            0 :         break;
    1510              :     }
    1511            0 :     default: {
    1512            0 :         break;
    1513              :     }
    1514              :     }
    1515              : 
    1516            6 :     return isDefault;
    1517              : }
    1518              : 
    1519            0 : Drumset* getDrumset(Score* score, int part)
    1520              : {
    1521            0 :     Part* p = score->parts().at(part);
    1522            0 :     return const_cast<Drumset*>(p->instrument()->drumset()); // TODO: remove cast
    1523              : }
    1524              : 
    1525            9 : void OveToMScore::convertNotes(Measure* measure, int part, int staff, int track)
    1526              : {
    1527              :     int j;
    1528            9 :     ovebase::MeasureData* measureData = m_ove->getMeasureData(part, staff, measure->measureNumber());
    1529            9 :     QList<ovebase::NoteContainer*> containers = measureData->getNoteContainers();
    1530              :     QList<ovebase::MusicData*> tuplets = measureData->getCrossMeasureElements(ovebase::MusicDataType::Tuplet,
    1531            9 :                                                                               ovebase::MeasureData::PairType::Start);
    1532              :     QList<ovebase::MusicData*> beams = measureData->getCrossMeasureElements(ovebase::MusicDataType::Beam,
    1533            9 :                                                                             ovebase::MeasureData::PairType::Start);
    1534            9 :     Tuplet* tuplet = 0;
    1535            9 :     ChordRest* cr = 0;
    1536            9 :     int partStaffCount = m_ove->getStaffCount(part);
    1537              : 
    1538            9 :     if (containers.empty()) {
    1539            3 :         int absTick = m_mtt->getTick(measure->measureNumber(), 0);
    1540            3 :         Segment* s = measure->getSegment(SegmentType::ChordRest, Fraction::fromTicks(absTick));
    1541            3 :         cr = Factory::createRest(s);
    1542            3 :         cr->setTicks(measure->ticks());
    1543            3 :         cr->setDurationType(DurationType::V_MEASURE);
    1544            3 :         cr->setTrack(track);
    1545            3 :         s->add(cr);
    1546              :     }
    1547            9 :     QList<mu::engraving::Chord*> graceNotes;
    1548           21 :     for (int i = 0; i < containers.size(); ++i) {
    1549           12 :         ovebase::NoteContainer* container = containers[i];
    1550           12 :         int tick = m_mtt->getTick(measure->measureNumber(), container->getTick());
    1551           12 :         int noteTrack = track + container->getVoice();
    1552              : 
    1553           12 :         if (container->getIsRest()) {
    1554            6 :             TDuration duration = OveNoteType_To_Duration(container->getNoteType());
    1555            6 :             duration.setDots(container->getDot());
    1556            6 :             Segment* s = measure->getSegment(SegmentType::ChordRest, Fraction::fromTicks(tick));
    1557            6 :             cr = Factory::createRest(s);
    1558            6 :             cr->setTicks(duration.fraction());
    1559            6 :             cr->setDurationType(duration);
    1560            6 :             cr->setTrack(noteTrack);
    1561            6 :             cr->setVisible(container->getShow());
    1562            6 :             s->add(cr);
    1563              : 
    1564            6 :             QList<ovebase::Note*> notes = container->getNotesRests();
    1565           12 :             for (j = 0; j < notes.size(); ++j) {
    1566            6 :                 ovebase::Note* notePtr = notes[j];
    1567            6 :                 if (!isRestDefaultLine(notePtr, container->getNoteType()) && notePtr->getLine() != 0) {
    1568            0 :                     double yOffset = -(double)(notePtr->getLine());
    1569            0 :                     int stepOffset = cr->staff()->staffType(cr->tick())->stepOffset();
    1570            0 :                     yOffset -= qreal(stepOffset);
    1571            0 :                     yOffset *= m_score->style().spatium() / 2.0;
    1572            0 :                     cr->ryoffset() = yOffset;
    1573            0 :                     cr->setAutoplace(false);
    1574              :                 }
    1575              :             }
    1576            6 :         } else {
    1577            6 :             QList<ovebase::Note*> notes = container->getNotesRests();
    1578              : 
    1579            6 :             cr = measure->findChord(Fraction::fromTicks(tick), noteTrack);
    1580            6 :             if (cr == 0) {
    1581            6 :                 cr = Factory::createChord(m_score->dummy());
    1582            6 :                 cr->setTrack(noteTrack);
    1583              : 
    1584              :                 // grace
    1585            6 :                 if (container->getIsGrace()) {
    1586            0 :                     TDuration duration = OveNoteType_To_Duration(container->getGraceNoteType());
    1587            0 :                     duration.setDots(container->getDot());
    1588            0 :                     ((mu::engraving::Chord*)cr)->setNoteType(NoteType::APPOGGIATURA);
    1589              : 
    1590            0 :                     if (duration.type() == DurationType::V_QUARTER) {
    1591            0 :                         ((mu::engraving::Chord*)cr)->setNoteType(NoteType::GRACE4);
    1592            0 :                         cr->setDurationType(DurationType::V_QUARTER);
    1593            0 :                     } else if (duration.type() == DurationType::V_16TH) {
    1594            0 :                         ((mu::engraving::Chord*)cr)->setNoteType(NoteType::GRACE16);
    1595            0 :                         cr->setDurationType(DurationType::V_16TH);
    1596            0 :                     } else if (duration.type() == DurationType::V_32ND) {
    1597            0 :                         ((mu::engraving::Chord*)cr)->setNoteType(NoteType::GRACE32);
    1598            0 :                         cr->setDurationType(DurationType::V_32ND);
    1599              :                     } else {
    1600            0 :                         cr->setDurationType(DurationType::V_EIGHTH);
    1601              :                     }
    1602              : 
    1603              :                     // st = SegmentType::Grace;
    1604              :                 } else {
    1605            6 :                     TDuration duration = OveNoteType_To_Duration(container->getNoteType());
    1606            6 :                     duration.setDots(container->getDot());
    1607              : 
    1608            6 :                     if (duration.type() == DurationType::V_INVALID) {
    1609            0 :                         duration.setType(DurationType::V_QUARTER);
    1610              :                     }
    1611            6 :                     cr->setDurationType(duration);
    1612              :                     // append grace notes before
    1613            6 :                     int ii = -1;
    1614            6 :                     for (ii = graceNotes.size() - 1; ii >= 0; ii--) {
    1615            0 :                         mu::engraving::Chord* gc = graceNotes[ii];
    1616            0 :                         if (gc->voice() == cr->voice()) {
    1617            0 :                             cr->add(gc);
    1618              :                         }
    1619              :                     }
    1620            6 :                     graceNotes.clear();
    1621              :                 }
    1622            6 :                 cr->setTicks(cr->durationType().fraction());
    1623              : 
    1624            6 :                 if (!container->getIsGrace()) {
    1625            6 :                     Segment* s = measure->getSegment(SegmentType::ChordRest, Fraction::fromTicks(tick));
    1626            6 :                     s->add(cr);
    1627              :                 } else {
    1628            0 :                     graceNotes.append(static_cast<mu::engraving::Chord*>(cr));
    1629              :                 }
    1630              :             }
    1631              : 
    1632            6 :             cr->setVisible(container->getShow());
    1633            6 :             cr->setSmall(container->getIsCue());
    1634           12 :             for (j = 0; j < notes.size(); ++j) {
    1635            6 :                 ovebase::Note* oveNote = notes[j];
    1636            6 :                 Note* note = Factory::createNote(mu::engraving::toChord(cr));
    1637            6 :                 int pitch = oveNote->getNote();
    1638              : 
    1639            6 :                 note->setUserVelocity(oveNote->getOnVelocity());
    1640            6 :                 note->setPitch(pitch);
    1641              : 
    1642              :                 // tpc
    1643            6 :                 bool setDirection = false;
    1644            6 :                 ovebase::ClefType clefType = getClefType(measureData, container->getTick());
    1645            6 :                 if (clefType == ovebase::ClefType::Percussion1 || clefType == ovebase::ClefType::Percussion2) {
    1646            0 :                     Drumset* drumset = getDrumset(m_score, part);
    1647            0 :                     if (drumset != 0) {
    1648            0 :                         if (!drumset->isValid(pitch)) {
    1649            0 :                             LOGD("unmapped drum note 0x%02x %d", note->pitch(), note->pitch());
    1650              :                         } else {
    1651            0 :                             note->setHeadGroup(drumset->noteHead(pitch));
    1652            0 :                             int line = drumset->line(pitch);
    1653            0 :                             note->setLine(line);
    1654            0 :                             note->setTpcFromPitch();
    1655            0 :                             ((mu::engraving::Chord*)cr)->setStemDirection(drumset->stemDirection(pitch));
    1656            0 :                             setDirection = true;
    1657              :                         }
    1658              :                     } else {
    1659              :                         // no drumset, we don't allow mid staff percussion
    1660            0 :                         note->setTpc(14);
    1661              :                     }
    1662            0 :                 } else {
    1663            6 :                     const int OCTAVE = 7;
    1664              :                     ovebase::ToneType clefMiddleTone;
    1665              :                     int clefMiddleOctave;
    1666            6 :                     getMiddleToneOctave(clefType, clefMiddleTone, clefMiddleOctave);
    1667            6 :                     int absLine = static_cast<int>(clefMiddleTone) + clefMiddleOctave * OCTAVE + oveNote->getLine();
    1668            6 :                     if ((partStaffCount == 2) && oveNote->getOffsetStaff()) {
    1669            0 :                         absLine += 2 * (oveNote->getOffsetStaff());
    1670              :                     }
    1671            6 :                     int tone = absLine % OCTAVE;
    1672            6 :                     int alter = accidentalToAlter(oveNote->getAccidental());
    1673            6 :                     NoteVal nv(pitch);
    1674            6 :                     note->setTrack(cr->track());
    1675            6 :                     note->setNval(nv, Fraction::fromTicks(tick));
    1676              :                     // note->setTpcFromPitch();
    1677            6 :                     note->setTpc(step2tpc(tone, AccidentalVal(alter)));
    1678            6 :                     if (oveNote->getShowAccidental()) {
    1679            0 :                         mu::engraving::Accidental* a = Factory::createAccidental(m_score->dummy());
    1680            0 :                         bool bracket = static_cast<int>(oveNote->getAccidental()) & 0x8;
    1681            0 :                         AccidentalType at = mu::engraving::AccidentalType::NONE;
    1682            0 :                         switch (alter) {
    1683            0 :                         case 0: at = mu::engraving::AccidentalType::NATURAL;
    1684            0 :                             break;
    1685            0 :                         case 1: at = mu::engraving::AccidentalType::SHARP;
    1686            0 :                             break;
    1687            0 :                         case -1: at = mu::engraving::AccidentalType::FLAT;
    1688            0 :                             break;
    1689            0 :                         case 2: at = mu::engraving::AccidentalType::SHARP2;
    1690            0 :                             break;
    1691            0 :                         case -2: at = mu::engraving::AccidentalType::FLAT2;
    1692            0 :                             break;
    1693              :                         }
    1694            0 :                         a->setAccidentalType(at);
    1695            0 :                         a->setBracket(AccidentalBracket(bracket));
    1696            0 :                         a->setRole(mu::engraving::AccidentalRole::USER);
    1697            0 :                         note->add(a);
    1698              :                     }
    1699            6 :                     note->setHeadGroup(getHeadGroup(oveNote->getHeadType()));
    1700              :                 }
    1701            6 :                 if ((oveNote->getHeadType() == ovebase::NoteHeadType::Invisible) || !(oveNote->getShow())) {
    1702            0 :                     note->setVisible(false);
    1703              :                 }
    1704              :                 // tie
    1705            6 :                 if ((int(oveNote->getTiePos()) & int(ovebase::TiePos::LeftEnd)) == int(ovebase::TiePos::LeftEnd)) {
    1706            0 :                     Tie* tie = new Tie(m_score->dummy());
    1707            0 :                     note->setTieFor(tie);
    1708            0 :                     tie->setStartNote(note);
    1709            0 :                     tie->setTrack(noteTrack);
    1710              :                 }
    1711              : 
    1712              :                 // pitch must be set before adding note to chord as note
    1713              :                 // is inserted into pitch sorted list (ws)
    1714            6 :                 cr->add(note);
    1715              : 
    1716              :                 // cr->setVisible(oveNote->getShow());
    1717            6 :                 ((mu::engraving::Chord*)cr)->setNoStem(int(container->getNoteType()) <= int(ovebase::NoteType::Note_Whole));
    1718            6 :                 if (!setDirection) {
    1719            6 :                     ((mu::engraving::Chord*)cr)->setStemDirection(container->getStemUp() ? DirectionV::UP : DirectionV::DOWN);
    1720              :                 }
    1721              : 
    1722              :                 // cross staff
    1723            6 :                 int staffMove = 0;
    1724            6 :                 if (partStaffCount == 2) { // treble-bass
    1725            0 :                     staffMove = oveNote->getOffsetStaff();
    1726              :                 }
    1727            6 :                 cr->setStaffMove(staffMove);
    1728              :             }
    1729            6 :         }
    1730              : 
    1731              :         // beam
    1732              :         // BeamMode bm = container->getIsRest() ? BeamMode::NONE : BeamMode::AUTO;
    1733           12 :         BeamMode bm = BeamMode::NONE;
    1734           12 :         if (container->getInBeam()) {
    1735            0 :             ovebase::MeasurePos pos = container->start()->shiftMeasure(0);
    1736            0 :             ovebase::MusicData* data = getCrossMeasureElementByPos(part, staff, pos,
    1737            0 :                                                                    container->getVoice(), ovebase::MusicDataType::Beam);
    1738              : 
    1739            0 :             if (data != 0) {
    1740            0 :                 ovebase::Beam* beam = static_cast<ovebase::Beam*>(data);
    1741            0 :                 ovebase::MeasurePos startPos = beam->start()->shiftMeasure(0);
    1742            0 :                 ovebase::MeasurePos stopPos = beam->stop()->shiftMeasure(beam->start()->getMeasure());
    1743              : 
    1744            0 :                 if (startPos == pos) {
    1745            0 :                     bm = BeamMode::BEGIN;
    1746            0 :                 } else if (stopPos == pos) {
    1747            0 :                     bm = BeamMode::END;
    1748              :                 } else {
    1749            0 :                     bm = BeamMode::MID;
    1750              :                 }
    1751            0 :             }
    1752            0 :         }
    1753           12 :         cr->setBeamMode(bm);
    1754              : 
    1755              :         // tuplet
    1756           12 :         if (container->getTuplet() > 0) {
    1757            0 :             if (tuplet == 0) {
    1758            0 :                 bool create = true;
    1759              : 
    1760              :                 // check tuplet start
    1761            0 :                 if (container->getNoteType() < ovebase::NoteType::Note_Eight) {
    1762            0 :                     const ovebase::Tuplet* oveTuplet = getTuplet(tuplets, container->start()->getOffset());
    1763            0 :                     if (oveTuplet == 0) {
    1764            0 :                         create = false;
    1765              :                     }
    1766              :                 }
    1767              : 
    1768            0 :                 if (create) {
    1769            0 :                     tuplet = new Tuplet(measure);
    1770            0 :                     tuplet->setTrack(noteTrack);
    1771            0 :                     tuplet->setRatio(Fraction(container->getTuplet(), container->getSpace()));
    1772            0 :                     TDuration duration = OveNoteType_To_Duration(container->getNoteType());
    1773            0 :                     tuplet->setBaseLen(duration);
    1774            0 :                     tuplet->setTick(Fraction::fromTicks(tick));
    1775              :                     // measure->add(tuplet);
    1776              :                 }
    1777              :             }
    1778              : 
    1779            0 :             if (tuplet != 0) {
    1780            0 :                 cr->setTuplet(tuplet);
    1781            0 :                 tuplet->add(cr);
    1782              :             }
    1783              : 
    1784            0 :             if (tuplet != 0) {
    1785              :                 // check tuplet end
    1786            0 :                 const ovebase::Tuplet* oveTuplet = getTuplet(tuplets, container->start()->getOffset());
    1787            0 :                 if (oveTuplet != 0) {
    1788              :                     // set direction
    1789            0 :                     tuplet->setDirection(
    1790            0 :                         oveTuplet->getLeftShoulder()->getYOffset() < 0 ? DirectionV::UP : DirectionV::DOWN);
    1791              : 
    1792            0 :                     if (container->start()->getOffset() == oveTuplet->stop()->getOffset()) {
    1793            0 :                         tuplet = 0;
    1794              :                     }
    1795              :                 }
    1796              :             }
    1797              :         }
    1798              : 
    1799              :         // articulation
    1800           24 :         QList<ovebase::Articulation*> articulations = container->getArticulations();
    1801           12 :         for (j = 0; j < articulations.size(); ++j) {
    1802            0 :             convertArticulation(measure, mu::engraving::toChord(cr), noteTrack, tick, articulations[j]);
    1803              :         }
    1804              :     }
    1805            9 : }
    1806              : 
    1807            0 : void OveToMScore::convertArticulation(
    1808              :     Measure* measure, Chord* cr,
    1809              :     int track, int absTick, ovebase::Articulation* art)
    1810              : {
    1811            0 :     switch (art->getArtType()) {
    1812            0 :     case ovebase::ArticulationType::Major_Trill:
    1813              :     case ovebase::ArticulationType::Minor_Trill: {
    1814            0 :         Articulation* a = Factory::createArticulation(cr);
    1815            0 :         a->setSymId(SymId::ornamentTrill);
    1816            0 :         cr->add(a);
    1817            0 :         break;
    1818              :     }
    1819            0 :     case ovebase::ArticulationType::Trill_Section: {
    1820            0 :         break;
    1821              :     }
    1822            0 :     case ovebase::ArticulationType::Inverted_Short_Mordent:
    1823              :     case ovebase::ArticulationType::Inverted_Long_Mordent: {
    1824            0 :         Articulation* a = Factory::createArticulation(cr);
    1825            0 :         a->setSymId(SymId::ornamentMordent);
    1826            0 :         cr->add(a);
    1827            0 :         break;
    1828              :     }
    1829            0 :     case ovebase::ArticulationType::Short_Mordent: {
    1830            0 :         Articulation* a = Factory::createArticulation(cr);
    1831            0 :         a->setSymId(SymId::ornamentShortTrill);
    1832            0 :         cr->add(a);
    1833            0 :         break;
    1834              :     }
    1835            0 :     case ovebase::ArticulationType::Turn: {
    1836            0 :         Articulation* a = Factory::createArticulation(cr);
    1837            0 :         a->setSymId(SymId::ornamentTurn);
    1838            0 :         cr->add(a);
    1839            0 :         break;
    1840              :     }
    1841              :     // case ovebase::ArticulationType::Flat_Accidental_For_Trill:
    1842              :     // case ovebase::ArticulationType::Sharp_Accidental_For_Trill:
    1843              :     // case ovebase::ArticulationType::Natural_Accidental_For_Trill:
    1844            0 :     case ovebase::ArticulationType::Tremolo_Eighth: {
    1845            0 :         TremoloSingleChord* t = Factory::createTremoloSingleChord(cr);
    1846            0 :         t->setTremoloType(TremoloType::R8);
    1847            0 :         cr->add(t);
    1848            0 :         break;
    1849              :     }
    1850            0 :     case ovebase::ArticulationType::Tremolo_Sixteenth: {
    1851            0 :         TremoloSingleChord* t = Factory::createTremoloSingleChord(cr);
    1852            0 :         t->setTremoloType(TremoloType::R16);
    1853            0 :         cr->add(t);
    1854            0 :         break;
    1855              :     }
    1856            0 :     case ovebase::ArticulationType::Tremolo_Thirty_Second: {
    1857            0 :         TremoloSingleChord* t = Factory::createTremoloSingleChord(cr);
    1858            0 :         t->setTremoloType(TremoloType::R32);
    1859            0 :         cr->add(t);
    1860            0 :         break;
    1861              :     }
    1862            0 :     case ovebase::ArticulationType::Tremolo_Sixty_Fourth: {
    1863            0 :         TremoloSingleChord* t = Factory::createTremoloSingleChord(cr);
    1864            0 :         t->setTremoloType(TremoloType::R64);
    1865            0 :         cr->add(t);
    1866            0 :         break;
    1867              :     }
    1868            0 :     case ovebase::ArticulationType::Marcato: {
    1869            0 :         Articulation* a = Factory::createArticulation(cr);
    1870            0 :         a->setSymId(SymId::articAccentAbove);
    1871            0 :         cr->add(a);
    1872            0 :         break;
    1873              :     }
    1874            0 :     case ovebase::ArticulationType::Marcato_Dot: {
    1875            0 :         Articulation* a = Factory::createArticulation(cr);
    1876            0 :         a->setSymId(SymId::articAccentAbove);
    1877            0 :         cr->add(a);
    1878              : 
    1879            0 :         a = Factory::createArticulation(cr);
    1880            0 :         a->setSymId(SymId::articStaccatoAbove);
    1881            0 :         cr->add(a);
    1882            0 :         break;
    1883              :     }
    1884            0 :     case ovebase::ArticulationType::Heavy_Attack: {
    1885            0 :         Articulation* a = Factory::createArticulation(cr);
    1886            0 :         a->setSymId(SymId::articAccentAbove);
    1887            0 :         cr->add(a);
    1888              : 
    1889            0 :         a = Factory::createArticulation(cr);
    1890            0 :         a->setSymId(SymId::articTenutoAbove);
    1891            0 :         cr->add(a);
    1892            0 :         break;
    1893              :     }
    1894            0 :     case ovebase::ArticulationType::SForzando: {
    1895            0 :         Articulation* a = Factory::createArticulation(cr);
    1896            0 :         a->setUp(true);
    1897            0 :         a->setSymId(SymId::articMarcatoAbove);
    1898            0 :         cr->add(a);
    1899            0 :         break;
    1900              :     }
    1901            0 :     case ovebase::ArticulationType::SForzando_Inverted: {
    1902            0 :         Articulation* a = Factory::createArticulation(cr);
    1903            0 :         a->setUp(false);
    1904            0 :         a->setSymId(SymId::articMarcatoAbove);
    1905            0 :         cr->add(a);
    1906            0 :         break;
    1907              :     }
    1908            0 :     case ovebase::ArticulationType::SForzando_Dot: {
    1909            0 :         Articulation* a = Factory::createArticulation(cr);
    1910            0 :         a->setUp(true);
    1911            0 :         a->setSymId(SymId::articMarcatoAbove);
    1912            0 :         cr->add(a);
    1913              : 
    1914            0 :         a = Factory::createArticulation(cr);
    1915            0 :         a->setSymId(SymId::articStaccatoAbove);
    1916            0 :         cr->add(a);
    1917            0 :         break;
    1918              :     }
    1919            0 :     case ovebase::ArticulationType::SForzando_Dot_Inverted: {
    1920            0 :         Articulation* a = Factory::createArticulation(cr);
    1921            0 :         a->setUp(false);
    1922            0 :         a->setSymId(SymId::articMarcatoAbove);
    1923            0 :         cr->add(a);
    1924              : 
    1925            0 :         a = Factory::createArticulation(cr);
    1926            0 :         a->setSymId(SymId::articStaccatoAbove);
    1927            0 :         cr->add(a);
    1928            0 :         break;
    1929              :     }
    1930            0 :     case ovebase::ArticulationType::Heavier_Attack: {
    1931            0 :         Articulation* a = Factory::createArticulation(cr);
    1932            0 :         a->setUp(true);
    1933            0 :         a->setSymId(SymId::articMarcatoAbove);
    1934            0 :         cr->add(a);
    1935              : 
    1936            0 :         a = Factory::createArticulation(cr);
    1937            0 :         a->setSymId(SymId::articTenutoAbove);
    1938            0 :         cr->add(a);
    1939            0 :         break;
    1940              :     }
    1941            0 :     case ovebase::ArticulationType::Staccatissimo: {
    1942            0 :         Articulation* a = Factory::createArticulation(cr);
    1943            0 :         a->setUp(true);
    1944            0 :         a->setSymId(SymId::articStaccatissimoAbove);
    1945            0 :         cr->add(a);
    1946            0 :         break;
    1947              :     }
    1948            0 :     case ovebase::ArticulationType::Staccato: {
    1949            0 :         Articulation* a = Factory::createArticulation(cr);
    1950            0 :         a->setSymId(SymId::articStaccatoAbove);
    1951            0 :         cr->add(a);
    1952            0 :         break;
    1953              :     }
    1954            0 :     case ovebase::ArticulationType::Tenuto: {
    1955            0 :         Articulation* a = Factory::createArticulation(cr);
    1956            0 :         a->setSymId(SymId::articTenutoAbove);
    1957            0 :         cr->add(a);
    1958            0 :         break;
    1959              :     }
    1960            0 :     case ovebase::ArticulationType::Pause: {
    1961            0 :         Segment* seg = measure->getSegment(SegmentType::Breath,
    1962            0 :                                            Fraction::fromTicks(absTick + (cr ? cr->actualTicks().ticks() : 0)));
    1963            0 :         Breath* b = Factory::createBreath(seg);
    1964            0 :         b->setTrack(track);
    1965            0 :         seg->add(b);
    1966            0 :         break;
    1967              :     }
    1968            0 :     case ovebase::ArticulationType::Grand_Pause: {
    1969            0 :         break;
    1970              :     }
    1971            0 :     case ovebase::ArticulationType::Up_Bow: {
    1972            0 :         Articulation* a = Factory::createArticulation(cr);
    1973            0 :         a->setSymId(SymId::stringsUpBow);
    1974            0 :         cr->add(a);
    1975            0 :         break;
    1976              :     }
    1977            0 :     case ovebase::ArticulationType::Down_Bow: {
    1978            0 :         Articulation* a = Factory::createArticulation(cr);
    1979            0 :         a->setSymId(SymId::stringsDownBow);
    1980            0 :         cr->add(a);
    1981            0 :         break;
    1982              :     }
    1983            0 :     case ovebase::ArticulationType::Up_Bow_Inverted: {
    1984            0 :         Articulation* a = Factory::createArticulation(cr);
    1985            0 :         a->setSymId(SymId::stringsUpBow);
    1986            0 :         a->ryoffset() = 5.3;
    1987            0 :         cr->add(a);
    1988            0 :         break;
    1989              :     }
    1990            0 :     case ovebase::ArticulationType::Down_Bow_Inverted: {
    1991            0 :         Articulation* a = Factory::createArticulation(cr);
    1992            0 :         a->setSymId(SymId::stringsDownBow);
    1993            0 :         a->ryoffset() = 5.3;
    1994            0 :         cr->add(a);
    1995            0 :         break;
    1996              :     }
    1997            0 :     case ovebase::ArticulationType::Natural_Harmonic: {
    1998            0 :         Articulation* a = Factory::createArticulation(cr);
    1999            0 :         a->setSymId(SymId::stringsHarmonic);
    2000            0 :         cr->add(a);
    2001            0 :         break;
    2002              :     }
    2003            0 :     case ovebase::ArticulationType::Artificial_Harmonic: {
    2004            0 :         break;
    2005              :     }
    2006            0 :     case ovebase::ArticulationType::Finger_1:
    2007              :     case ovebase::ArticulationType::Finger_2:
    2008              :     case ovebase::ArticulationType::Finger_3:
    2009              :     case ovebase::ArticulationType::Finger_4:
    2010              :     case ovebase::ArticulationType::Finger_5: {
    2011            0 :         break;
    2012              :     }
    2013            0 :     case ovebase::ArticulationType::Plus_Sign: {
    2014            0 :         Articulation* a = Factory::createArticulation(cr);
    2015            0 :         a->setSymId(SymId::brassMuteClosed);
    2016            0 :         cr->add(a);
    2017            0 :         break;
    2018              :     }
    2019            0 :     case ovebase::ArticulationType::Arpeggio: {
    2020              :         // there can be only one
    2021            0 :         if (!(static_cast<mu::engraving::Chord*>(cr))->arpeggio()) {
    2022            0 :             Arpeggio* a = Factory::createArpeggio(cr);
    2023            0 :             a->setArpeggioType(ArpeggioType::NORMAL);
    2024              :             /*
    2025              :             if (art->getPlacementAbove()){
    2026              :                 a->setSubtype(ArpeggioType::UP);
    2027              :             } else {
    2028              :                 a->setSubtype(ARpeggioType::DOWN);
    2029              :             }
    2030              :             */
    2031            0 :             cr->add(a);
    2032              :         }
    2033              : 
    2034            0 :         break;
    2035              :     }
    2036            0 :     case ovebase::ArticulationType::Fermata: {
    2037            0 :         Articulation* a = Factory::createArticulation(cr);
    2038            0 :         a->setUp(true);
    2039            0 :         a->setSymId(SymId::fermataAbove);
    2040            0 :         cr->add(a);
    2041            0 :         break;
    2042              :     }
    2043            0 :     case ovebase::ArticulationType::Fermata_Inverted: {
    2044            0 :         Articulation* a = Factory::createArticulation(cr);
    2045            0 :         a->setDirection(DirectionV::DOWN);
    2046            0 :         a->setSymId(SymId::fermataBelow);
    2047            0 :         cr->add(a);
    2048            0 :         break;
    2049              :     }
    2050            0 :     case ovebase::ArticulationType::Pedal_Down: {
    2051            0 :         if (m_pedal) {
    2052            0 :             delete m_pedal;
    2053            0 :             m_pedal = 0;
    2054              :         } else {
    2055            0 :             m_pedal = Factory::createPedal(m_score->dummy());
    2056            0 :             m_pedal->setTrack(track);
    2057            0 :             Segment* seg = measure->getSegment(SegmentType::ChordRest, Fraction::fromTicks(absTick));
    2058            0 :             m_pedal->setTick(seg->tick());
    2059              :         }
    2060            0 :         break;
    2061              :     }
    2062            0 :     case ovebase::ArticulationType::Pedal_Up: {
    2063            0 :         if (m_pedal) {
    2064            0 :             Segment* seg = measure->getSegment(SegmentType::ChordRest, Fraction::fromTicks(absTick));
    2065            0 :             m_pedal->setTick2(seg->tick());
    2066            0 :             m_score->addSpanner(m_pedal);
    2067            0 :             m_pedal = 0;
    2068              :         }
    2069            0 :         break;
    2070              :     }
    2071              :     // case ovebase::ArticulationType::Toe_Pedal:
    2072              :     // case ovebase::ArticulationType::Heel_Pedal:
    2073              :     // case ovebase::ArticulationType::Toe_To_Heel_Pedal:
    2074              :     // case ovebase::ArticulationType::Heel_To_Toe_Pedal:
    2075              :     // case ovebase::ArticulationType::Open_String:
    2076            0 :     default:
    2077            0 :         break;
    2078              :     }
    2079            0 : }
    2080              : 
    2081            9 : void OveToMScore::convertLyrics(Measure* measure, int part, int staff, int track)
    2082              : {
    2083            9 :     ovebase::MeasureData* measureData = m_ove->getMeasureData(part, staff, measure->measureNumber());
    2084            9 :     if (measureData == 0) {
    2085            0 :         return;
    2086              :     }
    2087              : 
    2088            9 :     QList<ovebase::MusicData*> lyrics = measureData->getMusicDatas(ovebase::MusicDataType::Lyric);
    2089              : 
    2090            9 :     for (int i = 0; i < lyrics.size(); ++i) {
    2091            0 :         ovebase::Lyric* oveLyric = static_cast<ovebase::Lyric*>(lyrics[i]);
    2092            0 :         int tick = m_mtt->getTick(measure->measureNumber(), oveLyric->getTick());
    2093              : 
    2094            0 :         Lyrics* lyric = Factory::createLyrics(m_score->dummy());
    2095            0 :         lyric->setVerse(oveLyric->getVerse());
    2096            0 :         lyric->setPlainText(oveLyric->getLyric());
    2097            0 :         lyric->setTrack(track);
    2098            0 :         Segment* segment = measure->getSegment(SegmentType::ChordRest, Fraction::fromTicks(tick));
    2099            0 :         if (segment->element(track)) {
    2100            0 :             toChordRest(segment->element(track))->add(lyric);
    2101              :         }
    2102              :     }
    2103            9 : }
    2104              : 
    2105            0 : static const ChordDescription* harmonyFromXml(Harmony* h, const muse::String& kind)
    2106              : {
    2107            0 :     String lowerCaseKind = kind.toLower();
    2108            0 :     const ChordList* cl = h->score()->chordList();
    2109            0 :     for (const auto& p : *cl) {
    2110            0 :         const ChordDescription& cd = p.second;
    2111            0 :         if (lowerCaseKind == cd.xmlKind) {
    2112            0 :             return &cd;
    2113              :         }
    2114              :     }
    2115            0 :     return nullptr;
    2116            0 : }
    2117              : 
    2118            9 : void OveToMScore::convertHarmonies(Measure* measure, int part, int staff, int track)
    2119              : {
    2120            9 :     ovebase::MeasureData* measureData = m_ove->getMeasureData(part, staff, measure->measureNumber());
    2121            9 :     if (measureData == 0) {
    2122            0 :         return;
    2123              :     }
    2124              : 
    2125            9 :     QList<ovebase::MusicData*> harmonies = measureData->getMusicDatas(ovebase::MusicDataType::Harmony);
    2126              : 
    2127            9 :     for (int i = 0; i < harmonies.size(); ++i) {
    2128            0 :         ovebase::Harmony* harmonyPtr = static_cast<ovebase::Harmony*>(harmonies[i]);
    2129            0 :         int absTick = m_mtt->getTick(measure->measureNumber(), harmonyPtr->getTick());
    2130              : 
    2131            0 :         Harmony* harmony = Factory::createHarmony(m_score->dummy());
    2132            0 :         HarmonyInfo* info = new HarmonyInfo(measure->score());
    2133              : 
    2134              :         // TODO - does this need to be key-aware?
    2135            0 :         harmony->setTrack(track);
    2136            0 :         info->setRootTpc(step2tpc(harmonyPtr->getRoot(), AccidentalVal(harmonyPtr->getAlterRoot())));
    2137            0 :         if (harmonyPtr->getBass() != ovebase::INVALID_NOTE
    2138            0 :             && (harmonyPtr->getBass() != harmonyPtr->getRoot()
    2139            0 :                 || (harmonyPtr->getBass() == harmonyPtr->getRoot()
    2140            0 :                     && harmonyPtr->getAlterBass() != harmonyPtr->getAlterRoot()))) {
    2141            0 :             info->setBassTpc(step2tpc(harmonyPtr->getBass(), AccidentalVal(harmonyPtr->getAlterBass())));
    2142              :         }
    2143            0 :         const ChordDescription* d = harmonyFromXml(harmony, harmonyPtr->getHarmonyType());
    2144            0 :         if (d != 0) {
    2145            0 :             info->setId(d->id);
    2146            0 :             info->setTextName(d->names.front());
    2147              :         } else {
    2148            0 :             info->setId(-1);
    2149            0 :             info->setTextName(harmonyPtr->getHarmonyType());
    2150              :         }
    2151              : 
    2152            0 :         harmony->addChord(info);
    2153              : 
    2154            0 :         Segment* s = measure->getSegment(SegmentType::ChordRest, Fraction::fromTicks(absTick));
    2155            0 :         s->add(harmony);
    2156              :     }
    2157            9 : }
    2158              : 
    2159              : /*
    2160              : ovebase::MusicData* OveToMScore::getMusicDataByUnit(int part, int staff, int measure, int unit, ovebase::MusicDataType type)
    2161              : {
    2162              :     ovebase::MeasureData* measureData = m_ove->getMeasureData(part, staff, measure);
    2163              :     if (measureData != 0) {
    2164              :         const QList<ovebase::MusicData*>& datas = measureData->getMusicDatas(type);
    2165              :         for (unsigned int i = 0; i < datas.size(); ++i){
    2166              :             if (datas[i]->getTick() == unit) { // different measurement
    2167              :                 return datas[i];
    2168              :             }
    2169              :         }
    2170              :     }
    2171              : 
    2172              :     return 0;
    2173              : }
    2174              : */
    2175              : 
    2176            0 : ovebase::MusicData* OveToMScore::getCrossMeasureElementByPos(int part, int staff, const ovebase::MeasurePos& pos, int voice,
    2177              :                                                              ovebase::MusicDataType type)
    2178              : {
    2179            0 :     ovebase::MeasureData* measureData = m_ove->getMeasureData(part, staff, pos.getMeasure());
    2180            0 :     if (measureData != 0) {
    2181              :         const QList<ovebase::MusicData*>& datas
    2182            0 :             = measureData->getCrossMeasureElements(type, ovebase::MeasureData::PairType::All);
    2183            0 :         for (int i = 0; i < datas.size(); ++i) {
    2184            0 :             ovebase::MeasurePos dataStart = datas[i]->start()->shiftMeasure(0);
    2185            0 :             ovebase::MeasurePos dataStop = datas[i]->stop()->shiftMeasure(datas[i]->start()->getMeasure());
    2186              : 
    2187            0 :             if (dataStart <= pos && dataStop >= pos && (int)datas[i]->getVoice() == voice) {
    2188            0 :                 return datas[i];
    2189              :             }
    2190            0 :         }
    2191            0 :     }
    2192              : 
    2193            0 :     return 0;
    2194              : }
    2195              : 
    2196            0 : ovebase::NoteContainer* OveToMScore::getContainerByPos(int part, int staff, const ovebase::MeasurePos& pos)
    2197              : {
    2198            0 :     ovebase::MeasureData* measureData = m_ove->getMeasureData(part, staff, pos.getMeasure());
    2199            0 :     if (measureData != 0) {
    2200            0 :         const QList<ovebase::NoteContainer*>& containers = measureData->getNoteContainers();
    2201            0 :         for (int i = 0; i < containers.size(); ++i) {
    2202            0 :             if (pos == containers[i]->start()->shiftMeasure(0)) {
    2203            0 :                 return containers[i];
    2204              :             }
    2205              :         }
    2206            0 :     }
    2207              : 
    2208            0 :     return 0;
    2209              : }
    2210              : 
    2211            9 : void OveToMScore::convertRepeats(Measure* measure, int part, int staff, int track)
    2212              : {
    2213            9 :     ovebase::MeasureData* measureData = m_ove->getMeasureData(part, staff, measure->measureNumber());
    2214            9 :     if (measureData == 0) {
    2215            0 :         return;
    2216              :     }
    2217              : 
    2218              :     int i;
    2219            9 :     QList<ovebase::MusicData*> repeats = measureData->getMusicDatas(ovebase::MusicDataType::Repeat);
    2220              : 
    2221            9 :     for (i = 0; i < repeats.size(); ++i) {
    2222            0 :         ovebase::RepeatSymbol* repeatPtr = static_cast<ovebase::RepeatSymbol*>(repeats[i]);
    2223            0 :         ovebase::RepeatType type = repeatPtr->getRepeatType();
    2224            0 :         EngravingItem* e = 0;
    2225              : 
    2226            0 :         switch (type) {
    2227            0 :         case ovebase::RepeatType::Segno: {
    2228            0 :             Marker* m = Factory::createMarker(measure);
    2229            0 :             m->setMarkerType(MarkerType::SEGNO);
    2230            0 :             m->resetProperty(Pid::LABEL);
    2231            0 :             e = m;
    2232            0 :             break;
    2233              :         }
    2234            0 :         case ovebase::RepeatType::Coda: {
    2235            0 :             Marker* m = Factory::createMarker(measure);
    2236            0 :             m->setMarkerType(MarkerType::CODA);
    2237            0 :             m->resetProperty(Pid::LABEL);
    2238            0 :             e = m;
    2239            0 :             break;
    2240              :         }
    2241            0 :         case ovebase::RepeatType::DSAlCoda: {
    2242            0 :             Jump* jp = Factory::createJump(measure);
    2243            0 :             jp->setJumpType(JumpType::DS_AL_CODA);
    2244            0 :             e = jp;
    2245            0 :             break;
    2246              :         }
    2247            0 :         case ovebase::RepeatType::DSAlFine: {
    2248            0 :             Jump* jp = Factory::createJump(measure);
    2249            0 :             jp->setJumpType(JumpType::DS_AL_FINE);
    2250            0 :             e = jp;
    2251            0 :             break;
    2252              :         }
    2253            0 :         case ovebase::RepeatType::DCAlCoda: {
    2254            0 :             Jump* jp = Factory::createJump(measure);
    2255            0 :             jp->setJumpType(JumpType::DC_AL_CODA);
    2256            0 :             e = jp;
    2257            0 :             break;
    2258              :         }
    2259            0 :         case ovebase::RepeatType::DCAlFine: {
    2260            0 :             Jump* jp = Factory::createJump(measure);
    2261            0 :             jp->setJumpType(JumpType::DC_AL_FINE);
    2262            0 :             e = jp;
    2263            0 :             break;
    2264              :         }
    2265            0 :         case ovebase::RepeatType::ToCoda: {
    2266            0 :             Marker* m = Factory::createMarker(measure);
    2267            0 :             m->setMarkerType(MarkerType::TOCODA);
    2268            0 :             m->resetProperty(Pid::LABEL);
    2269            0 :             e = m;
    2270            0 :             break;
    2271              :         }
    2272            0 :         case ovebase::RepeatType::Fine: {
    2273            0 :             Marker* m = Factory::createMarker(measure);
    2274            0 :             m->setMarkerType(MarkerType::FINE);
    2275            0 :             m->resetProperty(Pid::LABEL);
    2276            0 :             e = m;
    2277            0 :             break;
    2278              :         }
    2279            0 :         default:
    2280            0 :             break;
    2281              :         }
    2282              : 
    2283            0 :         if (e != 0) {
    2284            0 :             e->setTrack(track);
    2285            0 :             measure->add(e);
    2286              :         }
    2287              :     }
    2288              : 
    2289              :     QList<ovebase::MusicData*> endings = measureData->getCrossMeasureElements(
    2290              :         ovebase::MusicDataType::Numeric_Ending,
    2291           18 :         ovebase::MeasureData::PairType::Start);
    2292              : 
    2293           12 :     for (i = 0; i < endings.size(); ++i) {
    2294            3 :         ovebase::NumericEnding* ending = static_cast<ovebase::NumericEnding*>(endings[i]);
    2295            3 :         int absTick1 = m_mtt->getTick(measure->measureNumber(), 0);
    2296            3 :         int absTick2 = m_mtt->getTick(measure->measureNumber() + ending->stop()->getMeasure(), 0);
    2297              : 
    2298            3 :         if (absTick1 < absTick2) {
    2299            3 :             Volta* volta = Factory::createVolta(m_score->dummy());
    2300            3 :             volta->setTrack(track);
    2301            3 :             volta->setTick(Fraction::fromTicks(absTick1));
    2302            3 :             volta->setTick2(Fraction::fromTicks(absTick2));
    2303            3 :             m_score->addElement(volta);
    2304            3 :             volta->setVoltaType(Volta::Type::CLOSED);
    2305            3 :             volta->setText(ending->getText());
    2306              : 
    2307            3 :             volta->endings().clear();
    2308            3 :             QList<int> numbers = ending->getNumbers();
    2309            8 :             for (int j = 0; j < numbers.size(); ++j) {
    2310            5 :                 volta->endings().push_back(numbers[j]);
    2311              :             }
    2312            3 :         }
    2313              :     }
    2314            9 : }
    2315              : 
    2316            9 : void OveToMScore::convertSlurs(Measure* measure, int part, int staff, int track)
    2317              : {
    2318            9 :     ovebase::MeasureData* measureData = m_ove->getMeasureData(part, staff, measure->measureNumber());
    2319            9 :     if (measureData == 0) {
    2320            0 :         return;
    2321              :     }
    2322              : 
    2323              :     QList<ovebase::MusicData*> slurs = measureData->getCrossMeasureElements(ovebase::MusicDataType::Slur,
    2324            9 :                                                                             ovebase::MeasureData::PairType::Start);
    2325              : 
    2326            9 :     for (int i = 0; i < slurs.size(); ++i) {
    2327            0 :         ovebase::Slur* slurPtr = static_cast<ovebase::Slur*>(slurs[i]);
    2328              : 
    2329            0 :         ovebase::NoteContainer* startContainer = getContainerByPos(part, staff, slurPtr->start()->shiftMeasure(0));
    2330            0 :         ovebase::NoteContainer* endContainer = getContainerByPos(
    2331              :             part,
    2332              :             staff,
    2333            0 :             slurPtr->stop()->shiftMeasure(slurPtr->start()->getMeasure()));
    2334              : 
    2335            0 :         if (startContainer != 0 && endContainer != 0) {
    2336            0 :             int absStartTick = m_mtt->getTick(slurPtr->start()->getMeasure(), startContainer->getTick());
    2337            0 :             int absEndTick = m_mtt->getTick(
    2338            0 :                 slurPtr->start()->getMeasure() + slurPtr->stop()->getMeasure(), endContainer->getTick());
    2339              : 
    2340            0 :             Slur* slur = Factory::createSlur(m_score->dummy());
    2341            0 :             slur->setSlurDirection(slurPtr->getShowOnTop() ? DirectionV::UP : DirectionV::DOWN);
    2342            0 :             slur->setTick(Fraction::fromTicks(absStartTick));
    2343            0 :             slur->setTick2(Fraction::fromTicks(absEndTick));
    2344            0 :             slur->setTrack(track);
    2345            0 :             slur->setTrack2(track + endContainer->getOffsetStaff());
    2346              : 
    2347            0 :             m_score->addSpanner(slur);
    2348              :         }
    2349              :     }
    2350            9 : }
    2351              : 
    2352            0 : QString OveDynamics_To_Dynamics(ovebase::DynamicsType type)
    2353              : {
    2354            0 :     QString dynamic = "other-dynamics";
    2355              : 
    2356            0 :     switch (type) {
    2357            0 :     case ovebase::DynamicsType::PPPP:
    2358            0 :         dynamic = "pppp";
    2359            0 :         break;
    2360            0 :     case ovebase::DynamicsType::PPP:
    2361            0 :         dynamic = "ppp";
    2362            0 :         break;
    2363            0 :     case ovebase::DynamicsType::PP:
    2364            0 :         dynamic = "pp";
    2365            0 :         break;
    2366            0 :     case ovebase::DynamicsType::P:
    2367            0 :         dynamic = "p";
    2368            0 :         break;
    2369            0 :     case ovebase::DynamicsType::MP:
    2370            0 :         dynamic = "mp";
    2371            0 :         break;
    2372            0 :     case ovebase::DynamicsType::MF:
    2373            0 :         dynamic = "mf";
    2374            0 :         break;
    2375            0 :     case ovebase::DynamicsType::F:
    2376            0 :         dynamic = "f";
    2377            0 :         break;
    2378            0 :     case ovebase::DynamicsType::FF:
    2379            0 :         dynamic = "ff";
    2380            0 :         break;
    2381            0 :     case ovebase::DynamicsType::FFF:
    2382            0 :         dynamic = "fff";
    2383            0 :         break;
    2384            0 :     case ovebase::DynamicsType::FFFF:
    2385            0 :         dynamic = "ffff";
    2386            0 :         break;
    2387            0 :     case ovebase::DynamicsType::SF:
    2388            0 :         dynamic = "sf";
    2389            0 :         break;
    2390            0 :     case ovebase::DynamicsType::FZ:
    2391            0 :         dynamic = "fz";
    2392            0 :         break;
    2393            0 :     case ovebase::DynamicsType::SFZ:
    2394            0 :         dynamic = "sfz";
    2395            0 :         break;
    2396            0 :     case ovebase::DynamicsType::SFFZ:
    2397            0 :         dynamic = "sffz";
    2398            0 :         break;
    2399            0 :     case ovebase::DynamicsType::FP:
    2400            0 :         dynamic = "fp";
    2401            0 :         break;
    2402            0 :     case ovebase::DynamicsType::SFP:
    2403            0 :         dynamic = "sfp";
    2404            0 :         break;
    2405            0 :     default:
    2406            0 :         break;
    2407              :     }
    2408              : 
    2409            0 :     return dynamic;
    2410            0 : }
    2411              : 
    2412            9 : void OveToMScore::convertDynamics(Measure* measure, int part, int staff, int track)
    2413              : {
    2414            9 :     ovebase::MeasureData* measureData = m_ove->getMeasureData(part, staff, measure->measureNumber());
    2415            9 :     if (measureData == 0) {
    2416            0 :         return;
    2417              :     }
    2418              : 
    2419            9 :     QList<ovebase::MusicData*> dynamics = measureData->getMusicDatas(ovebase::MusicDataType::Dynamics);
    2420              : 
    2421            9 :     for (int i = 0; i < dynamics.size(); ++i) {
    2422            0 :         ovebase::Dynamics* dynamicPtr = static_cast<ovebase::Dynamics*>(dynamics[i]);
    2423            0 :         int absTick = m_mtt->getTick(measure->measureNumber(), dynamicPtr->getTick());
    2424            0 :         Segment* s = measure->getSegment(SegmentType::ChordRest, Fraction::fromTicks(absTick));
    2425            0 :         Dynamic* dynamic = Factory::createDynamic(s);
    2426              : 
    2427            0 :         dynamic->setDynamicType(OveDynamics_To_Dynamics(dynamicPtr->getDynamicsType()));
    2428            0 :         dynamic->setTrack(track);
    2429              : 
    2430            0 :         s->add(dynamic);
    2431              :     }
    2432            9 : }
    2433              : 
    2434            9 : void OveToMScore::convertExpressions(Measure* measure, int part, int staff, int track)
    2435              : {
    2436            9 :     ovebase::MeasureData* measureData = m_ove->getMeasureData(part, staff, measure->measureNumber());
    2437            9 :     if (measureData == 0) {
    2438            0 :         return;
    2439              :     }
    2440              : 
    2441            9 :     QList<ovebase::MusicData*> expressions = measureData->getMusicDatas(ovebase::MusicDataType::Expressions);
    2442              : 
    2443            9 :     for (int i = 0; i < expressions.size(); ++i) {
    2444            0 :         ovebase::Expressions* expressionPtr = static_cast<ovebase::Expressions*>(expressions[i]);
    2445            0 :         int absTick = m_mtt->getTick(measure->measureNumber(), expressionPtr->getTick());
    2446            0 :         Segment* s = measure->getSegment(SegmentType::ChordRest, Fraction::fromTicks(absTick));
    2447            0 :         Text* t = Factory::createText(s, TextStyleType::EXPRESSION);
    2448            0 :         t->setPlainText(expressionPtr->getText());
    2449            0 :         t->setTrack(track);
    2450              : 
    2451            0 :         s->add(t);
    2452              :     }
    2453            9 : }
    2454              : 
    2455            9 : void OveToMScore::convertGlissandos(Measure* measure, int part, int staff, int track)
    2456              : {
    2457            9 :     ovebase::MeasureData* measureData = m_ove->getMeasureData(part, staff, measure->measureNumber());
    2458            9 :     if (measureData == 0) {
    2459            0 :         return;
    2460              :     }
    2461              : 
    2462              :     QList<ovebase::MusicData*> glissandos = measureData->getCrossMeasureElements(ovebase::MusicDataType::Glissando,
    2463            9 :                                                                                  ovebase::MeasureData::PairType::All);
    2464              : 
    2465            9 :     for (int i = 0; i < glissandos.size(); ++i) {
    2466            0 :         ovebase::Glissando* glissandoPtr = static_cast<ovebase::Glissando*>(glissandos[i]);
    2467            0 :         ovebase::NoteContainer* startContainer = getContainerByPos(part, staff, glissandoPtr->start()->shiftMeasure(0));
    2468            0 :         ovebase::NoteContainer* endContainer = getContainerByPos(
    2469              :             part,
    2470              :             staff,
    2471            0 :             glissandoPtr->stop()->shiftMeasure(glissandoPtr->start()->getMeasure()));
    2472              : 
    2473            0 :         if (startContainer != 0 && endContainer != 0) {
    2474            0 :             int absTick = m_mtt->getTick(measure->measureNumber(), glissandoPtr->getTick());
    2475            0 :             ChordRest* cr = measure->findChordRest(Fraction::fromTicks(absTick), track);
    2476            0 :             if (cr != 0) {
    2477            0 :                 Glissando* g = Factory::createGlissando(cr);
    2478            0 :                 g->setGlissandoType(GlissandoType::WAVY);
    2479            0 :                 g->setGlissandoStyle(cr->part()->instrument(cr->tick())->glissandoStyle());
    2480            0 :                 cr->add(g);
    2481              :             }
    2482              :         }
    2483              :     }
    2484            9 : }
    2485              : 
    2486            0 : static HairpinType OveWedgeType_To_Type(ovebase::WedgeType type)
    2487              : {
    2488            0 :     HairpinType subtype = HairpinType::CRESC_HAIRPIN;
    2489            0 :     switch (type) {
    2490            0 :     case ovebase::WedgeType::Cresc_Line: {
    2491            0 :         subtype = HairpinType::CRESC_HAIRPIN;
    2492            0 :         break;
    2493              :     }
    2494            0 :     case ovebase::WedgeType::Double_Line: {
    2495            0 :         subtype = HairpinType::CRESC_HAIRPIN;
    2496            0 :         break;
    2497              :     }
    2498            0 :     case ovebase::WedgeType::Dim_Line: {
    2499            0 :         subtype = HairpinType::DIM_HAIRPIN;
    2500            0 :         break;
    2501              :     }
    2502            0 :     case ovebase::WedgeType::Cresc: {
    2503            0 :         subtype = HairpinType::CRESC_HAIRPIN;
    2504            0 :         break;
    2505              :     }
    2506            0 :     case ovebase::WedgeType::Dim: {
    2507            0 :         subtype = HairpinType::DIM_HAIRPIN;
    2508            0 :         break;
    2509              :     }
    2510            0 :     default:
    2511            0 :         break;
    2512              :     }
    2513              : 
    2514            0 :     return subtype;
    2515              : }
    2516              : 
    2517            9 : void OveToMScore::convertWedges(Measure* measure, int part, int staff, int track)
    2518              : {
    2519            9 :     ovebase::MeasureData* measureData = m_ove->getMeasureData(part, staff, measure->measureNumber());
    2520            9 :     if (measureData == 0) {
    2521            0 :         return;
    2522              :     }
    2523              : 
    2524              :     QList<ovebase::MusicData*> wedges = measureData->getCrossMeasureElements(ovebase::MusicDataType::Wedge,
    2525            9 :                                                                              ovebase::MeasureData::PairType::All);
    2526              : 
    2527            9 :     for (int i = 0; i < wedges.size(); ++i) {
    2528            0 :         ovebase::Wedge* wedgePtr = static_cast<ovebase::Wedge*>(wedges[i]);
    2529            0 :         int absTick = m_mtt->getTick(
    2530              :             measure->measureNumber(),
    2531            0 :             MeasureToTick::unitToTick(wedgePtr->start()->getOffset(), m_ove->getQuarter()));
    2532            0 :         int absTick2 = m_mtt->getTick(
    2533            0 :             measure->measureNumber() + wedgePtr->stop()->getMeasure(),
    2534            0 :             MeasureToTick::unitToTick(wedgePtr->stop()->getOffset(), m_ove->getQuarter()));
    2535              : 
    2536            0 :         if (absTick2 > absTick) {
    2537            0 :             Hairpin* hp = Factory::createHairpin(m_score->dummy());
    2538              : 
    2539            0 :             hp->setHairpinType(OveWedgeType_To_Type(wedgePtr->getWedgeType()));
    2540              :             // hp->setYoff(wedgePtr->getYOffset());
    2541            0 :             hp->setTrack(track);
    2542              : 
    2543            0 :             hp->setTick(Fraction::fromTicks(absTick));
    2544            0 :             hp->setTick2(Fraction::fromTicks(absTick2));
    2545            0 :             m_score->addSpanner(hp);
    2546              :         }
    2547              :     }
    2548            9 : }
    2549              : 
    2550            4 : Err importOve(MasterScore* score, const QString& name)
    2551              : {
    2552            4 :     ovebase::IOVEStreamLoader* oveLoader = ovebase::createOveStreamLoader();
    2553            4 :     ovebase::OveSong oveSong;
    2554              : 
    2555            4 :     QFile oveFile(name);
    2556            4 :     if (!oveFile.exists()) {
    2557            0 :         return Err::FileNotFound;
    2558              :     }
    2559            4 :     if (!oveFile.open(QFile::ReadOnly)) {
    2560              :         // messageOutString(QString("can't read file!"));
    2561            0 :         return Err::FileOpenError;
    2562              :     }
    2563              : 
    2564            4 :     QByteArray buffer = oveFile.readAll();
    2565              : 
    2566            4 :     oveFile.close();
    2567              : 
    2568            4 :     oveSong.setTextCodecName(QString::fromStdString(ove::configuration()->importOvertureCharset()));
    2569            4 :     oveLoader->setOve(&oveSong);
    2570            4 :     oveLoader->setFileStream((unsigned char*)buffer.data(), buffer.size());
    2571            4 :     bool result = oveLoader->load();
    2572            4 :     oveLoader->release();
    2573              : 
    2574            4 :     if (result) {
    2575            2 :         OveToMScore otm;
    2576            2 :         otm.convert(&oveSong, score);
    2577              : 
    2578              :         // score->connectSlurs();
    2579            2 :     }
    2580              : 
    2581            4 :     return result ? Err::NoError : Err::FileUnknownError;
    2582            4 : }
        

Generated by: LCOV version 2.0-1