From 3a69137465de2600633687fab88755f38085ba46 Mon Sep 17 00:00:00 2001 From: Alexander Pavlov Date: Fri, 10 Jun 2022 04:17:01 +0300 Subject: [PATCH] fix #11928: octave import in gp --- .../guitarpro/internal/gtp/gpconverter.cpp | 72 ++++++++++--------- .../guitarpro/internal/gtp/gpconverter.h | 3 +- 2 files changed, 38 insertions(+), 37 deletions(-) diff --git a/src/importexport/guitarpro/internal/gtp/gpconverter.cpp b/src/importexport/guitarpro/internal/gtp/gpconverter.cpp index 514389ec9f..ae1f294386 100644 --- a/src/importexport/guitarpro/internal/gtp/gpconverter.cpp +++ b/src/importexport/guitarpro/internal/gtp/gpconverter.cpp @@ -120,6 +120,23 @@ static QString harmonicText(const GPNote::Harmonic::Type& type) return QString(); } +static OttavaType ottavaType(GPBeat::OttavaType t) +{ + static QMap types { + { GPBeat::OttavaType::va8, OttavaType::OTTAVA_8VA }, + { GPBeat::OttavaType::vb8, OttavaType::OTTAVA_8VB }, + { GPBeat::OttavaType::ma15, OttavaType::OTTAVA_15MA }, + { GPBeat::OttavaType::mb15, OttavaType::OTTAVA_15MB } + }; + + if (types.contains(t)) { + return types[t]; + } + + LOGE() << "wrong ottava type"; + return OttavaType::OTTAVA_8VA; /// there is no type "NONE" +} + GPConverter::GPConverter(Score* score, std::unique_ptr&& gpDom) : _score(score), _gpDom(std::move(gpDom)) { @@ -228,10 +245,12 @@ void GPConverter::convert(const std::vector >& mast } // adding end tick of ottava if the score ends with it - if (_lastOttava) { - _lastOttava->setTick2(_score->endTick()); - _score->addElement(_lastOttava); - _lastOttava = nullptr; + for (auto& ottava : m_lastOttavas) { + if (ottava) { + ottava->setTick2(_score->endTick()); + _score->addElement(ottava); + ottava = nullptr; + } } // fixing last measure barline @@ -794,6 +813,8 @@ void GPConverter::setUpGPScore(const GPScore* gpscore) void GPConverter::setUpTracks(const std::map >& tracks) { + m_lastOttavas.resize(tracks.size()); + for (const auto& track : tracks) { setUpTrack(track.second); } @@ -1885,48 +1906,29 @@ void GPConverter::addLegato(const GPBeat* beat, ChordRest* cr) void GPConverter::addOttava(const GPBeat* gpb, ChordRest* cr) { - auto convertOttava = [](GPBeat::OttavaType t) { - switch (t) { - case GPBeat::OttavaType::va8: { - return mu::engraving::OttavaType::OTTAVA_8VA; - } - case GPBeat::OttavaType::vb8: { - return mu::engraving::OttavaType::OTTAVA_8VB; - } - case GPBeat::OttavaType::ma15: { - return mu::engraving::OttavaType::OTTAVA_15MA; - } - case GPBeat::OttavaType::mb15: { - return mu::engraving::OttavaType::OTTAVA_15MB; - } - case GPBeat::OttavaType::None: - break; - } - LOGE() << "wrong ottava type"; - return mu::engraving::OttavaType::OTTAVA_8VA; - }; + auto& ot = m_lastOttavas[cr->track() / VOICES]; if (gpb->ottavaType() == GPBeat::OttavaType::None) { - if (_lastOttava) { - _lastOttava->setTick2(cr->segment()->tick()); - _score->addElement(_lastOttava); + if (ot) { + ot->setTick2(cr->segment()->tick()); + _score->addElement(ot); } - _lastOttava = nullptr; + ot = nullptr; return; } - auto newOttavaType = convertOttava(gpb->ottavaType()); + auto newOttavaType = ottavaType(gpb->ottavaType()); - if (!_lastOttava || newOttavaType != _lastOttava->ottavaType()) { + if (!ot || newOttavaType != ot->ottavaType()) { Ottava* ottava = Factory::createOttava(_score->dummy()); ottava->setTrack(cr->track()); ottava->setTick(cr->segment()->tick()); ottava->setOttavaType(newOttavaType); - if (_lastOttava) { - _lastOttava->setTick2(cr->segment()->tick()); - _score->addElement(_lastOttava); + if (ot) { + ot->setTick2(cr->segment()->tick()); + _score->addElement(ot); } - _lastOttava = ottava; + ot = ottava; } if (!cr->isChord()) { @@ -1934,7 +1936,7 @@ void GPConverter::addOttava(const GPBeat* gpb, ChordRest* cr) } const Chord* chord = toChord(cr); - mu::engraving::OttavaType type = _lastOttava->ottavaType(); + mu::engraving::OttavaType type = ot->ottavaType(); for (mu::engraving::Note* note : chord->notes()) { int pitch = note->pitch(); diff --git a/src/importexport/guitarpro/internal/gtp/gpconverter.h b/src/importexport/guitarpro/internal/gtp/gpconverter.h index d20517129b..beddd89110 100644 --- a/src/importexport/guitarpro/internal/gtp/gpconverter.h +++ b/src/importexport/guitarpro/internal/gtp/gpconverter.h @@ -170,7 +170,6 @@ private: std::vector m_rasgueados; std::map > m_harmonicMarks; std::vector _vibratos; - std::vector _ottavas; Volta* _lastVolta = nullptr; struct NextTupletInfo { @@ -185,7 +184,7 @@ private: } m_nextTupletInfo; Hairpin* _lastHairpin = nullptr; - Ottava* _lastOttava = nullptr; + std::vector m_lastOttavas; Measure* _lastMeasure = nullptr; bool m_showCapo = true; // TODO-gp : settings };