void SyntiParameterData::write(Xml& xml) const { if (_type == P_FLOAT) xml.tagE(QString("f name=\"%1\" val=\"%3\"").arg(_name).arg(_fval)); else if (_type == P_STRING) xml.tagE(QString("s name=\"%1\" val=\"%3\"").arg(_name).arg(Xml::xmlString(_sval))); }
void Pos::write(Xml& xml, const char* name) const { if (_type == TICKS) xml.tagE(QString("%1 tick=\"%2\"").arg(name).arg(_tick)); else xml.tagE(QString("%1 frame=\"%2\"").arg(name).arg(_frame)); }
void PosLen::write(Xml& xml, const char* name) const { if (type() == TICKS) xml.tagE(QString("%1 tick=\"%2\" len=\"%3\"").arg(name).arg(tick()).arg(_lenTick)); else xml.tagE(QString("%1 sample=\"%2\" len=\"%3\"").arg(name).arg(frame()).arg(_lenFrame)); }
void KeyList::write(Xml& xml, const char* name) const { xml.stag(name); for (ciKeyList i = begin(); i != end(); ++i) { if (i->second.custom()) xml.tagE("key tick=\"%d\" custom=\"%d\"", i->first, i->second.customType()); else xml.tagE("key tick=\"%d\" idx=\"%d\"", i->first, i->second.accidentalType()); } xml.etag(); }
void Bend::write(Xml& xml) const { xml.stag("Bend"); foreach(const PitchValue& v, _points) { xml.tagE(QString("point time=\"%1\" pitch=\"%2\" vibrato=\"%3\"") .arg(v.time).arg(v.pitch).arg(v.vibrato)); }
void Groups::write(Xml& xml) const { xml.stag("Groups"); for (const GroupNode& n : *this) xml.tagE(QString("Node pos=\"%1\" action=\"%3\"") .arg(n.pos).arg(n.action)); xml.etag(); }
void StaffText::write(Xml& xml) const { if (!xml.canWrite(this)) return; xml.stag("StaffText"); foreach(ChannelActions s, _channelActions) { int channel = s.channel; foreach(QString name, s.midiActionNames) xml.tagE(QString("MidiAction channel=\"%1\" name=\"%2\"").arg(channel).arg(name)); }
void TremoloBar::write(Xml& xml) const { xml.stag("TremoloBar"); writeProperty(xml, P_ID::MAG); for (const PitchValue& v : _points) { xml.tagE(QString("point time=\"%1\" pitch=\"%2\" vibrato=\"%3\"") .arg(v.time).arg(v.pitch).arg(v.vibrato)); } xml.etag(); }
static void saveMeasureEvents(Xml& xml, Measure* m, int offset) { for (Segment* s = m->first(Segment::SegChordRest); s; s = s->next(Segment::SegChordRest)) { int tick = s->tick() + offset; int id = segs[(void*)s]; int time = lrint(m->score()->repeatList()->utick2utime(tick) * 1000); xml.tagE(QString("event elid=\"%1\" position=\"%2\"") .arg(id) .arg(time) ); } }
void Articulation::write(Xml& xml) const { xml.stag("Articulation"); if (!_channelName.isEmpty()) xml.tagE(QString("channel name=\"%1\"").arg(_channelName)); writeProperty(xml, P_DIRECTION); xml.tag("subtype", subtypeName()); if (_timeStretch != 1.0) xml.tag("timeStretch", _timeStretch); Element::writeProperties(xml); if (anchorStyle == PropertyStyle::UNSTYLED) xml.tag("anchor", int(_anchor)); xml.etag(); }
void Articulation::write(Xml& xml) const { if (!xml.canWrite(this)) return; xml.stag("Articulation"); if (!_channelName.isEmpty()) xml.tagE(QString("channel name=\"%1\"").arg(_channelName)); writeProperty(xml, P_ID::DIRECTION); xml.tag("subtype", Sym::id2name(_symId)); writeProperty(xml, P_ID::TIME_STRETCH); writeProperty(xml, P_ID::PLAY); writeProperty(xml, P_ID::ORNAMENT_STYLE); Element::writeProperties(xml); writeProperty(xml, P_ID::ARTICULATION_ANCHOR); xml.etag(); }
void Harmony::write(Xml& xml) const { if (!xml.canWrite(this)) return; xml.stag("Harmony"); if (_leftParen) xml.tagE("leftParen"); if (_rootTpc != Tpc::TPC_INVALID || _baseTpc != Tpc::TPC_INVALID) { int rRootTpc = _rootTpc; int rBaseTpc = _baseTpc; if (staff()) { const Interval& interval = staff()->part()->instr()->transpose(); if (xml.clipboardmode && !score()->styleB(StyleIdx::concertPitch) && interval.chromatic) { rRootTpc = transposeTpc(_rootTpc, interval, false); rBaseTpc = transposeTpc(_baseTpc, interval, false); } } if (rRootTpc != Tpc::TPC_INVALID) xml.tag("root", rRootTpc); if (_id > 0) xml.tag("extension", _id); if (_textName != "") xml.tag("name", _textName); if (rBaseTpc != Tpc::TPC_INVALID) xml.tag("base", rBaseTpc); foreach(const HDegree& hd, _degreeList) { HDegreeType tp = hd.type(); if (tp == HDegreeType::ADD || tp == HDegreeType::ALTER || tp == HDegreeType::SUBTRACT) { xml.stag("degree"); xml.tag("degree-value", hd.value()); xml.tag("degree-alter", hd.alter()); switch (tp) { case HDegreeType::ADD: xml.tag("degree-type", "add"); break; case HDegreeType::ALTER: xml.tag("degree-type", "alter"); break; case HDegreeType::SUBTRACT: xml.tag("degree-type", "subtract"); break; default: break; } xml.etag(); } }
void ChordLine::write(Xml& xml) const { xml.stag(name()); xml.tag("subtype", _chordLineType); Element::writeProperties(xml); if (modified) { int n = path.elementCount(); xml.stag("Path"); for (int i = 0; i < n; ++i) { const QPainterPath::Element& e = path.elementAt(i); xml.tagE(QString("Element type=\"%1\" x=\"%2\" y=\"%3\"") .arg(int(e.type)).arg(e.x).arg(e.y)); } xml.etag(); } xml.etag(); }
void Articulation::write(Xml& xml) const { if (!xml.canWrite(this)) return; xml.stag("Articulation"); if (!_channelName.isEmpty()) xml.tagE(QString("channel name=\"%1\"").arg(_channelName)); writeProperty(xml, P_ID::DIRECTION); xml.tag("subtype", subtypeName()); if (_timeStretch != 1.0) xml.tag("timeStretch", _timeStretch); writeProperty(xml, P_ID::PLAY_ARTICULATION); writeProperty(xml, P_ID::ORNAMENT_STYLE); Element::writeProperties(xml); if (anchorStyle == PropertyStyle::UNSTYLED) xml.tag("anchor", int(_anchor)); xml.etag(); }
void Articulation::write(Xml& xml) const { xml.stag("Articulation"); if (!_channelName.isEmpty()) xml.tagE(QString("channel name=\"%1\"").arg(_channelName)); switch(_direction) { case MScore::UP: xml.tag("direction", QVariant("up")); break; case MScore::DOWN: xml.tag("direction", QVariant("down")); break; case MScore::AUTO: break; } xml.tag("subtype", subtypeName()); Element::writeProperties(xml); if (_anchor != score()->style()->articulationAnchor(subtype())) xml.tag("anchor", int(_anchor)); xml.etag(); }
void MidiCoreEvent::write(Xml& xml) const { switch(_type) { case ME_NOTEON: xml.tagE(QString("note-on channel=\"%1\" pitch=\"%2\" velo=\"%3\"") .arg(_channel).arg(_a).arg(_b)); break; case ME_NOTEOFF: xml.tagE(QString("note-off channel=\"%1\" pitch=\"%2\" velo=\"%3\"") .arg(_channel).arg(_a).arg(_b)); break; case ME_CONTROLLER: if (_a == CTRL_PROGRAM) { if (_channel == 0) { xml.tagE(QString("program value=\"%1\"").arg(_b)); } else { xml.tagE(QString("program channel=\"%1\" value=\"%2\"") .arg(channel()).arg(_b)); } } else { if (channel() == 0) { xml.tagE(QString("controller ctrl=\"%1\" value=\"%2\"") .arg(_a).arg(_b)); } else { xml.tagE(QString("controller channel=\"%1\" ctrl=\"%2\" value=\"%3\"") .arg(channel()).arg(_a).arg(_b)); } } break; default: qDebug("MidiCoreEvent::write: unknown type"); break; } }
void Score::write(Xml& xml, bool selectionOnly) { // if we have multi measure rests and some parts are hidden, // then some layout information is missing: // relayout with all parts set visible QList<Part*> hiddenParts; bool unhide = false; if (styleB(StyleIdx::createMultiMeasureRests)) { for (Part* part : _parts) { if (!part->show()) { if (!unhide) { startCmd(); unhide = true; } part->undoChangeProperty(P_ID::VISIBLE, true); hiddenParts.append(part); } } } if (unhide) { doLayout(); for (Part* p : hiddenParts) p->setShow(false); } xml.stag("Score"); switch(_layoutMode) { case LayoutMode::PAGE: case LayoutMode::FLOAT: case LayoutMode::SYSTEM: break; case LayoutMode::LINE: xml.tag("layoutMode", "line"); break; } #ifdef OMR if (_omr && xml.writeOmr) _omr->write(xml); #endif if (_showOmr && xml.writeOmr) xml.tag("showOmr", _showOmr); if (_audio && xml.writeOmr) { xml.tag("playMode", int(_playMode)); _audio->write(xml); } for (int i = 0; i < 32; ++i) { if (!_layerTags[i].isEmpty()) { xml.tag(QString("LayerTag id=\"%1\" tag=\"%2\"").arg(i).arg(_layerTags[i]), _layerTagComments[i]); } } int n = _layer.size(); for (int i = 1; i < n; ++i) { // dont save default variant const Layer& l = _layer[i]; xml.tagE(QString("Layer name=\"%1\" mask=\"%2\"").arg(l.name).arg(l.tags)); } xml.tag("currentLayer", _currentLayer); if (!MScore::testMode) _synthesizerState.write(xml); if (pageNumberOffset()) xml.tag("page-offset", pageNumberOffset()); xml.tag("Division", MScore::division); xml.curTrack = -1; _style.save(xml, true); // save only differences to buildin style xml.tag("showInvisible", _showInvisible); xml.tag("showUnprintable", _showUnprintable); xml.tag("showFrames", _showFrames); xml.tag("showMargins", _showPageborders); QMapIterator<QString, QString> i(_metaTags); while (i.hasNext()) { i.next(); if ((!MScore::testMode && !MScore::saveTemplateMode) || (i.key() != "platform" && i.key() != "creationDate")) xml.tag(QString("metaTag name=\"%1\"").arg(i.key().toHtmlEscaped()), i.value()); } if (!selectionOnly) { xml.stag("PageList"); foreach(Page* page, _pages) page->write(xml); xml.etag(); } xml.curTrack = 0; int staffStart; int staffEnd; MeasureBase* measureStart; MeasureBase* measureEnd; if (selectionOnly) { staffStart = _selection.staffStart(); staffEnd = _selection.staffEnd(); // make sure we select full parts Staff* sStaff = staff(staffStart); Part* sPart = sStaff->part(); Staff* eStaff = staff(staffEnd - 1); Part* ePart = eStaff->part(); staffStart = staffIdx(sPart); staffEnd = staffIdx(ePart) + ePart->nstaves(); measureStart = _selection.startSegment()->measure(); if (_selection.endSegment()) measureEnd = _selection.endSegment()->measure()->next(); else measureEnd = 0; } else { staffStart = 0; staffEnd = nstaves(); measureStart = first(); measureEnd = 0; } foreach(const Part* part, _parts) { if (!selectionOnly || ((staffIdx(part) >= staffStart) && (staffEnd >= staffIdx(part) + part->nstaves()))) part->write(xml); } xml.curTrack = 0; xml.trackDiff = -staffStart * VOICES; if (measureStart) { for (int staffIdx = staffStart; staffIdx < staffEnd; ++staffIdx) { xml.stag(QString("Staff id=\"%1\"").arg(staffIdx + 1 - staffStart)); xml.curTick = measureStart->tick(); xml.tickDiff = xml.curTick; xml.curTrack = staffIdx * VOICES; bool writeSystemElements = staffIdx == staffStart; for (MeasureBase* m = measureStart; m != measureEnd; m = m->next()) writeMeasure(xml, m, staffIdx, writeSystemElements); xml.etag(); } } xml.curTrack = -1; if (!selectionOnly) { for (const Excerpt* excerpt : _excerpts) { if (excerpt->partScore() != this) excerpt->partScore()->write(xml, false); // recursion } } if (parentScore()) xml.tag("name", name()); xml.etag(); if (unhide) { endCmd(); undo()->undo(); endUndoRedo(); } }
void Event::write(Xml& xml) const { switch(_type) { case ME_NOTE: xml.tagE(QString("note tick=\"%1\" channel=\"%2\" len=\"%3\" pitch=\"%4\" velo=\"%5\"") .arg(_ontime).arg(_channel).arg(_duration).arg(_a).arg(_b)); break; case ME_NOTEON: xml.tagE(QString("note-on tick=\"%1\" channel=\"%2\" pitch=\"%3\" velo=\"%4\"") .arg(_ontime).arg(_channel).arg(_a).arg(_b)); break; case ME_NOTEOFF: xml.tagE(QString("note-off tick=\"%1\" channel=\"%2\" pitch=\"%3\" velo=\"%4\"") .arg(_ontime).arg(_channel).arg(_a).arg(_b)); break; case ME_CONTROLLER: if (_a == CTRL_PROGRAM) { if ((_ontime == -1) && (_channel == 0)) { xml.tagE(QString("program value=\"%1\"").arg(_b)); } else { xml.tagE(QString("program tick=\"%1\" channel=\"%2\" value=\"%3\"") .arg(ontime()).arg(channel()).arg(_b)); } } else { if ((ontime() == -1) && (channel() == 0)) { xml.tagE(QString("controller ctrl=\"%1\" value=\"%2\"") .arg(_a).arg(_b)); } else { xml.tagE(QString("controller tick=\"%1\" channel=\"%2\" ctrl=\"%3\" value=\"%4\"") .arg(ontime()).arg(channel()).arg(_a).arg(_b)); } } break; case ME_SYSEX: xml.stag(QString("sysex tick=\"%1\" len=\"%2\"").arg(ontime()).arg(_len)); xml.dump(_len, _edata); xml.etag(); break; case ME_META: switch(metaType()) { case META_TRACK_NAME: xml.tag(QString("TrackName tick=\"%1\"").arg(ontime()), QString((char*)(edata()))); break; case META_LYRIC: xml.tag(QString("Lyric tick=\"%1\"").arg(ontime()), QString((char*)(edata()))); break; case META_KEY_SIGNATURE: { const char* keyTable[] = { "Ces", "Ges", "Des", "As", "Es", "Bes", "F", "C", "G", "D", "A", "E", "B", "Fis", "Cis" }; int key = (char)(_edata[0]) + 7; if (key < 0 || key > 14) { qDebug("bad key signature %d", key); key = 0; } QString sex(_edata[1] ? "Minor" : "Major"); QString keyName(keyTable[key]); xml.tag(QString("Key tick=\"%1\" key=\"%2\" sex=\"%3\"").arg(ontime()).arg(_edata[0]).arg(_edata[1]), QString("%1 %2").arg(keyName).arg(sex)); } break; case META_TIME_SIGNATURE: xml.tagE(QString("TimeSig tick=\"%1\" num=\"%2\" denom=\"%3\" metro=\"%4\" quarter=\"%5\"") .arg(ontime()) .arg(int(_edata[0])) .arg(int(_edata[1])) .arg(int(_edata[2])) .arg(int(_edata[3]))); break; case META_TEMPO: { unsigned tempo = _edata[2] + (_edata[1] << 8) + (_edata[0] << 16); xml.tagE(QString("Tempo tick=\"%1\" value=\"%2\"").arg(ontime()).arg(tempo)); } break; default: xml.stag(QString("Meta tick=\"%1\" type=\"%2\" len=\"%3\" name=\"%4\"") .arg(ontime()).arg(metaType()).arg(_len).arg(midiMetaName(metaType()))); xml.dump(_len, _edata); xml.etag(); break; } break; } }
void ChordRest::writeProperties(Xml& xml) const { DurationElement::writeProperties(xml); // // Beam::Mode default: // REST - Beam::Mode::NONE // CHORD - Beam::Mode::AUTO // if ((type() == Element::Type::REST && _beamMode != Beam::Mode::NONE) || (type() == Element::Type::CHORD && _beamMode != Beam::Mode::AUTO)) { QString s; switch(_beamMode) { case Beam::Mode::AUTO: s = "auto"; break; case Beam::Mode::BEGIN: s = "begin"; break; case Beam::Mode::MID: s = "mid"; break; case Beam::Mode::END: s = "end"; break; case Beam::Mode::NONE: s = "no"; break; case Beam::Mode::BEGIN32: s = "begin32"; break; case Beam::Mode::BEGIN64: s = "begin64"; break; case Beam::Mode::INVALID: s = "?"; break; } xml.tag("BeamMode", s); } writeProperty(xml, P_ID::SMALL); if (actualDurationType().dots()) xml.tag("dots", actualDurationType().dots()); writeProperty(xml, P_ID::STAFF_MOVE); if (actualDurationType().isValid()) xml.tag("durationType", actualDurationType().name()); if (!duration().isZero() && (!actualDurationType().fraction().isValid() || (actualDurationType().fraction() != duration()))) xml.fTag("duration", duration()); foreach(const Articulation* a, _articulations) a->write(xml); #ifndef NDEBUG if (_beam && (MScore::testMode || !_beam->generated())) xml.tag("Beam", _beam->id()); #else if (_beam && !_beam->generated()) xml.tag("Beam", _beam->id()); #endif foreach(Lyrics* lyrics, _lyricsList) { if (lyrics) lyrics->write(xml); } if (!isGrace()) { Fraction t(globalDuration()); if (staff()) t *= staff()->timeStretch(xml.curTick); xml.curTick += t.ticks(); } for (auto i : score()->spanner()) { // TODO: dont search whole list Spanner* s = i.second; if (s->generated() || s->type() != Element::Type::SLUR || !xml.canWrite(s)) continue; if (s->startElement() == this) { int id = xml.spannerId(s); xml.tagE(QString("Slur type=\"start\" id=\"%1\"").arg(id)); } else if (s->endElement() == this) { int id = xml.spannerId(s); xml.tagE(QString("Slur type=\"stop\" id=\"%1\"").arg(id)); } } }