Skip to content

Commit

Permalink
Fixed gp7 tuning string for ver 7.0.0 (musescore#19085)
Browse files Browse the repository at this point in the history
  • Loading branch information
mikekirin authored Aug 21, 2023
1 parent 01411a6 commit 6470ba3
Show file tree
Hide file tree
Showing 8 changed files with 29 additions and 15 deletions.
10 changes: 5 additions & 5 deletions src/importexport/guitarpro/internal/gtp/gp67dombuilder.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,6 @@ void GP67DomBuilder::buildGPDomModel(XmlDomElement* domElem)
masterBars, bars, voices,
beats, notes, rhythms;

// Currently ignored
XmlDomNode gpversion, encoding;

std::map<String, XmlDomNode*> nodeMap =
Expand Down Expand Up @@ -61,7 +60,7 @@ void GP67DomBuilder::buildGPDomModel(XmlDomElement* domElem)
buildGPScore(&scoreNode);
buildGPMasterTracks(&masterTrack);
buildGPAudioTracks(&audioTracks);
buildGPTracks(&eachTrack);
buildGPTracks(&eachTrack, &gpversion);
}

std::unique_ptr<GPDomModel> GP67DomBuilder::getGPDomModel()
Expand Down Expand Up @@ -142,12 +141,12 @@ void GP67DomBuilder::buildGPAudioTracks(XmlDomNode* audioTrack)
}
}

void GP67DomBuilder::buildGPTracks(XmlDomNode* tracksNode)
void GP67DomBuilder::buildGPTracks(XmlDomNode* tracksNode, XmlDomNode* versionNode)
{
std::map<int, std::unique_ptr<GPTrack> > tracks;
XmlDomNode currentNode = tracksNode->firstChild();
while (!currentNode.isNull()) {
tracks.insert(createGPTrack(&currentNode));
tracks.insert(createGPTrack(&currentNode, versionNode));
currentNode = currentNode.nextSibling();
}

Expand Down Expand Up @@ -1196,9 +1195,10 @@ void GP67DomBuilder::readBeatProperties(const XmlDomNode& propertiesNode, GPBeat
}
}

