MuseScore/mscore/importxmlfirstpass.cpp
2017-02-14 21:03:40 +01:00

165 lines
4.8 KiB
C++

//=============================================================================
// MuseScore
// Music Composition & Notation
//
// Copyright (C) 2013 - 2015 Werner Schweer and others
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License version 2
// as published by the Free Software Foundation and appearing in
// the file LICENCE.GPL
//=============================================================================
#include "importxmlfirstpass.h"
namespace Ms {
// TODO: move somewhere else
MusicXmlPart::MusicXmlPart(QString id, QString name)
: id(id), name(name)
{
octaveShifts.resize(MAX_STAVES);
}
void MusicXmlPart::addMeasureNumberAndDuration(QString measureNumber, Fraction measureDuration)
{
measureNumbers.append(measureNumber);
measureDurations.append(measureDuration);
}
Fraction MusicXmlPart::measureDuration(int i) const
{
if (i >= 0 && i < measureDurations.size())
return measureDurations.at(i);
return Fraction(0, 0); // return invalid fraction
}
QString MusicXmlPart::toString() const
{
QString res;
res = QString("part id '%1' name '%2'\n").arg(id).arg(name);
for (VoiceList::const_iterator i = voicelist.constBegin(); i != voicelist.constEnd(); ++i) {
res += QString("voice %1 map staff data %2\n")
.arg(i.key() + 1)
.arg(i.value().toString());
}
for (int i = 0; i < measureNumbers.size(); ++i) {
if (i > 0)
res += "\n";
res += QString("measure %1 duration %2 (%3)")
.arg(measureNumbers.at(i))
.arg(measureDurations.at(i).print())
.arg(measureDurations.at(i).ticks());
}
return res;
}
int MusicXmlPart::octaveShift(const int staff, const Fraction f) const
{
if (staff < 0 || MAX_STAVES <= staff)
return 0;
if (f < Fraction(0, 1))
return 0;
return octaveShifts[staff].octaveShift(f);
}
void MusicXmlPart::addOctaveShift(const int staff, const int shift, const Fraction f)
{
if (staff < 0 || MAX_STAVES <= staff)
return;
if (f < Fraction(0, 1))
return;
octaveShifts[staff].addOctaveShift(shift, f);
}
void MusicXmlPart::calcOctaveShifts()
{
for (int i = 0; i < MAX_STAVES; ++i) {
octaveShifts[i].calcOctaveShiftShifts();
}
}
//---------------------------------------------------------
// instrument
//---------------------------------------------------------
const QString MusicXmlInstrList::instrument(const Fraction f) const
{
if (empty())
return "";
auto i = upper_bound(f);
if (i == begin())
return "";
--i;
return i->second;
}
//---------------------------------------------------------
// setInstrument
//---------------------------------------------------------
void MusicXmlInstrList::setInstrument(const QString instr, const Fraction f)
{
// TODO determine how to handle multiple instrument changes at the same time
// current implementation keeps the first one
if (!insert({ f, instr }).second)
qDebug("instr '%s', tick %s (%d): element already exists",
qPrintable(instr), qPrintable(f.print()), f.ticks());
//(*this)[f] = instr;
}
int MusicXmlOctaveShiftList::octaveShift(const Fraction f) const
{
if (empty())
return 0;
auto i = upper_bound(f);
if (i == begin())
return 0;
--i;
return i->second;
}
void MusicXmlOctaveShiftList::addOctaveShift(const int shift, const Fraction f)
{
Q_ASSERT(Fraction(0, 1) <= f);
//qDebug("addOctaveShift(shift %d f %s)", shift, qPrintable(f.print()));
auto i = find(f);
if (i == end()) {
//qDebug("addOctaveShift: not found, inserting");
insert({ f, shift });
}
else {
//qDebug("addOctaveShift: found %d, adding", (*this)[f]);
(*this)[f] += shift;
//qDebug("addOctaveShift: res %d", (*this)[f]);
}
}
void MusicXmlOctaveShiftList::calcOctaveShiftShifts()
{
/*
for (auto i = cbegin(); i != cend(); ++i)
qDebug(" [%s : %d]", qPrintable((*i).first.print()), (*i).second);
*/
// to each MusicXmlOctaveShiftList entry, add the sum of all previous ones
int currentShift = 0;
for (auto i = begin(); i != end(); ++i) {
currentShift += i->second;
i->second = currentShift;
}
/*
for (auto i = cbegin(); i != cend(); ++i)
qDebug(" [%s : %d]", qPrintable((*i).first.print()), (*i).second);
*/
}
}