void GP67DomBuilder::readTrackProperties(XmlDomNode* propertiesNode, GPTrack* track) const
void GP67DomBuilder::readTrackProperties(XmlDomNode* propertiesNode, GPTrack* track, bool ignoreTuningFlats) const
{
GPTrack::StaffProperty property;
property.ignoreFlats = ignoreTuningFlats;

auto propertyNode = propertiesNode->firstChild();

Expand Down
6 changes: 3 additions & 3 deletions src/importexport/guitarpro/internal/gtp/gp67dombuilder.h
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ class GP67DomBuilder : public IGPDomBuilder
void buildGPScore(XmlDomNode* scoreNode);
void buildGPMasterTracks(XmlDomNode* masterTrack);
void buildGPAudioTracks(XmlDomNode* audioTrack);
void buildGPTracks(XmlDomNode* tracksNode);
void buildGPTracks(XmlDomNode* tracksNode, XmlDomNode* versionNode);
void buildGPMasterBars(XmlDomNode* masterBars);
void buildGPBars(XmlDomNode* bars);
void buildGPVoices(XmlDomNode* voicesNode);
Expand All @@ -33,7 +33,7 @@ class GP67DomBuilder : public IGPDomBuilder
void breakLyricsOnBeatsIfNeed();
bool isLyricsOnBeats() const;

virtual std::pair<int, std::unique_ptr<GPTrack> > createGPTrack(XmlDomNode* trackNode) = 0;
virtual std::pair<int, std::unique_ptr<GPTrack> > createGPTrack(XmlDomNode* trackNode, XmlDomNode* versionNode) = 0;

std::unique_ptr<GPMasterTracks> createGPMasterTrack(XmlDomNode* metadata);
std::unique_ptr<GPMasterBar> createGPMasterBar(XmlDomNode* masterBarNode);
Expand All @@ -54,7 +54,7 @@ class GP67DomBuilder : public IGPDomBuilder
GPMasterBar::KeySig readKeySig(XmlDomNode* keyNode) const;
bool readUseFlats(XmlDomNode* keyNode) const;
GPMasterBar::TimeSig readTimeSig(XmlDomNode* timeNode) const;
void readTrackProperties(XmlDomNode* propertiesNode, GPTrack* track) const;
void readTrackProperties(XmlDomNode* propertiesNode, GPTrack* track, bool ignoreTuningFlats) const;
void readBeatProperties(const XmlDomNode& propertiesNode, GPBeat* beat) const;
void readDiagram(const XmlDomNode& items, GPTrack* track) const;
void readLyrics(const XmlDomNode& items, GPTrack* track) const;
Expand Down
4 changes: 2 additions & 2 deletions src/importexport/guitarpro/internal/gtp/gp6dombuilder.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
#include "global/log.h"

namespace mu::iex::guitarpro {
std::pair<int, std::unique_ptr<GPTrack> > GP6DomBuilder::createGPTrack(XmlDomNode* trackNode)
std::pair<int, std::unique_ptr<GPTrack> > GP6DomBuilder::createGPTrack(XmlDomNode* trackNode, XmlDomNode* versionNode)
{
static const std::set<String> sUnusedNodes = {
u"Color", // we dont use icon color for the tracks
Expand Down Expand Up @@ -50,7 +50,7 @@ std::pair<int, std::unique_ptr<GPTrack> > GP6DomBuilder::createGPTrack(XmlDomNod
} else if (nodeName == u"ShortName") {
track->setShortName(trackChildNode.toElement().text());
} else if (nodeName == u"Properties") {
readTrackProperties(&trackChildNode, track.get());
readTrackProperties(&trackChildNode, track.get(), false);
} else if (nodeName == u"Instrument") {
setUpInstrument(&trackChildNode, track.get());
} else if (nodeName == u"Lyrics") {
Expand Down
2 changes: 1 addition & 1 deletion src/importexport/guitarpro/internal/gtp/gp6dombuilder.h
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ class GP6DomBuilder : public GP67DomBuilder
GP6DomBuilder() = default;

private:
virtual std::pair<int, std::unique_ptr<GPTrack> > createGPTrack(XmlDomNode* trackNode);
virtual std::pair<int, std::unique_ptr<GPTrack> > createGPTrack(XmlDomNode* trackNode, XmlDomNode* versionNode);
void setUpInstrument(XmlDomNode* trackChildNode, GPTrack* track);
GPTrack::SoundAutomation readRsePickUp(XmlDomNode& rseNode) const;
};
Expand Down
9 changes: 7 additions & 2 deletions src/importexport/guitarpro/internal/gtp/gp7dombuilder.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
#include "global/log.h"

namespace mu::iex::guitarpro {
std::pair<int, std::unique_ptr<GPTrack> > GP7DomBuilder::createGPTrack(XmlDomNode* trackNode)
std::pair<int, std::unique_ptr<GPTrack> > GP7DomBuilder::createGPTrack(XmlDomNode* trackNode, XmlDomNode* versionNode)
{
static const std::set<String> sUnused = {
u"Color", u"SystemsDefautLayout", u"SystemsLayout", u"AutoBrush",
Expand All @@ -18,6 +18,7 @@ std::pair<int, std::unique_ptr<GPTrack> > GP7DomBuilder::createGPTrack(XmlDomNod
int trackIdx = trackNode->attribute("id").toInt();
auto track = std::make_unique<GPTrack>(trackIdx);
XmlDomNode trackChildNode = trackNode->firstChild();
String version = versionNode->toElement().text();

while (!trackChildNode.isNull()) {
String nodeName = trackChildNode.nodeName();
Expand Down Expand Up @@ -46,7 +47,11 @@ std::pair<int, std::unique_ptr<GPTrack> > GP7DomBuilder::createGPTrack(XmlDomNod
int staffCount = 0;
while (!staffNode.isNull()) {
auto propertyNode = staffNode.firstChild();
readTrackProperties(&propertyNode, track.get());
// there is a bug in gp v 7.0.0
// All parts marked to use flat for tuning string,
// but in real world gp uses tuning presets
// sp we have to ignore <Flats/> and <TuningFlat> props
readTrackProperties(&propertyNode, track.get(), version == "7");
staffNode = staffNode.nextSibling();
staffCount++;
}
Expand Down
2 changes: 1 addition & 1 deletion src/importexport/guitarpro/internal/gtp/gp7dombuilder.h
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ class GP7DomBuilder : public GP67DomBuilder
GP7DomBuilder() = default;

private:
std::pair<int, std::unique_ptr<GPTrack> > createGPTrack(XmlDomNode* trackNode) override;
std::pair<int, std::unique_ptr<GPTrack> > createGPTrack(XmlDomNode* trackNode, XmlDomNode* versionNode) override;

int readMidiChannel(XmlDomNode* trackChildNode) const;
int readMidiProgramm(XmlDomNode* trackChildNode) const;
Expand Down
10 changes: 9 additions & 1 deletion src/importexport/guitarpro/internal/gtp/gpconverter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1115,8 +1115,16 @@ void GPConverter::setUpTrack(const std::unique_ptr<GPTrack>& tR)
part->staff(0)->insertCapoParams({ 0, 1 }, params);
part->setCapoFret(capoFret);
auto tunning = staffProperty[0].tunning;
bool usePresetTable = staffProperty[0].ignoreFlats;

bool useFlats = staffProperty[0].useFlats;
std::array<uint64_t, 3> flatPresets{ 0x3f3a36312c27, 0x3c37332e2924, 0x3f3a36312c25 };

uint64_t k = 0;
for (size_t i = 0; i < tunning.size(); ++i) {
k |= (uint64_t)tunning[i] << 8 * i;
}
bool useFlats
= usePresetTable ? std::find(flatPresets.begin(), flatPresets.end(), k) != flatPresets.end() : staffProperty[0].useFlats;
auto fretCount = staffProperty[0].fretCount;

if (tunning.empty()) {
Expand Down
1 change: 1 addition & 0 deletions src/importexport/guitarpro/internal/gtp/gptrack.h
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ class GPTrack
int capoFret{ 0 };
std::vector<int> tunning;
bool useFlats{ false };
bool ignoreFlats{ false };
};

struct InstrumentString {
Expand Down

0 comments on commit 6470ba3

Please sign in to comment.