From b9ca2856877b073a86cd25c276aa414b75da71c9 Mon Sep 17 00:00:00 2001 From: Paul Overell Date: Tue, 1 Mar 2022 15:29:45 +0000 Subject: [PATCH 001/151] Fix midi if note to be played is already sounding, end it first. --- src/note.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/note.cpp b/src/note.cpp index ab9f4be2fe..a699200d34 100644 --- a/src/note.cpp +++ b/src/note.cpp @@ -1472,8 +1472,9 @@ int Note::GenerateMIDI(FunctorParams *functorParams) params->m_heldNotes[course - 1].m_stopTime = startTime; // stop now // end all previously held notes that have reached their stoptime + // or if the new pitch is already sounding, on any course for (auto &held : params->m_heldNotes) { - if (held.m_pitch > 0 && held.m_stopTime <= startTime) { + if (held.m_pitch > 0 && (held.m_stopTime <= startTime || held.m_pitch == pitch)) { params->m_midiFile->addNoteOff(params->m_midiTrack, held.m_stopTime * tpq, channel, held.m_pitch); held.m_pitch = 0; held.m_stopTime = 0; From 9e63d670fe525f79c26603988b2e0378dbd83928 Mon Sep 17 00:00:00 2001 From: Klaus Rettinghaus Date: Wed, 26 Apr 2023 16:08:03 +0200 Subject: [PATCH 002/151] add text enclosure to mNum --- src/view_page.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/view_page.cpp b/src/view_page.cpp index f059b512ae..7aa1cafff3 100644 --- a/src/view_page.cpp +++ b/src/view_page.cpp @@ -1181,6 +1181,7 @@ void View::DrawMNum(DeviceContext *dc, MNum *mnum, Measure *measure, int yOffset // HARDCODED // we set mNum to a fixed height above the system and make it a bit smaller than other text + params.m_enclosedRend.clear(); params.m_x = staff->GetDrawingX(); params.m_y = staff->GetDrawingY() + yOffset; if (mnum->HasFontsize()) { @@ -1208,6 +1209,9 @@ void View::DrawMNum(DeviceContext *dc, MNum *mnum, Measure *measure, int yOffset dc->EndText(); dc->ResetFont(); + dc->ResetBrush(); + + this->DrawTextEnclosure(dc, params, staff->m_drawingStaffSize); dc->EndGraphic(mnum, this); } From 4ee97e43f2b5a7118d9f27d9e46e0a8452c8261b Mon Sep 17 00:00:00 2001 From: David Bauer Date: Wed, 26 Apr 2023 21:25:16 +0200 Subject: [PATCH 003/151] Add FloatingPositioner to mNum --- include/vrv/view.h | 2 +- src/view_page.cpp | 9 ++++++--- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/include/vrv/view.h b/include/vrv/view.h index 33aaa2a718..575b918c40 100644 --- a/include/vrv/view.h +++ b/include/vrv/view.h @@ -227,7 +227,7 @@ class View { void DrawLedgerLines(DeviceContext *dc, Staff *staff, const ArrayOfLedgerLines &lines, bool below, bool cueSize); void DrawMeasure(DeviceContext *dc, Measure *measure, System *system); void DrawMeterSigGrp(DeviceContext *dc, Layer *layer, Staff *staff); - void DrawMNum(DeviceContext *dc, MNum *mnum, Measure *measure, int yOffset); + void DrawMNum(DeviceContext *dc, MNum *mnum, Measure *measure, System *system, int yOffset); void DrawStaff(DeviceContext *dc, Staff *staff, Measure *measure, System *system); void DrawStaffLines(DeviceContext *dc, Staff *staff, Measure *measure, System *system); void DrawLayer(DeviceContext *dc, Layer *layer, Staff *staff, Measure *measure); diff --git a/src/view_page.cpp b/src/view_page.cpp index 7aa1cafff3..25727abe49 100644 --- a/src/view_page.cpp +++ b/src/view_page.cpp @@ -1080,7 +1080,7 @@ void View::DrawMeasure(DeviceContext *dc, Measure *measure, System *system) } // hardcoded offset for the mNum based on the lyric font size const int yOffset = m_doc->GetDrawingLyricFont(60)->GetPointSize(); - this->DrawMNum(dc, mnum, measure, std::max(symbolOffset, yOffset)); + this->DrawMNum(dc, mnum, measure, system, std::max(symbolOffset, yOffset)); } } } @@ -1156,7 +1156,7 @@ void View::DrawMeterSigGrp(DeviceContext *dc, Layer *layer, Staff *staff) dc->EndGraphic(meterSigGrp, this); } -void View::DrawMNum(DeviceContext *dc, MNum *mnum, Measure *measure, int yOffset) +void View::DrawMNum(DeviceContext *dc, MNum *mnum, Measure *measure, System *system, int yOffset) { assert(dc); assert(measure); @@ -1164,6 +1164,10 @@ void View::DrawMNum(DeviceContext *dc, MNum *mnum, Measure *measure, int yOffset Staff *staff = measure->GetTopVisibleStaff(); if (staff) { + // Only one FloatingPositioner on the top (visible) staff + if (!system->SetCurrentFloatingPositioner(staff->GetN(), mnum, staff, staff)) { + return; + } dc->StartGraphic(mnum, "", mnum->GetID()); @@ -1181,7 +1185,6 @@ void View::DrawMNum(DeviceContext *dc, MNum *mnum, Measure *measure, int yOffset // HARDCODED // we set mNum to a fixed height above the system and make it a bit smaller than other text - params.m_enclosedRend.clear(); params.m_x = staff->GetDrawingX(); params.m_y = staff->GetDrawingY() + yOffset; if (mnum->HasFontsize()) { From a6ed66347457d6f39315251ca88675592e810148 Mon Sep 17 00:00:00 2001 From: Laurent Pugin Date: Fri, 28 Apr 2023 08:14:26 +0200 Subject: [PATCH 004/151] Add DC::m_pushBack flag, setter and resetter --- include/vrv/devicecontext.h | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/include/vrv/devicecontext.h b/include/vrv/devicecontext.h index a965384200..e7a2323c4a 100644 --- a/include/vrv/devicecontext.h +++ b/include/vrv/devicecontext.h @@ -73,6 +73,7 @@ class DeviceContext { m_userScaleY = 1.0; m_baseWidth = 0; m_baseHeight = 0; + m_pushBack = false; } DeviceContext(ClassId classId) { @@ -87,6 +88,7 @@ class DeviceContext { m_userScaleY = 1.0; m_baseWidth = 0; m_baseHeight = 0; + m_pushBack = false; } virtual ~DeviceContext(){}; ClassId GetClassId() const { return m_classId; } @@ -139,9 +141,11 @@ class DeviceContext { void SetPen( int colour, int width, int style, int dashLength = 0, int gapLength = 0, int lineCap = 0, int lineJoin = 0); void SetFont(FontInfo *font); + void SetPushBack() { m_pushBack = true; } void ResetBrush(); void ResetPen(); void ResetFont(); + void ResetPushBack() { m_pushBack = false; } virtual void SetBackground(int colour, int style = AxSOLID) = 0; virtual void SetBackgroundImage(void *image, double opacity = 1.0) = 0; virtual void SetBackgroundMode(int mode) = 0; @@ -353,6 +357,9 @@ class DeviceContext { /** stores the scale as requested by the used */ double m_userScaleX; double m_userScaleY; + + /** push back mode */ + bool m_pushBack; }; } // namespace vrv From 980a2e6be6d3085583dd199bcf015ba50d2588ae Mon Sep 17 00:00:00 2001 From: Laurent Pugin Date: Fri, 28 Apr 2023 08:15:08 +0200 Subject: [PATCH 005/151] Rename SVGDeviceContext::AppendChild to AddChild --- include/vrv/svgdevicecontext.h | 2 +- src/svgdevicecontext.cpp | 28 ++++++++++++++-------------- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/include/vrv/svgdevicecontext.h b/include/vrv/svgdevicecontext.h index 43972ae115..f0929facb6 100644 --- a/include/vrv/svgdevicecontext.h +++ b/include/vrv/svgdevicecontext.h @@ -288,7 +288,7 @@ class SvgDeviceContext : public DeviceContext { std::string GetColour(int colour); - pugi::xml_node AppendChild(std::string name); + pugi::xml_node AddChild(std::string name); /** * Transform pen properties into stroke attributes diff --git a/src/svgdevicecontext.cpp b/src/svgdevicecontext.cpp index d8385f4add..13205feeef 100644 --- a/src/svgdevicecontext.cpp +++ b/src/svgdevicecontext.cpp @@ -332,7 +332,7 @@ void SvgDeviceContext::StartCustomGraphic(std::string name, std::string gClass, void SvgDeviceContext::StartTextGraphic(Object *object, std::string gClass, std::string gId) { - m_currentNode = AppendChild("tspan"); + m_currentNode = AddChild("tspan"); m_svgNodeStack.push_back(m_currentNode); AppendIdAndClass(gId, object->GetClassName(), gClass); AppendAdditionalAttributes(object); @@ -536,7 +536,7 @@ Point SvgDeviceContext::GetLogicalOrigin() return Point(m_originX, m_originY); } -pugi::xml_node SvgDeviceContext::AppendChild(std::string name) +pugi::xml_node SvgDeviceContext::AddChild(std::string name) { pugi::xml_node g = m_currentNode.child("g"); return (g) ? m_currentNode.insert_child_before(name.c_str(), g) : m_currentNode.append_child(name.c_str()); @@ -576,7 +576,7 @@ void SvgDeviceContext::AppendStrokeDashArray(pugi::xml_node node, const Pen &pen // Drawing methods void SvgDeviceContext::DrawQuadBezierPath(Point bezier[3]) { - pugi::xml_node pathChild = AppendChild("path"); + pugi::xml_node pathChild = AddChild("path"); pathChild.append_attribute("d") = StringFormat("M%d,%d Q%d,%d %d,%d", // Base string bezier[0].x, bezier[0].y, // M Command bezier[1].x, bezier[1].y, bezier[2].x, bezier[2].y) @@ -591,7 +591,7 @@ void SvgDeviceContext::DrawQuadBezierPath(Point bezier[3]) void SvgDeviceContext::DrawCubicBezierPath(Point bezier[4]) { - pugi::xml_node pathChild = AppendChild("path"); + pugi::xml_node pathChild = AddChild("path"); pathChild.append_attribute("d") = StringFormat("M%d,%d C%d,%d %d,%d %d,%d", // Base string bezier[0].x, bezier[0].y, // M Command bezier[1].x, bezier[1].y, bezier[2].x, bezier[2].y, bezier[3].x, bezier[3].y // Remaining bezier points. @@ -607,7 +607,7 @@ void SvgDeviceContext::DrawCubicBezierPath(Point bezier[4]) void SvgDeviceContext::DrawCubicBezierPathFilled(Point bezier1[4], Point bezier2[4]) { - pugi::xml_node pathChild = AppendChild("path"); + pugi::xml_node pathChild = AddChild("path"); pathChild.append_attribute("d") = StringFormat("M%d,%d C%d,%d %d,%d %d,%d C%d,%d %d,%d %d,%d", bezier1[0].x, bezier1[0].y, // M command bezier1[1].x, bezier1[1].y, bezier1[2].x, bezier1[2].y, bezier1[3].x, bezier1[3].y, // First bezier @@ -639,7 +639,7 @@ void SvgDeviceContext::DrawEllipse(int x, int y, int width, int height) int rh = height / 2; int rw = width / 2; - pugi::xml_node ellipseChild = AppendChild("ellipse"); + pugi::xml_node ellipseChild = AddChild("ellipse"); ellipseChild.append_attribute("cx") = x + rw; ellipseChild.append_attribute("cy") = y + rh; ellipseChild.append_attribute("rx") = rw; @@ -702,7 +702,7 @@ void SvgDeviceContext::DrawEllipticArc(int x, int y, int width, int height, doub int fSweep = (fabs(theta2 - theta1) > M_PI) ? 1 : 0; - pugi::xml_node pathChild = AppendChild("path"); + pugi::xml_node pathChild = AddChild("path"); pathChild.append_attribute("d") = StringFormat( "M%d %d A%d %d 0.0 %d %d %d %d", int(xs), int(ys), abs(int(rx)), abs(int(ry)), fArc, fSweep, int(xe), int(ye)) .c_str(); @@ -717,7 +717,7 @@ void SvgDeviceContext::DrawEllipticArc(int x, int y, int width, int height, doub void SvgDeviceContext::DrawLine(int x1, int y1, int x2, int y2) { - pugi::xml_node pathChild = AppendChild("path"); + pugi::xml_node pathChild = AddChild("path"); pathChild.append_attribute("d") = StringFormat("M%d %d L%d %d", x1, y1, x2, y2).c_str(); pathChild.append_attribute("stroke") = this->GetColour(m_penStack.top().GetColour()).c_str(); if (m_penStack.top().GetWidth() > 1) pathChild.append_attribute("stroke-width") = m_penStack.top().GetWidth(); @@ -730,7 +730,7 @@ void SvgDeviceContext::DrawPolyline(int n, Point points[], int xOffset, int yOff assert(m_penStack.size()); const Pen ¤tPen = m_penStack.top(); - pugi::xml_node polylineChild = AppendChild("polyline"); + pugi::xml_node polylineChild = AddChild("polyline"); if (currentPen.GetWidth() > 0) { polylineChild.append_attribute("stroke") = this->GetColour(currentPen.GetColour()).c_str(); @@ -763,7 +763,7 @@ void SvgDeviceContext::DrawPolygon(int n, Point points[], int xOffset, int yOffs const Pen ¤tPen = m_penStack.top(); const Brush ¤tBrush = m_brushStack.top(); - pugi::xml_node polygonChild = AppendChild("polygon"); + pugi::xml_node polygonChild = AddChild("polygon"); if (currentPen.GetWidth() > 0) { polygonChild.append_attribute("stroke") = this->GetColour(currentPen.GetColour()).c_str(); @@ -797,7 +797,7 @@ void SvgDeviceContext::DrawRectangle(int x, int y, int width, int height) void SvgDeviceContext::DrawRoundedRectangle(int x, int y, int width, int height, int radius) { - pugi::xml_node rectChild = AppendChild("rect"); + pugi::xml_node rectChild = AddChild("rect"); if (m_penStack.size()) { Pen currentPen = m_penStack.top(); @@ -930,7 +930,7 @@ void SvgDeviceContext::DrawText( = (m_currentNode.attribute("font-family")) ? m_currentNode.attribute("font-family").value() : ""; std::string fontFaceName = m_fontStack.top()->GetFaceName(); - pugi::xml_node textChild = AppendChild("tspan"); + pugi::xml_node textChild = AddChild("tspan"); // We still add @xml:space (No: this seems to create problems with Safari) // textChild.append_attribute("xml:space") = "preserve"; // Set the @font-family only if it is not the same as in the parent node @@ -1015,7 +1015,7 @@ void SvgDeviceContext::DrawMusicText(const std::u32string &text, int x, int y, b m_smuflGlyphs.insert(glyph); // Write the char in the SVG - pugi::xml_node useChild = AppendChild("use"); + pugi::xml_node useChild = AddChild("use"); useChild.append_attribute(hrefAttrib.c_str()) = StringFormat("#%s-%s", glyph->GetCodeStr().c_str(), m_glyphPostfixId.c_str()).c_str(); useChild.append_attribute("x") = x; @@ -1162,7 +1162,7 @@ void SvgDeviceContext::DrawSvgBoundingBoxRectangle(int x, int y, int width, int x -= width; } - pugi::xml_node rectChild = AppendChild("rect"); + pugi::xml_node rectChild = AddChild("rect"); rectChild.append_attribute("x") = x; rectChild.append_attribute("y") = y; rectChild.append_attribute("height") = height; From 15aeb8ac48dfd852f98ee0d8f0e9f9954ec3247a Mon Sep 17 00:00:00 2001 From: Laurent Pugin Date: Fri, 28 Apr 2023 08:21:30 +0200 Subject: [PATCH 006/151] Make m_pushBack protected and use it in AddChild --- include/vrv/devicecontext.h | 6 +++--- src/svgdevicecontext.cpp | 7 ++++++- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/include/vrv/devicecontext.h b/include/vrv/devicecontext.h index e7a2323c4a..75c5f88748 100644 --- a/include/vrv/devicecontext.h +++ b/include/vrv/devicecontext.h @@ -334,6 +334,9 @@ class DeviceContext { bool m_isDeactivatedX; bool m_isDeactivatedY; + /** push back mode */ + bool m_pushBack; + Zone *m_facsimile = NULL; private: @@ -357,9 +360,6 @@ class DeviceContext { /** stores the scale as requested by the used */ double m_userScaleX; double m_userScaleY; - - /** push back mode */ - bool m_pushBack; }; } // namespace vrv diff --git a/src/svgdevicecontext.cpp b/src/svgdevicecontext.cpp index 13205feeef..f25e186f02 100644 --- a/src/svgdevicecontext.cpp +++ b/src/svgdevicecontext.cpp @@ -539,7 +539,12 @@ Point SvgDeviceContext::GetLogicalOrigin() pugi::xml_node SvgDeviceContext::AddChild(std::string name) { pugi::xml_node g = m_currentNode.child("g"); - return (g) ? m_currentNode.insert_child_before(name.c_str(), g) : m_currentNode.append_child(name.c_str()); + if (g) { + return m_currentNode.insert_child_before(name.c_str(), g); + } + else { + return (m_pushBack) ? m_currentNode.prepend_child(name.c_str()) : m_currentNode.append_child(name.c_str()); + } } void SvgDeviceContext::AppendStrokeLineCap(pugi::xml_node node, const Pen &pen) From 851a94c73a1cf8c252e7b92deb57cb19167e2268 Mon Sep 17 00:00:00 2001 From: Laurent Pugin Date: Fri, 28 Apr 2023 08:25:27 +0200 Subject: [PATCH 007/151] Push back text enclosure --- src/view_control.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/view_control.cpp b/src/view_control.cpp index 890ad14810..91bc9d062b 100644 --- a/src/view_control.cpp +++ b/src/view_control.cpp @@ -2922,6 +2922,8 @@ void View::DrawTextEnclosure(DeviceContext *dc, const TextDrawingParams ¶ms, const int lineThickness = m_options->m_textEnclosureThickness.GetValue() * staffSize; const int margin = m_doc->GetDrawingUnit(staffSize); + dc->SetPushBack(); + for (const auto rend : params.m_enclosedRend) { int x1 = rend->GetContentLeft() - margin; int x2 = rend->GetContentRight() + margin; @@ -2945,6 +2947,8 @@ void View::DrawTextEnclosure(DeviceContext *dc, const TextDrawingParams ¶ms, this->DrawNotFilledEllipse(dc, x1, y1, x2, y2, lineThickness); } } + + dc->ResetPushBack(); } } // namespace vrv From d0d3809383eb2435e15b817b9297c38933209ffe Mon Sep 17 00:00:00 2001 From: Laurent Pugin Date: Tue, 2 May 2023 11:00:13 +0200 Subject: [PATCH 008/151] Check syl->GetStart() before accessing it --- src/view_element.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/view_element.cpp b/src/view_element.cpp index ddcf1f02cf..c963ed98ae 100644 --- a/src/view_element.cpp +++ b/src/view_element.cpp @@ -1707,7 +1707,7 @@ void View::DrawSyl(DeviceContext *dc, LayerElement *element, Layer *layer, Staff if (syl->HasFontstyle()) { currentFont.SetStyle(syl->GetFontstyle()); } - if (syl->GetStart()->GetDrawingCueSize()) { + if (syl->GetStart() && syl->GetStart()->GetDrawingCueSize()) { currentFont.SetPointSize(m_doc->GetCueSize(currentFont.GetPointSize())); } dc->SetFont(¤tFont); From 9fa3aacc89f174b0808a108ae62b332f44b5b4f7 Mon Sep 17 00:00:00 2001 From: Paul Overell Date: Tue, 2 May 2023 17:45:31 +0100 Subject: [PATCH 009/151] Use SMuFL glyphs for open 7th .. 10th courses. Partial fix of issue #2530 --- fonts/supported.xml | 8 ++++---- include/vrv/smufl.h | 6 +++++- src/note.cpp | 9 ++++++++- 3 files changed, 17 insertions(+), 6 deletions(-) diff --git a/fonts/supported.xml b/fonts/supported.xml index 553c85f41a..28a430260e 100644 --- a/fonts/supported.xml +++ b/fonts/supported.xml @@ -2828,10 +2828,10 @@ - - - - + + + + diff --git a/include/vrv/smufl.h b/include/vrv/smufl.h index 75a12ac254..13b0febe4a 100644 --- a/include/vrv/smufl.h +++ b/include/vrv/smufl.h @@ -541,6 +541,10 @@ enum { SMUFL_EBCA_luteFrenchFretL = 0xEBCA, SMUFL_EBCB_luteFrenchFretM = 0xEBCB, SMUFL_EBCC_luteFrenchFretN = 0xEBCC, + SMUFL_EBCD_luteFrench7thCourse = 0xEBCD, + SMUFL_EBCE_luteFrench8thCourse = 0xEBCE, + SMUFL_EBCF_luteFrench9thCourse = 0xEBCF, + SMUFL_EBD0_luteFrench10thCourse = 0xEBD0, SMUFL_EBE0_luteItalianFret0 = 0xEBE0, SMUFL_EBE1_luteItalianFret1 = 0xEBE1, SMUFL_EBE2_luteItalianFret2 = 0xEBE2, @@ -578,7 +582,7 @@ enum { }; /** The number of glyphs for verification **/ -#define SMUFL_COUNT 553 +#define SMUFL_COUNT 557 } // namespace vrv diff --git a/src/note.cpp b/src/note.cpp index 24755d7241..597493fcb3 100644 --- a/src/note.cpp +++ b/src/note.cpp @@ -297,8 +297,15 @@ std::u32string Note::GetTabFretString(data_NOTATIONTYPE notationType) const // Temporary kludge, use SMUFL_EBE4_luteItalianFret4 ... . fretStr.push_back(SMUFL_EBE4_luteItalianFret4 + course - 11); } + else if (course >= 7 && fret == 0) { + // SMUFL has glyphs for 7th to 10th open courses + static_assert(SMUFL_EBCE_luteFrench8thCourse == SMUFL_EBCD_luteFrench7thCourse + 1); + static_assert(SMUFL_EBCF_luteFrench9thCourse == SMUFL_EBCD_luteFrench7thCourse + 2); + static_assert(SMUFL_EBD0_luteFrench10thCourse == SMUFL_EBCD_luteFrench7thCourse + 3); + fretStr = SMUFL_EBCD_luteFrench7thCourse + course - 7; + } else { - // courses 8..10 use slashes followed by fret letter + // stopped courses 8..10 use slashes followed by fret letter if (course >= 8) { // TODO need SMUFL_xxxx_luteDiapasonSlash or 3 glyphs "/", "//", "///". // Temporary kludge, use SMUFL_E101_noteheadSlashHorizontalEnds, doesn't From bb52ec35775c234ba9b130c5f6cc790d8e08c8ad Mon Sep 17 00:00:00 2001 From: Laurent Pugin Date: Wed, 3 May 2023 07:09:13 +0200 Subject: [PATCH 010/151] Re-generate the fonts --- data/Bravura.css | 2 +- data/Bravura.xml | 16 ++++++++++++++++ data/Bravura/EBCD.xml | 1 + data/Bravura/EBCE.xml | 1 + data/Bravura/EBCF.xml | 1 + data/Bravura/EBD0.xml | 1 + data/Bravura/F44E.xml | 1 + data/Bravura/F44F.xml | 1 + data/Bravura/F450.xml | 1 + data/Bravura/F451.xml | 1 + data/Bravura/F452.xml | 1 + data/Bravura/F453.xml | 1 + data/Bravura/F454.xml | 1 + data/Bravura/F455.xml | 1 + data/Bravura/F456.xml | 1 + data/Bravura/F457.xml | 1 + data/Bravura/F458.xml | 1 + data/Bravura/F459.xml | 1 + data/Gootville.css | 2 +- data/Leipzig.css | 2 +- data/Leipzig.xml | 4 ++++ data/Leipzig/EBCD.xml | 1 + data/Leipzig/EBCE.xml | 1 + data/Leipzig/EBCF.xml | 1 + data/Leipzig/EBD0.xml | 1 + data/Leland.css | 2 +- data/Petaluma.css | 2 +- include/vrv/smufl.h | 5 ++++- 28 files changed, 49 insertions(+), 6 deletions(-) create mode 100644 data/Bravura/EBCD.xml create mode 100644 data/Bravura/EBCE.xml create mode 100644 data/Bravura/EBCF.xml create mode 100644 data/Bravura/EBD0.xml create mode 100644 data/Bravura/F44E.xml create mode 100644 data/Bravura/F44F.xml create mode 100644 data/Bravura/F450.xml create mode 100644 data/Bravura/F451.xml create mode 100644 data/Bravura/F452.xml create mode 100644 data/Bravura/F453.xml create mode 100644 data/Bravura/F454.xml create mode 100644 data/Bravura/F455.xml create mode 100644 data/Bravura/F456.xml create mode 100644 data/Bravura/F457.xml create mode 100644 data/Bravura/F458.xml create mode 100644 data/Bravura/F459.xml create mode 100644 data/Leipzig/EBCD.xml create mode 100644 data/Leipzig/EBCE.xml create mode 100644 data/Leipzig/EBCF.xml create mode 100644 data/Leipzig/EBD0.xml diff --git a/data/Bravura.css b/data/Bravura.css index c53ee3524e..d926021e68 100644 --- a/data/Bravura.css +++ b/data/Bravura.css @@ -1,6 +1,6 @@ @font-face { font-family: 'Bravura'; - src: url(data:application/font-woff2;charset=utf-8;base64,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) format('woff2'); + src: url(data:application/font-woff2;charset=utf-8;base64,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) format('woff2'); font-weight: normal; font-style: normal; } \ No newline at end of file diff --git a/data/Bravura.xml b/data/Bravura.xml index b872d005fa..90c1d9fa98 100644 --- a/data/Bravura.xml +++ b/data/Bravura.xml @@ -806,6 +806,10 @@ + + + + @@ -957,6 +961,18 @@ + + + + + + + + + + + + diff --git a/data/Bravura/EBCD.xml b/data/Bravura/EBCD.xml new file mode 100644 index 0000000000..2a874b8ed8 --- /dev/null +++ b/data/Bravura/EBCD.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/data/Bravura/EBCE.xml b/data/Bravura/EBCE.xml new file mode 100644 index 0000000000..78a9973085 --- /dev/null +++ b/data/Bravura/EBCE.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/data/Bravura/EBCF.xml b/data/Bravura/EBCF.xml new file mode 100644 index 0000000000..bd2aba9966 --- /dev/null +++ b/data/Bravura/EBCF.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/data/Bravura/EBD0.xml b/data/Bravura/EBD0.xml new file mode 100644 index 0000000000..8db4a3818c --- /dev/null +++ b/data/Bravura/EBD0.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/data/Bravura/F44E.xml b/data/Bravura/F44E.xml new file mode 100644 index 0000000000..1cbfe8ca5b --- /dev/null +++ b/data/Bravura/F44E.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/data/Bravura/F44F.xml b/data/Bravura/F44F.xml new file mode 100644 index 0000000000..9031cc5d1c --- /dev/null +++ b/data/Bravura/F44F.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/data/Bravura/F450.xml b/data/Bravura/F450.xml new file mode 100644 index 0000000000..99d5eacc45 --- /dev/null +++ b/data/Bravura/F450.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/data/Bravura/F451.xml b/data/Bravura/F451.xml new file mode 100644 index 0000000000..a4f7e20b59 --- /dev/null +++ b/data/Bravura/F451.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/data/Bravura/F452.xml b/data/Bravura/F452.xml new file mode 100644 index 0000000000..14afceeabe --- /dev/null +++ b/data/Bravura/F452.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/data/Bravura/F453.xml b/data/Bravura/F453.xml new file mode 100644 index 0000000000..a632d64066 --- /dev/null +++ b/data/Bravura/F453.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/data/Bravura/F454.xml b/data/Bravura/F454.xml new file mode 100644 index 0000000000..9640661393 --- /dev/null +++ b/data/Bravura/F454.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/data/Bravura/F455.xml b/data/Bravura/F455.xml new file mode 100644 index 0000000000..cfbf9d8b4f --- /dev/null +++ b/data/Bravura/F455.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/data/Bravura/F456.xml b/data/Bravura/F456.xml new file mode 100644 index 0000000000..01ce5bfe57 --- /dev/null +++ b/data/Bravura/F456.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/data/Bravura/F457.xml b/data/Bravura/F457.xml new file mode 100644 index 0000000000..810fcf2bd9 --- /dev/null +++ b/data/Bravura/F457.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/data/Bravura/F458.xml b/data/Bravura/F458.xml new file mode 100644 index 0000000000..65e835054a --- /dev/null +++ b/data/Bravura/F458.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/data/Bravura/F459.xml b/data/Bravura/F459.xml new file mode 100644 index 0000000000..1f6e78e9e2 --- /dev/null +++ b/data/Bravura/F459.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/data/Gootville.css b/data/Gootville.css index b14efec3d2..68ce50f6a2 100644 --- a/data/Gootville.css +++ b/data/Gootville.css @@ -1,6 +1,6 @@ @font-face { font-family: 'Gootville'; - src: url(data:application/font-woff2;charset=utf-8;base64,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) format('woff2'); + src: url(data:application/font-woff2;charset=utf-8;base64,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) format('woff2'); font-weight: normal; font-style: normal; } \ No newline at end of file diff --git a/data/Leipzig.css b/data/Leipzig.css index 0959068d4d..b83348e4fc 100644 --- a/data/Leipzig.css +++ b/data/Leipzig.css @@ -1,6 +1,6 @@ @font-face { font-family: 'Leipzig'; - src: url(data:application/font-woff2;charset=utf-8;base64,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) format('woff2'); + src: url(data:application/font-woff2;charset=utf-8;base64,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) format('woff2'); font-weight: normal; font-style: normal; } \ No newline at end of file diff --git a/data/Leipzig.xml b/data/Leipzig.xml index b7da288878..561598324b 100644 --- a/data/Leipzig.xml +++ b/data/Leipzig.xml @@ -585,6 +585,10 @@ + + + + diff --git a/data/Leipzig/EBCD.xml b/data/Leipzig/EBCD.xml new file mode 100644 index 0000000000..8619d5df01 --- /dev/null +++ b/data/Leipzig/EBCD.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/data/Leipzig/EBCE.xml b/data/Leipzig/EBCE.xml new file mode 100644 index 0000000000..22b56ab04c --- /dev/null +++ b/data/Leipzig/EBCE.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/data/Leipzig/EBCF.xml b/data/Leipzig/EBCF.xml new file mode 100644 index 0000000000..13a879ef7a --- /dev/null +++ b/data/Leipzig/EBCF.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/data/Leipzig/EBD0.xml b/data/Leipzig/EBD0.xml new file mode 100644 index 0000000000..0ef02b3e40 --- /dev/null +++ b/data/Leipzig/EBD0.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/data/Leland.css b/data/Leland.css index b655ef583a..35db26c5b3 100644 --- a/data/Leland.css +++ b/data/Leland.css @@ -1,6 +1,6 @@ @font-face { font-family: 'Leland'; - src: url(data:application/font-woff2;charset=utf-8;base64,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) format('woff2'); + src: url(data:application/font-woff2;charset=utf-8;base64,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) format('woff2'); font-weight: normal; font-style: normal; } \ No newline at end of file diff --git a/data/Petaluma.css b/data/Petaluma.css index 4a9640ec91..f0a19c2255 100644 --- a/data/Petaluma.css +++ b/data/Petaluma.css @@ -1,6 +1,6 @@ @font-face { font-family: 'Petaluma'; - src: url(data:application/font-woff2;charset=utf-8;base64,d09GMgABAAAAASO4AA0AAAACdfAAASNdAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP0ZGVE0cGh4GVgCOdBEIComMWIb4UwuQJAABNgIkA5AgBCAFgw8HqFpb4eJxQbx9j8TtIL5BLvxowXSbD3I7tnV+9CYXjGNWwMYBANkfLvv//6ykYwwBbIBiqf7VTzBykLkxBwuq5EFOLRtFr1SdnXHVOubVMzPXtXOmheBNmqopoEhvKym6iCKNT9P148QQcTbuFMVCD9OHbn9MdnI7h4n40hBcuMdDF3vZDeEVYbJBaj9WwR4OFFnS3ihhHCBAGeAG5gQG3b3W3vx/vCo+4D96S4be9al4ReAoq4BybE6NZOXkyRcshKMy256eModoOdvR9dvd29PcXXIa0YsYQe4uF5OLGARihIAHC1rMKkgpBdpCoS2UGlZoSxUqUAMqVIyq0fZr33Z4fm69n4v6i2Ysid4YFSsqRkQJEm0SiigWKmIm6p3VZ9VpnxXnWWc24+/X3iFWoQRN1giNmP2byLlhjVvHImMd/p+4+J23f6eflVAUR4FEUBZxFlFAeZNlElz/e3W9783vnuZ3myWQQBu0iJA2C6QNGfK598J3iKnoXJUuSo87964EcqicqX/+4Ldz36cIEg4C10QTPSobS+Gld/CjQ7TpAQ7+QyaTTciJxSOwAqEF8fel/W3LY0hAACpai+Q0vRdYBgbOybysvuKtUi05xY92/zMUKWuCRKUgckFCkXI2VOXK2KWsJ13zhaUAGmBxMp6kXPjGpThAJtP8r/U/dGXs3rk+Jmszs/Jc94uIQOLQtBESNEgkQiJ0fqxpX1W7bM/RiT/h9BCBYy/wwF6u0lV1fdJTgSGxig1h27ETuwPUaVaVFuH/bJb9ivxe1XP2oWGXe6QB84HN8RF0n1ZmjMdOpFRKq1mwIKCRllBrAEyi07FhrDCexKepO6qqLPqFyEfGFEoBNCrVNCpl7ElqdK8vv/68FCBlTbndf1b/sSh4cF7JeYAPwv/r0u+moD80s62gELiw0owivogcHuqnPGttyd7SKyC2Mt+r7v9/5lda+280o2JbSSxLspQCO410SiC0Imkw7ELgcju3dMhP8uv82rJjh4Sd6nRKgLTC2RW6pLmt/N77Xgj436+9Rt7z8d4AlTBIwsbW+Aq9EDq7+zq/BKwAXacKhapxAXQFYepIAsm4al0rOxHa96+5XhssoTBVDsFVuBpzeW83O7ebfCA4UFVAIb4iqBpNQpuci6729f/fytS0GkPqYLyCXqlsjiPK3oNszX1yRUnVff93V7//C6h+vxps/GoMe371UEA1OBpUgaSmusdattE+8rIumUJON7QBpGyBXrZIDp3JQeLjzNkehE7yPV9DZw4dZM5DT6zV6v1jd/euDS/lXfEkFsqr7B0mYhWPeDXxpLbgUTRCkygu7UshRIakoVqJRDyJpkSiRG3wfLpo/vrfuZGVJ4wnVyYhG2oIxa1kG1p2AgmBKxrn4ty6AMayU9r3si3VSnQN3JUxySKyTbDMKYv687Gu9/4mjtU25719iVahEIhd/JIclGNMrf1PfoyZ7iSNCgIKCvuO0Q5rM73Jop9XYdJ6zgSjBvPiGGpZ/t97bZMrX/pWxzm7S7IaEkiUAYYZWALoBPf/TtV8X/Xg8d/JwMkwBtFom7bISACA34VB2o1vE86m3CzAGHNCD9JtnZ8ftI2KwOCNKryFlQDDwwdwdor8ZF0zP5vX9xvnvpI4CxbYLgb3lWhg0j+HLgww8oBkeB0opUkjl5EMsIr1/Mku7vGv1HPd1dBQzep2hAt92k+//ctK3kxSm0k5lb23PunrTvntFzyvXmWvmqs56Azn6Yv7+P1lgSYLnCg98Q30Nfk/HAPJ3vEATJFIDkU0sqzC97+Dm3yLuqCbSkpUoA4bXOBlPm/8SQVmlLJ0Z3P+67XrT1WJRwdGNeunY5YNHwl8vPv4o0GfI3dPte/8x//Zm5+LXbsJvhI02RD7GzX6x6ZoTw9PiPy7dnOYEpjW6B206SVTNfzDl/7N96EQE+LMIFKaJkvEOnq3BXMO18PrCDnmnX2NG9zfvbj3AWeIAHApAFflFbzqgJvx3Ld6j9+zD44yAeMTnNqzIqDd5X6+PeY8vkAoEkuksi758OXHX4BAQYKFCGVgZAKAwiyD0YsKFyFSlGgxC6fLiBN/SN/SVf+47oabbrntjrvuue/BdCryYtF2h9PlwWCy2Dy+QCgSS6QyuYLsdUp/Y7HrpL6BoRHAzgm7sBt7sBf7sB8HcHD8Q3vvg48++ewLyZfwwzff/WgmgUgiU6g0OoPJYnO4vC0sPTnsiKOOOe6Ek0457YyzN3PlAoFQJJZs5W/nXQiHhYNHQERC1hhjY6KgYuPg4uETEBIRk5CyIWNLTkFJRU3Djj0Hjpw4cwGAZTK5Qqmqpq6hqQUAG3V09ZYrlKpq6hqaWto6unr6BhHPDds75cadBy3dRqhWY6Radeo1aNSkWYtWbdoD1JQlW45cefIVKFSkWIlSZcpVqFRlhGo1RqpVp16DRk2atTjltDMSJLJKkixFqjTpMjYqjC+ptx4YHIFEoTFYHJ5AJJEpVBqdwWSxOdzO6Hntoksuu+Kqccbr8EA15iAQGNKrY6w7Ovitjjm5n375bRgGUDAMIzAKYzAORrRpN8poY4w1zngdHjyCwBAoDI5AotAYrG93AOCue+7vfy+98tobb73rnL+dd3rjAi7KJeMyruAqrwGu48b/mpseeOiRfz32nyeeeua5F/730iuvvfHWO+998NEnn33x1Tff/fDTL7+tuGBIaBbD5uDk4ubh5cOXHx2CERTDCQaTxeZweXyBUCRWUlZRVZNI1TU0tXTo1KVbj159+g0YNBTPRowaMw4AgsAQKAweL0gUGoPF4QlEEplCpcXNVSfMWGVnYMlfD7tLRb3hbqPVz71+fvTPsv8n/Zv+evSKmAfJ3UIv3tbt31zUhp1wWdn+M26MBfV6dIhsvTAG0c/OINNKnTP89EAa1xBUgRyI8uUBnY6JOw3Ggg8kVHsK+biUUpwTHYiNEVJuxAobkiP2qz652TJoQkQKxi0LVuwv9TAjY4lmI2SdudWQuNURK2Z9nKkwSRzE3kV2PO4ZujN4FmvUN107sRLBcQNHRHExPlnwuA0/IcQCPam48MHaECg9zkSpQBRQ6Agn7Acy+46wFeWdeXgw4umP3q9J2Kd3PtPXPN1SVU7gFLwsrYQJnJ4+q+Zflg5/okiNuhBxHIaEuEGWpZynLc5aLudu0mgkEEaRbTcdpyU8InRXtbkfhxhHuEGcnAzJMolj8vvd1tFaRUdVPuQ/AAR4JREijxUvltCvV3YXY85Z9Fv0l4YmGdtnsvYOxlS0W0WM/cSYWRkQ3Y1izRfVTrnMzFUSp2wZ4ViKfpsWbJKxpRID2P9xlOH26IqVB1asXLhm2+xcvGf12JJ2+/FHJLqh86/+tyklWPsP6JT/TR34IXb+gXNvr4n0/b//5f84IrHV7VULVs1dgFc9jsd41bz2qtkFbfzdkvaKsRVjbUgbo6vm9s1bu3//BlWL0FC+UOruizUlIH5BWqQqVTiEDhf7xprNXtiBZ2Q4C+VlEGjLNKDuz6tyYVdBVvO7VQkU8AFUAJJ6TpELBe2cVigUlNNysSh/K0mnJOnbQrEoj8PFcBNcCj9L74Qu3lDjEvWbvKonRkIGRaNBhms8Ek7ox7YXpWYYUrzQJDzE6fgUX0fpRkVFB3QdBMcRlFT8A4KEPDUB06AteBfuqkMEu/HeOctwG+O5rl+OFQL9LmtJYw2mgdSIOMsWLOlbOG/urGUj1w9VbnqeMUF1zIHJOV8j5yzsEIvZDl+tIQ0i4Ey3b9u+01awbeiWs4FYNdnybeqKnZgIonoBwoEgRmy5lmHwM0CSIcQ6RYap6ziMWzNrhvJLWma9pTstff4atVtktUD02yRjXY1uY96ABg5v1JV1UFkPiHJSp2SewmCRnESQq/uBrmDwIAEiuE8DUIWKekLXKcBYjhxl0QgVW4bA82bnrJhf0YZrjFYRNeKGjxmoB43OUlpLMn+skOOoZ2zxwtmEd8cQlVjHXNANTWoOhk6cTI9ndWu/drpAWO3HWljN50GaF7Kh5lTZpo4uDEsI7ofcUEDFiBUEDKUSAVQpwYBCVF855TZXgGzFlAuGBwW4jThbN1DVMpQ4wqC5qjxFdsLtwQFfVM+tVr4xDRMHboepJHRULnyTw7JcyBVkCa7f8GzE47F3L2xZt+nj35MPn39Uduby49zrM3viIDg5B+FGUyj0MBJLZE2F24rqN7nthH6XB1DSZIc5QWBu6Fp36cbSnTefnNbSFOqn87wkhW14RRrcCtCNedKSpq5r9X6kX51W5D9NVrLLva0UpimE898xlMlBL1OgybL1q/Yu6uLNqsA9eO6BAMyZNXxmza2VmiljPeVT8hVWMTg1BLEJNwWlwhgwKLUF55YZcJMJ3jYF0jgPzmrni6MDEQFZVAiGBtJFa/mGDuOiUp3QAp884Q4hKpihg7uUvF0vs9mpAVxdfo87sGaq0bKCUdV8HEMEbEISVv09iXnd3s8BIkEt00IYdcHxWI3E5JM68xP2IBiUogEcIUqF2kNQn0EYLogAYW4xnxMHJ7TSCQLAHvxYUBaCzeGjlrml9OXa+RXLtnRB9gdVlTmiAg0hQXgBWidNvimt/V7gskJLQstVfD2WvkIjapoR4VIbXC61xMBLhNrum1dnyFsVOIBKbb+JVJEi3psYS/JfslL2+28VCkQQcMS7NZ+SMQCkPpPy9meNrTQiktHnDlceGsZeqjREqVDBVst2P6OxlXmrDxurQAy3ME+uCEgFyALFzJiFxKxAoFkcehs2XFSCQwubvZ7kFaHZgqnLKMbq8uHxhT38XYiQGcirxAEEkG6TUaC7WFilBunuGk3x5jV7yHPPShP/cRjbgskish3GSaxJJ7wOnB1xREogwk7Gq+modvu/dIQo3PtdGkG3el5vd3BHlurkrgvFN9ouB//r1BxxgsrvVVOTD7fr/2cAEKkphziy9at6x/MOh8rrFY6FKrq9mxA7mXvMESW0rBa1i2yU741bjYsEec03Sgyoga9nqOwmrCKJmSNScEbPsYRRFMBIco+k0b6hmel4Hdgg/kWBS+9P1XFcNU03MZzDMc0bJbgdMaSI8T7cacVZMfaQdFgijQk1LsK/BGw6h1VoCPeCJoVIEe533It5HXENMMV02pCATbqXPtNoUs01MKEaZ/OXq91u4ZDYfZs41tUtLaujQwwi20fbIOMPrTEjImoR4HC3m1DQQduTNwyaVKDtB0hlbnt9Bdmj32R2NU1xlrKnC4KTgoYzHROfZuvncnCB+2/Er8V/T42QusAewUJsrL426hY7ISKa4uiPdOAYcJyKLo+MwZWJ3kn2ItkGVZXzGteKP3IQg1Gb1VnCgyA+U3E8LaXqBfeH7glyQ8mVnYsJHxI2PAExK+6DJz+iG9D8P7nJX4hPeNxCcsChIS59WxIUqLSgklFVqQ3IASwwIVOh3IGIIJJdm0OfKc8iaoADQSEHXkssIuulJECgAUdfTHgmWJYR/yHbtMYFy/AwlFxQOiGzLrAd8CiSPXjoUHIrTL+YM6IV3TzqYAUoIuvSqknleMzYuk91eI1/Eg6NYI8jFoMlry7jiHQ00JQbzSgoezcxV9DRCLl7GiZmOMPrS+wdGsi30wDZnn8DR9fFZ9y3dA+vBwPJuMwrMfHYiAX1nwqCFUlFBFDWp+YvZuCsRJG+fvsQJ4dZexA285cUAib3A6C2lSv8VsJgilYIwkGB/3BlZvlfkGJw3kmk9w/mn3T8iHuVwRBHUKCbXVnqSmLJcFpWN05kfeAP5vSkxOfwk0wQpiImi3nBwlxAwvSQB/BWyw09qbCQbW8aOt5eCngCxPkJngt3J6yjZLExY18uuGkaUdry9pXJTYUA6w4aTGeY+e1FCoW2xK/bYiwVnNC5XZFDhNxID6YJtPNXmCeyFysie5Nu2Qzc1dNhmHKoM2tdHuQG8D3jfo+B1HL1HjXxHOKPWtQjdZ+1n3hlU7ku9ZSeKiAjb2Qo8LcrBc14ZQ1nDhLH4Ghc63gkug0ms/RcQUMREcg+6zonRxHHYxryq18iL+LoAAIs4P7K41vk9VyYfpqzqPVAaTHRrg3x5eCRTwkKXCgsNUwmAqLAAuLF/M6zUK6nn5Ir8pjUySlrcBv2FkVA0F6eROwMs+w7lr4011Rw8vGcvOMBcP3Bjv0tD7njn9dBkY157VWu1hl+xp4i1P7lPkHZ4+GKQ6bWxUYXAbvVr5PbVoGkYl4jybGEdArMZShhh+NN4LTVIWPO2N6vRASM5NY+7T8AP/cfIDeKR2QXhFeRZ3Gy99eiVLDnBxp3UEWXLxEnLSP5HXqgCwRFi3Jk6/2cjB9cZX0Gp8FVEmsKFJmRM3Y2p3On056JYCbpH3OyZzHKdiz61AigzT0Gt65YW9yp/TkDJEfDyygTdf44DjnsIbh/3uB8cVCVQ8ha4y5NA2sU7s5JQ/O34AeC6ZHHVPA2mAZIKbx/cCS8gjygew5VQ7mHumGCfNSfekSCWqB/OuQKfCILHpm7JnMWW4VhLHCJx6Wm3r7dXtwBBO4DssO+w4EVEdPYf43zdnWErDsMWBTfcH6ypwKuoUOQNYKqhlGNIHZ9qv7Y0tCV50h7lhEfVlamRxzRA1JVNJEnfiqAwKsiad+ld+04JBVqld3DhiHeAdYmiuxRgHKYMQ0J6lT4LZO9WTgbL6T+mdiF6sx7t93MuaB26ZgpAuI0oVY0PMmEfj4D0CCo/RARNtAPlFiqUBCN6dl3ADSABgNGuhBfa8Udatf20W925Je+li9IUQKw2xzSF+8ZETg7c8ixCcKaqyGflTriTuTzc+NJcPbtQzZfeGJIAV05AJXkSR+LWOKogTk7RGlB6mDJjr3Sc8hox6wd7Cg+Uyk2HTEzF9ZsTtDGggg8T4ucbzvSnQyMqpwDQsyre/UqIc3k0fSNHyVotKAqG7tYaWyB1YTgQk0kHUXglDaJXmfCUW3At7zN4Ypvg8trDnEnKkJYF5IcZSaALq5xRrLEvBPkFBK/OZSYjQKAOICjZ7AiI4BrVrg5by8zMZ/XQSoHD3YEDhLRZ5maD/TddTtAYjnN8jRIbns44nXG+UEyYq/qXqKs/ZbZHsin3BOByCp6ZGaKD7/7wos5Iv6gvgvJl2aZqdr/bFf1FaatMhG6855uQ9YyqL3Hp1wI3n/1txSwdIIh8tbqwgm4gxB4/0olexCNRs5ChBjjw9pUGOdhvA0QOrKDelNweXXwrrnAOrmSio2BCQOlwcYxnWMjdcBbLahBR4RUjxQxODF/k5QCvJV7bP6zMYOwtGK1Q/2soKmpN1mNwZIwuXHX73g1qooNt1Dydxn7gRHkY/ZqFuJvJrDK0O8QM/4OFvqhJ1ZxfEcFccd2XMh3+rzIOeol/0QK/2iO4HQfJUotkNd7ykJetheIekYC4I9ZS3mxvu7VKUs/YhBeR4mTJ0jyTxMfXvsHkbf8EhehxAE6G8n4pBy1PBEYrN7naAnIVUMHPGxpKZHaMeYkTo8ppeIHRnXgZWfULgGF7rpW6FWyB3HY0TIkCsOpoEpx1Hl3+F8ZuPC5FWfHbSrKihtwSlCkdG+LdtXj2aQb/9Kj+vlxRtamH35E95JbjuKroH1mzSEp7k4aHezR/c6H7+9z9MR84skGRIHguEaXjWPcwOXk2S0TAF18ZDbhqAtf13E6XWoEkcuf26BBv1RjviBTwDZFHPNsOvJm5T8KaacO0+aJy4du9bJYAozhwsVdf2W+c5J4ADUrEU0ufgbBAEOA2V+RIVMH2hl/iGluNVetpB+H/SXs6e39jfRw9Cgyft+e+v6MvJKBsga4Hfu94PqaFD9VkRlbQszQM/4P1u4x/xb7AwyU1T+ZiJhF0PkL6BQyP6MWG0IHaDj3/jhaTLusP5mX0zXpZ7/6BayhpMoMT0fUtltQWwOPUjGjEguE0U7SZ573r93GIg9qqF52VIbN6CwL8vTG72NIIcHdQhskZixGcD3EtFxRz7SiQF+d1DQ7tCpIbN2yjQuaGGKI8WXnNsPvPUp2mfdAuSs8Xxy1PT9a2sVbsVR/8li55B6sbu+b/GpmxOebpeO6YVjHl3J659Vl82vPmwnU6odIifIpAt31GnRc6x8i7jhzoHBD/bPeM0Lx48YiCC8oIhikY4B24JYz62L5dQ0YweyeEy5r+8V9lqXwXrtO36Tnn1zK68pTFqGYwyB8D5YRhK+fY5DzPnpoICNUGTCI5KDu2bEIKsQeroJVCi0o4hvcKjZc+iipXGUke34Abzj62hA1gO7WTyMACmEWz/5RIgVYbJowTeE2Bb9ukGaA09+DwzzWvcT2no8YbEqWhLyqUMcJixOj5RBmh5cZJP8KwxEu+SWBb0+RB0WCyVqrvuIOuANjdpeiodCwIMgN61DIS2hzcVYb6usAT5/z1hhS2IvyUSS78jbALF5AY6IghOzhkr/xQmOYLkbrvHerlkzHCGS15jwAVJDzWuq32a0qyqOCmGXx8BWW8KJ/XkRw67CGj1LcBPRcUyYiK/ML9xCOgjVvlobuqIp1VrDqkwg3nTREjU1nEIgc9KD1B0My4BDj+/CJQy5MYQ2Edihw98VvGkHFFiuvJcJm3hZfa3tOK9K23nvpHV8Z0tMH384rXl42AKwy2Yvkf2Ivqtmi6yG8IlHjcjOo+p21BlP0hPFYjGkNDg+HdND2FiUEPCsxttCc3CGVPdiY7fOx1C/XDlPlwZbNzUArjM1zlUzM7iTF20IeEzSAc2IwqAYQPIsWgb36uLt9TM/cgkIg0ihxMOMkmD/EBHWhmRrrJiDLMojpNDDaJIf1UlLUVtj/S9ZSssypajLj4JwY1rCcbjhajzRkCdzx0a8+AQDcna7CsroEkSMpS7kJ6i+VPKpEEWLhfMG2IxChlNGBy1D/AU0Luw1PgSPU8lEE9HnN52KXq3GN4kPO0FkcGeDJfPzUlWQC8frRlZzX1MAGSPPA0Z+SlXy4SDNHCBDxlh2r3lYNfqr+vy1xWIfPxTSateM8IbQfWidQv0NzRmjmwb4644YWLyaB+T4oP16f70mHXFOtCQi+38PNjYRWBDauW/NRT17/kK4DCA5jXSqkL9aNrIuW6LBBKFB9EbE31isH2osYgJN3M6njsYCyrJzD63s/iwW+N4EXBJ/ph1aquDNUqEjOZJSYeLs8PjYtgov2em7dnenMP+2hmAT9Roo4g2HICGrFdL3b4LEowoPLQm+sRIhTC5ruoeaJrocFPzs90w/0Z0Fiw5mtbUucoLjJ3Vxx2RIlBB4KFPIX/JW8waROyu5Jr+px1KkwMF//WQuMevgKXbZaXT/HcpFrNC6ko9mMg8NcUS6pXfUhfHwsHvEgzHmIDv5WUSCDcTx6RNu2ZPUezGA2eJzoRIl9Y6yqY9P4ro1xoUuEF3YhAh1eCQEff6/OAgCtcISPhOgTgpvpHx/SFN86ycZDkgt8xXkmPdjDuPFW6mJjdDVZ84m+doHE+Fk75HVtlLMVPbfhGX/T0rY0TD081yDxZnPJVB54KG91zIbfGfEyDd5+RXyovj1N9OFXmlfXUJc1dVEF5pSjcxZ/U9h2brzogzWemmGnd493cDOdj+UhiTvs9pdCibDEfJB/Z0d5GLqt8oOSw59eDjSOej1H/bCdSIRny+GBf+iulKv0piwV5GTeLjwKZDwJOIfnI/F4pVrCnzhJIK7K7rDUviaaAlX5707iacu4ab+/inSbv+310Md0vb0KKc+d9CJrFLIkXFpQ6lU4UjXOVRzRtNO78y2+FE9zceR2ePFXtE5LXjaAjwiQifFLzbysO66rspuVSnidmkl8WwpwViq8xLBx0ELo1Uiy28/yZvVJOkFTXw15D7oKDrjcVmllFQASEKzeLPuCatbZSIwGSV0L9yF9v8MXqIo67memTuTVz8lO6iXjTwLjeDmXeU/Od+k0rZRWPiYa4STuWbq0q5AM1cL8puwD6pk6l+J6mn2WRdgy4DVbvyo295FqcI4WuLqpesKz0b49BIWVK/6UWrzaCxrb2IECH0RZC4s443XBRxWT1gpaIhdHzhy26zo4BWdyNi+U0hajxVW007gz93e/IbWHesUofGdxdb+qgNJ0/cqiaYX26PwOODcGI1b6CTE+b0QkEMlR5gulNj1yiFhuYViJFJiQ+MtxQh9QU+vRQcdJXDz2ize08QkUx5o5rfftiyPakW85+qny2TkebPJADFNHtVT3ebyKQLHTU6OdlGDxL+hDw2L85nzH/1ve5jZu67dZ7FnaHUEwrbdjy26bQYsWoWv0ApcpCe63x1AZDBALpTC8tClGHjvpCCBX7rnJZY7HCWKnsacBz+6TPdMQOCmPj/tKgzISCn3TYtB3ZxDK2M4d//KuRNLsxm6keC3cPnexmlJlI8jmsDwUvrDwiwjKV87y73rlp3PA6wV8LXV1RKE6NnUc1sqXwyt/DbfVfLul49kqVaOOxyufm984AS6IAPnzQ2kTwKBogUnQD9NK93j1msL63lkY2DwCo1knm6DBhhd6tQgGfVizaiunXvmRLCnagmkFDhpyrzYUMaiNfxsvr13VgNXBebRVVPsr5/q/hG0I+2ANIcXUXHm+2Kg5eN99u6ggyXvwCpxSPuYzHzH8hxeC40hx6E/bhHmyS1vwVtNY3TCfe7VVZcSp467NxcuB6k00364jycfYhi1kqHfEAs9iXcbXcs+012z36ju/vJJ6v75xBF1loDGf9o4ubu0nrK6UthDJ7wiS99xELn2+vwZ+1s9C3BxzhLaSyPeOoQ+2Xav4wK6oKlm115ElCq74AvrP66x4DI9Lj5hz+SCObezBcCA2lhpCMIup14eILwVxIs7y5ls4xJ2dPzL3kIuNzChMcbH7ti99dNYKWAh9B/Y/9k/hMW9CEaoqNj9n4p9rJ3odMQi85cwDd44KKqNQko8PfXPhTjr0vP2Fl32FMTViO1Nj0aST76oDfJ2B0+3x7JwlvDKBLYRTGhL1RNuXUbQwAccC7s6rC4sErho+Ij3aehBTEcSulO1jV5EhB7LX2u2wkgFxm0AeZ1BWUneO65v2HcB7Hb7qs0nm15+/NqiM7fjLgMt6DjUVSrltMnPJjS/9of2u/1YS945wAPJ6nOor4hZEtlv2mEUtkiI8jp5UVIVVG5A7fSjum9IEfl6lcNtRxiIP85qaO+DYyw2b/hRJXPCNjxDY7mXMQISg3yGxsgex4TVnjjNoTk2q0aA7B5G8jgpe3EH+Tm1FEMdN34wPW7vJPlPouK18lAIawG1r4z7t3jwJ9LF5zJNGY1whHJ/DO+RrNEGBUQ97mkhh2Tc/OG4V/pijsTZXVy/0jrQcw3OWiXXjeRu4o7Zno3Fvj25exfBWwxVZXhER+5wbH823B5QSl96m26UpwQ9/1eD7RDyXMWOjCY4FyXHSfCpTYHchEKXpxbE7Jtu953eua8wT5angsqbRr/OnyHeH6rKvymVNLbhDuTRPhxBy57zmd4hAwgeO4os4TWDnqMEgSodLZ11GYFwp51Uk+QUTLSHUVIE1JGjq7YAj9k/ntJxCux2D/9HgycTLhrRM081KrssiAtsDr4Sc3Tmc/R5cAknOpcKh5HRfKTjzWQQ3Qfu3TqzNOK/exMtIL+iFIpRBnJWYVAF8XdOU9jbJ2MjV1stG5t5qCwYxEz4UgYjmrsFZ9QdVv5ZuITewNYE3yKreHSfDs+VWHFllXdAYU/OWtXAg6utWx7WeAwD8aX7zOeHlvGNP/sLkab0Rz8LHoc+tEs1bvVjjIJ4bOBtwiP4IqCcutZ7rOIeiaqVIcFPuOcR/+SdNELv3fS0245PlNUUMP7uvVhOIvdorh/hKAiBZuRzoO/hrZ9Pvoj+vTM3cmjtOKxKTp35zm46PuOxsj590HBI7MP0hXjndmuKFNlUVVqtqn9rAeEEIwsgI5VaJX6F3JDj7R3Iazi1nU8HAjQpIQUg2tyAA/J4ESZHauPDQL7EF/VY7uuBKKAWgFoWinpz6VrmvlSmrmU3YTknoZOw+mwiKDVwajn4KHfoTAPWOGCOdyMaApiLUsJwGVLuSg/G/Ye0Zpqc4teDkjT91kv6kdGHgPCg2Os3iVDXCvG44C1GqTyWuABxtcPexZyk9LeAbSEcAER0qF6lzDoyi02VYIQhn4a7YVJcpAb0O5Fo6YLs0bRAP8zN7YuwesN5/vjcB9O53oWB9epkLVUb6dxVcnGoDsVyNNEY5vVq8vuatqZ5mPKWmONn3ZtrrHUlvKwQ3a7JmLF8xazUYN6k4fAZjQ27EYuXi6633bEo8vHEQt5Iaouf5WZZjJISqXhPUuYwxc87RrZ0rKMyUZzyAYLSc/BwKQkZvRFRYstNVjYtDQnPWuhdcBE1dHEPW2oCTNB/htoWliYqKtHpRgs7OwynWW7aNXvJkFTzp4PYQpMxxbFzsEZaXDjVo7inIsrl6YBfIhq8dJVFh2pjKhEUrqFwOCIDhrI6IlRMu8Ll4e9mDOL39MVvw9/oYA7bXmGjTG56jhqeANUw24ZVeFxXYaAzMZO3TCrcrjC+TKGraVz9zuGlFHOgUhs+9hBSEDWNHh4Iz+TpATucmo0jfszHlnDYCGvMuzT1KmhhXUHekQUyKzunX6Xgw7g+O8gCa5ImHp1DgFPL6NQAZ5AMBteclMUAhmNJRKrksrsCm9FPkMTYqlItZD3MbZzUyev0I5lWuh6Bj2mtg2c1OCBf8bo1Pcuo+LJWF9ebIm9Wg9doQoKqCAx3ySK/Ef5wD2GBiNCq1sMdVtN2KMz00iRgxQpqvOdY5ZZndXlVxVK2VvS9BwBxFDUZ7ONuo4ZQp9ISiXrXPt4mqdG5sx5DEbJbES1TCql4aGw8WCIXVJy1NklRtrwYzSQ5uq4dKfiVyUJFRBTKnG85fqM0GtBSk0fqCimTcevWzb1wWoQ/7A1efaFIW/L9uCAdIb4ZXYxzXi/5jQrooat+V1/DM9Q5OHPBXnVXaxD5MTvEMw+OGgtyy6sOkJwOBpZR1S2pfzsDB3ZxPimilLq02kWJ2BM66saCqsOb9njwWmxN8V3LrtR+IQRVCKT4fvpGI9BudWDVA1Bshb0xWztOju6bcz4QcSsdELCH5VaPzFr3fIkh7GtA/Lz3vjHs+X+5LxdzbIbuvp/SiH/l9YlU5dLOyt7GPeJIp3eSHMV+YbyUzxfEutVNNhat47ivASyi72eoQap89gs3zPHGkl2gzepPB/c60aU/b/RQX0vYtTNEMODzbbWFikxJGDYGrboF4+/C7NHCvb+haxmAQF7bfMDs2nQKG/ITVTCBGN3poC8LIxoMst1ySgM1selZlDXdtPkxExSvXYZn+g6Sgk5gzbU5bGC6S2pQzk+b1jieVLzXFsz4voD3nJY2WM2d6L4jZCIusu+A9l8RXabYTXdeYfuWloKH1lT+mLf4N1+0I21RAf5wZdjgUcIXJ80nIDNovrOfj/C9R8G68cPh6E0oW9PUNonCn0+T7i2korfGLJqNm+zynb2znHekEoabPreZNpUkxEOOqdr8ghMl7Bos8gkPz0qQKPlNNprxkVPPQ+fltwP9QDBSpvKu8ox4jaH8ZvcPN2Iw+WV5F5ZZjZUrJPuPy3aWUvlND5hrRX01ryt1pZvx5Za4+M4dnlq4373Db5Ug21/c79kB8mfQAjQ5kP8anxaavysDFJn6Hq5rWOPcNaj1+YB9WZ7w9XuZQh8mcPpxuvlmVUR1su4ZTLPQAOu3n/VeEUQSI9YhTFxKn1Vzy1obPpBmLAZp08SbjV1pSUX9ucGfrtCb7Jt2tXjfh/weVk6rlunIa7/LdrfPfbTs2PC7xdIInHmpBaH8VbhUkmBwKKW0zNkWR5hZEiUVJC5faQUlPxxIE+dbwwihZzrDnBkIQQMHF8lPBYuqpGpsZeRogInt+gVbln0Js0q/TR/DpCnaNCjdR4moRYdAG076TkQvnf+QSwr/zEJAXOgqpkJG2i3uqNIY5/GjoD0+8lynRAzH4wpgHvQ06gto2c9shhzgaqIZmFBI3rjW+rQzczIZZ0aN5FUhf9RTZuXBKB3ip/pYNEuMX4VVGE0Cq+95NiVNXYwilhHm9bLssuiJBcI/3itOU3FH7PT7mgAYx0P2tFDXVZITuVV00wAh4h98qDd87d/oFYg5c6WbWAK1zGnBKEtPUHNIhgZkMoslGpRhZJ6JpRGttQbG409rXD4ne92u7CuUfSuE+/pxqRCRcgCV0R3OUHfNdfD7G5DOkyy0mz/f5MJLjxZxcbOch1EX4I6+H+3d+QRWU17Mj/JIwUkA9KV5H1F4pvoA4GE2zCr0S7p+u6B+Tw672cp/UMDK3s39qsAzENe7eLn1fGZ++qHBkoeDZjUhTMQDf7YOjrggoaWHqRPGxwBECzLAruCl+jyPghl35Rj/yvtAhr2Lh2I13O4q/uYElY3SqDc5WHRnfmeev/at75rzLf/Eija8TXkRypIPA3XwtZuVortIIchSSK2skq0MApy7hksKGD2ZVMa3vwCgQzQNOvO4N4sOcENSNbHam1Bprt1ZzTdhCXsDZyrHAX5CQndglypGS7ejtLE2hHapmhLPMW3/qc6ZebWUQdnYkH9m5VILqhzSbvAq5mXsY15cqzlREBcLZj8MrU3OEpkc8MSimutRkWpMe5xPtgQCQtVsQyd+OZ6GDdaLAHcETYN8f4p7YYRIno/DuWl+xe/aUrwiZn4h/SqmrK3V+J00jTH4YkxMLUBJ3ebpSYwOefGkBScyI3kphEU/yUOYWbCgv0yPJFRrCNDWArwJy4Bb3fyhBQK28AZVLpRw89ety04C41mIPJqb0oUCRFAq/WG2CBpQAlelHarxU7spazvphMWIYUCm+FcJQ+eKm3MmvTzgQdGJgBKKViZ1l/lkAIm55Vlw6hyI01W5BRqIT8CAQnFMHaRhx68tvf+vPklC/8D2aZXW/L8hgfQsK4MTFXyynpw4jkxJF8yWq4/9HQK4Cb0bQoBGuOvI7r/zu0nt9BabQCvTl0oppv1pQqJT0zWMhD4yzZKbN388lud6FdkBAyDeJYK0q9CkA4IRi1/D9CnulzZ/kTivFfyeEUohmSYpxHwJDagCFvK2gihTt7mFcSfXRNKBMTw8sdrjUO6l+RaVFHeL7Ana31RgM3M/tuOs17KEnHgkDrWSY0Bjvip/cj/SIcQR7aj0UcOQSLAhRAVMoNULZpFfbIncp3jre/ileEPkB21V8BCrNXt4z7O18j7N67rr74eoxn2+cUyOG16hrVTQwuGAzxp9AQxBsdSa5hf+eydStxzZ+2bVVNvrqp04I9jb0N8LPfsXruuRHa6c+uxenCIoElYubRRYLuDFtcIAvnxSqdvoDPxkxu/J5N83fbbveWLEs1smaJcguDwe4LBpCqAqPOIYfOIBHfzTFIoUuEJXIOglB6SjDeLM8hVcKUHiC2X9IPz2WBGgQIxLupjfLVdmP5NaXKBEfZBoPPZInA2ftj7BULoJwupsJDz7fRdxTs+yGwtNCe96EAMhPI2OwOMdIj4C3xkAuxCNLRFb72Y0r93OXDwvy7p6yW+yn29+5R3iWaON1KxxAaQh6dRhDhTIls6FpIhKBvHd1ETHpsVo2YlbZ/FOlCyeiQmnVw7lthIH+ZhIg3a+Kc0ZyCAc+bpmJs6RLCFlkwxx8XAh+lIescHnJ3k/8XD/yMkKpsBMjCppGQujAIW6rcppKkaqiQasSb/Btgu3SyUY7zoGBC5UKC5E92on/qIB57S3jktthiM5BtNXre/j2cBptRe2Y9i3DG6Uzn7fa+59eKoeOshE05bicRbIH/wkMestN404C4wKttJejygzO2Eww9gqE8UckiCdZSN+6tqmN2WTSjtT5TcqPe47/5ZDk1nVcAPCcOVAZLL0k91mplQSBYzK+Fo+QIXinpZOZxvQPUKiq8aB4stlAW87SfBpL5woVjR1AIxdoAWfzO8AkCZA+bvlV1iQK43N5B7v5yT5Hpd6JNHRpvRfJQd0LBOi6150Sv/nTtuMdRGskXcyxDJ0EHho0rPbntt8xFfAZFMKs4B2dUXWAMHaYLrShp3SVNG4nCWNOM4F+KCaz2Y6xn/v0AvUw2NrE+SnzhwhlEnm5F5BIpS9Qh6cZrpCAfZWQ/ls0jb/TAhKvZ4E5iNuRMqaJuSqUyi+uP9NsiReWr3eJOYqwAxQB33pdOiqEDTeAQXvJp3D/4f4Q0AuDMQ35jWU3l0+KyNoMTxyHcEOWA3swRnUa3hAyJi4kfwAEA95YsR59jd39pU83tyJZd/j2lLjzNG9/wrwTzXeT9HHGTCK6BSN5fODCgTx/UG4cg/0NSKiPZgy0YzfoXKVezsgZ7xmJN8WBIgJgGdOL7D5u+J8tjDHqPtpElpfBiWtmdOaWPxbEqWlmEKCx+QxmlDPjOXSUgMdVRknw0cnZFxKosXB9loGPi3sifpjdLftSDMgDvSaID7+cZkxXkeyV6D4I4eI8VWBX4ve5toJ49TDMkGRwWuiHiT3tBY9xNsie1fg5cyiQs4DPeeQ9n309097e36Yft8UWBE3dZPldpht9/rFd4Gkf4yNIphyIjdGMN4+PsHi/I18J4TeVnAMbILymEAAfhIxY3xSQ49TShB3ajHZuXDbS6SqBJkJbOe7UOTo34jlAPPTDOmLBBR2wqLwrkgGn9w+kQrAHXBhfk8ei05nPVD034XNOggDC6uXbLVmZM3f3UubAmc9+s/DChyC8ZT0lF5KQN2oagfmA5VN2TujU8PW9a9pbRVh2Tzq78CeRBvbLHmJKRMsmp7S5qA0ZhJbe2+19Z7WmWE+kIIav/fP3ritrZWObsoYSJ3V3qld7/FZwBJIatNx6IKyqxW6VrQe+7UmC75sc1pRSRG+vcpc6PbfhQ1Gbd1ftLt+FkjdrhDmD7QP8dkSfxeWbHxPBZdrY6dt2M/4DwuATI/p9aSRf6wNHQ/jQtupPvVctGs9wvPVqXRU4hzuwVI1gjpoy4W+NC+VZkB6Ss7AHtXF0IXc0p50Lp0cPcaRioQ2QbIKASL7RaFHSyQDHyyV3wF4upQw2pZRFPsxRbUzPBIkfZlo5otPe3bPPlLN5wyeAekMc4OxW8cOFQSd8RInm9+TsMLPN5Y3lH8k8KpvlJD7uRjXXLx9K6Rus/EBMDYddCcM0IErXeOwF8jK2q11vgVk3xDezmg0xIXwdftqHWb/yGQo9MwlMcAT2Iu9Z1ecDqo7Sa4p0QbTGaTi2gTKWxUzeYn5ewPUxLgtjAaRNSCUH0vExY0vYSx4zG3ehCVZnkdUULTekxdTYIP/6OID7TD4Yl1VvkC6DKQo6MgUE1sjFbHPhJB6T10X8aww4hlhUSw0ENquYvb7Cxt+G+f2brvsEPa8puP9vytKMKbCoPVt1j/kemP6G6wguSG621V++R67Sr/N2m3QVX86Q0SWBic2ENRdoCss05ZdUPVdsslXusqx1bIFKsJI/92xqVSmBxcKGTGKqONXtRMwt2YsSwT3+79A7lKOAuZ3GzMhY4k//5YaSG8pwFnbTaU/43CxvFLc8F0ncslUtKh1w5NHFrmsNcktlmAKjNXVIrtpiLvskbzR6o/9DJwst60jtciCHu8HD7QY9LYcF90rTc5p6TCQSy6318CPlejZ+q54icp6AlZmYtoVwqXVmBDaSFWNceuJ5GRHc0nhEyxcsO5sDGCfLvpxlNaQ+Hy31rq7StCxdt2Moz6oM9/Thro387njZBY2WM9fmzbyCThFjOOTP1CWJ/mekPiLlVtrhpM8xqTJ5W6NEeibS1g0wZiNDgAqJmPAMdE+XS6x9gVf6/6whXfolWGurN8OAiGsujcakMae8DUYwLuHD5wo+O/JoWb4rIYbKMhWNfKX1yMPiAthQuszXbWCnELwK+DumxaLUQgCTs9RALH3K/325E+E9xWPGQG6sb8fA82AF5VAjygGhAs5Pj4FOpvlBnhXm4jCKS5FpRaaNARYaSdlTQMuHI4+RYSLNB+Vry0rac+wcxgLINY4C2DfXvJ+V4/qa97y0Vqjn6DpPbnhMK0OLqb4vD6LFJtcNrjDpq31r11S3iO8iGzkMgFGFuyZnel4HMONeKGHmKr/3qNRvdi2t0mV/dRZrxZR9CxXHyeHDDbHPuiEhLyok9n/unedbkPoQNUfVbKYOuZoizvRI06N4Ch/4rvizqCv4hKR4hIpp2N+koFFdokNWmyNO1NfrP0N/UHJHRyDe5lQJxawRW9wpnIN+iWn5Q5RgfldH6DgleH3HtVR/XFwotYAaPcIaDqPIWr+9e08QboZ3T2ZJRuykcbk46DV7K2WmLREiqoTjIP0UKsBgbvKgWHAQFcNUxRhTLpvkkddl7AY21x2Nu/fKe2F1R9OnamWOx4/qP7oMoyjT/N3c9nQvGlaEodn+l9/xOByWJK0qy+acOAcKlyCJM6BpknZ0ok0PIhwXSsUs+Th/BMAcSdZMv+tEUVX6AGafQhotvdJLdPE8PZyXOlm78n3XIsLD57wLGnLGLhWUDQH8qvYZzoT2/rZ2l9yfrba2VZTlrL+XDKrqLsKybdWXXYG5gWDTUwK9zng7X+OsOzwhbv5P7DiSRrUFfjq/MjbWyoKWYn4Q/Msn+fJJNU2tquHm0+3vrNK3zcQhceQHo+8xRjWsdD3PNzh3ORfS0/NbW0iKcYgj/qHTVkNyg/LfIjCtqdrL2iHXg6cWg9EnHadnt8YcrQyRVVrO7bsQ9/SzIWp/1f1P2PAjnfqSPhOz+wYcMxnibO0G67HGXZsLTQPpbZv1L/9C5wDkWkyracijHjWKhZCXCJBKP1N3i887MrnKcHvqLakUhOT5wCvQ9xux+5psMC+RoGTjcrbzPRZbUBG8CIrMSU+U+8Z9V1GEgWkTTETX3ah3rbJ60m6ppWpumu/1anrKp310wvFTCko5FxzRz9x0/VHBBKKJuJxVsdtRu8rj+A1wsq9wmzJTI25mpSOp3MfhiETT709Fgcv08Ohv9Z1COoZpvjTwDP2vwhPRjmGzVq3Bp/z63eWfrc8d+EJJv+upEZMH9WwyNrgjCkO3S4329SYAtubhBBZRz7YtMOMCXx8fFY0iC5Dldnjpho0o4gRSrcvj+yTG2DuYj32I1V3DhbMu/sv0tUlISxIlaVLdfj9jkcoPqYcFZkbsGxjfEkqCviPgc2gZikgt2YSwg57EXaNIroGWVDY/m9VXEJca2JBbjx2w0EfdUiHIe9mMyF8ypas8uVMcl6f1EX1stQI/R/qUFto5qjD4Le3IYDqqBHAHTg4PvBuzLCtcgmRLjecKo8ww5MSf7SY1vvSeuTQFVFJzI76z6HfInCLebdG+G1UkzfsvWUB1A6l8XnjTKzZB31TmQ6ywR5Hi2+BtSKY+1Z6/PiiiV/P0+YjXxs3H+ot+NPRgJDtU2KQ4emHGoyOr5fElvAoP+3Rcje4x0HcDGLxmoOZtHffFeUfrfbFy3p+m0piG3TjxemCEBQbXLpCV6vLPp22vaCGVU182RS/cMC5jV/BNLPfzUhd6Qz3iVm7z5DUQBH/OEtNbjWNrFbvle2NLCAwxdndAZbKtkLUV23iQ/dyaWktcWHMAsP3C0XMEWMwWE1R39zPJCUUPt4yPVYzVNTZRrGbsVQ2wihD0R6fRq9O5Mee1jbeKYFSwqwS35OkCi5kuHE8ZMpzIxOdbmG80qPrSBxVRxFTS+WnTiiFNRijwL+Vvc8ifNvyRmHg63uHNNcOmdbaayj38NSpl+w5ts3QqAGpl4llxZdBU8lAIrWq67Bi+IPlD18wF9Atqhe6UawJkiaMZKrfq5QUq7B0S31rQ0MQfCEqeM/CIUPJcUHDNAIyf7IN4MAGv1QzXZ/7nr0e1QtRMcJDrOygjAhRrVMis+zjZXFyc0oNdhUocfyy13sJ5JMx9Qe1XmjCTD7eLRXB1heSeT/ao4aODhGhY6IBGJMeRNizoKr3TF8PHsXF9SiOSts3CqiBIXQJB5DNExEmYfE5e6d6uLbrw0vHcT9JONXmMbhUZofbS4h4yrdqMSb20U/TFZPUlWihKmstrziz3aDfY7rB4/wciZ35r5ePH/y08irDxX+uCA6+KOr/ZuexpUMGk/hfZq2B6Ec5Jt3ZW8s2P0u8/ppF+OwQBqlf2uqaMkBJAno0KY715yWdxcLU9jZYZifp1ARUlhEWHgXfncU58WJNCrezgT2oyQzWeMsgh2uv7hdEEHqawYdPObwZiF0M7dJlr1QRZgviinKWYEeu98KbVsFNdEpG9DfkcxD50hlLAKCp+feJDvVyLiLCraUt0prHX43CJdcI+2sa2wqXY08BxnZ6PFV949WNFrzz2SteW5AhPp0SViUoHKZpeOR0EsPHJcacXb5/mwhrP+RQ92krP6AIC460jpQ8M1Hz65jX0uIiahfcto5OB9eWoYOS/zeXjfM/FZ7gJKYHs3gPDpBGkeru1FZG3F8jjpCF6TlDdrkn5TMkYkH5wLYaBWHRtrvyRGOOOfMp6whpI2kf53BABNEUw1F0MCR7RSprVfAb85gRvCSjEGATHs7AtjNlgbdiMlCSmBZ2oWFAJTZmGadDKPtGJdrqPbYMjsjTckAezdosBWLjM8yFOZhHeTPNP+yJaWLmjEtFsGw/68aLgrqMOrOyhrIIFv12joT190asBLqcgn5Kob7G4z6STijciJ4A/Y7LpE0U6Ib8VimSka5YTMcF21N2nCPYhSJeo+5Y1DbuouxabxDbv0m4ExbMW5M76py2+PpymDz1eRnW/RtzcwoFqwggdHzy7f7yM959vyxfU3DO8tMOwqemS9VRONDWKebQwTwQudXnysUsshwo4yMa9aYaLgJ5E3WRVSpWMrYi2jqDfT7topR/GcpGLS2FvjH670Sn4XMlinG2a4wgj2olb3YMnPuMTrxPVq4qkP0CHffESY0p4nemHyEgzgiRZXwBAAa+prHTDtCTeb1e4ivyu+3z5/UZ7cZ6GN0tu74cCRVEbzVW2T4JQe5/gtacyJQxeJNzrfMwxhQ9JeY/cOEre4HiqvwclGvXi9lFkWbE3iR3jSWVbKk4AcZ7RYqsEEpVpzKWcnES+Bdo5oAeLbfMDZCOITSlO6m92hVRWJZoCw/WU4D/ZxSUXRGxH8m67uCzUoK4CaCGmgBNfmV6/C/zTcCOdu+FSKpOgBYqPa9ImyHs/8fd2HPO9gOxF4v2GTFy+PY3omPSvh6922iDcnpt9ckJ+v+U2SH1p6Hpw3u0WUT0ficHtQmyi6hoCJV8EgjUgmcBNspv8ynIw60h+EwkN7VDEfuZjsMKT42H3EMe3T6zylz2eKAGbpCKBSBpXgTz7OVqL3k86fLvfjSWKJBRBahqngTc621BVNL9D2X22xtUDptBELRCKKWuf3UUXPpgJd0lHUk3kCY3p6aPkNAH747YHwrcl8wEI7gY3yU/LE5ssoS5PZEFuSH2bh2f1JKfRGQBY+BEbZEc2DAgJZLqDrUpXiNaHdTSyi/RKP+XA8gt8nOZ56L9VVabxVvj6hTG6qI4bokAZ2x47zJLPJSJ6Lryel1xHdDMs5RvbjOIljcX5pDKUKjHjkSljy3SMrnFu0388jNijFYeeSHfylnqdV7HU68vMUmAsqLvezXKPtIriwnNcsnVnn2Iy5si+RFXLHamixpnDOfdAWUbXszCdxusOEIeY5Ha4co+Z7Ir+HbnIIaqoZZd3zzd4jD/BPvfE4yCudDAlcEDLPVxQat+ky1ZC249YS8qejwWBJmxZoU/58B5H8kzt/XPitde75lK77WahrGTfaLZyIAa8tzVsOXZL+e9NgDqku7ydRViKRZbGINCH8HY5eORwUIaZiT9AbM7We++jXTLyMrTdLIhGuGhx+iBmEnkwQ5lKoS2GHsgiHTzO9LIO97FRx/Kou6X+ne1YQqKPFk2VL5C0JguFccUF/pbBQhNH9aAkWvbSOyiEyCVuYIiigym4YJu0hT+pG2Jk/5ql26ks6htjStOgA+yPiQrfEazRLA4cedeUiJNi/3kRDJQsdWHyWrScLcTnnfeWfrHfbLIQShnelhJCdHXyszJKkWxpfX5r2UEcIAKqBtqtjCCn4F6x/L+lNNcmkjrcdvMZ1strCZJMi6hkkXjq0yRDyMZfwZP2oNKcs7ghIX4qSjGa+fM9GqzI+iJ5FsSzn4Rjt06UMgsRWC2HQfM/06UvXSMEPDWSIiJ9o49v64fv30q8ZOuy6XJJwVYqh+tfZbai82Q0SkIRhI8Vb3yer0f2vr08DVAq6VVfFhtXWeVMf5nblmYD6XRiz9a/ousAiQvOn17cNBexWpEOY7hlQbW6Kd1ihxdaDvPFDqZdDwfmTp8TDTb6xsyWJTy7oI+psirpRYgdflX/ilCsQI68F7gx1J1Bm+SHCZ6XqlKb4FINF1/kiG+L9Urkkk4A6E6iZZFWFNAf0LKEdxOEFJEvm4lqRLm/nlThJEtJP46bym5Knn2MDD7ODEGSR6fG3gpL5YZERMCG9pgb0TFuWG3I+MFth6VN6IeNz1NeBbXVbOUikfBqDAgVKKP0IfcnmPUr6GGgHIMzObFHxo0BJ6IU+baQtxqrVRkpcUNCQAsvCasRCTznJ01Z1RBypojivEFtxuV8Dt0hgiPeQoATdMWrKtx7mppyKnGn0WAjE5CxY9RXcagLcOPQ1JdqJKvHaWPh3fqgrzPUQL6V2tUcGIwHxKIRQkzRJ/sKYXjnvqZoSx6P006UjlW/mcNNw9dIxp1XRWc9VBl8MI5YEk0UxJVoyLp5QcZHJjTKVBGYNrQH7iihXti2EoR3XXVNsX0yApYc7oxbEMnmbc57Mk60XzbrFfgPQs7/XzUww5ZmmNbRDArdsiSQLvFKOVlSX8OTPa/0wGc9EY0+o/abwyU3y6TlKF3PRhZgb9B0XVEqvC1ijKjPs1a6D+B1z/M0jBXrXgdBhCcYgEd/A6KVkjquVDxJ4xK5aweBYwYgoAQZCCTGl1/9JozRvC6SwvhgDYuxAGmh2t7LAv+j2gu4ipmLJeASnhvE6RPvd93jydHj2HOST5BIIYjPL6REyMEKvIV6eFLNkTBTblgsp/sI/xP1MEb/HHmEi39Ej+Zgvs1U6OObhx6HaPmA9yeTNa7cys8U0sim1GxJoeoNqf5NUnudjh/GC6vSRz5rmAGtLzTa+FiSol1JrYdEr06OvEdQKUrb4eFVfBtfjwdWugzA/FLQ2fIxTwniE6K5MfMkoE8v52lC3YgL5nxvTSo35+IA6DTTuJonDoIMnoIyDdn9JbFVjAk6iyBWeXKRgxTh4cmCtZ0swiOvQ7qhGjtuLHVVabhL06+E4kA3fwCUTLQZW/keWbDIIqsYhwdAsbhFXkGV5kt1ShLot66ZYqThYlLFf31HU2Haw9ZxQAmaT5khHhJkh/Y4IeCjlDtF1FFfWjk5M5aNKLK21HlJJfEId8GdNw68G17iPaY160eXn5VG3oRUx4JA9JEr1RpZms7APkDA8DIg5CvBME8KLG3ZbKfEhOjntRsgf1Te/R6Ta3xuWEV4HS7ppNfFGyP2z+VqY4jqIUrFy35eS9BY2GGQxT2GoXSuahp/YeFSpxsnqJAoFI1qmuOTysKBrr8302WDH+3VyMXF5DrqWcx2vzD3SxCYT0asZ/wpR4+sGY8DyD+9NEZWb1XH567kC9FBLWXaQOfaRKQpEp3rWYRZDEHNRpYwCFkuHHCQgrAPxzjTywu0c66f5FGRWTOZse6kob8FhK98av4oa7KqKcrWBHjWZ3ZOhyiZYLYDRdGMPdEXk6sL1XB/Ao+rjb5Mk/HILJ4D0xyF2iJu2FHH7iARDIgyL+VL3Lc0FoCwYetQxjgk0dicm6Yc2zEjj7Wz8xKrXtIJo9nx3U75ESwkfiYgw38Z8XCmZP6ZHGPyDGRIq8z9pkj2QHGM7gSPvPosw6rMiPFU265wYKq+p6s8C8vLo2jGztKtMNwG7/N8lKdgKY6XrBonFnkcd49ovlGh2bhcxmf6+WsM1XRar2KVQjFmBZAcPUG/IGQfwrbUboxfKwJDV6bJMdCvqSkXslWYP/POyln9z3yPC9+Qx01J05rv3ilk3vE4Hrf/PBgEF7cnYF9YdkxbP0CLK4FVvSCJcmYbWY2eBAMAPSMCTrRHa0qr+fugvpF0INfxEDJ+Av3gg4thO3ACNGTM90y6ITNeIktrUDnq3CXNwZlN7/lyPfse8w+CQ5jsadaAAc1hWzp3I+qMiLN+FvmR0rTt6TEU2qh/W3LnYCPCgkycEKEqRFLGxiDEdabVCL4oc9WKMmfY85CopglbbeCHXeW5Cggo+1qNCk+lLQo8Sq8spRSZQ6/IonhLGpQSTIxI9BIMQFt5t4nu4APoXZmw9qUYI5cEx8plbY+/L1pemNuGa7oHa4MJJs8jigy8W6veXWDs3YzJ2PlBpCRGVBg02VEhHz/xCaQ8nmDQxa8VGz9NIDRk0x9KfDLURJ3qD/ZPXX2HkqyFfFRWsU+hiLpjhRH5QVtapYYhFM/5Py576g93uwUIsfxl3a3wa94DzJJrxbbLFvpDbXrgw/BdoWsBkxcNYwQ1I0O/uBL4q/KNB1J3BfsqOqo6reClJEo8I4VFrQQShXy/1AK7S3jPsVoe4N7IxO4uaqVEHi3pc7N8kqjpHZvADWTx0AgEHT05nihfgcx4XEtwN7DCVg4yTqwwPQYXM3LZxexK0EyPN49iZisqySZo/3xDDv93tpa+keRtsAJn/rdcMdvu4771zNDRUCgb3uXrQzEZ2PlaLzD3EHEzPNtApvcwYdCN6UpOZrLdHObM6Ufi1XRmpYqb40tEz2a6q7+jUoZ7esxQTiAHd3pqSJkuqGpwBwgHX0ml3W3PITlL0hqkV7/ygj7h4oIV/nBSOJiqdQ4VVKvVgzKLlrg/xtcEwF63q2QgXgXRVSjIZsdi0MTevPnTx8yVhzghD1eQSpfjwQ8/X0DIkBo2LnEhCRFqHn/qEpcvAkrb0qX9FmiDXRY+U6dAUmrOfZYKPyjohp0HygR5XegH60fBt8iKWjNexd4JK/6SZhB7XtQL+tShXxGcUZHHPb7Xuz5ULhAIzNncOQCZjlsLMz12iB3a8xRthJsZpXBNgxBc1p3to0uosXk65LUD+ssn+16YLJdoRf+uyV9Id/cPVF3ZyIcTjQNNz8GwwDAXhCitaEXs5ElEtTHQM0i7y1OVy7SOC+k4QSAJp8sHnjM7V3ivR8eSwa00zVZ76JQKrclL/ZxMgmearygYnBnN5Y/lI/VQ4MfDPLPN6mmalRv51AJFwn1pBdpVdcNYMdfy/chXcwth1/vES71J1GBHhivwmwOxORHbEH/tWkD6boJzdJ8RLYC7TgMqpg05IzpRMmFL3nYMh0xonmNnzcpDaRlpD+k2KWyDyEukdLb6Bpw39KqVfOZ23j3ezK88zoZoX3DKy1EA6bJE4myHyjoaV2/6WsI5Ta7T/tsAJfFpx97EBiRtQvL+M8ZH2leQRRDOT8KWBIz9Z8syfPvGC6s1/kwsj02RFK02k3A7cek3xLSblEPjNGPZJ43iYGMvBV8FpaqO5Bt8aU6Cl27VgNxvayql/IJQiTFBTvkEteKK7pDVF/rlkz7TWi4mfpZpaXFDdbMdg4+70JmkwO1Q5FVZTvTihg2RDGSUY+PcsFcv9KT4FHOzuiCLw4qWUpJfdhiz6dBJ7qRhKGVKNKmku7vZy0SLhOa//BrlPenSbYuaXITq1Twvui7xQ+BQ+JMpYtqWlfleONdLh/K+7PKgf5mpOVOn5jkd5JikWuwUvOhyjcbMIDrHAIS8VOMxsJPWnekACvnScx2oob8r9RClwpJMhuCUhKLV5442kmIuIVjCJo+T0IPiDHq9UaNL7UJWNaxFDt0+3VxpQMqSCAsJk8UwObCMXHh1cihS7OE/cQpGNhlAPiEiJpB+wb1OvZX3grdDt+C4dm53Ul5d9uo8Y1tscI7PxQRDgHowv0CEgZKFhQ6MSwG2eYeUpXTFDNfX+C3qKMA6hrQGrZSgKJVMTTzutyToaG7idbwibXx/kWqJZOo7c3jaJLdr76FUJiBClLX9SwQn+6rQAapC0t01fd618iB4wGPR7AcZph3S+lKIt7RPh3uqj1QuYntZ/XPhqaAkENcmYZUKX73jSD0qutwJrL0jo2WP6ls5TSskuGMOmcIiRr6QAdnzLdsqED1InKO84TF6ooZXBhOOGfVeZoCddnty5ClkitEZcaxkjoyh4vPOrOKJZoMOxjuVIG25khRsxXQvitbhF+xy0KTWBZvSN53Qb+lgaPHaEQ/HLWhNZjv4JzKjm6OAr6IHhWfe4GPOn9yXVveqInpfrtJlFmuOaT84oRFjWrDllbzdAAkzNc/e6j4t5DsN46TizjsHbKDSikQ3kEpPage3HKOp+vT4dzdsjK47bcbvE7ecfkH46ZANHffUvxW3w7tRm1xOtoo7wOEpfK7fHWHWNu7ZsdGRk14G92IGnQEL2YXrgrtlarxzUMcSmFT1nIlemzgcmwtuPYjEW1wErMzE2jZzh5nT0cNlyC2DjFtYaGdlsAc2R241CcGILA2qRNPLmoHBqst9E/VYF6zSBBoqxFuyjeGf5m4nkfm4k1Uqk6Np4DbGYwfNC8pHXFDr9oCbNsaJYyNtmCptAyMzO66tapVVT/tjiCVbhu7KGOb4YaNLwq0UrBCuySi+qTd6/bR+WqTGIzZ9Gn8kObMmd9YNPFR5MEqRTqTnKUd3kR41hbIUzQBXUSIIJFQmaxxRBmAEP7PjDqtJZu8lnZTkA+ZiyDM/rdGP4L5YkK4mUS+9EPme8Oi/C1rlb4EATSbm+3VWVr+vhBzMh/VBKxKGanxMp0PCEtN9Xs50mHmiQlgJ2lHKeZ3VrA6ve1uO+mH3WrJD1/OzVeQZTt2LT5kPV9aibGZYli9/gJ+gVh6a1+fR01CgVougvknyxhfNcZCpNH+HAdkrSrF8Cj+FLyt57XAcLg9RgLouaGpOTH5bc0tlX4x0WaMbqmc6VM/+RGbKokRxXdX2EZ/aPc/DpkKwVGNee429PjHESUS6yXpLjQxGyTmhDSvfuju9xoAI1BaIyCWM8MoS2FoLTm/VkXmXcWyNGtls0+u/CKKRzATmC+zSIXVMVAKh/hCKiMs98fBDtE94ZyYXzyo4sVvjWnkRBukGMf3zfxVtxGulXbd4DaIDelbgk5PqVYu4dNx1hsgIsEVrcDVt43X45ehDjZ115WfQaUt9ypKRHsmgXQip8PRbhsAEWzBOG6GQSsGsdo3APd02x7GQQXQsTWlRdtVL7ZrRRjvTBbpeWTt28ivNKUDDEE42UqcdgYbsD2HdBQx8lHpQalyZ9+GsiT/xzx8IvBkUxTcfmDBvAu2L1/PZOL8VtZxvD93YbjZAQ+K+rNVU5hTQd8x3dOPxJdcN44gUDLhRTMauMKf3kL9VGfq6LHgjV3IU1TUFcIvV+d0adxjeip8orrhPcS7k9Up2uVHj+Sj6XLaEopqBax0LHYYklrRYWZfL9PlsW2TxiYplLMrTGq8eS0x8AJSCTCkYuNsFeO/8tyRd5pPsQ39rBHnoTFMMiYn3G9bSwU1CurI/0gNulX8r3pa/5VE25m+sp+60JErEbgnQkm/v7V2eQPgUIlYyZkEUv3Oc5mV/xAE4s1/B+AxQDJcaqjFnbE/suF4F6Bph+MvOjO/cQCrtqaM6F2ZGChJkaoDMKXwEyDd0SGyKp8SWQMWeqDp3HY+dStNZ3IXc3Vg11G+nrCNT8F5u3d2s5c/cAsmtSRJL1qN5GjmHTkxe027Jp7cSV7qnyGindPocz1NQwsjJarcQqRqV685+BU3s2Xu+9MQLs//CUVewM7FArh+lI71jd55xyFjVSXLBGyhVvYLfOZvgV1DCCxcs7p7ZSLS51U7dIV13OXH6c9+6LtNvi6sFyiuPjNnn4hzERtkIVfsmZbIwrLYrj8rRgpVpA2KCf/TPnTgLfO5cWXpQNm28BrFo9/97wBmMipnm/G91/PER6ZpwF0nMlrSQaeqKjKyE+n59qdqYhJ0kBktP88IfTFIUtMQgIzPOkhp7CkdADAW74coh/T6SZuPyF78bA/iBLXLgLxywVUWjiZ8ZQWhGDDjDkUe4qjmxj8bZGqHQfqYx6Ez+HMf79JCLQFH/Qp6s5ajIMZzNUtNr8JLltByxYi0Rmh8QhxX8i/kCzAk6UKwVVY+QW+xPrw9Dx42GfTa/w2O0HyS5+Qf1pQqFIU0QtMIbuzmXRvf/muLdKo+WEuCzA6/wdtPdhhQl+hOiekpLG5CBaFefuUKYLW0mIEft9IKV4d+PKxCyUBXdISd7k9feulrQtPNEE9Q56EqF8BwDn/DjxdP4QP+ks4uaO8ekFoKAnPzOrBUuWLegYVA+bkWhKhfddvCdRFsTo/zjskBKcF1S6QYoncsKVjnS/xoPKeZSKkPIuAe0HKCXJzGuSVL7WnsEP05y7mEIq+JK3hjiTzinLtAxwXUZJTNrJ8HrVFmxDRCh0XnK8IC5hlGiFioFtPoQJp5p4Eb6A5jMNjSBMTgrCjqzzhKNV4Q6fJrAltbDbRqssCbe3nviPqbdm9SmYp5HSuSPZ13BrdoZeeLOPGfhzRCKl+G9Xhfe+dBuCjg1h2CaXoBBvGUVdifFlZXmoFPuYesm4HSp0BZr7eqhLuV1rUnD5GBfcDfAjiFrESmIRmNUjurQmchbGmzHRdgWxaWkVk32Od0M47Dbxj0rrnaU2txcmqKuyA3GxCj1MpQSBqg9s062O85rWhMDyU51KEqm0ZxCiWhTBwrRRYeqz2ATaKimtXrw6ENPrnUeCan1xXUrUmwGe/+Fv9Si1KcB0yq3HrvMg+rdFK33XJtsVtktl2ekFYOGDeB4tSWrTI2w26f/4NhcIZZliO6QKaBihmbf5zwHhkoIhYkpEbe8vtXSuUmihTex97X6x3eV2w73aQcLE06zm321IZnjPJ9syng5rkwDPYCM0Lm6iKu449osj86oxlcB7Dg18hwKNrpr5lcoLzyOnU9eE6+45BMPfm+85Jsd8A6BXi5v43HQsc2BAC1PYa0JRxkerpNhyBPK/SabaR+AslXE362Gixt4QZAlCbruyRX4N9EgZ+o+A2jQ6yVY2iE7VodaePrbRsxuS2UhL7epFXsO798ukYiqtoeLgo2wrv4QtawhsFzxneOTcR8l56nHabXUI249ElY7CLs/dzXFefcq8ysbc9pEHv+vCsxWdYK9DQIicfi1wMB1MfnzZDQ1Xg1PV9EgV4thtFlBX5Nav2F8g6MUBNRozcDatcSYJsM6nV4f4cA2j+9IYuH0yyykZvobdp6mr+mEVAw6dC41HCz3Jug/bnmpQrdlJ2h7Nz7KftU4MeS1wfxvozR0ucQFhyDter0Kf7a2w2xVbwXKTeq67798e2CPuoNqRbEgkJ36TpwhQ3p18KLI6SN3e553v87P3tiUHzI91TcWwzu+/CV/AgMtlo9EkCBF+x1dz6+feOxpk54pa0+KSI+CDiS9GJN5Oxz5qk/cI9jGOX0kjy9k7/Kw83/qTDjEmBDjgRcRhkNW9pOTYbVRkSi4nmsX82sGsnJPy+es5tgToJjtiiJfshdsn253ydJoNuRxQCdPRzmyYpj9aLTnqd3xD+xl0pPDwARGfRgSYMJPfaEIISNY7cZG8QnxjOb92tTy4a2vygtWFlb3OQxx81qUBNjYNyAJOpP7iuOZFfGIXcDyXHFitxh+UKgJmY9KFZYlX7HuQdxcGL5ygVy1AescsOb6Puac2RXoVkZ+0jIeZ7uLi3eGM1f5Ub5P8IZ4vlEQb754I6+cqME4dMO8n7oDRRbsl+XJlHe42OMnRPUPh7l8btHcQqNKxsDOxaLRBrUxERI2Is7gI3YSNChHhHcs2pJVJxbvlCkN2UVsPncjjtSWLCz1sExMy3BiIZq4eIjXNwSGp4ttTfn6stjHm9u1gJLstmxCcwd+gNun8E5d/tLGh4KyDbQ0ADlvrsjPW1kFgS+9d6fE2M3mpeL8juU4XomZfeCfc+vcJgWlsYh9XwfyJsHW4IZpt/KpDxuhQ9janL4wGFuZx4Hlq19IWVVL9OtGiiwuE/EIPXvguvLTcPfSlDCn6sb0NvWvXTrJeY57wu8KcQmrGxeL7R/N3/2AjI3e1cXxRMBYazZlkepHIU1F2MxhNrOSukDCUwGR4XriVRUBzGOihjCBrYYKJCtJnDYQdSXzderBlIOxC/cS0pufrJkQF8K2U2kdJC6ZLW7PUU/Z+sv29tlEMKWfJ5+ykCFAQacar1TZbqIVnfMVjCwZC/PhLR6e4EJVC83eQe0Ld8As0868JQWhv1gUVDhdvhGKewuedIKGrSzv+fv7JXWgmHpDNHrcwag6WshYPLnB45tjcbtiDiZEpByhY/LIjwPida9N2yIcBxKSubtE5as8zy0uY/sFxm67w9hCIdLZEcSdwq+5K7uQS9iL1XF1Z14YS+PpYuEkD9Nac6gHw3Df1NC8te1IDV1CCHTWmwCB+EL1JXs/so5mVUiw52qlmOFjS68NXT4moxUfrqz8eAIbxm8oRkfv2/lLE08erbyqTDS6kUuexqPBDif88Qlqz0Yw7+uO/AJZq6Okaa5ROhoJ0FqJPOTlQYftvECQzxpW0rl0DhCNcFlZFTjLOvonbc/OmXLwydIZmhZkLn1Sf6krYxol81JOakZ+j2/Mw80xJT2m2cVuzIoqswa1wgq14NQqC/WqA2kATvEb7p+fKbVvdAUYzeipf26d+uTw8Zbg0BhIj9z02U9S4FZHploLL2Kh3Hs0dkeHQzAfn2JNyH+7EyoLoYpaOPayDgSuelDq5dCjykmiaS0U5SmOSbMD5eARNs9OO/vswoOR9M5Il1p+I2HUGNf/LO5U+Xc5OhsB/M5Rl2dVjyaN4xBUtoKrGPSfxtfcwf1u/7NJczfCbtNU69s4m46T2gbXXToRYAslS6020cPQb3Ez5V4j/iapaw/g4fss44b35u6H/cZeBsVsGjw1jZF+rChuk2Ut8kLgxntdp6Qs+OXZ8o5Hg47LvFFClJsabvKJ57oc6Hy8O4e3IlmXJy5B+XfJbJhERQKL5e2c1Oqkfz6UeTNWIZ1juLI6ptWBqD8QERIc4Nwhi7rHe0PiwTSGx3Nj9AL4R03CMrvmP25kEB22eHJB5pBOsFSGMh92G5iOvzv9Bv/MsTS7z6UfgEUcmLUNS0rmZdGydlbSEg3A5uNk2bOkd0vuNyoWEHj6jYTicGSv/EoQTGSuvdthRixIEZ52o3l2++TrVlvoYBbUBeHF+ID5JC53ksqnD8t8WawGFKFR4sER3jU/0AxjQtOwLnFm93ItWL2sgrYaWVwhvw5ENEHpmJd5L6KtUJtGvB3G8XALLheK2yCNBQbYdGuC9f/EadVrDNCbBbV/vS8hPFHixnaT2d0L5bUSMgzWD6dh2xhXON7NvdAyQpOXhj8//pMj8xCT7RLwQokZqwiCrN25bO7ScvDTWVCQUrYp3xHQoQ7n3hPSEY5P3V7Tdfmwb9YPXfwkSUZZ3S9DXLSgaCD1I3xlJXFgCFlrPFbhVpn1/ze2JteDa36oCSKWEvpj161TiGJsjFfZAPGDr4xZJnDGPxIz4EE+fEfNU2OaD29tsH7xi44h6Y0NMbuwC2tnpbOYtPfv2350C1mtlBCZl5zh1p+E5gYR4S/fewidlZd99XrO6xUzLUKFw6A8HJhwVsb6JvXB7dCyriqbwm8daBKZLPOj0HM4jfzuxblyfTAK0oQHkjecLUUsxk78p5JBKwio1XGBPyrwKmYAmi2sN6lcMPXwS/kawGr07mvyw93LU44zfKJiCfZk3AOcAt+/VMG/SOcIH1pZQkywt1uNwTTWkZBoxlKtlCiYo1J7GXoQayfnhoHSee9ji/z/ZIJlnjnOjZEd9BGhomMK8mUpILxJ9tFPa0/z3wkXCyrq2IquGITNb44xaPq7B5nfj3pZLqgGWq7yocrGlYGdiOztpUiafb0OClK/aGAxEmB3x3NynzBTjTfuFESchaON+dwo2zdPLVmaRMiq+GiawLLpWcYJqoloIf7Jh1dRJSuWeDWqAEe478XgkPwuRAQ/8H4f2I//FQqwrtpcQ8PWaMFuL5PxDWj7iggczVz1RgnN5sN/5tOuYZrmA35k6Gg88249Z6fyyVb1pOcHrmc3ndTB2gLt/FBgr0tjN1wMbFzUJSVrJFfhryNZzCSKaxI7v4EndyqY1X0i77OXOJJvHzAiJGFQkCt6ivHfVJARZdqolnP5rNG0FPNKA2Dg5BvtiooME45hraRwoiXI96Z+1w+DkvXLv6KM0EkVBVje6Tckzg51YG82Qeep6mygsoF2cr0sPhhF0ZYGzMifx2g+Nfox2j2UJxKmoCMch9TFm6Ly0MWZy4kCtXzPOOJ/yAvJW5bTGTaGtM+ZNwtP9Xx1sUBKo6X3e1T2ZHWUQ++Ryk5lrvQXav6OVed37Dsf/km1ihIbTNYdPlXA5oz0DVyKdCZw4EX3hrBG1d07c8W44z+xhbWM0zBW7jA8l/igxQcmA525i1MP+uecxc+3EYn3giNdSgWF658JjvNl9AwLBy3l6U+qIKG3fxmFkMurXajZOin2OeWJ+zOYEBE+P+emk0Nw4RNJPtS12PCs1CfLv/J+6So63zUjLKVNd52fW1nISlqYvDYWYTzL1l3bcTrwrJ/Ku2voscJhp0o2t3a9zW4JykNWKltKhexgYM5TIRDe8frDD++ykhq0lXKh+pafg5C1KjfyPaYKBbzs5KkDIYxpTCvC3piu2NQPrkwfCjJtVSTFCVvGHbfC+YOJKMoJfwkhh48Qbh7Ms2y3QZgQlJ4oHzvxTdTrVdxbWC6owpUO60Oye3IUz2o6tIIm+j/qhf7o0DW2GLDp38eX8j1y42uukv73mgVST3WAADO1Y/Cwz5Ik53IA12B9/Y61AVEQte5xmD8GS+npJ8GRbexlCuqva/BTFG+5UPIUnzZ9wD+ECwqpT8WUusH73aZswE2oMyT9N4rx5jdkbJHNBeQBvBJVJ2QErKhRLvtpXygHlZuOB2TMXBNcwdeWybT2WchE6VJi++GgLFswzw48QrnokbPlUmDtclDyn9lKu8y7sGwKI7dfTZSrGEzBpZ8GPEXy23mTkPMBOvawhqekORAXbmclWCSC4FR0BgqoRVoF4lav319HOj2VrVnY0O4ct49I8nPyA3mdcx/MkQ4x3ZQ475BugHqBCDe1c3qcKwHpawXH5fpAfucg3gjnF25Ak4T3VXp95HzZ10yl20rA323QAx+TMGW/0xanoDWAKpIvlFHvK2x4W+p5IRsB6KBremeOOqkILuxaK+2sMYwKL5HGn/0HaK8hH/qIUt3A7RKmWuWoH/G7xlcrcm5owFWjKa7kn8sTHoxldehDvp1zJys1OGPjvYFH28YPLg6iV9RbLpGj011pTDoQ4sXePee9B9LCe+1+18nsk3fbyu5E8hYPaYkbyJ/iPF9CB9c3UGD0D+ROi/TR5mE8BoXxCrUbFZWAxy18ZDjnPnDNutKm+uWsqgC5sUi+0coiNGtUpZNM6QuVPAStDXWAwatUoUE4iFulNZ0pBSd9sEDwIXUWmlx1HX4QWrK8zzV6pPYVvztKHe9lrICyzfR3o+NQV57Pwf2BxbBKSYEHHwRV7bX8ByeIAyY4d6T4a8N/oWQbv2+StOqg2Awkd52rtNzMJxetMQKN8pRMkbpgwfGjVPG6y1M9T5MQdLZAk/5vCwhaFlM/MINb3I/kRxcnLCQbxuXOEB5It68DUsrjt46FY7otudDZrU7ifITi7FGEvk/agEBIu1b3KJnbkvTluTEIgo1/2NC/Ojr1ekHMU0h5mq6I5eIkd6IIFYLKZZJUcIdREAdNNBiKzXkuiP/QbbOVjPBRjrRhj48pE9n3mU8Kb3qzPcqVhBAiRSsLDlf7qP3nW/zZnjusc1cQT0tpCd0PaO4yPXIHy79QTSwcEf38ccNGEtQ2dwv6L/nQ89InZd5qhfPWPwsaHcXR32u1YQqFUHAk5XOFCOLxKiyRbC62AjqvIvn7y+UNQY2GXtkxFK9E3p6hAUN6CBVm4cn/2+dNBXZJyB9GKXNpAByt3L8e51YP+P9CIW8CBL7btk7+jVQ1EaHj2VUpD0hEX+41jOu/G6pTYz6j3Kkvl4DVASoZGy/lkTTct2nHJVnNEnvWNbwXMFt9DzSVDfa7nFMK//gHmRH2P4gHB4NBQGrzY3rEzEnC0kfMunIbDRx2U/RJ7efRrejPWyd7W/Z0qta3JJN9jRHlPYpZVYdlvsU7XsNOZNCmZnCw+G60JGK9lLb/QN2uTRxdBmj0olrFLMS4CNVRh1tUIIeV2MjjJLxB6lqmYu6mrf2kjVYU+3lj4d4Jpd5Fcb3J8TEQ/IkUsndAy6rQZx+a4EK1Kvkn6u08mMJG3Ip8HHGewOTsNC9Icb5wTzDm0j5HrK3gkII9KoawiNVUVQgkh9vTtFSy5jVx9LFSohBqoYIrquiyLkdgohTrDlOgl/QLwj/XFCdCJVvUc8XNCMc2S6B4S+EIXCjXy31hopqIK3VI8NPy8DJ2Lj0zynLtoBXDtmvFfuIXuRlg1igM/ogdnBK4ZAbQV22Ae0g8WFHFPms12mLZwPzTNFUv6oSfxx2ucudjNT4CUfpjop4D7Q/5cXz96Oc8AWqNKfLd0plUi2Pg1FIraTukzqbQN3g7d5LIFF9pXzrTPIdcneU34lMQ0P61vGp8fU0qx2vKOTC7zPCmAUWirZ1HNRLch82wxNeRSD+muLtwr0kyvUUEGSHMQgtxDlkU7HO+Cm7twv1qiv/H96jRAr2H3Uhugx65g7S7xP8bx3oQfIrEliqEPVd3oHuDhLf3BMTDer5D10ENpjQRl0yc9I2OETwQJGtOJ+tUsI35mDf/n6ArWjFcKvlp59ac1pvQBOHCBw/xp48cB2617zO490zmobWP2IkGXkK2Ab4gk5MSKI7qnRwtldsYmGHffGqUEWbeatmpadhVuR24/vMYAP1+CZmP0HL5XuDf2FjT8Xvdnwioy9zEoQYG9+33Jaeg34WgGfXAhn/rihQjIOfb56QRy89XVC+JEwS3OKGJ5jnrvfYp4CbrTJ6ulHcbLZqwF5v+uM8f8hvEJRnAUmGDD81VB4xenEihq70MJ1HQfWAWEpbAdxTipDha4J1gh0KVSXiEjutTYHYZFAVOybJ+rRiKriL8awHW6kz2S7uY/C4Ot1vlKWdWSVq4NGNeq62s10HpDy5nVizH9JvhTXb1cBkQ1h8r6WAGcz1Bmjuj1aawdbHLrwGtS4Ebxndb3f7H2TMlwpeEEtj9DCa+lm5iyyPmmXa1Wz0xjBSajuPRMSDhYLBHgecnowhPoJMYKf7EIuThpucJ+MpaWuORKAYVpNQony++LUo9haYY94uK4Wf7Co4r10RQ7yu2mnUVFJndGmr75iN5HckgDB9soVVIDSW1zvV2Nq+LHI/Vk6zB04tk23ukzQHO7cRwTgZZI20Qa7NmzmsHEo7ZQBxRNt76mtSuLVN5WxEWiVZ6wUj3BBVkmeew0Ia4oMj5stwqGZ4gSA60MVjEt7mdsyXUOUIdmnIArIdIPU7+XHbsOBCcqJgrN7PfHT1lxXxIREFkyaxVg2MvWV+dt6sxHU2PF7qUZpgvfZaMLDU0vWdnPP9V8WBm21ps/sQ8U53PBe5xAE5FMaBG0cn04sJZGeqkSbMbuDKPhHNVHOwf2UcgKmVnbixtndiuEd9xh5pFDPCpxpVMdD6SS5smAQcVGCl98G3jo63wIdtT6Ov8e9gr0E7GxTeujBrqZxBg4ZIwOJ8Mzub+kG0ymChwwRvEc3QCZWEOQVA1M7umM65Kap101hc+/bES5JyY/y0UQoNGkWaJIk+I75y7SsLax3rMtyBn9123LVacToBkJtIjZRILqfDlZ7GhfMppAb9C5x1BKY0f18eNMy9FlJOQlUld36SWeXzQ1koA2RDutnM/bQfevYfpkBESCblF+x2Aw0LxGPE58BHfEnYvuubqKGbaZj3+zYjn04Av3Bpccm7yq7SZ6zvfvz86OvF7ycKu0ZIam6ozYdmo7XWIDSaDy+a2Z0T1AmWtUpnqckXveX1JYmVMbd86NexcOIkVfcaIGQwR/OH6eCoCJJYyLKopdVQ/CciFVP4lXMlZJjgp251PDKOvdyGyg2V2HtPpbSdAF0VcuOAIvffqG9eGl6Pl3gGeXp7EdkDLATnCdXsmiehEI7nv5K06dRqE1EX6YSeyykQl+h1tdtQBPkPLLvadkvnO5NLkgJkipXzUlHHnuUTwy2Zmf/Mq6y5GOh3TrHC3VamRQJx0mMvbQvXc92JRoxEEIMb05FHH+G6rXKyeh3wthX7FCJIzm/Y9/T8qtStwpBMxFH6D3+Z1TqgxM20/aGLClicvLtOKeqQVty4u4WxMBkD9moOpknrzvUjxTFaoKp1u6duwTgxsBe7l2EJhIG+q4TOpJG2cyqZLVFJoZzaVryaF08ct/H2nZ3/84WL/DeJS3P7Hfyz/ikWRCRwihU9dPV2l2dfOgdjv3Xlzzo/icFTPDoOPi2Q4QQfXtJV6YJr9kVlZfF3U0w/Zx3dcIgtZgexEQEnNumBsyaYhucC4Dvrlp/2bwq7HzZF1PoJMMw/pczlVLItez2PDfQKa/o7zBEFVz935Q0yyItakhewLQ1qpKqdIXRB/nLecy034IzaDzBMH88tLr1wy3SBZ204D43Ix+1EBGFmiPtmmFEHKcYqYV6R5ZIkh+1z6j034gTaDlv2/sqATEISm+n/KYtkC8+VUaddA4FwUhNr0XSZunR9P0XL4eBRGHIbFvtCE6ZS4TCBeznHluwrjoPkGJEidoUokgUNXeUNAIkUiwFUr00kVEf8cl5LzFovw6Px63rf2iNyVSoqpdk4bWSSMX2H5YpRdrjEKXLeeYYbj2Wzq2vXFfGOl50ebh2bM9IxJDx3yAr9X9Gfhy3cBd33QCUpPfm/FN6vBMdOCbbPuZiLZCYNxbPzK4SdIjt/sLWGlKo9cgffSmtSVnJRc9DkB04JfQ/HGbq7GsFuM4WensqGF8KAsRuH2wToYIsOBrz+f8ZHQZAcWjvDBnEMz2ArmZ8cyrDXL14WB0IS/IJcLpqiIB6xhDZT6luxXP78DH+7/DRuGI2a9yuTAq5NzwC2mwJFgUp5F7NxQDvhixW/2sY21eQRwg2Xrw1P2gHMJYylYOiWgWN9xa1E0hq2tn4yis9M4bBGYwpmK3RqzN1yjyIf6mVBbmK66NnnTrWHl3zb/xHlwjXlZQWW8qqWU+pzLOFnL8/xzj75jZpswAiaV58zsoOOWGvWffZMsPu3Iyhy9GT8PqWwip/rXwPZVtoRFBOo8inYNmDxTkOq2nnkP0qQtOD1JJVJN+kCVH48Zap7EQHzxGbSRb5p3RI6JtT84oM6BVIFdByd484vI+pR2S2RdW6APH4jQjB3IoHsVbBO5IGyXvMeVKyP7/MDvfR2m1vE4fW9Jt12wtnnlXxPpWPLcI2JyOE2XMfzMLAE/7BodDJjCjfkdqP0Pt16lYQVKOoH3OnQAB78aBUiXRtmyXKTa1BU9wRRrmhAdO/XUxVgLpSISaaKceSNcsnZqavev8y/FT43WMD45VWdxj+SdWmZ6FJP5KPaRcempvFOUY5FY09S+3GfIucN3wPiCmnwoWDYcJnh7fAJssXgAippsYIZPjBPNoCaOce/lSe4pXi7H/p6CFS+ZK9qD10dRlUXPUtU7dR63WsJsPo9XKODGFCOuNE4ytLGDVLdwyMra432gjHDfhHoPzZXAwCgyPIE0ZtUkFdBNgIooTaNbk2SrnIi3BxC2QJCk50f6FtKj3BgA6zIalT7EclBSmd5iNBAH/x/gkPQKpj4M7VfF22QXW1nFGMfAnQXn62F3Mukwe3553Kk5uVWWADnMocS8Ft0M2/SMGvgBoIs6RjrHTEHaAhPrdCxkJ9Zw5Q2l6xa3KxJYmcKFv2tZqJjdSe2TFsIVQOWsy0YhfFyN+yNIIVUJIZYGI9d7K2muxfSZBys6GJsOXiiUhVwZGByd9lyWTTSaGxUJnz97Qk63CJr5J5ldCs18HCsMpHy+yqboYswTh0rZXILHtDSeTbIgK3k68A9rraoSC2d/7SbzVgaHtVePImTZt+5bRJZyL4Ktz981rqJ6HJLJciSTHVArotC7ytRJJ1EuBwvW24P/MHuyOMAHzENz4Pkfk7PrCXXwuxU9BcukrrwpCsnU685IQI1ZjBN9MyCbKYoAjwW2JMTj7cRwWB5zSLUcLVHdnuw7CeHZNpZQtR70WDs5wiSu1RQkosrp6Q+tyxagdsuqW5hKJFc+NN+ftMNZh1VGxWWCx8Fk0foK9DOqbDOntLeoCttJBnZa3Hbc4HbsrvduiWYDbpMp3pyAWbmyCQpx2WGmmypedrw5/oFjHcI5zrhTf0lBRUNhwsUnUawOlSMM2m8gBtWS+fFJ8wDWUCEpSBawzoJRMp9A6kODW/tRg27tyb7WKRgmtPHcF7WsvEJ3Plg6Z24pT7Dzcb9ricQ4r0prNjLNpmBEzCw92wiFGcNbVwlEBTaRBUj+WjSXjPmH7zn8Q+vGnMAH2NT/jY7j7dLK9cshFXJCkoFGWuo+1tPWwriCdhx5EWGiFFYj0UAZg7R3uYIxIvEJoMTAJYwuXvmkHtFMccmZbOlrJJF+fgs2seIqmw7FODzTPMB2KNuHOrVEinewyqRoaic+7POn58YZbhtlYA13N3BdCf56jnipQoiMWCmTAwb2Abt8Pedid4WoOqMAgOXNCNzoPnEuLV792+PZvss/UEmbceyjuyl07ibfcvF1OwdIOFC0JCzOrrViiv/qdMAuc96I0FLmc3bc5Hi7zwDx/omzyfBRi8pZRpePuZ3BWMTjV7ifBNvnBtUXQ4cedTSnW6xa/Lh9IHvLUqa8/U1eGRuN1KmpwDvuDU4399UwMPmBI//orzrpfYfgNvGoOHoBEgVv8xXB87wd+5OV/qS29cE29iiTN8pWzyKSTNXnbSme4p7PT6xE6ei9aS/ZjND9y3kZ68qPuyUDcWc8DIL2vPJpz6I9AOddhDDV3hOK5WRbagIfvn4qqVtyME6Jz7zZ8nlPgZGwGWoYqMYAX3Z2GB2DcochvnxnAoeJNLbEcNRBID63kMNtWxQsNrKBIhkDJyZG3OTrqQt9ry+9Pv0g5mGFB1KV8ETthFL9JT2TntOMZ+c8kwO1k7z+kYc/8taQz4OtYW98i+p+hMpAT+oAjS/X1iY0/vnFIn3+M/XDmnuvaciMLtmy7st/LIwobFG2TiHx12dVuh/wxS/srRNKQkyedpLO3pIDTrHIi3Nu12wDx6fvFSA7gQmSffQ2F/1EA2N9iLjTaEEAjj4HeW70+kGH+zY2Or/XVdIWRufWlFjx6zmD3hNW/r1trWTc8dEzgr5ZkdtlWbCJWIkP6MlUmJrf0nbA/n4LjkfDQDzzpS7xibYU76lUmmxac4gwxwfgaEyj38yBwE8t7e3PQfcN9370Ajn4PAPg+UCti1GEEXgnsfyyxQij3GAv1Pb2jUtj2cRw8GGqKQ9IIZhfNGs052DDc3Cy8YU3VhsBnjffuw8yF/UvKOsTX2bdGVxvVjR5L7j1ZP87ym+aO/9IPdM5x+Bc7uD5qnh3y+QR/J44Gi84ol32k2TFfWKfoII+tY+IcHwI0h2qO3ol4GoPnpTwE1FB0Y1tCDUxyc9oSZjreroCDx0HaUVJ6/GrAa9bFOoOHCKfMXKzq7UPUgWfHRwPVeBPZxnJJPhMMuBR1GbUKyjqT8xlWD2XZ5h8uCC/IqnuLjMxIVDwdOeIz3KGPTbR8EFSnXeFT5hiTPhf54hDPgHm37DqNNtSQZaRc2hAKHdOLPRc65YWszvQeER8TxPKZSSw3sLcyVa3dIaXBDQHZ8yyxJdWp4UFpcfccif7etmEDA7Pv0d8tnGF1S4tY22hp3NiOJizIsc1TM7m22stniNlSreQ+Vnn7Xoi+fFfkagzi5k5o1E2NWr6td9RHb7d+dhdcHsGWz1rLemU7DB5QjpTf10hCY6BWHQ9kL+83/9jQj7zriHhktT1dg/X8OHM0PY2BA7dfvPXGm478DZGlRFt97gSIjCCfZhFmSP4xUYU9hsTAYAoMgzW2WyAmUHXrnvYSEAdmDwJdh4G9REEApBo9IeRRtEvzJnZFjhMeZWlCtR11MvCNAQlRM5rosCAOZlbupcm3a+1saNMpWo6l3Z+w9ZZstARg2hh0Z4gE6da92e6Dgc9Aa1pQunIhsY8SJlm2rIpdzX6uoiNDtm+ThGmGPXEWTRho2MOtZJpcZkriyJmvhd/2bBhxA6za13yQPQs36W73ywpM52cZp0qMc/zOeFqCsfbP1DRdf1UrLMn15zf5LtS/demrwfefdhoWbwxYKF/3WnPDr/ZR8dlF5ruhEe44fiX1o4oGKqVObY63BK+HAQ8Qq3wGeoDhBv5KSztx4Enq2iCYXfRNsgwa/KImIvBF/+fLMa7+tfm8+SlHbVGKr7ndT7KRD8Z1WmleGLBqDcDAoQu9kUcflvwYJkLJz9aNAeWZx2oD6uLGapZPmBJtcfUUrwwsJA3CG3B4g/j3d/iekqpkzf25PIdqLZa99bm3ulVz6U9QatNRD5rLR4JSGYVvjVY/FGCe/8ePaGDG3ri+CJe2vC0YnJJnk1P0FzT/0VYbumI3vV0rmrpDuL9oL6rVhUTOeadcuZ91RBOWxAg7OLbVgwW8+4qy/RfneXkWnlxHjjLmHVT2W/XS8EXT3Iqb9L2yo5kJr5YfYQHK1xXGZe542vIoqMbbmf5EAMBvPdBKFn9ibCUIIPqr4AwaOdJhNkjKktPsE3xAecz63OV/pFUahWRcuti0pri0+BAZAfPONK+96cmNfme4CSP8xpucDGwQdfKwfiUmMwO77DduxoVs8Q05RhSmd2iinSryffj+bnKQCCAEWI6Mu07IX/pVqF7M/4szziGtLZS4ShrJrQ7T4JX7vratROFSP2J+GLj4/ncWcxjTYJwjBQ03ytr8wj+9tU8tamw83MmtD5otpHZjZWltVz7A+niZk5Z6Chv2uQM/41Ll1KwvSc5yeRQa/tmA39QHFHsrEqN7fM38PjM3LaNdqthkyejWbDFICmyRmtmGDIXU1CdZSgq8lp5W+ncrCaXugxFoaiMmvfm2X1ZiWWR15ilRG7bWfuklIK8uOALDR1l4YdWFNSTidG2hhyHUTQadJdZ7LEx7F+aTX1WJY3jJAFQB2QDDumtBw8qKYLpikpz3IMQD5XjDGFIgL62oYuk3OBug2apKE4i5iKKUyIkG9pThWHvi6VrjFaEE9MN67/4LwaEq6SAH/f+jg62dEFBbT7K2wIXugfTAwMmuYSr0oXkd6adATCZwqc7qowdEasHxIjC3B9axQOCwLgF/t/5nbs76keEBYcZtrcCCb8xquYTbq9Lkhjg5wGUdb1CMIy03ESsGBptnNV1pPSLI2dGi3g4/O0trUFjJlzgDmyoKLHyNC41hKnswkutvPXs4DJKoqT+FIATQEjx8mdxxBwStnLKVTCJuct/8MdLp/EYp+kgsacOExmUBU4dKOomzGpCSuz6bxyqZqbBROYbQdEV5NLfHhAK2xkIAMpkL5NS3hgX0ZLYCJd81MckUmB9/EjbeOTkgZDwb0LcC1+8FC7Gn0k3pyGnmZeEjzPdwXGvNfVL77aZzlXCHekvx4/pUWwcnuIx5OYH/ELPB3s/sOefVL1qA0a5+1JCVea1Vnt3VjMfKT9T8m7ZYEwF/mfy3DLfWKjc6NNHv6AqLZlayvlRIPRibYNZLPKbK0vHe+YeDknbmRlmO8WlTxOjbpGR/TtbL4tPPRutbi/nz1bEl+5aFELB9vq2s4e/KUufxcOxyw626zKl2BTRV7tJIxJ8VS7ZLbhXOQsxEPJbQZWGrYTP5UQule718Rqnj1vGGXvQ7ViMJdY4crLR5sILKAwDqfi2ePvcIt04hiMLVbz+IKF8TGRfQemExWgd2XlLUPwa8SSha4jXGBsBSo0W1P4U5dekqS71z9TOM3eECJxcHhic7MtytzzKfyIe3Xqq4BKVQMdCvEIeNIMEea+SaZrtIBISrQy6IYZh2aeBW5mseHSq+UJKrQ30g6cgDK0a8LbzxHw/R3zH4DqqgDlNw/tQaQJaEg+rWF9HOOeTtgiRq8uXsIJYLTiYSkcD3ACZLj5jWHOcN7bkTgjlYALqLQoty7Ybgyxn5cU1DMI3fWAnV7TbOcK4u9zic4ffMCwMva7LupbCenqPsrTC3C5XewnWoghupNtgvi/mzYsHy/OEw4jwQm0uX5oVCx3mQ3nvjSrFgtiEuNj3WQ52Ps1/tt7j//KoJagxnD4pzjKp0L/ObQhDFnup1EAQoYp3TUnd1S5ByIBPnotGHIYNk4zpgTTfDf9qO/93LM08pnW+6zJRdBqn9eh7+nfgBYYKjMpeuUiUjhxxVTPFmtRTZMF696xEVDc5rpM51/XDr342FYm2CaMYtC99zQSOZc0TIPi62WFsKeNa0776qFSYiv+sfBVtbE83HX5ktDVYLENnQLxhzjU36mgXVSzeKTOPB0mgwl3Oa71vMIwYsYoxR2tvKKJ1R4VgT1ZH8c6vSo+43GbhK/ZDVb4Bz4jwy+A0MW7vylAGFmYkmwyhB4GPMTe7Uev+JGkEzbMbsHzVYhWFgA9VSxYamVuJbDWHzIxrE6tn48VkUzyue44K+puzZpOI6Ey3UvdVpJaUbOABY7t0E6BV2ireiphVtrKbA8uNxFzkPDGFzPhyGZMiZ3FJpdTygjQg5QPyI5z9FOb/FIa8Xxdb0ZNP4ZXPWNiuxByY70PXANuXafjc6iEzmBj1gSoKPMqmqMlk8JxHTPGdpBmfhP7xbsZa+SOJ29uQJJ43MlqC2TNvQPaISO4wdJeQFHROvsE3nlZrkzR4jnWPykz+7Z7FUGop2rFNsgDTbyIoCC7aR6NXY8DR2NgKGwaGcdeTZB7Jiy0GxslFSOsWk/2UoVvQeONpW/FdMkr45dTxPdQYP4LkFQ9qP33DuD+lL9XHUMSO/6g/bE2k0TnEGQrA62AHOqJeMH6mc8HQ8St+lwJNHM2lkWkoS7qtVn2rklh+mXBQUkapA19jYcz3XwdiniQdZY8LQoloaC1WQgokICJginO9fboD1kfaLyykThJGnJ9BC3gwHMf0IDJ6YqKr5z/Y3KsaYhYuis1mcpu7GTz0GPHPPdR8PIzn3TADKgcTwMOEGU6P33N90tuC70tnzUbQCC+Tkp78LBmkYTyRbxx4CIzaLmiTlyAOXlbMppXdaItmqJzcpx5n4NwFbYOnaWyg/nr2xtmUlf/urQ2sXosWFbwaYkdEXzkB7Z+brQu/73p7rMI40jH18sNidZthAleYJ8TRgwZGeVV+o5gaJhbJbBrLK1ep8fHI+IVFlsXLPSN8vAQ1TNZzOcvyIjIjw7A51QnYrRSowXc/Sm9YNxejC3f4MiULD1EoIMiD2WgO819o0qnEHgy3VobkqwPWxA92+SpPQJaBWXzovVpgqh32EdFRGZBHpdvk0FXPnFWb1TLWzZeLjbTFMmMKA6p0/SwId67GcWBW3I4GSAdgVBQFOFrM1F+bo4AI0BBEFYVrd+84VFDKQlsREsa7a6NXLllf2/innxmwx+YYnhrI/KI6RymOzJQ6hKE7LVRWGQ6lJJ50cdq+jCA/8k6o4267yxbYrTxO3ce+Hr9mXYeTtwodrQs+AN1CpMxNytVw/Z/Md9cV/mtv+gWhHJTK/BxISrgXrHdnVwfub2hDz7BvWftiq1IVO03iwQb+m7a1JodT4h7G5JOMCZNdvKPGGcvEzembxPrsyFLSRtlZKnwQzvxf4aomc+XXT9osV9v6ZKjGEeb3bSFjfdZ8MFW9Wb8xeWLXLPwnAlnXrZ2AnPRIdaEZlhphUVxIsGXOyrpnbxoDFLHQ3eFSl9U0t5QZOsGuiqwQ1CHfA0HJ6J3cZleIAPYXpCQlvpSmV8cs/Zqgmlb1u5nspassQVEEx3G2NRzFve0IiMwSsT1f5DcLVvYLvBAfRmFdgHxHBGzFOtHbyNxSsdpbe1kbuemthK5Al9df9cSMj6dQBktlVIr3icxpn1Eh13doxvv5hLfn7+yEQxA85YfO2SV/Je9MIvW2B04yTmI6cGRygwEPWVZfrSvpVimUIGJwlIotaIjUZfT6TxLESZMawy1BUfn/67POatJ4e9L277G4BBZZFO+NCxnQPGwNnUU3d9eepKLhicLylTQ+P6bOh9toI0ZRDZfY07v0hZpyrlDJRa95ZL/eRoHDRXdYfMoV1BFOt6tgBD5IoiCmm8ZbOTZotGeX4YqlHiI4B4E7S8aanusGBjPTBcOGBilT6RCqRYElhV0yW0Xbo3BOJQh91X7dVnH/To8OaI81SuueW5TOnrOKMX26wXA/jVseoQDNYLzZdWpxhKhdSjOu1RnqmTOCIYEhPvzocLqp3Rj9iiDc4zyFrVX1S5vem+WirJ9XLpSIaWO+FEYIhKMToP18hQUAaKb/zpyvFKc3PVLEIFzqK4ceNIRMkCjMwr8loSi3VbzOXrDCgUohGrfNMGALHD6YmYkbZSv5u3fvsv33BAsWT6V3r8iDERD3H41P+2MXvZKfk81nXnMdTA5X7O5xryaH26fCVqgsStY53BUs/Y+hzRLGTwl0OuMLSxK7WPEUKfNe1Jt9NYwyPcXUH+F3d+jzFAqX1SaWH6sXPn2dNcGvJ55wq8y3K3mWUiiWqa/7N4acDKh+kkpLk/ik2hd2t3C9JxPUKTHPH1uLpc5+LjUPmrX0NQyBthtlFoi8F+qddUsr8CmDB9S4yHXOXviQpS5LrhDaKNF1XZxArT/eyvRzQJVRfA61tC44aNEoaqGOsJRCe0K2RYnwW5bZ0gthPlFBboOoEhwlXDYDk5JpQu7Z8M9zBKkrO1OhICBlZnvKyiNM04UGimBNsht1L0TQTRGh7rlwTfAERudG2TGIzkd+YijFL/4L8eUf83kMsF7WhSLJwco518xO1px8M2Wq2VB04OXjrTT5E7KWIOhds/HPyNTdHxT1xQwa26Vn9pgaZamPND3kNUCYO9T73J27Sm4884/uCy6xG6IbLFffyzg0Vs2abaurL0DZ4H/uyuh9Q5GR1eRf0yKk8BgBTPnLsGRVAeQGbKcZT1yqMefMY+1MthPNNdP5CDGRX5EUUYVBt9pjNAmo5RS4tw6+zHd86K8T2ZIcTsKWdsMCtkRQ6Yz35c5tHBWWNyUX6XKItmejBPPb8THJnYE4McGR+VqqozhK4PewQi8FmsnegI4yLAlkNs4zU98SjrAsC+mkDDtgijgsyCt0DrIoP9S3CBPMiNogyhBxre/D3+3knCFDB6B+2/6kWwPgmPSxT97a8YPfmG+Hth82ULMGIimybQnflnozKvpZPq1OeAyL+zqFF3UKfKSoMCjLlqXFxZf9f9pWmZNNbSf+HWQYbo5B2L5Zk38Z93RsPeEcN7BwGJzDL3v7N4sxiN3MlHd9uk1Es+ew4i/8XxafFrcsTBlSVNy3SzFFU55LyDFrnQvP+kV8c6rNvEQk85UDHkIoZ1DebJa9dyPozk1X90pT/ltYIkl9fmsG0E1Vl8EtDvn/P9jzmxNORPQbqNlRcrFtK0xtnPHhwfCEBLp6YGjEzGEHjQnXImDeHgbS7+R4LPiiiZXILJSU79koidN9+apnv7TvAweHYmywkFU+gSKvOsS3HYhCxcgcStob9VISd0eYhZcS+CfCHVK2UOvaHpcdXGSrsHqPqGTsYoahygzwtsOmZBn1rHOZARY7z3BZp6SuZtO6fhSYq5jy4rElth4uq8TfdrDscVwatcUTilD8Y5cS5ZUtkRDH8FUXfk6EhqsOiMyHOhn82nIPAfsG33nnXT4w7ajk3bgN0pT/9oQDkiN5J/N5TtZ34vfvPpQ1cxY5fL/Wxvvxn9qpGF7cPjNj/W9dtno/rSwfy8PAA31M8dT5+WxCIxpug935o8OJSWWeU1T7HRBut455MphnStxRGZfTPjJtlti2BVeW8+zmX6aOJOJSYWEsdg9VevfnzXK7lQxpX9tf6BGL8l4+FC1bfyNINkpGpk1aHAp/b3lvwJPQKm5jU8yyizZw8e7FFLprG9nFKVaVAVHnJpBP12akctW29X5TmSMNMSkiU9rum1Mp9FDGX6aE+OChuMVU9thh9sL16VZErD/aGx6pulOYcGnhgt40autj1/dOWHuFZPYeubC3gsQuyt/9+qmTbCws893chtGRhaf3uTOrSrRmHqamzfoj+P5kAzUts2VIvCabrtWJSi3cbWVp7m9N1SfsKvKkAUNP54SMw6qEu2oEx/0FnoUEsM3C8wHxxnOUKcGKxyOB/Q2YTwek/b/K1LFJ4mKo9e5ONV6ksqzOwOPvVm+ZZ8FRrI9owtKkcdL5n/8xva9i3Ir9jcF30cNHWDvmkqQ2L+E3/zv0SsZ2NHbEcCT8ecawwpA5otT+3ruByzQrmLnIvNdADNewUbwk0QMgCFiC8OBPNYfJZO5zKr5cM+e3TLnFio+RNI69VRsxNW1B/SkeYYs5bl0Qh+c/OJHEtUbJR4SQbpYDJ7Kk1jixH7iuR5LnZWimiIV1PLVeYAuGrP5DG22Gp0ziM2Fzl+d2Yai1ZSB0ZzG9iQiOC0uovTSUkR5/iTlnK700mk7cMoHpi/suunmujd+xfI5+o+di9TS0xOg6rUiv6DxJklvqBSBdfrqMHCyjspv2ljzcgg5oLTvbKgGrU9RHi6fSObFg8j+yJ6847vtg/NgofKyMpJnyuPb8uy3caoGxAhRqOjbccpZAMKjBFrWykprA8pM4S3NYA6jMvTCJSqsKfE+s1GJYCKFw6pNEGPSgOxMBhtydJ0Yby66KJp90sO5v2X9X695yQ42x/7mtLzBh9sz3AjHcQ0LmM9qGF58V2krdpBJ6IyMRohb/kxypqdxHk0NYMBmFNavUm3/5yiyqKVQ07PInP9PlN/yIWqBD/sin2Cs5KRSGJMauSjubihsxWHjU0zLdOTP32yQgthr521EdN45IIrcGqoAjiLTe1z+PxvbfLcxiq7lgTmPU/yx29RS51RmuQD3xbN4H2zn9ySSQaX0LZpFUvUQ4TfCwZGXbcVAXw0tn2n9t/bDD+Ui7LfuL9//P1fddbaBA1s8g9I6bd03IECSDupcXI62oO1iBthSW9pSKzIZ752XUSw1v4TNtTaORZ4/UY1Qz4+n0lc6AVuwqpKlc/mfjqPPl6nTHOnqkXSbTXfvW3rCwsS/A5P997ucMcwrF3dvNxgoWL4ej1y9bO/HufAo8wWG7XVRcf5lXRo/xDKfbT2ydmcwbRlmvD9Ghkj/mNMg80Zn5phju5+Sh5jw7cUG07M9SuEf9eQmkhWghGASyQAquPHYIbVnIjk33NV63gKGHZf0zHVEs56trsMa2ps3MKpLIa2hZ9Yr1KzgxjQ+z178dkUK3PH5qxZfUTUg3vlWbjSg5f1Up7Ib2BEahEnGUqf6HSRwpmF32AclV/26p8WSJ+w874y2aQVrbTRZDlTVWMeN9SXmwgIl7LRVQSIykcR7cA50xWmr6TtWlhWU0RNx9ZGruTO9/22JwFhnvOKzekDqfRj1zKbzIikl72qVxH0iIjbxb92Pqgeu4wUgq5ugzn3IQqXZXd6Lmrc536dkvXiHbGxoY5ZQEm+hm2w5v4qbhRwnQCNFwar5rOx40kgNC/J4EQnzaIeW19zLGEbQL5fCkcqmkyDaZ8XeOPbRdy8VP8Tqnh7AWkqbsK3OO4pdd7iVNa7Bi1L0NSwwZ7Fn7Mc+E0zlmlu3fnwIhcc4gR2didPUq1zgTh6y4CTBhz8jaT0WcnErqkA/SA4rnK8aWGdUgXIwU/V2PSSumQ29+tA9fbOd9IfMdIx2rJTdI8ycLE8zxLzy7zp4Z71ydyS7JOPB8xaJZ20hcHkDSmeURJZk28+tRGmxzf8Suh9IoDeivIyLWp98k3uHOCF5pFtCKXNuUiy//VRA+qW3m5BLZ0Gy9RvOHeI0zzlHq1M1VAU71VCinzg891Kjru4L6sBDdUrBnSwGVIwV/zutNEP9qmnrrvtavLhiFTbSwOQ/HDitePU7b9k4LBcfmEQVXfR1dMRctO08NmEmiak140afCH1D4xBdnqDT7pCg4/2eFXX4tQkmh+uRA28BJkmo3ORY6fSyO7OVte0Gl2dRGIPm95TXqGK7SYZuSXb0t+ORMmAoVMcs9BeV8GoLj60Wf1t8xF94NMF9ZYGBYiz/gGzoxbsZ0jPaH8dl+9LO3F+/UsKq2oWzcL3APsM/hG+O5/n6K4eb3erOdLZJN2P75iwi8FwDw2Rwc/JLy3IVJNpYNUuIY9wjXLk5KLu/Hf719Rehekq7Rr0CDjOcwL+P3yqOBXvKozFXbyMD9a0BOdoe2PUw0l3LiW7M3NQjIfMv3P4raqRqsmeq2grXuJgri07MZBLYxYR7HrWVpq1rI4Vv7M/utGJsY/47XfGn5HI0GQYe0gL+dhLle8UlkwPEGch6oHHYSaaycMJk48yGmwDkgFgAMhKf/uXvhniZ6e94Gx71NyYui9OSCp1KRfbGT893kP9WHyIaKBv7VzD5RyT0816640ltU43iJ/nXPFtxzL7i453am+TTNLBoSNn5YmRQJmwGoy3m/lMQ9KSIFv+VzGfMHE+3SxoGSffby2fTi0bQFP28j8nwY3f05b+f+z7+kWOvOB5KqT7tZc57C9sHY1B7+zcyfnqSzeSQh51WRaYJ/xuZ6HMyBkY+dhPw9nDVU5S+JZEVdm5jOi6d3wSx/LMmY/SBqwqmgm4HZ7IPguAHKDszcckOzzTi9mqKbSA1nTMrjpxDr3TOO5ypyvlTWmPT8Zd+0hzbEMmEYIw9CqfmDFYJ7CcxVm41VjMr95hNb+8OhKl485+1o0GcfpgX2q2N9AmX9qF29NDS8iqYU8Dv6bdL+iwv3goxdvamMymbPI0EWJnNThkmuW21THoFyOqznaDTntAj9tjORlrFqkiZx2deS8fdQQDJ3NNyu9w7hMkt8xxaGKWL81zgAgqptGcbMfGfSBOky8zrWPKsxP227b02UmEnOCQteR4mQDxBkXxusXzfDDffcjHwKj02yxu8zism2ld0+7YkeHVAj5O5tRBN5i4MVNDb5CF/+vAhHo7zuL4vZ1qmMY1ZDlheSfiLD2EEXN5Nj9SC8+0sPdwGuoH1wiSLV0uZvvt996HxL8MZ1VHfvBBokoDzhgfgMMSXbypL0ZduW/DxcAsoiKDKMeTrXzPwF94l3eAKHbeclBu44AWLU4++O84EK+VYNjV9cY+1yaBfA/chobX8378f/uqYpeSLcm7Qz0KI2PEH3zEsl7SI5FyYz8kAj5K0l2idcc241I+1LesQ2vXSnrfeV/Xzh9+ig2NiERP50YOChN1wtTQKg4PS8QQMqh+NH1LIxDoJUbnU2c+A98Wrckl+KS4X2JqSC9e4Y69mk5RLsYXvL+CDaT7jc5dzkhTp6g/DAakzP8Klr+VlGJauCXX7d+YWuLtyUyfXhG3ALhVaS3zgLYhCcm3/YGrqRSuZe4ctcpYnCva69l4/tZriWO/P2VtCSM+g531RcWFhP8ps5WkejidxtKSzO8cDPCLcM5DgJiTgAWEi92emfUwANA8BAqNyfvAWWbt7ZWkYhc88FpRAX/0mkn9Hzih0zfWShKjIoNW+tC3lk0kxpsHG2FeHXewgaf6z9/GCjdnjo7uLQohnerWzj6AX8bag5g3mwR/jtLBxFWyaG3jUwC2qGn5FNP58bQ9RTGnhRatJOCbQF/851DdGPljLQ2c6r35/4mX23DKY55B1YRFAQgn2WHS+TMHHiejHr4ERxAkfdPpHtWGxqXKq8m84e0xBfbXS6qDhqElmc5Y2ibypPXJj0oJcpFcqkCTby6wv/3Z/i3CoISe5Is/uhEpLd6l5B94V806sOTGLFb9EJ/uz/QKhDbxSRpT/mkoGPaJOYxa6UTnxMMcURzz3scWvXYPjvd8TelVtwsi2/7z97AxXqcScV8wtkT+efsIUgR/3IepK7Hy/mm4UtqZiyyeHh1bGtku7VTUCu0VwNowdgxTspUnsT3EhWigRRJV7zdP9HZld37/BbTm1tJePPilolJuHupasj7duD6hXf2hsN6UuqZ/3D9txbg7DRbe39EN9477g5mDjcL1CzUW5wDrTgTumYklCNnD9wAKXF8SIunZiaARUva5UewyzSXCFSuv1kEk7mYiHu+ZtBbDSZWLAkjqPFb5oTp51Juux28/k0KdqBkG4ggd6zkTx0Zc29pYeu+y0IGVNBUUcvtNuGml3MgWOcv7uorS8VJXKlm+fipg/2m4k1fjinH6E5fKg5wX1Kjpka5PUXu3DSqjjncYSHm0iGi4faOIPQNDUECFMSYCDyrXIqO6q0TEuttnZRvSGti3uqfxfxV/EbONsHUgBCRoazxfuI9ZgpVS4nGprhfgttJHpJfdhsW/uDczhAaxtPpnDMzoeES71nHlVtjxeKhbRnxETnNp4p2bIFmm+tdlo9QxZkKM8Sn7DrYJQ3n53zoXI9W3p+Dkm/N7g3sNMIucVLdEoFSpvEu8Knx96U521Xb3b1HhEpV4ScfvN5aJKzYWs9z8OgmJNdoiJqOq59O8qjTLwT7lM1403ubrIAc8YPLroTQjoatE1Y48OCpUr4MFdW6X1osOkbx7V7NwTxwM7vAKrSTPO8d3tmeMwqnJ7+cu2cb16jpTsF5nK19gLqmJt+NWFacjOpqgtrZCaIO/JCzhPxmyczVbNjzRxMnP0ql/QXsxnw3oCKTZXYVt6QiOhRdwSmIeLnMa9zwo07LSTmwzFq6BoJTutib6LS7OdY8S9qKsY6OeW4TSSCQLUEd66PffYPVbvnyolkdvb+rbfHrLbhiZCVu4aziqfM2YrB/DZHtGGkEzGrc2xm1/heYdpvmd9P4b4LikQT88hSz4ZpsyEuVa10OyrOHE+KayuPPUVoQ28+BeZ9HByD2eKLLwnCd3qLLovMW2krL5ML00wTC3ztBlvTieN6gsvLFfNJ8g1dX4sxm/6GSydyNGP0t8sXny5kFn/rT4SN7sP1ECvmdlsRqf4hD4JIGBRcpigvTDw+sWOipiZwVY0sRuODk5n85oO9ZWS6QDTEfWhbji+zOvT9/aQBaGUN7KRApCpPMoxfRbUuu64zXPCkrgmx4zTfDzughlRYPRsq1sAMe6nH0pEe34LgS0eLhnPJ8p78WOt8Ej8LFJsrzcUoHUixyqjMeTSvHMtLgaR7oDvD/e4TOG9iYDQFFOzdOcGuN4i0j9bCgB2cAycbzBzduz7lT6zJO4SzHywu66Vwuz9kmh4oTxCiZtNyKEQwmRnfqRpItVlNSWzW0PzB7tb5VEh3vYXyu/6tTGA4qUczkNZiYdagdesEknrou8BtnFKT1kqCZIFidDz8PzY/wUhZWnMC2paxNYwixOKkQnVyiecVIr5jOgKqbK8l4ZICGMCerp9qbi5E6YIxLAFs9pw82LrstLoi2T/dnLKIJij/uz1hDZlfPaPCUVGvvvcLw2v51dyy9WcVmfnTcent/7pPUgx9vdoYzGf/4IbBUajbpYm9huV+r4+EzBCRodGrTRgnK3quTtzX5KTUuVKfxD5NBtzMGXHLfS4t4nJsR+fbJlb25N+whr7/Q9sSLtqMrYLHkJhPjJ3sxcD+wCzMru/fxhtfEvg2uHiMfWE3md346a0WCqTrGYu6DhcnTRg5SjirBp0skv3J++u57FHW8DzWcFUZvIX6W8cWzPZRN5nmDq6adKsQ23FK8RkmFtaic0ZN04BBgo8iSsiCQJf7cLXzXUwv6BKkPa2drXswbtLEobtM9dB80vwgrEfykZ4IMr0Mk9aBcuVhsWgjavG4ag/BmvwiNKjpohx8/loxSZzxQuUxVIiU4cP02jt09CsAzvmx5M7AjWuF21ieWw/AhM27s94Ks9X3XBLmzSapDr0O0l1XKdiWCi2tecF1UlcjKY+lUXrrDlSadd0kAnETHrTHZsy7eWnlx5TGjPxd8oYw55k2ec8u4hzZN2U7zM88PweRl258IFeOqoG4dkFDmG+frX/3MEON+/Y7WTwrGqmHxIz1YYipx32/+37RxJzkvXzpteOX71PZrbV/NZG4md/3rSSLQ3douEukmFEcJtqtiXHR+kKIprVUL5saBq3TeV1eWKa+MGUyjc1WzYbkNtaOWmx7iw0uXZRx3XlJh/MJEnfy+SrLpDDqttfpjof8+VXcpKvBeStpayapJsf7dXkZEhEZFAbfq0MvIaZX/qAZVnH1wsqt7yN8Li9tiq9cHO/1tW+Qsb3GhmgDmLLQcTG9m68dU7xi+9dhv4bIxQ5/7ieyDKSqzz43TwqTb5i055FKI5aysd06xaGMuhWGK7HN85KY9BLual3gGGtjTvBprifiMg1B7Z2H6xEo1C8ZQ2BSv1dS1NS5y3h/Ls2SynnZPYMGcs5hkdH3nnpWVaKbd8WS283eH2vb3lNY3sQgeMn+dXdvQgxRwn7xJkx597CvSif4pc9npwC7KDmaw4JVMSA62/zEub/RMO5PjcrtIyhPtPOgW8dbIO+xf4tlkHgZaSVz8F6vPbzxAmpBu8YxlwYcaFdupbyOrmzs6ay5saCJS32ufPG7P+YYSNlHz9aZE5J1jObOjfD4vyc1H5y7EPsZH5JtfSaGOOzwHKr7DO7ipEsmOODaVtBN5xgS++gp0wFdmdGoCibyVl5QsO6Pt3AkvScJtDdO38ouaiv2OQ4+FAFr5CruV++8NKrYc3HjLCP8WEc0YhIgAMB3t5t7akfzAfYcg3zI0i840c9owy1HHSevLITGrGwEwbMqrcCfUWxoY6oiWD6uNpjTzc8a+Xu1+y0tnCgH3b/aiMBCAPl7rvMGgpBohnjH0ZjhMzmNeevE9L2ursoTdhDnblt1CueWT9jCQythL8X64d/uQ8dsjcvc2rNpobdpuQNIP66KY+xLaJA2+5CICWJMYt5Hrog5mi3rlhZOWduBfQ2eECRByO5aYYBBIxIsZki37c8G61dpzFuby/mXHjWG+TftOIUJ3U9qkm19GDDB2w/l/FVb9UbX1hxG6BO6EdDThOnv53XVIh3SRzK/QsAdBDrFQAB/Fyj0uRafSCPFWEdhec4UcN2yrsMCJM/aGHJEh49YHOXY32iBJM4vagPJb2ZnD7HqLyT8e8HEBimxhzCv2xUFEqsuCnaHKXwoEDVe5ljNPwaFQ+LvqJYbP9zB0N6J8kMYo8aipdspjuzpjh7GZC4Ph4kwvKDOJiUOvUxue5JCu56MrmEuuSiwoi6LtOlO6q4fSJKEVsIMEmR2ACp6wj2dzAcGMdzSSnxFxuVln0e9HrG4XEVgKAbXpLmtllUioU/NMB8Y8X+4mut/isWejMHs/Wd8OsFQgDvPNGGj4orOOzub2wpDg3C/fXVnnbaMZwMoSkI7/DpUVwohFCEOVmBGMlrWkUgAgcK8IH2iHe8QCF2TRKyTqKSpH8drSycDT0xOHzgOtZ+YCcoGNObhxwLxV7rzPTvC52pX1pDIxlvkQsoZ0E1/1MM6WCE2dyGfTXn9OBRnbsVk15ikG9sCkln1+Ex3VmgEwuhV5BRh9Zc8QYQ/Q2AUb2UeVvJULkhMhKPEkq7PUa1kykp2MFwG9vK8P6HNOx9b/2DeFgwlhN5xMII+eLSOXSRkz/Xfh9BUCpKxjFwGAzUQlVtvZbrkvw8FE3b8jWTWy8zz4vYJEjq3BU+FhYp3pJdtEpghhJQyc9kb4GovoCDTpKDYCUHCh0WocNKIcOkB0CfRBgiMcggFGhIua2lSVbyj8zTIfezeLyj9z6ptEVsV2DDLSawbTcO4xvdTGpN1/jIO0QaTcIVqhuzFt3KBZfOwl9NQbRnG8Jr3sC91rWKuo9LFlv7JroD4NfaO65dI2gDB9Fq5ViAseGOHFkEiaCvyTjzaxEwhmM1/QinmgrBi9YaFReSB3C6wyVfhtc2vL9g6TyudF9WFjMAYfd3LalFxBxVfMyUyiwi+ILzsUrFNQ2PDFtAECnPHd0ednLbHL8uEEAjAlW9axi4tc1e133Yt/yfcfcsIH9ouCNaTpn7Tm4Pv6flJ3nfPOQzsmB4EG6vkM9buH/+GqF5LPJc8FyPGxtlFu4iPou7PzVDPWyIQQ2A+6NTMnz59rmSsEcLLTtl4RVKzemJ77KbUOWbTxonv3koWPyZLZ0rJHgMNjDKHnc9C1eUdY1O99VXNYi0XzgH2Zypp0nKXowly6gvB1NeJpSv0beR61xxs+jZHue45O97HAzVAoNsIMSLAFKexd60WtnV2vctID3IuHMCKkMwcPblCtCW/73Sjp29j5vZV7Lhf50DVxrXJ2xdnnrxy/U5KpldZ3ZyU2cwHx0NPxWi5BZZKzZxP0NdbJcwU0v/5no/UZktZ6ktti51xPD1+xQCV+1ycvdPbujUL56Z/I/GN2VY42d4NFEN4jkZk3Ukb3X/ic8kNk5YcSSczm8gMggOBzVkaG/RezzHlRp2NN430pNvWXhAb7sM1EANaf0xZNkQlmoFVjXM0KyjC4BMcngFRZec3RiCsysenFyQ75tow7dwvVdn97x+EFt63g6Uz0aYxlY0bBjdOHctjj2RN6nip2ALFtj5KAhqkunXK6K1KraLiVqtBA5S1020AapjxlQ1mg0UACBYL+rlMJ5/HtB1BCGnD0Px3CXb1ZqekscvL1hqsQodV4z8Kfbk5f2HItJcQIu7DFLbJ2l69n4QQs5BOoUYZFTV12XDseJzg1lSXuA2g1LEmSqloFQ0g23oM81fhSluVd0YOG712x45wz9Wj/JDHKrJOJnsEtafonJNNUinmeKRgylJWZE0oZjIf8JUsNlezV9BrBYAVMBB4VZBYnhqsBoBgR9Hd2PbJOCYilI8BhAChAlPdD6dsUCr0090wUBvJtIPVjNFWZyYSQHUrHWVAfRM8/FkBoZtujiA09Xm5W6DbIICICU+QuCQVA5yUKODKuF8/nVADld32zACBAS8ZyZmBJySBGsQKSxCbTzLmuyWjnJQs3jHATg5xgkki40/z/T+ry+mDI7toKVJAiwECYs9VM39j2J61GDvjQYUUeTS98BY2iYmkJHohztzbc07VCipBrrdj57N+2gGtrPVh6vRL2f3eIWozeSYCjIesP3Lx2NvOYn0JXAJO3v3PX49QAIDPxyzYtfXn8e+7IL2Ioa3JaEWpSDpZjXOOk+sKJXY85fpjBX0JC0zp7X6eJdhlDrVh7sLBlwcjs7mb0xzG0kfcpOfX3fjYpDbu5sjs4i15mDw2UuNlbImnaLEpfUFCn7WA3E/Hs1JhHWOck9PYTiJSzHBQbrbM9FQ2N4xz2CxsTLOR2e7ANkzBihmoAOXqVpA8Nbpw++uUvZyi2iuyKjTMhkWwgnMg7am4tHno//GByuxH3F2p+3Sj/c33KwxxmyiMkzx/TGpxm7DRYXPDuMpm0ANhiCMQj7TF/cVGDm4FEMMsDruqrvjVch5Leb29MLrSEVj1XOWs7kzqIPcTU0oWIqJ5/AOhuIr7mmbARLEga0UZBikmqxb7spQo6UcdcTzQbKaoWUscplXYPoOhz8JkI2eZU6lTdBZIUx4xi8ICqvOOYb6srbCtiqXppVCiFjDmuSPSOiGb1l6NCkUX3WciH8A7txQv5++ZpC4WEy5NTokFTDQm6GkDGQAEgF5Kq42vGs+WzcNSXqcLBNH8CItJi84yO5U5OdF4RuCD8DNRtnFYLiXSetUMmk11HfelLVHiZQJVjkmGDGRlnRsCWmInX5SLxb4NC/h3FvcNkB46UuN+0U/A7TNcWIaVWxjBIQfhvr4i9oqxWHVGfBJpsIv9LKU0mBNOcMtLC1ApPe5nAJAviblra0Y/W/LP/Pp/g58AbBI1W1ieredcXsrmsU233ghjIM92d4cU2tf4/pMtcIWd2l3WsEbd+nvOdJ34iYU8KkRP3V8Q7QOq7uNs0BouYWLWxfvpsYHEkLwc66wDLJ/jRLe4cKy7u5YBMLzRqtswr+275KlnJ9jCbNGEAfHP/flrn8X7Z8Qc/wFw8CHAvJOkSzSQlpfRYPQMUkpZsd9OGpLiM0j18vHsviJ4H+QgdTUHdMZhy5MNpKQ99v4FDxE8/oF2A+c+qKqgJ3qZsxQaxUmfxXgtek8Kz7OGDWo7fTmBof+i4XgYB5WqGyTdScbY2Ndqg0NxpVUGyljWrQ7FBKr8Ulji9GJZVjlyl72l0AogAH0WsIrVDP8yF36212ptpdkT5u+logG7L62LzZlNEY/EswVSuVlCHKwxziLk8VI0NfMkpnd6tUwFprLsTNM+r5rYROzE6kWh0ccykvRXylz5g8zvY9ImHkaFQOH9ix3podjk4cvXT58B59+hLXmdXHIyM1WKjmeoszg1MIekZtnRc8Q+aArzOa3LxWcfQITH5svt4kjMuvdxC/NfpsauAhYfBAwBTKfQ/nYuJ0lhP6gyKQ6rLmO5pNLFpTgMvh9iY41Jku5pUSwYB3n7shNnTiddHh4pGb7iePtG34CAn0mbCFZO+0M+N+W7A3F9FhpdJB8h1zZ61ezLNIVlA8bBkpBTHK4jPq0kZ1AbapwqBE1gpCQb9NKMANwRyCApa9l821gyFmUQxKtSZ0w0dV4YlYkZt/1VcHabHYHWJQrvEzwezs2xBg6HsfTmErG1P47DltnNSXKaKK/RQj6J66ExOqhJHAAab6ZoeuWRY8wM/O8STMrAnnBO+Zlb99HrbaeOaPJTo3jOdKtlKDqQBAwLD/LRzn2zwoM+cDho1uWk0AI3p1QHuvOC58FUd3dt7FhqyzAO8mQgsQaCZitYn1ighboZYpqcZLaXkYx1xUL7QDJXKTtsZ82ZC/OmJ1TuJUJIAm26Md/Pign1rm1Jbv9Qu8NbUnlEMhI4gecVVuG1tU6E8atxKejNLgEjoMl6faM25DkYqPlIHY5LMXb+MI2tbstS6BTOmxgc6I5mce4C/ueZZt1Bhw/Cg7ZLJ/7DP9jCDJDqkiOWeTyOBwevZkQ7ve31a27dz3JlTXd+huAuf8Za6vjJ3zyRYeRW60Sr6Lsjn51wcHVqpikszUW5zQDrQHIbWTOiOQkWR2KdLViaoINqk0E3YEDMTW4qn/ivsUKvSnJlYsEEDW5ngvxxu8ZBW5/uoCXe0x4eT00Jdi3PdinPqpb7VqYJZOL5LZbnku9Xe3aLMZ841Te/iSMFDkSp9bFxdTGpg+BTMP3mhyU+MDAUcakKuuNyY89LqMazO+31nT70gbvo1aXwXaMrQk0X1vlE48OFRR/0lvviuvmsylJPMe/hzCh2eW4JYOTGRQZTYyR1IbqvaoWdZGzyLpxqz2P7bqXvfkeOr/1NSWRLW4c6fmaWS3n2cm2Xk1Be377GXlz59Ezoul0S/2gmHfsn+CRWMiS1Qh/+bc+rGU18ArBBN5hAtZ4AlsbX2TssCWiOUePakgGsMyi3pbWZwlIzV6+Ua5OWqEWrKHSq3SXh7KrMHV5iTqWZNV/dmx3Xe9fPWh/uE8U30Ypxo++Cq0vp9k0z+3JylKDmu8Ye6aT9VZcihkrs4qM/XgB6f0GMnrNExpWWBQ1lEhNZsVEW0ZbdbiPzuAfW+1j+ZjF+FS5jFi0rhH0wGg2OJ3cm65AVM/zPk7rCRAc64v87W5RmNHimfenD0XZs1RwbnEW13uqbDZ8VCdhFTVOcBMPcbpV9reMHHGH/9bKMIQ0EaT/65RwuuzoDDNyzaU6Ij3fMzXRHfPTXRutLU8PRzM/8xseynlqfGxtsnpRet0RkTNJCtPiJpZ736utMKeSDH1Z0n2heqlfLKJMdWRv7XiVk+r/35tXZceX/bb9pjQbQr5thPflOLH5MFI7CvsJlCItluipe5G9mue8YznadTbSMUmLqxIrMsKBSsmuJpxRTITfhjbJ1nkU/ugDoH3JzXb+MavzAca3Y293A5FOn8KgLC7Zn4ezCWDwhpm6QalbcTrmCL11yGqrp4vi/NSOo2pFlJD2vyRCBeeC/8nFnX705Z42+Sfu4r9fDMZmilhncGzKZCc9XdN/rTqE6aoKWJWAxQ6RFX2f7B782uLvn7R116ZSraGu5vnQ0NL7W7zPw1rE+PiHZ5mWTjzuTYf2gf7Gv1A5XgpiiSSyM/dY4P6w5wy5Ea2Rp1Fs9orJMbSRmeb4A1TKWjvIY1FwaUHh7BttIySVEWihKrDzKgBiKCZbnqXtsyV2zkmSKI781ZiMYafVLDNMaWLYOicWrq3i64s2sMeg6oCaoEG6Chk8QHZ4m+STB6k4ZylWakyAChlWas10/GOFQRqlhMWgudS5bEsX2rTJcxhN4BZ/+ZGzQ3pkV0CyVcnWAOUGiMaWFRp5za7gCSsJDBs+sWFevMNQCwOsYkl3faKJNvzVm0xw2A3Lnq0pDOWxSVfMJTYTVuARZYsGw5zfPeSkUZqfVsfD2dI6Xx0ehWkNRuAl4lFTDhR1e3ZBGVtpYOqSWI23kThG1I6QzP6HQMYmPwlgQLjaOoIok/UgBO0E7manLMsIItAuXVLgIdJ05fJuXNXp00JVTlZjE7c/IVl07u/XqeZtfBU3ZNSJfIukZOyb/je1am4SseCKic2YlbGXqJ/6YPpYzceVf8K/W0278BZLw9JsRLG8K4TBW3Wg783roESP3g/wI6LY4pQYWoYVhg0M8RDzszDHHYkNKcs0F5YKEb5RNmWizWYzLv1tRbsyHWnGcP8wIC8RpC/gDhk7miO39mzf6/iLcS6JHWucuSL1Lag2cfBk4XV+mG9X02LduyhGW/MxJWu/G2fbcKlA9psVSn4rhySP5/c3ESwarij4B7nl+RJg57utB5qrEvfaReN/I2D/E3Pc4V1P8tr/OyY9UMvVzkWRrOLHDDPJ5duP9G4beQsxGvQhOAe6KwG09//MuzGsmnV8u/W9ffc2++eRLiaM+7v2ZE5JHIgIYhLR6sVdnXi/2bkhCIpV/TiFxS2aM33y+on2OEoHkkq+XzFAXVF2gH7VOQkM5jAA4bpJyTOQX9QZELM2KN+0Gj+oFHGTbKTYjqmuDB8714uzgfy83VZn/VyOgeZiU/ux5ZUUWcuv01rr2ewJBjFndWfxmIlLV9+lJJUOr565FtpRkxGW1ccZD5Swt1TD0eHOZMdM66stwMnl6xchScK7kap3BfBFOOnGEwz+myWKFyhav0/0CbcNqeAoV6yrtuvUKuEY2TjLymRSL2/pBwXPa/ovaZvoS86d/e7KN3ERJsfPBXggysGIUWhJZxXuTnCEpy2cgjKuYH8Zo5UqNwuNAn46xrycBJN8jlZjd3GIhPuDTAM7DPLDphi5FnklUPW4tHHoC6lE2ybguhEXIAUAFvsJPW9xYsB+Y4nSRWJmHJ0L+dLJTW0kpQyyWsQ16cxhZWCTsMxThT/0cjmnXoLegWRZvuwDvZhbYhzPICB3JFHfJrS1Ia7rrYwJDg9noqM2qIpFKuewBgd2dRhtwT2kaqSWzICz9N7yBjCahkLT+6C3ydNSEZIXQVgxZiik265ETJPeOVHfVvOrhFoZ6h0AHpvjXrwL7I8wjGe26QCZ+OMP2xTX5UgancyLBI1bJ4eU7ytBQI01RO9MCeHN8VPS/WpsOQcnNgdoTGTa/n0C0meDegu3kXxhLnGGzAfbyijXrs1XyDMHkNag7yXwrt8EVmOSZnm4mkntn+tvF8FF8VE6UkI6c7nbKa2xJX2GbfD1Izsx7VMsBcpwVbguhmgGyUPmQF6aGbmWW3mAxSLLtv4B81pt/dv/xFaeuhoWWPZhoIhP7XKf9GSMbZi2/3GvQUogByZSss7Ely6bl1x3ocmQ2Mirua0mt6l1hX5k6Chieo93RPi29ksG96zK/Tn6hs6Egfb1qFxt+N2/7TN6oWx3luQkfvWK2PImQvELxdJqdkg1Nnz9Zxi2ujRz6h/Ge7x5KwffLer8CY1U0Zzc4wYXQY/QzPyIckmuqsg2J2mKoeidEez6yJ5GwjJuC7lBHi+m32mdHaeykdMBiFhFk8kRgPHmSIKWOm8rMBi1MVAYzhi9u96ypbLPf5i5nvu/N0ZziKhitzS3nRWWTcrvCEw5FzjP1iWkwvVoZdmmrcQliozYc8KZ3EsjnzO1jbDnturCmEUtK/4zbsQcIP8SLdbg6KCmSqLGUEFGWksZiUUaqDkn9DlFCSMbUOXNgBi1u9oLH9EK0RlibCCBr/EJJOG4Sr4SnYkNoW1IN9kjAYenA89lazH8KMQTMgZiJFcjIqGIRGWlCSu2ovaweAd6oYUGwQBRVtHGCDqFschZrglmHdXpCvGVx1AdWNdO2ShB57qPLsUiKLbd3VJWL1aCNaQ73muV2M8GTF/9Z6VwYUfEcXwB/ngkOX0T8HCB5bRcZmUi0jsoZ0rodFX4ya3DKosVg8HmSjIAUOnTOiYS5YQbW8CVyRaLHDDBEOJvIv8BY5xiNTODb3vG7gnav3m4XiJsOpBU6sy4BRZBONYIc0nMnnWZjgVmw5+LEOuO+lc5yScIkbUgXybHimy1gwuZGUxXvPOVYB0X6Mmnqk1QqfyBKFExHuR13g/Itui7fmZmhLYH/iv3v6rRBZDo8BR1Ili8rG70F2HhnPMia0ZpFamT7+AOvdu6pWIxbV5oYW0ZoRP3sNmjYuJXmz04kkusR7WCly30ycyCmM0svYy8hTD8iqTyZXytlr5JOweXApjleCp8EajfVs5Isqd6V/qvGK3J57fMilDeCN6Eh8Ao0CHkkK+L3VOX9/XebWtW7RVNBDCG0ln1/VL04Fb6vshibNPuaR7HnsccG/hC+FzYZ1G56R5MtaZ6gbFyEprAunUvYBMo7pXO1MGXMiEFJVEb1tcKiQIMl/jStVjT1zBEk1zzp6KyYOEP2XkSvEwAEeQi2pp/LLM6pIvOU1xBnGzQGM7WbE2mpZa7JrlBjvTSXN3F3E84YKCIf+HpBWEQVJuMVHSQ31rqGo9DR5ZQlOqeVFB6zS8Wj1GbVDFOEfsk09WIDkVHKSKn0WqN5imsWNrYmztt9lgZ6lWAGDMNAM72uPTxw/EWiVjmxqDYWyuIgB7GQtt48f7+qLiZAmiaQkpynL9S2vKUkCylNPYLY7ClXQf4WlzKXhHWBK8cpjjOcCXHIy8zmoTpdVMT6sZoxngzbIQpMo5ChEMcfzqyJTKtKihp2keyZXAaIecc+zoWoGN6UWODp+5YTFxyIwtnurmubI6YsKLur7zfQLGKFIKdppdNG8Q4uvxDSHV+oCaRZaXVBudntPVa0LTdnpFQa9azyEfbS7Bg0BBMS55jNga/LEef5q7B1XcUAccTu1f6r/vUuco5tOpmEcTroziTdvU6gGS5e7MQsd3LjbRQSgM2jr8EkzV0S+lpYz+3MtnVMFmJa8odz7mJ/p66l3QRTNjk9WHxSg3FAzRKi0gn/qBhLTouxvNfSuw/o+xmOFPaOZMpSdpxSesNo/mfxsRR9zLOlMWfBeJsx88ewhiziB5XZdsPlKeomYym4tyqadnhts4OL9UydWl+8mEwQ1jbGxpWGWwkpzY5UZl5Skgq+P0EMdapax1ZmT7botmAfsLfMA/WbExlp/vQ0IbygVpzLmyutMMtbn8iTSnDCxBAVhlSdZ5f9OVYOJNaErkSwn2P+9A1vvOL4qTymXu0iCjMlVlQtUadRpiuu8WU2ernWNkzi0l5Sj7Xul3a65M7I9C6TqaOU4TJTzz21VYAYtgFUGeyclvZ6XCt//mlTyOHkHJXzRYrTLMTf22sK/v4z9rpGsmeK5kgIKDDGX+/z89+JWYUZwo1rz7LZnCumTrlZtOb6D1kXuRt2NniVs1oSfW2c+zWROWlrEGrHGjcvBEZuqmcmmVMTjaHGOvFrDDewMmnmVCzxRlBtGLuc1O/xK8AuJVzHvAneYNaVyo76MN9Sr3b5AtEkaGgaC4uo+vzQtbYn4W7lFdTtxSunTF9gMGUhEkIaoop9+69MU2GJZOzpsnG8DhcjaN5jm7XY3hx2dGww3rYAhE/NdB8y3gE9nqNxom8hWC99pOVhYB8roWlNYZMvj0SoC1NiUR6h0IWFeCLeneRRXPNCbqabfvELF6HXFVc8dPAEOLb5fPH8B0dS6VbivOFaSOkWt1Jm1kcmzS0jZYi1Fh59o5pQeGqMLVGw9NzJGHOx7dsIS3Rifrm0MEKrUc/8Ca11wOKNgbwtbjXB+t+m4RrxWZaZNmEu3jA0xjQWB5PAjUxj3io5nL/Ag9nnzo0oOxg8VV3VXgYVbhvzoE3VlsKujpyWK0h5hQ+QOS0jvdSRFZorlK4owhKjPynhFIRRMXwgJet5IaalOMniDBHRciYU0Xizc7OBqtwfDU7dLyqq0vbQecLbHYG2w71+5SfYd3s+CDeq/bSqnX385300NhwxgEmW1Ar4+rMdfhgv5Jtf6LnXwgyNIq9aWRnNqjWjNCIFyF84OZZUw4mzq7cmbFyDcgm8s07533l1fbftvSMntQkYnaf4SfK7u1bdxC+GGgNLLuUFztd7xcAVnvkT1lsiZ8kT//+M13aZ52pJREA6RqzL2iIflzETfQHmKbHlVI8Ne0+ZnXSIggRk/MOY4WR6KWJSouQ7/q+CaklYECtUrWf5FgBYikxgwvXyRGk1jawjGSUSBJ4cz819PPQMcmcZ2/y0OD6/USQ0Ir7wzSTPzYnhJBFajxJ3pdt76pwXSEnKuOh2XDU7rMkNBJVKvKJQkro9fJAd96sCCXBSV2BORqwL4zOWMfshwcQbQU5xhg2lFOCXuxuchV62UedvXfx4IcvNJpx3qPKp+JaRncn3fLbenlV+Kei0cR9XpKUpcx0mdZ9AX/1zG4B5igN747Wj7zDQjj9NIPlwBEalLUTm34J9tHvFYIN3ElN1AhdG/hvhanoywlu8+xSddtZKHJ88YRn+smEILEksNO8LFZY02EOp4wAMd83bwEPHEDfoZeFR6I8PNAqEGOYL33z/Z1lDYhomwvmG+SNaVyjOdQrCJ4fCVuKqyWVObiBYkfkP2cCkZXMJnPLV/GYEJwJtP0/eEGku1Zhyf9oj1y9yaqCYuO3C30Agc2S9eTZF40BojdF+UFURptyc2q3tzQyHTZzWajRdLGa/wtatIfDWgjwbxj0yoq67AIIXbGQ/m5yAz+JxDgMWMxq7aP7wTKHzYhoq5laGdyNHoWudyBiUYz3epfakXqJ2LRTHijM8mydPitpTbnDoEeJlwX+tvzKa1qSQlOtvYKgrIs83cxdk+sM5CZ3pGykJDTGhgihaJLgNWOf5feqLNIplzJqpZQHRrpyrilGLJSyLxO09h+il4aGrdN9ICpMNoYYGAgAcLWQqnht9+jlK3e13Pi2b98Ltc1remJBWJEJVOFB7C9czKg0u2eUFD3zeRF0poNndxC6FdQKGjgMYtw65sse4O0bf5REhZOQzOHTDntOcwz/mz0NoRcF5h4gVCeXmEerbdy1Gv24VV2tNduEun9C7A34rFlISio6jcofqz8lpnuaDVInVIcfD5PckVp3AMZ1gIMujdoXAVitd55nAJte+5CnhT20kj9zS61uqYWslYlfCs2zt6oksWVKphir7ZeQxg6c+LF525RRFPdLLsZxUPpH8e/fXQJ2DrV85PoluZI7O/7HK6vyKXqa+QI5p6jQd/gmtp2NDfzPFhxeOTqdGW5PA2xm7oSXzQQuo9CBWKukz+PWzg7y6Ol5Y5tJt0+P8OoU+Py0qgSkwZRsGJrv3KZ+bI/vat0iFVupe/e+JlFtBf60c7TxV8XMnNZIUdcyRGg+W1UQvFtXRmd9fGc2LUymP3Upt7zLG/ivkR15sb52/lboxl+a2gYndRnMZm6V45JWT+uIJO//Yt9fz39THa2vKVNPHSPXVN3J7lG9ZaLVfqVW8mmLAw4BTT0MPGWg6gLJSl5YyCn4ZYEkvsbCl90ENjfcc5Yx/WG6TR0ppAlE7rkgHXT3SSZU00flf+uE5JZIwHxw3WJJ+hbGJZWDCQrJufTCYJxv+NvmvggPZmwPsoBdeNzFw5GKx5LQ5pCoZ5IEz0tC5k3YxSUE4sByNJK27pmaEBSGZAK+gKJa4MOuAfemyhSB8R4Sf2qTdO9ftF6pqPT8RGAUMCLSJtBggrsocBNLnkApgDiaMfYvfk/Lc/zzC55f402qBzqAstt2eqx/RekSmYXx5VIJduw1T4+QhnzIe0gFaN7YuY9X5eWZEQDXF1RfezZvfw7ht5xC7qLRvuTSvewPq2HmNfJ9qijYF4ARgwFXt0eLO86a0QR9zHdDh5tHzjbmIOmOZirmQuVN6XGPzvdd/fr6b1hav/XKtxfyR70qJ5925LytGi8wdH142muxGyr2ZVnh+UdbaFwUc4eJEF38rRts2Hn/Pe1FIg58aXLcoNYMgLugDJbRq1hvIyDFT4D7eCH4cGYUPMEULftAMmmeLwfVTLbW8y7t2vLeM2upP82DFIsXdmJ+1CIilHF5uSvPO2TYm6RNEAj740lxkNfTjVGMyWrhMk2g1BjCNtuK4aSBgAXEUx61tn9LdHUFMM2TensJbozgOGK2J/mW+uLnV+FBLrS8iDj4NJ0DuFJkXGNsR8FsSt/Z4oso+m075HA3DBUzG6HbFb2mtKD26gBgIaAKrqKuLvouUR5zncIQfd4zpLsW5wcOPvY2Cgw01Hp51teFJEiUySl02i6FpUs26DlMJhquuvjKCSgYgdKBLgVpENe564QynzAe3cd7Yua1jI1nX2qsuOH2gdMxfVg/W6K4UNuDiZwO3qQHzuPSEaTK/Kfny/sCIZYFn5ofeqzYqVrEafjjqq+s6Y2EAjKL7oRZR0rayhv2ZTzZShDWWecWZZD3eOHu6wlla8A7k+tT1RhMu7fht70a17onXp9o45MQ1Y8565gk56VwoEKsmmphZNzY4pjJ1DIz8P0PNouEBaXpq5qwUstD/RXLwbLLuU6bNVDryGi5HKAd1uUSc/9zoKXay1aVMdcmO5N6cDWzze7rMWXbhWKKC4pabkoEZMx0AQiY3aBF1YQ83OzHzX7MxusYczeF0WVjZLLUlNY8D9lq50kvFlnXZ1WrZqohDkuxIrwtcxjbv8QyQimzS38BOuM5ETmXu+EXNfRP3kXFAF5XMcX0EzQkwJ44CtjV5pwNBDCJOKIa9R+ML0owBpuoOlTMv7ZOMy9OXDk8015RQpgRsaQx5riV391/7iXITwvuoklMVunFCL3ju2XTqg+rb9rr/97JhknpSB1BuAWO7fqxtgkYwdkxgPrmrR3VrU/H6MX5u1oSgAWWvJmheAfNj3PwfTdbUZkeOuVM6yr1hU3GkhTTdc79A321rDifk6L7SDXiYNtTIUx5AeGGQUMnnvUetRQ5puvT/51y8t/8yID1rpSfbkdPZOKsXzEdovwZCGXPn9QOvbPBsBO48ffr/2BiVWp6MhzHiAJJR7tuRxpoaAB7lhqFwY19MRIRp7iADS5iFkMUyUp5tOPlBdWAg2c0hflL03Ne7ufP5OgZ2QqoFyQINQa+XKZ1Uki2PI6w8K+5Mb2/hWTWCSC+ZW9SzmP1NY+NpeVJRQQUKmTd5mArHkazMyBHQENEODk/5w/ccVMvKN/sy56C7p5MA1CnIR3EHl5nuSL9Z5FWGNUuOnCNCLJwgeQVdQZpk5k1pvomoiCgMG/JD+m9jdeqCTsluj5emTRI+D51OLJwQ7404KKbsyO2ZwmaO58Ij2pZONtOm7eD0C0Y3pkTX1rKZs0a6x0Gdj+ZlZGe8NFmVKJR54WdcjRmEhenPZJCOvHl2n7WQMBou3hmYNx3cyXV/K/uXhcANeaSeM0xcrBxIz8vfZ9fOq8Kx/Nhdg0UTbDhsMyTW4GjBrMqkKCYj2uhMIXjNaO5taZlPFuMl+WEVwZx8Zs+hFnhDnMPwXHFxVd4cIUxlTzEIaGUmtA/rg/Yb7DBi7k0Zw0YirCkJ3X8wdIdUWiQeqIy3L+rgpiqSahEsCmtiZN8zFi5fu8mvCprBimz8KoCA8YESHtlY8x9eY1kIR0d9KwNWmOmOaRej44Sj6qz0MQABrjuj2DXdO6mOE79ZF2eFZeXi9igQ5wmXlvrdGuvL0B8NY5ACrx05vqXfehNRpupjx7gZsW+jR0BYNn2kQBDOeLd0sY+YSuhUyWsw+y8fmwqf18qBZJbYO312W86yPSs694FydS0nJnAFd61e3Up7Po4rH5L27wVpnj5lmMYqKLj2BLglT79upDaK2tjEFOkFHcBdILJlVL4Wuro8OEyeUe3pb2Fw8awxaSJ15LpxxuBScdxNDhixjzHd41nazeE4l8BZ6wUsjTITOoY3OGA9gU4U1NM+3EhLdFJKXNI8OnZQcyp3OhugXN9ka7Q55L1kD7vvuVM7e/FMqp2DUaQcJK8bm7jHWbx+FEHMtXBHrbZhwdnmbWANSgsBNgIrzWVf8EywgFZzPLuc4dNuu8y2609DgolMHrviyrXqXmE0SpSiS6Zx9zrZasjaP0K2hMstglROkIVyQ9K3doapBCdI1O1/J9RQ+ukt4sZ33aUBLZ/P2X4Hh7iqu1qWWz5pARGCC94spD0gmZKSLBNNTjY0uomo80n5ylfkc90bapLrSX4DHftDrQ+DPdVBGvFeP0U/grHxWEGZ9/YMDgjfzKasv3K+15jIQCLKDy481+kryN+VDkwp24cK6SmX7zSV5+aCIvhkA9U4zro+dcaksrvGIl7GvNOTklPugtZmcDCF8ehLB29TTUhBGYeTZnaDK5dvl2QmBfpFgmRs0+muB1X3LV4vBdnWHI6QB5vWXlQ9vyoh8jez0DHFgsCBduv1lrl7RFFYIqJu8+VpZ80LpxGD7BulbHKKeBIwBMzxM/uHBp1tW30JFk+ZMBisCW38knxCzCVTSHg0liUL/xo357ttVrz+VuHuj17PwnqbDXQoItaYDDMFvOu/Kd2Wu0IBYxzXjT9XmhJ7trTXNNdnFBSR+VPr4EFVc0udbL4qCTZQzFx2zlg7OwNFjNpvDPgT8+B8fAPFn+xkFRnssMemHoCFsbXwmDKvybHYClFfrhLNRDSpFSxNq+qyk+tfEyL+BFtoDiyECVdwRSFNbYDRE7kbzx2oWhjpkNRcGJz8LsrnZef0+jULZYJYT/+aL0/FSARqlRwZYsr95SM8M/KFwh6IIbI/GVg+ZFp6rJx3B8WYGf/2lki70zqALCYxfiW7sunL+pbNX8irMmI3rZgeu4ZKEIkzlLaUJPkzlCf7KNhu5qgh9bGfy5bNx3mgcWl7ps0dBs0986EzgghZCCP/3pm9SLlIuQBj4z2I9UY8V01gM17eHHQszDLwrUTYlb60/QV7z0TUoJZZwa4NwKLGsIueGMRBKnnAP3tLyvaVqdVFnjdzwgFxpIrZfwCkGfugE30EjGlpGbVhqamgohmVU+yIJrz3a/FCYPFEwLFCDqkyQMia1UjwmrFgQaN2h4Aasr4N3TQZlDeBD3V9uz7kvP3MGq08gpcm3K2DKK+AWThtxxkBtmKVkxLbpA+dOzKfTTSMErD5M+vaSyp5wXCyCSaNtlRK8JnwmvuqR55Fm03rWcjEkDDiUYJEBnb22fTLqQOmjSceP7d8bhr7HnOLD6o2WxskPIm+cuIcF1LYXUIJfuHC+VRymeGkinMCzIQJZsMDqcVXNJ4snWpae1F1ah3gYoX4xLuzAfT5mcnjzaEelQOQONtEp0Pnl+rVp6XYYZWJKtCFL+1iOhKaXFnC3PQAOCACvSnO9ZbiZ4FO0t29LxL2VAUyzwN5NiodA9jHM/lW9PwfAZPpFXnOJEOBgYSha/UA1NoXICufUtNcuavzVZn3+VuekmucYyf1h1os+M+n/jJjUyHhtEYSPNSwIVvkQDqD6boxG/zaYO1YUeBYysweIpLDov6npadbp8i+lbMpd/xoq9CMpQBTB+Li63qifJh/MIVwVs45pzPRGnRXQwoNJ5HU9HOVUbLPnGo9BgqN7kUisVZpNqkeA6/MfldHpbXHlk4KajGp7TLBvJchPR40cA2cdKhjH2ibYjGxW5V7zUYZ4jg4Wo109vbOh08LEuIgogK247hvEyNKSl5btQEoACSi7Lu2jhwJ2qLUl+XuOIkufunEmTqlFmR27iTaS46QczlIgfLD/TfLhl53WYnERcit7TqKMhJY76nTK2eDyUXaNYI4q2DvDJ9vOcO+UF95GnDKwF9WKn+dJD2qru8CpxW9cifvkXdtmQ68srlzYsHegA+c+2tfUhGBBBRUbr5hPpthvB5vCb1hfBnKZ/FqyTiWDrYOTqBbCbTe5Esg98ydSYQz1nO+IUbIuxB3dzaAXj8DJo0dTs0XWRCKSxpNieG+keKsVlV8XnmhrR9yd6vY62e2rcvI/ox3I/FM06l3qhOr9tAFs0lQTxJ0KrN5xa9gAuIhQQrSDOcX9B+bxEQiNSeJO7MBzPEzx3ZYij3ty3wQlE7NGTFwcy9TYAX9BAHxFmbnpls0km1L5yh+/LsIQ1rcxB7coerjMjg6OWHzWLlibBWlUWJ5aNsq1V+TSaI13uXgyGBNTEvZL76fZLCYeZqOFdqQc32X98MmEtRoyFSyHPkd2l23AKq1sH0OnXf3x7B3EJiTb+PLS1qTOe12LJZRQsJUDaulfBlpQBFf9lxdmBBS6AnV6IwTptiaq4VE+oY6RTHa4qfcc80hdsyvpim29MXOHG866BQ/VUrlKi6ocaIJEGTyZaOyogMunq+Hmt9XJeafZ059gzywNDL8FJkhGZNqFUUfov1bdXZi/PGvhSd/ir/ycZPW4qYJak3Oe+T2jkm5/sLbJCW6a9e+jF8BRuH07Mcl9HOYmFQvGK87zEY4MVlIPQMm+TOkKwaxlmXdfXbfXZPSLIH41XPWFpuFg3+fA+nNCG9AAOftDA9d3wMgNzjRTvnn99DiVpw1EPtrd351jv41BXkKGzEWnHZsz3xxaDV7UN+vmssNF6QnVFSUgYNUEToQtmPBLzauH6v4wGjlutjgxFN9ncPkM3m89PKZ/fsMnRxLyuWX9cWxsfvw8zRfnCTuvnxmyGD0AKWNP34UTEIvZxqwzY8cP7CNQ4TcKGhd3wbSm4Huq/Bx2SkOlegE0O+0wFZcVj9G+yJNHRBV0o2kxZrBttLorH0seSVpCwGYFgrb0NA8OJ5NK2/CcW+pPklPhQ6ws46VotQ8uBLEfwshjwlTMM4ksQ/L1jp1G0ZTHVjevenUFd96XNSTksyihTZo0Aqd7HUaMPgZ5i9hCX5TphYpJQ/lOabYbLbgbNI41hTjhRAdWiGnjVs2gTDsz/EpfmooHP07pQIiIKgr1fzTvXR1L5OEiHkr/AXwvHb32qQZzDkIea2Mg6noqfBFVDn4ur2l2vWtt9AwZJOzsfTwu22+Tt0Mi4BrKyJ1GlLHQmv/OFv24FLLWqp6Z0dQhSLvKCzAuFxbA5YcV7ppGlNgKn4uT8BlBkq8oTq2iqQMF6eMTvHOGyeaIEN6AWE5wWK0ZRlFK5EYlMRY9SoXBuYacSrSVBdnbZunE6UAmh7XCeKu7acpa/+zNyZSs4l48m8QpodC2eG24eRr+sCIsHwc484Zr5NC+mYKMe9E8kxUyUqpk/HelYnH6i7TeWWheG2lglJu/t/Mxh8uBklxlU6DwPQj66+IvpBEpx3TSJ2No2jzVKF2eq6/nagXrp0GDsa8GPJMeC4SSwg/UZ2/HTz6vvVJdeMdCyTOmpt63U0Ed5R52utg0e7TOkqA1w8aRMhil7Qz84oYCjzMJeDAcR6BkIgCGs5THdVKwqbpPDvVOiQ+Qo2MI4z0Ax0XJAgXrVAj2MGEpyf94rf5IKGfeMGlFsgVxaIwrnOlt8mP/Skj0HmBGWZPxUPT+9jO2oSLWnUCy+O127OhVv9c7doc/GaHoSTavh5OE9gsVsC6ARmZzE+30aST239hYQ4kKZZl9sAM9WzEd38Et/i62EclZ6d+ucUp+4kbnJyvyW1Wtt2EFoX7KL3/g+qKLAsJLDUlZGf8mcTofpl/VxvdZnEvV7At8fu3E2B7GmhRehjUKwB7R20NcDSVWbXPpCe4sh0he95ko96KiddMJH7zDVDtmADnUjXUmOU3Vwj20UUms2yzGgLvlVL1xJFcjZ9/dNzLZliT4DDcCrV8o0XApX9QDfflol6ukvjX+KZUwVUyi7yQgI8O1OhwLGyxnzCmTASZSEpGuYiMx2qdLVnbjymRjFXLyCyzsLEwC70xvVFUEcR43g7hQBwcrYn5rG17YhlZxICBRd1aiYiaiEopEeBot6KZrLYeZBuC1cAsEOU2qFNjt4ebvOc5+58ahysPyQLKhDajutLdoImRWdIaeVui86tBuemOyJnQYZhXfN8OXR47itMynrGlxVlApcWlWHESGT8A1jMUlICqVNKc1pRLubVo/nx5e7SkgSva69y2wigHUvBxqCuda7W0cspDZnhPlE+CFk0F9w5iBRJot3p3S7H/wJYw7/vp7TO9llId1Mrj1P3cR7PXvpF8EBcPr8ThuWppXFLkCRcBs8nvIcn2rZlUcfq5lpIM9/MuPWot9Lh5XKhUPhuQz+ko0VG1XszORlzIRRIXFjcv25MSPoKRLSmDC2BcVLKCrO+rqACeRqbbveoPW4Qx+7zR9dGH1GZhkmSD8jMQTf/Od0209eBgop+houNDOEPfMTdBmPyhMDB2bBc52vbXP3h5LcNhnN+toRYeGzBpoaYh2pOHSteNKpnM5lucJ6gE4KLxdpTA5wPaJLXHWBVpllH2cpXWFpqrt+l/mL6P9Y9CKc0PPSxMdVe+F7fku/qTGPKzJA7GgTSXFTXLnLzThTscEfGoSEBYHdkhFnG5WTIrZ2GUm8xccXGFopw7aXOGvDqrkWnEqdLrLbeNCq01/wiDrEYsQDoH49p77eqd6sKLxh2pfD6l1uTxJnuULEzhOZmV7gSkShYc8t3rk66dkASTwehyQPslewXFOhDWK8UJ3xty6xzOYWFSkxSM0DTWGvSAlZ6xpVQKi3sh4kh23rfjz/6Mv5Tr+ZD0whZburUs5tbUoWL2ixzGMRBklZ6+8GM7Rs9tDk5cH84z5MobMrtHsKEK+sESmUty1Uhe/P478vWUF4yFBeoKNzFx2oG2skq3wJ7xNYB2LpFkIz12DAiK8ceImbosPewor86afN+x9Lo07ulBlWTldqiQdOzAIlJc1h7xCSRXHQydUnI7JREeCh6K9vcs1GlW4De9BqNc3QYec+cmNyC3xQed5faTGoqSiEEuaR9SjMks3V6EO0I2en1/0X/86WnB5cSPrJpIq7szGnG6NzUiPArQc1Wz6JpAL+UrSvPnR6iK7HfZW/jaqI+BGoxMpJ7AjHWrOKQZOM4tYvdvG9dMb27ImZBMJMYVuoJPiAmf+j9HSxBgUnzUVXXZ1aUSR3Y0OaIUWlpKNn62tJp2ULJNUk1IhJqva+AZzZ9xAxNjfLMMdeMNRnf27W626WJMSHMI0IVwl/KuSYX7oGfYT3EmhPl5t77aMBaq1NsqkwA6GCSKrKbqaaAXdIJGJkpAky2aWSbjRJJvhWI6dzWloGKhKnxK7Pq5Swq90lmIHf9ihP5JGAM8B+CSVa7VvpvaVj5vcuKRiyOUrby17/ANRKwxqQB6TNgMfcbML2zBHylqBV8U1rJWuW70mne25X+zKgv2hsPNJno65Pnos6smKZ8uFS2srbXYGZhBx1rfqTH5/GA7ybjFdzH03V6Dfr6rzFx/WsyoTF33IojHCdoTZ2d9e+mi2sjQXqdPifPdf0hZYbGcG7W3AZoMzzxuQQ1Rv52MF837IdmsLN2esee5fnktso01NYn9pux3HAVknx3b4yiyqNUm6EQy3VMmKT9djXr847Tx04FXV9RgQlmBfYpgLVo+MteBFZqpUPjo291FOdOkGkV82qE5Z36NIGfSRcvZ072d71IV05vNrGhBtnLfq7bfp1hanvmFiuIZ35RC1yvmobTk2HPp6ehoR+9S/ul0fwYU25GDNwmsIPLCGHItKDMVHU7lCwQnmDfKzr4wKmB0VY40b4wi6M6VEJp6macZy4ly/vjosCLGRFhEzN9F+skpO1ZWM4TJWLDqNucBiNQGc+Sxomt9k1SSGhFH4R+uyY8ICc1HqHUqz5gg2W5KKwdlsy/dgKeDdf6f/zrlWToU2h6keBilmtVZl77IRSMv5v/smnqxQmSetjQm3PTN3/C+dmh6XHqYvOwsV7LMSfOfZJ7nC1nIYgherC0r5o+qAPH/31GfV++kMfR+l6ZZxs2VNXg1jzM7vufvpLMdPnwKDnURuMJiudsVUYcrtzIY9Axhmw237LAP/iCE2B6RpLzCx5AFlYG0OWIirER5cQYH5tSZynRlSmwsrYUnjjQxOOA53j/CDt7nXZrOUO81bhmZSl/X4NAkqrGCieTq/uKDc+vWIwLMeqqyJEX9pZuceNRnZdMZqin7gXf02etToQP3duSMTBstr92+9lkD/GIcU67aFZUa9JBGjouWn1QdXpNCXIAwjK2c71bhfSGZlf+PmQGNH+c42VNYhVO4BLrUHdD4jj6hCy+YpGA6FNnxeGF8xmA0PanBbuWENRzlsEozOMgeDMLpY8fyAUg6mhaFJUZ7mYP/fPvy1bctmlGCOHYUFY8BrLPgfX2ZpMbzplbjWg9l7FB9/KhxSKnQ+NWAQiphNd6QPktTlDkf5TIrNUnLpJyQslIZuKNUQsKCaVVevDncr9RHq+mA+vGCR5pLPyQxf4I/OTdqZghqKQ5qsB4ZGpZuKtmi0Zj/vzzb/zIrsZBZ0jtxbHXSYyNXPrLMfWhhaBRpuN6zMiZFIm/YbK9J+IpHux9NcWUI+R3zw4Z+5qjM3fNUs2I1LImFjxfGM1hqN3IkO2EMSuo0ImvwE4EcDq9shLg28Qv4plSSs/jNnPREyjaiEM89DqfQdrP/RT5mR3DEmVDuqphme0tsQtBq7wzRHUtSOOqNWptntZQS+1J18G8hbE+P2Is1xWDyJNqEddbqiliSwuLwkaH5RVHs5+ifRY7MrTUzC7cnn3blOpkjDoJ10bA5P7jFQHF+m/jNmGh9Lr5oT4JfIJ9LW3xj+t/iN32R+PV3Ya3TNy5iwv/Wmlzv5D9R0Jpr9vjWSEv44nRlkO01r66YaLdvHKgcMYSD6QwSva4YpTL63qIUE9KYVQ6NJMbEUEFE6AUNXnueHUy2dwW5Hrev8ltwtGYj7yOHuI5eVDuLYF8KKAIV6fdrRjmjMIXaSkE+BoSeR10xJOTINzjgkDN+hYsgbUEBa+5rfLz2igADUvNeNK3Ee2hixZGKZ2yBCUtot4Y+Ta+Ms3p7M+1npuT5GoYFzL22cW9CdmllUqW4ix8ymy6UBVnR3qY459QDXacc+fycpslTLKDVN8UumbsyPl3fngLmRLn4Wq4zWZE1w2+dzpj8bv1WqZUTWrQ23beCzBl5gm93tPr3JPg38oPTxZcWDL3SR43fVhJw1WIQFzL40MWLqqx+j8wbHbcI/JUDnB3tsGzGYxN0kUEIlI4pUE49uM9YN/FiMrp53t/kuLtnk/H0gihxgCK0fjE16Smd7zhGOQ9iE7GQ2RztQIfbJTPqEkVdp29PlLR3jNnFf6ZA2+cUl7XdeZ5XDUXhg1udd3NzNUK1TCbuzjh2KyIiEtrRFyetari+vizHLoPEA1B7cEk0zqyA9ST3e40GFduHILsxVo7a9VGTPIXtdqnOX74jJ5S++EPUmu/2ViqNXbJvxwI7/+FKsJak+CuVO/TvJVY43JzNx8i/4FlzqMJm91GQB0HDeA6In7ydRisdmFu6FhNg6rEM+UgtbwRCvEjm0DgTIBC7M8yrtBbtLMjTaWkbEQ26EMZPf6zsuDkVY1OLA8VjiCLXX25/YdKd7iPxFWZjWmlgDXmLOTk2jml+MFKzWJx86+UqWd3NHmzrHQW2OdQwjxnipquejUSlt2VzIMW7bv0+/sS/G/f5Z3z5jyqp8upzfQ7F1mhYoqgK8TiexmQOJ1sPBazh+bfDAbM3/Ff5hTRFeRPqZdXhtEKU2aezVcqN43Ihd1Dbz/cUbIOl4R9skrvi04IWQczqfm2BBsYa49+O0k9zysPsnRCsNKi3tQnKA/neuAN8Y48vr630fPRzpt1sivNbpHlffoB4g4mvEwuZCZSxUQslQTXzCrv7uxJuRudWuli22cuW0p8I3arSHJUq9mOiisBTR+uYTTz5zZvvdaCZrYyPs+lrQY87pvRZ8B9c8XhdYKW3bhdaU9eAmZSCkBvtcCjDYxqicgu1Tq4e1aMcp0fvCbzZXL/bb5uBFr/gvDar1Cn02m4654NohjnrnCb1YZuR1yACeUyYhQ45cIfjwWmPvUa1FjUIn3cxHGuOZIt1BfsYmH3NO5DSTJkjOa2k0LnozMzYUUvVSxe512fO5jPRUdDhUHR1/cIaLF0J3aAx8vXuoNHXlpXRsVKgOBORH/ZGLa04ad9t9l29znca1pob/8SH9EJT70ztJ/WzGfzvH7ltPMBlWqeQ2daikAWh5b9xXglfwmdPMwfpm1WldIdis9gKWYE2kvFd0CLjitCSh/3rlcn6p7554aoEUUTaIZ+lORWG75eOIe9eodbxryVwzk8KN7aQKfuVnFYy6iBb2qtBhI9cGIrhx83Xp91FX/6IFlG2s/UkO4Li0insCxtTHLPqzSDqEvXB8nS0phjRxcDTf3YAXO8P0uzBaV+h2176tHVmclFYYeAnCb63gOA78PgMg2znEW850LmFisyJnONSSFCQBICj2A4lNyhtIj9sF3V/uYHMM2SB43kC5cXLyPbXUkMxbQ1u5ZgPUVqirO25qBhBijDKZrqlCTY2uUiOmTQgYGtOM9ZT1c61G7bsZ/bIRgBQO58JkMTjICM0Wg3TpG25JmQ3psUFGfaiZRwheYKkLAaWzccNaSboqdllvyAzyIErnVgQTXG1AcICUXu5anCTgzUC5TFOEWqBDc1W74gJkanMWLW58nuyG7psLL/aipMHHFAVt9DQxkLgYPAwwHl2YOKbqyn9jrKYSEkVqdzIvk2CdkRjKsLR0aB6hk0JEDvGmDhmhewwLjCuHyMeE7bAisV+uEwRhkI2EkjKpHd6mSz7AsgKc5EhD92YJZfNtjdx/Xac1hKdpIJtUq0m8wz5kxwel+AjRWRychipA5N4p7VQdI4HCaZpLg7DSsA6HdugExZ0Q9KA4Ms84PlVwaAwk94ZRwCmq8CHbg5743Ir+gxNtGjBrXwX/FPGmGbZEfigSXcTRXUxxBeUNg0AABSTeyuX3PeWLdMab1cYXKWSier6pV6bqZ5or8Lkn1OrtcA+jDyDfMxVfZkmJlafAFlTHDnBHBPiAKGkhYIbtT+Y019De4ZIxMK4hqBGaBwqYxKrmaCYmwjGCFjKILxVI0HMcQg5Id+8jgaM2wSdDIb9rZIbYzgxKkm6u9j0fxM7GcuNDCmUIrBFmLUXG94kDZi+QGVsYPxrG2zTG7dBQUix1SykXFRVXABPR0M2VBaeJimMpCq7qRzAKRaVt7iVJ7eZrV7LysjZ2Iwl1RMSNPo4/94lq6PK5kUP3RehPyFjr4Jx6C+m1VRJr28JANvylnwUmbsO6uuxQbNxurzGTez5JTDJSPMeJ/G9vgZsEirjCh1xTPT/of6tiKIV4pcMb2+yEFPqYJHrQVl48Q47946sy/ZRyidNNsTCs3sbyIiDorZyodA2yi0zqz4Nv2ys4RpunwhTkPBDbKy0KZaivbuHI8yT/WDZexEqhizaxy3udczshlI4fWrApAiUPXqsqPOyBxFt+wJFlmm8+mDaJF9UgvAUIgzmENodPCTyHvwhiS+X2cgHX7jWjDRKVZxtd0Yfz2wQYoLmKSTqoxz2cgfbM3AJufonak78ooy4+wk55Ddm1+aC6ahgRGF3nJWupI6nOQ/wHN//J6+M/fPvlssNFGiDNY4Gv9E65ZT97zuX8iHAUcSDOjubwFqN1N0zswBT9HjzoVm6S4iEy2AKGMsEXEs9KwLpygmIvAXgxsQ0/3gMrvYZYmdXWvzikr06y1FzLIo/J5O6H3NlvDi3NWlzOKXXDBBKJwsttcLx+90a7uVpZGYsjhXdJq2n9iXZS+SXeUdsDZ83JgtXOHAFe1TagSP1nb0zbIr3r4jhi96d4lBs+RWS9nIFH1vHrhNI4RDxekyJoPi65SDi+/d2KXmPLrCt6IY6gEnDx+lKCgqZJI8PjUow8i4ezrtN6/sp3TDGhAQpsCX2X3i+YzUYYygHd6ENSMj6djeV1jzkn8ndn3GFGTZNkPs/FUKuY8Tk8J54XHn7CdqqA1c8j2aQDT8MNc6nvV+QcYdnQJuyo2h2frk5jbrzH6aYqrgn1RxXTpW/XVSlyN9eJVK/axuUBTJCLgcZzuqG8ibZwNjR/lJ5XP1NOu1Kj/94FVilvJuzHhnKw93MkSsMvxM9LYniPQ5pNDn1lpN27ktjqn2FH8ZlN6kd+h7g4Dma45++S/OF3dJEkpxjHceM2BxJFgr+qdhKb+twKrVL/o45GB2/XmkQtVluHxcy4staMW7cKupEjV9T2hrkPOy08xV373G/5NH84l+P1+QF8jgjaA5rgI/3cw7LGWfx7hSPMte05Ph4m+ydzeBPaCqcqCQsIG91LeZBCsQXHjRQ5G6aRLEdS69D1G8Fd6oWJt3aiPXehyueVXxDBc6WSvwKcx2ry8xvK98EzbhLQRPz2LXv49OYebAYFxNDg78caMoAR3PjbExF2/CDGKjs0K4UdBpQHlGENYLh3qup2GLg4mkydPwHDvm2YDF4SSqGqalfu/8iCphm/JO0DqZS4hmukVG8nyj9kW36n33IJVzwj4JN5IXLAM4NMMN5J1maxqxcg7scbwVO9okrVzva/Z28QuPfIHDbTHZNbVj7NsgMs5lwZfhJzoSAhFHqNJsQ9Nd2Oo7YiAycpVVrp3uux6Z7Smu+Kd0MTX+IYXpAok70tNV61m+T8DnEztLWjSJrXbJNqjjiblwPlr6EUG4VyL3X7jlGRSTfpl0z+/A1bcPyhk5+PKTGUs9W+92C3sBu7boMp3rA1xna37SI4Poqcyr/ILJAFq1dnlvFFYuuK+RiBxdrLT88dXfkH9w+q8cKcntrgA+V0dkpS1S9wG1+f280GXavB5INLsx6Z0FKIwvcP5NtnBYcRhgnxfDfRf7SfNY04GF6VDmg3w3mM/mpUsdRNAiRmx67EihAK2s32kMGoB6GFaWIQrP5WgebGSjjYEQ0UKpOgE7w81qo2gsP3lEhycM0J0pIJMeg3/C2MUgSHmMKBf+DzdnNaYI0JmsVIrp9xtx9VVgi+sYo/r/NAQM1M1WUB3w9mznWNQ7Pwv9nyZukSzKz3TyiZjLX+msqP17krZYIbgCBVLwnnspTZTrs5j6mL2OV+04kdgBjvwKvetSfqyhi6MIFpdLUekuY+5DujnuWezb5R/mosB+rN9vv8rinMGbsRi0zeS62wLwNVz4XHANTkgxaqwDX6ik/ZI7Hnlt+t4w+7bhtojOxMdj/kD5AnfT/jnAlzNawhDLzDXB4O9Xdcb67i0cycOpGaYtPVNXS4D2zYeWio1sZtulzYE7Is7g/S9Wyngvzv9pgICG+gBmfeJ0xmuU8m1KAKjiOeWTW6PkThCOsL0aHfUclI9hx/Tw/VILIFCoM5hJ2VvCQBMPuYeNch8lYo1TLxh3ZO8LSiiIYMAirBc3DBqn6Loe7PJONnKKM3yPgGQRt2yXkp2WopVK0kHNSlLSRbnv/TRrUkViDfX+yrL0qF4QMAmc+dMx7Sbnn4N1Zo0jc4jyM3iK2PxLt3nkogsy2lpJ48l/b25Jb/+tlYzGG2MMvfi1UrIsqN4AtyyiKtIzrw1vVIEal28GppM2NeehCr5GUQUoMS1qw8Je7+azC9fNoKzwmldaMbAfDc6ZjHbPGqnP/n5o7QYKXmAqn7REn4Mf/mXNib+N6a3PUR9MLN+b1RxYk1UYHCQH/zy6rWMEBg+/Xtj39eOKTawtKz+wYpwPgSebIbCP2rsl1bNH7WUNWI7T/PiKC/Tm3TMfyARBaN0dg/MS/PketW6k3t3XD4OW9xLE8w6SJ2ML30DtffOhVF637GmKJH9B5fWb36CjdJI03u9weuJd413maptE05+mirCDmz2mVwCf22CbvuPRmji9vzZwoOvyE6F272iE+oaincCAhovurkKBYeqRb69GeqNG80id62zpR9SK7LtHtIc/F7tRVOsSzFauP0Osa9ymOg8UzRDktt+4O7qFwu6ORsff2YfzQR9mFqfTBsghNGwkONu39uOuByq3GhbLC2Dh6l4WVGQLD445Xq5r050n0yytjw7LX6J5TvFpd3Ni7h8z9WTW2w2eAwhWcxFeuj/qrjpV6RDu2GehDYHc/cMjd05FKHuyIv51K5nfnlUVZRnHO9Lb/ng+S1sxen6q+Lwxc061Fyepeh3Nx9Qh/0jlcOHeAfsI6CywYlUq1/LytMv3AO0SYrJZb8P6PF/q/dj8dYwfdUVp1HVD7GW8mpEKNSW7uXxaEo0/ZjyCEkd9wA/q9pxvHa8nIalzaeZ81xalAwNFIF/FbI+e+ZFRMdE2e93exFaEPJ5fJ7/JttE8p09TWwOZekPMs1lU1gjSFyYsEaJtKUDSvlG45zDgaEY5Kr+E+FDkS52kEMLRz4VRlt/fCoKawtCrBZ4FQyh1AyHtXqF1tEAtxuye0+gbxj5Y51VmD1/Q+FiS+StThr9lOS3La8W4VN2WR0X4psTUJlGgV+pC9v436mVvK64/U9kzd++O5swjojQasY7rmGGQ/MYm7IGD4DflMUa7OfmsLbs/st7Kdx0HyiiTmnGUPRsdz4qqiWGwxEfrKfDMshnXPOFMHyyM7SwpF183Vqrc/joXQ/Z7fiZU5wazBmK2RMd0E4qcPtReVek+MgLr8Uw3d6may+PDz8ZO3/l9ORsuxRM8uueUiH9GjeSxX2j6b8eDeOZtx80JUBeiRiQWti4NRPZJUhCeFnjH4nMWz8gQomf5x63MHPAK8nnY6UQeKeC0JZVgghQHvbtdNkuiSg9CZVZ2zEwSKWkty7p7vzrEuoWbU6TkU20auYNg1E3MIB3z6lzqAnePMrZZzkzwNusN5oypLG12Z0/3feiC6e2UCAtk97LF9ts519f9QetVZS+5FHFJ/QH/6zkS1VCyNP5YiYvIRRwoJIBskYbm1wlC01y7BcVw++YuK5wg1mXlkOK9sIX9DguI7eiqMfLVB0jTa+X+mVJ7M2kynTelrBthkzRcgVqPprVwooHj8TApC0Lhz0FzIZ7o5/nDyb0dBm7qTc5JnzKZRsCkOdRu4wKj5bMOJ8EBytroezgZE0hSgSIAdK7m8Bq4lYztZSGZcLBPX4qxf4+3GTsgK9NQWPcFW3HtqNcr6EJteTTe3hlW5Q3MZ238xhi8V6gf0eQzrmGNvIUsXk15MZtrj2kndnYU6eaEcaiGkH2moriDlI29CJMML4l0RRQYyTaOf8E0mx85dTNPjV9yc3UhtRltnet85UKjOci0bW3ZX9E9TQC6Wuo4N8OOv43KknVjxHNGxfP0KetmO+CwJljSWGxwSog4LcK6xzOLvT0NjyRvPHccukKAfBbZxc2y3R3o9YtsifA8mwntm+umvFzg3gVgjXuAm0eUikGKKhgClV1K/G3iPLja6/1vl0qiI/PU0QPTuwMX4jC/djLeP4GZeKw4YzvX8FGBf/ozVLs1zjrL0cbceKxLonRE4ehOsevFE6r3Gtr05aGoM0JxHzpXAKA4LgeviKxRdmzucBX3rDzu/fetI2wWZwvY0m9VUW7nMKpY6Y8JSj5pDSYn1aAhYquFjr3ZpQD/4TDNn3XMXbBH2atYZtWJ8NvCVz/NOyHyfQinPrmbfjbDLvWhYUF2mmJD3CKtWRlGQaZbIjiTKjzdIC48XsmftJ4/feFf0z2/L0m1PIwlMBSfT6IQcRSZJ/t61kud7jl812XKaPV9txMj8kLvFn/P0X6scFAKH1ZlXoCDgJRuYZAta2Rtb8wAb8Q4PJtYWqSYZtC8zye2vTdqGrYof3JRBno1kAxiJEjlBQ75CPcB3T+LYaKeZqCN6LOcDHVht2fE5t3zb4tTEHzrJZyV9za6qOFoqxz6ZzEXRBfn4BtoqkEhi3/aeCYpd3SjNzRGkx/qdigaDWtE8/33DzTInUpCNmc1m3c3XWbPjzNPrk/Js5aJkrnRBGn2owvausjLVAgCyyr8+9znME5J5PsxKu2ohyt8Yr9ySDajIIz6xfv+v9wn712NzWXnjGp8w1y3Zfo/d92ysW50DpxRUU0kO5jl6gJTNBmO57CooCTAnXQlUBlrFYwdkG+HxBWw+sbHbSnksZDWvM7sb46StWV6V4np297FWQd7mYncs1nTBPsF+ssi1liYSkwWjhsw8w7MvMDxHGJH0GbNP4QGTEI1926vZGYbS3qqUnPJuAudEwQ8e4WMMXlpO7OEJLWADZWw84xR1cLgWesg3nm3svFrQJIjPuWnpJZZ4vtjoOe6sYmzny37MdHH//wG6saz1r3PzBY65f+WO+ULIZOntHqVjt4RWfjYmzcdYabRzTm7WxMIZDdPCHJ9UM46vzFpPc4I5riikltlwJNV3W2rvAHHIXG5P6NDcK4p/OwL+fYyI91ZDF50UhOyIE1ve399vauiKAj32jy6U9Fb6qG+hfG0iq7bl+zARN0ZIDi4nSwKPd5x8f7KezJWqiG5+kZhd67pdyXQrEeUMIvd5OgslYBdc4FrkUWBXKlda5XRRGrSmIJ7JVZLqbQtBP6CvlDynj3ZvKsRL4+KZ9r2ZgZf3gRI8ATf/80Nm2ySugDf9ZndOuA63ABXGVBY7b/XjGxFZ/y+wdD2MoTge+4/wnWGZpAk7QWtaTaRzfMZzMivkkSRYp7F6WtdypqXyXG9dE9ZskhDrDV9rvtogM3FPJtu+AzURyp8zeZ4XTtml9OxrJM/6Wcjv5QSETI0oC0LHFB+lRasOvGKDIA3lePP1RBBA7LGzszn9jv4H3vDloo1gDsSHekxme2RVGzo8xX4B8qIxAphdMA6JojxO6QDD6n4PxEqmSkTqgxwSmIXhD7/vKhL03L3L5No7uGyyc2JQ2G5smUfIr0Y2B56a0hzSbIp2iKu1fHYa1fIcSPG2K1urxBUZ0bF5rxIDByRMIri2HuKaVhJvEXULNKl/tPxd/NIv/To6yMQUndxW5uvo61SPdtYR3oHDC1TbA06o5492K09kMRc1trQyP/YodedN9RUaEqxTjnegRECAYomT4mVqo57rB2weiOziwqPQsz0C438+wli22WoPOCikHtfMpfa1a8ZDiZcbkgAG9vYjqbMdD7TEyT0Fj6akg06WuaHFKN8jLM2wYy3xZbPMeQaQ2lVl0Yz855haH6lmIKd0wvGK0n/b/iSpXFgdvObiQmTs9DAvhfJtQl4SFg/F8k6/SY1SBGS4fEdMAjlNDzFKeZTeREpQhB7Bbtqv7YBZkPr1h8zi/XyKh0PJCUCGg7Lx1RiXaTmAISX/F3X4zEqK9nCEqqyRwj618VHqx9Ts4g8J7eON2+0e7o/4QeOjrebshcLPu2nGD/STE6iMgw8BUhucYfLqTxzjdFj7muJhCnd864aHKwZswm9bU1L7pCEQoJZHOvV6Jg5+sG2ebf/HM7r58SJZXTF3cs7CgsRF+zTJpa/2ihzHpnw7+rIFJ7uveX/Uj4+9HM7TwhNu/cMx3eBQNdPXaPor1d0Ru6vaQKmrdhn699AWmnRwxoylCeNnIyuz1XHLdh9ZATrlmm5Jzl8eZXTIx8VA7kQPy/wIa99YsExEQiEbK5ymN4TmMz7GfG9uTtiAOP7bbdv9J9/wTvK6va1/p933+gT6CCXz+3nR27bqrMiYlFkLcHZSfMc2hl2V1xvMm2o4ZqlxVcXtmQot48jdHONaivQqGq58Q5F21bCqYV/SdWU7Lx25bZkyilJdvY+pPfEr7nXBD0Pepe4Z3CZHS+4l0IM2mWzV40ghZe0CF4JGq5+uJPz53ZTWqta7TPXq/pPp8Wx5VtPwEM7H4hons4SX58eF211voy1ZoKl174s1GyfacgoHuBMQDW0ornZd4TrdbZbF05bgdvz/98JeEOaNsBuJs7N+mwzBaouliCZlVPz+AsaGvCqoelxaSF0zcI//sZOxIt25sCpjv03pvsop64xsU9UWXcUllDyc3ZKJ90Wcn92m9h69dgjPXheUNnkeCQc+3t2Dcwuz7Ob76pxi13bZ5f99uPkpX/uPnVt5AIRr6rO4epOkm/QVV/stp67mjyUkXGYHrrr1wcnJ1SHTprGXj6Owj7604d/JcUm1tbGx026rrqwuSSbs107Mbp42fV97B2hlJjR7G22Z74bkfJ4lLgnlrbujSs4JiXKm8x1nJ+qSv19wpYtiPJA1JZvaeadTGdelG0sW29fXUOndp8sWlQ0vakJYuTQnpyxySPXFDrJ8fPq+xdDUvMF6jFvUyKkUVOVM4YvsPf5h6NmaNSz5ZdXfwMTT8p0z04Mc6fHxJVqZfNOo6G8rJwD/6WOtI+LLhfP19nR7xbrlNHQUji+uXDQqGyWJVkRHIptGu1jNyb7etnbzGZxvuey6QW45fuMu1SHrT8ZykjbPvHhqEUSZfCyeJ+iwXhjif2/An2VaZWF0hdc7wYppTOUIyAyPm1SEqyb4IEl5Zxa11taxlUDisaPBTb/irV/EElOmW3wrK5q+JMG4yTsgpLqbgJlZT4tgD70OuQydJ2/45Badp8pnxaGCq9xX/UNg2qCHoprVjNZZxjSBeUt9+EKLwPqkrvJSH4leb2yodHxcuf6QS9i9nDO6Lz5lv++oST3+e1UjONk14OaO+4ohj5m9BDf5dp+beaZ92qTXNPnV4c1TwkG6MaljfdQsrmGyq41yUuDvuu4RtSbQuUzyxCWPqsd7IjA8hHyVDsm6lhrmPQ2RRDvQBZzsAeFO9X7JU5d8J9hfItMP3ziXp5O/39edhKGq/Tumhp16m7prNtsyHO1RS1IN3P5UylI3s7n9EsmaevhCRLj2vLkweaShxWhXavGo8A7Te8692x+TGF5GbV2PPpiWf55rvJxmTjtIpi/+tkM8sku3M/w33WVeFZc4SxkK69AfCO6Rmgd+X9VuuYDRBz523Hrg08+TFp2/OWL8V6ryy6icSojxUvN46Y/FYbZ4qbtgp9t1NR2JZB5sznHJBBF8H+qfThW3+sBteaFLk3F2WWt5Pt840hqb0hCiOV9tcGwShRIQVnm8Ob/LoPOIjccdzsVyqcBQXoAa0Uc2i415EbJDYckTzTWMEtWY8LBDk98KQRPFL7cf4yhPnOm+6z+zg/OpvNopktCxJSNKswAKByHxAQYiVY9oFuknWcMDzR3cWpcCVfvNUDA/s9fZEGnYO4shGM486jFlfQ5Gp0dGuD7yHJz5ODhpeSbe1a6LpMY3RPvHl99zqFAVNULIxzL6ZU+iecaKDfVTHtKkj2OMNLM8fZJ6NQmaq/0Cs5isO7kisS1QGf2Be49B9/89XWSxbtOmg8Wjr4sa3rweDqdZf30fsnU0xk6fMjc2qra6hd2zBWiEr6ja9X02gyEr12VXv7D8wdmfvql1TzKFkw8Ni8rzeLdk9/9Rep5Ej77hN+Q/d6cRJ19AL5Svp8ZZcgcvj97j+xRUI8PoVPrQXM5zzo0zXhw+QmgnVzKUuu+w/BBSdb3HeJCzn6Pvb1/7h++99t/y1KxJHqwyudKby1SuwT1AZHHNcru1/1wijZqY8LNT2WnK2R/G1hJumiWrqg1icc2Mk2D/JYzx+1mVCKKgM+2e5gU2wxshCBho/UYyHYpx3tfU/WK1Gm1fOrp7J8Pl40mNi5u401TlF7cAhvoi7K3fcu4rJSWnqThK3l7oA1pSVwgrpzoWlsUfduyCaoyMnS+iaBxRPc5n1fihDQz1wAmbzhj/N3hNmyFh1SmXibv2kZKtjh/rtmGbZbbSpJyFsd8GQjad426Am81D/KaZECktYXa4dR2/EcXTrf+OP35NeDMhNkeC2/R7Qza3TRpsJjAx7+mqnB47dtxKiv7oAK850Sl/Aolez+UM2O1LbLHSYQjVE4mJ3zdMNoReud5IkW4vDg7EqNrJHQccupyGHjKUR5NaoxEfa/raMDJ/bqxoVnjrExen5dofij7fIlSU2Ik/PO0r3/SlJqvTLqncFTyQzmPekZG9H/daVIXlEOcF1XACtzi7GYwwTU1u7sT4k0sjrXD6dCjFjwGK6AVM3Py/uq0wmza9xadzUl8qQ/t5QNGQC1lNLQiOjtKOO1ROhx+OZzLxC2RlQ6InlurBAzrTH7m8OHWYLh+ZKGmaRIo+OE9Y/lt9tP1FF9FSWhNPbhSriisd7pXUF+QGZjfaTHnI1t/eJo1FdyRPWgki5nG192QJK0c4dMaguHPD+w/fr7YQCCb3XjtTPbG95ssOsrpGO6PFcd8V3rOjXat+8zaDR5votQSumpjzjaY92q2KTQCOpihe6k8GN7xRNeauhXfZefLelyY38/H/0vzDvnsC1iSPG/33kxifnu8VFwn9ja92/X5ryHSfjwgqfw5iCOgjTK4B3AQqHli8U2CdsO70as6l+PyQivsDRhyN/7UuLy8c0edx7841NO3gl/TebdMwuuxGxtZAHLMQ7CaLk1394uFUs8O4Y0t2xmW4fr7O2u82I7b4MOWfQGACDNnvBig3iRmb3yeqtU94O7A9fDSGVnR/Hlv2gK388Fpfn1GjXsK5nqMsa1zul259TVXl/0pjpNJYwBs4rNdJWgfto0sFtpLCS9232g8zj+53jSzrA6kW+0v+bcvaUJru7fpvGnu0bqyv3EWKzg40jDcGStPBMm6La9P0Sk0leSRpFzdfJGnnvFNrIhUvVcypkTzxaR/L8FKCtp7zv/GpnbtGVlxiqx9nes3MgpJMpXi2SU8CiTVDZf/KNwUN9kAjMi89rKRPhKcXDBVjdFozd5Wyaiy7jiGNKWx9BzA5Wqate2epAksOTBeRcBReuyQ2hb+QuSWtjP9LgOedrQG+cwhvrPWTAPJiyrifXuI32lPhV/3xxxWO/FfmkNyYSm/jaBUSn4GRjwPtioQfli08+JEs7MibTIv/a7KudQYZl+pFwN/KMj7SVuyJQfId96pdOm51fpfN57Ncqid4VAZ0zbhugWfmW5hvstFRn7s8Ij6z7FnuCXNu0W5iUytcMpKibbXLev5GUBt3LqHNq/wwguLdD4w9oFqmusowbDvuWruV09dGZjf2craqy2Y+d39cZ7uPxD3Q5lLKjD/o9Puon12uvNZ7O/+oyMVRbjLj2hr9rultqnKybPRYjJ1xw96ZHO0fsnSyeWIGQtp95YUlPV/LGd+VrxQ1cjTI6KMMQ/L3krNN3V0gV18+2l3k9twLpTX+dZF6LK8xLKC8KGZqRrio2Um0XbCn/Jis1SM9Q05dXjHv5sNM+ceN9nWrh/LVz633+VLxm6FrSYUStNpEMlMQKLQOw8DoY76KIN1q2jyw6V/FZ5c9mi734WTz2HpPdUS5vpvAMHnqt3LL8iWj9kxiGccVmk6T6bXtqmQYZtdpjLfwOd1xNcdzEfcRv4SK9PrwPbay/v4cVX0uiez63n3H3jm7uGt9V0dOb19gMaZEGT1V00+z5eU5d+Y798or8rcQhmPjI2t8P/ZbxRIXvpoilKriS10mlJOwgSOBrdj1pSWuU2VlUe3p9XSmlp31yj2okUl29UI2U7Jerm1SzqUZhsXsrJcf912ws9znWFLuD1TlG+m/M1srMPrPGvFbXOXi++jpf+L7x01eeoWlLg7oe1FN3/KavnLT6IsDWoqq4ebUyBZdhOt9mmMuq3CJ5VJnbHMOj12+9y7vk0t+HfxFKB6/4onvgSkPaDKq7vq2lsTfvymoQxsnuzlG2zNLTQNmikiNmpnPzOJoDy33jlTSlxd4Kw7zePH0edeukavIr4cbytO4xdahHmHTLl3+K/z+hy1vMdlxmVqU9SU1IT24+h+fLnevNHoGd6XmybN2A0J9S1FTH4kbT/Y1ujsjdTY96ALnexVi67BoVE/mD7ogn8qa+h2a5dtl0bJcX8EObZ37g01UZX9W2K405KQC0emt3KQffeGqoCWBkeb2kR6xKeOaK6gsN5CW+3SUQxNzjNiRVuuz9z1l71nl2rozeutamrzjO4+Z0ffD0nHc5S1fhzywn4n78k3JwN5azy4Cz/E+Ta1jmy4KticRLxYEdLrZbeP+1MyMRXOTmLqXCla/s5lrSW/Lq7qgxnZq23XQkwWzeHHmqoSCpSvqilKiEuCjjH+Cb7ecQOya5qnbjmm59Pzc9ww/FJh/jJNWy2pJu9GAC7AHrCbsofIZnKls+wm77a1AE/tcQ3m1QU4f0aW3j6WH2mZCnWrcCf7T9wOgbaRW3DmHLGxqp9KcNVxkwGmvw2mQ+wMgMM3VLa6AGcXZognhGMReY0QX0/ZCgUpi+4vh3V44bWw2N0Sf7nwXSmsQr6ZwfU2YwZf6gsRO5GlnyezVsiKzOFe/C24MhpReCHHLs2Bxquj0sSRVNaftxzKdkMuqGfhNJqRTv84m+cbV2oujWheGo9wnW2nkGJEZ/GgeB3jwDEG3rRfIdkNIrne8FtH/s3YCFIKNt5kcgh04iTJI4VZbriwvv6IruoQqVVQsY+yWcKmCyWPIwJOcpy0C52eRrrz93+IPGudgwooNeDZzEVWbENLSWDir5BJVesIR8AAjf9fHeohLtxFmyTYJs6W8cf1siSMzYshg0UTIe/VCx79o3GH+2OWv5HmLmL15eXZcb0lutxcNHBo4GBGnEulsT/xMJynh1beNMFI1n0zmfmCNJMtXW4/oTq7RlkWFLj2f37WMQIpiJo2mhHgHHuTLCtWKmT4hmnCReamcK46J0g2be1TLOfrYoGi4uIxpiWNa1GyGGhIp7pwwBo5UwebJI0yJQ6ODtqkCiaXB/QbFDQHwYO1/nreQSUXJrHpYftcu3d1vOzFR9pKqffPBY1FxcV67PCk34EawA6bp0egfwvc36MeM9cV/H7ywXbG9fkte17dJmuHY8bJWsrilIdAUKOXmO9NTwinO9+5Kzt4oveh1QvGJXtjNcjfM5hpO3c2Udx3e24Vyp5kbE3aR2COtI1rOUPlbSsObheEqcPooVsHAFTkaCGnKsam0usAk98BEpykBBqrAuM506u42Pgnh87C1y78sd+RWfhO0oTRHlgskY5Kk9IihH7GSTwuERkjxT6iDuLb/yW/bAEEC9E1x5WkNfQzQm22yTeUcyIQyzDHAM5XejtL3wvBwB5oOVcYgylBGR9GAMKHNLeno5sYCXlGD3D0IgXtBq8CsX6xhtrjZB2ZebLuo8GkDuS6L/BjkzxI1Bs1OugErQz+FyoZ4wg1u3XI1Ggt7ZDYlYR69UVwRsjJLxyt5Dz+nVU76YRBx5pbSMSaJDTeRmUtoOyI7nHcl0118NT4oGvfHotlzVNm39WUYKmmFq4bC2ApauB/tOYrRZtaXR0bPXZRfAk9g30+MQPaVef6vGxGHxLGygSydRyvI9bVp5WFOsgJRWCbiY05mrawysCEcg4WD1ta7ZP5iaDlCVQOFcy+U5IVK5YXj0n6tucO2RI9tLXiJ3+x3fP+T9EA595cs400L6FzhnMcPtMH7fSIm2gFov96OSrEFEd61Efb/nlfE2da8ByASqImMcXywrvFTpzrlWsae5B9w/nKGdRN3wL+VfjyVqww7pN65cjs8/vn3hHbB3ve+MMb9LlDxP1cB9nY1fwSHVLh1dY47MRrnRWzGZ97HIFbMTbRgHhJgUkKp0en/4aNGE5xfV0pEnJviQJNiGFKRyQIKRSStbqZwocaWrYhDKkR+FgT0mgTXofMKu52uUok0wvMf/H+r88z6SCkBBBR370DTeBO/dqYjuznaMODqNBjK9sC33obVLF/K4C/G27/poV5DfDeA3Tgk5WQPlE0ktAsOwV4kycpw/xX/RGZpH6zxpTqZWqfhRL5m30uKe4wR7yLr/Wq2AqnyG8GE3whfwrO32pDTrnuIs/1ntygYhz903yGh3EgueQtE6ZBtPmYqmX0HRt3kDJwnGLdSBcbW4emAg7zCk4rIShBpFXM3SAQL77SrHuZd3TcFWuZz61lVCkJNFIlIuVyOLWBe49lEiBX0JUqQgpX/8V4AFv+HHIuXCpZJsmdF/bBdukxLmtJCTgx16JmK2wG+wX1gvP9ccteY0aX215R9inV7/Yn8Nf2dcTTh4mVd28dFNPmtYlz4r9HfjpGRW/kO54opQxRSVel0SHv/w3G4+hyB+IeYxeot+k0lE2cb/zVFfhSzKFuNaoEJwShTj/aEb66a3RYhCPTa0QSxyv03wb9pKpOyBiQuDxD2DMXzete3pCqIwUK4kp98P4qsTV8DZoabSG5LdwWqItp+3+2zYuvcdK0t4bStHmo48jIArkxnoXxFsambel2KXnP7+JljQabSKhf3Dcd5ZLh3iMkhtKWjDz2tqfey+Ka1LOMJ/9FZW4VLJcUN5DnaB2DUT/2R+BWaISFxZ8gZngZRwxiCdZ8wROYqBQ9W0o0novgJcwBZzTYk9/qUbxK0Kj9pWnQlhZZ/eB7NljL4gZJziw/BOZuWzuTzpZuFL5z3Mv+qc9P46x4pEQ9zzyu5nx2emUredmsBU6GRt4TYWs0bio5y/eicZIS3oFC502XpcTDlAhLOQ1bmAq+WbT493WaxqG/7kaOs/MZg1XN70aDY+hUoLSaotSkLwBBaq7CYsOocKyHxVXZQzXrLL+8KzLWtdFNrfl1NpI0eQ/MFQ3perUD5qszw8r0tfWfsVzdfU7hKyH3Q9TjdNz4dwwPrfbMnHV9jE/9gtOdnof/qvqqVlHGsE2skRSvB8kOrMZGwimsvJ6aw9QiXl1wi+e5TcX7z8tFkr2GNy4M5ZFFe9G4Fxow3PrEcn8kwN3ZjG5d1FeSmGpC2B35RGT/wY+Cfq/VH6K5flfXuC9wTmkrHqq+Yjyw2F4sqkrWcTeHUx83+VkuPHaBwwkKRq7dI5ZnxF5OyrO5ZtG8lK+Fhc6COW3peRkzjojlwZQqVvR9GfJAuSWnlNLs8v0F2ZywgrblfW4ba4Q2u+P0TuU3B2ANvfo7xzJIptu5y6cdHaxscFoRnAsTad39TJJ8Kq/eQdIGKbE7qWdbVMpvOg/SquS6/HGUV4EiCQjk2ewKuxv5fT7BVZEYADodsVqnkXCHi0RzOUMx/bNP/7wo5x6iGVEjLUj75xLD8Gb5B4tooi1sYIBvdiRNEA2I+VD4gaLyWdVwAeIB6thvIwbugZOZY/YQbO8hKmpZlb1fOdfra9gG7xdIO+/uUO6VTxtrdsjv4yeCK+4D0BolLTfEk9nCNF13T76O7h1duY9kSoVVKezV/rYB1e4V6eKseo6Y7yv+t9MDRhjMWAzWwCQJAs7P+ILuxWB+/Mnk23+jIPBCY3XbCnQv6mLD+B9/wManmcs3NJ1f56bYJh+WWy0XlfO6EE7hy4OHSibbCW0BXLY9eZoihU65p+beI3JxlpCsaRztyg3SL7Qnh1l/fafK7MjvEfChpFiQGsHwCgXXWrptq9dwGF7fFXhHWUMdwWj3PN7IfTZmD0ZyHBey4rV9LHF0eb/Zov37j++UVyYDTS/7GjY2uR6c+aAWU13dj09OSrMteU5u6ZXUxilHBXQpfiWXFbvc1e4OHfRJMS7SZwA11NqtoqSXJhojPPnTfcGn6YPD5L9npY94M4sc5a64v7zyTGiTMO0YPw2+MZnXuz5jbgpSektvVcf9PMnx16oM039wknp8942oEJ+7iYkppYc09qfH5U2xeaIoqSSMXw7tCYUHmuA6GzscP7iMIT3GT+oJprXmSz5BjKuW1yuWaMSFHX63uaNIuXgFOrpMaTabxjT9/bqUkZo5z/an338/DMFdjQrWf/5slwqkPc5v4syID9Sp2b3pVIzMy9o8TW/VPznO8h7PK74Z2sAJCuGw89GTSyGnBattV0qm/rUg83UIdPHLjpfbkSKbzl0DdG1mok2n9Kbn72eabZn6Y1xzyxgZ9qsXBFH6sfDnfZQudr7rRdHFOlOdCesC5YrczJPxuL4IXbozTa0dS1iRyQWEPXc3Nthiey/DoUArJnjQpVn60tttpbv7fGU7JrDhPo2Xt7A0xSx5jcvzVT6DgH0oM1JoB3vzJbUZRRVBVpYMD9oDB82vJpP1qQEVazUX+yrnfb6PB4eNg769Vf7JeT8Z0PohwUCWwBx4rTga4/Rf+oqkVOKDXGqwgCt8kU3c1pOb0FhKQIf9c3+eUDL3c7SFVdeLg0reTZ5wrMyLg2OA/cPuy+YV3KMN049zOhZvMcX9D6hzKx7kYw722dQbaxJNt21DuYfc2vRbFIY3pWue0dyazEG7CV1LPaszDNZ2zKJ8nkSkPFjUvKGgIuBpY+bbNNYdz+v2/HuGEQ7KMFqBhMmwlpUh7/2FOUcgnX3V1HctSDOkam2Q1hOWxb0+TNvfNkM9KbsLY9LFG1zPuy05O6hMxj3q5OdPSvfr6C6qQrT0PLxVFCRSiYNaBJGM3FqL16SsiApafxcOAQGwFUpQRXfzPKCJ/OyV4AJtB6KKaxH+GYnTzydsKe8nZft2fpdijfxEGQ+Hn5L7xQR0BYBqfmziTbw33v4M8tbwvvI0u7m4bTBn/XqzVcA4CJSalBZ9EpbWFvi84SKk0zS+6FNQLwcLOcVS6a9XIuy1n76b0Atl7uKdU+dYTYG6qk59p97K3JGcVYFHJdPgg9tnALIuKpjhNVkBRUHdvdzAzCaZQrHdqnBFgEwsSE16CUE6U2GFj+PxytMVvQ+KZFJCmzbfiva0ILfEq2utFmaVD69dX+bdqMB1IMAon/9EL/beHt6EPObtUOkPW8000+IWMY9q7IFKkwvXWE65nuaAn1WgySHaUd/gsqbI5ld2sIJpZh7wSF/MyhRk5aDKXYLOowRro5mTgD4BtjrM+AimH/Bhs0FSUiyxgTHyCAYU932v76HHxkIWVXZX1n+vh5Ly9l9CnV3C6l0QUzjWwYEgxXl/t7iaQVGhKlsKB0aaKZPFsrMxkB7AT7JVsvpHx/z/oHYO4MYR08FmCQUjNeVwVc1N/Zu/VH07Ef4tUIDUFLpfb/L5YAznkO9NKL836QF/Wz+706ofXHr+7gg2jYPh9iBk8VyRDzLEa27RdNSGvPxgqU7XiDATaQ8ioB6AwfnYxwa4V7udkK5tclxYGEc+8YG+QjW/aXBY/A5nrUDTXT5At54S/0b3OvVhlDQuW5ZUq319dR+IE6OUCcWD3eBBrdDK1ziIBL4jz6gyE8+NAt8oloMoJ+n8+pEhl7Qb/aZEH/y8ZU2lJ8loajtGREVlwehEp23I6Bp6yiH2mXjWIs1800rhPM3UvtQ/9EYWK+kqMwWWWMN+Oe2KQBlg4xnWMNM19giQS2Y+wn2eWeRFKwSQ06ZrJvJr+8RF3jZeHZpc3+H5dNEXhGB1wWkX1f7ubdSzeH3QvhKrwI966IIWGVK+RQfPtoFqZQGMKjKW++YAiW4dhgjei2Zr9UmXLB+gXydaVRjGcwj9oKYoKWDeb8YtSa36P/LkZJ4Fjs8iFZXQmnvEfpll0UKtrw5/qWzDa7jAIZtZckdiUyGeSzGFa8OZCAksuzFOWSKTk7t6JkDpAqjDoDAKwiQOT4rQEzRTixvYqdBTO9hkp5BAH7l4qCH5hk2htu1SPNKJTe/sxm02eEPxr3oSvdfk83CP28DAOzKp+dOBRmmZXwWrasBFO0lBUe2v2s89sIwM8WUgBYghEh0skNN1hsWR9QuDcOFCkoKlhCTGGLkIMmospiAKvYPEmcCvc/tFx02d0MmCZi4GXPCg90U2zOTPHXju3lcckmJ7Z+55jZvWSDNPA/HfqEYMZhIpOwNmr5AfTUU4ifJkpi5aZfJIset2a3kglfhe4vxjA6lK+tIYTWXYUUZ5656iBQxZID3yO8TzPkOOL24TwJo1RI5wvgrAmJLjif5aCmU55jFNnIIB9LLjOvm+ft2RySKwNnximWxVdBdgfBybljvlVpMoKqNDFxFEGQNKAX/AwnfJ3SuFGtZfmS+RR5abBffqQsX/WFuQYkbdZ/S+miXdaEmxebgZGmmIfZ/DNyGH49rULg6raSOp/DWbFGWaYnI3mHi6sXr4FEZeBj22ivAouG9aoMDH3ergRxgw+EJaZKJmbnt+ADicfSB1xbuhIIVf/IjCWyPUOgxCXqSfXaypwMKKIkWIeUpAuJ6RkhbBaKg80BIS4usdq5Oa/tVjRWDAloomzNKIZOCbwvzFYQ6uBQ6QdfMcYy1rmJh4CKHADmlLPM7ck0dhtKUYFIHIJMQgIXUaFghv4Uu44C0O3CwKXLIS2bSYKErSxPL0JahJ3XCqIh5CIshUEctlk1ADZNQk2UU6S7VMWgMNv/tIQD4moBtkMgFaQcm+WHz7v3k/2lrUBShoPL4A7AgvfSe+PFY1o4udX6zmFg4VuwgvyPin+rT6sxWyac7UADgLFxGWzyb8UPFzgE0dKOOUyhEwsCHDlcFV5P3CyOrxi/ymITV8U5HIU3YKt4mP/behG72wragzvLsJFU5pZsnRT//xA5Xg5SZ5T0V9I1USas7+1fgvN5q2S/BuO65T4M7bpnGQuAgHNH1RDI+3T3vwXWw5c0+23hXdGwGWv9zol69TeI3pExwppovtLmZzAiJGOKQxnVrs8KwhLDnBizqyRA7yvCpDBrTzKpYSHJHOCqymFS0n41DtjdPDarO3z7JaLGXXQymTbTbdXgzmeIdH7DikSBQgAwOBjmVYe+uRnIFg7WiMsCaCaA1fS+rk5f0woECekp+tHmV4e9Cijqx26/ghiKsEXrNi72o/cM4LQwJO3Zq4QZb5ADfGmnmBTxmJCIHKF97DzY0ZweqRkSogec7rbZVia5j/+BzQWjUmsDmvRJauJ30eYtKAYskM9CFOXFTdT/951F9bkYooDY8JOvunKpHGVrv5QvLInT+y4MUCzzN0pYwPfgpelj6q6Zm0pc55tN1BsG6tXfCyryAmX1Tj290ol2JnUqB0Yz54nNfmn5UbWdnsMt2aVkmnfT27BNnw9e+91PRxm5wj2N/QG+k88mdjDFcCwmm+y2n92siLuUhKa0Kpcy3L8bF/pYpe0d0lFWDo2FVgWJctVmsC5M8f0R0QXl8Z0SMv8sWHS04E1td/8IiBd+wEXBJgGrUrexrJ3xPnNT0w2eQnvHGz2kKmwd0FXSNlr/aVmQdK6W94+R9pGy41bxUlcEmvzfd6iDQkjWz+YPTdFaS/cBgMt6+KXZjAjcWa/irjs1J/X3Ih1LHPdFy9zTRIic01whpIXYe3e3T2bgGMV+x1p6xKjs9qJ7JsRDZJ0R8nZHaMcHLMhR/It9bAUTJc9KcOLt+/kt6i49lTn+tTYBEueG7P6WRGfNztoj+DEN/Qy3YbgTxPp/jKTzd34fsSu6WY4vsh2DHmOX/EseNJ1z44V8HQw/Wfc7WJdf2xosgszc5uX+s86ahfqpa8EmosxgEYL30otJhyxIA4oZqeE2tPtU4rIvOpnx4YynlFluBBNrMo8uBxkzxt1uszTRqq2dyi1au72IWX9G/VvVf0UsagwbDucSjko0O4nnBAHvVscJ0w7CrSDJY4arJL17FBnj2OY9QKNvWqHuY+9Xqtyn6E8bjc/IfZckX0uYJhTPmGlrUq198xBiqcETgmeMZxrKaYHuW2h42Lr4SwKG43J9MMrPKqWy8uXWNn2h49Z3F494v8C3z26Ivj2ieaoiflYFFaaqwT7qijyX1c0W8+WOWV1Q9cjs77yEPgzQ2XDdq0yJ+zQ4CF28X8mx7KRxKhyh6EMNtnGv/ohoSZO5fp6pUrL28nin7h9d/KaoEWCOdkrSC+AXRtCezPN7Cyt1f+eZtPpyX79y6ZZJ7kWd8TfbdcUfg6ZELQOFIbMIz0eN21+y0h6o/Irt/nETN3lY4wGgvjbXwoP+uA+v5TPGzNvKGkrxKKjL9hluhIyHBenZ8eMiaeJ0QhYscqjPGg/o8wsfRJFpfVjTTJO1j79HRE7rF3CbQ3eBX+2726KV4f33L0hXXVd2ZSVWm1LHq+1wcWWLSwOLgva0xy33+a7duOoKJLyQ+8F14LcZp+51UztqGcp0NsY96r9CTPqjAh3dnavOWSY0vTg6l4b98uLwhOKu2mZM97zLHHve2hvmnFI/oRmePudwGXtPYrMXekCTg/NibVoHm+3b2pOf7gPVyzeG6tPgEl/kIoY+M483WpkxqHEzwOqsPl4VCTGyvXK/TfpGhqrYyWpbhdcIIv8ggfXnCIJSbdQTJGe+pqs1RhnyWVfRtznVmjnL/d+9lnJDJ0c8s+0KnvTj7yWwlniu0WVuhenUGFsLgViM4z73TJqgQu8A8AN3ixgNxV6m2qe0IY3wvt/5gxn11ZlMoyzTCYWTkNHkeedBnOkJrdlhbSo4A5hI2+JFUX5F5/c2qkB2hdgZSkyPOcBdo3NTZ+h/EkJtyi5uer+/91NL/HFxkHKFDlE0xCoIOuQgU0tN3oS+nAJY8nIBHNTU3eQ3yT6XURtaXL9JtocSZTp82JIgZG5eIxqwBIClUOYbGhNc72pQ7hpKwi30Vi2yXkJMZrJTCShfO2oKDfXhoUFkjuMKGd7aHTuVXiBb9QvcooGFkGplgozcLyHXFrEVHmc41k3+m/xr2qg8Ws6W+DVLy9PnixHTGVZwE5oImBViMRusz81mRr3J9qoK2mGHuKdMYcsFHa//oxy+YWHY4RIt12G/0+3n/Ihe1TD4ktgdT/GXmU5Xam/v5VNgEgxa3taSV4G0X8+gINMSPDpIxE0+a4t8yb3kMiGb9qqXuzpIWEM/BHGcGvy0s7k9RTI3V8Vk9H2ifb0mTc8nquYHhMzmb5oc2TyQ3ly7iC+alFr97urqRhAC2pi2suJQSrTOwdiewI3jytoki5dm8xWA+kSnJPR59Txz1SmbPbfmaAYehUTkNCS6zNztY1Wpmdkd+NpW8RUfy26nPFAVsJi1+65f38JcA32YLjpB07JAtIGw6h4Hn4UNuvckjIw8TpiDoY9KkdHhlysGvBdFPI0OpBGn0m4GXw4uLOYY3qWTNmqo327bEK8+h02j7brFjsvCjnZsndq7aiALjUjvqTAqBjeWnjbYJ18RNg3Zk75PjVSg36x//U1gemCvaIGD1GN/zLjeU5ebqgyRANH4k/+jB0x3QRGbQ4c8+NDxk5lyJEM2kffkAOYv7YSLiWaI1pBhkj63if9WIaQNLHUM8o4BC9iJoH81v+xI9GAmaf1PEm0oVlWU0wzpZ6l8uqYCzK1+JK0lPY8QYsYrsOmMV3b+LjakIIZxjdI7aj0rlWcljJ2FGe3B94qFMjPJWGSqgvWScudVO75+sTVtULPKuaJjUG16Rh9ZJ/JYRxzfyvZpZRmy9b0rfxKVtI5e1bxXuOYyj7GPnAJuRFGteMfbcSzFRZHAwZCuatBZLNDJSWJz/eX0bKrfCGeS41i7uEISIA1uFFdpZbx51VeXbGSP17WSAo1I2bLc09pwqLyfS8GAwbGKKZloTNmu/j2+1fUM1TKD/HG2VWCVsdXN9RpG6ktEU5RDZF6Q/x8kgF2MtPTaTKfwyMBFuahsdmY7+5D+MwJa9Y7tPDdTA8sMyLEfzKlT13GmYte1UjmzdoyE/sBLWxktlEVoVwQHn7L5TXy/ol8HgUKV4iqWdlMd52BMc6ekVZq+k8BGqFupDDxiXrPhYMiswrPyFmIEzEjoF8PKrehwkzj7PzC5mr+TLGbHBMEe7ahtJazW72dxNcqE8b71sxzcDN9W4kAm05NiyrS3xc+4mRixSUK5FGiqT2S2KaGc+j9LDdO8Tx1/LH2AK5nKN1tJV8CYZA/GqLL1EZ1znozlAKDQPMTwdpf0kC5Qha4iCCZc3757PkJWVQp603KOZWhunWNnZuZoua7clON8Y9fHcVaorup229n9c2JpgTaPns2uGAIx7kem3Pz6uc+B7CnHdW15pRPgW744J0U6mOVp5574RYmCzOMps1JYZ8DPfpjNCObyXIO3y8bHNrYKpZMHCT7ikZsxou38Q4UQhlcNud4dWUUbYd5G3oUqjbI42rcOQ9ELTkc89EGQAa/sLDVAkte+dghojxR2yxAlABW/Y398dpnVPFba3CNN57juWyg2CYWlbXiotG7heyZA46wHSnxEb48XoLZ7p2NKM29MOkKlYwRE3ZhSlrqRyhv30AhaULpmARDlnoTaNCwPKqmUm3HBj0kpzhnwHyJdSWSBVVX+o+o3LUfIO44IZfpUS/QtNlZUUy6PBMTx5cENNSA2dWh8WTp1ndvtvGUVecI5hwbqnVO7ghmQUR13zMbpaW1Lj5ogFYGVsemOkI8y09QiNHyBEf+1qCI8P1xBpRmJCsmyAI1J2RDUOTC4EcHBi6T4U2YNdSnXEQBi82eCEpHUzJQwgl2ZH1jIoh8iEgpvOgNqeH1IkUWJTngtPsWzxFNJWK7iS+dOg4FN8DYsKCCgxowt7pxJkV45ND1/Fq+4Y0OyFA3usgIWagCCNxOiiOVEX30g3dCbnaPmpacGMKo8gwS60ZJ9jFRG8246XXCpymjalv1dmSAAHreL+xMTo7vJ/q3ETfBUs1ov4bGIn5lqIB45OaNhYhh9huEislh8hM+bOLcWz+ivHSIwcUI2zOiro/Xv8xckPAkufV+zu64qNK4uJZyCklaQd/o2cT+gJ39AWgqOxUS6GlWz9VU3M9njf6NLDYckWd9jHjdrf+Jo5IyXRwM4daFoJqFfWVd8Yq2NoBb7AUWjDxr76up7EzH+lzXAPXcU+Tg2cGBc3Udr9iwq1P1+sBS2ve7lOvLqg/IVh0qoLNCHFPj1NktMNmBmRulFlKmjNk3q+fuF4uWKQak+jAuaPj3ygvQaZt0Q1WkWVXuhvmBbF4A1UdQl63Ubq/BBZt6IxW2PRzf9+Hb67FLtqsFtrDkIAuRGoHZpBzG7DX3aHENX7YV3wXzwceIq5tPOzgEVHrXkPdy48Pz18cWd33Tc7N5Xm9Zjnuaor1z0a4ascm534UeMLrydLLNtTi0elPAbV7vvwNW8A3I3GY2bjvyPkz94Nln32MIAPd4Zrv6M8K/IbinZviHGLzZpbqC41S95i62vXLSxscbLgAZZ6Pi7sVcdGGAMdniVWGGh6t+Ijkl7kf95GazIuCxOH03yTSDMfzNpGHqVFfrQufrOrz+ZUA99oSx+58b+yVp+LcnA7YTkBBZUR61cFrWKVPMsvHIUnOxYV3SbL1uAfr0LBakqIAlQCkUQvo4M1UM+XVP3K8qANwGUy7Zar4Li5g/bb0bPNofvm0Tv/tNy+wg2fza07/UYDpTGmSSXKcqOwky/MJsv87XmW/N8Dn7r9r6XfENN84gk3+CRFe+BRPjE34M/dEEHAdcrue3Kfwa89fM/yb+ZOXvfvHf73Q7gHWCmsLy6ywupKTVrp9gnW4YyyZch61YgZXYgCVYjY24/dEB+YdVXMDrviE+TTY0nFJTZgYZSWgKz5TTznDDP05hRGMKzauw4e/4pMWVM6uToPLleWqMpqw5yp34ADdEQy4mZdt5xgEYbFG+Z6+GmwdQN5WmR5/LFyArSiK/5A4X2ViHJbiEae5M3x3iNw7hMt4l92fDSc1PkNyjt5IOuOtDpVkL6oO4D0vZZ3LDBzJ4o7JK7mUAz2KNE15qt0O6U0MwmiNZ8tlPbbgpMAgfZWoq9ogXx++h2ugJRTKynYIBF6Gd9rXn5oec7Fjdk1NtvYtupIaSZByfoF94ANoUqzspX4R3sy9dq9tsWMV6H8mmUnlbfUYLjIsCx8sGAlrNWIiJUlXd6/MCxu93toKkNj/ev9fMLdmvDjB/T06pPSj4/hrt8QGdMsEY3zMr3jm9g4utNFF3erNmfLl2ucT1usRGgTIrGf6JsqjdfU1Ar/Zb5nqrY2WaKQ6Sygt1u9VuBafYej/T4FThBYyupOTQXiDn/xLruuvGpWoEy9IP1+xldVW9uN9VupFaPpVAy8JceGrInuOZL5TbEfTcD8ei4s1jsmPdcS3uMW2uyY44olACOmFALs7WDAS0yE29dCTTcomyVpl1QuOrSPLXH8TzN09HZjl9zuZ3tg67nhPlN51TkYGqza7K0gotL9+WrLBJ8y6dj2v6aYaGbEk2vxefZtxeMajSguEk9J+FsEMRgZy+jt0RhlsWQuduDuOkwWBJa3D4jKavZ481BCDyGgNL/ElVBTxF1H7TADHgaECU0xPb7NIGgsVeUjvdPYlKNSlUrVnNfB2o8NpUWN1cw6yUZ3lOqoM/Df3/LoubASim1khNAzZUry+l4MmdFp4fQLG/PsdxX270U5Un7Q490EPmRRM0lJcqmtW6d+qV6j/ENo4qrUpPiuZWdZOqYU9Lisq6LCroyrdBT7d+eaNa33XSsPf7v7XOTFpwGzUPagtZwPXBJwS4f1E9zC/IlacgZqsLoHflhlFGK3Vpakpp6kkZskqVHnpqBtDmcspQ1cwJv8+pGpu+Fcc0FcZ8QQHL8DTWdOpV6dBE01RD04dKlv+N3R6eXt4+vn78+tMRJpRxYZiW7bieH4RRXCpXqrUkzeqNZqujs6u7p7evf2BwaHhkdGwcACEYQTGcICmaYTleECVZUTXdMC3bcT0/CKM4SbO8KKu6abt+GKd5Wbf9OK/7eb/fwyMEIyiGEyRFMyzHC6IkK6qmG6ZlO67nB2EUJ2mWF2W1Vm80W+1Ot9cfDEfjyXQ2XyyfAESYUMaFVNpY50NMudTWx1zbfpzX/bzfjyGk0sY6zyGmXCpaH3Ptc9+PiEk6K7P5Z2k/3Hfwy+E+3uuqEgZCGU9UEQZCGReOVNpYN2931VprrbXWWmudvo0IMBAae14+YpIRBkIZN9lyEMq4VDa3QijjQukx09yFI5U21s0rEAZCWQMAAAAAEEIIIYQQQgiJXCWFhRgIZVw4Umlj3bxywkAo45/4O+P7B0UMhDIuHKm0sW5eBWEgtC8F75AXYiCUceHI3FoGMnTyEgbChNQ2ry4TNmK6EWaypfneZiEe2CnVe4oAA2FCaptXzYSNmFUqlXUX1f9TIsBA8ooJA6GMC0cqbaybt1E1AADAUQIMhDIuHKl0ZgelEOc0GOvmVRIGQhkXjkw9WxubWzPWzdsbmrXWWnuugptXjzAQyvh4q0uxAAOhXDhSaWPdvGLCQBkXjlTpgjIuHNlwigADoTKv2niiNpU2Nree8VGLowUYCGVcOFJpY3PrSOeaztH0diHEQLhwOoTTBBgIZVw4Umlj3bzOvYwxxhhjm7oWCCGEEEJf+tIGA6GMC0cqbbL1MHwyMXRMH7GRDJ1wwkAo48KRSptsHcLQUutThHPOL6JYBgOhjAtHKm2sm1dJGAjtrkiHaowxxtwAIQZClZvXpzZcJ4SFGAhlXDjyu1LyowYAAA==) format('woff2'); + src: url(data:application/font-woff2;charset=utf-8;base64,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) format('woff2'); font-weight: normal; font-style: normal; } \ No newline at end of file diff --git a/include/vrv/smufl.h b/include/vrv/smufl.h index 13b0febe4a..111fa1b65e 100644 --- a/include/vrv/smufl.h +++ b/include/vrv/smufl.h @@ -350,7 +350,10 @@ enum { SMUFL_E631_pluckedSnapPizzicatoAbove = 0xE631, SMUFL_E632_pluckedBuzzPizzicato = 0xE632, SMUFL_E633_pluckedLeftHandPizzicato = 0xE633, + SMUFL_E636_pluckedWithFingernails = 0xE636, + SMUFL_E637_pluckedFingernailFlick = 0xE637, SMUFL_E638_pluckedDamp = 0xE638, + SMUFL_E639_pluckedDampAll = 0xE639, SMUFL_E645_vocalSprechgesang = 0xE645, SMUFL_E650_keyboardPedalPed = 0xE650, SMUFL_E651_keyboardPedalP = 0xE651, @@ -582,7 +585,7 @@ enum { }; /** The number of glyphs for verification **/ -#define SMUFL_COUNT 557 +#define SMUFL_COUNT 560 } // namespace vrv From 3fc0ebe8d8ca7db12078e1c32055752e491b0720 Mon Sep 17 00:00:00 2001 From: Laurent Pugin Date: Wed, 3 May 2023 07:32:56 +0200 Subject: [PATCH 011/151] Fix problem with stems also drawn with tab glyphs --- src/view_tab.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/view_tab.cpp b/src/view_tab.cpp index 895fc3d8ca..6e22d177e0 100644 --- a/src/view_tab.cpp +++ b/src/view_tab.cpp @@ -228,8 +228,10 @@ void View::DrawTabDurSym(DeviceContext *dc, LayerElement *element, Layer *layer, } } - // Draw children (stems) - this->DrawLayerChildren(dc, tabDurSym, layer, staff, measure); + // Draw children (stems) for beam or guitar notation + if (tabGrp->IsInBeam() || staff->IsTabGuitar()) { + this->DrawLayerChildren(dc, tabDurSym, layer, staff, measure); + } dc->EndGraphic(tabDurSym, this); } From dd04813e939fde10bda38da56da5541c4114ea26 Mon Sep 17 00:00:00 2001 From: Klaus Rettinghaus Date: Wed, 3 May 2023 14:22:49 +0200 Subject: [PATCH 012/151] do not draw keySig for TAB --- src/view_element.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/view_element.cpp b/src/view_element.cpp index c963ed98ae..58c5cb1daa 100644 --- a/src/view_element.cpp +++ b/src/view_element.cpp @@ -943,6 +943,11 @@ void View::DrawKeySig(DeviceContext *dc, LayerElement *element, Layer *layer, St assert(staff); assert(measure); + if (staff->IsTablature()) { + // Encoded keySig will not be shown on tablature + return; + } + KeySig *keySig = vrv_cast(element); assert(keySig); From 5b882e43fcf390a21f7ba29620339a231c323b2a Mon Sep 17 00:00:00 2001 From: Klaus Rettinghaus Date: Wed, 3 May 2023 14:23:06 +0200 Subject: [PATCH 013/151] code style --- src/iomusxml.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/iomusxml.cpp b/src/iomusxml.cpp index 4fdc0a0cf5..bc0e4245ca 100644 --- a/src/iomusxml.cpp +++ b/src/iomusxml.cpp @@ -1374,7 +1374,7 @@ short int MusicXmlInput::ReadMusicXmlPartAttributesAsStaffDef( staffDef->SetScale(staffDef->AttScalable::StrToPercent(scaleStr + "%")); } // Tablature? - if (staffDetails.node().child("staff-tuning") || staffDef->GetNotationtype() == NOTATIONTYPE_tab_guitar) { + if (staffDetails.node().child("staff-tuning") || (staffDef->GetNotationtype() == NOTATIONTYPE_tab_guitar)) { // tablature type. MusicXML does not support German tablature. if (HasAttributeWithValue(staffDetails.node(), "show-frets", "letters")) { staffDef->SetNotationtype(NOTATIONTYPE_tab_lute_french); From 6b40030d87fb3bcf18b125e9871bf7c9709795c9 Mon Sep 17 00:00:00 2001 From: Klaus Rettinghaus Date: Wed, 3 May 2023 14:23:28 +0200 Subject: [PATCH 014/151] fix import of staff-details --- src/iomusxml.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/iomusxml.cpp b/src/iomusxml.cpp index bc0e4245ca..ed879849c4 100644 --- a/src/iomusxml.cpp +++ b/src/iomusxml.cpp @@ -1360,7 +1360,7 @@ short int MusicXmlInput::ReadMusicXmlPartAttributesAsStaffDef( xpath = StringFormat("staff-details[@number='%d']", i + 1); staffDetails = it->select_node(xpath.c_str()); if (!staffDetails) { - staffDetails = it->select_node("staff-details"); + staffDetails = it->select_node("staff-details[not(@number)]"); } short int staffLines = staffDetails.node().select_node("staff-lines").node().text().as_int(); if (staffLines) { From 5f0097ab5a6732b71adc7d1cd26f4570cc0d643d Mon Sep 17 00:00:00 2001 From: Klaus Rettinghaus Date: Wed, 3 May 2023 14:23:58 +0200 Subject: [PATCH 015/151] keep keySig as attribute for TAB --- src/iomusxml.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/iomusxml.cpp b/src/iomusxml.cpp index ed879849c4..596bd23154 100644 --- a/src/iomusxml.cpp +++ b/src/iomusxml.cpp @@ -1353,6 +1353,7 @@ short int MusicXmlInput::ReadMusicXmlPartAttributesAsStaffDef( if (key) { KeySig *meiKey = ConvertKey(key.node()); staffDef->AddChild(meiKey); + if (staffDef->GetNotationtype() == NOTATIONTYPE_tab_guitar) meiKey->IsAttribute(true); } // staff details From 32339c5fb62418ac077627034dcbd1d3479b4807 Mon Sep 17 00:00:00 2001 From: Klaus Rettinghaus Date: Wed, 3 May 2023 15:12:17 +0200 Subject: [PATCH 016/151] fix misplaced object in WriteObjectInternal --- src/iomei.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/iomei.cpp b/src/iomei.cpp index 6f4612eb64..46f61ada21 100644 --- a/src/iomei.cpp +++ b/src/iomei.cpp @@ -506,6 +506,10 @@ bool MEIOutput::WriteObjectInternal(Object *object, bool useCustomScoreDef) m_currentNode = m_currentNode.append_child("fing"); this->WriteFing(m_currentNode, vrv_cast(object)); } + else if (object->Is(GLISS)) { + m_currentNode = m_currentNode.append_child("gliss"); + this->WriteGliss(m_currentNode, vrv_cast(object)); + } else if (object->Is(HAIRPIN)) { m_currentNode = m_currentNode.append_child("hairpin"); this->WriteHairpin(m_currentNode, vrv_cast(object)); @@ -624,10 +628,6 @@ bool MEIOutput::WriteObjectInternal(Object *object, bool useCustomScoreDef) m_currentNode = m_currentNode.append_child("fTrem"); this->WriteFTrem(m_currentNode, vrv_cast(object)); } - else if (object->Is(GLISS)) { - m_currentNode = m_currentNode.append_child("gliss"); - this->WriteGliss(m_currentNode, vrv_cast(object)); - } else if (object->Is(GRACEGRP)) { m_currentNode = m_currentNode.append_child("graceGrp"); this->WriteGraceGrp(m_currentNode, vrv_cast(object)); From b9cd206abceba5a3c37ddeb5b8dc38638ff5109d Mon Sep 17 00:00:00 2001 From: Laurent Pugin Date: Thu, 4 May 2023 10:41:54 +0200 Subject: [PATCH 017/151] Fix PAE keysig output for empty key signatures --- src/iopae.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/iopae.cpp b/src/iopae.cpp index b6d7c98479..66f5ae5a63 100644 --- a/src/iopae.cpp +++ b/src/iopae.cpp @@ -351,7 +351,7 @@ void PAEOutput::WriteKeySig(KeySig *keySig) data_ACCIDENTAL_WRITTEN accidType = keySig->GetSig().second; std::string sig; - sig.push_back((accidType == ACCIDENTAL_WRITTEN_s) ? 'x' : 'b'); + if (accidType != ACCIDENTAL_WRITTEN_n) sig.push_back((accidType == ACCIDENTAL_WRITTEN_s) ? 'x' : 'b'); for (int i = 0; i < keySig->GetSig().first; ++i) { data_PITCHNAME pname = KeySig::GetAccidPnameAt(accidType, i); std::string pnameStr = keySig->AttTyped::PitchnameToStr(pname); From bbc725141ff3d69cd6b59069bf887cbc71bf48f3 Mon Sep 17 00:00:00 2001 From: David Bauer Date: Mon, 24 Apr 2023 10:14:46 +0200 Subject: [PATCH 018/151] Add InitOnsetOffset skeleton --- Verovio.xcodeproj/project.pbxproj | 16 +++++++ include/vrv/midifunctor.h | 72 +++++++++++++++++++++++++++++++ src/midifunctor.cpp | 60 ++++++++++++++++++++++++++ 3 files changed, 148 insertions(+) create mode 100644 include/vrv/midifunctor.h create mode 100644 src/midifunctor.cpp diff --git a/Verovio.xcodeproj/project.pbxproj b/Verovio.xcodeproj/project.pbxproj index 442340ca83..9d75cc5659 100644 --- a/Verovio.xcodeproj/project.pbxproj +++ b/Verovio.xcodeproj/project.pbxproj @@ -1576,6 +1576,12 @@ E7ADB3AF29D1923500825D5D /* adjustarticfunctor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E7ADB3AD29D1923200825D5D /* adjustarticfunctor.cpp */; }; E7ADB3B029D1923600825D5D /* adjustarticfunctor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E7ADB3AD29D1923200825D5D /* adjustarticfunctor.cpp */; }; E7ADB3B129D1923700825D5D /* adjustarticfunctor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E7ADB3AD29D1923200825D5D /* adjustarticfunctor.cpp */; }; + E7B17DA629F6657B0076E75F /* midifunctor.h in Headers */ = {isa = PBXBuildFile; fileRef = E7B17DA529F6657B0076E75F /* midifunctor.h */; }; + E7B17DA729F6657B0076E75F /* midifunctor.h in Headers */ = {isa = PBXBuildFile; fileRef = E7B17DA529F6657B0076E75F /* midifunctor.h */; settings = {ATTRIBUTES = (Public, ); }; }; + E7B17DA929F665C50076E75F /* midifunctor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E7B17DA829F665C50076E75F /* midifunctor.cpp */; }; + E7B17DAA29F665C50076E75F /* midifunctor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E7B17DA829F665C50076E75F /* midifunctor.cpp */; }; + E7B17DAB29F665C90076E75F /* midifunctor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E7B17DA829F665C50076E75F /* midifunctor.cpp */; }; + E7B17DAC29F665C90076E75F /* midifunctor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E7B17DA829F665C50076E75F /* midifunctor.cpp */; }; E7BCFFB5281297980012513D /* resources.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E7BCFFB4281297980012513D /* resources.cpp */; }; E7BCFFB6281297980012513D /* resources.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E7BCFFB4281297980012513D /* resources.cpp */; }; E7BCFFB8281297C60012513D /* resources.h in Headers */ = {isa = PBXBuildFile; fileRef = E7BCFFB7281297C60012513D /* resources.h */; }; @@ -2206,6 +2212,8 @@ E7A3790C29BB41F600E3BA98 /* adjustxposfunctor.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = adjustxposfunctor.cpp; path = src/adjustxposfunctor.cpp; sourceTree = ""; }; E7ADB3AA29D1920D00825D5D /* adjustarticfunctor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = adjustarticfunctor.h; path = include/vrv/adjustarticfunctor.h; sourceTree = ""; }; E7ADB3AD29D1923200825D5D /* adjustarticfunctor.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = adjustarticfunctor.cpp; path = src/adjustarticfunctor.cpp; sourceTree = ""; }; + E7B17DA529F6657B0076E75F /* midifunctor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = midifunctor.h; path = include/vrv/midifunctor.h; sourceTree = ""; }; + E7B17DA829F665C50076E75F /* midifunctor.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = midifunctor.cpp; path = src/midifunctor.cpp; sourceTree = ""; }; E7BCFFB4281297980012513D /* resources.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = resources.cpp; path = src/resources.cpp; sourceTree = ""; }; E7BCFFB7281297C60012513D /* resources.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = resources.h; path = include/vrv/resources.h; sourceTree = ""; }; E7BF80E329E3374600EA38F0 /* justifyfunctor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = justifyfunctor.h; path = include/vrv/justifyfunctor.h; sourceTree = ""; }; @@ -2985,6 +2993,8 @@ E765675828BBFBA400BC6490 /* functorinterface.h */, E7BF80E629E3625700EA38F0 /* justifyfunctor.cpp */, E7BF80E329E3374600EA38F0 /* justifyfunctor.h */, + E7B17DA829F665C50076E75F /* midifunctor.cpp */, + E7B17DA529F6657B0076E75F /* midifunctor.h */, E70E2AA229F262DB00DB3044 /* miscfunctor.cpp */, E70E2A9F29F262A200DB3044 /* miscfunctor.h */, E7C3AED8295501A5002DE5AB /* preparedatafunctor.cpp */, @@ -3193,6 +3203,7 @@ 8F59294718854BF800FE51AD /* measure.h in Headers */, 4D6331F91F46DBF200A0D6BF /* plistinterface.h in Headers */, 4DB3D8CB1F83D10A00B5FC2B /* fermata.h in Headers */, + E7B17DA629F6657B0076E75F /* midifunctor.h in Headers */, 8F59294818854BF800FE51AD /* mensur.h in Headers */, 4D79641D26C152400026288B /* pageelement.h in Headers */, 4DB3D8B81F83D0B100B5FC2B /* score.h in Headers */, @@ -3618,6 +3629,7 @@ BB4C4A9622A9328F001F6AF0 /* floatingobject.h in Headers */, E7E1698C29A8BA3A00FFF482 /* adjustgracexposfunctor.h in Headers */, BB4C4AAA22A932A0001F6AF0 /* devicecontextbase.h in Headers */, + E7B17DA729F6657B0076E75F /* midifunctor.h in Headers */, 4DACC9C72990F29A00B55913 /* atts_cmn.h in Headers */, BB4C4A9B22A9328F001F6AF0 /* object.h in Headers */, E7E1698429A8988F00FFF482 /* adjustlayersfunctor.h in Headers */, @@ -3828,6 +3840,7 @@ 4D1693FA1E3A44F300569BF4 /* clef.cpp in Sources */, 4D1693FB1E3A44F300569BF4 /* devicecontext.cpp in Sources */, 4D766F0020ACAD6D006875D8 /* syllable.cpp in Sources */, + E7B17DAB29F665C90076E75F /* midifunctor.cpp in Sources */, 4D1693FC1E3A44F300569BF4 /* view_control.cpp in Sources */, E76046C228D496B300C36204 /* calcledgerlinesfunctor.cpp in Sources */, E7870358299CF07500156DC4 /* adjustarpegfunctor.cpp in Sources */, @@ -4122,6 +4135,7 @@ 4D95D4FC1D74551100B2B856 /* score.cpp in Sources */, 8F086EE9188539540037FD8E /* doc.cpp in Sources */, 8F086EEA188539540037FD8E /* durationinterface.cpp in Sources */, + E7B17DAC29F665C90076E75F /* midifunctor.cpp in Sources */, 4DACC9D82990F29A00B55913 /* atts_gestural.cpp in Sources */, 8F086EEB188539540037FD8E /* toolkit.cpp in Sources */, 4DACC9842990F29A00B55913 /* atts_performance.cpp in Sources */, @@ -4383,6 +4397,7 @@ 8F3DD36C18854B410051330C /* object.cpp in Sources */, 35FDEBD224B6DC5B00AC1696 /* fing.cpp in Sources */, 403B0511244F3E2900EE4F71 /* gliss.cpp in Sources */, + E7B17DA929F665C50076E75F /* midifunctor.cpp in Sources */, 8F3DD36E18854B410051330C /* vrv.cpp in Sources */, 4D6122C01F77E1E000FC90A0 /* rend.cpp in Sources */, 8F3DD35E18854B390051330C /* view.cpp in Sources */, @@ -4661,6 +4676,7 @@ BB4C4B2122A932CF001F6AF0 /* dir.cpp in Sources */, BB4C4BAF22A932EB001F6AF0 /* view_mensural.cpp in Sources */, 35FDEBD324B6DC5B00AC1696 /* fing.cpp in Sources */, + E7B17DAA29F665C50076E75F /* midifunctor.cpp in Sources */, 403B0512244F3E2900EE4F71 /* gliss.cpp in Sources */, BB4C4B5D22A932D7001F6AF0 /* metersig.cpp in Sources */, BB4C4BB622A932F6001F6AF0 /* jsonxx.cc in Sources */, diff --git a/include/vrv/midifunctor.h b/include/vrv/midifunctor.h new file mode 100644 index 0000000000..5aa405e837 --- /dev/null +++ b/include/vrv/midifunctor.h @@ -0,0 +1,72 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: midifunctor.h +// Author: David Bauer +// Created: 2023 +// Copyright (c) Authors and others. All rights reserved. +///////////////////////////////////////////////////////////////////////////// + +#ifndef __VRV_MIDIFUNCTOR_H__ +#define __VRV_MIDIFUNCTOR_H__ + +#include "functor.h" + +namespace vrv { + +//---------------------------------------------------------------------------- +// InitOnsetOffsetFunctor +//---------------------------------------------------------------------------- + +/** + * This class prepares Note onsets. + */ +class InitOnsetOffsetFunctor : public MutableFunctor { +public: + /** + * @name Constructors, destructors + */ + ///@{ + InitOnsetOffsetFunctor(); + virtual ~InitOnsetOffsetFunctor() = default; + ///@} + + /* + * Abstract base implementation + */ + bool ImplementsEndInterface() const override { return true; } + + /* + * Functor interface + */ + ///@{ + FunctorCode VisitChordEnd(Chord *chord) override; + FunctorCode VisitLayer(Layer *layer) override; + FunctorCode VisitLayerElement(LayerElement *layerElement) override; + FunctorCode VisitMeasure(Measure *measure) override; + FunctorCode VisitStaff(Staff *staff) override; + FunctorCode VisitTabGrpEnd(TabGrp *tabGrp) override; + ///@} + +protected: + // +private: + // +public: + // +private: + // The current score time in the measure (incremented by each element) + double m_currentScoreTime; + // The current real time in seconds in the measure (incremented by each element) + double m_currentRealTimeSeconds; + // The current Mensur + Mensur *m_currentMensur; + // The current MeterSig + MeterSig *m_currentMeterSig; + // The current notation type + data_NOTATIONTYPE m_notationType; + // The current tempo + double m_currentTempo; +}; + +} // namespace vrv + +#endif // __VRV_MIDIFUNCTOR_H__ diff --git a/src/midifunctor.cpp b/src/midifunctor.cpp new file mode 100644 index 0000000000..5fecf73aec --- /dev/null +++ b/src/midifunctor.cpp @@ -0,0 +1,60 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: midifunctor.cpp +// Author: David Bauer +// Created: 2023 +// Copyright (c) Authors and others. All rights reserved. +///////////////////////////////////////////////////////////////////////////// + +#include "midifunctor.h" + +//---------------------------------------------------------------------------- + +//---------------------------------------------------------------------------- + +namespace vrv { + +//---------------------------------------------------------------------------- +// InitOnsetOffsetFunctor +//---------------------------------------------------------------------------- + +InitOnsetOffsetFunctor::InitOnsetOffsetFunctor() +{ + m_currentScoreTime = 0.0; + m_currentRealTimeSeconds = 0.0; + m_currentMensur = NULL; + m_currentMeterSig = NULL; + m_notationType = NOTATIONTYPE_cmn; + m_currentTempo = MIDI_TEMPO; +} + +FunctorCode InitOnsetOffsetFunctor::VisitChordEnd(Chord *chord) +{ + return FUNCTOR_CONTINUE; +} + +FunctorCode InitOnsetOffsetFunctor::VisitLayer(Layer *layer) +{ + return FUNCTOR_CONTINUE; +} + +FunctorCode InitOnsetOffsetFunctor::VisitLayerElement(LayerElement *layerElement) +{ + return FUNCTOR_CONTINUE; +} + +FunctorCode InitOnsetOffsetFunctor::VisitMeasure(Measure *measure) +{ + return FUNCTOR_CONTINUE; +} + +FunctorCode InitOnsetOffsetFunctor::VisitStaff(Staff *staff) +{ + return FUNCTOR_CONTINUE; +} + +FunctorCode InitOnsetOffsetFunctor::VisitTabGrpEnd(TabGrp *tabGrp) +{ + return FUNCTOR_CONTINUE; +} + +} // namespace vrv From 0216c4988935d7a66539e89baa8388880adcf855 Mon Sep 17 00:00:00 2001 From: David Bauer Date: Mon, 24 Apr 2023 11:10:47 +0200 Subject: [PATCH 019/151] Add InitOnsetOffset implementation --- include/vrv/measure.h | 8 +++ src/midifunctor.cpp | 119 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 127 insertions(+) diff --git a/include/vrv/measure.h b/include/vrv/measure.h index 82aff6f00f..17b296cbfc 100644 --- a/include/vrv/measure.h +++ b/include/vrv/measure.h @@ -300,6 +300,14 @@ class Measure : public Object, */ double GetRealTimeOffsetMilliseconds(int repeat) const; + /** + * Setter and getter for the current tempo + */ + ///@{ + void SetCurrentTempo(double tempo) { m_currentTempo = tempo; } + double GetCurrentTempo() const { return m_currentTempo; } + ///@} + /** * Return vector with tie endpoints for ties that start and end in current measure */ diff --git a/src/midifunctor.cpp b/src/midifunctor.cpp index 5fecf73aec..815e5994a0 100644 --- a/src/midifunctor.cpp +++ b/src/midifunctor.cpp @@ -9,6 +9,12 @@ //---------------------------------------------------------------------------- +#include "beatrpt.h" +#include "layer.h" +#include "rest.h" +#include "staff.h" +#include "tabgrp.h" + //---------------------------------------------------------------------------- namespace vrv { @@ -29,31 +35,144 @@ InitOnsetOffsetFunctor::InitOnsetOffsetFunctor() FunctorCode InitOnsetOffsetFunctor::VisitChordEnd(Chord *chord) { + LayerElement *element = chord->ThisOrSameasLink(); + + double incrementScoreTime = element->GetAlignmentDuration(m_currentMensur, m_currentMeterSig, true, m_notationType); + incrementScoreTime = incrementScoreTime / (DUR_MAX / DURATION_4); + double realTimeIncrementSeconds = incrementScoreTime * 60.0 / m_currentTempo; + + m_currentScoreTime += incrementScoreTime; + m_currentRealTimeSeconds += realTimeIncrementSeconds; + return FUNCTOR_CONTINUE; } FunctorCode InitOnsetOffsetFunctor::VisitLayer(Layer *layer) { + m_currentScoreTime = 0.0; + m_currentRealTimeSeconds = 0.0; + + m_currentMensur = layer->GetCurrentMensur(); + m_currentMeterSig = layer->GetCurrentMeterSig(); + return FUNCTOR_CONTINUE; } FunctorCode InitOnsetOffsetFunctor::VisitLayerElement(LayerElement *layerElement) { + if (layerElement->IsScoreDefElement()) return FUNCTOR_SIBLINGS; + + LayerElement *element = layerElement->ThisOrSameasLink(); + + double incrementScoreTime; + + if (element->Is(REST) || element->Is(SPACE)) { + incrementScoreTime = element->GetAlignmentDuration(m_currentMensur, m_currentMeterSig, true, m_notationType); + incrementScoreTime = incrementScoreTime / (DUR_MAX / DURATION_4); + // For rests to be possibly added to the timemap + if (element->Is(REST)) { + Rest *rest = vrv_cast(element); + double realTimeIncrementSeconds = incrementScoreTime * 60.0 / m_currentTempo; + rest->SetScoreTimeOnset(m_currentScoreTime); + rest->SetRealTimeOnsetSeconds(m_currentRealTimeSeconds); + rest->SetScoreTimeOffset(m_currentScoreTime + incrementScoreTime); + rest->SetRealTimeOffsetSeconds(m_currentRealTimeSeconds + realTimeIncrementSeconds); + } + m_currentScoreTime += incrementScoreTime; + m_currentRealTimeSeconds += incrementScoreTime * 60.0 / m_currentTempo; + } + else if (element->Is(NOTE)) { + Note *note = vrv_cast(element); + assert(note); + + // For now just ignore grace notes + if (note->IsGraceNote()) return FUNCTOR_CONTINUE; + + Chord *chord = note->IsChordTone(); + TabGrp *tabGrp = note->IsTabGrpNote(); + + // If the note has a @dur or a @dur.ges, take it into account + // This means that overwriting only @dots or @dots.ges will not be taken into account + if (chord && !note->HasDur() && !note->HasDurGes()) { + incrementScoreTime = chord->GetAlignmentDuration(m_currentMensur, m_currentMeterSig, true, m_notationType); + } + else if (tabGrp && !note->HasDur() && !note->HasDurGes()) { + incrementScoreTime = tabGrp->GetAlignmentDuration(m_currentMensur, m_currentMeterSig, true, m_notationType); + } + else { + incrementScoreTime = note->GetAlignmentDuration(m_currentMensur, m_currentMeterSig, true, m_notationType); + } + incrementScoreTime = incrementScoreTime / (DUR_MAX / DURATION_4); + double realTimeIncrementSeconds = incrementScoreTime * 60.0 / m_currentTempo; + + // LogDebug("Note Alignment Duration %f - Dur %d - Diatonic Pitch %d - Track %d", GetAlignmentDuration(), + // note->GetNoteOrChordDur(element), note->GetDiatonicPitch(), *midiTrack); + // LogDebug("Oct %d - Pname %d - Accid %d", note->GetOct(), note->GetPname(), note->GetAccid()); + + // When we have a @sameas, do store the onset / offset values of the pointed note in the pointing note + Note *storeNote = (layerElement == element) ? note : dynamic_cast(layerElement); + if (storeNote) { + storeNote->SetScoreTimeOnset(m_currentScoreTime); + storeNote->SetRealTimeOnsetSeconds(m_currentRealTimeSeconds); + storeNote->SetScoreTimeOffset(m_currentScoreTime + incrementScoreTime); + storeNote->SetRealTimeOffsetSeconds(m_currentRealTimeSeconds + realTimeIncrementSeconds); + } + + // increase the currentTime accordingly, but only if not in a chord or tabGrp + if (!note->IsChordTone() && !note->IsTabGrpNote()) { + m_currentScoreTime += incrementScoreTime; + m_currentRealTimeSeconds += realTimeIncrementSeconds; + } + } + else if (element->Is(BEATRPT)) { + BeatRpt *rpt = vrv_cast(element); + assert(rpt); + + incrementScoreTime = rpt->GetAlignmentDuration(m_currentMensur, m_currentMeterSig, true, m_notationType); + incrementScoreTime = incrementScoreTime / (DUR_MAX / DURATION_4); + rpt->SetScoreTimeOnset(m_currentScoreTime); + m_currentScoreTime += incrementScoreTime; + m_currentRealTimeSeconds += incrementScoreTime * 60.0 / m_currentTempo; + } + else if (layerElement->Is({ BEAM, LIGATURE, FTREM, TUPLET }) && layerElement->HasSameasLink()) { + incrementScoreTime + = layerElement->GetSameAsContentAlignmentDuration(m_currentMensur, m_currentMeterSig, true, m_notationType); + incrementScoreTime = incrementScoreTime / (DUR_MAX / DURATION_4); + m_currentScoreTime += incrementScoreTime; + m_currentRealTimeSeconds += incrementScoreTime * 60.0 / m_currentTempo; + } + return FUNCTOR_CONTINUE; } FunctorCode InitOnsetOffsetFunctor::VisitMeasure(Measure *measure) { + m_currentTempo = measure->GetCurrentTempo(); + return FUNCTOR_CONTINUE; } FunctorCode InitOnsetOffsetFunctor::VisitStaff(Staff *staff) { + StaffDef *drawingStaffDef = staff->m_drawingStaffDef; + assert(drawingStaffDef); + + m_notationType = (drawingStaffDef->HasNotationtype()) ? drawingStaffDef->GetNotationtype() : NOTATIONTYPE_cmn; + return FUNCTOR_CONTINUE; } FunctorCode InitOnsetOffsetFunctor::VisitTabGrpEnd(TabGrp *tabGrp) { + LayerElement *element = tabGrp->ThisOrSameasLink(); + + double incrementScoreTime = element->GetAlignmentDuration(m_currentMensur, m_currentMeterSig, true, m_notationType); + incrementScoreTime = incrementScoreTime / (DUR_MAX / DURATION_4); + double realTimeIncrementSeconds = incrementScoreTime * 60.0 / m_currentTempo; + + m_currentScoreTime += incrementScoreTime; + m_currentRealTimeSeconds += realTimeIncrementSeconds; + return FUNCTOR_CONTINUE; } From 331254ae50b603f92831ec935287c5f2b304fc0c Mon Sep 17 00:00:00 2001 From: David Bauer Date: Mon, 24 Apr 2023 15:52:53 +0200 Subject: [PATCH 020/151] Apply InitOnsetOffset and cleanup --- include/vrv/chord.h | 5 -- include/vrv/functorparams.h | 32 ------------- include/vrv/layer.h | 7 --- include/vrv/layerelement.h | 7 --- include/vrv/measure.h | 5 -- include/vrv/object.h | 10 ---- include/vrv/staff.h | 7 --- include/vrv/tabgrp.h | 5 -- src/chord.cpp | 18 ------- src/doc.cpp | 7 ++- src/layer.cpp | 14 ------ src/layerelement.cpp | 95 ------------------------------------- src/measure.cpp | 10 ---- src/staff.cpp | 17 ------- src/tabgrp.cpp | 18 ------- 15 files changed, 3 insertions(+), 254 deletions(-) diff --git a/include/vrv/chord.h b/include/vrv/chord.h index 8295161115..c1ca29d442 100644 --- a/include/vrv/chord.h +++ b/include/vrv/chord.h @@ -192,11 +192,6 @@ class Chord : public LayerElement, FunctorCode AcceptEnd(ConstFunctor &functor) const override; ///@} - /** - * See Object::InitOnsetOffsetEnd - */ - int InitOnsetOffsetEnd(FunctorParams *functorParams) override; - /** * See Object::GenerateMIDI */ diff --git a/include/vrv/functorparams.h b/include/vrv/functorparams.h index 0cf23a4511..96a8dc7812 100644 --- a/include/vrv/functorparams.h +++ b/include/vrv/functorparams.h @@ -282,38 +282,6 @@ class InitMaxMeasureDurationParams : public FunctorParams { int m_multiRestFactor; }; -//---------------------------------------------------------------------------- -// InitOnsetOffset -//---------------------------------------------------------------------------- - -/** - * member 0: double: the current score time in the measure (incremented by each element) - * member 1: double: the current real time in seconds in the measure (incremented by each element) - * member 2: the current Mensur - * member 3: the current MeterSig - * member 4: the current notation type - * member 5: the current tempo - **/ - -class InitOnsetOffsetParams : public FunctorParams { -public: - InitOnsetOffsetParams() - { - m_currentScoreTime = 0.0; - m_currentRealTimeSeconds = 0.0; - m_currentMensur = NULL; - m_currentMeterSig = NULL; - m_notationType = NOTATIONTYPE_cmn; - m_currentTempo = MIDI_TEMPO; - } - double m_currentScoreTime; - double m_currentRealTimeSeconds; - Mensur *m_currentMensur; - MeterSig *m_currentMeterSig; - data_NOTATIONTYPE m_notationType; - double m_currentTempo; -}; - //---------------------------------------------------------------------------- // InitMIDIParams //---------------------------------------------------------------------------- diff --git a/include/vrv/layer.h b/include/vrv/layer.h index 69392efd34..6456e7cd30 100644 --- a/include/vrv/layer.h +++ b/include/vrv/layer.h @@ -246,13 +246,6 @@ class Layer : public Object, FunctorCode AcceptEnd(ConstFunctor &functor) const override; ///@} - /** - * See Object::InitOnsetOffset - */ - ///@{ - int InitOnsetOffset(FunctorParams *functorParams) override; - ///@} - /** * @name See Object::GenerateMIDI */ diff --git a/include/vrv/layerelement.h b/include/vrv/layerelement.h index 620e90c48d..af4c32b688 100644 --- a/include/vrv/layerelement.h +++ b/include/vrv/layerelement.h @@ -338,13 +338,6 @@ class LayerElement : public Object, FunctorCode AcceptEnd(ConstFunctor &functor) const override; ///@} - /** - * See Object::InitOnsetOffset - */ - ///@{ - int InitOnsetOffset(FunctorParams *functorParams) override; - ///@} - /** * See Object::InitTimemapTies */ diff --git a/include/vrv/measure.h b/include/vrv/measure.h index 17b296cbfc..929889b811 100644 --- a/include/vrv/measure.h +++ b/include/vrv/measure.h @@ -355,11 +355,6 @@ class Measure : public Object, int InitMaxMeasureDurationEnd(FunctorParams *functorParams) override; ///@} - /** - * See Object::InitOnsetOffset - */ - int InitOnsetOffset(FunctorParams *functorParams) override; - public: // flags for drawing measure barline based on visibility or other conditions enum BarlineDrawingFlags { diff --git a/include/vrv/object.h b/include/vrv/object.h index eef46d6c27..6655d948d3 100644 --- a/include/vrv/object.h +++ b/include/vrv/object.h @@ -692,16 +692,6 @@ class Object : public BoundingBox { */ ///@{ - /** - * Prepare Note onsets - */ - virtual int InitOnsetOffset(FunctorParams *) { return FUNCTOR_CONTINUE; } - - /** - * End Functor for Object::InitOnsetOffset - */ - virtual int InitOnsetOffsetEnd(FunctorParams *) { return FUNCTOR_CONTINUE; } - /** * Calculate the maximum duration of each measure. */ diff --git a/include/vrv/staff.h b/include/vrv/staff.h index 43513c2a8e..41c9f20c3a 100644 --- a/include/vrv/staff.h +++ b/include/vrv/staff.h @@ -195,13 +195,6 @@ class Staff : public Object, FunctorCode AcceptEnd(ConstFunctor &functor) const override; ///@} - /** - * See Object::InitOnsetOffset - */ - ///@{ - int InitOnsetOffset(FunctorParams *functorParams) override; - ///@} - /** * See Object::GenerateMIDI */ diff --git a/include/vrv/tabgrp.h b/include/vrv/tabgrp.h index c15c6a9f00..00c093d878 100644 --- a/include/vrv/tabgrp.h +++ b/include/vrv/tabgrp.h @@ -72,11 +72,6 @@ class TabGrp : public LayerElement, public ObjectListInterface, public DurationI FunctorCode AcceptEnd(ConstFunctor &functor) const override; ///@} - /** - * See Object::InitOnsetOffsetEnd - */ - virtual int InitOnsetOffsetEnd(FunctorParams *functorParams) override; - protected: /** * Filter the flat list and keep only Note elements. diff --git a/src/chord.cpp b/src/chord.cpp index 0bfeea2105..f8c375c48a 100644 --- a/src/chord.cpp +++ b/src/chord.cpp @@ -601,24 +601,6 @@ MapOfDotLocs Chord::CalcDotLocations(int layerCount, bool primary) const return dotLocs; } -int Chord::InitOnsetOffsetEnd(FunctorParams *functorParams) -{ - InitOnsetOffsetParams *params = vrv_params_cast(functorParams); - assert(params); - - LayerElement *element = this->ThisOrSameasLink(); - - double incrementScoreTime = element->GetAlignmentDuration( - params->m_currentMensur, params->m_currentMeterSig, true, params->m_notationType); - incrementScoreTime = incrementScoreTime / (DUR_MAX / DURATION_4); - double realTimeIncrementSeconds = incrementScoreTime * 60.0 / params->m_currentTempo; - - params->m_currentScoreTime += incrementScoreTime; - params->m_currentRealTimeSeconds += realTimeIncrementSeconds; - - return FUNCTOR_CONTINUE; -} - int Chord::GenerateMIDI(FunctorParams *functorParams) { GenerateMIDIParams *params = vrv_params_cast(functorParams); diff --git a/src/doc.cpp b/src/doc.cpp index 50932023f0..ed8aaee6f6 100644 --- a/src/doc.cpp +++ b/src/doc.cpp @@ -36,6 +36,7 @@ #include "measure.h" #include "mensur.h" #include "metersig.h" +#include "midifunctor.h" #include "miscfunctor.h" #include "mnum.h" #include "mrest.h" @@ -358,10 +359,8 @@ void Doc::CalculateTimemap() this->Process(&initMaxMeasureDuration, &initMaxMeasureDurationParams, &initMaxMeasureDurationEnd); // Then calculate the onset and offset times (w.r.t. the measure) for every note - InitOnsetOffsetParams initOnsetOffsetParams; - Functor initOnsetOffset(&Object::InitOnsetOffset); - Functor initOnsetOffsetEnd(&Object::InitOnsetOffsetEnd); - this->Process(&initOnsetOffset, &initOnsetOffsetParams, &initOnsetOffsetEnd); + InitOnsetOffsetFunctor initOnsetOffset; + this->Process(initOnsetOffset); // Adjust the duration of tied notes Functor initTimemapTies(&Object::InitTimemapTies); diff --git a/src/layer.cpp b/src/layer.cpp index d6abbd6372..4f0010ddc2 100644 --- a/src/layer.cpp +++ b/src/layer.cpp @@ -630,20 +630,6 @@ FunctorCode Layer::AcceptEnd(ConstFunctor &functor) const return functor.VisitLayerEnd(this); } -int Layer::InitOnsetOffset(FunctorParams *functorParams) -{ - InitOnsetOffsetParams *params = vrv_params_cast(functorParams); - assert(params); - - params->m_currentScoreTime = 0.0; - params->m_currentRealTimeSeconds = 0.0; - - params->m_currentMensur = this->GetCurrentMensur(); - params->m_currentMeterSig = this->GetCurrentMeterSig(); - - return FUNCTOR_CONTINUE; -} - int Layer::GenerateMIDI(FunctorParams *functorParams) { GenerateMIDIParams *params = vrv_params_cast(functorParams); diff --git a/src/layerelement.cpp b/src/layerelement.cpp index a92844d16a..164908cd55 100644 --- a/src/layerelement.cpp +++ b/src/layerelement.cpp @@ -1315,101 +1315,6 @@ std::pair LayerElement::CalcElementHorizontalOverlap(const Doc *doc, return { shift, isInUnison }; } -int LayerElement::InitOnsetOffset(FunctorParams *functorParams) -{ - InitOnsetOffsetParams *params = vrv_params_cast(functorParams); - assert(params); - - if (this->IsScoreDefElement()) return FUNCTOR_SIBLINGS; - - LayerElement *element = this->ThisOrSameasLink(); - - double incrementScoreTime; - - if (element->Is(REST) || element->Is(SPACE)) { - incrementScoreTime = element->GetAlignmentDuration( - params->m_currentMensur, params->m_currentMeterSig, true, params->m_notationType); - incrementScoreTime = incrementScoreTime / (DUR_MAX / DURATION_4); - // For rests to be possibly added to the timemap - if (element->Is(REST)) { - Rest *rest = vrv_cast(element); - double realTimeIncrementSeconds = incrementScoreTime * 60.0 / params->m_currentTempo; - rest->SetScoreTimeOnset(params->m_currentScoreTime); - rest->SetRealTimeOnsetSeconds(params->m_currentRealTimeSeconds); - rest->SetScoreTimeOffset(params->m_currentScoreTime + incrementScoreTime); - rest->SetRealTimeOffsetSeconds(params->m_currentRealTimeSeconds + realTimeIncrementSeconds); - } - params->m_currentScoreTime += incrementScoreTime; - params->m_currentRealTimeSeconds += incrementScoreTime * 60.0 / params->m_currentTempo; - } - else if (element->Is(NOTE)) { - Note *note = vrv_cast(element); - assert(note); - - // For now just ignore grace notes - if (note->IsGraceNote()) return FUNCTOR_CONTINUE; - - Chord *chord = note->IsChordTone(); - TabGrp *tabGrp = note->IsTabGrpNote(); - - // If the note has a @dur or a @dur.ges, take it into account - // This means that overwriting only @dots or @dots.ges will not be taken into account - if (chord && !note->HasDur() && !note->HasDurGes()) { - incrementScoreTime = chord->GetAlignmentDuration( - params->m_currentMensur, params->m_currentMeterSig, true, params->m_notationType); - } - else if (tabGrp && !note->HasDur() && !note->HasDurGes()) { - incrementScoreTime = tabGrp->GetAlignmentDuration( - params->m_currentMensur, params->m_currentMeterSig, true, params->m_notationType); - } - else { - incrementScoreTime = note->GetAlignmentDuration( - params->m_currentMensur, params->m_currentMeterSig, true, params->m_notationType); - } - incrementScoreTime = incrementScoreTime / (DUR_MAX / DURATION_4); - double realTimeIncrementSeconds = incrementScoreTime * 60.0 / params->m_currentTempo; - - // LogDebug("Note Alignment Duration %f - Dur %d - Diatonic Pitch %d - Track %d", GetAlignmentDuration(), - // note->GetNoteOrChordDur(element), note->GetDiatonicPitch(), *midiTrack); - // LogDebug("Oct %d - Pname %d - Accid %d", note->GetOct(), note->GetPname(), note->GetAccid()); - - // When we have a @sameas, do store the onset / offset values of the pointed note in the pointing note - Note *storeNote = (this == element) ? note : dynamic_cast(this); - if (storeNote) { - storeNote->SetScoreTimeOnset(params->m_currentScoreTime); - storeNote->SetRealTimeOnsetSeconds(params->m_currentRealTimeSeconds); - storeNote->SetScoreTimeOffset(params->m_currentScoreTime + incrementScoreTime); - storeNote->SetRealTimeOffsetSeconds(params->m_currentRealTimeSeconds + realTimeIncrementSeconds); - } - - // increase the currentTime accordingly, but only if not in a chord or tabGrp - checkit with note->IsChordTone() - // or note->IsTabGrpNote() - if (!(note->IsChordTone()) && !(note->IsTabGrpNote())) { - params->m_currentScoreTime += incrementScoreTime; - params->m_currentRealTimeSeconds += realTimeIncrementSeconds; - } - } - else if (element->Is(BEATRPT)) { - BeatRpt *rpt = vrv_cast(element); - assert(rpt); - - incrementScoreTime = rpt->GetAlignmentDuration( - params->m_currentMensur, params->m_currentMeterSig, true, params->m_notationType); - incrementScoreTime = incrementScoreTime / (DUR_MAX / DURATION_4); - rpt->SetScoreTimeOnset(params->m_currentScoreTime); - params->m_currentScoreTime += incrementScoreTime; - params->m_currentRealTimeSeconds += incrementScoreTime * 60.0 / params->m_currentTempo; - } - else if (this->Is({ BEAM, LIGATURE, FTREM, TUPLET }) && this->HasSameasLink()) { - incrementScoreTime = this->GetSameAsContentAlignmentDuration( - params->m_currentMensur, params->m_currentMeterSig, true, params->m_notationType); - incrementScoreTime = incrementScoreTime / (DUR_MAX / DURATION_4); - params->m_currentScoreTime += incrementScoreTime; - params->m_currentRealTimeSeconds += incrementScoreTime * 60.0 / params->m_currentTempo; - } - return FUNCTOR_CONTINUE; -} - int LayerElement::InitTimemapTies(FunctorParams *) { return FUNCTOR_CONTINUE; diff --git a/src/measure.cpp b/src/measure.cpp index ac90d9183b..285b007bf1 100644 --- a/src/measure.cpp +++ b/src/measure.cpp @@ -798,14 +798,4 @@ int Measure::InitMaxMeasureDurationEnd(FunctorParams *functorParams) return FUNCTOR_CONTINUE; } -int Measure::InitOnsetOffset(FunctorParams *functorParams) -{ - InitOnsetOffsetParams *params = vrv_params_cast(functorParams); - assert(params); - - params->m_currentTempo = m_currentTempo; - - return FUNCTOR_CONTINUE; -} - } // namespace vrv diff --git a/src/staff.cpp b/src/staff.cpp index 4436112e2e..3477afa2ca 100644 --- a/src/staff.cpp +++ b/src/staff.cpp @@ -364,23 +364,6 @@ FunctorCode Staff::AcceptEnd(ConstFunctor &functor) const return functor.VisitStaffEnd(this); } -int Staff::InitOnsetOffset(FunctorParams *functorParams) -{ - InitOnsetOffsetParams *params = vrv_params_cast(functorParams); - assert(params); - - assert(m_drawingStaffDef); - - if (m_drawingStaffDef->HasNotationtype()) { - params->m_notationType = m_drawingStaffDef->GetNotationtype(); - } - else { - params->m_notationType = NOTATIONTYPE_cmn; - } - - return FUNCTOR_CONTINUE; -} - int Staff::GenerateMIDI(FunctorParams *functorParams) { GenerateMIDIParams *params = vrv_params_cast(functorParams); diff --git a/src/tabgrp.cpp b/src/tabgrp.cpp index a2648b21ce..54c786bac1 100644 --- a/src/tabgrp.cpp +++ b/src/tabgrp.cpp @@ -137,22 +137,4 @@ FunctorCode TabGrp::AcceptEnd(ConstFunctor &functor) const return functor.VisitTabGrpEnd(this); } -int TabGrp::InitOnsetOffsetEnd(FunctorParams *functorParams) -{ - InitOnsetOffsetParams *params = vrv_params_cast(functorParams); - assert(params); - - LayerElement *element = this->ThisOrSameasLink(); - - double incrementScoreTime = element->GetAlignmentDuration( - params->m_currentMensur, params->m_currentMeterSig, true, params->m_notationType); - incrementScoreTime = incrementScoreTime / (DUR_MAX / DURATION_4); - double realTimeIncrementSeconds = incrementScoreTime * 60.0 / params->m_currentTempo; - - params->m_currentScoreTime += incrementScoreTime; - params->m_currentRealTimeSeconds += realTimeIncrementSeconds; - - return FUNCTOR_CONTINUE; -} - } // namespace vrv From d640faace73969a3a04f442ced4bcfc41214578e Mon Sep 17 00:00:00 2001 From: David Bauer Date: Mon, 24 Apr 2023 16:20:03 +0200 Subject: [PATCH 021/151] Add InitMaxMeasureDuration skeleton --- include/vrv/midifunctor.h | 52 +++++++++++++++++++++++++++++++++++++++ src/midifunctor.cpp | 38 ++++++++++++++++++++++++++++ 2 files changed, 90 insertions(+) diff --git a/include/vrv/midifunctor.h b/include/vrv/midifunctor.h index 5aa405e837..91f4409a10 100644 --- a/include/vrv/midifunctor.h +++ b/include/vrv/midifunctor.h @@ -67,6 +67,58 @@ class InitOnsetOffsetFunctor : public MutableFunctor { double m_currentTempo; }; +//---------------------------------------------------------------------------- +// InitMaxMeasureDurationFunctor +//---------------------------------------------------------------------------- + +/** + * This class calculates the maximum duration of each measure. + */ +class InitMaxMeasureDurationFunctor : public MutableFunctor { +public: + /** + * @name Constructors, destructors + */ + ///@{ + InitMaxMeasureDurationFunctor(); + virtual ~InitMaxMeasureDurationFunctor() = default; + ///@} + + /* + * Abstract base implementation + */ + bool ImplementsEndInterface() const override { return true; } + + /* + * Functor interface + */ + ///@{ + FunctorCode VisitLayerElement(LayerElement *layerElement) override; + FunctorCode VisitMeasure(Measure *measure) override; + FunctorCode VisitMeasureEnd(Measure *measure) override; + FunctorCode VisitScoreDef(ScoreDef *scoreDef) override; + FunctorCode VisitTempo(Tempo *tempo) override; + ///@} + +protected: + // +private: + // +public: + // +private: + // The current score time + double m_currentScoreTime; + // The current time in seconds + double m_currentRealTimeSeconds; + // The current tempo + double m_currentTempo; + // The tempo adjustment + double m_tempoAdjustment; + // The factor for multibar rests + int m_multiRestFactor; +}; + } // namespace vrv #endif // __VRV_MIDIFUNCTOR_H__ diff --git a/src/midifunctor.cpp b/src/midifunctor.cpp index 815e5994a0..a0f0c76564 100644 --- a/src/midifunctor.cpp +++ b/src/midifunctor.cpp @@ -176,4 +176,42 @@ FunctorCode InitOnsetOffsetFunctor::VisitTabGrpEnd(TabGrp *tabGrp) return FUNCTOR_CONTINUE; } +//---------------------------------------------------------------------------- +// InitMaxMeasureDurationFunctor +//---------------------------------------------------------------------------- + +InitMaxMeasureDurationFunctor::InitMaxMeasureDurationFunctor() +{ + m_currentScoreTime = 0.0; + m_currentRealTimeSeconds = 0.0; + m_currentTempo = MIDI_TEMPO; + m_tempoAdjustment = 1.0; + m_multiRestFactor = 1; +} + +FunctorCode InitMaxMeasureDurationFunctor::VisitLayerElement(LayerElement *layerElement) +{ + return FUNCTOR_CONTINUE; +} + +FunctorCode InitMaxMeasureDurationFunctor::VisitMeasure(Measure *measure) +{ + return FUNCTOR_CONTINUE; +} + +FunctorCode InitMaxMeasureDurationFunctor::VisitMeasureEnd(Measure *measure) +{ + return FUNCTOR_CONTINUE; +} + +FunctorCode InitMaxMeasureDurationFunctor::VisitScoreDef(ScoreDef *scoreDef) +{ + return FUNCTOR_CONTINUE; +} + +FunctorCode InitMaxMeasureDurationFunctor::VisitTempo(Tempo *tempo) +{ + return FUNCTOR_CONTINUE; +} + } // namespace vrv From e1802aba10e666234ca870114cbd940753242333 Mon Sep 17 00:00:00 2001 From: David Bauer Date: Tue, 25 Apr 2023 08:06:49 +0200 Subject: [PATCH 022/151] Add InitMaxMeasureDuration implementation --- include/vrv/measure.h | 20 +++++++++++++++----- src/midifunctor.cpp | 37 ++++++++++++++++++++++++++++++++++++- 2 files changed, 51 insertions(+), 6 deletions(-) diff --git a/include/vrv/measure.h b/include/vrv/measure.h index 929889b811..5b9884bd1c 100644 --- a/include/vrv/measure.h +++ b/include/vrv/measure.h @@ -295,11 +295,26 @@ class Measure : public Object, */ int EnclosesTime(int time) const; + /** + * Read only access to m_scoreTimeOffset + */ + double GetLastTimeOffset() const { return m_scoreTimeOffset.back(); } + /** * Return the real time offset in millisecond for the repeat (1-based). */ double GetRealTimeOffsetMilliseconds(int repeat) const; + /** + * Setter for the time offset + */ + ///@{ + void ClearScoreTimeOffset() { m_scoreTimeOffset.clear(); } + void AddScoreTimeOffset(double offset) { m_scoreTimeOffset.push_back(offset); } + void ClearRealTimeOffset() { m_realTimeOffsetMilliseconds.clear(); } + void AddRealTimeOffset(double milliseconds) { m_realTimeOffsetMilliseconds.push_back(milliseconds); } + ///@} + /** * Setter and getter for the current tempo */ @@ -313,11 +328,6 @@ class Measure : public Object, */ std::vector> GetInternalTieEndpoints(); - /** - * Read only access to m_scoreTimeOffset - */ - double GetLastTimeOffset() const { return m_scoreTimeOffset.back(); } - //----------// // Functors // //----------// diff --git a/src/midifunctor.cpp b/src/midifunctor.cpp index a0f0c76564..acd99aac00 100644 --- a/src/midifunctor.cpp +++ b/src/midifunctor.cpp @@ -11,9 +11,11 @@ #include "beatrpt.h" #include "layer.h" +#include "multirest.h" #include "rest.h" #include "staff.h" #include "tabgrp.h" +#include "tempo.h" //---------------------------------------------------------------------------- @@ -191,26 +193,59 @@ InitMaxMeasureDurationFunctor::InitMaxMeasureDurationFunctor() FunctorCode InitMaxMeasureDurationFunctor::VisitLayerElement(LayerElement *layerElement) { - return FUNCTOR_CONTINUE; + if (layerElement->Is(MULTIREST)) { + MultiRest *multiRest = vrv_cast(layerElement); + assert(multiRest); + m_multiRestFactor = multiRest->GetNum(); + } + + return FUNCTOR_SIBLINGS; } FunctorCode InitMaxMeasureDurationFunctor::VisitMeasure(Measure *measure) { + measure->ClearScoreTimeOffset(); + measure->AddScoreTimeOffset(m_currentScoreTime); + + measure->ClearRealTimeOffset(); + measure->AddRealTimeOffset(m_currentRealTimeSeconds * 1000.0); + return FUNCTOR_CONTINUE; } FunctorCode InitMaxMeasureDurationFunctor::VisitMeasureEnd(Measure *measure) { + const double scoreTimeIncrement + = measure->m_measureAligner.GetRightAlignment()->GetTime() * m_multiRestFactor * DURATION_4 / DUR_MAX; + m_currentTempo = m_currentTempo * m_tempoAdjustment; + m_currentScoreTime += scoreTimeIncrement; + m_currentRealTimeSeconds += scoreTimeIncrement * 60.0 / m_currentTempo; + m_multiRestFactor = 1; + return FUNCTOR_CONTINUE; } FunctorCode InitMaxMeasureDurationFunctor::VisitScoreDef(ScoreDef *scoreDef) { + if (scoreDef->HasMidiBpm()) { + m_currentTempo = scoreDef->GetMidiBpm(); + } + else if (scoreDef->HasMm()) { + m_currentTempo = Tempo::CalcTempo(scoreDef); + } + return FUNCTOR_CONTINUE; } FunctorCode InitMaxMeasureDurationFunctor::VisitTempo(Tempo *tempo) { + if (tempo->HasMidiBpm()) { + m_currentTempo = tempo->GetMidiBpm(); + } + else if (tempo->HasMm()) { + m_currentTempo = Tempo::CalcTempo(tempo); + } + return FUNCTOR_CONTINUE; } From 883240e291d4b1f0f79a3b0a12f98588120623e0 Mon Sep 17 00:00:00 2001 From: David Bauer Date: Tue, 25 Apr 2023 08:40:55 +0200 Subject: [PATCH 023/151] Apply InitMaxMeasureDuration and cleanup --- include/vrv/functorparams.h | 29 ----------------------------- include/vrv/layerelement.h | 5 ----- include/vrv/measure.h | 8 -------- include/vrv/midifunctor.h | 8 ++++++++ include/vrv/object.h | 10 ---------- include/vrv/scoredef.h | 5 ----- include/vrv/tempo.h | 5 ----- src/doc.cpp | 10 ++++------ src/layerelement.cpp | 14 -------------- src/measure.cpp | 30 ------------------------------ src/scoredef.cpp | 15 --------------- src/tempo.cpp | 15 --------------- 12 files changed, 12 insertions(+), 142 deletions(-) diff --git a/include/vrv/functorparams.h b/include/vrv/functorparams.h index 96a8dc7812..fd33682b76 100644 --- a/include/vrv/functorparams.h +++ b/include/vrv/functorparams.h @@ -253,35 +253,6 @@ class GenerateTimemapParams : public FunctorParams { Functor *m_functor; }; -//---------------------------------------------------------------------------- -// InitMaxMeasureDurationParams -//---------------------------------------------------------------------------- - -/** - * member 0: the current score time - * member 1: the current time in seconds - * member 2: the current tempo - * member 3: the tempo adjustment - * member 4: factor for multibar rests - **/ - -class InitMaxMeasureDurationParams : public FunctorParams { -public: - InitMaxMeasureDurationParams() - { - m_currentScoreTime = 0.0; - m_currentRealTimeSeconds = 0.0; - m_currentTempo = MIDI_TEMPO; - m_tempoAdjustment = 1.0; - m_multiRestFactor = 1; - } - double m_currentScoreTime; - double m_currentRealTimeSeconds; - double m_currentTempo; - double m_tempoAdjustment; - int m_multiRestFactor; -}; - //---------------------------------------------------------------------------- // InitMIDIParams //---------------------------------------------------------------------------- diff --git a/include/vrv/layerelement.h b/include/vrv/layerelement.h index af4c32b688..52b19eaf5d 100644 --- a/include/vrv/layerelement.h +++ b/include/vrv/layerelement.h @@ -357,11 +357,6 @@ class LayerElement : public Object, */ int GenerateTimemap(FunctorParams *functorParams) override; - /** - * See Object::CalcMaxMeasureDuration - */ - int InitMaxMeasureDuration(FunctorParams *functorParams) override; - protected: /** * Helper to figure whether two chords are in fully in unison based on the locations of the notes. diff --git a/include/vrv/measure.h b/include/vrv/measure.h index 5b9884bd1c..7473c8aa19 100644 --- a/include/vrv/measure.h +++ b/include/vrv/measure.h @@ -357,14 +357,6 @@ class Measure : public Object, */ int GenerateTimemap(FunctorParams *functorParams) override; - /** - * See Object::CalcMaxMeasureDuration - */ - ///@{ - int InitMaxMeasureDuration(FunctorParams *functorParams) override; - int InitMaxMeasureDurationEnd(FunctorParams *functorParams) override; - ///@} - public: // flags for drawing measure barline based on visibility or other conditions enum BarlineDrawingFlags { diff --git a/include/vrv/midifunctor.h b/include/vrv/midifunctor.h index 91f4409a10..c3a4eaa859 100644 --- a/include/vrv/midifunctor.h +++ b/include/vrv/midifunctor.h @@ -89,6 +89,14 @@ class InitMaxMeasureDurationFunctor : public MutableFunctor { */ bool ImplementsEndInterface() const override { return true; } + /* + * Set the tempo + */ + ///@{ + void SetCurrentTempo(double tempo) { m_currentTempo = tempo; } + void SetTempoAdjustment(double adjustment) { m_tempoAdjustment = adjustment; } + ///@} + /* * Functor interface */ diff --git a/include/vrv/object.h b/include/vrv/object.h index 6655d948d3..ceb33c606f 100644 --- a/include/vrv/object.h +++ b/include/vrv/object.h @@ -692,16 +692,6 @@ class Object : public BoundingBox { */ ///@{ - /** - * Calculate the maximum duration of each measure. - */ - virtual int InitMaxMeasureDuration(FunctorParams *) { return FUNCTOR_CONTINUE; } - - /** - * End Functor for Object::CalcMaxMeasureDuration - */ - virtual int InitMaxMeasureDurationEnd(FunctorParams *) { return FUNCTOR_CONTINUE; } - /** * Adjust note timings based on ties */ diff --git a/include/vrv/scoredef.h b/include/vrv/scoredef.h index 7bab051d89..3f9d363fc3 100644 --- a/include/vrv/scoredef.h +++ b/include/vrv/scoredef.h @@ -276,11 +276,6 @@ class ScoreDef : public ScoreDefElement, FunctorCode AcceptEnd(ConstFunctor &functor) const override; ///@} - /** - * See Object::CalcMaxMeasureDuration - */ - int InitMaxMeasureDuration(FunctorParams *functorParams) override; - /** * See Object::GenerateMIDI */ diff --git a/include/vrv/tempo.h b/include/vrv/tempo.h index 636e93a663..59ddac27aa 100644 --- a/include/vrv/tempo.h +++ b/include/vrv/tempo.h @@ -96,11 +96,6 @@ class Tempo : public ControlElement, FunctorCode AcceptEnd(ConstFunctor &functor) const override; ///@} - /** - * See Object::CalcMaxMeasureDuration - */ - int InitMaxMeasureDuration(FunctorParams *functorParams) override; - //----------// // Static // //----------// diff --git a/src/doc.cpp b/src/doc.cpp index ed8aaee6f6..ba1f743647 100644 --- a/src/doc.cpp +++ b/src/doc.cpp @@ -351,12 +351,10 @@ void Doc::CalculateTimemap() } // We first calculate the maximum duration of each measure - InitMaxMeasureDurationParams initMaxMeasureDurationParams; - initMaxMeasureDurationParams.m_currentTempo = tempo; - initMaxMeasureDurationParams.m_tempoAdjustment = m_options->m_midiTempoAdjustment.GetValue(); - Functor initMaxMeasureDuration(&Object::InitMaxMeasureDuration); - Functor initMaxMeasureDurationEnd(&Object::InitMaxMeasureDurationEnd); - this->Process(&initMaxMeasureDuration, &initMaxMeasureDurationParams, &initMaxMeasureDurationEnd); + InitMaxMeasureDurationFunctor initMaxMeasureDuration; + initMaxMeasureDuration.SetCurrentTempo(tempo); + initMaxMeasureDuration.SetTempoAdjustment(m_options->m_midiTempoAdjustment.GetValue()); + this->Process(initMaxMeasureDuration); // Then calculate the onset and offset times (w.r.t. the measure) for every note InitOnsetOffsetFunctor initOnsetOffset; diff --git a/src/layerelement.cpp b/src/layerelement.cpp index 164908cd55..bc9defb5ba 100644 --- a/src/layerelement.cpp +++ b/src/layerelement.cpp @@ -1352,18 +1352,4 @@ int LayerElement::GenerateTimemap(FunctorParams *functorParams) return FUNCTOR_CONTINUE; } -int LayerElement::InitMaxMeasureDuration(FunctorParams *functorParams) -{ - InitMaxMeasureDurationParams *params = vrv_params_cast(functorParams); - assert(params); - - if (this->Is(MULTIREST)) { - MultiRest *multiRest = vrv_cast(this); - assert(multiRest); - params->m_multiRestFactor = multiRest->GetNum(); - } - - return FUNCTOR_SIBLINGS; -} - } // namespace vrv diff --git a/src/measure.cpp b/src/measure.cpp index 285b007bf1..33beb57776 100644 --- a/src/measure.cpp +++ b/src/measure.cpp @@ -768,34 +768,4 @@ int Measure::GenerateTimemap(FunctorParams *functorParams) return FUNCTOR_CONTINUE; } -int Measure::InitMaxMeasureDuration(FunctorParams *functorParams) -{ - InitMaxMeasureDurationParams *params = vrv_params_cast(functorParams); - assert(params); - - m_scoreTimeOffset.clear(); - m_scoreTimeOffset.push_back(params->m_currentScoreTime); - - m_realTimeOffsetMilliseconds.clear(); - // m_realTimeOffsetMilliseconds.push_back(int(params->m_maxCurrentRealTimeSeconds * 1000.0 + 0.5)); - m_realTimeOffsetMilliseconds.push_back(params->m_currentRealTimeSeconds * 1000.0); - - return FUNCTOR_CONTINUE; -} - -int Measure::InitMaxMeasureDurationEnd(FunctorParams *functorParams) -{ - InitMaxMeasureDurationParams *params = vrv_params_cast(functorParams); - assert(params); - - const double scoreTimeIncrement - = m_measureAligner.GetRightAlignment()->GetTime() * params->m_multiRestFactor * DURATION_4 / DUR_MAX; - m_currentTempo = params->m_currentTempo * params->m_tempoAdjustment; - params->m_currentScoreTime += scoreTimeIncrement; - params->m_currentRealTimeSeconds += scoreTimeIncrement * 60.0 / m_currentTempo; - params->m_multiRestFactor = 1; - - return FUNCTOR_CONTINUE; -} - } // namespace vrv diff --git a/src/scoredef.cpp b/src/scoredef.cpp index f97bbbb0a1..1facc5b448 100644 --- a/src/scoredef.cpp +++ b/src/scoredef.cpp @@ -699,21 +699,6 @@ FunctorCode ScoreDef::AcceptEnd(ConstFunctor &functor) const return functor.VisitScoreDefEnd(this); } -int ScoreDef::InitMaxMeasureDuration(FunctorParams *functorParams) -{ - InitMaxMeasureDurationParams *params = vrv_params_cast(functorParams); - assert(params); - - if (this->HasMidiBpm()) { - params->m_currentTempo = this->GetMidiBpm(); - } - else if (this->HasMm()) { - params->m_currentTempo = Tempo::CalcTempo(this); - } - - return FUNCTOR_CONTINUE; -} - int ScoreDef::GenerateMIDI(FunctorParams *functorParams) { GenerateMIDIParams *params = vrv_params_cast(functorParams); diff --git a/src/tempo.cpp b/src/tempo.cpp index dab2a58023..52978a5b5d 100644 --- a/src/tempo.cpp +++ b/src/tempo.cpp @@ -107,21 +107,6 @@ FunctorCode Tempo::AcceptEnd(ConstFunctor &functor) const return functor.VisitTempoEnd(this); } -int Tempo::InitMaxMeasureDuration(FunctorParams *functorParams) -{ - InitMaxMeasureDurationParams *params = vrv_params_cast(functorParams); - assert(params); - - if (this->HasMidiBpm()) { - params->m_currentTempo = this->GetMidiBpm(); - } - else if (this->HasMm()) { - params->m_currentTempo = Tempo::CalcTempo(this); - } - - return FUNCTOR_CONTINUE; -} - double Tempo::CalcTempo(const AttMmTempo *attMmTempo) { double tempo = MIDI_TEMPO; From 6e338d03c0bfa8c7cb108b4f07bef104c291be4a Mon Sep 17 00:00:00 2001 From: David Bauer Date: Tue, 25 Apr 2023 08:55:33 +0200 Subject: [PATCH 024/151] Add InitTimemapTies --- include/vrv/midifunctor.h | 39 +++++++++++++++++++++++++++++++++++++++ src/midifunctor.cpp | 30 ++++++++++++++++++++++++++++++ 2 files changed, 69 insertions(+) diff --git a/include/vrv/midifunctor.h b/include/vrv/midifunctor.h index c3a4eaa859..90a8803e45 100644 --- a/include/vrv/midifunctor.h +++ b/include/vrv/midifunctor.h @@ -127,6 +127,45 @@ class InitMaxMeasureDurationFunctor : public MutableFunctor { int m_multiRestFactor; }; +//---------------------------------------------------------------------------- +// InitTimemapTiesFunctor +//---------------------------------------------------------------------------- + +/** + * This class adjusts note timings based on ties. + */ +class InitTimemapTiesFunctor : public MutableFunctor { +public: + /** + * @name Constructors, destructors + */ + ///@{ + InitTimemapTiesFunctor(); + virtual ~InitTimemapTiesFunctor() = default; + ///@} + + /* + * Abstract base implementation + */ + bool ImplementsEndInterface() const override { return false; } + + /* + * Functor interface + */ + ///@{ + FunctorCode VisitTie(Tie *tie) override; + ///@} + +protected: + // +private: + // +public: + // +private: + // +}; + } // namespace vrv #endif // __VRV_MIDIFUNCTOR_H__ diff --git a/src/midifunctor.cpp b/src/midifunctor.cpp index acd99aac00..e3c0332e54 100644 --- a/src/midifunctor.cpp +++ b/src/midifunctor.cpp @@ -16,6 +16,7 @@ #include "staff.h" #include "tabgrp.h" #include "tempo.h" +#include "tie.h" //---------------------------------------------------------------------------- @@ -249,4 +250,33 @@ FunctorCode InitMaxMeasureDurationFunctor::VisitTempo(Tempo *tempo) return FUNCTOR_CONTINUE; } +//---------------------------------------------------------------------------- +// InitTimemapTiesFunctor +//---------------------------------------------------------------------------- + +InitTimemapTiesFunctor::InitTimemapTiesFunctor() {} + +FunctorCode InitTimemapTiesFunctor::VisitTie(Tie *tie) +{ + Note *note1 = dynamic_cast(tie->GetStart()); + Note *note2 = dynamic_cast(tie->GetEnd()); + + if (!note1 || !note2) { + return FUNCTOR_CONTINUE; + } + + double sttd2 = note2->GetScoreTimeTiedDuration(); + double std2 = note2->GetScoreTimeDuration(); + + if (sttd2 > 0.0) { + note1->SetScoreTimeTiedDuration(sttd2 + std2); + } + else { + note1->SetScoreTimeTiedDuration(std2); + } + note2->SetScoreTimeTiedDuration(-1.0); + + return FUNCTOR_SIBLINGS; +} + } // namespace vrv From 94a279e9c78932aaf2ed68b304cd88f0da81cc98 Mon Sep 17 00:00:00 2001 From: David Bauer Date: Tue, 25 Apr 2023 09:09:19 +0200 Subject: [PATCH 025/151] Apply InitTimemapTies and cleanup --- include/vrv/layerelement.h | 7 ------- include/vrv/object.h | 5 ----- include/vrv/tie.h | 7 ------- src/doc.cpp | 5 +++-- src/layerelement.cpp | 5 ----- src/tie.cpp | 23 ----------------------- 6 files changed, 3 insertions(+), 49 deletions(-) diff --git a/include/vrv/layerelement.h b/include/vrv/layerelement.h index 52b19eaf5d..a9673185b5 100644 --- a/include/vrv/layerelement.h +++ b/include/vrv/layerelement.h @@ -338,13 +338,6 @@ class LayerElement : public Object, FunctorCode AcceptEnd(ConstFunctor &functor) const override; ///@} - /** - * See Object::InitTimemapTies - */ - ///@{ - int InitTimemapTies(FunctorParams *functorParams) override; - ///@} - /** * @name See Object::GenerateMIDI */ diff --git a/include/vrv/object.h b/include/vrv/object.h index ceb33c606f..c6cc620d37 100644 --- a/include/vrv/object.h +++ b/include/vrv/object.h @@ -692,11 +692,6 @@ class Object : public BoundingBox { */ ///@{ - /** - * Adjust note timings based on ties - */ - virtual int InitTimemapTies(FunctorParams *) { return FUNCTOR_CONTINUE; } - /** * Initialize the MIDI export * Captures information (i.e. from control elements) for MIDI interpretation diff --git a/include/vrv/tie.h b/include/vrv/tie.h index 17f8d86712..162383455b 100644 --- a/include/vrv/tie.h +++ b/include/vrv/tie.h @@ -83,13 +83,6 @@ class Tie : public ControlElement, FunctorCode AcceptEnd(ConstFunctor &functor) const override; ///@} - /** - * see Object::InitTimemapTies - */ - ///@{ - int InitTimemapTies(FunctorParams *functorParams) override; - ///@} - private: // Update tie positioning based overlaps with accidentals in cases with enharmonic ties bool AdjustEnharmonicTies(const Doc *doc, const FloatingCurvePositioner *curve, Point bezier[4], diff --git a/src/doc.cpp b/src/doc.cpp index ba1f743647..9baf4c3558 100644 --- a/src/doc.cpp +++ b/src/doc.cpp @@ -361,8 +361,9 @@ void Doc::CalculateTimemap() this->Process(initOnsetOffset); // Adjust the duration of tied notes - Functor initTimemapTies(&Object::InitTimemapTies); - this->Process(&initTimemapTies, NULL, NULL, NULL, UNLIMITED_DEPTH, BACKWARD); + InitTimemapTiesFunctor initTimemapTies; + initTimemapTies.SetDirection(BACKWARD); + this->Process(initTimemapTies); m_timemapTempo = m_options->m_midiTempoAdjustment.GetValue(); } diff --git a/src/layerelement.cpp b/src/layerelement.cpp index bc9defb5ba..f101bf9d3d 100644 --- a/src/layerelement.cpp +++ b/src/layerelement.cpp @@ -1315,11 +1315,6 @@ std::pair LayerElement::CalcElementHorizontalOverlap(const Doc *doc, return { shift, isInUnison }; } -int LayerElement::InitTimemapTies(FunctorParams *) -{ - return FUNCTOR_CONTINUE; -} - int LayerElement::GenerateMIDI(FunctorParams *functorParams) { GenerateMIDIParams *params = vrv_params_cast(functorParams); diff --git a/src/tie.cpp b/src/tie.cpp index 404e90abc3..4c263973fa 100644 --- a/src/tie.cpp +++ b/src/tie.cpp @@ -614,27 +614,4 @@ FunctorCode Tie::AcceptEnd(ConstFunctor &functor) const return functor.VisitTieEnd(this); } -int Tie::InitTimemapTies(FunctorParams *) -{ - Note *note1 = dynamic_cast(this->GetStart()); - Note *note2 = dynamic_cast(this->GetEnd()); - - if (!note1 || !note2) { - return FUNCTOR_CONTINUE; - } - - double sttd2 = note2->GetScoreTimeTiedDuration(); - double std2 = note2->GetScoreTimeDuration(); - - if (sttd2 > 0.0) { - note1->SetScoreTimeTiedDuration(sttd2 + std2); - } - else { - note1->SetScoreTimeTiedDuration(std2); - } - note2->SetScoreTimeTiedDuration(-1.0); - - return FUNCTOR_SIBLINGS; -} - } // namespace vrv From d58cc7c092d4fc84afbe984a39d0a824ac14102b Mon Sep 17 00:00:00 2001 From: David Bauer Date: Thu, 27 Apr 2023 12:44:17 +0200 Subject: [PATCH 026/151] Add InitMIDI --- include/vrv/midifunctor.h | 45 +++++++++++++++++++++++++++++++++++++++ src/midifunctor.cpp | 41 +++++++++++++++++++++++++++++++++++ 2 files changed, 86 insertions(+) diff --git a/include/vrv/midifunctor.h b/include/vrv/midifunctor.h index 90a8803e45..6278dd392f 100644 --- a/include/vrv/midifunctor.h +++ b/include/vrv/midifunctor.h @@ -166,6 +166,51 @@ class InitTimemapTiesFunctor : public MutableFunctor { // }; +//---------------------------------------------------------------------------- +// InitMIDIFunctor +//---------------------------------------------------------------------------- + +/** + * This class initializes the MIDI export. + * Captures information (i.e. from control elements) for MIDI interpretation + * which is required beforehand in GenerateMIDI. + */ +class InitMIDIFunctor : public ConstFunctor { +public: + /** + * @name Constructors, destructors + */ + ///@{ + InitMIDIFunctor(); + virtual ~InitMIDIFunctor() = default; + ///@} + + /* + * Abstract base implementation + */ + bool ImplementsEndInterface() const override { return false; } + + /* + * Functor interface + */ + ///@{ + FunctorCode VisitArpeg(const Arpeg *arpeg) override; + FunctorCode VisitMeasure(const Measure *measure) override; + ///@} + +protected: + // +private: + // +public: + // +private: + // The current tempo + double m_currentTempo; + // Deferred notes which start slightly later + std::map m_deferredNotes; +}; + } // namespace vrv #endif // __VRV_MIDIFUNCTOR_H__ diff --git a/src/midifunctor.cpp b/src/midifunctor.cpp index e3c0332e54..748df9250f 100644 --- a/src/midifunctor.cpp +++ b/src/midifunctor.cpp @@ -9,6 +9,7 @@ //---------------------------------------------------------------------------- +#include "arpeg.h" #include "beatrpt.h" #include "layer.h" #include "multirest.h" @@ -279,4 +280,44 @@ FunctorCode InitTimemapTiesFunctor::VisitTie(Tie *tie) return FUNCTOR_SIBLINGS; } +//---------------------------------------------------------------------------- +// InitMidiFunctor +//---------------------------------------------------------------------------- + +InitMIDIFunctor::InitMIDIFunctor() +{ + m_currentTempo = MIDI_TEMPO; +} + +FunctorCode InitMIDIFunctor::VisitArpeg(const Arpeg *arpeg) +{ + // Sort the involved notes by playing order + const bool playTopDown = (arpeg->GetOrder() == arpegLog_ORDER_down); + std::set notes = arpeg->GetNotes(); + std::vector sortedNotes; + std::copy(notes.begin(), notes.end(), std::back_inserter(sortedNotes)); + std::sort(sortedNotes.begin(), sortedNotes.end(), [playTopDown](const Note *note1, const Note *note2) { + const int pitch1 = note1->GetMIDIPitch(); + const int pitch2 = note2->GetMIDIPitch(); + return playTopDown ? (pitch1 > pitch2) : (pitch1 < pitch2); + }); + + // Defer the notes in playing order + double shift = 0.0; + const double increment = UNACC_GRACENOTE_DUR * m_currentTempo / 60000.0; + for (const Note *note : sortedNotes) { + if (shift > 0.0) m_deferredNotes[note] = shift; + shift += increment; + } + + return FUNCTOR_CONTINUE; +} + +FunctorCode InitMIDIFunctor::VisitMeasure(const Measure *measure) +{ + m_currentTempo = measure->GetCurrentTempo(); + + return FUNCTOR_CONTINUE; +} + } // namespace vrv From 931fb16489cf8cb3892456020586aca362b38234 Mon Sep 17 00:00:00 2001 From: David Bauer Date: Thu, 27 Apr 2023 16:46:13 +0200 Subject: [PATCH 027/151] Apply InitMIDI and cleanup --- include/vrv/arpeg.h | 5 ----- include/vrv/functorparams.h | 18 +----------------- include/vrv/measure.h | 5 ----- include/vrv/midifunctor.h | 8 ++++++++ include/vrv/object.h | 7 ------- src/arpeg.cpp | 27 --------------------------- src/doc.cpp | 9 ++++----- src/measure.cpp | 10 ---------- 8 files changed, 13 insertions(+), 76 deletions(-) diff --git a/include/vrv/arpeg.h b/include/vrv/arpeg.h index 343a2c4490..35bbdbddfa 100644 --- a/include/vrv/arpeg.h +++ b/include/vrv/arpeg.h @@ -113,11 +113,6 @@ class Arpeg : public ControlElement, FunctorCode AcceptEnd(ConstFunctor &functor) const override; ///@} - /** - * See Object::InitMIDI - */ - int InitMIDI(FunctorParams *functorParams) override; - protected: // private: diff --git a/include/vrv/functorparams.h b/include/vrv/functorparams.h index fd33682b76..eed374705d 100644 --- a/include/vrv/functorparams.h +++ b/include/vrv/functorparams.h @@ -213,7 +213,7 @@ class GenerateMIDIParams : public FunctorParams { double m_currentTempo; Note *m_lastNote; std::map m_expandedNotes; - std::map m_deferredNotes; + std::map m_deferredNotes; MIDIChordSequence m_graceNotes; bool m_accentedGraceNote; bool m_cueExclusion; @@ -253,22 +253,6 @@ class GenerateTimemapParams : public FunctorParams { Functor *m_functor; }; -//---------------------------------------------------------------------------- -// InitMIDIParams -//---------------------------------------------------------------------------- - -/** - * member 0: the current tempo - * member 1: deferred notes which start slightly later - **/ - -class InitMIDIParams : public FunctorParams { -public: - InitMIDIParams() { m_currentTempo = MIDI_TEMPO; } - double m_currentTempo; - std::map m_deferredNotes; -}; - //---------------------------------------------------------------------------- // TransposeParams //---------------------------------------------------------------------------- diff --git a/include/vrv/measure.h b/include/vrv/measure.h index 7473c8aa19..0e1aad46e1 100644 --- a/include/vrv/measure.h +++ b/include/vrv/measure.h @@ -342,11 +342,6 @@ class Measure : public Object, FunctorCode AcceptEnd(ConstFunctor &functor) const override; ///@} - /** - * See Object::InitMIDI - */ - int InitMIDI(FunctorParams *functorParams) override; - /** * See Object::GenerateMIDI */ diff --git a/include/vrv/midifunctor.h b/include/vrv/midifunctor.h index 6278dd392f..46ee99df74 100644 --- a/include/vrv/midifunctor.h +++ b/include/vrv/midifunctor.h @@ -190,6 +190,14 @@ class InitMIDIFunctor : public ConstFunctor { */ bool ImplementsEndInterface() const override { return false; } + /* + * Setter and getter for properties + */ + ///@{ + void SetCurrentTempo(double tempo) { m_currentTempo = tempo; } + const std::map &GetDeferredNotes() const { return m_deferredNotes; } + ///@} + /* * Functor interface */ diff --git a/include/vrv/object.h b/include/vrv/object.h index c6cc620d37..974fc70f72 100644 --- a/include/vrv/object.h +++ b/include/vrv/object.h @@ -692,13 +692,6 @@ class Object : public BoundingBox { */ ///@{ - /** - * Initialize the MIDI export - * Captures information (i.e. from control elements) for MIDI interpretation - * This information is usually required beforehand in GenerateMIDI - */ - virtual int InitMIDI(FunctorParams *) { return FUNCTOR_CONTINUE; } - /** * Export the object to a MidiFile */ diff --git a/src/arpeg.cpp b/src/arpeg.cpp index dd217e22c4..883885a43e 100644 --- a/src/arpeg.cpp +++ b/src/arpeg.cpp @@ -214,31 +214,4 @@ FunctorCode Arpeg::AcceptEnd(ConstFunctor &functor) const return functor.VisitArpegEnd(this); } -int Arpeg::InitMIDI(FunctorParams *functorParams) -{ - InitMIDIParams *params = vrv_params_cast(functorParams); - assert(params); - - // Sort the involved notes by playing order - const bool playTopDown = (this->GetOrder() == arpegLog_ORDER_down); - std::set notes = this->GetNotes(); - std::vector sortedNotes; - std::copy(notes.begin(), notes.end(), std::back_inserter(sortedNotes)); - std::sort(sortedNotes.begin(), sortedNotes.end(), [playTopDown](Note *note1, Note *note2) { - const int pitch1 = note1->GetMIDIPitch(); - const int pitch2 = note2->GetMIDIPitch(); - return playTopDown ? (pitch1 > pitch2) : (pitch1 < pitch2); - }); - - // Defer the notes in playing order - double shift = 0.0; - const double increment = UNACC_GRACENOTE_DUR * params->m_currentTempo / 60000.0; - for (Note *note : sortedNotes) { - if (shift > 0.0) params->m_deferredNotes[note] = shift; - shift += increment; - } - - return FUNCTOR_CONTINUE; -} - } // namespace vrv diff --git a/src/doc.cpp b/src/doc.cpp index 9baf4c3558..55336b0779 100644 --- a/src/doc.cpp +++ b/src/doc.cpp @@ -391,10 +391,9 @@ void Doc::ExportMIDI(smf::MidiFile *midiFile) midiFile->addTempo(0, 0, tempo); // Capture information for MIDI generation, i.e. from control elements - Functor initMIDI(&Object::InitMIDI); - InitMIDIParams initMIDIParams; - initMIDIParams.m_currentTempo = tempo; - this->Process(&initMIDI, &initMIDIParams); + InitMIDIFunctor initMIDI; + initMIDI.SetCurrentTempo(tempo); + this->Process(initMIDI); // We need to populate processing lists for processing the document by Layer (by Verse will not be used) InitProcessingListsFunctor initProcessingLists; @@ -501,7 +500,7 @@ void Doc::ExportMIDI(smf::MidiFile *midiFile) generateMIDIParams.m_staffN = staves->first; generateMIDIParams.m_transSemi = transSemi; generateMIDIParams.m_currentTempo = tempo; - generateMIDIParams.m_deferredNotes = initMIDIParams.m_deferredNotes; + generateMIDIParams.m_deferredNotes = initMIDI.GetDeferredNotes(); generateMIDIParams.m_cueExclusion = this->GetOptions()->m_midiNoCue.GetValue(); // LogDebug("Exporting track %d ----------------", midiTrack); diff --git a/src/measure.cpp b/src/measure.cpp index 33beb57776..22f2d416ce 100644 --- a/src/measure.cpp +++ b/src/measure.cpp @@ -728,16 +728,6 @@ FunctorCode Measure::AcceptEnd(ConstFunctor &functor) const return functor.VisitMeasureEnd(this); } -int Measure::InitMIDI(FunctorParams *functorParams) -{ - InitMIDIParams *params = vrv_params_cast(functorParams); - assert(params); - - params->m_currentTempo = m_currentTempo; - - return FUNCTOR_CONTINUE; -} - int Measure::GenerateMIDI(FunctorParams *functorParams) { GenerateMIDIParams *params = vrv_params_cast(functorParams); From b27ef52e5fe46290cd4c4ff3f38f233d401dcccd Mon Sep 17 00:00:00 2001 From: David Bauer Date: Fri, 28 Apr 2023 08:47:47 +0200 Subject: [PATCH 028/151] Add GenerateMIDI skeleton --- include/vrv/midifunctor.h | 88 +++++++++++++++++++++++++++++++ src/midifunctor.cpp | 108 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 196 insertions(+) diff --git a/include/vrv/midifunctor.h b/include/vrv/midifunctor.h index 46ee99df74..472d3d887f 100644 --- a/include/vrv/midifunctor.h +++ b/include/vrv/midifunctor.h @@ -9,6 +9,11 @@ #define __VRV_MIDIFUNCTOR_H__ #include "functor.h" +#include "functorparams.h" + +namespace smf { +class MidiFile; +} namespace vrv { @@ -219,6 +224,89 @@ class InitMIDIFunctor : public ConstFunctor { std::map m_deferredNotes; }; +//---------------------------------------------------------------------------- +// GenerateMIDIFunctor +//---------------------------------------------------------------------------- + +/** + * This class performs the export to a MidiFile. + */ +class GenerateMIDIFunctor : public ConstFunctor { +public: + /** + * @name Constructors, destructors + */ + ///@{ + GenerateMIDIFunctor(smf::MidiFile *midiFile); + virtual ~GenerateMIDIFunctor() = default; + ///@} + + /* + * Abstract base implementation + */ + bool ImplementsEndInterface() const override { return true; } + + /* + * Functor interface + */ + ///@{ + FunctorCode VisitBeatRpt(const BeatRpt *beatRpt) override; + FunctorCode VisitBTrem(const BTrem *bTrem) override; + FunctorCode VisitChord(const Chord *chord) override; + FunctorCode VisitFTrem(const FTrem *fTrem) override; + FunctorCode VisitGraceGrpEnd(const GraceGrp *graceGrp) override; + FunctorCode VisitHalfmRpt(const HalfmRpt *halfmRpt) override; + FunctorCode VisitLayer(const Layer *layer) override; + FunctorCode VisitLayerEnd(const Layer *layer) override; + FunctorCode VisitLayerElement(const LayerElement *layerElement) override; + FunctorCode VisitMeasure(const Measure *measure) override; + FunctorCode VisitMRpt(const MRpt *mRpt) override; + FunctorCode VisitNote(const Note *note) override; + FunctorCode VisitPedal(const Pedal *pedal) override; + FunctorCode VisitScoreDef(const ScoreDef *scoreDef) override; + FunctorCode VisitStaff(const Staff *staff) override; + FunctorCode VisitStaffDef(const StaffDef *staffDef) override; + FunctorCode VisitSyl(const Syl *syl) override; + FunctorCode VisitVerse(const Verse *verse) override; + ///@} + +protected: + // +private: + // +public: + // +private: + // The MidiFile we are writing to + smf::MidiFile *m_midiFile; + // The midi track number + int m_midiTrack; + // The midi channel number + int m_midiChannel; + // The score time from the start of the music to the start of the current measure + double m_totalTime; + // The current staff number + int m_staffN; + // The semi tone transposition for the current track + int m_transSemi; + // The current tempo + double m_currentTempo; + // The last (non grace) note that was performed + const Note *m_lastNote; + // Expanded notes due to ornaments and tremolandi + std::map m_expandedNotes; + // Deferred notes which start slightly later + std::map m_deferredNotes; + // Grace note sequence + MIDIChordSequence m_graceNotes; + // Indicates whether the last grace note/chord was accented + bool m_accentedGraceNote; + // Indicates whether cue notes should be included + bool m_cueExclusion; + // Tablature held notes indexed by (course - 1) + std::vector m_heldNotes; +}; + } // namespace vrv #endif // __VRV_MIDIFUNCTOR_H__ diff --git a/src/midifunctor.cpp b/src/midifunctor.cpp index 748df9250f..f2cb408f65 100644 --- a/src/midifunctor.cpp +++ b/src/midifunctor.cpp @@ -320,4 +320,112 @@ FunctorCode InitMIDIFunctor::VisitMeasure(const Measure *measure) return FUNCTOR_CONTINUE; } +//---------------------------------------------------------------------------- +// GenerateMIDIFunctor +//---------------------------------------------------------------------------- + +GenerateMIDIFunctor::GenerateMIDIFunctor(smf::MidiFile *midiFile) +{ + m_midiFile = midiFile; + m_midiTrack = 1; + m_midiChannel = 0; + m_totalTime = 0.0; + m_staffN = 0; + m_transSemi = 0; + m_currentTempo = MIDI_TEMPO; + m_lastNote = NULL; + m_accentedGraceNote = false; + m_cueExclusion = false; +} + +FunctorCode GenerateMIDIFunctor::VisitBeatRpt(const BeatRpt *beatRpt) +{ + return FUNCTOR_CONTINUE; +} + +FunctorCode GenerateMIDIFunctor::VisitBTrem(const BTrem *bTrem) +{ + return FUNCTOR_CONTINUE; +} + +FunctorCode GenerateMIDIFunctor::VisitChord(const Chord *chord) +{ + return FUNCTOR_CONTINUE; +} + +FunctorCode GenerateMIDIFunctor::VisitFTrem(const FTrem *fTrem) +{ + return FUNCTOR_CONTINUE; +} + +FunctorCode GenerateMIDIFunctor::VisitGraceGrpEnd(const GraceGrp *graceGrp) +{ + return FUNCTOR_CONTINUE; +} + +FunctorCode GenerateMIDIFunctor::VisitHalfmRpt(const HalfmRpt *halfmRpt) +{ + return FUNCTOR_CONTINUE; +} + +FunctorCode GenerateMIDIFunctor::VisitLayer(const Layer *layer) +{ + return FUNCTOR_CONTINUE; +} + +FunctorCode GenerateMIDIFunctor::VisitLayerEnd(const Layer *layer) +{ + return FUNCTOR_CONTINUE; +} + +FunctorCode GenerateMIDIFunctor::VisitLayerElement(const LayerElement *layerElement) +{ + return FUNCTOR_CONTINUE; +} + +FunctorCode GenerateMIDIFunctor::VisitMeasure(const Measure *measure) +{ + return FUNCTOR_CONTINUE; +} + +FunctorCode GenerateMIDIFunctor::VisitMRpt(const MRpt *mRpt) +{ + return FUNCTOR_CONTINUE; +} + +FunctorCode GenerateMIDIFunctor::VisitNote(const Note *note) +{ + return FUNCTOR_CONTINUE; +} + +FunctorCode GenerateMIDIFunctor::VisitPedal(const Pedal *pedal) +{ + return FUNCTOR_CONTINUE; +} + +FunctorCode GenerateMIDIFunctor::VisitScoreDef(const ScoreDef *scoreDef) +{ + return FUNCTOR_CONTINUE; +} + +FunctorCode GenerateMIDIFunctor::VisitStaff(const Staff *staff) +{ + return FUNCTOR_CONTINUE; +} + +FunctorCode GenerateMIDIFunctor::VisitStaffDef(const StaffDef *staffDef) +{ + return FUNCTOR_CONTINUE; +} + +FunctorCode GenerateMIDIFunctor::VisitSyl(const Syl *syl) +{ + return FUNCTOR_CONTINUE; +} + +FunctorCode GenerateMIDIFunctor::VisitVerse(const Verse *verse) +{ + return FUNCTOR_CONTINUE; +} + } // namespace vrv From ed53eb0a54faf757250810c5dc506d08d6a569ed Mon Sep 17 00:00:00 2001 From: David Bauer Date: Wed, 3 May 2023 08:40:19 +0200 Subject: [PATCH 029/151] Add GenerateMIDI implementation --- include/vrv/btrem.h | 12 +- include/vrv/midifunctor.h | 11 +- src/midifunctor.cpp | 434 +++++++++++++++++++++++++++++++++++++- 3 files changed, 450 insertions(+), 7 deletions(-) diff --git a/include/vrv/btrem.h b/include/vrv/btrem.h index 03fdde6a90..67a4033425 100644 --- a/include/vrv/btrem.h +++ b/include/vrv/btrem.h @@ -49,6 +49,11 @@ class BTrem : public LayerElement, */ data_STEMMODIFIER GetDrawingStemMod() const override; + /** + * Calculate the duration of an individual note in a measured tremolo + */ + data_DURATION CalcIndividualNoteDuration() const; + //----------// // Functors // //----------// @@ -69,14 +74,11 @@ class BTrem : public LayerElement, int GenerateMIDI(FunctorParams *functorParams) override; private: - /** - * Calculate the duration of an individual note in a measured tremolo - */ - data_DURATION CalcIndividualNoteDuration() const; - + // public: // private: + // }; } // namespace vrv diff --git a/include/vrv/midifunctor.h b/include/vrv/midifunctor.h index 472d3d887f..9c63fb8bb2 100644 --- a/include/vrv/midifunctor.h +++ b/include/vrv/midifunctor.h @@ -273,7 +273,16 @@ class GenerateMIDIFunctor : public ConstFunctor { protected: // private: - // + /** + * Register deferred notes for MIDI + */ + void DeferMIDINote(const Note *refNote, double shift, bool includeChordSiblings); + + /** + * Creates the MIDI output of the grace note sequence + */ + void GenerateGraceNoteMIDI(const Note *refNote, double startTime, int tpq, int channel, int velocity); + public: // private: diff --git a/src/midifunctor.cpp b/src/midifunctor.cpp index f2cb408f65..91baee574b 100644 --- a/src/midifunctor.cpp +++ b/src/midifunctor.cpp @@ -11,16 +11,27 @@ #include "arpeg.h" #include "beatrpt.h" +#include "btrem.h" +#include "ftrem.h" +#include "gracegrp.h" #include "layer.h" #include "multirest.h" +#include "pedal.h" #include "rest.h" #include "staff.h" +#include "syl.h" #include "tabgrp.h" #include "tempo.h" +#include "text.h" #include "tie.h" +#include "tuplet.h" +#include "verse.h" +#include "vrv.h" //---------------------------------------------------------------------------- +#include "MidiFile.h" + namespace vrv { //---------------------------------------------------------------------------- @@ -340,92 +351,513 @@ GenerateMIDIFunctor::GenerateMIDIFunctor(smf::MidiFile *midiFile) FunctorCode GenerateMIDIFunctor::VisitBeatRpt(const BeatRpt *beatRpt) { + // Sameas not taken into account for now + double beatLength = beatRpt->GetAlignmentDuration() / (DUR_MAX / DURATION_4); + double startTime = m_totalTime + beatRpt->GetScoreTimeOnset(); + int tpq = m_midiFile->getTPQ(); + + // filter last beat and copy all notes + smf::MidiEvent event; + int eventCount = m_midiFile->getEventCount(m_midiTrack); + for (int i = 0; i < eventCount; ++i) { + event = m_midiFile->getEvent(m_midiTrack, i); + if (event.tick > startTime * tpq) + break; + else if (event.tick >= (startTime - beatLength) * tpq) { + if (((event[0] & 0xf0) == 0x80) || ((event[0] & 0xf0) == 0x90)) { + m_midiFile->addEvent(m_midiTrack, event.tick + beatLength * tpq, event); + } + } + } + + for (int i = 0; i < beatLength * tpq; ++i) { + // LogWarning("%i", i); + // smf::MidiEvent event = m_midiFile->getEvent(m_midiTrack, startTime * tpq); + // event.clearVariables(); + } + return FUNCTOR_CONTINUE; } FunctorCode GenerateMIDIFunctor::VisitBTrem(const BTrem *bTrem) { + // Do nothing if the tremolo is unmeasured + if (bTrem->GetForm() == bTremLog_FORM_unmeas) { + return FUNCTOR_CONTINUE; + } + + // Adjust duration of the bTrem if it's nested within tuplet + int num = 0; + const Tuplet *tuplet = vrv_cast(bTrem->GetFirstAncestor(TUPLET, MAX_TUPLET_DEPTH)); + if (tuplet) { + num = (tuplet->GetNum() > 0) ? tuplet->GetNum() : 0; + } + // Get num value if it's set + if (bTrem->HasNum()) { + num = bTrem->GetNum(); + } + + // Calculate duration of individual note in tremolo + const data_DURATION individualNoteDur = bTrem->CalcIndividualNoteDuration(); + if (individualNoteDur == DURATION_NONE) return FUNCTOR_CONTINUE; + const double noteInQuarterDur = pow(2.0, (DURATION_4 - individualNoteDur)); + + // Define lambda which expands one note into multiple individual notes of the same pitch + auto expandNote = [this, noteInQuarterDur, num](const Object *obj) { + const Note *note = vrv_cast(obj); + assert(note); + const int pitch = note->GetMIDIPitch(m_transSemi); + const double totalInQuarterDur = note->GetScoreTimeDuration() + note->GetScoreTimeTiedDuration(); + int multiplicity = totalInQuarterDur / noteInQuarterDur; + double noteDuration = noteInQuarterDur; + // if NUM has been set for the bTrem, override calculated values + if (num) { + multiplicity = num; + noteDuration = totalInQuarterDur / double(num); + } + m_expandedNotes[note] = MIDINoteSequence(multiplicity, { pitch, noteDuration }); + }; + + // Apply expansion either to all notes in chord or to first note + const Chord *chord = vrv_cast(bTrem->FindDescendantByType(CHORD)); + if (chord) { + ListOfConstObjects notes = chord->FindAllDescendantsByType(NOTE, false); + std::for_each(notes.begin(), notes.end(), expandNote); + } + else { + const Object *note = bTrem->FindDescendantByType(NOTE); + if (note) { + expandNote(note); + } + } + return FUNCTOR_CONTINUE; } FunctorCode GenerateMIDIFunctor::VisitChord(const Chord *chord) { + // Handle grace chords + if (chord->IsGraceNote()) { + std::set pitches; + const ListOfConstObjects ¬es = chord->GetList(chord); + for (const Object *obj : notes) { + const Note *note = vrv_cast(obj); + assert(note); + pitches.insert(note->GetMIDIPitch(m_transSemi)); + } + + double quarterDuration = 0.0; + const data_DURATION dur = chord->GetDur(); + if ((dur >= DURATION_long) && (dur <= DURATION_1024)) { + quarterDuration = pow(2.0, (DURATION_4 - dur)); + } + + m_graceNotes.push_back({ pitches, quarterDuration }); + + bool accented = (chord->GetGrace() == GRACE_acc); + const GraceGrp *graceGrp = vrv_cast(chord->GetFirstAncestor(GRACEGRP)); + if (graceGrp && (graceGrp->GetGrace() == GRACE_acc)) accented = true; + m_accentedGraceNote = accented; + + return FUNCTOR_SIBLINGS; + } + return FUNCTOR_CONTINUE; } FunctorCode GenerateMIDIFunctor::VisitFTrem(const FTrem *fTrem) { + if (fTrem->HasUnitdur()) { + LogWarning("FTrem produces incorrect MIDI output"); + } + return FUNCTOR_CONTINUE; } FunctorCode GenerateMIDIFunctor::VisitGraceGrpEnd(const GraceGrp *graceGrp) { + // Handling of Nachschlag + if (!m_graceNotes.empty() && (graceGrp->GetAttach() == graceGrpLog_ATTACH_pre) && !m_accentedGraceNote + && m_lastNote) { + double startTime = m_totalTime + m_lastNote->GetScoreTimeOffset(); + const double graceNoteDur = UNACC_GRACENOTE_DUR * m_currentTempo / 60000.0; + const double totalDur = graceNoteDur * m_graceNotes.size(); + startTime -= totalDur; + startTime = std::max(startTime, 0.0); + + int velocity = MIDI_VELOCITY; + if (m_lastNote->HasVel()) velocity = m_lastNote->GetVel(); + const int tpq = m_midiFile->getTPQ(); + + for (const MIDIChord &chord : m_graceNotes) { + const double stopTime = startTime + graceNoteDur; + for (int pitch : chord.pitches) { + m_midiFile->addNoteOn(m_midiTrack, startTime * tpq, m_midiChannel, pitch, velocity); + m_midiFile->addNoteOff(m_midiTrack, stopTime * tpq, m_midiChannel, pitch); + } + startTime = stopTime; + } + + m_graceNotes.clear(); + } + return FUNCTOR_CONTINUE; } FunctorCode GenerateMIDIFunctor::VisitHalfmRpt(const HalfmRpt *halfmRpt) { + LogWarning("HalfmRpt produces empty MIDI output"); + return FUNCTOR_CONTINUE; } FunctorCode GenerateMIDIFunctor::VisitLayer(const Layer *layer) { + if ((layer->GetCue() == BOOLEAN_true) && m_cueExclusion) return FUNCTOR_SIBLINGS; + return FUNCTOR_CONTINUE; } FunctorCode GenerateMIDIFunctor::VisitLayerEnd(const Layer *layer) { + // stop all previously held notes + for (auto &held : m_heldNotes) { + if (held.m_pitch > 0) { + m_midiFile->addNoteOff(m_midiTrack, held.m_stopTime * m_midiFile->getTPQ(), m_midiChannel, held.m_pitch); + } + } + + m_heldNotes.clear(); + return FUNCTOR_CONTINUE; } FunctorCode GenerateMIDIFunctor::VisitLayerElement(const LayerElement *layerElement) { + if (layerElement->IsScoreDefElement()) return FUNCTOR_SIBLINGS; + + // Only resolve simple sameas links to avoid infinite recursion + const LayerElement *sameas = dynamic_cast(layerElement->GetSameasLink()); + if (sameas && !sameas->HasSameasLink()) { + sameas->Process(*this); + } + return FUNCTOR_CONTINUE; } FunctorCode GenerateMIDIFunctor::VisitMeasure(const Measure *measure) { + // Here we need to update the m_totalTime from the starting time of the measure. + m_totalTime = measure->GetLastTimeOffset(); + + if (measure->GetCurrentTempo() != m_currentTempo) { + m_currentTempo = measure->GetCurrentTempo(); + m_midiFile->addTempo(0, m_totalTime * m_midiFile->getTPQ(), m_currentTempo); + } + return FUNCTOR_CONTINUE; } FunctorCode GenerateMIDIFunctor::VisitMRpt(const MRpt *mRpt) { + LogWarning("MRpt produces empty MIDI output"); + return FUNCTOR_CONTINUE; } FunctorCode GenerateMIDIFunctor::VisitNote(const Note *note) { + // Skip linked notes + if (note->HasSameasLink()) { + return FUNCTOR_SIBLINGS; + } + + // Skip cue notes when midiNoCue is activated + if ((note->GetCue() == BOOLEAN_true) && m_cueExclusion) { + return FUNCTOR_SIBLINGS; + } + + // If the note is a secondary tied note, then ignore it + if (note->GetScoreTimeTiedDuration() < 0.0) { + return FUNCTOR_SIBLINGS; + } + + // Handle grace notes + if (note->IsGraceNote()) { + const int pitch = note->GetMIDIPitch(m_transSemi); + + double quarterDuration = 0.0; + const data_DURATION dur = note->GetDur(); + if ((dur >= DURATION_long) && (dur <= DURATION_1024)) { + quarterDuration = pow(2.0, (DURATION_4 - dur)); + } + + m_graceNotes.push_back({ { pitch }, quarterDuration }); + + bool accented = (note->GetGrace() == GRACE_acc); + const GraceGrp *graceGrp = vrv_cast(note->GetFirstAncestor(GRACEGRP)); + if (graceGrp && (graceGrp->GetGrace() == GRACE_acc)) accented = true; + m_accentedGraceNote = accented; + + return FUNCTOR_SIBLINGS; + } + + const int channel = m_midiChannel; + int velocity = MIDI_VELOCITY; + if (note->HasVel()) velocity = note->GetVel(); + + double startTime = m_totalTime + note->GetScoreTimeOnset(); + const int tpq = m_midiFile->getTPQ(); + + // Check if some grace notes must be performed + if (!m_graceNotes.empty()) { + this->GenerateGraceNoteMIDI(note, startTime, tpq, channel, velocity); + m_graceNotes.clear(); + } + + // Check if note is deferred + if (m_deferredNotes.find(note) != m_deferredNotes.end()) { + startTime += m_deferredNotes.at(note); + m_deferredNotes.erase(note); + } + + // Check if note was expanded into sequence of short notes due to trills/tremolandi + // Play either the expanded note sequence or a single note + if (m_expandedNotes.find(note) != m_expandedNotes.end()) { + for (const auto &midiNote : m_expandedNotes.at(note)) { + const double stopTime = startTime + midiNote.duration; + + m_midiFile->addNoteOn(m_midiTrack, startTime * tpq, channel, midiNote.pitch, velocity); + m_midiFile->addNoteOff(m_midiTrack, stopTime * tpq, channel, midiNote.pitch); + + startTime = stopTime; + } + } + else { + const int pitch = note->GetMIDIPitch(m_transSemi); + + if (note->HasTabCourse() && (note->GetTabCourse() >= 1)) { + // Tablature 'rule of holds'. A note on a course is held until the next note + // on that course is required, or until a default hold duration is reached. + + const int course = note->GetTabCourse(); + if (m_heldNotes.size() < static_cast(course)) { + m_heldNotes.resize(course); // make room + } + + // if a previously held note on this course is already sounding, end it now. + if (m_heldNotes[course - 1].m_pitch > 0) { + m_heldNotes[course - 1].m_stopTime = startTime; // stop now + } + + // end all previously held notes that have reached their stoptime + for (auto &held : m_heldNotes) { + if ((held.m_pitch > 0) && (held.m_stopTime <= startTime)) { + m_midiFile->addNoteOff(m_midiTrack, held.m_stopTime * tpq, channel, held.m_pitch); + held.m_pitch = 0; + held.m_stopTime = 0; + } + } + + // hold this note until the greater of its rhythm sign and the default duration. + // TODO optimize the default hold duration + const double defaultHoldTime = 4; // quarter notes + m_heldNotes[course - 1].m_pitch = pitch; + m_heldNotes[course - 1].m_stopTime = m_totalTime + + std::max(defaultHoldTime, note->GetScoreTimeOffset() + note->GetScoreTimeTiedDuration()); + + // start this note + m_midiFile->addNoteOn(m_midiTrack, startTime * tpq, channel, pitch, velocity); + } + else { + const double stopTime = m_totalTime + note->GetScoreTimeOffset() + note->GetScoreTimeTiedDuration(); + + m_midiFile->addNoteOn(m_midiTrack, startTime * tpq, channel, pitch, velocity); + m_midiFile->addNoteOff(m_midiTrack, stopTime * tpq, channel, pitch); + } + } + + // Store reference, i.e. for Nachschlag + m_lastNote = note; + return FUNCTOR_CONTINUE; } FunctorCode GenerateMIDIFunctor::VisitPedal(const Pedal *pedal) { + if (!pedal->HasDir()) return FUNCTOR_CONTINUE; + + double pedalTime = pedal->GetStart()->GetAlignment()->GetTime() * DURATION_4 / DUR_MAX; + double startTime = m_totalTime + pedalTime; + int tpq = m_midiFile->getTPQ(); + + // todo: check pedal @func to switch between sustain/soften/damper pedals? + switch (pedal->GetDir()) { + case pedalLog_DIR_down: m_midiFile->addSustainPedalOn(m_midiTrack, (startTime * tpq), m_midiChannel); break; + case pedalLog_DIR_up: m_midiFile->addSustainPedalOff(m_midiTrack, (startTime * tpq), m_midiChannel); break; + case pedalLog_DIR_bounce: + m_midiFile->addSustainPedalOff(m_midiTrack, (startTime * tpq), m_midiChannel); + m_midiFile->addSustainPedalOn(m_midiTrack, (startTime * tpq) + 0.1, m_midiChannel); + break; + default: return FUNCTOR_CONTINUE; + } + return FUNCTOR_CONTINUE; } FunctorCode GenerateMIDIFunctor::VisitScoreDef(const ScoreDef *scoreDef) { + double totalTime = m_totalTime; + // check next measure for the time offset + const Object *parent = scoreDef->GetParent(); + if (parent && (parent->GetLast() != scoreDef)) { + const Object *next = parent->GetNext(scoreDef); + if (next && next->Is(MEASURE)) { + const Measure *nextMeasure = vrv_cast(next); + totalTime = nextMeasure->GetLastTimeOffset(); + } + } + const double currentTick = totalTime * m_midiFile->getTPQ(); + + smf::MidiEvent midiEvent; + midiEvent.tick = currentTick; + // calculate reference pitch class based on @tune.pname + int referencePitchClass = 0; + if (scoreDef->HasTunePname()) { + referencePitchClass = Note::PnameToPclass(scoreDef->GetTunePname()); + } + // set temperament event if corresponding attribute present + if (scoreDef->HasTuneTemper()) { + switch (scoreDef->GetTuneTemper()) { + case TEMPERAMENT_equal: midiEvent.makeTemperamentEqual(referencePitchClass); break; + case TEMPERAMENT_just: midiEvent.makeTemperamentBad(100.0, referencePitchClass); break; + case TEMPERAMENT_mean: midiEvent.makeTemperamentMeantone(referencePitchClass); break; + case TEMPERAMENT_pythagorean: midiEvent.makeTemperamentPythagorean(referencePitchClass); break; + default: break; + } + m_midiFile->addEvent(m_midiTrack, midiEvent); + } + // set tuning + if (scoreDef->HasTuneHz()) { + const double tuneHz = scoreDef->GetTuneHz(); + // Add tuning for all keys from 0 to 127 + std::vector> tuneFrequencies; + for (int i = 0; i < 127; ++i) { + double freq = pow(2.0, (i - 69.0) / 12.0) * tuneHz; + tuneFrequencies.push_back(std::make_pair(i, freq)); + } + midiEvent.makeMts2_KeyTuningsByFrequency(tuneFrequencies); + m_midiFile->addEvent(m_midiTrack, midiEvent); + } + // set MIDI key signature + if (scoreDef->HasKeySigInfo()) { + const KeySig *keySig = vrv_cast(scoreDef->GetKeySig()); + if (keySig && keySig->HasSig()) { + m_midiFile->addKeySignature( + m_midiTrack, currentTick, keySig->GetFifthsInt(), (keySig->GetMode() == MODE_minor)); + } + } + // set MIDI time signature + if (scoreDef->HasMeterSigInfo()) { + const MeterSig *meterSig = vrv_cast(scoreDef->GetMeterSig()); + if (meterSig && meterSig->HasCount() && meterSig->HasUnit()) { + m_midiFile->addTimeSignature(m_midiTrack, currentTick, meterSig->GetTotalCount(), meterSig->GetUnit()); + } + } + return FUNCTOR_CONTINUE; } FunctorCode GenerateMIDIFunctor::VisitStaff(const Staff *staff) { + m_expandedNotes.clear(); + return FUNCTOR_CONTINUE; } FunctorCode GenerateMIDIFunctor::VisitStaffDef(const StaffDef *staffDef) { + if (staffDef->GetN() == m_staffN) { + // Update the semitone transposition + if (staffDef->HasTransSemi()) m_transSemi = staffDef->GetTransSemi(); + } + return FUNCTOR_CONTINUE; } FunctorCode GenerateMIDIFunctor::VisitSyl(const Syl *syl) { - return FUNCTOR_CONTINUE; + const int startTime = m_totalTime + m_lastNote->GetScoreTimeOnset(); + const Text *text = vrv_cast(syl->GetChild(0, TEXT)); + const std::string sylText = UTF32to8(text->GetText()); + + m_midiFile->addLyric(m_midiTrack, startTime * m_midiFile->getTPQ(), sylText); + + return FUNCTOR_SIBLINGS; } FunctorCode GenerateMIDIFunctor::VisitVerse(const Verse *verse) { + const LayerElement *parent = vrv_cast(verse->GetFirstAncestor(NOTE)); + if (!parent) parent = vrv_cast(verse->GetFirstAncestor(CHORD)); + assert(parent); + + const Verse *previousVerse = vrv_cast(parent->GetPrevious(verse, VERSE)); + + if (previousVerse) return FUNCTOR_SIBLINGS; + return FUNCTOR_CONTINUE; } +void GenerateMIDIFunctor::DeferMIDINote(const Note *refNote, double shift, bool includeChordSiblings) +{ + // Recursive call for chords + const Chord *chord = refNote->IsChordTone(); + if (chord && includeChordSiblings) { + const ListOfConstObjects ¬es = chord->GetList(chord); + + for (const Object *obj : notes) { + const Note *note = vrv_cast(obj); + assert(note); + this->DeferMIDINote(note, shift, false); + } + return; + } + + // Register the shift + if (shift < refNote->GetScoreTimeDuration() + refNote->GetScoreTimeTiedDuration()) { + m_deferredNotes[refNote] = shift; + } +} + +void GenerateMIDIFunctor::GenerateGraceNoteMIDI( + const Note *refNote, double startTime, int tpq, int channel, int velocity) +{ + double graceNoteDur = 0.0; + if (m_accentedGraceNote && !m_graceNotes.empty()) { + const double totalDur = refNote->GetScoreTimeDuration() / 2.0; + this->DeferMIDINote(refNote, totalDur, true); + graceNoteDur = totalDur / m_graceNotes.size(); + } + else { + graceNoteDur = UNACC_GRACENOTE_DUR * m_currentTempo / 60000.0; + const double totalDur = graceNoteDur * m_graceNotes.size(); + if (startTime >= totalDur) { + startTime -= totalDur; + } + else { + this->DeferMIDINote(refNote, totalDur, true); + } + } + + for (const MIDIChord &chord : m_graceNotes) { + const double stopTime = startTime + graceNoteDur; + for (int pitch : chord.pitches) { + m_midiFile->addNoteOn(m_midiTrack, startTime * tpq, channel, pitch, velocity); + m_midiFile->addNoteOff(m_midiTrack, stopTime * tpq, channel, pitch); + } + startTime = stopTime; + } +} + } // namespace vrv From 8be2d9211a4174f9886787e9497147bc49e32142 Mon Sep 17 00:00:00 2001 From: David Bauer Date: Thu, 4 May 2023 14:37:43 +0200 Subject: [PATCH 030/151] Apply GenerateMIDI and cleanup --- include/vrv/beatrpt.h | 7 ---- include/vrv/btrem.h | 5 --- include/vrv/chord.h | 5 --- include/vrv/ftrem.h | 5 --- include/vrv/functorparams.h | 83 ------------------------------------- include/vrv/gracegrp.h | 7 ---- include/vrv/halfmrpt.h | 7 ---- include/vrv/layer.h | 12 ------ include/vrv/layerelement.h | 7 ---- include/vrv/measure.h | 5 --- include/vrv/midifunctor.h | 42 ++++++++++++++++++- include/vrv/mrpt.h | 7 ---- include/vrv/note.h | 15 ------- include/vrv/object.h | 10 ----- include/vrv/pedal.h | 5 --- include/vrv/scoredef.h | 5 --- include/vrv/staff.h | 5 --- include/vrv/staffdef.h | 5 --- include/vrv/syl.h | 5 --- include/vrv/verse.h | 5 --- src/beatrpt.cpp | 33 --------------- src/btrem.cpp | 58 -------------------------- src/chord.cpp | 34 --------------- src/doc.cpp | 32 +++++++------- src/ftrem.cpp | 18 -------- src/gracegrp.cpp | 33 --------------- src/halfmrpt.cpp | 10 ----- src/layer.cpp | 28 ------------- src/layerelement.cpp | 16 ------- src/measure.cpp | 16 ------- src/mrpt.cpp | 10 ----- src/note.cpp | 56 ------------------------- src/pedal.cpp | 30 -------------- src/scoredef.cpp | 67 ------------------------------ src/staff.cpp | 10 ----- src/staffdef.cpp | 13 ------ src/syl.cpp | 14 ------- src/verse.cpp | 13 ------ 38 files changed, 56 insertions(+), 682 deletions(-) diff --git a/include/vrv/beatrpt.h b/include/vrv/beatrpt.h index b2b27b0fe4..f0919c88ec 100644 --- a/include/vrv/beatrpt.h +++ b/include/vrv/beatrpt.h @@ -66,13 +66,6 @@ class BeatRpt : public LayerElement, public AttColor, public AttBeatRptLog, publ FunctorCode AcceptEnd(ConstFunctor &functor) const override; ///@} - /** - * @name See Object::GenerateMIDI - */ - ///@{ - int GenerateMIDI(FunctorParams *functorParams) override; - ///@} - private: // public: diff --git a/include/vrv/btrem.h b/include/vrv/btrem.h index 67a4033425..37b9424f22 100644 --- a/include/vrv/btrem.h +++ b/include/vrv/btrem.h @@ -68,11 +68,6 @@ class BTrem : public LayerElement, FunctorCode AcceptEnd(ConstFunctor &functor) const override; ///@} - /** - * See Object::GenerateMIDI - */ - int GenerateMIDI(FunctorParams *functorParams) override; - private: // public: diff --git a/include/vrv/chord.h b/include/vrv/chord.h index c1ca29d442..b99a91e8df 100644 --- a/include/vrv/chord.h +++ b/include/vrv/chord.h @@ -192,11 +192,6 @@ class Chord : public LayerElement, FunctorCode AcceptEnd(ConstFunctor &functor) const override; ///@} - /** - * See Object::GenerateMIDI - */ - int GenerateMIDI(FunctorParams *functorParams) override; - protected: /** * The note locations w.r.t. each staff diff --git a/include/vrv/ftrem.h b/include/vrv/ftrem.h index 636dafe37e..9d22970085 100644 --- a/include/vrv/ftrem.h +++ b/include/vrv/ftrem.h @@ -82,11 +82,6 @@ class FTrem : public LayerElement, public BeamDrawingInterface, public AttFTremV FunctorCode AcceptEnd(ConstFunctor &functor) const override; ///@} - /** - * See Object::GenerateMIDI - */ - int GenerateMIDI(FunctorParams *functorParams) override; - private: // protected: diff --git a/include/vrv/functorparams.h b/include/vrv/functorparams.h index eed374705d..2a845c700c 100644 --- a/include/vrv/functorparams.h +++ b/include/vrv/functorparams.h @@ -138,89 +138,6 @@ class GenerateFeaturesParams : public FunctorParams { FeatureExtractor *m_extractor; }; -//---------------------------------------------------------------------------- -// GenerateMIDIParams -//---------------------------------------------------------------------------- - -/** - * Helper struct to store note sequences which replace notes in MIDI output due to expanded ornaments and tremolandi - */ -struct MIDINote { - int pitch; - double duration; -}; - -using MIDINoteSequence = std::list; - -/** - * Helper struct for held notes in tablature - */ -struct MIDIHeldNote { - int m_pitch = 0; - double m_stopTime = 0; -}; - -/** - * Helper struct to store chord sequences in MIDI output due to grace notes - */ -struct MIDIChord { - std::set pitches; - double duration; -}; - -using MIDIChordSequence = std::list; - -/** - * member 0: MidiFile*: the MidiFile we are writing to - * member 1: int: the midi track number - * member 2: int: the midi channel number - * member 3: double: the score time from the start of the music to the start of the current measure - * member 4: the current staff number - * member 5: the semi tone transposition for the current track - * member 6: double with the current tempo - * member 7: the last (non grace) note that was performed - * member 8: expanded notes due to ornaments and tremolandi - * member 9: deferred notes which start slightly later - * member 10: grace note sequence - * member 11: flag indicating whether the last grace note/chord was accented - * member 12: flag indicating whether cue notes should be included - * member 13: the functor - * member 14: Tablature held notes indexed by (course - 1) - **/ - -class GenerateMIDIParams : public FunctorParams { -public: - GenerateMIDIParams(smf::MidiFile *midiFile, Functor *functor) - { - m_midiFile = midiFile; - m_midiTrack = 1; - m_midiChannel = 0; - m_totalTime = 0.0; - m_staffN = 0; - m_transSemi = 0; - m_currentTempo = MIDI_TEMPO; - m_lastNote = NULL; - m_accentedGraceNote = false; - m_cueExclusion = false; - m_functor = functor; - } - smf::MidiFile *m_midiFile; - int m_midiTrack; - int m_midiChannel; - double m_totalTime; - int m_staffN; - int m_transSemi; - double m_currentTempo; - Note *m_lastNote; - std::map m_expandedNotes; - std::map m_deferredNotes; - MIDIChordSequence m_graceNotes; - bool m_accentedGraceNote; - bool m_cueExclusion; - Functor *m_functor; - std::vector m_heldNotes; -}; - //---------------------------------------------------------------------------- // GenerateTimemapParams //---------------------------------------------------------------------------- diff --git a/include/vrv/gracegrp.h b/include/vrv/gracegrp.h index 153ed22250..0df8d8a582 100644 --- a/include/vrv/gracegrp.h +++ b/include/vrv/gracegrp.h @@ -50,13 +50,6 @@ class GraceGrp : public LayerElement, public AttColor, public AttGraced, public FunctorCode AcceptEnd(ConstFunctor &functor) const override; ///@} - /** - * @name See Object::GenerateMIDIEnd - */ - ///@{ - int GenerateMIDIEnd(FunctorParams *functorParams) override; - ///@} - protected: // private: diff --git a/include/vrv/halfmrpt.h b/include/vrv/halfmrpt.h index 0008449029..7cef27d4a8 100644 --- a/include/vrv/halfmrpt.h +++ b/include/vrv/halfmrpt.h @@ -54,13 +54,6 @@ class HalfmRpt : public LayerElement, public AttColor { FunctorCode AcceptEnd(ConstFunctor &functor) const override; ///@} - /** - * @name See Object::GenerateMIDI - */ - ///@{ - int GenerateMIDI(FunctorParams *functorParams) override; - ///@} - private: // public: diff --git a/include/vrv/layer.h b/include/vrv/layer.h index 6456e7cd30..0803c31196 100644 --- a/include/vrv/layer.h +++ b/include/vrv/layer.h @@ -246,18 +246,6 @@ class Layer : public Object, FunctorCode AcceptEnd(ConstFunctor &functor) const override; ///@} - /** - * @name See Object::GenerateMIDI - */ - ///@{ - int GenerateMIDI(FunctorParams *functorParams) override; - ///@} - - /** - * See Object::GenerateMIDIEnd - */ - int GenerateMIDIEnd(FunctorParams *functorParams) override; - private: // public: diff --git a/include/vrv/layerelement.h b/include/vrv/layerelement.h index a9673185b5..f3e21d664d 100644 --- a/include/vrv/layerelement.h +++ b/include/vrv/layerelement.h @@ -338,13 +338,6 @@ class LayerElement : public Object, FunctorCode AcceptEnd(ConstFunctor &functor) const override; ///@} - /** - * @name See Object::GenerateMIDI - */ - ///@{ - int GenerateMIDI(FunctorParams *functorParams) override; - ///@} - /** * See Object::GenerateTimemap */ diff --git a/include/vrv/measure.h b/include/vrv/measure.h index 0e1aad46e1..ec72259db5 100644 --- a/include/vrv/measure.h +++ b/include/vrv/measure.h @@ -342,11 +342,6 @@ class Measure : public Object, FunctorCode AcceptEnd(ConstFunctor &functor) const override; ///@} - /** - * See Object::GenerateMIDI - */ - int GenerateMIDI(FunctorParams *functorParams) override; - /** * See Object::GenerateTimemap */ diff --git a/include/vrv/midifunctor.h b/include/vrv/midifunctor.h index 9c63fb8bb2..104a60cb12 100644 --- a/include/vrv/midifunctor.h +++ b/include/vrv/midifunctor.h @@ -9,7 +9,6 @@ #define __VRV_MIDIFUNCTOR_H__ #include "functor.h" -#include "functorparams.h" namespace smf { class MidiFile; @@ -228,6 +227,34 @@ class InitMIDIFunctor : public ConstFunctor { // GenerateMIDIFunctor //---------------------------------------------------------------------------- +/** + * Helper struct to store note sequences which replace notes in MIDI output due to expanded ornaments and tremolandi + */ +struct MIDINote { + int pitch; + double duration; +}; + +using MIDINoteSequence = std::list; + +/** + * Helper struct for held notes in tablature + */ +struct MIDIHeldNote { + int m_pitch = 0; + double m_stopTime = 0; +}; + +/** + * Helper struct to store chord sequences in MIDI output due to grace notes + */ +struct MIDIChord { + std::set pitches; + double duration; +}; + +using MIDIChordSequence = std::list; + /** * This class performs the export to a MidiFile. */ @@ -246,6 +273,19 @@ class GenerateMIDIFunctor : public ConstFunctor { */ bool ImplementsEndInterface() const override { return true; } + /* + * Setter for various properties + */ + ///@{ + void SetChannel(int channel) { m_midiChannel = channel; } + void SetCueExclusion(bool cueExclusion) { m_cueExclusion = cueExclusion; } + void SetCurrentTempo(double tempo) { m_currentTempo = tempo; } + void SetDeferredNotes(const std::map &deferredNotes) { m_deferredNotes = deferredNotes; } + void SetStaffN(int staffN) { m_staffN = staffN; } + void SetTrack(int track) { m_midiTrack = track; } + void SetTransSemi(int transSemi) { m_transSemi = transSemi; } + ///@} + /* * Functor interface */ diff --git a/include/vrv/mrpt.h b/include/vrv/mrpt.h index ecba3261a8..28462147a2 100644 --- a/include/vrv/mrpt.h +++ b/include/vrv/mrpt.h @@ -51,13 +51,6 @@ class MRpt : public LayerElement, public AttColor, public AttNumbered, public At FunctorCode AcceptEnd(ConstFunctor &functor) const override; ///@} - /** - * @name See Object::GenerateMIDI - */ - ///@{ - int GenerateMIDI(FunctorParams *functorParams) override; - ///@} - private: // public: diff --git a/include/vrv/note.h b/include/vrv/note.h index 0a47095361..ba44908b5f 100644 --- a/include/vrv/note.h +++ b/include/vrv/note.h @@ -296,11 +296,6 @@ class Note : public LayerElement, FunctorCode AcceptEnd(ConstFunctor &functor) const override; ///@} - /** - * See Object::GenerateMIDI - */ - int GenerateMIDI(FunctorParams *functorParams) override; - /** * See Object::GenerateTimemap */ @@ -334,16 +329,6 @@ class Note : public LayerElement, void UpdateFromTransPitch(const TransPitch &tp, bool hasKeySig); - /** - * Register deferred notes for MIDI - */ - void DeferMIDINote(FunctorParams *functorParams, double shift, bool includeChordSiblings); - - /** - * Create the MIDI output of the grace note sequence stored in params - */ - void GenerateGraceNoteMIDI(FunctorParams *functorParams, double startTime, int tpq, int channel, int velocity); - public: // private: diff --git a/include/vrv/object.h b/include/vrv/object.h index 974fc70f72..5bfc5664fb 100644 --- a/include/vrv/object.h +++ b/include/vrv/object.h @@ -692,16 +692,6 @@ class Object : public BoundingBox { */ ///@{ - /** - * Export the object to a MidiFile - */ - virtual int GenerateMIDI(FunctorParams *) { return FUNCTOR_CONTINUE; } - - /** - * End Functor for Object::GenerateMIDI - */ - virtual int GenerateMIDIEnd(FunctorParams *) { return FUNCTOR_CONTINUE; } - /** * Export the object to a JSON timemap file. */ diff --git a/include/vrv/pedal.h b/include/vrv/pedal.h index c5ae684fce..d1f43dcfda 100644 --- a/include/vrv/pedal.h +++ b/include/vrv/pedal.h @@ -93,11 +93,6 @@ class Pedal : public ControlElement, FunctorCode AcceptEnd(ConstFunctor &functor) const override; ///@} - /** - * See Object::GenerateMIDI - */ - int GenerateMIDI(FunctorParams *functorParams) override; - private: /** * Flag indicating if following pedal mark is a bounce diff --git a/include/vrv/scoredef.h b/include/vrv/scoredef.h index 3f9d363fc3..49f99a56ff 100644 --- a/include/vrv/scoredef.h +++ b/include/vrv/scoredef.h @@ -276,11 +276,6 @@ class ScoreDef : public ScoreDefElement, FunctorCode AcceptEnd(ConstFunctor &functor) const override; ///@} - /** - * See Object::GenerateMIDI - */ - int GenerateMIDI(FunctorParams *functorParams) override; - /** * See Object::Transpose */ diff --git a/include/vrv/staff.h b/include/vrv/staff.h index 41c9f20c3a..3f55cc368a 100644 --- a/include/vrv/staff.h +++ b/include/vrv/staff.h @@ -195,11 +195,6 @@ class Staff : public Object, FunctorCode AcceptEnd(ConstFunctor &functor) const override; ///@} - /** - * See Object::GenerateMIDI - */ - int GenerateMIDI(FunctorParams *functorParams) override; - /** * See Object::Transpose */ diff --git a/include/vrv/staffdef.h b/include/vrv/staffdef.h index 4ab0fbb3be..80ea8aa665 100644 --- a/include/vrv/staffdef.h +++ b/include/vrv/staffdef.h @@ -84,11 +84,6 @@ class StaffDef : public ScoreDefElement, FunctorCode AcceptEnd(ConstFunctor &functor) const override; ///@} - /** - * See Object::GenerateMIDI - */ - int GenerateMIDI(FunctorParams *functorParams) override; - /** * See Object::Transpose */ diff --git a/include/vrv/syl.h b/include/vrv/syl.h index d82ddc9f49..b23df4cb65 100644 --- a/include/vrv/syl.h +++ b/include/vrv/syl.h @@ -108,11 +108,6 @@ class Syl : public LayerElement, FunctorCode AcceptEnd(ConstFunctor &functor) const override; ///@} - /** - * See Object::GenerateMIDI - */ - int GenerateMIDI(FunctorParams *functorParams) override; - /** Create a default zone for a syl based on syllable. */ bool CreateDefaultZone(Doc *doc); diff --git a/include/vrv/verse.h b/include/vrv/verse.h index cbc926cc6c..fb1b264ec1 100644 --- a/include/vrv/verse.h +++ b/include/vrv/verse.h @@ -70,11 +70,6 @@ class Verse : public LayerElement, public AttColor, public AttLang, public AttNI FunctorCode AcceptEnd(ConstFunctor &functor) const override; ///@} - /** - * See Object::GenerateMIDI - */ - int GenerateMIDI(FunctorParams *) override; - private: // public: diff --git a/src/beatrpt.cpp b/src/beatrpt.cpp index 08d8e6e4b2..5003a59eb2 100644 --- a/src/beatrpt.cpp +++ b/src/beatrpt.cpp @@ -96,37 +96,4 @@ FunctorCode BeatRpt::AcceptEnd(ConstFunctor &functor) const return functor.VisitBeatRptEnd(this); } -int BeatRpt::GenerateMIDI(FunctorParams *functorParams) -{ - GenerateMIDIParams *params = vrv_params_cast(functorParams); - assert(params); - - // Sameas not taken into account for now - double beatLength = this->GetAlignmentDuration() / (DUR_MAX / DURATION_4); - double starttime = params->m_totalTime + this->GetScoreTimeOnset(); - int tpq = params->m_midiFile->getTPQ(); - - // filter last beat and copy all notes - smf::MidiEvent event; - int eventcount = params->m_midiFile->getEventCount(params->m_midiTrack); - for (int i = 0; i < eventcount; ++i) { - event = params->m_midiFile->getEvent(params->m_midiTrack, i); - if (event.tick > starttime * tpq) - break; - else if (event.tick >= (starttime - beatLength) * tpq) { - if (((event[0] & 0xf0) == 0x80) || ((event[0] & 0xf0) == 0x90)) { - params->m_midiFile->addEvent(params->m_midiTrack, event.tick + beatLength * tpq, event); - } - } - } - - for (int i = 0; i < beatLength * tpq; ++i) { - // LogWarning("%i", i); - // smf::MidiEvent event = params->m_midiFile->getEvent(params->m_midiTrack, starttime * tpq); - // event.clearVariables(); - } - - return FUNCTOR_CONTINUE; -} - } // namespace vrv diff --git a/src/btrem.cpp b/src/btrem.cpp index e8bde4787c..7570e6129b 100644 --- a/src/btrem.cpp +++ b/src/btrem.cpp @@ -93,64 +93,6 @@ FunctorCode BTrem::AcceptEnd(ConstFunctor &functor) const return functor.VisitBTremEnd(this); } -int BTrem::GenerateMIDI(FunctorParams *functorParams) -{ - GenerateMIDIParams *params = vrv_params_cast(functorParams); - assert(params); - - // Do nothing if the tremolo is unmeasured - if (this->GetForm() == bTremLog_FORM_unmeas) { - return FUNCTOR_CONTINUE; - } - - // Adjust duration of the bTrem if it's nested within tuplet - int num = 0; - Tuplet *tuplet = vrv_cast(this->GetFirstAncestor(TUPLET, MAX_TUPLET_DEPTH)); - if (tuplet) { - num = (tuplet->GetNum() > 0) ? tuplet->GetNum() : 0; - } - // Get num value if it's set - if (this->HasNum()) { - num = this->GetNum(); - } - - // Calculate duration of individual note in tremolo - const data_DURATION individualNoteDur = CalcIndividualNoteDuration(); - if (individualNoteDur == DURATION_NONE) return FUNCTOR_CONTINUE; - const double noteInQuarterDur = pow(2.0, (DURATION_4 - individualNoteDur)); - - // Define lambda which expands one note into multiple individual notes of the same pitch - auto expandNote = [params, noteInQuarterDur, num](Object *obj) { - Note *note = vrv_cast(obj); - assert(note); - const int pitch = note->GetMIDIPitch(params->m_transSemi); - const double totalInQuarterDur = note->GetScoreTimeDuration() + note->GetScoreTimeTiedDuration(); - int multiplicity = totalInQuarterDur / noteInQuarterDur; - double noteDuration = noteInQuarterDur; - // if NUM has been set for the bTrem, override calculated values - if (num) { - multiplicity = num; - noteDuration = totalInQuarterDur / double(num); - } - (params->m_expandedNotes)[note] = MIDINoteSequence(multiplicity, { pitch, noteDuration }); - }; - - // Apply expansion either to all notes in chord or to first note - Chord *chord = vrv_cast(this->FindDescendantByType(CHORD)); - if (chord) { - ListOfObjects notes = chord->FindAllDescendantsByType(NOTE, false); - std::for_each(notes.begin(), notes.end(), expandNote); - } - else { - Object *note = this->FindDescendantByType(NOTE); - if (note) { - expandNote(note); - } - } - - return FUNCTOR_CONTINUE; -} - data_DURATION BTrem::CalcIndividualNoteDuration() const { // Check if duration is given by attribute diff --git a/src/chord.cpp b/src/chord.cpp index f8c375c48a..284c65ce5f 100644 --- a/src/chord.cpp +++ b/src/chord.cpp @@ -601,38 +601,4 @@ MapOfDotLocs Chord::CalcDotLocations(int layerCount, bool primary) const return dotLocs; } -int Chord::GenerateMIDI(FunctorParams *functorParams) -{ - GenerateMIDIParams *params = vrv_params_cast(functorParams); - assert(params); - - // Handle grace chords - if (this->IsGraceNote()) { - std::set pitches; - const ListOfObjects ¬es = this->GetList(this); - for (Object *obj : notes) { - Note *note = vrv_cast(obj); - assert(note); - pitches.insert(note->GetMIDIPitch(params->m_transSemi)); - } - - double quarterDuration = 0.0; - const data_DURATION dur = this->GetDur(); - if ((dur >= DURATION_long) && (dur <= DURATION_1024)) { - quarterDuration = pow(2.0, (DURATION_4 - dur)); - } - - params->m_graceNotes.push_back({ pitches, quarterDuration }); - - bool accented = (this->GetGrace() == GRACE_acc); - GraceGrp *graceGrp = vrv_cast(this->GetFirstAncestor(GRACEGRP)); - if (graceGrp && (graceGrp->GetGrace() == GRACE_acc)) accented = true; - params->m_accentedGraceNote = accented; - - return FUNCTOR_SIBLINGS; - } - - return FUNCTOR_CONTINUE; -} - } // namespace vrv diff --git a/src/doc.cpp b/src/doc.cpp index 55336b0779..0582b80c1e 100644 --- a/src/doc.cpp +++ b/src/doc.cpp @@ -477,12 +477,10 @@ void Doc::ExportMIDI(smf::MidiFile *midiFile) } // Set initial scoreDef values for tuning - Functor generateScoreDefMIDI(&Object::GenerateMIDI); - Functor generateScoreDefMIDIEnd(&Object::GenerateMIDIEnd); - GenerateMIDIParams generateScoreDefMIDIParams(midiFile, &generateScoreDefMIDI); - generateScoreDefMIDIParams.m_midiChannel = midiChannel; - generateScoreDefMIDIParams.m_midiTrack = midiTrack; - currentScoreDef->Process(&generateScoreDefMIDI, &generateScoreDefMIDIParams, &generateScoreDefMIDIEnd); + GenerateMIDIFunctor generateScoreDefMIDI(midiFile); + generateScoreDefMIDI.SetChannel(midiChannel); + generateScoreDefMIDI.SetTrack(midiTrack); + currentScoreDef->Process(generateScoreDefMIDI); for (layers = staves->second.child.begin(); layers != staves->second.child.end(); ++layers) { filters.Clear(); @@ -492,19 +490,19 @@ void Doc::ExportMIDI(smf::MidiFile *midiFile) filters.Add(&matchStaff); filters.Add(&matchLayer); - Functor generateMIDI(&Object::GenerateMIDI); - Functor generateMIDIEnd(&Object::GenerateMIDIEnd); - GenerateMIDIParams generateMIDIParams(midiFile, &generateMIDI); - generateMIDIParams.m_midiChannel = midiChannel; - generateMIDIParams.m_midiTrack = midiTrack; - generateMIDIParams.m_staffN = staves->first; - generateMIDIParams.m_transSemi = transSemi; - generateMIDIParams.m_currentTempo = tempo; - generateMIDIParams.m_deferredNotes = initMIDI.GetDeferredNotes(); - generateMIDIParams.m_cueExclusion = this->GetOptions()->m_midiNoCue.GetValue(); + GenerateMIDIFunctor generateMIDI(midiFile); + generateMIDI.SetFilters(&filters); + + generateMIDI.SetChannel(midiChannel); + generateMIDI.SetTrack(midiTrack); + generateMIDI.SetStaffN(staves->first); + generateMIDI.SetTransSemi(transSemi); + generateMIDI.SetCurrentTempo(tempo); + generateMIDI.SetDeferredNotes(initMIDI.GetDeferredNotes()); + generateMIDI.SetCueExclusion(this->GetOptions()->m_midiNoCue.GetValue()); // LogDebug("Exporting track %d ----------------", midiTrack); - this->Process(&generateMIDI, &generateMIDIParams, &generateMIDIEnd, &filters); + this->Process(generateMIDI); } } } diff --git a/src/ftrem.cpp b/src/ftrem.cpp index 600a3e1fb9..30e752a952 100644 --- a/src/ftrem.cpp +++ b/src/ftrem.cpp @@ -143,22 +143,4 @@ FunctorCode FTrem::AcceptEnd(ConstFunctor &functor) const return functor.VisitFTremEnd(this); } -int FTrem::GenerateMIDI(FunctorParams *functorParams) -{ - // GenerateMIDIParams *params = vrv_params_cast(functorParams); - // assert(params); - - FTrem *fTrem = vrv_cast(this); - assert(fTrem); - - if (!fTrem->HasUnitdur()) { - return FUNCTOR_CONTINUE; - } - else { - LogWarning("FTrem produces incorrect MIDI output"); - } - - return FUNCTOR_CONTINUE; -} - } // namespace vrv diff --git a/src/gracegrp.cpp b/src/gracegrp.cpp index 75289ec1f8..8595c31b23 100644 --- a/src/gracegrp.cpp +++ b/src/gracegrp.cpp @@ -100,37 +100,4 @@ FunctorCode GraceGrp::AcceptEnd(ConstFunctor &functor) const return functor.VisitGraceGrpEnd(this); } -int GraceGrp::GenerateMIDIEnd(FunctorParams *functorParams) -{ - GenerateMIDIParams *params = vrv_params_cast(functorParams); - assert(params); - - // Handling of Nachschlag - if (!params->m_graceNotes.empty() && (this->GetAttach() == graceGrpLog_ATTACH_pre) && !params->m_accentedGraceNote - && params->m_lastNote) { - double startTime = params->m_totalTime + params->m_lastNote->GetScoreTimeOffset(); - const double graceNoteDur = UNACC_GRACENOTE_DUR * params->m_currentTempo / 60000.0; - const double totalDur = graceNoteDur * params->m_graceNotes.size(); - startTime -= totalDur; - startTime = std::max(startTime, 0.0); - - const int channel = params->m_midiChannel; - int velocity = MIDI_VELOCITY; - if (params->m_lastNote->HasVel()) velocity = params->m_lastNote->GetVel(); - const int tpq = params->m_midiFile->getTPQ(); - - for (const MIDIChord &chord : params->m_graceNotes) { - const double stopTime = startTime + graceNoteDur; - for (int pitch : chord.pitches) { - params->m_midiFile->addNoteOn(params->m_midiTrack, startTime * tpq, channel, pitch, velocity); - params->m_midiFile->addNoteOff(params->m_midiTrack, stopTime * tpq, channel, pitch); - } - startTime = stopTime; - } - - params->m_graceNotes.clear(); - } - return FUNCTOR_CONTINUE; -} - } // namespace vrv diff --git a/src/halfmrpt.cpp b/src/halfmrpt.cpp index 84310e3efb..b3d034f777 100644 --- a/src/halfmrpt.cpp +++ b/src/halfmrpt.cpp @@ -70,14 +70,4 @@ FunctorCode HalfmRpt::AcceptEnd(ConstFunctor &functor) const return functor.VisitHalfmRptEnd(this); } -int HalfmRpt::GenerateMIDI(FunctorParams *functorParams) -{ - // GenerateMIDIParams *params = vrv_params_cast(functorParams); - // assert(params); - - LogWarning("HalfmRpt produces empty MIDI output"); - - return FUNCTOR_CONTINUE; -} - } // namespace vrv diff --git a/src/layer.cpp b/src/layer.cpp index 4f0010ddc2..d713f493bb 100644 --- a/src/layer.cpp +++ b/src/layer.cpp @@ -630,32 +630,4 @@ FunctorCode Layer::AcceptEnd(ConstFunctor &functor) const return functor.VisitLayerEnd(this); } -int Layer::GenerateMIDI(FunctorParams *functorParams) -{ - GenerateMIDIParams *params = vrv_params_cast(functorParams); - assert(params); - - if (this->GetCue() == BOOLEAN_true && params->m_cueExclusion) return FUNCTOR_SIBLINGS; - - return FUNCTOR_CONTINUE; -} - -int Layer::GenerateMIDIEnd(FunctorParams *functorParams) -{ - GenerateMIDIParams *params = vrv_params_cast(functorParams); - assert(params); - - // stop all previously held notes - for (auto &held : params->m_heldNotes) { - if (held.m_pitch > 0) { - params->m_midiFile->addNoteOff(params->m_midiTrack, held.m_stopTime * params->m_midiFile->getTPQ(), - params->m_midiChannel, held.m_pitch); - } - } - - params->m_heldNotes.clear(); - - return FUNCTOR_CONTINUE; -} - } // namespace vrv diff --git a/src/layerelement.cpp b/src/layerelement.cpp index f101bf9d3d..f6a499eaf5 100644 --- a/src/layerelement.cpp +++ b/src/layerelement.cpp @@ -1315,22 +1315,6 @@ std::pair LayerElement::CalcElementHorizontalOverlap(const Doc *doc, return { shift, isInUnison }; } -int LayerElement::GenerateMIDI(FunctorParams *functorParams) -{ - GenerateMIDIParams *params = vrv_params_cast(functorParams); - assert(params); - - if (this->IsScoreDefElement()) return FUNCTOR_SIBLINGS; - - // Only resolve simple sameas links to avoid infinite recursion - LayerElement *sameas = dynamic_cast(this->GetSameasLink()); - if (sameas && !sameas->HasSameasLink()) { - sameas->Process(params->m_functor, functorParams); - } - - return FUNCTOR_CONTINUE; -} - int LayerElement::GenerateTimemap(FunctorParams *functorParams) { GenerateTimemapParams *params = vrv_params_cast(functorParams); diff --git a/src/measure.cpp b/src/measure.cpp index 22f2d416ce..1e0de0fc96 100644 --- a/src/measure.cpp +++ b/src/measure.cpp @@ -728,22 +728,6 @@ FunctorCode Measure::AcceptEnd(ConstFunctor &functor) const return functor.VisitMeasureEnd(this); } -int Measure::GenerateMIDI(FunctorParams *functorParams) -{ - GenerateMIDIParams *params = vrv_params_cast(functorParams); - assert(params); - - // Here we need to update the m_totalTime from the starting time of the measure. - params->m_totalTime = m_scoreTimeOffset.back(); - - if (m_currentTempo != params->m_currentTempo) { - params->m_midiFile->addTempo(0, m_scoreTimeOffset.back() * params->m_midiFile->getTPQ(), m_currentTempo); - params->m_currentTempo = m_currentTempo; - } - - return FUNCTOR_CONTINUE; -} - int Measure::GenerateTimemap(FunctorParams *functorParams) { GenerateTimemapParams *params = vrv_params_cast(functorParams); diff --git a/src/mrpt.cpp b/src/mrpt.cpp index c3296f2e89..b4c14819a7 100644 --- a/src/mrpt.cpp +++ b/src/mrpt.cpp @@ -76,14 +76,4 @@ FunctorCode MRpt::AcceptEnd(ConstFunctor &functor) const return functor.VisitMRptEnd(this); } -int MRpt::GenerateMIDI(FunctorParams *functorParams) -{ - // GenerateMIDIParams *params = vrv_params_cast(functorParams); - // assert(params); - - LogWarning("MRpt produces empty MIDI output"); - - return FUNCTOR_CONTINUE; -} - } // namespace vrv diff --git a/src/note.cpp b/src/note.cpp index 7c084b5d46..ace143230b 100644 --- a/src/note.cpp +++ b/src/note.cpp @@ -729,62 +729,6 @@ void Note::UpdateFromTransPitch(const TransPitch &tp, bool hasKeySig) } } -void Note::DeferMIDINote(FunctorParams *functorParams, double shift, bool includeChordSiblings) -{ - GenerateMIDIParams *params = vrv_params_cast(functorParams); - assert(params); - - // Recursive call for chords - Chord *chord = this->IsChordTone(); - if (chord && includeChordSiblings) { - const ListOfObjects ¬es = chord->GetList(chord); - - for (Object *obj : notes) { - Note *note = vrv_cast(obj); - assert(note); - note->DeferMIDINote(functorParams, shift, false); - } - return; - } - - // Register the shift - if (shift < this->GetScoreTimeDuration() + this->GetScoreTimeTiedDuration()) { - params->m_deferredNotes[this] = shift; - } -} - -void Note::GenerateGraceNoteMIDI(FunctorParams *functorParams, double startTime, int tpq, int channel, int velocity) -{ - GenerateMIDIParams *params = vrv_params_cast(functorParams); - assert(params); - - double graceNoteDur = 0.0; - if (params->m_accentedGraceNote && !params->m_graceNotes.empty()) { - const double totalDur = this->GetScoreTimeDuration() / 2.0; - this->DeferMIDINote(functorParams, totalDur, true); - graceNoteDur = totalDur / params->m_graceNotes.size(); - } - else { - graceNoteDur = UNACC_GRACENOTE_DUR * params->m_currentTempo / 60000.0; - const double totalDur = graceNoteDur * params->m_graceNotes.size(); - if (startTime >= totalDur) { - startTime -= totalDur; - } - else { - this->DeferMIDINote(functorParams, totalDur, true); - } - } - - for (const MIDIChord &chord : params->m_graceNotes) { - const double stopTime = startTime + graceNoteDur; - for (int pitch : chord.pitches) { - params->m_midiFile->addNoteOn(params->m_midiTrack, startTime * tpq, channel, pitch, velocity); - params->m_midiFile->addNoteOff(params->m_midiTrack, stopTime * tpq, channel, pitch); - } - startTime = stopTime; - } -} - //----------------// // Static methods // //----------------// diff --git a/src/pedal.cpp b/src/pedal.cpp index fcf79f21ee..9554d56609 100644 --- a/src/pedal.cpp +++ b/src/pedal.cpp @@ -129,34 +129,4 @@ FunctorCode Pedal::AcceptEnd(ConstFunctor &functor) const return functor.VisitPedalEnd(this); } -int Pedal::GenerateMIDI(FunctorParams *functorParams) -{ - GenerateMIDIParams *params = vrv_params_cast(functorParams); - assert(params); - - // Sameas not taken into account for now - if (!this->HasDir()) return FUNCTOR_CONTINUE; - - double pedalTime = this->GetStart()->GetAlignment()->GetTime() * DURATION_4 / DUR_MAX; - double starttime = params->m_totalTime + pedalTime; - int tpq = params->m_midiFile->getTPQ(); - - // todo: check pedal @func to switch between sustain/soften/damper pedals? - switch (this->GetDir()) { - case pedalLog_DIR_down: - params->m_midiFile->addSustainPedalOn(params->m_midiTrack, (starttime * tpq), params->m_midiChannel); - break; - case pedalLog_DIR_up: - params->m_midiFile->addSustainPedalOff(params->m_midiTrack, (starttime * tpq), params->m_midiChannel); - break; - case pedalLog_DIR_bounce: - params->m_midiFile->addSustainPedalOff(params->m_midiTrack, (starttime * tpq), params->m_midiChannel); - params->m_midiFile->addSustainPedalOn(params->m_midiTrack, (starttime * tpq) + 0.1, params->m_midiChannel); - break; - default: return FUNCTOR_CONTINUE; - } - - return FUNCTOR_CONTINUE; -} - } // namespace vrv diff --git a/src/scoredef.cpp b/src/scoredef.cpp index 1facc5b448..e58607a216 100644 --- a/src/scoredef.cpp +++ b/src/scoredef.cpp @@ -699,73 +699,6 @@ FunctorCode ScoreDef::AcceptEnd(ConstFunctor &functor) const return functor.VisitScoreDefEnd(this); } -int ScoreDef::GenerateMIDI(FunctorParams *functorParams) -{ - GenerateMIDIParams *params = vrv_params_cast(functorParams); - assert(params); - - double totalTime = params->m_totalTime; - // check next measure for the time offset - Object *parent = this->GetParent(); - if (parent && (parent->GetLast() != this)) { - Object *next = parent->GetNext(this); - if (next && next->Is(MEASURE)) { - Measure *nextMeasure = vrv_cast(next); - totalTime = nextMeasure->GetLastTimeOffset(); - } - } - const double currentTick = totalTime * params->m_midiFile->getTPQ(); - - smf::MidiEvent midiEvent; - midiEvent.tick = currentTick; - // calculate reference pitch class based on @tune.pname - int referencePitchClass = 0; - if (this->HasTunePname()) { - referencePitchClass = Note::PnameToPclass(this->GetTunePname()); - } - // set temperament event if corresponding attribute present - if (this->HasTuneTemper()) { - switch (this->GetTuneTemper()) { - case TEMPERAMENT_equal: midiEvent.makeTemperamentEqual(referencePitchClass); break; - case TEMPERAMENT_just: midiEvent.makeTemperamentBad(100.0, referencePitchClass); break; - case TEMPERAMENT_mean: midiEvent.makeTemperamentMeantone(referencePitchClass); break; - case TEMPERAMENT_pythagorean: midiEvent.makeTemperamentPythagorean(referencePitchClass); break; - default: break; - } - params->m_midiFile->addEvent(params->m_midiTrack, midiEvent); - } - // set tuning - if (this->HasTuneHz()) { - const double tuneHz = this->GetTuneHz(); - // Add tuning for all keys from 0 to 127 - std::vector> tuneFrequencies; - for (int i = 0; i < 127; ++i) { - double freq = pow(2.0, (i - 69.0) / 12.0) * tuneHz; - tuneFrequencies.push_back(std::make_pair(i, freq)); - } - midiEvent.makeMts2_KeyTuningsByFrequency(tuneFrequencies); - params->m_midiFile->addEvent(params->m_midiTrack, midiEvent); - } - // set MIDI key signature - if (this->HasKeySigInfo()) { - KeySig *keySig = vrv_cast(this->GetKeySig()); - if (keySig && keySig->HasSig()) { - params->m_midiFile->addKeySignature( - params->m_midiTrack, currentTick, keySig->GetFifthsInt(), (keySig->GetMode() == MODE_minor)); - } - } - // set MIDI time signature - if (this->HasMeterSigInfo()) { - MeterSig *meterSig = vrv_cast(this->GetMeterSig()); - if (meterSig && meterSig->HasCount() && meterSig->HasUnit()) { - params->m_midiFile->addTimeSignature( - params->m_midiTrack, currentTick, meterSig->GetTotalCount(), meterSig->GetUnit()); - } - } - - return FUNCTOR_CONTINUE; -} - int ScoreDef::Transpose(FunctorParams *functorParams) { TransposeParams *params = vrv_params_cast(functorParams); diff --git a/src/staff.cpp b/src/staff.cpp index 3477afa2ca..b517ca48d3 100644 --- a/src/staff.cpp +++ b/src/staff.cpp @@ -364,16 +364,6 @@ FunctorCode Staff::AcceptEnd(ConstFunctor &functor) const return functor.VisitStaffEnd(this); } -int Staff::GenerateMIDI(FunctorParams *functorParams) -{ - GenerateMIDIParams *params = vrv_params_cast(functorParams); - assert(params); - - params->m_expandedNotes.clear(); - - return FUNCTOR_CONTINUE; -} - int Staff::Transpose(FunctorParams *functorParams) { TransposeParams *params = vrv_params_cast(functorParams); diff --git a/src/staffdef.cpp b/src/staffdef.cpp index 9085289db7..683b7c83af 100644 --- a/src/staffdef.cpp +++ b/src/staffdef.cpp @@ -158,19 +158,6 @@ FunctorCode StaffDef::AcceptEnd(ConstFunctor &functor) const return functor.VisitStaffDefEnd(this); } -int StaffDef::GenerateMIDI(FunctorParams *functorParams) -{ - GenerateMIDIParams *params = vrv_params_cast(functorParams); - assert(params); - - if (this->GetN() == params->m_staffN) { - // Update the semitone transposition - if (this->HasTransSemi()) params->m_transSemi = this->GetTransSemi(); - } - - return FUNCTOR_CONTINUE; -} - int StaffDef::Transpose(FunctorParams *functorParams) { TransposeParams *params = vrv_params_cast(functorParams); diff --git a/src/syl.cpp b/src/syl.cpp index a99e267477..0915e40970 100644 --- a/src/syl.cpp +++ b/src/syl.cpp @@ -171,20 +171,6 @@ FunctorCode Syl::AcceptEnd(ConstFunctor &functor) const return functor.VisitSylEnd(this); } -int Syl::GenerateMIDI(FunctorParams *functorParams) -{ - GenerateMIDIParams *params = vrv_params_cast(functorParams); - assert(params); - - const int startTime = params->m_totalTime + params->m_lastNote->GetScoreTimeOnset(); - Text *text = vrv_cast(this->GetChild(0, TEXT)); - const std::string sylText = UTF32to8(text->GetText()); - - params->m_midiFile->addLyric(params->m_midiTrack, startTime * params->m_midiFile->getTPQ(), sylText); - - return FUNCTOR_SIBLINGS; -} - bool Syl::CreateDefaultZone(Doc *doc) { const int offsetUly = 100; diff --git a/src/verse.cpp b/src/verse.cpp index 7788b44732..a66ce728f9 100644 --- a/src/verse.cpp +++ b/src/verse.cpp @@ -127,17 +127,4 @@ FunctorCode Verse::AcceptEnd(ConstFunctor &functor) const return functor.VisitVerseEnd(this); } -int Verse::GenerateMIDI(FunctorParams *) -{ - LayerElement *parent = vrv_cast(this->GetFirstAncestor(NOTE)); - if (!parent) parent = vrv_cast(this->GetFirstAncestor(CHORD)); - assert(parent); - - Verse *previousVerse = vrv_cast(parent->GetPrevious(this, VERSE)); - - if (previousVerse) return FUNCTOR_SIBLINGS; - - return FUNCTOR_CONTINUE; -} - } // namespace vrv From e6cd5e61d4d5a73ad54680c5c13a21f33717a90d Mon Sep 17 00:00:00 2001 From: David Bauer Date: Thu, 4 May 2023 15:26:16 +0200 Subject: [PATCH 031/151] Resolve rebase conflict --- src/midifunctor.cpp | 3 +- src/note.cpp | 120 -------------------------------------------- 2 files changed, 2 insertions(+), 121 deletions(-) diff --git a/src/midifunctor.cpp b/src/midifunctor.cpp index 91baee574b..ddee53dc13 100644 --- a/src/midifunctor.cpp +++ b/src/midifunctor.cpp @@ -651,8 +651,9 @@ FunctorCode GenerateMIDIFunctor::VisitNote(const Note *note) } // end all previously held notes that have reached their stoptime + // or if the new pitch is already sounding, on any course for (auto &held : m_heldNotes) { - if ((held.m_pitch > 0) && (held.m_stopTime <= startTime)) { + if ((held.m_pitch > 0) && ((held.m_stopTime <= startTime) || (held.m_pitch == pitch))) { m_midiFile->addNoteOff(m_midiTrack, held.m_stopTime * tpq, channel, held.m_pitch); held.m_pitch = 0; held.m_stopTime = 0; diff --git a/src/note.cpp b/src/note.cpp index ace143230b..416a0453ea 100644 --- a/src/note.cpp +++ b/src/note.cpp @@ -848,126 +848,6 @@ MapOfDotLocs Note::CalcDotLocations(int layerCount, bool primary) const return dotLocs; } -int Note::GenerateMIDI(FunctorParams *functorParams) -{ - GenerateMIDIParams *params = vrv_params_cast(functorParams); - assert(params); - - // Skip linked notes - if (this->HasSameasLink()) { - return FUNCTOR_SIBLINGS; - } - - // Skip cue notes when midiNoCue is activated - if (this->GetCue() == BOOLEAN_true && params->m_cueExclusion) { - return FUNCTOR_SIBLINGS; - } - - // If the note is a secondary tied note, then ignore it - if (this->GetScoreTimeTiedDuration() < 0.0) { - return FUNCTOR_SIBLINGS; - } - - // Handle grace notes - if (this->IsGraceNote()) { - const int pitch = this->GetMIDIPitch(params->m_transSemi); - - double quarterDuration = 0.0; - const data_DURATION dur = this->GetDur(); - if ((dur >= DURATION_long) && (dur <= DURATION_1024)) { - quarterDuration = pow(2.0, (DURATION_4 - dur)); - } - - params->m_graceNotes.push_back({ { pitch }, quarterDuration }); - - bool accented = (this->GetGrace() == GRACE_acc); - GraceGrp *graceGrp = vrv_cast(this->GetFirstAncestor(GRACEGRP)); - if (graceGrp && (graceGrp->GetGrace() == GRACE_acc)) accented = true; - params->m_accentedGraceNote = accented; - - return FUNCTOR_SIBLINGS; - } - - const int channel = params->m_midiChannel; - int velocity = MIDI_VELOCITY; - if (this->HasVel()) velocity = this->GetVel(); - - double startTime = params->m_totalTime + this->GetScoreTimeOnset(); - const int tpq = params->m_midiFile->getTPQ(); - - // Check if some grace notes must be performed - if (!params->m_graceNotes.empty()) { - this->GenerateGraceNoteMIDI(functorParams, startTime, tpq, channel, velocity); - params->m_graceNotes.clear(); - } - - // Check if note is deferred - if (params->m_deferredNotes.find(this) != params->m_deferredNotes.end()) { - startTime += params->m_deferredNotes.at(this); - params->m_deferredNotes.erase(this); - } - - // Check if note was expanded into sequence of short notes due to trills/tremolandi - // Play either the expanded note sequence or a single note - if (params->m_expandedNotes.find(this) != params->m_expandedNotes.end()) { - for (const auto &midiNote : params->m_expandedNotes[this]) { - const double stopTime = startTime + midiNote.duration; - - params->m_midiFile->addNoteOn(params->m_midiTrack, startTime * tpq, channel, midiNote.pitch, velocity); - params->m_midiFile->addNoteOff(params->m_midiTrack, stopTime * tpq, channel, midiNote.pitch); - - startTime = stopTime; - } - } - else { - const int pitch = this->GetMIDIPitch(params->m_transSemi); - - if (this->HasTabCourse() && this->GetTabCourse() >= 1) { - // Tablature 'rule of holds'. A note on a course is held until the next note - // on that course is required, or until a default hold duration is reached. - - const int course = this->GetTabCourse(); - if (params->m_heldNotes.size() < static_cast(course)) - params->m_heldNotes.resize(course); // make room - - // if a previously held note on this course is already sounding, end it now. - if (params->m_heldNotes[course - 1].m_pitch > 0) - params->m_heldNotes[course - 1].m_stopTime = startTime; // stop now - - // end all previously held notes that have reached their stoptime - // or if the new pitch is already sounding, on any course - for (auto &held : params->m_heldNotes) { - if (held.m_pitch > 0 && (held.m_stopTime <= startTime || held.m_pitch == pitch)) { - params->m_midiFile->addNoteOff(params->m_midiTrack, held.m_stopTime * tpq, channel, held.m_pitch); - held.m_pitch = 0; - held.m_stopTime = 0; - } - } - - // hold this note until the greater of its rhythm sign and the default duration. - // TODO optimize the default hold duration - const double defaultHoldTime = 4; // quarter notes - params->m_heldNotes[course - 1].m_pitch = pitch; - params->m_heldNotes[course - 1].m_stopTime = params->m_totalTime - + std::max(defaultHoldTime, this->GetScoreTimeOffset() + this->GetScoreTimeTiedDuration()); - - // start this note - params->m_midiFile->addNoteOn(params->m_midiTrack, startTime * tpq, channel, pitch, velocity); - } - else { - const double stopTime = params->m_totalTime + this->GetScoreTimeOffset() + this->GetScoreTimeTiedDuration(); - - params->m_midiFile->addNoteOn(params->m_midiTrack, startTime * tpq, channel, pitch, velocity); - params->m_midiFile->addNoteOff(params->m_midiTrack, stopTime * tpq, channel, pitch); - } - } - - // Store reference, i.e. for Nachschlag - params->m_lastNote = this; - - return FUNCTOR_CONTINUE; -} - int Note::GenerateTimemap(FunctorParams *functorParams) { GenerateTimemapParams *params = vrv_params_cast(functorParams); From 354cc4812234595576e387d61c1a064dbfb601e8 Mon Sep 17 00:00:00 2001 From: David Bauer Date: Thu, 4 May 2023 21:57:04 +0200 Subject: [PATCH 032/151] Add GenerateTimemap --- include/vrv/measure.h | 5 +- include/vrv/midifunctor.h | 57 +++++++++++++++++ include/vrv/timemap.h | 5 ++ src/midifunctor.cpp | 125 ++++++++++++++++++++++++++++++++++++++ 4 files changed, 191 insertions(+), 1 deletion(-) diff --git a/include/vrv/measure.h b/include/vrv/measure.h index ec72259db5..e3b665d4d8 100644 --- a/include/vrv/measure.h +++ b/include/vrv/measure.h @@ -301,9 +301,12 @@ class Measure : public Object, double GetLastTimeOffset() const { return m_scoreTimeOffset.back(); } /** - * Return the real time offset in millisecond for the repeat (1-based). + * Return the real time offset in milliseconds */ + ///@{ + double GetLastRealTimeOffset() const { return m_realTimeOffsetMilliseconds.back(); } double GetRealTimeOffsetMilliseconds(int repeat) const; + ///@} /** * Setter for the time offset diff --git a/include/vrv/midifunctor.h b/include/vrv/midifunctor.h index 104a60cb12..12973a781b 100644 --- a/include/vrv/midifunctor.h +++ b/include/vrv/midifunctor.h @@ -16,6 +16,8 @@ class MidiFile; namespace vrv { +class Timemap; + //---------------------------------------------------------------------------- // InitOnsetOffsetFunctor //---------------------------------------------------------------------------- @@ -356,6 +358,61 @@ class GenerateMIDIFunctor : public ConstFunctor { std::vector m_heldNotes; }; +//---------------------------------------------------------------------------- +// GenerateTimemapFunctor +//---------------------------------------------------------------------------- + +/** + * This class exports the object to a JSON timemap file. + */ +class GenerateTimemapFunctor : public ConstFunctor { +public: + /** + * @name Constructors, destructors + */ + ///@{ + GenerateTimemapFunctor(Timemap *timemap); + virtual ~GenerateTimemapFunctor() = default; + ///@} + + /* + * Abstract base implementation + */ + bool ImplementsEndInterface() const override { return false; } + + /* + * Functor interface + */ + ///@{ + FunctorCode VisitLayerElement(const LayerElement *layerElement) override; + FunctorCode VisitMeasure(const Measure *measure) override; + FunctorCode VisitNote(const Note *note) override; + FunctorCode VisitRest(const Rest *rest) override; + ///@} + +protected: + // +private: + /** + * Add an entry to the timemap. + */ + void AddTimemapEntry(const Object *object); + +public: + // +private: + // The score time from the start of the piece to the previous barline in quarter notes + double m_scoreTimeOffset; + // Real time from the start of the piece to the previous barline in ms + double m_realTimeOffsetMilliseconds; + // The current tempo + double m_currentTempo; + // Indicates whether cue notes should be included + bool m_cueExclusion; + // The timemap + Timemap *m_timemap; +}; + } // namespace vrv #endif // __VRV_MIDIFUNCTOR_H__ diff --git a/include/vrv/timemap.h b/include/vrv/timemap.h index ea5612819e..ebdb1ad962 100644 --- a/include/vrv/timemap.h +++ b/include/vrv/timemap.h @@ -63,6 +63,11 @@ class Timemap { */ void AddEntry(Object *object, GenerateTimemapParams *params); + /** + * Return (and possibly add) an entry for the given time. + */ + TimemapEntry &GetEntry(double time) { return m_map[time]; } + /** * Write the current timemap to a JSON string */ diff --git a/src/midifunctor.cpp b/src/midifunctor.cpp index ddee53dc13..0ad8defa18 100644 --- a/src/midifunctor.cpp +++ b/src/midifunctor.cpp @@ -24,6 +24,7 @@ #include "tempo.h" #include "text.h" #include "tie.h" +#include "timemap.h" #include "tuplet.h" #include "verse.h" #include "vrv.h" @@ -861,4 +862,128 @@ void GenerateMIDIFunctor::GenerateGraceNoteMIDI( } } +//---------------------------------------------------------------------------- +// GenerateTimemapFunctor +//---------------------------------------------------------------------------- + +GenerateTimemapFunctor::GenerateTimemapFunctor(Timemap *timemap) +{ + m_scoreTimeOffset = 0.0; + m_realTimeOffsetMilliseconds = 0.0; + m_currentTempo = MIDI_TEMPO; + m_cueExclusion = false; + m_timemap = timemap; +} + +FunctorCode GenerateTimemapFunctor::VisitLayerElement(const LayerElement *layerElement) +{ + if (layerElement->IsScoreDefElement()) return FUNCTOR_SIBLINGS; + + // Only resolve simple sameas links to avoid infinite recursion + const LayerElement *sameas = dynamic_cast(layerElement->GetSameasLink()); + if (sameas && !sameas->HasSameasLink()) { + sameas->Process(*this); + } + + return FUNCTOR_CONTINUE; +} + +FunctorCode GenerateTimemapFunctor::VisitMeasure(const Measure *measure) +{ + m_scoreTimeOffset = measure->GetLastTimeOffset(); + m_realTimeOffsetMilliseconds = measure->GetLastRealTimeOffset(); + m_currentTempo = measure->GetCurrentTempo(); + + this->AddTimemapEntry(measure); + + return FUNCTOR_CONTINUE; +} + +FunctorCode GenerateTimemapFunctor::VisitNote(const Note *note) +{ + if (note->HasGrace()) return FUNCTOR_SIBLINGS; + + // Skip cue notes when midiNoCue is activated + if ((note->GetCue() == BOOLEAN_true) && m_cueExclusion) { + return FUNCTOR_SIBLINGS; + } + + note = dynamic_cast(note->ThisOrSameasLink()); + assert(note); + + this->AddTimemapEntry(note); + + return FUNCTOR_SIBLINGS; +} + +FunctorCode GenerateTimemapFunctor::VisitRest(const Rest *rest) +{ + this->AddTimemapEntry(rest); + + return FUNCTOR_SIBLINGS; +} + +void GenerateTimemapFunctor::AddTimemapEntry(const Object *object) +{ + assert(object); + + if (object->Is({ NOTE, REST })) { + const DurationInterface *interface = object->GetDurationInterface(); + assert(interface); + + double realTimeStart = round(m_realTimeOffsetMilliseconds + interface->GetRealTimeOnsetMilliseconds()); + double scoreTimeStart = m_scoreTimeOffset + interface->GetScoreTimeOnset(); + + double realTimeEnd = round(m_realTimeOffsetMilliseconds + interface->GetRealTimeOffsetMilliseconds()); + double scoreTimeEnd = m_scoreTimeOffset + interface->GetScoreTimeOffset(); + + bool isRest = (object->Is(REST)); + + /*********** start values ***********/ + + TimemapEntry &startEntry = m_timemap->GetEntry(realTimeStart); + + // Should check if value for realTimeStart already exists and if so, then + // ensure that it is equal to scoreTimeStart: + startEntry.qstamp = scoreTimeStart; + + // Store the element ID in list to turn on at given time - note or rest + if (!isRest) startEntry.notesOn.push_back(object->GetID()); + if (isRest) startEntry.restsOn.push_back(object->GetID()); + + // Also add the tempo + startEntry.tempo = m_currentTempo; + + /*********** end values ***********/ + + TimemapEntry &endEntry = m_timemap->GetEntry(realTimeEnd); + + // Should check if value for realTimeEnd already exists and if so, then + // ensure that it is equal to scoreTimeEnd: + endEntry.qstamp = scoreTimeEnd; + + // Store the element ID in list to turn off at given time - notes or rest + if (!isRest) endEntry.notesOff.push_back(object->GetID()); + if (isRest) endEntry.restsOff.push_back(object->GetID()); + } + else if (object->Is(MEASURE)) { + + const Measure *measure = vrv_cast(object); + assert(measure); + + // Deal with repeated music later, for now get the last times. + double scoreTimeStart = m_scoreTimeOffset; + double realTimeStart = round(m_realTimeOffsetMilliseconds); + + TimemapEntry &startEntry = m_timemap->GetEntry(realTimeStart); + + // Should check if value for realTimeStart already exists and if so, then + // ensure that it is equal to scoreTimeStart: + startEntry.qstamp = scoreTimeStart; + + // Add the measureOn + startEntry.measureOn = measure->GetID(); + } +} + } // namespace vrv From e2a0cf7fe56cbe205eac2f31251820f384219aa3 Mon Sep 17 00:00:00 2001 From: David Bauer Date: Fri, 5 May 2023 08:46:35 +0200 Subject: [PATCH 033/151] Check if child was actually added --- src/iomusxml.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/iomusxml.cpp b/src/iomusxml.cpp index 596bd23154..e53893dee8 100644 --- a/src/iomusxml.cpp +++ b/src/iomusxml.cpp @@ -425,6 +425,9 @@ void MusicXmlInput::AddLayerElement(Layer *layer, LayerElement *element, int dur else { m_elementStackMap.at(layer).back()->AddChild(element); } + // Recheck if AddChild was successful + if (!element->GetParent()) return; + m_layerEndTimes[layer] = m_durTotal + duration; if (!element->Is({ BEAM, TUPLET })) { m_layerTimes[layer].emplace(m_durTotal + duration, element); From 45e737e69f6c7bf78b3e13e9ae86f3bc7ba6677f Mon Sep 17 00:00:00 2001 From: David Bauer Date: Fri, 5 May 2023 14:36:08 +0200 Subject: [PATCH 034/151] Keep mismatched measure alive --- src/iomusxml.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/iomusxml.cpp b/src/iomusxml.cpp index e53893dee8..5ae5145ae2 100644 --- a/src/iomusxml.cpp +++ b/src/iomusxml.cpp @@ -382,6 +382,9 @@ bool MusicXmlInput::AddMeasure(Section *section, Measure *measure, int i) } else { LogError("MusicXML import: Mismatching measure number %s", measure->GetN().c_str()); + + // Keep the measure alive as ghost. Its content was not transferred, so we cannot delete it. + return true; } contentMeasure = existingMeasure; } From e6135c86fc099ced63f55b0a7950e6e5b082f471 Mon Sep 17 00:00:00 2001 From: David Bauer Date: Fri, 5 May 2023 16:35:04 +0200 Subject: [PATCH 035/151] Apply GenerateTimemap and cleanup --- include/vrv/functorparams.h | 32 --------------- include/vrv/layerelement.h | 5 --- include/vrv/measure.h | 5 --- include/vrv/midifunctor.h | 5 +++ include/vrv/note.h | 5 --- include/vrv/object.h | 5 --- include/vrv/rest.h | 5 --- include/vrv/timemap.h | 7 ---- src/doc.cpp | 7 ++-- src/layerelement.cpp | 16 -------- src/measure.cpp | 15 ------- src/note.cpp | 21 ---------- src/rest.cpp | 11 ------ src/timemap.cpp | 79 ------------------------------------- 14 files changed, 8 insertions(+), 210 deletions(-) diff --git a/include/vrv/functorparams.h b/include/vrv/functorparams.h index 2a845c700c..4e5a4117fe 100644 --- a/include/vrv/functorparams.h +++ b/include/vrv/functorparams.h @@ -138,38 +138,6 @@ class GenerateFeaturesParams : public FunctorParams { FeatureExtractor *m_extractor; }; -//---------------------------------------------------------------------------- -// GenerateTimemapParams -//---------------------------------------------------------------------------- - -/** - * member 0: Score time from the start of the piece to previous barline in quarter notes - * member 1: Real time from the start of the piece to previous barline in ms - * member 2: Currently active tempo - * member 3: flag indicating whether cue notes should be included - * member 4: a pointer to the Timemap - * member 5: the functor for redirection - **/ - -class GenerateTimemapParams : public FunctorParams { -public: - GenerateTimemapParams(Timemap *timemap, Functor *functor) - { - m_scoreTimeOffset = 0.0; - m_realTimeOffsetMilliseconds = 0; - m_currentTempo = MIDI_TEMPO; - m_cueExclusion = false; - m_timemap = timemap; - m_functor = functor; - } - double m_scoreTimeOffset; - double m_realTimeOffsetMilliseconds; - double m_currentTempo; - bool m_cueExclusion; - Timemap *m_timemap; - Functor *m_functor; -}; - //---------------------------------------------------------------------------- // TransposeParams //---------------------------------------------------------------------------- diff --git a/include/vrv/layerelement.h b/include/vrv/layerelement.h index f3e21d664d..9423a7f2a2 100644 --- a/include/vrv/layerelement.h +++ b/include/vrv/layerelement.h @@ -338,11 +338,6 @@ class LayerElement : public Object, FunctorCode AcceptEnd(ConstFunctor &functor) const override; ///@} - /** - * See Object::GenerateTimemap - */ - int GenerateTimemap(FunctorParams *functorParams) override; - protected: /** * Helper to figure whether two chords are in fully in unison based on the locations of the notes. diff --git a/include/vrv/measure.h b/include/vrv/measure.h index e3b665d4d8..476c404819 100644 --- a/include/vrv/measure.h +++ b/include/vrv/measure.h @@ -345,11 +345,6 @@ class Measure : public Object, FunctorCode AcceptEnd(ConstFunctor &functor) const override; ///@} - /** - * See Object::GenerateTimemap - */ - int GenerateTimemap(FunctorParams *functorParams) override; - public: // flags for drawing measure barline based on visibility or other conditions enum BarlineDrawingFlags { diff --git a/include/vrv/midifunctor.h b/include/vrv/midifunctor.h index 12973a781b..4032f1e38d 100644 --- a/include/vrv/midifunctor.h +++ b/include/vrv/midifunctor.h @@ -380,6 +380,11 @@ class GenerateTimemapFunctor : public ConstFunctor { */ bool ImplementsEndInterface() const override { return false; } + /* + * Set the cue exclusion flag + */ + void SetCueExclusion(bool cueExclusion) { m_cueExclusion = cueExclusion; } + /* * Functor interface */ diff --git a/include/vrv/note.h b/include/vrv/note.h index ba44908b5f..1498e76210 100644 --- a/include/vrv/note.h +++ b/include/vrv/note.h @@ -296,11 +296,6 @@ class Note : public LayerElement, FunctorCode AcceptEnd(ConstFunctor &functor) const override; ///@} - /** - * See Object::GenerateTimemap - */ - int GenerateTimemap(FunctorParams *functorParams) override; - /** * See Object::Transpose */ diff --git a/include/vrv/object.h b/include/vrv/object.h index 5bfc5664fb..608a8699ee 100644 --- a/include/vrv/object.h +++ b/include/vrv/object.h @@ -692,11 +692,6 @@ class Object : public BoundingBox { */ ///@{ - /** - * Export the object to a JSON timemap file. - */ - virtual int GenerateTimemap(FunctorParams *) { return FUNCTOR_CONTINUE; } - /** * Export the object to a JSON feature file. */ diff --git a/include/vrv/rest.h b/include/vrv/rest.h index ba3b71020d..57b174e50c 100644 --- a/include/vrv/rest.h +++ b/include/vrv/rest.h @@ -110,11 +110,6 @@ class Rest : public LayerElement, */ int Transpose(FunctorParams *functorParams) override; - /** - * See Object::GenerateTimemap - */ - int GenerateTimemap(FunctorParams *functorParams) override; - private: /** * Helper function to update rest oloc/ploc based on the input TransPitch diff --git a/include/vrv/timemap.h b/include/vrv/timemap.h index ebdb1ad962..2545af4fca 100644 --- a/include/vrv/timemap.h +++ b/include/vrv/timemap.h @@ -18,7 +18,6 @@ namespace vrv { class Object; -class GenerateTimemapParams; //---------------------------------------------------------------------------- // TimemapEntry @@ -57,12 +56,6 @@ class Timemap { /** Resets the timemap */ void Reset(); - /** - * Add an entry to the timemap. - * Currently support note and rest (duration interfaces) and measure. - */ - void AddEntry(Object *object, GenerateTimemapParams *params); - /** * Return (and possibly add) an entry for the given time. */ diff --git a/src/doc.cpp b/src/doc.cpp index 0582b80c1e..4fa2a02aba 100644 --- a/src/doc.cpp +++ b/src/doc.cpp @@ -519,10 +519,9 @@ bool Doc::ExportTimemap(std::string &output, bool includeRests, bool includeMeas return false; } Timemap timemap; - Functor generateTimemap(&Object::GenerateTimemap); - GenerateTimemapParams generateTimemapParams(&timemap, &generateTimemap); - generateTimemapParams.m_cueExclusion = this->GetOptions()->m_midiNoCue.GetValue(); - this->Process(&generateTimemap, &generateTimemapParams); + GenerateTimemapFunctor generateTimemap(&timemap); + generateTimemap.SetCueExclusion(this->GetOptions()->m_midiNoCue.GetValue()); + this->Process(generateTimemap); timemap.ToJson(output, includeRests, includeMeasures); diff --git a/src/layerelement.cpp b/src/layerelement.cpp index f6a499eaf5..8792d01f90 100644 --- a/src/layerelement.cpp +++ b/src/layerelement.cpp @@ -1315,20 +1315,4 @@ std::pair LayerElement::CalcElementHorizontalOverlap(const Doc *doc, return { shift, isInUnison }; } -int LayerElement::GenerateTimemap(FunctorParams *functorParams) -{ - GenerateTimemapParams *params = vrv_params_cast(functorParams); - assert(params); - - if (this->IsScoreDefElement()) return FUNCTOR_SIBLINGS; - - // Only resolve simple sameas links to avoid infinite recursion - LayerElement *sameas = dynamic_cast(this->GetSameasLink()); - if (sameas && !sameas->HasSameasLink()) { - sameas->Process(params->m_functor, functorParams); - } - - return FUNCTOR_CONTINUE; -} - } // namespace vrv diff --git a/src/measure.cpp b/src/measure.cpp index 1e0de0fc96..965a4b1dbc 100644 --- a/src/measure.cpp +++ b/src/measure.cpp @@ -40,7 +40,6 @@ #include "tempo.h" #include "tie.h" #include "timeinterface.h" -#include "timemap.h" #include "timestamp.h" #include "vrv.h" @@ -728,18 +727,4 @@ FunctorCode Measure::AcceptEnd(ConstFunctor &functor) const return functor.VisitMeasureEnd(this); } -int Measure::GenerateTimemap(FunctorParams *functorParams) -{ - GenerateTimemapParams *params = vrv_params_cast(functorParams); - assert(params); - - params->m_scoreTimeOffset = this->m_scoreTimeOffset.back(); - params->m_realTimeOffsetMilliseconds = this->m_realTimeOffsetMilliseconds.back(); - params->m_currentTempo = this->m_currentTempo; - - params->m_timemap->AddEntry(this, params); - - return FUNCTOR_CONTINUE; -} - } // namespace vrv diff --git a/src/note.cpp b/src/note.cpp index 416a0453ea..a063d38498 100644 --- a/src/note.cpp +++ b/src/note.cpp @@ -34,7 +34,6 @@ #include "syl.h" #include "tabgrp.h" #include "tie.h" -#include "timemap.h" #include "tuning.h" #include "verse.h" #include "vrv.h" @@ -848,26 +847,6 @@ MapOfDotLocs Note::CalcDotLocations(int layerCount, bool primary) const return dotLocs; } -int Note::GenerateTimemap(FunctorParams *functorParams) -{ - GenerateTimemapParams *params = vrv_params_cast(functorParams); - assert(params); - - if (this->HasGrace()) return FUNCTOR_SIBLINGS; - - // Skip cue notes when midiNoCue is activated - if (this->GetCue() == BOOLEAN_true && params->m_cueExclusion) { - return FUNCTOR_SIBLINGS; - } - - Note *note = vrv_cast(this->ThisOrSameasLink()); - assert(note); - - params->m_timemap->AddEntry(note, params); - - return FUNCTOR_SIBLINGS; -} - int Note::Transpose(FunctorParams *functorParams) { TransposeParams *params = vrv_params_cast(functorParams); diff --git a/src/rest.cpp b/src/rest.cpp index ad64cbffee..d43341e32a 100644 --- a/src/rest.cpp +++ b/src/rest.cpp @@ -24,7 +24,6 @@ #include "smufl.h" #include "staff.h" #include "system.h" -#include "timemap.h" #include "transposition.h" #include "vrv.h" @@ -640,14 +639,4 @@ int Rest::Transpose(FunctorParams *functorParams) return FUNCTOR_SIBLINGS; } -int Rest::GenerateTimemap(FunctorParams *functorParams) -{ - GenerateTimemapParams *params = vrv_params_cast(functorParams); - assert(params); - - params->m_timemap->AddEntry(this, params); - - return FUNCTOR_SIBLINGS; -} - } // namespace vrv diff --git a/src/timemap.cpp b/src/timemap.cpp index a9d14cc58a..8630131f24 100644 --- a/src/timemap.cpp +++ b/src/timemap.cpp @@ -37,85 +37,6 @@ void Timemap::Reset() m_map.clear(); } -void Timemap::AddEntry(Object *object, GenerateTimemapParams *params) -{ - assert(object); - assert(params); - - // It is a bit weird to have a timemap parameter, but we need it to call this method from the functor. - // Just make sure they are the same because below we use m_map (and not params->m_timemap) - assert(params->m_timemap == this); - - TimemapEntry emptyEntry; - - if (object->Is({ NOTE, REST })) { - DurationInterface *interface = object->GetDurationInterface(); - assert(interface); - - double realTimeStart = round(params->m_realTimeOffsetMilliseconds + interface->GetRealTimeOnsetMilliseconds()); - double scoreTimeStart = params->m_scoreTimeOffset + interface->GetScoreTimeOnset(); - - double realTimeEnd = round(params->m_realTimeOffsetMilliseconds + interface->GetRealTimeOffsetMilliseconds()); - double scoreTimeEnd = params->m_scoreTimeOffset + interface->GetScoreTimeOffset(); - - bool isRest = (object->Is(REST)); - - /*********** start values ***********/ - - if (m_map.count(realTimeStart) == 0) { - m_map[realTimeStart] = emptyEntry; - } - TimemapEntry *startEntry = &m_map.at(realTimeStart); - - // Should check if value for realTimeStart already exists and if so, then - // ensure that it is equal to scoreTimeStart: - startEntry->qstamp = scoreTimeStart; - - // Store the element ID in list to turn on at given time - note or rest - if (!isRest) startEntry->notesOn.push_back(object->GetID()); - if (isRest) startEntry->restsOn.push_back(object->GetID()); - - // Also add the tempo the - startEntry->tempo = params->m_currentTempo; - - /*********** end values ***********/ - - if (m_map.count(realTimeEnd) == 0) { - m_map[realTimeEnd] = emptyEntry; - } - TimemapEntry *endEntry = &m_map.at(realTimeEnd); - - // Should check if value for realTimeEnd already exists and if so, then - // ensure that it is equal to scoreTimeEnd: - endEntry->qstamp = scoreTimeEnd; - - // Store the element ID in list to turn off at given time - notes or rest - if (!isRest) endEntry->notesOff.push_back(object->GetID()); - if (isRest) endEntry->restsOff.push_back(object->GetID()); - } - else if (object->Is(MEASURE)) { - - Measure *measure = vrv_cast(object); - assert(measure); - - // Deal with repeated music later, for now get the last times. - double scoreTimeStart = params->m_scoreTimeOffset; - double realTimeStart = round(params->m_realTimeOffsetMilliseconds); - - if (m_map.count(realTimeStart) == 0) { - m_map[realTimeStart] = emptyEntry; - } - TimemapEntry *startEntry = &m_map.at(realTimeStart); - - // Should check if value for realTimeStart already exists and if so, then - // ensure that it is equal to scoreTimeStart: - startEntry->qstamp = scoreTimeStart; - - // Add the measureOn - startEntry->measureOn = measure->GetID(); - } -} - void Timemap::ToJson(std::string &output, bool includeRests, bool includeMeasures) { double currentTempo = -1000.0; From a772b7f13f6126503d8c0b3ae718fc86197e0b80 Mon Sep 17 00:00:00 2001 From: Klaus Rettinghaus Date: Fri, 5 May 2023 17:30:54 +0200 Subject: [PATCH 036/151] support diamond shape enclosing --- src/view_control.cpp | 8 ++++++-- src/view_text.cpp | 2 +- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/src/view_control.cpp b/src/view_control.cpp index 82f3ed9121..3df0130b4c 100644 --- a/src/view_control.cpp +++ b/src/view_control.cpp @@ -2952,13 +2952,17 @@ void View::DrawTextEnclosure(DeviceContext *dc, const TextDrawingParams ¶ms, int x2 = rend->GetContentRight() + margin; int y1 = rend->GetContentBottom() - margin / 2; int y2 = rend->GetContentTop() + margin; + const int width = std::abs(x2 - x1); + const int height = std::abs(y2 - y1); if (params.m_enclose == TEXTRENDITION_box) { this->DrawNotFilledRectangle(dc, x1, y1, x2, y2, lineThickness, 0); } + else if (params.m_enclose == TEXTRENDITION_dbox) { + const int yCenter = y1 + (y2 - y1) / 2; + this->DrawDiamond(dc, x1 - width / 2, yCenter, height * sqrt(2), width * 2, false, lineThickness); + } else if (params.m_enclose == TEXTRENDITION_circle) { - const int width = std::abs(x2 - x1); - const int height = std::abs(y2 - y1); if (width > height) { y1 -= (width - height) / 2; y2 += (width - height) / 2; diff --git a/src/view_text.cpp b/src/view_text.cpp index 470f0ab7fe..1e12e1625b 100644 --- a/src/view_text.cpp +++ b/src/view_text.cpp @@ -449,7 +449,7 @@ void View::DrawRend(DeviceContext *dc, Rend *rend, TextDrawingParams ¶ms) // Do not render the box or circle if the content is empty if (rend->HasContentBB()) { - if ((rend->GetRend() == TEXTRENDITION_box) || (rend->GetRend() == TEXTRENDITION_circle)) { + if (rend->HasRend()) { params.m_enclosedRend.push_back(rend); params.m_x = rend->GetContentRight() + m_doc->GetDrawingUnit(100); params.m_explicitPosition = true; From 9c73088615790d7e21e9e9ea970adae033e22ca7 Mon Sep 17 00:00:00 2001 From: David Bauer Date: Fri, 5 May 2023 21:51:12 +0200 Subject: [PATCH 037/151] Add GenerateFeatures --- include/vrv/featureextractor.h | 5 ++--- include/vrv/midifunctor.h | 41 ++++++++++++++++++++++++++++++++++ src/featureextractor.cpp | 14 +++++++----- src/midifunctor.cpp | 17 ++++++++++++++ src/object.cpp | 2 +- 5 files changed, 69 insertions(+), 10 deletions(-) diff --git a/include/vrv/featureextractor.h b/include/vrv/featureextractor.h index 0a595c7eeb..0c049af5ec 100644 --- a/include/vrv/featureextractor.h +++ b/include/vrv/featureextractor.h @@ -10,7 +10,6 @@ //---------------------------------------------------------------------------- -#include "functorparams.h" #include "options.h" //---------------------------------------------------------------------------- @@ -39,7 +38,7 @@ class FeatureExtractor { /** * Extract a feature for the object */ - void Extract(Object *object, GenerateFeaturesParams *params); + void Extract(const Object *object); /** * Write the current content of the extractor to a JSON string @@ -53,7 +52,7 @@ class FeatureExtractor { * A list of previous notes for interval calculation. * Usually one note, but sometimes more than one with tied notes. */ - std::list m_previousNotes; + std::list m_previousNotes; jsonxx::Array m_pitchesChromatic; jsonxx::Array m_pitchesDiatonic; diff --git a/include/vrv/midifunctor.h b/include/vrv/midifunctor.h index 4032f1e38d..e008b55aba 100644 --- a/include/vrv/midifunctor.h +++ b/include/vrv/midifunctor.h @@ -16,6 +16,7 @@ class MidiFile; namespace vrv { +class FeatureExtractor; class Timemap; //---------------------------------------------------------------------------- @@ -418,6 +419,46 @@ class GenerateTimemapFunctor : public ConstFunctor { Timemap *m_timemap; }; +//---------------------------------------------------------------------------- +// GenerateFeaturesFunctor +//---------------------------------------------------------------------------- + +/** + * This class exports the object to a JSON feature file. + */ +class GenerateFeaturesFunctor : public ConstFunctor { +public: + /** + * @name Constructors, destructors + */ + ///@{ + GenerateFeaturesFunctor(FeatureExtractor *extractor); + virtual ~GenerateFeaturesFunctor() = default; + ///@} + + /* + * Abstract base implementation + */ + bool ImplementsEndInterface() const override { return false; } + + /* + * Functor interface + */ + ///@{ + FunctorCode VisitObject(const Object *object) override; + ///@} + +protected: + // +private: + // +public: + // +private: + // The FeatureExtractor to which extraction is delegated + FeatureExtractor *m_extractor; +}; + } // namespace vrv #endif // __VRV_MIDIFUNCTOR_H__ diff --git a/src/featureextractor.cpp b/src/featureextractor.cpp index 06fa4b40d1..bf9ccfc8cf 100644 --- a/src/featureextractor.cpp +++ b/src/featureextractor.cpp @@ -47,15 +47,15 @@ void FeatureExtractor::Reset() m_previousNotes.clear(); } -void FeatureExtractor::Extract(Object *object, GenerateFeaturesParams *params) +void FeatureExtractor::Extract(const Object *object) { if (object->Is(NOTE)) { - Note *note = vrv_cast(object); + const Note *note = vrv_cast(object); assert(note); // Check if the note is part of a chord and return if it is not its top one - Chord *chord = note->IsChordTone(); - if (chord && note != chord->GetTopNote()) return; + const Chord *chord = note->IsChordTone(); + if (chord && (note != chord->GetTopNote())) return; // Check if the note is tied to a previous one and skip it if yes if (note->GetScoreTimeTiedDuration() == -1.0) { @@ -75,7 +75,7 @@ void FeatureExtractor::Extract(Object *object, GenerateFeaturesParams *params) int signCount = (oct > 3) ? (oct - 3) : (4 - oct); pitch << std::string(signCount, octSign); - Accid *accid = vrv_cast(note->FindDescendantByType(ACCID)); + const Accid *accid = vrv_cast(note->FindDescendantByType(ACCID)); if (accid) { // We need to check both written and gestural accidentals std::string accidStrWritten; @@ -130,7 +130,9 @@ void FeatureExtractor::Extract(Object *object, GenerateFeaturesParams *params) = StringFormat("%d", note->GetDiatonicPitch() - m_previousNotes.front()->GetDiatonicPitch()); m_intervalsDiatonic << intervalDiatonicStr; jsonxx::Array intervalsIds; - for (Note *previousNote : m_previousNotes) intervalsIds << previousNote->GetID(); + for (const Note *previousNote : m_previousNotes) { + intervalsIds << previousNote->GetID(); + } intervalsIds << note->GetID(); m_intervalsIds << jsonxx::Value(intervalsIds); } diff --git a/src/midifunctor.cpp b/src/midifunctor.cpp index 0ad8defa18..b4814a380b 100644 --- a/src/midifunctor.cpp +++ b/src/midifunctor.cpp @@ -12,6 +12,7 @@ #include "arpeg.h" #include "beatrpt.h" #include "btrem.h" +#include "featureextractor.h" #include "ftrem.h" #include "gracegrp.h" #include "layer.h" @@ -986,4 +987,20 @@ void GenerateTimemapFunctor::AddTimemapEntry(const Object *object) } } +//---------------------------------------------------------------------------- +// GenerateFeaturesFunctor +//---------------------------------------------------------------------------- + +GenerateFeaturesFunctor::GenerateFeaturesFunctor(FeatureExtractor *extractor) +{ + m_extractor = extractor; +} + +FunctorCode GenerateFeaturesFunctor::VisitObject(const Object *object) +{ + m_extractor->Extract(object); + + return FUNCTOR_CONTINUE; +} + } // namespace vrv diff --git a/src/object.cpp b/src/object.cpp index 7229093865..7a2deb4ed7 100644 --- a/src/object.cpp +++ b/src/object.cpp @@ -1793,7 +1793,7 @@ int Object::GenerateFeatures(FunctorParams *functorParams) GenerateFeaturesParams *params = vrv_params_cast(functorParams); assert(params); - params->m_extractor->Extract(this, params); + params->m_extractor->Extract(this); return FUNCTOR_CONTINUE; } From 0dc85d7974fb1c093776f61ebf7440c449fb78b6 Mon Sep 17 00:00:00 2001 From: David Bauer Date: Fri, 5 May 2023 22:01:04 +0200 Subject: [PATCH 038/151] Apply GenerateFeatures and cleanup --- include/vrv/functorparams.h | 20 -------------------- include/vrv/object.h | 12 ------------ src/doc.cpp | 5 ++--- src/object.cpp | 14 -------------- 4 files changed, 2 insertions(+), 49 deletions(-) diff --git a/include/vrv/functorparams.h b/include/vrv/functorparams.h index 4e5a4117fe..7c3c49179f 100644 --- a/include/vrv/functorparams.h +++ b/include/vrv/functorparams.h @@ -118,26 +118,6 @@ class FindLayerIDWithinStaffDefParams : public FunctorParams { std::string m_id; }; -//---------------------------------------------------------------------------- -// GenerateFeaturesParams -//---------------------------------------------------------------------------- - -/** - * member 0: a pointer to the Doc - * member 1: a pointer to the FeatureExtractor to which extraction is delegated - **/ - -class GenerateFeaturesParams : public FunctorParams { -public: - GenerateFeaturesParams(Doc *doc, FeatureExtractor *extractor) - { - m_doc = doc; - m_extractor = extractor; - } - Doc *m_doc; - FeatureExtractor *m_extractor; -}; - //---------------------------------------------------------------------------- // TransposeParams //---------------------------------------------------------------------------- diff --git a/include/vrv/object.h b/include/vrv/object.h index 608a8699ee..5f35356d55 100644 --- a/include/vrv/object.h +++ b/include/vrv/object.h @@ -687,18 +687,6 @@ class Object : public BoundingBox { // Functors // //----------// - /** - * @name Functors for generating MIDI output. - */ - ///@{ - - /** - * Export the object to a JSON feature file. - */ - virtual int GenerateFeatures(FunctorParams *functorParams); - - ///@} - /** * Transpose the content. */ diff --git a/src/doc.cpp b/src/doc.cpp index 4fa2a02aba..d8e5441eae 100644 --- a/src/doc.cpp +++ b/src/doc.cpp @@ -550,9 +550,8 @@ bool Doc::ExportFeatures(std::string &output, const std::string &options) return false; } FeatureExtractor extractor(options); - Functor generateFeatures(&Object::GenerateFeatures); - GenerateFeaturesParams generateFeaturesParams(this, &extractor); - this->Process(&generateFeatures, &generateFeaturesParams); + GenerateFeaturesFunctor generateFeatures(&extractor); + this->Process(generateFeatures); extractor.ToJson(output); return true; diff --git a/src/object.cpp b/src/object.cpp index 7a2deb4ed7..bf76fde886 100644 --- a/src/object.cpp +++ b/src/object.cpp @@ -1784,18 +1784,4 @@ void ObjectFactory::Register(std::string name, ClassId classId, std::function(functorParams); - assert(params); - - params->m_extractor->Extract(this); - - return FUNCTOR_CONTINUE; -} - } // namespace vrv From ec64ba999dbeed289f1b27e9b0b2d106a3867a90 Mon Sep 17 00:00:00 2001 From: David Bauer Date: Sat, 6 May 2023 18:20:25 +0200 Subject: [PATCH 039/151] Add Transpose skeleton --- Verovio.xcodeproj/project.pbxproj | 16 ++++++ include/vrv/transposefunctor.h | 80 ++++++++++++++++++++++++++++ src/transposefunctor.cpp | 86 +++++++++++++++++++++++++++++++ 3 files changed, 182 insertions(+) create mode 100644 include/vrv/transposefunctor.h create mode 100644 src/transposefunctor.cpp diff --git a/Verovio.xcodeproj/project.pbxproj b/Verovio.xcodeproj/project.pbxproj index 9d75cc5659..6fd57e1a04 100644 --- a/Verovio.xcodeproj/project.pbxproj +++ b/Verovio.xcodeproj/project.pbxproj @@ -1406,6 +1406,12 @@ E738716029CAFA9D00982DE5 /* calcligaturenoteposfunctor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E738715E29CAFA9500982DE5 /* calcligaturenoteposfunctor.cpp */; }; E738716129CAFA9D00982DE5 /* calcligaturenoteposfunctor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E738715E29CAFA9500982DE5 /* calcligaturenoteposfunctor.cpp */; }; E738716229CAFA9E00982DE5 /* calcligaturenoteposfunctor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E738715E29CAFA9500982DE5 /* calcligaturenoteposfunctor.cpp */; }; + E73E86252A069C640089DF74 /* transposefunctor.h in Headers */ = {isa = PBXBuildFile; fileRef = E73E86242A069C640089DF74 /* transposefunctor.h */; }; + E73E86262A069C640089DF74 /* transposefunctor.h in Headers */ = {isa = PBXBuildFile; fileRef = E73E86242A069C640089DF74 /* transposefunctor.h */; settings = {ATTRIBUTES = (Public, ); }; }; + E73E86282A069C920089DF74 /* transposefunctor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E73E86272A069C920089DF74 /* transposefunctor.cpp */; }; + E73E86292A069C920089DF74 /* transposefunctor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E73E86272A069C920089DF74 /* transposefunctor.cpp */; }; + E73E862A2A069C9C0089DF74 /* transposefunctor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E73E86272A069C920089DF74 /* transposefunctor.cpp */; }; + E73E862B2A069C9C0089DF74 /* transposefunctor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E73E86272A069C920089DF74 /* transposefunctor.cpp */; }; E741ACFF299A3D3400854426 /* calcslurdirectionfunctor.h in Headers */ = {isa = PBXBuildFile; fileRef = E741ACFE299A3D1D00854426 /* calcslurdirectionfunctor.h */; }; E741AD00299A3D3500854426 /* calcslurdirectionfunctor.h in Headers */ = {isa = PBXBuildFile; fileRef = E741ACFE299A3D1D00854426 /* calcslurdirectionfunctor.h */; settings = {ATTRIBUTES = (Public, ); }; }; E741AD02299A3D5B00854426 /* calcslurdirectionfunctor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E741AD01299A3D5B00854426 /* calcslurdirectionfunctor.cpp */; }; @@ -2155,6 +2161,8 @@ E7265E7029DC700800D11F41 /* castofffunctor.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = castofffunctor.cpp; path = src/castofffunctor.cpp; sourceTree = ""; }; E738715B29CAFA6700982DE5 /* calcligaturenoteposfunctor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = calcligaturenoteposfunctor.h; path = include/vrv/calcligaturenoteposfunctor.h; sourceTree = ""; }; E738715E29CAFA9500982DE5 /* calcligaturenoteposfunctor.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = calcligaturenoteposfunctor.cpp; path = src/calcligaturenoteposfunctor.cpp; sourceTree = ""; }; + E73E86242A069C640089DF74 /* transposefunctor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = transposefunctor.h; path = include/vrv/transposefunctor.h; sourceTree = ""; }; + E73E86272A069C920089DF74 /* transposefunctor.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = transposefunctor.cpp; path = src/transposefunctor.cpp; sourceTree = ""; }; E741ACFE299A3D1D00854426 /* calcslurdirectionfunctor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = calcslurdirectionfunctor.h; path = include/vrv/calcslurdirectionfunctor.h; sourceTree = ""; }; E741AD01299A3D5B00854426 /* calcslurdirectionfunctor.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = calcslurdirectionfunctor.cpp; path = src/calcslurdirectionfunctor.cpp; sourceTree = ""; }; E74A806028BC9111005274E7 /* findfunctor.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = findfunctor.cpp; path = src/findfunctor.cpp; sourceTree = ""; }; @@ -3005,6 +3013,8 @@ E7F1C36329F033FB007E12C1 /* savefunctor.h */, E7D3389C293E05A800C40B81 /* setscoredeffunctor.cpp */, E7D33899293E057100C40B81 /* setscoredeffunctor.h */, + E73E86272A069C920089DF74 /* transposefunctor.cpp */, + E73E86242A069C640089DF74 /* transposefunctor.h */, ); name = functors; sourceTree = ""; @@ -3332,6 +3342,7 @@ E7901659298BCA97008FDB4E /* calcalignmentxposfunctor.h in Headers */, BDEF9ECC26725248008A3A47 /* caesura.h in Headers */, E7ADB3AB29D1921300825D5D /* adjustarticfunctor.h in Headers */, + E73E86252A069C640089DF74 /* transposefunctor.h in Headers */, 4DEC4DD921C8295700D1D273 /* rdg.h in Headers */, 4DB3D8D01F83D11800B5FC2B /* mordent.h in Headers */, 4DACC9F02990F29A00B55913 /* atts_critapp.h in Headers */, @@ -3539,6 +3550,7 @@ 4DACC9EB2990F29A00B55913 /* attmodule.h in Headers */, BB4C4ABC22A932B6001F6AF0 /* instrdef.h in Headers */, BB4C4B7622A932D7001F6AF0 /* syl.h in Headers */, + E73E86262A069C640089DF74 /* transposefunctor.h in Headers */, BB4C4AEA22A932BC001F6AF0 /* del.h in Headers */, BB4C4B3422A932CF001F6AF0 /* tempo.h in Headers */, 4DACC9E12990F29A00B55913 /* attconverter.h in Headers */, @@ -3946,6 +3958,7 @@ 4D16941E1E3A44F300569BF4 /* note.cpp in Sources */, 4D27E13827F582BB00D64FBD /* docselection.cpp in Sources */, E74A806328BC911D005274E7 /* findfunctor.cpp in Sources */, + E73E862A2A069C9C0089DF74 /* transposefunctor.cpp in Sources */, E7908EA4298582DE0004C1F9 /* alignfunctor.cpp in Sources */, 4D16941F1E3A44F300569BF4 /* boundingbox.cpp in Sources */, 4D1694211E3A44F300569BF4 /* object.cpp in Sources */, @@ -4232,6 +4245,7 @@ 4DB0B0161C44129300DBDCC3 /* timestamp.cpp in Sources */, 4DEC4D9221C81E0B00D1D273 /* del.cpp in Sources */, 4D1BE76F1C688F5A0086DC0E /* MidiEventList.cpp in Sources */, + E73E862B2A069C9C0089DF74 /* transposefunctor.cpp in Sources */, 4DA20ED11D0F151900706C4A /* iohumdrum.cpp in Sources */, 8F086EFD188539540037FD8E /* rest.cpp in Sources */, 4D766EFC20ACAD63006875D8 /* view_neume.cpp in Sources */, @@ -4503,6 +4517,7 @@ E7D3389D293E05A800C40B81 /* setscoredeffunctor.cpp in Sources */, 4DA1448B1C2AB28700CB7CEE /* textelement.cpp in Sources */, 8F3DD35018854B2E0051330C /* positioninterface.cpp in Sources */, + E73E86282A069C920089DF74 /* transposefunctor.cpp in Sources */, 4DB3D8ED1F83D18C00B5FC2B /* space.cpp in Sources */, 4D27E13927F582BB00D64FBD /* docselection.cpp in Sources */, E7908EA22985829F0004C1F9 /* alignfunctor.cpp in Sources */, @@ -4782,6 +4797,7 @@ BB4C4B7D22A932D7001F6AF0 /* verse.cpp in Sources */, BB4C4B5122A932D7001F6AF0 /* ftrem.cpp in Sources */, BB4C4AEF22A932BC001F6AF0 /* lem.cpp in Sources */, + E73E86292A069C920089DF74 /* transposefunctor.cpp in Sources */, BB4C4AD522A932B6001F6AF0 /* staffgrp.cpp in Sources */, BB4C4B2D22A932CF001F6AF0 /* octave.cpp in Sources */, BB4C4BA922A932EB001F6AF0 /* view.cpp in Sources */, diff --git a/include/vrv/transposefunctor.h b/include/vrv/transposefunctor.h new file mode 100644 index 0000000000..3efe7f47cb --- /dev/null +++ b/include/vrv/transposefunctor.h @@ -0,0 +1,80 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: transposefunctor.h +// Author: David Bauer +// Created: 2023 +// Copyright (c) Authors and others. All rights reserved. +///////////////////////////////////////////////////////////////////////////// + +#ifndef __VRV_TRANSPOSEFUNCTOR_H__ +#define __VRV_TRANSPOSEFUNCTOR_H__ + +#include "functor.h" + +namespace vrv { + +//---------------------------------------------------------------------------- +// TransposeFunctor +//---------------------------------------------------------------------------- + +/** + * This class transposes the content. + */ +class TransposeFunctor : public DocFunctor { +public: + /** + * @name Constructors, destructors + */ + ///@{ + TransposeFunctor(Doc *doc, Transposer *transposer); + virtual ~TransposeFunctor() = default; + ///@} + + /* + * Abstract base implementation + */ + bool ImplementsEndInterface() const override { return true; } + + /* + * Functor interface + */ + ///@{ + FunctorCode VisitHarm(Harm *harm) override; + FunctorCode VisitKeySig(KeySig *keySig) override; + FunctorCode VisitMdiv(Mdiv *mdiv) override; + FunctorCode VisitNote(Note *note) override; + FunctorCode VisitPageMilestone(PageMilestoneEnd *pageMilestoneEnd) override; + FunctorCode VisitRest(Rest *rest) override; + FunctorCode VisitScore(Score *score) override; + FunctorCode VisitScoreDef(ScoreDef *scoreDef) override; + FunctorCode VisitScoreDefEnd(ScoreDef *scoreDef) override; + FunctorCode VisitStaff(Staff *staff) override; + FunctorCode VisitStaffDef(StaffDef *staffDef) override; + FunctorCode VisitSystem(System *system) override; + ///@} + +protected: + // +private: + // +public: + // +private: + // The transposer + Transposer *m_transposer; + // The transposition to be applied + std::string m_transposition; + // The mdiv selected for transposition + std::string m_selectedMdivID; + // The list of current (nested) mdivs + std::list m_currentMdivIDs; + // Transpose to sounding pitch by evaluating @trans.semi ? + bool m_transposeToSoundingPitch; + // The current KeySig for staffN (ScoreDef key signatures are mapped to -1) + std::map m_keySigForStaffN; + // The transposition interval for staffN + std::map m_transposeIntervalForStaffN; +}; + +} // namespace vrv + +#endif // __VRV_TRANSPOSEFUNCTOR_H__ diff --git a/src/transposefunctor.cpp b/src/transposefunctor.cpp new file mode 100644 index 0000000000..603d880e5f --- /dev/null +++ b/src/transposefunctor.cpp @@ -0,0 +1,86 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: transposefunctor.cpp +// Author: David Bauer +// Created: 2023 +// Copyright (c) Authors and others. All rights reserved. +///////////////////////////////////////////////////////////////////////////// + +#include "transposefunctor.h" + +//---------------------------------------------------------------------------- + +//---------------------------------------------------------------------------- + +namespace vrv { + +//---------------------------------------------------------------------------- +// TransposeFunctor +//---------------------------------------------------------------------------- + +TransposeFunctor::TransposeFunctor(Doc *doc, Transposer *transposer) : DocFunctor(doc) +{ + m_transposer = transposer; + m_transposeToSoundingPitch = false; +} + +FunctorCode TransposeFunctor::VisitHarm(Harm *harm) +{ + return FUNCTOR_CONTINUE; +} + +FunctorCode TransposeFunctor::VisitKeySig(KeySig *keySig) +{ + return FUNCTOR_CONTINUE; +} + +FunctorCode TransposeFunctor::VisitMdiv(Mdiv *mdiv) +{ + return FUNCTOR_CONTINUE; +} + +FunctorCode TransposeFunctor::VisitNote(Note *note) +{ + return FUNCTOR_CONTINUE; +} + +FunctorCode TransposeFunctor::VisitPageMilestone(PageMilestoneEnd *pageMilestoneEnd) +{ + return FUNCTOR_CONTINUE; +} + +FunctorCode TransposeFunctor::VisitRest(Rest *rest) +{ + return FUNCTOR_CONTINUE; +} + +FunctorCode TransposeFunctor::VisitScore(Score *score) +{ + return FUNCTOR_CONTINUE; +} + +FunctorCode TransposeFunctor::VisitScoreDef(ScoreDef *scoreDef) +{ + return FUNCTOR_CONTINUE; +} + +FunctorCode TransposeFunctor::VisitScoreDefEnd(ScoreDef *scoreDef) +{ + return FUNCTOR_CONTINUE; +} + +FunctorCode TransposeFunctor::VisitStaff(Staff *staff) +{ + return FUNCTOR_CONTINUE; +} + +FunctorCode TransposeFunctor::VisitStaffDef(StaffDef *staffDef) +{ + return FUNCTOR_CONTINUE; +} + +FunctorCode TransposeFunctor::VisitSystem(System *system) +{ + return FUNCTOR_CONTINUE; +} + +} // namespace vrv From dd5745f8631b3b9ccd5638bb4bfa5dd84d812478 Mon Sep 17 00:00:00 2001 From: David Bauer Date: Sat, 6 May 2023 21:16:53 +0200 Subject: [PATCH 040/151] Add Transpose implementation --- include/vrv/note.h | 12 +- include/vrv/rest.h | 10 +- src/transposefunctor.cpp | 287 ++++++++++++++++++++++++++++++++++++++- 3 files changed, 296 insertions(+), 13 deletions(-) diff --git a/include/vrv/note.h b/include/vrv/note.h index 1498e76210..14e46442a6 100644 --- a/include/vrv/note.h +++ b/include/vrv/note.h @@ -282,6 +282,14 @@ class Note : public LayerElement, */ static int PnameToPclass(data_PITCHNAME pitchName); + /** + * Get and set the pitch for transposition + */ + ///@{ + TransPitch GetTransPitch() const; + void UpdateFromTransPitch(const TransPitch &tp, bool hasKeySig); + ///@} + //----------// // Functors // //----------// @@ -320,10 +328,6 @@ class Note : public LayerElement, */ int GetChromaticAlteration() const; - TransPitch GetTransPitch() const; - - void UpdateFromTransPitch(const TransPitch &tp, bool hasKeySig); - public: // private: diff --git a/include/vrv/rest.h b/include/vrv/rest.h index 57b174e50c..e26cb7490b 100644 --- a/include/vrv/rest.h +++ b/include/vrv/rest.h @@ -91,6 +91,11 @@ class Rest : public LayerElement, */ int GetOptimalLayerLocation(const Staff *staff, const Layer *layer, int defaultLocation) const; + /** + * Update the rest location based on the input TransPitch + */ + void UpdateFromTransLoc(const TransPitch &tp); + //----------// // Functors // //----------// @@ -111,11 +116,6 @@ class Rest : public LayerElement, int Transpose(FunctorParams *functorParams) override; private: - /** - * Helper function to update rest oloc/ploc based on the input TransPitch - */ - void UpdateFromTransLoc(const TransPitch &tp); - /** * Get the rest vertical location relative to location of elements placed on other layers */ diff --git a/src/transposefunctor.cpp b/src/transposefunctor.cpp index 603d880e5f..70daae2e06 100644 --- a/src/transposefunctor.cpp +++ b/src/transposefunctor.cpp @@ -9,6 +9,15 @@ //---------------------------------------------------------------------------- +#include "harm.h" +#include "layer.h" +#include "mdiv.h" +#include "rest.h" +#include "score.h" +#include "staff.h" +#include "transposition.h" +#include "vrv.h" + //---------------------------------------------------------------------------- namespace vrv { @@ -25,61 +34,331 @@ TransposeFunctor::TransposeFunctor(Doc *doc, Transposer *transposer) : DocFuncto FunctorCode TransposeFunctor::VisitHarm(Harm *harm) { - return FUNCTOR_CONTINUE; + unsigned int position = 0; + TransPitch pitch; + if (harm->GetRootPitch(pitch, position)) { + m_transposer->Transpose(pitch); + harm->SetRootPitch(pitch, position); + } + + // Transpose bass notes (the "/F#" in "G#m7/F#") + if (harm->GetBassPitch(pitch)) { + m_transposer->Transpose(pitch); + harm->SetBassPitch(pitch); + } + + return FUNCTOR_SIBLINGS; } FunctorCode TransposeFunctor::VisitKeySig(KeySig *keySig) { - return FUNCTOR_CONTINUE; + // Store current KeySig + int staffN = -1; + const StaffDef *staffDef = vrv_cast(keySig->GetFirstAncestor(STAFFDEF)); + if (staffDef) { + staffN = staffDef->GetN(); + } + else { + const Staff *staff = keySig->GetAncestorStaff(ANCESTOR_ONLY, false); + if (staff) staffN = staff->GetN(); + } + m_keySigForStaffN[staffN] = keySig; + + // Transpose + const int sig = keySig->GetFifthsInt(); + + int intervalClass = m_transposer->CircleOfFifthsToIntervalClass(sig); + intervalClass = m_transposer->Transpose(intervalClass); + int fifths = m_transposer->IntervalToCircleOfFifths(intervalClass); + + if (fifths == INVALID_INTERVAL_CLASS) { + keySig->SetSig({ -1, ACCIDENTAL_WRITTEN_NONE }); + } + else if (fifths < 0) { + keySig->SetSig({ -fifths, ACCIDENTAL_WRITTEN_f }); + } + else if (fifths > 0) { + keySig->SetSig({ fifths, ACCIDENTAL_WRITTEN_s }); + } + else { + keySig->SetSig({ -1, ACCIDENTAL_WRITTEN_NONE }); + } + + // Also convert pname and accid attributes + if (keySig->HasPname()) { + TransPitch pitch = TransPitch(keySig->GetPname(), ACCIDENTAL_GESTURAL_NONE, keySig->GetAccid(), 4); + m_transposer->Transpose(pitch); + keySig->SetPname(pitch.GetPitchName()); + keySig->SetAccid(pitch.GetAccidW()); + } + + return FUNCTOR_SIBLINGS; } FunctorCode TransposeFunctor::VisitMdiv(Mdiv *mdiv) { + m_currentMdivIDs.push_back(mdiv->GetID()); + m_keySigForStaffN.clear(); + m_transposeIntervalForStaffN.clear(); + return FUNCTOR_CONTINUE; } FunctorCode TransposeFunctor::VisitNote(Note *note) { - return FUNCTOR_CONTINUE; + if (!note->HasPname()) return FUNCTOR_SIBLINGS; + + TransPitch pitch = note->GetTransPitch(); + m_transposer->Transpose(pitch); + + const int staffN = note->GetAncestorStaff(RESOLVE_CROSS_STAFF)->GetN(); + const bool hasKeySig = ((m_keySigForStaffN.count(staffN) > 0) || (m_keySigForStaffN.count(-1) > 0)); + note->UpdateFromTransPitch(pitch, hasKeySig); + + return FUNCTOR_SIBLINGS; } FunctorCode TransposeFunctor::VisitPageMilestone(PageMilestoneEnd *pageMilestoneEnd) { + if (pageMilestoneEnd->GetStart() && pageMilestoneEnd->GetStart()->Is(MDIV)) { + m_currentMdivIDs.pop_back(); + } + return FUNCTOR_CONTINUE; } FunctorCode TransposeFunctor::VisitRest(Rest *rest) { - return FUNCTOR_CONTINUE; + if ((!rest->HasOloc() || !rest->HasPloc()) && !rest->HasLoc()) return FUNCTOR_SIBLINGS; + + // Find whether current layer is top, middle (either one if multiple) or bottom + Staff *parentStaff = rest->GetAncestorStaff(); + Layer *parentLayer = vrv_cast(rest->GetFirstAncestor(LAYER)); + assert(parentLayer); + + ListOfObjects objects = parentStaff->FindAllDescendantsByType(LAYER, false); + const int layerCount = (int)objects.size(); + + Layer *firstLayer = vrv_cast(objects.front()); + Layer *lastLayer = vrv_cast(objects.back()); + + const bool isTopLayer = (firstLayer->GetN() == parentLayer->GetN()); + const bool isBottomLayer = (lastLayer->GetN() == parentLayer->GetN()); + + // transpose based on @oloc and @ploc + if (rest->HasOloc() && rest->HasPloc()) { + const TransPitch centralLocation(6, 0, 4); // middle location of the staff + TransPitch restLoc(rest->GetPloc() - PITCHNAME_c, 0, rest->GetOloc()); + m_transposer->Transpose(restLoc); + const bool isRestOnSpace = static_cast((restLoc.m_oct * 7 + restLoc.m_pname) % 2); + // on outer layers move rest on odd locations one line further + // in middle layers tolerate even locations to not risk collisions + if (layerCount > 1) { + if (isTopLayer && isRestOnSpace) { + ++restLoc; + } + else if (isBottomLayer && isRestOnSpace) { + --restLoc; + } + if ((isTopLayer && (restLoc < centralLocation)) || (isBottomLayer && (restLoc > centralLocation))) { + restLoc = centralLocation; + } + } + + rest->UpdateFromTransLoc(restLoc); + } + // transpose based on @loc + else if (rest->HasLoc()) { + constexpr int centralLocation = 4; + int transval = m_transposer->GetTranspositionIntervalClass(); + int diatonic; + int chromatic; + m_transposer->IntervalToDiatonicChromatic(diatonic, chromatic, transval); + int transposedLoc = rest->GetLoc() + diatonic; + // on outer layers move rest on odd locations one line further + // in middle layers tolerate even locations to not risk collisions + if (layerCount > 1) { + if (isTopLayer) + transposedLoc += abs(transposedLoc % 2); + else if (isBottomLayer) + transposedLoc -= abs(transposedLoc % 2); + if ((isTopLayer && (transposedLoc < centralLocation)) + || (isBottomLayer && (transposedLoc > centralLocation))) { + transposedLoc = centralLocation; + } + } + rest->SetLoc(transposedLoc); + } + + return FUNCTOR_SIBLINGS; } FunctorCode TransposeFunctor::VisitScore(Score *score) { + ScoreDef *scoreDef = score->GetScoreDef(); + + // Check whether we transpose to sounding pitch + if (m_transposeToSoundingPitch) { + // Evaluate functor on scoreDef + scoreDef->Process(*this); + return FUNCTOR_CONTINUE; + } + + // Check whether we are in the selected mdiv + if (!m_selectedMdivID.empty() + && (std::find(m_currentMdivIDs.begin(), m_currentMdivIDs.end(), m_selectedMdivID) == m_currentMdivIDs.end())) { + return FUNCTOR_CONTINUE; + } + + if (m_transposer->IsValidIntervalName(m_transposition)) { + m_transposer->SetTransposition(m_transposition); + } + else if (m_transposer->IsValidKeyTonic(m_transposition)) { + // Find the starting key tonic of the data to use in calculating the tranposition interval: + // Set transposition by key tonic. + // Detect the current key from the keysignature. + KeySig *keySig = vrv_cast(scoreDef->FindDescendantByType(KEYSIG)); + // If there is no keysignature, assume it is C. + TransPitch currentKey = TransPitch(0, 0, 0); + if (keySig && keySig->HasPname()) { + currentKey = TransPitch(keySig->GetPname(), ACCIDENTAL_GESTURAL_NONE, keySig->GetAccid(), 0); + } + else if (keySig) { + // No tonic pitch in key signature, so infer from key signature. + int fifthsInt = keySig->GetFifthsInt(); + // Check the keySig@mode is present (currently assuming major): + currentKey = m_transposer->CircleOfFifthsToMajorTonic(fifthsInt); + // need to add a dummy "0" key signature in score (staffDefs of staffDef). + } + m_transposer->SetTransposition(currentKey, m_transposition); + } + else if (m_transposer->IsValidSemitones(m_transposition)) { + KeySig *keySig = vrv_cast(scoreDef->FindDescendantByType(KEYSIG)); + int fifths = 0; + if (keySig) { + fifths = keySig->GetFifthsInt(); + } + else { + LogWarning("No key signature in data, assuming no key signature with no sharps/flats."); + // need to add a dummy "0" key signature in score (staffDefs of staffDef). + } + m_transposer->SetTransposition(fifths, m_transposition); + } + else { + LogWarning("Transposition is invalid: %s", m_transposition.c_str()); + // there is no transposition that can be done so do not try + // to transpose any further (if continuing in this function, + // there will not be an error, just that the transposition + // will be at the unison, so no notes should change. + return FUNCTOR_STOP; + } + + // Evaluate functor on scoreDef + scoreDef->Process(*this); + return FUNCTOR_CONTINUE; } FunctorCode TransposeFunctor::VisitScoreDef(ScoreDef *scoreDef) { + if (m_transposeToSoundingPitch) { + // Set the transposition in order to transpose common key signatures + // (i.e. encoded as ScoreDef attributes or direct KeySig children) + const std::vector staffNs = scoreDef->GetStaffNs(); + if (staffNs.empty()) { + int transposeInterval = 0; + if (!m_transposeIntervalForStaffN.empty()) { + transposeInterval = m_transposeIntervalForStaffN.begin()->second; + } + m_transposer->SetTransposition(transposeInterval); + } + else { + this->VisitStaffDef(scoreDef->GetStaffDef(staffNs.front())); + } + } + return FUNCTOR_CONTINUE; } FunctorCode TransposeFunctor::VisitScoreDefEnd(ScoreDef *scoreDef) { + const bool hasScoreDefKeySig = (m_keySigForStaffN.count(-1) > 0); + if (m_transposeToSoundingPitch && hasScoreDefKeySig) { + bool showWarning = false; + // Check if some staves are untransposed + const int mapEntryCount = static_cast(m_transposeIntervalForStaffN.size()); + if ((mapEntryCount > 0) && (mapEntryCount < (int)scoreDef->GetStaffNs().size())) { + showWarning = true; + } + // Check if there are different transpositions + auto iter = std::adjacent_find(m_transposeIntervalForStaffN.begin(), m_transposeIntervalForStaffN.end(), + [](const auto &mapEntry1, const auto &mapEntry2) { return (mapEntry1.second != mapEntry2.second); }); + if (iter != m_transposeIntervalForStaffN.end()) { + showWarning = true; + } + // Display warning + if (showWarning) { + LogWarning("Transpose to sounding pitch cannot handle different transpositions for ScoreDef key " + "signatures. Please encode KeySig as StaffDef attribute or child."); + } + } + return FUNCTOR_CONTINUE; } FunctorCode TransposeFunctor::VisitStaff(Staff *staff) { + if (m_transposeToSoundingPitch) { + int transposeInterval = 0; + if (staff->HasN() && (m_transposeIntervalForStaffN.count(staff->GetN()) > 0)) { + transposeInterval = m_transposeIntervalForStaffN.at(staff->GetN()); + } + m_transposer->SetTransposition(transposeInterval); + } + return FUNCTOR_CONTINUE; } FunctorCode TransposeFunctor::VisitStaffDef(StaffDef *staffDef) { + if (m_transposeToSoundingPitch) { + // Retrieve the key signature + const KeySig *keySig = vrv_cast(staffDef->FindDescendantByType(KEYSIG)); + if (!keySig) { + const ScoreDef *scoreDef = vrv_cast(staffDef->GetFirstAncestor(SCOREDEF)); + keySig = vrv_cast(scoreDef->FindDescendantByType(KEYSIG)); + } + // Determine and store the transposition interval (based on keySig) + if (keySig && staffDef->HasTransSemi() && staffDef->HasN()) { + const int fifths = keySig->GetFifthsInt(); + int semitones = staffDef->GetTransSemi(); + // Factor out octave transpositions + const int sign = (semitones >= 0) ? +1 : -1; + semitones = sign * (std::abs(semitones) % 24); + m_transposer->SetTransposition(fifths, std::to_string(semitones)); + m_transposeIntervalForStaffN[staffDef->GetN()] = m_transposer->GetTranspositionIntervalClass(); + staffDef->ResetTransposition(); + } + else { + int transposeInterval = 0; + if (staffDef->HasN() && (m_transposeIntervalForStaffN.count(staffDef->GetN()) > 0)) { + transposeInterval = m_transposeIntervalForStaffN.at(staffDef->GetN()); + } + m_transposer->SetTransposition(transposeInterval); + } + } + return FUNCTOR_CONTINUE; } FunctorCode TransposeFunctor::VisitSystem(System *system) { + // Check whether we are in the selected mdiv + if (!m_selectedMdivID.empty() + && (std::find(m_currentMdivIDs.begin(), m_currentMdivIDs.end(), m_selectedMdivID) == m_currentMdivIDs.end())) { + return FUNCTOR_SIBLINGS; + } + return FUNCTOR_CONTINUE; } From 1a4183d8a13e582af196609ccc29f6fb79f777b7 Mon Sep 17 00:00:00 2001 From: David Bauer Date: Sun, 7 May 2023 15:01:03 +0200 Subject: [PATCH 041/151] Apply Transpose and cleanup --- include/vrv/functorparams.h | 39 ------------------ include/vrv/harm.h | 5 --- include/vrv/keysig.h | 5 --- include/vrv/mdiv.h | 5 --- include/vrv/note.h | 6 --- include/vrv/object.h | 14 ------- include/vrv/pagemilestone.h | 5 --- include/vrv/rest.h | 5 --- include/vrv/score.h | 5 --- include/vrv/scoredef.h | 8 ---- include/vrv/staff.h | 5 --- include/vrv/staffdef.h | 5 --- include/vrv/system.h | 5 --- include/vrv/transposefunctor.h | 9 +++++ src/doc.cpp | 27 ++++++------- src/harm.cpp | 21 ---------- src/iomei.cpp | 1 - src/keysig.cpp | 49 ----------------------- src/mdiv.cpp | 12 ------ src/note.cpp | 17 -------- src/pagemilestone.cpp | 12 ------ src/rest.cpp | 69 -------------------------------- src/score.cpp | 72 ---------------------------------- src/scoredef.cpp | 54 ------------------------- src/staff.cpp | 16 -------- src/staffdef.cpp | 36 ----------------- src/system.cpp | 15 ------- 27 files changed, 22 insertions(+), 500 deletions(-) diff --git a/include/vrv/functorparams.h b/include/vrv/functorparams.h index 7c3c49179f..731f56c0d5 100644 --- a/include/vrv/functorparams.h +++ b/include/vrv/functorparams.h @@ -118,45 +118,6 @@ class FindLayerIDWithinStaffDefParams : public FunctorParams { std::string m_id; }; -//---------------------------------------------------------------------------- -// TransposeParams -//---------------------------------------------------------------------------- - -/** - * member 0: a pointer to the document - * member 1: the functor for redirection - * member 2: the end functor for redirection - * member 3: a pointer to the transposer - * member 4: the transposition to be applied - * member 5: the mdiv selected for transposition - * member 6: the list of current (nested) mdivs - * member 7: transpose to sounding pitch by evaluating @trans.semi - * member 8: current KeySig for staff (ScoreDef key signatures are mapped to -1) - * member 9: transposition interval for staff - **/ - -class TransposeParams : public FunctorParams { -public: - TransposeParams(Doc *doc, Functor *functor, Functor *functorEnd, Transposer *transposer) - { - m_doc = doc; - m_functor = functor; - m_functorEnd = functorEnd; - m_transposer = transposer; - m_transposeToSoundingPitch = false; - } - Doc *m_doc; - Functor *m_functor; - Functor *m_functorEnd; - Transposer *m_transposer; - std::string m_transposition; - std::string m_selectedMdivID; - std::list m_currentMdivIDs; - bool m_transposeToSoundingPitch; - std::map m_keySigForStaffN; - std::map m_transposeIntervalForStaffN; -}; - } // namespace vrv #endif diff --git a/include/vrv/harm.h b/include/vrv/harm.h index 17a04c9b99..64ab26bb00 100644 --- a/include/vrv/harm.h +++ b/include/vrv/harm.h @@ -89,11 +89,6 @@ class Harm : public ControlElement, FunctorCode AcceptEnd(ConstFunctor &functor) const override; ///@} - /** - * See Object::Transpose - */ - int Transpose(FunctorParams *functorParams) override; - protected: // private: diff --git a/include/vrv/keysig.h b/include/vrv/keysig.h index 43c84359f2..da96e055f9 100644 --- a/include/vrv/keysig.h +++ b/include/vrv/keysig.h @@ -126,11 +126,6 @@ class KeySig : public LayerElement, FunctorCode AcceptEnd(ConstFunctor &functor) const override; ///@} - /** - * See Object::Transpose - */ - int Transpose(FunctorParams *functorParams) override; - protected: /** * Filter the flat list and keep only StaffDef elements. diff --git a/include/vrv/mdiv.h b/include/vrv/mdiv.h index 27bb94b0da..800cab4553 100644 --- a/include/vrv/mdiv.h +++ b/include/vrv/mdiv.h @@ -62,11 +62,6 @@ class Mdiv : public PageElement, public PageMilestoneInterface, public AttLabell FunctorCode AcceptEnd(ConstFunctor &functor) const override; ///@} - /** - * See Object::Transpose - */ - int Transpose(FunctorParams *functorParams) override; - private: // public: diff --git a/include/vrv/note.h b/include/vrv/note.h index 14e46442a6..529030d399 100644 --- a/include/vrv/note.h +++ b/include/vrv/note.h @@ -34,7 +34,6 @@ class Note; class Slur; class TabGrp; class Tie; -class TransPitch; class Verse; //---------------------------------------------------------------------------- @@ -304,11 +303,6 @@ class Note : public LayerElement, FunctorCode AcceptEnd(ConstFunctor &functor) const override; ///@} - /** - * See Object::Transpose - */ - int Transpose(FunctorParams *functorParams) override; - protected: /** * The note locations w.r.t. each staff diff --git a/include/vrv/object.h b/include/vrv/object.h index 5f35356d55..3982f7229d 100644 --- a/include/vrv/object.h +++ b/include/vrv/object.h @@ -683,20 +683,6 @@ class Object : public BoundingBox { */ static bool IsPreOrdered(const Object *left, const Object *right); - //----------// - // Functors // - //----------// - - /** - * Transpose the content. - */ - virtual int Transpose(FunctorParams *) { return FUNCTOR_CONTINUE; } - - /** - * End functor for Object::Transpose - */ - virtual int TransposeEnd(FunctorParams *) { return FUNCTOR_CONTINUE; } - private: /** * Method for generating the id. diff --git a/include/vrv/pagemilestone.h b/include/vrv/pagemilestone.h index b9278cda5c..2371f72ac9 100644 --- a/include/vrv/pagemilestone.h +++ b/include/vrv/pagemilestone.h @@ -59,11 +59,6 @@ class PageMilestoneEnd : public PageElement { FunctorCode AcceptEnd(ConstFunctor &functor) const override; ///@} - /** - * See Object::Transpose - */ - int Transpose(FunctorParams *functorParams) override; - protected: // private: diff --git a/include/vrv/rest.h b/include/vrv/rest.h index e26cb7490b..f201375227 100644 --- a/include/vrv/rest.h +++ b/include/vrv/rest.h @@ -110,11 +110,6 @@ class Rest : public LayerElement, FunctorCode AcceptEnd(ConstFunctor &functor) const override; ///@} - /** - * See Object::Transpose - */ - int Transpose(FunctorParams *functorParams) override; - private: /** * Get the rest vertical location relative to location of elements placed on other layers diff --git a/include/vrv/score.h b/include/vrv/score.h index b8d6edd5cd..40ce402570 100644 --- a/include/vrv/score.h +++ b/include/vrv/score.h @@ -88,11 +88,6 @@ class Score : public PageElement, public PageMilestoneInterface, public AttLabel FunctorCode AcceptEnd(ConstFunctor &functor) const override; ///@} - /** - * See Object::Transpose - */ - int Transpose(FunctorParams *functorParams) override; - private: /** * The score/scoreDef (first child of the score) diff --git a/include/vrv/scoredef.h b/include/vrv/scoredef.h index 49f99a56ff..3a6ab19f04 100644 --- a/include/vrv/scoredef.h +++ b/include/vrv/scoredef.h @@ -276,14 +276,6 @@ class ScoreDef : public ScoreDefElement, FunctorCode AcceptEnd(ConstFunctor &functor) const override; ///@} - /** - * See Object::Transpose - */ - ///@{ - int Transpose(FunctorParams *functorParams) override; - int TransposeEnd(FunctorParams *functorParams) override; - ///@} - protected: /** * Filter the flat list and keep only StaffDef elements. diff --git a/include/vrv/staff.h b/include/vrv/staff.h index 3f55cc368a..37cf3dc650 100644 --- a/include/vrv/staff.h +++ b/include/vrv/staff.h @@ -195,11 +195,6 @@ class Staff : public Object, FunctorCode AcceptEnd(ConstFunctor &functor) const override; ///@} - /** - * See Object::Transpose - */ - int Transpose(FunctorParams *functorParams) override; - private: /** * Add the ledger line dashes to the legderline array. diff --git a/include/vrv/staffdef.h b/include/vrv/staffdef.h index 80ea8aa665..40a6f9ee14 100644 --- a/include/vrv/staffdef.h +++ b/include/vrv/staffdef.h @@ -84,11 +84,6 @@ class StaffDef : public ScoreDefElement, FunctorCode AcceptEnd(ConstFunctor &functor) const override; ///@} - /** - * See Object::Transpose - */ - int Transpose(FunctorParams *functorParams) override; - private: // public: diff --git a/include/vrv/system.h b/include/vrv/system.h index a7395513c1..8e98f42ed0 100644 --- a/include/vrv/system.h +++ b/include/vrv/system.h @@ -179,11 +179,6 @@ class System : public Object, public DrawingListInterface, public AttTyped { FunctorCode AcceptEnd(ConstFunctor &functor) const override; ///@} - /** - * See Object::Transpose - */ - int Transpose(FunctorParams *functorParams) override; - public: SystemAligner m_systemAligner; diff --git a/include/vrv/transposefunctor.h b/include/vrv/transposefunctor.h index 3efe7f47cb..3235f73bad 100644 --- a/include/vrv/transposefunctor.h +++ b/include/vrv/transposefunctor.h @@ -34,6 +34,15 @@ class TransposeFunctor : public DocFunctor { */ bool ImplementsEndInterface() const override { return true; } + /* + * Setter for various properties + */ + ///@{ + void SetTransposition(const std::string &transposition) { m_transposition = transposition; } + void SetSelectedMdivID(const std::string &selectedID) { m_selectedMdivID = selectedID; } + void SetTransposeToSoundingPitch() { m_transposeToSoundingPitch = true; } + ///@} + /* * Functor interface */ diff --git a/src/doc.cpp b/src/doc.cpp index d8e5441eae..8d4e90e537 100644 --- a/src/doc.cpp +++ b/src/doc.cpp @@ -68,6 +68,7 @@ #include "text.h" #include "timemap.h" #include "timestamp.h" +#include "transposefunctor.h" #include "transposition.h" #include "verse.h" #include "vrv.h" @@ -1372,12 +1373,10 @@ void Doc::TransposeDoc() Transposer transposer; transposer.SetBase600(); // Set extended chromatic alteration mode (allowing more than double sharps/flats) - Functor transpose(&Object::Transpose); - Functor transposeEnd(&Object::TransposeEnd); - TransposeParams transposeParams(this, &transpose, &transposeEnd, &transposer); + TransposeFunctor transpose(this, &transposer); if (m_options->m_transposeSelectedOnly.GetValue() == false) { - transpose.m_visibleOnly = false; + transpose.SetVisibleOnly(false); } if (m_options->m_transpose.IsSet()) { @@ -1386,26 +1385,26 @@ void Doc::TransposeDoc() LogWarning("\"%s\" is ignored when \"%s\" is set as well. Please use only one of the two options.", m_options->m_transposeMdiv.GetKey().c_str(), m_options->m_transpose.GetKey().c_str()); } - transposeParams.m_transposition = m_options->m_transpose.GetValue(); - this->Process(&transpose, &transposeParams, &transposeEnd); + transpose.SetTransposition(m_options->m_transpose.GetValue()); + this->Process(transpose); } else if (m_options->m_transposeMdiv.IsSet()) { // Transpose mdivs individually std::set ids = m_options->m_transposeMdiv.GetKeys(); for (const std::string &id : ids) { - transposeParams.m_selectedMdivID = id; - transposeParams.m_transposition = m_options->m_transposeMdiv.GetStrValue({ id }); - this->Process(&transpose, &transposeParams, &transposeEnd); + transpose.SetSelectedMdivID(id); + transpose.SetTransposition(m_options->m_transposeMdiv.GetStrValue({ id })); + this->Process(transpose); } } if (m_options->m_transposeToSoundingPitch.GetValue()) { // Transpose to sounding pitch - transposeParams.m_selectedMdivID = ""; - transposeParams.m_transposition = ""; - transposeParams.m_transposer->SetTransposition(0); - transposeParams.m_transposeToSoundingPitch = true; - this->Process(&transpose, &transposeParams, &transposeEnd); + transpose.SetSelectedMdivID(""); + transpose.SetTransposition(""); + transposer.SetTransposition(0); + transpose.SetTransposeToSoundingPitch(); + this->Process(transpose); } } diff --git a/src/harm.cpp b/src/harm.cpp index 2eeada9c08..c342dc01d3 100644 --- a/src/harm.cpp +++ b/src/harm.cpp @@ -180,25 +180,4 @@ FunctorCode Harm::AcceptEnd(ConstFunctor &functor) const return functor.VisitHarmEnd(this); } -int Harm::Transpose(FunctorParams *functorParams) -{ - TransposeParams *params = vrv_params_cast(functorParams); - assert(params); - - unsigned int position = 0; - TransPitch pitch; - if (this->GetRootPitch(pitch, position)) { - params->m_transposer->Transpose(pitch); - this->SetRootPitch(pitch, position); - } - - // Transpose bass notes (the "/F#" in "G#m7/F#") - if (this->GetBassPitch(pitch)) { - params->m_transposer->Transpose(pitch); - this->SetBassPitch(pitch); - } - - return FUNCTOR_SIBLINGS; -} - } // namespace vrv diff --git a/src/iomei.cpp b/src/iomei.cpp index 46f61ada21..c7cc15667d 100644 --- a/src/iomei.cpp +++ b/src/iomei.cpp @@ -141,7 +141,6 @@ #include "tempo.h" #include "text.h" #include "tie.h" -#include "transposition.h" #include "trill.h" #include "tuning.h" #include "tuplet.h" diff --git a/src/keysig.cpp b/src/keysig.cpp index 587102fd71..cabfafb92a 100644 --- a/src/keysig.cpp +++ b/src/keysig.cpp @@ -24,7 +24,6 @@ #include "smufl.h" #include "staff.h" #include "staffdef.h" -#include "transposition.h" #include "vrv.h" namespace vrv { @@ -389,52 +388,4 @@ FunctorCode KeySig::AcceptEnd(ConstFunctor &functor) const return functor.VisitKeySigEnd(this); } -int KeySig::Transpose(FunctorParams *functorParams) -{ - TransposeParams *params = vrv_params_cast(functorParams); - assert(params); - - // Store current KeySig - int staffN = -1; - const StaffDef *staffDef = vrv_cast(this->GetFirstAncestor(STAFFDEF)); - if (staffDef) { - staffN = staffDef->GetN(); - } - else { - const Staff *staff = this->GetAncestorStaff(ANCESTOR_ONLY, false); - if (staff) staffN = staff->GetN(); - } - params->m_keySigForStaffN[staffN] = this; - - // Transpose - const int sig = this->GetFifthsInt(); - - int intervalClass = params->m_transposer->CircleOfFifthsToIntervalClass(sig); - intervalClass = params->m_transposer->Transpose(intervalClass); - int fifths = params->m_transposer->IntervalToCircleOfFifths(intervalClass); - - if (fifths == INVALID_INTERVAL_CLASS) { - this->SetSig({ -1, ACCIDENTAL_WRITTEN_NONE }); - } - else if (fifths < 0) { - this->SetSig({ -fifths, ACCIDENTAL_WRITTEN_f }); - } - else if (fifths > 0) { - this->SetSig({ fifths, ACCIDENTAL_WRITTEN_s }); - } - else { - this->SetSig({ -1, ACCIDENTAL_WRITTEN_NONE }); - } - - // Also convert pname and accid attributes - if (this->HasPname()) { - TransPitch pitch = TransPitch(this->GetPname(), ACCIDENTAL_GESTURAL_NONE, this->GetAccid(), 4); - params->m_transposer->Transpose(pitch); - this->SetPname(pitch.GetPitchName()); - this->SetAccid(pitch.GetAccidW()); - } - - return FUNCTOR_SIBLINGS; -} - } // namespace vrv diff --git a/src/mdiv.cpp b/src/mdiv.cpp index 314db5d79a..c248f520fa 100644 --- a/src/mdiv.cpp +++ b/src/mdiv.cpp @@ -96,16 +96,4 @@ FunctorCode Mdiv::AcceptEnd(ConstFunctor &functor) const return functor.VisitMdivEnd(this); } -int Mdiv::Transpose(FunctorParams *functorParams) -{ - TransposeParams *params = vrv_params_cast(functorParams); - assert(params); - - params->m_currentMdivIDs.push_back(this->GetID()); - params->m_keySigForStaffN.clear(); - params->m_transposeIntervalForStaffN.clear(); - - return FUNCTOR_CONTINUE; -} - } // namespace vrv diff --git a/src/note.cpp b/src/note.cpp index a063d38498..d17b6879bf 100644 --- a/src/note.cpp +++ b/src/note.cpp @@ -847,21 +847,4 @@ MapOfDotLocs Note::CalcDotLocations(int layerCount, bool primary) const return dotLocs; } -int Note::Transpose(FunctorParams *functorParams) -{ - TransposeParams *params = vrv_params_cast(functorParams); - assert(params); - - if (!this->HasPname()) return FUNCTOR_SIBLINGS; - - TransPitch pitch = this->GetTransPitch(); - params->m_transposer->Transpose(pitch); - - const int staffN = this->GetAncestorStaff(RESOLVE_CROSS_STAFF)->GetN(); - const bool hasKeySig = ((params->m_keySigForStaffN.count(staffN) > 0) || (params->m_keySigForStaffN.count(-1) > 0)); - this->UpdateFromTransPitch(pitch, hasKeySig); - - return FUNCTOR_SIBLINGS; -} - } // namespace vrv diff --git a/src/pagemilestone.cpp b/src/pagemilestone.cpp index f8884a3527..4e3dbee84d 100644 --- a/src/pagemilestone.cpp +++ b/src/pagemilestone.cpp @@ -101,18 +101,6 @@ FunctorCode PageMilestoneEnd::AcceptEnd(ConstFunctor &functor) const return functor.VisitPageMilestoneEnd(this); } -int PageMilestoneEnd::Transpose(FunctorParams *functorParams) -{ - TransposeParams *params = vrv_params_cast(functorParams); - assert(params); - - if (this->m_start && this->m_start->Is(MDIV)) { - params->m_currentMdivIDs.pop_back(); - } - - return FUNCTOR_CONTINUE; -} - //---------------------------------------------------------------------------- // Interface pseudo functor (redirected) //---------------------------------------------------------------------------- diff --git a/src/rest.cpp b/src/rest.cpp index d43341e32a..e1fb03f923 100644 --- a/src/rest.cpp +++ b/src/rest.cpp @@ -570,73 +570,4 @@ FunctorCode Rest::AcceptEnd(ConstFunctor &functor) const return functor.VisitRestEnd(this); } -int Rest::Transpose(FunctorParams *functorParams) -{ - TransposeParams *params = vrv_params_cast(functorParams); - assert(params); - - if ((!this->HasOloc() || !this->HasPloc()) && !this->HasLoc()) return FUNCTOR_SIBLINGS; - - // Find whether current layer is top, middle (either one if multiple) or bottom - Staff *parentStaff = this->GetAncestorStaff(); - Layer *parentLayer = vrv_cast(this->GetFirstAncestor(LAYER)); - assert(parentLayer); - - ListOfObjects objects = parentStaff->FindAllDescendantsByType(LAYER, false); - const int layerCount = (int)objects.size(); - - Layer *firstLayer = vrv_cast(objects.front()); - Layer *lastLayer = vrv_cast(objects.back()); - - const bool isTopLayer = (firstLayer->GetN() == parentLayer->GetN()); - const bool isBottomLayer = (lastLayer->GetN() == parentLayer->GetN()); - - // transpose based on @oloc and @ploc - if (this->HasOloc() && this->HasPloc()) { - const TransPitch centralLocation(6, 0, 4); // middle location of the staff - TransPitch restLoc(this->GetPloc() - PITCHNAME_c, 0, this->GetOloc()); - params->m_transposer->Transpose(restLoc); - const bool isRestOnSpace = static_cast((restLoc.m_oct * 7 + restLoc.m_pname) % 2); - // on outer layers move rest on odd locations one line further - // in middle layers tolerate even locations to not risk collisions - if (layerCount > 1) { - if (isTopLayer && isRestOnSpace) { - restLoc++; - } - else if (isBottomLayer && isRestOnSpace) { - restLoc--; - } - if ((isTopLayer && (restLoc < centralLocation)) || (isBottomLayer && (restLoc > centralLocation))) { - restLoc = centralLocation; - } - } - - this->UpdateFromTransLoc(restLoc); - } - // transpose based on @loc - else if (this->HasLoc()) { - constexpr int centralLocation(4); - int transval = params->m_transposer->GetTranspositionIntervalClass(); - int diatonic; - int chromatic; - params->m_transposer->IntervalToDiatonicChromatic(diatonic, chromatic, transval); - int transposedLoc = this->GetLoc() + diatonic; - // on outer layers move rest on odd locations one line further - // in middle layers tolerate even locations to not risk collisions - if (layerCount > 1) { - if (isTopLayer) - transposedLoc += abs(transposedLoc % 2); - else if (isBottomLayer) - transposedLoc -= abs(transposedLoc % 2); - if ((isTopLayer && (transposedLoc < centralLocation)) - || (isBottomLayer && (transposedLoc > centralLocation))) { - transposedLoc = centralLocation; - } - } - this->SetLoc(transposedLoc); - } - - return FUNCTOR_SIBLINGS; -} - } // namespace vrv diff --git a/src/score.cpp b/src/score.cpp index a0214b06e8..68a82af119 100644 --- a/src/score.cpp +++ b/src/score.cpp @@ -175,76 +175,4 @@ FunctorCode Score::AcceptEnd(ConstFunctor &functor) const return functor.VisitScoreEnd(this); } -int Score::Transpose(FunctorParams *functorParams) -{ - TransposeParams *params = vrv_params_cast(functorParams); - assert(params); - - ScoreDef *scoreDef = this->GetScoreDef(); - Transposer *transposer = params->m_transposer; - const std::string &transposition = params->m_transposition; - - // Check whether we transpose to sounding pitch - if (params->m_transposeToSoundingPitch) { - // Evaluate functor on scoreDef - scoreDef->Process(params->m_functor, params, params->m_functorEnd); - return FUNCTOR_CONTINUE; - } - - // Check whether we are in the selected mdiv - if (!params->m_selectedMdivID.empty() - && (std::find(params->m_currentMdivIDs.begin(), params->m_currentMdivIDs.end(), params->m_selectedMdivID) - == params->m_currentMdivIDs.end())) { - return FUNCTOR_CONTINUE; - } - - if (transposer->IsValidIntervalName(transposition)) { - transposer->SetTransposition(transposition); - } - else if (transposer->IsValidKeyTonic(transposition)) { - // Find the starting key tonic of the data to use in calculating the tranposition interval: - // Set transposition by key tonic. - // Detect the current key from the keysignature. - KeySig *keySig = vrv_cast(scoreDef->FindDescendantByType(KEYSIG)); - // If there is no keysignature, assume it is C. - TransPitch currentKey = TransPitch(0, 0, 0); - if (keySig && keySig->HasPname()) { - currentKey = TransPitch(keySig->GetPname(), ACCIDENTAL_GESTURAL_NONE, keySig->GetAccid(), 0); - } - else if (keySig) { - // No tonic pitch in key signature, so infer from key signature. - int fifthsInt = keySig->GetFifthsInt(); - // Check the keySig@mode is present (currently assuming major): - currentKey = transposer->CircleOfFifthsToMajorTonic(fifthsInt); - // need to add a dummy "0" key signature in score (staffDefs of staffDef). - } - transposer->SetTransposition(currentKey, transposition); - } - else if (transposer->IsValidSemitones(transposition)) { - KeySig *keySig = vrv_cast(scoreDef->FindDescendantByType(KEYSIG)); - int fifths = 0; - if (keySig) { - fifths = keySig->GetFifthsInt(); - } - else { - LogWarning("No key signature in data, assuming no key signature with no sharps/flats."); - // need to add a dummy "0" key signature in score (staffDefs of staffDef). - } - transposer->SetTransposition(fifths, transposition); - } - else { - LogWarning("Transposition is invalid: %s", transposition.c_str()); - // there is no transposition that can be done so do not try - // to transpose any further (if continuing in this function, - // there will not be an error, just that the transposition - // will be at the unison, so no notes should change. - return FUNCTOR_STOP; - } - - // Evaluate functor on scoreDef - scoreDef->Process(params->m_functor, params, params->m_functorEnd); - - return FUNCTOR_CONTINUE; -} - } // namespace vrv diff --git a/src/scoredef.cpp b/src/scoredef.cpp index e58607a216..15bfcb5ff3 100644 --- a/src/scoredef.cpp +++ b/src/scoredef.cpp @@ -699,58 +699,4 @@ FunctorCode ScoreDef::AcceptEnd(ConstFunctor &functor) const return functor.VisitScoreDefEnd(this); } -int ScoreDef::Transpose(FunctorParams *functorParams) -{ - TransposeParams *params = vrv_params_cast(functorParams); - assert(params); - - if (params->m_transposeToSoundingPitch) { - // Set the transposition in order to transpose common key signatures - // (i.e. encoded as ScoreDef attributes or direct KeySig children) - const std::vector staffNs = this->GetStaffNs(); - if (staffNs.empty()) { - int transposeInterval = 0; - if (!params->m_transposeIntervalForStaffN.empty()) { - transposeInterval = params->m_transposeIntervalForStaffN.begin()->second; - } - params->m_transposer->SetTransposition(transposeInterval); - } - else { - this->GetStaffDef(staffNs.front())->Transpose(functorParams); - } - } - - return FUNCTOR_CONTINUE; -} - -int ScoreDef::TransposeEnd(FunctorParams *functorParams) -{ - TransposeParams *params = vrv_params_cast(functorParams); - assert(params); - - const bool hasScoreDefKeySig = (params->m_keySigForStaffN.count(-1) > 0); - if (params->m_transposeToSoundingPitch && hasScoreDefKeySig) { - bool showWarning = false; - // Check if some staves are untransposed - const int mapEntryCount = static_cast(params->m_transposeIntervalForStaffN.size()); - if ((mapEntryCount > 0) && (mapEntryCount < (int)this->GetStaffNs().size())) { - showWarning = true; - } - // Check if there are different transpositions - auto iter = std::adjacent_find(params->m_transposeIntervalForStaffN.begin(), - params->m_transposeIntervalForStaffN.end(), - [](const auto &mapEntry1, const auto &mapEntry2) { return (mapEntry1.second != mapEntry2.second); }); - if (iter != params->m_transposeIntervalForStaffN.end()) { - showWarning = true; - } - // Display warning - if (showWarning) { - LogWarning("Transpose to sounding pitch cannot handle different transpositions for ScoreDef key " - "signatures. Please encode KeySig as StaffDef attribute or child."); - } - } - - return FUNCTOR_CONTINUE; -} - } // namespace vrv diff --git a/src/staff.cpp b/src/staff.cpp index b517ca48d3..bc8cd81e85 100644 --- a/src/staff.cpp +++ b/src/staff.cpp @@ -364,20 +364,4 @@ FunctorCode Staff::AcceptEnd(ConstFunctor &functor) const return functor.VisitStaffEnd(this); } -int Staff::Transpose(FunctorParams *functorParams) -{ - TransposeParams *params = vrv_params_cast(functorParams); - assert(params); - - if (params->m_transposeToSoundingPitch) { - int transposeInterval = 0; - if (this->HasN() && (params->m_transposeIntervalForStaffN.count(this->GetN()) > 0)) { - transposeInterval = params->m_transposeIntervalForStaffN.at(this->GetN()); - } - params->m_transposer->SetTransposition(transposeInterval); - } - - return FUNCTOR_CONTINUE; -} - } // namespace vrv diff --git a/src/staffdef.cpp b/src/staffdef.cpp index 683b7c83af..7f239ae1cd 100644 --- a/src/staffdef.cpp +++ b/src/staffdef.cpp @@ -21,7 +21,6 @@ #include "layerdef.h" #include "metersiggrp.h" #include "staffgrp.h" -#include "transposition.h" #include "tuning.h" #include "vrv.h" @@ -158,39 +157,4 @@ FunctorCode StaffDef::AcceptEnd(ConstFunctor &functor) const return functor.VisitStaffDefEnd(this); } -int StaffDef::Transpose(FunctorParams *functorParams) -{ - TransposeParams *params = vrv_params_cast(functorParams); - assert(params); - - if (params->m_transposeToSoundingPitch) { - // Retrieve the key signature - const KeySig *keySig = vrv_cast(this->FindDescendantByType(KEYSIG)); - if (!keySig) { - const ScoreDef *scoreDef = vrv_cast(this->GetFirstAncestor(SCOREDEF)); - keySig = vrv_cast(scoreDef->FindDescendantByType(KEYSIG)); - } - // Determine and store the transposition interval (based on keySig) - if (keySig && this->HasTransSemi() && this->HasN()) { - const int fifths = keySig->GetFifthsInt(); - int semitones = this->GetTransSemi(); - // Factor out octave transpositions - const int sign = (semitones >= 0) ? +1 : -1; - semitones = sign * (std::abs(semitones) % 24); - params->m_transposer->SetTransposition(fifths, std::to_string(semitones)); - params->m_transposeIntervalForStaffN[this->GetN()] = params->m_transposer->GetTranspositionIntervalClass(); - this->ResetTransposition(); - } - else { - int transposeInterval = 0; - if (this->HasN() && (params->m_transposeIntervalForStaffN.count(this->GetN()) > 0)) { - transposeInterval = params->m_transposeIntervalForStaffN.at(this->GetN()); - } - params->m_transposer->SetTransposition(transposeInterval); - } - } - - return FUNCTOR_CONTINUE; -} - } // namespace vrv diff --git a/src/system.cpp b/src/system.cpp index 840b4f712c..10f8bb48a8 100644 --- a/src/system.cpp +++ b/src/system.cpp @@ -505,19 +505,4 @@ FunctorCode System::AcceptEnd(ConstFunctor &functor) const return functor.VisitSystemEnd(this); } -int System::Transpose(FunctorParams *functorParams) -{ - TransposeParams *params = vrv_params_cast(functorParams); - assert(params); - - // Check whether we are in the selected mdiv - if (!params->m_selectedMdivID.empty() - && (std::find(params->m_currentMdivIDs.begin(), params->m_currentMdivIDs.end(), params->m_selectedMdivID) - == params->m_currentMdivIDs.end())) { - return FUNCTOR_SIBLINGS; - } - - return FUNCTOR_CONTINUE; -} - } // namespace vrv From 3141dec78e9bad2144e07ff8ae36c0eba99f1b97 Mon Sep 17 00:00:00 2001 From: David Bauer Date: Sun, 7 May 2023 15:21:06 +0200 Subject: [PATCH 042/151] Clean previous Process method and Functor class --- include/vrv/object.h | 48 +------------ src/object.cpp | 157 ------------------------------------------- 2 files changed, 2 insertions(+), 203 deletions(-) diff --git a/include/vrv/object.h b/include/vrv/object.h index 3982f7229d..c871d9434e 100644 --- a/include/vrv/object.h +++ b/include/vrv/object.h @@ -636,22 +636,16 @@ class Object : public BoundingBox { Object *FindNextChild(Comparison *comp, Object *start); Object *FindPreviousChild(Comparison *comp, Object *start); + /** * Main method that processes functors. * For each object, it will call the functor. * Depending on the code returned by the functor, it will also process it for all children. - * The Filters class parameter makes is possible to process only objects of a - * type that matches the attribute value given in the Comparison object. - * This is the generic way for parsing the tree, e.g., for extracting one single staff or layer. * Deepness specifies how many child levels should be processed. UNLIMITED_DEPTH means no * limit (EditorialElement objects do not count). - * skipFirst does not call the functor or endFunctor on the first (calling) level + * skipFirst does not call the functor on the first (calling) level */ ///@{ - void Process(Functor *functor, FunctorParams *functorParams, Functor *endFunctor = NULL, Filters *filters = NULL, - int deepness = UNLIMITED_DEPTH, bool direction = FORWARD, bool skipFirst = false); - void Process(Functor *functor, FunctorParams *functorParams, Functor *endFunctor = NULL, Filters *filters = NULL, - int deepness = UNLIMITED_DEPTH, bool direction = FORWARD, bool skipFirst = false) const; void Process(MutableFunctor &functor, int deepness = UNLIMITED_DEPTH, bool skipFirst = false); void Process(ConstFunctor &functor, int deepness = UNLIMITED_DEPTH, bool skipFirst = false) const; ///@} @@ -934,46 +928,8 @@ class TextListInterface : public ObjectListInterface { // public: // -private: -}; - -//---------------------------------------------------------------------------- -// Functor -//---------------------------------------------------------------------------- - -class Functor { -private: - int (Object::*obj_fpt)(FunctorParams *functorParams); // pointer to member function - int (Object::*const_obj_fpt)(FunctorParams *functorParams) const; - -public: - // constructor - takes pointer to a functor method and stores it - Functor(); - Functor(int (Object::*_obj_fpt)(FunctorParams *)); - Functor(int (Object::*_const_obj_fpt)(FunctorParams *) const); - virtual ~Functor(){}; - - // Call the internal functor method - void Call(Object *ptr, FunctorParams *functorParams); - void Call(const Object *ptr, FunctorParams *functorParams); - private: // -public: - /** - * The return code of the functor. - * FUNCTOR_CONTINUE: continue processing - * FUNCTOR_SIBLINGS: process only siblings (do not go deeper) - * FUNCTOR_STOP: stop the functor (e.g., when an Object or a value is found) - */ - int m_returnCode; - /** - * A flag for indicating if only visible Object have to be processed. - * The value is true by default. - */ - bool m_visibleOnly; - -private: }; //---------------------------------------------------------------------------- diff --git a/src/object.cpp b/src/object.cpp index bf76fde886..b71ea6b719 100644 --- a/src/object.cpp +++ b/src/object.cpp @@ -1013,116 +1013,6 @@ bool Object::HasNonEditorialContent() return (!nonEditorial.empty()); } -void Object::Process(Functor *functor, FunctorParams *functorParams, Functor *endFunctor, Filters *filters, - int deepness, bool direction, bool skipFirst) -{ - if (functor->m_returnCode == FUNCTOR_STOP) { - return; - } - - // Update the current score stored in the document - this->UpdateDocumentScore(direction); - - if (!skipFirst) { - functor->Call(this, functorParams); - } - - // do not go any deeper in this case - if (functor->m_returnCode == FUNCTOR_SIBLINGS) { - functor->m_returnCode = FUNCTOR_CONTINUE; - return; - } - else if (this->IsEditorialElement()) { - // since editorial object doesn't count, we increase the deepness limit - deepness++; - } - if (deepness == 0) { - // any need to change the functor m_returnCode? - return; - } - deepness--; - - if (!this->SkipChildren(functor->m_visibleOnly)) { - // We need a pointer to the array for the option to work on a reversed copy - ArrayOfObjects *children = &m_children; - if (direction == BACKWARD) { - for (ArrayOfObjects::reverse_iterator iter = children->rbegin(); iter != children->rend(); ++iter) { - // we will end here if there is no filter at all or for the current child type - if (this->FiltersApply(filters, *iter)) { - (*iter)->Process(functor, functorParams, endFunctor, filters, deepness, direction); - } - } - } - else { - for (ArrayOfObjects::iterator iter = children->begin(); iter != children->end(); ++iter) { - // we will end here if there is no filter at all or for the current child type - if (this->FiltersApply(filters, *iter)) { - (*iter)->Process(functor, functorParams, endFunctor, filters, deepness, direction); - } - } - } - } - - if (endFunctor && !skipFirst) { - endFunctor->Call(this, functorParams); - } -} - -void Object::Process(Functor *functor, FunctorParams *functorParams, Functor *endFunctor, Filters *filters, - int deepness, bool direction, bool skipFirst) const -{ - if (functor->m_returnCode == FUNCTOR_STOP) { - return; - } - - // Update the current score stored in the document - const_cast(this)->UpdateDocumentScore(direction); - - if (!skipFirst) { - functor->Call(this, functorParams); - } - - // do not go any deeper in this case - if (functor->m_returnCode == FUNCTOR_SIBLINGS) { - functor->m_returnCode = FUNCTOR_CONTINUE; - return; - } - else if (this->IsEditorialElement()) { - // since editorial object doesn't count, we increase the deepness limit - deepness++; - } - if (deepness == 0) { - // any need to change the functor m_returnCode? - return; - } - deepness--; - - if (!this->SkipChildren(functor->m_visibleOnly)) { - // We need a pointer to the array for the option to work on a reversed copy - const ArrayOfObjects *children = &m_children; - if (direction == BACKWARD) { - for (ArrayOfObjects::const_reverse_iterator iter = children->rbegin(); iter != children->rend(); ++iter) { - // we will end here if there is no filter at all or for the current child type - if (this->FiltersApply(filters, *iter)) { - (*iter)->Process(functor, functorParams, endFunctor, filters, deepness, direction); - } - } - } - else { - for (ArrayOfObjects::const_iterator iter = children->begin(); iter != children->end(); ++iter) { - // we will end here if there is no filter at all or for the current child type - if (this->FiltersApply(filters, *iter)) { - (*iter)->Process(functor, functorParams, endFunctor, filters, deepness, direction); - } - } - } - } - - if (endFunctor && !skipFirst) { - endFunctor->Call(this, functorParams); - } -} - void Object::Process(MutableFunctor &functor, int deepness, bool skipFirst) { if (functor.GetCode() == FUNCTOR_STOP) { @@ -1675,53 +1565,6 @@ void TextListInterface::FilterList(ListOfConstObjects &childList) const } } -//---------------------------------------------------------------------------- -// Functor -//---------------------------------------------------------------------------- - -Functor::Functor() -{ - m_returnCode = FUNCTOR_CONTINUE; - m_visibleOnly = true; - obj_fpt = NULL; - const_obj_fpt = NULL; -} - -Functor::Functor(int (Object::*_obj_fpt)(FunctorParams *)) -{ - m_returnCode = FUNCTOR_CONTINUE; - m_visibleOnly = true; - obj_fpt = _obj_fpt; - const_obj_fpt = NULL; -} - -Functor::Functor(int (Object::*_const_obj_fpt)(FunctorParams *) const) -{ - m_returnCode = FUNCTOR_CONTINUE; - m_visibleOnly = true; - obj_fpt = NULL; - const_obj_fpt = _const_obj_fpt; -} - -void Functor::Call(Object *ptr, FunctorParams *functorParams) -{ - if (const_obj_fpt) { - m_returnCode = (ptr->*const_obj_fpt)(functorParams); - } - else { - m_returnCode = (ptr->*obj_fpt)(functorParams); - } -} - -void Functor::Call(const Object *ptr, FunctorParams *functorParams) -{ - if (!const_obj_fpt && obj_fpt) { - LogError("Non-const functor cannot be called from a const method!"); - assert(false); - } - m_returnCode = (ptr->*const_obj_fpt)(functorParams); -} - //---------------------------------------------------------------------------- // ObjectFactory methods //---------------------------------------------------------------------------- From e888d3c18974659e438f824108a005e7cf48a56e Mon Sep 17 00:00:00 2001 From: Laurent Pugin Date: Sun, 7 May 2023 20:55:33 +0200 Subject: [PATCH 043/151] Set element names when writing libmei element classes --- libmei/tools/cpp.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libmei/tools/cpp.py b/libmei/tools/cpp.py index da0fe8a95c..234dc733d5 100644 --- a/libmei/tools/cpp.py +++ b/libmei/tools/cpp.py @@ -244,6 +244,7 @@ class {elementNameUpper} : public Element{attClasses} {{ bool {elementNameUpper}::Write({writeParam}) {{ + element.set_name("{elementNameLower}"); bool hasAttribute = false;{elementWrite} return hasAttribute; }} @@ -1065,10 +1066,9 @@ def create_element_classes(cpp_ns: str, schema, outdir: Path): element_reset.append(f"\n Reset{att_str}();") read_param = "pugi::xml_node, bool" - write_param = "pugi::xml_node" if element_read: read_param = "pugi::xml_node element, bool removeAttr" - write_param = "pugi::xml_node element" + write_param = "pugi::xml_node element" consvars = { 'elementNameUpper': schema.cc(element), From 1ef760ecb9886bfd851fd7f339f7e716ad2952cd Mon Sep 17 00:00:00 2001 From: David Bauer Date: Mon, 8 May 2023 08:56:30 +0200 Subject: [PATCH 044/151] Collect measure as garbage --- include/vrv/iomusxml.h | 8 ++++++-- src/iomusxml.cpp | 25 +++++++++++++------------ 2 files changed, 19 insertions(+), 14 deletions(-) diff --git a/include/vrv/iomusxml.h b/include/vrv/iomusxml.h index 2b81d6d83a..62ca7c1c80 100644 --- a/include/vrv/iomusxml.h +++ b/include/vrv/iomusxml.h @@ -277,9 +277,8 @@ class MusicXmlInput : public Input { * Add a Measure to the section. * If the measure already exists it will move all its content. * The measure can contain only staves. Other elements must be stacked on m_floatingElements. - * Returns true if the measure was added to the tree (did not exist before) */ - bool AddMeasure(Section *section, Measure *measure, int i); + void AddMeasure(Section *section, Measure *measure, int i); /* * Add a Layer element to the layer or to the LayerElement at the top of m_elementStack. @@ -559,6 +558,11 @@ class MusicXmlInput : public Input { /* measure rests */ std::map m_multiRests; + /* + * Objects that were not successfully added and should be destroyed at the end of the import + */ + ListOfObjects m_garbage; + #endif // NO_MUSICXML_SUPPORT }; diff --git a/src/iomusxml.cpp b/src/iomusxml.cpp index 5ae5145ae2..27b9ea69a3 100644 --- a/src/iomusxml.cpp +++ b/src/iomusxml.cpp @@ -109,7 +109,13 @@ enum class MetronomeElements { BEAT_UNIT, BEAT_UNIT_DOT, PER_MINUTE, SEPARATOR } MusicXmlInput::MusicXmlInput(Doc *doc) : Input(doc) {} -MusicXmlInput::~MusicXmlInput() {} +MusicXmlInput::~MusicXmlInput() +{ + // Clean the collected garbage + for (Object *object : m_garbage) { + delete object; + } +} #ifndef NO_MUSICXML_SUPPORT @@ -340,7 +346,7 @@ void MusicXmlInput::InsertClefIntoObject(Object *parent, Clef *clef, Object *lay } } -bool MusicXmlInput::AddMeasure(Section *section, Measure *measure, int i) +void MusicXmlInput::AddMeasure(Section *section, Measure *measure, int i) { assert(section); assert(i >= 0); @@ -381,12 +387,13 @@ bool MusicXmlInput::AddMeasure(Section *section, Measure *measure, int i) measure->ClearRelinquishedChildren(); } else { + // The measure was not transferred and not added to the tree. Its entire content will be deleted at the end. LogError("MusicXML import: Mismatching measure number %s", measure->GetN().c_str()); - - // Keep the measure alive as ghost. Its content was not transferred, so we cannot delete it. - return true; } contentMeasure = existingMeasure; + + m_measureCounts.erase(measure); + m_garbage.push_back(measure); } // Handle endings @@ -407,8 +414,6 @@ bool MusicXmlInput::AddMeasure(Section *section, Measure *measure, int i) } m_currentEndingStart.reset(); m_currentEndingStop.reset(); - - return (contentMeasure == measure); } void MusicXmlInput::AddLayerElement(Layer *layer, LayerElement *element, int duration) @@ -1565,11 +1570,7 @@ bool MusicXmlInput::ReadMusicXmlPart(pugi::xml_node node, Section *section, shor m_measureCounts[measure] = i; ReadMusicXmlMeasure(xmlMeasure.node(), section, measure, nbStaves, staffOffset, i); // Add the measure to the system - if already there from a previous part we'll just merge the content - if (!AddMeasure(section, measure, i)) { - // If content was transferred to existing measure, clean up - m_measureCounts.erase(measure); - delete measure; - } + AddMeasure(section, measure, i); } else { // Handle barline parsing for the multirests (where barline would be defined in last measure of the mRest) From 7dbb599fdb19b9a02ffec86f427e0c83d707a2cc Mon Sep 17 00:00:00 2001 From: David Bauer Date: Mon, 8 May 2023 10:22:07 +0200 Subject: [PATCH 045/151] Clean previous FunctorParams --- Verovio.xcodeproj/project.pbxproj | 6 -- bindings/iOS/all.h | 6 +- include/vrv/functorparams.h | 123 ------------------------------ include/vrv/scoredef.h | 1 - src/accid.cpp | 1 - src/arpeg.cpp | 1 - src/artic.cpp | 1 - src/barline.cpp | 1 - src/beam.cpp | 1 - src/beamspan.cpp | 1 - src/beatrpt.cpp | 1 - src/bracketspan.cpp | 1 - src/btrem.cpp | 1 - src/chord.cpp | 1 - src/clef.cpp | 1 - src/controlelement.cpp | 1 - src/dir.cpp | 1 - src/doc.cpp | 1 - src/dot.cpp | 1 - src/durationinterface.cpp | 1 - src/dynam.cpp | 1 - src/editorial.cpp | 1 - src/elementpart.cpp | 1 - src/ending.cpp | 1 - src/facsimileinterface.cpp | 1 - src/fermata.cpp | 2 +- src/fig.cpp | 1 - src/ftrem.cpp | 1 - src/gliss.cpp | 1 - src/gracegrp.cpp | 1 - src/grpsym.cpp | 1 - src/hairpin.cpp | 1 - src/halfmrpt.cpp | 1 - src/harm.cpp | 1 - src/horizontalaligner.cpp | 1 - src/iopae.cpp | 1 - src/keyaccid.cpp | 1 - src/keysig.cpp | 1 - src/layer.cpp | 1 - src/layerelement.cpp | 1 - src/ligature.cpp | 1 - src/mdiv.cpp | 1 - src/measure.cpp | 1 - src/mensur.cpp | 1 - src/metersig.cpp | 1 - src/metersiggrp.cpp | 1 - src/mrest.cpp | 1 - src/mrpt.cpp | 1 - src/mrpt2.cpp | 1 - src/mspace.cpp | 1 - src/multirpt.cpp | 1 - src/neume.cpp | 1 - src/note.cpp | 1 - src/object.cpp | 1 - src/page.cpp | 1 - src/pageelement.cpp | 1 - src/pagemilestone.cpp | 1 - src/pb.cpp | 1 - src/pedal.cpp | 3 +- src/pitchinflection.cpp | 1 - src/rend.cpp | 1 - src/rest.cpp | 1 - src/runningelement.cpp | 1 - src/sb.cpp | 1 - src/score.cpp | 1 - src/scoredef.cpp | 1 - src/section.cpp | 1 - src/slur.cpp | 1 - src/space.cpp | 1 - src/staff.cpp | 1 - src/staffdef.cpp | 1 - src/staffgrp.cpp | 1 - src/stem.cpp | 2 +- src/syl.cpp | 1 - src/system.cpp | 1 - src/systemelement.cpp | 1 - src/systemmilestone.cpp | 1 - src/tabdursym.cpp | 2 +- src/tabgrp.cpp | 1 - src/tempo.cpp | 1 - src/tie.cpp | 1 - src/timemap.cpp | 2 +- src/toolkit.cpp | 1 - src/tuplet.cpp | 1 - src/turn.cpp | 3 +- src/verse.cpp | 1 - src/verticalaligner.cpp | 1 - src/view_control.cpp | 2 +- src/view_element.cpp | 2 +- src/view_page.cpp | 2 +- src/view_slur.cpp | 2 +- 91 files changed, 17 insertions(+), 218 deletions(-) delete mode 100644 include/vrv/functorparams.h diff --git a/Verovio.xcodeproj/project.pbxproj b/Verovio.xcodeproj/project.pbxproj index 6fd57e1a04..04dec6a933 100644 --- a/Verovio.xcodeproj/project.pbxproj +++ b/Verovio.xcodeproj/project.pbxproj @@ -879,7 +879,6 @@ 4DF440751D39567A00152B7E /* ending.h in Headers */ = {isa = PBXBuildFile; fileRef = 4DF440741D39567A00152B7E /* ending.h */; }; 4DF440771D39575500152B7E /* ending.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4DF440761D39575500152B7E /* ending.cpp */; }; 4DF440781D39575500152B7E /* ending.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4DF440761D39575500152B7E /* ending.cpp */; }; - 4DF4407A1D3D085600152B7E /* functorparams.h in Headers */ = {isa = PBXBuildFile; fileRef = 4DF440791D3D085600152B7E /* functorparams.h */; }; 4DF4407D1D511D0200152B7E /* systemmilestone.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4DF4407C1D511D0200152B7E /* systemmilestone.cpp */; }; 4DFB3E8523ABDFC200D688C7 /* pitchinflection.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4DFB3E8423ABDFC200D688C7 /* pitchinflection.cpp */; }; 4DFB3E8623ABDFC200D688C7 /* pitchinflection.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4DFB3E8423ABDFC200D688C7 /* pitchinflection.cpp */; }; @@ -1017,7 +1016,6 @@ BB4C4A9422A9328F001F6AF0 /* doc.h in Headers */ = {isa = PBXBuildFile; fileRef = 8F59291418854BF800FE51AD /* doc.h */; settings = {ATTRIBUTES = (Public, ); }; }; BB4C4A9522A9328F001F6AF0 /* floatingobject.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4DF28A041A754DF000BA9F7D /* floatingobject.cpp */; }; BB4C4A9622A9328F001F6AF0 /* floatingobject.h in Headers */ = {isa = PBXBuildFile; fileRef = 4D95D4F41D7185DE00B2B856 /* floatingobject.h */; settings = {ATTRIBUTES = (Public, ); }; }; - BB4C4A9722A9328F001F6AF0 /* functorparams.h in Headers */ = {isa = PBXBuildFile; fileRef = 4DF440791D3D085600152B7E /* functorparams.h */; settings = {ATTRIBUTES = (Public, ); }; }; BB4C4A9822A9328F001F6AF0 /* horizontalaligner.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4D09D3EC1EA8AD8500A420E6 /* horizontalaligner.cpp */; }; BB4C4A9922A9328F001F6AF0 /* horizontalaligner.h in Headers */ = {isa = PBXBuildFile; fileRef = 4D14600F1EA8A913007DB90C /* horizontalaligner.h */; settings = {ATTRIBUTES = (Public, ); }; }; BB4C4A9A22A9328F001F6AF0 /* object.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8F086ECD188539540037FD8E /* object.cpp */; }; @@ -2046,7 +2044,6 @@ 4DF2AF7D1A62F6A50016F869 /* drawinginterface.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = drawinginterface.h; path = include/vrv/drawinginterface.h; sourceTree = ""; }; 4DF440741D39567A00152B7E /* ending.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ending.h; path = include/vrv/ending.h; sourceTree = ""; }; 4DF440761D39575500152B7E /* ending.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = ending.cpp; path = src/ending.cpp; sourceTree = ""; }; - 4DF440791D3D085600152B7E /* functorparams.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = functorparams.h; path = include/vrv/functorparams.h; sourceTree = ""; }; 4DF4407B1D511CEE00152B7E /* systemmilestone.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = systemmilestone.h; path = include/vrv/systemmilestone.h; sourceTree = ""; }; 4DF4407C1D511D0200152B7E /* systemmilestone.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = systemmilestone.cpp; path = src/systemmilestone.cpp; sourceTree = ""; }; 4DFB3E8423ABDFC200D688C7 /* pitchinflection.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = pitchinflection.cpp; path = src/pitchinflection.cpp; sourceTree = ""; }; @@ -2747,7 +2744,6 @@ 4D79643026C6AA720026288B /* featureextractor.h */, 4DF28A041A754DF000BA9F7D /* floatingobject.cpp */, 4D95D4F41D7185DE00B2B856 /* floatingobject.h */, - 4DF440791D3D085600152B7E /* functorparams.h */, 4D09D3EC1EA8AD8500A420E6 /* horizontalaligner.cpp */, 4D14600F1EA8A913007DB90C /* horizontalaligner.h */, 4DE0B9A02988070C00D4C939 /* interface.h */, @@ -3355,7 +3351,6 @@ E79320642991452100D80975 /* calcstemfunctor.h in Headers */, 4D1BD1B921908D78000D35B2 /* halfmrpt.h in Headers */, 4DACC9F42990F29A00B55913 /* atts_visual.h in Headers */, - 4DF4407A1D3D085600152B7E /* functorparams.h in Headers */, 4DA0EADD22BB77AF00A7EBEB /* zone.h in Headers */, E71EF3C32975E4DC00D36264 /* resetfunctor.h in Headers */, 4D763EC91987D067003FCAB5 /* metersig.h in Headers */, @@ -3501,7 +3496,6 @@ 4DACC9952990F29A00B55913 /* atts_neumes.h in Headers */, 4DACC9CF2990F29A00B55913 /* atts_mei.h in Headers */, E79ADDC526BD1AE900527E4B /* runtimeclock.h in Headers */, - BB4C4A9722A9328F001F6AF0 /* functorparams.h in Headers */, E70E2AA129F262A200DB3044 /* miscfunctor.h in Headers */, BB4C4B0222A932BC001F6AF0 /* unclear.h in Headers */, BB4C4B2C22A932CF001F6AF0 /* mordent.h in Headers */, diff --git a/bindings/iOS/all.h b/bindings/iOS/all.h index 983b16356a..c23b905bcb 100644 --- a/bindings/iOS/all.h +++ b/bindings/iOS/all.h @@ -13,8 +13,8 @@ #import #import #import +#import #import -#import #import #import #import @@ -33,6 +33,7 @@ #import #import #import +#import #import #import #import @@ -137,6 +138,7 @@ #import #import #import +#import #import #import #import @@ -152,6 +154,7 @@ #import #import #import +#import #import #import #import @@ -188,6 +191,7 @@ #import #import #import +#import #import #import #import diff --git a/include/vrv/functorparams.h b/include/vrv/functorparams.h deleted file mode 100644 index 731f56c0d5..0000000000 --- a/include/vrv/functorparams.h +++ /dev/null @@ -1,123 +0,0 @@ -///////////////////////////////////////////////////////////////////////////// -// Name: functorparams.h -// Author: Laurent Pugin -// Created: 2016 -// Copyright (c) Authors and others. All rights reserved. -///////////////////////////////////////////////////////////////////////////// - -#ifndef __VRV_FUNCTOR_PARAMS_H__ -#define __VRV_FUNCTOR_PARAMS_H__ - -//---------------------------------------------------------------------------- - -#include "doc.h" -#include "vrvdef.h" - -namespace smf { -class MidiFile; -} - -namespace vrv { - -class Artic; -class SystemMilestoneInterface; -class Chord; -class ClassIdComparison; -class Clef; -class Doc; -class Dot; -class Dots; -class Dynam; -class Ending; -class Output; -class Facsimile; -class FeatureExtractor; -class Functor; -class Hairpin; -class Harm; -class KeySig; -class LabelAbbr; -class Layer; -class LayerElement; -class Measure; -class MeasureAligner; -class Mensur; -class MeterSig; -class MeterSigGrp; -class MRpt; -class Object; -class Page; -class Pedal; -class ScoreDef; -class ScoreDefElement; -class Slur; -class Staff; -class StaffAlignment; -class StaffDef; -class StemmedDrawingInterface; -class Syl; -class SymbolTable; -class System; -class SystemAligner; -class Timemap; -class Transposer; -class TupletNum; -class Turn; -class Verse; - -//---------------------------------------------------------------------------- -// FunctorParams -//---------------------------------------------------------------------------- - -/** - * This is the base class for all MEI att classes. - * It is not an abstract class but it should not be instanciated directly. - * The att classes are generated with the libmei parser for Verovio. - */ - -class FunctorParams { -public: - FunctorParams() {} - virtual ~FunctorParams() {} -}; - -//---------------------------------------------------------------------------- -// Child classes of FunctorParams -//---------------------------------------------------------------------------- - -/** - * This is a basic FunctorParams with only the doc pointer for cases where - * it is the only parameter needed. - * member 0: the Doc - **/ - -class FunctorDocParams : public FunctorParams { -public: - FunctorDocParams(Doc *doc) { m_doc = doc; } - Doc *m_doc; -}; - -//---------------------------------------------------------------------------- -// FindLayerIDWithinStaffDefParams -//---------------------------------------------------------------------------- - -/** - * member 0: a pointer to the element inside Layer StaffDef - * member 1: ID of element to be found - **/ - -class FindLayerIDWithinStaffDefParams : public FunctorParams { -public: - explicit FindLayerIDWithinStaffDefParams(const std::string &xmlId) - { - m_id = xmlId; - m_object = NULL; - } - - const Object *m_object; - std::string m_id; -}; - -} // namespace vrv - -#endif diff --git a/include/vrv/scoredef.h b/include/vrv/scoredef.h index 3a6ab19f04..95ce8b0652 100644 --- a/include/vrv/scoredef.h +++ b/include/vrv/scoredef.h @@ -207,7 +207,6 @@ class ScoreDef : public ScoreDefElement, /** * Set the redraw flag to all staffDefs. * This is necessary at the beginning or when a scoreDef occurs. - * Apply StaffDefRedrawFlags that are defined in functorparams.h */ void SetRedrawFlags(int redrawFlags); diff --git a/src/accid.cpp b/src/accid.cpp index 99755deafd..6307f9adbe 100644 --- a/src/accid.cpp +++ b/src/accid.cpp @@ -15,7 +15,6 @@ #include "doc.h" #include "functor.h" -#include "functorparams.h" #include "note.h" #include "smufl.h" #include "staff.h" diff --git a/src/arpeg.cpp b/src/arpeg.cpp index 883885a43e..49be174e50 100644 --- a/src/arpeg.cpp +++ b/src/arpeg.cpp @@ -16,7 +16,6 @@ #include "chord.h" #include "doc.h" #include "functor.h" -#include "functorparams.h" #include "horizontalaligner.h" #include "note.h" #include "staff.h" diff --git a/src/artic.cpp b/src/artic.cpp index bc0a883dd7..d5ed2436bb 100644 --- a/src/artic.cpp +++ b/src/artic.cpp @@ -18,7 +18,6 @@ #include "elementpart.h" #include "floatingobject.h" #include "functor.h" -#include "functorparams.h" #include "layer.h" #include "smufl.h" #include "staff.h" diff --git a/src/barline.cpp b/src/barline.cpp index bfa0714f17..8e4b3523cc 100644 --- a/src/barline.cpp +++ b/src/barline.cpp @@ -16,7 +16,6 @@ #include "comparison.h" #include "doc.h" #include "functor.h" -#include "functorparams.h" #include "horizontalaligner.h" #include "layer.h" #include "measure.h" diff --git a/src/beam.cpp b/src/beam.cpp index 347e827ac9..948b25020a 100644 --- a/src/beam.cpp +++ b/src/beam.cpp @@ -20,7 +20,6 @@ #include "doc.h" #include "editorial.h" #include "functor.h" -#include "functorparams.h" #include "gracegrp.h" #include "layer.h" #include "measure.h" diff --git a/src/beamspan.cpp b/src/beamspan.cpp index 845e6854ce..ac0fc03d3e 100644 --- a/src/beamspan.cpp +++ b/src/beamspan.cpp @@ -16,7 +16,6 @@ #include "barline.h" #include "comparison.h" #include "functor.h" -#include "functorparams.h" #include "layer.h" #include "measure.h" #include "staff.h" diff --git a/src/beatrpt.cpp b/src/beatrpt.cpp index 5003a59eb2..1faa277e5a 100644 --- a/src/beatrpt.cpp +++ b/src/beatrpt.cpp @@ -17,7 +17,6 @@ #include "chord.h" #include "editorial.h" #include "functor.h" -#include "functorparams.h" #include "layer.h" #include "note.h" #include "staff.h" diff --git a/src/bracketspan.cpp b/src/bracketspan.cpp index 0887731e0a..3e99d79b5f 100644 --- a/src/bracketspan.cpp +++ b/src/bracketspan.cpp @@ -16,7 +16,6 @@ #include "devicecontext.h" #include "doc.h" #include "functor.h" -#include "functorparams.h" #include "verticalaligner.h" #include "vrv.h" diff --git a/src/btrem.cpp b/src/btrem.cpp index 7570e6129b..f25f07758e 100644 --- a/src/btrem.cpp +++ b/src/btrem.cpp @@ -18,7 +18,6 @@ #include "comparison.h" #include "editorial.h" #include "functor.h" -#include "functorparams.h" #include "layer.h" #include "note.h" #include "tuplet.h" diff --git a/src/chord.cpp b/src/chord.cpp index 284c65ce5f..862266f264 100644 --- a/src/chord.cpp +++ b/src/chord.cpp @@ -24,7 +24,6 @@ #include "elementpart.h" #include "fermata.h" #include "functor.h" -#include "functorparams.h" #include "gracegrp.h" #include "horizontalaligner.h" #include "layer.h" diff --git a/src/clef.cpp b/src/clef.cpp index b4d5abcdaf..664245fde7 100644 --- a/src/clef.cpp +++ b/src/clef.cpp @@ -16,7 +16,6 @@ #include "comparison.h" #include "doc.h" #include "functor.h" -#include "functorparams.h" #include "layer.h" #include "scoredefinterface.h" #include "smufl.h" diff --git a/src/controlelement.cpp b/src/controlelement.cpp index 28c6b243d3..8393ce0d6c 100644 --- a/src/controlelement.cpp +++ b/src/controlelement.cpp @@ -14,7 +14,6 @@ //---------------------------------------------------------------------------- #include "functor.h" -#include "functorparams.h" #include "layer.h" #include "rend.h" #include "system.h" diff --git a/src/dir.cpp b/src/dir.cpp index ad374ca4c3..7890a9db07 100644 --- a/src/dir.cpp +++ b/src/dir.cpp @@ -16,7 +16,6 @@ #include "comparison.h" #include "editorial.h" #include "functor.h" -#include "functorparams.h" #include "symbol.h" #include "text.h" #include "verticalaligner.h" diff --git a/src/doc.cpp b/src/doc.cpp index 8d4e90e537..9854b447f1 100644 --- a/src/doc.cpp +++ b/src/doc.cpp @@ -25,7 +25,6 @@ #include "expansion.h" #include "featureextractor.h" #include "functor.h" -#include "functorparams.h" #include "glyph.h" #include "instrdef.h" #include "iomei.h" diff --git a/src/dot.cpp b/src/dot.cpp index 1b877d75d2..a057636b6a 100644 --- a/src/dot.cpp +++ b/src/dot.cpp @@ -14,7 +14,6 @@ //---------------------------------------------------------------------------- #include "functor.h" -#include "functorparams.h" #include "note.h" namespace vrv { diff --git a/src/durationinterface.cpp b/src/durationinterface.cpp index 7372309e1a..92308cbc96 100644 --- a/src/durationinterface.cpp +++ b/src/durationinterface.cpp @@ -17,7 +17,6 @@ #include "beam.h" #include "chord.h" -#include "functorparams.h" #include "mensur.h" #include "note.h" #include "vrv.h" diff --git a/src/dynam.cpp b/src/dynam.cpp index ef802becc9..600340597b 100644 --- a/src/dynam.cpp +++ b/src/dynam.cpp @@ -16,7 +16,6 @@ #include "editorial.h" #include "functor.h" -#include "functorparams.h" #include "hairpin.h" #include "rend.h" #include "smufl.h" diff --git a/src/editorial.cpp b/src/editorial.cpp index 5323fb0588..80a1b4548f 100644 --- a/src/editorial.cpp +++ b/src/editorial.cpp @@ -17,7 +17,6 @@ #include "controlelement.h" #include "fig.h" #include "functor.h" -#include "functorparams.h" #include "layer.h" #include "measure.h" #include "scoredef.h" diff --git a/src/elementpart.cpp b/src/elementpart.cpp index 62c916d375..c63278f88a 100644 --- a/src/elementpart.cpp +++ b/src/elementpart.cpp @@ -17,7 +17,6 @@ #include "chord.h" #include "doc.h" #include "functor.h" -#include "functorparams.h" #include "layer.h" #include "note.h" #include "smufl.h" diff --git a/src/ending.cpp b/src/ending.cpp index 0823577bc8..04eeb4cc79 100644 --- a/src/ending.cpp +++ b/src/ending.cpp @@ -15,7 +15,6 @@ #include "editorial.h" #include "functor.h" -#include "functorparams.h" #include "measure.h" #include "scoredef.h" #include "section.h" diff --git a/src/facsimileinterface.cpp b/src/facsimileinterface.cpp index a44c03cbbe..6ef3a50b88 100644 --- a/src/facsimileinterface.cpp +++ b/src/facsimileinterface.cpp @@ -15,7 +15,6 @@ #include "doc.h" #include "facsimile.h" -#include "functorparams.h" #include "surface.h" #include "syllable.h" #include "view.h" diff --git a/src/fermata.cpp b/src/fermata.cpp index 61dcb4cf98..bd052f2636 100644 --- a/src/fermata.cpp +++ b/src/fermata.cpp @@ -14,7 +14,7 @@ //---------------------------------------------------------------------------- #include "functor.h" -#include "functorparams.h" +#include "resources.h" #include "smufl.h" #include "verticalaligner.h" diff --git a/src/fig.cpp b/src/fig.cpp index aa8d235941..343669caec 100644 --- a/src/fig.cpp +++ b/src/fig.cpp @@ -14,7 +14,6 @@ //---------------------------------------------------------------------------- #include "functor.h" -#include "functorparams.h" #include "svg.h" #include "vrv.h" diff --git a/src/ftrem.cpp b/src/ftrem.cpp index 30e752a952..be969f89c2 100644 --- a/src/ftrem.cpp +++ b/src/ftrem.cpp @@ -17,7 +17,6 @@ #include "chord.h" #include "editorial.h" #include "functor.h" -#include "functorparams.h" #include "layer.h" #include "note.h" #include "staff.h" diff --git a/src/gliss.cpp b/src/gliss.cpp index 26c689c1f6..37a16fb543 100644 --- a/src/gliss.cpp +++ b/src/gliss.cpp @@ -16,7 +16,6 @@ #include "devicecontext.h" #include "doc.h" #include "functor.h" -#include "functorparams.h" #include "vrv.h" namespace vrv { diff --git a/src/gracegrp.cpp b/src/gracegrp.cpp index 8595c31b23..04ec116550 100644 --- a/src/gracegrp.cpp +++ b/src/gracegrp.cpp @@ -17,7 +17,6 @@ #include "chord.h" #include "editorial.h" #include "functor.h" -#include "functorparams.h" #include "note.h" #include "rest.h" #include "space.h" diff --git a/src/grpsym.cpp b/src/grpsym.cpp index 9fc9697733..71e51e2e07 100644 --- a/src/grpsym.cpp +++ b/src/grpsym.cpp @@ -15,7 +15,6 @@ #include "comparison.h" #include "functor.h" -#include "functorparams.h" #include "staffgrp.h" #include "vrv.h" diff --git a/src/hairpin.cpp b/src/hairpin.cpp index cb78221aa8..303bf0edfa 100644 --- a/src/hairpin.cpp +++ b/src/hairpin.cpp @@ -18,7 +18,6 @@ #include "doc.h" #include "dynam.h" #include "functor.h" -#include "functorparams.h" #include "measure.h" #include "system.h" #include "verticalaligner.h" diff --git a/src/halfmrpt.cpp b/src/halfmrpt.cpp index b3d034f777..cb7d57a7b0 100644 --- a/src/halfmrpt.cpp +++ b/src/halfmrpt.cpp @@ -17,7 +17,6 @@ #include "chord.h" #include "editorial.h" #include "functor.h" -#include "functorparams.h" #include "layer.h" #include "note.h" #include "staff.h" diff --git a/src/harm.cpp b/src/harm.cpp index c342dc01d3..6beb26b6a4 100644 --- a/src/harm.cpp +++ b/src/harm.cpp @@ -18,7 +18,6 @@ #include "f.h" #include "fb.h" #include "functor.h" -#include "functorparams.h" #include "measure.h" #include "system.h" #include "text.h" diff --git a/src/horizontalaligner.cpp b/src/horizontalaligner.cpp index 2fcfb213ed..4e728a2ef9 100644 --- a/src/horizontalaligner.cpp +++ b/src/horizontalaligner.cpp @@ -20,7 +20,6 @@ #include "elementpart.h" #include "floatingobject.h" #include "functor.h" -#include "functorparams.h" #include "layer.h" #include "measure.h" #include "miscfunctor.h" diff --git a/src/iopae.cpp b/src/iopae.cpp index 66f5ae5a63..38d30416fe 100644 --- a/src/iopae.cpp +++ b/src/iopae.cpp @@ -25,7 +25,6 @@ #include "doc.h" #include "dot.h" #include "fermata.h" -#include "functorparams.h" #include "gracegrp.h" #include "keyaccid.h" #include "keysig.h" diff --git a/src/keyaccid.cpp b/src/keyaccid.cpp index 3afafed947..db66c82f26 100644 --- a/src/keyaccid.cpp +++ b/src/keyaccid.cpp @@ -16,7 +16,6 @@ #include "accid.h" #include "doc.h" #include "functor.h" -#include "functorparams.h" #include "keysig.h" #include "note.h" #include "smufl.h" diff --git a/src/keysig.cpp b/src/keysig.cpp index cabfafb92a..fc7737716b 100644 --- a/src/keysig.cpp +++ b/src/keysig.cpp @@ -18,7 +18,6 @@ #include "comparison.h" #include "editorial.h" #include "functor.h" -#include "functorparams.h" #include "keyaccid.h" #include "scoredefinterface.h" #include "smufl.h" diff --git a/src/layer.cpp b/src/layer.cpp index d713f493bb..66c908be7e 100644 --- a/src/layer.cpp +++ b/src/layer.cpp @@ -23,7 +23,6 @@ #include "editorial.h" #include "findlayerelementsfunctor.h" #include "functor.h" -#include "functorparams.h" #include "keysig.h" #include "measure.h" #include "mensur.h" diff --git a/src/layerelement.cpp b/src/layerelement.cpp index 8792d01f90..d55101e867 100644 --- a/src/layerelement.cpp +++ b/src/layerelement.cpp @@ -33,7 +33,6 @@ #include "elementpart.h" #include "ftrem.h" #include "functor.h" -#include "functorparams.h" #include "horizontalaligner.h" #include "keysig.h" #include "layer.h" diff --git a/src/ligature.cpp b/src/ligature.cpp index 35f2e6290a..abb01e7343 100644 --- a/src/ligature.cpp +++ b/src/ligature.cpp @@ -18,7 +18,6 @@ #include "dot.h" #include "editorial.h" #include "functor.h" -#include "functorparams.h" #include "note.h" #include "staff.h" #include "vrv.h" diff --git a/src/mdiv.cpp b/src/mdiv.cpp index c248f520fa..3f204d4b5b 100644 --- a/src/mdiv.cpp +++ b/src/mdiv.cpp @@ -14,7 +14,6 @@ //---------------------------------------------------------------------------- #include "functor.h" -#include "functorparams.h" #include "iomei.h" #include "page.h" #include "pages.h" diff --git a/src/measure.cpp b/src/measure.cpp index 965a4b1dbc..4c5adaf783 100644 --- a/src/measure.cpp +++ b/src/measure.cpp @@ -24,7 +24,6 @@ #include "ending.h" #include "f.h" #include "functor.h" -#include "functorparams.h" #include "hairpin.h" #include "harm.h" #include "multirest.h" diff --git a/src/mensur.cpp b/src/mensur.cpp index a74d13c8b5..08d33a54ea 100644 --- a/src/mensur.cpp +++ b/src/mensur.cpp @@ -15,7 +15,6 @@ //---------------------------------------------------------------------------- #include "functor.h" -#include "functorparams.h" #include "scoredefinterface.h" #include "vrv.h" diff --git a/src/metersig.cpp b/src/metersig.cpp index 68ef66d4fd..c1310484dc 100644 --- a/src/metersig.cpp +++ b/src/metersig.cpp @@ -16,7 +16,6 @@ //---------------------------------------------------------------------------- #include "functor.h" -#include "functorparams.h" #include "scoredefinterface.h" #include "smufl.h" #include "vrv.h" diff --git a/src/metersiggrp.cpp b/src/metersiggrp.cpp index 0c0e68dc5c..fec57ac6d8 100644 --- a/src/metersiggrp.cpp +++ b/src/metersiggrp.cpp @@ -14,7 +14,6 @@ //---------------------------------------------------------------------------- #include "functor.h" -#include "functorparams.h" #include "metersig.h" #include "vrv.h" diff --git a/src/mrest.cpp b/src/mrest.cpp index bac9439204..ecb0c46273 100644 --- a/src/mrest.cpp +++ b/src/mrest.cpp @@ -16,7 +16,6 @@ #include "comparison.h" #include "fermata.h" #include "functor.h" -#include "functorparams.h" #include "layer.h" #include "pitchinterface.h" #include "rest.h" diff --git a/src/mrpt.cpp b/src/mrpt.cpp index b4c14819a7..02508db796 100644 --- a/src/mrpt.cpp +++ b/src/mrpt.cpp @@ -17,7 +17,6 @@ #include "chord.h" #include "editorial.h" #include "functor.h" -#include "functorparams.h" #include "layer.h" #include "note.h" #include "staff.h" diff --git a/src/mrpt2.cpp b/src/mrpt2.cpp index 7ade52b7c1..d2784a82c2 100644 --- a/src/mrpt2.cpp +++ b/src/mrpt2.cpp @@ -17,7 +17,6 @@ #include "chord.h" #include "editorial.h" #include "functor.h" -#include "functorparams.h" #include "layer.h" #include "note.h" #include "staff.h" diff --git a/src/mspace.cpp b/src/mspace.cpp index 3edd09ea5b..4d5658cca8 100644 --- a/src/mspace.cpp +++ b/src/mspace.cpp @@ -13,7 +13,6 @@ //---------------------------------------------------------------------------- #include "functor.h" -#include "functorparams.h" namespace vrv { diff --git a/src/multirpt.cpp b/src/multirpt.cpp index 175809514a..9a7204557c 100644 --- a/src/multirpt.cpp +++ b/src/multirpt.cpp @@ -17,7 +17,6 @@ #include "chord.h" #include "editorial.h" #include "functor.h" -#include "functorparams.h" #include "layer.h" #include "note.h" #include "staff.h" diff --git a/src/neume.cpp b/src/neume.cpp index 0fc168c9ec..3c586af482 100644 --- a/src/neume.cpp +++ b/src/neume.cpp @@ -19,7 +19,6 @@ #include "editorial.h" #include "elementpart.h" #include "functor.h" -#include "functorparams.h" #include "glyph.h" #include "layer.h" #include "nc.h" diff --git a/src/note.cpp b/src/note.cpp index d17b6879bf..f80b5b395b 100644 --- a/src/note.cpp +++ b/src/note.cpp @@ -21,7 +21,6 @@ #include "elementpart.h" #include "fermata.h" #include "functor.h" -#include "functorparams.h" #include "glyph.h" #include "gracegrp.h" #include "layer.h" diff --git a/src/object.cpp b/src/object.cpp index b71ea6b719..c2433662cb 100644 --- a/src/object.cpp +++ b/src/object.cpp @@ -28,7 +28,6 @@ #include "editorial.h" #include "featureextractor.h" #include "findfunctor.h" -#include "functorparams.h" #include "io.h" #include "keysig.h" #include "layer.h" diff --git a/src/page.cpp b/src/page.cpp index d017c8e441..df8ded3e83 100644 --- a/src/page.cpp +++ b/src/page.cpp @@ -50,7 +50,6 @@ #include "comparison.h" #include "doc.h" #include "functor.h" -#include "functorparams.h" #include "justifyfunctor.h" #include "libmei.h" #include "miscfunctor.h" diff --git a/src/pageelement.cpp b/src/pageelement.cpp index 1bcbfe47dd..4505dc6f46 100644 --- a/src/pageelement.cpp +++ b/src/pageelement.cpp @@ -14,7 +14,6 @@ //---------------------------------------------------------------------------- #include "functor.h" -#include "functorparams.h" #include "page.h" namespace vrv { diff --git a/src/pagemilestone.cpp b/src/pagemilestone.cpp index 4e3dbee84d..d3231460f0 100644 --- a/src/pagemilestone.cpp +++ b/src/pagemilestone.cpp @@ -15,7 +15,6 @@ #include "ending.h" #include "functor.h" -#include "functorparams.h" #include "page.h" #include "system.h" #include "vrv.h" diff --git a/src/pb.cpp b/src/pb.cpp index 6225554c9b..1ec33460e6 100644 --- a/src/pb.cpp +++ b/src/pb.cpp @@ -16,7 +16,6 @@ #include "doc.h" #include "editorial.h" #include "functor.h" -#include "functorparams.h" #include "page.h" #include "pages.h" #include "system.h" diff --git a/src/pedal.cpp b/src/pedal.cpp index 9554d56609..741c3be4ae 100644 --- a/src/pedal.cpp +++ b/src/pedal.cpp @@ -13,10 +13,11 @@ //---------------------------------------------------------------------------- +#include "doc.h" #include "functor.h" -#include "functorparams.h" #include "horizontalaligner.h" #include "layerelement.h" +#include "resources.h" #include "smufl.h" #include "system.h" #include "vrv.h" diff --git a/src/pitchinflection.cpp b/src/pitchinflection.cpp index 2f8600b4a6..92ab725150 100644 --- a/src/pitchinflection.cpp +++ b/src/pitchinflection.cpp @@ -14,7 +14,6 @@ //---------------------------------------------------------------------------- #include "functor.h" -#include "functorparams.h" #include "vrv.h" namespace vrv { diff --git a/src/rend.cpp b/src/rend.cpp index fbc8945a38..30c65e3d77 100644 --- a/src/rend.cpp +++ b/src/rend.cpp @@ -15,7 +15,6 @@ #include "editorial.h" #include "functor.h" -#include "functorparams.h" #include "lb.h" #include "num.h" #include "symbol.h" diff --git a/src/rest.cpp b/src/rest.cpp index e1fb03f923..dcba491ed2 100644 --- a/src/rest.cpp +++ b/src/rest.cpp @@ -19,7 +19,6 @@ #include "elementpart.h" #include "fermata.h" #include "findlayerelementsfunctor.h" -#include "functorparams.h" #include "layer.h" #include "smufl.h" #include "staff.h" diff --git a/src/runningelement.cpp b/src/runningelement.cpp index c593a01715..e97e1a4c44 100644 --- a/src/runningelement.cpp +++ b/src/runningelement.cpp @@ -17,7 +17,6 @@ #include "editorial.h" #include "fig.h" #include "functor.h" -#include "functorparams.h" #include "num.h" #include "page.h" #include "rend.h" diff --git a/src/sb.cpp b/src/sb.cpp index 8276dbb674..f636c4851d 100644 --- a/src/sb.cpp +++ b/src/sb.cpp @@ -16,7 +16,6 @@ #include "doc.h" #include "editorial.h" #include "functor.h" -#include "functorparams.h" #include "measure.h" #include "page.h" #include "system.h" diff --git a/src/score.cpp b/src/score.cpp index 68a82af119..c7cb1548a6 100644 --- a/src/score.cpp +++ b/src/score.cpp @@ -18,7 +18,6 @@ #include "editorial.h" #include "ending.h" #include "functor.h" -#include "functorparams.h" #include "page.h" #include "pages.h" #include "pb.h" diff --git a/src/scoredef.cpp b/src/scoredef.cpp index 15bfcb5ff3..f40f10be84 100644 --- a/src/scoredef.cpp +++ b/src/scoredef.cpp @@ -17,7 +17,6 @@ #include "comparison.h" #include "editorial.h" #include "functor.h" -#include "functorparams.h" #include "grpsym.h" #include "keysig.h" #include "label.h" diff --git a/src/section.cpp b/src/section.cpp index 634a006e2d..e51f0feaf3 100644 --- a/src/section.cpp +++ b/src/section.cpp @@ -17,7 +17,6 @@ #include "editorial.h" #include "ending.h" #include "functor.h" -#include "functorparams.h" #include "measure.h" #include "page.h" #include "pages.h" diff --git a/src/slur.cpp b/src/slur.cpp index 66bfbfa056..162536863d 100644 --- a/src/slur.cpp +++ b/src/slur.cpp @@ -23,7 +23,6 @@ #include "findlayerelementsfunctor.h" #include "ftrem.h" #include "functor.h" -#include "functorparams.h" #include "layer.h" #include "layerelement.h" #include "note.h" diff --git a/src/space.cpp b/src/space.cpp index 2e0a9dbb5d..36ec94559b 100644 --- a/src/space.cpp +++ b/src/space.cpp @@ -14,7 +14,6 @@ //---------------------------------------------------------------------------- #include "functor.h" -#include "functorparams.h" #include "horizontalaligner.h" #include "vrv.h" diff --git a/src/staff.cpp b/src/staff.cpp index bc8cd81e85..92489227f8 100644 --- a/src/staff.cpp +++ b/src/staff.cpp @@ -19,7 +19,6 @@ #include "doc.h" #include "editorial.h" #include "functor.h" -#include "functorparams.h" #include "hairpin.h" #include "keysig.h" #include "layer.h" diff --git a/src/staffdef.cpp b/src/staffdef.cpp index 7f239ae1cd..36e39b4e8a 100644 --- a/src/staffdef.cpp +++ b/src/staffdef.cpp @@ -14,7 +14,6 @@ //---------------------------------------------------------------------------- #include "functor.h" -#include "functorparams.h" #include "instrdef.h" #include "label.h" #include "labelabbr.h" diff --git a/src/staffgrp.cpp b/src/staffgrp.cpp index 93836c82ac..bdce134550 100644 --- a/src/staffgrp.cpp +++ b/src/staffgrp.cpp @@ -16,7 +16,6 @@ #include "comparison.h" #include "editorial.h" #include "functor.h" -#include "functorparams.h" #include "instrdef.h" #include "label.h" #include "labelabbr.h" diff --git a/src/stem.cpp b/src/stem.cpp index b5386629e6..a43426c51f 100644 --- a/src/stem.cpp +++ b/src/stem.cpp @@ -15,9 +15,9 @@ #include "btrem.h" #include "chord.h" +#include "doc.h" #include "elementpart.h" #include "functor.h" -#include "functorparams.h" #include "note.h" #include "smufl.h" #include "staff.h" diff --git a/src/syl.cpp b/src/syl.cpp index 0915e40970..acc467862f 100644 --- a/src/syl.cpp +++ b/src/syl.cpp @@ -16,7 +16,6 @@ #include "doc.h" #include "editorial.h" #include "functor.h" -#include "functorparams.h" #include "measure.h" #include "note.h" #include "smufl.h" diff --git a/src/system.cpp b/src/system.cpp index 10f8bb48a8..7b50793a5f 100644 --- a/src/system.cpp +++ b/src/system.cpp @@ -22,7 +22,6 @@ #include "ending.h" #include "findfunctor.h" #include "findlayerelementsfunctor.h" -#include "functorparams.h" #include "layer.h" #include "measure.h" #include "miscfunctor.h" diff --git a/src/systemelement.cpp b/src/systemelement.cpp index a27dec1505..0eefd7980b 100644 --- a/src/systemelement.cpp +++ b/src/systemelement.cpp @@ -14,7 +14,6 @@ //---------------------------------------------------------------------------- #include "functor.h" -#include "functorparams.h" #include "system.h" namespace vrv { diff --git a/src/systemmilestone.cpp b/src/systemmilestone.cpp index 2a317b8a4f..5a30a1058e 100644 --- a/src/systemmilestone.cpp +++ b/src/systemmilestone.cpp @@ -15,7 +15,6 @@ #include "ending.h" #include "functor.h" -#include "functorparams.h" #include "preparedatafunctor.h" #include "system.h" #include "vrv.h" diff --git a/src/tabdursym.cpp b/src/tabdursym.cpp index 906a3ad579..040bd686ff 100644 --- a/src/tabdursym.cpp +++ b/src/tabdursym.cpp @@ -13,9 +13,9 @@ //---------------------------------------------------------------------------- +#include "doc.h" #include "elementpart.h" #include "functor.h" -#include "functorparams.h" #include "layer.h" #include "note.h" #include "staff.h" diff --git a/src/tabgrp.cpp b/src/tabgrp.cpp index 54c786bac1..5e76de9765 100644 --- a/src/tabgrp.cpp +++ b/src/tabgrp.cpp @@ -15,7 +15,6 @@ #include "editorial.h" #include "functor.h" -#include "functorparams.h" #include "note.h" #include "tabdursym.h" diff --git a/src/tempo.cpp b/src/tempo.cpp index 52978a5b5d..7d3fe9505d 100644 --- a/src/tempo.cpp +++ b/src/tempo.cpp @@ -16,7 +16,6 @@ #include "comparison.h" #include "editorial.h" #include "functor.h" -#include "functorparams.h" #include "measure.h" #include "staff.h" #include "system.h" diff --git a/src/tie.cpp b/src/tie.cpp index 4c263973fa..826e4d09a2 100644 --- a/src/tie.cpp +++ b/src/tie.cpp @@ -19,7 +19,6 @@ #include "dot.h" #include "elementpart.h" #include "functor.h" -#include "functorparams.h" #include "layer.h" #include "note.h" #include "slur.h" diff --git a/src/timemap.cpp b/src/timemap.cpp index 8630131f24..6e48ff1679 100644 --- a/src/timemap.cpp +++ b/src/timemap.cpp @@ -13,7 +13,7 @@ //---------------------------------------------------------------------------- -#include "functorparams.h" +#include "jsonxx.h" #include "measure.h" #include "note.h" #include "rest.h" diff --git a/src/toolkit.cpp b/src/toolkit.cpp index 3afed5124a..7aa714721c 100644 --- a/src/toolkit.cpp +++ b/src/toolkit.cpp @@ -22,7 +22,6 @@ #include "editortoolkit_mensural.h" #include "editortoolkit_neume.h" #include "findfunctor.h" -#include "functorparams.h" #include "ioabc.h" #include "iodarms.h" #include "iohumdrum.h" diff --git a/src/tuplet.cpp b/src/tuplet.cpp index c721610430..517bd46f82 100644 --- a/src/tuplet.cpp +++ b/src/tuplet.cpp @@ -22,7 +22,6 @@ #include "elementpart.h" #include "ftrem.h" #include "functor.h" -#include "functorparams.h" #include "note.h" #include "rest.h" #include "space.h" diff --git a/src/turn.cpp b/src/turn.cpp index f0de2d287d..21f338ef56 100644 --- a/src/turn.cpp +++ b/src/turn.cpp @@ -13,9 +13,10 @@ //---------------------------------------------------------------------------- +#include "doc.h" #include "functor.h" -#include "functorparams.h" #include "layerelement.h" +#include "resources.h" #include "smufl.h" #include "verticalaligner.h" diff --git a/src/verse.cpp b/src/verse.cpp index a66ce728f9..e2e5cf1abb 100644 --- a/src/verse.cpp +++ b/src/verse.cpp @@ -17,7 +17,6 @@ #include "doc.h" #include "editorial.h" #include "functor.h" -#include "functorparams.h" #include "label.h" #include "labelabbr.h" #include "layer.h" diff --git a/src/verticalaligner.cpp b/src/verticalaligner.cpp index c8fefe4065..db24109f76 100644 --- a/src/verticalaligner.cpp +++ b/src/verticalaligner.cpp @@ -19,7 +19,6 @@ #include "doc.h" #include "floatingobject.h" #include "functor.h" -#include "functorparams.h" #include "scoredef.h" #include "slur.h" #include "smufl.h" diff --git a/src/view_control.cpp b/src/view_control.cpp index 82f3ed9121..f5e26ae01f 100644 --- a/src/view_control.cpp +++ b/src/view_control.cpp @@ -24,13 +24,13 @@ #include "comparison.h" #include "devicecontext.h" #include "dir.h" +#include "doc.h" #include "dynam.h" #include "ending.h" #include "f.h" #include "fb.h" #include "fermata.h" #include "fing.h" -#include "functorparams.h" #include "gliss.h" #include "hairpin.h" #include "harm.h" diff --git a/src/view_element.cpp b/src/view_element.cpp index 58c5cb1daa..c45269d558 100644 --- a/src/view_element.cpp +++ b/src/view_element.cpp @@ -23,12 +23,12 @@ #include "clef.h" #include "custos.h" #include "devicecontext.h" +#include "doc.h" #include "dot.h" #include "dynam.h" #include "elementpart.h" #include "f.h" #include "ftrem.h" -#include "functorparams.h" #include "halfmrpt.h" #include "keyaccid.h" #include "label.h" diff --git a/src/view_page.cpp b/src/view_page.cpp index 25727abe49..72316e2d54 100644 --- a/src/view_page.cpp +++ b/src/view_page.cpp @@ -23,12 +23,12 @@ #include "comparison.h" #include "controlelement.h" #include "devicecontext.h" +#include "doc.h" #include "editorial.h" #include "ending.h" #include "f.h" #include "fb.h" #include "fig.h" -#include "functorparams.h" #include "glyph.h" #include "keysig.h" #include "label.h" diff --git a/src/view_slur.cpp b/src/view_slur.cpp index f6dccf3413..64c26ae0ea 100644 --- a/src/view_slur.cpp +++ b/src/view_slur.cpp @@ -16,7 +16,7 @@ //---------------------------------------------------------------------------- #include "bboxdevicecontext.h" -#include "functorparams.h" +#include "doc.h" #include "layer.h" #include "layerelement.h" #include "note.h" From 8a187e39f07aa44113356d0082d2971701c2c7f0 Mon Sep 17 00:00:00 2001 From: David Bauer Date: Mon, 8 May 2023 10:37:30 +0200 Subject: [PATCH 046/151] Rename MutableFunctor to Functor --- include/vrv/accid.h | 4 +-- include/vrv/adjustxoverflowfunctor.h | 2 +- .../vrv/adjustxrelfortranscriptionfunctor.h | 2 +- include/vrv/anchoredtext.h | 4 +-- include/vrv/arpeg.h | 4 +-- include/vrv/artic.h | 4 +-- include/vrv/barline.h | 4 +-- include/vrv/beam.h | 4 +-- include/vrv/beamspan.h | 4 +-- include/vrv/beatrpt.h | 4 +-- include/vrv/bracketspan.h | 4 +-- include/vrv/breath.h | 4 +-- include/vrv/btrem.h | 4 +-- include/vrv/caesura.h | 4 +-- include/vrv/castofffunctor.h | 2 +- include/vrv/chord.h | 4 +-- include/vrv/clef.h | 4 +-- include/vrv/controlelement.h | 4 +-- include/vrv/convertfunctor.h | 8 ++--- include/vrv/course.h | 4 +-- include/vrv/custos.h | 4 +-- include/vrv/dir.h | 4 +-- include/vrv/doc.h | 4 +-- include/vrv/dot.h | 4 +-- include/vrv/dynam.h | 4 +-- include/vrv/editorial.h | 4 +-- include/vrv/elementpart.h | 16 ++++----- include/vrv/ending.h | 4 +-- include/vrv/expansion.h | 4 +-- include/vrv/f.h | 4 +-- include/vrv/fb.h | 4 +-- include/vrv/fermata.h | 4 +-- include/vrv/fig.h | 4 +-- include/vrv/findfunctor.h | 4 +-- include/vrv/fing.h | 4 +-- include/vrv/floatingobject.h | 4 +-- include/vrv/ftrem.h | 4 +-- include/vrv/functor.h | 10 +++--- include/vrv/gliss.h | 4 +-- include/vrv/gracegrp.h | 4 +-- include/vrv/grpsym.h | 4 +-- include/vrv/hairpin.h | 4 +-- include/vrv/halfmrpt.h | 4 +-- include/vrv/harm.h | 4 +-- include/vrv/horizontalaligner.h | 24 ++++++------- include/vrv/instrdef.h | 4 +-- include/vrv/keyaccid.h | 4 +-- include/vrv/keysig.h | 4 +-- include/vrv/label.h | 4 +-- include/vrv/labelabbr.h | 4 +-- include/vrv/layer.h | 4 +-- include/vrv/layerdef.h | 4 +-- include/vrv/layerelement.h | 4 +-- include/vrv/lb.h | 4 +-- include/vrv/ligature.h | 4 +-- include/vrv/lv.h | 4 +-- include/vrv/mdiv.h | 4 +-- include/vrv/measure.h | 4 +-- include/vrv/mensur.h | 4 +-- include/vrv/metersig.h | 4 +-- include/vrv/metersiggrp.h | 4 +-- include/vrv/midifunctor.h | 6 ++-- include/vrv/miscfunctor.h | 4 +-- include/vrv/mnum.h | 4 +-- include/vrv/mordent.h | 4 +-- include/vrv/mrest.h | 4 +-- include/vrv/mrpt.h | 4 +-- include/vrv/mrpt2.h | 4 +-- include/vrv/mspace.h | 4 +-- include/vrv/multirest.h | 4 +-- include/vrv/multirpt.h | 4 +-- include/vrv/nc.h | 4 +-- include/vrv/neume.h | 4 +-- include/vrv/note.h | 4 +-- include/vrv/num.h | 4 +-- include/vrv/object.h | 8 ++--- include/vrv/octave.h | 4 +-- include/vrv/ornam.h | 4 +-- include/vrv/page.h | 4 +-- include/vrv/pageelement.h | 4 +-- include/vrv/pagemilestone.h | 4 +-- include/vrv/pages.h | 4 +-- include/vrv/pb.h | 4 +-- include/vrv/pedal.h | 4 +-- include/vrv/pgfoot.h | 4 +-- include/vrv/pgfoot2.h | 4 +-- include/vrv/pghead.h | 4 +-- include/vrv/pghead2.h | 4 +-- include/vrv/phrase.h | 4 +-- include/vrv/pitchinflection.h | 4 +-- include/vrv/plica.h | 4 +-- include/vrv/preparedatafunctor.h | 36 +++++++++---------- include/vrv/proport.h | 4 +-- include/vrv/reh.h | 4 +-- include/vrv/rend.h | 4 +-- include/vrv/resetfunctor.h | 6 ++-- include/vrv/rest.h | 4 +-- include/vrv/runningelement.h | 4 +-- include/vrv/savefunctor.h | 2 +- include/vrv/sb.h | 4 +-- include/vrv/score.h | 4 +-- include/vrv/scoredef.h | 8 ++--- include/vrv/section.h | 4 +-- include/vrv/setscoredeffunctor.h | 10 +++--- include/vrv/slur.h | 4 +-- include/vrv/space.h | 4 +-- include/vrv/staff.h | 4 +-- include/vrv/staffdef.h | 4 +-- include/vrv/staffgrp.h | 4 +-- include/vrv/stem.h | 4 +-- include/vrv/svg.h | 4 +-- include/vrv/syl.h | 4 +-- include/vrv/syllable.h | 4 +-- include/vrv/symbol.h | 4 +-- include/vrv/system.h | 4 +-- include/vrv/systemelement.h | 4 +-- include/vrv/systemmilestone.h | 4 +-- include/vrv/tabdursym.h | 4 +-- include/vrv/tabgrp.h | 4 +-- include/vrv/tempo.h | 4 +-- include/vrv/text.h | 4 +-- include/vrv/textelement.h | 4 +-- include/vrv/tie.h | 4 +-- include/vrv/timestamp.h | 4 +-- include/vrv/trill.h | 4 +-- include/vrv/tuning.h | 4 +-- include/vrv/tuplet.h | 4 +-- include/vrv/turn.h | 4 +-- include/vrv/verse.h | 4 +-- include/vrv/verticalaligner.h | 8 ++--- src/accid.cpp | 4 +-- src/anchoredtext.cpp | 4 +-- src/arpeg.cpp | 4 +-- src/artic.cpp | 4 +-- src/barline.cpp | 4 +-- src/beam.cpp | 4 +-- src/beamspan.cpp | 4 +-- src/beatrpt.cpp | 4 +-- src/bracketspan.cpp | 4 +-- src/breath.cpp | 4 +-- src/btrem.cpp | 4 +-- src/caesura.cpp | 4 +-- src/chord.cpp | 4 +-- src/clef.cpp | 4 +-- src/controlelement.cpp | 4 +-- src/course.cpp | 4 +-- src/custos.cpp | 4 +-- src/dir.cpp | 4 +-- src/doc.cpp | 4 +-- src/dot.cpp | 4 +-- src/dynam.cpp | 4 +-- src/editorial.cpp | 4 +-- src/elementpart.cpp | 16 ++++----- src/ending.cpp | 4 +-- src/expansion.cpp | 4 +-- src/f.cpp | 4 +-- src/fb.cpp | 4 +-- src/fermata.cpp | 4 +-- src/fig.cpp | 4 +-- src/findfunctor.cpp | 3 +- src/fing.cpp | 4 +-- src/floatingobject.cpp | 4 +-- src/ftrem.cpp | 4 +-- src/gliss.cpp | 4 +-- src/gracegrp.cpp | 4 +-- src/grpsym.cpp | 4 +-- src/hairpin.cpp | 4 +-- src/halfmrpt.cpp | 4 +-- src/harm.cpp | 4 +-- src/horizontalaligner.cpp | 24 ++++++------- src/instrdef.cpp | 4 +-- src/keyaccid.cpp | 4 +-- src/keysig.cpp | 4 +-- src/label.cpp | 4 +-- src/labelabbr.cpp | 4 +-- src/layer.cpp | 4 +-- src/layerdef.cpp | 4 +-- src/layerelement.cpp | 4 +-- src/lb.cpp | 4 +-- src/ligature.cpp | 4 +-- src/lv.cpp | 4 +-- src/mdiv.cpp | 4 +-- src/measure.cpp | 4 +-- src/mensur.cpp | 4 +-- src/metersig.cpp | 4 +-- src/metersiggrp.cpp | 4 +-- src/mnum.cpp | 4 +-- src/mordent.cpp | 4 +-- src/mrest.cpp | 4 +-- src/mrpt.cpp | 4 +-- src/mrpt2.cpp | 4 +-- src/mspace.cpp | 4 +-- src/multirest.cpp | 4 +-- src/multirpt.cpp | 4 +-- src/nc.cpp | 4 +-- src/neume.cpp | 4 +-- src/note.cpp | 4 +-- src/num.cpp | 4 +-- src/object.cpp | 6 ++-- src/octave.cpp | 4 +-- src/ornam.cpp | 4 +-- src/page.cpp | 4 +-- src/pageelement.cpp | 4 +-- src/pagemilestone.cpp | 4 +-- src/pages.cpp | 4 +-- src/pb.cpp | 4 +-- src/pedal.cpp | 4 +-- src/pgfoot.cpp | 4 +-- src/pgfoot2.cpp | 4 +-- src/pghead.cpp | 4 +-- src/pghead2.cpp | 4 +-- src/phrase.cpp | 4 +-- src/pitchinflection.cpp | 4 +-- src/plica.cpp | 4 +-- src/proport.cpp | 4 +-- src/reh.cpp | 4 +-- src/rend.cpp | 4 +-- src/rest.cpp | 4 +-- src/runningelement.cpp | 4 +-- src/sb.cpp | 4 +-- src/score.cpp | 4 +-- src/scoredef.cpp | 8 ++--- src/section.cpp | 4 +-- src/slur.cpp | 4 +-- src/space.cpp | 4 +-- src/staff.cpp | 4 +-- src/staffdef.cpp | 4 +-- src/staffgrp.cpp | 4 +-- src/stem.cpp | 4 +-- src/svg.cpp | 4 +-- src/syl.cpp | 4 +-- src/syllable.cpp | 4 +-- src/symbol.cpp | 4 +-- src/system.cpp | 4 +-- src/systemelement.cpp | 4 +-- src/systemmilestone.cpp | 4 +-- src/tabdursym.cpp | 4 +-- src/tabgrp.cpp | 4 +-- src/tempo.cpp | 4 +-- src/text.cpp | 4 +-- src/textelement.cpp | 4 +-- src/tie.cpp | 4 +-- src/timestamp.cpp | 4 +-- src/trill.cpp | 4 +-- src/tuning.cpp | 4 +-- src/tuplet.cpp | 4 +-- src/turn.cpp | 4 +-- src/verse.cpp | 4 +-- src/verticalaligner.cpp | 8 ++--- 249 files changed, 562 insertions(+), 563 deletions(-) diff --git a/include/vrv/accid.h b/include/vrv/accid.h index e0a21b93f0..6090bcdfe2 100644 --- a/include/vrv/accid.h +++ b/include/vrv/accid.h @@ -119,9 +119,9 @@ class Accid : public LayerElement, * Interface for class functor visitation */ ///@{ - FunctorCode Accept(MutableFunctor &functor) override; + FunctorCode Accept(Functor &functor) override; FunctorCode Accept(ConstFunctor &functor) const override; - FunctorCode AcceptEnd(MutableFunctor &functor) override; + FunctorCode AcceptEnd(Functor &functor) override; FunctorCode AcceptEnd(ConstFunctor &functor) const override; ///@} diff --git a/include/vrv/adjustxoverflowfunctor.h b/include/vrv/adjustxoverflowfunctor.h index 861ce5b4a7..31f3a12a9a 100644 --- a/include/vrv/adjustxoverflowfunctor.h +++ b/include/vrv/adjustxoverflowfunctor.h @@ -20,7 +20,7 @@ namespace vrv { * This class adjusts the X position of right barlines in order to make sure there is no text content * overflowing. */ -class AdjustXOverflowFunctor : public MutableFunctor { +class AdjustXOverflowFunctor : public Functor { public: /** * @name Constructors, destructors diff --git a/include/vrv/adjustxrelfortranscriptionfunctor.h b/include/vrv/adjustxrelfortranscriptionfunctor.h index 32e2c63247..029bbbddd5 100644 --- a/include/vrv/adjustxrelfortranscriptionfunctor.h +++ b/include/vrv/adjustxrelfortranscriptionfunctor.h @@ -19,7 +19,7 @@ namespace vrv { /** * This class adjusts the XRel positions taking into account the bounding boxes. */ -class AdjustXRelForTranscriptionFunctor : public MutableFunctor { +class AdjustXRelForTranscriptionFunctor : public Functor { public: /** * @name Constructors, destructors diff --git a/include/vrv/anchoredtext.h b/include/vrv/anchoredtext.h index 8605486c8b..60595e38f7 100644 --- a/include/vrv/anchoredtext.h +++ b/include/vrv/anchoredtext.h @@ -58,9 +58,9 @@ class AnchoredText : public ControlElement, public TextDirInterface { * Interface for class functor visitation */ ///@{ - FunctorCode Accept(MutableFunctor &functor) override; + FunctorCode Accept(Functor &functor) override; FunctorCode Accept(ConstFunctor &functor) const override; - FunctorCode AcceptEnd(MutableFunctor &functor) override; + FunctorCode AcceptEnd(Functor &functor) override; FunctorCode AcceptEnd(ConstFunctor &functor) const override; ///@} diff --git a/include/vrv/arpeg.h b/include/vrv/arpeg.h index 35bbdbddfa..4867378037 100644 --- a/include/vrv/arpeg.h +++ b/include/vrv/arpeg.h @@ -107,9 +107,9 @@ class Arpeg : public ControlElement, * Interface for class functor visitation */ ///@{ - FunctorCode Accept(MutableFunctor &functor) override; + FunctorCode Accept(Functor &functor) override; FunctorCode Accept(ConstFunctor &functor) const override; - FunctorCode AcceptEnd(MutableFunctor &functor) override; + FunctorCode AcceptEnd(Functor &functor) override; FunctorCode AcceptEnd(ConstFunctor &functor) const override; ///@} diff --git a/include/vrv/artic.h b/include/vrv/artic.h index 781697dc8e..e0cb911bb7 100644 --- a/include/vrv/artic.h +++ b/include/vrv/artic.h @@ -106,9 +106,9 @@ class Artic : public LayerElement, * Interface for class functor visitation */ ///@{ - FunctorCode Accept(MutableFunctor &functor) override; + FunctorCode Accept(Functor &functor) override; FunctorCode Accept(ConstFunctor &functor) const override; - FunctorCode AcceptEnd(MutableFunctor &functor) override; + FunctorCode AcceptEnd(Functor &functor) override; FunctorCode AcceptEnd(ConstFunctor &functor) const override; ///@} diff --git a/include/vrv/barline.h b/include/vrv/barline.h index 49c77d4a39..164c221413 100644 --- a/include/vrv/barline.h +++ b/include/vrv/barline.h @@ -89,9 +89,9 @@ class BarLine : public LayerElement, * Interface for class functor visitation */ ///@{ - FunctorCode Accept(MutableFunctor &functor) override; + FunctorCode Accept(Functor &functor) override; FunctorCode Accept(ConstFunctor &functor) const override; - FunctorCode AcceptEnd(MutableFunctor &functor) override; + FunctorCode AcceptEnd(Functor &functor) override; FunctorCode AcceptEnd(ConstFunctor &functor) const override; ///@} diff --git a/include/vrv/beam.h b/include/vrv/beam.h index 9f84d1a8eb..54683186f3 100644 --- a/include/vrv/beam.h +++ b/include/vrv/beam.h @@ -357,9 +357,9 @@ class Beam : public LayerElement, * Interface for class functor visitation */ ///@{ - FunctorCode Accept(MutableFunctor &functor) override; + FunctorCode Accept(Functor &functor) override; FunctorCode Accept(ConstFunctor &functor) const override; - FunctorCode AcceptEnd(MutableFunctor &functor) override; + FunctorCode AcceptEnd(Functor &functor) override; FunctorCode AcceptEnd(ConstFunctor &functor) const override; ///@} diff --git a/include/vrv/beamspan.h b/include/vrv/beamspan.h index d342653ab6..df117a6932 100644 --- a/include/vrv/beamspan.h +++ b/include/vrv/beamspan.h @@ -108,9 +108,9 @@ class BeamSpan : public ControlElement, * Interface for class functor visitation */ ///@{ - FunctorCode Accept(MutableFunctor &functor) override; + FunctorCode Accept(Functor &functor) override; FunctorCode Accept(ConstFunctor &functor) const override; - FunctorCode AcceptEnd(MutableFunctor &functor) override; + FunctorCode AcceptEnd(Functor &functor) override; FunctorCode AcceptEnd(ConstFunctor &functor) const override; ///@} diff --git a/include/vrv/beatrpt.h b/include/vrv/beatrpt.h index f0919c88ec..d4d8a4d9b5 100644 --- a/include/vrv/beatrpt.h +++ b/include/vrv/beatrpt.h @@ -60,9 +60,9 @@ class BeatRpt : public LayerElement, public AttColor, public AttBeatRptLog, publ * Interface for class functor visitation */ ///@{ - FunctorCode Accept(MutableFunctor &functor) override; + FunctorCode Accept(Functor &functor) override; FunctorCode Accept(ConstFunctor &functor) const override; - FunctorCode AcceptEnd(MutableFunctor &functor) override; + FunctorCode AcceptEnd(Functor &functor) override; FunctorCode AcceptEnd(ConstFunctor &functor) const override; ///@} diff --git a/include/vrv/bracketspan.h b/include/vrv/bracketspan.h index 22b3eb4e93..22e8c1aa69 100644 --- a/include/vrv/bracketspan.h +++ b/include/vrv/bracketspan.h @@ -69,9 +69,9 @@ class BracketSpan : public ControlElement, * Interface for class functor visitation */ ///@{ - FunctorCode Accept(MutableFunctor &functor) override; + FunctorCode Accept(Functor &functor) override; FunctorCode Accept(ConstFunctor &functor) const override; - FunctorCode AcceptEnd(MutableFunctor &functor) override; + FunctorCode AcceptEnd(Functor &functor) override; FunctorCode AcceptEnd(ConstFunctor &functor) const override; ///@} diff --git a/include/vrv/breath.h b/include/vrv/breath.h index 7626f7779c..502b510e25 100644 --- a/include/vrv/breath.h +++ b/include/vrv/breath.h @@ -54,9 +54,9 @@ class Breath : public ControlElement, public TimePointInterface, public AttColor * Interface for class functor visitation */ ///@{ - FunctorCode Accept(MutableFunctor &functor) override; + FunctorCode Accept(Functor &functor) override; FunctorCode Accept(ConstFunctor &functor) const override; - FunctorCode AcceptEnd(MutableFunctor &functor) override; + FunctorCode AcceptEnd(Functor &functor) override; FunctorCode AcceptEnd(ConstFunctor &functor) const override; ///@} diff --git a/include/vrv/btrem.h b/include/vrv/btrem.h index 37b9424f22..c7c11b804d 100644 --- a/include/vrv/btrem.h +++ b/include/vrv/btrem.h @@ -62,9 +62,9 @@ class BTrem : public LayerElement, * Interface for class functor visitation */ ///@{ - FunctorCode Accept(MutableFunctor &functor) override; + FunctorCode Accept(Functor &functor) override; FunctorCode Accept(ConstFunctor &functor) const override; - FunctorCode AcceptEnd(MutableFunctor &functor) override; + FunctorCode AcceptEnd(Functor &functor) override; FunctorCode AcceptEnd(ConstFunctor &functor) const override; ///@} diff --git a/include/vrv/caesura.h b/include/vrv/caesura.h index 47cfd783a0..026fee817e 100644 --- a/include/vrv/caesura.h +++ b/include/vrv/caesura.h @@ -66,9 +66,9 @@ class Caesura : public ControlElement, * Interface for class functor visitation */ ///@{ - FunctorCode Accept(MutableFunctor &functor) override; + FunctorCode Accept(Functor &functor) override; FunctorCode Accept(ConstFunctor &functor) const override; - FunctorCode AcceptEnd(MutableFunctor &functor) override; + FunctorCode AcceptEnd(Functor &functor) override; FunctorCode AcceptEnd(ConstFunctor &functor) const override; ///@} diff --git a/include/vrv/castofffunctor.h b/include/vrv/castofffunctor.h index 700245b764..1553a8bab1 100644 --- a/include/vrv/castofffunctor.h +++ b/include/vrv/castofffunctor.h @@ -221,7 +221,7 @@ class CastOffEncodingFunctor : public DocFunctor { * This class undoes the cast off for both pages and systems. * This is used by Doc::UnCastOffDoc for putting all pages / systems continously. */ -class UnCastOffFunctor : public MutableFunctor { +class UnCastOffFunctor : public Functor { public: /** * @name Constructors, destructors diff --git a/include/vrv/chord.h b/include/vrv/chord.h index b99a91e8df..2e6f4e84ee 100644 --- a/include/vrv/chord.h +++ b/include/vrv/chord.h @@ -186,9 +186,9 @@ class Chord : public LayerElement, * Interface for class functor visitation */ ///@{ - FunctorCode Accept(MutableFunctor &functor) override; + FunctorCode Accept(Functor &functor) override; FunctorCode Accept(ConstFunctor &functor) const override; - FunctorCode AcceptEnd(MutableFunctor &functor) override; + FunctorCode AcceptEnd(Functor &functor) override; FunctorCode AcceptEnd(ConstFunctor &functor) const override; ///@} diff --git a/include/vrv/clef.h b/include/vrv/clef.h index 43343b4013..cc867346c2 100644 --- a/include/vrv/clef.h +++ b/include/vrv/clef.h @@ -76,9 +76,9 @@ class Clef : public LayerElement, * Interface for class functor visitation */ ///@{ - FunctorCode Accept(MutableFunctor &functor) override; + FunctorCode Accept(Functor &functor) override; FunctorCode Accept(ConstFunctor &functor) const override; - FunctorCode AcceptEnd(MutableFunctor &functor) override; + FunctorCode AcceptEnd(Functor &functor) override; FunctorCode AcceptEnd(ConstFunctor &functor) const override; ///@} diff --git a/include/vrv/controlelement.h b/include/vrv/controlelement.h index 2f0e60624f..6d595ddfbc 100644 --- a/include/vrv/controlelement.h +++ b/include/vrv/controlelement.h @@ -72,9 +72,9 @@ class ControlElement : public FloatingObject, * Interface for class functor visitation */ ///@{ - FunctorCode Accept(MutableFunctor &functor) override; + FunctorCode Accept(Functor &functor) override; FunctorCode Accept(ConstFunctor &functor) const override; - FunctorCode AcceptEnd(MutableFunctor &functor) override; + FunctorCode AcceptEnd(Functor &functor) override; FunctorCode AcceptEnd(ConstFunctor &functor) const override; ///@} diff --git a/include/vrv/convertfunctor.h b/include/vrv/convertfunctor.h index c13e6c4539..74c9e50393 100644 --- a/include/vrv/convertfunctor.h +++ b/include/vrv/convertfunctor.h @@ -19,7 +19,7 @@ namespace vrv { /** * This class converts all top-level containers (section, endings) and editorial elements to milestone elements. */ -class ConvertToPageBasedFunctor : public MutableFunctor { +class ConvertToPageBasedFunctor : public Functor { public: /** * @name Constructors, destructors @@ -143,7 +143,7 @@ class ConvertToCastOffMensuralFunctor : public DocFunctor { /** * This class converts cast-off (measure) mensural segments MEI into mensural. */ -class ConvertToUnCastOffMensuralFunctor : public MutableFunctor { +class ConvertToUnCastOffMensuralFunctor : public Functor { public: /** * @name Constructors, destructors @@ -199,7 +199,7 @@ class ConvertToUnCastOffMensuralFunctor : public MutableFunctor { /** * This class converts analytical markup (\@fermata, \@tie) to elements. */ -class ConvertMarkupAnalyticalFunctor : public MutableFunctor { +class ConvertMarkupAnalyticalFunctor : public Functor { public: /** * @name Constructors, destructors @@ -257,7 +257,7 @@ class ConvertMarkupAnalyticalFunctor : public MutableFunctor { /** * This class converts markup of artic@artic multi value into distinct artic elements. */ -class ConvertMarkupArticFunctor : public MutableFunctor { +class ConvertMarkupArticFunctor : public Functor { public: /** * @name Constructors, destructors diff --git a/include/vrv/course.h b/include/vrv/course.h index 6939e9d7db..5f19e5ae4f 100644 --- a/include/vrv/course.h +++ b/include/vrv/course.h @@ -47,9 +47,9 @@ class Course : public Object, public AttAccidental, public AttNNumberLike, publi * Interface for class functor visitation */ ///@{ - FunctorCode Accept(MutableFunctor &functor) override; + FunctorCode Accept(Functor &functor) override; FunctorCode Accept(ConstFunctor &functor) const override; - FunctorCode AcceptEnd(MutableFunctor &functor) override; + FunctorCode AcceptEnd(Functor &functor) override; FunctorCode AcceptEnd(ConstFunctor &functor) const override; ///@} diff --git a/include/vrv/custos.h b/include/vrv/custos.h index ec49727933..a69dba5427 100644 --- a/include/vrv/custos.h +++ b/include/vrv/custos.h @@ -64,9 +64,9 @@ class Custos : public LayerElement, public PitchInterface, public PositionInterf * Interface for class functor visitation */ ///@{ - FunctorCode Accept(MutableFunctor &functor) override; + FunctorCode Accept(Functor &functor) override; FunctorCode Accept(ConstFunctor &functor) const override; - FunctorCode AcceptEnd(MutableFunctor &functor) override; + FunctorCode AcceptEnd(Functor &functor) override; FunctorCode AcceptEnd(ConstFunctor &functor) const override; ///@} diff --git a/include/vrv/dir.h b/include/vrv/dir.h index 401d91abe9..946067744b 100644 --- a/include/vrv/dir.h +++ b/include/vrv/dir.h @@ -81,9 +81,9 @@ class Dir : public ControlElement, * Interface for class functor visitation */ ///@{ - FunctorCode Accept(MutableFunctor &functor) override; + FunctorCode Accept(Functor &functor) override; FunctorCode Accept(ConstFunctor &functor) const override; - FunctorCode AcceptEnd(MutableFunctor &functor) override; + FunctorCode AcceptEnd(Functor &functor) override; FunctorCode AcceptEnd(ConstFunctor &functor) const override; ///@} diff --git a/include/vrv/doc.h b/include/vrv/doc.h index b21f05d92c..d1cfdc7a7a 100644 --- a/include/vrv/doc.h +++ b/include/vrv/doc.h @@ -460,9 +460,9 @@ class Doc : public Object { * Interface for class functor visitation */ ///@{ - FunctorCode Accept(MutableFunctor &functor) override; + FunctorCode Accept(Functor &functor) override; FunctorCode Accept(ConstFunctor &functor) const override; - FunctorCode AcceptEnd(MutableFunctor &functor) override; + FunctorCode AcceptEnd(Functor &functor) override; FunctorCode AcceptEnd(ConstFunctor &functor) const override; ///@} diff --git a/include/vrv/dot.h b/include/vrv/dot.h index 77da9e564c..69ece3f71d 100644 --- a/include/vrv/dot.h +++ b/include/vrv/dot.h @@ -52,9 +52,9 @@ class Dot : public LayerElement, public PositionInterface, public AttColor, publ * Interface for class functor visitation */ ///@{ - FunctorCode Accept(MutableFunctor &functor) override; + FunctorCode Accept(Functor &functor) override; FunctorCode Accept(ConstFunctor &functor) const override; - FunctorCode AcceptEnd(MutableFunctor &functor) override; + FunctorCode AcceptEnd(Functor &functor) override; FunctorCode AcceptEnd(ConstFunctor &functor) const override; ///@} diff --git a/include/vrv/dynam.h b/include/vrv/dynam.h index d418a52e3f..bc5aaf3848 100644 --- a/include/vrv/dynam.h +++ b/include/vrv/dynam.h @@ -107,9 +107,9 @@ class Dynam : public ControlElement, * Interface for class functor visitation */ ///@{ - FunctorCode Accept(MutableFunctor &functor) override; + FunctorCode Accept(Functor &functor) override; FunctorCode Accept(ConstFunctor &functor) const override; - FunctorCode AcceptEnd(MutableFunctor &functor) override; + FunctorCode AcceptEnd(Functor &functor) override; FunctorCode AcceptEnd(ConstFunctor &functor) const override; ///@} diff --git a/include/vrv/editorial.h b/include/vrv/editorial.h index 807a612e2b..0bd73a54fb 100644 --- a/include/vrv/editorial.h +++ b/include/vrv/editorial.h @@ -64,9 +64,9 @@ class EditorialElement : public Object, public SystemMilestoneInterface, public * Interface for class functor visitation */ ///@{ - FunctorCode Accept(MutableFunctor &functor) override; + FunctorCode Accept(Functor &functor) override; FunctorCode Accept(ConstFunctor &functor) const override; - FunctorCode AcceptEnd(MutableFunctor &functor) override; + FunctorCode AcceptEnd(Functor &functor) override; FunctorCode AcceptEnd(ConstFunctor &functor) const override; ///@} diff --git a/include/vrv/elementpart.h b/include/vrv/elementpart.h index dd52368783..4387902979 100644 --- a/include/vrv/elementpart.h +++ b/include/vrv/elementpart.h @@ -59,9 +59,9 @@ class Dots : public LayerElement, public AttAugmentDots { * Interface for class functor visitation */ ///@{ - FunctorCode Accept(MutableFunctor &functor) override; + FunctorCode Accept(Functor &functor) override; FunctorCode Accept(ConstFunctor &functor) const override; - FunctorCode AcceptEnd(MutableFunctor &functor) override; + FunctorCode AcceptEnd(Functor &functor) override; FunctorCode AcceptEnd(ConstFunctor &functor) const override; ///@} @@ -124,9 +124,9 @@ class Flag : public LayerElement { * Interface for class functor visitation */ ///@{ - FunctorCode Accept(MutableFunctor &functor) override; + FunctorCode Accept(Functor &functor) override; FunctorCode Accept(ConstFunctor &functor) const override; - FunctorCode AcceptEnd(MutableFunctor &functor) override; + FunctorCode AcceptEnd(Functor &functor) override; FunctorCode AcceptEnd(ConstFunctor &functor) const override; ///@} @@ -205,9 +205,9 @@ class TupletBracket : public LayerElement, public AttTupletVis { * Interface for class functor visitation */ ///@{ - FunctorCode Accept(MutableFunctor &functor) override; + FunctorCode Accept(Functor &functor) override; FunctorCode Accept(ConstFunctor &functor) const override; - FunctorCode AcceptEnd(MutableFunctor &functor) override; + FunctorCode AcceptEnd(Functor &functor) override; FunctorCode AcceptEnd(ConstFunctor &functor) const override; ///@} @@ -288,9 +288,9 @@ class TupletNum : public LayerElement, public AttNumberPlacement, public AttTupl * Interface for class functor visitation */ ///@{ - FunctorCode Accept(MutableFunctor &functor) override; + FunctorCode Accept(Functor &functor) override; FunctorCode Accept(ConstFunctor &functor) const override; - FunctorCode AcceptEnd(MutableFunctor &functor) override; + FunctorCode AcceptEnd(Functor &functor) override; FunctorCode AcceptEnd(ConstFunctor &functor) const override; ///@} diff --git a/include/vrv/ending.h b/include/vrv/ending.h index f2bf3e8530..2d28c3fb52 100644 --- a/include/vrv/ending.h +++ b/include/vrv/ending.h @@ -52,9 +52,9 @@ class Ending : public SystemElement, public SystemMilestoneInterface, public Att * Interface for class functor visitation */ ///@{ - FunctorCode Accept(MutableFunctor &functor) override; + FunctorCode Accept(Functor &functor) override; FunctorCode Accept(ConstFunctor &functor) const override; - FunctorCode AcceptEnd(MutableFunctor &functor) override; + FunctorCode AcceptEnd(Functor &functor) override; FunctorCode AcceptEnd(ConstFunctor &functor) const override; ///@} diff --git a/include/vrv/expansion.h b/include/vrv/expansion.h index cc824679e9..d3290fd9ee 100644 --- a/include/vrv/expansion.h +++ b/include/vrv/expansion.h @@ -53,9 +53,9 @@ class Expansion : public SystemElement, public PlistInterface { * Interface for class functor visitation */ ///@{ - FunctorCode Accept(MutableFunctor &functor) override; + FunctorCode Accept(Functor &functor) override; FunctorCode Accept(ConstFunctor &functor) const override; - FunctorCode AcceptEnd(MutableFunctor &functor) override; + FunctorCode AcceptEnd(Functor &functor) override; FunctorCode AcceptEnd(ConstFunctor &functor) const override; ///@} diff --git a/include/vrv/f.h b/include/vrv/f.h index 2e9bb9c232..85235d0d20 100644 --- a/include/vrv/f.h +++ b/include/vrv/f.h @@ -65,9 +65,9 @@ class F : public TextElement, public TimeSpanningInterface, public AttExtender { * Interface for class functor visitation */ ///@{ - FunctorCode Accept(MutableFunctor &functor) override; + FunctorCode Accept(Functor &functor) override; FunctorCode Accept(ConstFunctor &functor) const override; - FunctorCode AcceptEnd(MutableFunctor &functor) override; + FunctorCode AcceptEnd(Functor &functor) override; FunctorCode AcceptEnd(ConstFunctor &functor) const override; ///@} diff --git a/include/vrv/fb.h b/include/vrv/fb.h index 7765247ff7..92b7d94e54 100644 --- a/include/vrv/fb.h +++ b/include/vrv/fb.h @@ -44,9 +44,9 @@ class Fb : public Object { * Interface for class functor visitation */ ///@{ - FunctorCode Accept(MutableFunctor &functor) override; + FunctorCode Accept(Functor &functor) override; FunctorCode Accept(ConstFunctor &functor) const override; - FunctorCode AcceptEnd(MutableFunctor &functor) override; + FunctorCode AcceptEnd(Functor &functor) override; FunctorCode AcceptEnd(ConstFunctor &functor) const override; ///@} diff --git a/include/vrv/fermata.h b/include/vrv/fermata.h index c63ea6e683..0cb05b2130 100644 --- a/include/vrv/fermata.h +++ b/include/vrv/fermata.h @@ -81,9 +81,9 @@ class Fermata : public ControlElement, * Interface for class functor visitation */ ///@{ - FunctorCode Accept(MutableFunctor &functor) override; + FunctorCode Accept(Functor &functor) override; FunctorCode Accept(ConstFunctor &functor) const override; - FunctorCode AcceptEnd(MutableFunctor &functor) override; + FunctorCode AcceptEnd(Functor &functor) override; FunctorCode AcceptEnd(ConstFunctor &functor) const override; ///@} diff --git a/include/vrv/fig.h b/include/vrv/fig.h index f72a1f02f8..aab71304a5 100644 --- a/include/vrv/fig.h +++ b/include/vrv/fig.h @@ -59,9 +59,9 @@ class Fig : public TextElement, public AreaPosInterface { * Interface for class functor visitation */ ///@{ - FunctorCode Accept(MutableFunctor &functor) override; + FunctorCode Accept(Functor &functor) override; FunctorCode Accept(ConstFunctor &functor) const override; - FunctorCode AcceptEnd(MutableFunctor &functor) override; + FunctorCode AcceptEnd(Functor &functor) override; FunctorCode AcceptEnd(ConstFunctor &functor) const override; ///@} diff --git a/include/vrv/findfunctor.h b/include/vrv/findfunctor.h index 3bdf06c40c..90d0a4da6f 100644 --- a/include/vrv/findfunctor.h +++ b/include/vrv/findfunctor.h @@ -22,7 +22,7 @@ class Object; /** * This class finds all elements in the tree by comparison */ -class FindAllByComparisonFunctor : public MutableFunctor { +class FindAllByComparisonFunctor : public Functor { public: /** * @name Constructors, destructors @@ -403,7 +403,7 @@ class FindExtremeByComparisonFunctor : public ConstFunctor { /** * This class finds all objects to which another object refers to. */ -class FindAllReferencedObjectsFunctor : public MutableFunctor { +class FindAllReferencedObjectsFunctor : public Functor { public: /** * @name Constructors, destructors diff --git a/include/vrv/fing.h b/include/vrv/fing.h index 814d27347b..f16496aef6 100644 --- a/include/vrv/fing.h +++ b/include/vrv/fing.h @@ -68,9 +68,9 @@ class Fing : public ControlElement, public TimePointInterface, public TextDirInt * Interface for class functor visitation */ ///@{ - FunctorCode Accept(MutableFunctor &functor) override; + FunctorCode Accept(Functor &functor) override; FunctorCode Accept(ConstFunctor &functor) const override; - FunctorCode AcceptEnd(MutableFunctor &functor) override; + FunctorCode AcceptEnd(Functor &functor) override; FunctorCode AcceptEnd(ConstFunctor &functor) const override; ///@} diff --git a/include/vrv/floatingobject.h b/include/vrv/floatingobject.h index 75959827f4..aaa9d9edcf 100644 --- a/include/vrv/floatingobject.h +++ b/include/vrv/floatingobject.h @@ -125,9 +125,9 @@ class FloatingObject : public Object { * Interface for class functor visitation */ ///@{ - FunctorCode Accept(MutableFunctor &functor) override; + FunctorCode Accept(Functor &functor) override; FunctorCode Accept(ConstFunctor &functor) const override; - FunctorCode AcceptEnd(MutableFunctor &functor) override; + FunctorCode AcceptEnd(Functor &functor) override; FunctorCode AcceptEnd(ConstFunctor &functor) const override; ///@} diff --git a/include/vrv/ftrem.h b/include/vrv/ftrem.h index 9d22970085..79e1e80577 100644 --- a/include/vrv/ftrem.h +++ b/include/vrv/ftrem.h @@ -76,9 +76,9 @@ class FTrem : public LayerElement, public BeamDrawingInterface, public AttFTremV * Interface for class functor visitation */ ///@{ - FunctorCode Accept(MutableFunctor &functor) override; + FunctorCode Accept(Functor &functor) override; FunctorCode Accept(ConstFunctor &functor) const override; - FunctorCode AcceptEnd(MutableFunctor &functor) override; + FunctorCode AcceptEnd(Functor &functor) override; FunctorCode AcceptEnd(ConstFunctor &functor) const override; ///@} diff --git a/include/vrv/functor.h b/include/vrv/functor.h index edaec778db..11178d9865 100644 --- a/include/vrv/functor.h +++ b/include/vrv/functor.h @@ -75,20 +75,20 @@ class FunctorBase { }; //---------------------------------------------------------------------------- -// MutableFunctor +// Functor //---------------------------------------------------------------------------- /** * This abstract class is the base class for all mutable functors. */ -class MutableFunctor : public FunctorBase, public FunctorInterface { +class Functor : public FunctorBase, public FunctorInterface { public: /** * @name Constructors, destructors */ ///@{ - MutableFunctor(){}; - virtual ~MutableFunctor() = default; + Functor(){}; + virtual ~Functor() = default; ///@} private: @@ -131,7 +131,7 @@ class ConstFunctor : public FunctorBase, public ConstFunctorInterface { /** * This abstract class is the base class for all mutable functors that need access to the document. */ -class DocFunctor : public MutableFunctor { +class DocFunctor : public Functor { public: /** * @name Constructors, destructors diff --git a/include/vrv/gliss.h b/include/vrv/gliss.h index e529e3f1d1..3eb6c55378 100644 --- a/include/vrv/gliss.h +++ b/include/vrv/gliss.h @@ -64,9 +64,9 @@ class Gliss : public ControlElement, * Interface for class functor visitation */ ///@{ - FunctorCode Accept(MutableFunctor &functor) override; + FunctorCode Accept(Functor &functor) override; FunctorCode Accept(ConstFunctor &functor) const override; - FunctorCode AcceptEnd(MutableFunctor &functor) override; + FunctorCode AcceptEnd(Functor &functor) override; FunctorCode AcceptEnd(ConstFunctor &functor) const override; ///@} diff --git a/include/vrv/gracegrp.h b/include/vrv/gracegrp.h index 0df8d8a582..4b2a944600 100644 --- a/include/vrv/gracegrp.h +++ b/include/vrv/gracegrp.h @@ -44,9 +44,9 @@ class GraceGrp : public LayerElement, public AttColor, public AttGraced, public * Interface for class functor visitation */ ///@{ - FunctorCode Accept(MutableFunctor &functor) override; + FunctorCode Accept(Functor &functor) override; FunctorCode Accept(ConstFunctor &functor) const override; - FunctorCode AcceptEnd(MutableFunctor &functor) override; + FunctorCode AcceptEnd(Functor &functor) override; FunctorCode AcceptEnd(ConstFunctor &functor) const override; ///@} diff --git a/include/vrv/grpsym.h b/include/vrv/grpsym.h index 9c21356fdb..53ba6268e0 100644 --- a/include/vrv/grpsym.h +++ b/include/vrv/grpsym.h @@ -69,9 +69,9 @@ class GrpSym : public Object, * Interface for class functor visitation */ ///@{ - FunctorCode Accept(MutableFunctor &functor) override; + FunctorCode Accept(Functor &functor) override; FunctorCode Accept(ConstFunctor &functor) const override; - FunctorCode AcceptEnd(MutableFunctor &functor) override; + FunctorCode AcceptEnd(Functor &functor) override; FunctorCode AcceptEnd(ConstFunctor &functor) const override; ///@} diff --git a/include/vrv/hairpin.h b/include/vrv/hairpin.h index d8cba8ca1b..8a81dd1d3d 100644 --- a/include/vrv/hairpin.h +++ b/include/vrv/hairpin.h @@ -97,9 +97,9 @@ class Hairpin : public ControlElement, * Interface for class functor visitation */ ///@{ - FunctorCode Accept(MutableFunctor &functor) override; + FunctorCode Accept(Functor &functor) override; FunctorCode Accept(ConstFunctor &functor) const override; - FunctorCode AcceptEnd(MutableFunctor &functor) override; + FunctorCode AcceptEnd(Functor &functor) override; FunctorCode AcceptEnd(ConstFunctor &functor) const override; ///@} diff --git a/include/vrv/halfmrpt.h b/include/vrv/halfmrpt.h index 7cef27d4a8..dcc439dceb 100644 --- a/include/vrv/halfmrpt.h +++ b/include/vrv/halfmrpt.h @@ -48,9 +48,9 @@ class HalfmRpt : public LayerElement, public AttColor { * Interface for class functor visitation */ ///@{ - FunctorCode Accept(MutableFunctor &functor) override; + FunctorCode Accept(Functor &functor) override; FunctorCode Accept(ConstFunctor &functor) const override; - FunctorCode AcceptEnd(MutableFunctor &functor) override; + FunctorCode AcceptEnd(Functor &functor) override; FunctorCode AcceptEnd(ConstFunctor &functor) const override; ///@} diff --git a/include/vrv/harm.h b/include/vrv/harm.h index 64ab26bb00..f8d345c040 100644 --- a/include/vrv/harm.h +++ b/include/vrv/harm.h @@ -83,9 +83,9 @@ class Harm : public ControlElement, * Interface for class functor visitation */ ///@{ - FunctorCode Accept(MutableFunctor &functor) override; + FunctorCode Accept(Functor &functor) override; FunctorCode Accept(ConstFunctor &functor) const override; - FunctorCode AcceptEnd(MutableFunctor &functor) override; + FunctorCode AcceptEnd(Functor &functor) override; FunctorCode AcceptEnd(ConstFunctor &functor) const override; ///@} diff --git a/include/vrv/horizontalaligner.h b/include/vrv/horizontalaligner.h index 63b17528b8..647f1a3b9a 100644 --- a/include/vrv/horizontalaligner.h +++ b/include/vrv/horizontalaligner.h @@ -219,9 +219,9 @@ class Alignment : public Object { * Interface for class functor visitation */ ///@{ - FunctorCode Accept(MutableFunctor &functor) override; + FunctorCode Accept(Functor &functor) override; FunctorCode Accept(ConstFunctor &functor) const override; - FunctorCode AcceptEnd(MutableFunctor &functor) override; + FunctorCode AcceptEnd(Functor &functor) override; FunctorCode AcceptEnd(ConstFunctor &functor) const override; ///@} @@ -334,9 +334,9 @@ class AlignmentReference : public Object, public AttNInteger { * Interface for class functor visitation */ ///@{ - FunctorCode Accept(MutableFunctor &functor) override; + FunctorCode Accept(Functor &functor) override; FunctorCode Accept(ConstFunctor &functor) const override; - FunctorCode AcceptEnd(MutableFunctor &functor) override; + FunctorCode AcceptEnd(Functor &functor) override; FunctorCode AcceptEnd(ConstFunctor &functor) const override; ///@} @@ -391,9 +391,9 @@ class HorizontalAligner : public Object { * Interface for class functor visitation */ ///@{ - FunctorCode Accept(MutableFunctor &functor) override; + FunctorCode Accept(Functor &functor) override; FunctorCode Accept(ConstFunctor &functor) const override; - FunctorCode AcceptEnd(MutableFunctor &functor) override; + FunctorCode AcceptEnd(Functor &functor) override; FunctorCode AcceptEnd(ConstFunctor &functor) const override; ///@} @@ -529,9 +529,9 @@ class MeasureAligner : public HorizontalAligner { * Interface for class functor visitation */ ///@{ - FunctorCode Accept(MutableFunctor &functor) override; + FunctorCode Accept(Functor &functor) override; FunctorCode Accept(ConstFunctor &functor) const override; - FunctorCode AcceptEnd(MutableFunctor &functor) override; + FunctorCode AcceptEnd(Functor &functor) override; FunctorCode AcceptEnd(ConstFunctor &functor) const override; ///@} @@ -634,9 +634,9 @@ class GraceAligner : public HorizontalAligner { * Interface for class functor visitation */ ///@{ - FunctorCode Accept(MutableFunctor &functor) override; + FunctorCode Accept(Functor &functor) override; FunctorCode Accept(ConstFunctor &functor) const override; - FunctorCode AcceptEnd(MutableFunctor &functor) override; + FunctorCode AcceptEnd(Functor &functor) override; FunctorCode AcceptEnd(ConstFunctor &functor) const override; ///@} @@ -696,9 +696,9 @@ class TimestampAligner : public Object { * Interface for class functor visitation */ ///@{ - FunctorCode Accept(MutableFunctor &functor) override; + FunctorCode Accept(Functor &functor) override; FunctorCode Accept(ConstFunctor &functor) const override; - FunctorCode AcceptEnd(MutableFunctor &functor) override; + FunctorCode AcceptEnd(Functor &functor) override; FunctorCode AcceptEnd(ConstFunctor &functor) const override; ///@} diff --git a/include/vrv/instrdef.h b/include/vrv/instrdef.h index 3437e5de09..935cac6977 100644 --- a/include/vrv/instrdef.h +++ b/include/vrv/instrdef.h @@ -48,9 +48,9 @@ class InstrDef : public Object, * Interface for class functor visitation */ ///@{ - FunctorCode Accept(MutableFunctor &functor) override; + FunctorCode Accept(Functor &functor) override; FunctorCode Accept(ConstFunctor &functor) const override; - FunctorCode AcceptEnd(MutableFunctor &functor) override; + FunctorCode AcceptEnd(Functor &functor) override; FunctorCode AcceptEnd(ConstFunctor &functor) const override; ///@} diff --git a/include/vrv/keyaccid.h b/include/vrv/keyaccid.h index ffc20eda48..86993eeeab 100644 --- a/include/vrv/keyaccid.h +++ b/include/vrv/keyaccid.h @@ -72,9 +72,9 @@ class KeyAccid : public LayerElement, * Interface for class functor visitation */ ///@{ - FunctorCode Accept(MutableFunctor &functor) override; + FunctorCode Accept(Functor &functor) override; FunctorCode Accept(ConstFunctor &functor) const override; - FunctorCode AcceptEnd(MutableFunctor &functor) override; + FunctorCode AcceptEnd(Functor &functor) override; FunctorCode AcceptEnd(ConstFunctor &functor) const override; ///@} diff --git a/include/vrv/keysig.h b/include/vrv/keysig.h index da96e055f9..773aa23e32 100644 --- a/include/vrv/keysig.h +++ b/include/vrv/keysig.h @@ -120,9 +120,9 @@ class KeySig : public LayerElement, * Interface for class functor visitation */ ///@{ - FunctorCode Accept(MutableFunctor &functor) override; + FunctorCode Accept(Functor &functor) override; FunctorCode Accept(ConstFunctor &functor) const override; - FunctorCode AcceptEnd(MutableFunctor &functor) override; + FunctorCode AcceptEnd(Functor &functor) override; FunctorCode AcceptEnd(ConstFunctor &functor) const override; ///@} diff --git a/include/vrv/label.h b/include/vrv/label.h index b305db7f3a..b304d1823f 100644 --- a/include/vrv/label.h +++ b/include/vrv/label.h @@ -49,9 +49,9 @@ class Label : public Object, public TextListInterface { * Interface for class functor visitation */ ///@{ - FunctorCode Accept(MutableFunctor &functor) override; + FunctorCode Accept(Functor &functor) override; FunctorCode Accept(ConstFunctor &functor) const override; - FunctorCode AcceptEnd(MutableFunctor &functor) override; + FunctorCode AcceptEnd(Functor &functor) override; FunctorCode AcceptEnd(ConstFunctor &functor) const override; ///@} diff --git a/include/vrv/labelabbr.h b/include/vrv/labelabbr.h index 5b468ac875..82b496ebd2 100644 --- a/include/vrv/labelabbr.h +++ b/include/vrv/labelabbr.h @@ -49,9 +49,9 @@ class LabelAbbr : public Object, public TextListInterface { * Interface for class functor visitation */ ///@{ - FunctorCode Accept(MutableFunctor &functor) override; + FunctorCode Accept(Functor &functor) override; FunctorCode Accept(ConstFunctor &functor) const override; - FunctorCode AcceptEnd(MutableFunctor &functor) override; + FunctorCode AcceptEnd(Functor &functor) override; FunctorCode AcceptEnd(ConstFunctor &functor) const override; ///@} diff --git a/include/vrv/layer.h b/include/vrv/layer.h index 0803c31196..45fefba99a 100644 --- a/include/vrv/layer.h +++ b/include/vrv/layer.h @@ -240,9 +240,9 @@ class Layer : public Object, * Interface for class functor visitation */ ///@{ - FunctorCode Accept(MutableFunctor &functor) override; + FunctorCode Accept(Functor &functor) override; FunctorCode Accept(ConstFunctor &functor) const override; - FunctorCode AcceptEnd(MutableFunctor &functor) override; + FunctorCode AcceptEnd(Functor &functor) override; FunctorCode AcceptEnd(ConstFunctor &functor) const override; ///@} diff --git a/include/vrv/layerdef.h b/include/vrv/layerdef.h index 5d5c1f21ae..3243d8bc93 100644 --- a/include/vrv/layerdef.h +++ b/include/vrv/layerdef.h @@ -40,9 +40,9 @@ class LayerDef : public Object, public AttLabelled, public AttNInteger, public A * Interface for class functor visitation */ ///@{ - FunctorCode Accept(MutableFunctor &functor) override; + FunctorCode Accept(Functor &functor) override; FunctorCode Accept(ConstFunctor &functor) const override; - FunctorCode AcceptEnd(MutableFunctor &functor) override; + FunctorCode AcceptEnd(Functor &functor) override; FunctorCode AcceptEnd(ConstFunctor &functor) const override; ///@} }; diff --git a/include/vrv/layerelement.h b/include/vrv/layerelement.h index 9423a7f2a2..f9eb21bddf 100644 --- a/include/vrv/layerelement.h +++ b/include/vrv/layerelement.h @@ -332,9 +332,9 @@ class LayerElement : public Object, * Interface for class functor visitation */ ///@{ - FunctorCode Accept(MutableFunctor &functor) override; + FunctorCode Accept(Functor &functor) override; FunctorCode Accept(ConstFunctor &functor) const override; - FunctorCode AcceptEnd(MutableFunctor &functor) override; + FunctorCode AcceptEnd(Functor &functor) override; FunctorCode AcceptEnd(ConstFunctor &functor) const override; ///@} diff --git a/include/vrv/lb.h b/include/vrv/lb.h index 4fb575a8f8..9b044f6d25 100644 --- a/include/vrv/lb.h +++ b/include/vrv/lb.h @@ -43,9 +43,9 @@ class Lb : public TextElement { * Interface for class functor visitation */ ///@{ - FunctorCode Accept(MutableFunctor &functor) override; + FunctorCode Accept(Functor &functor) override; FunctorCode Accept(ConstFunctor &functor) const override; - FunctorCode AcceptEnd(MutableFunctor &functor) override; + FunctorCode AcceptEnd(Functor &functor) override; FunctorCode AcceptEnd(ConstFunctor &functor) const override; ///@} diff --git a/include/vrv/ligature.h b/include/vrv/ligature.h index d71f3f2e27..c59998f0dc 100644 --- a/include/vrv/ligature.h +++ b/include/vrv/ligature.h @@ -70,9 +70,9 @@ class Ligature : public LayerElement, public ObjectListInterface, public AttLiga * Interface for class functor visitation */ ///@{ - FunctorCode Accept(MutableFunctor &functor) override; + FunctorCode Accept(Functor &functor) override; FunctorCode Accept(ConstFunctor &functor) const override; - FunctorCode AcceptEnd(MutableFunctor &functor) override; + FunctorCode AcceptEnd(Functor &functor) override; FunctorCode AcceptEnd(ConstFunctor &functor) const override; ///@} diff --git a/include/vrv/lv.h b/include/vrv/lv.h index 3e054c89eb..d1f5c94051 100644 --- a/include/vrv/lv.h +++ b/include/vrv/lv.h @@ -44,9 +44,9 @@ class Lv : public Tie { * Interface for class functor visitation */ ///@{ - FunctorCode Accept(MutableFunctor &functor) override; + FunctorCode Accept(Functor &functor) override; FunctorCode Accept(ConstFunctor &functor) const override; - FunctorCode AcceptEnd(MutableFunctor &functor) override; + FunctorCode AcceptEnd(Functor &functor) override; FunctorCode AcceptEnd(ConstFunctor &functor) const override; ///@} diff --git a/include/vrv/mdiv.h b/include/vrv/mdiv.h index 800cab4553..8512e8a9bb 100644 --- a/include/vrv/mdiv.h +++ b/include/vrv/mdiv.h @@ -56,9 +56,9 @@ class Mdiv : public PageElement, public PageMilestoneInterface, public AttLabell * Interface for class functor visitation */ ///@{ - FunctorCode Accept(MutableFunctor &functor) override; + FunctorCode Accept(Functor &functor) override; FunctorCode Accept(ConstFunctor &functor) const override; - FunctorCode AcceptEnd(MutableFunctor &functor) override; + FunctorCode AcceptEnd(Functor &functor) override; FunctorCode AcceptEnd(ConstFunctor &functor) const override; ///@} diff --git a/include/vrv/measure.h b/include/vrv/measure.h index 476c404819..e9fe0cef9c 100644 --- a/include/vrv/measure.h +++ b/include/vrv/measure.h @@ -339,9 +339,9 @@ class Measure : public Object, * Interface for class functor visitation */ ///@{ - FunctorCode Accept(MutableFunctor &functor) override; + FunctorCode Accept(Functor &functor) override; FunctorCode Accept(ConstFunctor &functor) const override; - FunctorCode AcceptEnd(MutableFunctor &functor) override; + FunctorCode AcceptEnd(Functor &functor) override; FunctorCode AcceptEnd(ConstFunctor &functor) const override; ///@} diff --git a/include/vrv/mensur.h b/include/vrv/mensur.h index 4d7b649a2a..de8351493b 100644 --- a/include/vrv/mensur.h +++ b/include/vrv/mensur.h @@ -59,9 +59,9 @@ class Mensur : public LayerElement, * Interface for class functor visitation */ ///@{ - FunctorCode Accept(MutableFunctor &functor) override; + FunctorCode Accept(Functor &functor) override; FunctorCode Accept(ConstFunctor &functor) const override; - FunctorCode AcceptEnd(MutableFunctor &functor) override; + FunctorCode AcceptEnd(Functor &functor) override; FunctorCode AcceptEnd(ConstFunctor &functor) const override; ///@} diff --git a/include/vrv/metersig.h b/include/vrv/metersig.h index 7ae672198d..47e1fcebda 100644 --- a/include/vrv/metersig.h +++ b/include/vrv/metersig.h @@ -60,9 +60,9 @@ class MeterSig : public LayerElement, public AttEnclosingChars, public AttMeterS * Interface for class functor visitation */ ///@{ - FunctorCode Accept(MutableFunctor &functor) override; + FunctorCode Accept(Functor &functor) override; FunctorCode Accept(ConstFunctor &functor) const override; - FunctorCode AcceptEnd(MutableFunctor &functor) override; + FunctorCode AcceptEnd(Functor &functor) override; FunctorCode AcceptEnd(ConstFunctor &functor) const override; ///@} diff --git a/include/vrv/metersiggrp.h b/include/vrv/metersiggrp.h index f433c84657..529a438fb0 100644 --- a/include/vrv/metersiggrp.h +++ b/include/vrv/metersiggrp.h @@ -85,9 +85,9 @@ class MeterSigGrp : public Object, * Interface for class functor visitation */ ///@{ - FunctorCode Accept(MutableFunctor &functor) override; + FunctorCode Accept(Functor &functor) override; FunctorCode Accept(ConstFunctor &functor) const override; - FunctorCode AcceptEnd(MutableFunctor &functor) override; + FunctorCode AcceptEnd(Functor &functor) override; FunctorCode AcceptEnd(ConstFunctor &functor) const override; ///@} diff --git a/include/vrv/midifunctor.h b/include/vrv/midifunctor.h index e008b55aba..bd62e94eac 100644 --- a/include/vrv/midifunctor.h +++ b/include/vrv/midifunctor.h @@ -26,7 +26,7 @@ class Timemap; /** * This class prepares Note onsets. */ -class InitOnsetOffsetFunctor : public MutableFunctor { +class InitOnsetOffsetFunctor : public Functor { public: /** * @name Constructors, destructors @@ -81,7 +81,7 @@ class InitOnsetOffsetFunctor : public MutableFunctor { /** * This class calculates the maximum duration of each measure. */ -class InitMaxMeasureDurationFunctor : public MutableFunctor { +class InitMaxMeasureDurationFunctor : public Functor { public: /** * @name Constructors, destructors @@ -141,7 +141,7 @@ class InitMaxMeasureDurationFunctor : public MutableFunctor { /** * This class adjusts note timings based on ties. */ -class InitTimemapTiesFunctor : public MutableFunctor { +class InitTimemapTiesFunctor : public Functor { public: /** * @name Constructors, destructors diff --git a/include/vrv/miscfunctor.h b/include/vrv/miscfunctor.h index a3267dde75..fbfe04cfc3 100644 --- a/include/vrv/miscfunctor.h +++ b/include/vrv/miscfunctor.h @@ -19,7 +19,7 @@ namespace vrv { /** * This class applies the Pixel Per Unit factor of the page to its elements. */ -class ApplyPPUFactorFunctor : public MutableFunctor { +class ApplyPPUFactorFunctor : public Functor { public: /** * @name Constructors, destructors @@ -170,7 +170,7 @@ class InitProcessingListsFunctor : public ConstFunctor { /** * This class reorders elements by x-position. */ -class ReorderByXPosFunctor : public MutableFunctor { +class ReorderByXPosFunctor : public Functor { public: /** * @name Constructors, destructors diff --git a/include/vrv/mnum.h b/include/vrv/mnum.h index c62e57fe2f..a8d32b1de0 100644 --- a/include/vrv/mnum.h +++ b/include/vrv/mnum.h @@ -78,9 +78,9 @@ class MNum : public ControlElement, * Interface for class functor visitation */ ///@{ - FunctorCode Accept(MutableFunctor &functor) override; + FunctorCode Accept(Functor &functor) override; FunctorCode Accept(ConstFunctor &functor) const override; - FunctorCode AcceptEnd(MutableFunctor &functor) override; + FunctorCode AcceptEnd(Functor &functor) override; FunctorCode AcceptEnd(ConstFunctor &functor) const override; ///@} diff --git a/include/vrv/mordent.h b/include/vrv/mordent.h index 8fae4d8642..4e75c013c9 100644 --- a/include/vrv/mordent.h +++ b/include/vrv/mordent.h @@ -67,9 +67,9 @@ class Mordent : public ControlElement, * Interface for class functor visitation */ ///@{ - FunctorCode Accept(MutableFunctor &functor) override; + FunctorCode Accept(Functor &functor) override; FunctorCode Accept(ConstFunctor &functor) const override; - FunctorCode AcceptEnd(MutableFunctor &functor) override; + FunctorCode AcceptEnd(Functor &functor) override; FunctorCode AcceptEnd(ConstFunctor &functor) const override; ///@} diff --git a/include/vrv/mrest.h b/include/vrv/mrest.h index b0d1bc6d5c..7fbc22712c 100644 --- a/include/vrv/mrest.h +++ b/include/vrv/mrest.h @@ -64,9 +64,9 @@ class MRest : public LayerElement, * Interface for class functor visitation */ ///@{ - FunctorCode Accept(MutableFunctor &functor) override; + FunctorCode Accept(Functor &functor) override; FunctorCode Accept(ConstFunctor &functor) const override; - FunctorCode AcceptEnd(MutableFunctor &functor) override; + FunctorCode AcceptEnd(Functor &functor) override; FunctorCode AcceptEnd(ConstFunctor &functor) const override; ///@} diff --git a/include/vrv/mrpt.h b/include/vrv/mrpt.h index 28462147a2..f4375be355 100644 --- a/include/vrv/mrpt.h +++ b/include/vrv/mrpt.h @@ -45,9 +45,9 @@ class MRpt : public LayerElement, public AttColor, public AttNumbered, public At * Interface for class functor visitation */ ///@{ - FunctorCode Accept(MutableFunctor &functor) override; + FunctorCode Accept(Functor &functor) override; FunctorCode Accept(ConstFunctor &functor) const override; - FunctorCode AcceptEnd(MutableFunctor &functor) override; + FunctorCode AcceptEnd(Functor &functor) override; FunctorCode AcceptEnd(ConstFunctor &functor) const override; ///@} diff --git a/include/vrv/mrpt2.h b/include/vrv/mrpt2.h index 619aac796d..a40e4a8e99 100644 --- a/include/vrv/mrpt2.h +++ b/include/vrv/mrpt2.h @@ -41,9 +41,9 @@ class MRpt2 : public LayerElement, public AttColor { * Interface for class functor visitation */ ///@{ - FunctorCode Accept(MutableFunctor &functor) override; + FunctorCode Accept(Functor &functor) override; FunctorCode Accept(ConstFunctor &functor) const override; - FunctorCode AcceptEnd(MutableFunctor &functor) override; + FunctorCode AcceptEnd(Functor &functor) override; FunctorCode AcceptEnd(ConstFunctor &functor) const override; ///@} diff --git a/include/vrv/mspace.h b/include/vrv/mspace.h index 90035dbe73..39c7f34a0c 100644 --- a/include/vrv/mspace.h +++ b/include/vrv/mspace.h @@ -41,9 +41,9 @@ class MSpace : public LayerElement { * Interface for class functor visitation */ ///@{ - FunctorCode Accept(MutableFunctor &functor) override; + FunctorCode Accept(Functor &functor) override; FunctorCode Accept(ConstFunctor &functor) const override; - FunctorCode AcceptEnd(MutableFunctor &functor) override; + FunctorCode AcceptEnd(Functor &functor) override; FunctorCode AcceptEnd(ConstFunctor &functor) const override; ///@} diff --git a/include/vrv/multirest.h b/include/vrv/multirest.h index 7eed8bd039..574b44f41a 100644 --- a/include/vrv/multirest.h +++ b/include/vrv/multirest.h @@ -52,9 +52,9 @@ class MultiRest : public LayerElement, * Interface for class functor visitation */ ///@{ - FunctorCode Accept(MutableFunctor &functor) override; + FunctorCode Accept(Functor &functor) override; FunctorCode Accept(ConstFunctor &functor) const override; - FunctorCode AcceptEnd(MutableFunctor &functor) override; + FunctorCode AcceptEnd(Functor &functor) override; FunctorCode AcceptEnd(ConstFunctor &functor) const override; ///@} diff --git a/include/vrv/multirpt.h b/include/vrv/multirpt.h index 8a97f84aa3..4f70e23123 100644 --- a/include/vrv/multirpt.h +++ b/include/vrv/multirpt.h @@ -40,9 +40,9 @@ class MultiRpt : public LayerElement, public AttNumbered { * Interface for class functor visitation */ ///@{ - FunctorCode Accept(MutableFunctor &functor) override; + FunctorCode Accept(Functor &functor) override; FunctorCode Accept(ConstFunctor &functor) const override; - FunctorCode AcceptEnd(MutableFunctor &functor) override; + FunctorCode AcceptEnd(Functor &functor) override; FunctorCode AcceptEnd(ConstFunctor &functor) const override; ///@} diff --git a/include/vrv/nc.h b/include/vrv/nc.h index b3d78bfc9e..cee752c293 100644 --- a/include/vrv/nc.h +++ b/include/vrv/nc.h @@ -64,9 +64,9 @@ class Nc : public LayerElement, * Interface for class functor visitation */ ///@{ - FunctorCode Accept(MutableFunctor &functor) override; + FunctorCode Accept(Functor &functor) override; FunctorCode Accept(ConstFunctor &functor) const override; - FunctorCode AcceptEnd(MutableFunctor &functor) override; + FunctorCode AcceptEnd(Functor &functor) override; FunctorCode AcceptEnd(ConstFunctor &functor) const override; ///@} diff --git a/include/vrv/neume.h b/include/vrv/neume.h index 0b3730c9d1..083aa39eed 100644 --- a/include/vrv/neume.h +++ b/include/vrv/neume.h @@ -92,9 +92,9 @@ class Neume : public LayerElement, public ObjectListInterface, public AttColor { * Interface for class functor visitation */ ///@{ - FunctorCode Accept(MutableFunctor &functor) override; + FunctorCode Accept(Functor &functor) override; FunctorCode Accept(ConstFunctor &functor) const override; - FunctorCode AcceptEnd(MutableFunctor &functor) override; + FunctorCode AcceptEnd(Functor &functor) override; FunctorCode AcceptEnd(ConstFunctor &functor) const override; ///@} diff --git a/include/vrv/note.h b/include/vrv/note.h index 529030d399..db8ba2ed3c 100644 --- a/include/vrv/note.h +++ b/include/vrv/note.h @@ -297,9 +297,9 @@ class Note : public LayerElement, * Interface for class functor visitation */ ///@{ - FunctorCode Accept(MutableFunctor &functor) override; + FunctorCode Accept(Functor &functor) override; FunctorCode Accept(ConstFunctor &functor) const override; - FunctorCode AcceptEnd(MutableFunctor &functor) override; + FunctorCode AcceptEnd(Functor &functor) override; FunctorCode AcceptEnd(ConstFunctor &functor) const override; ///@} diff --git a/include/vrv/num.h b/include/vrv/num.h index a927bafec2..abd0728d3e 100644 --- a/include/vrv/num.h +++ b/include/vrv/num.h @@ -52,9 +52,9 @@ class Num : public TextElement { * Interface for class functor visitation */ ///@{ - FunctorCode Accept(MutableFunctor &functor) override; + FunctorCode Accept(Functor &functor) override; FunctorCode Accept(ConstFunctor &functor) const override; - FunctorCode AcceptEnd(MutableFunctor &functor) override; + FunctorCode AcceptEnd(Functor &functor) override; FunctorCode AcceptEnd(ConstFunctor &functor) const override; ///@} diff --git a/include/vrv/object.h b/include/vrv/object.h index c871d9434e..fce939c156 100644 --- a/include/vrv/object.h +++ b/include/vrv/object.h @@ -32,7 +32,7 @@ class Output; class Filters; class Functor; class FunctorParams; -class MutableFunctor; +class Functor; class ConstFunctor; class LinkingInterface; class FacsimileInterface; @@ -646,7 +646,7 @@ class Object : public BoundingBox { * skipFirst does not call the functor on the first (calling) level */ ///@{ - void Process(MutableFunctor &functor, int deepness = UNLIMITED_DEPTH, bool skipFirst = false); + void Process(Functor &functor, int deepness = UNLIMITED_DEPTH, bool skipFirst = false); void Process(ConstFunctor &functor, int deepness = UNLIMITED_DEPTH, bool skipFirst = false) const; ///@} @@ -654,9 +654,9 @@ class Object : public BoundingBox { * Interface for class functor visitation */ ///@{ - virtual FunctorCode Accept(MutableFunctor &functor); + virtual FunctorCode Accept(Functor &functor); virtual FunctorCode Accept(ConstFunctor &functor) const; - virtual FunctorCode AcceptEnd(MutableFunctor &functor); + virtual FunctorCode AcceptEnd(Functor &functor); virtual FunctorCode AcceptEnd(ConstFunctor &functor) const; ///@} diff --git a/include/vrv/octave.h b/include/vrv/octave.h index f199c1cc11..c9f59f7651 100644 --- a/include/vrv/octave.h +++ b/include/vrv/octave.h @@ -94,9 +94,9 @@ class Octave : public ControlElement, * Interface for class functor visitation */ ///@{ - FunctorCode Accept(MutableFunctor &functor) override; + FunctorCode Accept(Functor &functor) override; FunctorCode Accept(ConstFunctor &functor) const override; - FunctorCode AcceptEnd(MutableFunctor &functor) override; + FunctorCode AcceptEnd(Functor &functor) override; FunctorCode AcceptEnd(ConstFunctor &functor) const override; ///@} diff --git a/include/vrv/ornam.h b/include/vrv/ornam.h index 66bc65dbf1..f638e333c6 100644 --- a/include/vrv/ornam.h +++ b/include/vrv/ornam.h @@ -76,9 +76,9 @@ class Ornam : public ControlElement, * Interface for class functor visitation */ ///@{ - FunctorCode Accept(MutableFunctor &functor) override; + FunctorCode Accept(Functor &functor) override; FunctorCode Accept(ConstFunctor &functor) const override; - FunctorCode AcceptEnd(MutableFunctor &functor) override; + FunctorCode AcceptEnd(Functor &functor) override; FunctorCode AcceptEnd(ConstFunctor &functor) const override; ///@} diff --git a/include/vrv/page.h b/include/vrv/page.h index 87a8448d49..7bab10d7ec 100644 --- a/include/vrv/page.h +++ b/include/vrv/page.h @@ -158,9 +158,9 @@ class Page : public Object { * Interface for class functor visitation */ ///@{ - FunctorCode Accept(MutableFunctor &functor) override; + FunctorCode Accept(Functor &functor) override; FunctorCode Accept(ConstFunctor &functor) const override; - FunctorCode AcceptEnd(MutableFunctor &functor) override; + FunctorCode AcceptEnd(Functor &functor) override; FunctorCode AcceptEnd(ConstFunctor &functor) const override; ///@} diff --git a/include/vrv/pageelement.h b/include/vrv/pageelement.h index f910a445b9..e4b2abb7fc 100644 --- a/include/vrv/pageelement.h +++ b/include/vrv/pageelement.h @@ -44,9 +44,9 @@ class PageElement : public Object, public AttTyped { * Interface for class functor visitation */ ///@{ - FunctorCode Accept(MutableFunctor &functor) override; + FunctorCode Accept(Functor &functor) override; FunctorCode Accept(ConstFunctor &functor) const override; - FunctorCode AcceptEnd(MutableFunctor &functor) override; + FunctorCode AcceptEnd(Functor &functor) override; FunctorCode AcceptEnd(ConstFunctor &functor) const override; ///@} diff --git a/include/vrv/pagemilestone.h b/include/vrv/pagemilestone.h index 2371f72ac9..0a339ba712 100644 --- a/include/vrv/pagemilestone.h +++ b/include/vrv/pagemilestone.h @@ -53,9 +53,9 @@ class PageMilestoneEnd : public PageElement { * Interface for class functor visitation */ ///@{ - FunctorCode Accept(MutableFunctor &functor) override; + FunctorCode Accept(Functor &functor) override; FunctorCode Accept(ConstFunctor &functor) const override; - FunctorCode AcceptEnd(MutableFunctor &functor) override; + FunctorCode AcceptEnd(Functor &functor) override; FunctorCode AcceptEnd(ConstFunctor &functor) const override; ///@} diff --git a/include/vrv/pages.h b/include/vrv/pages.h index 38822ebb67..6b87e690d0 100644 --- a/include/vrv/pages.h +++ b/include/vrv/pages.h @@ -56,9 +56,9 @@ class Pages : public Object, public AttLabelled, public AttNNumberLike { * Interface for class functor visitation */ ///@{ - FunctorCode Accept(MutableFunctor &functor) override; + FunctorCode Accept(Functor &functor) override; FunctorCode Accept(ConstFunctor &functor) const override; - FunctorCode AcceptEnd(MutableFunctor &functor) override; + FunctorCode AcceptEnd(Functor &functor) override; FunctorCode AcceptEnd(ConstFunctor &functor) const override; ///@} diff --git a/include/vrv/pb.h b/include/vrv/pb.h index 6b764bbc47..92cecf39fd 100644 --- a/include/vrv/pb.h +++ b/include/vrv/pb.h @@ -43,9 +43,9 @@ class Pb : public SystemElement, public AttNNumberLike { * Interface for class functor visitation */ ///@{ - FunctorCode Accept(MutableFunctor &functor) override; + FunctorCode Accept(Functor &functor) override; FunctorCode Accept(ConstFunctor &functor) const override; - FunctorCode AcceptEnd(MutableFunctor &functor) override; + FunctorCode AcceptEnd(Functor &functor) override; FunctorCode AcceptEnd(ConstFunctor &functor) const override; ///@} diff --git a/include/vrv/pedal.h b/include/vrv/pedal.h index d1f43dcfda..9070421b57 100644 --- a/include/vrv/pedal.h +++ b/include/vrv/pedal.h @@ -87,9 +87,9 @@ class Pedal : public ControlElement, * Interface for class functor visitation */ ///@{ - FunctorCode Accept(MutableFunctor &functor) override; + FunctorCode Accept(Functor &functor) override; FunctorCode Accept(ConstFunctor &functor) const override; - FunctorCode AcceptEnd(MutableFunctor &functor) override; + FunctorCode AcceptEnd(Functor &functor) override; FunctorCode AcceptEnd(ConstFunctor &functor) const override; ///@} diff --git a/include/vrv/pgfoot.h b/include/vrv/pgfoot.h index 88bdedf0ce..124536d5b7 100644 --- a/include/vrv/pgfoot.h +++ b/include/vrv/pgfoot.h @@ -45,9 +45,9 @@ class PgFoot : public RunningElement { * Interface for class functor visitation */ ///@{ - FunctorCode Accept(MutableFunctor &functor) override; + FunctorCode Accept(Functor &functor) override; FunctorCode Accept(ConstFunctor &functor) const override; - FunctorCode AcceptEnd(MutableFunctor &functor) override; + FunctorCode AcceptEnd(Functor &functor) override; FunctorCode AcceptEnd(ConstFunctor &functor) const override; ///@} diff --git a/include/vrv/pgfoot2.h b/include/vrv/pgfoot2.h index 819de3e6ee..00e938c02e 100644 --- a/include/vrv/pgfoot2.h +++ b/include/vrv/pgfoot2.h @@ -45,9 +45,9 @@ class PgFoot2 : public RunningElement { * Interface for class functor visitation */ ///@{ - FunctorCode Accept(MutableFunctor &functor) override; + FunctorCode Accept(Functor &functor) override; FunctorCode Accept(ConstFunctor &functor) const override; - FunctorCode AcceptEnd(MutableFunctor &functor) override; + FunctorCode AcceptEnd(Functor &functor) override; FunctorCode AcceptEnd(ConstFunctor &functor) const override; ///@} diff --git a/include/vrv/pghead.h b/include/vrv/pghead.h index 312d03c765..8e450d8103 100644 --- a/include/vrv/pghead.h +++ b/include/vrv/pghead.h @@ -47,9 +47,9 @@ class PgHead : public RunningElement { * Interface for class functor visitation */ ///@{ - FunctorCode Accept(MutableFunctor &functor) override; + FunctorCode Accept(Functor &functor) override; FunctorCode Accept(ConstFunctor &functor) const override; - FunctorCode AcceptEnd(MutableFunctor &functor) override; + FunctorCode AcceptEnd(Functor &functor) override; FunctorCode AcceptEnd(ConstFunctor &functor) const override; ///@} diff --git a/include/vrv/pghead2.h b/include/vrv/pghead2.h index 7d0f8277ce..8f3d060587 100644 --- a/include/vrv/pghead2.h +++ b/include/vrv/pghead2.h @@ -45,9 +45,9 @@ class PgHead2 : public RunningElement { * Interface for class functor visitation */ ///@{ - FunctorCode Accept(MutableFunctor &functor) override; + FunctorCode Accept(Functor &functor) override; FunctorCode Accept(ConstFunctor &functor) const override; - FunctorCode AcceptEnd(MutableFunctor &functor) override; + FunctorCode AcceptEnd(Functor &functor) override; FunctorCode AcceptEnd(ConstFunctor &functor) const override; ///@} diff --git a/include/vrv/phrase.h b/include/vrv/phrase.h index 53fc3cf088..5ccbd59f46 100644 --- a/include/vrv/phrase.h +++ b/include/vrv/phrase.h @@ -38,9 +38,9 @@ class Phrase : public Slur { * Interface for class functor visitation */ ///@{ - FunctorCode Accept(MutableFunctor &functor) override; + FunctorCode Accept(Functor &functor) override; FunctorCode Accept(ConstFunctor &functor) const override; - FunctorCode AcceptEnd(MutableFunctor &functor) override; + FunctorCode AcceptEnd(Functor &functor) override; FunctorCode AcceptEnd(ConstFunctor &functor) const override; ///@} diff --git a/include/vrv/pitchinflection.h b/include/vrv/pitchinflection.h index 6491315cc8..252f0da9bd 100644 --- a/include/vrv/pitchinflection.h +++ b/include/vrv/pitchinflection.h @@ -58,9 +58,9 @@ class PitchInflection : public ControlElement, public TimeSpanningInterface { * Interface for class functor visitation */ ///@{ - FunctorCode Accept(MutableFunctor &functor) override; + FunctorCode Accept(Functor &functor) override; FunctorCode Accept(ConstFunctor &functor) const override; - FunctorCode AcceptEnd(MutableFunctor &functor) override; + FunctorCode AcceptEnd(Functor &functor) override; FunctorCode AcceptEnd(ConstFunctor &functor) const override; ///@} diff --git a/include/vrv/plica.h b/include/vrv/plica.h index 7eab5686b1..cc39b69a57 100644 --- a/include/vrv/plica.h +++ b/include/vrv/plica.h @@ -38,9 +38,9 @@ class Plica : public LayerElement, public AttPlicaVis { * Interface for class functor visitation */ ///@{ - FunctorCode Accept(MutableFunctor &functor) override; + FunctorCode Accept(Functor &functor) override; FunctorCode Accept(ConstFunctor &functor) const override; - FunctorCode AcceptEnd(MutableFunctor &functor) override; + FunctorCode AcceptEnd(Functor &functor) override; FunctorCode AcceptEnd(ConstFunctor &functor) const override; ///@} diff --git a/include/vrv/preparedatafunctor.h b/include/vrv/preparedatafunctor.h index 74dc17f447..b21caf37af 100644 --- a/include/vrv/preparedatafunctor.h +++ b/include/vrv/preparedatafunctor.h @@ -66,7 +66,7 @@ class PrepareDataInitializationFunctor : public DocFunctor { /** * This class sets the drawing cue size for all layer elements. */ -class PrepareCueSizeFunctor : public MutableFunctor { +class PrepareCueSizeFunctor : public Functor { public: /** * @name Constructors, destructors @@ -105,7 +105,7 @@ class PrepareCueSizeFunctor : public MutableFunctor { /** * This class sets the cross staff and cross layer pointers on layer elements. */ -class PrepareCrossStaffFunctor : public MutableFunctor { +class PrepareCrossStaffFunctor : public Functor { public: /** * @name Constructors, destructors @@ -151,7 +151,7 @@ class PrepareCrossStaffFunctor : public MutableFunctor { /** * This class matches the @altsym element to the corresponding symbolDef. */ -class PrepareAltSymFunctor : public MutableFunctor { +class PrepareAltSymFunctor : public Functor { public: /** * @name Constructors, destructors @@ -196,7 +196,7 @@ class PrepareAltSymFunctor : public MutableFunctor { /** * This class associates layer elements with @facs to the appropriate zone. */ -class PrepareFacsimileFunctor : public MutableFunctor { +class PrepareFacsimileFunctor : public Functor { public: /** * @name Constructors, destructors @@ -243,7 +243,7 @@ class PrepareFacsimileFunctor : public MutableFunctor { /** * This class matches linking elements (e.g, @next). */ -class PrepareLinkingFunctor : public MutableFunctor { +class PrepareLinkingFunctor : public Functor { public: /** * @name Constructors, destructors @@ -321,7 +321,7 @@ class PrepareLinkingFunctor : public MutableFunctor { /** * This class matches elements of @plist. */ -class PreparePlistFunctor : public MutableFunctor { +class PreparePlistFunctor : public Functor { public: /** * @name Constructors, destructors @@ -380,7 +380,7 @@ class PreparePlistFunctor : public MutableFunctor { /** * This class extracts the default duration from scoredef/staffdef. */ -class PrepareDurationFunctor : public MutableFunctor { +class PrepareDurationFunctor : public Functor { public: /** * @name Constructors, destructors @@ -425,7 +425,7 @@ class PrepareDurationFunctor : public MutableFunctor { /** * This class matches the start for TimePointingInterface elements (such as fermata or harm). */ -class PrepareTimePointingFunctor : public MutableFunctor { +class PrepareTimePointingFunctor : public Functor { public: /** * @name Constructors, destructors @@ -477,7 +477,7 @@ class PrepareTimePointingFunctor : public MutableFunctor { * If fillMode is set to false, only the remaining elements will be matched. * This is used when processing a second time in the other direction. */ -class PrepareTimeSpanningFunctor : public MutableFunctor { +class PrepareTimeSpanningFunctor : public Functor { public: /** * @name Constructors, destructors @@ -540,7 +540,7 @@ class PrepareTimeSpanningFunctor : public MutableFunctor { * It is performed only on TimeSpanningInterface elements without @startid (or @endid). * It adds to the start (and end) measure a TimeStampAttr to the Measure::m_tstamps. */ -class PrepareTimestampsFunctor : public MutableFunctor { +class PrepareTimestampsFunctor : public Functor { public: /** * @name Constructors, destructors @@ -595,7 +595,7 @@ class PrepareTimestampsFunctor : public MutableFunctor { * This class processes by layer and sets drawing pointers. * Set Dot::m_drawingNote for Dot elements in mensural mode */ -class PreparePointersByLayerFunctor : public MutableFunctor { +class PreparePointersByLayerFunctor : public Functor { public: /** * @name Constructors, destructors @@ -640,7 +640,7 @@ class PreparePointersByLayerFunctor : public MutableFunctor { * The functor is processed by staff/layer/verse using Filters. * At the end, the functor closes opened syl in VisitDocEnd. */ -class PrepareLyricsFunctor : public MutableFunctor { +class PrepareLyricsFunctor : public Functor { public: /** * @name Constructors, destructors @@ -687,7 +687,7 @@ class PrepareLyricsFunctor : public MutableFunctor { /** * This class adds LayerElement parts (stem, flag, dots, etc). */ -class PrepareLayerElementPartsFunctor : public MutableFunctor { +class PrepareLayerElementPartsFunctor : public Functor { public: /** * @name Constructors, destructors @@ -776,7 +776,7 @@ class PrepareRptFunctor : public DocFunctor { * This class sets Turn::m_drawingEndNote for delayed turns. * Needs a first pass to fill the map, processed by staff/layer after that. */ -class PrepareDelayedTurnsFunctor : public MutableFunctor { +class PrepareDelayedTurnsFunctor : public Functor { public: /** * @name Constructors, destructors @@ -843,7 +843,7 @@ class PrepareDelayedTurnsFunctor : public MutableFunctor { /** * This class sets the Measure of Ending. */ -class PrepareMilestonesFunctor : public MutableFunctor { +class PrepareMilestonesFunctor : public Functor { public: /** * @name Constructors, destructors @@ -958,7 +958,7 @@ class PrepareFloatingGrpsFunctor : public DocFunctor { * that is covered. At the end, it removes the TimeSpanningInterface element * from the list when the last measure is reached. */ -class PrepareStaffCurrentTimeSpanningFunctor : public MutableFunctor { +class PrepareStaffCurrentTimeSpanningFunctor : public Functor { public: /** * @name Constructors, destructors @@ -1010,7 +1010,7 @@ class PrepareStaffCurrentTimeSpanningFunctor : public MutableFunctor { /** * This class resolves the Reh time pointing position in case none is set. */ -class PrepareRehPositionFunctor : public MutableFunctor { +class PrepareRehPositionFunctor : public Functor { public: /** * @name Constructors, destructors @@ -1050,7 +1050,7 @@ class PrepareRehPositionFunctor : public MutableFunctor { * This class gets the list of referenced elements for the BeamSpan and marks referenced * objects as contained in a BeamSpan. */ -class PrepareBeamSpanElementsFunctor : public MutableFunctor { +class PrepareBeamSpanElementsFunctor : public Functor { public: /** * @name Constructors, destructors diff --git a/include/vrv/proport.h b/include/vrv/proport.h index 268a2c1157..ad3db4c2f2 100644 --- a/include/vrv/proport.h +++ b/include/vrv/proport.h @@ -41,9 +41,9 @@ class Proport : public LayerElement, public AttDurationRatio { * Interface for class functor visitation */ ///@{ - FunctorCode Accept(MutableFunctor &functor) override; + FunctorCode Accept(Functor &functor) override; FunctorCode Accept(ConstFunctor &functor) const override; - FunctorCode AcceptEnd(MutableFunctor &functor) override; + FunctorCode AcceptEnd(Functor &functor) override; FunctorCode AcceptEnd(ConstFunctor &functor) const override; ///@} diff --git a/include/vrv/reh.h b/include/vrv/reh.h index 3cb238b62c..51f837a32f 100644 --- a/include/vrv/reh.h +++ b/include/vrv/reh.h @@ -69,9 +69,9 @@ class Reh : public ControlElement, * Interface for class functor visitation */ ///@{ - FunctorCode Accept(MutableFunctor &functor) override; + FunctorCode Accept(Functor &functor) override; FunctorCode Accept(ConstFunctor &functor) const override; - FunctorCode AcceptEnd(MutableFunctor &functor) override; + FunctorCode AcceptEnd(Functor &functor) override; FunctorCode AcceptEnd(ConstFunctor &functor) const override; ///@} diff --git a/include/vrv/rend.h b/include/vrv/rend.h index b980e4fadb..278f5b9f50 100644 --- a/include/vrv/rend.h +++ b/include/vrv/rend.h @@ -66,9 +66,9 @@ class Rend : public TextElement, * Interface for class functor visitation */ ///@{ - FunctorCode Accept(MutableFunctor &functor) override; + FunctorCode Accept(Functor &functor) override; FunctorCode Accept(ConstFunctor &functor) const override; - FunctorCode AcceptEnd(MutableFunctor &functor) override; + FunctorCode AcceptEnd(Functor &functor) override; FunctorCode AcceptEnd(ConstFunctor &functor) const override; ///@} diff --git a/include/vrv/resetfunctor.h b/include/vrv/resetfunctor.h index 9a71fb3d22..769d8bdb98 100644 --- a/include/vrv/resetfunctor.h +++ b/include/vrv/resetfunctor.h @@ -19,7 +19,7 @@ namespace vrv { /** * This class resets the drawing values before calling PrepareData after changes. */ -class ResetDataFunctor : public MutableFunctor { +class ResetDataFunctor : public Functor { public: /** * @name Constructors, destructors @@ -90,7 +90,7 @@ class ResetDataFunctor : public MutableFunctor { /** * This class resets the horizontal alignment for various types. */ -class ResetHorizontalAlignmentFunctor : public MutableFunctor { +class ResetHorizontalAlignmentFunctor : public Functor { public: /** * @name Constructors, destructors @@ -147,7 +147,7 @@ class ResetHorizontalAlignmentFunctor : public MutableFunctor { /** * This class resets the vertical alignment for various types. */ -class ResetVerticalAlignmentFunctor : public MutableFunctor { +class ResetVerticalAlignmentFunctor : public Functor { public: /** * @name Constructors, destructors diff --git a/include/vrv/rest.h b/include/vrv/rest.h index f201375227..82a7926653 100644 --- a/include/vrv/rest.h +++ b/include/vrv/rest.h @@ -104,9 +104,9 @@ class Rest : public LayerElement, * Interface for class functor visitation */ ///@{ - FunctorCode Accept(MutableFunctor &functor) override; + FunctorCode Accept(Functor &functor) override; FunctorCode Accept(ConstFunctor &functor) const override; - FunctorCode AcceptEnd(MutableFunctor &functor) override; + FunctorCode AcceptEnd(Functor &functor) override; FunctorCode AcceptEnd(ConstFunctor &functor) const override; ///@} diff --git a/include/vrv/runningelement.h b/include/vrv/runningelement.h index 49971c3c32..20f03a85ae 100644 --- a/include/vrv/runningelement.h +++ b/include/vrv/runningelement.h @@ -158,9 +158,9 @@ class RunningElement : public Object, public ObjectListInterface, public AttHori * Interface for class functor visitation */ ///@{ - FunctorCode Accept(MutableFunctor &functor) override; + FunctorCode Accept(Functor &functor) override; FunctorCode Accept(ConstFunctor &functor) const override; - FunctorCode AcceptEnd(MutableFunctor &functor) override; + FunctorCode AcceptEnd(Functor &functor) override; FunctorCode AcceptEnd(ConstFunctor &functor) const override; ///@} diff --git a/include/vrv/savefunctor.h b/include/vrv/savefunctor.h index ab994c5072..a8ed923304 100644 --- a/include/vrv/savefunctor.h +++ b/include/vrv/savefunctor.h @@ -19,7 +19,7 @@ namespace vrv { /** * This class saves the content of any object by calling the appropriate FileOutputStream method. */ -class SaveFunctor : public MutableFunctor { +class SaveFunctor : public Functor { public: /** * @name Constructors, destructors diff --git a/include/vrv/sb.h b/include/vrv/sb.h index 8b16735b69..83d4812dd7 100644 --- a/include/vrv/sb.h +++ b/include/vrv/sb.h @@ -43,9 +43,9 @@ class Sb : public SystemElement, public AttNNumberLike { * Interface for class functor visitation */ ///@{ - FunctorCode Accept(MutableFunctor &functor) override; + FunctorCode Accept(Functor &functor) override; FunctorCode Accept(ConstFunctor &functor) const override; - FunctorCode AcceptEnd(MutableFunctor &functor) override; + FunctorCode AcceptEnd(Functor &functor) override; FunctorCode AcceptEnd(ConstFunctor &functor) const override; ///@} diff --git a/include/vrv/score.h b/include/vrv/score.h index 40ce402570..de496139af 100644 --- a/include/vrv/score.h +++ b/include/vrv/score.h @@ -82,9 +82,9 @@ class Score : public PageElement, public PageMilestoneInterface, public AttLabel * Interface for class functor visitation */ ///@{ - FunctorCode Accept(MutableFunctor &functor) override; + FunctorCode Accept(Functor &functor) override; FunctorCode Accept(ConstFunctor &functor) const override; - FunctorCode AcceptEnd(MutableFunctor &functor) override; + FunctorCode AcceptEnd(Functor &functor) override; FunctorCode AcceptEnd(ConstFunctor &functor) const override; ///@} diff --git a/include/vrv/scoredef.h b/include/vrv/scoredef.h index 95ce8b0652..156be72770 100644 --- a/include/vrv/scoredef.h +++ b/include/vrv/scoredef.h @@ -107,9 +107,9 @@ class ScoreDefElement : public Object, public ScoreDefInterface, public AttTyped * Interface for class functor visitation */ ///@{ - FunctorCode Accept(MutableFunctor &functor) override; + FunctorCode Accept(Functor &functor) override; FunctorCode Accept(ConstFunctor &functor) const override; - FunctorCode AcceptEnd(MutableFunctor &functor) override; + FunctorCode AcceptEnd(Functor &functor) override; FunctorCode AcceptEnd(ConstFunctor &functor) const override; ///@} @@ -269,9 +269,9 @@ class ScoreDef : public ScoreDefElement, * Interface for class functor visitation */ ///@{ - FunctorCode Accept(MutableFunctor &functor) override; + FunctorCode Accept(Functor &functor) override; FunctorCode Accept(ConstFunctor &functor) const override; - FunctorCode AcceptEnd(MutableFunctor &functor) override; + FunctorCode AcceptEnd(Functor &functor) override; FunctorCode AcceptEnd(ConstFunctor &functor) const override; ///@} diff --git a/include/vrv/section.h b/include/vrv/section.h index 6ec302c225..0eed82735f 100644 --- a/include/vrv/section.h +++ b/include/vrv/section.h @@ -52,9 +52,9 @@ class Section : public SystemElement, public SystemMilestoneInterface, public At * Interface for class functor visitation */ ///@{ - FunctorCode Accept(MutableFunctor &functor) override; + FunctorCode Accept(Functor &functor) override; FunctorCode Accept(ConstFunctor &functor) const override; - FunctorCode AcceptEnd(MutableFunctor &functor) override; + FunctorCode AcceptEnd(Functor &functor) override; FunctorCode AcceptEnd(ConstFunctor &functor) const override; ///@} diff --git a/include/vrv/setscoredeffunctor.h b/include/vrv/setscoredeffunctor.h index c963a95697..3e6a14e3c8 100644 --- a/include/vrv/setscoredeffunctor.h +++ b/include/vrv/setscoredeffunctor.h @@ -19,7 +19,7 @@ namespace vrv { /** * This class sets the current drawing clef, key signature, etc. to the StaffDef */ -class ReplaceDrawingValuesInStaffDefFunctor : public MutableFunctor { +class ReplaceDrawingValuesInStaffDefFunctor : public Functor { public: /** * @name Constructors, destructors @@ -219,7 +219,7 @@ class ScoreDefOptimizeFunctor : public DocFunctor { /** * This class sets the cautionary scoreDef wherever needed. */ -class SetCautionaryScoreDefFunctor : public MutableFunctor { +class SetCautionaryScoreDefFunctor : public Functor { public: /** * @name Constructors, destructors @@ -261,7 +261,7 @@ class SetCautionaryScoreDefFunctor : public MutableFunctor { /** * This class prepares the group symbol starting and ending staffDefs for drawing. */ -class ScoreDefSetGrpSymFunctor : public MutableFunctor { +class ScoreDefSetGrpSymFunctor : public Functor { public: /** * @name Constructors, destructors @@ -301,7 +301,7 @@ class ScoreDefSetGrpSymFunctor : public MutableFunctor { /** * This class unsets the initial scoreDef for each system and measure. */ -class ScoreDefUnsetCurrentFunctor : public MutableFunctor { +class ScoreDefUnsetCurrentFunctor : public Functor { public: /** * @name Constructors, destructors @@ -358,7 +358,7 @@ enum StaffDefRedrawFlags { * This class sets drawing flags for the StaffDef for indicating whether clefs, keysigs, etc. need * to be redrawn. This typically occurs when a new System or a new ScoreDef is encountered. */ -class SetStaffDefRedrawFlagsFunctor : public MutableFunctor { +class SetStaffDefRedrawFlagsFunctor : public Functor { public: /** * @name Constructors, destructors diff --git a/include/vrv/slur.h b/include/vrv/slur.h index af1791eaca..a3cf6a0ec4 100644 --- a/include/vrv/slur.h +++ b/include/vrv/slur.h @@ -215,9 +215,9 @@ class Slur : public ControlElement, * Interface for class functor visitation */ ///@{ - FunctorCode Accept(MutableFunctor &functor) override; + FunctorCode Accept(Functor &functor) override; FunctorCode Accept(ConstFunctor &functor) const override; - FunctorCode AcceptEnd(MutableFunctor &functor) override; + FunctorCode AcceptEnd(Functor &functor) override; FunctorCode AcceptEnd(ConstFunctor &functor) const override; ///@} diff --git a/include/vrv/space.h b/include/vrv/space.h index eddf6b4987..93f47528d0 100644 --- a/include/vrv/space.h +++ b/include/vrv/space.h @@ -50,9 +50,9 @@ class Space : public LayerElement, public DurationInterface { * Interface for class functor visitation */ ///@{ - FunctorCode Accept(MutableFunctor &functor) override; + FunctorCode Accept(Functor &functor) override; FunctorCode Accept(ConstFunctor &functor) const override; - FunctorCode AcceptEnd(MutableFunctor &functor) override; + FunctorCode AcceptEnd(Functor &functor) override; FunctorCode AcceptEnd(ConstFunctor &functor) const override; ///@} diff --git a/include/vrv/staff.h b/include/vrv/staff.h index 37cf3dc650..db2edc2561 100644 --- a/include/vrv/staff.h +++ b/include/vrv/staff.h @@ -189,9 +189,9 @@ class Staff : public Object, * Interface for class functor visitation */ ///@{ - FunctorCode Accept(MutableFunctor &functor) override; + FunctorCode Accept(Functor &functor) override; FunctorCode Accept(ConstFunctor &functor) const override; - FunctorCode AcceptEnd(MutableFunctor &functor) override; + FunctorCode AcceptEnd(Functor &functor) override; FunctorCode AcceptEnd(ConstFunctor &functor) const override; ///@} diff --git a/include/vrv/staffdef.h b/include/vrv/staffdef.h index 40a6f9ee14..7e779f3df0 100644 --- a/include/vrv/staffdef.h +++ b/include/vrv/staffdef.h @@ -78,9 +78,9 @@ class StaffDef : public ScoreDefElement, * Interface for class functor visitation */ ///@{ - FunctorCode Accept(MutableFunctor &functor) override; + FunctorCode Accept(Functor &functor) override; FunctorCode Accept(ConstFunctor &functor) const override; - FunctorCode AcceptEnd(MutableFunctor &functor) override; + FunctorCode AcceptEnd(Functor &functor) override; FunctorCode AcceptEnd(ConstFunctor &functor) const override; ///@} diff --git a/include/vrv/staffgrp.h b/include/vrv/staffgrp.h index 74a74860d8..c321841239 100644 --- a/include/vrv/staffgrp.h +++ b/include/vrv/staffgrp.h @@ -127,9 +127,9 @@ class StaffGrp : public Object, * Interface for class functor visitation */ ///@{ - FunctorCode Accept(MutableFunctor &functor) override; + FunctorCode Accept(Functor &functor) override; FunctorCode Accept(ConstFunctor &functor) const override; - FunctorCode AcceptEnd(MutableFunctor &functor) override; + FunctorCode AcceptEnd(Functor &functor) override; FunctorCode AcceptEnd(ConstFunctor &functor) const override; ///@} diff --git a/include/vrv/stem.h b/include/vrv/stem.h index b946c0d5a9..641c0895bb 100644 --- a/include/vrv/stem.h +++ b/include/vrv/stem.h @@ -94,9 +94,9 @@ class Stem : public LayerElement, public AttGraced, public AttStemVis, public At * Interface for class functor visitation */ ///@{ - FunctorCode Accept(MutableFunctor &functor) override; + FunctorCode Accept(Functor &functor) override; FunctorCode Accept(ConstFunctor &functor) const override; - FunctorCode AcceptEnd(MutableFunctor &functor) override; + FunctorCode AcceptEnd(Functor &functor) override; FunctorCode AcceptEnd(ConstFunctor &functor) const override; ///@} diff --git a/include/vrv/svg.h b/include/vrv/svg.h index d96e40ed65..79d5aa7897 100644 --- a/include/vrv/svg.h +++ b/include/vrv/svg.h @@ -50,9 +50,9 @@ class Svg : public Object { * Interface for class functor visitation */ ///@{ - FunctorCode Accept(MutableFunctor &functor) override; + FunctorCode Accept(Functor &functor) override; FunctorCode Accept(ConstFunctor &functor) const override; - FunctorCode AcceptEnd(MutableFunctor &functor) override; + FunctorCode AcceptEnd(Functor &functor) override; FunctorCode AcceptEnd(ConstFunctor &functor) const override; ///@} diff --git a/include/vrv/syl.h b/include/vrv/syl.h index b23df4cb65..47d0f654a2 100644 --- a/include/vrv/syl.h +++ b/include/vrv/syl.h @@ -102,9 +102,9 @@ class Syl : public LayerElement, * Interface for class functor visitation */ ///@{ - FunctorCode Accept(MutableFunctor &functor) override; + FunctorCode Accept(Functor &functor) override; FunctorCode Accept(ConstFunctor &functor) const override; - FunctorCode AcceptEnd(MutableFunctor &functor) override; + FunctorCode AcceptEnd(Functor &functor) override; FunctorCode AcceptEnd(ConstFunctor &functor) const override; ///@} diff --git a/include/vrv/syllable.h b/include/vrv/syllable.h index 1d7edf67b5..7813479caf 100644 --- a/include/vrv/syllable.h +++ b/include/vrv/syllable.h @@ -56,9 +56,9 @@ class Syllable : public LayerElement, public ObjectListInterface, public AttColo * Interface for class functor visitation */ ///@{ - FunctorCode Accept(MutableFunctor &functor) override; + FunctorCode Accept(Functor &functor) override; FunctorCode Accept(ConstFunctor &functor) const override; - FunctorCode AcceptEnd(MutableFunctor &functor) override; + FunctorCode AcceptEnd(Functor &functor) override; FunctorCode AcceptEnd(ConstFunctor &functor) const override; ///@} diff --git a/include/vrv/symbol.h b/include/vrv/symbol.h index 498447b9f1..3b029bf404 100644 --- a/include/vrv/symbol.h +++ b/include/vrv/symbol.h @@ -50,9 +50,9 @@ class Symbol : public TextElement, public AttColor, public AttExtSym, public Att * Interface for class functor visitation */ ///@{ - FunctorCode Accept(MutableFunctor &functor) override; + FunctorCode Accept(Functor &functor) override; FunctorCode Accept(ConstFunctor &functor) const override; - FunctorCode AcceptEnd(MutableFunctor &functor) override; + FunctorCode AcceptEnd(Functor &functor) override; FunctorCode AcceptEnd(ConstFunctor &functor) const override; ///@} diff --git a/include/vrv/system.h b/include/vrv/system.h index 8e98f42ed0..a8900f2a9c 100644 --- a/include/vrv/system.h +++ b/include/vrv/system.h @@ -173,9 +173,9 @@ class System : public Object, public DrawingListInterface, public AttTyped { * Interface for class functor visitation */ ///@{ - FunctorCode Accept(MutableFunctor &functor) override; + FunctorCode Accept(Functor &functor) override; FunctorCode Accept(ConstFunctor &functor) const override; - FunctorCode AcceptEnd(MutableFunctor &functor) override; + FunctorCode AcceptEnd(Functor &functor) override; FunctorCode AcceptEnd(ConstFunctor &functor) const override; ///@} diff --git a/include/vrv/systemelement.h b/include/vrv/systemelement.h index 7abd1eadee..dbb85c0065 100644 --- a/include/vrv/systemelement.h +++ b/include/vrv/systemelement.h @@ -44,9 +44,9 @@ class SystemElement : public FloatingObject, public AttTyped { * Interface for class functor visitation */ ///@{ - FunctorCode Accept(MutableFunctor &functor) override; + FunctorCode Accept(Functor &functor) override; FunctorCode Accept(ConstFunctor &functor) const override; - FunctorCode AcceptEnd(MutableFunctor &functor) override; + FunctorCode AcceptEnd(Functor &functor) override; FunctorCode AcceptEnd(ConstFunctor &functor) const override; ///@} diff --git a/include/vrv/systemmilestone.h b/include/vrv/systemmilestone.h index c535ad4a79..cc79e921e0 100644 --- a/include/vrv/systemmilestone.h +++ b/include/vrv/systemmilestone.h @@ -59,9 +59,9 @@ class SystemMilestoneEnd : public SystemElement { * Interface for class functor visitation */ ///@{ - FunctorCode Accept(MutableFunctor &functor) override; + FunctorCode Accept(Functor &functor) override; FunctorCode Accept(ConstFunctor &functor) const override; - FunctorCode AcceptEnd(MutableFunctor &functor) override; + FunctorCode AcceptEnd(Functor &functor) override; FunctorCode AcceptEnd(ConstFunctor &functor) const override; ///@} diff --git a/include/vrv/tabdursym.h b/include/vrv/tabdursym.h index e18296322c..87e39ab218 100644 --- a/include/vrv/tabdursym.h +++ b/include/vrv/tabdursym.h @@ -85,9 +85,9 @@ class TabDurSym : public LayerElement, public StemmedDrawingInterface, public At * Interface for class functor visitation */ ///@{ - FunctorCode Accept(MutableFunctor &functor) override; + FunctorCode Accept(Functor &functor) override; FunctorCode Accept(ConstFunctor &functor) const override; - FunctorCode AcceptEnd(MutableFunctor &functor) override; + FunctorCode AcceptEnd(Functor &functor) override; FunctorCode AcceptEnd(ConstFunctor &functor) const override; ///@} diff --git a/include/vrv/tabgrp.h b/include/vrv/tabgrp.h index 00c093d878..14e9f8ba4d 100644 --- a/include/vrv/tabgrp.h +++ b/include/vrv/tabgrp.h @@ -66,9 +66,9 @@ class TabGrp : public LayerElement, public ObjectListInterface, public DurationI * Interface for class functor visitation */ ///@{ - FunctorCode Accept(MutableFunctor &functor) override; + FunctorCode Accept(Functor &functor) override; FunctorCode Accept(ConstFunctor &functor) const override; - FunctorCode AcceptEnd(MutableFunctor &functor) override; + FunctorCode AcceptEnd(Functor &functor) override; FunctorCode AcceptEnd(ConstFunctor &functor) const override; ///@} diff --git a/include/vrv/tempo.h b/include/vrv/tempo.h index 59ddac27aa..f8b708b30e 100644 --- a/include/vrv/tempo.h +++ b/include/vrv/tempo.h @@ -90,9 +90,9 @@ class Tempo : public ControlElement, * Interface for class functor visitation */ ///@{ - FunctorCode Accept(MutableFunctor &functor) override; + FunctorCode Accept(Functor &functor) override; FunctorCode Accept(ConstFunctor &functor) const override; - FunctorCode AcceptEnd(MutableFunctor &functor) override; + FunctorCode AcceptEnd(Functor &functor) override; FunctorCode AcceptEnd(ConstFunctor &functor) const override; ///@} diff --git a/include/vrv/text.h b/include/vrv/text.h index 39cfd16843..aa86efd52b 100644 --- a/include/vrv/text.h +++ b/include/vrv/text.h @@ -48,9 +48,9 @@ class Text : public TextElement { * Interface for class functor visitation */ ///@{ - FunctorCode Accept(MutableFunctor &functor) override; + FunctorCode Accept(Functor &functor) override; FunctorCode Accept(ConstFunctor &functor) const override; - FunctorCode AcceptEnd(MutableFunctor &functor) override; + FunctorCode AcceptEnd(Functor &functor) override; FunctorCode AcceptEnd(ConstFunctor &functor) const override; ///@} diff --git a/include/vrv/textelement.h b/include/vrv/textelement.h index c3e8801f5e..2c33427548 100644 --- a/include/vrv/textelement.h +++ b/include/vrv/textelement.h @@ -59,9 +59,9 @@ class TextElement : public Object, public AttLabelled, public AttTyped { * Interface for class functor visitation */ ///@{ - FunctorCode Accept(MutableFunctor &functor) override; + FunctorCode Accept(Functor &functor) override; FunctorCode Accept(ConstFunctor &functor) const override; - FunctorCode AcceptEnd(MutableFunctor &functor) override; + FunctorCode AcceptEnd(Functor &functor) override; FunctorCode AcceptEnd(ConstFunctor &functor) const override; ///@} diff --git a/include/vrv/tie.h b/include/vrv/tie.h index 162383455b..7f81c9d6de 100644 --- a/include/vrv/tie.h +++ b/include/vrv/tie.h @@ -77,9 +77,9 @@ class Tie : public ControlElement, * Interface for class functor visitation */ ///@{ - FunctorCode Accept(MutableFunctor &functor) override; + FunctorCode Accept(Functor &functor) override; FunctorCode Accept(ConstFunctor &functor) const override; - FunctorCode AcceptEnd(MutableFunctor &functor) override; + FunctorCode AcceptEnd(Functor &functor) override; FunctorCode AcceptEnd(ConstFunctor &functor) const override; ///@} diff --git a/include/vrv/timestamp.h b/include/vrv/timestamp.h index 398bcc6b50..c715b569ec 100644 --- a/include/vrv/timestamp.h +++ b/include/vrv/timestamp.h @@ -51,9 +51,9 @@ class TimestampAttr : public LayerElement { * Interface for class functor visitation */ ///@{ - FunctorCode Accept(MutableFunctor &functor) override; + FunctorCode Accept(Functor &functor) override; FunctorCode Accept(ConstFunctor &functor) const override; - FunctorCode AcceptEnd(MutableFunctor &functor) override; + FunctorCode AcceptEnd(Functor &functor) override; FunctorCode AcceptEnd(ConstFunctor &functor) const override; ///@} diff --git a/include/vrv/trill.h b/include/vrv/trill.h index 90a98aaac6..28c1114558 100644 --- a/include/vrv/trill.h +++ b/include/vrv/trill.h @@ -74,9 +74,9 @@ class Trill : public ControlElement, * Interface for class functor visitation */ ///@{ - FunctorCode Accept(MutableFunctor &functor) override; + FunctorCode Accept(Functor &functor) override; FunctorCode Accept(ConstFunctor &functor) const override; - FunctorCode AcceptEnd(MutableFunctor &functor) override; + FunctorCode AcceptEnd(Functor &functor) override; FunctorCode AcceptEnd(ConstFunctor &functor) const override; ///@} diff --git a/include/vrv/tuning.h b/include/vrv/tuning.h index 025e3f41e0..d5be1648c0 100644 --- a/include/vrv/tuning.h +++ b/include/vrv/tuning.h @@ -63,9 +63,9 @@ class Tuning : public Object, public AttCourseLog { * Interface for class functor visitation */ ///@{ - FunctorCode Accept(MutableFunctor &functor) override; + FunctorCode Accept(Functor &functor) override; FunctorCode Accept(ConstFunctor &functor) const override; - FunctorCode AcceptEnd(MutableFunctor &functor) override; + FunctorCode AcceptEnd(Functor &functor) override; FunctorCode AcceptEnd(ConstFunctor &functor) const override; ///@} diff --git a/include/vrv/tuplet.h b/include/vrv/tuplet.h index 7f67ed32b9..ce96f6a51c 100644 --- a/include/vrv/tuplet.h +++ b/include/vrv/tuplet.h @@ -120,9 +120,9 @@ class Tuplet : public LayerElement, * Interface for class functor visitation */ ///@{ - FunctorCode Accept(MutableFunctor &functor) override; + FunctorCode Accept(Functor &functor) override; FunctorCode Accept(ConstFunctor &functor) const override; - FunctorCode AcceptEnd(MutableFunctor &functor) override; + FunctorCode AcceptEnd(Functor &functor) override; FunctorCode AcceptEnd(ConstFunctor &functor) const override; ///@} diff --git a/include/vrv/turn.h b/include/vrv/turn.h index 6933bd008f..20dffe9ee3 100644 --- a/include/vrv/turn.h +++ b/include/vrv/turn.h @@ -72,9 +72,9 @@ class Turn : public ControlElement, * Interface for class functor visitation */ ///@{ - FunctorCode Accept(MutableFunctor &functor) override; + FunctorCode Accept(Functor &functor) override; FunctorCode Accept(ConstFunctor &functor) const override; - FunctorCode AcceptEnd(MutableFunctor &functor) override; + FunctorCode AcceptEnd(Functor &functor) override; FunctorCode AcceptEnd(ConstFunctor &functor) const override; ///@} diff --git a/include/vrv/verse.h b/include/vrv/verse.h index fb1b264ec1..c67711eb1b 100644 --- a/include/vrv/verse.h +++ b/include/vrv/verse.h @@ -64,9 +64,9 @@ class Verse : public LayerElement, public AttColor, public AttLang, public AttNI * Interface for class functor visitation */ ///@{ - FunctorCode Accept(MutableFunctor &functor) override; + FunctorCode Accept(Functor &functor) override; FunctorCode Accept(ConstFunctor &functor) const override; - FunctorCode AcceptEnd(MutableFunctor &functor) override; + FunctorCode AcceptEnd(Functor &functor) override; FunctorCode AcceptEnd(ConstFunctor &functor) const override; ///@} diff --git a/include/vrv/verticalaligner.h b/include/vrv/verticalaligner.h index c193d4ac39..5a209b611c 100644 --- a/include/vrv/verticalaligner.h +++ b/include/vrv/verticalaligner.h @@ -116,9 +116,9 @@ class SystemAligner : public Object { * Interface for class functor visitation */ ///@{ - FunctorCode Accept(MutableFunctor &functor) override; + FunctorCode Accept(Functor &functor) override; FunctorCode Accept(ConstFunctor &functor) const override; - FunctorCode AcceptEnd(MutableFunctor &functor) override; + FunctorCode AcceptEnd(Functor &functor) override; FunctorCode AcceptEnd(ConstFunctor &functor) const override; ///@} @@ -342,9 +342,9 @@ class StaffAlignment : public Object { * Interface for class functor visitation */ ///@{ - FunctorCode Accept(MutableFunctor &functor) override; + FunctorCode Accept(Functor &functor) override; FunctorCode Accept(ConstFunctor &functor) const override; - FunctorCode AcceptEnd(MutableFunctor &functor) override; + FunctorCode AcceptEnd(Functor &functor) override; FunctorCode AcceptEnd(ConstFunctor &functor) const override; ///@} diff --git a/src/accid.cpp b/src/accid.cpp index 6307f9adbe..cfd8ba299e 100644 --- a/src/accid.cpp +++ b/src/accid.cpp @@ -280,7 +280,7 @@ std::u32string Accid::CreateSymbolStr(data_ACCIDENTAL_WRITTEN accid, data_ENCLOS // Functor methods //---------------------------------------------------------------------------- -FunctorCode Accid::Accept(MutableFunctor &functor) +FunctorCode Accid::Accept(Functor &functor) { return functor.VisitAccid(this); } @@ -290,7 +290,7 @@ FunctorCode Accid::Accept(ConstFunctor &functor) const return functor.VisitAccid(this); } -FunctorCode Accid::AcceptEnd(MutableFunctor &functor) +FunctorCode Accid::AcceptEnd(Functor &functor) { return functor.VisitAccidEnd(this); } diff --git a/src/anchoredtext.cpp b/src/anchoredtext.cpp index 174ba7ab1f..2451eb7f80 100644 --- a/src/anchoredtext.cpp +++ b/src/anchoredtext.cpp @@ -55,7 +55,7 @@ bool AnchoredText::IsSupportedChild(Object *child) return true; } -FunctorCode AnchoredText::Accept(MutableFunctor &functor) +FunctorCode AnchoredText::Accept(Functor &functor) { return functor.VisitAnchoredText(this); } @@ -65,7 +65,7 @@ FunctorCode AnchoredText::Accept(ConstFunctor &functor) const return functor.VisitAnchoredText(this); } -FunctorCode AnchoredText::AcceptEnd(MutableFunctor &functor) +FunctorCode AnchoredText::AcceptEnd(Functor &functor) { return functor.VisitAnchoredTextEnd(this); } diff --git a/src/arpeg.cpp b/src/arpeg.cpp index 49be174e50..c78661ce20 100644 --- a/src/arpeg.cpp +++ b/src/arpeg.cpp @@ -193,7 +193,7 @@ const Staff *Arpeg::GetCrossStaff() const // Arpeg functor methods //---------------------------------------------------------------------------- -FunctorCode Arpeg::Accept(MutableFunctor &functor) +FunctorCode Arpeg::Accept(Functor &functor) { return functor.VisitArpeg(this); } @@ -203,7 +203,7 @@ FunctorCode Arpeg::Accept(ConstFunctor &functor) const return functor.VisitArpeg(this); } -FunctorCode Arpeg::AcceptEnd(MutableFunctor &functor) +FunctorCode Arpeg::AcceptEnd(Functor &functor) { return functor.VisitArpegEnd(this); } diff --git a/src/artic.cpp b/src/artic.cpp index d5ed2436bb..542decf746 100644 --- a/src/artic.cpp +++ b/src/artic.cpp @@ -276,7 +276,7 @@ bool Artic::IsCentered(data_ARTICULATION artic) // Functor methods //---------------------------------------------------------------------------- -FunctorCode Artic::Accept(MutableFunctor &functor) +FunctorCode Artic::Accept(Functor &functor) { return functor.VisitArtic(this); } @@ -286,7 +286,7 @@ FunctorCode Artic::Accept(ConstFunctor &functor) const return functor.VisitArtic(this); } -FunctorCode Artic::AcceptEnd(MutableFunctor &functor) +FunctorCode Artic::AcceptEnd(Functor &functor) { return functor.VisitArticEnd(this); } diff --git a/src/barline.cpp b/src/barline.cpp index 8e4b3523cc..30952b11ed 100644 --- a/src/barline.cpp +++ b/src/barline.cpp @@ -170,7 +170,7 @@ std::pair BarLine::GetPlace(const StaffDef *staffDef) const // Functors methods //---------------------------------------------------------------------------- -FunctorCode BarLine::Accept(MutableFunctor &functor) +FunctorCode BarLine::Accept(Functor &functor) { return functor.VisitBarLine(this); } @@ -180,7 +180,7 @@ FunctorCode BarLine::Accept(ConstFunctor &functor) const return functor.VisitBarLine(this); } -FunctorCode BarLine::AcceptEnd(MutableFunctor &functor) +FunctorCode BarLine::AcceptEnd(Functor &functor) { return functor.VisitBarLineEnd(this); } diff --git a/src/beam.cpp b/src/beam.cpp index 948b25020a..49aa00c617 100644 --- a/src/beam.cpp +++ b/src/beam.cpp @@ -1736,7 +1736,7 @@ bool Beam::IsTabBeam() const return (this->FindDescendantByType(TABGRP)); } -FunctorCode Beam::Accept(MutableFunctor &functor) +FunctorCode Beam::Accept(Functor &functor) { return functor.VisitBeam(this); } @@ -1746,7 +1746,7 @@ FunctorCode Beam::Accept(ConstFunctor &functor) const return functor.VisitBeam(this); } -FunctorCode Beam::AcceptEnd(MutableFunctor &functor) +FunctorCode Beam::AcceptEnd(Functor &functor) { return functor.VisitBeamEnd(this); } diff --git a/src/beamspan.cpp b/src/beamspan.cpp index ac0fc03d3e..605016a01e 100644 --- a/src/beamspan.cpp +++ b/src/beamspan.cpp @@ -152,7 +152,7 @@ bool BeamSpan::AddSpanningSegment(const Doc *doc, const SpanIndexVector &element // Functors // //----------// -FunctorCode BeamSpan::Accept(MutableFunctor &functor) +FunctorCode BeamSpan::Accept(Functor &functor) { return functor.VisitBeamSpan(this); } @@ -162,7 +162,7 @@ FunctorCode BeamSpan::Accept(ConstFunctor &functor) const return functor.VisitBeamSpan(this); } -FunctorCode BeamSpan::AcceptEnd(MutableFunctor &functor) +FunctorCode BeamSpan::AcceptEnd(Functor &functor) { return functor.VisitBeamSpanEnd(this); } diff --git a/src/beatrpt.cpp b/src/beatrpt.cpp index 1faa277e5a..3b72624333 100644 --- a/src/beatrpt.cpp +++ b/src/beatrpt.cpp @@ -75,7 +75,7 @@ double BeatRpt::GetScoreTimeOnset() const // BeatRpt functor methods //---------------------------------------------------------------------------- -FunctorCode BeatRpt::Accept(MutableFunctor &functor) +FunctorCode BeatRpt::Accept(Functor &functor) { return functor.VisitBeatRpt(this); } @@ -85,7 +85,7 @@ FunctorCode BeatRpt::Accept(ConstFunctor &functor) const return functor.VisitBeatRpt(this); } -FunctorCode BeatRpt::AcceptEnd(MutableFunctor &functor) +FunctorCode BeatRpt::AcceptEnd(Functor &functor) { return functor.VisitBeatRptEnd(this); } diff --git a/src/bracketspan.cpp b/src/bracketspan.cpp index 3e99d79b5f..a793311d60 100644 --- a/src/bracketspan.cpp +++ b/src/bracketspan.cpp @@ -84,7 +84,7 @@ int BracketSpan::GetLineWidth(const Doc *doc, int unit) const // BracketSpan functor methods //---------------------------------------------------------------------------- -FunctorCode BracketSpan::Accept(MutableFunctor &functor) +FunctorCode BracketSpan::Accept(Functor &functor) { return functor.VisitBracketSpan(this); } @@ -94,7 +94,7 @@ FunctorCode BracketSpan::Accept(ConstFunctor &functor) const return functor.VisitBracketSpan(this); } -FunctorCode BracketSpan::AcceptEnd(MutableFunctor &functor) +FunctorCode BracketSpan::AcceptEnd(Functor &functor) { return functor.VisitBracketSpanEnd(this); } diff --git a/src/breath.cpp b/src/breath.cpp index 18d18faf49..e0af690624 100644 --- a/src/breath.cpp +++ b/src/breath.cpp @@ -43,7 +43,7 @@ void Breath::Reset() this->ResetPlacementRelStaff(); } -FunctorCode Breath::Accept(MutableFunctor &functor) +FunctorCode Breath::Accept(Functor &functor) { return functor.VisitBreath(this); } @@ -53,7 +53,7 @@ FunctorCode Breath::Accept(ConstFunctor &functor) const return functor.VisitBreath(this); } -FunctorCode Breath::AcceptEnd(MutableFunctor &functor) +FunctorCode Breath::AcceptEnd(Functor &functor) { return functor.VisitBreathEnd(this); } diff --git a/src/btrem.cpp b/src/btrem.cpp index f25f07758e..3fbf9e3db6 100644 --- a/src/btrem.cpp +++ b/src/btrem.cpp @@ -72,7 +72,7 @@ bool BTrem::IsSupportedChild(Object *child) return true; } -FunctorCode BTrem::Accept(MutableFunctor &functor) +FunctorCode BTrem::Accept(Functor &functor) { return functor.VisitBTrem(this); } @@ -82,7 +82,7 @@ FunctorCode BTrem::Accept(ConstFunctor &functor) const return functor.VisitBTrem(this); } -FunctorCode BTrem::AcceptEnd(MutableFunctor &functor) +FunctorCode BTrem::AcceptEnd(Functor &functor) { return functor.VisitBTremEnd(this); } diff --git a/src/caesura.cpp b/src/caesura.cpp index d69a13bd97..c9c213942f 100644 --- a/src/caesura.cpp +++ b/src/caesura.cpp @@ -67,7 +67,7 @@ char32_t Caesura::GetCaesuraGlyph() const return SMUFL_E4D1_caesura; } -FunctorCode Caesura::Accept(MutableFunctor &functor) +FunctorCode Caesura::Accept(Functor &functor) { return functor.VisitCaesura(this); } @@ -77,7 +77,7 @@ FunctorCode Caesura::Accept(ConstFunctor &functor) const return functor.VisitCaesura(this); } -FunctorCode Caesura::AcceptEnd(MutableFunctor &functor) +FunctorCode Caesura::AcceptEnd(Functor &functor) { return functor.VisitCaesuraEnd(this); } diff --git a/src/chord.cpp b/src/chord.cpp index 862266f264..f12f322860 100644 --- a/src/chord.cpp +++ b/src/chord.cpp @@ -545,7 +545,7 @@ std::list Chord::GetAdjacentNotesList(const Staff *staff, int loc) // Functors methods //---------------------------------------------------------------------------- -FunctorCode Chord::Accept(MutableFunctor &functor) +FunctorCode Chord::Accept(Functor &functor) { return functor.VisitChord(this); } @@ -555,7 +555,7 @@ FunctorCode Chord::Accept(ConstFunctor &functor) const return functor.VisitChord(this); } -FunctorCode Chord::AcceptEnd(MutableFunctor &functor) +FunctorCode Chord::AcceptEnd(Functor &functor) { return functor.VisitChordEnd(this); } diff --git a/src/clef.cpp b/src/clef.cpp index 664245fde7..92d10e69e8 100644 --- a/src/clef.cpp +++ b/src/clef.cpp @@ -214,7 +214,7 @@ char32_t Clef::GetClefGlyph(const data_NOTATIONTYPE notationtype) const // Clef functors methods //---------------------------------------------------------------------------- -FunctorCode Clef::Accept(MutableFunctor &functor) +FunctorCode Clef::Accept(Functor &functor) { return functor.VisitClef(this); } @@ -224,7 +224,7 @@ FunctorCode Clef::Accept(ConstFunctor &functor) const return functor.VisitClef(this); } -FunctorCode Clef::AcceptEnd(MutableFunctor &functor) +FunctorCode Clef::AcceptEnd(Functor &functor) { return functor.VisitClefEnd(this); } diff --git a/src/controlelement.cpp b/src/controlelement.cpp index 8393ce0d6c..910e205492 100644 --- a/src/controlelement.cpp +++ b/src/controlelement.cpp @@ -122,7 +122,7 @@ data_STAFFREL ControlElement::GetLayerPlace(data_STAFFREL defaultValue) const // Functor methods //---------------------------------------------------------------------------- -FunctorCode ControlElement::Accept(MutableFunctor &functor) +FunctorCode ControlElement::Accept(Functor &functor) { return functor.VisitControlElement(this); } @@ -132,7 +132,7 @@ FunctorCode ControlElement::Accept(ConstFunctor &functor) const return functor.VisitControlElement(this); } -FunctorCode ControlElement::AcceptEnd(MutableFunctor &functor) +FunctorCode ControlElement::AcceptEnd(Functor &functor) { return functor.VisitControlElementEnd(this); } diff --git a/src/course.cpp b/src/course.cpp index ed8726a2e4..9c3255c732 100644 --- a/src/course.cpp +++ b/src/course.cpp @@ -54,7 +54,7 @@ bool Course::IsSupportedChild(Object *child) // Functor methods //---------------------------------------------------------------------------- -FunctorCode Course::Accept(MutableFunctor &functor) +FunctorCode Course::Accept(Functor &functor) { return functor.VisitCourse(this); } @@ -64,7 +64,7 @@ FunctorCode Course::Accept(ConstFunctor &functor) const return functor.VisitCourse(this); } -FunctorCode Course::AcceptEnd(MutableFunctor &functor) +FunctorCode Course::AcceptEnd(Functor &functor) { return functor.VisitCourseEnd(this); } diff --git a/src/custos.cpp b/src/custos.cpp index 881c12e3e1..7157dff13a 100644 --- a/src/custos.cpp +++ b/src/custos.cpp @@ -87,7 +87,7 @@ char32_t Custos::GetCustosGlyph(const data_NOTATIONTYPE notationtype) const // Functors methods //---------------------------------------------------------------------------- -FunctorCode Custos::Accept(MutableFunctor &functor) +FunctorCode Custos::Accept(Functor &functor) { return functor.VisitCustos(this); } @@ -97,7 +97,7 @@ FunctorCode Custos::Accept(ConstFunctor &functor) const return functor.VisitCustos(this); } -FunctorCode Custos::AcceptEnd(MutableFunctor &functor) +FunctorCode Custos::AcceptEnd(Functor &functor) { return functor.VisitCustosEnd(this); } diff --git a/src/dir.cpp b/src/dir.cpp index 7890a9db07..7277e3e391 100644 --- a/src/dir.cpp +++ b/src/dir.cpp @@ -80,7 +80,7 @@ bool Dir::IsSupportedChild(Object *child) // Dir functor methods //---------------------------------------------------------------------------- -FunctorCode Dir::Accept(MutableFunctor &functor) +FunctorCode Dir::Accept(Functor &functor) { return functor.VisitDir(this); } @@ -90,7 +90,7 @@ FunctorCode Dir::Accept(ConstFunctor &functor) const return functor.VisitDir(this); } -FunctorCode Dir::AcceptEnd(MutableFunctor &functor) +FunctorCode Dir::AcceptEnd(Functor &functor) { return functor.VisitDirEnd(this); } diff --git a/src/doc.cpp b/src/doc.cpp index 9854b447f1..3ddfc4b1bf 100644 --- a/src/doc.cpp +++ b/src/doc.cpp @@ -2055,7 +2055,7 @@ void Doc::SetCurrentScore(Score *score) // Doc functors methods //---------------------------------------------------------------------------- -FunctorCode Doc::Accept(MutableFunctor &functor) +FunctorCode Doc::Accept(Functor &functor) { return functor.VisitDoc(this); } @@ -2065,7 +2065,7 @@ FunctorCode Doc::Accept(ConstFunctor &functor) const return functor.VisitDoc(this); } -FunctorCode Doc::AcceptEnd(MutableFunctor &functor) +FunctorCode Doc::AcceptEnd(Functor &functor) { return functor.VisitDocEnd(this); } diff --git a/src/dot.cpp b/src/dot.cpp index a057636b6a..ff1b02eb95 100644 --- a/src/dot.cpp +++ b/src/dot.cpp @@ -50,7 +50,7 @@ void Dot::Reset() // Functor methods //---------------------------------------------------------------------------- -FunctorCode Dot::Accept(MutableFunctor &functor) +FunctorCode Dot::Accept(Functor &functor) { return functor.VisitDot(this); } @@ -60,7 +60,7 @@ FunctorCode Dot::Accept(ConstFunctor &functor) const return functor.VisitDot(this); } -FunctorCode Dot::AcceptEnd(MutableFunctor &functor) +FunctorCode Dot::AcceptEnd(Functor &functor) { return functor.VisitDotEnd(this); } diff --git a/src/dynam.cpp b/src/dynam.cpp index 600340597b..3b3f770c9e 100644 --- a/src/dynam.cpp +++ b/src/dynam.cpp @@ -262,7 +262,7 @@ std::u32string Dynam::GetSymbolStr(const std::u32string &str, const bool singleG // Dynam functor methods //---------------------------------------------------------------------------- -FunctorCode Dynam::Accept(MutableFunctor &functor) +FunctorCode Dynam::Accept(Functor &functor) { return functor.VisitDynam(this); } @@ -272,7 +272,7 @@ FunctorCode Dynam::Accept(ConstFunctor &functor) const return functor.VisitDynam(this); } -FunctorCode Dynam::AcceptEnd(MutableFunctor &functor) +FunctorCode Dynam::AcceptEnd(Functor &functor) { return functor.VisitDynamEnd(this); } diff --git a/src/editorial.cpp b/src/editorial.cpp index 80a1b4548f..e21c4449d9 100644 --- a/src/editorial.cpp +++ b/src/editorial.cpp @@ -121,7 +121,7 @@ bool EditorialElement::IsSupportedChild(Object *child) // EditorialElement functor methods //---------------------------------------------------------------------------- -FunctorCode EditorialElement::Accept(MutableFunctor &functor) +FunctorCode EditorialElement::Accept(Functor &functor) { return functor.VisitEditorialElement(this); } @@ -131,7 +131,7 @@ FunctorCode EditorialElement::Accept(ConstFunctor &functor) const return functor.VisitEditorialElement(this); } -FunctorCode EditorialElement::AcceptEnd(MutableFunctor &functor) +FunctorCode EditorialElement::AcceptEnd(Functor &functor) { return functor.VisitEditorialElementEnd(this); } diff --git a/src/elementpart.cpp b/src/elementpart.cpp index c63278f88a..4ee3275c0f 100644 --- a/src/elementpart.cpp +++ b/src/elementpart.cpp @@ -275,7 +275,7 @@ void TupletNum::SetAlignedBracket(TupletBracket *alignedBracket) // Functors methods //---------------------------------------------------------------------------- -FunctorCode Dots::Accept(MutableFunctor &functor) +FunctorCode Dots::Accept(Functor &functor) { return functor.VisitDots(this); } @@ -285,7 +285,7 @@ FunctorCode Dots::Accept(ConstFunctor &functor) const return functor.VisitDots(this); } -FunctorCode Dots::AcceptEnd(MutableFunctor &functor) +FunctorCode Dots::AcceptEnd(Functor &functor) { return functor.VisitDotsEnd(this); } @@ -295,7 +295,7 @@ FunctorCode Dots::AcceptEnd(ConstFunctor &functor) const return functor.VisitDotsEnd(this); } -FunctorCode Flag::Accept(MutableFunctor &functor) +FunctorCode Flag::Accept(Functor &functor) { return functor.VisitFlag(this); } @@ -305,7 +305,7 @@ FunctorCode Flag::Accept(ConstFunctor &functor) const return functor.VisitFlag(this); } -FunctorCode Flag::AcceptEnd(MutableFunctor &functor) +FunctorCode Flag::AcceptEnd(Functor &functor) { return functor.VisitFlagEnd(this); } @@ -315,7 +315,7 @@ FunctorCode Flag::AcceptEnd(ConstFunctor &functor) const return functor.VisitFlagEnd(this); } -FunctorCode TupletBracket::Accept(MutableFunctor &functor) +FunctorCode TupletBracket::Accept(Functor &functor) { return functor.VisitTupletBracket(this); } @@ -325,7 +325,7 @@ FunctorCode TupletBracket::Accept(ConstFunctor &functor) const return functor.VisitTupletBracket(this); } -FunctorCode TupletBracket::AcceptEnd(MutableFunctor &functor) +FunctorCode TupletBracket::AcceptEnd(Functor &functor) { return functor.VisitTupletBracketEnd(this); } @@ -335,7 +335,7 @@ FunctorCode TupletBracket::AcceptEnd(ConstFunctor &functor) const return functor.VisitTupletBracketEnd(this); } -FunctorCode TupletNum::Accept(MutableFunctor &functor) +FunctorCode TupletNum::Accept(Functor &functor) { return functor.VisitTupletNum(this); } @@ -345,7 +345,7 @@ FunctorCode TupletNum::Accept(ConstFunctor &functor) const return functor.VisitTupletNum(this); } -FunctorCode TupletNum::AcceptEnd(MutableFunctor &functor) +FunctorCode TupletNum::AcceptEnd(Functor &functor) { return functor.VisitTupletNumEnd(this); } diff --git a/src/ending.cpp b/src/ending.cpp index 04eeb4cc79..a6098248e0 100644 --- a/src/ending.cpp +++ b/src/ending.cpp @@ -75,7 +75,7 @@ bool Ending::IsSupportedChild(Object *child) // Ending functor methods //---------------------------------------------------------------------------- -FunctorCode Ending::Accept(MutableFunctor &functor) +FunctorCode Ending::Accept(Functor &functor) { return functor.VisitEnding(this); } @@ -85,7 +85,7 @@ FunctorCode Ending::Accept(ConstFunctor &functor) const return functor.VisitEnding(this); } -FunctorCode Ending::AcceptEnd(MutableFunctor &functor) +FunctorCode Ending::AcceptEnd(Functor &functor) { return functor.VisitEndingEnd(this); } diff --git a/src/expansion.cpp b/src/expansion.cpp index 827d66c653..5cf1c552e7 100644 --- a/src/expansion.cpp +++ b/src/expansion.cpp @@ -42,7 +42,7 @@ void Expansion::Reset() // Expansion functor methods //---------------------------------------------------------------------------- -FunctorCode Expansion::Accept(MutableFunctor &functor) +FunctorCode Expansion::Accept(Functor &functor) { return functor.VisitExpansion(this); } @@ -52,7 +52,7 @@ FunctorCode Expansion::Accept(ConstFunctor &functor) const return functor.VisitExpansion(this); } -FunctorCode Expansion::AcceptEnd(MutableFunctor &functor) +FunctorCode Expansion::AcceptEnd(Functor &functor) { return functor.VisitExpansionEnd(this); } diff --git a/src/f.cpp b/src/f.cpp index 11a25b4b2f..c078e6baa1 100644 --- a/src/f.cpp +++ b/src/f.cpp @@ -61,7 +61,7 @@ bool F::IsSupportedChild(Object *child) // F functor methods //---------------------------------------------------------------------------- -FunctorCode F::Accept(MutableFunctor &functor) +FunctorCode F::Accept(Functor &functor) { return functor.VisitF(this); } @@ -71,7 +71,7 @@ FunctorCode F::Accept(ConstFunctor &functor) const return functor.VisitF(this); } -FunctorCode F::AcceptEnd(MutableFunctor &functor) +FunctorCode F::AcceptEnd(Functor &functor) { return functor.VisitFEnd(this); } diff --git a/src/fb.cpp b/src/fb.cpp index 33ddbfc069..ec090f932e 100644 --- a/src/fb.cpp +++ b/src/fb.cpp @@ -53,7 +53,7 @@ bool Fb::IsSupportedChild(Object *child) return true; } -FunctorCode Fb::Accept(MutableFunctor &functor) +FunctorCode Fb::Accept(Functor &functor) { return functor.VisitFb(this); } @@ -63,7 +63,7 @@ FunctorCode Fb::Accept(ConstFunctor &functor) const return functor.VisitFb(this); } -FunctorCode Fb::AcceptEnd(MutableFunctor &functor) +FunctorCode Fb::AcceptEnd(Functor &functor) { return functor.VisitFbEnd(this); } diff --git a/src/fermata.cpp b/src/fermata.cpp index bd052f2636..23fd96053b 100644 --- a/src/fermata.cpp +++ b/src/fermata.cpp @@ -137,7 +137,7 @@ data_VERTICALALIGNMENT Fermata::GetVerticalAlignment(char32_t code) // Fermata functor methods //---------------------------------------------------------------------------- -FunctorCode Fermata::Accept(MutableFunctor &functor) +FunctorCode Fermata::Accept(Functor &functor) { return functor.VisitFermata(this); } @@ -147,7 +147,7 @@ FunctorCode Fermata::Accept(ConstFunctor &functor) const return functor.VisitFermata(this); } -FunctorCode Fermata::AcceptEnd(MutableFunctor &functor) +FunctorCode Fermata::AcceptEnd(Functor &functor) { return functor.VisitFermataEnd(this); } diff --git a/src/fig.cpp b/src/fig.cpp index 343669caec..102311d2f6 100644 --- a/src/fig.cpp +++ b/src/fig.cpp @@ -55,7 +55,7 @@ bool Fig::IsSupportedChild(Object *child) // Functors methods //---------------------------------------------------------------------------- -FunctorCode Fig::Accept(MutableFunctor &functor) +FunctorCode Fig::Accept(Functor &functor) { return functor.VisitFig(this); } @@ -65,7 +65,7 @@ FunctorCode Fig::Accept(ConstFunctor &functor) const return functor.VisitFig(this); } -FunctorCode Fig::AcceptEnd(MutableFunctor &functor) +FunctorCode Fig::AcceptEnd(Functor &functor) { return functor.VisitFigEnd(this); } diff --git a/src/findfunctor.cpp b/src/findfunctor.cpp index c58c7d673b..af1623c38d 100644 --- a/src/findfunctor.cpp +++ b/src/findfunctor.cpp @@ -20,8 +20,7 @@ namespace vrv { // FindAllByComparisonFunctor //---------------------------------------------------------------------------- -FindAllByComparisonFunctor::FindAllByComparisonFunctor(Comparison *comparison, ListOfObjects *elements) - : MutableFunctor() +FindAllByComparisonFunctor::FindAllByComparisonFunctor(Comparison *comparison, ListOfObjects *elements) : Functor() { m_comparison = comparison; m_elements = elements; diff --git a/src/fing.cpp b/src/fing.cpp index 8e4b1bb807..8d1927b0f3 100644 --- a/src/fing.cpp +++ b/src/fing.cpp @@ -74,7 +74,7 @@ bool Fing::IsCloserToStaffThan(const FloatingObject *other, data_STAFFREL drawin } } -FunctorCode Fing::Accept(MutableFunctor &functor) +FunctorCode Fing::Accept(Functor &functor) { return functor.VisitFing(this); } @@ -84,7 +84,7 @@ FunctorCode Fing::Accept(ConstFunctor &functor) const return functor.VisitFing(this); } -FunctorCode Fing::AcceptEnd(MutableFunctor &functor) +FunctorCode Fing::AcceptEnd(Functor &functor) { return functor.VisitFingEnd(this); } diff --git a/src/floatingobject.cpp b/src/floatingobject.cpp index 6bd0db11fb..86cda0cb43 100644 --- a/src/floatingobject.cpp +++ b/src/floatingobject.cpp @@ -183,7 +183,7 @@ std::pair FloatingObject::GetVerticalContentBoundaryRel(const Doc *do return { boundary, false }; } -FunctorCode FloatingObject::Accept(MutableFunctor &functor) +FunctorCode FloatingObject::Accept(Functor &functor) { return functor.VisitFloatingObject(this); } @@ -193,7 +193,7 @@ FunctorCode FloatingObject::Accept(ConstFunctor &functor) const return functor.VisitFloatingObject(this); } -FunctorCode FloatingObject::AcceptEnd(MutableFunctor &functor) +FunctorCode FloatingObject::AcceptEnd(Functor &functor) { return functor.VisitFloatingObjectEnd(this); } diff --git a/src/ftrem.cpp b/src/ftrem.cpp index be969f89c2..97108b97ea 100644 --- a/src/ftrem.cpp +++ b/src/ftrem.cpp @@ -122,7 +122,7 @@ void FTrem::SetElementShortening(int shortening) // Functors methods //---------------------------------------------------------------------------- -FunctorCode FTrem::Accept(MutableFunctor &functor) +FunctorCode FTrem::Accept(Functor &functor) { return functor.VisitFTrem(this); } @@ -132,7 +132,7 @@ FunctorCode FTrem::Accept(ConstFunctor &functor) const return functor.VisitFTrem(this); } -FunctorCode FTrem::AcceptEnd(MutableFunctor &functor) +FunctorCode FTrem::AcceptEnd(Functor &functor) { return functor.VisitFTremEnd(this); } diff --git a/src/gliss.cpp b/src/gliss.cpp index 37a16fb543..791030e350 100644 --- a/src/gliss.cpp +++ b/src/gliss.cpp @@ -59,7 +59,7 @@ void Gliss::Reset() // Gliss functor methods //---------------------------------------------------------------------------- -FunctorCode Gliss::Accept(MutableFunctor &functor) +FunctorCode Gliss::Accept(Functor &functor) { return functor.VisitGliss(this); } @@ -69,7 +69,7 @@ FunctorCode Gliss::Accept(ConstFunctor &functor) const return functor.VisitGliss(this); } -FunctorCode Gliss::AcceptEnd(MutableFunctor &functor) +FunctorCode Gliss::AcceptEnd(Functor &functor) { return functor.VisitGlissEnd(this); } diff --git a/src/gracegrp.cpp b/src/gracegrp.cpp index 04ec116550..ee34753ad8 100644 --- a/src/gracegrp.cpp +++ b/src/gracegrp.cpp @@ -79,7 +79,7 @@ bool GraceGrp::IsSupportedChild(Object *child) return true; } -FunctorCode GraceGrp::Accept(MutableFunctor &functor) +FunctorCode GraceGrp::Accept(Functor &functor) { return functor.VisitGraceGrp(this); } @@ -89,7 +89,7 @@ FunctorCode GraceGrp::Accept(ConstFunctor &functor) const return functor.VisitGraceGrp(this); } -FunctorCode GraceGrp::AcceptEnd(MutableFunctor &functor) +FunctorCode GraceGrp::AcceptEnd(Functor &functor) { return functor.VisitGraceGrpEnd(this); } diff --git a/src/grpsym.cpp b/src/grpsym.cpp index 71e51e2e07..0354b0f6dd 100644 --- a/src/grpsym.cpp +++ b/src/grpsym.cpp @@ -79,7 +79,7 @@ int GrpSym::GetDrawingY() const // GrpSym functor methods //---------------------------------------------------------------------------- -FunctorCode GrpSym::Accept(MutableFunctor &functor) +FunctorCode GrpSym::Accept(Functor &functor) { return functor.VisitGrpSym(this); } @@ -89,7 +89,7 @@ FunctorCode GrpSym::Accept(ConstFunctor &functor) const return functor.VisitGrpSym(this); } -FunctorCode GrpSym::AcceptEnd(MutableFunctor &functor) +FunctorCode GrpSym::AcceptEnd(Functor &functor) { return functor.VisitGrpSymEnd(this); } diff --git a/src/hairpin.cpp b/src/hairpin.cpp index 303bf0edfa..ce1c079ba9 100644 --- a/src/hairpin.cpp +++ b/src/hairpin.cpp @@ -219,7 +219,7 @@ std::pair Hairpin::GetBarlineOverlapAdjustment(int doubleUnit, int lef // Hairpin functor methods //---------------------------------------------------------------------------- -FunctorCode Hairpin::Accept(MutableFunctor &functor) +FunctorCode Hairpin::Accept(Functor &functor) { return functor.VisitHairpin(this); } @@ -229,7 +229,7 @@ FunctorCode Hairpin::Accept(ConstFunctor &functor) const return functor.VisitHairpin(this); } -FunctorCode Hairpin::AcceptEnd(MutableFunctor &functor) +FunctorCode Hairpin::AcceptEnd(Functor &functor) { return functor.VisitHairpinEnd(this); } diff --git a/src/halfmrpt.cpp b/src/halfmrpt.cpp index cb7d57a7b0..67a3b9f40b 100644 --- a/src/halfmrpt.cpp +++ b/src/halfmrpt.cpp @@ -49,7 +49,7 @@ void HalfmRpt::Reset() // HalfmRpt functor methods //---------------------------------------------------------------------------- -FunctorCode HalfmRpt::Accept(MutableFunctor &functor) +FunctorCode HalfmRpt::Accept(Functor &functor) { return functor.VisitHalfmRpt(this); } @@ -59,7 +59,7 @@ FunctorCode HalfmRpt::Accept(ConstFunctor &functor) const return functor.VisitHalfmRpt(this); } -FunctorCode HalfmRpt::AcceptEnd(MutableFunctor &functor) +FunctorCode HalfmRpt::AcceptEnd(Functor &functor) { return functor.VisitHalfmRptEnd(this); } diff --git a/src/harm.cpp b/src/harm.cpp index 6beb26b6a4..2fecfd5719 100644 --- a/src/harm.cpp +++ b/src/harm.cpp @@ -159,7 +159,7 @@ void Harm::SetBassPitch(const TransPitch &pitch) // Harm functor methods //---------------------------------------------------------------------------- -FunctorCode Harm::Accept(MutableFunctor &functor) +FunctorCode Harm::Accept(Functor &functor) { return functor.VisitHarm(this); } @@ -169,7 +169,7 @@ FunctorCode Harm::Accept(ConstFunctor &functor) const return functor.VisitHarm(this); } -FunctorCode Harm::AcceptEnd(MutableFunctor &functor) +FunctorCode Harm::AcceptEnd(Functor &functor) { return functor.VisitHarmEnd(this); } diff --git a/src/horizontalaligner.cpp b/src/horizontalaligner.cpp index 4e728a2ef9..6f443e17a4 100644 --- a/src/horizontalaligner.cpp +++ b/src/horizontalaligner.cpp @@ -92,7 +92,7 @@ void HorizontalAligner::AddAlignment(Alignment *alignment, int idx) } } -FunctorCode HorizontalAligner::Accept(MutableFunctor &functor) +FunctorCode HorizontalAligner::Accept(Functor &functor) { return functor.VisitHorizontalAligner(this); } @@ -102,7 +102,7 @@ FunctorCode HorizontalAligner::Accept(ConstFunctor &functor) const return functor.VisitHorizontalAligner(this); } -FunctorCode HorizontalAligner::AcceptEnd(MutableFunctor &functor) +FunctorCode HorizontalAligner::AcceptEnd(Functor &functor) { return functor.VisitHorizontalAlignerEnd(this); } @@ -323,7 +323,7 @@ void MeasureAligner::AdjustGraceNoteSpacing(const Doc *doc, Alignment *alignment } } -FunctorCode MeasureAligner::Accept(MutableFunctor &functor) +FunctorCode MeasureAligner::Accept(Functor &functor) { return functor.VisitMeasureAligner(this); } @@ -333,7 +333,7 @@ FunctorCode MeasureAligner::Accept(ConstFunctor &functor) const return functor.VisitMeasureAligner(this); } -FunctorCode MeasureAligner::AcceptEnd(MutableFunctor &functor) +FunctorCode MeasureAligner::AcceptEnd(Functor &functor) { return functor.VisitMeasureAlignerEnd(this); } @@ -477,7 +477,7 @@ void GraceAligner::SetGraceAlignmentXPos(const Doc *doc) } } -FunctorCode GraceAligner::Accept(MutableFunctor &functor) +FunctorCode GraceAligner::Accept(Functor &functor) { return functor.VisitGraceAligner(this); } @@ -487,7 +487,7 @@ FunctorCode GraceAligner::Accept(ConstFunctor &functor) const return functor.VisitGraceAligner(this); } -FunctorCode GraceAligner::AcceptEnd(MutableFunctor &functor) +FunctorCode GraceAligner::AcceptEnd(Functor &functor) { return functor.VisitGraceAlignerEnd(this); } @@ -757,7 +757,7 @@ int Alignment::HorizontalSpaceForDuration( return pow(intervalTime, spacingNonLinear) * spacingLinear * 10.0; // numbers are experimental constants } -FunctorCode Alignment::Accept(MutableFunctor &functor) +FunctorCode Alignment::Accept(Functor &functor) { return functor.VisitAlignment(this); } @@ -767,7 +767,7 @@ FunctorCode Alignment::Accept(ConstFunctor &functor) const return functor.VisitAlignment(this); } -FunctorCode Alignment::AcceptEnd(MutableFunctor &functor) +FunctorCode Alignment::AcceptEnd(Functor &functor) { return functor.VisitAlignmentEnd(this); } @@ -930,7 +930,7 @@ void AlignmentReference::SetAccidLayerAlignment() } } -FunctorCode AlignmentReference::Accept(MutableFunctor &functor) +FunctorCode AlignmentReference::Accept(Functor &functor) { return functor.VisitAlignmentReference(this); } @@ -940,7 +940,7 @@ FunctorCode AlignmentReference::Accept(ConstFunctor &functor) const return functor.VisitAlignmentReference(this); } -FunctorCode AlignmentReference::AcceptEnd(MutableFunctor &functor) +FunctorCode AlignmentReference::AcceptEnd(Functor &functor) { return functor.VisitAlignmentReferenceEnd(this); } @@ -1010,7 +1010,7 @@ TimestampAttr *TimestampAligner::GetTimestampAtTime(double time) return timestampAttr; } -FunctorCode TimestampAligner::Accept(MutableFunctor &functor) +FunctorCode TimestampAligner::Accept(Functor &functor) { return functor.VisitTimestampAligner(this); } @@ -1020,7 +1020,7 @@ FunctorCode TimestampAligner::Accept(ConstFunctor &functor) const return functor.VisitTimestampAligner(this); } -FunctorCode TimestampAligner::AcceptEnd(MutableFunctor &functor) +FunctorCode TimestampAligner::AcceptEnd(Functor &functor) { return functor.VisitTimestampAlignerEnd(this); } diff --git a/src/instrdef.cpp b/src/instrdef.cpp index 4913e201f5..12740db9db 100644 --- a/src/instrdef.cpp +++ b/src/instrdef.cpp @@ -51,7 +51,7 @@ void InstrDef::Reset() // Functor methods //---------------------------------------------------------------------------- -FunctorCode InstrDef::Accept(MutableFunctor &functor) +FunctorCode InstrDef::Accept(Functor &functor) { return functor.VisitInstrDef(this); } @@ -61,7 +61,7 @@ FunctorCode InstrDef::Accept(ConstFunctor &functor) const return functor.VisitInstrDef(this); } -FunctorCode InstrDef::AcceptEnd(MutableFunctor &functor) +FunctorCode InstrDef::AcceptEnd(Functor &functor) { return functor.VisitInstrDefEnd(this); } diff --git a/src/keyaccid.cpp b/src/keyaccid.cpp index db66c82f26..2afc838322 100644 --- a/src/keyaccid.cpp +++ b/src/keyaccid.cpp @@ -84,7 +84,7 @@ int KeyAccid::CalcStaffLoc(Clef *clef, int clefLocOffset) const // Functor methods //---------------------------------------------------------------------------- -FunctorCode KeyAccid::Accept(MutableFunctor &functor) +FunctorCode KeyAccid::Accept(Functor &functor) { return functor.VisitKeyAccid(this); } @@ -94,7 +94,7 @@ FunctorCode KeyAccid::Accept(ConstFunctor &functor) const return functor.VisitKeyAccid(this); } -FunctorCode KeyAccid::AcceptEnd(MutableFunctor &functor) +FunctorCode KeyAccid::AcceptEnd(Functor &functor) { return functor.VisitKeyAccidEnd(this); } diff --git a/src/keysig.cpp b/src/keysig.cpp index fc7737716b..cb33e92aba 100644 --- a/src/keysig.cpp +++ b/src/keysig.cpp @@ -367,7 +367,7 @@ int KeySig::GetOctave(data_ACCIDENTAL_WRITTEN accidType, data_PITCHNAME pitch, c // Functors methods //---------------------------------------------------------------------------- -FunctorCode KeySig::Accept(MutableFunctor &functor) +FunctorCode KeySig::Accept(Functor &functor) { return functor.VisitKeySig(this); } @@ -377,7 +377,7 @@ FunctorCode KeySig::Accept(ConstFunctor &functor) const return functor.VisitKeySig(this); } -FunctorCode KeySig::AcceptEnd(MutableFunctor &functor) +FunctorCode KeySig::AcceptEnd(Functor &functor) { return functor.VisitKeySigEnd(this); } diff --git a/src/label.cpp b/src/label.cpp index 51a2c39d65..7151bbe618 100644 --- a/src/label.cpp +++ b/src/label.cpp @@ -56,7 +56,7 @@ bool Label::IsSupportedChild(Object *child) // Functor methods //---------------------------------------------------------------------------- -FunctorCode Label::Accept(MutableFunctor &functor) +FunctorCode Label::Accept(Functor &functor) { return functor.VisitLabel(this); } @@ -66,7 +66,7 @@ FunctorCode Label::Accept(ConstFunctor &functor) const return functor.VisitLabel(this); } -FunctorCode Label::AcceptEnd(MutableFunctor &functor) +FunctorCode Label::AcceptEnd(Functor &functor) { return functor.VisitLabelEnd(this); } diff --git a/src/labelabbr.cpp b/src/labelabbr.cpp index c922a898a2..d93b9321b2 100644 --- a/src/labelabbr.cpp +++ b/src/labelabbr.cpp @@ -56,7 +56,7 @@ bool LabelAbbr::IsSupportedChild(Object *child) // Functor methods //---------------------------------------------------------------------------- -FunctorCode LabelAbbr::Accept(MutableFunctor &functor) +FunctorCode LabelAbbr::Accept(Functor &functor) { return functor.VisitLabelAbbr(this); } @@ -66,7 +66,7 @@ FunctorCode LabelAbbr::Accept(ConstFunctor &functor) const return functor.VisitLabelAbbr(this); } -FunctorCode LabelAbbr::AcceptEnd(MutableFunctor &functor) +FunctorCode LabelAbbr::AcceptEnd(Functor &functor) { return functor.VisitLabelAbbrEnd(this); } diff --git a/src/layer.cpp b/src/layer.cpp index 66c908be7e..5794673df3 100644 --- a/src/layer.cpp +++ b/src/layer.cpp @@ -609,7 +609,7 @@ void Layer::SetDrawingCautionValues(StaffDef *currentStaffDef) // Layer functor methods //---------------------------------------------------------------------------- -FunctorCode Layer::Accept(MutableFunctor &functor) +FunctorCode Layer::Accept(Functor &functor) { return functor.VisitLayer(this); } @@ -619,7 +619,7 @@ FunctorCode Layer::Accept(ConstFunctor &functor) const return functor.VisitLayer(this); } -FunctorCode Layer::AcceptEnd(MutableFunctor &functor) +FunctorCode Layer::AcceptEnd(Functor &functor) { return functor.VisitLayerEnd(this); } diff --git a/src/layerdef.cpp b/src/layerdef.cpp index c067eefcad..bbf127959d 100644 --- a/src/layerdef.cpp +++ b/src/layerdef.cpp @@ -62,7 +62,7 @@ bool LayerDef::IsSupportedChild(Object *child) return true; } -FunctorCode LayerDef::Accept(MutableFunctor &functor) +FunctorCode LayerDef::Accept(Functor &functor) { return functor.VisitLayerDef(this); } @@ -72,7 +72,7 @@ FunctorCode LayerDef::Accept(ConstFunctor &functor) const return functor.VisitLayerDef(this); } -FunctorCode LayerDef::AcceptEnd(MutableFunctor &functor) +FunctorCode LayerDef::AcceptEnd(Functor &functor) { return functor.VisitLayerDefEnd(this); } diff --git a/src/layerelement.cpp b/src/layerelement.cpp index d55101e867..a54f519b5f 100644 --- a/src/layerelement.cpp +++ b/src/layerelement.cpp @@ -1082,7 +1082,7 @@ int LayerElement::GetCollisionCount(const MapOfDotLocs &dotLocs1, const MapOfDot // LayerElement functor methods //---------------------------------------------------------------------------- -FunctorCode LayerElement::Accept(MutableFunctor &functor) +FunctorCode LayerElement::Accept(Functor &functor) { return functor.VisitLayerElement(this); } @@ -1092,7 +1092,7 @@ FunctorCode LayerElement::Accept(ConstFunctor &functor) const return functor.VisitLayerElement(this); } -FunctorCode LayerElement::AcceptEnd(MutableFunctor &functor) +FunctorCode LayerElement::AcceptEnd(Functor &functor) { return functor.VisitLayerElementEnd(this); } diff --git a/src/lb.cpp b/src/lb.cpp index 7da8b3dc1c..9816ff1215 100644 --- a/src/lb.cpp +++ b/src/lb.cpp @@ -38,7 +38,7 @@ void Lb::Reset() TextElement::Reset(); } -FunctorCode Lb::Accept(MutableFunctor &functor) +FunctorCode Lb::Accept(Functor &functor) { return functor.VisitLb(this); } @@ -48,7 +48,7 @@ FunctorCode Lb::Accept(ConstFunctor &functor) const return functor.VisitLb(this); } -FunctorCode Lb::AcceptEnd(MutableFunctor &functor) +FunctorCode Lb::AcceptEnd(Functor &functor) { return functor.VisitLbEnd(this); } diff --git a/src/ligature.cpp b/src/ligature.cpp index abb01e7343..87134ce41e 100644 --- a/src/ligature.cpp +++ b/src/ligature.cpp @@ -119,7 +119,7 @@ int Ligature::GetDrawingNoteShape(const Note *note) const // Functors methods //---------------------------------------------------------------------------- -FunctorCode Ligature::Accept(MutableFunctor &functor) +FunctorCode Ligature::Accept(Functor &functor) { return functor.VisitLigature(this); } @@ -129,7 +129,7 @@ FunctorCode Ligature::Accept(ConstFunctor &functor) const return functor.VisitLigature(this); } -FunctorCode Ligature::AcceptEnd(MutableFunctor &functor) +FunctorCode Ligature::AcceptEnd(Functor &functor) { return functor.VisitLigatureEnd(this); } diff --git a/src/lv.cpp b/src/lv.cpp index 7e78ae086d..bc2d72e05a 100644 --- a/src/lv.cpp +++ b/src/lv.cpp @@ -60,7 +60,7 @@ bool Lv::CalculatePosition(const Doc *doc, const Staff *staff, int x1, int x2, i // Lv functor methods //---------------------------------------------------------------------------- -FunctorCode Lv::Accept(MutableFunctor &functor) +FunctorCode Lv::Accept(Functor &functor) { return functor.VisitLv(this); } @@ -70,7 +70,7 @@ FunctorCode Lv::Accept(ConstFunctor &functor) const return functor.VisitLv(this); } -FunctorCode Lv::AcceptEnd(MutableFunctor &functor) +FunctorCode Lv::AcceptEnd(Functor &functor) { return functor.VisitLvEnd(this); } diff --git a/src/mdiv.cpp b/src/mdiv.cpp index 3f204d4b5b..83f6276d86 100644 --- a/src/mdiv.cpp +++ b/src/mdiv.cpp @@ -75,7 +75,7 @@ void Mdiv::MakeVisible() // Functor methods //---------------------------------------------------------------------------- -FunctorCode Mdiv::Accept(MutableFunctor &functor) +FunctorCode Mdiv::Accept(Functor &functor) { return functor.VisitMdiv(this); } @@ -85,7 +85,7 @@ FunctorCode Mdiv::Accept(ConstFunctor &functor) const return functor.VisitMdiv(this); } -FunctorCode Mdiv::AcceptEnd(MutableFunctor &functor) +FunctorCode Mdiv::AcceptEnd(Functor &functor) { return functor.VisitMdivEnd(this); } diff --git a/src/measure.cpp b/src/measure.cpp index 4c5adaf783..b6cff691a5 100644 --- a/src/measure.cpp +++ b/src/measure.cpp @@ -706,7 +706,7 @@ std::vector> Measure::GetInternalTieEn // Measure functor methods //---------------------------------------------------------------------------- -FunctorCode Measure::Accept(MutableFunctor &functor) +FunctorCode Measure::Accept(Functor &functor) { return functor.VisitMeasure(this); } @@ -716,7 +716,7 @@ FunctorCode Measure::Accept(ConstFunctor &functor) const return functor.VisitMeasure(this); } -FunctorCode Measure::AcceptEnd(MutableFunctor &functor) +FunctorCode Measure::AcceptEnd(Functor &functor) { return functor.VisitMeasureEnd(this); } diff --git a/src/mensur.cpp b/src/mensur.cpp index 08d33a54ea..df6e4384a8 100644 --- a/src/mensur.cpp +++ b/src/mensur.cpp @@ -68,7 +68,7 @@ void Mensur::Reset() // Functors methods //---------------------------------------------------------------------------- -FunctorCode Mensur::Accept(MutableFunctor &functor) +FunctorCode Mensur::Accept(Functor &functor) { return functor.VisitMensur(this); } @@ -78,7 +78,7 @@ FunctorCode Mensur::Accept(ConstFunctor &functor) const return functor.VisitMensur(this); } -FunctorCode Mensur::AcceptEnd(MutableFunctor &functor) +FunctorCode Mensur::AcceptEnd(Functor &functor) { return functor.VisitMensurEnd(this); } diff --git a/src/metersig.cpp b/src/metersig.cpp index c1310484dc..204bb19a75 100644 --- a/src/metersig.cpp +++ b/src/metersig.cpp @@ -127,7 +127,7 @@ std::pair MeterSig::GetEnclosingGlyphs(bool smallGlyph) cons // Functors methods //---------------------------------------------------------------------------- -FunctorCode MeterSig::Accept(MutableFunctor &functor) +FunctorCode MeterSig::Accept(Functor &functor) { return functor.VisitMeterSig(this); } @@ -137,7 +137,7 @@ FunctorCode MeterSig::Accept(ConstFunctor &functor) const return functor.VisitMeterSig(this); } -FunctorCode MeterSig::AcceptEnd(MutableFunctor &functor) +FunctorCode MeterSig::AcceptEnd(Functor &functor) { return functor.VisitMeterSigEnd(this); } diff --git a/src/metersiggrp.cpp b/src/metersiggrp.cpp index fec57ac6d8..94aa3bb7f2 100644 --- a/src/metersiggrp.cpp +++ b/src/metersiggrp.cpp @@ -171,7 +171,7 @@ void MeterSigGrp::SetMeasureBasedCount(const Measure *measure) // Functors methods //---------------------------------------------------------------------------- -FunctorCode MeterSigGrp::Accept(MutableFunctor &functor) +FunctorCode MeterSigGrp::Accept(Functor &functor) { return functor.VisitMeterSigGrp(this); } @@ -181,7 +181,7 @@ FunctorCode MeterSigGrp::Accept(ConstFunctor &functor) const return functor.VisitMeterSigGrp(this); } -FunctorCode MeterSigGrp::AcceptEnd(MutableFunctor &functor) +FunctorCode MeterSigGrp::AcceptEnd(Functor &functor) { return functor.VisitMeterSigGrpEnd(this); } diff --git a/src/mnum.cpp b/src/mnum.cpp index d9ab8233f6..a98a5ec5d5 100644 --- a/src/mnum.cpp +++ b/src/mnum.cpp @@ -77,7 +77,7 @@ bool MNum::IsSupportedChild(Object *child) static const ClassRegistrar s_factory("mNum", MNUM); -FunctorCode MNum::Accept(MutableFunctor &functor) +FunctorCode MNum::Accept(Functor &functor) { return functor.VisitMNum(this); } @@ -87,7 +87,7 @@ FunctorCode MNum::Accept(ConstFunctor &functor) const return functor.VisitMNum(this); } -FunctorCode MNum::AcceptEnd(MutableFunctor &functor) +FunctorCode MNum::AcceptEnd(Functor &functor) { return functor.VisitMNumEnd(this); } diff --git a/src/mordent.cpp b/src/mordent.cpp index 166abdf8ee..f3e0c3579c 100644 --- a/src/mordent.cpp +++ b/src/mordent.cpp @@ -86,7 +86,7 @@ char32_t Mordent::GetMordentGlyph() const // Mordent functor methods //---------------------------------------------------------------------------- -FunctorCode Mordent::Accept(MutableFunctor &functor) +FunctorCode Mordent::Accept(Functor &functor) { return functor.VisitMordent(this); } @@ -96,7 +96,7 @@ FunctorCode Mordent::Accept(ConstFunctor &functor) const return functor.VisitMordent(this); } -FunctorCode Mordent::AcceptEnd(MutableFunctor &functor) +FunctorCode Mordent::AcceptEnd(Functor &functor) { return functor.VisitMordentEnd(this); } diff --git a/src/mrest.cpp b/src/mrest.cpp index ecb0c46273..ff5def6815 100644 --- a/src/mrest.cpp +++ b/src/mrest.cpp @@ -57,7 +57,7 @@ void MRest::Reset() // Functors methods //---------------------------------------------------------------------------- -FunctorCode MRest::Accept(MutableFunctor &functor) +FunctorCode MRest::Accept(Functor &functor) { return functor.VisitMRest(this); } @@ -67,7 +67,7 @@ FunctorCode MRest::Accept(ConstFunctor &functor) const return functor.VisitMRest(this); } -FunctorCode MRest::AcceptEnd(MutableFunctor &functor) +FunctorCode MRest::AcceptEnd(Functor &functor) { return functor.VisitMRestEnd(this); } diff --git a/src/mrpt.cpp b/src/mrpt.cpp index 02508db796..0d8c6775e6 100644 --- a/src/mrpt.cpp +++ b/src/mrpt.cpp @@ -55,7 +55,7 @@ void MRpt::Reset() // MRpt functor methods //---------------------------------------------------------------------------- -FunctorCode MRpt::Accept(MutableFunctor &functor) +FunctorCode MRpt::Accept(Functor &functor) { return functor.VisitMRpt(this); } @@ -65,7 +65,7 @@ FunctorCode MRpt::Accept(ConstFunctor &functor) const return functor.VisitMRpt(this); } -FunctorCode MRpt::AcceptEnd(MutableFunctor &functor) +FunctorCode MRpt::AcceptEnd(Functor &functor) { return functor.VisitMRptEnd(this); } diff --git a/src/mrpt2.cpp b/src/mrpt2.cpp index d2784a82c2..f981c74689 100644 --- a/src/mrpt2.cpp +++ b/src/mrpt2.cpp @@ -45,7 +45,7 @@ void MRpt2::Reset() this->ResetColor(); } -FunctorCode MRpt2::Accept(MutableFunctor &functor) +FunctorCode MRpt2::Accept(Functor &functor) { return functor.VisitMRpt2(this); } @@ -55,7 +55,7 @@ FunctorCode MRpt2::Accept(ConstFunctor &functor) const return functor.VisitMRpt2(this); } -FunctorCode MRpt2::AcceptEnd(MutableFunctor &functor) +FunctorCode MRpt2::AcceptEnd(Functor &functor) { return functor.VisitMRpt2End(this); } diff --git a/src/mspace.cpp b/src/mspace.cpp index 4d5658cca8..6c6868905f 100644 --- a/src/mspace.cpp +++ b/src/mspace.cpp @@ -38,7 +38,7 @@ void MSpace::Reset() // Functors methods //---------------------------------------------------------------------------- -FunctorCode MSpace::Accept(MutableFunctor &functor) +FunctorCode MSpace::Accept(Functor &functor) { return functor.VisitMSpace(this); } @@ -48,7 +48,7 @@ FunctorCode MSpace::Accept(ConstFunctor &functor) const return functor.VisitMSpace(this); } -FunctorCode MSpace::AcceptEnd(MutableFunctor &functor) +FunctorCode MSpace::AcceptEnd(Functor &functor) { return functor.VisitMSpaceEnd(this); } diff --git a/src/multirest.cpp b/src/multirest.cpp index 51292b7b0d..c5716b4da3 100644 --- a/src/multirest.cpp +++ b/src/multirest.cpp @@ -75,7 +75,7 @@ bool MultiRest::UseBlockStyle(const Doc *doc) const return useBlock; } -FunctorCode MultiRest::Accept(MutableFunctor &functor) +FunctorCode MultiRest::Accept(Functor &functor) { return functor.VisitMultiRest(this); } @@ -85,7 +85,7 @@ FunctorCode MultiRest::Accept(ConstFunctor &functor) const return functor.VisitMultiRest(this); } -FunctorCode MultiRest::AcceptEnd(MutableFunctor &functor) +FunctorCode MultiRest::AcceptEnd(Functor &functor) { return functor.VisitMultiRestEnd(this); } diff --git a/src/multirpt.cpp b/src/multirpt.cpp index 9a7204557c..b7228b51d3 100644 --- a/src/multirpt.cpp +++ b/src/multirpt.cpp @@ -44,7 +44,7 @@ void MultiRpt::Reset() this->ResetNumbered(); } -FunctorCode MultiRpt::Accept(MutableFunctor &functor) +FunctorCode MultiRpt::Accept(Functor &functor) { return functor.VisitMultiRpt(this); } @@ -54,7 +54,7 @@ FunctorCode MultiRpt::Accept(ConstFunctor &functor) const return functor.VisitMultiRpt(this); } -FunctorCode MultiRpt::AcceptEnd(MutableFunctor &functor) +FunctorCode MultiRpt::AcceptEnd(Functor &functor) { return functor.VisitMultiRptEnd(this); } diff --git a/src/nc.cpp b/src/nc.cpp index e8c19f2a46..2628f91b71 100644 --- a/src/nc.cpp +++ b/src/nc.cpp @@ -61,7 +61,7 @@ void Nc::Reset() this->ResetNcForm(); } -FunctorCode Nc::Accept(MutableFunctor &functor) +FunctorCode Nc::Accept(Functor &functor) { return functor.VisitNc(this); } @@ -71,7 +71,7 @@ FunctorCode Nc::Accept(ConstFunctor &functor) const return functor.VisitNc(this); } -FunctorCode Nc::AcceptEnd(MutableFunctor &functor) +FunctorCode Nc::AcceptEnd(Functor &functor) { return functor.VisitNcEnd(this); } diff --git a/src/neume.cpp b/src/neume.cpp index 3c586af482..1e5cf0d385 100644 --- a/src/neume.cpp +++ b/src/neume.cpp @@ -218,7 +218,7 @@ PitchInterface *Neume::GetLowestPitch() return min; } -FunctorCode Neume::Accept(MutableFunctor &functor) +FunctorCode Neume::Accept(Functor &functor) { return functor.VisitNeume(this); } @@ -228,7 +228,7 @@ FunctorCode Neume::Accept(ConstFunctor &functor) const return functor.VisitNeume(this); } -FunctorCode Neume::AcceptEnd(MutableFunctor &functor) +FunctorCode Neume::AcceptEnd(Functor &functor) { return functor.VisitNeumeEnd(this); } diff --git a/src/note.cpp b/src/note.cpp index f80b5b395b..fe8f758a62 100644 --- a/src/note.cpp +++ b/src/note.cpp @@ -800,7 +800,7 @@ int Note::PnameToPclass(data_PITCHNAME pitchName) // Functors methods //---------------------------------------------------------------------------- -FunctorCode Note::Accept(MutableFunctor &functor) +FunctorCode Note::Accept(Functor &functor) { return functor.VisitNote(this); } @@ -810,7 +810,7 @@ FunctorCode Note::Accept(ConstFunctor &functor) const return functor.VisitNote(this); } -FunctorCode Note::AcceptEnd(MutableFunctor &functor) +FunctorCode Note::AcceptEnd(Functor &functor) { return functor.VisitNoteEnd(this); } diff --git a/src/num.cpp b/src/num.cpp index 782994d2d7..6dc3464372 100644 --- a/src/num.cpp +++ b/src/num.cpp @@ -49,7 +49,7 @@ bool Num::IsSupportedChild(Object *child) return true; } -FunctorCode Num::Accept(MutableFunctor &functor) +FunctorCode Num::Accept(Functor &functor) { return functor.VisitNum(this); } @@ -59,7 +59,7 @@ FunctorCode Num::Accept(ConstFunctor &functor) const return functor.VisitNum(this); } -FunctorCode Num::AcceptEnd(MutableFunctor &functor) +FunctorCode Num::AcceptEnd(Functor &functor) { return functor.VisitNumEnd(this); } diff --git a/src/object.cpp b/src/object.cpp index c2433662cb..8a8d3f9346 100644 --- a/src/object.cpp +++ b/src/object.cpp @@ -1012,7 +1012,7 @@ bool Object::HasNonEditorialContent() return (!nonEditorial.empty()); } -void Object::Process(MutableFunctor &functor, int deepness, bool skipFirst) +void Object::Process(Functor &functor, int deepness, bool skipFirst) { if (functor.GetCode() == FUNCTOR_STOP) { return; @@ -1126,7 +1126,7 @@ void Object::Process(ConstFunctor &functor, int deepness, bool skipFirst) const } } -FunctorCode Object::Accept(MutableFunctor &functor) +FunctorCode Object::Accept(Functor &functor) { return functor.VisitObject(this); } @@ -1136,7 +1136,7 @@ FunctorCode Object::Accept(ConstFunctor &functor) const return functor.VisitObject(this); } -FunctorCode Object::AcceptEnd(MutableFunctor &functor) +FunctorCode Object::AcceptEnd(Functor &functor) { return functor.VisitObjectEnd(this); } diff --git a/src/octave.cpp b/src/octave.cpp index 20a4030d8e..db7af715bc 100644 --- a/src/octave.cpp +++ b/src/octave.cpp @@ -177,7 +177,7 @@ std::pair Octave::GetVerticalContentBoundaryRel(const Doc *doc, const // Octave functor methods //---------------------------------------------------------------------------- -FunctorCode Octave::Accept(MutableFunctor &functor) +FunctorCode Octave::Accept(Functor &functor) { return functor.VisitOctave(this); } @@ -187,7 +187,7 @@ FunctorCode Octave::Accept(ConstFunctor &functor) const return functor.VisitOctave(this); } -FunctorCode Octave::AcceptEnd(MutableFunctor &functor) +FunctorCode Octave::AcceptEnd(Functor &functor) { return functor.VisitOctaveEnd(this); } diff --git a/src/ornam.cpp b/src/ornam.cpp index 27408e243e..4931b5dab5 100644 --- a/src/ornam.cpp +++ b/src/ornam.cpp @@ -97,7 +97,7 @@ char32_t Ornam::GetOrnamGlyph() const // Ornam functor methods //---------------------------------------------------------------------------- -FunctorCode Ornam::Accept(MutableFunctor &functor) +FunctorCode Ornam::Accept(Functor &functor) { return functor.VisitOrnam(this); } @@ -107,7 +107,7 @@ FunctorCode Ornam::Accept(ConstFunctor &functor) const return functor.VisitOrnam(this); } -FunctorCode Ornam::AcceptEnd(MutableFunctor &functor) +FunctorCode Ornam::AcceptEnd(Functor &functor) { return functor.VisitOrnamEnd(this); } diff --git a/src/page.cpp b/src/page.cpp index df8ded3e83..12d9a630cd 100644 --- a/src/page.cpp +++ b/src/page.cpp @@ -770,7 +770,7 @@ void Page::AdjustSylSpacingByVerse(const IntTree &verseTree, Doc *doc) // Functor methods //---------------------------------------------------------------------------- -FunctorCode Page::Accept(MutableFunctor &functor) +FunctorCode Page::Accept(Functor &functor) { return functor.VisitPage(this); } @@ -780,7 +780,7 @@ FunctorCode Page::Accept(ConstFunctor &functor) const return functor.VisitPage(this); } -FunctorCode Page::AcceptEnd(MutableFunctor &functor) +FunctorCode Page::AcceptEnd(Functor &functor) { return functor.VisitPageEnd(this); } diff --git a/src/pageelement.cpp b/src/pageelement.cpp index 4505dc6f46..2651be7536 100644 --- a/src/pageelement.cpp +++ b/src/pageelement.cpp @@ -55,7 +55,7 @@ void PageElement::Reset() // Functor methods //---------------------------------------------------------------------------- -FunctorCode PageElement::Accept(MutableFunctor &functor) +FunctorCode PageElement::Accept(Functor &functor) { return functor.VisitPageElement(this); } @@ -65,7 +65,7 @@ FunctorCode PageElement::Accept(ConstFunctor &functor) const return functor.VisitPageElement(this); } -FunctorCode PageElement::AcceptEnd(MutableFunctor &functor) +FunctorCode PageElement::AcceptEnd(Functor &functor) { return functor.VisitPageElementEnd(this); } diff --git a/src/pagemilestone.cpp b/src/pagemilestone.cpp index d3231460f0..e15c6aceb6 100644 --- a/src/pagemilestone.cpp +++ b/src/pagemilestone.cpp @@ -80,7 +80,7 @@ void PageMilestoneInterface::ConvertToPageBasedMilestone(Object *object, Object // PageMilestoneEnd functor methods //---------------------------------------------------------------------------- -FunctorCode PageMilestoneEnd::Accept(MutableFunctor &functor) +FunctorCode PageMilestoneEnd::Accept(Functor &functor) { return functor.VisitPageMilestone(this); } @@ -90,7 +90,7 @@ FunctorCode PageMilestoneEnd::Accept(ConstFunctor &functor) const return functor.VisitPageMilestone(this); } -FunctorCode PageMilestoneEnd::AcceptEnd(MutableFunctor &functor) +FunctorCode PageMilestoneEnd::AcceptEnd(Functor &functor) { return functor.VisitPageMilestoneEnd(this); } diff --git a/src/pages.cpp b/src/pages.cpp index 3e7a4e56f2..79a3d1b838 100644 --- a/src/pages.cpp +++ b/src/pages.cpp @@ -66,7 +66,7 @@ void Pages::ConvertFrom(Score *score) // Functor methods //---------------------------------------------------------------------------- -FunctorCode Pages::Accept(MutableFunctor &functor) +FunctorCode Pages::Accept(Functor &functor) { return functor.VisitPages(this); } @@ -76,7 +76,7 @@ FunctorCode Pages::Accept(ConstFunctor &functor) const return functor.VisitPages(this); } -FunctorCode Pages::AcceptEnd(MutableFunctor &functor) +FunctorCode Pages::AcceptEnd(Functor &functor) { return functor.VisitPagesEnd(this); } diff --git a/src/pb.cpp b/src/pb.cpp index 1ec33460e6..9b7386736a 100644 --- a/src/pb.cpp +++ b/src/pb.cpp @@ -48,7 +48,7 @@ void Pb::Reset() // Pb functor methods //---------------------------------------------------------------------------- -FunctorCode Pb::Accept(MutableFunctor &functor) +FunctorCode Pb::Accept(Functor &functor) { return functor.VisitPb(this); } @@ -58,7 +58,7 @@ FunctorCode Pb::Accept(ConstFunctor &functor) const return functor.VisitPb(this); } -FunctorCode Pb::AcceptEnd(MutableFunctor &functor) +FunctorCode Pb::AcceptEnd(Functor &functor) { return functor.VisitPbEnd(this); } diff --git a/src/pedal.cpp b/src/pedal.cpp index 741c3be4ae..8eb25b9472 100644 --- a/src/pedal.cpp +++ b/src/pedal.cpp @@ -110,7 +110,7 @@ data_PEDALSTYLE Pedal::GetPedalForm(const Doc *doc, const System *system) const // Pedal functor methods //---------------------------------------------------------------------------- -FunctorCode Pedal::Accept(MutableFunctor &functor) +FunctorCode Pedal::Accept(Functor &functor) { return functor.VisitPedal(this); } @@ -120,7 +120,7 @@ FunctorCode Pedal::Accept(ConstFunctor &functor) const return functor.VisitPedal(this); } -FunctorCode Pedal::AcceptEnd(MutableFunctor &functor) +FunctorCode Pedal::AcceptEnd(Functor &functor) { return functor.VisitPedalEnd(this); } diff --git a/src/pgfoot.cpp b/src/pgfoot.cpp index e2cf854ee8..00d7a466f8 100644 --- a/src/pgfoot.cpp +++ b/src/pgfoot.cpp @@ -53,7 +53,7 @@ int PgFoot::GetTotalHeight(const Doc *doc) const // Functor methods //---------------------------------------------------------------------------- -FunctorCode PgFoot::Accept(MutableFunctor &functor) +FunctorCode PgFoot::Accept(Functor &functor) { return functor.VisitPgFoot(this); } @@ -63,7 +63,7 @@ FunctorCode PgFoot::Accept(ConstFunctor &functor) const return functor.VisitPgFoot(this); } -FunctorCode PgFoot::AcceptEnd(MutableFunctor &functor) +FunctorCode PgFoot::AcceptEnd(Functor &functor) { return functor.VisitPgFootEnd(this); } diff --git a/src/pgfoot2.cpp b/src/pgfoot2.cpp index cd2c3caf79..0f0f021ca6 100644 --- a/src/pgfoot2.cpp +++ b/src/pgfoot2.cpp @@ -52,7 +52,7 @@ int PgFoot2::GetTotalHeight(const Doc *doc) const // Functor methods //---------------------------------------------------------------------------- -FunctorCode PgFoot2::Accept(MutableFunctor &functor) +FunctorCode PgFoot2::Accept(Functor &functor) { return functor.VisitPgFoot2(this); } @@ -62,7 +62,7 @@ FunctorCode PgFoot2::Accept(ConstFunctor &functor) const return functor.VisitPgFoot2(this); } -FunctorCode PgFoot2::AcceptEnd(MutableFunctor &functor) +FunctorCode PgFoot2::AcceptEnd(Functor &functor) { return functor.VisitPgFoot2End(this); } diff --git a/src/pghead.cpp b/src/pghead.cpp index 3172348f35..fcd7b1a05e 100644 --- a/src/pghead.cpp +++ b/src/pghead.cpp @@ -114,7 +114,7 @@ bool PgHead::GenerateFromMEIHeader(const pugi::xml_document &header) // Functor methods //---------------------------------------------------------------------------- -FunctorCode PgHead::Accept(MutableFunctor &functor) +FunctorCode PgHead::Accept(Functor &functor) { return functor.VisitPgHead(this); } @@ -124,7 +124,7 @@ FunctorCode PgHead::Accept(ConstFunctor &functor) const return functor.VisitPgHead(this); } -FunctorCode PgHead::AcceptEnd(MutableFunctor &functor) +FunctorCode PgHead::AcceptEnd(Functor &functor) { return functor.VisitPgHeadEnd(this); } diff --git a/src/pghead2.cpp b/src/pghead2.cpp index 33aaa0f388..892067cffd 100644 --- a/src/pghead2.cpp +++ b/src/pghead2.cpp @@ -52,7 +52,7 @@ int PgHead2::GetTotalHeight(const Doc *doc) const // Functor methods //---------------------------------------------------------------------------- -FunctorCode PgHead2::Accept(MutableFunctor &functor) +FunctorCode PgHead2::Accept(Functor &functor) { return functor.VisitPgHead2(this); } @@ -62,7 +62,7 @@ FunctorCode PgHead2::Accept(ConstFunctor &functor) const return functor.VisitPgHead2(this); } -FunctorCode PgHead2::AcceptEnd(MutableFunctor &functor) +FunctorCode PgHead2::AcceptEnd(Functor &functor) { return functor.VisitPgHead2End(this); } diff --git a/src/phrase.cpp b/src/phrase.cpp index dc6e05e7a0..116dc3c700 100644 --- a/src/phrase.cpp +++ b/src/phrase.cpp @@ -40,7 +40,7 @@ void Phrase::Reset() // Functors methods //---------------------------------------------------------------------------- -FunctorCode Phrase::Accept(MutableFunctor &functor) +FunctorCode Phrase::Accept(Functor &functor) { return functor.VisitPhrase(this); } @@ -50,7 +50,7 @@ FunctorCode Phrase::Accept(ConstFunctor &functor) const return functor.VisitPhrase(this); } -FunctorCode Phrase::AcceptEnd(MutableFunctor &functor) +FunctorCode Phrase::AcceptEnd(Functor &functor) { return functor.VisitPhraseEnd(this); } diff --git a/src/pitchinflection.cpp b/src/pitchinflection.cpp index 92ab725150..5fe79c6cac 100644 --- a/src/pitchinflection.cpp +++ b/src/pitchinflection.cpp @@ -43,7 +43,7 @@ void PitchInflection::Reset() // PitchInflection functor methods //---------------------------------------------------------------------------- -FunctorCode PitchInflection::Accept(MutableFunctor &functor) +FunctorCode PitchInflection::Accept(Functor &functor) { return functor.VisitPitchInflection(this); } @@ -53,7 +53,7 @@ FunctorCode PitchInflection::Accept(ConstFunctor &functor) const return functor.VisitPitchInflection(this); } -FunctorCode PitchInflection::AcceptEnd(MutableFunctor &functor) +FunctorCode PitchInflection::AcceptEnd(Functor &functor) { return functor.VisitPitchInflectionEnd(this); } diff --git a/src/plica.cpp b/src/plica.cpp index 58fdfb6702..f9cc3038df 100644 --- a/src/plica.cpp +++ b/src/plica.cpp @@ -45,7 +45,7 @@ void Plica::Reset() // Functors methods //---------------------------------------------------------------------------- -FunctorCode Plica::Accept(MutableFunctor &functor) +FunctorCode Plica::Accept(Functor &functor) { return functor.VisitPlica(this); } @@ -55,7 +55,7 @@ FunctorCode Plica::Accept(ConstFunctor &functor) const return functor.VisitPlica(this); } -FunctorCode Plica::AcceptEnd(MutableFunctor &functor) +FunctorCode Plica::AcceptEnd(Functor &functor) { return functor.VisitPlicaEnd(this); } diff --git a/src/proport.cpp b/src/proport.cpp index 50022d3351..0ee5336561 100644 --- a/src/proport.cpp +++ b/src/proport.cpp @@ -34,7 +34,7 @@ void Proport::Reset() this->ResetDurationRatio(); } -FunctorCode Proport::Accept(MutableFunctor &functor) +FunctorCode Proport::Accept(Functor &functor) { return functor.VisitProport(this); } @@ -44,7 +44,7 @@ FunctorCode Proport::Accept(ConstFunctor &functor) const return functor.VisitProport(this); } -FunctorCode Proport::AcceptEnd(MutableFunctor &functor) +FunctorCode Proport::AcceptEnd(Functor &functor) { return functor.VisitProportEnd(this); } diff --git a/src/reh.cpp b/src/reh.cpp index 9c2262383f..90bf6643ad 100644 --- a/src/reh.cpp +++ b/src/reh.cpp @@ -70,7 +70,7 @@ bool Reh::IsSupportedChild(Object *child) // Reh functor methods //---------------------------------------------------------------------------- -FunctorCode Reh::Accept(MutableFunctor &functor) +FunctorCode Reh::Accept(Functor &functor) { return functor.VisitReh(this); } @@ -80,7 +80,7 @@ FunctorCode Reh::Accept(ConstFunctor &functor) const return functor.VisitReh(this); } -FunctorCode Reh::AcceptEnd(MutableFunctor &functor) +FunctorCode Reh::AcceptEnd(Functor &functor) { return functor.VisitRehEnd(this); } diff --git a/src/rend.cpp b/src/rend.cpp index 30c65e3d77..84aeb6c46f 100644 --- a/src/rend.cpp +++ b/src/rend.cpp @@ -91,7 +91,7 @@ bool Rend::IsSupportedChild(Object *child) // Functor methods //---------------------------------------------------------------------------- -FunctorCode Rend::Accept(MutableFunctor &functor) +FunctorCode Rend::Accept(Functor &functor) { return functor.VisitRend(this); } @@ -101,7 +101,7 @@ FunctorCode Rend::Accept(ConstFunctor &functor) const return functor.VisitRend(this); } -FunctorCode Rend::AcceptEnd(MutableFunctor &functor) +FunctorCode Rend::AcceptEnd(Functor &functor) { return functor.VisitRendEnd(this); } diff --git a/src/rest.cpp b/src/rest.cpp index dcba491ed2..3cfc71bced 100644 --- a/src/rest.cpp +++ b/src/rest.cpp @@ -549,7 +549,7 @@ int Rest::GetRestOffsetFromOptions( // Functors methods //---------------------------------------------------------------------------- -FunctorCode Rest::Accept(MutableFunctor &functor) +FunctorCode Rest::Accept(Functor &functor) { return functor.VisitRest(this); } @@ -559,7 +559,7 @@ FunctorCode Rest::Accept(ConstFunctor &functor) const return functor.VisitRest(this); } -FunctorCode Rest::AcceptEnd(MutableFunctor &functor) +FunctorCode Rest::AcceptEnd(Functor &functor) { return functor.VisitRestEnd(this); } diff --git a/src/runningelement.cpp b/src/runningelement.cpp index e97e1a4c44..d07d397cb7 100644 --- a/src/runningelement.cpp +++ b/src/runningelement.cpp @@ -386,7 +386,7 @@ void RunningElement::AddPageNum(data_HORIZONTALALIGNMENT halign, data_VERTICALAL // Functor methods //---------------------------------------------------------------------------- -FunctorCode RunningElement::Accept(MutableFunctor &functor) +FunctorCode RunningElement::Accept(Functor &functor) { return functor.VisitRunningElement(this); } @@ -396,7 +396,7 @@ FunctorCode RunningElement::Accept(ConstFunctor &functor) const return functor.VisitRunningElement(this); } -FunctorCode RunningElement::AcceptEnd(MutableFunctor &functor) +FunctorCode RunningElement::AcceptEnd(Functor &functor) { return functor.VisitRunningElementEnd(this); } diff --git a/src/sb.cpp b/src/sb.cpp index f636c4851d..33a33c0bdf 100644 --- a/src/sb.cpp +++ b/src/sb.cpp @@ -48,7 +48,7 @@ void Sb::Reset() // Sb functor methods //---------------------------------------------------------------------------- -FunctorCode Sb::Accept(MutableFunctor &functor) +FunctorCode Sb::Accept(Functor &functor) { return functor.VisitSb(this); } @@ -58,7 +58,7 @@ FunctorCode Sb::Accept(ConstFunctor &functor) const return functor.VisitSb(this); } -FunctorCode Sb::AcceptEnd(MutableFunctor &functor) +FunctorCode Sb::AcceptEnd(Functor &functor) { return functor.VisitSbEnd(this); } diff --git a/src/score.cpp b/src/score.cpp index c7cb1548a6..fb10abcd57 100644 --- a/src/score.cpp +++ b/src/score.cpp @@ -154,7 +154,7 @@ bool Score::ScoreDefNeedsOptimization(int optionCondense) const // Functor methods //---------------------------------------------------------------------------- -FunctorCode Score::Accept(MutableFunctor &functor) +FunctorCode Score::Accept(Functor &functor) { return functor.VisitScore(this); } @@ -164,7 +164,7 @@ FunctorCode Score::Accept(ConstFunctor &functor) const return functor.VisitScore(this); } -FunctorCode Score::AcceptEnd(MutableFunctor &functor) +FunctorCode Score::AcceptEnd(Functor &functor) { return functor.VisitScoreEnd(this); } diff --git a/src/scoredef.cpp b/src/scoredef.cpp index f40f10be84..0f46e79732 100644 --- a/src/scoredef.cpp +++ b/src/scoredef.cpp @@ -658,7 +658,7 @@ bool ScoreDef::HasSystemStartLine() const // Functors methods //---------------------------------------------------------------------------- -FunctorCode ScoreDefElement::Accept(MutableFunctor &functor) +FunctorCode ScoreDefElement::Accept(Functor &functor) { return functor.VisitScoreDefElement(this); } @@ -668,7 +668,7 @@ FunctorCode ScoreDefElement::Accept(ConstFunctor &functor) const return functor.VisitScoreDefElement(this); } -FunctorCode ScoreDefElement::AcceptEnd(MutableFunctor &functor) +FunctorCode ScoreDefElement::AcceptEnd(Functor &functor) { return functor.VisitScoreDefElementEnd(this); } @@ -678,7 +678,7 @@ FunctorCode ScoreDefElement::AcceptEnd(ConstFunctor &functor) const return functor.VisitScoreDefElementEnd(this); } -FunctorCode ScoreDef::Accept(MutableFunctor &functor) +FunctorCode ScoreDef::Accept(Functor &functor) { return functor.VisitScoreDef(this); } @@ -688,7 +688,7 @@ FunctorCode ScoreDef::Accept(ConstFunctor &functor) const return functor.VisitScoreDef(this); } -FunctorCode ScoreDef::AcceptEnd(MutableFunctor &functor) +FunctorCode ScoreDef::AcceptEnd(Functor &functor) { return functor.VisitScoreDefEnd(this); } diff --git a/src/section.cpp b/src/section.cpp index e51f0feaf3..2751bc9f3d 100644 --- a/src/section.cpp +++ b/src/section.cpp @@ -74,7 +74,7 @@ bool Section::IsSupportedChild(Object *child) // Section functor methods //---------------------------------------------------------------------------- -FunctorCode Section::Accept(MutableFunctor &functor) +FunctorCode Section::Accept(Functor &functor) { return functor.VisitSection(this); } @@ -84,7 +84,7 @@ FunctorCode Section::Accept(ConstFunctor &functor) const return functor.VisitSection(this); } -FunctorCode Section::AcceptEnd(MutableFunctor &functor) +FunctorCode Section::AcceptEnd(Functor &functor) { return functor.VisitSectionEnd(this); } diff --git a/src/slur.cpp b/src/slur.cpp index 162536863d..ca875c4669 100644 --- a/src/slur.cpp +++ b/src/slur.cpp @@ -2005,7 +2005,7 @@ void Slur::CalcInitialCurve(const Doc *doc, FloatingCurvePositioner *curve, Near // Functors methods //---------------------------------------------------------------------------- -FunctorCode Slur::Accept(MutableFunctor &functor) +FunctorCode Slur::Accept(Functor &functor) { return functor.VisitSlur(this); } @@ -2015,7 +2015,7 @@ FunctorCode Slur::Accept(ConstFunctor &functor) const return functor.VisitSlur(this); } -FunctorCode Slur::AcceptEnd(MutableFunctor &functor) +FunctorCode Slur::AcceptEnd(Functor &functor) { return functor.VisitSlurEnd(this); } diff --git a/src/space.cpp b/src/space.cpp index 36ec94559b..df56c81145 100644 --- a/src/space.cpp +++ b/src/space.cpp @@ -44,7 +44,7 @@ void Space::Reset() // Functors methods //---------------------------------------------------------------------------- -FunctorCode Space::Accept(MutableFunctor &functor) +FunctorCode Space::Accept(Functor &functor) { return functor.VisitSpace(this); } @@ -54,7 +54,7 @@ FunctorCode Space::Accept(ConstFunctor &functor) const return functor.VisitSpace(this); } -FunctorCode Space::AcceptEnd(MutableFunctor &functor) +FunctorCode Space::AcceptEnd(Functor &functor) { return functor.VisitSpaceEnd(this); } diff --git a/src/staff.cpp b/src/staff.cpp index 92489227f8..3d91195fea 100644 --- a/src/staff.cpp +++ b/src/staff.cpp @@ -343,7 +343,7 @@ void LedgerLine::AddDash(int left, int right, int extension) // Staff functor methods //---------------------------------------------------------------------------- -FunctorCode Staff::Accept(MutableFunctor &functor) +FunctorCode Staff::Accept(Functor &functor) { return functor.VisitStaff(this); } @@ -353,7 +353,7 @@ FunctorCode Staff::Accept(ConstFunctor &functor) const return functor.VisitStaff(this); } -FunctorCode Staff::AcceptEnd(MutableFunctor &functor) +FunctorCode Staff::AcceptEnd(Functor &functor) { return functor.VisitStaffEnd(this); } diff --git a/src/staffdef.cpp b/src/staffdef.cpp index 36e39b4e8a..5a86e2a6c4 100644 --- a/src/staffdef.cpp +++ b/src/staffdef.cpp @@ -136,7 +136,7 @@ bool StaffDef::HasLayerDefWithLabel() const // StaffDef functor methods //---------------------------------------------------------------------------- -FunctorCode StaffDef::Accept(MutableFunctor &functor) +FunctorCode StaffDef::Accept(Functor &functor) { return functor.VisitStaffDef(this); } @@ -146,7 +146,7 @@ FunctorCode StaffDef::Accept(ConstFunctor &functor) const return functor.VisitStaffDef(this); } -FunctorCode StaffDef::AcceptEnd(MutableFunctor &functor) +FunctorCode StaffDef::AcceptEnd(Functor &functor) { return functor.VisitStaffDefEnd(this); } diff --git a/src/staffgrp.cpp b/src/staffgrp.cpp index bdce134550..1c9598b57a 100644 --- a/src/staffgrp.cpp +++ b/src/staffgrp.cpp @@ -260,7 +260,7 @@ void StaffGrp::SetEverythingVisible() // StaffGrp functor methods //---------------------------------------------------------------------------- -FunctorCode StaffGrp::Accept(MutableFunctor &functor) +FunctorCode StaffGrp::Accept(Functor &functor) { return functor.VisitStaffGrp(this); } @@ -270,7 +270,7 @@ FunctorCode StaffGrp::Accept(ConstFunctor &functor) const return functor.VisitStaffGrp(this); } -FunctorCode StaffGrp::AcceptEnd(MutableFunctor &functor) +FunctorCode StaffGrp::AcceptEnd(Functor &functor) { return functor.VisitStaffGrpEnd(this); } diff --git a/src/stem.cpp b/src/stem.cpp index a43426c51f..891a0f468e 100644 --- a/src/stem.cpp +++ b/src/stem.cpp @@ -118,7 +118,7 @@ int Stem::CompareToElementPosition(const Doc *doc, const LayerElement *otherElem // Functors methods //---------------------------------------------------------------------------- -FunctorCode Stem::Accept(MutableFunctor &functor) +FunctorCode Stem::Accept(Functor &functor) { return functor.VisitStem(this); } @@ -128,7 +128,7 @@ FunctorCode Stem::Accept(ConstFunctor &functor) const return functor.VisitStem(this); } -FunctorCode Stem::AcceptEnd(MutableFunctor &functor) +FunctorCode Stem::AcceptEnd(Functor &functor) { return functor.VisitStemEnd(this); } diff --git a/src/svg.cpp b/src/svg.cpp index 916f4c03b0..d4d75dcca6 100644 --- a/src/svg.cpp +++ b/src/svg.cpp @@ -59,7 +59,7 @@ int Svg::GetHeight() const return 0; } -FunctorCode Svg::Accept(MutableFunctor &functor) +FunctorCode Svg::Accept(Functor &functor) { return functor.VisitSvg(this); } @@ -69,7 +69,7 @@ FunctorCode Svg::Accept(ConstFunctor &functor) const return functor.VisitSvg(this); } -FunctorCode Svg::AcceptEnd(MutableFunctor &functor) +FunctorCode Svg::AcceptEnd(Functor &functor) { return functor.VisitSvgEnd(this); } diff --git a/src/syl.cpp b/src/syl.cpp index acc467862f..1e777512da 100644 --- a/src/syl.cpp +++ b/src/syl.cpp @@ -150,7 +150,7 @@ void Syl::AdjustToLyricSize(const Doc *doc, int &value) // Functor methods //---------------------------------------------------------------------------- -FunctorCode Syl::Accept(MutableFunctor &functor) +FunctorCode Syl::Accept(Functor &functor) { return functor.VisitSyl(this); } @@ -160,7 +160,7 @@ FunctorCode Syl::Accept(ConstFunctor &functor) const return functor.VisitSyl(this); } -FunctorCode Syl::AcceptEnd(MutableFunctor &functor) +FunctorCode Syl::AcceptEnd(Functor &functor) { return functor.VisitSylEnd(this); } diff --git a/src/syllable.cpp b/src/syllable.cpp index eafbe032e7..63fbe5346e 100644 --- a/src/syllable.cpp +++ b/src/syllable.cpp @@ -84,7 +84,7 @@ bool Syllable::MarkupAddSyl() return false; } -FunctorCode Syllable::Accept(MutableFunctor &functor) +FunctorCode Syllable::Accept(Functor &functor) { return functor.VisitSyllable(this); } @@ -94,7 +94,7 @@ FunctorCode Syllable::Accept(ConstFunctor &functor) const return functor.VisitSyllable(this); } -FunctorCode Syllable::AcceptEnd(MutableFunctor &functor) +FunctorCode Syllable::AcceptEnd(Functor &functor) { return functor.VisitSyllableEnd(this); } diff --git a/src/symbol.cpp b/src/symbol.cpp index 282a08f73a..b92913824d 100644 --- a/src/symbol.cpp +++ b/src/symbol.cpp @@ -70,7 +70,7 @@ char32_t Symbol::GetSymbolGlyph() const return 0; } -FunctorCode Symbol::Accept(MutableFunctor &functor) +FunctorCode Symbol::Accept(Functor &functor) { return functor.VisitSymbol(this); } @@ -80,7 +80,7 @@ FunctorCode Symbol::Accept(ConstFunctor &functor) const return functor.VisitSymbol(this); } -FunctorCode Symbol::AcceptEnd(MutableFunctor &functor) +FunctorCode Symbol::AcceptEnd(Functor &functor) { return functor.VisitSymbolEnd(this); } diff --git a/src/system.cpp b/src/system.cpp index 7b50793a5f..01cb33b146 100644 --- a/src/system.cpp +++ b/src/system.cpp @@ -484,7 +484,7 @@ void System::ConvertToUnCastOffMensuralSystem() // System functor methods //---------------------------------------------------------------------------- -FunctorCode System::Accept(MutableFunctor &functor) +FunctorCode System::Accept(Functor &functor) { return functor.VisitSystem(this); } @@ -494,7 +494,7 @@ FunctorCode System::Accept(ConstFunctor &functor) const return functor.VisitSystem(this); } -FunctorCode System::AcceptEnd(MutableFunctor &functor) +FunctorCode System::AcceptEnd(Functor &functor) { return functor.VisitSystemEnd(this); } diff --git a/src/systemelement.cpp b/src/systemelement.cpp index 0eefd7980b..ffe791359c 100644 --- a/src/systemelement.cpp +++ b/src/systemelement.cpp @@ -58,7 +58,7 @@ void SystemElement::Reset() // Functor methods //---------------------------------------------------------------------------- -FunctorCode SystemElement::Accept(MutableFunctor &functor) +FunctorCode SystemElement::Accept(Functor &functor) { return functor.VisitSystemElement(this); } @@ -68,7 +68,7 @@ FunctorCode SystemElement::Accept(ConstFunctor &functor) const return functor.VisitSystemElement(this); } -FunctorCode SystemElement::AcceptEnd(MutableFunctor &functor) +FunctorCode SystemElement::AcceptEnd(Functor &functor) { return functor.VisitSystemElementEnd(this); } diff --git a/src/systemmilestone.cpp b/src/systemmilestone.cpp index 5a30a1058e..2b570090df 100644 --- a/src/systemmilestone.cpp +++ b/src/systemmilestone.cpp @@ -81,7 +81,7 @@ void SystemMilestoneInterface::ConvertToPageBasedMilestone(Object *object, Objec // SystemMilestoneEnd functor methods //---------------------------------------------------------------------------- -FunctorCode SystemMilestoneEnd::Accept(MutableFunctor &functor) +FunctorCode SystemMilestoneEnd::Accept(Functor &functor) { return functor.VisitSystemMilestone(this); } @@ -91,7 +91,7 @@ FunctorCode SystemMilestoneEnd::Accept(ConstFunctor &functor) const return functor.VisitSystemMilestone(this); } -FunctorCode SystemMilestoneEnd::AcceptEnd(MutableFunctor &functor) +FunctorCode SystemMilestoneEnd::AcceptEnd(Functor &functor) { return functor.VisitSystemMilestoneEnd(this); } diff --git a/src/tabdursym.cpp b/src/tabdursym.cpp index 040bd686ff..21d03c05f6 100644 --- a/src/tabdursym.cpp +++ b/src/tabdursym.cpp @@ -129,7 +129,7 @@ int TabDurSym::CalcStemLenInThirdUnits(const Staff *staff, data_STEMDIRECTION st // Functors methods //---------------------------------------------------------------------------- -FunctorCode TabDurSym::Accept(MutableFunctor &functor) +FunctorCode TabDurSym::Accept(Functor &functor) { return functor.VisitTabDurSym(this); } @@ -139,7 +139,7 @@ FunctorCode TabDurSym::Accept(ConstFunctor &functor) const return functor.VisitTabDurSym(this); } -FunctorCode TabDurSym::AcceptEnd(MutableFunctor &functor) +FunctorCode TabDurSym::AcceptEnd(Functor &functor) { return functor.VisitTabDurSymEnd(this); } diff --git a/src/tabgrp.cpp b/src/tabgrp.cpp index 5e76de9765..52a3a7183a 100644 --- a/src/tabgrp.cpp +++ b/src/tabgrp.cpp @@ -116,7 +116,7 @@ const Note *TabGrp::GetBottomNote() const // Functor methods //---------------------------------------------------------------------------- -FunctorCode TabGrp::Accept(MutableFunctor &functor) +FunctorCode TabGrp::Accept(Functor &functor) { return functor.VisitTabGrp(this); } @@ -126,7 +126,7 @@ FunctorCode TabGrp::Accept(ConstFunctor &functor) const return functor.VisitTabGrp(this); } -FunctorCode TabGrp::AcceptEnd(MutableFunctor &functor) +FunctorCode TabGrp::AcceptEnd(Functor &functor) { return functor.VisitTabGrpEnd(this); } diff --git a/src/tempo.cpp b/src/tempo.cpp index 7d3fe9505d..bbe34690c4 100644 --- a/src/tempo.cpp +++ b/src/tempo.cpp @@ -86,7 +86,7 @@ int Tempo::GetDrawingXRelativeToStaff(int staffN) const return this->GetStart()->GetDrawingX() + m_relativeX; } -FunctorCode Tempo::Accept(MutableFunctor &functor) +FunctorCode Tempo::Accept(Functor &functor) { return functor.VisitTempo(this); } @@ -96,7 +96,7 @@ FunctorCode Tempo::Accept(ConstFunctor &functor) const return functor.VisitTempo(this); } -FunctorCode Tempo::AcceptEnd(MutableFunctor &functor) +FunctorCode Tempo::AcceptEnd(Functor &functor) { return functor.VisitTempoEnd(this); } diff --git a/src/text.cpp b/src/text.cpp index 28ef2cfb94..7cc70355ae 100644 --- a/src/text.cpp +++ b/src/text.cpp @@ -35,7 +35,7 @@ void Text::Reset() TextElement::Reset(); } -FunctorCode Text::Accept(MutableFunctor &functor) +FunctorCode Text::Accept(Functor &functor) { return functor.VisitText(this); } @@ -45,7 +45,7 @@ FunctorCode Text::Accept(ConstFunctor &functor) const return functor.VisitText(this); } -FunctorCode Text::AcceptEnd(MutableFunctor &functor) +FunctorCode Text::AcceptEnd(Functor &functor) { return functor.VisitTextEnd(this); } diff --git a/src/textelement.cpp b/src/textelement.cpp index 522650104e..aab3720bad 100644 --- a/src/textelement.cpp +++ b/src/textelement.cpp @@ -113,7 +113,7 @@ void TextElement::SetDrawingYRel(int drawingYRel) // Functors methods //---------------------------------------------------------------------------- -FunctorCode TextElement::Accept(MutableFunctor &functor) +FunctorCode TextElement::Accept(Functor &functor) { return functor.VisitTextElement(this); } @@ -123,7 +123,7 @@ FunctorCode TextElement::Accept(ConstFunctor &functor) const return functor.VisitTextElement(this); } -FunctorCode TextElement::AcceptEnd(MutableFunctor &functor) +FunctorCode TextElement::AcceptEnd(Functor &functor) { return functor.VisitTextElementEnd(this); } diff --git a/src/tie.cpp b/src/tie.cpp index 826e4d09a2..699ccc4003 100644 --- a/src/tie.cpp +++ b/src/tie.cpp @@ -593,7 +593,7 @@ void Tie::UpdateTiePositioning(const FloatingCurvePositioner *curve, Point bezie // Tie functor methods //---------------------------------------------------------------------------- -FunctorCode Tie::Accept(MutableFunctor &functor) +FunctorCode Tie::Accept(Functor &functor) { return functor.VisitTie(this); } @@ -603,7 +603,7 @@ FunctorCode Tie::Accept(ConstFunctor &functor) const return functor.VisitTie(this); } -FunctorCode Tie::AcceptEnd(MutableFunctor &functor) +FunctorCode Tie::AcceptEnd(Functor &functor) { return functor.VisitTieEnd(this); } diff --git a/src/timestamp.cpp b/src/timestamp.cpp index dafd5969e1..da4a52e682 100644 --- a/src/timestamp.cpp +++ b/src/timestamp.cpp @@ -40,7 +40,7 @@ double TimestampAttr::GetTimestampAttrAlignmentDuration(int meterUnit) const return DUR_MAX / meterUnit * m_actualDurPos; } -FunctorCode TimestampAttr::Accept(MutableFunctor &functor) +FunctorCode TimestampAttr::Accept(Functor &functor) { return functor.VisitTimestamp(this); } @@ -50,7 +50,7 @@ FunctorCode TimestampAttr::Accept(ConstFunctor &functor) const return functor.VisitTimestamp(this); } -FunctorCode TimestampAttr::AcceptEnd(MutableFunctor &functor) +FunctorCode TimestampAttr::AcceptEnd(Functor &functor) { return functor.VisitTimestampEnd(this); } diff --git a/src/trill.cpp b/src/trill.cpp index 581f1869c9..58334943fa 100644 --- a/src/trill.cpp +++ b/src/trill.cpp @@ -88,7 +88,7 @@ char32_t Trill::GetTrillGlyph() const // Trill functor methods //---------------------------------------------------------------------------- -FunctorCode Trill::Accept(MutableFunctor &functor) +FunctorCode Trill::Accept(Functor &functor) { return functor.VisitTrill(this); } @@ -98,7 +98,7 @@ FunctorCode Trill::Accept(ConstFunctor &functor) const return functor.VisitTrill(this); } -FunctorCode Trill::AcceptEnd(MutableFunctor &functor) +FunctorCode Trill::AcceptEnd(Functor &functor) { return functor.VisitTrillEnd(this); } diff --git a/src/tuning.cpp b/src/tuning.cpp index 67ae4f5571..7ebbdc1e4b 100644 --- a/src/tuning.cpp +++ b/src/tuning.cpp @@ -203,7 +203,7 @@ int Tuning::CalcPitchNumber(int course, int fret, data_NOTATIONTYPE notationType // Functor methods //---------------------------------------------------------------------------- -FunctorCode Tuning::Accept(MutableFunctor &functor) +FunctorCode Tuning::Accept(Functor &functor) { return functor.VisitTuning(this); } @@ -213,7 +213,7 @@ FunctorCode Tuning::Accept(ConstFunctor &functor) const return functor.VisitTuning(this); } -FunctorCode Tuning::AcceptEnd(MutableFunctor &functor) +FunctorCode Tuning::AcceptEnd(Functor &functor) { return functor.VisitTuningEnd(this); } diff --git a/src/tuplet.cpp b/src/tuplet.cpp index 517bd46f82..5b7d2a29f5 100644 --- a/src/tuplet.cpp +++ b/src/tuplet.cpp @@ -324,7 +324,7 @@ void Tuplet::GetDrawingLeftRightXRel(int &xRelLeft, int &xRelRight, const Doc *d // Functors methods //---------------------------------------------------------------------------- -FunctorCode Tuplet::Accept(MutableFunctor &functor) +FunctorCode Tuplet::Accept(Functor &functor) { return functor.VisitTuplet(this); } @@ -334,7 +334,7 @@ FunctorCode Tuplet::Accept(ConstFunctor &functor) const return functor.VisitTuplet(this); } -FunctorCode Tuplet::AcceptEnd(MutableFunctor &functor) +FunctorCode Tuplet::AcceptEnd(Functor &functor) { return functor.VisitTupletEnd(this); } diff --git a/src/turn.cpp b/src/turn.cpp index 21f338ef56..4de99c0d33 100644 --- a/src/turn.cpp +++ b/src/turn.cpp @@ -99,7 +99,7 @@ int Turn::GetTurnHeight(const Doc *doc, int staffSize) const // Turn functor methods //---------------------------------------------------------------------------- -FunctorCode Turn::Accept(MutableFunctor &functor) +FunctorCode Turn::Accept(Functor &functor) { return functor.VisitTurn(this); } @@ -109,7 +109,7 @@ FunctorCode Turn::Accept(ConstFunctor &functor) const return functor.VisitTurn(this); } -FunctorCode Turn::AcceptEnd(MutableFunctor &functor) +FunctorCode Turn::AcceptEnd(Functor &functor) { return functor.VisitTurnEnd(this); } diff --git a/src/verse.cpp b/src/verse.cpp index e2e5cf1abb..66013ee926 100644 --- a/src/verse.cpp +++ b/src/verse.cpp @@ -106,7 +106,7 @@ int Verse::AdjustPosition(int &overlap, int freeSpace, const Doc *doc) // Verse functor methods //---------------------------------------------------------------------------- -FunctorCode Verse::Accept(MutableFunctor &functor) +FunctorCode Verse::Accept(Functor &functor) { return functor.VisitVerse(this); } @@ -116,7 +116,7 @@ FunctorCode Verse::Accept(ConstFunctor &functor) const return functor.VisitVerse(this); } -FunctorCode Verse::AcceptEnd(MutableFunctor &functor) +FunctorCode Verse::AcceptEnd(Functor &functor) { return functor.VisitVerseEnd(this); } diff --git a/src/verticalaligner.cpp b/src/verticalaligner.cpp index db24109f76..789bff6c80 100644 --- a/src/verticalaligner.cpp +++ b/src/verticalaligner.cpp @@ -250,7 +250,7 @@ SystemAligner::SpacingType SystemAligner::CalculateSpacingAbove(const StaffDef * return spacingType; } -FunctorCode SystemAligner::Accept(MutableFunctor &functor) +FunctorCode SystemAligner::Accept(Functor &functor) { return functor.VisitSystemAligner(this); } @@ -260,7 +260,7 @@ FunctorCode SystemAligner::Accept(ConstFunctor &functor) const return functor.VisitSystemAligner(this); } -FunctorCode SystemAligner::AcceptEnd(MutableFunctor &functor) +FunctorCode SystemAligner::AcceptEnd(Functor &functor) { return functor.VisitSystemAlignerEnd(this); } @@ -713,7 +713,7 @@ void StaffAlignment::FindAllIntersectionPoints( // Functors methods //---------------------------------------------------------------------------- -FunctorCode StaffAlignment::Accept(MutableFunctor &functor) +FunctorCode StaffAlignment::Accept(Functor &functor) { return functor.VisitStaffAlignment(this); } @@ -723,7 +723,7 @@ FunctorCode StaffAlignment::Accept(ConstFunctor &functor) const return functor.VisitStaffAlignment(this); } -FunctorCode StaffAlignment::AcceptEnd(MutableFunctor &functor) +FunctorCode StaffAlignment::AcceptEnd(Functor &functor) { return functor.VisitStaffAlignmentEnd(this); } From 490a760f9d39c59440eb79afdb27a786adb2eb1e Mon Sep 17 00:00:00 2001 From: Klaus Rettinghaus Date: Mon, 8 May 2023 11:07:27 +0200 Subject: [PATCH 047/151] check enclosing --- src/view_text.cpp | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/src/view_text.cpp b/src/view_text.cpp index 1e12e1625b..4851627501 100644 --- a/src/view_text.cpp +++ b/src/view_text.cpp @@ -447,14 +447,15 @@ void View::DrawRend(DeviceContext *dc, Rend *rend, TextDrawingParams ¶ms) dc->GetFont()->SetPointSize(dc->GetFont()->GetPointSize() / SUPER_SCRIPT_FACTOR); } - // Do not render the box or circle if the content is empty - if (rend->HasContentBB()) { - if (rend->HasRend()) { - params.m_enclosedRend.push_back(rend); - params.m_x = rend->GetContentRight() + m_doc->GetDrawingUnit(100); - params.m_explicitPosition = true; - params.m_enclose = rend->GetRend(); - } + const bool isEnclosed = (rend->HasRend()) + ? (((rend->GetRend() - TEXTRENDITION_box) | (TEXTRENDITION_tbox - rend->GetRend())) >= 0) + : false; + // Do not render enclosings if the content is empty + if (rend->HasContentBB() && isEnclosed) { + params.m_enclosedRend.push_back(rend); + params.m_x = rend->GetContentRight() + m_doc->GetDrawingUnit(100); + params.m_explicitPosition = true; + params.m_enclose = rend->GetRend(); } if (customFont) { From 52f46ee6bae3cf25c324084c7d6ea20d03f1c8d5 Mon Sep 17 00:00:00 2001 From: Klaus Rettinghaus Date: Mon, 8 May 2023 11:17:34 +0200 Subject: [PATCH 048/151] add AttNumberlike to rend --- include/vrv/rend.h | 1 + src/iomei.cpp | 2 ++ src/rend.cpp | 3 +++ 3 files changed, 6 insertions(+) diff --git a/include/vrv/rend.h b/include/vrv/rend.h index b980e4fadb..e5140b061b 100644 --- a/include/vrv/rend.h +++ b/include/vrv/rend.h @@ -25,6 +25,7 @@ class Rend : public TextElement, public AreaPosInterface, public AttColor, public AttLang, + public AttNNumberLike, public AttTextRendition, public AttTypography, public AttWhitespace { diff --git a/src/iomei.cpp b/src/iomei.cpp index 46f61ada21..6ad23d368f 100644 --- a/src/iomei.cpp +++ b/src/iomei.cpp @@ -2891,6 +2891,7 @@ void MEIOutput::WriteRend(pugi::xml_node currentNode, Rend *rend) this->WriteAreaPosInterface(currentNode, rend); rend->WriteColor(currentNode); rend->WriteLang(currentNode); + rend->WriteNNumberLike(currentNode); rend->WriteTextRendition(currentNode); rend->WriteTypography(currentNode); rend->WriteWhitespace(currentNode); @@ -6985,6 +6986,7 @@ bool MEIInput::ReadRend(Object *parent, pugi::xml_node rend) vrvRend->ReadColor(rend); vrvRend->ReadLang(rend); + vrvRend->ReadNNumberLike(rend); vrvRend->ReadTextRendition(rend); vrvRend->ReadTypography(rend); vrvRend->ReadWhitespace(rend); diff --git a/src/rend.cpp b/src/rend.cpp index fbc8945a38..446d738922 100644 --- a/src/rend.cpp +++ b/src/rend.cpp @@ -35,6 +35,7 @@ Rend::Rend() , AreaPosInterface() , AttColor() , AttLang() + , AttNNumberLike() , AttTextRendition() , AttTypography() , AttWhitespace() @@ -42,6 +43,7 @@ Rend::Rend() this->RegisterInterface(AreaPosInterface::GetAttClasses(), AreaPosInterface::IsInterface()); this->RegisterAttClass(ATT_COLOR); this->RegisterAttClass(ATT_LANG); + this->RegisterAttClass(ATT_NNUMBERLIKE); this->RegisterAttClass(ATT_TEXTRENDITION); this->RegisterAttClass(ATT_TYPOGRAPHY); this->RegisterAttClass(ATT_WHITESPACE); @@ -57,6 +59,7 @@ void Rend::Reset() AreaPosInterface::Reset(); this->ResetColor(); this->ResetLang(); + this->ResetNNumberLike(); this->ResetTextRendition(); this->ResetTypography(); this->ResetWhitespace(); From 4164a72acc9e76447cdc06c94ac97aa627100483 Mon Sep 17 00:00:00 2001 From: Klaus Rettinghaus Date: Mon, 8 May 2023 11:22:49 +0200 Subject: [PATCH 049/151] remove extra custom graphic --- src/view_page.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/view_page.cpp b/src/view_page.cpp index 25727abe49..2b606c9a02 100644 --- a/src/view_page.cpp +++ b/src/view_page.cpp @@ -651,9 +651,7 @@ void View::DrawBrace(DeviceContext *dc, int x, int y1, int y2, int staffSize) const float currentWidthToHeightRatio = font->GetWidthToHeightRatio(); const float widthAfterScalling = width * scale; font->SetWidthToHeightRatio(static_cast(braceWidth) / widthAfterScalling); - dc->StartCustomGraphic("grpSym"); this->DrawSmuflCode(dc, x, y2, SMUFL_E000_brace, staffSize * scale, false); - dc->EndCustomGraphic(); font->SetWidthToHeightRatio(currentWidthToHeightRatio); return; } From b851e7326109354ce1ecbeeb7edd986b5df0c40f Mon Sep 17 00:00:00 2001 From: David Bauer Date: Mon, 8 May 2023 11:32:03 +0200 Subject: [PATCH 050/151] Add base constructor call --- src/adjustxoverflowfunctor.cpp | 2 +- src/adjustxrelfortranscriptionfunctor.cpp | 2 +- src/castofffunctor.cpp | 2 +- src/convertfunctor.cpp | 8 ++--- src/findfunctor.cpp | 12 ++++---- src/findlayerelementsfunctor.cpp | 1 + src/midifunctor.cpp | 14 ++++----- src/miscfunctor.cpp | 8 ++--- src/preparedatafunctor.cpp | 36 +++++++++++------------ src/resetfunctor.cpp | 6 ++-- src/savefunctor.cpp | 2 +- src/setscoredeffunctor.cpp | 9 +++--- 12 files changed, 53 insertions(+), 49 deletions(-) diff --git a/src/adjustxoverflowfunctor.cpp b/src/adjustxoverflowfunctor.cpp index 15c29f0362..07991256a0 100644 --- a/src/adjustxoverflowfunctor.cpp +++ b/src/adjustxoverflowfunctor.cpp @@ -22,7 +22,7 @@ namespace vrv { // AdjustXOverflowFunctor //---------------------------------------------------------------------------- -AdjustXOverflowFunctor::AdjustXOverflowFunctor(int margin) +AdjustXOverflowFunctor::AdjustXOverflowFunctor(int margin) : Functor() { m_currentSystem = NULL; m_lastMeasure = NULL; diff --git a/src/adjustxrelfortranscriptionfunctor.cpp b/src/adjustxrelfortranscriptionfunctor.cpp index eebd018945..c4e4c1f20d 100644 --- a/src/adjustxrelfortranscriptionfunctor.cpp +++ b/src/adjustxrelfortranscriptionfunctor.cpp @@ -17,7 +17,7 @@ namespace vrv { // AdjustXRelForTranscriptionFunctor //---------------------------------------------------------------------------- -AdjustXRelForTranscriptionFunctor::AdjustXRelForTranscriptionFunctor() {} +AdjustXRelForTranscriptionFunctor::AdjustXRelForTranscriptionFunctor() : Functor() {} FunctorCode AdjustXRelForTranscriptionFunctor::VisitLayerElement(LayerElement *layerElement) { diff --git a/src/castofffunctor.cpp b/src/castofffunctor.cpp index 6838fd92aa..5fd1e7d3c6 100644 --- a/src/castofffunctor.cpp +++ b/src/castofffunctor.cpp @@ -505,7 +505,7 @@ FunctorCode CastOffEncodingFunctor::VisitSystemElement(SystemElement *systemElem // UnCastOffFunctor //---------------------------------------------------------------------------- -UnCastOffFunctor::UnCastOffFunctor(Page *page) +UnCastOffFunctor::UnCastOffFunctor(Page *page) : Functor() { m_page = page; m_currentSystem = NULL; diff --git a/src/convertfunctor.cpp b/src/convertfunctor.cpp index 3636a1d11b..3c99b20277 100644 --- a/src/convertfunctor.cpp +++ b/src/convertfunctor.cpp @@ -32,7 +32,7 @@ namespace vrv { // ConvertToPageBasedFunctor //---------------------------------------------------------------------------- -ConvertToPageBasedFunctor::ConvertToPageBasedFunctor(Page *page) +ConvertToPageBasedFunctor::ConvertToPageBasedFunctor(Page *page) : Functor() { m_currentSystem = NULL; m_page = page; @@ -361,7 +361,7 @@ FunctorCode ConvertToCastOffMensuralFunctor::VisitSystemElement(SystemElement *s // ConvertToUnCastOffMensuralFunctor //---------------------------------------------------------------------------- -ConvertToUnCastOffMensuralFunctor::ConvertToUnCastOffMensuralFunctor() +ConvertToUnCastOffMensuralFunctor::ConvertToUnCastOffMensuralFunctor() : Functor() { this->ResetContent(); m_trackSegmentsToDelete = true; @@ -408,7 +408,7 @@ FunctorCode ConvertToUnCastOffMensuralFunctor::VisitSection(Section *section) // ConvertMarkupAnalyticalFunctor //---------------------------------------------------------------------------- -ConvertMarkupAnalyticalFunctor::ConvertMarkupAnalyticalFunctor(bool permanent) +ConvertMarkupAnalyticalFunctor::ConvertMarkupAnalyticalFunctor(bool permanent) : Functor() { m_currentChord = NULL; m_permanent = permanent; @@ -543,7 +543,7 @@ void ConvertMarkupAnalyticalFunctor::ConvertToFermata( // ConvertMarkupArticFunctor //---------------------------------------------------------------------------- -ConvertMarkupArticFunctor::ConvertMarkupArticFunctor() {} +ConvertMarkupArticFunctor::ConvertMarkupArticFunctor() : Functor() {} FunctorCode ConvertMarkupArticFunctor::VisitArtic(Artic *artic) { diff --git a/src/findfunctor.cpp b/src/findfunctor.cpp index af1623c38d..7efa54ad70 100644 --- a/src/findfunctor.cpp +++ b/src/findfunctor.cpp @@ -145,7 +145,7 @@ FunctorCode FindByComparisonFunctor::VisitObject(const Object *object) // FindByIDFunctor //---------------------------------------------------------------------------- -FindByIDFunctor::FindByIDFunctor(const std::string &id) +FindByIDFunctor::FindByIDFunctor(const std::string &id) : ConstFunctor() { m_id = id; m_element = NULL; @@ -171,6 +171,7 @@ FunctorCode FindByIDFunctor::VisitObject(const Object *object) //---------------------------------------------------------------------------- FindNextChildByComparisonFunctor::FindNextChildByComparisonFunctor(Comparison *comparison, const Object *start) + : ConstFunctor() { m_comparison = comparison; m_start = start; @@ -204,6 +205,7 @@ FunctorCode FindNextChildByComparisonFunctor::VisitObject(const Object *object) //---------------------------------------------------------------------------- FindPreviousChildByComparisonFunctor::FindPreviousChildByComparisonFunctor(Comparison *comparison, const Object *start) + : ConstFunctor() { m_comparison = comparison; m_start = start; @@ -230,7 +232,7 @@ FunctorCode FindPreviousChildByComparisonFunctor::VisitObject(const Object *obje // FindExtremeByComparisonFunctor //---------------------------------------------------------------------------- -FindExtremeByComparisonFunctor::FindExtremeByComparisonFunctor(Comparison *comparison) +FindExtremeByComparisonFunctor::FindExtremeByComparisonFunctor(Comparison *comparison) : ConstFunctor() { m_comparison = comparison; m_element = NULL; @@ -250,7 +252,7 @@ FunctorCode FindExtremeByComparisonFunctor::VisitObject(const Object *object) // FindAllReferencedObjectsFunctor //---------------------------------------------------------------------------- -FindAllReferencedObjectsFunctor::FindAllReferencedObjectsFunctor(ListOfObjects *elements) +FindAllReferencedObjectsFunctor::FindAllReferencedObjectsFunctor(ListOfObjects *elements) : Functor() { m_elements = elements; m_milestoneReferences = false; @@ -303,7 +305,7 @@ FunctorCode FindAllReferencedObjectsFunctor::VisitObject(Object *object) // FindElementInLayerStaffDefFunctor //---------------------------------------------------------------------------- -FindElementInLayerStaffDefFunctor::FindElementInLayerStaffDefFunctor(const std::string &xmlId) +FindElementInLayerStaffDefFunctor::FindElementInLayerStaffDefFunctor(const std::string &xmlId) : ConstFunctor() { m_id = xmlId; m_element = NULL; @@ -336,7 +338,7 @@ FunctorCode FindElementInLayerStaffDefFunctor::VisitLayer(const Layer *layer) // AddToFlatListFunctor //---------------------------------------------------------------------------- -AddToFlatListFunctor::AddToFlatListFunctor(ListOfConstObjects *flatList) +AddToFlatListFunctor::AddToFlatListFunctor(ListOfConstObjects *flatList) : ConstFunctor() { m_flatList = flatList; } diff --git a/src/findlayerelementsfunctor.cpp b/src/findlayerelementsfunctor.cpp index 75ae96e2a7..021e969e31 100644 --- a/src/findlayerelementsfunctor.cpp +++ b/src/findlayerelementsfunctor.cpp @@ -249,6 +249,7 @@ FunctorCode FindSpannedLayerElementsFunctor::VisitMeasure(const Measure *measure GetRelativeLayerElementFunctor::GetRelativeLayerElementFunctor( int elementIndex, bool searchDirection, bool anotherLayer) + : ConstFunctor() { m_relativeElement = NULL; m_initialElementIndex = elementIndex; diff --git a/src/midifunctor.cpp b/src/midifunctor.cpp index b4814a380b..57873eaa0d 100644 --- a/src/midifunctor.cpp +++ b/src/midifunctor.cpp @@ -40,7 +40,7 @@ namespace vrv { // InitOnsetOffsetFunctor //---------------------------------------------------------------------------- -InitOnsetOffsetFunctor::InitOnsetOffsetFunctor() +InitOnsetOffsetFunctor::InitOnsetOffsetFunctor() : Functor() { m_currentScoreTime = 0.0; m_currentRealTimeSeconds = 0.0; @@ -197,7 +197,7 @@ FunctorCode InitOnsetOffsetFunctor::VisitTabGrpEnd(TabGrp *tabGrp) // InitMaxMeasureDurationFunctor //---------------------------------------------------------------------------- -InitMaxMeasureDurationFunctor::InitMaxMeasureDurationFunctor() +InitMaxMeasureDurationFunctor::InitMaxMeasureDurationFunctor() : Functor() { m_currentScoreTime = 0.0; m_currentRealTimeSeconds = 0.0; @@ -268,7 +268,7 @@ FunctorCode InitMaxMeasureDurationFunctor::VisitTempo(Tempo *tempo) // InitTimemapTiesFunctor //---------------------------------------------------------------------------- -InitTimemapTiesFunctor::InitTimemapTiesFunctor() {} +InitTimemapTiesFunctor::InitTimemapTiesFunctor() : Functor() {} FunctorCode InitTimemapTiesFunctor::VisitTie(Tie *tie) { @@ -297,7 +297,7 @@ FunctorCode InitTimemapTiesFunctor::VisitTie(Tie *tie) // InitMidiFunctor //---------------------------------------------------------------------------- -InitMIDIFunctor::InitMIDIFunctor() +InitMIDIFunctor::InitMIDIFunctor() : ConstFunctor() { m_currentTempo = MIDI_TEMPO; } @@ -337,7 +337,7 @@ FunctorCode InitMIDIFunctor::VisitMeasure(const Measure *measure) // GenerateMIDIFunctor //---------------------------------------------------------------------------- -GenerateMIDIFunctor::GenerateMIDIFunctor(smf::MidiFile *midiFile) +GenerateMIDIFunctor::GenerateMIDIFunctor(smf::MidiFile *midiFile) : ConstFunctor() { m_midiFile = midiFile; m_midiTrack = 1; @@ -867,7 +867,7 @@ void GenerateMIDIFunctor::GenerateGraceNoteMIDI( // GenerateTimemapFunctor //---------------------------------------------------------------------------- -GenerateTimemapFunctor::GenerateTimemapFunctor(Timemap *timemap) +GenerateTimemapFunctor::GenerateTimemapFunctor(Timemap *timemap) : ConstFunctor() { m_scoreTimeOffset = 0.0; m_realTimeOffsetMilliseconds = 0.0; @@ -991,7 +991,7 @@ void GenerateTimemapFunctor::AddTimemapEntry(const Object *object) // GenerateFeaturesFunctor //---------------------------------------------------------------------------- -GenerateFeaturesFunctor::GenerateFeaturesFunctor(FeatureExtractor *extractor) +GenerateFeaturesFunctor::GenerateFeaturesFunctor(FeatureExtractor *extractor) : ConstFunctor() { m_extractor = extractor; } diff --git a/src/miscfunctor.cpp b/src/miscfunctor.cpp index f8c253a265..c592281c49 100644 --- a/src/miscfunctor.cpp +++ b/src/miscfunctor.cpp @@ -23,7 +23,7 @@ namespace vrv { // ApplyPPUFactorFunctor //---------------------------------------------------------------------------- -ApplyPPUFactorFunctor::ApplyPPUFactorFunctor() +ApplyPPUFactorFunctor::ApplyPPUFactorFunctor() : Functor() { m_page = NULL; } @@ -79,7 +79,7 @@ FunctorCode ApplyPPUFactorFunctor::VisitSystem(System *system) // GetAlignmentLeftRightFunctor //---------------------------------------------------------------------------- -GetAlignmentLeftRightFunctor::GetAlignmentLeftRightFunctor() +GetAlignmentLeftRightFunctor::GetAlignmentLeftRightFunctor() : ConstFunctor() { m_minLeft = -VRV_UNSET; m_maxRight = VRV_UNSET; @@ -103,7 +103,7 @@ FunctorCode GetAlignmentLeftRightFunctor::VisitObject(const Object *object) // InitProcessingListsFunctor //---------------------------------------------------------------------------- -InitProcessingListsFunctor::InitProcessingListsFunctor() {} +InitProcessingListsFunctor::InitProcessingListsFunctor() : ConstFunctor() {} FunctorCode InitProcessingListsFunctor::VisitLayer(const Layer *layer) { @@ -129,7 +129,7 @@ FunctorCode InitProcessingListsFunctor::VisitVerse(const Verse *verse) // ReorderByXPosFunctor //---------------------------------------------------------------------------- -ReorderByXPosFunctor::ReorderByXPosFunctor() {} +ReorderByXPosFunctor::ReorderByXPosFunctor() : Functor() {} FunctorCode ReorderByXPosFunctor::VisitObject(Object *object) { diff --git a/src/preparedatafunctor.cpp b/src/preparedatafunctor.cpp index ce1b7e31c1..8be9b6407f 100644 --- a/src/preparedatafunctor.cpp +++ b/src/preparedatafunctor.cpp @@ -112,7 +112,7 @@ FunctorCode PrepareDataInitializationFunctor::VisitScore(Score *score) // PrepareCueSizeFunctor //---------------------------------------------------------------------------- -PrepareCueSizeFunctor::PrepareCueSizeFunctor() {} +PrepareCueSizeFunctor::PrepareCueSizeFunctor() : Functor() {} FunctorCode PrepareCueSizeFunctor::VisitLayerElement(LayerElement *layerElement) { @@ -176,7 +176,7 @@ FunctorCode PrepareCueSizeFunctor::VisitLayerElement(LayerElement *layerElement) // PrepareCrossStaffFunctor //---------------------------------------------------------------------------- -PrepareCrossStaffFunctor::PrepareCrossStaffFunctor() +PrepareCrossStaffFunctor::PrepareCrossStaffFunctor() : Functor() { m_currentMeasure = NULL; m_currentCrossStaff = NULL; @@ -314,7 +314,7 @@ FunctorCode PrepareCrossStaffFunctor::VisitMeasure(Measure *measure) // PrepareAltSymFunctor //---------------------------------------------------------------------------- -PrepareAltSymFunctor::PrepareAltSymFunctor() +PrepareAltSymFunctor::PrepareAltSymFunctor() : Functor() { m_symbolTable = NULL; } @@ -340,7 +340,7 @@ FunctorCode PrepareAltSymFunctor::VisitObject(Object *object) // PrepareFacsimileFunctor //---------------------------------------------------------------------------- -PrepareFacsimileFunctor::PrepareFacsimileFunctor(Facsimile *facsimile) +PrepareFacsimileFunctor::PrepareFacsimileFunctor(Facsimile *facsimile) : Functor() { m_facsimile = facsimile; } @@ -371,7 +371,7 @@ FunctorCode PrepareFacsimileFunctor::VisitObject(Object *object) // PrepareLinkingFunctor //---------------------------------------------------------------------------- -PrepareLinkingFunctor::PrepareLinkingFunctor() +PrepareLinkingFunctor::PrepareLinkingFunctor() : Functor() { m_fillMode = true; } @@ -470,7 +470,7 @@ void PrepareLinkingFunctor::ResolveStemSameas(Note *note) // PreparePlistFunctor //---------------------------------------------------------------------------- -PreparePlistFunctor::PreparePlistFunctor() +PreparePlistFunctor::PreparePlistFunctor() : Functor() { m_fillMode = true; } @@ -507,7 +507,7 @@ FunctorCode PreparePlistFunctor::VisitObject(Object *object) // PrepareDurationFunctor //---------------------------------------------------------------------------- -PrepareDurationFunctor::PrepareDurationFunctor() +PrepareDurationFunctor::PrepareDurationFunctor() : Functor() { m_durDefault = DURATION_NONE; } @@ -560,7 +560,7 @@ FunctorCode PrepareDurationFunctor::VisitStaffDef(StaffDef *staffDef) // PrepareTimePointingFunctor //---------------------------------------------------------------------------- -PrepareTimePointingFunctor::PrepareTimePointingFunctor() {} +PrepareTimePointingFunctor::PrepareTimePointingFunctor() : Functor() {} void PrepareTimePointingFunctor::InsertInterfaceIDTuple(ClassId classID, TimePointInterface *interface) { @@ -630,7 +630,7 @@ FunctorCode PrepareTimePointingFunctor::VisitMeasureEnd(Measure *measure) // PrepareTimeSpanningFunctor //---------------------------------------------------------------------------- -PrepareTimeSpanningFunctor::PrepareTimeSpanningFunctor() +PrepareTimeSpanningFunctor::PrepareTimeSpanningFunctor() : Functor() { m_fillMode = true; } @@ -708,7 +708,7 @@ FunctorCode PrepareTimeSpanningFunctor::VisitMeasureEnd(Measure *measure) // PrepareTimestampsFunctor //---------------------------------------------------------------------------- -PrepareTimestampsFunctor::PrepareTimestampsFunctor() {} +PrepareTimestampsFunctor::PrepareTimestampsFunctor() : Functor() {} void PrepareTimestampsFunctor::InsertInterfaceIDPair(ClassId classID, TimeSpanningInterface *interface) { @@ -855,7 +855,7 @@ FunctorCode PrepareTimestampsFunctor::VisitMeasureEnd(Measure *measure) // PreparePointersByLayerFunctor //---------------------------------------------------------------------------- -PreparePointersByLayerFunctor::PreparePointersByLayerFunctor() +PreparePointersByLayerFunctor::PreparePointersByLayerFunctor() : Functor() { m_currentElement = NULL; m_lastDot = NULL; @@ -893,7 +893,7 @@ FunctorCode PreparePointersByLayerFunctor::VisitLayerElement(LayerElement *layer // PrepareLyricsFunctor //---------------------------------------------------------------------------- -PrepareLyricsFunctor::PrepareLyricsFunctor() +PrepareLyricsFunctor::PrepareLyricsFunctor() : Functor() { m_currentSyl = NULL; m_lastNoteOrChord = NULL; @@ -990,7 +990,7 @@ FunctorCode PrepareLyricsFunctor::VisitSyl(Syl *syl) // PrepareLayerElementPartsFunctor //---------------------------------------------------------------------------- -PrepareLayerElementPartsFunctor::PrepareLayerElementPartsFunctor() {} +PrepareLayerElementPartsFunctor::PrepareLayerElementPartsFunctor() : Functor() {} FunctorCode PrepareLayerElementPartsFunctor::VisitChord(Chord *chord) { @@ -1334,7 +1334,7 @@ FunctorCode PrepareRptFunctor::VisitStaff(Staff *staff) // PrepareDelayedTurnsFunctor //---------------------------------------------------------------------------- -PrepareDelayedTurnsFunctor::PrepareDelayedTurnsFunctor() +PrepareDelayedTurnsFunctor::PrepareDelayedTurnsFunctor() : Functor() { m_fillMode = true; this->ResetCurrent(); @@ -1400,7 +1400,7 @@ FunctorCode PrepareDelayedTurnsFunctor::VisitTurn(Turn *turn) // PrepareMilestonesFunctor //---------------------------------------------------------------------------- -PrepareMilestonesFunctor::PrepareMilestonesFunctor() +PrepareMilestonesFunctor::PrepareMilestonesFunctor() : Functor() { m_lastMeasure = NULL; m_currentEnding = NULL; @@ -1695,7 +1695,7 @@ FunctorCode PrepareFloatingGrpsFunctor::VisitSystemMilestone(SystemMilestoneEnd // PrepareStaffCurrentTimeSpanningFunctor //---------------------------------------------------------------------------- -PrepareStaffCurrentTimeSpanningFunctor::PrepareStaffCurrentTimeSpanningFunctor() {} +PrepareStaffCurrentTimeSpanningFunctor::PrepareStaffCurrentTimeSpanningFunctor() : Functor() {} void PrepareStaffCurrentTimeSpanningFunctor::InsertTimeSpanningElement(Object *element) { @@ -1794,7 +1794,7 @@ FunctorCode PrepareStaffCurrentTimeSpanningFunctor::VisitSyl(Syl *syl) // PrepareRehPositionFunctor //---------------------------------------------------------------------------- -PrepareRehPositionFunctor::PrepareRehPositionFunctor() {} +PrepareRehPositionFunctor::PrepareRehPositionFunctor() : Functor() {} FunctorCode PrepareRehPositionFunctor::VisitReh(Reh *reh) { @@ -1810,7 +1810,7 @@ FunctorCode PrepareRehPositionFunctor::VisitReh(Reh *reh) // PrepareBeamSpanElementsFunctor //---------------------------------------------------------------------------- -PrepareBeamSpanElementsFunctor::PrepareBeamSpanElementsFunctor() {} +PrepareBeamSpanElementsFunctor::PrepareBeamSpanElementsFunctor() : Functor() {} FunctorCode PrepareBeamSpanElementsFunctor::VisitBeamSpan(BeamSpan *beamSpan) { diff --git a/src/resetfunctor.cpp b/src/resetfunctor.cpp index 86dbb1a1a0..d7e782dab3 100644 --- a/src/resetfunctor.cpp +++ b/src/resetfunctor.cpp @@ -45,7 +45,7 @@ namespace vrv { // ResetDataFunctor //---------------------------------------------------------------------------- -ResetDataFunctor::ResetDataFunctor() {} +ResetDataFunctor::ResetDataFunctor() : Functor() {} FunctorCode ResetDataFunctor::VisitAccid(Accid *accid) { @@ -412,7 +412,7 @@ FunctorCode ResetDataFunctor::VisitVerse(Verse *verse) // ResetHorizontalAlignmentFunctor //---------------------------------------------------------------------------- -ResetHorizontalAlignmentFunctor::ResetHorizontalAlignmentFunctor() {} +ResetHorizontalAlignmentFunctor::ResetHorizontalAlignmentFunctor() : Functor() {} FunctorCode ResetHorizontalAlignmentFunctor::VisitAccid(Accid *accid) { @@ -629,7 +629,7 @@ FunctorCode ResetHorizontalAlignmentFunctor::VisitTupletNum(TupletNum *tupletNum // ResetVerticalAlignmentFunctor //---------------------------------------------------------------------------- -ResetVerticalAlignmentFunctor::ResetVerticalAlignmentFunctor() {} +ResetVerticalAlignmentFunctor::ResetVerticalAlignmentFunctor() : Functor() {} FunctorCode ResetVerticalAlignmentFunctor::VisitArtic(Artic *artic) { diff --git a/src/savefunctor.cpp b/src/savefunctor.cpp index 75921788dd..641845a126 100644 --- a/src/savefunctor.cpp +++ b/src/savefunctor.cpp @@ -23,7 +23,7 @@ namespace vrv { // SaveFunctor //---------------------------------------------------------------------------- -SaveFunctor::SaveFunctor(Output *output, bool basic) +SaveFunctor::SaveFunctor(Output *output, bool basic) : Functor() { m_output = output; m_basic = basic; diff --git a/src/setscoredeffunctor.cpp b/src/setscoredeffunctor.cpp index ae3e990c6b..3c4a3458e4 100644 --- a/src/setscoredeffunctor.cpp +++ b/src/setscoredeffunctor.cpp @@ -28,6 +28,7 @@ namespace vrv { ReplaceDrawingValuesInStaffDefFunctor::ReplaceDrawingValuesInStaffDefFunctor(const Clef *clef, const KeySig *keySig, const Mensur *mensur, const MeterSig *meterSig, const MeterSigGrp *meterSigGrp) + : Functor() { m_clef = clef; m_keySig = keySig; @@ -491,7 +492,7 @@ FunctorCode ScoreDefOptimizeFunctor::VisitSystemEnd(System *system) // SetCautionaryScoreDefFunctor //---------------------------------------------------------------------------- -SetCautionaryScoreDefFunctor::SetCautionaryScoreDefFunctor(ScoreDef *currentScoreDef) +SetCautionaryScoreDefFunctor::SetCautionaryScoreDefFunctor(ScoreDef *currentScoreDef) : Functor() { m_currentScoreDef = currentScoreDef; m_currentStaffDef = NULL; @@ -524,7 +525,7 @@ FunctorCode SetCautionaryScoreDefFunctor::VisitObject(Object *object) // ScoreDefSetGrpSymFunctor //---------------------------------------------------------------------------- -ScoreDefSetGrpSymFunctor::ScoreDefSetGrpSymFunctor() {} +ScoreDefSetGrpSymFunctor::ScoreDefSetGrpSymFunctor() : Functor() {} FunctorCode ScoreDefSetGrpSymFunctor::VisitGrpSym(GrpSym *grpSym) { @@ -591,7 +592,7 @@ FunctorCode ScoreDefSetGrpSymFunctor::VisitSystem(System *system) // ScoreDefUnsetCurrentFunctor //---------------------------------------------------------------------------- -ScoreDefUnsetCurrentFunctor::ScoreDefUnsetCurrentFunctor() {} +ScoreDefUnsetCurrentFunctor::ScoreDefUnsetCurrentFunctor() : Functor() {} FunctorCode ScoreDefUnsetCurrentFunctor::VisitAlignmentReference(AlignmentReference *alignmentReference) { @@ -658,7 +659,7 @@ FunctorCode ScoreDefUnsetCurrentFunctor::VisitSystem(System *system) // SetStaffDefRedrawFlagsFunctor //---------------------------------------------------------------------------- -SetStaffDefRedrawFlagsFunctor::SetStaffDefRedrawFlagsFunctor(int redrawFlags) +SetStaffDefRedrawFlagsFunctor::SetStaffDefRedrawFlagsFunctor(int redrawFlags) : Functor() { m_redrawFlags = redrawFlags; } From 14390c4f2cc97a42ea2406773f3ac40745dd3b27 Mon Sep 17 00:00:00 2001 From: Klaus Rettinghaus Date: Tue, 9 May 2023 15:48:43 +0200 Subject: [PATCH 051/151] add helper to check for text enclosure --- include/vrv/rend.h | 8 +++++--- src/rend.cpp | 9 +++++++++ src/view_text.cpp | 5 +---- 3 files changed, 15 insertions(+), 7 deletions(-) diff --git a/include/vrv/rend.h b/include/vrv/rend.h index e5140b061b..7c35c3f2da 100644 --- a/include/vrv/rend.h +++ b/include/vrv/rend.h @@ -59,6 +59,11 @@ class Rend : public TextElement, */ bool IsSupportedChild(Object *object) override; + /** + * Check if rend has an enclosing. + */ + bool HasEnclosure() const; + //----------// // Functors // //----------// @@ -75,9 +80,6 @@ class Rend : public TextElement, private: // -public: - // -private: }; } // namespace vrv diff --git a/src/rend.cpp b/src/rend.cpp index 446d738922..d94e8bb7f1 100644 --- a/src/rend.cpp +++ b/src/rend.cpp @@ -91,6 +91,15 @@ bool Rend::IsSupportedChild(Object *child) return true; } +bool Rend::HasEnclosure() const +{ + if (!this->HasRend()) return false; + + const bool hasEnclosure = ((this->GetRend() == TEXTRENDITION_box) || (this->GetRend() == TEXTRENDITION_circle) + || (this->GetRend() == TEXTRENDITION_dbox) || (this->GetRend() == TEXTRENDITION_tbox)); + return hasEnclosure; +} + //---------------------------------------------------------------------------- // Functor methods //---------------------------------------------------------------------------- diff --git a/src/view_text.cpp b/src/view_text.cpp index 4851627501..56ab13022d 100644 --- a/src/view_text.cpp +++ b/src/view_text.cpp @@ -447,11 +447,8 @@ void View::DrawRend(DeviceContext *dc, Rend *rend, TextDrawingParams ¶ms) dc->GetFont()->SetPointSize(dc->GetFont()->GetPointSize() / SUPER_SCRIPT_FACTOR); } - const bool isEnclosed = (rend->HasRend()) - ? (((rend->GetRend() - TEXTRENDITION_box) | (TEXTRENDITION_tbox - rend->GetRend())) >= 0) - : false; // Do not render enclosings if the content is empty - if (rend->HasContentBB() && isEnclosed) { + if (rend->HasEnclosure()) { params.m_enclosedRend.push_back(rend); params.m_x = rend->GetContentRight() + m_doc->GetDrawingUnit(100); params.m_explicitPosition = true; From b053c3aa3d5c82de504c2342f4c5c54705b83fc5 Mon Sep 17 00:00:00 2001 From: Klaus Rettinghaus Date: Tue, 9 May 2023 16:05:10 +0200 Subject: [PATCH 052/151] revert removing placeholder --- include/vrv/rend.h | 3 +++ 1 file changed, 3 insertions(+) diff --git a/include/vrv/rend.h b/include/vrv/rend.h index 7c35c3f2da..71914ab397 100644 --- a/include/vrv/rend.h +++ b/include/vrv/rend.h @@ -80,6 +80,9 @@ class Rend : public TextElement, private: // +public: + // +private: }; } // namespace vrv From 3f688e354565232cd87c3c5627aab247cc5193be Mon Sep 17 00:00:00 2001 From: Greg Chapman <75333244+gregchapman-dev@users.noreply.github.com> Date: Tue, 9 May 2023 15:30:55 -0700 Subject: [PATCH 053/151] Fix two crashes with slightly improved NULL checking. --- src/layer.cpp | 2 ++ src/layerelement.cpp | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/layer.cpp b/src/layer.cpp index 5794673df3..c439ca9801 100644 --- a/src/layer.cpp +++ b/src/layer.cpp @@ -196,6 +196,8 @@ LayerElement *Layer::GetAtPos(int x) const LayerElement *Layer::GetAtPos(int x) const { const Object *first = this->GetFirst(); + if (!first) return NULL; + if (first->IsEditorialElement()) { IsEditorialElementComparison cmp; cmp.ReverseComparison(); diff --git a/src/layerelement.cpp b/src/layerelement.cpp index a54f519b5f..7ba098fa0c 100644 --- a/src/layerelement.cpp +++ b/src/layerelement.cpp @@ -1000,7 +1000,7 @@ int LayerElement::CalcLayerOverlap(const Doc *doc, int direction, int y1, int y2 const int currentTop = this->GetDrawingTop(doc, staff->m_drawingStaffSize); if (currentTop <= elementBottom) continue; const StemmedDrawingInterface *stemInterface = layerElement->GetStemmedDrawingInterface(); - if (sameDirElement || (stemInterface && (stemInterface->GetDrawingStemDir() == STEMDIRECTION_down))) { + if (stemInterface && (sameDirElement || (stemInterface->GetDrawingStemDir() == STEMDIRECTION_down))) { if (currentTop - stemInterface->GetDrawingStemLen() > currentTop) continue; leftMargin = unit + y1 - elementTop; rightMargin = unit + y2 - elementTop; From 43414e91d7b23bc93fbd4f0e61f52b239966a94f Mon Sep 17 00:00:00 2001 From: Klaus Rettinghaus Date: Wed, 10 May 2023 14:27:41 +0200 Subject: [PATCH 054/151] treat other-technical as glyph --- src/iomusxml.cpp | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/src/iomusxml.cpp b/src/iomusxml.cpp index 27b9ea69a3..cccae4dd61 100644 --- a/src/iomusxml.cpp +++ b/src/iomusxml.cpp @@ -3169,7 +3169,7 @@ void MusicXmlInput::ReadMusicXmlNote( const std::string technicalChildName = technicalChild.name(); // fingering is handled on the same level as breath marks, dynamics, etc. so we skip it here - if (technicalChildName == "fingering") continue; + if ((technicalChildName == "fingering") || (technicalChildName == "thumb-position")) continue; if (technicalChildName == "string") continue; // handled with fret if (technicalChildName == "fret") { @@ -3222,12 +3222,9 @@ void MusicXmlInput::ReadMusicXmlNote( pugi::xml_node articulation = technicalChild; Artic *artic = new Artic(); artics.push_back(ConvertArticulations(articulation.name())); - if (artics.back() == ARTICULATION_NONE) { - delete artic; - continue; - } - artic->SetArtic(artics); + if (artics.back() != ARTICULATION_NONE) artic->SetArtic(artics); artic->SetColor(articulation.attribute("color").as_string()); + artic->SetGlyphName(articulation.attribute("smufl").as_string()); artic->SetPlace( artic->AttPlacementRelEvent::StrToStaffrel(articulation.attribute("placement").as_string())); artic->SetType("technical"); From 56cee430987493c1e96ec422c81f9d7cac1cb00a Mon Sep 17 00:00:00 2001 From: Klaus Rettinghaus Date: Wed, 10 May 2023 14:28:48 +0200 Subject: [PATCH 055/151] add import for accidental-mark --- src/iomusxml.cpp | 28 ++++++++++------------------ 1 file changed, 10 insertions(+), 18 deletions(-) diff --git a/src/iomusxml.cpp b/src/iomusxml.cpp index cccae4dd61..32d3869f3a 100644 --- a/src/iomusxml.cpp +++ b/src/iomusxml.cpp @@ -2807,28 +2807,20 @@ void MusicXmlInput::ReadMusicXmlNote( // accidental pugi::xml_node accidental = node.child("accidental"); + if (!accidental) { + accidental = node.select_node("notations/accidental-mark").node(); + } if (accidental) { Accid *accid = new Accid(); accid->SetAccid(ConvertAccidentalToAccid(accidental.text().as_string())); accid->SetColor(accidental.attribute("color").as_string()); - bool isAttribute = true; - if (HasAttributeWithValue(accidental, "cautionary", "yes")) { - accid->SetFunc(accidLog_FUNC_caution); - isAttribute = false; - } - if (HasAttributeWithValue(accidental, "editorial", "yes")) { - accid->SetFunc(accidLog_FUNC_edit); - isAttribute = false; - } - if (HasAttributeWithValue(accidental, "bracket", "yes")) { - accid->SetEnclose(ENCLOSURE_brack); - isAttribute = false; - } - if (HasAttributeWithValue(accidental, "parentheses", "yes")) { - accid->SetEnclose(ENCLOSURE_paren); - isAttribute = false; - } - accid->IsAttribute(isAttribute); + accid->SetGlyphName(accidental.attribute("smufl").as_string()); + accid->SetPlace(accid->AttPlacementRelEvent::StrToStaffrel(accidental.attribute("placement").as_string())); + if (HasAttributeWithValue(accidental, "cautionary", "yes")) accid->SetFunc(accidLog_FUNC_caution); + if (HasAttributeWithValue(accidental, "editorial", "yes")) accid->SetFunc(accidLog_FUNC_edit); + if (HasAttributeWithValue(accidental, "bracket", "yes")) accid->SetEnclose(ENCLOSURE_brack); + if (HasAttributeWithValue(accidental, "parentheses", "yes")) accid->SetEnclose(ENCLOSURE_paren); + if (!strcmp(accidental.name(), "accidental-mark")) accid->SetOnstaff(BOOLEAN_false); note->AddChild(accid); } From 0badd27030ba3067e33c1f80deb13ccc16a35e90 Mon Sep 17 00:00:00 2001 From: Klaus Rettinghaus Date: Wed, 10 May 2023 14:28:58 +0200 Subject: [PATCH 056/151] fix missing check --- src/view_element.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/view_element.cpp b/src/view_element.cpp index c45269d558..c97689e04b 100644 --- a/src/view_element.cpp +++ b/src/view_element.cpp @@ -249,7 +249,7 @@ void View::DrawAccid(DeviceContext *dc, LayerElement *element, Layer *layer, Sta int x = accid->GetDrawingX(); int y = accid->GetDrawingY(); - if (accid->HasPlace() || (accid->GetFunc() == accidLog_FUNC_edit)) { + if (accid->HasPlace() || accid->HasOnstaff() || (accid->GetFunc() == accidLog_FUNC_edit)) { const int unit = m_doc->GetDrawingUnit(staff->m_drawingStaffSize); const int staffTop = staff->GetDrawingY(); const int staffBottom = staffTop - (staff->m_drawingLines - 1) * unit * 2; From 58d469f75fdbcebeaaf9a13db1617610f555b09a Mon Sep 17 00:00:00 2001 From: David Bauer Date: Wed, 10 May 2023 16:38:45 +0200 Subject: [PATCH 057/151] Drop BOM before conversion --- src/toolkit.cpp | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/toolkit.cpp b/src/toolkit.cpp index 7aa714721c..d320b89fa2 100644 --- a/src/toolkit.cpp +++ b/src/toolkit.cpp @@ -349,7 +349,7 @@ bool Toolkit::LoadUTF16File(const std::string &filename) fin.seekg(0, std::ios::end); std::streamsize wfileSize = (std::streamsize)fin.tellg(); fin.clear(); - // Skip the BOM + fin.seekg(0, std::wios::beg); std::u16string u16data((wfileSize / 2) + 1, '\0'); @@ -366,6 +366,11 @@ bool Toolkit::LoadUTF16File(const std::string &filename) }); } + // Skip the BOM + if (u16data.at(0) == u'\uFEFF') { + u16data.erase(0, 1); + } + std::wstring_convert, char16_t> convert; std::string utf8line = convert.to_bytes(u16data); From 6598270ae460839ad25208ea181bb9e1f84d20e9 Mon Sep 17 00:00:00 2001 From: Klaus Rettinghaus Date: Thu, 11 May 2023 10:42:12 +0200 Subject: [PATCH 058/151] add accidental-mark id --- src/iomusxml.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/iomusxml.cpp b/src/iomusxml.cpp index 32d3869f3a..d3928e0703 100644 --- a/src/iomusxml.cpp +++ b/src/iomusxml.cpp @@ -2816,6 +2816,7 @@ void MusicXmlInput::ReadMusicXmlNote( accid->SetColor(accidental.attribute("color").as_string()); accid->SetGlyphName(accidental.attribute("smufl").as_string()); accid->SetPlace(accid->AttPlacementRelEvent::StrToStaffrel(accidental.attribute("placement").as_string())); + if (accidental.attribute("id")) accid->SetID(accidental.attribute("id").as_string()); if (HasAttributeWithValue(accidental, "cautionary", "yes")) accid->SetFunc(accidLog_FUNC_caution); if (HasAttributeWithValue(accidental, "editorial", "yes")) accid->SetFunc(accidLog_FUNC_edit); if (HasAttributeWithValue(accidental, "bracket", "yes")) accid->SetEnclose(ENCLOSURE_brack); From cbe2888eaf765669430f906a25702c3291a7dc71 Mon Sep 17 00:00:00 2001 From: Klaus Rettinghaus Date: Thu, 11 May 2023 10:42:31 +0200 Subject: [PATCH 059/151] unify messages --- src/iomusxml.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/iomusxml.cpp b/src/iomusxml.cpp index d3928e0703..10dcf7deb4 100644 --- a/src/iomusxml.cpp +++ b/src/iomusxml.cpp @@ -1887,7 +1887,7 @@ void MusicXmlInput::ReadMusicXmlBarLine(pugi::xml_node node, Measure *measure, c measure->SetLeft(BARRENDITION_rptstart); } else if (HasAttributeWithValue(node, "location", "middle")) { - LogWarning("MusicXML import: Unsupported barline location 'middle' in %s.", measure->GetN().c_str()); + LogWarning("MusicXML import: Unsupported barline location 'middle' in %s", measure->GetN().c_str()); } else { measure->SetRight(BARRENDITION_rptend); @@ -2937,7 +2937,7 @@ void MusicXmlInput::ReadMusicXmlNote( chord = vrv_cast(m_elementStackMap.at(layer).back()); } if (!chord) { - LogError("MusicXML import: Chord starting point has not been found."); + LogError("MusicXML import: Chord starting point has not been found"); return; } // Mark a chord as cue=true if and only if all its child notes are cue. From 67fe812def436bdce3cb38081ffe29e0a461a73b Mon Sep 17 00:00:00 2001 From: Klaus Rettinghaus Date: Thu, 11 May 2023 10:56:55 +0200 Subject: [PATCH 060/151] reduce offset for breath and caesura --- src/iomusxml.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/iomusxml.cpp b/src/iomusxml.cpp index 10dcf7deb4..d4ec41f4ed 100644 --- a/src/iomusxml.cpp +++ b/src/iomusxml.cpp @@ -3255,7 +3255,7 @@ void MusicXmlInput::ReadMusicXmlNote( breath->SetPlace( breath->AttPlacementRelStaff::StrToStaffrel(xmlBreath.node().attribute("placement").as_string())); breath->SetColor(xmlBreath.node().attribute("color").as_string()); - breath->SetTstamp((double)(m_durTotal) * (double)m_meterUnit / (double)(4 * m_ppq) + 1.0); + breath->SetTstamp((double)(m_durTotal) * (double)m_meterUnit / (double)(4 * m_ppq) + 0.5); } // caesura @@ -3267,7 +3267,7 @@ void MusicXmlInput::ReadMusicXmlNote( caesura->SetPlace( caesura->AttPlacementRelStaff::StrToStaffrel(xmlCaesura.node().attribute("placement").as_string())); caesura->SetColor(xmlCaesura.node().attribute("color").as_string()); - caesura->SetTstamp((double)(m_durTotal) * (double)m_meterUnit / (double)(4 * m_ppq) + 1.0); + caesura->SetTstamp((double)(m_durTotal) * (double)m_meterUnit / (double)(4 * m_ppq) + 0.5); } // dynamics From 80f3e3fd660ee2c030d6d5910d87598884651858 Mon Sep 17 00:00:00 2001 From: Klaus Rettinghaus Date: Thu, 11 May 2023 11:10:06 +0200 Subject: [PATCH 061/151] fix import of accidentals on ornaments --- src/iomusxml.cpp | 24 +++++++++++++++++------- 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/src/iomusxml.cpp b/src/iomusxml.cpp index d4ec41f4ed..0d0a5ff85a 100644 --- a/src/iomusxml.cpp +++ b/src/iomusxml.cpp @@ -3374,16 +3374,21 @@ void MusicXmlInput::ReadMusicXmlNote( mordent->AttPlacementRelStaff::StrToStaffrel(xmlMordent.node().attribute("placement").as_string())); // form mordent->SetForm(mordentLog_FORM_lower); + if (!std::strncmp(xmlMordent.node().name(), "inverted", 7)) { + mordent->SetForm(mordentLog_FORM_upper); + } for (pugi::xml_node xmlAccidMark : notations.node().children("accidental-mark")) { + const data_ACCIDENTAL_WRITTEN accid = ConvertAccidentalToAccid(xmlAccidMark.text().as_string()); if (HasAttributeWithValue(xmlAccidMark, "placement", "above")) { - mordent->SetAccidupper(ConvertAccidentalToAccid(xmlAccidMark.text().as_string())); + mordent->SetAccidupper(accid); } else if (HasAttributeWithValue(xmlAccidMark, "placement", "below")) { - mordent->SetAccidlower(ConvertAccidentalToAccid(xmlAccidMark.text().as_string())); + mordent->SetAccidlower(accid); + } + else { + if (mordent->GetForm() == mordentLog_FORM_upper) mordent->SetAccidupper(accid); + if (mordent->GetForm() == mordentLog_FORM_lower) mordent->SetAccidlower(accid); } - } - if (!std::strncmp(xmlMordent.node().name(), "inverted", 7)) { - mordent->SetForm(mordentLog_FORM_upper); } if (BOOLEAN_true == mordent->GetLong()) { int mordentFlags = (mordentLog_FORM_upper == mordent->GetForm()) ? FORM_Inverted : FORM_Normal; @@ -3447,7 +3452,8 @@ void MusicXmlInput::ReadMusicXmlNote( musicxml::OpenSpanner openTrill(1, m_measureCounts.at(measure)); m_trillStack.push_back({ trill, openTrill }); } - for (pugi::xml_node xmlAccidMark : notations.node().children("accidental-mark")) { + for (pugi::xml_node xmlAccidMark = xmlTrill.node().next_sibling("accidental-mark"); xmlAccidMark; + xmlAccidMark = xmlAccidMark.next_sibling("accidental-mark")) { if (HasAttributeWithValue(xmlAccidMark, "placement", "below")) { trill->SetAccidlower(ConvertAccidentalToAccid(xmlAccidMark.text().as_string())); } @@ -3484,13 +3490,17 @@ void MusicXmlInput::ReadMusicXmlNote( turn->SetColor(xmlTurn.node().attribute("color").as_string()); turn->SetPlace(turn->AttPlacementRelStaff::StrToStaffrel(xmlTurn.node().attribute("placement").as_string())); turn->SetForm(turnLog_FORM_upper); - for (pugi::xml_node xmlAccidMark : notations.node().children("accidental-mark")) { + for (pugi::xml_node xmlAccidMark = xmlTurn.node().next_sibling("accidental-mark"); xmlAccidMark; + xmlAccidMark = xmlAccidMark.next_sibling("accidental-mark")) { if (HasAttributeWithValue(xmlAccidMark, "placement", "above")) { turn->SetAccidupper(ConvertAccidentalToAccid(xmlAccidMark.text().as_string())); } else if (HasAttributeWithValue(xmlAccidMark, "placement", "below")) { turn->SetAccidlower(ConvertAccidentalToAccid(xmlAccidMark.text().as_string())); } + else { + LogWarning("MusicXML import: Cannot add an accidental to a turn without placement"); + } } if (xmlTurn.node().attribute("slash").as_bool()) { AttModule::SetExternalsymbols(turn, "glyph.auth", "smufl"); From 6c733d3557b57a376c07f2321e9b4f449136a512 Mon Sep 17 00:00:00 2001 From: David Bauer Date: Thu, 11 May 2023 11:23:57 +0200 Subject: [PATCH 062/151] Add CollectAndProcess --- include/vrv/functor.h | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/include/vrv/functor.h b/include/vrv/functor.h index 11178d9865..0642ad00e7 100644 --- a/include/vrv/functor.h +++ b/include/vrv/functor.h @@ -192,6 +192,45 @@ class DocConstFunctor : public ConstFunctor { // }; +//---------------------------------------------------------------------------- +// CollectAndProcess +//---------------------------------------------------------------------------- + +/** + * This class is a mixin for all functors that require two step processing: + * (1) Collecing data. (2) Processing data. + */ +class CollectAndProcess { +protected: + /** + * @name Constructors, destructors + */ + ///@{ + CollectAndProcess() = default; + ~CollectAndProcess() = default; + ///@} + +public: + /** + * Check and switch the current phase. + */ + ///@{ + bool IsCollectingData() const { return !m_processingData; } + bool IsProcessingData() const { return m_processingData; } + void SetDataCollectionCompleted() { m_processingData = true; } + ///@} + +private: + // +public: + // +protected: + // +private: + // Indicates the current phase: collecting vs processing data + bool m_processingData = false; +}; + } // namespace vrv #endif // __VRV_FUNCTOR_H__ From 834102fe177a835c1c78689ee34c000de30fa3ef Mon Sep 17 00:00:00 2001 From: David Bauer Date: Thu, 11 May 2023 11:40:25 +0200 Subject: [PATCH 063/151] Apply in PrepareLinking --- include/vrv/preparedatafunctor.h | 12 +----------- src/doc.cpp | 2 +- src/linkinginterface.cpp | 2 +- src/preparedatafunctor.cpp | 9 +++------ 4 files changed, 6 insertions(+), 19 deletions(-) diff --git a/include/vrv/preparedatafunctor.h b/include/vrv/preparedatafunctor.h index b21caf37af..0e6397bfb1 100644 --- a/include/vrv/preparedatafunctor.h +++ b/include/vrv/preparedatafunctor.h @@ -243,7 +243,7 @@ class PrepareFacsimileFunctor : public Functor { /** * This class matches linking elements (e.g, @next). */ -class PrepareLinkingFunctor : public Functor { +class PrepareLinkingFunctor : public Functor, public CollectAndProcess { public: /** * @name Constructors, destructors @@ -258,14 +258,6 @@ class PrepareLinkingFunctor : public Functor { */ bool ImplementsEndInterface() const override { return false; } - /* - * Getter and setter for the fill mode flag - */ - ///@{ - bool FillMode() const { return m_fillMode; } - void FillMode(bool fillMode) { m_fillMode = fillMode; } - ///@} - /* * Getter for the interface / id pairs */ @@ -310,8 +302,6 @@ class PrepareLinkingFunctor : public Functor { MapOfLinkingInterfaceIDPairs m_sameasIDPairs; // Holds the note / id pairs to match for stem.sameas MapOfNoteIDPairs m_stemSameasIDPairs; - // Indicates the current mode: fill vs process - bool m_fillMode; }; //---------------------------------------------------------------------------- diff --git a/src/doc.cpp b/src/doc.cpp index 3ddfc4b1bf..62567a300f 100644 --- a/src/doc.cpp +++ b/src/doc.cpp @@ -634,10 +634,10 @@ void Doc::PrepareData() // Try to match all pointing elements using @next, @sameas and @stem.sameas PrepareLinkingFunctor prepareLinking; this->Process(prepareLinking); + prepareLinking.SetDataCollectionCompleted(); // If we have some left process again backward if (!prepareLinking.GetSameasIDPairs().empty() || !prepareLinking.GetStemSameasIDPairs().empty()) { - prepareLinking.FillMode(false); prepareLinking.SetDirection(BACKWARD); this->Process(prepareLinking); } diff --git a/src/linkinginterface.cpp b/src/linkinginterface.cpp index 0cce369007..119c2942d1 100644 --- a/src/linkinginterface.cpp +++ b/src/linkinginterface.cpp @@ -92,7 +92,7 @@ void LinkingInterface::AddBackLink(const Object *object) FunctorCode LinkingInterface::InterfacePrepareLinking(PrepareLinkingFunctor &functor, Object *object) { // This should not happen? - if (!functor.FillMode()) { + if (functor.IsProcessingData()) { return FUNCTOR_CONTINUE; } diff --git a/src/preparedatafunctor.cpp b/src/preparedatafunctor.cpp index 8be9b6407f..1ba0e30151 100644 --- a/src/preparedatafunctor.cpp +++ b/src/preparedatafunctor.cpp @@ -371,10 +371,7 @@ FunctorCode PrepareFacsimileFunctor::VisitObject(Object *object) // PrepareLinkingFunctor //---------------------------------------------------------------------------- -PrepareLinkingFunctor::PrepareLinkingFunctor() : Functor() -{ - m_fillMode = true; -} +PrepareLinkingFunctor::PrepareLinkingFunctor() : Functor(), CollectAndProcess() {} void PrepareLinkingFunctor::InsertNextIDPair(const std::string &nextID, LinkingInterface *interface) { @@ -388,7 +385,7 @@ void PrepareLinkingFunctor::InsertSameasIDPair(const std::string &sameasID, Link FunctorCode PrepareLinkingFunctor::VisitObject(Object *object) { - if (m_fillMode && object->HasInterface(INTERFACE_LINKING)) { + if (this->IsCollectingData() && object->HasInterface(INTERFACE_LINKING)) { LinkingInterface *interface = object->GetLinkingInterface(); assert(interface); interface->InterfacePrepareLinking(*this, object); @@ -430,7 +427,7 @@ FunctorCode PrepareLinkingFunctor::VisitObject(Object *object) void PrepareLinkingFunctor::ResolveStemSameas(Note *note) { // First pass we fill m_stemSameasIDPairs - if (m_fillMode) { + if (this->IsCollectingData()) { if (note->HasStemSameas()) { std::string idTarget = ExtractIDFragment(note->GetStemSameas()); m_stemSameasIDPairs[idTarget] = note; From 19894b52783c57adc780fcb77a721b97f0a94536 Mon Sep 17 00:00:00 2001 From: David Bauer Date: Thu, 11 May 2023 11:49:18 +0200 Subject: [PATCH 064/151] Apply in PreparePlist --- include/vrv/preparedatafunctor.h | 12 +----------- src/doc.cpp | 2 +- src/plistinterface.cpp | 2 +- src/preparedatafunctor.cpp | 7 ++----- 4 files changed, 5 insertions(+), 18 deletions(-) diff --git a/include/vrv/preparedatafunctor.h b/include/vrv/preparedatafunctor.h index 0e6397bfb1..d682b6f06c 100644 --- a/include/vrv/preparedatafunctor.h +++ b/include/vrv/preparedatafunctor.h @@ -311,7 +311,7 @@ class PrepareLinkingFunctor : public Functor, public CollectAndProcess { /** * This class matches elements of @plist. */ -class PreparePlistFunctor : public Functor { +class PreparePlistFunctor : public Functor, public CollectAndProcess { public: /** * @name Constructors, destructors @@ -326,14 +326,6 @@ class PreparePlistFunctor : public Functor { */ bool ImplementsEndInterface() const override { return false; } - /* - * Getter and setter for the fill mode flag - */ - ///@{ - bool FillMode() const { return m_fillMode; } - void FillMode(bool fillMode) { m_fillMode = fillMode; } - ///@} - /* * Getter and modifier for the interface / id tuples */ @@ -359,8 +351,6 @@ class PreparePlistFunctor : public Functor { private: // Holds the interface / id tuples to match ArrayOfPlistInterfaceIDTuples m_interfaceIDTuples; - // Indicates the current mode: fill vs process - bool m_fillMode; }; //---------------------------------------------------------------------------- diff --git a/src/doc.cpp b/src/doc.cpp index 62567a300f..7f10ec775f 100644 --- a/src/doc.cpp +++ b/src/doc.cpp @@ -659,10 +659,10 @@ void Doc::PrepareData() // Try to match all pointing elements using @plist PreparePlistFunctor preparePlist; this->Process(preparePlist); + preparePlist.SetDataCollectionCompleted(); // Process plist after all pairs have been collected if (!preparePlist.GetInterfaceIDTuples().empty()) { - preparePlist.FillMode(false); this->Process(preparePlist); for (const auto &[plistInterface, id, objectReference] : preparePlist.GetInterfaceIDTuples()) { diff --git a/src/plistinterface.cpp b/src/plistinterface.cpp index e617fdab9e..65915ea426 100644 --- a/src/plistinterface.cpp +++ b/src/plistinterface.cpp @@ -98,7 +98,7 @@ void PlistInterface::SetIDStrs() FunctorCode PlistInterface::InterfacePreparePlist(PreparePlistFunctor &functor, Object *object) { // This should not happen? - if (!functor.FillMode()) { + if (functor.IsProcessingData()) { return FUNCTOR_CONTINUE; } diff --git a/src/preparedatafunctor.cpp b/src/preparedatafunctor.cpp index 1ba0e30151..eaa64ea2fa 100644 --- a/src/preparedatafunctor.cpp +++ b/src/preparedatafunctor.cpp @@ -467,10 +467,7 @@ void PrepareLinkingFunctor::ResolveStemSameas(Note *note) // PreparePlistFunctor //---------------------------------------------------------------------------- -PreparePlistFunctor::PreparePlistFunctor() : Functor() -{ - m_fillMode = true; -} +PreparePlistFunctor::PreparePlistFunctor() : Functor(), CollectAndProcess() {} void PreparePlistFunctor::InsertInterfaceIDTuple(const std::string &elementID, PlistInterface *interface) { @@ -479,7 +476,7 @@ void PreparePlistFunctor::InsertInterfaceIDTuple(const std::string &elementID, P FunctorCode PreparePlistFunctor::VisitObject(Object *object) { - if (m_fillMode) { + if (this->IsCollectingData()) { if (object->HasInterface(INTERFACE_PLIST)) { PlistInterface *interface = object->GetPlistInterface(); assert(interface); From e88b43d26c3989dbf0c6d67b7149efbbefd4188c Mon Sep 17 00:00:00 2001 From: David Bauer Date: Thu, 11 May 2023 11:58:49 +0200 Subject: [PATCH 065/151] Apply in PrepareTimeSpanning --- include/vrv/preparedatafunctor.h | 12 +----------- src/doc.cpp | 2 +- src/preparedatafunctor.cpp | 7 ++----- src/timeinterface.cpp | 2 +- 4 files changed, 5 insertions(+), 18 deletions(-) diff --git a/include/vrv/preparedatafunctor.h b/include/vrv/preparedatafunctor.h index d682b6f06c..612d5825e1 100644 --- a/include/vrv/preparedatafunctor.h +++ b/include/vrv/preparedatafunctor.h @@ -457,7 +457,7 @@ class PrepareTimePointingFunctor : public Functor { * If fillMode is set to false, only the remaining elements will be matched. * This is used when processing a second time in the other direction. */ -class PrepareTimeSpanningFunctor : public Functor { +class PrepareTimeSpanningFunctor : public Functor, public CollectAndProcess { public: /** * @name Constructors, destructors @@ -472,14 +472,6 @@ class PrepareTimeSpanningFunctor : public Functor { */ bool ImplementsEndInterface() const override { return true; } - /* - * Getter and setter for the fill mode flag - */ - ///@{ - bool FillMode() const { return m_fillMode; } - void FillMode(bool fillMode) { m_fillMode = fillMode; } - ///@} - /* * Getter and modifier for the interface / owner pairs */ @@ -507,8 +499,6 @@ class PrepareTimeSpanningFunctor : public Functor { private: // The interface list that holds the current elements to match ListOfSpanningInterOwnerPairs m_timeSpanningInterfaces; - // Indicates the current mode: fill vs process - bool m_fillMode; }; //---------------------------------------------------------------------------- diff --git a/src/doc.cpp b/src/doc.cpp index 7f10ec775f..ec442dd5a5 100644 --- a/src/doc.cpp +++ b/src/doc.cpp @@ -583,6 +583,7 @@ void Doc::PrepareData() PrepareTimeSpanningFunctor prepareTimeSpanning; prepareTimeSpanning.SetDirection(BACKWARD); this->Process(prepareTimeSpanning); + prepareTimeSpanning.SetDataCollectionCompleted(); // First we try backwards because normally the spanning elements are at the end of // the measure. However, in some case, one (or both) end points will appear afterwards @@ -591,7 +592,6 @@ void Doc::PrepareData() // but this time without filling the list (that is only will the remaining elements) const ListOfSpanningInterOwnerPairs &interfaceOwnerPairs = prepareTimeSpanning.GetInterfaceOwnerPairs(); if (!interfaceOwnerPairs.empty()) { - prepareTimeSpanning.FillMode(false); prepareTimeSpanning.SetDirection(FORWARD); this->Process(prepareTimeSpanning); } diff --git a/src/preparedatafunctor.cpp b/src/preparedatafunctor.cpp index eaa64ea2fa..cf76c02770 100644 --- a/src/preparedatafunctor.cpp +++ b/src/preparedatafunctor.cpp @@ -624,10 +624,7 @@ FunctorCode PrepareTimePointingFunctor::VisitMeasureEnd(Measure *measure) // PrepareTimeSpanningFunctor //---------------------------------------------------------------------------- -PrepareTimeSpanningFunctor::PrepareTimeSpanningFunctor() : Functor() -{ - m_fillMode = true; -} +PrepareTimeSpanningFunctor::PrepareTimeSpanningFunctor() : Functor(), CollectAndProcess() {} void PrepareTimeSpanningFunctor::InsertInterfaceOwnerPair(Object *owner, TimeSpanningInterface *interface) { @@ -678,7 +675,7 @@ FunctorCode PrepareTimeSpanningFunctor::VisitLayerElement(LayerElement *layerEle FunctorCode PrepareTimeSpanningFunctor::VisitMeasureEnd(Measure *measure) { - if (!m_fillMode) { + if (this->IsProcessingData()) { return FUNCTOR_CONTINUE; } diff --git a/src/timeinterface.cpp b/src/timeinterface.cpp index a05365e5b3..3a8ed6e1ab 100644 --- a/src/timeinterface.cpp +++ b/src/timeinterface.cpp @@ -383,7 +383,7 @@ FunctorCode TimeSpanningInterface::InterfacePrepareTimeSpanning(PrepareTimeSpann return FUNCTOR_CONTINUE; } - if (!functor.FillMode()) { + if (functor.IsProcessingData()) { return FUNCTOR_CONTINUE; } From 9f1e482a025c64c4a3dee90928c972748f7994b5 Mon Sep 17 00:00:00 2001 From: David Bauer Date: Thu, 11 May 2023 12:20:21 +0200 Subject: [PATCH 066/151] Apply in PrepareDelayedTurns --- include/vrv/preparedatafunctor.h | 12 +----------- src/doc.cpp | 2 +- src/preparedatafunctor.cpp | 7 +++---- 3 files changed, 5 insertions(+), 16 deletions(-) diff --git a/include/vrv/preparedatafunctor.h b/include/vrv/preparedatafunctor.h index 612d5825e1..dfacf5a80a 100644 --- a/include/vrv/preparedatafunctor.h +++ b/include/vrv/preparedatafunctor.h @@ -746,7 +746,7 @@ class PrepareRptFunctor : public DocFunctor { * This class sets Turn::m_drawingEndNote for delayed turns. * Needs a first pass to fill the map, processed by staff/layer after that. */ -class PrepareDelayedTurnsFunctor : public Functor { +class PrepareDelayedTurnsFunctor : public Functor, public CollectAndProcess { public: /** * @name Constructors, destructors @@ -761,14 +761,6 @@ class PrepareDelayedTurnsFunctor : public Functor { */ bool ImplementsEndInterface() const override { return false; } - /* - * Getter and setter for the fill mode flag - */ - ///@{ - bool FillMode() const { return m_fillMode; } - void FillMode(bool fillMode) { m_fillMode = fillMode; } - ///@} - /* * Getter for the map of delayed turns */ @@ -802,8 +794,6 @@ class PrepareDelayedTurnsFunctor : public Functor { Turn *m_currentTurn; // A map of the delayed turns and the layer elements they point to std::map m_delayedTurns; - // Indicates the current mode: fill vs process - bool m_fillMode; }; //---------------------------------------------------------------------------- diff --git a/src/doc.cpp b/src/doc.cpp index ec442dd5a5..a6ce287c35 100644 --- a/src/doc.cpp +++ b/src/doc.cpp @@ -730,9 +730,9 @@ void Doc::PrepareData() PrepareDelayedTurnsFunctor prepareDelayedTurns; this->Process(prepareDelayedTurns); + prepareDelayedTurns.SetDataCollectionCompleted(); if (!prepareDelayedTurns.GetDelayedTurns().empty()) { - prepareDelayedTurns.FillMode(false); for (staves = layerTree.child.begin(); staves != layerTree.child.end(); ++staves) { for (layers = staves->second.child.begin(); layers != staves->second.child.end(); ++layers) { filters.Clear(); diff --git a/src/preparedatafunctor.cpp b/src/preparedatafunctor.cpp index cf76c02770..f4b7031ae8 100644 --- a/src/preparedatafunctor.cpp +++ b/src/preparedatafunctor.cpp @@ -1325,9 +1325,8 @@ FunctorCode PrepareRptFunctor::VisitStaff(Staff *staff) // PrepareDelayedTurnsFunctor //---------------------------------------------------------------------------- -PrepareDelayedTurnsFunctor::PrepareDelayedTurnsFunctor() : Functor() +PrepareDelayedTurnsFunctor::PrepareDelayedTurnsFunctor() : Functor(), CollectAndProcess() { - m_fillMode = true; this->ResetCurrent(); } @@ -1341,7 +1340,7 @@ void PrepareDelayedTurnsFunctor::ResetCurrent() FunctorCode PrepareDelayedTurnsFunctor::VisitLayerElement(LayerElement *layerElement) { // We are initializing the m_delayedTurns map - if (m_fillMode) return FUNCTOR_CONTINUE; + if (this->IsCollectingData()) return FUNCTOR_CONTINUE; if (!layerElement->HasInterface(INTERFACE_DURATION)) return FUNCTOR_CONTINUE; @@ -1374,7 +1373,7 @@ FunctorCode PrepareDelayedTurnsFunctor::VisitLayerElement(LayerElement *layerEle FunctorCode PrepareDelayedTurnsFunctor::VisitTurn(Turn *turn) { // We already initialized the m_delayedTurns map - if (!m_fillMode) return FUNCTOR_CONTINUE; + if (this->IsProcessingData()) return FUNCTOR_CONTINUE; // Map only delayed turns if (turn->GetDelayed() != BOOLEAN_true) return FUNCTOR_CONTINUE; From 1b00486852187a72c059d08c9e0a13b124a38361 Mon Sep 17 00:00:00 2001 From: David Bauer Date: Tue, 9 May 2023 15:55:18 +0200 Subject: [PATCH 067/151] Use stack for filters --- include/vrv/functor.h | 25 ++++++++++++++++++++----- src/adjustdotsfunctor.cpp | 5 ++--- src/adjustgracexposfunctor.cpp | 10 ++++------ src/adjustlayersfunctor.cpp | 5 ++--- src/adjustxposfunctor.cpp | 5 ++--- src/convertfunctor.cpp | 5 ++--- src/doc.cpp | 12 ++++++------ src/horizontalaligner.cpp | 2 +- src/layer.cpp | 4 ++-- src/page.cpp | 2 +- src/system.cpp | 2 +- 11 files changed, 43 insertions(+), 34 deletions(-) diff --git a/include/vrv/functor.h b/include/vrv/functor.h index 0642ad00e7..e3590cdae1 100644 --- a/include/vrv/functor.h +++ b/include/vrv/functor.h @@ -8,6 +8,8 @@ #ifndef __VRV_FUNCTOR_H__ #define __VRV_FUNCTOR_H__ +#include + #include "comparison.h" #include "functorinterface.h" #include "vrvdef.h" @@ -43,13 +45,26 @@ class FunctorBase { ///@} /** - * Getters/Setters for the properties + * Getters/Setters for the filters + */ + ///@{ + Filters *GetFilters() { return m_filters.empty() ? NULL : m_filters.top(); } + void PushFilters(Filters *filters) { m_filters.push(filters); } + void PopFilters() { m_filters.pop(); } + ///@} + + /** + * Getters/Setters for the visibility */ ///@{ - Filters *GetFilters() { return m_filters; } - void SetFilters(Filters *filters) { m_filters = filters; } bool VisibleOnly() const { return m_visibleOnly; } void SetVisibleOnly(bool visibleOnly) { m_visibleOnly = visibleOnly; } + ///@} + + /** + * Getters/Setters for the direction + */ + ///@{ bool GetDirection() const { return m_direction; } void SetDirection(bool direction) { m_direction = direction; } ///@} @@ -66,8 +81,8 @@ class FunctorBase { private: // The functor code FunctorCode m_code = FUNCTOR_CONTINUE; - // The filters - Filters *m_filters = NULL; + // The filter stack + std::stack m_filters; // Visible only flag bool m_visibleOnly = true; // Direction diff --git a/src/adjustdotsfunctor.cpp b/src/adjustdotsfunctor.cpp index 79c27af0a2..749adcd891 100644 --- a/src/adjustdotsfunctor.cpp +++ b/src/adjustdotsfunctor.cpp @@ -100,9 +100,8 @@ FunctorCode AdjustDotsFunctor::VisitMeasure(Measure *measure) { if (!measure->HasAlignmentRefWithMultipleLayers()) return FUNCTOR_SIBLINGS; - Filters *previousFilters = this->GetFilters(); Filters filters; - this->SetFilters(&filters); + this->PushFilters(&filters); std::vector::iterator iter; for (iter = m_staffNs.begin(); iter != m_staffNs.end(); ++iter) { @@ -119,7 +118,7 @@ FunctorCode AdjustDotsFunctor::VisitMeasure(Measure *measure) measure->m_measureAligner.Process(*this); } - this->SetFilters(previousFilters); + this->PopFilters(); return FUNCTOR_SIBLINGS; } diff --git a/src/adjustgracexposfunctor.cpp b/src/adjustgracexposfunctor.cpp index 7c9201d51f..683acdbffb 100644 --- a/src/adjustgracexposfunctor.cpp +++ b/src/adjustgracexposfunctor.cpp @@ -49,10 +49,9 @@ FunctorCode AdjustGraceXPosFunctor::VisitAlignment(Alignment *alignment) assert(measureAligner); bool previousDirection = this->GetDirection(); - Filters *previousFilters = this->GetFilters(); this->SetDirection(BACKWARD); Filters filters; - this->SetFilters(&filters); + this->PushFilters(&filters); std::vector::iterator iter; for (iter = m_staffNs.begin(); iter != m_staffNs.end(); ++iter) { @@ -111,7 +110,7 @@ FunctorCode AdjustGraceXPosFunctor::VisitAlignment(Alignment *alignment) } this->SetDirection(previousDirection); - this->SetFilters(previousFilters); + this->PopFilters(); // Change the flag back m_isGraceAlignment = false; @@ -144,16 +143,15 @@ FunctorCode AdjustGraceXPosFunctor::VisitAlignmentReference(AlignmentReference * // to process the children (LayerElement) "by hand" in FORWARD manner // (filters can be NULL because filtering was already applied in the parent) bool previousDirection = this->GetDirection(); - Filters *previousFilters = this->GetFilters(); this->SetDirection(FORWARD); - this->SetFilters(NULL); + this->PushFilters(NULL); for (auto child : alignmentReference->GetChildren()) { child->Process(*this); } this->SetDirection(previousDirection); - this->SetFilters(previousFilters); + this->PopFilters(); return FUNCTOR_SIBLINGS; } diff --git a/src/adjustlayersfunctor.cpp b/src/adjustlayersfunctor.cpp index 80752d7049..80d0c344b7 100644 --- a/src/adjustlayersfunctor.cpp +++ b/src/adjustlayersfunctor.cpp @@ -123,9 +123,8 @@ FunctorCode AdjustLayersFunctor::VisitMeasure(Measure *measure) { if (!measure->HasAlignmentRefWithMultipleLayers()) return FUNCTOR_SIBLINGS; - Filters *previousFilters = this->GetFilters(); Filters filters; - this->SetFilters(&filters); + this->PushFilters(&filters); std::vector::iterator iter; for (iter = m_staffNs.begin(); iter != m_staffNs.end(); ++iter) { @@ -142,7 +141,7 @@ FunctorCode AdjustLayersFunctor::VisitMeasure(Measure *measure) measure->m_measureAligner.Process(*this); } - this->SetFilters(previousFilters); + this->PopFilters(); return FUNCTOR_SIBLINGS; } diff --git a/src/adjustxposfunctor.cpp b/src/adjustxposfunctor.cpp index e11ef44f28..f0f9d254a8 100644 --- a/src/adjustxposfunctor.cpp +++ b/src/adjustxposfunctor.cpp @@ -214,9 +214,8 @@ FunctorCode AdjustXPosFunctor::VisitMeasure(Measure *measure) const bool hasSystemStartLine = measure->IsFirstInSystem() && system->GetDrawingScoreDef()->HasSystemStartLine(); - Filters *previousFilters = this->GetFilters(); Filters filters; - this->SetFilters(&filters); + this->PushFilters(&filters); for (auto staffN : m_staffNs) { m_minPos = 0; @@ -248,7 +247,7 @@ FunctorCode AdjustXPosFunctor::VisitMeasure(Measure *measure) measure->m_measureAligner.Process(*this); } - this->SetFilters(previousFilters); + this->PopFilters(); int minMeasureWidth = m_doc->GetOptions()->m_unit.GetValue() * m_doc->GetOptions()->m_measureMinWidth.GetValue(); // First try to see if we have a double measure length element diff --git a/src/convertfunctor.cpp b/src/convertfunctor.cpp index 3c99b20277..04536104e0 100644 --- a/src/convertfunctor.cpp +++ b/src/convertfunctor.cpp @@ -284,9 +284,8 @@ FunctorCode ConvertToCastOffMensuralFunctor::VisitMeasure(Measure *measure) } m_targetSubSystem->AddChild(targetMeasure); - Filters *previousFilters = this->GetFilters(); Filters filters; - this->SetFilters(&filters); + this->PushFilters(&filters); // Now we can process by layer and move their content to (measure) segments for (const auto &staves : m_layerTree->child) { @@ -303,7 +302,7 @@ FunctorCode ConvertToCastOffMensuralFunctor::VisitMeasure(Measure *measure) } } - this->SetFilters(previousFilters); + this->PopFilters(); m_targetMeasure = NULL; m_targetSubSystem = NULL; diff --git a/src/doc.cpp b/src/doc.cpp index a6ce287c35..a0a3cbab78 100644 --- a/src/doc.cpp +++ b/src/doc.cpp @@ -491,7 +491,7 @@ void Doc::ExportMIDI(smf::MidiFile *midiFile) filters.Add(&matchLayer); GenerateMIDIFunctor generateMIDI(midiFile); - generateMIDI.SetFilters(&filters); + generateMIDI.PushFilters(&filters); generateMIDI.SetChannel(midiChannel); generateMIDI.SetTrack(midiTrack); @@ -721,7 +721,7 @@ void Doc::PrepareData() filters.Add(&matchLayer); PreparePointersByLayerFunctor preparePointersByLayer; - preparePointersByLayer.SetFilters(&filters); + preparePointersByLayer.PushFilters(&filters); this->Process(preparePointersByLayer); } } @@ -733,6 +733,7 @@ void Doc::PrepareData() prepareDelayedTurns.SetDataCollectionCompleted(); if (!prepareDelayedTurns.GetDelayedTurns().empty()) { + prepareDelayedTurns.PushFilters(&filters); for (staves = layerTree.child.begin(); staves != layerTree.child.end(); ++staves) { for (layers = staves->second.child.begin(); layers != staves->second.child.end(); ++layers) { filters.Clear(); @@ -742,7 +743,6 @@ void Doc::PrepareData() filters.Add(&matchStaff); filters.Add(&matchLayer); - prepareDelayedTurns.SetFilters(&filters); prepareDelayedTurns.ResetCurrent(); this->Process(prepareDelayedTurns); } @@ -768,7 +768,7 @@ void Doc::PrepareData() // The first pass sets m_drawingFirstNote and m_drawingLastNote for each syl // m_drawingLastNote is set only if the syl has a forward connector PrepareLyricsFunctor prepareLyrics; - prepareLyrics.SetFilters(&filters); + prepareLyrics.PushFilters(&filters); this->Process(prepareLyrics); } } @@ -802,7 +802,7 @@ void Doc::PrepareData() // We set multiNumber to NONE for indicated we need to look at the staffDef when reaching the first staff PrepareRptFunctor prepareRpt(this); - prepareRpt.SetFilters(&filters); + prepareRpt.PushFilters(&filters); this->Process(prepareRpt); } } @@ -1348,7 +1348,7 @@ void Doc::ConvertMarkupDoc(bool permanent) filters.Add(&matchLayer); ConvertMarkupAnalyticalFunctor convertMarkupAnalytical(permanent); - convertMarkupAnalytical.SetFilters(&filters); + convertMarkupAnalytical.PushFilters(&filters); this->Process(convertMarkupAnalytical); // After having processed one layer, we check if we have open ties - if yes, we diff --git a/src/horizontalaligner.cpp b/src/horizontalaligner.cpp index 6f443e17a4..1953b143a9 100644 --- a/src/horizontalaligner.cpp +++ b/src/horizontalaligner.cpp @@ -664,7 +664,7 @@ void Alignment::GetLeftRight(int staffN, int &minLeft, int &maxRight, const std: Filters filters; AttNIntegerComparison matchStaff(ALIGNMENT_REFERENCE, staffN); filters.Add(&matchStaff); - getAlignmentLeftRight.SetFilters(&filters); + getAlignmentLeftRight.PushFilters(&filters); this->Process(getAlignmentLeftRight); } else { diff --git a/src/layer.cpp b/src/layer.cpp index c439ca9801..13805664b1 100644 --- a/src/layer.cpp +++ b/src/layer.cpp @@ -399,7 +399,7 @@ std::set Layer::GetLayersNInTimeSpan(double time, double duration, const Me Filters filters; AttNIntegerComparison matchStaff(ALIGNMENT_REFERENCE, staff); filters.Add(&matchStaff); - layersInTimeSpan.SetFilters(&filters); + layersInTimeSpan.PushFilters(&filters); measure->m_measureAligner.Process(layersInTimeSpan); @@ -481,7 +481,7 @@ ListOfConstObjects Layer::GetLayerElementsInTimeSpan( Filters filters; AttNIntegerComparison matchStaff(ALIGNMENT_REFERENCE, staff); filters.Add(&matchStaff); - layerElementsInTimeSpan.SetFilters(&filters); + layerElementsInTimeSpan.PushFilters(&filters); measure->m_measureAligner.Process(layerElementsInTimeSpan); diff --git a/src/page.cpp b/src/page.cpp index 12d9a630cd..067da51cf5 100644 --- a/src/page.cpp +++ b/src/page.cpp @@ -759,7 +759,7 @@ void Page::AdjustSylSpacingByVerse(const IntTree &verseTree, Doc *doc) filters = { &matchStaff, &matchLayer, &matchVerse }; AdjustSylSpacingFunctor adjustSylSpacing(doc); - adjustSylSpacing.SetFilters(&filters); + adjustSylSpacing.PushFilters(&filters); this->Process(adjustSylSpacing); } } diff --git a/src/system.cpp b/src/system.cpp index 01cb33b146..395ca9d1e1 100644 --- a/src/system.cpp +++ b/src/system.cpp @@ -458,7 +458,7 @@ void System::ConvertToUnCastOffMensuralSystem() Filters filters; ConvertToUnCastOffMensuralFunctor convertToUnCastOffMensural; - convertToUnCastOffMensural.SetFilters(&filters); + convertToUnCastOffMensural.PushFilters(&filters); // Now we can process by layer and move their content to (measure) segments for (const auto &staves : layerTree.child) { From 393f18edb1464439010c07567cffb3e18ee6b4ea Mon Sep 17 00:00:00 2001 From: David Bauer Date: Wed, 10 May 2023 08:53:20 +0200 Subject: [PATCH 068/151] Use stack for direction --- include/vrv/functor.h | 9 +++++---- src/adjustarpegfunctor.cpp | 7 +++---- src/adjustgracexposfunctor.cpp | 15 ++++++--------- src/doc.cpp | 15 ++++++++------- src/findlayerelementsfunctor.cpp | 5 +++-- src/object.cpp | 10 +++++----- src/rest.cpp | 4 ++-- 7 files changed, 32 insertions(+), 33 deletions(-) diff --git a/include/vrv/functor.h b/include/vrv/functor.h index e3590cdae1..54185b9ecb 100644 --- a/include/vrv/functor.h +++ b/include/vrv/functor.h @@ -65,8 +65,9 @@ class FunctorBase { * Getters/Setters for the direction */ ///@{ - bool GetDirection() const { return m_direction; } - void SetDirection(bool direction) { m_direction = direction; } + bool GetDirection() const { return m_direction.empty() ? FORWARD : m_direction.top(); } + void PushDirection(bool direction) { m_direction.push(direction); } + void PopDirection() { m_direction.pop(); } ///@} /** @@ -85,8 +86,8 @@ class FunctorBase { std::stack m_filters; // Visible only flag bool m_visibleOnly = true; - // Direction - bool m_direction = FORWARD; + // The direction stack + std::stack m_direction; }; //---------------------------------------------------------------------------- diff --git a/src/adjustarpegfunctor.cpp b/src/adjustarpegfunctor.cpp index ea6e059278..83e56f4cfa 100644 --- a/src/adjustarpegfunctor.cpp +++ b/src/adjustarpegfunctor.cpp @@ -172,11 +172,10 @@ FunctorCode AdjustArpegFunctor::VisitMeasureEnd(Measure *measure) { if (!m_alignmentArpegTuples.empty()) { m_measureAligner = &measure->m_measureAligner; - // Process backwards on measure aligner, then reset to previous direction - const bool direction = this->GetDirection(); - this->SetDirection(BACKWARD); + // Process backwards on measure aligner + this->PushDirection(BACKWARD); m_measureAligner->Process(*this); - this->SetDirection(direction); + this->PopDirection(); m_alignmentArpegTuples.clear(); } diff --git a/src/adjustgracexposfunctor.cpp b/src/adjustgracexposfunctor.cpp index 683acdbffb..eda19401a2 100644 --- a/src/adjustgracexposfunctor.cpp +++ b/src/adjustgracexposfunctor.cpp @@ -48,8 +48,7 @@ FunctorCode AdjustGraceXPosFunctor::VisitAlignment(Alignment *alignment) MeasureAligner *measureAligner = vrv_cast(alignment->GetFirstAncestor(MEASURE_ALIGNER)); assert(measureAligner); - bool previousDirection = this->GetDirection(); - this->SetDirection(BACKWARD); + this->PushDirection(BACKWARD); Filters filters; this->PushFilters(&filters); @@ -109,7 +108,7 @@ FunctorCode AdjustGraceXPosFunctor::VisitAlignment(Alignment *alignment) } } - this->SetDirection(previousDirection); + this->PopDirection(); this->PopFilters(); // Change the flag back @@ -142,15 +141,14 @@ FunctorCode AdjustGraceXPosFunctor::VisitAlignmentReference(AlignmentReference * // Because we are processing grace notes alignment backward (see VisitAlignment) we need // to process the children (LayerElement) "by hand" in FORWARD manner // (filters can be NULL because filtering was already applied in the parent) - bool previousDirection = this->GetDirection(); - this->SetDirection(FORWARD); + this->PushDirection(FORWARD); this->PushFilters(NULL); for (auto child : alignmentReference->GetChildren()) { child->Process(*this); } - this->SetDirection(previousDirection); + this->PopDirection(); this->PopFilters(); return FUNCTOR_SIBLINGS; @@ -207,8 +205,7 @@ FunctorCode AdjustGraceXPosFunctor::VisitMeasure(Measure *measure) m_rightDefaultAlignment = NULL; // We process it backward because we want to get the rightDefaultAlignment - bool previousDirection = this->GetDirection(); - this->SetDirection(BACKWARD); + this->PushDirection(BACKWARD); measure->m_measureAligner.Process(*this); // We need to process the staves in the reverse order @@ -223,7 +220,7 @@ FunctorCode AdjustGraceXPosFunctor::VisitMeasure(Measure *measure) m_staffNs = staffNsReversed; m_measureTieEndpoints = measure->GetInternalTieEndpoints(); measure->m_measureAligner.Process(*this); - this->SetDirection(previousDirection); + this->PopDirection(); // Put params back m_staffNs = staffNs; diff --git a/src/doc.cpp b/src/doc.cpp index a0a3cbab78..41ac501f06 100644 --- a/src/doc.cpp +++ b/src/doc.cpp @@ -362,7 +362,7 @@ void Doc::CalculateTimemap() // Adjust the duration of tied notes InitTimemapTiesFunctor initTimemapTies; - initTimemapTies.SetDirection(BACKWARD); + initTimemapTies.PushDirection(BACKWARD); this->Process(initTimemapTies); m_timemapTempo = m_options->m_midiTempoAdjustment.GetValue(); @@ -581,8 +581,9 @@ void Doc::PrepareData() // Try to match all spanning elements (slur, tie, etc) by processing backwards PrepareTimeSpanningFunctor prepareTimeSpanning; - prepareTimeSpanning.SetDirection(BACKWARD); + prepareTimeSpanning.PushDirection(BACKWARD); this->Process(prepareTimeSpanning); + prepareTimeSpanning.PopDirection(); prepareTimeSpanning.SetDataCollectionCompleted(); // First we try backwards because normally the spanning elements are at the end of @@ -592,7 +593,6 @@ void Doc::PrepareData() // but this time without filling the list (that is only will the remaining elements) const ListOfSpanningInterOwnerPairs &interfaceOwnerPairs = prepareTimeSpanning.GetInterfaceOwnerPairs(); if (!interfaceOwnerPairs.empty()) { - prepareTimeSpanning.SetDirection(FORWARD); this->Process(prepareTimeSpanning); } @@ -614,7 +614,7 @@ void Doc::PrepareData() // Try to match all time pointing elements (tempo, fermata, etc) by processing backwards PrepareTimePointingFunctor prepareTimePointing; - prepareTimePointing.SetDirection(BACKWARD); + prepareTimePointing.PushDirection(BACKWARD); this->Process(prepareTimePointing); /************ Resolve @tstamp / tstamp2 ************/ @@ -638,8 +638,9 @@ void Doc::PrepareData() // If we have some left process again backward if (!prepareLinking.GetSameasIDPairs().empty() || !prepareLinking.GetStemSameasIDPairs().empty()) { - prepareLinking.SetDirection(BACKWARD); + prepareLinking.PushDirection(BACKWARD); this->Process(prepareLinking); + prepareLinking.PopDirection(); } // If some are still there, then it is probably an issue in the encoding @@ -879,10 +880,10 @@ void Doc::ScoreDefSetCurrentDoc(bool force) // First we need to set Page::m_score and Page::m_scoreEnd // We do it by going BACKWARD, with a depth limit of 3 (we want to hit the Score elements) ScoreDefSetCurrentPageFunctor scoreDefSetCurrentPage(this); - scoreDefSetCurrentPage.SetDirection(BACKWARD); + scoreDefSetCurrentPage.PushDirection(BACKWARD); this->Process(scoreDefSetCurrentPage, 3); + scoreDefSetCurrentPage.PopDirection(); // Do it again FORWARD to set Page::m_scoreEnd - relies on Page::m_score not being NULL - scoreDefSetCurrentPage.SetDirection(FORWARD); this->Process(scoreDefSetCurrentPage, 3); ScoreDefSetCurrentFunctor scoreDefSetCurrent(this); diff --git a/src/findlayerelementsfunctor.cpp b/src/findlayerelementsfunctor.cpp index 021e969e31..32f3a5f4f0 100644 --- a/src/findlayerelementsfunctor.cpp +++ b/src/findlayerelementsfunctor.cpp @@ -263,8 +263,9 @@ FunctorCode GetRelativeLayerElementFunctor::VisitLayerElement(const LayerElement // processed (e.g. ignore index children of beams, since they have their own indices irrelevant to the one that // has been passed inside this functor) if (!m_isInNeighboringLayer && layerElement->GetParent()->Is(LAYER)) { - if (m_searchDirection == FORWARD && (layerElement->GetIdx() < m_initialElementIndex)) return FUNCTOR_SIBLINGS; - if (m_searchDirection == BACKWARD && (layerElement->GetIdx() > m_initialElementIndex)) return FUNCTOR_SIBLINGS; + if ((m_searchDirection == FORWARD) && (layerElement->GetIdx() < m_initialElementIndex)) return FUNCTOR_SIBLINGS; + if ((m_searchDirection == BACKWARD) && (layerElement->GetIdx() > m_initialElementIndex)) + return FUNCTOR_SIBLINGS; } if (layerElement->Is({ NOTE, CHORD, FTREM })) { diff --git a/src/object.cpp b/src/object.cpp index 8a8d3f9346..17b6f97426 100644 --- a/src/object.cpp +++ b/src/object.cpp @@ -590,7 +590,7 @@ Object *Object::FindDescendantByID(const std::string &id, int deepness, bool dir const Object *Object::FindDescendantByID(const std::string &id, int deepness, bool direction) const { FindByIDFunctor findByID(id); - findByID.SetDirection(direction); + findByID.PushDirection(direction); this->Process(findByID, deepness, true); return findByID.GetElement(); } @@ -614,7 +614,7 @@ Object *Object::FindDescendantByComparison(Comparison *comparison, int deepness, const Object *Object::FindDescendantByComparison(Comparison *comparison, int deepness, bool direction) const { FindByComparisonFunctor findByComparison(comparison); - findByComparison.SetDirection(direction); + findByComparison.PushDirection(direction); this->Process(findByComparison, deepness, true); return findByComparison.GetElement(); } @@ -628,7 +628,7 @@ Object *Object::FindDescendantExtremeByComparison(Comparison *comparison, int de const Object *Object::FindDescendantExtremeByComparison(Comparison *comparison, int deepness, bool direction) const { FindExtremeByComparisonFunctor findExtremeByComparison(comparison); - findExtremeByComparison.SetDirection(direction); + findExtremeByComparison.PushDirection(direction); this->Process(findExtremeByComparison, deepness, true); return findExtremeByComparison.GetElement(); } @@ -661,7 +661,7 @@ void Object::FindAllDescendantsByComparison( if (clear) objects->clear(); FindAllByComparisonFunctor findAllByComparison(comparison, objects); - findAllByComparison.SetDirection(direction); + findAllByComparison.PushDirection(direction); this->Process(findAllByComparison, deepness, true); } @@ -672,7 +672,7 @@ void Object::FindAllDescendantsByComparison( if (clear) objects->clear(); FindAllConstByComparisonFunctor findAllConstByComparison(comparison, objects); - findAllConstByComparison.SetDirection(direction); + findAllConstByComparison.PushDirection(direction); this->Process(findAllConstByComparison, deepness, true); } diff --git a/src/rest.cpp b/src/rest.cpp index 3cfc71bced..6a25a427ac 100644 --- a/src/rest.cpp +++ b/src/rest.cpp @@ -399,7 +399,7 @@ int Rest::GetLocationRelativeToCurrentLayer(const Staff *currentStaff, const Lay // Get previous and next elements from the current layer if (currentLayer->GetFirstChildNot(REST)) { GetRelativeLayerElementFunctor getRelativeLayerElementBackwards(this->GetIdx(), BACKWARD, false); - getRelativeLayerElementBackwards.SetDirection(BACKWARD); + getRelativeLayerElementBackwards.PushDirection(BACKWARD); currentLayer->Process(getRelativeLayerElementBackwards); previousElement = getRelativeLayerElementBackwards.GetRelativeElement(); @@ -471,7 +471,7 @@ int Rest::GetFirstRelativeElementLocation( // Get last element if it's previous layer, get first one otherwise GetRelativeLayerElementFunctor getRelativeLayerElement(this->GetIdx(), !isPrevious, true); - getRelativeLayerElement.SetDirection(!isPrevious); + getRelativeLayerElement.PushDirection(!isPrevious); (*layerIter)->Process(getRelativeLayerElement); const Object *lastLayerElement = getRelativeLayerElement.GetRelativeElement(); From f062f047860abdf5132ad2577f9450931190c3a7 Mon Sep 17 00:00:00 2001 From: David Bauer Date: Wed, 10 May 2023 09:09:30 +0200 Subject: [PATCH 069/151] Drop direction variable in GetRelativeLayerElement --- include/vrv/findlayerelementsfunctor.h | 6 ++---- src/findlayerelementsfunctor.cpp | 10 ++++------ src/rest.cpp | 6 +++--- 3 files changed, 9 insertions(+), 13 deletions(-) diff --git a/include/vrv/findlayerelementsfunctor.h b/include/vrv/findlayerelementsfunctor.h index 4fcff42803..50e6bde99f 100644 --- a/include/vrv/findlayerelementsfunctor.h +++ b/include/vrv/findlayerelementsfunctor.h @@ -231,7 +231,7 @@ class FindSpannedLayerElementsFunctor : public ConstFunctor { /** * This class goes through all layer elements of the layer and returns the next/previous element - * relative to the specified layer element. + * (depending on traversal direction) relative to the specified layer element. * It will search recursively through children elements until note, chord or ftrem is found. * It can be used to look into neighboring layers as well, but only the first element will be checked. */ @@ -241,7 +241,7 @@ class GetRelativeLayerElementFunctor : public ConstFunctor { * @name Constructors, destructors */ ///@{ - GetRelativeLayerElementFunctor(int elementIndex, bool searchDirection, bool anotherLayer); + GetRelativeLayerElementFunctor(int elementIndex, bool anotherLayer); virtual ~GetRelativeLayerElementFunctor() = default; ///@} @@ -273,8 +273,6 @@ class GetRelativeLayerElementFunctor : public ConstFunctor { const LayerElement *m_relativeElement; // The index of the layer element that is being compared to (starting point) int m_initialElementIndex; - // The direction of search - BACKWARD is for previous element, FORWARD - next - bool m_searchDirection; // The flag to indicate whether search is done in the same layer as the given element, or in neighboring one bool m_isInNeighboringLayer; }; diff --git a/src/findlayerelementsfunctor.cpp b/src/findlayerelementsfunctor.cpp index 32f3a5f4f0..f26e70e62c 100644 --- a/src/findlayerelementsfunctor.cpp +++ b/src/findlayerelementsfunctor.cpp @@ -247,13 +247,10 @@ FunctorCode FindSpannedLayerElementsFunctor::VisitMeasure(const Measure *measure // GetRelativeLayerElementFunctor //---------------------------------------------------------------------------- -GetRelativeLayerElementFunctor::GetRelativeLayerElementFunctor( - int elementIndex, bool searchDirection, bool anotherLayer) - : ConstFunctor() +GetRelativeLayerElementFunctor::GetRelativeLayerElementFunctor(int elementIndex, bool anotherLayer) : ConstFunctor() { m_relativeElement = NULL; m_initialElementIndex = elementIndex; - m_searchDirection = searchDirection; m_isInNeighboringLayer = anotherLayer; } @@ -263,8 +260,9 @@ FunctorCode GetRelativeLayerElementFunctor::VisitLayerElement(const LayerElement // processed (e.g. ignore index children of beams, since they have their own indices irrelevant to the one that // has been passed inside this functor) if (!m_isInNeighboringLayer && layerElement->GetParent()->Is(LAYER)) { - if ((m_searchDirection == FORWARD) && (layerElement->GetIdx() < m_initialElementIndex)) return FUNCTOR_SIBLINGS; - if ((m_searchDirection == BACKWARD) && (layerElement->GetIdx() > m_initialElementIndex)) + if ((this->GetDirection() == FORWARD) && (layerElement->GetIdx() < m_initialElementIndex)) + return FUNCTOR_SIBLINGS; + if ((this->GetDirection() == BACKWARD) && (layerElement->GetIdx() > m_initialElementIndex)) return FUNCTOR_SIBLINGS; } diff --git a/src/rest.cpp b/src/rest.cpp index 6a25a427ac..9f56a54f2d 100644 --- a/src/rest.cpp +++ b/src/rest.cpp @@ -398,13 +398,13 @@ int Rest::GetLocationRelativeToCurrentLayer(const Staff *currentStaff, const Lay const Object *nextElement = NULL; // Get previous and next elements from the current layer if (currentLayer->GetFirstChildNot(REST)) { - GetRelativeLayerElementFunctor getRelativeLayerElementBackwards(this->GetIdx(), BACKWARD, false); + GetRelativeLayerElementFunctor getRelativeLayerElementBackwards(this->GetIdx(), false); getRelativeLayerElementBackwards.PushDirection(BACKWARD); currentLayer->Process(getRelativeLayerElementBackwards); previousElement = getRelativeLayerElementBackwards.GetRelativeElement(); // search in other direction - GetRelativeLayerElementFunctor getRelativeLayerElementForwards(this->GetIdx(), FORWARD, false); + GetRelativeLayerElementFunctor getRelativeLayerElementForwards(this->GetIdx(), false); currentLayer->Process(getRelativeLayerElementForwards); nextElement = getRelativeLayerElementForwards.GetRelativeElement(); } @@ -470,7 +470,7 @@ int Rest::GetFirstRelativeElementLocation( if (((int)layers.size() != currentStaff->GetChildCount(LAYER)) || (layerIter == layers.end())) return VRV_UNSET; // Get last element if it's previous layer, get first one otherwise - GetRelativeLayerElementFunctor getRelativeLayerElement(this->GetIdx(), !isPrevious, true); + GetRelativeLayerElementFunctor getRelativeLayerElement(this->GetIdx(), true); getRelativeLayerElement.PushDirection(!isPrevious); (*layerIter)->Process(getRelativeLayerElement); From ca12de831e334e343e4a1ff86d4b0c8403e9abc0 Mon Sep 17 00:00:00 2001 From: David Bauer Date: Fri, 12 May 2023 09:36:50 +0200 Subject: [PATCH 070/151] Improve code style --- src/findlayerelementsfunctor.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/findlayerelementsfunctor.cpp b/src/findlayerelementsfunctor.cpp index f26e70e62c..8ffc22c460 100644 --- a/src/findlayerelementsfunctor.cpp +++ b/src/findlayerelementsfunctor.cpp @@ -260,10 +260,12 @@ FunctorCode GetRelativeLayerElementFunctor::VisitLayerElement(const LayerElement // processed (e.g. ignore index children of beams, since they have their own indices irrelevant to the one that // has been passed inside this functor) if (!m_isInNeighboringLayer && layerElement->GetParent()->Is(LAYER)) { - if ((this->GetDirection() == FORWARD) && (layerElement->GetIdx() < m_initialElementIndex)) + if ((this->GetDirection() == FORWARD) && (layerElement->GetIdx() < m_initialElementIndex)) { return FUNCTOR_SIBLINGS; - if ((this->GetDirection() == BACKWARD) && (layerElement->GetIdx() > m_initialElementIndex)) + } + if ((this->GetDirection() == BACKWARD) && (layerElement->GetIdx() > m_initialElementIndex)) { return FUNCTOR_SIBLINGS; + } } if (layerElement->Is({ NOTE, CHORD, FTREM })) { From e589ff914d0708ad56ffbdc30b46d41e070b3e84 Mon Sep 17 00:00:00 2001 From: Klaus Rettinghaus Date: Wed, 17 May 2023 08:52:37 +0200 Subject: [PATCH 071/151] unify spelling of color --- include/vrv/bboxdevicecontext.h | 6 ++-- include/vrv/devicecontext.h | 14 ++++---- include/vrv/devicecontextbase.h | 22 ++++++------ include/vrv/svgdevicecontext.h | 8 ++--- include/vrv/view.h | 4 +-- src/bboxdevicecontext.cpp | 6 ++-- src/devicecontext.cpp | 8 ++--- src/svgdevicecontext.cpp | 48 +++++++++++++------------- src/view.cpp | 2 +- src/view_control.cpp | 60 ++++++++++++++++----------------- src/view_element.cpp | 12 +++---- src/view_graph.cpp | 50 +++++++++++++-------------- src/view_page.cpp | 16 ++++----- src/view_running.cpp | 2 +- src/view_tab.cpp | 2 +- src/view_tuplet.cpp | 2 +- 16 files changed, 131 insertions(+), 131 deletions(-) diff --git a/include/vrv/bboxdevicecontext.h b/include/vrv/bboxdevicecontext.h index cb92131cff..e22c340861 100644 --- a/include/vrv/bboxdevicecontext.h +++ b/include/vrv/bboxdevicecontext.h @@ -49,11 +49,11 @@ class BBoxDeviceContext : public DeviceContext { * @name Setters */ ///@{ - void SetBackground(int colour, int style = AxSOLID) override; + void SetBackground(int color, int style = AxSOLID) override; void SetBackgroundImage(void *image, double opacity = 1.0) override{}; void SetBackgroundMode(int mode) override; - void SetTextForeground(int colour) override; - void SetTextBackground(int colour) override; + void SetTextForeground(int color) override; + void SetTextBackground(int color) override; void SetLogicalOrigin(int x, int y) override; void SetUserScale(double xScale, double yScale); ///@} diff --git a/include/vrv/devicecontext.h b/include/vrv/devicecontext.h index 75c5f88748..f0255c0b12 100644 --- a/include/vrv/devicecontext.h +++ b/include/vrv/devicecontext.h @@ -50,7 +50,7 @@ static inline double RadToDeg(double deg) * MusWxDC - a wrapper to wxDCs with wxWidgets; * SvgDeviceContext - a non-gui file DC; * MusCairoDC - a wrapper to a Cairo surface; - * The class uses int-based colour encoding (instead of wxColour in wxDC). + * The class uses int-based color encoding (instead of wxColor in wxDC). * It uses FontInfo (instead of wxFont in wxDC). */ @@ -137,20 +137,20 @@ class DeviceContext { * Non-virtual methods cannot be overridden and manage the Pen, Brush and FontInfo stacks */ ///@{ - void SetBrush(int colour, int opacity); + void SetBrush(int color, int opacity); void SetPen( - int colour, int width, int style, int dashLength = 0, int gapLength = 0, int lineCap = 0, int lineJoin = 0); + int color, int width, int style, int dashLength = 0, int gapLength = 0, int lineCap = 0, int lineJoin = 0); void SetFont(FontInfo *font); void SetPushBack() { m_pushBack = true; } void ResetBrush(); void ResetPen(); void ResetFont(); void ResetPushBack() { m_pushBack = false; } - virtual void SetBackground(int colour, int style = AxSOLID) = 0; + virtual void SetBackground(int color, int style = AxSOLID) = 0; virtual void SetBackgroundImage(void *image, double opacity = 1.0) = 0; virtual void SetBackgroundMode(int mode) = 0; - virtual void SetTextForeground(int colour) = 0; - virtual void SetTextBackground(int colour) = 0; + virtual void SetTextForeground(int color) = 0; + virtual void SetTextBackground(int color) = 0; virtual void SetLogicalOrigin(int x, int y) = 0; ///} @@ -317,7 +317,7 @@ class DeviceContext { // Static methods // //----------------// - /** Colour conversion method **/ + /** Color conversion method **/ static int RGB2Int(char red, char green, char blue) { return (red << 16 | green << 8 | blue); } private: diff --git a/include/vrv/devicecontextbase.h b/include/vrv/devicecontextbase.h index bacb438302..3db45409c4 100644 --- a/include/vrv/devicecontextbase.h +++ b/include/vrv/devicecontextbase.h @@ -71,11 +71,11 @@ enum { class Pen { public: Pen() - : m_penColour(0), m_penWidth(0), m_dashLength(0), m_gapLength(0), m_lineCap(0), m_lineJoin(0), m_penOpacity(0.0) + : m_penColor(0), m_penWidth(0), m_dashLength(0), m_gapLength(0), m_lineCap(0), m_lineJoin(0), m_penOpacity(0.0) { } - Pen(int colour, int width, float opacity, int dashLength, int gapLength, int lineCap, int lineJoin) - : m_penColour(colour) + Pen(int color, int width, float opacity, int dashLength, int gapLength, int lineCap, int lineJoin) + : m_penColor(color) , m_penWidth(width) , m_dashLength(dashLength) , m_gapLength(gapLength) @@ -85,8 +85,8 @@ class Pen { { } - int GetColour() const { return m_penColour; } - void SetColour(int colour) { m_penColour = colour; } + int GetColor() const { return m_penColor; } + void SetColor(int color) { m_penColor = color; } int GetWidth() const { return m_penWidth; } void SetWidth(int width) { m_penWidth = width; } int GetDashLength() const { return m_dashLength; } @@ -101,22 +101,22 @@ class Pen { void SetOpacity(float opacity) { m_penOpacity = opacity; } private: - int m_penColour, m_penWidth, m_dashLength, m_gapLength, m_lineCap, m_lineJoin; + int m_penColor, m_penWidth, m_dashLength, m_gapLength, m_lineCap, m_lineJoin; float m_penOpacity; }; class Brush { public: - Brush() : m_brushColour(0), m_brushOpacity(0.0) {} - Brush(int colour, float opacity) : m_brushColour(colour), m_brushOpacity(opacity) {} + Brush() : m_brushColor(0), m_brushOpacity(0.0) {} + Brush(int color, float opacity) : m_brushColor(color), m_brushOpacity(opacity) {} - int GetColour() const { return m_brushColour; } - void SetColour(int colour) { m_brushColour = colour; } + int GetColor() const { return m_brushColor; } + void SetColor(int color) { m_brushColor = color; } float GetOpacity() const { return m_brushOpacity; } void SetOpacity(float opacity) { m_brushOpacity = opacity; } private: - int m_brushColour; + int m_brushColor; float m_brushOpacity; }; diff --git a/include/vrv/svgdevicecontext.h b/include/vrv/svgdevicecontext.h index f0929facb6..9eed0baa79 100644 --- a/include/vrv/svgdevicecontext.h +++ b/include/vrv/svgdevicecontext.h @@ -52,11 +52,11 @@ class SvgDeviceContext : public DeviceContext { * @name Setters */ ///@{ - void SetBackground(int colour, int style = AxSOLID) override; + void SetBackground(int color, int style = AxSOLID) override; void SetBackgroundImage(void *image, double opacity = 1.0) override; void SetBackgroundMode(int mode) override; - void SetTextForeground(int colour) override; - void SetTextBackground(int colour) override; + void SetTextForeground(int color) override; + void SetTextBackground(int color) override; void SetLogicalOrigin(int x, int y) override; ///@} @@ -286,7 +286,7 @@ class SvgDeviceContext : public DeviceContext { void WriteLine(std::string); - std::string GetColour(int colour); + std::string GetColor(int color); pugi::xml_node AddChild(std::string name); diff --git a/include/vrv/view.h b/include/vrv/view.h index 575b918c40..4e3756a9a9 100644 --- a/include/vrv/view.h +++ b/include/vrv/view.h @@ -660,10 +660,10 @@ class View { protected: /** - * The colour currently being used when drawing. + * The color currently being used when drawing. * It can change when drawing the m_currentElement, for example */ - int m_currentColour; + int m_currentColor; /** * Control the handling of slurs diff --git a/src/bboxdevicecontext.cpp b/src/bboxdevicecontext.cpp index 74da9e9bfc..3ce136e037 100644 --- a/src/bboxdevicecontext.cpp +++ b/src/bboxdevicecontext.cpp @@ -92,7 +92,7 @@ void BBoxDeviceContext::StartPage() {} void BBoxDeviceContext::EndPage() {} -void BBoxDeviceContext::SetBackground(int colour, int style) +void BBoxDeviceContext::SetBackground(int color, int style) { // nothing to do, we do not handle Background } @@ -102,9 +102,9 @@ void BBoxDeviceContext::SetBackgroundMode(int mode) // nothing to do, we do not handle Background Mode } -void BBoxDeviceContext::SetTextForeground(int colour) {} +void BBoxDeviceContext::SetTextForeground(int color) {} -void BBoxDeviceContext::SetTextBackground(int colour) +void BBoxDeviceContext::SetTextBackground(int color) { // nothing to do, we do not handle Text Background Mode } diff --git a/src/devicecontext.cpp b/src/devicecontext.cpp index a67fc755d8..c601d8d6e0 100644 --- a/src/devicecontext.cpp +++ b/src/devicecontext.cpp @@ -129,7 +129,7 @@ const Resources *DeviceContext::GetResources(bool showWarning) const return m_resources; } -void DeviceContext::SetPen(int colour, int width, int style, int dashLength, int gapLength, int lineCap, int lineJoin) +void DeviceContext::SetPen(int color, int width, int style, int dashLength, int gapLength, int lineCap, int lineJoin) { float opacityValue; @@ -154,10 +154,10 @@ void DeviceContext::SetPen(int colour, int width, int style, int dashLength, int default: opacityValue = 1.0; // solid brush by default } - m_penStack.push(Pen(colour, width, opacityValue, dashLength, gapLength, lineCap, lineJoin)); + m_penStack.push(Pen(color, width, opacityValue, dashLength, gapLength, lineCap, lineJoin)); } -void DeviceContext::SetBrush(int colour, int opacity) +void DeviceContext::SetBrush(int color, int opacity) { float opacityValue; @@ -167,7 +167,7 @@ void DeviceContext::SetBrush(int colour, int opacity) default: opacityValue = 1.0; // solid brush by default } - m_brushStack.push(Brush(colour, opacityValue)); + m_brushStack.push(Brush(color, opacityValue)); } void DeviceContext::SetFont(FontInfo *font) diff --git a/src/svgdevicecontext.cpp b/src/svgdevicecontext.cpp index f25e186f02..45d520f14d 100644 --- a/src/svgdevicecontext.cpp +++ b/src/svgdevicecontext.cpp @@ -319,8 +319,8 @@ void SvgDeviceContext::StartGraphic( // m_currentNode.append_attribute("style") = StringFormat("stroke: #%s; stroke-opacity: %f; fill: #%s; fill-opacity: // %f;", - // this->GetColour(currentPen.GetColour()).c_str(), currentPen.GetOpacity(), - // this->GetColour(currentBrush.GetColour()).c_str(), currentBrush.GetOpacity()).c_str(); + // this->GetColor(currentPen.GetColor()).c_str(), currentPen.GetOpacity(), + // this->GetColor(currentBrush.GetColor()).c_str(), currentBrush.GetOpacity()).c_str(); } void SvgDeviceContext::StartCustomGraphic(std::string name, std::string gClass, std::string gId) @@ -503,7 +503,7 @@ void SvgDeviceContext::EndPage() m_currentNode = m_svgNodeStack.back(); } -void SvgDeviceContext::SetBackground(int colour, int style) +void SvgDeviceContext::SetBackground(int color, int style) { // nothing to do, we do not handle Background } @@ -515,12 +515,12 @@ void SvgDeviceContext::SetBackgroundMode(int mode) // nothing to do, we do not handle Background Mode } -void SvgDeviceContext::SetTextForeground(int colour) +void SvgDeviceContext::SetTextForeground(int color) { - m_brushStack.top().SetColour(colour); // we use the brush colour for text + m_brushStack.top().SetColor(color); // we use the brush color for text } -void SvgDeviceContext::SetTextBackground(int colour) +void SvgDeviceContext::SetTextBackground(int color) { // nothing to do, we do not handle Text Background Mode } @@ -587,7 +587,7 @@ void SvgDeviceContext::DrawQuadBezierPath(Point bezier[3]) bezier[1].x, bezier[1].y, bezier[2].x, bezier[2].y) .c_str(); pathChild.append_attribute("fill") = "none"; - pathChild.append_attribute("stroke") = this->GetColour(m_penStack.top().GetColour()).c_str(); + pathChild.append_attribute("stroke") = this->GetColor(m_penStack.top().GetColor()).c_str(); pathChild.append_attribute("stroke-linecap") = "round"; pathChild.append_attribute("stroke-linejoin") = "round"; pathChild.append_attribute("stroke-width") = m_penStack.top().GetWidth(); @@ -603,7 +603,7 @@ void SvgDeviceContext::DrawCubicBezierPath(Point bezier[4]) ) .c_str(); pathChild.append_attribute("fill") = "none"; - pathChild.append_attribute("stroke") = this->GetColour(m_penStack.top().GetColour()).c_str(); + pathChild.append_attribute("stroke") = this->GetColor(m_penStack.top().GetColor()).c_str(); pathChild.append_attribute("stroke-linecap") = "round"; pathChild.append_attribute("stroke-linejoin") = "round"; pathChild.append_attribute("stroke-width") = m_penStack.top().GetWidth(); @@ -621,7 +621,7 @@ void SvgDeviceContext::DrawCubicBezierPathFilled(Point bezier1[4], Point bezier2 .c_str(); // pathChild.append_attribute("fill") = "currentColor"; // pathChild.append_attribute("fill-opacity") = "1"; - pathChild.append_attribute("stroke") = this->GetColour(m_penStack.top().GetColour()).c_str(); + pathChild.append_attribute("stroke") = this->GetColor(m_penStack.top().GetColor()).c_str(); pathChild.append_attribute("stroke-linecap") = "round"; pathChild.append_attribute("stroke-linejoin") = "round"; // pathChild.append_attribute("stroke-opacity") = "1"; @@ -653,7 +653,7 @@ void SvgDeviceContext::DrawEllipse(int x, int y, int width, int height) if (currentPen.GetOpacity() != 1.0) ellipseChild.append_attribute("stroke-opacity") = currentPen.GetOpacity(); if (currentPen.GetWidth() > 0) { ellipseChild.append_attribute("stroke-width") = currentPen.GetWidth(); - ellipseChild.append_attribute("stroke") = this->GetColour(m_penStack.top().GetColour()).c_str(); + ellipseChild.append_attribute("stroke") = this->GetColor(m_penStack.top().GetColor()).c_str(); } } @@ -716,7 +716,7 @@ void SvgDeviceContext::DrawEllipticArc(int x, int y, int width, int height, doub if (currentPen.GetOpacity() != 1.0) pathChild.append_attribute("stroke-opacity") = currentPen.GetOpacity(); if (currentPen.GetWidth() > 0) { pathChild.append_attribute("stroke-width") = currentPen.GetWidth(); - pathChild.append_attribute("stroke") = this->GetColour(m_penStack.top().GetColour()).c_str(); + pathChild.append_attribute("stroke") = this->GetColor(m_penStack.top().GetColor()).c_str(); } } @@ -724,7 +724,7 @@ void SvgDeviceContext::DrawLine(int x1, int y1, int x2, int y2) { pugi::xml_node pathChild = AddChild("path"); pathChild.append_attribute("d") = StringFormat("M%d %d L%d %d", x1, y1, x2, y2).c_str(); - pathChild.append_attribute("stroke") = this->GetColour(m_penStack.top().GetColour()).c_str(); + pathChild.append_attribute("stroke") = this->GetColor(m_penStack.top().GetColor()).c_str(); if (m_penStack.top().GetWidth() > 1) pathChild.append_attribute("stroke-width") = m_penStack.top().GetWidth(); this->AppendStrokeLineCap(pathChild, m_penStack.top()); this->AppendStrokeDashArray(pathChild, m_penStack.top()); @@ -738,7 +738,7 @@ void SvgDeviceContext::DrawPolyline(int n, Point points[], int xOffset, int yOff pugi::xml_node polylineChild = AddChild("polyline"); if (currentPen.GetWidth() > 0) { - polylineChild.append_attribute("stroke") = this->GetColour(currentPen.GetColour()).c_str(); + polylineChild.append_attribute("stroke") = this->GetColor(currentPen.GetColor()).c_str(); } if (currentPen.GetWidth() > 1) { polylineChild.append_attribute("stroke-width") = StringFormat("%d", currentPen.GetWidth()).c_str(); @@ -771,7 +771,7 @@ void SvgDeviceContext::DrawPolygon(int n, Point points[], int xOffset, int yOffs pugi::xml_node polygonChild = AddChild("polygon"); if (currentPen.GetWidth() > 0) { - polygonChild.append_attribute("stroke") = this->GetColour(currentPen.GetColour()).c_str(); + polygonChild.append_attribute("stroke") = this->GetColor(currentPen.GetColor()).c_str(); } if (currentPen.GetWidth() > 1) { polygonChild.append_attribute("stroke-width") = StringFormat("%d", currentPen.GetWidth()).c_str(); @@ -783,8 +783,8 @@ void SvgDeviceContext::DrawPolygon(int n, Point points[], int xOffset, int yOffs this->AppendStrokeLineJoin(polygonChild, currentPen); this->AppendStrokeDashArray(polygonChild, currentPen); - if (currentBrush.GetColour() != AxNONE) - polygonChild.append_attribute("fill") = this->GetColour(currentBrush.GetColour()).c_str(); + if (currentBrush.GetColor() != AxNONE) + polygonChild.append_attribute("fill") = this->GetColor(currentBrush.GetColor()).c_str(); if (currentBrush.GetOpacity() != 1.0) polygonChild.append_attribute("fill-opacity") = StringFormat("%f", currentBrush.GetOpacity()).c_str(); @@ -807,7 +807,7 @@ void SvgDeviceContext::DrawRoundedRectangle(int x, int y, int width, int height, if (m_penStack.size()) { Pen currentPen = m_penStack.top(); if (currentPen.GetWidth() > 0) - rectChild.append_attribute("stroke") = this->GetColour(currentPen.GetColour()).c_str(); + rectChild.append_attribute("stroke") = this->GetColor(currentPen.GetColor()).c_str(); if (currentPen.GetWidth() > 1) rectChild.append_attribute("stroke-width") = StringFormat("%d", currentPen.GetWidth()).c_str(); if (currentPen.GetOpacity() != 1.0) @@ -816,8 +816,8 @@ void SvgDeviceContext::DrawRoundedRectangle(int x, int y, int width, int height, if (m_brushStack.size()) { Brush currentBrush = m_brushStack.top(); - if (currentBrush.GetColour() != AxNONE) - rectChild.append_attribute("fill") = this->GetColour(currentBrush.GetColour()).c_str(); + if (currentBrush.GetColor() != AxNONE) + rectChild.append_attribute("fill") = this->GetColor(currentBrush.GetColor()).c_str(); if (currentBrush.GetOpacity() != 1.0) rectChild.append_attribute("fill-opacity") = StringFormat("%f", currentBrush.GetOpacity()).c_str(); } @@ -1121,13 +1121,13 @@ void SvgDeviceContext::AppendAdditionalAttributes(Object *object) } } -std::string SvgDeviceContext::GetColour(int colour) +std::string SvgDeviceContext::GetColor(int color) { std::ostringstream ss; ss << "#"; ss << std::hex; - switch (colour) { + switch (color) { case (AxNONE): return "currentColor"; case (AxBLACK): return "#000000"; case (AxWHITE): return "#FFFFFF"; @@ -1137,9 +1137,9 @@ std::string SvgDeviceContext::GetColour(int colour) case (AxCYAN): return "#00FFFF"; case (AxLIGHT_GREY): return "#777777"; default: - int blue = (colour & 255); - int green = (colour >> 8) & 255; - int red = (colour >> 16) & 255; + int blue = (color & 255); + int green = (color >> 8) & 255; + int red = (color >> 16) & 255; ss << red << green << blue; // std::strin = wxDecToHex(char(red)) + wxDecToHex(char(green)) + wxDecToHex(char(blue)) ; // ax3 return ss.str(); diff --git a/src/view.cpp b/src/view.cpp index b2e33f1044..f9ee518f1e 100644 --- a/src/view.cpp +++ b/src/view.cpp @@ -31,7 +31,7 @@ View::View() m_pageIdx = 0; m_slurHandling = SlurHandling::Initialize; - m_currentColour = AxNONE; + m_currentColor = AxNONE; m_currentElement = NULL; m_currentLayer = NULL; m_currentMeasure = NULL; diff --git a/src/view_control.cpp b/src/view_control.cpp index 00e767bc71..8328e45142 100644 --- a/src/view_control.cpp +++ b/src/view_control.cpp @@ -462,8 +462,8 @@ void View::DrawBracketSpan( x1 += lineWidth / 2; x2 -= lineWidth / 2; - dc->SetPen(m_currentColour, lineWidth, AxSOLID, 0, 0, AxCAP_BUTT, AxJOIN_MITER); - dc->SetBrush(m_currentColour, AxSOLID); + dc->SetPen(m_currentColor, lineWidth, AxSOLID, 0, 0, AxCAP_BUTT, AxJOIN_MITER); + dc->SetBrush(m_currentColor, AxSOLID); if ((spanningType == SPANNING_START_END) || (spanningType == SPANNING_START)) { if (!bracketSpan->GetStart()->Is(TIMESTAMP_ATTR)) { @@ -494,11 +494,11 @@ void View::DrawBracketSpan( // We have a @lform - draw a full line if (bracketSpan->HasLform()) { if (bracketSpan->GetLform() == LINEFORM_dashed) { - dc->SetPen(m_currentColour, lineWidth, AxLONG_DASH, 0, 0, AxCAP_SQUARE); + dc->SetPen(m_currentColor, lineWidth, AxLONG_DASH, 0, 0, AxCAP_SQUARE); } else if (bracketSpan->GetLform() == LINEFORM_dotted) { // Adjust start and end - dc->SetPen(m_currentColour, lineWidth, AxDOT, 0, 0, AxCAP_ROUND); + dc->SetPen(m_currentColor, lineWidth, AxDOT, 0, 0, AxCAP_ROUND); x1 += unit + lineWidth * 2; x2 -= unit + lineWidth * 2; const int diff = (x2 - x1) % (lineWidth * 3 + 1); @@ -627,7 +627,7 @@ void View::DrawHairpin( const int cap = (style == AxDOT) ? AxCAP_ROUND : AxCAP_SQUARE; - dc->SetPen(m_currentColour, hairpinThickness, style, 0, 0, cap, AxJOIN_MITER); + dc->SetPen(m_currentColor, hairpinThickness, style, 0, 0, cap, AxJOIN_MITER); if ((startY == 0) && !niente) { Point p[3]; @@ -645,7 +645,7 @@ void View::DrawHairpin( } else { if (niente) { - dc->SetBrush(m_currentColour, AxTRANSPARENT); + dc->SetBrush(m_currentColor, AxTRANSPARENT); if (startY == 0) { dc->DrawCircle(ToDeviceContextX(x1), ToDeviceContextY(y), unit / 2); startY = unit * endY / (x2 - x1) / 2; @@ -753,12 +753,12 @@ void View::DrawOctave( x1 += lineWidth; if (altSymbols) x1 += extend.m_width / 2; - dc->SetPen(m_currentColour, lineWidth, AxSHORT_DASH, 0, gap, AxCAP_SQUARE); - dc->SetBrush(m_currentColour, AxSOLID); + dc->SetPen(m_currentColor, lineWidth, AxSHORT_DASH, 0, gap, AxCAP_SQUARE); + dc->SetBrush(m_currentColor, AxSOLID); if (octave->HasLform()) { if (octave->GetLform() == LINEFORM_solid) { - dc->SetPen(m_currentColour, lineWidth, AxSOLID, 0, 0, AxCAP_SQUARE); - dc->SetBrush(m_currentColour, AxSOLID); + dc->SetPen(m_currentColor, lineWidth, AxSOLID, 0, 0, AxCAP_SQUARE); + dc->SetBrush(m_currentColor, AxSOLID); } else if (octave->GetLform() == LINEFORM_dotted) { if ((spanningType == SPANNING_START_END) || (spanningType == SPANNING_END)) { @@ -766,8 +766,8 @@ void View::DrawOctave( const int diff = (x2 - x1) % (gap + 1); x2 += (gap - diff < diff) ? gap - diff : -diff; } - dc->SetPen(m_currentColour, lineWidth * 3 / 2, AxDOT, 0, gap, AxCAP_ROUND); - dc->SetBrush(m_currentColour, AxSOLID); + dc->SetPen(m_currentColor, lineWidth * 3 / 2, AxDOT, 0, gap, AxCAP_ROUND); + dc->SetBrush(m_currentColor, AxSOLID); } } @@ -790,12 +790,12 @@ void View::DrawOctave( if (octave->GetLform() == LINEFORM_dotted) { // make sure we have at least two dots for the dotted hook dc->SetPen( - m_currentColour, lineWidth * 3 / 2, AxDOT, 0, std::min(gap, unit * 2 - lineWidth), AxCAP_ROUND); + m_currentColor, lineWidth * 3 / 2, AxDOT, 0, std::min(gap, unit * 2 - lineWidth), AxCAP_ROUND); dc->DrawLine( ToDeviceContextX(x2), ToDeviceContextY(y1), ToDeviceContextX(x2), ToDeviceContextY(y2)); } else { - dc->SetPen(m_currentColour, lineWidth, AxSOLID); + dc->SetPen(m_currentColor, lineWidth, AxSOLID); // Right hook Point hookRight[3]; hookRight[0] = { ToDeviceContextX(x2), ToDeviceContextY(y2) }; @@ -898,8 +898,8 @@ void View::DrawPitchInflection(DeviceContext *dc, PitchInflection *pitchInflecti dc->StartGraphic(pitchInflection, "spanning-pinflection", ""); } - dc->SetPen(m_currentColour, m_doc->GetDrawingStemWidth(staff->m_drawingStaffSize), AxSOLID); - dc->SetBrush(m_currentColour, AxSOLID); + dc->SetPen(m_currentColor, m_doc->GetDrawingStemWidth(staff->m_drawingStaffSize), AxSOLID); + dc->SetBrush(m_currentColor, AxSOLID); dc->DrawQuadBezierPath(points); if (drawArrow) { @@ -1629,7 +1629,7 @@ void View::DrawDirOrOrnam(DeviceContext *dc, ControlElement *element, Measure *m params.m_y -= m_doc->GetTextXHeight(&dirTxt, false) / 2; } - dc->SetBrush(m_currentColour, AxSOLID); + dc->SetBrush(m_currentColor, AxSOLID); dc->SetFont(&dirTxt); dc->StartText(ToDeviceContextX(params.m_x - xAdjust), ToDeviceContextY(params.m_y), alignment); @@ -1710,7 +1710,7 @@ void View::DrawDynam(DeviceContext *dc, Dynam *dynam, Measure *measure, System * this->DrawDynamSymbolOnly(dc, staff, dynam, dynamSymbol, alignment, params); } else { - dc->SetBrush(m_currentColour, AxSOLID); + dc->SetBrush(m_currentColor, AxSOLID); dc->SetFont(&dynamTxt); dc->StartText(ToDeviceContextX(params.m_x), ToDeviceContextY(params.m_y), alignment); @@ -1789,7 +1789,7 @@ void View::DrawFb(DeviceContext *dc, Staff *staff, Fb *fb, TextDrawingParams &pa fontDim->SetPointSize(m_doc->GetDrawingLyricFont(staff->m_drawingStaffSize)->GetPointSize()); - dc->SetBrush(m_currentColour, AxSOLID); + dc->SetBrush(m_currentColor, AxSOLID); dc->SetFont(fontDim); for (Object *current : fb->GetChildren()) { @@ -1942,7 +1942,7 @@ void View::DrawFing(DeviceContext *dc, Fing *fing, Measure *measure, System *sys fingTxt.SetPointSize(params.m_pointSize); - dc->SetBrush(m_currentColour, AxSOLID); + dc->SetBrush(m_currentColor, AxSOLID); dc->SetFont(&fingTxt); dc->StartText(ToDeviceContextX(params.m_x), ToDeviceContextY(params.m_y), alignment); @@ -2070,21 +2070,21 @@ void View::DrawGliss(DeviceContext *dc, Gliss *gliss, int x1, int x2, Staff *sta break; } case LINEFORM_dashed: - dc->SetPen(m_currentColour, lineWidth, AxSHORT_DASH, 0, 0, AxCAP_ROUND, AxJOIN_ARCS); - dc->SetBrush(m_currentColour, AxSOLID); + dc->SetPen(m_currentColor, lineWidth, AxSHORT_DASH, 0, 0, AxCAP_ROUND, AxJOIN_ARCS); + dc->SetBrush(m_currentColor, AxSOLID); dc->DrawLine(ToDeviceContextX(x1), ToDeviceContextY(y1), ToDeviceContextX(x2), ToDeviceContextY(y2)); dc->ResetPen(); break; case LINEFORM_dotted: - dc->SetPen(m_currentColour, lineWidth * 3 / 2, AxDOT, 0, 0, AxCAP_ROUND, AxJOIN_ARCS); - dc->SetBrush(m_currentColour, AxSOLID); + dc->SetPen(m_currentColor, lineWidth * 3 / 2, AxDOT, 0, 0, AxCAP_ROUND, AxJOIN_ARCS); + dc->SetBrush(m_currentColor, AxSOLID); dc->DrawLine(ToDeviceContextX(x1), ToDeviceContextY(y1), ToDeviceContextX(x2), ToDeviceContextY(y2)); dc->ResetPen(); break; case LINEFORM_solid: [[fallthrough]]; default: { - dc->SetPen(m_currentColour, lineWidth, AxSOLID, 0, 0, AxCAP_ROUND, AxJOIN_ARCS); - dc->SetBrush(m_currentColour, AxSOLID); + dc->SetPen(m_currentColor, lineWidth, AxSOLID, 0, 0, AxCAP_ROUND, AxJOIN_ARCS); + dc->SetBrush(m_currentColor, AxSOLID); dc->DrawLine(ToDeviceContextX(x1), ToDeviceContextY(y1), ToDeviceContextX(x2), ToDeviceContextY(y2)); dc->ResetPen(); break; @@ -2146,7 +2146,7 @@ void View::DrawHarm(DeviceContext *dc, Harm *harm, Measure *measure, System *sys harmTxt.SetPointSize(params.m_pointSize); - dc->SetBrush(m_currentColour, AxSOLID); + dc->SetBrush(m_currentColor, AxSOLID); dc->SetFont(&harmTxt); dc->StartText(ToDeviceContextX(params.m_x), ToDeviceContextY(params.m_y), alignment); @@ -2442,7 +2442,7 @@ void View::DrawReh(DeviceContext *dc, Reh *reh, Measure *measure, System *system rehTxt.SetPointSize(params.m_pointSize); - dc->SetBrush(m_currentColour, AxSOLID); + dc->SetBrush(m_currentColor, AxSOLID); dc->SetFont(&rehTxt); dc->StartText(ToDeviceContextX(params.m_x), ToDeviceContextY(params.m_y), alignment); @@ -2504,7 +2504,7 @@ void View::DrawTempo(DeviceContext *dc, Tempo *tempo, Measure *measure, System * params.m_y -= m_doc->GetTextXHeight(&tempoTxt, false) / 2; } - dc->SetBrush(m_currentColour, AxSOLID); + dc->SetBrush(m_currentColor, AxSOLID); dc->SetFont(&tempoTxt); dc->StartText(ToDeviceContextX(params.m_x), ToDeviceContextY(params.m_y), alignment); @@ -2911,7 +2911,7 @@ void View::DrawEnding(DeviceContext *dc, Ending *ending, System *system) endX -= std::max(lineWidth + unit / 2 - rightBarLineWidth, 0); } - dc->SetPen(m_currentColour, lineWidth, AxSOLID, 0, 0, AxCAP_SQUARE, AxJOIN_MITER); + dc->SetPen(m_currentColor, lineWidth, AxSOLID, 0, 0, AxCAP_SQUARE, AxJOIN_MITER); Point p[4]; p[0] = { ToDeviceContextX(startX), ToDeviceContextY(y1) }; p[1] = { ToDeviceContextX(startX), ToDeviceContextY(y2) }; diff --git a/src/view_element.cpp b/src/view_element.cpp index c97689e04b..07c9fe8b89 100644 --- a/src/view_element.cpp +++ b/src/view_element.cpp @@ -73,13 +73,13 @@ void View::DrawLayerElement(DeviceContext *dc, LayerElement *element, Layer *lay return; } - int previousColor = m_currentColour; + int previousColor = m_currentColor; if (element == m_currentElement) { - m_currentColour = AxRED; + m_currentColor = AxRED; } else { - m_currentColour = AxNONE; + m_currentColor = AxNONE; } if (element->Is(ACCID)) { @@ -214,7 +214,7 @@ void View::DrawLayerElement(DeviceContext *dc, LayerElement *element, Layer *lay LogError("Element '%s' cannot be drawn", element->GetClassName().c_str()); } - m_currentColour = previousColor; + m_currentColor = previousColor; } //---------------------------------------------------------------------------- @@ -1703,7 +1703,7 @@ void View::DrawSyl(DeviceContext *dc, LayerElement *element, Layer *layer, Staff dc->StartGraphic(syl, "", syl->GetID()); dc->DeactivateGraphicY(); - dc->SetBrush(m_currentColour, AxSOLID); + dc->SetBrush(m_currentColor, AxSOLID); FontInfo currentFont = *m_doc->GetDrawingLyricFont(staff->m_drawingStaffSize); if (syl->HasFontweight()) { @@ -1815,7 +1815,7 @@ void View::DrawVerse(DeviceContext *dc, LayerElement *element, Layer *layer, Sta params.m_y = staff->GetDrawingY() + this->GetSylYRel(std::max(1, verse->GetN()), staff); params.m_pointSize = labelTxt.GetPointSize(); - dc->SetBrush(m_currentColour, AxSOLID); + dc->SetBrush(m_currentColor, AxSOLID); dc->SetFont(&labelTxt); dc->StartGraphic(graphic, "", graphic->GetID()); diff --git a/src/view_graph.cpp b/src/view_graph.cpp index 76a0d95c9d..76bf8ade51 100644 --- a/src/view_graph.cpp +++ b/src/view_graph.cpp @@ -28,8 +28,8 @@ void View::DrawVerticalLine(DeviceContext *dc, int y1, int y2, int x1, int width { assert(dc); - dc->SetPen(m_currentColour, std::max(1, ToDeviceContextX(width)), AxSOLID, dashLength, gapLength); - dc->SetBrush(m_currentColour, AxSOLID); + dc->SetPen(m_currentColor, std::max(1, ToDeviceContextX(width)), AxSOLID, dashLength, gapLength); + dc->SetBrush(m_currentColor, AxSOLID); dc->DrawLine(ToDeviceContextX(x1), ToDeviceContextY(y1), ToDeviceContextX(x1), ToDeviceContextY(y2)); @@ -42,8 +42,8 @@ void View::DrawHorizontalLine(DeviceContext *dc, int x1, int x2, int y1, int wid { assert(dc); - dc->SetPen(m_currentColour, std::max(1, ToDeviceContextX(width)), AxSOLID, dashLength, gapLength); - dc->SetBrush(m_currentColour, AxSOLID); + dc->SetPen(m_currentColor, std::max(1, ToDeviceContextX(width)), AxSOLID, dashLength, gapLength); + dc->SetBrush(m_currentColor, AxSOLID); dc->DrawLine(ToDeviceContextX(x1), ToDeviceContextY(y1), ToDeviceContextX(x2), ToDeviceContextY(y1)); @@ -78,8 +78,8 @@ void View::DrawNotFilledEllipse(DeviceContext *dc, int x1, int y1, int x2, int y std::swap(y1, y2); - dc->SetPen(m_currentColour, lineThickness, AxSOLID); - dc->SetBrush(m_currentColour, AxTRANSPARENT); + dc->SetPen(m_currentColor, lineThickness, AxSOLID); + dc->SetBrush(m_currentColor, AxTRANSPARENT); int width = x2 - x1; int height = y1 - y2; @@ -100,7 +100,7 @@ void View::DrawPartFilledRectangle(DeviceContext *dc, int x1, int y1, int x2, in std::swap(y1, y2); - // dc->SetPen(m_currentColour, 0, AxSOLID ); + // dc->SetPen(m_currentColor, 0, AxSOLID ); // dc->SetBrush(AxWHITE, AxTRANSPARENT); dc->SetPen(AxBLUE, 0, AxSOLID); dc->SetBrush(AxRED, AxTRANSPARENT); @@ -120,8 +120,8 @@ void View::DrawNotFilledRectangle(DeviceContext *dc, int x1, int y1, int x2, int std::swap(y1, y2); const int penWidth = lineThickness; - dc->SetPen(m_currentColour, penWidth, AxSOLID); - dc->SetBrush(m_currentColour, AxTRANSPARENT); + dc->SetPen(m_currentColor, penWidth, AxSOLID); + dc->SetBrush(m_currentColor, AxTRANSPARENT); dc->DrawRoundedRectangle( ToDeviceContextX(x1), ToDeviceContextY(y1), ToDeviceContextX(x2 - x1), ToDeviceContextX(y1 - y2), radius); @@ -148,8 +148,8 @@ void View::DrawFilledRoundedRectangle(DeviceContext *dc, int x1, int y1, int x2, std::swap(y1, y2); - dc->SetPen(m_currentColour, 0, AxSOLID); - dc->SetBrush(m_currentColour, AxSOLID); + dc->SetPen(m_currentColor, 0, AxSOLID); + dc->SetBrush(m_currentColor, AxSOLID); dc->DrawRoundedRectangle( ToDeviceContextX(x1), ToDeviceContextY(y1), ToDeviceContextX(x2 - x1), ToDeviceContextX(y1 - y2), radius); @@ -166,8 +166,8 @@ void View::DrawObliquePolygon(DeviceContext *dc, int x1, int y1, int x2, int y2, { Point p[4]; - dc->SetPen(m_currentColour, 0, AxSOLID); - dc->SetBrush(m_currentColour, AxSOLID); + dc->SetPen(m_currentColor, 0, AxSOLID); + dc->SetBrush(m_currentColor, AxSOLID); height = ToDeviceContextX(height); p[0].x = ToDeviceContextX(x1); @@ -191,12 +191,12 @@ void View::DrawDiamond(DeviceContext *dc, int x1, int y1, int height, int width, { Point p[4]; - dc->SetPen(m_currentColour, linewidth, AxSOLID); + dc->SetPen(m_currentColor, linewidth, AxSOLID); if (fill) { - dc->SetBrush(m_currentColour, AxSOLID); + dc->SetBrush(m_currentColor, AxSOLID); } else { - dc->SetBrush(m_currentColour, AxTRANSPARENT); + dc->SetBrush(m_currentColor, AxTRANSPARENT); } int dHeight = ToDeviceContextX(height); @@ -221,8 +221,8 @@ void View::DrawDot(DeviceContext *dc, int x, int y, int staffSize, bool dimin) int r = std::max(ToDeviceContextX(m_doc->GetDrawingDoubleUnit(staffSize) / 5), 2); if (dimin) r *= m_doc->GetOptions()->m_graceFactor.GetValue(); - dc->SetPen(m_currentColour, 0, AxSOLID); - dc->SetBrush(m_currentColour, AxSOLID); + dc->SetPen(m_currentColor, 0, AxSOLID); + dc->SetBrush(m_currentColor, AxSOLID); dc->DrawCircle(ToDeviceContextX(x), ToDeviceContextY(y), r); @@ -238,8 +238,8 @@ void View::DrawVerticalDots(DeviceContext *dc, int x, const SegmentedLine &line, const int radius = std::max(barlineWidth, 2); int drawingPosition = top - interval / 2; - dc->SetPen(m_currentColour, 0, AxSOLID); - dc->SetBrush(m_currentColour, AxSOLID); + dc->SetPen(m_currentColor, 0, AxSOLID); + dc->SetBrush(m_currentColor, AxSOLID); while (drawingPosition > bottom) { dc->DrawCircle(ToDeviceContextX(x), ToDeviceContextY(drawingPosition), radius); @@ -285,7 +285,7 @@ void View::DrawSmuflCode(DeviceContext *dc, int x, int y, char32_t code, int sta std::u32string str; str.push_back(code); - dc->SetBrush(m_currentColour, AxSOLID); + dc->SetBrush(m_currentColor, AxSOLID); dc->SetFont(m_doc->GetDrawingSmuflFont(staffSize, dimin)); dc->DrawMusicText(str, ToDeviceContextX(x), ToDeviceContextY(y), setBBGlyph); @@ -312,7 +312,7 @@ void View::DrawSmuflLine( // We add half a fill length for an average shorter / longer line result const int count = (length + fillWidth / 2 - startWidth - endWidth) / fillWidth; - dc->SetBrush(m_currentColour, AxSOLID); + dc->SetBrush(m_currentColor, AxSOLID); dc->SetFont(m_doc->GetDrawingSmuflFont(staffSize, dimin)); std::u32string str; @@ -342,7 +342,7 @@ void View::DrawSmuflString(DeviceContext *dc, int x, int y, std::u32string s, da int xDC = ToDeviceContextX(x); - dc->SetBrush(m_currentColour, AxSOLID); + dc->SetBrush(m_currentColor, AxSOLID); dc->SetFont(m_doc->GetDrawingSmuflFont(staffSize, dimin)); if (alignment == HORIZONTALALIGNMENT_center) { @@ -384,12 +384,12 @@ void View::DrawThickBezierCurve( // Actually draw it if (penStyle == AxSOLID) { // Solid Thick Bezier Curves are made of two beziers, filled in. - dc->SetPen(m_currentColour, std::max(1, m_doc->GetDrawingStemWidth(staffSize) / 2), penStyle); + dc->SetPen(m_currentColor, std::max(1, m_doc->GetDrawingStemWidth(staffSize) / 2), penStyle); dc->DrawCubicBezierPathFilled(bez1, bez2); } else { // Dashed or Dotted Thick Bezier Curves have a uniform line width. - dc->SetPen(m_currentColour, thickness, penStyle); + dc->SetPen(m_currentColor, thickness, penStyle); dc->DrawCubicBezierPath(bez1); } dc->ResetPen(); diff --git a/src/view_page.cpp b/src/view_page.cpp index bbd4335f0d..98fdd27732 100644 --- a/src/view_page.cpp +++ b/src/view_page.cpp @@ -568,7 +568,7 @@ void View::DrawLabels( params.m_y = y; params.m_pointSize = labelTxt.GetPointSize(); - dc->SetBrush(m_currentColour, AxSOLID); + dc->SetBrush(m_currentColor, AxSOLID); dc->SetFont(&labelTxt); dc->StartGraphic(graphic, "", graphic->GetID()); @@ -692,8 +692,8 @@ void View::DrawBrace(DeviceContext *dc, int x, int y1, int y2, int staffSize) bez2[2] = points[2]; bez2[3] = points[3]; - dc->SetPen(m_currentColour, std::max(1, penWidth), AxSOLID); - dc->SetBrush(m_currentColour, AxSOLID); + dc->SetPen(m_currentColor, std::max(1, penWidth), AxSOLID); + dc->SetBrush(m_currentColor, AxSOLID); dc->DrawCubicBezierPathFilled(bez1, bez2); @@ -1202,7 +1202,7 @@ void View::DrawMNum(DeviceContext *dc, MNum *mnum, Measure *measure, System *sys mnumTxt.SetPointSize(m_doc->GetDrawingLyricFont(80)->GetPointSize()); } - dc->SetBrush(m_currentColour, AxSOLID); + dc->SetBrush(m_currentColor, AxSOLID); dc->SetFont(&mnumTxt); dc->StartText(ToDeviceContextX(params.m_x), ToDeviceContextY(params.m_y), alignment); @@ -1296,8 +1296,8 @@ void View::DrawStaffLines(DeviceContext *dc, Staff *staff, Measure *measure, Sys } const int lineWidth = m_doc->GetDrawingStaffLineWidth(staff->m_drawingStaffSize); - dc->SetPen(m_currentColour, ToDeviceContextX(lineWidth), AxSOLID); - dc->SetBrush(m_currentColour, AxSOLID); + dc->SetPen(m_currentColor, ToDeviceContextX(lineWidth), AxSOLID); + dc->SetBrush(m_currentColor, AxSOLID); for (j = 0; j < staff->m_drawingLines; ++j) { // Skewed lines - with Facs (neumes) only for now @@ -1364,8 +1364,8 @@ void View::DrawLedgerLines(DeviceContext *dc, Staff *staff, const ArrayOfLedgerL = m_doc->GetOptions()->m_ledgerLineThickness.GetValue() * m_doc->GetDrawingUnit(staff->m_drawingStaffSize); if (cueSize) lineWidth *= m_doc->GetOptions()->m_graceFactor.GetValue(); - dc->SetPen(m_currentColour, ToDeviceContextX(lineWidth), AxSOLID); - dc->SetBrush(m_currentColour, AxSOLID); + dc->SetPen(m_currentColor, ToDeviceContextX(lineWidth), AxSOLID); + dc->SetBrush(m_currentColor, AxSOLID); for (const LedgerLine &line : lines) { for (const std::pair &dash : line.m_dashes) { diff --git a/src/view_running.cpp b/src/view_running.cpp index d498d215f4..a355d195a5 100644 --- a/src/view_running.cpp +++ b/src/view_running.cpp @@ -71,7 +71,7 @@ void View::DrawPgHeader(DeviceContext *dc, RunningElement *pgHeader) pgHeadTxt.SetPointSize(params.m_pointSize); - dc->SetBrush(m_currentColour, AxSOLID); + dc->SetBrush(m_currentColor, AxSOLID); dc->SetFont(&pgHeadTxt); this->DrawRunningChildren(dc, pgHeader, params); diff --git a/src/view_tab.cpp b/src/view_tab.cpp index 6e22d177e0..ecd12728ca 100644 --- a/src/view_tab.cpp +++ b/src/view_tab.cpp @@ -121,7 +121,7 @@ void View::DrawTabNote(DeviceContext *dc, LayerElement *element, Layer *layer, S params.m_pointSize = m_doc->GetDrawingLyricFont(glyphSize)->GetPointSize() * 4 / 5; fretTxt.SetPointSize(params.m_pointSize); - dc->SetBrush(m_currentColour, AxSOLID); + dc->SetBrush(m_currentColor, AxSOLID); dc->SetFont(&fretTxt); params.m_y -= (m_doc->GetTextGlyphHeight(L'0', &fretTxt, drawingCueSize) / 2); diff --git a/src/view_tuplet.cpp b/src/view_tuplet.cpp index 8005e8a542..bc37cf129f 100644 --- a/src/view_tuplet.cpp +++ b/src/view_tuplet.cpp @@ -107,7 +107,7 @@ void View::DrawTupletBracket(DeviceContext *dc, LayerElement *element, Layer *la const int yRight = tupletBracket->GetDrawingYRight(); int bracketHeight = (tuplet->GetDrawingBracketPos() == STAFFREL_basic_above) ? -1 : 1; - dc->SetPen(m_currentColour, lineWidth, AxSOLID, 0, 0, AxCAP_BUTT, AxJOIN_MITER); + dc->SetPen(m_currentColor, lineWidth, AxSOLID, 0, 0, AxCAP_BUTT, AxJOIN_MITER); // Draw a bracket with a gap if (tupletBracket->GetAlignedNum() && tupletBracket->GetAlignedNum()->HasSelfBB()) { From b8ba57d5119cba647d125819aaa8b0c9a8ecc171 Mon Sep 17 00:00:00 2001 From: Alpha Date: Wed, 17 May 2023 08:29:52 -0400 Subject: [PATCH 072/151] fix json "\uXXXX" parsing --- src/json/jsonxx.cc | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/src/json/jsonxx.cc b/src/json/jsonxx.cc index 511fe2fb36..302a155088 100644 --- a/src/json/jsonxx.cc +++ b/src/json/jsonxx.cc @@ -121,8 +121,24 @@ bool parse_string(std::istream& input, String& value) { input.get(ch); ss << std::hex << ch; } - if( input.good() && (ss >> i) ) - value.push_back(static_cast(i)); + if (input.good() && (ss >> i)) { + // Encode codepoint via utf-8. + if (i < 0x80) { + value.push_back(static_cast(i)); + } else if (i < 0x800) { + value.push_back(static_cast((i >> 6) | 0xc0)); + value.push_back(static_cast((i & 0x3f) | 0x80)); + } else if (i < 0x10000) { + value.push_back(static_cast((i >> 12) | 0xe0)); + value.push_back(static_cast(((i >> 6) & 0x3f) | 0x80)); + value.push_back(static_cast((i & 0x3f) | 0x80)); + } else { + value.push_back(static_cast((i >> 18) | 0xf0)); + value.push_back(static_cast(((i >> 12) & 0x3f) | 0x80)); + value.push_back(static_cast(((i >> 6) & 0x3f) | 0x80)); + value.push_back(static_cast((i & 0x3f) | 0x80)); + } + } } break; default: From 9e4c6ba24e452f8445c8bbd65c467ef748d1caa3 Mon Sep 17 00:00:00 2001 From: Laurent Pugin Date: Mon, 22 May 2023 16:26:27 +0200 Subject: [PATCH 073/151] Fix to the java binding makefile [skip-ci] --- bindings/java/build.sh | 25 ++++--------------------- bindings/java/pom.xml | 4 ++-- 2 files changed, 6 insertions(+), 23 deletions(-) diff --git a/bindings/java/build.sh b/bindings/java/build.sh index fbf4cbeed5..18ab52448d 100755 --- a/bindings/java/build.sh +++ b/bindings/java/build.sh @@ -11,7 +11,7 @@ cd java swig -c++ -java -package org.rismch.verovio -outdir src/main/java/org/rismch/verovio verovio.i -SRCFILES=$(\ls ../../src/*.cpp) +SRCFILES=$(\ls ../../src/*.cpp \ls ../../libmei/dist/*.cpp \ls ../../libmei/addons/*.cpp) FILES="$SRCFILES \ ../../src/pugi/pugixml.cpp \ @@ -22,26 +22,9 @@ FILES="$SRCFILES \ ../../src/midi/MidiMessage.cpp \ ../../src/hum/humlib.cpp \ ../../src/json/jsonxx.cc \ - ../../src/crc/crc.cpp \ - ../../libmei/attconverter.cpp \ - ../../libmei/atts_analytical.cpp \ - ../../libmei/atts_cmn.cpp \ - ../../libmei/atts_cmnornaments.cpp \ - ../../libmei/atts_critapp.cpp \ - ../../libmei/atts_frettab.cpp \ - ../../libmei/atts_gestural.cpp \ - ../../libmei/atts_externalsymbols.cpp \ - ../../libmei/atts_facsimile.cpp \ - ../../libmei/atts_frettab.cpp \ - ../../libmei/atts_mei.cpp \ - ../../libmei/atts_mensural.cpp \ - ../../libmei/atts_midi.cpp \ - ../../libmei/atts_neumes.cpp \ - ../../libmei/atts_pagebased.cpp \ - ../../libmei/atts_shared.cpp \ - ../../libmei/atts_visual.cpp" - -CXXOPTS="-g -fpic -std=c++17 -I../../include -I../../include/vrv -I../../include/json -I../../include/hum -I../../include/crc -I../../include/midi -I../../include/pugi -I../../include/zip -I../../libmei -I/opt/local/include/ " + ../../src/crc/crc.cpp" + +CXXOPTS="-g -fpic -std=c++17 -I../../include -I../../include/vrv -I../../include/json -I../../include/hum -I../../include/crc -I../../include/midi -I../../include/pugi -I../../include/zip -I../../libmei/addons -I../../libmei/dist -I/opt/local/include/ " PATHS="" unamestr=$(uname) diff --git a/bindings/java/pom.xml b/bindings/java/pom.xml index 82385a1a27..b9843f0e20 100644 --- a/bindings/java/pom.xml +++ b/bindings/java/pom.xml @@ -12,8 +12,8 @@ UTF-8 - 1.7 - 1.7 + 1.8 + 1.8 From 2c65ec34cdc176d1c04f8d5f185291622c0ed087 Mon Sep 17 00:00:00 2001 From: Klaus Rettinghaus Date: Mon, 22 May 2023 17:29:10 +0200 Subject: [PATCH 074/151] update header script to apply to clang format --- bindings/iOS/all.h | 427 +++++++++---------- bindings/iOS/create_ios_framework_headers.sh | 3 +- 2 files changed, 214 insertions(+), 216 deletions(-) diff --git a/bindings/iOS/all.h b/bindings/iOS/all.h index c23b905bcb..6a45301f91 100644 --- a/bindings/iOS/all.h +++ b/bindings/iOS/all.h @@ -1,249 +1,248 @@ #ifndef all_h #define all_h -#import -#import -#import -#import -#import -#import -#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import #import -#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import #import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import +#import +#import +#import #import -#import -#import +#import +#import #import -#import -#import -#import +#import #import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import #import -#import -#import -#import -#import -#import -#import -#import -#import +#import #import -#import -#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import #import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import #import -#import -#import -#import -#import -#import -#import -#import +#import #import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import +#import +#import +#import +#import +#import #import -#import -#import -#import -#import -#import +#import +#import #import -#import -#import -#import -#import +#import +#import #import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import +#import +#import +#import +#import +#import #import -#import -#import -#import -#import -#import -#import -#import -#import -#import +#import +#import +#import +#import +#import +#import +#import +#import +#import #import -#import -#import -#import -#import -#import -#import -#import +#import +#import +#import +#import +#import +#import #import -#import -#import +#import +#import +#import +#import +#import +#import +#import +#import #import -#import -#import +#import +#import #import -#import -#import -#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import #import -#import -#import -#import -#import -#import -#import -#import -#import +#import #import -#import -#import -#import -#import -#import -#import -#import +#import +#import #import -#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import #import +#import +#import #import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import +#import +#import +#import +#import +#import #import +#import +#import #import -#import -#import -#import -#import -#import -#import -#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import #import -#import -#import -#import -#import +#import #import -#import -#import -#import -#import -#import +#import +#import +#import +#import +#import +#import +#import #import -#import -#import -#import -#import +#import +#import +#import +#import +#import +#import #import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import #import -#import -#import -#import -#import -#import -#import +#import +#import +#import +#import +#import +#import +#import +#import +#import #import -#import -#import -#import -#import -#import -#import -#import -#import -#import +#import +#import +#import #import -#import -#import -#import -#import -#import -#import -#import -#import +#import #endif /* all_h */ - diff --git a/bindings/iOS/create_ios_framework_headers.sh b/bindings/iOS/create_ios_framework_headers.sh index 7f5e329d9e..d20d7c3125 100755 --- a/bindings/iOS/create_ios_framework_headers.sh +++ b/bindings/iOS/create_ios_framework_headers.sh @@ -7,11 +7,10 @@ output="./bindings/iOS/all.h" echo "#ifndef all_h" > "$output" echo "#define all_h" >> "$output" -for header in $(find ./include -name '*.h'); do +for header in $(find ./include -name '*.h' | sort -t/ -k4); do if [[ $header != *"win32"* ]]; then echo "#import " >> "$output" fi done echo "#endif /* all_h */" >> "$output" -echo "" >> "$output" From 3d4e25442e7c0d2767b8ad71e183236e5d4342b1 Mon Sep 17 00:00:00 2001 From: Klaus Rettinghaus Date: Wed, 17 May 2023 10:18:54 +0200 Subject: [PATCH 075/151] only add fill for complex polylines --- src/svgdevicecontext.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/svgdevicecontext.cpp b/src/svgdevicecontext.cpp index 45d520f14d..77e5556d53 100644 --- a/src/svgdevicecontext.cpp +++ b/src/svgdevicecontext.cpp @@ -751,7 +751,7 @@ void SvgDeviceContext::DrawPolyline(int n, Point points[], int xOffset, int yOff this->AppendStrokeLineJoin(polylineChild, currentPen); this->AppendStrokeDashArray(polylineChild, currentPen); - polylineChild.append_attribute("fill") = "none"; + if (n > 2) polylineChild.append_attribute("fill") = "none"; std::string pointsString; for (int i = 0; i < n; ++i) { From c501f6e3476d198856a8f4a34dd3a50df6fca37e Mon Sep 17 00:00:00 2001 From: Klaus Rettinghaus Date: Tue, 23 May 2023 12:23:42 +0200 Subject: [PATCH 076/151] remove superfluous joins --- src/view_control.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/view_control.cpp b/src/view_control.cpp index 8328e45142..f53115feb7 100644 --- a/src/view_control.cpp +++ b/src/view_control.cpp @@ -2070,20 +2070,20 @@ void View::DrawGliss(DeviceContext *dc, Gliss *gliss, int x1, int x2, Staff *sta break; } case LINEFORM_dashed: - dc->SetPen(m_currentColor, lineWidth, AxSHORT_DASH, 0, 0, AxCAP_ROUND, AxJOIN_ARCS); + dc->SetPen(m_currentColor, lineWidth, AxSHORT_DASH, 0, 0, AxCAP_ROUND); dc->SetBrush(m_currentColor, AxSOLID); dc->DrawLine(ToDeviceContextX(x1), ToDeviceContextY(y1), ToDeviceContextX(x2), ToDeviceContextY(y2)); dc->ResetPen(); break; case LINEFORM_dotted: - dc->SetPen(m_currentColor, lineWidth * 3 / 2, AxDOT, 0, 0, AxCAP_ROUND, AxJOIN_ARCS); + dc->SetPen(m_currentColor, lineWidth * 3 / 2, AxDOT, 0, 0, AxCAP_ROUND); dc->SetBrush(m_currentColor, AxSOLID); dc->DrawLine(ToDeviceContextX(x1), ToDeviceContextY(y1), ToDeviceContextX(x2), ToDeviceContextY(y2)); dc->ResetPen(); break; case LINEFORM_solid: [[fallthrough]]; default: { - dc->SetPen(m_currentColor, lineWidth, AxSOLID, 0, 0, AxCAP_ROUND, AxJOIN_ARCS); + dc->SetPen(m_currentColor, lineWidth, AxSOLID, 0, 0, AxCAP_ROUND); dc->SetBrush(m_currentColor, AxSOLID); dc->DrawLine(ToDeviceContextX(x1), ToDeviceContextY(y1), ToDeviceContextX(x2), ToDeviceContextY(y2)); dc->ResetPen(); From d74055dee0e788022d9efc899bf64815ec08745f Mon Sep 17 00:00:00 2001 From: David Bauer Date: Thu, 25 May 2023 08:36:22 +0200 Subject: [PATCH 077/151] Consider @loc for diatonic pitch --- include/vrv/note.h | 2 +- src/note.cpp | 12 ++++++++++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/include/vrv/note.h b/include/vrv/note.h index db8ba2ed3c..45c1e124a4 100644 --- a/include/vrv/note.h +++ b/include/vrv/note.h @@ -190,7 +190,7 @@ class Note : public LayerElement, /** * Returns a single integer representing pitch and octave. */ - int GetDiatonicPitch() const { return this->GetPname() + (int)this->GetOct() * 7; } + int GetDiatonicPitch() const; /** * Get the stem up / stem down attachment point. diff --git a/src/note.cpp b/src/note.cpp index fe8f758a62..f75965eb6c 100644 --- a/src/note.cpp +++ b/src/note.cpp @@ -352,6 +352,18 @@ void Note::SetNoteGroup(ChordNoteGroup *noteGroup, int position) m_noteGroupPosition = position; } +int Note::GetDiatonicPitch() const +{ + if (this->HasOct()) { + const int pitch = this->HasPname() ? (this->GetPname() - 1) : 0; + return this->GetOct() * 7 + pitch; + } + else if (this->HasLoc()) { + return this->GetLoc(); + } + return 0; +} + Point Note::GetStemUpSE(const Doc *doc, int staffSize, bool isCueSize) const { int defaultYShift = doc->GetDrawingUnit(staffSize) / 4; From ff810bddea9cc64aa5b7fccf131b436ead9feb28 Mon Sep 17 00:00:00 2001 From: Laurent Pugin Date: Thu, 25 May 2023 09:43:25 +0200 Subject: [PATCH 078/151] Remove duplicated `ls` in java binding script [skip-ci] --- bindings/java/build.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bindings/java/build.sh b/bindings/java/build.sh index 18ab52448d..9b4a138d0a 100755 --- a/bindings/java/build.sh +++ b/bindings/java/build.sh @@ -11,7 +11,7 @@ cd java swig -c++ -java -package org.rismch.verovio -outdir src/main/java/org/rismch/verovio verovio.i -SRCFILES=$(\ls ../../src/*.cpp \ls ../../libmei/dist/*.cpp \ls ../../libmei/addons/*.cpp) +SRCFILES=$(\ls ../../src/*.cpp ../../libmei/dist/*.cpp ../../libmei/addons/*.cpp) FILES="$SRCFILES \ ../../src/pugi/pugixml.cpp \ From 63efd098ab64b47477a87ad418585996ffe2559f Mon Sep 17 00:00:00 2001 From: David Bauer Date: Thu, 25 May 2023 09:48:35 +0200 Subject: [PATCH 079/151] Use clef loc offset --- src/layer.cpp | 6 ++++-- src/note.cpp | 15 ++++++++++++++- 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/src/layer.cpp b/src/layer.cpp index 13805664b1..9dd3ad94e9 100644 --- a/src/layer.cpp +++ b/src/layer.cpp @@ -496,8 +496,10 @@ Clef *Layer::GetCurrentClef() const Clef *Layer::GetCurrentClef() const { const Staff *staff = vrv_cast(this->GetFirstAncestor(STAFF)); - assert(staff && staff->m_drawingStaffDef && staff->m_drawingStaffDef->GetCurrentClef()); - return staff->m_drawingStaffDef->GetCurrentClef(); + if (staff && staff->m_drawingStaffDef) { + return staff->m_drawingStaffDef->GetCurrentClef(); + } + return NULL; } KeySig *Layer::GetCurrentKeySig() diff --git a/src/note.cpp b/src/note.cpp index f75965eb6c..898fc3ad3d 100644 --- a/src/note.cpp +++ b/src/note.cpp @@ -359,7 +359,20 @@ int Note::GetDiatonicPitch() const return this->GetOct() * 7 + pitch; } else if (this->HasLoc()) { - return this->GetLoc(); + // WARNING: Getting the correct clef loc offset does not work at an early stage of the processing. + // It requires that m_drawingStaffDef is set on staff and that m_crossStaff + m_crossLayer are calculated. + // However, in many cases we are only interested in a relative pitch value. Then this is still fine. + const Layer *layer = vrv_cast(this->GetFirstAncestor(LAYER)); + const LayerElement *layerElementY = this; + if (m_crossStaff && m_crossLayer) { + layerElementY = m_crossLayer->GetAtPos(this->GetDrawingX()); + layer = m_crossLayer; + } + assert(layer); + + const int clefLocOffset = layer->GetClefLocOffset(layerElementY); + + return this->GetLoc() + OCTAVE_OFFSET * 7 - clefLocOffset; } return 0; } From 33b8e3c83fa3403b46bb34b722e3ed3ffca42c36 Mon Sep 17 00:00:00 2001 From: Laurent Pugin Date: Thu, 25 May 2023 12:12:52 +0200 Subject: [PATCH 080/151] Add commented example for JAVA_HOME [skip-ci] --- bindings/java/build.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/bindings/java/build.sh b/bindings/java/build.sh index 9b4a138d0a..37b6c01435 100755 --- a/bindings/java/build.sh +++ b/bindings/java/build.sh @@ -31,6 +31,7 @@ unamestr=$(uname) if [[ "$unamestr" == 'Linux' ]]; then PATHS="-I$JAVA_HOME/include -I$JAVA_HOME/include/linux " # paths to java libraries elif [[ "$unamestr" == 'Darwin' ]]; then + #JAVA_HOME="/opt/homebrew/Cellar/openjdk/20.0.1/libexec/openjdk.jdk/Contents/Home" JAVA_HOME=$(/usr/libexec/java_home) PATHS="-I$JAVA_HOME/include -I$JAVA_HOME/include/darwin" fi From 309ea4b58df1d16fdcfb95a5e445c3911421dbea Mon Sep 17 00:00:00 2001 From: David Bauer Date: Thu, 25 May 2023 10:52:12 +0200 Subject: [PATCH 081/151] Move Pb/Sb to system elements --- Verovio.xcodeproj/project.pbxproj | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Verovio.xcodeproj/project.pbxproj b/Verovio.xcodeproj/project.pbxproj index 04dec6a933..b8d436ebcc 100644 --- a/Verovio.xcodeproj/project.pbxproj +++ b/Verovio.xcodeproj/project.pbxproj @@ -2410,6 +2410,10 @@ 4DF440741D39567A00152B7E /* ending.h */, 40ABF1FE1E5DF23B00F32F41 /* expansion.cpp */, 40ABF1FD1E5DF23B00F32F41 /* expansion.h */, + 40C2E41B2052A6E00003625F /* pb.cpp */, + 40C2E41D2052A6E00003625F /* pb.h */, + 40C2E41A2052A6DF0003625F /* sb.cpp */, + 40C2E41C2052A6E00003625F /* sb.h */, 4D95D4F11D6E042400B2B856 /* section.cpp */, 4D95D4F01D6E041E00B2B856 /* section.h */, 4D95D4F81D718D4A00B2B856 /* systemelement.cpp */, @@ -2831,10 +2835,6 @@ 8F59292518854BF800FE51AD /* page.h */, 4D6413772035F58200BB630E /* pages.cpp */, 4D6413752035F57800BB630E /* pages.h */, - 40C2E41B2052A6E00003625F /* pb.cpp */, - 40C2E41D2052A6E00003625F /* pb.h */, - 40C2E41A2052A6DF0003625F /* sb.cpp */, - 40C2E41C2052A6E00003625F /* sb.h */, 8F086ED2188539540037FD8E /* scoredef.cpp */, 8F59292918854BF800FE51AD /* scoredef.h */, 4D4FCD111F54570E0009C455 /* staffdef.cpp */, From 045cc35d6d54d992b77a90c9b6ebc823d2454ab3 Mon Sep 17 00:00:00 2001 From: David Bauer Date: Thu, 25 May 2023 10:56:00 +0200 Subject: [PATCH 082/151] Move MNum to control elements --- Verovio.xcodeproj/project.pbxproj | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Verovio.xcodeproj/project.pbxproj b/Verovio.xcodeproj/project.pbxproj index b8d436ebcc..add36f2a53 100644 --- a/Verovio.xcodeproj/project.pbxproj +++ b/Verovio.xcodeproj/project.pbxproj @@ -2465,8 +2465,6 @@ 4DB3D8971F7C2B2900B5FC2B /* lb.h */, 4D89F90D201771AE00A4D336 /* num.cpp */, 4D89F90B201771A700A4D336 /* num.h */, - 4026FBE3203C827D0076535E /* mnum.cpp */, - 4026FBE2203C827D0076535E /* mnum.h */, 4D6122BD1F77E1E000FC90A0 /* rend.cpp */, 4D6122BB1F77E1B900FC90A0 /* rend.h */, 4D89F9112018A93200A4D336 /* svg.cpp */, @@ -2660,6 +2658,8 @@ 4D796B5C1D78641200A15238 /* harm.h */, E79C87C2269440570098FE85 /* lv.cpp */, E79C87C1269440420098FE85 /* lv.h */, + 4026FBE3203C827D0076535E /* mnum.cpp */, + 4026FBE2203C827D0076535E /* mnum.h */, 40910FEA1E42734C00DB1FA5 /* mordent.cpp */, 40910FEB1E42734C00DB1FA5 /* mordent.h */, 4D55723F1CF3F32A008D06A0 /* octave.cpp */, From b98900cc33a7fb5fd8a1aca6fc2f6cc8a6c7e84c Mon Sep 17 00:00:00 2001 From: David Bauer Date: Thu, 25 May 2023 11:24:27 +0200 Subject: [PATCH 083/151] Derive MeterSigGrp from LayerElement --- include/vrv/metersiggrp.h | 23 +++++------------------ src/functorinterface.cpp | 8 ++++---- src/metersiggrp.cpp | 16 ++-------------- 3 files changed, 11 insertions(+), 36 deletions(-) diff --git a/include/vrv/metersiggrp.h b/include/vrv/metersiggrp.h index 529a438fb0..f98baad03c 100644 --- a/include/vrv/metersiggrp.h +++ b/include/vrv/metersiggrp.h @@ -11,13 +11,11 @@ #include "atts_cmn.h" #include "atts_mei.h" #include "atts_shared.h" -#include "linkinginterface.h" -#include "object.h" +#include "layerelement.h" namespace vrv { class Measure; -class MeterSig; //---------------------------------------------------------------------------- // MeterSigGrp @@ -27,13 +25,7 @@ class MeterSig; * This class represents a MEI meterSigGrp. * It contains meterSigGrp objects. */ -class MeterSigGrp : public Object, - public ObjectListInterface, - public LinkingInterface, - public AttBasic, - public AttLabelled, - public AttMeterSigGrpLog, - public AttTyped { +class MeterSigGrp : public LayerElement, public ObjectListInterface, public AttBasic, public AttMeterSigGrpLog { public: /** * @name Constructors, destructors, and other standard methods @@ -47,14 +39,6 @@ class MeterSigGrp : public Object, std::string GetClassName() const override { return "MeterSigGrp"; } ///@} - /** - * @name Getter to interfaces - */ - ///@{ - LinkingInterface *GetLinkingInterface() override { return vrv_cast(this); } - const LinkingInterface *GetLinkingInterface() const override { return vrv_cast(this); } - ///@} - /** * @name Methods for adding allowed content */ @@ -62,6 +46,9 @@ class MeterSigGrp : public Object, bool IsSupportedChild(Object *object) override; ///@} + /** Override the method since check is required */ + bool IsScoreDefElement() const override { return (this->GetParent() && this->GetFirstAncestor(SCOREDEF)); } + /** * Add specified measureId to the m_alternatingMeasures vector */ diff --git a/src/functorinterface.cpp b/src/functorinterface.cpp index 03e70eab8b..c81cbf8bb7 100644 --- a/src/functorinterface.cpp +++ b/src/functorinterface.cpp @@ -956,12 +956,12 @@ FunctorCode FunctorInterface::VisitMeterSigEnd(MeterSig *meterSig) FunctorCode FunctorInterface::VisitMeterSigGrp(MeterSigGrp *meterSigGrp) { - return this->VisitObject(meterSigGrp); + return this->VisitLayerElement(meterSigGrp); } FunctorCode FunctorInterface::VisitMeterSigGrpEnd(MeterSigGrp *meterSigGrp) { - return this->VisitObjectEnd(meterSigGrp); + return this->VisitLayerElementEnd(meterSigGrp); } FunctorCode FunctorInterface::VisitMRest(MRest *mRest) @@ -2230,12 +2230,12 @@ FunctorCode ConstFunctorInterface::VisitMeterSigEnd(const MeterSig *meterSig) FunctorCode ConstFunctorInterface::VisitMeterSigGrp(const MeterSigGrp *meterSigGrp) { - return this->VisitObject(meterSigGrp); + return this->VisitLayerElement(meterSigGrp); } FunctorCode ConstFunctorInterface::VisitMeterSigGrpEnd(const MeterSigGrp *meterSigGrp) { - return this->VisitObjectEnd(meterSigGrp); + return this->VisitLayerElementEnd(meterSigGrp); } FunctorCode ConstFunctorInterface::VisitMRest(const MRest *mRest) diff --git a/src/metersiggrp.cpp b/src/metersiggrp.cpp index 94aa3bb7f2..4aa1fd7012 100644 --- a/src/metersiggrp.cpp +++ b/src/metersiggrp.cpp @@ -25,19 +25,10 @@ namespace vrv { static const ClassRegistrar s_factory("meterSigGrp", METERSIGGRP); MeterSigGrp::MeterSigGrp() - : Object(METERSIGGRP, "metersiggrp-") - , ObjectListInterface() - , LinkingInterface() - , AttBasic() - , AttLabelled() - , AttMeterSigGrpLog() - , AttTyped() + : LayerElement(METERSIGGRP, "metersiggrp-"), ObjectListInterface(), AttBasic(), AttMeterSigGrpLog() { - this->RegisterInterface(LinkingInterface::GetAttClasses(), LinkingInterface::IsInterface()); this->RegisterAttClass(ATT_BASIC); - this->RegisterAttClass(ATT_LABELLED); this->RegisterAttClass(ATT_METERSIGGRPLOG); - this->RegisterAttClass(ATT_TYPED); this->Reset(); } @@ -46,11 +37,8 @@ MeterSigGrp::~MeterSigGrp() {} void MeterSigGrp::Reset() { - Object::Reset(); - LinkingInterface::Reset(); + LayerElement::Reset(); this->ResetBasic(); - this->ResetLabelled(); - this->ResetTyped(); this->ResetMeterSigGrpLog(); } From 0109c8dfad6e561a3e329328fe37f2c52a210bd9 Mon Sep 17 00:00:00 2001 From: David Bauer Date: Thu, 25 May 2023 12:23:47 +0200 Subject: [PATCH 084/151] Adjust MEI input/output --- include/vrv/vrvdef.h | 2 +- src/iomei.cpp | 16 ++++++---------- 2 files changed, 7 insertions(+), 11 deletions(-) diff --git a/include/vrv/vrvdef.h b/include/vrv/vrvdef.h index 95584ededb..8aebcedb1e 100644 --- a/include/vrv/vrvdef.h +++ b/include/vrv/vrvdef.h @@ -115,7 +115,6 @@ enum ClassId : uint16_t { MEASURE_ALIGNER, MENSUR_ATTR, METERSIG_ATTR, - METERSIGGRP, PAGE, PAGES, STAFF, @@ -227,6 +226,7 @@ enum ClassId : uint16_t { LIGATURE, MENSUR, METERSIG, + METERSIGGRP, MREST, MRPT, MRPT2, diff --git a/src/iomei.cpp b/src/iomei.cpp index 744bcaf92a..45b4ece315 100644 --- a/src/iomei.cpp +++ b/src/iomei.cpp @@ -405,10 +405,6 @@ bool MEIOutput::WriteObjectInternal(Object *object, bool useCustomScoreDef) m_currentNode = m_currentNode.append_child("layerDef"); this->WriteLayerDef(m_currentNode, vrv_cast(object)); } - else if (object->Is(METERSIGGRP)) { - m_currentNode = m_currentNode.append_child("meterSigGrp"); - this->WriteMeterSigGrp(m_currentNode, vrv_cast(object)); - } else if (object->Is(SCOREDEF)) { m_currentNode = m_currentNode.append_child("scoreDef"); this->WriteScoreDef(m_currentNode, vrv_cast(object)); @@ -657,6 +653,10 @@ bool MEIOutput::WriteObjectInternal(Object *object, bool useCustomScoreDef) if (this->IsTreeObject(object)) m_currentNode = m_currentNode.append_child("meterSig"); this->WriteMeterSig(m_currentNode, vrv_cast(object)); } + else if (object->Is(METERSIGGRP)) { + m_currentNode = m_currentNode.append_child("meterSigGrp"); + this->WriteMeterSigGrp(m_currentNode, vrv_cast(object)); + } else if (object->Is(MREST)) { m_currentNode = m_currentNode.append_child("mRest"); this->WriteMRest(m_currentNode, vrv_cast(object)); @@ -1888,11 +1888,9 @@ void MEIOutput::WriteMeterSigGrp(pugi::xml_node currentNode, MeterSigGrp *meterS assert(meterSigGrp); this->WriteXmlId(currentNode, meterSigGrp); - this->WriteLinkingInterface(currentNode, meterSigGrp); + this->WriteLayerElement(currentNode, meterSigGrp); meterSigGrp->WriteBasic(currentNode); - meterSigGrp->WriteLabelled(currentNode); meterSigGrp->WriteMeterSigGrpLog(currentNode); - meterSigGrp->WriteTyped(currentNode); } void MEIOutput::WriteFb(pugi::xml_node currentNode, Fb *fb) @@ -5361,11 +5359,9 @@ bool MEIInput::ReadMeterSigGrp(Object *parent, pugi::xml_node meterSigGrp) MeterSigGrp *vrvMeterSigGrp = new MeterSigGrp(); this->SetMeiID(meterSigGrp, vrvMeterSigGrp); - this->ReadLinkingInterface(meterSigGrp, vrvMeterSigGrp); + this->ReadLayerElement(meterSigGrp, vrvMeterSigGrp); vrvMeterSigGrp->ReadBasic(meterSigGrp); - vrvMeterSigGrp->ReadLabelled(meterSigGrp); vrvMeterSigGrp->ReadMeterSigGrpLog(meterSigGrp); - vrvMeterSigGrp->ReadTyped(meterSigGrp); parent->AddChild(vrvMeterSigGrp); this->ReadUnsupportedAttr(meterSigGrp, vrvMeterSigGrp); From 22dfca4eb57020ed4d1760c6356f6b88daa6a2ca Mon Sep 17 00:00:00 2001 From: David Bauer Date: Tue, 30 May 2023 14:59:42 +0200 Subject: [PATCH 085/151] Reset beam span data --- include/vrv/beamspan.h | 1 + include/vrv/resetfunctor.h | 1 + src/resetfunctor.cpp | 14 ++++++++++++++ 3 files changed, 16 insertions(+) diff --git a/include/vrv/beamspan.h b/include/vrv/beamspan.h index df117a6932..b66631bb92 100644 --- a/include/vrv/beamspan.h +++ b/include/vrv/beamspan.h @@ -89,6 +89,7 @@ class BeamSpan : public ControlElement, */ ///@{ const ArrayOfObjects &GetBeamedElements() const { return m_beamedElements; } + void ResetBeamedElements() { m_beamedElements.clear(); } void SetBeamedElements(const ArrayOfObjects &beamedElements) { m_beamedElements = beamedElements; } ///@} diff --git a/include/vrv/resetfunctor.h b/include/vrv/resetfunctor.h index 769d8bdb98..09ad003db6 100644 --- a/include/vrv/resetfunctor.h +++ b/include/vrv/resetfunctor.h @@ -42,6 +42,7 @@ class ResetDataFunctor : public Functor { FunctorCode VisitArpeg(Arpeg *arpeg) override; FunctorCode VisitArtic(Artic *artic) override; FunctorCode VisitBeam(Beam *beam) override; + FunctorCode VisitBeamSpan(BeamSpan *beamSpan) override; FunctorCode VisitChord(Chord *chord) override; FunctorCode VisitControlElement(ControlElement *controlElement) override; FunctorCode VisitCustos(Custos *custos) override; diff --git a/src/resetfunctor.cpp b/src/resetfunctor.cpp index d7e782dab3..afbc96b311 100644 --- a/src/resetfunctor.cpp +++ b/src/resetfunctor.cpp @@ -91,6 +91,20 @@ FunctorCode ResetDataFunctor::VisitBeam(Beam *beam) return FUNCTOR_CONTINUE; } +FunctorCode ResetDataFunctor::VisitBeamSpan(BeamSpan *beamSpan) +{ + // Call parent one too + this->VisitControlElement(beamSpan); + beamSpan->BeamDrawingInterface::Reset(); + beamSpan->PlistInterface::InterfaceResetData(*this, beamSpan); + + beamSpan->ResetBeamedElements(); + beamSpan->ClearBeamSegments(); + beamSpan->InitBeamSegments(); + + return FUNCTOR_CONTINUE; +} + FunctorCode ResetDataFunctor::VisitChord(Chord *chord) { // Call parent one too From f47a676a7cc7e6b8bca50accdf9b6157c7517cd2 Mon Sep 17 00:00:00 2001 From: David Bauer Date: Tue, 30 May 2023 15:37:00 +0200 Subject: [PATCH 086/151] Check against NULL --- src/hairpin.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/hairpin.cpp b/src/hairpin.cpp index ce1c079ba9..56115adb49 100644 --- a/src/hairpin.cpp +++ b/src/hairpin.cpp @@ -138,6 +138,8 @@ int Hairpin::CalcHeight(const Doc *doc, int staffSize, char spanningType, const void Hairpin::SetLeftLink(ControlElement *leftLink) { m_leftLink = leftLink; + if (!leftLink) return; + if (this->GetDrawingGrpId() != 0) { // LogDebug("Grp id LF already set %d", this->GetDrawingGrpId()); return; @@ -153,6 +155,8 @@ void Hairpin::SetLeftLink(ControlElement *leftLink) void Hairpin::SetRightLink(ControlElement *rightLink) { m_rightLink = rightLink; + if (!rightLink) return; + int grpId = this->GetDrawingGrpId(); if (grpId == 0) { grpId = this->SetDrawingGrpObject(this); From a458822d49881ab73464e3ba32a07495c64b04e2 Mon Sep 17 00:00:00 2001 From: David Bauer Date: Wed, 31 May 2023 13:20:03 +0200 Subject: [PATCH 087/151] Separate if/else into element handlers --- include/vrv/setscoredeffunctor.h | 13 +- src/setscoredeffunctor.cpp | 404 ++++++++++++++----------------- 2 files changed, 200 insertions(+), 217 deletions(-) diff --git a/include/vrv/setscoredeffunctor.h b/include/vrv/setscoredeffunctor.h index 3e6a14e3c8..5d4d417c45 100644 --- a/include/vrv/setscoredeffunctor.h +++ b/include/vrv/setscoredeffunctor.h @@ -128,7 +128,18 @@ class ScoreDefSetCurrentFunctor : public DocFunctor { * Functor interface */ ///@{ - FunctorCode VisitObject(Object *object) override; + FunctorCode VisitClef(Clef *clef) override; + FunctorCode VisitKeySig(KeySig *keySig) override; + FunctorCode VisitLayer(Layer *layer) override; + FunctorCode VisitMeasure(Measure *measure) override; + FunctorCode VisitMensur(Mensur *mensur) override; + FunctorCode VisitPage(Page *page) override; + FunctorCode VisitScore(Score *score) override; + FunctorCode VisitScoreDef(ScoreDef *scoreDef) override; + FunctorCode VisitStaff(Staff *staff) override; + FunctorCode VisitStaffDef(StaffDef *staffDef) override; + FunctorCode VisitStaffGrp(StaffGrp *staffGrp) override; + FunctorCode VisitSystem(System *system) override; ///@} protected: diff --git a/src/setscoredeffunctor.cpp b/src/setscoredeffunctor.cpp index 3c4a3458e4..d78d59db53 100644 --- a/src/setscoredeffunctor.cpp +++ b/src/setscoredeffunctor.cpp @@ -93,251 +93,223 @@ ScoreDefSetCurrentFunctor::ScoreDefSetCurrentFunctor(Doc *doc) : DocFunctor(doc) m_hasMeasure = false; } -FunctorCode ScoreDefSetCurrentFunctor::VisitObject(Object *object) -{ - if (object->Is({ DOC, MDIV, PAGES })) return FUNCTOR_CONTINUE; - - // starting a new page - if (object->Is(PAGE)) { - Page *page = vrv_cast(object); - assert(page); - // This will be reached before we reach the beginning of a first Score. - // However, page->m_score has already been set by ScoreDefSetCurrentPageFunctor - // This must be the first page or a new score is starting on this page - assert(page->m_score); - if (!m_currentScore || (m_currentScore != page->m_score)) { - m_upcomingScoreDef = *page->m_score->GetScoreDef(); - m_upcomingScoreDef.Process(*this); - } - page->m_drawingScoreDef = m_upcomingScoreDef; +FunctorCode ScoreDefSetCurrentFunctor::VisitClef(Clef *clef) +{ + LayerElement *elementOrLink = clef->ThisOrSameasLink(); + if (!elementOrLink || !elementOrLink->Is(CLEF)) return FUNCTOR_CONTINUE; + clef = vrv_cast(elementOrLink); + if (clef->IsScoreDefElement()) { return FUNCTOR_CONTINUE; } + assert(m_currentStaffDef); + const int n = clef->m_crossStaff ? clef->m_crossStaff->GetN() : m_currentStaffDef->GetN(); + StaffDef *upcomingStaffDef = m_upcomingScoreDef.GetStaffDef(n); + assert(upcomingStaffDef); + upcomingStaffDef->SetCurrentClef(clef); + m_upcomingScoreDef.m_setAsDrawing = true; + return FUNCTOR_CONTINUE; +} - // starting a new score - if (object->Is(SCORE)) { - Score *score = vrv_cast(object); - assert(score); - m_currentScore = score; - m_upcomingScoreDef = *score->GetScoreDef(); - m_upcomingScoreDef.Process(*this); - // Trigger the redraw of everything - m_upcomingScoreDef.SetRedrawFlags(StaffDefRedrawFlags::REDRAW_ALL); - m_drawLabels = true; - m_currentScoreDef = NULL; - m_currentStaffDef = NULL; - m_previousMeasure = NULL; - m_currentSystem = NULL; - m_restart = false; - m_hasMeasure = false; +FunctorCode ScoreDefSetCurrentFunctor::VisitKeySig(KeySig *keySig) +{ + if (keySig->IsScoreDefElement()) { return FUNCTOR_CONTINUE; } + assert(m_currentStaffDef); + StaffDef *upcomingStaffDef = m_upcomingScoreDef.GetStaffDef(m_currentStaffDef->GetN()); + assert(upcomingStaffDef); + upcomingStaffDef->SetCurrentKeySig(keySig); + m_upcomingScoreDef.m_setAsDrawing = true; + return FUNCTOR_CONTINUE; +} - // starting a new system - if (object->Is(SYSTEM)) { - System *system = vrv_cast(object); - assert(system); - // This is the only thing we do for now - we need to wait until we reach the first measure - m_currentSystem = system; - m_hasMeasure = false; - return FUNCTOR_CONTINUE; - } +FunctorCode ScoreDefSetCurrentFunctor::VisitLayer(Layer *layer) +{ + if (m_doc->GetType() != Transcription) layer->SetDrawingStaffDefValues(m_currentStaffDef); + return FUNCTOR_CONTINUE; +} - // starting a new measure - if (object->Is(MEASURE)) { - // If we have a restart scoreDef before, for redrawing of everything on the measure - if (m_restart) { - m_upcomingScoreDef.SetRedrawFlags(StaffDefRedrawFlags::REDRAW_ALL); - } +FunctorCode ScoreDefSetCurrentFunctor::VisitMeasure(Measure *measure) +{ + // If we have a restart scoreDef before, for redrawing of everything on the measure + if (m_restart) { + m_upcomingScoreDef.SetRedrawFlags(StaffDefRedrawFlags::REDRAW_ALL); + } - Measure *measure = vrv_cast(object); - assert(measure); - int drawingFlags = 0; - // This is the first measure of the system - more to do... - if (m_currentSystem) { - drawingFlags |= Measure::BarlineDrawingFlags::SYSTEM_BREAK; - // We had a scoreDef so we need to put cautionary values - // This will also happen with clef in the last measure - however, the cautionary functor will not do - // anything then - // The cautionary scoreDef for restart is already done when hitting the scoreDef - if (m_upcomingScoreDef.m_setAsDrawing && m_previousMeasure && !m_restart) { - ScoreDef cautionaryScoreDef = m_upcomingScoreDef; - SetCautionaryScoreDefFunctor setCautionaryScoreDef(&cautionaryScoreDef); - m_previousMeasure->Process(setCautionaryScoreDef); - } - // Set the flags we want to have. This also sets m_setAsDrawing to true so the next measure will keep it - m_upcomingScoreDef.SetRedrawFlags(StaffDefRedrawFlags::REDRAW_CLEF | StaffDefRedrawFlags::REDRAW_KEYSIG); - // Set it to the current system (used e.g. for endings) - m_currentSystem->SetDrawingScoreDef(&m_upcomingScoreDef); - m_currentSystem->GetDrawingScoreDef()->SetDrawLabels(m_drawLabels); - m_currentSystem = NULL; - m_drawLabels = false; - } - if (m_upcomingScoreDef.m_setAsDrawing) { - measure->SetDrawingScoreDef(&m_upcomingScoreDef); - m_currentScoreDef = measure->GetDrawingScoreDef(); - m_upcomingScoreDef.SetRedrawFlags(StaffDefRedrawFlags::FORCE_REDRAW); - m_upcomingScoreDef.m_setAsDrawing = false; + int drawingFlags = 0; + // This is the first measure of the system - more to do... + if (m_currentSystem) { + drawingFlags |= Measure::BarlineDrawingFlags::SYSTEM_BREAK; + // We had a scoreDef so we need to put cautionary values + // This will also happen with clef in the last measure - however, the cautionary functor will not do + // anything then + // The cautionary scoreDef for restart is already done when hitting the scoreDef + if (m_upcomingScoreDef.m_setAsDrawing && m_previousMeasure && !m_restart) { + ScoreDef cautionaryScoreDef = m_upcomingScoreDef; + SetCautionaryScoreDefFunctor setCautionaryScoreDef(&cautionaryScoreDef); + m_previousMeasure->Process(setCautionaryScoreDef); } + // Set the flags we want to have. This also sets m_setAsDrawing to true so the next measure will keep it + m_upcomingScoreDef.SetRedrawFlags(StaffDefRedrawFlags::REDRAW_CLEF | StaffDefRedrawFlags::REDRAW_KEYSIG); + // Set it to the current system (used e.g. for endings) + m_currentSystem->SetDrawingScoreDef(&m_upcomingScoreDef); + m_currentSystem->GetDrawingScoreDef()->SetDrawLabels(m_drawLabels); + m_currentSystem = NULL; m_drawLabels = false; - - // set other flags based on score def change - if (m_upcomingScoreDef.m_insertScoreDef) { - drawingFlags |= Measure::BarlineDrawingFlags::SCORE_DEF_INSERT; - m_upcomingScoreDef.m_insertScoreDef = false; - } - - // check if we need to draw barlines for current/previous measures (in cases when all staves are invisible in - // them) - ListOfObjects currentObjects, previousObjects; - AttVisibilityComparison comparison(STAFF, BOOLEAN_false); - measure->FindAllDescendantsByComparison(¤tObjects, &comparison); - if ((int)currentObjects.size() == measure->GetChildCount(STAFF)) { - drawingFlags |= Measure::BarlineDrawingFlags::INVISIBLE_MEASURE_CURRENT; - } - if (m_previousMeasure) { - m_previousMeasure->FindAllDescendantsByComparison(&previousObjects, &comparison); - if ((int)previousObjects.size() == m_previousMeasure->GetChildCount(STAFF)) - drawingFlags |= Measure::BarlineDrawingFlags::INVISIBLE_MEASURE_PREVIOUS; - } - - measure->SetInvisibleStaffBarlines(m_previousMeasure, currentObjects, previousObjects, drawingFlags); - measure->SetDrawingBarLines(m_previousMeasure, drawingFlags); - - m_previousMeasure = measure; - m_restart = false; - m_hasMeasure = true; - - return FUNCTOR_CONTINUE; } - - // starting a new scoreDef - if (object->Is(SCOREDEF)) { - ScoreDef *scoreDef = vrv_cast(object); - assert(scoreDef); - // Replace the current scoreDef with the new one, including its content (staffDef) - this also sets - // m_setAsDrawing to true so it will then be taken into account at the next measure - if (scoreDef->HasClefInfo(UNLIMITED_DEPTH) || scoreDef->HasKeySigInfo(UNLIMITED_DEPTH) - || scoreDef->HasMensurInfo(UNLIMITED_DEPTH) || scoreDef->HasMeterSigGrpInfo(UNLIMITED_DEPTH) - || scoreDef->HasMeterSigInfo(UNLIMITED_DEPTH)) { - m_upcomingScoreDef.ReplaceDrawingValues(scoreDef); - m_upcomingScoreDef.m_insertScoreDef = true; - } - if (scoreDef->IsSectionRestart()) { - m_drawLabels = true; - m_restart = true; - // Redraw the labels only if we already have a measure in the system. Otherwise this will be - // done through the system scoreDef - scoreDef->SetDrawLabels(m_hasMeasure); - // If we have a previous measure, we need to set the cautionary scoreDef independently from the - // presence of a system break - if (m_previousMeasure) { - ScoreDef cautionaryScoreDef = m_upcomingScoreDef; - SetCautionaryScoreDefFunctor setCautionaryScoreDef(&cautionaryScoreDef); - m_previousMeasure->Process(setCautionaryScoreDef); - } - } + if (m_upcomingScoreDef.m_setAsDrawing) { + measure->SetDrawingScoreDef(&m_upcomingScoreDef); + m_currentScoreDef = measure->GetDrawingScoreDef(); + m_upcomingScoreDef.SetRedrawFlags(StaffDefRedrawFlags::FORCE_REDRAW); + m_upcomingScoreDef.m_setAsDrawing = false; } + m_drawLabels = false; - // starting a new staffGrp - if (object->Is(STAFFGRP)) { - StaffGrp *staffGrp = vrv_cast(object); - assert(staffGrp); - // For now replace labels only if we have a section@restart - if (m_restart) { - m_upcomingScoreDef.ReplaceDrawingLabels(staffGrp); - } + // set other flags based on score def change + if (m_upcomingScoreDef.m_insertScoreDef) { + drawingFlags |= Measure::BarlineDrawingFlags::SCORE_DEF_INSERT; + m_upcomingScoreDef.m_insertScoreDef = false; } - // starting a new staffDef - if (object->Is(STAFFDEF)) { - StaffDef *staffDef = vrv_cast(object); - assert(staffDef); - m_upcomingScoreDef.ReplaceDrawingValues(staffDef); + // check if we need to draw barlines for current/previous measures (in cases when all staves are invisible in + // them) + ListOfObjects currentObjects, previousObjects; + AttVisibilityComparison comparison(STAFF, BOOLEAN_false); + measure->FindAllDescendantsByComparison(¤tObjects, &comparison); + if ((int)currentObjects.size() == measure->GetChildCount(STAFF)) { + drawingFlags |= Measure::BarlineDrawingFlags::INVISIBLE_MEASURE_CURRENT; + } + if (m_previousMeasure) { + m_previousMeasure->FindAllDescendantsByComparison(&previousObjects, &comparison); + if ((int)previousObjects.size() == m_previousMeasure->GetChildCount(STAFF)) + drawingFlags |= Measure::BarlineDrawingFlags::INVISIBLE_MEASURE_PREVIOUS; } - // starting a new staff - if (object->Is(STAFF)) { - Staff *staff = vrv_cast(object); - assert(staff); - m_currentStaffDef = m_currentScoreDef->GetStaffDef(staff->GetN()); - assert(staff->m_drawingStaffDef == NULL); - staff->m_drawingStaffDef = m_currentStaffDef; - assert(staff->m_drawingTuning == NULL); - staff->m_drawingTuning = vrv_cast(m_currentStaffDef->FindDescendantByType(TUNING)); - staff->m_drawingLines = m_currentStaffDef->GetLines(); - staff->m_drawingNotationType = m_currentStaffDef->GetNotationtype(); - staff->m_drawingStaffSize = 100; - if (m_currentStaffDef->HasScale()) { - staff->m_drawingStaffSize = m_currentStaffDef->GetScale(); - } - if (staff->IsTablature()) { - staff->m_drawingStaffSize *= TABLATURE_STAFF_RATIO; - } - if (MeterSigGrp *metersiggrp = m_currentStaffDef->GetCurrentMeterSigGrp(); - metersiggrp->GetFunc() == meterSigGrpLog_FUNC_alternating) { - Measure *parentMeasure = vrv_cast(staff->GetFirstAncestor(MEASURE)); - if (parentMeasure) metersiggrp->AddAlternatingMeasureToVector(parentMeasure); - } + measure->SetInvisibleStaffBarlines(m_previousMeasure, currentObjects, previousObjects, drawingFlags); + measure->SetDrawingBarLines(m_previousMeasure, drawingFlags); + + m_previousMeasure = measure; + m_restart = false; + m_hasMeasure = true; + + return FUNCTOR_CONTINUE; +} + +FunctorCode ScoreDefSetCurrentFunctor::VisitMensur(Mensur *mensur) +{ + if (mensur->IsScoreDefElement()) { return FUNCTOR_CONTINUE; } + assert(m_currentStaffDef); + StaffDef *upcomingStaffDef = m_upcomingScoreDef.GetStaffDef(m_currentStaffDef->GetN()); + assert(upcomingStaffDef); + upcomingStaffDef->SetCurrentMensur(mensur); + m_upcomingScoreDef.m_setAsDrawing = true; + return FUNCTOR_CONTINUE; +} - // starting a new layer - if (object->Is(LAYER)) { - Layer *layer = vrv_cast(object); - assert(layer); - if (m_doc->GetType() != Transcription) layer->SetDrawingStaffDefValues(m_currentStaffDef); - return FUNCTOR_CONTINUE; +FunctorCode ScoreDefSetCurrentFunctor::VisitPage(Page *page) +{ + // This will be reached before we reach the beginning of a first Score. + // However, page->m_score has already been set by ScoreDefSetCurrentPageFunctor + // This must be the first page or a new score is starting on this page + assert(page->m_score); + if (!m_currentScore || (m_currentScore != page->m_score)) { + m_upcomingScoreDef = *page->m_score->GetScoreDef(); + m_upcomingScoreDef.Process(*this); } + page->m_drawingScoreDef = m_upcomingScoreDef; + return FUNCTOR_CONTINUE; +} - // starting a new clef - if (object->Is(CLEF)) { - LayerElement *element = vrv_cast(object); - assert(element); - LayerElement *elementOrLink = element->ThisOrSameasLink(); - if (!elementOrLink || !elementOrLink->Is(CLEF)) return FUNCTOR_CONTINUE; - Clef *clef = vrv_cast(elementOrLink); - if (clef->IsScoreDefElement()) { - return FUNCTOR_CONTINUE; +FunctorCode ScoreDefSetCurrentFunctor::VisitScore(Score *score) +{ + m_currentScore = score; + m_upcomingScoreDef = *score->GetScoreDef(); + m_upcomingScoreDef.Process(*this); + // Trigger the redraw of everything + m_upcomingScoreDef.SetRedrawFlags(StaffDefRedrawFlags::REDRAW_ALL); + m_drawLabels = true; + m_currentScoreDef = NULL; + m_currentStaffDef = NULL; + m_previousMeasure = NULL; + m_currentSystem = NULL; + m_restart = false; + m_hasMeasure = false; + return FUNCTOR_CONTINUE; +} + +FunctorCode ScoreDefSetCurrentFunctor::VisitScoreDef(ScoreDef *scoreDef) +{ + // Replace the current scoreDef with the new one, including its content (staffDef) - this also sets + // m_setAsDrawing to true so it will then be taken into account at the next measure + if (scoreDef->HasClefInfo(UNLIMITED_DEPTH) || scoreDef->HasKeySigInfo(UNLIMITED_DEPTH) + || scoreDef->HasMensurInfo(UNLIMITED_DEPTH) || scoreDef->HasMeterSigGrpInfo(UNLIMITED_DEPTH) + || scoreDef->HasMeterSigInfo(UNLIMITED_DEPTH)) { + m_upcomingScoreDef.ReplaceDrawingValues(scoreDef); + m_upcomingScoreDef.m_insertScoreDef = true; + } + if (scoreDef->IsSectionRestart()) { + m_drawLabels = true; + m_restart = true; + // Redraw the labels only if we already have a measure in the system. Otherwise this will be + // done through the system scoreDef + scoreDef->SetDrawLabels(m_hasMeasure); + // If we have a previous measure, we need to set the cautionary scoreDef independently from the + // presence of a system break + if (m_previousMeasure) { + ScoreDef cautionaryScoreDef = m_upcomingScoreDef; + SetCautionaryScoreDefFunctor setCautionaryScoreDef(&cautionaryScoreDef); + m_previousMeasure->Process(setCautionaryScoreDef); } - assert(m_currentStaffDef); - const int n = clef->m_crossStaff ? clef->m_crossStaff->GetN() : m_currentStaffDef->GetN(); - StaffDef *upcomingStaffDef = m_upcomingScoreDef.GetStaffDef(n); - assert(upcomingStaffDef); - upcomingStaffDef->SetCurrentClef(clef); - m_upcomingScoreDef.m_setAsDrawing = true; - return FUNCTOR_CONTINUE; } + return FUNCTOR_CONTINUE; +} - // starting a new keysig - if (object->Is(KEYSIG)) { - KeySig *keySig = vrv_cast(object); - assert(keySig); - if (keySig->IsScoreDefElement()) { - return FUNCTOR_CONTINUE; - } - assert(m_currentStaffDef); - StaffDef *upcomingStaffDef = m_upcomingScoreDef.GetStaffDef(m_currentStaffDef->GetN()); - assert(upcomingStaffDef); - upcomingStaffDef->SetCurrentKeySig(keySig); - m_upcomingScoreDef.m_setAsDrawing = true; - return FUNCTOR_CONTINUE; +FunctorCode ScoreDefSetCurrentFunctor::VisitStaff(Staff *staff) +{ + m_currentStaffDef = m_currentScoreDef->GetStaffDef(staff->GetN()); + assert(staff->m_drawingStaffDef == NULL); + staff->m_drawingStaffDef = m_currentStaffDef; + assert(staff->m_drawingTuning == NULL); + staff->m_drawingTuning = vrv_cast(m_currentStaffDef->FindDescendantByType(TUNING)); + staff->m_drawingLines = m_currentStaffDef->GetLines(); + staff->m_drawingNotationType = m_currentStaffDef->GetNotationtype(); + staff->m_drawingStaffSize = 100; + if (m_currentStaffDef->HasScale()) { + staff->m_drawingStaffSize = m_currentStaffDef->GetScale(); + } + if (staff->IsTablature()) { + staff->m_drawingStaffSize *= TABLATURE_STAFF_RATIO; + } + if (MeterSigGrp *metersiggrp = m_currentStaffDef->GetCurrentMeterSigGrp(); + metersiggrp->GetFunc() == meterSigGrpLog_FUNC_alternating) { + Measure *parentMeasure = vrv_cast(staff->GetFirstAncestor(MEASURE)); + if (parentMeasure) metersiggrp->AddAlternatingMeasureToVector(parentMeasure); } + return FUNCTOR_CONTINUE; +} - // starting a new mensur - if (object->Is(MENSUR)) { - Mensur *mensur = vrv_cast(object); - assert(mensur); - if (mensur->IsScoreDefElement()) { - return FUNCTOR_CONTINUE; - } - assert(m_currentStaffDef); - StaffDef *upcomingStaffDef = m_upcomingScoreDef.GetStaffDef(m_currentStaffDef->GetN()); - assert(upcomingStaffDef); - upcomingStaffDef->SetCurrentMensur(mensur); - m_upcomingScoreDef.m_setAsDrawing = true; - return FUNCTOR_CONTINUE; +FunctorCode ScoreDefSetCurrentFunctor::VisitStaffDef(StaffDef *staffDef) +{ + m_upcomingScoreDef.ReplaceDrawingValues(staffDef); + return FUNCTOR_CONTINUE; +} + +FunctorCode ScoreDefSetCurrentFunctor::VisitStaffGrp(StaffGrp *staffGrp) +{ + // For now replace labels only if we have a section@restart + if (m_restart) { + m_upcomingScoreDef.ReplaceDrawingLabels(staffGrp); } + return FUNCTOR_CONTINUE; +} +FunctorCode ScoreDefSetCurrentFunctor::VisitSystem(System *system) +{ + // This is the only thing we do for now - we need to wait until we reach the first measure + m_currentSystem = system; + m_hasMeasure = false; return FUNCTOR_CONTINUE; } From b55c99721e1efa9ce5441ebe4459db5d61fd17e7 Mon Sep 17 00:00:00 2001 From: Laurent Pugin Date: Thu, 1 Jun 2023 12:25:36 +0200 Subject: [PATCH 088/151] Update LibMEI with latest 5.0.0-dev * https://github.com/music-encoding/music-encoding/commit/400f5c8a7228f4e407f113a6b2540be3fc781b29 --- libmei/dist/attclasses.h | 8 +- libmei/dist/attconverter.cpp | 151 +- libmei/dist/attconverter.h | 13 +- libmei/dist/attmodule.cpp | 130 +- libmei/dist/atts_externalsymbols.cpp | 91 +- libmei/dist/atts_externalsymbols.h | 95 +- libmei/dist/atts_facsimile.h | 4 +- libmei/dist/atts_gestural.cpp | 8 +- libmei/dist/atts_gestural.h | 6 +- libmei/dist/atts_header.cpp | 120 + libmei/dist/atts_header.h | 150 + libmei/dist/atts_neumes.cpp | 40 + libmei/dist/atts_neumes.h | 49 + libmei/dist/atts_shared.cpp | 40 + libmei/dist/atts_shared.h | 53 +- libmei/dist/atts_visual.cpp | 43 +- libmei/dist/atts_visual.h | 24 +- libmei/dist/atttypes.h | 74 +- libmei/dist/meibasic.h | 305 +- libmei/mei/develop/mei-basic_compiled.odd | 4524 +++--------- libmei/mei/develop/mei-verovio_compiled.odd | 6935 ++++++++++--------- 21 files changed, 5724 insertions(+), 7139 deletions(-) diff --git a/libmei/dist/attclasses.h b/libmei/dist/attclasses.h index 8d5369fcb4..49004a0936 100644 --- a/libmei/dist/attclasses.h +++ b/libmei/dist/attclasses.h @@ -69,7 +69,8 @@ enum AttClassId { ATT_CRIT, ATT_AGENTIDENT, ATT_REASONIDENT, - ATT_EXTSYM, + ATT_EXTSYMAUTH, + ATT_EXTSYMNAMES, ATT_FACSIMILE, ATT_TABULAR, ATT_FINGGRPLOG, @@ -88,8 +89,11 @@ enum AttClassId { ATT_TIMESTAMPGES, ATT_TIMESTAMP2GES, ATT_HARMLOG, + ATT_ADLIBITUM, ATT_BIFOLIUMSURFACES, ATT_FOLIUMSURFACES, + ATT_PERFRES, + ATT_PERFRESBASIC, ATT_RECORDTYPE, ATT_REGULARMETHOD, ATT_DURATIONQUALITY, @@ -107,6 +111,7 @@ enum AttClassId { ATT_MIDIVALUE2, ATT_MIDIVELOCITY, ATT_TIMEBASE, + ATT_DIVLINELOG, ATT_NCLOG, ATT_NCFORM, ATT_MARGINS, @@ -206,6 +211,7 @@ enum AttClassId { ATT_POINTING, ATT_QUANTITY, ATT_RANGING, + ATT_REPEATMARKLOG, ATT_RESPONSIBILITY, ATT_RESTDURATIONLOG, ATT_SCALABLE, diff --git a/libmei/dist/attconverter.cpp b/libmei/dist/attconverter.cpp index 1f19a8e49c..ad8e418602 100644 --- a/libmei/dist/attconverter.cpp +++ b/libmei/dist/attconverter.cpp @@ -385,6 +385,8 @@ std::string AttConverterBase::ArticulationToStr(data_ARTICULATION data) const case ARTICULATION_stacciss: value = "stacciss"; break; case ARTICULATION_marc: value = "marc"; break; case ARTICULATION_spicc: value = "spicc"; break; + case ARTICULATION_stress: value = "stress"; break; + case ARTICULATION_unstress: value = "unstress"; break; case ARTICULATION_doit: value = "doit"; break; case ARTICULATION_scoop: value = "scoop"; break; case ARTICULATION_rip: value = "rip"; break; @@ -431,6 +433,8 @@ data_ARTICULATION AttConverterBase::StrToArticulation(const std::string &value, if (value == "stacciss") return ARTICULATION_stacciss; if (value == "marc") return ARTICULATION_marc; if (value == "spicc") return ARTICULATION_spicc; + if (value == "stress") return ARTICULATION_stress; + if (value == "unstress") return ARTICULATION_unstress; if (value == "doit") return ARTICULATION_doit; if (value == "scoop") return ARTICULATION_scoop; if (value == "rip") return ARTICULATION_rip; @@ -1185,6 +1189,69 @@ data_DIVISIO AttConverterBase::StrToDivisio(const std::string &value, bool logWa return DIVISIO_NONE; } +std::string AttConverterBase::DurationGesturalToStr(data_DURATION_GESTURAL data) const +{ + std::string value; + switch (data) { + case DURATION_GESTURAL_long: value = "long"; break; + case DURATION_GESTURAL_breve: value = "breve"; break; + case DURATION_GESTURAL_1: value = "1"; break; + case DURATION_GESTURAL_2: value = "2"; break; + case DURATION_GESTURAL_4: value = "4"; break; + case DURATION_GESTURAL_8: value = "8"; break; + case DURATION_GESTURAL_16: value = "16"; break; + case DURATION_GESTURAL_32: value = "32"; break; + case DURATION_GESTURAL_64: value = "64"; break; + case DURATION_GESTURAL_128: value = "128"; break; + case DURATION_GESTURAL_256: value = "256"; break; + case DURATION_GESTURAL_512: value = "512"; break; + case DURATION_GESTURAL_1024: value = "1024"; break; + case DURATION_GESTURAL_2048: value = "2048"; break; + case DURATION_GESTURAL_maxima: value = "maxima"; break; + case DURATION_GESTURAL_longa: value = "longa"; break; + case DURATION_GESTURAL_brevis: value = "brevis"; break; + case DURATION_GESTURAL_semibrevis: value = "semibrevis"; break; + case DURATION_GESTURAL_minima: value = "minima"; break; + case DURATION_GESTURAL_semiminima: value = "semiminima"; break; + case DURATION_GESTURAL_fusa: value = "fusa"; break; + case DURATION_GESTURAL_semifusa: value = "semifusa"; break; + default: + LogWarning("Unknown value '%d' for data.DURATION.GESTURAL", data); + value = ""; + break; + } + return value; +} + +data_DURATION_GESTURAL AttConverterBase::StrToDurationGestural(const std::string &value, bool logWarning) const +{ + if (value == "long") return DURATION_GESTURAL_long; + if (value == "breve") return DURATION_GESTURAL_breve; + if (value == "1") return DURATION_GESTURAL_1; + if (value == "2") return DURATION_GESTURAL_2; + if (value == "4") return DURATION_GESTURAL_4; + if (value == "8") return DURATION_GESTURAL_8; + if (value == "16") return DURATION_GESTURAL_16; + if (value == "32") return DURATION_GESTURAL_32; + if (value == "64") return DURATION_GESTURAL_64; + if (value == "128") return DURATION_GESTURAL_128; + if (value == "256") return DURATION_GESTURAL_256; + if (value == "512") return DURATION_GESTURAL_512; + if (value == "1024") return DURATION_GESTURAL_1024; + if (value == "2048") return DURATION_GESTURAL_2048; + if (value == "maxima") return DURATION_GESTURAL_maxima; + if (value == "longa") return DURATION_GESTURAL_longa; + if (value == "brevis") return DURATION_GESTURAL_brevis; + if (value == "semibrevis") return DURATION_GESTURAL_semibrevis; + if (value == "minima") return DURATION_GESTURAL_minima; + if (value == "semiminima") return DURATION_GESTURAL_semiminima; + if (value == "fusa") return DURATION_GESTURAL_fusa; + if (value == "semifusa") return DURATION_GESTURAL_semifusa; + if (logWarning && !value.empty()) + LogWarning("Unsupported value '%s' for data.DURATION.GESTURAL", value.c_str()); + return DURATION_GESTURAL_NONE; +} + std::string AttConverterBase::DurationrestsMensuralToStr(data_DURATIONRESTS_mensural data) const { std::string value; @@ -2108,7 +2175,6 @@ std::string AttConverterBase::MeterformToStr(data_METERFORM data) const case METERFORM_denomsym: value = "denomsym"; break; case METERFORM_norm: value = "norm"; break; case METERFORM_symplusnorm: value = "sym+norm"; break; - case METERFORM_invis: value = "invis"; break; default: LogWarning("Unknown value '%d' for data.METERFORM", data); value = ""; @@ -2123,7 +2189,6 @@ data_METERFORM AttConverterBase::StrToMeterform(const std::string &value, bool l if (value == "denomsym") return METERFORM_denomsym; if (value == "norm") return METERFORM_norm; if (value == "sym+norm") return METERFORM_symplusnorm; - if (value == "invis") return METERFORM_invis; if (logWarning && !value.empty()) LogWarning("Unsupported value '%s' for data.METERFORM", value.c_str()); return METERFORM_NONE; @@ -2847,7 +2912,7 @@ std::string AttConverterBase::NoteheadmodifierToStr(data_NOTEHEADMODIFIER data) case NOTEHEADMODIFIER_brack: value = "brack"; break; case NOTEHEADMODIFIER_box: value = "box"; break; case NOTEHEADMODIFIER_circle: value = "circle"; break; - case NOTEHEADMODIFIER_dblwhole: value = "dblwhole"; break; + case NOTEHEADMODIFIER_fences: value = "fences"; break; default: LogWarning("Unknown value '%d' for data.NOTEHEADMODIFIER", data); value = ""; @@ -2867,7 +2932,7 @@ data_NOTEHEADMODIFIER AttConverterBase::StrToNoteheadmodifier(const std::string if (value == "brack") return NOTEHEADMODIFIER_brack; if (value == "box") return NOTEHEADMODIFIER_box; if (value == "circle") return NOTEHEADMODIFIER_circle; - if (value == "dblwhole") return NOTEHEADMODIFIER_dblwhole; + if (value == "fences") return NOTEHEADMODIFIER_fences; if (logWarning && !value.empty()) LogWarning("Unsupported value '%s' for data.NOTEHEADMODIFIER", value.c_str()); return NOTEHEADMODIFIER_NONE; @@ -2886,7 +2951,7 @@ std::string AttConverterBase::NoteheadmodifierListToStr(data_NOTEHEADMODIFIER_li case NOTEHEADMODIFIER_list_brack: value = "brack"; break; case NOTEHEADMODIFIER_list_box: value = "box"; break; case NOTEHEADMODIFIER_list_circle: value = "circle"; break; - case NOTEHEADMODIFIER_list_dblwhole: value = "dblwhole"; break; + case NOTEHEADMODIFIER_list_fences: value = "fences"; break; default: LogWarning("Unknown value '%d' for data.NOTEHEADMODIFIER.list", data); value = ""; @@ -2906,7 +2971,7 @@ data_NOTEHEADMODIFIER_list AttConverterBase::StrToNoteheadmodifierList(const std if (value == "brack") return NOTEHEADMODIFIER_list_brack; if (value == "box") return NOTEHEADMODIFIER_list_box; if (value == "circle") return NOTEHEADMODIFIER_list_circle; - if (value == "dblwhole") return NOTEHEADMODIFIER_list_dblwhole; + if (value == "fences") return NOTEHEADMODIFIER_list_fences; if (logWarning && !value.empty()) LogWarning("Unsupported value '%s' for data.NOTEHEADMODIFIER.list", value.c_str()); return NOTEHEADMODIFIER_list_NONE; @@ -4049,6 +4114,37 @@ cutout_CUTOUT AttConverterBase::StrToCutoutCutout(const std::string &value, bool return cutout_CUTOUT_NONE; } +std::string AttConverterBase::DivLineLogFormToStr(divLineLog_FORM data) const +{ + std::string value; + switch (data) { + case divLineLog_FORM_caesura: value = "caesura"; break; + case divLineLog_FORM_finalis: value = "finalis"; break; + case divLineLog_FORM_maior: value = "maior"; break; + case divLineLog_FORM_maxima: value = "maxima"; break; + case divLineLog_FORM_minima: value = "minima"; break; + case divLineLog_FORM_virgula: value = "virgula"; break; + default: + LogWarning("Unknown value '%d' for att.divLine.log@form", data); + value = ""; + break; + } + return value; +} + +divLineLog_FORM AttConverterBase::StrToDivLineLogForm(const std::string &value, bool logWarning) const +{ + if (value == "caesura") return divLineLog_FORM_caesura; + if (value == "finalis") return divLineLog_FORM_finalis; + if (value == "maior") return divLineLog_FORM_maior; + if (value == "maxima") return divLineLog_FORM_maxima; + if (value == "minima") return divLineLog_FORM_minima; + if (value == "virgula") return divLineLog_FORM_virgula; + if (logWarning && !value.empty()) + LogWarning("Unsupported value '%s' for att.divLine.log@form", value.c_str()); + return divLineLog_FORM_NONE; +} + std::string AttConverterBase::DotLogFormToStr(dotLog_FORM data) const { std::string value; @@ -4145,25 +4241,25 @@ evidence_EVIDENCE AttConverterBase::StrToEvidenceEvidence(const std::string &val return evidence_EVIDENCE_NONE; } -std::string AttConverterBase::ExtSymGlyphauthToStr(extSym_GLYPHAUTH data) const +std::string AttConverterBase::ExtSymAuthGlyphauthToStr(extSymAuth_GLYPHAUTH data) const { std::string value; switch (data) { - case extSym_GLYPHAUTH_smufl: value = "smufl"; break; + case extSymAuth_GLYPHAUTH_smufl: value = "smufl"; break; default: - LogWarning("Unknown value '%d' for att.extSym@glyph.auth", data); + LogWarning("Unknown value '%d' for att.extSym.auth@glyph.auth", data); value = ""; break; } return value; } -extSym_GLYPHAUTH AttConverterBase::StrToExtSymGlyphauth(const std::string &value, bool logWarning) const +extSymAuth_GLYPHAUTH AttConverterBase::StrToExtSymAuthGlyphauth(const std::string &value, bool logWarning) const { - if (value == "smufl") return extSym_GLYPHAUTH_smufl; + if (value == "smufl") return extSymAuth_GLYPHAUTH_smufl; if (logWarning && !value.empty()) - LogWarning("Unsupported value '%s' for att.extSym@glyph.auth", value.c_str()); - return extSym_GLYPHAUTH_NONE; + LogWarning("Unsupported value '%s' for att.extSym.auth@glyph.auth", value.c_str()); + return extSymAuth_GLYPHAUTH_NONE; } std::string AttConverterBase::FTremLogFormToStr(fTremLog_FORM data) const @@ -5173,6 +5269,35 @@ rehearsal_REHENCLOSE AttConverterBase::StrToRehearsalRehenclose(const std::strin return rehearsal_REHENCLOSE_NONE; } +std::string AttConverterBase::RepeatMarkLogFuncToStr(repeatMarkLog_FUNC data) const +{ + std::string value; + switch (data) { + case repeatMarkLog_FUNC_coda: value = "coda"; break; + case repeatMarkLog_FUNC_segno: value = "segno"; break; + case repeatMarkLog_FUNC_dalSegno: value = "dalSegno"; break; + case repeatMarkLog_FUNC_daCapo: value = "daCapo"; break; + case repeatMarkLog_FUNC_fine: value = "fine"; break; + default: + LogWarning("Unknown value '%d' for att.repeatMark.log@func", data); + value = ""; + break; + } + return value; +} + +repeatMarkLog_FUNC AttConverterBase::StrToRepeatMarkLogFunc(const std::string &value, bool logWarning) const +{ + if (value == "coda") return repeatMarkLog_FUNC_coda; + if (value == "segno") return repeatMarkLog_FUNC_segno; + if (value == "dalSegno") return repeatMarkLog_FUNC_dalSegno; + if (value == "daCapo") return repeatMarkLog_FUNC_daCapo; + if (value == "fine") return repeatMarkLog_FUNC_fine; + if (logWarning && !value.empty()) + LogWarning("Unsupported value '%s' for att.repeatMark.log@func", value.c_str()); + return repeatMarkLog_FUNC_NONE; +} + std::string AttConverterBase::SbVisFormToStr(sbVis_FORM data) const { std::string value; diff --git a/libmei/dist/attconverter.h b/libmei/dist/attconverter.h index 284bf7daf4..3a5040169a 100644 --- a/libmei/dist/attconverter.h +++ b/libmei/dist/attconverter.h @@ -102,6 +102,9 @@ class AttConverterBase { std::string DivisioToStr(data_DIVISIO data) const; data_DIVISIO StrToDivisio(const std::string &value, bool logWarning = true) const; + std::string DurationGesturalToStr(data_DURATION_GESTURAL data) const; + data_DURATION_GESTURAL StrToDurationGestural(const std::string &value, bool logWarning = true) const; + std::string DurationrestsMensuralToStr(data_DURATIONRESTS_mensural data) const; data_DURATIONRESTS_mensural StrToDurationrestsMensural(const std::string &value, bool logWarning = true) const; @@ -318,6 +321,9 @@ class AttConverterBase { std::string CutoutCutoutToStr(cutout_CUTOUT data) const; cutout_CUTOUT StrToCutoutCutout(const std::string &value, bool logWarning = true) const; + std::string DivLineLogFormToStr(divLineLog_FORM data) const; + divLineLog_FORM StrToDivLineLogForm(const std::string &value, bool logWarning = true) const; + std::string DotLogFormToStr(dotLog_FORM data) const; dotLog_FORM StrToDotLogForm(const std::string &value, bool logWarning = true) const; @@ -330,8 +336,8 @@ class AttConverterBase { std::string EvidenceEvidenceToStr(evidence_EVIDENCE data) const; evidence_EVIDENCE StrToEvidenceEvidence(const std::string &value, bool logWarning = true) const; - std::string ExtSymGlyphauthToStr(extSym_GLYPHAUTH data) const; - extSym_GLYPHAUTH StrToExtSymGlyphauth(const std::string &value, bool logWarning = true) const; + std::string ExtSymAuthGlyphauthToStr(extSymAuth_GLYPHAUTH data) const; + extSymAuth_GLYPHAUTH StrToExtSymAuthGlyphauth(const std::string &value, bool logWarning = true) const; std::string FTremLogFormToStr(fTremLog_FORM data) const; fTremLog_FORM StrToFTremLogForm(const std::string &value, bool logWarning = true) const; @@ -450,6 +456,9 @@ class AttConverterBase { std::string RehearsalRehencloseToStr(rehearsal_REHENCLOSE data) const; rehearsal_REHENCLOSE StrToRehearsalRehenclose(const std::string &value, bool logWarning = true) const; + std::string RepeatMarkLogFuncToStr(repeatMarkLog_FUNC data) const; + repeatMarkLog_FUNC StrToRepeatMarkLogFunc(const std::string &value, bool logWarning = true) const; + std::string SbVisFormToStr(sbVis_FORM data) const; sbVis_FORM StrToSbVisForm(const std::string &value, bool logWarning = true) const; diff --git a/libmei/dist/attmodule.cpp b/libmei/dist/attmodule.cpp index c1db66d316..62250666b9 100644 --- a/libmei/dist/attmodule.cpp +++ b/libmei/dist/attmodule.cpp @@ -1033,13 +1033,21 @@ namespace vrv { bool AttModule::SetExternalsymbols(Object *element, const std::string &attrType, const std::string &attrValue) { - if (element->HasAttClass(ATT_EXTSYM)) { - AttExtSym *att = dynamic_cast(element); + if (element->HasAttClass(ATT_EXTSYMAUTH)) { + AttExtSymAuth *att = dynamic_cast(element); assert(att); if (attrType == "glyph.auth") { att->SetGlyphAuth(att->StrToStr(attrValue)); return true; } + if (attrType == "glyph.uri") { + att->SetGlyphUri(att->StrToStr(attrValue)); + return true; + } + } + if (element->HasAttClass(ATT_EXTSYMNAMES)) { + AttExtSymNames *att = dynamic_cast(element); + assert(att); if (attrType == "glyph.name") { att->SetGlyphName(att->StrToStr(attrValue)); return true; @@ -1048,10 +1056,6 @@ bool AttModule::SetExternalsymbols(Object *element, const std::string &attrType, att->SetGlyphNum(att->StrToHexnum(attrValue)); return true; } - if (attrType == "glyph.uri") { - att->SetGlyphUri(att->StrToStr(attrValue)); - return true; - } } return false; @@ -1059,21 +1063,25 @@ bool AttModule::SetExternalsymbols(Object *element, const std::string &attrType, void AttModule::GetExternalsymbols(const Object *element, ArrayOfStrAttr *attributes) { - if (element->HasAttClass(ATT_EXTSYM)) { - const AttExtSym *att = dynamic_cast(element); + if (element->HasAttClass(ATT_EXTSYMAUTH)) { + const AttExtSymAuth *att = dynamic_cast(element); assert(att); if (att->HasGlyphAuth()) { attributes->push_back({ "glyph.auth", att->StrToStr(att->GetGlyphAuth()) }); } + if (att->HasGlyphUri()) { + attributes->push_back({ "glyph.uri", att->StrToStr(att->GetGlyphUri()) }); + } + } + if (element->HasAttClass(ATT_EXTSYMNAMES)) { + const AttExtSymNames *att = dynamic_cast(element); + assert(att); if (att->HasGlyphName()) { attributes->push_back({ "glyph.name", att->StrToStr(att->GetGlyphName()) }); } if (att->HasGlyphNum()) { attributes->push_back({ "glyph.num", att->HexnumToStr(att->GetGlyphNum()) }); } - if (att->HasGlyphUri()) { - attributes->push_back({ "glyph.uri", att->StrToStr(att->GetGlyphUri()) }); - } } } @@ -1286,7 +1294,7 @@ bool AttModule::SetGestural(Object *element, const std::string &attrType, const AttDurationGes *att = dynamic_cast(element); assert(att); if (attrType == "dur.ges") { - att->SetDurGes(att->StrToDuration(attrValue)); + att->SetDurGes(att->StrToDurationGestural(attrValue)); return true; } if (attrType == "dots.ges") { @@ -1441,7 +1449,7 @@ void AttModule::GetGestural(const Object *element, ArrayOfStrAttr *attributes) const AttDurationGes *att = dynamic_cast(element); assert(att); if (att->HasDurGes()) { - attributes->push_back({ "dur.ges", att->DurationToStr(att->GetDurGes()) }); + attributes->push_back({ "dur.ges", att->DurationGesturalToStr(att->GetDurGes()) }); } if (att->HasDotsGes()) { attributes->push_back({ "dots.ges", att->IntToStr(att->GetDotsGes()) }); @@ -1591,6 +1599,14 @@ namespace vrv { bool AttModule::SetHeader(Object *element, const std::string &attrType, const std::string &attrValue) { + if (element->HasAttClass(ATT_ADLIBITUM)) { + AttAdlibitum *att = dynamic_cast(element); + assert(att); + if (attrType == "adlib") { + att->SetAdlib(att->StrToBoolean(attrValue)); + return true; + } + } if (element->HasAttClass(ATT_BIFOLIUMSURFACES)) { AttBifoliumSurfaces *att = dynamic_cast(element); assert(att); @@ -1623,6 +1639,22 @@ bool AttModule::SetHeader(Object *element, const std::string &attrType, const st return true; } } + if (element->HasAttClass(ATT_PERFRES)) { + AttPerfRes *att = dynamic_cast(element); + assert(att); + if (attrType == "solo") { + att->SetSolo(att->StrToBoolean(attrValue)); + return true; + } + } + if (element->HasAttClass(ATT_PERFRESBASIC)) { + AttPerfResBasic *att = dynamic_cast(element); + assert(att); + if (attrType == "count") { + att->SetCount(att->StrToInt(attrValue)); + return true; + } + } if (element->HasAttClass(ATT_RECORDTYPE)) { AttRecordType *att = dynamic_cast(element); assert(att); @@ -1645,6 +1677,13 @@ bool AttModule::SetHeader(Object *element, const std::string &attrType, const st void AttModule::GetHeader(const Object *element, ArrayOfStrAttr *attributes) { + if (element->HasAttClass(ATT_ADLIBITUM)) { + const AttAdlibitum *att = dynamic_cast(element); + assert(att); + if (att->HasAdlib()) { + attributes->push_back({ "adlib", att->BooleanToStr(att->GetAdlib()) }); + } + } if (element->HasAttClass(ATT_BIFOLIUMSURFACES)) { const AttBifoliumSurfaces *att = dynamic_cast(element); assert(att); @@ -1671,6 +1710,20 @@ void AttModule::GetHeader(const Object *element, ArrayOfStrAttr *attributes) attributes->push_back({ "verso", att->StrToStr(att->GetVerso()) }); } } + if (element->HasAttClass(ATT_PERFRES)) { + const AttPerfRes *att = dynamic_cast(element); + assert(att); + if (att->HasSolo()) { + attributes->push_back({ "solo", att->BooleanToStr(att->GetSolo()) }); + } + } + if (element->HasAttClass(ATT_PERFRESBASIC)) { + const AttPerfResBasic *att = dynamic_cast(element); + assert(att); + if (att->HasCount()) { + attributes->push_back({ "count", att->IntToStr(att->GetCount()) }); + } + } if (element->HasAttClass(ATT_RECORDTYPE)) { const AttRecordType *att = dynamic_cast(element); assert(att); @@ -2062,6 +2115,14 @@ namespace vrv { bool AttModule::SetNeumes(Object *element, const std::string &attrType, const std::string &attrValue) { + if (element->HasAttClass(ATT_DIVLINELOG)) { + AttDivLineLog *att = dynamic_cast(element); + assert(att); + if (attrType == "form") { + att->SetForm(att->StrToStr(attrValue)); + return true; + } + } if (element->HasAttClass(ATT_NCLOG)) { AttNcLog *att = dynamic_cast(element); assert(att); @@ -2116,6 +2177,13 @@ bool AttModule::SetNeumes(Object *element, const std::string &attrType, const st void AttModule::GetNeumes(const Object *element, ArrayOfStrAttr *attributes) { + if (element->HasAttClass(ATT_DIVLINELOG)) { + const AttDivLineLog *att = dynamic_cast(element); + assert(att); + if (att->HasForm()) { + attributes->push_back({ "form", att->StrToStr(att->GetForm()) }); + } + } if (element->HasAttClass(ATT_NCLOG)) { const AttNcLog *att = dynamic_cast(element); assert(att); @@ -3343,6 +3411,14 @@ bool AttModule::SetShared(Object *element, const std::string &attrType, const st return true; } } + if (element->HasAttClass(ATT_REPEATMARKLOG)) { + AttRepeatMarkLog *att = dynamic_cast(element); + assert(att); + if (attrType == "func") { + att->SetFunc(att->StrToRepeatMarkLogFunc(attrValue)); + return true; + } + } if (element->HasAttClass(ATT_RESPONSIBILITY)) { AttResponsibility *att = dynamic_cast(element); assert(att); @@ -4777,6 +4853,13 @@ void AttModule::GetShared(const Object *element, ArrayOfStrAttr *attributes) attributes->push_back({ "confidence", att->DblToStr(att->GetConfidence()) }); } } + if (element->HasAttClass(ATT_REPEATMARKLOG)) { + const AttRepeatMarkLog *att = dynamic_cast(element); + assert(att); + if (att->HasFunc()) { + attributes->push_back({ "func", att->RepeatMarkLogFuncToStr(att->GetFunc()) }); + } + } if (element->HasAttClass(ATT_RESPONSIBILITY)) { const AttResponsibility *att = dynamic_cast(element); assert(att); @@ -5507,14 +5590,14 @@ bool AttModule::SetVisual(Object *element, const std::string &attrType, const st if (element->HasAttClass(ATT_KEYSIGDEFAULTVIS)) { AttKeySigDefaultVis *att = dynamic_cast(element); assert(att); - if (attrType == "keysig.show") { - att->SetKeysigShow(att->StrToBoolean(attrValue)); - return true; - } if (attrType == "keysig.showchange") { att->SetKeysigShowchange(att->StrToBoolean(attrValue)); return true; } + if (attrType == "keysig.visible") { + att->SetKeysigVisible(att->StrToBoolean(attrValue)); + return true; + } } if (element->HasAttClass(ATT_LIGATUREVIS)) { AttLigatureVis *att = dynamic_cast(element); @@ -5639,6 +5722,10 @@ bool AttModule::SetVisual(Object *element, const std::string &attrType, const st att->SetMeterShowchange(att->StrToBoolean(attrValue)); return true; } + if (attrType == "meter.visible") { + att->SetMeterVisible(att->StrToBoolean(attrValue)); + return true; + } } if (element->HasAttClass(ATT_MULTIRESTVIS)) { AttMultiRestVis *att = dynamic_cast(element); @@ -5975,12 +6062,12 @@ void AttModule::GetVisual(const Object *element, ArrayOfStrAttr *attributes) if (element->HasAttClass(ATT_KEYSIGDEFAULTVIS)) { const AttKeySigDefaultVis *att = dynamic_cast(element); assert(att); - if (att->HasKeysigShow()) { - attributes->push_back({ "keysig.show", att->BooleanToStr(att->GetKeysigShow()) }); - } if (att->HasKeysigShowchange()) { attributes->push_back({ "keysig.showchange", att->BooleanToStr(att->GetKeysigShowchange()) }); } + if (att->HasKeysigVisible()) { + attributes->push_back({ "keysig.visible", att->BooleanToStr(att->GetKeysigVisible()) }); + } } if (element->HasAttClass(ATT_LIGATUREVIS)) { const AttLigatureVis *att = dynamic_cast(element); @@ -6081,6 +6168,9 @@ void AttModule::GetVisual(const Object *element, ArrayOfStrAttr *attributes) if (att->HasMeterShowchange()) { attributes->push_back({ "meter.showchange", att->BooleanToStr(att->GetMeterShowchange()) }); } + if (att->HasMeterVisible()) { + attributes->push_back({ "meter.visible", att->BooleanToStr(att->GetMeterVisible()) }); + } } if (element->HasAttClass(ATT_MULTIRESTVIS)) { const AttMultiRestVis *att = dynamic_cast(element); diff --git a/libmei/dist/atts_externalsymbols.cpp b/libmei/dist/atts_externalsymbols.cpp index 6b21dfdfcd..8e752de5a7 100644 --- a/libmei/dist/atts_externalsymbols.cpp +++ b/libmei/dist/atts_externalsymbols.cpp @@ -23,23 +23,21 @@ namespace vrv { //---------------------------------------------------------------------------- -// AttExtSym +// AttExtSymAuth //---------------------------------------------------------------------------- -AttExtSym::AttExtSym() : Att() +AttExtSymAuth::AttExtSymAuth() : Att() { - ResetExtSym(); + ResetExtSymAuth(); } -void AttExtSym::ResetExtSym() +void AttExtSymAuth::ResetExtSymAuth() { m_glyphAuth = ""; - m_glyphName = ""; - m_glyphNum = 0; m_glyphUri = ""; } -bool AttExtSym::ReadExtSym(pugi::xml_node element, bool removeAttr) +bool AttExtSymAuth::ReadExtSymAuth(pugi::xml_node element, bool removeAttr) { bool hasAttribute = false; if (element.attribute("glyph.auth")) { @@ -47,16 +45,6 @@ bool AttExtSym::ReadExtSym(pugi::xml_node element, bool removeAttr) if (removeAttr) element.remove_attribute("glyph.auth"); hasAttribute = true; } - if (element.attribute("glyph.name")) { - this->SetGlyphName(StrToStr(element.attribute("glyph.name").value())); - if (removeAttr) element.remove_attribute("glyph.name"); - hasAttribute = true; - } - if (element.attribute("glyph.num")) { - this->SetGlyphNum(StrToHexnum(element.attribute("glyph.num").value())); - if (removeAttr) element.remove_attribute("glyph.num"); - hasAttribute = true; - } if (element.attribute("glyph.uri")) { this->SetGlyphUri(StrToStr(element.attribute("glyph.uri").value())); if (removeAttr) element.remove_attribute("glyph.uri"); @@ -65,21 +53,13 @@ bool AttExtSym::ReadExtSym(pugi::xml_node element, bool removeAttr) return hasAttribute; } -bool AttExtSym::WriteExtSym(pugi::xml_node element) +bool AttExtSymAuth::WriteExtSymAuth(pugi::xml_node element) { bool wroteAttribute = false; if (this->HasGlyphAuth()) { element.append_attribute("glyph.auth") = StrToStr(this->GetGlyphAuth()).c_str(); wroteAttribute = true; } - if (this->HasGlyphName()) { - element.append_attribute("glyph.name") = StrToStr(this->GetGlyphName()).c_str(); - wroteAttribute = true; - } - if (this->HasGlyphNum()) { - element.append_attribute("glyph.num") = HexnumToStr(this->GetGlyphNum()).c_str(); - wroteAttribute = true; - } if (this->HasGlyphUri()) { element.append_attribute("glyph.uri") = StrToStr(this->GetGlyphUri()).c_str(); wroteAttribute = true; @@ -87,24 +67,69 @@ bool AttExtSym::WriteExtSym(pugi::xml_node element) return wroteAttribute; } -bool AttExtSym::HasGlyphAuth() const +bool AttExtSymAuth::HasGlyphAuth() const { return (m_glyphAuth != ""); } -bool AttExtSym::HasGlyphName() const +bool AttExtSymAuth::HasGlyphUri() const { - return (m_glyphName != ""); + return (m_glyphUri != ""); +} + +//---------------------------------------------------------------------------- +// AttExtSymNames +//---------------------------------------------------------------------------- + +AttExtSymNames::AttExtSymNames() : Att() +{ + ResetExtSymNames(); } -bool AttExtSym::HasGlyphNum() const +void AttExtSymNames::ResetExtSymNames() { - return (m_glyphNum != 0); + m_glyphName = ""; + m_glyphNum = 0; } -bool AttExtSym::HasGlyphUri() const +bool AttExtSymNames::ReadExtSymNames(pugi::xml_node element, bool removeAttr) { - return (m_glyphUri != ""); + bool hasAttribute = false; + if (element.attribute("glyph.name")) { + this->SetGlyphName(StrToStr(element.attribute("glyph.name").value())); + if (removeAttr) element.remove_attribute("glyph.name"); + hasAttribute = true; + } + if (element.attribute("glyph.num")) { + this->SetGlyphNum(StrToHexnum(element.attribute("glyph.num").value())); + if (removeAttr) element.remove_attribute("glyph.num"); + hasAttribute = true; + } + return hasAttribute; +} + +bool AttExtSymNames::WriteExtSymNames(pugi::xml_node element) +{ + bool wroteAttribute = false; + if (this->HasGlyphName()) { + element.append_attribute("glyph.name") = StrToStr(this->GetGlyphName()).c_str(); + wroteAttribute = true; + } + if (this->HasGlyphNum()) { + element.append_attribute("glyph.num") = HexnumToStr(this->GetGlyphNum()).c_str(); + wroteAttribute = true; + } + return wroteAttribute; +} + +bool AttExtSymNames::HasGlyphName() const +{ + return (m_glyphName != ""); +} + +bool AttExtSymNames::HasGlyphNum() const +{ + return (m_glyphNum != 0); } } // namespace vrv diff --git a/libmei/dist/atts_externalsymbols.h b/libmei/dist/atts_externalsymbols.h index 3c1f35d72f..c36db9705a 100644 --- a/libmei/dist/atts_externalsymbols.h +++ b/libmei/dist/atts_externalsymbols.h @@ -26,23 +26,23 @@ namespace vrv { //---------------------------------------------------------------------------- -// AttExtSym +// AttExtSymAuth //---------------------------------------------------------------------------- -class AttExtSym : public Att { +class AttExtSymAuth : public Att { protected: - AttExtSym(); - ~AttExtSym() = default; + AttExtSymAuth(); + ~AttExtSymAuth() = default; public: /** Reset the default values for the attribute class **/ - void ResetExtSym(); + void ResetExtSymAuth(); /** Read the values for the attribute class **/ - bool ReadExtSym(pugi::xml_node element, bool removeAttr = true); + bool ReadExtSymAuth(pugi::xml_node element, bool removeAttr = true); /** Write the values for the attribute class **/ - bool WriteExtSym(pugi::xml_node element); + bool WriteExtSymAuth(pugi::xml_node element); /** * @name Setters, getters and presence checker for class members. @@ -54,14 +54,6 @@ class AttExtSym : public Att { std::string GetGlyphAuth() const { return m_glyphAuth; } bool HasGlyphAuth() const; // - void SetGlyphName(std::string glyphName_) { m_glyphName = glyphName_; } - std::string GetGlyphName() const { return m_glyphName; } - bool HasGlyphName() const; - // - void SetGlyphNum(data_HEXNUM glyphNum_) { m_glyphNum = glyphNum_; } - data_HEXNUM GetGlyphNum() const { return m_glyphNum; } - bool HasGlyphNum() const; - // void SetGlyphUri(std::string glyphUri_) { m_glyphUri = glyphUri_; } std::string GetGlyphUri() const { return m_glyphUri; } bool HasGlyphUri() const; @@ -70,9 +62,65 @@ class AttExtSym : public Att { private: /** * A name or label associated with the controlled vocabulary from which the value - * of glyph.name or glyph.num is taken. + * of glyph.name or glyph.num is taken, or the textual content of the element. **/ std::string m_glyphAuth; + /** + * The web-accessible location of the controlled vocabulary from which the value of + * glyph.name or glyph.num is taken, or the textual content of the element. + **/ + std::string m_glyphUri; +}; + +//---------------------------------------------------------------------------- +// InstExtSymAuth +//---------------------------------------------------------------------------- + +/** + * Instantiable version of AttExtSymAuth + */ + +class InstExtSymAuth : public AttExtSymAuth { +public: + InstExtSymAuth() = default; + virtual ~InstExtSymAuth() = default; +}; + +//---------------------------------------------------------------------------- +// AttExtSymNames +//---------------------------------------------------------------------------- + +class AttExtSymNames : public Att { +protected: + AttExtSymNames(); + ~AttExtSymNames() = default; + +public: + /** Reset the default values for the attribute class **/ + void ResetExtSymNames(); + + /** Read the values for the attribute class **/ + bool ReadExtSymNames(pugi::xml_node element, bool removeAttr = true); + + /** Write the values for the attribute class **/ + bool WriteExtSymNames(pugi::xml_node element); + + /** + * @name Setters, getters and presence checker for class members. + * The checker returns true if the attribute class is set (e.g., not equal + * to the default value) + **/ + ///@{ + void SetGlyphName(std::string glyphName_) { m_glyphName = glyphName_; } + std::string GetGlyphName() const { return m_glyphName; } + bool HasGlyphName() const; + // + void SetGlyphNum(data_HEXNUM glyphNum_) { m_glyphNum = glyphNum_; } + data_HEXNUM GetGlyphNum() const { return m_glyphNum; } + bool HasGlyphNum() const; + ///@} + +private: /** Glyph name. **/ std::string m_glyphName; /** @@ -80,25 +128,20 @@ class AttExtSym : public Att { * N.B. SMuFL version 1.18 uses the range U+E000 - U+ECBF. **/ data_HEXNUM m_glyphNum; - /** - * The web-accessible location of the controlled vocabulary from which the value of - * glyph.name or glyph.num is taken. - **/ - std::string m_glyphUri; }; //---------------------------------------------------------------------------- -// InstExtSym +// InstExtSymNames //---------------------------------------------------------------------------- /** - * Instantiable version of AttExtSym + * Instantiable version of AttExtSymNames */ -class InstExtSym : public AttExtSym { +class InstExtSymNames : public AttExtSymNames { public: - InstExtSym() = default; - virtual ~InstExtSym() = default; + InstExtSymNames() = default; + virtual ~InstExtSymNames() = default; }; } // namespace vrv diff --git a/libmei/dist/atts_facsimile.h b/libmei/dist/atts_facsimile.h index d2083ac936..f5b8af1191 100644 --- a/libmei/dist/atts_facsimile.h +++ b/libmei/dist/atts_facsimile.h @@ -57,8 +57,8 @@ class AttFacsimile : public Att { private: /** - * Permits the current element to reference a facsimile surface or image zone which - * corresponds to it. + * Points to one or more images, portions of an image, or surfaces which correspond + * to the current element. **/ std::string m_facs; }; diff --git a/libmei/dist/atts_gestural.cpp b/libmei/dist/atts_gestural.cpp index b448bd659a..a8804281d5 100644 --- a/libmei/dist/atts_gestural.cpp +++ b/libmei/dist/atts_gestural.cpp @@ -153,7 +153,7 @@ AttDurationGes::AttDurationGes() : Att() void AttDurationGes::ResetDurationGes() { - m_durGes = DURATION_NONE; + m_durGes = DURATION_GESTURAL_NONE; m_dotsGes = MEI_UNSET; m_durMetrical = 0.0; m_durPpq = MEI_UNSET; @@ -165,7 +165,7 @@ bool AttDurationGes::ReadDurationGes(pugi::xml_node element, bool removeAttr) { bool hasAttribute = false; if (element.attribute("dur.ges")) { - this->SetDurGes(StrToDuration(element.attribute("dur.ges").value())); + this->SetDurGes(StrToDurationGestural(element.attribute("dur.ges").value())); if (removeAttr) element.remove_attribute("dur.ges"); hasAttribute = true; } @@ -201,7 +201,7 @@ bool AttDurationGes::WriteDurationGes(pugi::xml_node element) { bool wroteAttribute = false; if (this->HasDurGes()) { - element.append_attribute("dur.ges") = DurationToStr(this->GetDurGes()).c_str(); + element.append_attribute("dur.ges") = DurationGesturalToStr(this->GetDurGes()).c_str(); wroteAttribute = true; } if (this->HasDotsGes()) { @@ -229,7 +229,7 @@ bool AttDurationGes::WriteDurationGes(pugi::xml_node element) bool AttDurationGes::HasDurGes() const { - return (m_durGes != DURATION_NONE); + return (m_durGes != DURATION_GESTURAL_NONE); } bool AttDurationGes::HasDotsGes() const diff --git a/libmei/dist/atts_gestural.h b/libmei/dist/atts_gestural.h index e49d7a8052..dc02da9c9c 100644 --- a/libmei/dist/atts_gestural.h +++ b/libmei/dist/atts_gestural.h @@ -201,8 +201,8 @@ class AttDurationGes : public Att { * to the default value) **/ ///@{ - void SetDurGes(data_DURATION durGes_) { m_durGes = durGes_; } - data_DURATION GetDurGes() const { return m_durGes; } + void SetDurGes(data_DURATION_GESTURAL durGes_) { m_durGes = durGes_; } + data_DURATION_GESTURAL GetDurGes() const { return m_durGes; } bool HasDurGes() const; // void SetDotsGes(int dotsGes_) { m_dotsGes = dotsGes_; } @@ -228,7 +228,7 @@ class AttDurationGes : public Att { private: /** Records performed duration information that differs from the written duration. **/ - data_DURATION m_durGes; + data_DURATION_GESTURAL m_durGes; /** * Number of dots required for a gestural duration when different from that of the * written duration. diff --git a/libmei/dist/atts_header.cpp b/libmei/dist/atts_header.cpp index 567f2bfa4e..a44b662041 100644 --- a/libmei/dist/atts_header.cpp +++ b/libmei/dist/atts_header.cpp @@ -22,6 +22,46 @@ namespace vrv { +//---------------------------------------------------------------------------- +// AttAdlibitum +//---------------------------------------------------------------------------- + +AttAdlibitum::AttAdlibitum() : Att() +{ + ResetAdlibitum(); +} + +void AttAdlibitum::ResetAdlibitum() +{ + m_adlib = BOOLEAN_NONE; +} + +bool AttAdlibitum::ReadAdlibitum(pugi::xml_node element, bool removeAttr) +{ + bool hasAttribute = false; + if (element.attribute("adlib")) { + this->SetAdlib(StrToBoolean(element.attribute("adlib").value())); + if (removeAttr) element.remove_attribute("adlib"); + hasAttribute = true; + } + return hasAttribute; +} + +bool AttAdlibitum::WriteAdlibitum(pugi::xml_node element) +{ + bool wroteAttribute = false; + if (this->HasAdlib()) { + element.append_attribute("adlib") = BooleanToStr(this->GetAdlib()).c_str(); + wroteAttribute = true; + } + return wroteAttribute; +} + +bool AttAdlibitum::HasAdlib() const +{ + return (m_adlib != BOOLEAN_NONE); +} + //---------------------------------------------------------------------------- // AttBifoliumSurfaces //---------------------------------------------------------------------------- @@ -162,6 +202,86 @@ bool AttFoliumSurfaces::HasVerso() const return (m_verso != ""); } +//---------------------------------------------------------------------------- +// AttPerfRes +//---------------------------------------------------------------------------- + +AttPerfRes::AttPerfRes() : Att() +{ + ResetPerfRes(); +} + +void AttPerfRes::ResetPerfRes() +{ + m_solo = BOOLEAN_NONE; +} + +bool AttPerfRes::ReadPerfRes(pugi::xml_node element, bool removeAttr) +{ + bool hasAttribute = false; + if (element.attribute("solo")) { + this->SetSolo(StrToBoolean(element.attribute("solo").value())); + if (removeAttr) element.remove_attribute("solo"); + hasAttribute = true; + } + return hasAttribute; +} + +bool AttPerfRes::WritePerfRes(pugi::xml_node element) +{ + bool wroteAttribute = false; + if (this->HasSolo()) { + element.append_attribute("solo") = BooleanToStr(this->GetSolo()).c_str(); + wroteAttribute = true; + } + return wroteAttribute; +} + +bool AttPerfRes::HasSolo() const +{ + return (m_solo != BOOLEAN_NONE); +} + +//---------------------------------------------------------------------------- +// AttPerfResBasic +//---------------------------------------------------------------------------- + +AttPerfResBasic::AttPerfResBasic() : Att() +{ + ResetPerfResBasic(); +} + +void AttPerfResBasic::ResetPerfResBasic() +{ + m_count = MEI_UNSET; +} + +bool AttPerfResBasic::ReadPerfResBasic(pugi::xml_node element, bool removeAttr) +{ + bool hasAttribute = false; + if (element.attribute("count")) { + this->SetCount(StrToInt(element.attribute("count").value())); + if (removeAttr) element.remove_attribute("count"); + hasAttribute = true; + } + return hasAttribute; +} + +bool AttPerfResBasic::WritePerfResBasic(pugi::xml_node element) +{ + bool wroteAttribute = false; + if (this->HasCount()) { + element.append_attribute("count") = IntToStr(this->GetCount()).c_str(); + wroteAttribute = true; + } + return wroteAttribute; +} + +bool AttPerfResBasic::HasCount() const +{ + return (m_count != MEI_UNSET); +} + //---------------------------------------------------------------------------- // AttRecordType //---------------------------------------------------------------------------- diff --git a/libmei/dist/atts_header.h b/libmei/dist/atts_header.h index e3a8d59a56..fdd325e3b7 100644 --- a/libmei/dist/atts_header.h +++ b/libmei/dist/atts_header.h @@ -25,6 +25,55 @@ namespace vrv { +//---------------------------------------------------------------------------- +// AttAdlibitum +//---------------------------------------------------------------------------- + +class AttAdlibitum : public Att { +protected: + AttAdlibitum(); + ~AttAdlibitum() = default; + +public: + /** Reset the default values for the attribute class **/ + void ResetAdlibitum(); + + /** Read the values for the attribute class **/ + bool ReadAdlibitum(pugi::xml_node element, bool removeAttr = true); + + /** Write the values for the attribute class **/ + bool WriteAdlibitum(pugi::xml_node element); + + /** + * @name Setters, getters and presence checker for class members. + * The checker returns true if the attribute class is set (e.g., not equal + * to the default value) + **/ + ///@{ + void SetAdlib(data_BOOLEAN adlib_) { m_adlib = adlib_; } + data_BOOLEAN GetAdlib() const { return m_adlib; } + bool HasAdlib() const; + ///@} + +private: + /** Marks a performance resource as ad libitum (optional). **/ + data_BOOLEAN m_adlib; +}; + +//---------------------------------------------------------------------------- +// InstAdlibitum +//---------------------------------------------------------------------------- + +/** + * Instantiable version of AttAdlibitum + */ + +class InstAdlibitum : public AttAdlibitum { +public: + InstAdlibitum() = default; + virtual ~InstAdlibitum() = default; +}; + //---------------------------------------------------------------------------- // AttBifoliumSurfaces //---------------------------------------------------------------------------- @@ -159,6 +208,107 @@ class InstFoliumSurfaces : public AttFoliumSurfaces { virtual ~InstFoliumSurfaces() = default; }; +//---------------------------------------------------------------------------- +// AttPerfRes +//---------------------------------------------------------------------------- + +class AttPerfRes : public Att { +protected: + AttPerfRes(); + ~AttPerfRes() = default; + +public: + /** Reset the default values for the attribute class **/ + void ResetPerfRes(); + + /** Read the values for the attribute class **/ + bool ReadPerfRes(pugi::xml_node element, bool removeAttr = true); + + /** Write the values for the attribute class **/ + bool WritePerfRes(pugi::xml_node element); + + /** + * @name Setters, getters and presence checker for class members. + * The checker returns true if the attribute class is set (e.g., not equal + * to the default value) + **/ + ///@{ + void SetSolo(data_BOOLEAN solo_) { m_solo = solo_; } + data_BOOLEAN GetSolo() const { return m_solo; } + bool HasSolo() const; + ///@} + +private: + /** + * Use this attribute to identify the performance resource as a soloist especially + * in an accompanied work, such as a concerto or vocal solo. + **/ + data_BOOLEAN m_solo; +}; + +//---------------------------------------------------------------------------- +// InstPerfRes +//---------------------------------------------------------------------------- + +/** + * Instantiable version of AttPerfRes + */ + +class InstPerfRes : public AttPerfRes { +public: + InstPerfRes() = default; + virtual ~InstPerfRes() = default; +}; + +//---------------------------------------------------------------------------- +// AttPerfResBasic +//---------------------------------------------------------------------------- + +class AttPerfResBasic : public Att { +protected: + AttPerfResBasic(); + ~AttPerfResBasic() = default; + +public: + /** Reset the default values for the attribute class **/ + void ResetPerfResBasic(); + + /** Read the values for the attribute class **/ + bool ReadPerfResBasic(pugi::xml_node element, bool removeAttr = true); + + /** Write the values for the attribute class **/ + bool WritePerfResBasic(pugi::xml_node element); + + /** + * @name Setters, getters and presence checker for class members. + * The checker returns true if the attribute class is set (e.g., not equal + * to the default value) + **/ + ///@{ + void SetCount(int count_) { m_count = count_; } + int GetCount() const { return m_count; } + bool HasCount() const; + ///@} + +private: + /** Indicates the number of performers. **/ + int m_count; +}; + +//---------------------------------------------------------------------------- +// InstPerfResBasic +//---------------------------------------------------------------------------- + +/** + * Instantiable version of AttPerfResBasic + */ + +class InstPerfResBasic : public AttPerfResBasic { +public: + InstPerfResBasic() = default; + virtual ~InstPerfResBasic() = default; +}; + //---------------------------------------------------------------------------- // AttRecordType //---------------------------------------------------------------------------- diff --git a/libmei/dist/atts_neumes.cpp b/libmei/dist/atts_neumes.cpp index 83bfadb579..cbb89b100a 100644 --- a/libmei/dist/atts_neumes.cpp +++ b/libmei/dist/atts_neumes.cpp @@ -22,6 +22,46 @@ namespace vrv { +//---------------------------------------------------------------------------- +// AttDivLineLog +//---------------------------------------------------------------------------- + +AttDivLineLog::AttDivLineLog() : Att() +{ + ResetDivLineLog(); +} + +void AttDivLineLog::ResetDivLineLog() +{ + m_form = ""; +} + +bool AttDivLineLog::ReadDivLineLog(pugi::xml_node element, bool removeAttr) +{ + bool hasAttribute = false; + if (element.attribute("form")) { + this->SetForm(StrToStr(element.attribute("form").value())); + if (removeAttr) element.remove_attribute("form"); + hasAttribute = true; + } + return hasAttribute; +} + +bool AttDivLineLog::WriteDivLineLog(pugi::xml_node element) +{ + bool wroteAttribute = false; + if (this->HasForm()) { + element.append_attribute("form") = StrToStr(this->GetForm()).c_str(); + wroteAttribute = true; + } + return wroteAttribute; +} + +bool AttDivLineLog::HasForm() const +{ + return (m_form != ""); +} + //---------------------------------------------------------------------------- // AttNcLog //---------------------------------------------------------------------------- diff --git a/libmei/dist/atts_neumes.h b/libmei/dist/atts_neumes.h index b6dc3b87ea..cce5271c4c 100644 --- a/libmei/dist/atts_neumes.h +++ b/libmei/dist/atts_neumes.h @@ -25,6 +25,55 @@ namespace vrv { +//---------------------------------------------------------------------------- +// AttDivLineLog +//---------------------------------------------------------------------------- + +class AttDivLineLog : public Att { +protected: + AttDivLineLog(); + ~AttDivLineLog() = default; + +public: + /** Reset the default values for the attribute class **/ + void ResetDivLineLog(); + + /** Read the values for the attribute class **/ + bool ReadDivLineLog(pugi::xml_node element, bool removeAttr = true); + + /** Write the values for the attribute class **/ + bool WriteDivLineLog(pugi::xml_node element); + + /** + * @name Setters, getters and presence checker for class members. + * The checker returns true if the attribute class is set (e.g., not equal + * to the default value) + **/ + ///@{ + void SetForm(std::string form_) { m_form = form_; } + std::string GetForm() const { return m_form; } + bool HasForm() const; + ///@} + +private: + /** Indicates to what degree the harmonic label is supported by the notation. **/ + std::string m_form; +}; + +//---------------------------------------------------------------------------- +// InstDivLineLog +//---------------------------------------------------------------------------- + +/** + * Instantiable version of AttDivLineLog + */ + +class InstDivLineLog : public AttDivLineLog { +public: + InstDivLineLog() = default; + virtual ~InstDivLineLog() = default; +}; + //---------------------------------------------------------------------------- // AttNcLog //---------------------------------------------------------------------------- diff --git a/libmei/dist/atts_shared.cpp b/libmei/dist/atts_shared.cpp index 7eefde0b06..2cc9b8a574 100644 --- a/libmei/dist/atts_shared.cpp +++ b/libmei/dist/atts_shared.cpp @@ -5037,6 +5037,46 @@ bool AttRanging::HasConfidence() const return (m_confidence != 0.0); } +//---------------------------------------------------------------------------- +// AttRepeatMarkLog +//---------------------------------------------------------------------------- + +AttRepeatMarkLog::AttRepeatMarkLog() : Att() +{ + ResetRepeatMarkLog(); +} + +void AttRepeatMarkLog::ResetRepeatMarkLog() +{ + m_func = repeatMarkLog_FUNC_NONE; +} + +bool AttRepeatMarkLog::ReadRepeatMarkLog(pugi::xml_node element, bool removeAttr) +{ + bool hasAttribute = false; + if (element.attribute("func")) { + this->SetFunc(StrToRepeatMarkLogFunc(element.attribute("func").value())); + if (removeAttr) element.remove_attribute("func"); + hasAttribute = true; + } + return hasAttribute; +} + +bool AttRepeatMarkLog::WriteRepeatMarkLog(pugi::xml_node element) +{ + bool wroteAttribute = false; + if (this->HasFunc()) { + element.append_attribute("func") = RepeatMarkLogFuncToStr(this->GetFunc()).c_str(); + wroteAttribute = true; + } + return wroteAttribute; +} + +bool AttRepeatMarkLog::HasFunc() const +{ + return (m_func != repeatMarkLog_FUNC_NONE); +} + //---------------------------------------------------------------------------- // AttResponsibility //---------------------------------------------------------------------------- diff --git a/libmei/dist/atts_shared.h b/libmei/dist/atts_shared.h index 696a227abb..6afc35cc03 100644 --- a/libmei/dist/atts_shared.h +++ b/libmei/dist/atts_shared.h @@ -477,7 +477,7 @@ class AttBarring : public Att { private: /** - * States the length of barlines in virtual units. + * States the length of bar lines in virtual units. * The value must be greater than 0 and is typically equal to 2 times (the number * of staff lines - 1); e.g., a value of 8 for a 5-line staff. **/ @@ -3749,7 +3749,7 @@ class AttMeterConformanceBar : public Att { * point of alignment across all the parts. * Bar lines within a score are usually controlling; that is, they "line up". Bar * lines within parts may or may not be controlling. When applied to measure, this - * attribute indicates the nature of the right barline but not the left. + * attribute indicates the nature of the right bar line but not the left. **/ data_BOOLEAN m_control; }; @@ -5464,6 +5464,55 @@ class InstRanging : public AttRanging { virtual ~InstRanging() = default; }; +//---------------------------------------------------------------------------- +// AttRepeatMarkLog +//---------------------------------------------------------------------------- + +class AttRepeatMarkLog : public Att { +protected: + AttRepeatMarkLog(); + ~AttRepeatMarkLog() = default; + +public: + /** Reset the default values for the attribute class **/ + void ResetRepeatMarkLog(); + + /** Read the values for the attribute class **/ + bool ReadRepeatMarkLog(pugi::xml_node element, bool removeAttr = true); + + /** Write the values for the attribute class **/ + bool WriteRepeatMarkLog(pugi::xml_node element); + + /** + * @name Setters, getters and presence checker for class members. + * The checker returns true if the attribute class is set (e.g., not equal + * to the default value) + **/ + ///@{ + void SetFunc(repeatMarkLog_FUNC func_) { m_func = func_; } + repeatMarkLog_FUNC GetFunc() const { return m_func; } + bool HasFunc() const; + ///@} + +private: + /** Describes the function of the bracketed event sequence. **/ + repeatMarkLog_FUNC m_func; +}; + +//---------------------------------------------------------------------------- +// InstRepeatMarkLog +//---------------------------------------------------------------------------- + +/** + * Instantiable version of AttRepeatMarkLog + */ + +class InstRepeatMarkLog : public AttRepeatMarkLog { +public: + InstRepeatMarkLog() = default; + virtual ~InstRepeatMarkLog() = default; +}; + //---------------------------------------------------------------------------- // AttResponsibility //---------------------------------------------------------------------------- diff --git a/libmei/dist/atts_visual.cpp b/libmei/dist/atts_visual.cpp index 7710550a62..11735ae6fb 100644 --- a/libmei/dist/atts_visual.cpp +++ b/libmei/dist/atts_visual.cpp @@ -918,48 +918,48 @@ AttKeySigDefaultVis::AttKeySigDefaultVis() : Att() void AttKeySigDefaultVis::ResetKeySigDefaultVis() { - m_keysigShow = BOOLEAN_NONE; m_keysigShowchange = BOOLEAN_NONE; + m_keysigVisible = BOOLEAN_NONE; } bool AttKeySigDefaultVis::ReadKeySigDefaultVis(pugi::xml_node element, bool removeAttr) { bool hasAttribute = false; - if (element.attribute("keysig.show")) { - this->SetKeysigShow(StrToBoolean(element.attribute("keysig.show").value())); - if (removeAttr) element.remove_attribute("keysig.show"); - hasAttribute = true; - } if (element.attribute("keysig.showchange")) { this->SetKeysigShowchange(StrToBoolean(element.attribute("keysig.showchange").value())); if (removeAttr) element.remove_attribute("keysig.showchange"); hasAttribute = true; } + if (element.attribute("keysig.visible")) { + this->SetKeysigVisible(StrToBoolean(element.attribute("keysig.visible").value())); + if (removeAttr) element.remove_attribute("keysig.visible"); + hasAttribute = true; + } return hasAttribute; } bool AttKeySigDefaultVis::WriteKeySigDefaultVis(pugi::xml_node element) { bool wroteAttribute = false; - if (this->HasKeysigShow()) { - element.append_attribute("keysig.show") = BooleanToStr(this->GetKeysigShow()).c_str(); - wroteAttribute = true; - } if (this->HasKeysigShowchange()) { element.append_attribute("keysig.showchange") = BooleanToStr(this->GetKeysigShowchange()).c_str(); wroteAttribute = true; } + if (this->HasKeysigVisible()) { + element.append_attribute("keysig.visible") = BooleanToStr(this->GetKeysigVisible()).c_str(); + wroteAttribute = true; + } return wroteAttribute; } -bool AttKeySigDefaultVis::HasKeysigShow() const +bool AttKeySigDefaultVis::HasKeysigShowchange() const { - return (m_keysigShow != BOOLEAN_NONE); + return (m_keysigShowchange != BOOLEAN_NONE); } -bool AttKeySigDefaultVis::HasKeysigShowchange() const +bool AttKeySigDefaultVis::HasKeysigVisible() const { - return (m_keysigShowchange != BOOLEAN_NONE); + return (m_keysigVisible != BOOLEAN_NONE); } //---------------------------------------------------------------------------- @@ -1455,6 +1455,7 @@ void AttMeterSigDefaultVis::ResetMeterSigDefaultVis() { m_meterForm = METERFORM_NONE; m_meterShowchange = BOOLEAN_NONE; + m_meterVisible = BOOLEAN_NONE; } bool AttMeterSigDefaultVis::ReadMeterSigDefaultVis(pugi::xml_node element, bool removeAttr) @@ -1470,6 +1471,11 @@ bool AttMeterSigDefaultVis::ReadMeterSigDefaultVis(pugi::xml_node element, bool if (removeAttr) element.remove_attribute("meter.showchange"); hasAttribute = true; } + if (element.attribute("meter.visible")) { + this->SetMeterVisible(StrToBoolean(element.attribute("meter.visible").value())); + if (removeAttr) element.remove_attribute("meter.visible"); + hasAttribute = true; + } return hasAttribute; } @@ -1484,6 +1490,10 @@ bool AttMeterSigDefaultVis::WriteMeterSigDefaultVis(pugi::xml_node element) element.append_attribute("meter.showchange") = BooleanToStr(this->GetMeterShowchange()).c_str(); wroteAttribute = true; } + if (this->HasMeterVisible()) { + element.append_attribute("meter.visible") = BooleanToStr(this->GetMeterVisible()).c_str(); + wroteAttribute = true; + } return wroteAttribute; } @@ -1497,6 +1507,11 @@ bool AttMeterSigDefaultVis::HasMeterShowchange() const return (m_meterShowchange != BOOLEAN_NONE); } +bool AttMeterSigDefaultVis::HasMeterVisible() const +{ + return (m_meterVisible != BOOLEAN_NONE); +} + //---------------------------------------------------------------------------- // AttMultiRestVis //---------------------------------------------------------------------------- diff --git a/libmei/dist/atts_visual.h b/libmei/dist/atts_visual.h index 1f7fdbbcd4..cfd1585ce7 100644 --- a/libmei/dist/atts_visual.h +++ b/libmei/dist/atts_visual.h @@ -203,7 +203,7 @@ class AttBarLineVis : public Att { private: /** - * States the length of barlines in virtual units. + * States the length of bar lines in virtual units. * The value must be greater than 0 and is typically equal to 2 times (the number * of staff lines - 1); e.g., a value of 8 for a 5-line staff. **/ @@ -926,20 +926,20 @@ class AttKeySigDefaultVis : public Att { * to the default value) **/ ///@{ - void SetKeysigShow(data_BOOLEAN keysigShow_) { m_keysigShow = keysigShow_; } - data_BOOLEAN GetKeysigShow() const { return m_keysigShow; } - bool HasKeysigShow() const; - // void SetKeysigShowchange(data_BOOLEAN keysigShowchange_) { m_keysigShowchange = keysigShowchange_; } data_BOOLEAN GetKeysigShowchange() const { return m_keysigShowchange; } bool HasKeysigShowchange() const; + // + void SetKeysigVisible(data_BOOLEAN keysigVisible_) { m_keysigVisible = keysigVisible_; } + data_BOOLEAN GetKeysigVisible() const { return m_keysigVisible; } + bool HasKeysigVisible() const; ///@} private: - /** Indicates whether the key signature should be displayed. **/ - data_BOOLEAN m_keysigShow; /** Determines whether cautionary accidentals should be displayed at a key change. **/ data_BOOLEAN m_keysigShowchange; + /** Determines whether the key signature is to be displayed. **/ + data_BOOLEAN m_keysigVisible; }; //---------------------------------------------------------------------------- @@ -1388,6 +1388,10 @@ class AttMeterSigDefaultVis : public Att { void SetMeterShowchange(data_BOOLEAN meterShowchange_) { m_meterShowchange = meterShowchange_; } data_BOOLEAN GetMeterShowchange() const { return m_meterShowchange; } bool HasMeterShowchange() const; + // + void SetMeterVisible(data_BOOLEAN meterVisible_) { m_meterVisible = meterVisible_; } + data_BOOLEAN GetMeterVisible() const { return m_meterVisible; } + bool HasMeterVisible() const; ///@} private: @@ -1398,6 +1402,8 @@ class AttMeterSigDefaultVis : public Att { * signature changes. **/ data_BOOLEAN m_meterShowchange; + /** Determines whether the meter signature is to be displayed. **/ + data_BOOLEAN m_meterVisible; }; //---------------------------------------------------------------------------- @@ -1606,7 +1612,7 @@ class AttPlicaVis : public Att { /** Records the position of the piano damper pedal. **/ data_STEMDIRECTION_basic m_dir; /** - * States the length of barlines in virtual units. + * States the length of bar lines in virtual units. * The value must be greater than 0 and is typically equal to 2 times (the number * of staff lines - 1); e.g., a value of 8 for a 5-line staff. **/ @@ -2112,7 +2118,7 @@ class AttStemVis : public Att { /** Records the position of the stem in relation to the note head(s). **/ data_STEMPOSITION m_pos; /** - * States the length of barlines in virtual units. + * States the length of bar lines in virtual units. * The value must be greater than 0 and is typically equal to 2 times (the number * of staff lines - 1); e.g., a value of 8 for a 5-line staff. **/ diff --git a/libmei/dist/atttypes.h b/libmei/dist/atttypes.h index ef49d5a4e2..4a9ae186c4 100644 --- a/libmei/dist/atttypes.h +++ b/libmei/dist/atttypes.h @@ -193,6 +193,8 @@ enum data_ARTICULATION : int8_t { ARTICULATION_stacciss, ARTICULATION_marc, ARTICULATION_spicc, + ARTICULATION_stress, + ARTICULATION_unstress, ARTICULATION_doit, ARTICULATION_scoop, ARTICULATION_rip, @@ -563,6 +565,36 @@ enum data_DIVISIO : int8_t { DIVISIO_MAX }; +/** + * MEI data.DURATION.GESTURAL + */ +enum data_DURATION_GESTURAL : int8_t { + DURATION_GESTURAL_NONE = 0, + DURATION_GESTURAL_long, + DURATION_GESTURAL_breve, + DURATION_GESTURAL_1, + DURATION_GESTURAL_2, + DURATION_GESTURAL_4, + DURATION_GESTURAL_8, + DURATION_GESTURAL_16, + DURATION_GESTURAL_32, + DURATION_GESTURAL_64, + DURATION_GESTURAL_128, + DURATION_GESTURAL_256, + DURATION_GESTURAL_512, + DURATION_GESTURAL_1024, + DURATION_GESTURAL_2048, + DURATION_GESTURAL_maxima, + DURATION_GESTURAL_longa, + DURATION_GESTURAL_brevis, + DURATION_GESTURAL_semibrevis, + DURATION_GESTURAL_minima, + DURATION_GESTURAL_semiminima, + DURATION_GESTURAL_fusa, + DURATION_GESTURAL_semifusa, + DURATION_GESTURAL_MAX +}; + /** * MEI data.DURATIONRESTS.mensural */ @@ -992,7 +1024,6 @@ enum data_METERFORM : int8_t { METERFORM_denomsym, METERFORM_norm, METERFORM_symplusnorm, - METERFORM_invis, METERFORM_MAX }; @@ -1346,7 +1377,7 @@ enum data_NOTEHEADMODIFIER : int8_t { NOTEHEADMODIFIER_brack, NOTEHEADMODIFIER_box, NOTEHEADMODIFIER_circle, - NOTEHEADMODIFIER_dblwhole, + NOTEHEADMODIFIER_fences, NOTEHEADMODIFIER_MAX }; @@ -1364,7 +1395,7 @@ enum data_NOTEHEADMODIFIER_list : int8_t { NOTEHEADMODIFIER_list_brack, NOTEHEADMODIFIER_list_box, NOTEHEADMODIFIER_list_circle, - NOTEHEADMODIFIER_list_dblwhole, + NOTEHEADMODIFIER_list_fences, NOTEHEADMODIFIER_list_MAX }; @@ -1887,6 +1918,20 @@ enum cutout_CUTOUT : int8_t { cutout_CUTOUT_MAX }; +/** + * MEI att.divLine.log@form + */ +enum divLineLog_FORM : int8_t { + divLineLog_FORM_NONE = 0, + divLineLog_FORM_caesura, + divLineLog_FORM_finalis, + divLineLog_FORM_maior, + divLineLog_FORM_maxima, + divLineLog_FORM_minima, + divLineLog_FORM_virgula, + divLineLog_FORM_MAX +}; + /** * MEI att.dot.log@form */ @@ -1930,12 +1975,12 @@ enum evidence_EVIDENCE : int8_t { }; /** - * MEI att.extSym@glyph.auth + * MEI att.extSym.auth@glyph.auth */ -enum extSym_GLYPHAUTH : int8_t { - extSym_GLYPHAUTH_NONE = 0, - extSym_GLYPHAUTH_smufl, - extSym_GLYPHAUTH_MAX +enum extSymAuth_GLYPHAUTH : int8_t { + extSymAuth_GLYPHAUTH_NONE = 0, + extSymAuth_GLYPHAUTH_smufl, + extSymAuth_GLYPHAUTH_MAX }; /** @@ -2383,6 +2428,19 @@ enum rehearsal_REHENCLOSE : int8_t { rehearsal_REHENCLOSE_MAX }; +/** + * MEI att.repeatMark.log@func + */ +enum repeatMarkLog_FUNC : int8_t { + repeatMarkLog_FUNC_NONE = 0, + repeatMarkLog_FUNC_coda, + repeatMarkLog_FUNC_segno, + repeatMarkLog_FUNC_dalSegno, + repeatMarkLog_FUNC_daCapo, + repeatMarkLog_FUNC_fine, + repeatMarkLog_FUNC_MAX +}; + /** * MEI att.sb.vis@form */ diff --git a/libmei/dist/meibasic.h b/libmei/dist/meibasic.h index 17d292f057..2629a7fbcd 100644 --- a/libmei/dist/meibasic.h +++ b/libmei/dist/meibasic.h @@ -12,228 +12,91 @@ class MEIBasic { // clang-format off inline static std::map> map = { - {"arpeg", {"order", "layer", "plist", "staff", "tstamp", "startid", "arrow", "arrow.shape", "arrow.size", "arrow.color", "arrow.fillcolor", "line.form", "line.width", "fontfam", "fontname", "fontsize", "fontstyle", "fontweight", "letterspacing", "lineheight"}}, - {"beam", {"layer", "staff", "cue"}}, - {"beatRpt", {"beatdef", "layer", "staff", "slash", "expand", "fontfam", "fontname", "fontsize", "fontstyle", "fontweight", "letterspacing", "lineheight", "plist"}}, - {"breath", {"layer", "staff", "startid", "tstamp", "place", "fontfam", "fontname", "fontsize", "fontstyle", "fontweight", "letterspacing", "lineheight"}}, - {"bTrem", {"form", "layer", "staff", "dots", "dur", "num", "num.place", "num.visible", "unitdur"}}, - {"fermata", {"layer", "plist", "staff", "tstamp", "endid", "startid"}}, - {"fTrem", {"form", "layer", "staff", "dots", "dur", "unitdur"}}, - {"gliss", {"layer", "plist", "staff", "tstamp", "dur", "endid", "startid", "tstamp2", "fontfam", "fontname", "fontsize", "fontstyle", "fontweight", "letterspacing", "lineheight", "lendsym", "lendsym.size", "lstartsym", "lstartsym.size", "lform", "lsegs", "lwidth"}}, - {"graceGrp", {"attach", "layer", "staff", "grace", "grace.time"}}, - {"hairpin", {"form", "niente", "layer", "plist", "staff", "tstamp", "dur", "endid", "startid", "tstamp2", "opening", "closed", "opening.vertical", "angle.optimize", "lform", "lsegs", "lwidth", "place"}}, - {"halfmRpt", {"layer", "staff", "dur", "expand", "fontfam", "fontname", "fontsize", "fontstyle", "fontweight", "letterspacing", "lineheight"}}, - {"harpPedal", {"c", "d", "e", "f", "g", "a", "b", "layer", "plist", "staff", "tstamp", "endid", "startid", "place", "fontfam", "fontname", "fontsize", "fontstyle", "fontweight", "letterspacing", "lineheight"}}, - {"lv", {"layer", "plist", "staff", "tstamp", "endid", "startid", "tstamp2", "curvedir"}}, - {"measure", {"left", "right", "metcon", "n"}}, - {"mNum", {"xml:lang", "place", "fontfam", "fontname", "fontsize", "fontstyle", "fontweight", "letterspacing", "lineheight"}}, - {"mRest", {"cue", "dur", "layer", "staff", "cutout", "fontfam", "fontname", "fontsize", "fontstyle", "fontweight", "letterspacing", "lineheight"}}, - {"mRpt", {"layer", "staff", "num", "expand", "num.place", "num.visible", "fontfam", "fontname", "fontsize", "fontstyle", "fontweight", "letterspacing", "lineheight"}}, - {"multiRest", {"layer", "staff", "num", "block", "num.place", "num.visible", "fontfam", "fontname", "fontsize", "fontstyle", "fontweight", "letterspacing", "lineheight", "width"}}, - {"multiRpt", {"layer", "staff", "num", "expand", "fontfam", "fontname", "fontsize", "fontstyle", "fontweight", "letterspacing", "lineheight"}}, - {"octave", {"coll", "layer", "plist", "staff", "tstamp", "dur", "dis", "dis.place", "endid", "startid", "tstamp2"}}, - {"pedal", {"dir", "func", "layer", "plist", "staff", "tstamp", "endid", "startid", "tstamp2", "form", "lendsym", "lendsym.size", "lstartsym", "lstartsym.size", "lform", "lsegs", "lwidth", "place", "fontfam", "fontname", "fontsize", "fontstyle", "fontweight", "letterspacing", "lineheight"}}, - {"reh", {"xml:lang", "staff", "startid", "tstamp", "place", "fontfam", "fontname", "fontsize", "fontstyle", "fontweight", "letterspacing", "lineheight"}}, - {"slur", {"layer", "plist", "staff", "tstamp", "dur", "endid", "startid", "tstamp2", "curvedir"}}, - {"tie", {"layer", "plist", "staff", "tstamp", "endid", "startid", "tstamp2", "curvedir"}}, - {"tuplet", {"dur", "num", "numbase", "layer", "staff", "endid", "startid", "bracket.place", "bracket.visible", "dur.visible", "num.format", "num.place", "num.visible"}}, - {"mordent", {"form", "long", "layer", "plist", "staff", "tstamp", "endid", "startid", "accidupper", "accidlower", "accidupper.ges", "accidlower.ges", "place", "fontfam", "fontname", "fontsize", "fontstyle", "fontweight", "letterspacing", "lineheight"}}, - {"trill", {"layer", "plist", "staff", "tstamp", "dur", "accidupper", "accidlower", "accidupper.ges", "accidlower.ges", "endid", "startid", "tstamp2", "place", "fontfam", "fontname", "fontsize", "fontstyle", "fontweight", "letterspacing", "lineheight"}}, - {"turn", {"delayed", "form", "layer", "plist", "staff", "tstamp", "accidupper", "accidlower", "accidupper.ges", "accidlower.ges", "startid", "place", "fontfam", "fontname", "fontsize", "fontstyle", "fontweight", "letterspacing", "lineheight"}}, - {"fig", {"halign", "valign"}}, - {"figDesc", {"xml:lang"}}, - {"graphic", {"height", "width", "mimetype", "startid", "ulx", "uly"}}, - {"table", {"xml:lang"}}, - {"td", {"xml:lang", "colspan", "rowspan"}}, - {"th", {"xml:lang", "colspan", "rowspan"}}, - {"tr", {"xml:lang"}}, - {"fing", {"layer", "plist", "staff", "tstamp", "dur", "endid", "startid", "tstamp2", "place"}}, - {"fingGrp", {"form", "layer", "plist", "staff", "tstamp", "dur", "endid", "startid", "tstamp2"}}, - {"expression", {"data"}}, - {"expressionList", {}}, - {"item", {"data"}}, - {"itemList", {}}, - {"manifestation", {"comptype", "data", "recordtype", "singleton"}}, - {"manifestationList", {}}, - {"chordDef", {"tab.pos", "tab.strings"}}, - {"chordMember", {"accid.ges", "pname", "oct", "tab.fing", "tab.fret", "tab.string"}}, - {"chordTable", {}}, - {"f", {"layer", "plist", "staff", "tstamp", "dur", "endid", "startid", "tstamp2", "place"}}, - {"fb", {}}, - {"harm", {"chordref", "layer", "plist", "staff", "tstamp", "dur", "endid", "startid", "tstamp2"}}, - {"availability", {"data"}}, - {"fileDesc", {"corresp"}}, - {"meiHead", {"xml:lang", "type"}}, - {"pubStmt", {}}, - {"titleStmt", {}}, - {"refrain", {"xml:lang", "place", "fontfam", "fontname", "fontsize", "fontstyle", "fontweight", "letterspacing", "lineheight", "voltasym"}}, - {"verse", {"xml:lang", "place", "fontfam", "fontname", "fontsize", "fontstyle", "fontweight", "letterspacing", "lineheight", "voltasym"}}, - {"volta", {"xml:lang", "fontfam", "fontname", "fontsize", "fontstyle", "fontweight", "letterspacing", "lineheight"}}, - {"accMat", {"xml:lang"}}, - {"addDesc", {"xml:lang"}}, - {"binding", {"enddate", "isodate", "notafter", "notbefore", "startdate", "xml:lang", "contemporary"}}, - {"bindingDesc", {"xml:lang"}}, - {"catchwords", {"xml:lang"}}, - {"collation", {"xml:lang"}}, - {"colophon", {"xml:lang"}}, - {"decoDesc", {"xml:lang"}}, - {"decoNote", {"xml:lang"}}, - {"explicit", {"xml:lang"}}, - {"foliation", {"xml:lang"}}, - {"heraldry", {"xml:lang"}}, - {"layout", {"xml:lang", "cols", "ruledlines", "writtenlines", "ruledstaves", "writtenstaves"}}, - {"layoutDesc", {"xml:lang"}}, - {"locus", {"xml:lang", "scheme", "from", "to"}}, - {"locusGrp", {"xml:lang", "scheme"}}, - {"rubric", {"xml:lang", "func"}}, - {"scriptDesc", {"xml:lang"}}, - {"scriptNote", {"xml:lang"}}, - {"seal", {"enddate", "isodate", "notafter", "notbefore", "startdate", "xml:lang", "contemporary"}}, - {"sealDesc", {"xml:lang"}}, - {"secFolio", {"xml:lang"}}, - {"signatures", {"xml:lang"}}, - {"stamp", {"enddate", "isodate", "notafter", "notbefore", "startdate", "xml:lang"}}, - {"support", {"xml:lang"}}, - {"supportDesc", {"xml:lang", "material"}}, - {"typeDesc", {"xml:lang"}}, - {"typeNote", {"xml:lang"}}, - {"addName", {"xml:lang", "nymref", "role", "enddate", "isodate", "notafter", "notbefore", "startdate"}}, - {"bloc", {"xml:lang", "nymref", "role", "enddate", "isodate", "notafter", "notbefore", "startdate"}}, - {"corpName", {"xml:lang", "nymref", "role", "enddate", "isodate", "notafter", "notbefore", "startdate"}}, - {"country", {"xml:lang", "nymref", "role", "enddate", "isodate", "notafter", "notbefore", "startdate"}}, - {"district", {"xml:lang", "nymref", "role", "enddate", "isodate", "notafter", "notbefore", "startdate"}}, - {"famName", {"xml:lang", "nymref", "role", "enddate", "isodate", "notafter", "notbefore", "startdate"}}, - {"foreName", {"xml:lang", "nymref", "role", "enddate", "isodate", "notafter", "notbefore", "startdate"}}, - {"genName", {"xml:lang", "nymref", "role", "enddate", "isodate", "notafter", "notbefore", "startdate"}}, - {"geogFeat", {"xml:lang", "nymref", "role", "enddate", "isodate", "notafter", "notbefore", "startdate"}}, - {"geogName", {"xml:lang", "nymref", "role", "enddate", "isodate", "notafter", "notbefore", "startdate"}}, - {"nameLink", {"xml:lang", "nymref", "role", "enddate", "isodate", "notafter", "notbefore", "startdate"}}, - {"periodName", {"xml:lang", "nymref", "role", "enddate", "isodate", "notafter", "notbefore", "startdate"}}, - {"persName", {"xml:lang", "nymref", "role", "enddate", "isodate", "notafter", "notbefore", "startdate"}}, - {"postBox", {"xml:lang"}}, - {"postCode", {"xml:lang"}}, - {"region", {"xml:lang", "nymref", "role", "enddate", "isodate", "notafter", "notbefore", "startdate"}}, - {"roleName", {"xml:lang", "nymref", "role", "enddate", "isodate", "notafter", "notbefore", "startdate"}}, - {"settlement", {"xml:lang", "nymref", "role", "enddate", "isodate", "notafter", "notbefore", "startdate"}}, - {"street", {"xml:lang"}}, - {"styleName", {"xml:lang", "nymref", "role", "enddate", "isodate", "notafter", "notbefore", "startdate"}}, - {"accid", {"func", "accid", "layer", "plist", "staff", "tstamp", "accid.ges"}}, - {"actor", {"xml:lang"}}, - {"address", {"xml:lang"}}, - {"addrLine", {"xml:lang"}}, - {"ambitus", {"inth"}}, - {"ambNote", {"accid", "dur", "pname", "oct"}}, - {"analytic", {"comptype", "data", "recordtype"}}, - {"arranger", {"xml:lang"}}, - {"artic", {"artic", "layer", "plist", "staff", "tstamp", "onstaff", "place", "fontfam", "fontname", "fontsize", "fontstyle", "fontweight", "letterspacing", "lineheight"}}, - {"author", {"xml:lang"}}, - {"bibl", {"xml:lang"}}, - {"biblList", {"xml:lang"}}, - {"biblScope", {"extent", "unit", "atleast", "atmost", "min", "max", "confidence", "xml:lang", "from", "to"}}, - {"biblStruct", {"data", "xml:lang", "recordtype"}}, - {"body", {}}, - {"caesura", {"layer", "staff", "startid", "tstamp", "place", "fontfam", "fontname", "fontsize", "fontstyle", "fontweight", "letterspacing", "lineheight"}}, - {"caption", {"xml:lang"}}, - {"castGrp", {"xml:lang"}}, - {"castItem", {"xml:lang"}}, - {"castList", {"xml:lang"}}, - {"chord", {"dots", "grace", "grace.time", "cue", "dur", "layer", "staff", "stem.dir", "stem.len", "stem.mod"}}, - {"clef", {"layer", "staff", "cautionary", "shape", "line", "oct", "dis", "dis.place", "fontfam", "fontname", "fontsize", "fontstyle", "fontweight", "letterspacing", "lineheight"}}, - {"clefGrp", {"layer", "staff"}}, - {"composer", {"xml:lang"}}, - {"contributor", {"xml:lang", "role"}}, - {"creation", {"enddate", "isodate", "notafter", "notbefore", "startdate", "xml:lang"}}, - {"date", {"calendar", "enddate", "isodate", "notafter", "notbefore", "startdate", "xml:lang"}}, - {"dedicatee", {"xml:lang"}}, - {"depth", {"xml:lang", "quantity", "unit", "atleast", "atmost", "min", "max", "confidence"}}, - {"desc", {"xml:lang"}}, - {"dim", {"xml:lang", "quantity", "unit", "atleast", "atmost", "min", "max", "confidence", "form"}}, - {"dimensions", {"xml:lang", "unit"}}, - {"dir", {"xml:lang", "layer", "plist", "staff", "tstamp", "dur", "endid", "startid", "tstamp2", "place"}}, - {"distributor", {"xml:lang"}}, - {"dot", {"form", "layer", "plist", "staff", "tstamp", "fontfam", "fontname", "fontsize", "fontstyle", "fontweight", "letterspacing", "lineheight"}}, - {"dynam", {"layer", "plist", "staff", "tstamp", "dur", "endid", "startid", "tstamp2", "place", "xml:lang"}}, - {"edition", {"xml:lang"}}, - {"editor", {"xml:lang"}}, - {"ending", {"lendsym", "lendsym.size", "lstartsym", "lstartsym.size", "lform", "lsegs", "lwidth"}}, - {"event", {"calendar", "enddate", "isodate", "notafter", "notbefore", "startdate", "xml:lang"}}, - {"eventList", {}}, - {"expansion", {"plist"}}, - {"extent", {"xml:lang", "quantity", "unit", "atleast", "atmost", "min", "max", "confidence"}}, - {"funder", {"xml:lang"}}, - {"genre", {"xml:lang"}}, - {"grpSym", {"level", "symbol", "endid", "startid", "fontfam", "fontname", "fontsize", "fontstyle", "fontweight", "letterspacing", "lineheight"}}, - {"head", {"xml:lang"}}, - {"height", {"xml:lang", "quantity", "unit", "atleast", "atmost", "min", "max", "confidence"}}, - {"identifier", {}}, - {"imprint", {}}, - {"incip", {}}, - {"keyAccid", {"accid", "pname", "oct", "fontfam", "fontname", "fontsize", "fontstyle", "fontweight", "letterspacing", "lineheight", "form"}}, - {"label", {"xml:lang"}}, - {"labelAbbr", {"xml:lang"}}, - {"layer", {"n"}}, - {"layerDef", {"n", "trans.diat", "trans.semi", "tune.Hz", "tune.pname", "tune.temper"}}, - {"lb", {}}, - {"lg", {"xml:lang", "layer", "staff", "place", "fontfam", "fontname", "fontsize", "fontstyle", "fontweight", "letterspacing", "lineheight"}}, - {"librettist", {"xml:lang"}}, - {"lyricist", {"xml:lang"}}, - {"mdiv", {"attacca", "n", "label"}}, + {"arpeg", {"label", "type", "order", "layer", "plist", "staff", "tstamp", "startid", "arrow", "arrow.shape", "arrow.size", "arrow.color", "arrow.fillcolor", "line.form", "line.width", "fontfam", "fontname", "fontsize", "fontstyle", "fontweight", "letterspacing", "lineheight"}}, + {"beam", {"label", "type", "layer", "staff", "cue"}}, + {"beatRpt", {"label", "type", "beatdef", "layer", "staff", "slash", "expand", "fontfam", "fontname", "fontsize", "fontstyle", "fontweight", "letterspacing", "lineheight", "plist"}}, + {"breath", {"label", "type", "layer", "staff", "startid", "tstamp", "place", "fontfam", "fontname", "fontsize", "fontstyle", "fontweight", "letterspacing", "lineheight"}}, + {"bTrem", {"label", "type", "form", "layer", "staff", "dots", "dur", "num", "num.place", "num.visible", "unitdur"}}, + {"fermata", {"label", "type", "layer", "plist", "staff", "tstamp", "endid", "startid"}}, + {"fTrem", {"label", "type", "form", "layer", "staff", "dots", "dur", "unitdur"}}, + {"gliss", {"label", "type", "layer", "plist", "staff", "tstamp", "dur", "endid", "startid", "tstamp2", "fontfam", "fontname", "fontsize", "fontstyle", "fontweight", "letterspacing", "lineheight", "lendsym", "lendsym.size", "lstartsym", "lstartsym.size", "lform", "lsegs", "lwidth"}}, + {"graceGrp", {"label", "type", "attach", "layer", "staff", "grace", "grace.time"}}, + {"hairpin", {"label", "type", "form", "niente", "layer", "plist", "staff", "tstamp", "dur", "endid", "startid", "tstamp2", "opening", "closed", "opening.vertical", "angle.optimize", "lform", "lsegs", "lwidth", "place", "val", "val2"}}, + {"halfmRpt", {"label", "type", "layer", "staff", "dur", "expand", "fontfam", "fontname", "fontsize", "fontstyle", "fontweight", "letterspacing", "lineheight"}}, + {"harpPedal", {"label", "type", "c", "d", "e", "f", "g", "a", "b", "layer", "plist", "staff", "tstamp", "endid", "startid", "place", "fontfam", "fontname", "fontsize", "fontstyle", "fontweight", "letterspacing", "lineheight"}}, + {"lv", {"label", "type", "layer", "plist", "staff", "tstamp", "endid", "startid", "tstamp2", "curvedir"}}, + {"measure", {"label", "type", "left", "right", "metcon", "n"}}, + {"mNum", {"label", "type", "xml:lang", "place", "fontfam", "fontname", "fontsize", "fontstyle", "fontweight", "letterspacing", "lineheight"}}, + {"mRest", {"label", "type", "cue", "dur", "layer", "staff", "cutout", "fontfam", "fontname", "fontsize", "fontstyle", "fontweight", "letterspacing", "lineheight"}}, + {"mRpt", {"label", "type", "layer", "staff", "num", "expand", "num.place", "num.visible", "fontfam", "fontname", "fontsize", "fontstyle", "fontweight", "letterspacing", "lineheight"}}, + {"multiRest", {"label", "type", "layer", "staff", "num", "block", "num.place", "num.visible", "fontfam", "fontname", "fontsize", "fontstyle", "fontweight", "letterspacing", "lineheight", "width"}}, + {"multiRpt", {"label", "type", "layer", "staff", "num", "expand", "fontfam", "fontname", "fontsize", "fontstyle", "fontweight", "letterspacing", "lineheight"}}, + {"octave", {"label", "type", "coll", "layer", "plist", "staff", "tstamp", "dur", "dis", "dis.place", "endid", "startid", "tstamp2"}}, + {"pedal", {"label", "type", "dir", "func", "layer", "plist", "staff", "tstamp", "endid", "startid", "tstamp2", "form", "lendsym", "lendsym.size", "lstartsym", "lstartsym.size", "lform", "lsegs", "lwidth", "place", "fontfam", "fontname", "fontsize", "fontstyle", "fontweight", "letterspacing", "lineheight"}}, + {"reh", {"label", "type", "xml:lang", "staff", "startid", "tstamp", "place", "fontfam", "fontname", "fontsize", "fontstyle", "fontweight", "letterspacing", "lineheight"}}, + {"repeatMark", {"label", "type", "xml:lang", "func", "layer", "plist", "staff", "tstamp", "dur", "endid", "startid", "tstamp2", "place"}}, + {"slur", {"label", "type", "layer", "plist", "staff", "tstamp", "dur", "endid", "startid", "tstamp2", "curvedir"}}, + {"tie", {"label", "type", "layer", "plist", "staff", "tstamp", "endid", "startid", "tstamp2", "curvedir"}}, + {"tuplet", {"label", "type", "dur", "num", "numbase", "layer", "staff", "endid", "startid", "bracket.place", "bracket.visible", "dur.visible", "num.format", "num.place", "num.visible"}}, + {"mordent", {"label", "type", "form", "long", "layer", "plist", "staff", "tstamp", "endid", "startid", "accidupper", "accidlower", "accidupper.ges", "accidlower.ges", "place", "fontfam", "fontname", "fontsize", "fontstyle", "fontweight", "letterspacing", "lineheight"}}, + {"trill", {"label", "type", "layer", "plist", "staff", "tstamp", "dur", "accidupper", "accidlower", "accidupper.ges", "accidlower.ges", "endid", "startid", "tstamp2", "place", "fontfam", "fontname", "fontsize", "fontstyle", "fontweight", "letterspacing", "lineheight"}}, + {"turn", {"label", "type", "delayed", "form", "layer", "plist", "staff", "tstamp", "accidupper", "accidlower", "accidupper.ges", "accidlower.ges", "startid", "place", "fontfam", "fontname", "fontsize", "fontstyle", "fontweight", "letterspacing", "lineheight"}}, + {"fing", {"label", "type", "layer", "plist", "staff", "tstamp", "dur", "endid", "startid", "tstamp2", "place"}}, + {"fingGrp", {"label", "type", "form", "layer", "plist", "staff", "tstamp", "dur", "endid", "startid", "tstamp2"}}, + {"chordDef", {"label", "type", "tab.pos", "tab.strings"}}, + {"chordMember", {"label", "type", "accid.ges", "pname", "oct", "tab.fing", "tab.fret", "tab.string"}}, + {"chordTable", {"label", "type"}}, + {"f", {"label", "type", "layer", "plist", "staff", "tstamp", "dur", "endid", "startid", "tstamp2", "place"}}, + {"fb", {"label", "type"}}, + {"harm", {"label", "type", "chordref", "layer", "plist", "staff", "tstamp", "dur", "endid", "startid", "tstamp2"}}, + {"availability", {"label", "type", "data"}}, + {"fileDesc", {"label", "type", "corresp"}}, + {"meiHead", {"label", "xml:lang", "type"}}, + {"pubStmt", {"label", "type"}}, + {"titleStmt", {"label", "type"}}, + {"refrain", {"label", "type", "xml:lang", "place", "fontfam", "fontname", "fontsize", "fontstyle", "fontweight", "letterspacing", "lineheight", "voltasym"}}, + {"verse", {"label", "type", "xml:lang", "place", "fontfam", "fontname", "fontsize", "fontstyle", "fontweight", "letterspacing", "lineheight", "voltasym"}}, + {"volta", {"label", "type", "xml:lang", "fontfam", "fontname", "fontsize", "fontstyle", "fontweight", "letterspacing", "lineheight"}}, + {"instrDef", {"label", "n", "type", "midi.channel", "midi.duty", "midi.port", "midi.track", "midi.instrnum", "midi.instrname", "midi.pan", "midi.patchname", "midi.patchnum", "midi.volume", "azimuth", "elevation"}}, + {"persName", {"label", "type", "xml:lang", "nymref", "role", "enddate", "isodate", "notafter", "notbefore", "startdate"}}, + {"accid", {"label", "type", "func", "accid", "layer", "plist", "staff", "tstamp", "accid.ges"}}, + {"artic", {"label", "type", "artic", "layer", "plist", "staff", "tstamp", "onstaff", "place", "fontfam", "fontname", "fontsize", "fontstyle", "fontweight", "letterspacing", "lineheight"}}, + {"body", {"label", "type"}}, + {"caesura", {"label", "type", "layer", "staff", "startid", "tstamp", "place", "fontfam", "fontname", "fontsize", "fontstyle", "fontweight", "letterspacing", "lineheight"}}, + {"chord", {"label", "type", "dots", "grace", "grace.time", "cue", "dur", "layer", "staff", "instr", "stem.dir", "stem.len", "stem.mod"}}, + {"clef", {"label", "type", "layer", "staff", "cautionary", "shape", "line", "oct", "dis", "dis.place", "fontfam", "fontname", "fontsize", "fontstyle", "fontweight", "letterspacing", "lineheight"}}, + {"clefGrp", {"label", "type", "layer", "staff"}}, + {"date", {"label", "type", "calendar", "enddate", "isodate", "notafter", "notbefore", "startdate", "xml:lang"}}, + {"dir", {"label", "type", "xml:lang", "layer", "plist", "staff", "tstamp", "dur", "endid", "startid", "tstamp2", "place"}}, + {"dynam", {"label", "type", "layer", "plist", "staff", "tstamp", "dur", "endid", "startid", "tstamp2", "place", "xml:lang"}}, + {"label", {"label", "type", "xml:lang"}}, + {"labelAbbr", {"label", "type", "xml:lang"}}, + {"layer", {"label", "n", "type"}}, + {"lb", {"label", "type"}}, + {"mdiv", {"label", "type", "attacca", "n"}}, {"mei", {"meiversion"}}, - {"monogr", {"data", "recordtype"}}, - {"music", {}}, - {"name", {"xml:lang", "nymref", "role", "enddate", "isodate", "notafter", "notbefore", "startdate", "n", "type"}}, - {"note", {"dots", "cue", "dur", "layer", "staff", "grace", "grace.time", "pname", "oct", "stem.dir", "stem.len", "stem.mod", "fontfam", "fontname", "fontsize", "fontstyle", "fontweight", "letterspacing", "lineheight", "oct.ges", "pname.ges", "tab.fing", "tab.fret", "tab.string"}}, - {"num", {"xml:lang", "unit", "atleast", "atmost", "min", "max", "confidence", "value"}}, - {"ornam", {"layer", "plist", "staff", "tstamp", "dur", "accidupper", "accidlower", "accidupper.ges", "accidlower.ges", "endid", "startid", "tstamp2", "place"}}, - {"p", {"xml:lang"}}, - {"pb", {"folium"}}, - {"pgDesc", {"xml:lang"}}, - {"pgFoot", {"xml:lang", "halign", "func"}}, - {"pgHead", {"xml:lang", "halign", "func"}}, - {"phrase", {"layer", "plist", "staff", "tstamp", "dur", "endid", "startid", "tstamp2", "curvedir"}}, - {"physLoc", {}}, - {"publisher", {"xml:lang"}}, - {"pubPlace", {"xml:lang"}}, - {"recipient", {"xml:lang"}}, - {"relatedItem", {"data", "rel"}}, - {"rend", {"halign", "xml:lang", "altrend", "rend", "fontfam", "fontname", "fontsize", "fontstyle", "fontweight", "letterspacing", "lineheight", "valign", "xml:space", "rotation"}}, - {"repository", {"xml:lang", "nymref", "role", "enddate", "isodate", "notafter", "notbefore", "startdate"}}, - {"resp", {"enddate", "isodate", "notafter", "notbefore", "startdate", "xml:lang"}}, - {"respStmt", {}}, - {"rest", {"dots", "cue", "dur", "layer", "staff", "fontfam", "fontname", "fontsize", "fontstyle", "fontweight", "letterspacing", "lineheight"}}, - {"role", {"xml:lang"}}, - {"roleDesc", {"xml:lang"}}, - {"sb", {"form", "fontfam", "fontname", "fontsize", "fontstyle", "fontweight", "letterspacing", "lineheight"}}, - {"score", {}}, - {"scoreDef", {"key.sig", "meter.count", "meter.unit", "meter.sym"}}, - {"section", {"attacca", "restart"}}, - {"series", {"xml:lang"}}, - {"space", {"dots", "dur", "layer", "staff", "compressable", "cutout"}}, - {"speaker", {"xml:lang"}}, - {"sponsor", {"xml:lang"}}, - {"stack", {"xml:lang", "delim", "align"}}, - {"staff", {"n"}}, - {"staffDef", {"n", "lines", "clef.shape", "clef.line", "clef.dis", "clef.dis.place", "key.sig", "meter.count", "meter.unit", "meter.sym", "trans.diat", "trans.semi", "tab.strings", "tune.Hz", "tune.pname", "tune.temper"}}, - {"staffGrp", {"bar.thru", "symbol"}}, - {"syl", {"xml:lang", "con", "wordpos", "place", "fontfam", "fontname", "fontsize", "fontstyle", "fontweight", "letterspacing", "lineheight", "halign"}}, - {"symbol", {"startid", "scale", "fontfam", "fontname", "fontsize", "fontstyle", "fontweight", "letterspacing", "lineheight"}}, - {"tempo", {"xml:lang", "func", "layer", "plist", "staff", "tstamp", "mm", "mm.unit", "mm.dots", "endid", "startid", "tstamp2", "place"}}, - {"term", {"data", "xml:lang"}}, - {"textLang", {"xml:lang", "lang.main", "lang.other"}}, - {"title", {"xml:lang", "n", "level", "type"}}, - {"titlePage", {"xml:lang"}}, - {"titlePart", {"xml:lang", "n", "type"}}, - {"width", {"xml:lang", "quantity", "unit", "atleast", "atmost", "min", "max", "confidence"}}, - {"barre", {"endid", "startid", "fret"}}, - {"argument", {"xml:lang"}}, - {"epigraph", {"xml:lang"}}, - {"imprimatur", {"xml:lang"}}, - {"l", {"xml:lang", "rhythm"}}, - {"li", {"xml:lang"}}, - {"list", {"xml:lang", "n", "form", "type"}}, - {"q", {"xml:lang", "n", "type"}}, - {"quote", {"xml:lang"}}, - {"seg", {"xml:lang"}}, + {"music", {"label", "type"}}, + {"note", {"label", "type", "dots", "cue", "dur", "layer", "staff", "grace", "grace.time", "pname", "oct", "stem.dir", "stem.len", "stem.mod", "fontfam", "fontname", "fontsize", "fontstyle", "fontweight", "letterspacing", "lineheight", "oct.ges", "pname.ges", "instr", "vel", "tab.fing", "tab.fret", "tab.string"}}, + {"ornam", {"label", "type", "layer", "plist", "staff", "tstamp", "dur", "accidupper", "accidlower", "accidupper.ges", "accidlower.ges", "endid", "startid", "tstamp2", "place"}}, + {"pb", {"label", "type", "folium"}}, + {"pgFoot", {"label", "type", "xml:lang", "halign", "func"}}, + {"pgHead", {"label", "type", "xml:lang", "halign", "func"}}, + {"pubPlace", {"label", "type", "xml:lang"}}, + {"rend", {"label", "type", "halign", "xml:lang", "altrend", "rend", "fontfam", "fontname", "fontsize", "fontstyle", "fontweight", "letterspacing", "lineheight", "valign", "xml:space", "rotation"}}, + {"respStmt", {"label", "type"}}, + {"rest", {"label", "type", "dots", "cue", "dur", "layer", "staff", "fontfam", "fontname", "fontsize", "fontstyle", "fontweight", "letterspacing", "lineheight", "instr"}}, + {"sb", {"label", "type", "form", "fontfam", "fontname", "fontsize", "fontstyle", "fontweight", "letterspacing", "lineheight"}}, + {"score", {"label", "type"}}, + {"scoreDef", {"label", "type", "key.sig", "meter.count", "meter.unit", "meter.sym"}}, + {"section", {"label", "type", "attacca", "restart"}}, + {"space", {"label", "type", "dots", "dur", "layer", "staff", "compressable", "cutout"}}, + {"staff", {"label", "n", "type"}}, + {"staffDef", {"label", "n", "type", "lines", "clef.shape", "clef.line", "clef.dis", "clef.dis.place", "key.sig", "meter.count", "meter.unit", "meter.sym", "trans.diat", "trans.semi", "instr", "tab.strings", "ppq", "tune.Hz", "tune.pname", "tune.temper"}}, + {"staffGrp", {"label", "type", "bar.thru", "symbol", "instr"}}, + {"syl", {"label", "type", "xml:lang", "con", "wordpos", "place", "fontfam", "fontname", "fontsize", "fontstyle", "fontweight", "letterspacing", "lineheight", "halign"}}, + {"tempo", {"label", "type", "xml:lang", "func", "layer", "plist", "staff", "tstamp", "mm", "mm.unit", "mm.dots", "endid", "startid", "tstamp2", "place", "midi.bpm", "midi.mspb"}}, + {"title", {"label", "xml:lang", "n", "level", "type"}}, + {"barre", {"label", "type", "endid", "startid", "fret"}}, }; // clang-format on diff --git a/libmei/mei/develop/mei-basic_compiled.odd b/libmei/mei/develop/mei-basic_compiled.odd index 177f498fcb..a10dbc9e4a 100644 --- a/libmei/mei/develop/mei-basic_compiled.odd +++ b/libmei/mei/develop/mei-basic_compiled.odd @@ -1,4 +1,4 @@ - + @@ -30,7 +30,7 @@ - + Written accidental values. @@ -250,6 +250,12 @@ Spiccato. + + Stress (Unicode 00B4). + + + Unstress (Unicode 02D8). + Main note followed by short slide to higher, indeterminate pitch (Unicode 1D185). @@ -338,7 +344,7 @@ - + "" contains a deprecated value. @@ -465,7 +471,7 @@ G clef (Unicode 1D11E). - Double G clef. + Double G clef. Sounds one octave lower than G clef. (See remarks on usage below.) F clef (Unicode 1D122). @@ -481,6 +487,14 @@ + +

Double-G clefs sound one octave lower, so do not combine with dis/ + dis.place/clef.dis/clef.dis.place. In some cases + the double G clef may be used to indicate that two voices share one staff and + does not sound one octave lower. In this case the oct attribute may be + used to clarify the sounding octave of the instruments for the clef. +

+
Confidence is expressed as a real number between 0 and 1; 0 representing certainly false and 1 representing certainly true. @@ -1728,9 +1742,6 @@ Meter signature rendered using both the symbol and the traditional numeric values. - - Meter signature not rendered. - @@ -1748,6 +1759,563 @@ + + MIDI channel number. One-based values must be followed by a lower-case letter "o". + + + 0|([1-9]|1[0-5])o?|16o + + + + Tempo expressed as "beats" per minute, where "beat" is always defined as a quarter note, + *not the numerator of the time signature or the metronomic indication*. + + + 0 + + + + Tempo expressed as microseconds per "beat", where "beat" is always defined as a quarter + note, *not the numerator of the time signature or the metronomic indication*. + + + + + General MIDI instrument names. + + + + Acoustic Grand Piano, Program #0. + + + Bright Acoustic Piano, Program #1. + + + Electric Grand Piano, Program #2. + + + Honky-tonk Piano, Program #3. + + + Electric Piano 1, Program #4. + + + Electric Piano 2, Program #5. + + + Harpsichord, Program #6. + + + Clavi, Program #7. + + + Celesta, Program #8. + + + Glockenspiel, Program #9. + + + Music Box, Program #10. + + + Vibraphone, Program #11. + + + Marimba, Program #12. + + + Xylophone, Program #13. + + + Tubular Bells, Program #14. + + + Dulcimer, Program #15. + + + Drawbar Organ, Program #16. + + + Percussive Organ, Program #17. + + + Rock Organ, Program #18. + + + Church Organ, Program #19. + + + Reed Organ, Program #20. + + + Accordion, Program #21. + + + Harmonica, Program #22. + + + Tango Accordion, Program #23. + + + Acoustic Guitar (nylon), Program #24. + + + Acoustic Guitar (steel), Program #25. + + + Electric Guitar (jazz), Program #26. + + + Electric Guitar (clean), Program #27. + + + Electric Guitar (muted), Program #28. + + + Overdriven Guitar, Program #29. + + + Distortion Guitar, Program #30. + + + Guitar harmonics, Program #31. + + + Acoustic Bass, Program #32. + + + Electric Bass (finger), Program #33. + + + Electric Bass (pick), Program #34. + + + Fretless Bass, Program #35. + + + Slap Bass 1, Program #36. + + + Slap Bass 2, Program #37. + + + Synth Bass 1, Program #38. + + + Synth Bass 2, Program #39. + + + Violin, Program #40. + + + Viola, Program #41. + + + Cello, Program #42. + + + Contrabass, Program #43. + + + Tremolo Strings, Program #44. + + + Pizzicato Strings, Program #45. + + + Orchestral Harp, Program #46. + + + Timpani, Program #47. + + + String Ensemble 1, Program #48. + + + String Ensemble 2, Program #49. + + + SynthStrings 1, Program #50. + + + SynthStrings 2, Program #51. + + + Choir Aahs, Program #52. + + + Voice Oohs, Program #53. + + + Synth Voice, Program #54. + + + Orchestra Hit, Program #55. + + + Trumpet, Program #56. + + + Trombone, Program #57. + + + Tuba, Program #58. + + + Muted Trumpet, Program #59. + + + French Horn, Program #60. + + + Brass Section, Program #61. + + + SynthBrass 1, Program #62. + + + SynthBrass 2, Program #63. + + + Soprano Sax, Program #64. + + + Alto Sax, Program #65. + + + Tenor Sax, Program #66. + + + Baritone Sax, Program #67. + + + Oboe, Program #68. + + + English Horn, Program #69. + + + Bassoon, Program #70. + + + Clarinet, Program #71. + + + Piccolo, Program #72. + + + Flute, Program #73. + + + Recorder, Program #74. + + + Pan Flute, Program #75. + + + Blown Bottle, Program #76. + + + Shakuhachi, Program #77. + + + Whistle, Program #78. + + + Ocarina, Program #79. + + + Lead 1 (square), Program #80. + + + Lead 2 (sawtooth), Program #81. + + + Lead 3 (calliope), Program #82. + + + Lead 4 (chiff), Program #83. + + + Lead 5 (charang), Program #84. + + + Lead 6 (voice), Program #85. + + + Lead 7 (fifths), Program #86. + + + Lead 8 (bass + lead), Program #87. + + + Pad 1 (new age), Program #88. + + + Pad 2 (warm), Program #89. + + + Pad 3 (polysynth), Program #90. + + + Pad 4 (choir), Program #91. + + + Pad 5 (bowed), Program #92. + + + Pad 6 (metallic), Program #93. + + + Pad 7 (halo), Program #94. + + + Pad 8 (sweep), Program #95. + + + FX 1 (rain), Program #96. + + + FX 2 (soundtrack), Program #97. + + + FX 3 (crystal), Program #98. + + + FX 4 (atmosphere), Program #99. + + + FX 5 (brightness), Program #100. + + + FX 6 (goblins), Program #101. + + + FX 7 (echoes), Program #102. + + + FX 8 (sci-fi), Program #103. + + + Sitar, Program #104. + + + Banjo, Program #105. + + + Shamisen, Program #106. + + + Koto, Program #107. + + + Kalimba, Program #108. + + + Bag pipe, Program #109. + + + Fiddle, Program #110. + + + Shanai, Program #111. + + + Tinkle Bell, Program #112. + + + Agogo, Program #113. + + + Steel Drums, Program #114. + + + Woodblock, Program #115. + + + Taiko Drum, Program #116. + + + Melodic Tom, Program #117. + + + Synth Drum, Program #118. + + + Reverse Cymbal, Program #119. + + + Guitar Fret Noise, Program #120. + + + Breath Noise, Program #121. + + + Seashore, Program #122. + + + Bird Tweet, Program #123. + + + Telephone Ring, Program #124. + + + Helicopter, Program #125. + + + Applause, Program #126. + + + Gunshot, Program #127. + + + Acoustic Bass Drum, Key #35. + + + Bass Drum 1, Key #36. + + + Side Stick, Key #37. + + + Acoustic Snare, Key #38. + + + Hand Clap, Key #39. + + + Electric Snare, Key #40. + + + Low Floor Tom, Key #41. + + + Closed Hi Hat, Key #42. + + + High Floor Tom, Key #43. + + + Pedal Hi-Hat, Key #44. + + + Low Tom, Key #45. + + + Open Hi-Hat, Key #46. + + + Low-Mid Tom, Key #47. + + + Hi-Mid Tom, Key #48. + + + Crash Cymbal 1, Key #49. + + + High Tom, Key #50. + + + Ride Cymbal 1, Key #51. + + + Chinese Cymbal, Key #52. + + + Ride Bell, Key #53. + + + Tambourine, Key #54. + + + Splash Cymbal, Key #55. + + + Cowbell, Key #56. + + + Crash Cymbal 2, Key #57. + + + Vibraslap, Key #58. + + + Ride Cymbal 2, Key #59. + + + Hi Bongo, Key #60. + + + Low Bongo, Key #61. + + + Mute Hi Conga, Key #62. + + + Open Hi Conga, Key #63. + + + Low Conga, Key #64. + + + High Timbale, Key #65. + + + Low Timbale, Key #66. + + + High Agogo, Key #67. + + + Low Agogo, Key #68. + + + Cabasa, Key #69. + + + Maracas, Key #70. + + + Short Whistle, Key #71. + + + Long Whistle, Key #72. + + + Short Guiro, Key #73. + + + Long Guiro, Key #74. + + + Claves, Key #75. + + + Hi Wood Block, Key #76. + + + Low Wood Block, Key #77. + + + Mute Cuica, Key #78. + + + Open Cuica, Key #79. + + + Mute Triangle, Key #80. + + + Open Triangle, Key #81. + + + + +

Instrument names are based on the official list in the General MIDI Specifications.

+

MEI uses 0-based program numbers.

+

Percussion sounds are available when the MIDI channel is set to "10".

+
Generic MIDI value. One-based values must be followed by a lower-case letter "o". @@ -1755,6 +2323,21 @@ 0|([1-9]|[1-9][0-9]|1([0-1][0-9]|2[0-7]))o?|128o + + data.MIDIVALUE or data.NCName values. + + + + + data.MIDIVALUE or data.PERCENT.LIMITED.SIGNED values. + + + + + data.MIDIVALUE or data.PERCENT.LIMITED values. + + + Modes. @@ -1955,7 +2538,7 @@ Enclosing circle. - + Enclosing "fences". @@ -2028,24 +2611,24 @@ - Positive decimal number plus '%', i.e., [0-9]+(\.?[0-9]*)?\%. + Positive decimal number plus '%', i.e., [0-9]+(\.[0-9]*)?%. - [0-9]+(\.?[0-9]*)?% + [0-9]+(\.[0-9]*)?% - Positive decimal number between 0 and 100, followed by a percent sign "%". + Decimal number between 0 and 100, followed by a percent sign "%". - (([0-9]|[1-9][0-9])(\.[0-9]+)?|100(\.0+)?)% + (([0-9]|[1-9][0-9])(\.[0-9]*)?|100(\.0*)?)% - Positive decimal number between -100 and 100, followed by a percent sign "%". + Decimal number between -100 and 100, followed by a percent sign "%". - (\+|-)?(([0-9]|[1-9][0-9])(\.[0-9]+)?|100(\.0+)?)% + (\+|-)?(([0-9]|[1-9][0-9])(\.[0-9]*)?|100(\.0*)?)% @@ -2087,7 +2670,7 @@ [a-g] - + Gestural pitch names need an additional value for when the notated pitch is not to be sounded. @@ -2105,7 +2688,7 @@ - + Other values not permitted when 'above', 'below', 'between' or 'within' is @@ -2221,7 +2804,7 @@ - + The @staff @@ -2515,27 +3098,9 @@ (\p{L}|\p{N}|\p{P}|\p{S})* - - Analytical domain attributes. - - - - +
Analytical domain attributes. - - Analytical domain attributes. - - Attributes that describe harmonic intervals. - - - interval harmonic - Encodes the harmonic interval between pitches occurring at the same time. - - - - - - + Analytical domain attributes. Logical, that is, written, duration attribute values for the CMN repertoire. @@ -2729,8 +3294,6 @@ - - Gestural domain attributes for CMN features. Logical domain attributes in the CMN repertoire. @@ -2749,8 +3312,6 @@ - - Logical domain attributes. Attributes that indicate whether to render a repeat symbol or the source material to which it refers. @@ -2988,11 +3549,6 @@ - - Logical domain attributes. - - - Logical domain attributes. @@ -3172,12 +3728,6 @@ - - Visual domain attributes. - - - - Logical domain attributes. @@ -3188,8 +3738,6 @@ - - Logical domain attributes in the CMN repertoire. Visual domain attributes. @@ -3203,8 +3751,6 @@ - - Logical domain attributes in the CMN repertoire. Logical domain attributes for staffDef in the CMN repertoire. @@ -3282,7 +3828,7 @@ - + @@ -3304,12 +3850,12 @@ - + - + A beam that contains neither a copyof nor sameas attribute must have at least 2 note, rest, chord, or space @@ -3327,7 +3873,7 @@ - + @@ -3350,7 +3896,7 @@ - + Must have one of the @@ -3380,14 +3926,14 @@ An indication placed over a note or rest to indicate that it should be held longer than its written value. May also occur over a bar line to indicate the end of a phrase or section. - Sometimes called a 'hold' or 'pause'. + Sometimes called a 'hold' or 'pause'. Must have one of the attributes: startid, tstamp, tstamp.ges or tstamp.real. - + Must have one of the @@ -3424,7 +3970,7 @@ - + Must have one of the @@ -3448,19 +3994,19 @@ - - + + - + A graceGrp without a copyof attribute must have at least 1 note, rest, chord, or space descendants. - + The grace attribute is not allowed on @@ -3478,7 +4024,7 @@ - + Must have one of the @@ -3517,7 +4063,7 @@ - + Must have one of the @@ -3538,14 +4084,14 @@ - + Must have one of the attributes: startid, tstamp, tstamp.ges or tstamp.real. - + The visual attributes of the lv element (@bezier, @bulge, @curvedir, @@ -3570,10 +4116,10 @@ - + - - + + @@ -3596,7 +4142,7 @@ - + @@ -3620,7 +4166,7 @@ - + @@ -3641,7 +4187,7 @@ - + Must have one of the @@ -3670,7 +4216,7 @@ - + Must have one of the @@ -3688,7 +4234,7 @@ - + @@ -3697,6 +4243,37 @@

It may also be called a "rehearsal figure", or when numbers are used instead of letters, a "rehearsal number". See Read, p. 443. reh uses a subset of model.textPhraseLike.limited.

+
repetition mark + An instruction expressed as a combination of text and symbols – segno and coda – typically above, + below, or between staves, but not on the staff. + + + + + + + + + + + + + + Must have one of the + attributes: startid, tstamp, tstamp.ges or tstamp.real. + + + + + + When @glyph.name or @glyph.num is present, repeatMark must not have content. + + + +

When only func is provided to describe the function of the repeat mark (i.e., without glyph information and no textual content), then a renderer + can rely on it to display the appropriate symbol. When textual content is provided, it will take precedence over the symbol implied by the function. Generic repeat marks where + no function can be determined, then generic dir elements should be used. +

Indication of 1) a "unified melodic idea" or 2) performance technique. @@ -3707,7 +4284,7 @@ - + Must have one of the @@ -3716,7 +4293,7 @@ dur, dur.ges, endid, or tstamp2. - + The visual attributes of the slur (@bezier, @bulge, @curvedir, @lform, @@ -3751,7 +4328,7 @@ - + Must have one of the @@ -3760,7 +4337,7 @@ dur, dur.ges, endid, or tstamp2. - + The visual attributes of the tie (@bezier, @bulge, @curvedir, @lform, @@ -3909,12 +4486,12 @@ - + - + Must have one of the @@ -3936,7 +4513,7 @@ - + Must have one of the @@ -3958,12 +4535,12 @@ - + - + Must have one of the @@ -3973,156 +4550,6 @@

See Read, p. 246-247. Whether the turn is accented or unaccented may be inferred from the timestamp — accented turns occur directly on the affected beat, unaccented ones do not.

-
- Attributes shared by table cells. - - - The number of columns spanned by this cell. - - - - - - The number of rows spanned by this cell. - - - - - - - Groups elements representing or containing graphic information such as an illustration or - figure. - - - - - Groups elements that indicate the location of an inline graphic, illustration, or - figure. - - Groups table-like elements. - - - - - figureGroups elements representing or containing graphic information such as an - illustration or figure. - - - - - - - - - -

The model of this element is based on the figure element of the Text Encoding Initiative (TEI).

-
figure descriptionContains a brief prose description of the appearance or content of - a graphic figure, for use when documenting an image without displaying it. - - - - - - -

Best practice suggests the use of controlled vocabulary for figure descriptions. Don't - confuse this entity with a figure caption. A caption is text primarily intended for display - with an illustration. It may or may not function as a description of the illustration.

-
-

The model of this element is based on the figDesc element of the Text Encoding Initiative (TEI).

-
Indicates the location of an inline graphic. - - - - - - - - - - - - - - - Graphic child of zone should not have - children. - - - Graphic should have either a - startid attribute or ulx and uly attributes. - - - Graphic should not have @ulx or @uly - attributes. - Graphic should not have @ho or @vo - attributes. - - - - Indicates the upper-left corner x coordinate. - - - - - Indicates the upper-left corner y coordinate. - - - - -

The model of this element is based on the graphic element of the Text Encoding Initiative (TEI).

-
Contains text displayed in tabular form. - - - - - - - - - - -

The model of this element is based on the table element of the Encoded Archival Description (EAD), the table element of the Text - Encoding Initiative (TEI), and the table element of HTML.

-
table dataDesignates a table cell that contains data as opposed to a cell that - contains column or row heading information. - - - - - - - - -

The colspan and rowspan attributes record tabular display rendering - information.

-
-

The model of this element is based on the td element of HTML.

-
table headerDesignates a table cell containing column or row heading information as - opposed to one containing data. - - - - - - - - -

The colspan and rowspan attributes record tabular display rendering - information.

-
-

The model of this element is based on the th element of HTML.

-
table rowA formatting element that contains one or more cells (intersection of a row - and a column) in a table. - - - - - - - -

More precise rendition of the table and its cells can be specified in a style sheet.

-
-

The model of this element is based on the tr element of HTML.

Logical domain attributes. @@ -4170,14 +4597,14 @@ - + Must have one of the attributes: startid, tstamp, tstamp.ges or tstamp.real. - + @@ -4195,14 +4622,14 @@ - + At least 2 fing or fingGrp elements are required. - + @@ -4216,258 +4643,7 @@ - - Relationships between FRBR entities. - - - - Target is an abridgement, condensation, or expurgation of the current entity. - - - Reciprocal relationship of hasAbridgement. - - - Target is an adaptation, paraphrase, free translation, variation (music), - harmonization (music), or fantasy (music) of the current entity. - - - Reciprocal relationship of hasAdaptation. - - - Target is an alternate format or simultaneously released edition of the current - entity. - - - Reciprocal relationship of hasAlternate. - - - Target is an arrangement (music) of the current entity. - - - Reciprocal relationship of hasArrangement. - - - Target is a cadenza, libretto, choreography, ending for unfinished work, incidental - music, or musical setting of a text of the current entity. - - - Reciprocal relationship of hasComplement. - - - Target is a physical embodiment of the current abstract entity; describes the - expression-to-manifestation relationship. - - - Reciprocal relationship of hasEmbodiment. - - - Target is an exemplar of the class of things represented by the current entity; - describes the manifestation-to-item relationship. - - - Reciprocal relationship of hasExamplar. - - - Target is a parody, imitation, or travesty of the current entity. - - - Reciprocal relationship of hasImitation. - - - Target is a chapter, section, part, etc.; volume of a multivolume manifestation; - volume/issue of serial; intellectual part of a multi-part work; illustration for a text; - sound aspect of a film; soundtrack for a film on separate medium; soundtrack for a film - embedded in film; monograph in a series; physical component of a particular copy; the - binding of a book of the current entity. - - - Reciprocal relationship of hasPart. - - - Target is a realization of the current entity; describes the work-to-expression - relationship. - - - Reciprocal relationship of hasRealization. - - - Target has been reconfigured: bound with, split into, extracted from the current - entity. - - - Reciprocal relationship of hasReconfiguration. - - - Target is a reproduction, microreproduction, macroreproduction, reprint, - photo-offset reprint, or facsimile of the current entity. - - - Reciprocal relationship of hasReproduction. - - - Target is a revised edition, enlarged edition, or new state (graphic) of the current - entity. - - - Reciprocal relationship of hasRevision. - - - Target is a sequel or succeeding work of the current entity. - - - Reciprocal relationship of hasSuccessor. - - - Target is a digest or abstract of the current entity. - - - Reciprocal relationship of hasSummarization. - - - Target is an index, concordance, teacher’s guide, gloss, supplement, or appendix of - the current entity. - - - Reciprocal relationship of hasSupplement. - - - Target is a dramatization, novelization, versification, or screenplay of the current - entity. - - - Reciprocal relationship of hasTransformation. - - - Target is a literal translation or transcription (music) of the current - entity. - - - Reciprocal relationship of hasTranslation. - - - - - Collects FRBR expression-like elements. - - Collects FRBR item-like elements. - - Collects FRBR manifestation-like elements. - Intellectual or artistic realization of a work. - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

The perfDuration element captures the intended duration - of the expression, while extent records scope of the expression in - other terms, such as number of pages, measures, etc.

-
Gathers bibliographic expression entities. - - - - - Single instance or exemplar of a source/manifestation. - - - - - - - - - - - - - - - - - - - - Gathers bibliographic item entities. - - - - - A bibliographic description of a physical embodiment of an expression of a work. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Item children are not permitted when @singleton - equals "true". - - - - - - Availability is only permitted when @singleton equals "true". - - - - Indicates the manifestation is a unique physical object. - - - -

This attribute is inspired by the FRBRoo concept of manifestation singleton.

-

Manifestation singleton encompasses: manuscripts, preperatory sketches, and final clean drafts.

-
A container for the descriptions of physical embodiments of an expression of a - work. - - - - - +
Gestural domain attributes. @@ -4480,7 +4656,7 @@ - + The value of @accid.ges should @@ -4490,21 +4666,11 @@ - - Gestural domain attributes. - - Gestural domain attributes. - - Gestural domain attributes. Gestural domain attributes. - - Gestural domain attributes. - - Gestural domain attributes. Gestural domain attributes. @@ -4526,20 +4692,14 @@ + - - - Gestural domain attributes. Gestural domain attributes. - - Gestural domain attributes. - - Gestural domain attributes. Gestural domain attributes. @@ -4585,16 +4745,12 @@ - - Gestural domain attributes. - - Gestural domain attributes. Gestural domain attributes. - - + + @@ -4602,23 +4758,18 @@ - - Gestural domain attributes. - - Gestural domain attributes. - + Gestural domain attributes. - - + + + Gestural domain attributes. - - Gestural domain attributes. Gestural domain attributes. The tstamp.ges and tstamp.real attributes encode the onset time of the measure. In reality, this is usually the same as the onset time of the first event @@ -4626,32 +4777,24 @@ - - Gestural domain attributes. - - Gestural domain attributes. Gestural domain attributes. - - Gestural domain attributes. Gestural domain attributes. - - Gestural domain attributes. Gestural domain attributes. - - + + @@ -4666,7 +4809,7 @@ Contains a performed pitch name that differs from the written value. - + @@ -4698,26 +4841,18 @@ - - Gestural domain attributes. Gestural domain attributes. - + Gestural domain attributes. - - Gestural domain attributes. - - Gestural domain attributes. - Gestural domain attributes. - Gestural domain attributes. - + Gestural domain attributes. Gestural domain attributes. Gestural domain attributes. @@ -4736,34 +4871,52 @@ + + Attributes that locate a sound source within 3-D space. + + + The lateral or left-to-right plane. + + + + +

A value of 0, 360, or -360 is directly in front of the listener, while a value of 180 + or -180 is directly behind.

+
+
+ + The above-to-below axis. + + + + +

A value of 0, 360, or -360 is directly above the listener, while a value of 180 or -180 + is directly below.

+
+
+
Gestural domain attributes. - - Gestural domain attributes. Gestural domain attributes for staffDef in the CMN repertoire. - + - + Gestural domain attributes. - + - - Gestural domain attributes. - - Gestural domain attributes. Gestural domain attributes. - + Gestural domain attributes. @@ -4781,12 +4934,6 @@ - - Gestural domain attributes. - - Gestural domain attributes. - - Gestural domain attributes. Logical domain attributes. @@ -4823,7 +4970,7 @@ - + @chordref attribute @@ -4853,9 +5000,9 @@ chord definitionChord tablature definition. - + - + @@ -4870,7 +5017,7 @@ - + @@ -4915,7 +5062,7 @@ - + Must have one of the @@ -4928,147 +5075,13 @@ -
- Groups manifestation- and item-specific elements that may appear as part of a - bibliographic description. - - - - - - - - - - Attributes that define the characteristics and components of the bibliographic - description. - - - - - Language material. - - - Notated music. - - - Manuscript notated music. - - - Non-manuscript cartographic material. - - - Manuscript cartographic material. - - - Projected medium. - - - Nonmusical sound recording. - - - Musical sound recording. - - - Two-dimensional nonprojectable graphic. - - - Computer file. - - - Kit. - - - Mixed materials. - - - Three-dimensional artifact or naturally occurring object. - - - Manuscript language material. - - - - - -

The recordtype attribute may be used to determine the appropriateness and - validity of certain data elements in the description.

-

- - Code Descriptions - - Use for non-manuscript language material, including microforms and electronic - resources that are basically textual in nature, whether they are reproductions from - print or originally produced. - - Use for printed, microform, or electronic notated music. - - Use for manuscript notated music or a microform of manuscript music. - - Use for non-manuscript cartographic material or a microform of non-manuscript - cartographic material. - - Use for manuscript cartographic material or a microform of manuscript cartographic - material. - - Use for motion pictures, videorecordings (including digital video), filmstrips, - slide, transparencies or material specifically designed for projection. - - Use for recordings of nonmusical sounds (e.g., speech). - - Use for musical sound recording (e.g., phonodiscs, compact discs, or cassette - tapes. - - Use for two-dimensional nonprojectable graphics such as, activity cards, charts, - collages, computer graphics, digital pictures, drawings, duplication masters, flash - cards, paintings, photo CDs, photomechanical reproductions, photonegatives, photoprints, - pictures, postcards, posters, prints, spirit masters, study prints, technical drawings, - transparency masters, and reproductions of any of these. - - Use for computer software (including programs, games, fonts), numeric data, - computer-oriented multimedia, online systems or services. Other classes of electronic - resources are coded for their most significant aspect (e.g., language material, graphic, - cartographic material, sound, music, moving image). In case of doubt or if the most - significant aspect cannot be determined, consider the item a computer file. - - Use for a mixture of various components issued as a unit and intended primarily for - instructional purposes where no one item is the predominant component of the kit. - Examples are packages of assorted materials, such as a set of school social studies - curriculum material (books, workbooks, guides, activities, etc.), or packages of - educational test materials (tests, answer sheets, scoring guides, score charts, - interpretative manuals, etc.). - - Use for materials in two or more forms that are usually related by virtue of their - having been accumulated by or about a person or body. Includes archival fonds and - manuscript collections of mixed forms of materials, such as text, photographs, and sound - recordings. Intended primary purpose is other than for instructional purposes (i.e., - materials coded as "o"). - - Includes man-made objects such as models, dioramas, games, puzzles, simulations, - sculptures and other three-dimensional art works, exhibits, machines, clothing, toys, - and stitchery. Also includes naturally occurring objects such as, microscope specimens - (or representations of them) and other specimens mounted for viewing. - - This category is applied to items for language material in handwriting, typescript, - or computer printout including printed materials completed by hand or by keyboard or a - microform of these categories. At the time it is created, this material is usually - intended, either implicitly or explicitly, to exist as a single instance. Examples - include marked or corrected galley and page proofs, manuscript books, legal papers, and - unpublished theses and dissertations. - -

-
-
- Groups elements that may be used to provide a structured description of an event. - - Groups elements that assist in the identification of a work. - Groups elements that describe the availability of and access to a bibliographic item, + Groups elements that describe the availability of and access to a bibliographic item, including an MEI-encoded document. - + @@ -5092,7 +5105,7 @@

This element is modelled on elements in the Text Encoding Initiative (TEI) and Encoded Archival Description (EAD) standards.

MEI header(MEI header) – Supplies the descriptive and declarative metadata prefixed to every - MEI-conformant text. + MEI-conformant text.
The meiHead type attribute can have the value 'music' @@ -5136,23 +5149,7 @@

The model of this element is based on the titleStmt element of the Text Encoding Initiative (TEI).

-
- Logical domain attributes. - - - - - - - Logical domain attributes. The n attribute should be used for verse numbers. Numbers need - not be consecutive; they may also be expressed as ranges, e.g., 2-3,6. - - Logical domain attributes. The n attribute should be used for verse numbers. Numbers need - not be consecutive; they may also be expressed as ranges, e.g., 2-3,6. - - Logical domain attributes. The n attribute should be used for repetition numbers. Numbers - need not be consecutive; they may also be expressed as ranges, e.g., 2-3,6. - + Groups elements that contain a lyric verse. @@ -5164,9 +5161,9 @@ - + - + @@ -5182,9 +5179,9 @@ - + - + @@ -5201,9 +5198,9 @@ - + - + @@ -5214,635 +5211,240 @@

The volta element is intended for those cases where the musical notation is repeated, but the accompanying lyrics are not.

-
- Attributes that express the relationship between a component and its host. + + Attributes that record MIDI channel information. - - + + Records a MIDI channel value. + + + + + + Specifies the 'on' part of the duty cycle as a percentage of a note’s duration. + + + + + + Sets the MIDI port value. + + + + + + Sets the MIDI track. + + + + + + + Logical domain attributes. + + Attributes which identify a MIDI instrument. + + + Provides a way of pointing to a MIDI instrument definition. It must contain the ID of + an instrDef element elsewhere in the document. + + + + - - - The comptype attribute may occur on - only when it is a descendant of a - componentList. + + @instr attribute + should have content. + The value in @instr should correspond to the @xml:id attribute of an instrDef + element. - - - A physical and logical part of entity. - - - A physical, but not logical component of the entity, usually included as part of - the binding process. - - - A logical component of the entity physically held elsewhere. - - - - Groups elements that may appear inline when the msdesc module is active. - - - - Holds a description of any additional material bound with an item, such as - non-contemporaneous documents or fragments. - - - - - - - -

The model of this element is based on the accMat element of the Text Encoding Initiative (TEI).

-
addition descriptionProvides a description of significant additions found within an - item, such as marginalia or other annotations. - - - - - - - -

The model of this element is based on the additions element of the Text Encoding Initiative (TEI).

-
bindingContains a description of one binding, i.e., type of covering, boards, etc. - applied to an item. - - - - - - - - +
+ Attributes that record MIDI instrument information. + + + + Only one of @midi.instrname and @midi.instrnum + allowed. + + + + + + + Only one of @midi.patchname and @midi.patchnum + allowed. + + + + + + Captures the General MIDI instrument number. Use an integer for a 0-based value. An + integer preceded by "in" indicates a 1-based value. - + - -

The model of this element is based on the binding element of the Text Encoding Initiative (TEI).

-
binding descriptionDescribes the present and former bindings of an item. - - - - - - - - -

The model of this element is based on the bindingDesc element of the Text Encoding Initiative (TEI).

-
Describes the system used to ensure correct ordering of the quires making up an item, - typically by means of annotations at the foot of the page. - - - - - - - - -

The model of this element is based on the catchwords element of the Text Encoding Initiative (TEI).

-
Records a description of how the leaves or bifolia of an item are physically - arranged. - - - - - - -

The model of this element is based on the collation element of the Text Encoding Initiative (TEI).

-
Contains a statement providing information regarding the date, place, agency, or reason - for production of the item. - - - - - - - - -

The model of this element is based on the colophon element of the Text Encoding Initiative (TEI).

-
decoration descriptionContains a description of the decoration of an item. - - - - - - - -

The model of this element is based on the decoDesc element of the Text Encoding Initiative (TEI).

-
decoration noteContains a description of one or more decorative features of an - item. - - - - - - -

The model of this element is based on the decoNote element of the Text Encoding Initiative (TEI).

-
Contains the explicit of a manuscript item; that is, the closing words of the text proper, - exclusive of any rubric or colophon which might follow it. - - - - - - - - -

The model of this element is based on the explicit element of the Text Encoding Initiative (TEI).

-
Describes the numbering system or systems used to count the leaves or pages in a - codex. - - - - - - -

The model of this element is based on the foliation element of the Text Encoding Initiative (TEI).

-
Contains a heraldic formula or phrase, typically found as part of a blazon, coat of arms, - etc. - - - - - - - - - -

The model of this element is based on the heraldry element of the Text Encoding Initiative (TEI).

-
Describes how text is laid out on the page, including information about any ruling, - pricking, or other evidence of page-preparation techniques. - - - - - - - Specifies the number of columns per page. - - + + + Provides a General MIDI label for the MIDI instrument. + + - -

A single number indicates that all pages have this number of columns. Two numbers mean - that the number of columns per page varies between the values supplied.

-
-
- Specifies the number of ruled text lines per column. - - + + + Sets the instrument’s position in a stereo field. MIDI values of 0 and 1 both pan + left, 127 or 128 pans right, and 63 or 64 pans to the center. Positve percentage values + pan to the right, negative ones to the left. 0% is centered. + + - -

A single number indicates that all columns have this number of ruled lines. Two - numbers mean that the number of text lines per column varies between the values - supplied.

-
-
- Specifies the number of written text lines per column. - - + + + Records a non-General MIDI patch/instrument name. + + - -

A single number indicates that all columns have this number of written text lines. Two - numbers mean that the number of text lines per column varies between the values - supplied.

-
-
- Specifies the number of ruled staves per column. - - + + + Records a non-General MIDI patch/instrument number. + + - -

A single number indicates that all columns have this number of ruled staves. Two - numbers mean that the number of ruled staves per column varies between the values - supplied.

-
-
- Specifies the number of written staves per column. - - + + + Sets the instrument’s volume. + + - -

A single number indicates that all columns have this number of written staves. Two - numbers mean that the number of written staves per column varies between the values - supplied.

-
-
-

The model of this element is based on the layout element of the Text Encoding Initiative (TEI).

-
layout descriptionCollects layout descriptions. - - - - - - - -

The model of this element is based on the layoutDesc element of the Text Encoding Initiative (TEI).

-
Defines a location within a manuscript or manuscript component, usually as a (possibly - discontinuous) sequence of folio references. - - - - - - - - Identifies the foliation scheme in terms of which the location is being specified by - pointing to some foliation element defining it, or to some other equivalent - resource. + + +
+ Attributes that record MIDI tempo information. + + + Captures the number of *quarter notes* per minute. In MIDI, a beat is always defined + as a quarter note, *not the numerator of the time signature or the metronomic + indication*. - + - - Specifies the starting point of the location in a normalized form. + + + Records the number of microseconds per *quarter note*. In MIDI, a beat is always + defined as a quarter note, *not the numerator of the time signature or the metronomic + indication*. At 120 quarter notes per minute, each quarter note will last 500,000 + microseconds. - + - - Specifies the end-point of the location in a normalized form. + + + + Attributes that record MIDI values. + + + MIDI number. - + - -

The model of this element is based on the locus element of the Text Encoding Initiative (TEI).

-
locus groupGroups locations which together form a distinct but discontinuous item - within a manuscript or manuscript part, according to a specific foliation. - - - - - - - - Identifies the foliation scheme in terms of which the location is being specified by - pointing to some foliation element defining it, or to some other equivalent - resource. + + +
+ Attributes that record terminal MIDI values. + + + MIDI number. - + - -

The model of this element is based on the locusGrp element of the Text Encoding Initiative (TEI).

-
Contains a string of words through which a manuscript signals the beginning or end of a - text division, often with an assertion as to its author and title, which is in some way set - off from the text itself, usually in red ink, or by use of different size or type of script, - or some other such visual device. - - - - - - - - - - - Signals beginning of a text division. - - - Makrs the end of a text division. - - - -

The model of this element is based on the rubric element of the Text Encoding Initiative (TEI).

-
script descriptionContains a description of the letters or characters used in an - autographic item. - - - - - - - -

The model of this element is based on the scriptDesc element of the Text Encoding Initiative (TEI).

-
script noteDescribes a particular script distinguished within the description of an - autographic item. - - - - - - -

The model of this element is based on the scriptNote element of the Text Encoding Initiative (TEI).

-
A single seal or similar attachment. - - - - - - - + + +
+ MIDI attributes pertaining to key velocity. + + + MIDI Note-on/off velocity. - + - -

The model of this element is based on the seal element of the Text Encoding Initiative (TEI).

-
seal descriptionDescribes the seals or similar external attachments applied to an - item. - - - - - - - -

The model of this element is based on the sealDesc element of the Text Encoding Initiative (TEI).

-
second folioMarks the word or words taken from a fixed point in a codex (typically - the beginning of the second leaf) in order to provide a unique identifier for the item. - - - - - - - - - -

The model of this element is based on the secFol element of the Text Encoding Initiative (TEI).

-
Provides a description of the leaf or quire signatures found within a codex. - - - - - - - - -

The model of this element is based on the signatures element of the Text Encoding Initiative (TEI).

-
Contains a word or phrase describing an official mark indicating ownership, genuineness, - validity, etc. - - - - - - - - - - -

The model of this element is based on the stamp element of the Text Encoding Initiative (TEI).

-
Provides a description of the physical support material of a written item. - - - - - - - -

The model of this element is based on the support element of the Text Encoding Initiative (TEI).

-
support descriptionGroups elements describing the physical support material of an - item. - - - - - - - - Short, project-defined name for the material composing the majority of the - support. + + +
+ Attributes that record time-base information. + + + Indicates the number of pulses (sometimes referred to as ticks or divisions) per + quarter note. Unlike MIDI, MEI permits different values for a score and individual + staves. - + - - - Paper. - - - Parchment. - - - Mixed materials. - - - -

The model of this element is based on the supportDesc element of the Text Encoding Initiative (TEI).

-
type descriptionContains a description of the typefaces or other aspects of the - printing of a printed source. - - - - - - - -

The model of this element is based on the typeDesc element of the Text Encoding Initiative (TEI).

-
type noteDescribes a particular font or other significant typographic feature of a - printed resource. - - - - - - -

The model of this element is based on the typeNote element in the Text Encoding Initiative (TEI).

-
- Groups elements used as part of a physical address. - - - - - Groups elements which form part of a geographic name. - - - - - Groups elements which contain names of individuals or corporate bodies. - - - - - - Groups geographic name elements. - - - - - - Groups elements that serve as stylistic labels. - - - - - Groups place name elements. + + + + Groups elements which group MIDI-like elements. - - - - Groups elements which form part of a personal name. - additional nameContains an additional name component, such as a nickname, epithet, or - alias, or any other descriptive phrase used within a personal name. - - - - - - - - - - -

The model of this element is based on the addName element of the Text Encoding Initiative (TEI).

-
Contains the name of a geopolitical unit consisting of two or more nation states or - countries. - - - - - - - - - - -

The model of this element is based on the bloc element of the Text Encoding Initiative (TEI).

-
corporate nameIdentifies an organization or group of people that acts as a single - entity. - - - - - - - - - - -

Examples of corporate entities include names of associations, institutions, business firms, - non-profit enterprises, governments, government agencies, projects, programs, religious - bodies, churches, conferences, athletic contests, exhibitions, expeditions, fairs, and - ships. Usually, secondary name parts are encoded in corpName - sub-elements. The name of the list from which a controlled value is taken may be recorded - using the auth attribute.

-
-

The model of this element is based on the corpname element of the Encoded Archival Description (EAD).

-
Contains the name of a geopolitical unit, such as a nation, country, colony, or - commonwealth, larger than or administratively superior to a region and smaller than a - bloc. - - - - - - - - - - -

The model of this element is based on the country element of the Text Encoding Initiative (TEI).

-
Contains the name of any kind of subdivision of a settlement, such as a parish, ward, or - other administrative or geographic unit. - - - - - - - - - - -

The model of this element is based on the district element of the Text Encoding Initiative (TEI).

-
family nameContains a family (inherited) name, as opposed to a given, baptismal, or - nick name. - - - - - - - - - - Contains a forename, given or baptismal name. - - - - - - - - - -

The model of this element is based on the forename element of the Text Encoding Initiative (TEI).

-
generational name componentContains a name component used to distinguish otherwise - similar names on the basis of the relative ages or generations of the persons named. - - - - - - - - - - -

The model of this element is based on the genName element of the Text Encoding Initiative (TEI).

-
geographical feature nameContains a common noun identifying a geographical - feature. - - - - - - - - - - -

The model of this element is based on the geogFeat element of the Text Encoding Initiative (TEI).

-
geographic nameThe proper noun designation for a place, natural feature, or political - jurisdiction. - + + +
instrument definitionMIDI instrument declaration. + + - - - - - - -

Examples include Black Forest; Baltimore, Maryland; and Quartier Latin, Paris. Geographic - name parts can be encoded using geogName sub-elements. For greater - specificity, however, use district, settlement, - region, country, and bloc - sub-elements. The name of the list from which a controlled value is taken, such as the - Thesaurus of Geographic Names (TGN), may be recorded using the auth - attribute.

-
-

The model of this element is based on the geogname element of the Encoded Archival Description (EAD).

-
name linkContains a connecting phrase or link used within a name but not regarded as - part of it, such as "van der" or "of", "from", etc. - + + + + - - - + - + -

The model of this element is based on the nameLink element of the Text Encoding Initiative (TEI).

-
period nameA label that describes a period of time, such as 'Baroque' or '3rd Style - period'. - - +

This element provides a starting or default instrument declaration for a staff, a group of + staves, or a layer. Following scoreDef, staffDef, layerDef, or MIDI prog elements may then + change the instrument as necessary.

+
+ Groups elements used as part of a physical address. + + + + + Groups elements which form part of a geographic name. + + + + + Groups elements which contain names of individuals or corporate bodies. + + + + + Groups geographic name elements. + - - - - - - -

The name of the list from which a controlled value is taken may be recorded using the - auth attribute.

-
personal nameDesignation for an individual, including any or all of that individual's + + +
+ Groups elements that serve as stylistic labels. + + + + + Groups place name elements. + + + + + Groups elements which form part of a personal name. + personal nameDesignation for an individual, including any or all of that individual's forenames, surnames, honorific titles, and added names. @@ -5860,90 +5462,6 @@ persName is taken may be recorded using the auth attribute.

The model of this element is based on the persname element of the Encoded Archival Description (EAD).

-
(postal box or post office box) contains a number or other identifier for some postal - delivery point other than a street address. - - - - - - - -

The model of this element is based on the postBox element of the Text Encoding Initiative (TEI).

-
(postal code) contains a numerical or alphanumeric code used as part of a postal address - to simplify sorting or delivery of mail. - - - - - - - -

The model of this element is based on the postCode element of the Text Encoding Initiative (TEI).

-
Contains the name of an administrative unit such as a state, province, or county, larger - than a settlement, but smaller than a country. - - - - - - - - - - -

The model of this element is based on the region element of the Text Encoding Initiative (TEI).

-
role nameContains a name component which indicates that the referent has a particular - role or position in society, such as an official title or rank. - - - - - - - - - - -

The model of this element is based on the roleName element of the Text Encoding Initiative (TEI).

-
Contains the name of a settlement such as a city, town, or village identified as a single - geopolitical or administrative unit. - - - - - - - - - - -

The model of this element is based on the settlement element of the Text Encoding Initiative (TEI).

-
full street address including any name or number identifying a building as well as the - name of the street or route on which it is located. - - - - - - - -

The model of this element is based on the street element of the Text Encoding Initiative (TEI).

-
style nameA label for a characteristic style of writing or performance, such as - 'bebop' or 'rock-n-roll'. - - - - - - - - - - -

Do not confuse this element with the periodName element. The name of - the list from which a controlled value is taken may be recorded using the auth - attribute.

Groups elements that contain meta-data about a single page. @@ -5958,11 +5476,6 @@ - - Provides a choice between structured and unstructured/mixed content. - - - Groups elements that may appear as part of a bibliographic title. @@ -6042,16 +5555,6 @@ -
- Logical domain attributes. - - Logical domain attributes. - - - - - - Logical domain attributes. @@ -6079,7 +5582,7 @@ - + An element with a dots attribute must also have a dur @@ -6145,7 +5648,7 @@ Used by staffDef and scoreDef to provide default values for attributes in the logical domain related to clefs. - + An 'F', 'C', or 'G' clef requires that its position be @@ -6185,11 +5688,9 @@ - - Logical domain attributes. Attributes that record the shape of a clef. - + When @shape is present, @line must also be @@ -6205,7 +5706,7 @@ - Attributes common to many elements. + Attributes common to many elements. Attributes shared by events which rely on other events for their existence. For example, a slur/phrase marking must be drawn between or over a group of notes. The slur is therefore a control event. @@ -6288,7 +5789,7 @@ - + @data attribute should @@ -6300,12 +5801,6 @@ - - Attributes that capture the dimensions of an entity. - - - - Logical domain attributes. @@ -6314,24 +5809,6 @@ - - Logical domain attributes. - - - - - - Records the function of the dot. - - - Augmentation dot. - - - Dot of division. - - - - Attributes that permit total duration to be represented by multiple values. @@ -6383,63 +5860,7 @@ - - Logical domain attributes. - - - - Attributes that apply to all written events, e.g., note, chord, rest, etc. - Provides attributes for describing the size of an entity. - - - - - - - Captures a measurement, count, or description. When extent contains a numeric value, - use the unit attribute to indicate the measurement unit. - - - - - - - The @unit attribute is - recommended. - - - Separation into value (@extent) and unit - (@unit) is recommended. - - - - - - - Logical domain attributes. - - - - - - - Indicates the nesting level of staff grouping symbols. - - - - - - - Attributes that describe vertical size. - - - Measurement of the vertical dimension of an entity. - - - - - - + Attributes that apply to all written events, e.g., note, chord, rest, etc. Attributes that record horizontal alignment. @@ -6461,24 +5882,6 @@ - - Attributes which record the type of an electronic resource. - - - Specifies the applicable MIME (multimedia internet mail extension) type. The value - should be a valid MIME media type defined by the Internet Engineering Task Force in RFC - 2046. - - - - - - - Logical domain attributes. - - - - Used by staffDef and scoreDef to provide default values for attributes in the logical domain that are related to key signatures. @@ -6495,6 +5898,25 @@ ex. 9-39), and key signatures with unorthodox placement of the accidentals (Read, p. 141) can be encoded using the keySig element.

+
+ + + Captures text to be used to generate a label for the element to which it’s attached, a + "tool tip" or prefatory text, for example. Should not be used to record document + content. + + + + +

label is used to provide a display label for an element’s contents, for + example in the form of a "tool tip" or as the "name" when the element’s contents are + treated as the "value" in a "name-value pair". Unlike n, label may + contain space characters.

+

Don't confuse this attribute with the label element, which + records document content.

+
+
+
Language attributes common to text elements. @@ -6515,15 +5937,7 @@ language tags are constructed, may be found at www.iana.org/assignments/language-subtag-registry. A tool for locating subtags and validating language tags is available at https://r12a.github.io/apps/subtags.

-
- Logical domain attributes. - - - - - - - + Attributes that identify the layer to which a feature applies. @@ -6601,7 +6015,7 @@ 2 - + @lform attribute @@ -6618,69 +6032,6 @@ - - Attributes that record the unit of measurement in which a value is expressed. - - - Indicates the unit of measurement. - - - - - - Byte. - - - Character. - - - Centimeter. - - - Degree. - - - Inch. - - - Serial issue. - - - Foot. - - - Meter. - - - Millimeter. - - - Page. - - - Pica. - - - Point. - - - Pixel. - - - Radian. - - - Record. - - - Serial volume. - - - MEI virtual unit. - - - - Attributes that record the version of MEI in use. @@ -6776,7 +6127,7 @@ - + @nymref attribute @@ -6876,14 +6227,6 @@ - - Logical domain attributes. - - - - - - Attributes that record written pitch name. @@ -6944,82 +6287,49 @@ - + - @plist attribute - should have content. - Each - value in @plist should correspond to the @xml:id attribute of an - element. - - - - - - - Attributes that specify a measurement in numerical terms. - - - - - - - Numeric value capturing a measurement or count. Can only be interpreted in combination - with the unit attribute. - - - 0 - - - - - - Groups attributes that describe a numerical range. - - - Gives a minimum estimated value for an approximate measurement. - - - - - - Gives a maximum estimated value for an approximate measurement. - - - - - - Where the measurement summarizes more than one observation or a range of values, - supplies the minimum value observed. - - - - - - Where the measurement summarizes more than one observation or a range of values, - supplies the maximum value observed. - - - - - - Specifies the degree of statistical confidence (between zero and one) that a value - falls within the range specified by min and max, or the proportion of observed values that - fall within that range. - - - - - - - The attributes @min and @max are required when - @confidence is present. + @plist attribute + should have content. + Each + value in @plist should correspond to the @xml:id attribute of an + element. + + Logical domain attributes. + + + + + + + + + Indicates the function of the mark, usually implying a corresponding form. + + + Coda (SMuFL E048 or Unicode 1D10C). + + + Segno (SMuFL E047 or Unicode 1D10B). + + + Dal segno (SMuFL E045 or Unicode 1D109). + + + Da capo (SMuFL E046 or Unicode 1D10A). + + + Fine. (text) + + + + Logical domain attributes. @@ -7027,7 +6337,7 @@ - + Attributes that express duration of rests in musical terms. @@ -7045,18 +6355,6 @@ - - Attributes that describe relative size. - - - Scale factor to be applied to the feature to make it the desired display size. - - - - - - - Logical domain attributes. Logical domain attributes. @@ -7068,7 +6366,7 @@ - + Logical domain attributes for staffDef. @@ -7116,8 +6414,6 @@ - - Logical domain attributes. Attributes for identifying the staff associated with the current feature. @@ -7142,7 +6438,7 @@ - + @endid attribute @@ -7164,7 +6460,7 @@ - + @startid attribute @@ -7258,11 +6554,6 @@ - - Logical domain attributes. - - - Logical domain attributes. @@ -7386,6 +6677,23 @@ + + Attributes which can be used to classify features. + + + + + + Designation which characterizes the element in some sense, using any convenient + classification scheme or typology that employs single-token labels. + + + + + + +

When appropriate, values from an established typology should be used.

+
Typographical attributes. @@ -7510,7 +6818,7 @@ - + Groups annotation-like elements. @@ -7522,11 +6830,6 @@ - - Groups elements that may appear as part of a bibliographic description. - - Groups elements that contain the text of a caption or other text displayed along with a - figure. Groups elements that may appear as part of the content of a chord element. @@ -7544,8 +6847,8 @@ - - + + Groups elements which describe a measurement forming part of the physical dimensions of an @@ -7553,12 +6856,6 @@ - - Groups elements containing bibliographic edition information. - - - - Groups editorial intervention elements. @@ -7584,15 +6881,7 @@ - - - - Groups elements that may appear as part of a bibliographic imprint. - - Groups elements used to represent a textual or musical incipit. - - Groups elements used to declare a MIDI instrument. @@ -7618,7 +6907,7 @@ Groups elements that function like line beginnings. - + @@ -7636,8 +6925,6 @@ Groups milestone-style elements found in music notation. - - Groups milestone-style elements found in text. Groups elements that contain names. @@ -7653,14 +6940,11 @@ - - Groups elements which may appear as part of the paragraph content model. A paragraph may - contain inline elements and all other block-level elements except itself. Groups page beginning-like elements. - + @@ -7689,14 +6973,14 @@ Groups elements that are used to indicate intellectual or other significant responsibility, for example within a bibliographic citation. - + Groups elements that delineate particular responsibilities as opposed to the respStmt element that provides for generic statements of responsibility. - + Groups elements that provide score meta-information. @@ -7748,7 +7032,7 @@ Groups textual elements that occur at the level of individual words or phrases. - + Groups textual elements that occur at the level of individual words or phrases. This class @@ -7762,10 +7046,8 @@ Groups elements that denote the name of a bibliographic item. - + - - Groups elements that may appear as part of a title page transcription. accidentalRecords a temporary alteration to the pitch of a note. @@ -7785,82 +7067,7 @@ be recorded for the accidental or when multiple accidentals occur on a single note. The func attribute can be used to differentiate between the accidental’s functions, such as 'cautionary' or 'editorial'.

-
Name of an actor appearing within a cast list. - - - - - - -

The model of this element is based on the actor element of the Text Encoding Initiative (TEI).

-
Contains a postal address, for example of a publisher, an organization, or an - individual. - - - - - - - -

The model of this element is based on the address element of the Text Encoding Initiative (TEI) and the address element of the Encoded - Archival Description (EAD).

-
address lineSingle line of a postal address. - - - - - - -

addrLine may be repeated as many times as necessary to enter all - lines of an address.

-
-

The model of this element is based on the addrLine element of the Text Encoding Initiative (TEI) and the addressline element of the Encoded - Archival Description (EAD).

-
Range of a voice, instrument or piece. - - - - - - - - - - - Highest or lowest pitch in a score, staff, or layer. - - - - - - - - - analytic levelContains bibliographic elements describing an item (e.g., an article or - poem) published within a monograph or journal and not as an independent publication. - - - - - - - - - - - - A person or organization who transcribes a musical composition, usually for a different - medium from that of the original; in an arrangement the musical substance remains essentially - unchanged. - - - - - - - - - articulationAn indication of how to play a note or chord. + articulationAn indication of how to play a note or chord. @@ -7877,90 +7084,7 @@ the note and chord elements. It may be used when specific display info, such as size or color, needs to be recorded for the articulation or when multiple articulation marks occur on a single note or chord.

-
The name of the creator of the intellectual content of a non-musical, literary - work. - - - - - - - - - -

The model of this element is based on the author element of the Text Encoding Initiative (TEI) and the author element of the Encoded - Archival Description (EAD).

-
bibliographic referenceProvides a loosely-structured bibliographic citation in which - the sub-components may or may not be explicitly marked. - - - - - - - - - -

bibl may contain a mix of text and more specific elements such as - title, edition, persName, - and corpName. This element may also function as a hypertext reference - to an external electronic resource. Do not confuse this element with ref, which does not provide special bibliographic sub-elements.

-
-

The model of this element is based on the bibl element of the Text Encoding Initiative (TEI) and the bibref element of the Encoded - Archival Description (EAD).

-
List of bibliographic references. - - - - - - - - - - - - When labels are used, - usually each bibliographic item has one. - - - -

The model of this element is based on the listBibl element of the Text Encoding Initiative (TEI).

-
scope of citationDefines the scope of a bibliographic reference, for example as a - list of page numbers, or a named subdivision of a larger work. - - - - - - - - - - - - - - - - - -

Use the from and to attributes to regularize the beginning and ending - values provided in the element content.

-

The model of this element is based on the biblScope element of the Text Encoding Initiative (TEI).

-
structured bibliographic citationContains a bibliographic citation in which - bibliographic sub-elements must appear in a specified order. - - - - - - - - - - - Contains the whole of a single musical text, excluding any front or back matter. + Contains the whole of a single musical text, excluding any front or back matter. @@ -7985,7 +7109,7 @@ - + Must have one of the @@ -8006,267 +7130,60 @@ attributes, a caesura will be rendered as a pair of slanted lines through the top line of the staff.

- A label which accompanies an illustration or a table. - - - - - - - cast groupGroups one or more individual castItem elements within a cast list. - - - - - - -

The model of this element is based on the castGroup element of the Text Encoding Initiative (TEI).

-
Contains a single entry within a cast list, describing either a single role or a list of - non-speaking roles. - - - - - - - -

The model of this element is based on the castItem element of the Text Encoding Initiative (TEI).

-
Contains a single cast list or dramatis personae. - - - - - - - - - -

The model of this element is based on the castList element of the Text Encoding Initiative (TEI).

A simultaneous sounding of two or more notes in the same layer *with the same duration*.Indication of the exact location of a particular note on the staff and, therefore, the other notes as well. - - - - - - - - - - - - - - - - The clef position must be less than or equal to the number of lines of an ancestor - staff. - - - - - - - The clef position must be less than or equal to the number of lines of a preceding - staff. - - - -

This element can be used as an alternative to the staff element's - clef.* attributes. It should be used when specific display info, such as size or color, - needs to be recorded for the clef or when multiple, simultaneous clefs occur on a single - staff. This element may also be used within the staff context to indicate changes of - clef.

-
clef groupA set of simultaneously-occurring clefs. - - - - - - - - - - - - The name of the creator of the intellectual content of a musical work. - - - - - - - - - Names of individuals, institutions, or organizations responsible for contributions to the - intellectual content of a work, where the specialized elements for authors, editors, etc. do - not suffice or do not apply. - - - - - - - - - - - - The value of @role must not contain the name of another element available in this - context. - - - - Used to specify the contributor’s function. - - - - -

When applicable, values from the MARC relator term list (http://www.loc.gov/marc/relators/relaterm.html) or code list (http://www.loc.gov/marc/relators/relacode.html) are recommended for - role.

-
-
Non-bibliographic details of the creation of an intellectual entity, in narrative form, - such as the date, place, and circumstances of its composition. More detailed information may - be captured within the history element. - - - - - - - - - - -

The model of this element is based on the creation element of the Text Encoding Initiative (TEI).

-
A string identifying a point in time or the time period between two such points. -

This element is modelled on elements in the Text Encoding Initiative (TEI) and Encoded Archival Description (EAD) standards.

-
Entity to whom a creative work is formally offered. - - - - - - - - - - - The dedicatee element may not be - recursively nested. - - - Description of a measurement taken through a three-dimensional object. - - - - - - - - descriptionContainer for text that briefly describes the feature to which it is - attached, including its intended usage, purpose, or application as appropriate. - + - - - - - -

The model of this element is based on the desc element of the Text Encoding Initiative (TEI).

-
dimensionAny single dimensional specification. - + + + + - - - - - - Aspect of the object being measured. - - - - - - Altitude. Refers to the distance above a given level, commonly mean sea - level. - - - Angle. Amount of rotation needed to bring one line or plane into coincidence with - another. - - - Circumference of a circular area. - - - Dimension taken through an object or body of material, usually downward from an - upper surface, horizontally inward from an outer surface, or from top to bottom of - something regarded as one of several layers. - - - Length of a straight line passing through the center of a circle or sphere and - meeting the circumference or surface at each end. - - - Distance to which something has been raised or uplifted above a level, e.g., a - hill’s elevation above the surrounding country. - - - Denotes extent upward (as from foot to head) as well as any measurable distance - above a given level. - - - Measure of the greatest dimension of a plane or solid figure. - - - Half the diameter of a circular, spherical, or cylindrical object. - - - Projection of a figure or part from the plane on which it is formed. - - - Extent from side to side; breadth. - - - -

The height, width, and depth elements are preferred when appropriate.

-
Information about the physical size of an entity; usually includes numerical data. + + + + + + The clef position must be less than or equal to the number of lines of an ancestor + staff. + + + + + + + The clef position must be less than or equal to the number of lines of a preceding + staff. + + + +

This element can be used as an alternative to the staff element's + clef.* attributes. It should be used when specific display info, such as size or color, + needs to be recorded for the clef or when multiple, simultaneous clefs occur on a single + staff. This element may also be used within the staff context to indicate changes of + clef.

+
clef groupA set of simultaneously-occurring clefs. + - - - + + + + - - - - - The depth element may only appear - once. - The height element may only appear - once. - The width element may only appear - once. - - - -

The elements height, width, depth, and dim are available for circumstances that require the - capture of the individual dimensions of an object. Do not confuse this element with the extent element, which is used to indicate the quantity of described - materials.

-
-

The model of this element is based on the dimensions element of the Text Encoding Initiative (TEI) and the dimensions element of the Encoded - Archival Description (EAD).

-
directiveAn instruction expressed as a combination of text and symbols — such as - segno and coda symbols, fermatas over a bar line, etc., typically above, below, or between - staves, but not on the staff — that is not encoded elsewhere in more specific elements, like - tempo or dynam. + + A string identifying a point in time or the time period between two such points. +

This element is modelled on elements in the Text Encoding Initiative (TEI) and Encoded Archival Description (EAD) standards.

+
directiveAn instruction expressed as a combination of text and symbols, typically above, + below, or between staves, but not on the staff — that is not encoded elsewhere in more specific + elements, like tempo, dynam or repeatMark. @@ -8277,7 +7194,7 @@ - + Must have one of the @@ -8292,33 +7209,6 @@ or tstamp.real attribute, while the ending point may be recorded by either a dur, dur.ges, endid, or tstamp2 attribute. It is a semantic error not to specify a starting point attribute.

-
Person or agency, other than a publisher, from which access (including electronic access) - to a bibliographic entity may be obtained. - - - - - - - - - -

The model of this element is based on the distributor element of the Text Encoding Initiative (TEI).

-
Dot of augmentation or division. - - - - - - - - - - - -

This element provides an alternative to the dots attribute on note and rest elements. It should be used when specific display - info, such as size or color, needs to be recorded for the dot. This element may also be used - for dots of division in the mensural repertoire.

dynamicIndication of the volume of a note, phrase, or section of music. @@ -8330,14 +7220,14 @@ - + Must have one of the attributes: startid, tstamp, tstamp.ges or tstamp.real. - + When @val2 is present, either @@ -8354,262 +7244,6 @@ endid, or tstamp2 attribute. It is a semantic error not to specify a starting point attribute. MIDI values associated with the graphical dynamic sign may be recorded in the val and val2 attributes.

-
edition designationA word or text phrase that indicates a difference in either - content or form between the item being described and a related item previously issued by the - same publisher/distributor (e.g., 2nd edition, version 2.0, etc.), or simultaneously issued by - either the same publisher/distributor or another publisher/distributor (e.g., large print - edition, British edition, etc.). - - - - - - - -

The model of this element is based on the edition element of the Text Encoding Initiative (TEI) and the edition element of the Encoded - Archival Description (EAD).

-
The name of the individual(s), institution(s) or organization(s) acting in an editorial - capacity. - - - - - - - - - -

The model of this element is based on the editor element of the Text Encoding Initiative (TEI).

-
Alternative ending for a repeated passage of music; i.e., prima volta, seconda volta, - etc. - - - - - - - - - - - - - -

The scoreDef element is allowed as a sub-element so that an ending - may have its own meta-data without the overhead of child section - elements. div sub-elements are not allowed within ending. They may, - however, be contained by the children of ending, e.g., measures. Endings may not contain - other ending elements.

-
Contains a free-text event description. - - - - - - - - - - - - - Contains historical information given as a sequence of significant past events. - - - - - - - - - - -

An eventList contains event elements that - capture a brief description of the associated event, including dates and locations where the - event took place. An eventList describes events associated with a work - when it appears in the workList element or events associated with the - custodial history of a given copy of a source for the encoding when it appears within the - sourceDesc or relatedItem elements. The - type attribute may be used to distinguish between event lists with different - functions, such as a list of events in the compositional process and a list of performance - dates.

-
Indicates how a section may be programmatically expanded into its 'through-composed' - form. - - - - - - - -

The plist attribute contains an ordered list of identifiers of descendant section, ending, lem, or rdg elements. For example, the sequence "#A #End1 #A #End2" indicates that - the section labelled 'A' comes first, then the ending labelled 'End1', followed by the 'A' - section again, and finally the ending labelled 'End2'.

-
Used to express size in terms other than physical dimensions, such as number of pages, - records, bytes, physical components, etc. - - - - - - - - - - -

Use the dimensions element when it is necessary to specify the physical size of materials being described, for example, height and - width.

-
-

The model of this element is based on the extent element of the Text Encoding Initiative (TEI).

-
Names of individuals, institutions, or organizations responsible for funding. Funders - provide financial support for a project; they are distinct from sponsors, who provide - intellectual support and authority. - - - - - - - - - -

The model of this element is based on the funder element of the Text Encoding Initiative (TEI).

-
Term or terms that designate a category characterizing a particular style, form, or - content. - - - - - - - - - group symbolA brace or bracket used to group two or more staves of a score or - part. - - - - - - - - - - - - In scoreDef, grpSym must have startid, - endid, and level attributes. - - - - - - In staffGrp, grpSym must not have - startid, endid, or level attributes. - - - -

This element provides an alternative to the staffGrp element's - symbol attribute. It may be used when exact placement or editorial details for - the grouping symbol must be recorded.

-
headingContains any heading, for example, the title of a section of text, or the - heading of a list. - - - - - - - - -

One or more head elements usually identify the parent element and/or - its purpose.

-
-

The model of this element is based on the head element of the Encoded Archival Description (EAD), the head element of the Text Encoding - Initiative (TEI), and the head element of HTML.

-
Description of the vertical size of an object. - - - - - - - - An alpha-numeric string that establishes the identity of the described material. - - - - - - - - -

Examples include an International Standard Book/Music Number, Library of Congress Control - Number, publisher’s number, a personal identification number, an entry in a bibliography or - catalog, etc. The type attribute may be used to indicate the system from which - the identifier was derived.

-
Information relating to the publication or distribution of a bibliographic item. - - - - - - - - -

The model of this element is based on the imprint element of the Text Encoding Initiative (TEI).

-
incipitThe opening music and/or words of a musical or textual work. - - - - - - - - - - - - - - -

The incipText element may be used to capture a text incipit, while - score is available to provide an MEI-encoded musical incipit. Images - of an incipit may be referenced using the graphic element. An incipit - encoded in a text format other than MEI may be placed in the incipCode - element.

-
key accidentalAccidental in a key signature. - - - - - - - - - - - - - One of the following is required: @x and - @y attribute pair, @pname attribute, or @loc attribute. - - - - Specifies whether enharmonic (written) values or implicit ("perform-able") values are - allowed. - - - Only performed values (sharp, flat, natural) allowed. - - - All enharmonic (written) values allowed. - - - -

It is a semantic error not to provide one of the following: the x and - y pair of attributes, the pname and oct pair of attributes, - or the loc attribute.

A container for document text that identifies the feature to which it is attached. For a "tool tip" or other generated label, use the label attribute. @@ -8636,15 +7270,15 @@ An independent stream of events on a staff. - + - + - + @@ -8654,98 +7288,30 @@ 'voice leading' and 'voicing'. The def attribute may be used to create a connection with a layerDef element where logical and visual information about the layer is recorded. Alternatively, the n attribute may be - used as a reference to a layerDef element with the same value in its - n attribute. If neither def nor n attributes are present, - then encoding order of the layers is presumed to match the encoding order of the layer - definitions.

-
layer definitionContainer for layer meta-information. - - - - - - - - - - - - - - - - - line beginningAn empty formatting element that forces text to begin on a new - line. - - - - - - - -

The n attribute should be used to record a number associated with this textual - line. See comment on verse element for description of func - attribute. Do not confuse this element with the sb element, which - performs a similar function for musical notation.

-
-

The model of this element is based on the lb element of the Text Encoding Initiative (TEI).

-
line groupMay be used for any section of text that is organized as a group of lines; - however, it is most often used for a group of verse lines functioning as a formal unit, e.g., a - stanza, refrain, verse paragraph, etc. - - - - - - - - - - - - - - - -

The model of this element is based on the lg element of the Text Encoding Initiative (TEI).

-
Person or organization who is a writer of the text of an opera, oratorio, etc. - - - - - - - - - Person or organization who is a writer of the text of a song. + used as a reference to a layerDef element with the same value in its + n attribute. If neither def nor n attributes are present, + then encoding order of the layers is presumed to match the encoding order of the layer + definitions.

+
line beginningAn empty formatting element that forces text to begin on a new + line. - - - + - - musical division(musical division) – Contains a subdivision of the body of a musical text. + + +

The n attribute should be used to record a number associated with this textual + line. See comment on verse element for description of func + attribute. Do not confuse this element with the sb element, which + performs a similar function for musical notation.

+
+

The model of this element is based on the lb element of the Text Encoding Initiative (TEI).

+
musical division(musical division) – Contains a subdivision of the body of a musical text. Provides a number-like designation that indicates an element's position in a sequence of similar elements. May not contain space characters. - - Captures text to be used to generate a label for the element to which it's attached, a "tool tip" or prefatory text, for example. Should not be used to record document content. - - - - -

- label is used to provide a display label for an element's contents, - for example in the form of a "tool tip" or as the "name" when the element's contents are - treated as the "value" in a "name-value pair". Unlike n, - label may contain space characters.

-

Don't confuse this attribute with the label - element, which records document content.

-

The mdiv element may be recursively nested in order to represent music which exhibits this kind of structure. For example, @@ -8758,7 +7324,7 @@ - + The values in @staff must correspond to @n attribute of a staffDef @@ -8770,17 +7336,7 @@ MEI schema. It is the document element for a single document containing a header and data. The name of this element should not be changed by any customization in order to assure an absolute minimum level of MEI compliance.

-
monograph levelContains bibliographic elements describing an item, for example, a - published book or journal, score, recording, or an unpublished manuscript. - - - - - - - - - Contains a single musical text of any kind, whether unitary or composite, for example, an etude, opera, song cycle, symphony, or anthology of piano solos. + Contains a single musical text of any kind, whether unitary or composite, for example, an etude, opera, song cycle, symphony, or anthology of piano solos. An element with @tstamp may not have @startid as well (and vice versa). @@ -8789,75 +7345,7 @@ An element with @tstamp2 may not have @endid as well (and vice versa). - Proper noun or noun phrase. - - - - - - - - - - - - - - - - - - - Recommended practice is to use name elements to capture sub-parts of a generic - name. - - - - Characterizes the name in some sense, using any convenient classification scheme or - typology that employs single-token labels. - - - - - - A personal name. - - - Name of a corporate body. - - - Name of a location. - - - Name of a process or software application. - - - Name of a musical style; i.e., form, genre, technique, etc. - - - Name of a period of time. - - - -

Contains the name of an entity that is difficult to tag more specifically, for example, as - a corpName, geogName, persName, or title. The name element may - be used in place of the more specific elements when it is not known what kind of name is - being described or when a high degree of precision is not necessary. For example, the name element might be used when it is not clear whether the name "Bach" - refers to a person or a geographic feature. The name element may be - used for an individual, such as 'Henry VIII, King of England'; a corporate body, such as - 'The Beatles'; a geographical place; an expanse of time, such as 'The Romantic Era'; or a - mechanical (often generative) process. When name parts are needed, name sub-elements are recommended. The recommended values for the type - attribute are: person, corporation, location, period, and process. Dates associated with - the name (not necessarily the same as those pertaining to the entity - described by the name) may be recorded using startdate, - enddate, notbefore, notafter, and isodate - attributes. The name of the list from which a controlled value is taken, such as the - Thesaurus of Geographic Names (TGN) or Library of Congress Name Authority File (LCNAF), and - its electronically-available location may be recorded using the auth and - auth.uri attributes.

-
-

The model of this element is based on the name element of the Encoded Archival Description (EAD).

-
A single pitched event. + A single pitched event. @@ -8879,24 +7367,6 @@ imperfect. In the CMN repertoire, coloration is an inversion of the note head’s normal rendition, that is, the note head is void when it would otherwise be filled and vice versa. Do not confuse this with visual color.

-
numberNumeric information in any form. - - - - - - - - - - Numeric value capturing a measurement or count. Can only be interpreted in combination - with the unit attribute. - - - - -

Use this element only when it is necessary to display a number in a special way or to - identify it with a type attribute.

An element indicating an ornament that is not a mordent, turn, or trill. @@ -8907,7 +7377,7 @@ - + Must have one of the @@ -8920,21 +7390,6 @@ The starting point of the ornament may be indicated by either a startid, tstamp, tstamp.ges, or tstamp.real attribute. It is a semantic error not to specify one of these attributes.

-
paragraphOne or more text phrases that form a logical prose passage. - - - - - - - - - -

A paragraph is usually typographically distinct: The text usually begins on a new line and - the first letter of the content is often indented, enlarged, or both.

-
-

The model of this element is based on the p element of the Encoded Archival Description, the p element of the Text Encoding - Initiative (TEI), and the p element of HTML.

page beginningAn empty formatting element that forces text to begin on a new page. @@ -8942,7 +7397,7 @@ - + @@ -8955,17 +7410,6 @@ score context, a page beginning implies an accompanying system beginning.

The model of this element is based on the pb element of the Text Encoding Initiative (TEI).

-
page descriptionContains a brief prose description of the appearance or description - of the content of a physical page. - - - - - - -

Best practice suggests the use of controlled vocabulary. Don't confuse this element with a - figure caption. A caption is text primarily intended for display with an illustration. It - may or may not function as a description of the illustration.

page footerA running footer. @@ -9010,113 +7454,22 @@ used within pb, it records a temporary suspension of the pattern of page headers established by the use of pgHead within a previous scoreDef. Auto-generated page numbers may be indicated with a processing instruction. The pgHead and pgFoot elements should *not* be used to encode textual notes/annotations.

-
Indication of 1) a "unified melodic idea" or 2) performance technique. - - - - - - - - - - - - - Must have one of the - attributes: startid, tstamp, tstamp.ges or tstamp.real. - Must have one of the attributes: - dur, dur.ges, endid, or tstamp2. - - - - - - The visual attributes of the phrase (@bezier, @bulge, @curvedir, @lform, - @lwidth, @ho, @startho, @endho, @to, @startto, @endto, @vo, @startvo, @endvo, @x, @y, - @x2, and @y2) will be overridden by visual attributes of the contained curve - elements. - - - -

Historically, the term "slur" indicated two notes performed legato, while the term "phrase" - was used for a "unified melodic idea". Nowadays, however, "slur" often has the same meaning - as "phrase" (See Read, p. 265-266), since the visual rendition of the two concepts is the - same. MEI provides two distinct elements so that those users wishing to maintain a - distinction for historical reasons may do so. If the user does not want to maintain the - distinction, then the more generic slur element should be employed. - The starting point of the phrase/slur may be indicated by either a startid, - tstamp, tstamp.ges, or tstamp.real attribute, while the - ending point may be recorded by either a dur, dur.ges, - endid, or tstamp2 attribute. It is a semantic error not to specify one - starting and one ending type of attribute. Either place, bulge, or - bezier attributes may be used to record the curvature of the phrase/slur. The slur and tie elements may be used instead of the - slur.* and tie.* attributes provided on chord and note elements when 1) they are required by software, or 2) multiple, alternative slurs - are needed.

-
physical locationGroups information about the current physical location of a - bibliographic item, such as the repository in which it is located and its shelf mark(s), and - its previous locations. - - - - - - - - - -

The model of this element is based on the physloc element of the Encoded Archival Description (EAD).

-
Name of the organization responsible for the publication of a bibliographic item. - - - - - - - - - -

The model of this element is based on the publisher element of the Text Encoding Initiative (TEI).

publication placeName of the place where a bibliographic item was published. - +

The model of this element is based on the pubPlace element of the Text Encoding Initiative (TEI).

-
The name of the individual(s), institution(s) or organization(s) receiving - correspondence. - - - - - - - - related itemContains or references another bibliographic item which is related to the - present one. - - - - - - - - - - - Describes the relationship between the entity identified by the relatedItem element and the resource described in the parent element, i.e., bibl, source or relatedItem. - - - - renderA formatting element indicating special visual rendering, e.g., bold or + renderA formatting element indicating special visual rendering, e.g., bold or italicized, of a text word or phrase. + @@ -9134,36 +7487,9 @@

When an entire element should be rendered in a special way, a style sheet function should - be used instead of the rend element.

-
Institution, agency, or individual which holds a bibliographic item. - - - - - - - - - -

Sub-units of the holding institution may be marked with repository - sub-elements. The name of the list from which a controlled value is taken may be recorded - using the auth attribute.

-
-

The model of this element is based on the repository element of the Encoded Archival Description (EAD).

-
responsibilityA phrase describing the nature of intellectual responsibility. - - - - - - - - - -

The name of the list from which a controlled value is taken may be recorded using the - auth attribute.

-
-

The model of this element is based on the resp element of the Text Encoding Initiative (TEI).

+ be used instead of the rend element. The glyph.auth and glyph.uri + attributes may be used to specify an external authority, e.g., SMuFL, to be used for + displaying code points in the textual content of the element.

responsibility statementTranscription of text that names one or more individuals, groups, or in rare cases, mechanical processes, responsible for creation, realization, production, funding, or distribution of the intellectual or artistic content. @@ -9175,7 +7501,7 @@ - + At least one element pair (a resp element and a name-like element) is @@ -9195,7 +7521,7 @@ - + @@ -9206,29 +7532,13 @@

See (Read, p. 96-102). Do not confuse this element with the space element, which is used as an aid for visual alignment.

-
Name of a dramatic role, as given in a cast list. - - - - - - -

The model of this element is based on the role element of the Text Encoding Initiative (TEI).

-
role descriptionDescribes a character’s role in a drama. - - - - - - -

The model of this element is based on the roleDesc element of the Text Encoding Initiative (TEI).

system beginningAn empty formatting element that forces musical notation to begin on a new line. - + @@ -9240,8 +7550,8 @@ Full score view of the musical content. - - + + @@ -9252,7 +7562,7 @@ of page beginnings, each of which points to a page image. div elements are allowed preceding and following sections of music data in order to accommodate blocks of explanatory text.

-
score definition(score definition) – Container for score meta-information.Segment of music data. + score definition(score definition) – Container for score meta-information.Segment of music data. @@ -9266,7 +7576,7 @@ - + A @@ -9278,18 +7588,6 @@

This element functions as a container for actual music data. Pointing attributes make it possible to connect this element to other internal or external entities, such as media objects or annotations.

-
Contains information about the serial publication in which a bibliographic item has - appeared. - - - - - - - - - -

The model of this element is based on the series element of the Text Encoding Initiative (TEI).

A placeholder used to fill an incomplete measure, layer, etc. most often so that the combined duration of the events equals the number of beats in the measure. @@ -9302,78 +7600,26 @@ - Contains a specialized form of heading or label, giving the name of one or more speakers - in a dramatic text or fragment. - - - - - - -

The model of this element is based on the speaker element of the Text Encoding Initiative (TEI).

-
Names of sponsoring individuals, organizations or institutions. Sponsors give their - intellectual authority to a project; they are to be distinguished from funders, who provide - the funding but do not necessarily take intellectual responsibility. - - - - - - - - - -

The model of this element is based on the sponsor element of the Text Encoding Initiative (TEI) and the sponsor element of the Encoded - Archival Description (EAD).

-
stacked textAn inline table with a single column. - - - - - - - - Indicates the delimiter used to mark the portions of text that are to be - stacked. - - - - - Specifies how the stacked text components should be aligned. - - - Left justified. - - - Right justified. - - - Centered. - - - Aligned on right-most digit. - - - A group of equidistant horizontal lines on which notes are placed in order to represent + A group of equidistant horizontal lines on which notes are placed in order to represent pitch or a grouping element for individual 'strands' of notes, rests, etc. that may or may not actually be rendered on staff lines; that is, both diastematic and non-diastematic signs. - + - + - + - + @@ -9389,12 +7635,12 @@ encoding order of the staff definitions.

staff definitionContainer for staff meta-information. - + - + @@ -9404,7 +7650,7 @@ - + @@ -9416,7 +7662,7 @@ permitted. - + @@ -9424,7 +7670,7 @@ current staff. - + @@ -9433,14 +7679,14 @@ exist. - + The clef position must be less than or equal to the number of lines on the staff. - + @@ -9449,7 +7695,7 @@ less than or equal to the number of lines on the staff. - + @@ -9457,7 +7703,7 @@ number of values as there are staff lines. - + @@ -9467,7 +7713,7 @@ lines. - + @@ -9484,7 +7730,7 @@ - + @@ -9495,7 +7741,7 @@ - + @@ -9506,7 +7752,7 @@ - staff group(staff group) – A group of bracketed or braced staves. + staff group(staff group) – A group of bracketed or braced staves. @@ -9515,7 +7761,7 @@ for the n attribute. - + @@ -9534,7 +7780,7 @@ - + @@ -9542,34 +7788,6 @@

Do not confuse this element with the syllable element, which is used to organize neume notation.

-
A reference to a previously defined symbol. - - - - - - - - - - - - - In the symbolDef context, symbol must have - either a startid attribute or x and y attributes. - In the symbolDef context, symbol - must have one of the following attributes: altsym, glyph.name, or - glyph.num. - - - -

The starting point, e.g., "hotspot", of the symbol may be identified in absolute output - coordinate terms using the x and y attributes or relative to another - element using the startid attribute. Attributes in the att.visualOffset class may - be used to record horizontal, vertical, or time offsets from the absolute coordinates or - from the location of the referenced element. The altsym attribute must contain the - id of a symbolDef element. The scale attribute indicates - that the printed output must be scaled by the specified percentage.

Text and symbols descriptive of tempo, mood, or style, e.g., "allarg.", "a tempo", "cantabile", "Moderato", "♩=60", "Moderato ♩ =60"). @@ -9581,10 +7799,10 @@ - + - + Only analog, class, label, mm, mm.dots, mm.unit, n, translit, type, xml:base, xml:id, @@ -9592,67 +7810,21 @@ part. - + Must have one of the - attributes: startid, tstamp, tstamp.ges or tstamp.real. - - - Keyword or phrase which describes a resource. - - - - - - - - - - - The @data attribute may only occur on a - term which is a descendant of a classification element. - - - -

The term element may include other term - elements in order to allow the creation of coordinated terms; i.e., terms created from a - combination of other, independent terms.

-

To associate a term with a taxonomy category defined in the MEI metadata header, the value - of class must contain a fragment identifier corresponding to the appropriate term element. To associate a term with category in an externally-defined - taxonomy, class must contain an absolute URI, which may include the fragment - identifier of the element containing the category label.

-
-

The model of this element is based on the term element of the Text Encoding Initiative (TEI).

-
text languageIdentifies the languages and writing systems within the work described - by a bibliographic description, not the language of the description. - - - - - - - - - (main language) supplies a code which identifies the chief language used in the - bibliographic work. - - - - - (other languages) one or more codes identifying any other languages used in the - bibliographic work. - - - - Title of a bibliographic entity. + attributes: startid, tstamp, tstamp.ges or tstamp.real. + + + Title of a bibliographic entity. - + @@ -9736,101 +7908,7 @@ or name may be indicated in the nonfiling attribute.

The model of this element is based on the title element of the Text Encoding Initiative (TEI).

-
Contains a transcription of the title page of a text. - - - - - - - - - - -

This element may be used within the physDesc element when no other - transcription is provided.

-
-

The model of this element is based on the titlePage element of the Text Encoding Initiative (TEI).

-
Contains a subsection or division of the title of a bibliographic entity. - - - - - - - - - - - - - - - - Characterizes this title component in some sense, using any convenient classification - scheme or typology that employs single-token labels. - - - - - - Alternate title by which the item is also known. - - - Arranged statement for music. Analogous to MARC 240 subfield o. - - - Medium of the carrier. Analogous to MARC 240 subfield h. - - - Publication/creation date(s) of work. Analogous to MARC 240 subfield f. - - - Descriptive paraphrase of the work. - - - Form subheading. Analogous to MARC 240 subfield k. - - - Key for music. Analogous to MARC 240 subfield r. - - - Language of a work. Analogous to MARC 240 subfield l (el). - - - Main title. - - - Name of a part or section of a work. Analogous to MARC 240 subfield p. - - - Standard number designation of a work or of a part or section of a work. Analogous - to MARC 240 subfield n. - - - Performance medium. Analogous to MARC 240 subfield m. - - - Subtitle. - - - Translated form of title. - - - Version. Analogous to MARC 240 subfield s. - - - -

The model of this element is based on the titlePart element of the Text Encoding Initiative (TEI).

-
Description of the horizontal size of an object. - - - - - - - - + String tablature string and fret information. @@ -9897,256 +7975,7 @@

The startid and endid attributes are used to indicate the chordMember elements on which the barre starts and finishes respectively. The fret at which the barre should be created is recorded by the fret attribute.

- - Groups elements that may contain back matter. - - - - - Groups elements used to represent generic structural divisions of text. - - Groups elements that may contain front matter. - - - - - Groups elements that have a line-grouping function. - - - - - - Groups list-like elements. - - - - - - Groups elements representing metrical components such as verse lines. - - Groups elements related to highlighting which can appear at the phrase-level. - - - - - Groups elements used to directly contain quotations. - - - - - Contains a formal list or prose description of topics addressed. - - - - - - - - - -

The model of this element is based on the argument element of the Text Encoding Initiative (TEI).

-
Contains a quotation, anonymous or attributed, appearing on a title page. - - - - - - - - -

The model of this element is based on the epigraph element of the Text Encoding Initiative (TEI).

-
Contains a formal statement authorizing the publication of a work, sometimes required to - appear on a title page or its verso. - - - - - - - - -

The model of this element is based on the imprimatur element of the Text Encoding Initiative (TEI).

-
line of textContains a single line of text within a line group. - - - - - - - - Used to specify a rhythm for the lyric syllables that differs from that of the notes - on the staff, e.g., '4,4,4,4' when the rhythm of the notes is '4.,8,4.,8'. - - - - -

Do not confuse this element with the line element, which is used for - graphical lines that occur in music notation.

-
-

The model of this element is based on the l element of the Text Encoding Initiative (TEI).

-
list itemSingle item in a list. - - - - - - -

The model of this element is based on the item elements of the Encoded Archival Description (EAD), the item element of the Text - Encoding Initiative (TEI), and the li element of HTML.

-
A formatting element that contains a series of items separated from one another and - arranged in a linear, often vertical, sequence. - - - - - - - - - - - - - - - - - In a list of type "gloss" all items - must be immediately preceded by a label. - - - - Used to indicate the format of a list. In a simple list, li - elements are not numbered or bulleted. In a marked list, the sequence of the list items - is not critical, and a bullet, box, dash, or other character is displayed at the start of - each item. In an ordered list, the sequence of the items is - important, and each li is lettered or numbered. Style sheet - functions should be used to specify the mark or numeration system for each li. - - - Items are not numbered or bulleted. - - - Bullet, box, dash, or other character is displayed before each item. - - - Each item is numbered or lettered. - - - - Captures the nature of the content of a list. - - - - - - Each list item glosses some term or concept, which is given by a label element - preceding the list item. - - - Each list item is an entry in an index such as the alphabetical topical index at - the back of a print volume. - - - Each list item is a step in a sequence of instructions, as in a recipe. - - - Each list item is one of a sequence of petitions, supplications or invocations, - typically in a religious ritual. - - - Each list item is part of an argument consisting of two or more propositions and a - final conclusion derived from them. - - - -

In a list of type gloss it is a semantic error not to precede each list item with a - label.

-
-
-

The model of this element is based on the list element of the Encoded Archival Description (EAD), the list element of the Text Encoding - Initiative (TEI), and the respective elements of HTML.

-
quotedContains material which is distinguished from the surrounding phrase-level text - using quotation marks or a similar method. Use quote for block-level - quotations. - - - - - - - - - - - - - - - - - Representation of speech. - - - Representation of thought, e.g., internal monologue. - - - Quotation from a written source. - - - Authorial distance. - - - Linguistically distinct. - - - Linguistically distinct. - - - Technical term. - - - Rhetorically emphasized. - - - Refering to itself, not its normal referent. - - - -

This element may be used for a variety of reasons including, but not limited to: direct - speech or thought, technical terms or jargon, authorial distance, quotations from elsewhere, - and passages that are mentioned but not used.

-

Do not confuse this element, used to capture phrase-level quotations, and quote, intended for block quotations.

-
-

The model of this element is based on the q element of HTML and the q element of the Text Encoding Initiative (TEI).

-
quoted materialContains a paragraph-like block of text attributed to an external - source, normally set off from the surrounding text by spacing or other typographic - distinction. - - - - - - - - -

The source for the quote may be included in a bibl sub-element.

-

Do not confuse this element, used to capture block-level quotations, and q, intended for inline quotations.

-
-

The model of this element is based on the quote element of the Text Encoding Initiative (TEI) and the quote element of the Encoded Archival Description (EAD).

-
(arbitrary segment) represents any segmentation of text below the "text component" - level. - - - - - - - -

The model of this element is based on the seg element of the Text Encoding Initiative (TEI).

-
- Visual domain attributes. - + Visual domain attributes. @@ -10277,10 +8106,6 @@ - - Visual domain attributes. - - Visual domain attributes. Visual domain attributes. @@ -10292,8 +8117,6 @@ - - Visual domain attributes. Visual domain attributes. @@ -10304,19 +8127,6 @@ - - - Visual domain attributes. - - - - - - - - - - Visual domain attributes. @@ -10328,11 +8138,6 @@ - - - Visual domain attributes. - - Visual domain attributes. @@ -10377,16 +8182,6 @@ Visual domain attributes. - - - Visual domain attributes. - - - - - - - Visual domain attributes. The startho and startvo attributes record the horizontal and @@ -10454,29 +8249,11 @@ - - - Visual domain attributes. - - - - - - - - Visual domain attributes. - - - Visual domain attributes. - - - - Visual domain attributes. The vo attribute is the vertical offset (from its normal @@ -10494,12 +8271,6 @@ - - Visual domain attributes. - - - - Visual domain attributes. @@ -10653,17 +8424,18 @@
-
+ Visual domain attributes. + + + - - - + Visual domain attributes. @@ -10671,15 +8443,16 @@ - - - + Visual domain attributes. + - + + + @@ -10701,8 +8474,6 @@ - - Visual domain attributes. Visual domain attributes. @@ -10776,17 +8547,6 @@ - - Visual domain attributes. - - - - - - - - - Visual domain attributes. @@ -10899,12 +8659,12 @@ - +
-
+
\ No newline at end of file diff --git a/libmei/mei/develop/mei-verovio_compiled.odd b/libmei/mei/develop/mei-verovio_compiled.odd index 2c5c164009..d6c9141eb6 100644 --- a/libmei/mei/develop/mei-verovio_compiled.odd +++ b/libmei/mei/develop/mei-verovio_compiled.odd @@ -1,4 +1,4 @@ - + @@ -50,19 +50,19 @@ - - Written accidental values. - + + Written accidental values. + - +

- Written standard accidental values. - + Written standard accidental values. + Sharp. @@ -103,8 +103,8 @@ - Written quarter-tone accidental values. - + Written quarter-tone accidental values. + @@ -141,8 +141,8 @@ - Arel-Ezgi-Uzdilek (AEU) accidental values (written and gestural/performed). - + Arel-Ezgi-Uzdilek (AEU) accidental values (written and gestural/performed). + Büyük mücenneb (sharp). @@ -170,14 +170,14 @@ - +

- Persian accidental values (written and gestural/performed). - + Persian accidental values (written and gestural/performed). + Koron (quarter tone flat). @@ -188,13 +188,13 @@ - Gestural/performed standard accidental values. - + Gestural/performed standard accidental values. + - Gestural/performed accidental values. - + Gestural/performed accidental values. + Sharp. @@ -220,8 +220,8 @@ - Gestural/performed quarter-tone accidental values. - + Gestural/performed quarter-tone accidental values. + Three quarter-tones sharp. @@ -238,10 +238,10 @@ - The following list of articulations mostly corresponds to symbols from the Western Musical + The following list of articulations mostly corresponds to symbols from the Western Musical Symbols portion of the Unicode Standard. The dot and stroke values may be used in cases where interpretation is difficult or undesirable. - + Accent (Unicode 1D17B). @@ -270,6 +270,12 @@ Spiccato. + + Stress (Unicode 00B4). + + + Unstress (Unicode 02D8). + Main note followed by short slide to higher, indeterminate pitch (Unicode 1D185). @@ -358,7 +364,7 @@ - + "" contains a deprecated value. @@ -369,16 +375,16 @@ - Dots attribute values (number of augmentation dots) (Read, 113-119, ex. 8-21). - + Dots attribute values (number of augmentation dots) (Read, 113-119, ex. 8-21). + 4 - Records where bar lines are drawn. The value 'staff' describes the traditional placement + Records where bar lines are drawn. The value 'staff' describes the traditional placement of bar lines. - + Between staves only. @@ -392,9 +398,9 @@ - Renderings of bar lines. Some values correspond to the Western Musical Symbols portion of + Renderings of bar lines. Some values correspond to the Western Musical Symbols portion of the Unicode Standard. - + Dashed line (SMuFL E036 and Unicode 1D104). @@ -444,15 +450,15 @@ - Beam attribute values: initial, medial, terminal. Nested beaming is permitted. - + Beam attribute values: initial, medial, terminal. Nested beaming is permitted. + [i|m|t][1-6] - Location of a beam relative to the events it affects. - + Location of a beam relative to the events it affects. + The beam is above the events it affects. @@ -466,18 +472,18 @@ - A beat location, i.e., [0-9]+(\.?[0-9]*)? The value must fall between 0 and the numerator + A beat location, i.e., [0-9]+(\.?[0-9]*)? The value must fall between 0 and the numerator of the time signature + 1, where 0 represents the left bar line and the upper boundary represents the right bar line. For example, in 12/8 the value must be in the range from 0 to 13. - + 0 - Visual and performance information for a repeated beat symbol. - + Visual and performance information for a repeated beat symbol. + 1|2|3|4|5 @@ -485,9 +491,9 @@ - Either an integer value, a decimal value, or a token. Fractional values are limited to + Either an integer value, a decimal value, or a token. Fractional values are limited to .25, .5, .75, while the token value is restricted to 'full'. - + \.25|\.5|\.75 @@ -497,8 +503,8 @@ - Boolean attribute values. - + Boolean attribute values. + True. @@ -509,10 +515,10 @@ - Values for certainty attribute. Certainty may be expressed by one of the predefined symbolic values high, + Values for certainty attribute. Certainty may be expressed by one of the predefined symbolic values high, medium, or low. The value unknown should be used in cases where the encoder does not wish to assert an opinion about the matter. - + High certainty. @@ -529,21 +535,21 @@ - Clef line attribute values. The value must be in the range between 1 and the number of + Clef line attribute values. The value must be in the range between 1 and the number of lines on the staff. The numbering of lines starts with the lowest line of the staff. - + - Clef shape attribute values (Read, p.53-56). Some values correspond to the Unicode + Clef shape attribute values (Read, p.53-56). Some values correspond to the Unicode Standard. - + G clef (Unicode 1D11E). - Double G clef. + Double G clef. Sounds one octave lower than G clef. (See remarks on usage below.) F clef (Unicode 1D122). @@ -559,9 +565,17 @@ + +

Double-G clefs sound one octave lower, so do not combine with dis/ + dis.place/clef.dis/clef.dis.place. In some cases + the double G clef may be used to indicate that two voices share one staff and + does not sound one octave lower. In this case the oct attribute may be + used to clarify the sounding octave of the instruments for the clef. +

+
- Tone-cluster rendition. - + Tone-cluster rendition. + White keys. @@ -575,17 +589,17 @@ - Confidence is expressed as a real number between 0 and 1; 0 representing certainly false + Confidence is expressed as a real number between 0 and 1; 0 representing certainly false and 1 representing certainly true. - + 0 1 - List of named colors from CSS Color Module Level 4. - + List of named colors from CSS Color Module Level 4. + Hex: #f0f8ff / RGB: 240,248,255 @@ -1033,13 +1047,13 @@ - +

Color names are taken from the list at https://www.w3.org/TR/css-color-4/.

All of these keywords are case-insensitive.

- Parameterized color values - + Parameterized color values + #[0-9A-Fa-f]{6,6} @@ -1055,19 +1069,19 @@ - A value in one of the following forms is expected: 1) hexadecimal RRGGBB, 2) hexadecimal + A value in one of the following forms is expected: 1) hexadecimal RRGGBB, 2) hexadecimal RRGGBBAA, 3) CSS RGB, 4) CSS RGBA, 5) HSL, 6) HSLA, or 7) CSS color name. - + - Description of direction with respect to an imaginary compass. - + Description of direction with respect to an imaginary compass. + - Basic compass directions. - + Basic compass directions. + In a northern direction. @@ -1084,8 +1098,8 @@ - Additional compass directions. - + Additional compass directions. + In a north-eastern direction. @@ -1102,17 +1116,17 @@ - 360th-unit measure of a circle’s circumference; optionally signed decimal number between + 360th-unit measure of a circle’s circumference; optionally signed decimal number between -360 and 360. - + 360.0 -360.0 - Divisio values. - + Divisio values. + Divisio ternaria. Three semibreves in a breve. @@ -1138,23 +1152,23 @@ - Logical, that is, written, duration attribute values. - + Logical, that is, written, duration attribute values. + - Logical, that is, written, duration attribute values for rests. - + Logical, that is, written, duration attribute values for rests. + - - Performed duration attribute values. - + + Performed duration attribute values. + - Enclosures for editorial notes, accidentals, articulations, etc. - + Enclosures for editorial notes, accidentals, articulations, etc. + Parentheses: ( and ). @@ -1171,13 +1185,13 @@ - Location of musical material relative to a symbol on a staff instead of the staff. - + Location of musical material relative to a symbol on a staff instead of the staff. + - Location of musical material relative to a symbol other than a staff. - + Location of musical material relative to a symbol other than a staff. + Above. @@ -1194,8 +1208,8 @@ - Location of musical material relative to a symbol other than a staff. - + Location of musical material relative to a symbol other than a staff. + Above and left; north-west. @@ -1212,10 +1226,10 @@ - Describes how a graphical object, such as a note head, should be filled. The relative + Describes how a graphical object, such as a note head, should be filled. The relative values — top, bottom, left, and right — indicate these locations *after* rotation is applied. - + Unfilled @@ -1238,23 +1252,23 @@ - Font family (for text) attribute values. - + Font family (for text) attribute values. + - Font name (for text) attribute values. - + Font name (for text) attribute values. + - Font size expressions. - + Font size expressions. + - Font size expressed as numbers; i.e., points or virtual units. - + Font size expressed as numbers; i.e., points or virtual units. + \d*(\.\d+)?(pt|vu) @@ -1272,16 +1286,16 @@ - Relative size of symbol that may begin/end a line. - + Relative size of symbol that may begin/end a line. + 1 9 - Font size expressed as relative term. - + Font size expressed as relative term. + Smaller than x-small. @@ -1313,8 +1327,8 @@ - Font style (for text) attribute values. - + Font style (for text) attribute values. + Text slants to right. @@ -1328,8 +1342,8 @@ - Font weight (for text) attribute values. - + Font weight (for text) attribute values. + Bold or heavy. @@ -1340,14 +1354,14 @@ - In string tablature, the fret number. The value 0 (zero) indicates the open + In string tablature, the fret number. The value 0 (zero) indicates the open string. - + - Analytical glissando attribute values. - + Analytical glissando attribute values. + First note/chord in glissando. @@ -1361,8 +1375,8 @@ - Do grace notes get time from the current (acc) or previous (unacc) one? - + Do grace notes get time from the current (acc) or previous (unacc) one? + Time "stolen" from following note. @@ -1376,13 +1390,13 @@ - Note head shapes. - + Note head shapes. + - Enumerated note head shapes. - + Enumerated note head shapes. + Filled, rotated oval (Unicode 1D158). @@ -1435,15 +1449,15 @@ - Hexadecimal number. - + Hexadecimal number. + (#x|U\+)[A-F0-9]+ - Data values for attributes that capture horizontal alignment. - + Data values for attributes that capture horizontal alignment. + Left aligned. @@ -1460,17 +1474,17 @@ - A token indicating diatonic interval quality and size. - + A token indicating diatonic interval quality and size. + [AdMmP][0-9]+ - A token indicating direction of the interval but not its precise value, a diatonic + A token indicating direction of the interval but not its precise value, a diatonic interval (with optional direction and quality), or a decimal value in half steps. Decimal values are permitted to accommodate micro-tuning. - + u|d|s|n|sd|su @@ -1479,7 +1493,7 @@ (\+|\-)?\d+(\.\d+)?hs - +

Interval direction only: @@ -1518,33 +1532,33 @@

- ISO date formats. - + ISO date formats. + [0-9.,DHMPRSTWYZ/:+\-]+ - ISO 24-hour time format: HH:MM:SS.ss, i.e., + ISO 24-hour time format: HH:MM:SS.ss, i.e., [0-9][0-9]:[0-9][0-9]:[0-9][0-9](\.?[0-9]*)?. - + - Indicates the location of the tonic in the circle of fifths. - + Indicates the location of the tonic in the circle of fifths. + mixed|0|([1-9]|1[0-2])[f|s] - Indicates how stems should be drawn when more than one layer is present and stem + Indicates how stems should be drawn when more than one layer is present and stem directions are not indicated on the notes/chords themselves. '1' indicates that there is only a single layer on a staff. '2o' means there are two layers with opposing stems. '2f' indicates two 'free' layers; that is, opposing stems will be drawn unless one of the layers has 'space'. In that case, stem direction in the remaining layer will be determined as if there were only one layer. '3o' and '3f' are analogous to '2o' and '2f' with three layers allowed. - + Single layer. @@ -1564,8 +1578,8 @@ - Ligature forms. - + Ligature forms. + Notes are "squeezed" together. @@ -1576,8 +1590,8 @@ - Visual form of a line. - + Visual form of a line. + Dashed line. @@ -1594,8 +1608,8 @@ - Symbol that may begin/end a line. - + Symbol that may begin/end a line. + 90 degree turn down (similar to Unicode 231D at end of line, 231C at start). @@ -1664,13 +1678,13 @@ - Datatype of line width measurements. - + Datatype of line width measurements. + - Relative width of a line. - + Relative width of a line. + Default line width. @@ -1684,7 +1698,7 @@ - A count of measures plus a beat location, i.e., [0-9]+m *\+ *[0-9]+(\.?[0-9]*)?. The + A count of measures plus a beat location, i.e., [0-9]+m *\+ *[0-9]+(\.?[0-9]*)?. The measure count is the number of bar lines crossed by the event, while the beat location is a timestamp expressed as a beat with an optional fractional part. For example, "1m+3.5" indicates a point in the next measure on the second half of beat 3. The measure number must be @@ -1693,13 +1707,13 @@ number must be within the range from 0 (the left bar line) to 7 (the right bar line). A value with a measure number of "0", such as "0m+2", indicates a point within the current measure. - + ([0-9]+m\s*\+\s*)?[0-9]+(\.?[0-9]*)? - A count of measures plus a beat location, i.e., (\+|-)?[0-9]+m\+[0-9]+(\.?[0-9]*)?. The + A count of measures plus a beat location, i.e., (\+|-)?[0-9]+m\+[0-9]+(\.?[0-9]*)?. The measure count is the number of bar lines crossed by the event, while the beat location is a timestamp expressed as a beat with an optional fractional part. The measure number must be in the range of preceding measures to the number of remaining measures. A value with a positive @@ -1709,64 +1723,64 @@ in 6/8 the beat number must be within the range from 0 (the left bar line) to 7 (the right bar line). A value with a measure number of "0", such as "0m+2", indicates a point within the current measure. - + (\+|-)?[0-9]+m\+[0-9]+(\.[0-9]*)? - Measurement expressed in real-world (e.g., centimeters, millimeters, inches, points, + Measurement expressed in real-world (e.g., centimeters, millimeters, inches, points, picas, or pixels) or virtual units (vu). 'vu' is the default value. Unlike data.MEASUREMENTSIGNED, only positive values are allowed. - + (\+)?\d+(\.\d+)?(cm|mm|in|pt|pc|px|vu)? - Measurement expressed in real-world (e.g., centimeters, millimeters, inches, points, + Measurement expressed in real-world (e.g., centimeters, millimeters, inches, points, picas, or pixels) or virtual units (vu). 'vu' is the default value. Unlike data.MEASUREMENTUNSIGNED, in which only positive values are allowed, both positive and negative values are permitted. - + (\+|-)?\d+(\.\d+)?(cm|mm|in|pt|pc|px|vu)? - Measurement expressed relative to properties of the current font, in analogy to the + Measurement expressed relative to properties of the current font, in analogy to the respective CSS length units. Unlike data.MEASUREMENTFONTUNSIGNED, only positive values are allowed. - + \d+(\.\d+)?(ch|em|ex)? - Measurement expressed relative to properties of the current font, in analogy to the + Measurement expressed relative to properties of the current font, in analogy to the respective CSS length units. Unlike data.MEASUREMENTFONTUNSIGNED, both positive and negative values are allowed. - + (\+|-)?\d+(\.\d+)?(ch|em|ex)? - Measurements used for typographical features. Unlike data.MEASUREMENTTYPOGRAPHYSIGNED, only + Measurements used for typographical features. Unlike data.MEASUREMENTTYPOGRAPHYSIGNED, only positive values are allowed. - + - Measurements used for typographical features. Unlike data.MEASUREMENTTYPOGRAPHYSIGNED, both + Measurements used for typographical features. Unlike data.MEASUREMENTTYPOGRAPHYSIGNED, both positive and negative values are allowed. - + - Indication of melodic function, i.e., anticipation, lower neighbor, escape tone, + Indication of melodic function, i.e., anticipation, lower neighbor, escape tone, etc. - + Accented lower neighbor. @@ -1855,8 +1869,8 @@ - Mensuration signs attribute values. - + Mensuration signs attribute values. + Sign for tempus imperfectum. @@ -1906,8 +1920,8 @@ - Contains an indication of how a meter signature should be rendered. - + Contains an indication of how a meter signature should be rendered. + Show only the number of beats. @@ -1921,14 +1935,11 @@ Meter signature rendered using both the symbol and the traditional numeric values. - - Meter signature not rendered. - - Meter.sym attribute values for CMN. - + Meter.sym attribute values for CMN. + Common time; i.e., 4/4. @@ -1942,29 +1953,29 @@ - MIDI channel number. One-based values must be followed by a lower-case letter "o". - + MIDI channel number. One-based values must be followed by a lower-case letter "o". + 0|([1-9]|1[0-5])o?|16o - Tempo expressed as "beats" per minute, where "beat" is always defined as a quarter note, + Tempo expressed as "beats" per minute, where "beat" is always defined as a quarter note, *not the numerator of the time signature or the metronomic indication*. - + 0 - Tempo expressed as microseconds per "beat", where "beat" is always defined as a quarter + Tempo expressed as microseconds per "beat", where "beat" is always defined as a quarter note, *not the numerator of the time signature or the metronomic indication*. - + - General MIDI instrument names. - + General MIDI instrument names. + Acoustic Grand Piano, Program #0. @@ -2493,41 +2504,41 @@ - +

Instrument names are based on the official list in the General MIDI Specifications.

MEI uses 0-based program numbers.

Percussion sounds are available when the MIDI channel is set to "10".

- Generic MIDI value. One-based values must be followed by a lower-case letter "o". - + Generic MIDI value. One-based values must be followed by a lower-case letter "o". + 0|([1-9]|[1-9][0-9]|1([0-1][0-9]|2[0-7]))o?|128o - data.MIDIVALUE or data.NCName values. - + data.MIDIVALUE or data.NCName values. + - data.MIDIVALUE or data.PERCENT.LIMITED.SIGNED values. - + data.MIDIVALUE or data.PERCENT.LIMITED.SIGNED values. + - data.MIDIVALUE or data.PERCENT.LIMITED values. - + data.MIDIVALUE or data.PERCENT.LIMITED values. + - Modes. - + Modes. + - Common modes. - + Common modes. + Major mode. @@ -2538,8 +2549,8 @@ - Gregorian modes. - + Gregorian modes. + Dorian mode (the first mode). @@ -2571,8 +2582,8 @@ - Modern modes. - + Modern modes. + Ionian mode. @@ -2595,8 +2606,8 @@ - Bibliographic relationship values based on MODS version 3.4. - + Bibliographic relationship values based on MODS version 3.4. + Temporal predecessor of the resource. @@ -2630,41 +2641,41 @@ - Maxima-long relationship values. - + Maxima-long relationship values. + 2 3 - Long-breve relationship values. - + Long-breve relationship values. + 2 3 - Music font family. - + Music font family. + - "Convenience" datatype that permits combining enumerated values with a user-supplied + "Convenience" datatype that permits combining enumerated values with a user-supplied name. - + - "Convenience" datatype that permits combining enumerated values with user-supplied + "Convenience" datatype that permits combining enumerated values with user-supplied values. - + - Non-staff location. - + Non-staff location. + At the foot of the page. @@ -2749,14 +2760,14 @@ - Captures any notehead "modifiers"; that is, symbols added to the notehead, such as + Captures any notehead "modifiers"; that is, symbols added to the notehead, such as slashes, lines, text, and enclosures, etc. - + - Enumerated note head modifier values. - + Enumerated note head modifier values. + Slash (upper right to lower left). @@ -2785,14 +2796,14 @@ Enclosing circle. - + Enclosing "fences". - Captures text rendered in the center of the notehead. - + Captures text rendered in the center of the notehead. + centertext\((A|B|C|D|E|F|G)(f|♭|n|♮|s|♯)?\) @@ -2800,32 +2811,32 @@ - Oct attribute values. The default values conform to Acoustical Society of America + Oct attribute values. The default values conform to Acoustical Society of America representation. Read, p. 44. - + 9 - The amount of octave displacement; that is, '8' (as in '8va' for 1 octave), '15' (for 2 + The amount of octave displacement; that is, '8' (as in '8va' for 1 octave), '15' (for 2 octaves), or rarely '22' (for 3 octaves). - + 8|15|22 - Rotation or reflection of base symbol values. - + Rotation or reflection of base symbol values. + reversed|90CW|90CCW - For musical material designated to appear on an adjacent layer or staff, the location of the layer + For musical material designated to appear on an adjacent layer or staff, the location of the layer relative to the current one; i.e., the layer above or the layer below. - + The layer immediately above. @@ -2836,16 +2847,16 @@ - The number of panels per page. - + The number of panels per page. + 1 2 - Styling of piano pedal marks. - + Styling of piano pedal marks. + Continuous line with start and end positions rendered by vertical bars and bounces @@ -2866,29 +2877,29 @@ - Positive decimal number plus '%', i.e., [0-9]+(\.?[0-9]*)?\%. - + Positive decimal number plus '%', i.e., [0-9]+(\.[0-9]*)?%. + - [0-9]+(\.?[0-9]*)?% + [0-9]+(\.[0-9]*)?% - Positive decimal number between 0 and 100, followed by a percent sign "%". - + Decimal number between 0 and 100, followed by a percent sign "%". + - (([0-9]|[1-9][0-9])(\.[0-9]+)?|100(\.0+)?)% + (([0-9]|[1-9][0-9])(\.[0-9]*)?|100(\.0*)?)% - Positive decimal number between -100 and 100, followed by a percent sign "%". - + Decimal number between -100 and 100, followed by a percent sign "%". + - (\+|-)?(([0-9]|[1-9][0-9])(\.[0-9]+)?|100(\.0+)?)% + (\+|-)?(([0-9]|[1-9][0-9])(\.[0-9]*)?|100(\.0*)?)% - Page header and footer function; a value that defines the function (i.e., the placement) of the header or the footer. - + Page header and footer function; a value that defines the function (i.e., the placement) of the header or the footer. + Header or footer for all pages, including the first and the last page, unless a page header or footer for the first or the last page is provided. @@ -2907,48 +2918,48 @@ - +

An alternating pattern with "alt1" and "alt2" starts from the first page. However, if header or footer with a func="first" is also defined, it will shift the pattern by one page. A header or footer with func="last" will interupt the pattern.

- Page scale factor; a percentage of the values in page.height and page.width. - + Page scale factor; a percentage of the values in page.height and page.width. + - Pclass (pitch class) attribute values. - + Pclass (pitch class) attribute values. + 11 - The pitch names (gamut) used within a single octave. The default values conform to + The pitch names (gamut) used within a single octave. The default values conform to Acoustical Society of America representation. - + [a-g] - - Gestural pitch names need an additional value for when the notated pitch is not to be + + Gestural pitch names need an additional value for when the notated pitch is not to be sounded. - + [a-g]|none - Pnum (pitch number, e.g., MIDI) attribute values. - + Pnum (pitch number, e.g., MIDI) attribute values. + - Location information. - + Location information. + - + Other values not permitted when 'above', 'below', 'between' or 'within' is @@ -2957,26 +2968,26 @@ - Semibreve-minim relationship values. - + Semibreve-minim relationship values. + 2 3 - General-purpose relationships - + General-purpose relationships + - Rotation. - + Rotation. + - Rotation term. - + Rotation term. + No rotation. @@ -3002,29 +3013,29 @@ - Scale degree values. - + Scale degree values. + (\^|v)?[1-7](\+|\-)? - The number of slashes to be rendered for tremolandi. - + The number of slashes to be rendered for tremolandi. + 1 6 - i=initial, m=medial, t=terminal. Number is used to match endpoints of the slur when slurs + i=initial, m=medial, t=terminal. Number is used to match endpoints of the slur when slurs are nested or overlap. - + [i|m|t][1-6] - + @@ -3032,13 +3043,13 @@ - Items that may be printed above, below, or between staves. - + Items that may be printed above, below, or between staves. + - Items in all repertoires that may be printed near a staff. - + Items in all repertoires that may be printed near a staff. + Accidentals. @@ -3075,19 +3086,19 @@ - Staff location. The value '0' indicates the bottom line of the current staff; positive + Staff location. The value '0' indicates the bottom line of the current staff; positive values are used for positions above the bottom line and negative values for the positions below. For example, in treble clef, 1 = F4, 2 = G4, 3 = A4, etc. and -1 = D4, -2 = C4, and so on. - + - Location of musical material relative to a staff. - + Location of musical material relative to a staff. + - + The @staff @@ -3101,8 +3112,8 @@ - Location of symbol relative to a staff. - + Location of symbol relative to a staff. + Above the staff. @@ -3113,8 +3124,8 @@ - Location of symbol relative to a staff. - + Location of symbol relative to a staff. + Between staves. @@ -3125,13 +3136,13 @@ - Stem direction. - + Stem direction. + - Common stem directions. - + Common stem directions. + Stem points upwards. @@ -3142,8 +3153,8 @@ - Additional stem directions. - + Additional stem directions. + Stem points left. @@ -3166,8 +3177,8 @@ - Stem modification. - + Stem modification. + No modifications to stem. @@ -3199,8 +3210,8 @@ - Position of a note’s stem relative to the head of the note. - + Position of a note’s stem relative to the head of the note. + Stem attached to left side of note head. @@ -3214,8 +3225,8 @@ - Temperament or tuning system. - + Temperament or tuning system. + Equal or 12-tone temperament. @@ -3232,21 +3243,21 @@ - Beats (meter signature denominator) per minute, e.g., 120. - + Beats (meter signature denominator) per minute, e.g., 120. + - Breve-semibreve relationship values. - + Breve-semibreve relationship values. + 2 3 - Closed list of text rendition values. - + Closed list of text rendition values. + Surrounded by single quotes. @@ -3342,45 +3353,45 @@ - Parameterized text rendition values. - + Parameterized text rendition values. + (underline|overline|line-through|strike|x-through)\(\d+\) - Text rendition values. - + Text rendition values. + - Tie attribute values: initial, medial, terminal. - + Tie attribute values: initial, medial, terminal. + [i|m|t] - A positive or negative offset from the value given in the tstamp attribute in terms of + A positive or negative offset from the value given in the tstamp attribute in terms of musical time, i.e., beats[.fractional beat part]. - + - Tuplet attribute values: initial, medial, terminal. - + Tuplet attribute values: initial, medial, terminal. + [i|m|t][1-6] - A Uniform Resource Identifier, see [RFC2396]. - + A Uniform Resource Identifier, see [RFC2396]. + - Data values for attributes that capture vertical alignment. - + Data values for attributes that capture vertical alignment. + Top aligned. @@ -3397,16 +3408,16 @@ - A single "word" that contains only letters, digits, punctuation characters, or symbols. It + A single "word" that contains only letters, digits, punctuation characters, or symbols. It cannot contain whitespace. - + (\p{L}|\p{N}|\p{P}|\p{S})* - Attributes that provide for classification of notation. - + Attributes that provide for classification of notation. + Contains classification of the notation contained or described by the element bearing this attribute. @@ -3420,7 +3431,7 @@ - + An element with a notationsubtype attribute must have @@ -3431,100 +3442,100 @@ - Analytical domain attributes. + Analytical domain attributes. - Analytical domain attributes. - + Analytical domain attributes. + - Analytical domain attributes. + Analytical domain attributes. - Analytical domain attributes. + Analytical domain attributes. - Analytical domain attributes. + Analytical domain attributes. - Analytical domain attributes. + Analytical domain attributes. - Analytical domain attributes. + Analytical domain attributes. - Analytical domain attributes. + Analytical domain attributes. - Analytical domain attributes. + Analytical domain attributes. - Analytical domain attributes. + Analytical domain attributes. - Analytical domain attributes. + Analytical domain attributes. - Analytical domain attributes. + Analytical domain attributes. - Analytical domain attributes. + Analytical domain attributes. - Analytical domain attributes. + Analytical domain attributes. - Analytical domain attributes. + Analytical domain attributes. - Analytical domain attributes. + Analytical domain attributes. - Analytical domain attributes. + Analytical domain attributes. - Analytical domain attributes. - + Analytical domain attributes. + - Analytical domain attributes. + Analytical domain attributes. - Analytical domain attributes. - + Analytical domain attributes. + - Analytical domain attributes. + Analytical domain attributes. - Analytical domain attributes. + Analytical domain attributes. - Analytical domain attributes. + Analytical domain attributes. - Analytical domain attributes. + Analytical domain attributes. - Analytical domain attributes. + Analytical domain attributes. - Analytical domain attributes. + Analytical domain attributes. - Analytical domain attributes. + Analytical domain attributes. - Analytical domain attributes. + Analytical domain attributes. - Analytical domain attributes. + Analytical domain attributes. - Analytical domain attributes. + Analytical domain attributes. - Analytical domain attributes. + Analytical domain attributes. - Analytical domain attributes. + Analytical domain attributes. - Analytical domain attributes. + Analytical domain attributes. - Analytical domain attributes. + Analytical domain attributes. - Analytical domain attributes. + Analytical domain attributes. - Analytical domain attributes. + Analytical domain attributes. - Analytical domain attributes. + Analytical domain attributes. - Analytical domain attributes. + Analytical domain attributes. - Analytical domain attributes. + Analytical domain attributes. - Analytical domain attributes. + Analytical domain attributes. - Analytical domain attributes. - + Analytical domain attributes. + - + Indicates to what degree the harmonic label is supported by the notation. @@ -3541,10 +3552,10 @@ - Analytical domain attributes. + Analytical domain attributes. - Attributes describing the harmonic function of a single pitch. - + Attributes describing the harmonic function of a single pitch. + degree Captures scale degree information using Humdrum **deg syntax -- an optional indicator @@ -3558,14 +3569,14 @@ - Analytical domain attributes. + Analytical domain attributes. - Analytical domain attributes. + Analytical domain attributes. - Analytical domain attributes. + Analytical domain attributes. - Attributes that describe harmonic intervals. - + Attributes that describe harmonic intervals. + interval harmonic Encodes the harmonic interval between pitches occurring at the same time. @@ -3575,8 +3586,8 @@ - Attributes that provide for description of intervallic content. - + Attributes that provide for description of intervallic content. + interval melodic Encodes the melodic interval from the previous pitch. The value may be a general @@ -3588,14 +3599,14 @@ - Analytical domain attributes. + Analytical domain attributes. - Analytical domain attributes. - + Analytical domain attributes. + - + Indicates major, minor, or other tonality. @@ -3604,9 +3615,9 @@ - Used by staffDef and scoreDef to provide default values for attributes in the analytical + Used by staffDef and scoreDef to provide default values for attributes in the analytical domain that are related to key signatures. - + Contains an accidental for the tonic key, if one is required, e.g., if key.pname equals c and key.accid equals s, then a tonic of C# is indicated. @@ -3628,27 +3639,27 @@ - Analytical domain attributes. + Analytical domain attributes. - Analytical domain attributes. + Analytical domain attributes. - Analytical domain attributes. + Analytical domain attributes. - Analytical domain attributes. + Analytical domain attributes. - Analytical domain attributes. + Analytical domain attributes. - Analytical domain attributes. + Analytical domain attributes. - Analytical domain attributes. + Analytical domain attributes. - Analytical domain attributes. - + Analytical domain attributes. + - Attributes describing melodic function. - + Attributes describing melodic function. + Describes melodic function using Humdrum **embel syntax. @@ -3657,41 +3668,41 @@ - Analytical domain attributes. + Analytical domain attributes. - Analytical domain attributes. + Analytical domain attributes. - Analytical domain attributes. + Analytical domain attributes. - Analytical domain attributes. + Analytical domain attributes. - Analytical domain attributes. + Analytical domain attributes. - Analytical domain attributes. + Analytical domain attributes. - Analytical domain attributes. + Analytical domain attributes. - Analytical domain attributes in the CMN repertoire. - + Analytical domain attributes in the CMN repertoire. + - Analytical domain attributes. + Analytical domain attributes. - Analytical domain attributes. + Analytical domain attributes. - Analytical domain attributes in the CMN repertoire. Use the n attribute to explicitly + Analytical domain attributes in the CMN repertoire. Use the n attribute to explicitly encode this measure’s position in a string of measures containing only mRest elements. - + - Analytical domain attributes. + Analytical domain attributes. - Analytical domain attributes. + Analytical domain attributes. - Analytical domain attributes. - + Analytical domain attributes. + @@ -3699,12 +3710,12 @@ - Analytical domain attributes. + Analytical domain attributes. - Analytical domain attributes. + Analytical domain attributes. - Analytical domain attributes. - + Analytical domain attributes. + @@ -3717,31 +3728,31 @@ - Analytical domain attributes. + Analytical domain attributes. - Analytical domain attributes. + Analytical domain attributes. - Analytical domain attributes. + Analytical domain attributes. - Analytical domain attributes. + Analytical domain attributes. - Analytical domain attributes. + Analytical domain attributes. - Analytical domain attributes. + Analytical domain attributes. - Analytical domain attributes. + Analytical domain attributes. - Analytical domain attributes. + Analytical domain attributes. - Analytical domain attributes. + Analytical domain attributes. - Analytical domain attributes. - + Analytical domain attributes. + - Attributes that describe pitch class. - + Attributes that describe pitch class. + pitch class Holds pitch class information. @@ -3751,43 +3762,45 @@ - Analytical domain attributes that describe the properties of a plica in the mensural repertoire. + Analytical domain attributes that describe the properties of a plica in the mensural repertoire. - Analytical domain attributes. + Analytical domain attributes. - Analytical domain attributes. + Analytical domain attributes. - Analytical domain attributes. + Analytical domain attributes. - Analytical domain attributes. + Analytical domain attributes. - Analytical domain attributes. + Analytical domain attributes. + + Analytical domain attributes. - Analytical domain attributes. - + Analytical domain attributes. + - Analytical domain attributes. + Analytical domain attributes. - Analytical domain attributes. + Analytical domain attributes. - Analytical domain attributes. - + Analytical domain attributes. + - Analytical domain attributes. + Analytical domain attributes. - Analytical domain attributes. - + Analytical domain attributes. + - Analytical domain attributes. + Analytical domain attributes. - Attributes that specify pitch using sol-fa. - + Attributes that specify pitch using sol-fa. + pitch sol-fa Contains sol-fa designation, e.g., do, re, mi, etc., in either a fixed or movable Do @@ -3798,55 +3811,55 @@ - Analytical domain attributes. + Analytical domain attributes. - Analytical domain attributes. - + Analytical domain attributes. + - Analytical domain attributes. + Analytical domain attributes. - Analytical domain attributes. - + Analytical domain attributes. + - Analytical domain attributes. + Analytical domain attributes. - Analytical domain attributes. + Analytical domain attributes. - Analytical domain attributes that describe the properties of a stem in the mensural repertoire. + Analytical domain attributes that describe the properties of a stem in the mensural repertoire. - Analytical domain attributes. + Analytical domain attributes. - Analytical domain attributes. + Analytical domain attributes. - Analytical domain attributes. + Analytical domain attributes. - Analytical domain attributes. + Analytical domain attributes. - Analytical domain attributes. + Analytical domain attributes. - Analytical domain attributes. + Analytical domain attributes. - Analytical domain attributes. + Analytical domain attributes. - Analytical domain attributes. + Analytical domain attributes. - Analytical domain attributes. - + Analytical domain attributes. + - Analytical domain attributes. + Analytical domain attributes. - Analytical domain attributes. + Analytical domain attributes. - Analytical domain attributes. + Analytical domain attributes. - Logical, that is, written, duration attribute values for the CMN repertoire. - + Logical, that is, written, duration attribute values for the CMN repertoire. + Quadruple whole note. @@ -3893,8 +3906,8 @@ - Items in the CMN repertoire that may be printed near a staff. - + Items in the CMN repertoire that may be printed near a staff. + Beams. @@ -3961,12 +3974,12 @@ - Logical domain attributes. - + Logical domain attributes. + - + Describes the direction in which an arpeggio is to be performed. @@ -3984,14 +3997,14 @@ - Logical domain attributes. - + Logical domain attributes. + - Attributes indicating cross-staff beaming. - + Attributes indicating cross-staff beaming. + In the case of cross-staff beams, the beam.with attribute is used to indicate which staff the beam is connected to; that is, the staff above or the staff below. @@ -4001,9 +4014,9 @@ - Used by layerDef, staffDef, and scoreDef to provide default values for attributes in the + Used by layerDef, staffDef, and scoreDef to provide default values for attributes in the logical domain related to beaming. - + Provides an example of how automated beaming (including secondary beams) is to be performed. @@ -4019,7 +4032,7 @@ - +

The beam.group attribute can be used to set a default beaming pattern to be used when no beaming is indicated at the event level. beam.group must contain a comma-separated list of time values that add up to a measure, e.g., in 4/4 time '4,4,4,4' @@ -4033,8 +4046,8 @@ explicitly 'turned off' by setting beam.group to an empty string.

- Attributes that indicate whether an event lies under a beam. - + Attributes that indicate whether an event lies under a beam. + Indicates that this event is "under a beam". @@ -4043,8 +4056,8 @@ - Attributes that record the visual rendition of beams. - + Attributes that record the visual rendition of beams. + Captures whether a beam is "feathered" and in which direction. @@ -4074,7 +4087,7 @@ - + Stem direction must be specified for all notes and chords under the @@ -4101,8 +4114,8 @@ - Attributes that capture information about secondary beaming. - + Attributes that capture information about secondary beaming. + Presence of this attribute indicates that the secondary beam should be broken following this note/chord. The value of the attribute records the number of beams which @@ -4113,8 +4126,8 @@ - Logical domain attributes. - + Logical domain attributes. + @@ -4122,11 +4135,11 @@ - Logical domain attributes. - + Logical domain attributes. + - + Indicates the performed duration represented by the beatRpt symbol; expressed in time signature denominator units. @@ -4138,22 +4151,22 @@ - Logical domain attributes. - + Logical domain attributes. + - Logical domain attributes. - + Logical domain attributes. + - + function Describes the function of the bracketed event sequence. @@ -4174,8 +4187,8 @@ - Logical domain attributes. - + Logical domain attributes. + @@ -4184,14 +4197,14 @@ - Logical domain attributes. - + Logical domain attributes. + - + Indicates whether the tremolo is measured or unmeasured. @@ -4205,8 +4218,8 @@ - Analytical domain attributes in the CMN repertoire. - + Analytical domain attributes in the CMN repertoire. + @@ -4216,24 +4229,24 @@ - Gestural domain attributes for CMN features. + Gestural domain attributes for CMN features. - Logical domain attributes in the CMN repertoire. - + Logical domain attributes in the CMN repertoire. + - Visual domain attributes for chord. The slur, slur.dir, slur.rend, tie, tie.dir, and + Visual domain attributes for chord. The slur, slur.dir, slur.rend, tie, tie.dir, and tie.rend attributes here are "syntactic sugar" for these attributes on each of the chord's individual notes. The values here apply to all the notes in the chord. If some notes are slurred or tied while others aren't, then the individual note attributes must be used. - + - Attributes that indicate how to render the staff lines of the measure containing an + Attributes that indicate how to render the staff lines of the measure containing an element belonging to this attribute class. - + "Cut-out" style. @@ -4244,11 +4257,11 @@ - Logical domain attributes. + Logical domain attributes. - Attributes that indicate whether to render a repeat symbol or the source material to which + Attributes that indicate whether to render a repeat symbol or the source material to which it refers. - + Indicates whether to render a repeat symbol or the source material to which it refers. A value of 'true' renders the source material, while 'false' displays the repeat @@ -4259,19 +4272,19 @@ - Logical domain attributes. - + Logical domain attributes. + - Logical domain attributes. - + Logical domain attributes. + - + Describes the style of the tremolo. @@ -4285,8 +4298,8 @@ - Attributes that indicate whether an event participates in a glissando. - + Attributes that indicate whether an event participates in a glissando. + glissando Indicates that this element participates in a glissando. If visual information about @@ -4298,17 +4311,17 @@ - Logical domain attributes. - + Logical domain attributes. + - Attributes that mark a note or chord as a "grace", how it should "steal" time, and how + Attributes that mark a note or chord as a "grace", how it should "steal" time, and how much time should be allotted to the grace note/chord. - + Marks a note or chord as a "grace" (without a definite performed duration) and records from which other note/chord it should "steal" time. @@ -4324,12 +4337,12 @@ - Logical domain attributes. - + Logical domain attributes. + - + Records whether the grace note group is attached to the following event or to the preceding one. The usual name for the latter is "Nachschlag". @@ -4347,14 +4360,14 @@ - Logical domain attributes. - + Logical domain attributes. + - + Captures the visual rendition and function of the hairpin; that is, whether it indicates an increase or a decrease in volume. @@ -4376,19 +4389,19 @@ - Logical domain attributes. - + Logical domain attributes. + - Logical domain attributes. The pedal setting, i.e., flat, natural, or sharp, for each + Logical domain attributes. The pedal setting, i.e., flat, natural, or sharp, for each diatonic pitch name is indicated by the seven letter-named attributes. - + - + Indicates the pedal setting for the harp’s C strings. n @@ -4496,21 +4509,21 @@ - Logical domain attributes. - + Logical domain attributes. + - Logical domain attributes. - + Logical domain attributes. + - Attributes that indicate the presence of an l.v. (laissez vibrer) marking attached to a + Attributes that indicate the presence of an l.v. (laissez vibrer) marking attached to a feature. If visual information about the lv sign needs to be recorded, then an lv element should be employed. - + Indicates the attachment of an l.v. (laissez vibrer) sign to this element. @@ -4519,7 +4532,7 @@ - Logical domain attributes. The n attribute contains a name or number associated with the + Logical domain attributes. The n attribute contains a name or number associated with the measure (Read, p. 445). Often, this is an integer, but not always. For example, some measures, especially incomplete measures or those under an ending mark, may have labels that contain an integer plus a suffix, such as '12a'. Measures may even have labels, especially in editorial @@ -4527,11 +4540,11 @@ machine-generated instead of encoding them in the markup. However, an explicit measure number should restart numbering with the given value. The join attribute may be used to indicate another measure which metrically completes the current, incomplete one. - + - + Indicates the visual rendition of the left bar line. It is present here only for facilitation of translation from legacy encodings which use it. Usually, it can be safely @@ -4548,8 +4561,8 @@ - Logical domain attributes. - + Logical domain attributes. + function Function of the meter signature group. @@ -4571,44 +4584,44 @@ - Logical domain attributes. - + Logical domain attributes. + - Logical domain attributes. - + Logical domain attributes. + - Logical domain attributes. - + Logical domain attributes. + - Logical domain attributes in the CMN repertoire. - + Logical domain attributes in the CMN repertoire. + - Logical domain attributes. - + Logical domain attributes. + - Logical domain attributes. - + Logical domain attributes. + - Analytical domain attributes in the CMN repertoire. - + Analytical domain attributes in the CMN repertoire. + @@ -4619,18 +4632,18 @@ - Logical domain attributes. - + Logical domain attributes. + - Visual domain attributes. - + Visual domain attributes. + - Attributes that record numbers to be displayed with a feature. - + Attributes that record numbers to be displayed with a feature. + number Records a number or count accompanying a notational feature. @@ -4640,9 +4653,9 @@ - Attributes that record the placement and visibility of numbers that accompany a bowed + Attributes that record the placement and visibility of numbers that accompany a bowed tremolo or tuplet. - + number placement States where the tuplet number will be placed in relation to the note heads. @@ -4658,15 +4671,15 @@ - Logical domain attributes. - + Logical domain attributes. + - + Indicates whether the octave displacement should be performed simultaneously with the written notes, i.e., "coll' ottava". Unlike other octave signs which are indicated by @@ -4680,15 +4693,15 @@ - Logical domain attributes. + Logical domain attributes. - Logical domain attributes. - + Logical domain attributes. + - + direction Records the position of the piano damper pedal. @@ -4739,15 +4752,15 @@ - Visual domain attributes. - + Visual domain attributes. + - Used by scoreDef and staffDef to provide default description of piano pedal + Used by scoreDef and staffDef to provide default description of piano pedal rendition. - + Determines whether piano pedal marks should be rendered as lines or as terms. @@ -4756,8 +4769,8 @@ - Logical domain attributes. - + Logical domain attributes. + @@ -4766,9 +4779,9 @@ - Attributes used by scoreDef and staffDef to provide default information about rehearsal + Attributes used by scoreDef and staffDef to provide default information about rehearsal numbers/letters. - + Describes the enclosing shape for rehearsal marks. @@ -4785,34 +4798,34 @@ - Analytical domain attributes in the CMN repertoire. - + Analytical domain attributes in the CMN repertoire. + - Logical domain attributes in the CMN repertoire. + Logical domain attributes in the CMN repertoire. - Visual domain attributes. - + Visual domain attributes. + - Logical domain attributes. - + Logical domain attributes. + - Visual domain attributes. - + Visual domain attributes. + - + Determines whether to display guitar chord grids. @@ -4821,16 +4834,16 @@ - Logical domain attributes. - + Logical domain attributes. + - Attributes that describe the rendition of slurs. - + Attributes that describe the rendition of slurs. + @@ -4843,22 +4856,22 @@ - Analytical domain attributes in the CMN repertoire. - + Analytical domain attributes in the CMN repertoire. + - Logical domain attributes in the CMN repertoire. + Logical domain attributes in the CMN repertoire. - Logical domain attributes for staffDef in the CMN repertoire. - + Logical domain attributes for staffDef in the CMN repertoire. + - Visual domain attributes for staffDef in the CMN repertoire. - + Visual domain attributes for staffDef in the CMN repertoire. + @@ -4866,9 +4879,9 @@ - Attributes that describe the properties of stemmed features; that is, chords and + Attributes that describe the properties of stemmed features; that is, chords and notes. - + Contains an indication of which staff a note or chord that logically belongs to the current staff should be visually placed on; that is, the one above or the one @@ -4879,15 +4892,15 @@ - Logical domain attributes. - + Logical domain attributes. + - Attributes that describe the rendition of ties. - + Attributes that describe the rendition of ties. + @@ -4900,8 +4913,8 @@ - Attributes that describe measured tremolandi. - + Attributes that describe measured tremolandi. + The performed duration of an individual note in a measured tremolo. @@ -4910,8 +4923,8 @@ - Logical domain attributes. - + Logical domain attributes. + @@ -4919,8 +4932,8 @@ - Logical domain attributes. - + Logical domain attributes. + @@ -4929,47 +4942,47 @@ - Groups control events that appear in CMN. - + Groups control events that appear in CMN. + - Groups events that appear in CMN. - + Groups events that appear in CMN. + - Groups events that completely fill a CMN measure. - + Groups events that completely fill a CMN measure. + - Groups notated events that may appear at the layer level in CMN. - + Groups notated events that may appear at the layer level in CMN. + - Groups CMN measure-like elements. - + Groups CMN measure-like elements. + - Groups elements that may appear within a CMN measure. + Groups elements that may appear within a CMN measure. - Groups elements that function like ossia. - + Groups elements that function like ossia. + - Groups elements that may appear as part of a section. - + Groups elements that may appear as part of a section. + - arpeggiationIndicates that the notes of a chord are to be performed successively - rather than simultaneously, usually from lowest to highest. Sometimes called a "roll". + arpeggiationIndicates that the notes of a chord are to be performed successively + rather than simultaneously, usually from lowest to highest. Sometimes called a "roll". @@ -4977,9 +4990,9 @@ - + - +

The modern arpeggiation symbol is a vertical wavy line preceding the chord. When the notes of the chord are to be performed from highest to lowest, an arrowhead may be added to the lower end of the line. Even though it is redundant, an arrowhead is sometimes added to the @@ -4990,8 +5003,8 @@ staff and layer attributes. Arpeggios that do not cross staves, but still involve more than one layer require multiple values for the layer attribute.

-
An instruction to begin the next section or movement of a composition without - pause. + An instruction to begin the next section or movement of a composition without + pause. @@ -5001,16 +5014,16 @@ - + - + Must have one of the attributes: startid, tstamp, tstamp.ges or tstamp.real. - +

As a specialized directive, attacca is a control element. That is, it can be linked via its attributes to other events. The starting point of the attacca directive may be indicated by either a startid, tstamp, @@ -5018,8 +5031,8 @@ recorded by either a dur, dur.ges, endid, or tstamp2 attribute. It is a semantic error not to specify a starting point attribute.

-
A container for a series of explicitly beamed events that begins and ends entirely within - a measure. + A container for a series of explicitly beamed events that begins and ends entirely within + a measure. @@ -5027,23 +5040,23 @@ - + - + A beam that contains neither a copyof nor sameas attribute must have at least 2 note, rest, chord, or space descendants. - +

For beams that cross the bar line, use the beamSpan element. Secondary beams may be broken explicitly using the breaksec attribute on the notes or chords under the beam. Automated beaming, as opposed to explicitly marked beams, may be indicated for an entire score, part or section by using the beam.group and beam.rests attributes on these elements.

-
beam spanAlternative element for explicitly encoding beams, particularly those which - extend across bar lines. + beam spanAlternative element for explicitly encoding beams, particularly those which + extend across bar lines. @@ -5051,9 +5064,9 @@ - + - + Must have one of the @@ -5062,13 +5075,13 @@ dur, dur.ges, endid, or tstamp2. - +

The starting point of the beam may be indicated by either a startid, tstamp, tstamp.ges, or tstamp.real attribute, while the ending point may be recorded by either a dur, dur.ges, endid, or tstamp2 attribute. It is a semantic error not to specify one starting and one ending type of attribute.

-
beat repeatAn indication that material on a preceding beat should be repeated. + beat repeatAn indication that material on a preceding beat should be repeated. @@ -5078,15 +5091,15 @@ - + - +

beatRpt may also be used in guitar or rhythm parts to indicate where chord changes occur. When these parts require durations longer or shorter than a beat; however, note elements with appropriately-shaped note heads should be employed.

-
A variation in pitch (often micro-tonal) upwards or downwards during the course of a - note. + A variation in pitch (often micro-tonal) upwards or downwards during the course of a + note. @@ -5094,9 +5107,9 @@ - + - + Must have one of the @@ -5105,7 +5118,7 @@ dur, dur.ges, endid, or tstamp2. - Marks a sequence of notational events grouped by a bracket. + Marks a sequence of notational events grouped by a bracket. @@ -5113,9 +5126,9 @@ - + - + Must have one of the @@ -5124,15 +5137,15 @@ dur, dur.ges, endid, or tstamp2. - +

Text that interrupts the bracket used to mark the event group may be captured as the content of bracketSpan. The starting point of the group/bracket may be indicated by either a startid, tstamp, tstamp.ges, or tstamp.real attribute, while the ending point may be recorded by either a dur, dur.ges, endid, or tstamp2 attribute. It is a semantic error not to specify one starting and one ending type of attribute.

-
breath markAn indication of a point at which the performer on an instrument requiring - breath (including the voice) may breathe. + breath markAn indication of a point at which the performer on an instrument requiring + breath (including the voice) may breathe. @@ -5140,16 +5153,16 @@ - + - + Must have one of the attributes: startid, tstamp, tstamp.ges or tstamp.real. - +

This element may also indicate a short pause or break for instruments *not* requiring breath. In such cases, it functions as a guide to phrasing. The starting point of the breath mark may be indicated by either a startid, tstamp, @@ -5160,7 +5173,7 @@

The default value for place for a breath mark is "above". Unless indicated by other attributes, a breath mark will be rendered as a comma-like symbol above the top line of the staff.

-
bowed tremoloA rapid alternation on a single pitch or chord. + bowed tremoloA rapid alternation on a single pitch or chord. @@ -5168,11 +5181,11 @@ - + - An indication placed over a note or rest to indicate that it should be held longer than +
An indication placed over a note or rest to indicate that it should be held longer than its written value. May also occur over a bar line to indicate the end of a phrase or section. - Sometimes called a 'hold' or 'pause'. + Sometimes called a 'hold' or 'pause'. @@ -5180,16 +5193,16 @@ - + - + Must have one of the attributes: startid, tstamp, tstamp.ges or tstamp.real. - +

The shape attribute may be used to record whether the fermata is curved, square, or triangular, while form may be used to capture whether the fermata is "upright", i.e., has the curve or bracket above the dot, or inverted, i.e., has the curve or @@ -5197,8 +5210,8 @@ altsym attribute. The starting point of the fermata may be indicated by either a startid, tstamp, tstamp.ges, or tstamp.real attribute. It is a semantic error not to specify a starting point attribute.

-
fingered tremoloA rapid alternation between a pair of notes (or chords or perhaps - between a note and a chord) that are (usually) farther apart than a major second. + fingered tremoloA rapid alternation between a pair of notes (or chords or perhaps + between a note and a chord) that are (usually) farther apart than a major second. @@ -5206,10 +5219,10 @@ - + - glissandoA continuous or sliding movement from one pitch to another, usually - indicated by a straight or wavy line. + glissandoA continuous or sliding movement from one pitch to another, usually + indicated by a straight or wavy line. @@ -5217,9 +5230,9 @@ - + - + Must have one of the @@ -5228,7 +5241,7 @@ dur, dur.ges, endid, or tstamp2. - +

Commonly also called a 'slide'. The term 'glissando' is frequently used to indicate both the case where distinct intermediate pitches are produced (as on the piano) and the case where they are not (as on the trombone), though the latter is sometimes referred to as @@ -5238,7 +5251,7 @@ tstamp.real attribute, while the ending point may be recorded by either a dur, dur.ges, endid, or tstamp2 attribute. It is a semantic error not to specify one starting and one ending type of attribute.

-
A container for a sequence of grace notes. + A container for a sequence of grace notes. @@ -5246,24 +5259,24 @@ - + - + A graceGrp without a copyof attribute must have at least 1 note, rest, chord, or space descendants. - + The grace attribute is not allowed on descendants of a graceGrp with a grace attribute. - Indicates continuous dynamics expressed on the score as wedge-shaped graphics, e.g., < - and >. + Indicates continuous dynamics expressed on the score as wedge-shaped graphics, e.g., < + and >. @@ -5271,9 +5284,9 @@ - + - + Must have one of the @@ -5282,7 +5295,7 @@ dur, dur.ges, endid, or tstamp2. - +

The hairpin element is used for graphical, i.e., crescendo and diminuendo, dynamic markings. For instantaneous or continuous textual dynamics, such as 'p', 'mf', or 'cres. poco a poco', the dynam element should be used. The starting point of the hairpin marking @@ -5292,7 +5305,7 @@ a semantic error not to specify one starting and one ending type of attribute. MIDI values associated with the graphical dynamic sign may be recorded in the val and val2 attributes.

-
half-measure repeatA half-measure repeat in any meter. + half-measure repeatA half-measure repeat in any meter. @@ -5300,9 +5313,9 @@ - + - harp pedalHarp pedal diagram. + harp pedalHarp pedal diagram. @@ -5310,20 +5323,20 @@ - + - + Must have one of the attributes: startid, tstamp, tstamp.ges or tstamp.real. - +

The starting point of the harp pedal diagram may be indicated by either a tstamp, tstamp.ges, tstamp.real or startid attribute. It is a semantic error not to specify a starting point attribute.

-
laissez vibrerA "tie-like" indication that a note should ring beyond its written duration. + laissez vibrerA "tie-like" indication that a note should ring beyond its written duration. @@ -5331,16 +5344,16 @@ - + - + Must have one of the attributes: startid, tstamp, tstamp.ges or tstamp.real. - + The visual attributes of the lv element (@bezier, @bulge, @curvedir, @@ -5349,17 +5362,17 @@ elements. - +

The lv element captures the graphical, "tie-like" symbol. Any associated text, such as "l.v.", must be captured using a dir element.

-
Unit of musical time consisting of a fixed number of note values of a given type, as - determined by the prevailing meter, and delimited in musical notation by bar lines. + Unit of musical time consisting of a fixed number of note values of a given type, as + determined by the prevailing meter, and delimited in musical notation by bar lines.

In MEI, the measure element is a grouping mechanism for events and control events. Pointing attributes make it possible to connect this element to other internal or external entities, such as media objects or annotations. The width attribute may be used to capture the width of the measure for interchange with music printing systems that utilize this information for printing.

-
meter signatureWritten meter signature. + meter signatureWritten meter signature. @@ -5367,9 +5380,9 @@ - + - meter signature groupUsed to capture alternating, interchanging, mixed or other non-standard meter signatures. + meter signature groupUsed to capture alternating, interchanging, mixed or other non-standard meter signatures. @@ -5377,18 +5390,18 @@ - + - + meterSigGrp must have at least 2 child meterSig elements. - measure numberDesignation, name, or label for a measure, often but not always + measure numberDesignation, name, or label for a measure, often but not always consisting of digits. Use this element when the n attribute on measure does not adequately capture the appearance or placement of the measure - number/label. + number/label. @@ -5396,11 +5409,11 @@ - + - +

mNum uses a subset of model.textPhraseLike.limited.

-
measure restComplete measure rest in any meter. + measure restComplete measure rest in any meter. @@ -5408,12 +5421,12 @@ - + - +

Automatically-generated numbering of consecutive measures of rest may be controlled via the multi.number attribute on the scoreDef or staffDef elements.

-
measure repeatAn indication that the previous measure should be repeated. + measure repeatAn indication that the previous measure should be repeated. @@ -5421,13 +5434,13 @@ - + - +

The automated numbering of consecutive measures of rest may be controlled via the multi.number attribute on the scoreDef or staffDef elements.

-
2-measure repeatAn indication that the previous two measures should be - repeated. + 2-measure repeatAn indication that the previous two measures should be + repeated. @@ -5435,9 +5448,9 @@ - + - measure spaceA measure containing only empty space in any meter. + measure spaceA measure containing only empty space in any meter. @@ -5445,13 +5458,13 @@ - + - +

The automated numbering of consecutive measures of space may be controlled via the multi.number attribute on the scoreDef or staffDef elements.

-
multiple restMultiple measures of rest compressed into a single symbol, frequently - found in performer parts. + multiple restMultiple measures of rest compressed into a single symbol, frequently + found in performer parts. @@ -5459,9 +5472,9 @@ - + - multiple repeatMultiple repeated measures. + multiple repeatMultiple repeated measures. @@ -5469,15 +5482,15 @@ - + - +

In modern publishing practice, repeats of more than two measures should be written out using repeat signs. This element, however, is provided for handling non-standard practices often found in manuscript. The num attribute records the number of measures to be repeated.

-
An indication that a passage should be performed one or more octaves above or below its - written pitch. + An indication that a passage should be performed one or more octaves above or below its + written pitch. @@ -5485,9 +5498,9 @@ - + - + Must have one of the @@ -5496,7 +5509,7 @@ dur, dur.ges, endid, or tstamp2. - +

The dis and dis.place attributes record the amount and direction of displacement, respectively. The lform and lwidth attributes capture the appearance of the continuation line associated with the octave displacement. The @@ -5506,7 +5519,7 @@ endid, or tstamp2 attribute. It is a semantic error not to specify one starting and one ending type of attribute. Also, note that the dur attribute is not required because the octave displacement can be visually instantaneous.

-
ossia layerA layer that contains an alternative to material in another layer. + ossia layerA layer that contains an alternative to material in another layer. @@ -5519,10 +5532,10 @@ - + - Captures original notation and a differently notated version *present in - the source being transcribed*. + Captures original notation and a differently notated version *present in + the source being transcribed*. @@ -5530,9 +5543,9 @@ - + - + @@ -5545,15 +5558,15 @@ - +

The alternative material in an ossia often provides a simpler, easier-to-perform option, while at other times the alternate material provides indications of performance practice, such as ornamentation. Often an ossia is rendered above the main staff on a reduced-size staff. Sometimes the alternate material occurs on the same staff as the primary text, but in a separate layer. In this case, the alternative material is often rendered in small-sized notation.

-
ossia staffA staff that holds an alternative passage which may be played instead of - the original material. + ossia staffA staff that holds an alternative passage which may be played instead of + the original material. @@ -5566,9 +5579,9 @@ - + - Piano pedal mark. + Piano pedal mark. @@ -5576,21 +5589,21 @@ - + - + Must have one of the attributes: startid, tstamp, tstamp.ges or tstamp.real. - +

The starting point of the pedal mark may be indicated by either a startid, tstamp, tstamp.ges, or tstamp.real attribute. It is a semantic error not to specify one of these attributes.

-
rehearsal markIn an orchestral score and its corresponding parts, a mark indicating a - convenient point from which to resume rehearsal after a break. + rehearsal markIn an orchestral score and its corresponding parts, a mark indicating a + convenient point from which to resume rehearsal after a break. @@ -5599,13 +5612,44 @@ - + - +

It may also be called a "rehearsal figure", or when numbers are used instead of letters, a "rehearsal number". See Read, p. 443. reh uses a subset of model.textPhraseLike.limited.

-
Indication of 1) a "unified melodic idea" or 2) performance technique. + repetition mark + An instruction expressed as a combination of text and symbols – segno and coda – typically above, + below, or between staves, but not on the staff. + + + + + + + + + + + + + + Must have one of the + attributes: startid, tstamp, tstamp.ges or tstamp.real. + + + + + + When @glyph.name or @glyph.num is present, repeatMark must not have content. + + + +

When only func is provided to describe the function of the repeat mark (i.e., without glyph information and no textual content), then a renderer + can rely on it to display the appropriate symbol. When textual content is provided, it will take precedence over the symbol implied by the function. Generic repeat marks where + no function can be determined, then generic dir elements should be used. +

+
Indication of 1) a "unified melodic idea" or 2) performance technique. @@ -5613,9 +5657,9 @@ - + - + Must have one of the @@ -5624,7 +5668,7 @@ dur, dur.ges, endid, or tstamp2. - + The visual attributes of the slur (@bezier, @bulge, @curvedir, @lform, @@ -5633,7 +5677,7 @@ elements. - +

Historically, the term "slur" indicated two notes performed legato, while the term "phrase" was used for a "unified melodic idea". Nowadays, however, "slur" often has the same meaning as "phrase" (See Read, p. 265-266), since the visual rendition of the two concepts is the @@ -5648,8 +5692,8 @@ bezier attributes may be used to record the curvature of the phrase/slur. The slur and tie elements may be used instead of the slur.* and tie.* attributes provided on chord and note elements when 1) they are required by software, or 2) multiple, alternative slurs are needed.

-
An indication that two notes of the same pitch form a single note with their combined - rhythmic values. + An indication that two notes of the same pitch form a single note with their combined + rhythmic values. @@ -5657,9 +5701,9 @@ - + - + Must have one of the @@ -5668,7 +5712,7 @@ dur, dur.ges, endid, or tstamp2. - + The visual attributes of the tie (@bezier, @bulge, @curvedir, @lform, @@ -5677,11 +5721,11 @@ elements. - +

Most often, a tie is rendered as a curved line connecting the two notes. See Read, p. 110-111, 122.

-
A group of notes with "irregular" (sometimes called "irrational") rhythmic values, for - example, three notes in the time normally occupied by two or nine in the time of five. + A group of notes with "irregular" (sometimes called "irrational") rhythmic values, for + example, three notes in the time normally occupied by two or nine in the time of five. @@ -5689,9 +5733,9 @@ - + - +

The beam sub-element is allowed so that custom beaming may be indicated, e.g., a septuplet may be divided into a group of three plus a group of four notes. See Read, p. 187-215. The tuplet element may also used for @@ -5704,8 +5748,8 @@ tuplet, such as, '3' with an 8th-note triplet, '3:2' over a quarter-note triplet, etc. The rendering of the ratio, however, is dependent on the num.format attribute found in the att.vis.tuplet attribute class.

-
tuplet spanAlternative element for encoding tuplets, especially useful for tuplets - that extend across bar lines. + tuplet spanAlternative element for encoding tuplets, especially useful for tuplets + that extend across bar lines. @@ -5713,9 +5757,9 @@ - + - + Must have one of the @@ -5724,32 +5768,32 @@ dur, dur.ges, endid, or tstamp2. - +

The starting point of the tuplet may be indicated by either a startid, tstamp, tstamp.ges, or tstamp.real attribute, while the ending point may be recorded by either a dur, dur.ges, endid, or tstamp2 attribute. It is a semantic error not to specify one starting and one ending type of attribute.

- CMN ornam attribute values: A = appogiatura (upper neighbor); a = acciaccatura (lower + CMN ornam attribute values: A = appogiatura (upper neighbor); a = acciaccatura (lower neighbor); b = bebung; I = ascending slide; i = descending slide; k = delayed turn; K = 5-note turn; m = mordent (alternation with lower neighbor); M = inverted mordent (alternation with upper neighbor); N = Nachschlag (upper neighbor); n = Nachschlag (lower neighbor); S = turn; s = inverted turn; t = trill commencing on auxiliary note; T = trill commencing on principal note; O = generic / unspecified ornament. - + [A|a|b|I|i|K|k|M|m|N|n|S|s|T|t|O]|(A|a|S|s|K|k)?(T|t|M|m)(I|i|S|s)? - Logical domain attributes. - + Logical domain attributes. + - + Records semantic meaning, i.e., intended performance, of the mordent. The altsym, glyph.name, or glyph.num attributes may be used @@ -5776,11 +5820,11 @@ - Accidentals associated with ornaments. - + Accidentals associated with ornaments. + - + Records the written accidental associated with an upper neighboring note. @@ -5795,8 +5839,8 @@ - Attributes for marking the presence of an ornament. - + Attributes for marking the presence of an ornament. + ornament Indicates that this element has an attached ornament. If visual information about the @@ -5808,8 +5852,8 @@ - Logical domain attributes. - + Logical domain attributes. + @@ -5817,13 +5861,13 @@ - Logical domain attributes. - + Logical domain attributes. + - + When set to 'true', the turn begins on the second half of the beat. @@ -5845,13 +5889,13 @@ - Groups CMN ornament elements. - + Groups CMN ornament elements. + - An ornament indicating rapid alternation of the main note with a secondary note, usually a + An ornament indicating rapid alternation of the main note with a secondary note, usually a step below, but sometimes a step above. - + @@ -5859,21 +5903,21 @@ - + - + Must have one of the attributes: startid, tstamp, tstamp.ges or tstamp.real. - +

The starting point of the mordent may be indicated by either a startid, tstamp, tstamp.ges, or tstamp.real attribute. It is a semantic error not to specify one of these attributes.

-
Rapid alternation of a note with another (usually at the interval of a second - above). + Rapid alternation of a note with another (usually at the interval of a second + above). @@ -5881,16 +5925,16 @@ - + - + Must have one of the attributes: startid, tstamp, tstamp.ges or tstamp.real. - +

The interval between the main and auxiliary notes is usually understood to be diatonic unless altered by an accidental. The starting note of the trill; i.e., the written one or the ornamenting one, and the speed of alternation depends on performance practice. The @@ -5899,8 +5943,8 @@ ending point may be recorded by either a dur, dur.ges, endid, or tstamp2 attribute. It is a semantic error not to specify a starting point attribute.

-
An ornament consisting of four notes — the upper neighbor of the written note, the written - note, the lower neighbor, and the written note. + An ornament consisting of four notes — the upper neighbor of the written note, the written + note, the lower neighbor, and the written note. @@ -5908,39 +5952,39 @@ - + - + Must have one of the attributes: startid, tstamp, tstamp.ges or tstamp.real. - +

See Read, p. 246-247. Whether the turn is accented or unaccented may be inferred from the timestamp — accented turns occur directly on the affected beat, unaccented ones do not.

-
MEI corpusA group of related MEI documents, consisting of a header for the group, and - one or more mei elements, each with its own complete header. + MEI corpusA group of related MEI documents, consisting of a header for the group, and + one or more mei elements, each with its own complete header. - + - +

The model of this element is based on the teiCorpus element of the Text Encoding Initiative (TEI). The MEI instances making up the corpus may be related in a number of ways, for example, by composer, by similar instrumentation, by holding institution, etc. This element’s name should not be changed in order to assure an absolute minimum level of MEI compliance.

- Attributes common to all elements representing variant readings. - + Attributes common to all elements representing variant readings. + - + Classifies the cause for the variant reading, according to any appropriate typology of possible origins. @@ -5950,38 +5994,38 @@ - Logical domain attributes. + Logical domain attributes. - Groups elements that contain a critical apparatus entry. + Groups elements that contain a critical apparatus entry. - Groups elements that may appear as part of a textual or musical variant. + Groups elements that may appear as part of a textual or musical variant. - Groups elements that may appear as part of a musical variant. - + Groups elements that may appear as part of a musical variant. + - Groups elements that may appear as part of a textual variant. - + Groups elements that may appear as part of a textual variant. + - (apparatus) – Contains one or more alternative encodings. + (apparatus) – Contains one or more alternative encodings. - + - +

The alternatives provided in lem and/or rdg sub-elements may be thought of as exclusive or as parallel. The type attribute may contain any convenient descriptive word, describing the extent of the variation (e.g., note, phrase, measure, etc.), its text-critical significance (e.g., significant, accidental, unclear), or the nature of the variation or the principles required to understand it (e.g., lectio difficilior, usus auctoris, etc.).

-
+

The model of this element is based on the app element of the Text Encoding Initiative (TEI).

-
(lemma) – Contains the lemma, or base text, of a textual variation. + (lemma) – Contains the lemma, or base text, of a textual variation. @@ -5990,9 +6034,9 @@ - + - +

The lem element may also be used, under some circumstances, to record the base text of the source edition, to mark the readings of a base witness, to indicate the preference of an editor or encoder for a particular reading, or to make clear, in cases of @@ -6004,9 +6048,9 @@ permitted to occur within the parent of its own app ancestor. For example, when used as a descendent of verse, lem should only contain those elements allowed within verse.

-
+

The model of this element is based on the lem element of the Text Encoding Initiative (TEI).

-
(reading) – Contains a single reading within a textual variation. + (reading) – Contains a single reading within a textual variation. @@ -6015,41 +6059,41 @@ - + - +

Since a reading can be a multi-measure section, the scoreDef element is allowed so that a reading may have its own meta-data without incurring the overhead of child section elements. The app sub-element is permitted in order to allow nested sub-variants.

-
+

In no case should rdg contain elements that would not otherwise be permitted to occur within the parent of its own app ancestor. For example, when used as a descendent of verse, rdg should only contain those elements allowed within verse.

-
+

The model of this element is based on the rdg element of the Text Encoding Initiative (TEI).

- Logical domain attributes. - + Logical domain attributes. + - Logical domain attributes. - + Logical domain attributes. + - Groups elements containing stage directions in performance texts. - + Groups elements containing stage directions in performance texts. + - speechContains an individual speech in a performance text. + speechContains an individual speech in a performance text. @@ -6058,19 +6102,19 @@ - + - + Must have one of the attributes: startid, tstamp, tstamp.ges or tstamp.real. - + Must not have any of the attributes: startid, endid, tstamp, tstamp2, tstamp.ges, @@ -6078,14 +6122,14 @@ plist. - +

In a musical context sp must have a start-type attribute when it's not a descendant of sp. In a textual content sp must NOT have any musical attributes.

-
+

The model of this element is based on the sp element of the Text Encoding Initiative (TEI).

-
stage directionContains any kind of stage direction within a dramatic text or - fragment. + stage directionContains any kind of stage direction within a dramatic text or + fragment. @@ -6094,16 +6138,16 @@ - + - + Must have one of the attributes: startid, tstamp, tstamp.ges or tstamp.real. - + Must not have any of the attributes: startid, endid, tstamp, tstamp2, tstamp.ges, @@ -6111,14 +6155,14 @@ plist. - +

In a musical context stageDir must have a start-type attribute when it’s not a descendant of sp. In a textual content stageDir must NOT have any musical attributes.

-
+

The model of this element is based on the stage element of the Text Encoding Initiative (TEI).

- Attributes for the identification of a causative agent. - + Attributes for the identification of a causative agent. + Signifies the causative agent of damage, illegibility, or other loss of original text. @@ -6128,8 +6172,8 @@ - Logical domain attributes. - + Logical domain attributes. + @@ -6140,15 +6184,15 @@ - Attributes describing the nature of an encoded scholarly intervention or + Attributes describing the nature of an encoded scholarly intervention or interpretation. - + - Logical domain attributes. - + Logical domain attributes. + @@ -6156,8 +6200,8 @@ - Attributes that identify the reason why an editorial feature is used. - + Attributes that identify the reason why an editorial feature is used. + Holds a short phrase describing the reason for missing textual material (gap), why material is supplied (supplied), or why transcription is difficult (unclear). @@ -6167,65 +6211,65 @@ - Attributes for elements encoding authorial or scribal intervention when transcribing + Attributes for elements encoding authorial or scribal intervention when transcribing manuscript or similar sources. - + - Groups elements that may appear as part of the content of a choice element. + Groups elements that may appear as part of the content of a choice element. - Groups elements for editorial interventions that may be useful both in transcribing and in + Groups elements for editorial interventions that may be useful both in transcribing and in authoring processes. - + - Groups elements that may appear as part of editorial and transcription elements. + Groups elements that may appear as part of editorial and transcription elements. - Groups elements that may appear as part of editorial and transcription elements in music + Groups elements that may appear as part of editorial and transcription elements in music notation. - + - Groups elements that may appear as part of editorial and transcription elements in + Groups elements that may appear as part of editorial and transcription elements in prose. - + - Groups elements used for editorial transcription of pre-existing source materials. - + Groups elements used for editorial transcription of pre-existing source materials. + - abbreviationA generic element for 1) a shortened form of a word, including an acronym - or 2) a shorthand notation. + abbreviationA generic element for 1) a shortened form of a word, including an acronym + or 2) a shorthand notation. - + - + Records the expansion of a text abbreviation. - +

In no case should abbr contain elements that would not otherwise be permitted to occur within the parent of its own app ancestor. For example, when used as a descendent of verse, abbr should only contain those elements allowed within verse.

-
+

The model of this element is based on the abbr element of the Text Encoding Initiative (TEI) and the abbr element of the Encoded Archival Description (EAD).

-
additionMarks an addition to the text. + additionMarks an addition to the text. @@ -6233,14 +6277,14 @@ - + - + Location of the addition. - +

The add element contains material inserted by an author, scribe, annotator, or corrector. The agent responsible for the addition may be encoded using the hand attribute, while the resp attribute records the editor or @@ -6253,22 +6297,22 @@ permitted to occur within the parent of its own app ancestor. For example, when used as a descendent of verse, add should only contain those elements allowed within verse.

-
+

The model of this element is based on the add element of the Text Encoding Initiative (TEI).

-
Groups a number of alternative encodings for the same point in a text. + Groups a number of alternative encodings for the same point in a text. - + - +

Because the children of a choice element all represent alternative ways of encoding the same sequence, it is natural to think of them as mutually exclusive. However, there may be cases where a full representation of a text requires the alternative encodings to be considered as parallel. Note also that choice elements may be recursively nested.

-
+

The model of this element is based on the choice element of the Text Encoding Initiative (TEI).

-
correctionContains the correct form of an apparent erroneous passage. + correctionContains the correct form of an apparent erroneous passage. @@ -6276,9 +6320,9 @@ - + - +

The cert attribute signifies the degree of certainty ascribed to correction. The resp attribute contains an ID reference to an element containing the name of the editor or transcriber responsible for suggesting the correction held as the content of the @@ -6288,10 +6332,10 @@

In no case should corr contain elements that would not otherwise be permitted to occur within the parent of its own app ancestor. For example, when used as a descendent of verse, corr should only contain those elements allowed within verse.

-
+

The model of this element is based on the corr element of the Text Encoding Initiative (TEI).

-
copy/colla parte markA verbal or graphical indication to copy musical material - written elsewhere. + copy/colla parte markA verbal or graphical indication to copy musical material + written elsewhere. @@ -6299,9 +6343,9 @@ - + - + Must have one of the @@ -6310,19 +6354,19 @@ dur, dur.ges, endid, or tstamp2 - + a. b. c. d. e. f. g. - + unis: - + in 8va - +

Typical examples are colla parte instructions (such as "col Basso") or other indications intended to result in filling gaps in the score with material written elsewhere. It is recommended to capture the position of the indication itself with the @@ -6339,7 +6383,7 @@

Textual instructions are encoded as text content of the cpMark, while graphical instructions may use the altsym, facs, or extsym attributes.

-
Contains an area of damage to the physical medium. + Contains an area of damage to the physical medium. @@ -6347,21 +6391,21 @@ - + - + Records the degree of damage. - +

In no case should damage contain elements that would not otherwise be permitted to occur within the parent of its own app ancestor. For example, when used as a descendent of verse, damage should only contain those elements allowed within verse.

-
+

The model of this element is based on the damage element of the Text Encoding Initiative (TEI).

-
deletionContains information deleted, marked as deleted, or otherwise indicated as - superfluous or spurious in the copy text by an author, scribe, annotator, or corrector. + deletionContains information deleted, marked as deleted, or otherwise indicated as + superfluous or spurious in the copy text by an author, scribe, annotator, or corrector. @@ -6370,9 +6414,9 @@ - + - +

The resp attribute contains an ID reference to an element containing the name of the editor or transcriber responsible for identifying the hand of the deletion. The cert attribute signifies the degree of certainty ascribed to the identification @@ -6383,9 +6427,9 @@ permitted to occur within the parent of its own app ancestor. For example, when used as a descendent of verse, del should only contain those elements allowed within verse.

-
+

The model of this element is based on the del element of the Text Encoding Initiative (TEI).

-
expansionContains the expansion of an abbreviation. + expansionContains the expansion of an abbreviation. @@ -6393,32 +6437,32 @@ - + - + abbreviation Captures the abbreviated form of the text. - +

In no case should expan contain elements that would not otherwise be permitted to occur within the parent of its own app ancestor. For example, when used as a descendent of verse, expan should only contain those elements allowed within verse.

-
+

The model of this element is based on the expan element of the Text Encoding Initiative (TEI) and the expan element of the Encoded Archival Description (EAD).

-
Indicates a point where material has been omitted in a transcription, whether as part of - sampling practice or for editorial reasons described in the MEI header. + Indicates a point where material has been omitted in a transcription, whether as part of + sampling practice or for editorial reasons described in the MEI header. - + - +

When material is omitted because it is illegible or inaudible, unclear should be used instead. Similarly, use damage if the omission is due to damage and del if the omission is because the material is marked as deleted, or otherwise indicated as superfluous or spurious in the copy @@ -6433,29 +6477,29 @@ the deletion in the case of text omitted from the transcription because of deliberate deletion by an identifiable hand. The cert attribute signifies the degree of certainty ascribed to the identification of the extent of the missing material.

-
+

The model of this element is based on the gap element of the Text Encoding Initiative (TEI).

-
Marks the beginning of a passage written in a new hand, or of a change in the scribe, - writing style, ink or character of the document hand. + Marks the beginning of a passage written in a new hand, or of a change in the scribe, + writing style, ink or character of the document hand. - + - + Describes the character of the new hand. - + Identifies the new hand. The value must contain the ID of a hand element given elsewhere in the document. - + @new attribute should @@ -6465,13 +6509,13 @@ - + Identifies the old hand. The value must contain the ID of a hand element given elsewhere in the document. - + @old attribute should @@ -6481,7 +6525,7 @@ - +

The character attribute describes characteristics of the hand, particularly those related to the quality of the writing, e.g., shaky, thick, regular. A description of the tint or type of ink, e.g., brown or the writing medium, e.g., pencil, may be placed @@ -6491,11 +6535,11 @@ editor or transcriber responsible for identifying the change of hand. The cert attribute signifies the degree of certainty ascribed to the identification of the new hand.

-
+

The model of this element is based on the handShift element of the Text Encoding Initiative (TEI).

-
A graphical or textual statement with additional / explanatory information about the + A graphical or textual statement with additional / explanatory information about the musical text. The textual consequences of this intervention are encoded independently via - other means; that is, with elements such as add, del, etc. + other means; that is, with elements such as add, del, etc. @@ -6505,16 +6549,16 @@ - + - + Must have one of the attributes: startid, tstamp, tstamp.ges or tstamp.real - + Describes the purpose of the metaMark. @@ -6552,11 +6596,11 @@ clarification of the reading order of the musical text. - +

This element is used to encode explicit metatexts as defined by the Beethovens Werkstatt project.

-
originalContains material which is marked as following the original, rather than - being normalized or corrected. + originalContains material which is marked as following the original, rather than + being normalized or corrected. @@ -6564,9 +6608,9 @@ - + - +

This element will often be combined with a regularized form within a choice element. The editor(s) responsible for asserting that the material is original may be recorded in the resp attribute. The value of resp must point to one or more identifiers declared @@ -6575,10 +6619,10 @@

In no case should orig contain elements that would not otherwise be permitted to occur within the parent of its own app ancestor. For example, when used as a descendent of verse, orig should only contain those elements allowed within verse.

-
+

The model of this element is based on the orig element of the Text Encoding Initiative (TEI).

-
regularizationContains material which has been regularized or normalized in some - sense. + regularizationContains material which has been regularized or normalized in some + sense. @@ -6586,9 +6630,9 @@ - + - +

It is possible to identify the individual responsible for the regularization, and, using the choice and orig elements, to provide both original and regularized readings. The editor(s) responsible for asserting the regularized @@ -6599,10 +6643,10 @@ permitted to occur within the parent of its own app ancestor. For example, when used as a descendent of verse, reg should only contain those elements allowed within verse.

-
+

The model of this element is based on the reg element of the Text Encoding Initiative (TEI).

-
Indicates restoration of material to an earlier state by cancellation of an editorial or - authorial marking or instruction. + Indicates restoration of material to an earlier state by cancellation of an editorial or + authorial marking or instruction. @@ -6610,22 +6654,22 @@ - + - + description Provides a description of the means of restoration, stet or strike-down, for example. - +

In no case should restore contain elements that would not otherwise be permitted to occur within the parent of its own app ancestor. For example, when used as a descendent of verse, restore should only contain those elements allowed within verse.

-
+

The model of this element is based on the restore element of the Text Encoding Initiative (TEI).

-
Contains apparently incorrect or inaccurate material. + Contains apparently incorrect or inaccurate material. @@ -6633,28 +6677,28 @@ - + - +

A correction for the apparent error may be given in an accompanying child or sibling corr element.

In no case should sic contain elements that would not otherwise be permitted to occur within the parent of its own app ancestor. For example, when used as a descendent of verse, sic should only contain those elements allowed within verse.

-
+

The model of this element is based on the sic element of the Text Encoding Initiative (TEI).

-
substitutionGroups transcriptional elements when the combination is to be regarded as - a single intervention in the text. + substitutionGroups transcriptional elements when the combination is to be regarded as + a single intervention in the text. - + - +

The model of this element is based on the subst element of the Text Encoding Initiative (TEI).

-
Contains material supplied by the transcriber or editor for any reason. + Contains material supplied by the transcriber or editor for any reason. @@ -6663,9 +6707,9 @@ - + - +

When the presumed loss of text arises from an identifiable cause, agent signifies the causative agent. When the presumed loss of text arises from action (partial deletion, etc.) assignable to an identifiable hand, the hand attribute signifies the hand @@ -6680,10 +6724,10 @@

In no case should supplied contain elements that would not otherwise be permitted to occur within the parent of its own app ancestor. For example, when used as a descendent of verse, supplied should only contain those elements allowed within verse.

-
+

The model of this element is based on the supplied element of the Text Encoding Initiative (TEI).

-
Contains material that cannot be transcribed with certainty because it is illegible or - inaudible in the source. + Contains material that cannot be transcribed with certainty because it is illegible or + inaudible in the source. @@ -6694,9 +6738,9 @@ - + - +

Where the difficulty in transcription arises from an identifiable cause, the agent attribute signifies the causative agent. The cert attribute signifies the degree of certainty ascribed to the transcription of the text contained within @@ -6710,15 +6754,14 @@

In no case should unclear contain elements that would not otherwise be permitted to occur within the parent of its own app ancestor. For example, when used as a descendent of verse, unclear should only contain those elements allowed within verse.

-
+

The model of this element is based on the unclear element of the Text Encoding Initiative (TEI).

-
- Attributes used to associate MEI features with corresponding glyphs in an - externally-defined standard such as SMuFL. - + + Attributes that point to an external symbol authority. + A name or label associated with the controlled vocabulary from which the value of - glyph.name or glyph.num is taken. + glyph.name or glyph.num is taken, or the textual content of the element. @@ -6728,12 +6771,23 @@ + + The web-accessible location of the controlled vocabulary from which the value of + glyph.name or glyph.num is taken, or the textual content of the element. + + + + + + + Attributes that specify names or values taken from an external symbol authority. + Glyph name. - + @glyph.name attribute @@ -6748,7 +6802,7 @@ - + SMuFL version 1.18 uses the range U+E000 - U+ECBF. @@ -6756,24 +6810,24 @@ - - The web-accessible location of the controlled vocabulary from which the value of - glyph.name or glyph.num is taken. - - - - + + Attributes used to associate MEI features with corresponding glyphs in an + externally-defined standard such as SMuFL. + + + + - Attributes that associate a feature corresponding with all or part of an image. - + Attributes that associate a feature corresponding with all or part of an image. + facsimile Points to one or more images, portions of an image, or surfaces which correspond to the current element. - + @facs attribute should @@ -6785,15 +6839,15 @@ - Contains a representation of a written source in the form of a set of images rather than - as transcribed or encoded text. + Contains a representation of a written source in the form of a set of images rather than + as transcribed or encoded text. - + - +

The graphic element is provided within facsimile for association of the facsimile with graphic files capable of representing multiple pages, such as TIFF or PDF formats. When more than one graphic element is used, each must represent the same material. @@ -6801,41 +6855,41 @@ element for each page.

The decls attribute may be used to link the collection of images with a particular source described in the header.

-
+

The model of this element is based on the facsimile element of the Text Encoding Initiative (TEI).

-
Defines a writing surface in terms of a rectangular coordinate space, optionally grouping + Defines a writing surface in terms of a rectangular coordinate space, optionally grouping one or more graphic representations of that space, and rectangular zones of interest within - it. + it. - + - +

Scalable Vector Graphics (SVG) markup may be used when allowed by the graphicLike model.

The startid attribute may be used to hold a reference to the first feature occurring on this surface.

-
+

The model of this element is based on the surface element of the Text Encoding Initiative (TEI).

-
Defines an area of interest within a surface or graphic file. + Defines an area of interest within a surface or graphic file. - + - +

Scalable Vector Graphics (SVG) markup may be used when allowed by the graphicLike model.

The model of this element is based on the zone element of the Text Encoding Initiative (TEI).

- Attributes shared by table cells. - + Attributes shared by table cells. + The number of columns spanned by this cell. @@ -6850,49 +6904,49 @@ - Groups elements that provide a brief prose description of the appearance or content of a + Groups elements that provide a brief prose description of the appearance or content of a graphic figure. - Groups elements representing or containing graphic information such as an illustration or + Groups elements representing or containing graphic information such as an illustration or figure. - + - Groups elements that indicate the location of an inline graphic, illustration, or + Groups elements that indicate the location of an inline graphic, illustration, or figure. - Groups table-like elements. - + Groups table-like elements. + - figureGroups elements representing or containing graphic information such as an - illustration or figure. + figureGroups elements representing or containing graphic information such as an + illustration or figure. - + - +

The model of this element is based on the figure element of the Text Encoding Initiative (TEI).

-
figure descriptionContains a brief prose description of the appearance or content of - a graphic figure, for use when documenting an image without displaying it. + figure descriptionContains a brief prose description of the appearance or content of + a graphic figure, for use when documenting an image without displaying it. - + - +

Best practice suggests the use of controlled vocabulary for figure descriptions. Don't confuse this entity with a figure caption. A caption is text primarily intended for display with an illustration. It may or may not function as a description of the illustration.

-
+

The model of this element is based on the figDesc element of the Text Encoding Initiative (TEI).

-
Indicates the location of an inline graphic. + Indicates the location of an inline graphic. @@ -6902,9 +6956,9 @@ - + - + Graphic child of zone should not have @@ -6921,88 +6975,88 @@ attributes. - + Indicates the upper-left corner x coordinate. - + Indicates the upper-left corner y coordinate. - +

The model of this element is based on the graphic element of the Text Encoding Initiative (TEI).

-
Contains text displayed in tabular form. + Contains text displayed in tabular form. - + - +

The model of this element is based on the table element of the Encoded Archival Description (EAD), the table element of the Text Encoding Initiative (TEI), and the table element of HTML.

-
table dataDesignates a table cell that contains data as opposed to a cell that - contains column or row heading information. + table dataDesignates a table cell that contains data as opposed to a cell that + contains column or row heading information. - + - +

The colspan and rowspan attributes record tabular display rendering information.

-
+

The model of this element is based on the td element of HTML.

-
table headerDesignates a table cell containing column or row heading information as - opposed to one containing data. + table headerDesignates a table cell containing column or row heading information as + opposed to one containing data. - + - +

The colspan and rowspan attributes record tabular display rendering information.

-
+

The model of this element is based on the th element of HTML.

-
table rowA formatting element that contains one or more cells (intersection of a row - and a column) in a table. + table rowA formatting element that contains one or more cells (intersection of a row + and a column) in a table. - + - +

More precise rendition of the table and its cells can be specified in a style sheet.

-
+

The model of this element is based on the tr element of HTML.

- Logical domain attributes. - + Logical domain attributes. + - Logical domain attributes. - + Logical domain attributes. + - + @@ -7018,12 +7072,12 @@ - Groups elements that capture performance instructions regarding the use of the fingers of + Groups elements that capture performance instructions regarding the use of the fingers of the hand (or a subset of them). - + - finger – An individual finger in a fingering indication. + finger – An individual finger in a fingering indication. @@ -7031,16 +7085,16 @@ - + - + Must have one of the attributes: startid, tstamp, tstamp.ges or tstamp.real. - + @@ -7048,7 +7102,7 @@ descendant of fing. - (finger group)– A group of individual fingers in a fingering indication. + (finger group)– A group of individual fingers in a fingering indication. @@ -7056,16 +7110,16 @@ - + - + At least 2 fing or fingGrp elements are required. - + @@ -7080,8 +7134,8 @@ - Relationships between FRBR entities. - + Relationships between FRBR entities. + Target is an abridgement, condensation, or expurgation of the current entity. @@ -7210,18 +7264,18 @@ - Collects FRBR expression-like elements. + Collects FRBR expression-like elements. - Collects FRBR item-like elements. + Collects FRBR item-like elements. - Collects FRBR manifestation-like elements. - Intellectual or artistic realization of a work. + Collects FRBR manifestation-like elements. + Intellectual or artistic realization of a work. - + @@ -7243,16 +7297,16 @@ - +

The perfDuration element captures the intended duration of the expression, while extent records scope of the expression in other terms, such as number of pages, measures, etc.

-
Gathers bibliographic expression entities. + Gathers bibliographic expression entities. - + - Single instance or exemplar of a source/manifestation. + Single instance or exemplar of a source/manifestation. @@ -7260,7 +7314,7 @@ - + @@ -7272,12 +7326,12 @@ - Gathers bibliographic item entities. + Gathers bibliographic item entities. - + - A bibliographic description of a physical embodiment of an expression of a work. + A bibliographic description of a physical embodiment of an expression of a work. @@ -7287,7 +7341,7 @@ - + @@ -7304,46 +7358,46 @@ - + Item children are not permitted when @singleton equals "true". - + Availability is only permitted when @singleton equals "true". - + Indicates the manifestation is a unique physical object.

This attribute is inspired by the FRBRoo concept of manifestation singleton.

Manifestation singleton encompasses: manuscripts, preperatory sketches, and final clean drafts.

-
A container for the descriptions of physical embodiments of an expression of a - work. + A container for the descriptions of physical embodiments of an expression of a + work. - + - Gestural domain attributes. - + Gestural domain attributes. + - Attributes for capturing momentary pitch inflection in the gestural domain. - + Attributes for capturing momentary pitch inflection in the gestural domain. + Records the performed pitch inflection. - + The value of @accid.ges should @@ -7354,28 +7408,28 @@ - Gestural domain attributes. + Gestural domain attributes. - Gestural domain attributes. + Gestural domain attributes. - Gestural domain attributes. + Gestural domain attributes. - Gestural domain attributes. - + Gestural domain attributes. + - Gestural domain attributes. + Gestural domain attributes. - Gestural domain attributes. - + Gestural domain attributes. + - Attributes describing the method of performance. - + Attributes describing the method of performance. + Records performed articulation that differs from the written value. @@ -7384,28 +7438,28 @@ - Gestural domain attributes. - + Gestural domain attributes. + - Gestural domain attributes. + Gestural domain attributes. - Gestural domain attributes. + Gestural domain attributes. - Gestural domain attributes. - + Gestural domain attributes. + - Gestural domain attributes. + Gestural domain attributes. - Gestural domain attributes. - + Gestural domain attributes. + - + Records the amount of detuning. The decimal values should be rendered as a fraction (or an integer plus a fraction) along with the bend symbol. @@ -7415,59 +7469,59 @@ - Gestural domain attributes. - + Gestural domain attributes. + - Gestural domain attributes. - + Gestural domain attributes. + - Gestural domain attributes. - + Gestural domain attributes. + - Gestural domain attributes. - + Gestural domain attributes. + - Gestural domain attributes. - + Gestural domain attributes. + - Gestural domain attributes. + Gestural domain attributes. - Gestural domain attributes. - + Gestural domain attributes. + - Gestural domain attributes. + Gestural domain attributes. - Gestural domain attributes. + Gestural domain attributes. - Gestural domain attributes. - + Gestural domain attributes. + - Gestural domain attributes. + Gestural domain attributes. - Gestural domain attributes. + Gestural domain attributes. - Gestural domain attributes. - + Gestural domain attributes. + Indicates that the performance of the next musical division should begin immediately following this one. @@ -7477,21 +7531,21 @@ - Gestural domain attributes. - + Gestural domain attributes. + - Gestural domain attributes. + Gestural domain attributes. - Attributes that record performed duration that differs from a feature’s written + Attributes that record performed duration that differs from a feature’s written duration. - + Records performed duration information that differs from the written duration. - + @@ -7534,168 +7588,169 @@ - Gestural domain attributes. - + Gestural domain attributes. + - Gestural domain attributes. + Gestural domain attributes. - Gestural domain attributes. - + Gestural domain attributes. + - Gestural domain attributes. - + Gestural domain attributes. + - Gestural domain attributes. - + Gestural domain attributes. + - Gestural domain attributes. - + Gestural domain attributes. + - Gestural domain attributes. - + Gestural domain attributes. + - Gestural domain attributes. - + Gestural domain attributes. + - Gestural domain attributes. - + Gestural domain attributes. + - Gestural domain attributes. + Gestural domain attributes. - Gestural domain attributes. + Gestural domain attributes. - Gestural domain attributes. - + Gestural domain attributes. + - Gestural domain attributes. - + Gestural domain attributes. + - Gestural domain attributes. - + Gestural domain attributes. + - Gestural domain attributes. - + Gestural domain attributes. + - Gestural domain attributes. + Gestural domain attributes. - Gestural domain attributes. - + Gestural domain attributes. + - Gestural domain attributes. + Gestural domain attributes. - Gestural domain attributes. + Gestural domain attributes. - Gestural domain attributes. + Gestural domain attributes. - Gestural domain attributes. - + Gestural domain attributes. + - Gestural domain attributes. + Gestural domain attributes. - Attributes for describing the performed components of a line. - + Attributes for describing the performed components of a line. + - Gestural domain attributes. + Gestural domain attributes. - Gestural domain attributes. - + Gestural domain attributes. + - Gestural domain attributes. + Gestural domain attributes. - Gestural domain attributes. The tstamp.ges and tstamp.real attributes encode the onset + Gestural domain attributes. The tstamp.ges and tstamp.real attributes encode the onset time of the measure. In reality, this is usually the same as the onset time of the first event in the measure. - + - Gestural domain attributes. + Gestural domain attributes. - Gestural domain attributes. - + Gestural domain attributes. + + - Gestural domain attributes. + Gestural domain attributes. - Gestural domain attributes. + Gestural domain attributes. - Gestural domain attributes. + Gestural domain attributes. - Gestural domain attributes. + Gestural domain attributes. - Gestural domain attributes. + Gestural domain attributes. - Gestural domain attributes. - + Gestural domain attributes. + - Gestural domain attributes. + Gestural domain attributes. - Gestural domain attributes. + Gestural domain attributes. - Gestural domain attributes. - + Gestural domain attributes. + - Gestural domain attributes. - + Gestural domain attributes. + - Gestural domain attributes. + Gestural domain attributes. - Gestural domain attributes. - + Gestural domain attributes. + @@ -7703,7 +7758,7 @@ - + Records performed octave information that differs from the written value. @@ -7713,7 +7768,7 @@ Contains a performed pitch name that differs from the written value. - + @@ -7725,18 +7780,18 @@ - Gestural domain attributes. - + Gestural domain attributes. + - Gestural domain attributes. - + Gestural domain attributes. + - Gestural domain attributes. - + Gestural domain attributes. + @@ -7745,7 +7800,7 @@ - + When the @extremis attribute is used, @@ -7753,7 +7808,7 @@ - + Indicates an extreme, indefinite performed pitch. @@ -7781,7 +7836,7 @@ Contains a performed pitch name that differs from the written value. - + @@ -7793,22 +7848,22 @@ - Gestural domain attributes. - + Gestural domain attributes. + - Gestural domain attributes. + Gestural domain attributes. - Gestural domain attributes. - + Gestural domain attributes. + - Gestural accidentals associated with ornaments. - + Gestural accidentals associated with ornaments. + Records the sounding accidental associated with an upper neighboring note. @@ -7823,57 +7878,63 @@ - Gestural domain attributes. + Gestural domain attributes. - Gestural domain attributes. + Gestural domain attributes. - Gestural domain attributes. + Gestural domain attributes. - Gestural domain attributes. + Gestural domain attributes. - Gestural domain attributes. + Gestural domain attributes. - Gestural domain attributes. - + Gestural domain attributes. + - Gestural domain attributes. - + Gestural domain attributes. + - Gestural domain attributes that describe the properties of a plica in the mensural repertoire. + Gestural domain attributes that describe the properties of a plica in the mensural repertoire. - Gestural domain attributes. + Gestural domain attributes. - Gestural domain attributes. + Gestural domain attributes. - Gestural domain attributes. + Gestural domain attributes. - Gestural domain attributes. + Gestural domain attributes. - Gestural domain attributes. + Gestural domain attributes. + + Gestural domain attributes. + + + + - Gestural domain attributes. - + Gestural domain attributes. + - Gestural domain attributes. + Gestural domain attributes. - Gestural domain attributes. + Gestural domain attributes. - Gestural domain attributes for scoreDef. The values set in these attributes act as + Gestural domain attributes for scoreDef. The values set in these attributes act as score-wide defaults for attributes that are not set in descendant elements. For example, the grace attribute value here applies to all the grace attribute values in the score (or, more accurately, until the next scoreDef element) without having to individually set each note’s grace attribute value. The midi.* attributes function as default values when creating sounding output. The tune.* attributes provide the capability of recording a tuning reference pitch. - + @@ -7881,8 +7942,8 @@ - Gestural domain attributes. - + Gestural domain attributes. + Indicates that the performance of the next section should begin immediately following this one. @@ -7892,16 +7953,16 @@ - Gestural domain attributes. + Gestural domain attributes. - Gestural domain attributes. - + Gestural domain attributes. + - Attributes that locate a sound source within 3-D space. - + Attributes that locate a sound source within 3-D space. + The lateral or left-to-right plane. @@ -7924,58 +7985,58 @@ - Gestural domain attributes. - + Gestural domain attributes. + - Gestural domain attributes. - + Gestural domain attributes. + - Gestural domain attributes. + Gestural domain attributes. - Gestural domain attributes for staffDef in the CMN repertoire. - + Gestural domain attributes for staffDef in the CMN repertoire. + - Gestural domain attributes. - + Gestural domain attributes. + - Gestural domain attributes. - + Gestural domain attributes. + - Gestural domain attributes that describe the properties of a stem in the mensural repertoire. + Gestural domain attributes that describe the properties of a stem in the mensural repertoire. - Gestural domain attributes. + Gestural domain attributes. - Gestural domain attributes. + Gestural domain attributes. - Gestural domain attributes. + Gestural domain attributes. - Gestural domain attributes. + Gestural domain attributes. - Gestural domain attributes. - + Gestural domain attributes. + - Gestural domain attributes. - + Gestural domain attributes. + - Attributes that record a performed (as opposed to notated) time stamp. - + Attributes that record a performed (as opposed to notated) time stamp. + Encodes the onset time in terms of musical time, i.e., beats[.fractional beat part], as expressed in the written time signature. @@ -7991,9 +8052,9 @@ - Attributes that record a performed (as opposed to notated) time stamp for the end of an + Attributes that record a performed (as opposed to notated) time stamp for the end of an event. - + Encodes the ending point of an event, i.e., a count of measures plus a beat location in the ending measure. @@ -8009,57 +8070,57 @@ - Gestural domain attributes. - + Gestural domain attributes. + - Gestural domain attributes. - + Gestural domain attributes. + - Gestural domain attributes. - + Gestural domain attributes. + - Gestural domain attributes. + Gestural domain attributes. - Gestural domain attributes. + Gestural domain attributes. - Gestural domain attributes. + Gestural domain attributes. - Logical domain attributes. - + Logical domain attributes. + - Logical domain attributes. - + Logical domain attributes. + - Logical domain attributes. - + Logical domain attributes. + - Logical domain attributes. - + Logical domain attributes. + - + chord reference Contains a reference to a chordDef element elsewhere in the @@ -8067,7 +8128,7 @@ - + @chordref attribute @@ -8080,60 +8141,60 @@ - Groups elements that group playable chord definitions. + Groups elements that group playable chord definitions. - Groups harmonic elements that function as control events; that is, those events that + Groups harmonic elements that function as control events; that is, those events that modify or otherwise depend on the existence of notated events. - + - Groups elements that record figured bass. + Groups elements that record figured bass. - Groups elements that represent single figured bass elements. + Groups elements that represent single figured bass elements. - Groups elements that record indications of harmony. - + Groups elements that record indications of harmony. + - chord definitionChord tablature definition. + chord definitionChord tablature definition. - + - +

An xml:id attribute, while not required by the schema, is needed so that harm elements can reference a particular chord definition. The pos (position) attribute is provided in order to create displayable chord tablature grids. chordMember sub-elements record the individual pitches of the chord. barre sub-elements may be used when a single finger is used to stop multiple strings.

-
An individual pitch in a chord defined by a chordDef element. + An individual pitch in a chord defined by a chordDef element. - + - +

The string, fret, and fing attributes are provided in order to create displayable chord tablature grids. The inth (harmonic interval) attribute may be used to facilitate automated performance of a chord. It gives the number of 1/2 steps above the bass. Of course, for the bass note itself, inth should be set to 0.

-
Chord/tablature look-up table. + Chord/tablature look-up table. - + - +

A chordTable may be shared between MEI instances through the use of an external parsed entity containing the look-up table to be shared.

-
figureSingle element of a figured bass indication. + figureSingle element of a figured bass indication. @@ -8141,17 +8202,17 @@ - + - figured bassSymbols added to a bass line that indicate harmony. Used to improvise a - chordal accompaniment. Sometimes called Generalbass, thoroughbass, or basso continuo. + figured bassSymbols added to a bass line that indicate harmony. Used to improvise a + chordal accompaniment. Sometimes called Generalbass, thoroughbass, or basso continuo. - + - harmonyAn indication of harmony, e.g., chord names, tablature grids, harmonic - analysis, figured bass. + harmonyAn indication of harmony, e.g., chord names, tablature grids, harmonic + analysis, figured bass. @@ -8159,9 +8220,9 @@ - + - + Must have one of the @@ -8169,15 +8230,15 @@ - Groups elements that may appear as part of a description of the availability of and access + Groups elements that may appear as part of a description of the availability of and access to a bibliographic item. - + - Groups manifestation- and item-specific elements that may appear as part of a + Groups manifestation- and item-specific elements that may appear as part of a bibliographic description. - + @@ -8186,9 +8247,9 @@ - Attributes that link a bifolium element with a surface + Attributes that link a bifolium element with a surface element. - + A reference to a surface element positioned on the outer recto side of a (folded) sheet. @@ -8219,8 +8280,8 @@ - Attributes that link a folium element with a surface element. - + Attributes that link a folium element with a surface element. + A reference to a surface element positioned on the recto side of the sheet. @@ -8237,12 +8298,12 @@ - Attributes that define the characteristics and components of the performance resource. - + Attributes that define the characteristics and components of the performance resource. + - + Use this attribute to identify the performance resource as a soloist especially in an accompanied work, such as a concerto or vocal solo. @@ -8251,11 +8312,11 @@ - Attributes that define the characteristics and components of the performance resource or a performance resource list. - + Attributes that define the characteristics and components of the performance resource or a performance resource list. + - + Indicates the number of performers. @@ -8264,8 +8325,8 @@ - Attributes that describe a performance resource as ad libitum (optional). - + Attributes that describe a performance resource as ad libitum (optional). + Marks a performance resource as ad libitum (optional). @@ -8273,7 +8334,7 @@ - +

The technical term “ad libitum” has several meanings depending on the context in which it occurs:

@@ -8291,9 +8352,9 @@

Currently only the use within a performance resource (case 1) is supported.

- Attributes that define the characteristics and components of the bibliographic + Attributes that define the characteristics and components of the bibliographic description. - + @@ -8341,7 +8402,7 @@ - +

The recordtype attribute may be used to determine the appropriateness and validity of certain data elements in the description.

@@ -8410,8 +8471,8 @@

- Attributes that describe correction and normalization methods. - + Attributes that describe correction and normalization methods. + Indicates the method employed to mark corrections and normalizations. @@ -8425,190 +8486,190 @@ - Collects bifoliumlike elements. + Collects bifoliumlike elements. - Groups elements that may appear as part of a description of the editorial process applied + Groups elements that may appear as part of a description of the editorial process applied to the encoding of notation. - Groups elements that may be used to provide a structured description of an event. + Groups elements that may be used to provide a structured description of an event. - Collects foliumlike elements. + Collects foliumlike elements. - Groups elements that may appear as part of auxiliary material preceding or following the + Groups elements that may appear as part of auxiliary material preceding or following the text proper. - Groups elements dealing with modifications of document pages. + Groups elements dealing with modifications of document pages. - Groups elements that may appear as part of the physical description of a bibliographic + Groups elements that may appear as part of the physical description of a bibliographic item. - Groups elements that may appear as part of the publication statement for a bibliographic + Groups elements that may appear as part of the publication statement for a bibliographic item. - Groups elements that assist in the identification of a work. + Groups elements that assist in the identification of a work. - Collects work-like elements. - access restrictionDescribes the conditions that affect the accessibility of - material. + Collects work-like elements. + access restrictionDescribes the conditions that affect the accessibility of + material. - + - +

May indicate the nature of restrictions or the lack of restrictions. Do not confuse this element with useRestrict (usage restrictions), which captures information about limitations on the use of material, such as those afforded by copyright.

-
+

The model of this element is based on the accessrestrict element of the Encoded Archival Description (EAD).

-
Records information concerning the process by which an item was acquired by the holding - institution. + Records information concerning the process by which an item was acquired by the holding + institution. - + - +

The model of this element is based on the acquisition element of the Text Encoding Initiative (TEI).

-
alternative identifierMay contain a bibliographic identifier that does not fit within + alternative identifierMay contain a bibliographic identifier that does not fit within the meiHead element’s id attribute, for example because the identifier does not fit the - definition of an XML id or because multiple identifiers are needed. + definition of an XML id or because multiple identifiers are needed. - + - -

One or the other of altId or the id attribute on mei is required when applicable.

-
application informationGroups information about applications which have acted upon - the MEI file. + +

One or the other of altId or the xml:id attribute on mei is required when applicable.

+
application informationGroups information about applications which have acted upon + the MEI file. - + - +

The model of this element is based on the appInfo element of the Text Encoding Initiative (TEI).

-
Provides information about an application which has acted upon the current - document. + Provides information about an application which has acted upon the current + document. - + - + Supplies a version number for an application, independent of its identifier or display name. - +

The model of this element is based on the application element of the Text Encoding Initiative (TEI).

-
Documents the usage of a specific attribute of the element. + Documents the usage of a specific attribute of the element. - + - + @context attribute should contain an XPath expression. - + Name of the attribute. - + Circumstances in which the element appears, an XPath expression. - Defines the class of user for which the work is intended, as defined by age group (e.g., + Defines the class of user for which the work is intended, as defined by age group (e.g., children, young adults, adults, etc.), educational level (e.g., primary, secondary, etc.), or - other categorization. + other categorization. - + - Groups elements that describe the availability of and access to a bibliographic item, - including an MEI-encoded document. + Groups elements that describe the availability of and access to a bibliographic item, + including an MEI-encoded document. - + - +

When used within the fileDesc element, availability indicates access to the MEI-encoded document itself.

-
+

The model of this element is based on the availability element of the Text Encoding Initiative (TEI).

-
Describes a folded sheet of paper. + Describes a folded sheet of paper. - + - Contains the primary statement of responsibility given for a work on its title - page. + Contains the primary statement of responsibility given for a work on its title + page. - + - capture modeThe means used to record notation, sound, or images in the production of - a source/manifestation (e.g., analogue, acoustic, electric, digital, optical etc.). + capture modeThe means used to record notation, sound, or images in the production of + a source/manifestation (e.g., analogue, acoustic, electric, digital, optical etc.). - + - carrier formThe specific class of material to which the physical carrier of the + carrier formThe specific class of material to which the physical carrier of the source/manifestation belongs (e.g., sound cassette, videodisc, microfilm cartridge, transparency, etc.). The carrier for a manifestation comprising multiple physical components may include more than one form (e.g., a filmstrip with an accompanying booklet, a separate - sound disc carrying the sound track for a film, etc.). + sound disc carrying the sound track for a film, etc.). - + - Contains an individual descriptive category in a user-defined taxonomy, possibly nested - within a superordinate category. + Contains an individual descriptive category in a user-defined taxonomy, possibly nested + within a superordinate category. - + - + To be addressable, the category element must have an xml:id attribute. - category relationshipContains the name of a related category. + category relationshipContains the name of a related category. @@ -8616,10 +8677,10 @@ - + - + Provides a description of the relationship between the current and the target categories. @@ -8638,15 +8699,15 @@ label. - Individual change within the revision description. + Individual change within the revision description. - + - + The date of the change must be recorded in an @@ -8656,7 +8717,7 @@ element. - +

Additions, deletions, and significant recoding should be noted, but not correction of minor typographical errors. It is recommended that revisions should be entered in reverse chronological order, with the most recent change first. The @@ -8664,52 +8725,52 @@ person/entity responsible for change. The edition element can be used to designate an MEI encoding that has been so substantively changed that it constitutes a new version that supersedes earlier versions.

-
+

The model of this element is based on the respective element of the Encoded Archival Description (EAD).

-
change descriptionDescription of a revision of the MEI file. + change descriptionDescription of a revision of the MEI file. - + - Groups information which describes the nature or topic of an entity. + Groups information which describes the nature or topic of an entity. - + - +

Although the use of names and terms from locally controlled vocabularies is possible, best practice suggests that terms should come from standard national or international vocabularies whenever they are available in order to enable searches in systems that include multiple MEI documents, or MEI documents and bibliographic records from many institutions.

-
Groups information which describes the nature or topic of an entity. + Groups information which describes the nature or topic of an entity. - + - +

Although the use of names and terms from locally controlled vocabularies is possible, best practice suggests that terms should come from standard national or international vocabularies whenever they are available in order to enable searches in systems that include multiple MEI documents, or MEI documents and bibliographic records from many institutions.

-
Container for intellectual or physical component parts of a bibliographic entity. + Container for intellectual or physical component parts of a bibliographic entity. - + - + Only child elements of the same name as the parent of the componentList are allowed. - + When any child @@ -8717,7 +8778,7 @@ elements. - +

The child elements of this element are treated as components of the bibliographic entity containing the componentList. Although this is an implicit way of expressing FRBR’s hasPart and isPartOf relationships, it avoids this terminology in order to @@ -8727,46 +8788,46 @@ either source or itemcomponents as required to accommodate composite sources (those containing multiple sources) or multi-part sources (those made up of several physical items.

-
The physical condition of an item, particularly any variances between the physical make-up + The physical condition of an item, particularly any variances between the physical make-up of the item and that of other copies of the same item (e.g., missing pages or plates, - brittleness, faded images, etc.). + brittleness, faded images, etc.). - + - +

The model of this element is based on the respective element of the Encoded Archival Description (EAD).

-
Contains a single entry within a content description element. + Contains a single entry within a content description element. - + - List of the material contained within a resource. + List of the material contained within a resource. - + - + When labels are used, usually each content item has one. - + -

A suitable tone ; Left hand colouring ; Rhythm and accent ; Tempo ; +

A suitable tone ; Left hand coloring ; Rhythm and accent ; Tempo ; Flexibility ; Ornaments

-
+ Contents @@ -8778,36 +8839,36 @@ Couperin - + - +

Use this element to provide an enumeration of the contents of a bibliographic entity, like that often found in a table of contents. When a detailed bibliographic description of included material is desired, use the componentList element instead.

-
The historical, social, intellectual, artistic, or other context within which the work was + The historical, social, intellectual, artistic, or other context within which the work was originally conceived (e.g., the 17th century restoration of the monarchy in England, the aesthetic movement of the late 19th century, etc.) or the historical, social, intellectual, - artistic, or other context within which the expression was realized. + artistic, or other context within which the expression was realized. - + - States how and under what circumstances corrections have been made in the text. + States how and under what circumstances corrections have been made in the text. - + - + Indicates the degree of correction applied to the text. @@ -8823,9 +8884,9 @@ The correction status of the text is unknown. - +

The model of this element is based on the correction element of the Text Encoding Initiative (TEI).

-
A cutout is a section of a document sheet that has been removed and is now missing. + A cutout is a section of a document sheet that has been removed and is now missing. @@ -8833,9 +8894,9 @@ - + - + Describes the position of the cutout on the parent folium / bifolium. @@ -8857,7 +8918,7 @@ removed from verso side of folium. - + Describes the method of removing the cutout. @@ -8870,14 +8931,14 @@ section is ripped off the page, leaving a rough edge. - +

The dimensions (@width, @height) of the parent element (e.g., folium) indicate the size of the bounding box of the remaining part of the page. That is, if the complete lower half of a page has been cut, the @width and @height attributes describe the remaining upper half. If, in contrast, only the lower right quarter of the page has been cut, these attributes still indicate the size of the full page (assuming that the removed section was a regular rectangle).

-
+

The dimensions (@width, @height) on cutout itself are only to be used when there is a "gap" in the manuscript that allows to specify the dimensions of that missing part. In this case, the bounding box dimensions are given, together with @x and @y @@ -8885,62 +8946,62 @@ available by itself, then a corresponding folium (or bifolium) should be placed inside the cutout element, and should provide it’s own dimensions using @width and @height there. In this case, @width and @height on cutout is expendable.

-
Contains a dedicatory statement. + Contains a dedicatory statement. - + - +

This element uses a variant of the content model provided by macro.struc-unstrucContent.

-
domains declarationIndicates which domains are included in the encoding. + domains declarationIndicates which domains are included in the encoding. - + - + - + - edition statementContainer for meta-data pertaining to a particular edition of the - material being described. + edition statementContainer for meta-data pertaining to a particular edition of the + material being described. - + - +

The model of this element is based on the editionStmt element of the Text Encoding Initiative (TEI) and the editionstmt Encoded Archival Description (EAD).

-
editorial declarationUsed to provide details of editorial principles and practices - applied during the encoding of musical text. + editorial declarationUsed to provide details of editorial principles and practices + applied during the encoding of musical text. - + - +

The model of this element is based on the editorialDecl element of the Text Encoding Initiative (TEI).

-
encoding descriptionDocuments the relationship between an electronic file and the + encoding descriptionDocuments the relationship between an electronic file and the source or sources from which it was derived as well as applications used in the - encoding/editing process. + encoding/editing process. - + @@ -8949,37 +9010,37 @@ - +

The model of this element is based on the encodingDesc element of the Text Encoding Initiative (TEI).

-
exhibition historyA record of public exhibitions, including dates, venues, - etc. + exhibition historyA record of public exhibitions, including dates, venues, + etc. - + - +

The model of this element is based on the MARC 585 field.

-
extended metadataProvides a container element for non-MEI metadata formats. + extended metadataProvides a container element for non-MEI metadata formats. - + - file characteristicsStandards or schemes used to encode the file (e.g., ASCII, SGML, + file characteristicsStandards or schemes used to encode the file (e.g., ASCII, SGML, etc.), physical characteristics of the file (e.g., recording density, parity, blocking, etc.), - and other characteristics that have a bearing on how the file can be processed. + and other characteristics that have a bearing on how the file can be processed. - + - file descriptionContains a full bibliographic description of the MEI file. + file descriptionContains a full bibliographic description of the MEI file. - + @@ -8987,46 +9048,46 @@ - +

Extent in this context represents file size.

-
+

The model of this element is based on the fileDesc element of the Text Encoding Initiative (TEI) and the filedesc element of the Encoded Archival Description (EAD).

-
Describes the order of folia and bifolia making up the text block of a manuscript or - print. + Describes the order of folia and bifolia making up the text block of a manuscript or + print. - + - +

The purpose of foliaDesc is to transcribe the addition and removal of pages as part of physical modifications to a document. Missing pages may be indicated using the gap element. The folium and bifolium children describe the physical order of surface elements provided elsewhere.

-
Describes a single leaf of paper. + Describes a single leaf of paper. - + - +

When the exact folium setup can't be identified, it is advised to use folium elements only (and not guess about the presence of bifoliums in the document).

-
Defines a distinct scribe or handwriting style. + Defines a distinct scribe or handwriting style. - + - + Marks this hand as the first one of the document. - +

The initial attribute indicates whether this is the first or main hand of the document. The medium attribute describes the writing medium, e.g., pencil, or the tint or type of ink, e.g., brown. @@ -9035,58 +9096,58 @@ hand, particularly those related to the quality of the writing, such as shaky, thick, etc. may be described within the content of the hand element.

-
+

The model of this element is based on the handNote element of the Text Encoding Initiative (TEI).

-
Container for one or more hand elements. + Container for one or more hand elements. - + - + When labels are used, usually each hand has one. - +

The model of this element is based on the handNotes element of the Text Encoding Initiative (TEI).

-
Provides a container for information about the history of a resource other than the - circumstances of its creation. + Provides a container for information about the history of a resource other than the + circumstances of its creation. - + - + The elements acquisition, provenance, exhibHist, treatHist and treatSched are not permitted at the work or expression level and are only permitted at the manifestation level, if the manifestation is a manifestation singleton. - +

To facilitate efficient data interchange, basic information about the circumstances surrounding the creation of bibliographic resources should be recorded within the creation element, while the record of ownership and custody should be captured within the history element.

-
Incipit coded in a non-XML, plain text format, such as Plaine & Easie Code. + Incipit coded in a non-XML, plain text format, such as Plaine & Easie Code. - + - + incipCode must have a form or mimetype attribute. - + Form of the encoded incipit. @@ -9096,86 +9157,86 @@ Plaine & Easie Code. - Humdrum Kern format. + **kern representation of the Humdrum format. Parsons code. - Opening words of a musical composition. + Opening words of a musical composition. - + - An inscription added to an item, such as a bookplate, a note designating the item as a - gift, and/or the author’s signature. + An inscription added to an item, such as a bookplate, a note designating the item as a + gift, and/or the author’s signature. - + - Describes the scope of any analytic or interpretive information added to the transcription - of the music. + Describes the scope of any analytic or interpretive information added to the transcription + of the music. - + - +

The model of this element is based on the interpretation element of the Text Encoding Initiative (TEI).

-
Key captures information about tonal center and mode. + Key captures information about tonal center and mode. - + - + Indicates major, minor, or other tonality. - +

This element is used exclusively within bibliographic descriptions. Do not confuse this element with keySig, which is used within the body of an MEI file to record this data.

-
Description of a language used in the document. + Description of a language used in the document. - + - +

A textual element may be related to this element by setting its xml:lang attribute, which normally takes the form of a code drawn from a coded list, such as ISO639-2b, to the same value as this element’s codedval attribute. The name and web location of the authorizing list may be encoded in the auth attribute and the auth.uri attribute, respectively.

-
+

The model of this element is based on the language element of the Text Encoding Initiative (TEI) and the language element of the Encoded Archival Description (EAD).

-
language usageGroups elements describing the languages, sub-languages, dialects, - etc., represented within the encoded resource. + language usageGroups elements describing the languages, sub-languages, dialects, + etc., represented within the encoded resource. - + - +

The model of this element is based on the langUsage element of the Text Encoding Initiative (TEI).

-
MEI headerSupplies the descriptive and declarative metadata prefixed to every - MEI-conformant text. + MEI headerSupplies the descriptive and declarative metadata prefixed to every + MEI-conformant text. @@ -9183,7 +9244,7 @@ - + @@ -9191,7 +9252,7 @@ - + The meiHead type attribute can have the value 'music' @@ -9206,7 +9267,7 @@ 'independent' only when the document element is "meiHead". - + Specifies the kind of document to which the header is attached, for example whether it is a corpus or individual text. @@ -9221,7 +9282,7 @@ document. - +

In order to encourage uniformity in the provision of metadata across document types, this element is modelled on an element in the Text Encoding Initiative (TEI) standard. This information is often essential in a machine-readable environment. Five sub-elements must be @@ -9231,84 +9292,84 @@ information about the creation of the work being encoded, and statements regarding significant revisions of the file. The xml:lang attribute may be used to indicate the language in which the metadata content of the header is provided.

-
Captures information about mensuration within bibliographic descriptions. + Captures information about mensuration within bibliographic descriptions. - + - Captures information about the time signature within bibliographic descriptions. + Captures information about the time signature within bibliographic descriptions. - + - +

This element is used exclusively within bibliographic descriptions. Do not confuse meter with the meterSig or meterSigGrp or attributes used by staffDef and scoreDef to record this data within the body of an MEI file.

-
Supplies the formal name of the namespace to which the elements documented by its children - belong. + Supplies the formal name of the namespace to which the elements documented by its children + belong. - + - + Formal namespace identifier; that is, a uniform resource identifier (URI). - + Prefix associated with the formal identifier. - +

The model of this element is based on the namespace element of the Text Encoding Initiative (TEI).

-
Indicates the extent of normalization or regularization of the original source carried out - in converting it to electronic form. + Indicates the extent of normalization or regularization of the original source carried out + in converting it to electronic form. - + - +

The model of this element is based on the normalization element of the Text Encoding Initiative (TEI).

-
(notes statement)– Collects any notes providing information about a text additional to - that recorded in other parts of the bibliographic description. + (notes statement)– Collects any notes providing information about a text additional to + that recorded in other parts of the bibliographic description. - + - +

The model of this element is based on the notesStmt element of the Text Encoding Initiative (TEI).

-
other distinguishing characteristicAny characteristic that serves to differentiate a - work or expression from another. + other distinguishing characteristicAny characteristic that serves to differentiate a + work or expression from another. - + - Describes a physical writing surface attached to the original document. + Describes a physical writing surface attached to the original document. - + - + The allowed positions of a patch depend on its parent element. @@ -9316,7 +9377,7 @@ or a bifolium element. - + Describes the position of the patch on the parent folium / bifolium. @@ -9338,7 +9399,7 @@ patch attached to verso side of folium. - + Describes the method of attachment of the patch. @@ -9360,12 +9421,12 @@ patch is attached on surface beneath using a staple. - +

A patch must always contain a folium or bifolium element. The @x and @y attributes are used to position the patch on its parent surface by indicating the upper left corner of the patch. The size of the patch is encoded using the @height and @width attributes on the child folium (or bifolium).

-
performance durationUsed to express the duration of performance of printed or - manuscript music or the playing time for a sound recording, videorecording, etc. + performance durationUsed to express the duration of performance of printed or + manuscript music or the playing time for a sound recording, videorecording, etc. @@ -9373,117 +9434,117 @@ - + - + Holds a W3C duration value, e.g., "PT2H34M45.67S". - +

- performance mediumIndicates the number and character of the performing forces used in - a musical composition. + performance mediumIndicates the number and character of the performing forces used in + a musical composition. - + - +

Arrangements are coded for the medium of the work being described, not for the original medium.

-
performance resourceName of an instrument on which a performer plays, a performer's - voice range, or a standard performing ensemble designation. + performance resourceName of an instrument on which a performer plays, a performer's + voice range, or a standard performing ensemble designation. - + - +

In the context of a performance resource the attribute adlib marks a resource as optional.

-
+

To indicate the tuning of an instrument, the attribute trans.diat can be used.

-
Several instrumental or vocal resources treated as a group. + Several instrumental or vocal resources treated as a group. - + - +

The function of instrumentalists or vocalists is represented by the choice of perfRes and perfResList child elements. Arrangements are coded for the medium of the work being described, not for the original medium.

-
physical descriptionContainer for information about the appearance, construction, or + physical descriptionContainer for information about the appearance, construction, or handling of physical materials, such as their dimension, quantity, color, style, and technique - of creation. + of creation. - + - +

Dedicatory text and title page features may also be encoded here when they are not transcribed as part of the front or back matter; i.e., when they are considered to be meta-data rather than a transcription.

-
+

The model of this element is based on the physdesc element of the Encoded Archival Description (EAD).

-
physical mediumRecords the physical materials used in the source, such as ink and - paper. + physical mediumRecords the physical materials used in the source, such as ink and + paper. - + - +

All materials may be described in a single physMedium element or multiple elements may be used, one for each medium.

-
+

The model of this element is based on respective elements of the Encoded Archival Description (EAD). It has the same function as the material element of the Text Encoding Initiative (TEI).

-
plate numberDesignation assigned to a resource by a music publisher, usually printed - at the bottom of each page, and sometimes appearing also on the title page. + plate numberDesignation assigned to a resource by a music publisher, usually printed + at the bottom of each page, and sometimes appearing also on the title page. - + - +

While it is often called a "plate number", it does not always contain numbers. The facs attribute may be used to record the location of the plate number in a facsimile image.

-
Playing speed for a sound recording is the speed at which the carrier must be operated to - produce the sound intended (e.g., 33 1/3 rpm, 19 cm/s, etc.). + Playing speed for a sound recording is the speed at which the carrier must be operated to + produce the sound intended (e.g., 33 1/3 rpm, 19 cm/s, etc.). - + - The cost of access to a bibliographic item. + The cost of access to a bibliographic item. - + - + Numeric value capturing a cost. Can only be interpreted in combination with the currency attribute. @@ -9491,130 +9552,130 @@ [0-9]+\.[0-9]{2} - + Monetary unit. - +

Best practice suggests the use of controlled vocabulary for the currency attribute, such as the ISO 4217 list of currency designators.

-
project descriptionProject-level meta-data describing the aim or purpose for which + project descriptionProject-level meta-data describing the aim or purpose for which the electronic file was encoded, funding agencies, etc. together with any other relevant - information concerning the process by which it was assembled or collected. + information concerning the process by which it was assembled or collected. - + - +

The model of this element is based on the projectDesc element of the Text Encoding Initiative (TEI).

-
The record of ownership or custodianship of an item. + The record of ownership or custodianship of an item. - + - +

The model of this element is based on the respective element of the Encoded Archival Description (EAD) and the provenance element of the Text Encoding Initiative (TEI).

-
publication statementContainer for information regarding the publication or + publication statementContainer for information regarding the publication or distribution of a bibliographic item, including the publisher’s name and address, the date of - publication, and other relevant details. + publication, and other relevant details. - + - +

When an item is unpublished, use only the unpub sub-element.

-
+

The model of this element is based on the publicationStmt element of the Text Encoding Initiative (TEI).

-
revision descriptionContainer for information about alterations that have been made - to an MEI file. + revision descriptionContainer for information about alterations that have been made + to an MEI file. - + - +

It is recommended that changes be recorded in reverse chronological order, with the most recent alteration first.

-
+

The model of this element is based on the revisionDesc element of the Text Encoding Initiative (TEI).

-
sampling declarationContains a prose description of the rationale and methods used in - sampling texts in the creation of a corpus or collection. + sampling declarationContains a prose description of the rationale and methods used in + sampling texts in the creation of a corpus or collection. - + - +

The model of this element is based on the samplingDecl element of the Text Encoding Initiative (TEI).

-
Describes the type of score used to represent a musical composition (e.g., short score, - full score, condensed score, close score, etc.). + Describes the type of score used to represent a musical composition (e.g., short score, + full score, condensed score, close score, etc.). - + - Describes the principles according to which the musical text has been segmented, for - example into movements, sections, etc. + Describes the principles according to which the musical text has been segmented, for + example into movements, sections, etc. - + - +

The model of this element is based on the segmentation element of the Text Encoding Initiative (TEI).

-
series statementGroups information about the series, if any, to which a publication - belongs. + series statementGroups information about the series, if any, to which a publication + belongs. - + - +

The title sub-element records the series title, the respStmt element records the person or group responsible for the series, and the identifier element contains a series identifier. The contents element should be used when it is necessary to enumerate the content of the series, but not describe each component. The seriesStmt element is provided within seriesStmt for the description of a sub-series.

-
+

The model of this element is based on the seriesStmt element of the Text Encoding Initiative (TEI).

-
sound channelsReflects the number of apparent sound channels in the playback of a - recording (monaural, stereophonic, quadraphonic, etc.). + sound channelsReflects the number of apparent sound channels in the playback of a + recording (monaural, stereophonic, quadraphonic, etc.). - + - + Records the channel configuration in numeric form. - +

The number of apparent playback channels can differ from the number of physical channels of the recording medium, i.e., 2-track monophonic recordings. In this example, the soundChan element should record the fact that there is a single output channel, while the trackConfig element should capture the existence of two physical tracks. This element is analogous to MARC field 344 subfield g.

-
A bibliographic description of a source used in the creation of the electronic - file. + A bibliographic description of a source used in the creation of the electronic + file. @@ -9623,11 +9684,11 @@ - + - + @target attribute should @@ -9636,223 +9697,230 @@ manifestation element or be an external URI. - +

This element contains, or references via its target attribute, a description of a source used in the creation of the electronic file. For description of a physical embodiment of an expression of a work use the manifestation element.

The data attribute may be used to reference one or more musical features found in the content of this particular source.

-
+

The model of this element is based on the source element of the Text Encoding Initiative (TEI) and the source element of the Encoded Archival Description (EAD).

-
source descriptionA container for the descriptions of the source(s) used in the - creation of the electronic file. + source descriptionA container for the descriptions of the source(s) used in the + creation of the electronic file. - + - +

This element is recommended where the MEI file is a transcription of existing music, but is not required when the data is originally created in MEI form.

-
special reproduction characteristicThe equalization system, noise reduction system, - etc. used in making the recording (e.g., NAB, DBX, Dolby, etc.). + special reproduction characteristicThe equalization system, noise reduction system, + etc. used in making the recording (e.g., NAB, DBX, Dolby, etc.). - + - standard valuesSpecifies the format used when standardized date or number values are - supplied. + standard valuesSpecifies the format used when standardized date or number values are + supplied. - + - +

The model of this element is based on the stdVals element of the Text Encoding Initiative (TEI).

-
system requirementsSystem requirements for using the electronic item. + system requirementsSystem requirements for using the electronic item. - + - tagging declarationProvides detailed information about the tagging applied to a - document. + tagging declarationProvides detailed information about the tagging applied to a + document. - + - +

The model of this element is based on the tagsDecl element of the Text Encoding Initiative (TEI).

-
Documents the usage of a specific element within the document. + Documents the usage of a specific element within the document. - + - + @context attribute should contain an XPath expression. - + Name of the element. - + Circumstances in which the element appears, an XPath expression. - + Number of occurrences in the defined context. - + Number of occurrences in the defined context that have an xml:id attribute. - +

The model of this element is based on the tagUsage element of the Text Encoding Initiative (TEI).

-
Defines a typology either implicitly, by means of a bibliographic citation, or explicitly - by a structured taxonomy. + Defines a typology either implicitly, by means of a bibliographic citation, or explicitly + by a structured taxonomy. - + - Collection of text phrases which describe a resource. + Collection of text phrases which describe a resource. - + - + When labels are used, usually each term has one. - +

An external taxonomy from which all the descendant term elements are drawn may be referred to using the target attribute.

-
title statementContainer for title and responsibility meta-data. + title statementContainer for title and responsibility meta-data. - + - +

The model of this element is based on the titleStmt element of the Text Encoding Initiative (TEI).

-
track configurationNumber of physical/input tracks on a sound medium (e.g., eight - track, twelve track). + track configurationNumber of physical/input tracks on a sound medium (e.g., eight + track, twelve track). - + - + Records the track configuration in numeric form. - +

The number of apparent playback channels can differ from the number of physical channels of the recording medium, i.e., 2-track monophonic recordings. In this example, the trackConfig element should record the fact that there are two physical tracks on the sound medium, while the soundChan element should be used to state that there is a single output channel. This element may be mapped to MARC field 344 subfield e or subfield f as appropriate.

-
treatment historyA record of the treatment the item has undergone (e.g., - de-acidification, restoration, etc.). + treatment historyA record of the treatment the item has undergone (e.g., + de-acidification, restoration, etc.). - + - +

Treatment history may also comprise details of the treatment process (e.g., chemical solutions used, techniques applied, etc.), the date the treatment was applied, etc.

-
+

The model of this element is based on the respective element of the Encoded Archival Description (EAD).

-
treatment scheduledScheduled treatment, e.g., de-acidification, restoration, etc., for - an item. + treatment scheduledScheduled treatment, e.g., de-acidification, restoration, etc., for + an item. - + - +

The model of this element is based on the respective element of the Encoded Archival Description (EAD).

-
unpublishedUsed to explicitly indicate that a bibliographic resource is - unpublished. + unpublishedUsed to explicitly indicate that a bibliographic resource is + unpublished. - + - +

A short phrase indicating the nature of or the reason for the unpublished status may be given as the element’s content.

-
usage restrictionsContainer for information about the conditions that affect use of a - bibliographic item after access has been granted. + usage restrictionsContainer for information about the conditions that affect use of a + bibliographic item after access has been granted. - + - +

useRestrict may indicate limitations imposed by an owner, repository, or legal statute (for example, copyright law) regarding the reproduction, publication, or quotation of the item. It may also indicate the absence of restrictions, such as when rights have been ceded to the public domain. Do not confuse this element with the accessRestrict element, which holds information about conditions affecting the availability of the material.

-
+

The model of this element is based on the userestrict element of the Encoded Archival Description (EAD).

-
Contains a description of a watermark or similar device. + Contains a description of a watermark or similar device. - + - + + + + The watermark element may only appear as a + descendant of the physDesc element. + + +

The facs attribute may be used to record the location of the watermark in a facsimile image.

-
+

The model of this element is based on the watermark element of the Text Encoding Initiative (TEI).

-
Provides a detailed description of a work — a distinct intellectual or artistic creation — + Provides a detailed description of a work — a distinct intellectual or artistic creation — specifically its history, language use, and high-level musical attributes (e.g., key, tempo, - meter, medium of performance, and intended duration). + meter, medium of performance, and intended duration). @@ -9860,7 +9928,7 @@ - + @@ -9882,41 +9950,41 @@ - +

The perfDuration element captures the intended duration of the work.

-
work listGrouping mechanism for information describing non-bibliographic aspects of a - text. + work listGrouping mechanism for information describing non-bibliographic aspects of a + text. - + - Logical domain attributes. - + Logical domain attributes. + - Logical domain attributes. The n attribute should be used for verse numbers. Numbers need + Logical domain attributes. The n attribute should be used for verse numbers. Numbers need not be consecutive; they may also be expressed as ranges, e.g., 2-3,6. - Logical domain attributes. The n attribute should be used for verse numbers. Numbers need + Logical domain attributes. The n attribute should be used for verse numbers. Numbers need not be consecutive; they may also be expressed as ranges, e.g., 2-3,6. - Logical domain attributes. The n attribute should be used for repetition numbers. Numbers + Logical domain attributes. The n attribute should be used for repetition numbers. Numbers need not be consecutive; they may also be expressed as ranges, e.g., 2-3,6. - Groups elements that contain a lyric verse. - + Groups elements that contain a lyric verse. + - Recurring lyrics, especially at the end of each verse or stanza of a poem or song lyrics; - a chorus. + Recurring lyrics, especially at the end of each verse or stanza of a poem or song lyrics; + a chorus. @@ -9925,16 +9993,16 @@ - + - +

The lb element is allowed here in order to facilitate karaoke applications. The func attribute on lb may be used to distinguish true line endings from those of line groups for these applications.

-
Division of a poem or song lyrics, sometimes having a fixed length, meter or rhyme scheme; - a stanza. + Division of a poem or song lyrics, sometimes having a fixed length, meter or rhyme scheme; + a stanza. @@ -9943,17 +10011,17 @@ - + - +

The lb element is allowed here in order to facilitate karaoke applications. The func attribute on lb may be used to distinguish true line endings from those of line groups for these applications.

-
Sung text for a specific iteration of a repeated section of music. + Sung text for a specific iteration of a repeated section of music. @@ -9963,16 +10031,16 @@ - + - +

The volta element is intended for those cases where the musical notation is repeated, but the accompanying lyrics are not.

- Logical, that is, written, note-shape (or note symbol) attribute values for the mensural repertoire. - + Logical, that is, written, note-shape (or note symbol) attribute values for the mensural repertoire. + Two or three times as long as a longa. @@ -10001,8 +10069,8 @@ - Logical, that is, written, duration attribute values for multi-breve rests in the mensural repertoire. - + Logical, that is, written, duration attribute values for multi-breve rests in the mensural repertoire. + A two-breve rest. @@ -10013,13 +10081,13 @@ - Logical, that is, written, duration attribute values for mensural rests. - + Logical, that is, written, duration attribute values for mensural rests. + - Duration attribute values of a given note symbol for the mensural repertoire. - + Duration attribute values of a given note symbol for the mensural repertoire. + Three times the duration of the note in the next smaller degree. @@ -10042,8 +10110,8 @@ - Form of the flag. - + Form of the flag. + Flag is a straight horizontal line. @@ -10065,15 +10133,15 @@ - +

- Position of the flag relative to the stem. - + Position of the flag relative to the stem. + Flag lies at the left side of the stem. @@ -10087,8 +10155,8 @@ - Items in the Mensural repertoire that may be printed near a staff. - + Items in the Mensural repertoire that may be printed near a staff. + Ligatures. @@ -10096,8 +10164,8 @@ - Form of the stem attached to the note. - + Form of the stem attached to the note. + Stem has a circular form. @@ -10114,8 +10182,8 @@ - Attribute that expresses duration for a given mensural note symbol. - + Attribute that expresses duration for a given mensural note symbol. + @@ -10124,7 +10192,7 @@ - + @@ -10133,7 +10201,7 @@ - + Encodes the durational quality of a mensural note using the values provided by the data.DURQUALITY.mensural datatype (i.e., the perfect / imperfect / altered / major / minor / duplex quality of a note). @@ -10142,9 +10210,9 @@ - Logical domain attributes. + Logical domain attributes. - Used by staffDef and scoreDef to provide default values for attributes in the logical + Used by staffDef and scoreDef to provide default values for attributes in the logical domain related to mensuration. The tempus, prolatio, modusmaior, and modusminor attributes (from the att.mensural.shared class) specify the relationship between the four principle levels of note value, i.e., the long, breve, semibreve and minim, in mensural notation. @@ -10152,10 +10220,10 @@ and prolatio the semibreve-minim relationship, respectively. Modusmaior is for the maxima-long relationship. The proport.* attributes describe augmentation or diminution of the normal value of the notes in mensural notation. - + - + Together, proport.num and proport.numbase specify a proportional change as a ratio, e.g., 1:3. Proport.num is for the first value in the ratio. @@ -10172,8 +10240,8 @@ - Shared attributes in the mensural repertoire. - + Shared attributes in the mensural repertoire. + @@ -10182,7 +10250,7 @@ - + Describes the maxima-long relationship. @@ -10215,17 +10283,17 @@ - Analytical domain attributes in the Mensural repertoire. + Analytical domain attributes in the Mensural repertoire. - Gestural domain attributes in the Mensural repertoire. - + Gestural domain attributes in the Mensural repertoire. + - Logical domain attributes in the Mensural repertoire. + Logical domain attributes in the Mensural repertoire. - Visual domain attributes in the Mensural repertoire. - + Visual domain attributes in the Mensural repertoire. + Indicates this element’s participation in a ligature. @@ -10234,21 +10302,21 @@ - Logical domain attributes that describe the properties of a plica in the mensural repertoire. + Logical domain attributes that describe the properties of a plica in the mensural repertoire. - Logical domain attributes. These attributes describe augmentation or diminution of the + Logical domain attributes. These attributes describe augmentation or diminution of the normal value of the notes in mensural notation as a ratio. - + - Gestural domain attributes. - + Gestural domain attributes. + - Visual domain attributes. - + Visual domain attributes. + States how many spaces are covered by the rest. @@ -10257,32 +10325,32 @@ - Logical domain attributes for a score in the mensural repertoire. The values set in these + Logical domain attributes for a score in the mensural repertoire. The values set in these attributes act as score-wide defaults for attributes that are not set in descendant elements. - + - Visual domain attributes for scoreDef in the mensural repertoire. - + Visual domain attributes for scoreDef in the mensural repertoire. + - Logical domain attributes for staffDef in the mensural repertoire. - + Logical domain attributes for staffDef in the mensural repertoire. + - Visual domain attributes for the mensural repertoire. - + Visual domain attributes for the mensural repertoire. + - Logical domain attributes that describe the properties of a stem in the mensural repertoire. + Logical domain attributes that describe the properties of a stem in the mensural repertoire. - Attributes that describe the properties of stemmed features specific to mensural repertoires. - + Attributes that describe the properties of stemmed features specific to mensural repertoires. + Records the form of the stem. @@ -10291,27 +10359,27 @@ - Groups event elements that occur in the mensural repertoire. - + Groups event elements that occur in the mensural repertoire. + - Groups notated events that may appear at the layer level in the mensural + Groups notated events that may appear at the layer level in the mensural repertoire. - + - Groups elements that may appear in the declaration of staff features. - + Groups elements that may appear in the declaration of staff features. + - Groups elements that are components of a staff in the mensural repertoire. - + Groups elements that are components of a staff in the mensural repertoire. + - A mensural notation symbol that combines two or more notes into a single sign. + A mensural notation symbol that combines two or more notes into a single sign. @@ -10319,17 +10387,17 @@ - + - +

The rhythmic meaning of the components of a ligature is typically contextual, not absolute; therefore, an interpretative duration may be encoded on each of the components using either the dur.ges attribute or the num and numbase attribute pair. The ligature element should not be used for brackets in modern notation that indicate notes that were part of a ligature in the original source.

-
mensurationCollects information about the metrical relationship between a note value - and the next smaller value; that is, either triple or duple. + mensurationCollects information about the metrical relationship between a note value + and the next smaller value; that is, either triple or duple. @@ -10338,26 +10406,26 @@ - + - +

The mensur element is provided for the encoding of mensural notation. The slash attribute indicates the number lines added to the mensuration sign. For example, one slash is added for what we now call 'alla breve'.

-
Plica + Plica - + Only one plica is allowed. - proportionDescription of note duration as arithmetic ratio. + proportionDescription of note duration as arithmetic ratio. @@ -10366,37 +10434,37 @@ - + - +

The proport element is provided for the encoding of mensural notation. It allows the description of note durations as arithmetic ratios. While mensuration refers to the normal relationships between note durations, proportion affects the relations of the note durations to the tactus.

-
A stem element. + A stem element. - + - + A note with nested stem elements must not have @stem.* attributes. - +

Mensural notes can have multiple stems and these may have various forms, directions, and types of flags. Multiple stem elements can be encoded as children of a single note. The attributes pos, length, form, and dir allow to encode different positions, lengths, forms, and directions for each these stems. The attributes flag.pos and flag.form also allow to encode different types of flags for each of the stems.

- Attributes that record MIDI channel information. - + Attributes that record MIDI channel information. + Records a MIDI channel value. @@ -10423,17 +10491,17 @@ - Logical domain attributes. + Logical domain attributes. - Attributes which identify a MIDI instrument. - + Attributes which identify a MIDI instrument. + Provides a way of pointing to a MIDI instrument definition. It must contain the ID of an instrDef element elsewhere in the document. - + @instr attribute @@ -10446,8 +10514,8 @@ - Attributes common to MIDI events. - + Attributes common to MIDI events. + @@ -10455,15 +10523,15 @@ - Logical domain attributes. - + Logical domain attributes. + - Attributes that record MIDI instrument information. - + Attributes that record MIDI instrument information. + Only one of @midi.instrname and @midi.instrnum @@ -10471,7 +10539,7 @@ - + Only one of @midi.patchname and @midi.patchnum @@ -10479,7 +10547,7 @@ - + Captures the General MIDI instrument number. Use an integer for a 0-based value. An integer preceded by "in" indicates a 1-based value. @@ -10521,8 +10589,8 @@ - Attributes that record MIDI numbers. - + Attributes that record MIDI numbers. + number MIDI number in the range set by data.MIDIVALUE. @@ -10532,8 +10600,8 @@ - Attributes that record MIDI tempo information. - + Attributes that record MIDI tempo information. + Captures the number of *quarter notes* per minute. In MIDI, a beat is always defined as a quarter note, *not the numerator of the time signature or the metronomic @@ -10553,8 +10621,8 @@ - Attributes that record MIDI values. - + Attributes that record MIDI values. + MIDI number. @@ -10563,8 +10631,8 @@ - Attributes that record terminal MIDI values. - + Attributes that record terminal MIDI values. + MIDI number. @@ -10573,8 +10641,8 @@ - MIDI attributes pertaining to key velocity. - + MIDI attributes pertaining to key velocity. + MIDI Note-on/off velocity. @@ -10583,8 +10651,8 @@ - Attributes that record time-base information. - + Attributes that record time-base information. + Indicates the number of pulses (sometimes referred to as ticks or divisions) per quarter note. Unlike MIDI, MEI permits different values for a score and individual @@ -10595,142 +10663,148 @@ - Groups elements which group MIDI-like elements. - + Groups elements which group MIDI-like elements. + - control changeMIDI parameter/control change. + control changeMIDI parameter/control change. - + - +

The num attribute specifies a MIDI parameter number, while val contains the parameter value. Each must fall in the range 0-127.

-
channelMIDI channel assignment. + channelMIDI channel assignment. - + - + MIDI number in the range set by data.MIDICHANNEL. - channel pressureMIDI channel pressure/after touch. + channel pressureMIDI channel pressure/after touch. - + - +

The value of the num attribute must be in the range 0-127.

-
MIDI cue point. + MIDI cue point. - + - Arbitrary MIDI data in hexadecimal form. + Arbitrary MIDI data in hexadecimal form. - + - +

The element’s content must be wrapped in a CDATA section to avoid parsing errors.

-
instrument definitionMIDI instrument declaration. - + instrument definitionMIDI instrument declaration. + + + + + + + - + - +

This element provides a starting or default instrument declaration for a staff, a group of staves, or a layer. Following scoreDef, staffDef, layerDef, or MIDI prog elements may then change the instrument as necessary.

-
instrument groupCollects MIDI instrument definitions. + instrument groupCollects MIDI instrument definitions. - + - MIDI marker meta-event. + MIDI marker meta-event. - + - MIDI text meta-event. + MIDI text meta-event. - + - Container for elements that contain information useful when generating MIDI output. + Container for elements that contain information useful when generating MIDI output. - + - +

The label attribute can be used to differentiate between multiple MIDI data streams, e.g., quantized/unquantized, straight/swing, ornamented/as notated, etc.

-
MIDI note-off event. + MIDI note-off event. - + - MIDI note-on event. + MIDI note-on event. - + - MIDI port. + MIDI port. - + - programMIDI program change. + programMIDI program change. - + - sequence numberMIDI sequence number. + sequence numberMIDI sequence number. - + - + Number in the range 0-65535. 65535 - track nameMIDI track/sequence name. + track nameMIDI track/sequence name. - + - velocityMIDI Note-on/off velocity. + velocityMIDI Note-on/off velocity. - + - + Indicates whether this is note-on or note-off velocity data. @@ -10741,41 +10815,41 @@ - Groups elements used as part of a physical address. - + Groups elements used as part of a physical address. + - Groups elements which form part of a geographic name. - + Groups elements which form part of a geographic name. + - Groups elements which contain names of individuals or corporate bodies. - + Groups elements which contain names of individuals or corporate bodies. + - Groups geographic name elements. - + Groups geographic name elements. + - Groups elements that serve as stylistic labels. - + Groups elements that serve as stylistic labels. + - Groups place name elements. - + Groups place name elements. + - Groups elements which form part of a personal name. - additional nameContains an additional name component, such as a nickname, epithet, or - alias, or any other descriptive phrase used within a personal name. + Groups elements which form part of a personal name. + additional nameContains an additional name component, such as a nickname, epithet, or + alias, or any other descriptive phrase used within a personal name. @@ -10783,12 +10857,12 @@ - + - +

The model of this element is based on the addName element of the Text Encoding Initiative (TEI).

-
Contains the name of a geopolitical unit consisting of two or more nation states or - countries. + Contains the name of a geopolitical unit consisting of two or more nation states or + countries. @@ -10796,12 +10870,12 @@ - + - +

The model of this element is based on the bloc element of the Text Encoding Initiative (TEI).

-
corporate nameIdentifies an organization or group of people that acts as a single - entity. + corporate nameIdentifies an organization or group of people that acts as a single + entity. @@ -10809,20 +10883,20 @@ - + - +

Examples of corporate entities include names of associations, institutions, business firms, non-profit enterprises, governments, government agencies, projects, programs, religious bodies, churches, conferences, athletic contests, exhibitions, expeditions, fairs, and ships. Usually, secondary name parts are encoded in corpName sub-elements. The name of the list from which a controlled value is taken may be recorded using the auth attribute.

-
+

The model of this element is based on the corpname element of the Encoded Archival Description (EAD).

-
Contains the name of a geopolitical unit, such as a nation, country, colony, or + Contains the name of a geopolitical unit, such as a nation, country, colony, or commonwealth, larger than or administratively superior to a region and smaller than a - bloc. + bloc. @@ -10830,12 +10904,12 @@ - + - +

The model of this element is based on the country element of the Text Encoding Initiative (TEI).

-
Contains the name of any kind of subdivision of a settlement, such as a parish, ward, or - other administrative or geographic unit. + Contains the name of any kind of subdivision of a settlement, such as a parish, ward, or + other administrative or geographic unit. @@ -10843,12 +10917,12 @@ - + - +

The model of this element is based on the district element of the Text Encoding Initiative (TEI).

-
family nameContains a family (inherited) name, as opposed to a given, baptismal, or - nick name. + family nameContains a family (inherited) name, as opposed to a given, baptismal, or + nick name. @@ -10856,9 +10930,9 @@ - + - Contains a forename, given or baptismal name. + Contains a forename, given or baptismal name. @@ -10866,12 +10940,12 @@ - + - +

The model of this element is based on the forename element of the Text Encoding Initiative (TEI).

-
generational name componentContains a name component used to distinguish otherwise - similar names on the basis of the relative ages or generations of the persons named. + generational name componentContains a name component used to distinguish otherwise + similar names on the basis of the relative ages or generations of the persons named. @@ -10879,12 +10953,12 @@ - + - +

The model of this element is based on the genName element of the Text Encoding Initiative (TEI).

-
geographical feature nameContains a common noun identifying a geographical - feature. + geographical feature nameContains a common noun identifying a geographical + feature. @@ -10892,12 +10966,12 @@ - + - +

The model of this element is based on the geogFeat element of the Text Encoding Initiative (TEI).

-
geographic nameThe proper noun designation for a place, natural feature, or political - jurisdiction. + geographic nameThe proper noun designation for a place, natural feature, or political + jurisdiction. @@ -10905,9 +10979,9 @@ - + - +

Examples include Black Forest; Baltimore, Maryland; and Quartier Latin, Paris. Geographic name parts can be encoded using geogName sub-elements. For greater specificity, however, use district, settlement, @@ -10915,10 +10989,10 @@ sub-elements. The name of the list from which a controlled value is taken, such as the Thesaurus of Geographic Names (TGN), may be recorded using the auth attribute.

-
+

The model of this element is based on the geogname element of the Encoded Archival Description (EAD).

-
name linkContains a connecting phrase or link used within a name but not regarded as - part of it, such as "van der" or "of", "from", etc. + name linkContains a connecting phrase or link used within a name but not regarded as + part of it, such as "van der" or "of", "from", etc. @@ -10926,12 +11000,12 @@ - + - +

The model of this element is based on the nameLink element of the Text Encoding Initiative (TEI).

-
period nameA label that describes a period of time, such as 'Baroque' or '3rd Style - period'. + period nameA label that describes a period of time, such as 'Baroque' or '3rd Style + period'. @@ -10939,13 +11013,13 @@ - + - +

The name of the list from which a controlled value is taken may be recorded using the auth attribute.

-
personal nameDesignation for an individual, including any or all of that individual's - forenames, surnames, honorific titles, and added names. + personal nameDesignation for an individual, including any or all of that individual's + forenames, surnames, honorific titles, and added names. @@ -10953,37 +11027,37 @@ - + - +

Parts of a personal name may be captured using persName sub-elements. For greater specificity, however, use foreName, famName, genName, addName, genName, nameLink, and roleName elements. The name of the list from which a controlled value for persName is taken may be recorded using the auth attribute.

-
+

The model of this element is based on the persname element of the Encoded Archival Description (EAD).

-
(postal box or post office box) contains a number or other identifier for some postal - delivery point other than a street address. + (postal box or post office box) contains a number or other identifier for some postal + delivery point other than a street address. - + - +

The model of this element is based on the postBox element of the Text Encoding Initiative (TEI).

-
(postal code) contains a numerical or alphanumeric code used as part of a postal address - to simplify sorting or delivery of mail. + (postal code) contains a numerical or alphanumeric code used as part of a postal address + to simplify sorting or delivery of mail. - + - +

The model of this element is based on the postCode element of the Text Encoding Initiative (TEI).

-
Contains the name of an administrative unit such as a state, province, or county, larger - than a settlement, but smaller than a country. + Contains the name of an administrative unit such as a state, province, or county, larger + than a settlement, but smaller than a country. @@ -10991,12 +11065,12 @@ - + - +

The model of this element is based on the region element of the Text Encoding Initiative (TEI).

-
role nameContains a name component which indicates that the referent has a particular - role or position in society, such as an official title or rank. + role nameContains a name component which indicates that the referent has a particular + role or position in society, such as an official title or rank. @@ -11004,12 +11078,12 @@ - + - +

The model of this element is based on the roleName element of the Text Encoding Initiative (TEI).

-
Contains the name of a settlement such as a city, town, or village identified as a single - geopolitical or administrative unit. + Contains the name of a settlement such as a city, town, or village identified as a single + geopolitical or administrative unit. @@ -11017,22 +11091,22 @@ - + - +

The model of this element is based on the settlement element of the Text Encoding Initiative (TEI).

-
full street address including any name or number identifying a building as well as the - name of the street or route on which it is located. + full street address including any name or number identifying a building as well as the + name of the street or route on which it is located. - + - +

The model of this element is based on the street element of the Text Encoding Initiative (TEI).

-
style nameA label for a characteristic style of writing or performance, such as - 'bebop' or 'rock-n-roll'. + style nameA label for a characteristic style of writing or performance, such as + 'bebop' or 'rock-n-roll'. @@ -11040,17 +11114,17 @@ - + - +

Do not confuse this element with the periodName element. The name of the list from which a controlled value is taken may be recorded using the auth attribute.

- Items in the Neume repertoire that may be printed near a staff. + Items in the Neume repertoire that may be printed near a staff. - Logical domain attributes. - + Logical domain attributes. + Identifies the different kinds of division. @@ -11067,8 +11141,8 @@ - Logical domain attributes. - + Logical domain attributes. + @@ -11078,8 +11152,8 @@ - Logical domain attributes. - + Logical domain attributes. + @@ -11089,16 +11163,16 @@ - Logical domain attributes. + Logical domain attributes. - Logical domain attributes. - + Logical domain attributes. + - + Captures written octave information. @@ -11121,8 +11195,8 @@ - Attributes that record visual details of neume notation. - + Attributes that record visual details of neume notation. + @@ -11195,8 +11269,8 @@ - Logical domain attributes. - + Logical domain attributes. + @@ -11204,8 +11278,8 @@ - Logical domain attributes. - + Logical domain attributes. + @@ -11213,12 +11287,12 @@ - Logical domain attributes. + Logical domain attributes. - Logical domain attributes. + Logical domain attributes. - Logical domain attributes. - + Logical domain attributes. + @@ -11228,37 +11302,37 @@ - Logical domain attributes. + Logical domain attributes. - Logical domain attributes. - + Logical domain attributes. + - Groups event elements that occur in the neume repertoire. - + Groups event elements that occur in the neume repertoire. + - Groups notated events that may appear at the layer level in the neume repertoire. - + Groups notated events that may appear at the layer level in the neume repertoire. + - Groups elements that modify neume components. + Groups elements that modify neume components. - Groups elements that modify neume-like features. + Groups elements that modify neume-like features. - Groups elements that may occur within a neume. + Groups elements that may occur within a neume. - Groups elements that accommodate neumed text. - + Groups elements that accommodate neumed text. + - Groups elements that may appear as part of the content of a syllable. - Episema. + Groups elements that may appear as part of the content of a syllable. + Episema. @@ -11266,7 +11340,7 @@ - Hispanic tick. + Hispanic tick. @@ -11274,9 +11348,9 @@ - + - Liquescent. + Liquescent. @@ -11284,8 +11358,8 @@ - Sign representing a single pitched event, although the exact pitch may not be - known. + Sign representing a single pitched event, although the exact pitch may not be + known. @@ -11298,9 +11372,9 @@ - + - + Designation which characterizes the element in some sense, using any convenient classification scheme or typology that employs single-token labels. @@ -11330,7 +11404,7 @@ - Collection of one or more neume components. + Collection of one or more neume components. @@ -11338,9 +11412,9 @@ - + - Sign representing one or more musical pitches. + Sign representing one or more musical pitches. @@ -11353,9 +11427,9 @@ - + - + Designation which characterizes the element in some sense, using any convenient classification scheme or typology that employs single-token labels. @@ -11385,7 +11459,7 @@ - Oriscus. + Oriscus. @@ -11393,7 +11467,7 @@ - Quilisma. + Quilisma. @@ -11401,7 +11475,7 @@ - Significantive letter(s). + Significantive letter(s). @@ -11409,9 +11483,9 @@ - + - Strophicus. + Strophicus. @@ -11419,8 +11493,8 @@ - Neume notation can be thought of as "neumed text". Therefore, the syllable element - provides high-level organization in this repertoire. + Neume notation can be thought of as "neumed text". Therefore, the syllable element + provides high-level organization in this repertoire. @@ -11428,10 +11502,10 @@ - + - Represents a division (divisio) in neume notation. Divisions indicate short, medium, or long pauses - similar to breath marks in modern notation. + Represents a division (divisio) in neume notation. Divisions indicate short, medium, or long pauses + similar to breath marks in modern notation. @@ -11448,8 +11522,8 @@ - Temporal alignment attributes. - + Temporal alignment attributes. + @when attribute should @@ -11460,7 +11534,7 @@ - + Indicates the point of occurrence of this feature along a time line. Its value must be the ID of a when element elsewhere in the document. @@ -11469,82 +11543,82 @@ - audio/video fileReferences an external digital audio or video file. + audio/video fileReferences an external digital audio or video file. - + - + An avFile child of clip cannot have children. - +

This element is analogous to the graphic element in the figtable module.

-
Defines a time segment of interest within a recording or within a digital audio or video - file. + Defines a time segment of interest within a recording or within a digital audio or video + file. - + - + When @begin or @end is used, @betype should appear on clip or one of its ancestors. - +

This element is analogous to the zone element in the facsimile module.

-
A presentation of one or more musical works. + A presentation of one or more musical works. - + - +

The decls attribute may be used to link the collection with a particular source described in the header. This element is analogous to the facsimile element in the facsimile module.

-
A recorded performance. + A recorded performance. - + - + When @begin or @end is used, @betype should be present. - +

The startid attribute may be used to hold a reference to the first feature occurring in this performance. This element is analogous to the surface element in the facsimile module.

-
Indicates a point in time either absolutely (using the absolute attribute), or relative to - another when element (using the since, interval and inttype attributes). + Indicates a point in time either absolutely (using the absolute attribute), or relative to + another when element (using the since, interval and inttype attributes). - - - + + + @since must be present when @interval is used. @@ -11560,7 +11634,7 @@ be 'time'. - + When @absolute is @@ -11568,12 +11642,12 @@ ancestor. - + Provides an absolute value for the time point. - + Specifies the time interval between this time point and the one designated by the since attribute. This attribute can only be interpreted meaningfully in conjunction with the inttype attribute. @@ -11585,17 +11659,17 @@ - + Specifies the kind of values used in the absolute attribute. - + Specifies the kind of values used in the interval attribute. - + Identifies the reference point for determining the time of the current when element, which is obtained by adding the interval to the time of the reference point. The value should be the ID of another when element within the same parent element. If the since @@ -11604,7 +11678,7 @@ - + @since attribute @@ -11614,34 +11688,34 @@ - +

The data attribute may be used to reference one or more features that occur at this point in time.

-
+

The model of this element is based on the when element of the Text Encoding Initiative (TEI).

- Groups elements used for purposes of location and reference. - + Groups elements used for purposes of location and reference. + - pointerDefines a traversible pointer to another location, using only attributes to - describe the destination. + pointerDefines a traversible pointer to another location, using only attributes to + describe the destination. - + - +

Unlike the ref element, ptr cannot contain text or sub-elements to describe the referenced object.

-
+

The model of this element is based on the ptr element of the Encoded Archival Description (EAD) and the ptr element of the Text Encoding Initiative (TEI).

-
referenceDefines a traversible reference to another location. May contain text and - sub-elements that describe the destination. + referenceDefines a traversible reference to another location. May contain text and + sub-elements that describe the destination. @@ -11649,17 +11723,17 @@ - + - +

Unlike the ptr element, ref may contain text and sub-elements to describe the destination.

-
+

The model of this element is based on the ref element of the Encoded Archival Description (EAD) and the ref element of the Text Encoding Initiative (TEI).

- Permits any XML elements except those from the MEI or SVG namespace. - + Permits any XML elements except those from the MEI or SVG namespace. + @@ -11674,32 +11748,32 @@ - Groups elements that contain meta-data about a single page. - + Groups elements that contain meta-data about a single page. + - Groups elements that may appear as part of the music element. - + Groups elements that may appear as part of the music element. + - Provides a choice between structured and unstructured/mixed content. - + Provides a choice between structured and unstructured/mixed content. + - Groups elements that may appear as part of a bibliographic title. - + Groups elements that may appear as part of a bibliographic title. + - Datatypes for values in begin, end, abstype and inttype attributes. - + Datatypes for values in begin, end, abstype and inttype attributes. + Bytes. @@ -11743,12 +11817,12 @@ - Logical domain attributes. - + Logical domain attributes. + - + Records the function of an accidental. @@ -11762,8 +11836,8 @@ - Attributes for capturing momentary pitch inflection. - + Attributes for capturing momentary pitch inflection. + Captures a written accidental. @@ -11772,21 +11846,21 @@ - Logical domain attributes. + Logical domain attributes. - Logical domain attributes. - + Logical domain attributes. + - Logical domain attributes for annot. Values for the type attribute can be taken from any + Logical domain attributes for annot. Values for the type attribute can be taken from any convenient typology of annotation suitable to the work in hand; e.g., annotation, gloss, citation, digression, preliminary, temporary, etc. - + @@ -11797,14 +11871,14 @@ - Logical domain attributes. - + Logical domain attributes. + - Attributes for capturing the written signs that describe the method of performance. - + Attributes for capturing the written signs that describe the method of performance. + Encodes the written articulation(s). Articulations are normally encoded in order from the note head outward; that is, away from the stem. See additional notes at att.vis.note. @@ -11816,19 +11890,19 @@ - Logical domain attributes. - + Logical domain attributes. + - + Indicates the next section or movement to be performed. - + @target attribute @@ -11841,8 +11915,8 @@ - Attributes that describe the intended audience. - + Attributes that describe the intended audience. + The intended audience. @@ -11856,14 +11930,14 @@ - Attributes that record the number of dots of augmentation. - + Attributes that record the number of dots of augmentation. + Records the number of augmentation dots required by a written dotted duration. - + An element with a dots attribute must also have a dur @@ -11873,18 +11947,18 @@ - +

The dots attribute records the number of augmentation dots necessary to represent a non-power-of-two duration. This is usually, but not always, the number of dots displayed. For example, a note with this attribute will result in displayed dots, while a glissando will not.

- Attributes that describe the source of a controlled value. - + Attributes that describe the source of a controlled value. + - + A name or label associated with a controlled vocabulary or other authoritative source for this element or its content. @@ -11903,11 +11977,11 @@ - Logical domain attributes. - + Logical domain attributes. + - + Records the appearance and usually the function of the bar line. @@ -11916,8 +11990,8 @@ - Attributes that capture the placement of bar lines. - + Attributes that capture the placement of bar lines. + States the length of bar lines in virtual units. The value must be greater than 0 and is typically equal to 2 times (the number of staff lines - 1); e.g., a value of 8 for a @@ -11936,7 +12010,7 @@ - + "mensur" not allowed in this @@ -11962,11 +12036,11 @@ - Attributes that form the basis of the att.common class. - + Attributes that form the basis of the att.common class. + - + Provides a base URI reference with which applications can resolve relative URI @@ -11977,8 +12051,8 @@ - Bibliographic attributes. - + Bibliographic attributes. + Contains a reference to a field or element in another descriptive encoding system to which this MEI element is comparable. @@ -11987,15 +12061,15 @@ - +

Mapping elements from one system to another via analog may help a repository harvest selected data from the MEI file to build a basic catalog record. The encoding system from which fields are taken must be specified. When possible, subfields as well as fields should be specified, e.g., subfields within MARC fields.

- Logical domain attributes. - + Logical domain attributes. + @@ -12003,8 +12077,8 @@ - Attributes that indicate the calendar system of a date or other datable element. - + Attributes that indicate the calendar system of a date or other datable element. + Indicates the calendar system to which a date belongs, for example, Gregorian, Julian, Roman, Mosaic, Revolutionary, Islamic, etc. @@ -12014,9 +12088,9 @@ - Attributes that can be used to associate a representation such as a name or title with + Attributes that can be used to associate a representation such as a name or title with canonical information about the object being named or referenced. - + A value that represents or identifies other data. Often, it is a primary key in the database or a unique value in the coded list identified by the auth or @@ -12027,13 +12101,13 @@ - Logical domain attributes for chord. The artic, dots, and dur attributes encode the + Logical domain attributes for chord. The artic, dots, and dur attributes encode the written articulations, augmentation dots, and duration values. The beam, fermata, lv, slur, syl, tie, and tuplet attributes may be used to indicate the attachment of these things to this chord. If visual information about these things needs to be recorded, then either the elements corresponding to these attributes or the attributes available in the att.vis.chord class should be employed. - + @@ -12043,15 +12117,15 @@ - Attributes which can be used to classify features. - + Attributes which can be used to classify features. + Contains one or more URIs which denote classification terms that apply to the entity bearing this attribute. - + The value in @class must either correspond to the @xml:id attribute of a category @@ -12062,14 +12136,14 @@ - Logical domain attributes. - + Logical domain attributes. + - + Records the function of the clef. A "cautionary" clef does not change the following pitches. @@ -12079,9 +12153,9 @@ - Used by staffDef and scoreDef to provide default values for attributes in the logical + Used by staffDef and scoreDef to provide default values for attributes in the logical domain related to clefs. - + An 'F', 'C', or 'G' clef requires that its position be @@ -12093,7 +12167,7 @@ - + Encodes a value for the clef symbol. @@ -12122,10 +12196,10 @@ - Logical domain attributes. + Logical domain attributes. - Attributes that record the shape of a clef. - + Attributes that record the shape of a clef. + When @shape is present, @line must also be @@ -12133,7 +12207,7 @@ - + Describes a clef’s shape. @@ -12142,8 +12216,8 @@ - Visual color attributes. - + Visual color attributes. + Used to indicate visual appearance. Do not confuse this with the musical term 'color' as used in pre-CMN notation. @@ -12153,8 +12227,8 @@ - Indication of coloration. - + Indication of coloration. + Indicates this feature is 'colored'; that is, it is a participant in a change in rhythmic values. In mensural notation, coloration is indicated by colored notes (red, @@ -12167,8 +12241,8 @@ - Attributes common to many elements. - + Attributes common to many elements. + @@ -12177,10 +12251,10 @@ - Attributes shared by events which rely on other events for their existence. For example, a + Attributes shared by events which rely on other events for their existence. For example, a slur/phrase marking must be drawn between or over a group of notes. The slur is therefore a control event. - + @@ -12191,9 +12265,9 @@ - This attribute class records the position of a feature within a two-dimensional coordinate + This attribute class records the position of a feature within a two-dimensional coordinate system. - + Indicates the upper-left corner x coordinate. @@ -12234,8 +12308,8 @@ - Attributes that describe "cue-ness". - + Attributes that describe "cue-ness". + @@ -12243,8 +12317,8 @@ - Attributes that describe curvature. - + Attributes that describe curvature. + Records the placement of Bezier control points as a series of pairs of space-separated values; e.g., 19 45 -32 118. @@ -12280,8 +12354,8 @@ - Attributes that record the visual rendition of curves. - + Attributes that record the visual rendition of curves. + Describes the line style of a curve. @@ -12296,19 +12370,19 @@ - Logical domain attributes. - + Logical domain attributes. + - + Encodes the target note when its pitch differs from the pitch at which the custos appears. - + @target attribute @@ -12321,8 +12395,8 @@ - Attributes common to dates. - + Attributes common to dates. + Contains the end point of a date range in standard ISO form. @@ -12355,14 +12429,14 @@ - Attributes for linking metadata to data. - + Attributes for linking metadata to data. + Used to link metadata elements to one or more data-containing elements. - + @data attribute should @@ -12375,14 +12449,14 @@ - Logical domain attributes. - + Logical domain attributes. + - Provides attributes for elements which may be associated with particular contextual + Provides attributes for elements which may be associated with particular contextual elements within the header. - + Identifies one or more metadata elements (other than classification terms) within the header, which are understood to apply to the element bearing this attribute and its @@ -12390,7 +12464,7 @@ - + @decls attribute @@ -12405,22 +12479,22 @@ - Attributes that capture the dimensions of an entity. - + Attributes that capture the dimensions of an entity. + - Logical domain attributes. - + Logical domain attributes. + - Attributes that describe distance from the staff. - + Attributes that describe distance from the staff. + Records the default distance from the staff for directives. @@ -12454,11 +12528,11 @@ - Logical domain attributes. - + Logical domain attributes. + - + Records the function of the dot. @@ -12472,8 +12546,8 @@ - Attributes that permit total duration to be represented by multiple values. - + Attributes that permit total duration to be represented by multiple values. + duration When a duration cannot be represented as a single power-of-two value, multiple @@ -12484,8 +12558,8 @@ - Attributes that provide a durational default value. - + Attributes that provide a durational default value. + Contains a default duration in those situations when the first note, rest, chord, etc. in a measure does not have a duration specified. @@ -12509,8 +12583,8 @@ - Attributes that express duration in musical terms. - + Attributes that express duration in musical terms. + duration Records the duration of a feature using the relative durational values provided by the @@ -12521,8 +12595,8 @@ - Attributes that describe duration as a ratio. - + Attributes that describe duration as a ratio. + number Along with numbase, describes duration as a ratio. num is the first value in the @@ -12540,17 +12614,17 @@ - Logical domain attributes. - + Logical domain attributes. + - Attributes that capture characters used to enclose symbols having a cautionary or + Attributes that capture characters used to enclose symbols having a cautionary or editorial function. - + Records the characters often used to mark accidentals, articulations, and sometimes notes as having a cautionary or editorial function. For an example of cautionary @@ -12561,13 +12635,13 @@ - Logical domain attributes. - + Logical domain attributes. + - Attributes that record ending style information - + Attributes that record ending style information + Describes where ending marks should be displayed. @@ -12584,8 +12658,8 @@ - Attributes that apply to all written events, e.g., note, chord, rest, etc. - + Attributes that apply to all written events, e.g., note, chord, rest, etc. + @@ -12593,8 +12667,8 @@ - Attributes describing the support for and the certainty of an assertion. - + Attributes describing the support for and the certainty of an assertion. + Signifies the degree of certainty or precision associated with a feature. @@ -12622,12 +12696,12 @@ - Attributes that describe extension symbols, typically lines. Members of this class are + Attributes that describe extension symbols, typically lines. Members of this class are also typically members of the att.lineRend class. - + - + Indicates the presence of an extension symbol, typically a line. @@ -12636,19 +12710,19 @@ - Provides attributes for describing the size of an entity. - + Provides attributes for describing the size of an entity. + - + Captures a measurement, count, or description. When extent contains a numeric value, use the unit attribute to indicate the measurement unit. - + The @unit attribute is @@ -12663,8 +12737,8 @@ - Attributes indicating the attachment of a fermata to the feature. - + Attributes indicating the attachment of a fermata to the feature. + Indicates the attachment of a fermata to this element. If visual information about the fermata needs to be recorded, then a fermata element should be @@ -12675,8 +12749,8 @@ - Attributes that deal with string filing characteristics. - + Attributes that deal with string filing characteristics. + Holds the number of initial characters (such as those constituting an article or preposition) that should not be used for sorting a title or name. @@ -12686,12 +12760,12 @@ - Logical domain attributes. - + Logical domain attributes. + - + Indicates the nesting level of staff grouping symbols. @@ -12700,14 +12774,14 @@ - Attributes which identify a document hand. - + Attributes which identify a document hand. + Signifies the hand responsible for an action. The value must be the ID of a hand element declared in the header. - + @hand attribute should @@ -12720,8 +12794,8 @@ - Attributes that describe vertical size. - + Attributes that describe vertical size. + Measurement of the vertical dimension of an entity. @@ -12730,8 +12804,8 @@ - Attributes that record horizontal alignment. - + Attributes that record horizontal alignment. + Records horizontal alignment. @@ -12740,8 +12814,8 @@ - Attributes that uniquely identify an element. - + Attributes that uniquely identify an element. + Regularizes the naming of an element and thus facilitates building links between it @@ -12752,8 +12826,8 @@ - Attributes which record the type of an electronic resource. - + Attributes which record the type of an electronic resource. + Specifies the applicable MIME (multimedia internet mail extension) type. The value should be a valid MIME media type defined by the Internet Engineering Task Force in RFC @@ -12764,9 +12838,9 @@ - Attributes indicating that elements are semantically linked; that is, while the parts are + Attributes indicating that elements are semantically linked; that is, while the parts are encoded separately, together they may be thought of as a single intellectual object. - + Used for linking visually separate entities that form a single logical entity, for example, multiple slurs broken across a system break that form a single musical phrase. @@ -12776,7 +12850,7 @@ - + @join attribute should @@ -12790,14 +12864,14 @@ - Logical domain attributes. - + Logical domain attributes. + - Logical domain attributes. - + Logical domain attributes. + Written key signature. @@ -12805,15 +12879,15 @@ - +

Mixed key signatures, e.g., those consisting of a mixture of flats and sharps (Read, p. 143, ex. 9-39), and key signatures with unorthodox placement of the accidentals (Read, p. 141) can be encoded using the keySig element.

- Used by staffDef and scoreDef to provide default values for attributes in the logical + Used by staffDef and scoreDef to provide default values for attributes in the logical domain that are related to key signatures. - + Written key signature. @@ -12821,13 +12895,13 @@ - +

Mixed key signatures, e.g., those consisting of a mixture of flats and sharps (Read, p. 143, ex. 9-39), and key signatures with unorthodox placement of the accidentals (Read, p. 141) can be encoded using the keySig element.

- + Captures text to be used to generate a label for the element to which it’s attached, a "tool tip" or prefatory text, for example. Should not be used to record document @@ -12846,8 +12920,8 @@ - Language attributes common to text elements. - + Language attributes common to text elements. + Identifies the language of the element’s content. The values for this attribute are @@ -12868,24 +12942,24 @@ - +

BCP 47 is described at https://tools.ietf.org/html/bcp47. The IANA Subtag Registry, from which BCP 47 language tags are constructed, may be found at www.iana.org/assignments/language-subtag-registry. A tool for locating subtags and validating language tags is available at https://r12a.github.io/apps/subtags.

- Logical domain attributes. - + Logical domain attributes. + - + Provides a mechanism for linking the layer to a layerDef element. - + @def attribute should @@ -12898,16 +12972,16 @@ - Logical domain attributes. - + Logical domain attributes. + - Attributes that identify the layer to which a feature applies. - + Attributes that identify the layer to which a feature applies. + Identifies the layer to which a feature applies. @@ -12916,8 +12990,8 @@ - Attributes for identifying the staff line with which a feature is associated. - + Attributes for identifying the staff line with which a feature is associated. + Indicates the line upon which a feature stands. The value must be in the range between 1 and the number of lines on the staff. The numbering of lines starts with the lowest line @@ -12928,11 +13002,11 @@ - Attributes that record the visual rendition of lines. - + Attributes that record the visual rendition of lines. + - + line end symbol @@ -12962,8 +13036,8 @@ - Attributes that record the basic visual rendition of lines. - + Attributes that record the basic visual rendition of lines. + line form Describes the line style of a line. @@ -12983,7 +13057,7 @@ 2 - + @lform attribute @@ -13001,8 +13075,8 @@ - Attributes that specify element-to-element relationships. - + Attributes that specify element-to-element relationships. + Points to an element of which the current element is a copy. @@ -13154,8 +13228,8 @@ - Attributes that describe default typography of lyrics. - + Attributes that describe default typography of lyrics. + Describes the alignment of lyric syllables associated with a note or chord. @@ -13194,8 +13268,8 @@ - Attributes that record the unit of measurement in which a value is expressed. - + Attributes that record the unit of measurement in which a value is expressed. + Indicates the unit of measurement. @@ -13257,8 +13331,8 @@ - Attributes pertaining to measure numbers - + Attributes pertaining to measure numbers + Indicates whether measure numbers should be displayed. @@ -13267,8 +13341,8 @@ - Attributes that establish the boundaries of a media object. - + Attributes that establish the boundaries of a media object. + Specifies a point where the relevant content begins. A numerical value must be less and a time value must be earlier than that given by the end attribute. @@ -13293,8 +13367,8 @@ - Attributes describing a writing medium, such as pencil or ink. - + Attributes describing a writing medium, such as pencil or ink. + Describes the writing medium. @@ -13331,15 +13405,15 @@ - Logical domain attributes. - + Logical domain attributes. + - Attributes that provide information about a structure’s conformance to the prevailing + Attributes that provide information about a structure’s conformance to the prevailing meter. - + meter conformance Indicates the relationship between the content of a staff or layer and the prevailing @@ -13358,9 +13432,9 @@ - Attributes that provide information about a measure’s conformance to the prevailing + Attributes that provide information about a measure’s conformance to the prevailing meter. - + meter conformance Indicates the relationship between the content of a measure and the prevailing @@ -13381,8 +13455,8 @@ - Logical domain attributes. - + Logical domain attributes. + Captures the number of beats in a measure, that is, the top number of the meter signature. It must contain a decimal number or an expression that evaluates to a @@ -13410,9 +13484,9 @@ - Used by staffDef and scoreDef to provide default values for attributes in the logical + Used by staffDef and scoreDef to provide default values for attributes in the logical domain related to meter signature. - + Captures the number of beats in a measure, that is, the top number of the meter signature. It must contain a decimal number or an expression that evaluates to a @@ -13441,8 +13515,8 @@ - Attributes that record tempo in terms of beats per minute. - + Attributes that record tempo in terms of beats per minute. + Used to describe tempo in terms of beats (often the meter signature denominator) per minute, ala M.M. (Maelzel’s Metronome). Do not confuse this attribute with midi.bpm or @@ -13466,8 +13540,8 @@ - Attributes that indicate programmatic numbering. - + Attributes that indicate programmatic numbering. + Indicates whether programmatically calculated counts of multiple measures of rest (mRest) and whole measure repeats (mRpt) in parts should be rendered. @@ -13477,20 +13551,20 @@ - Attributes shared by names. - + Attributes shared by names. + - + Used to record a pointer to the regularized form of the name elsewhere in the document. - + @nymref attribute @@ -13515,8 +13589,8 @@ - Attributes used to supply an integer number designation for an element. - + Attributes used to supply an integer number designation for an element. + Provides a numeric designation that indicates an element’s position in a sequence of similar elements. Its value must be a non-negative integer. @@ -13526,8 +13600,8 @@ - Attributes used to supply a number-like designation for an element. - + Attributes used to supply a number-like designation for an element. + Provides a number-like designation that indicates an element’s position in a sequence of similar elements. May not contain space characters. @@ -13537,8 +13611,8 @@ - Attributes that capture music font name and size. - + Attributes that capture music font name and size. + Sets the default music font name. @@ -13553,8 +13627,8 @@ - Logical domain attributes. - + Logical domain attributes. + @@ -13566,15 +13640,15 @@ - Attributes pertaining to the notehead part of a note. - + Attributes pertaining to the notehead part of a note. + Provides a way of pointing to a user-defined symbol. It must contain a reference to an ID of a symbolDef element elsewhere in the document. - + @head.altsym attribute @@ -13591,7 +13665,7 @@ - + When @@ -13643,7 +13717,7 @@ - + SMuFL version 1.18 uses the range U+E000 - U+ECBF. @@ -13660,8 +13734,8 @@ - Attributes that record written octave. - + Attributes that record written octave. + octave Captures written octave information. @@ -13671,8 +13745,8 @@ - Attributes that record a default value for octave. - + Attributes that record a default value for octave. + Contains a default octave specification for use when the first note, rest, chord, etc. in a measure does not have an octave value specified. @@ -13682,8 +13756,8 @@ - Attributes describing the amount and direction of octave displacement. - + Attributes describing the amount and direction of octave displacement. + Records the amount of octave displacement. @@ -13698,8 +13772,8 @@ - Attributes that record placement of notes on a single-line staff. - + Attributes that record placement of notes on a single-line staff. + Determines the placement of notes on a 1-line staff. A value of 'true' places all notes on the line, while a value of 'false' places stems-up notes above the line and @@ -13710,8 +13784,8 @@ - Attributes pertaining to layout optimization. - + Attributes pertaining to layout optimization. + Indicates whether staves without notes, rests, etc. should be displayed. When the value is 'true', empty staves are displayed. @@ -13721,8 +13795,8 @@ - Attributes that identify the layer associated with a distant feature. - + Attributes that identify the layer associated with a distant feature. + identifies the layer on which referenced notation occurs. @@ -13731,8 +13805,8 @@ - Attributes for identifying the staff associated with a distant feature. - + Attributes for identifying the staff associated with a distant feature. + signifies the staff on which referenced notation occurs. Defaults to the same value as the local staff. Mandatory when applicable. @@ -13742,9 +13816,9 @@ - Attributes recording the identifiers of the first and last elements of a sequence of + Attributes recording the identifiers of the first and last elements of a sequence of distant elements. - + indicates the first element in a sequence of events. @@ -13759,8 +13833,8 @@ - Attributes that identify a musical range in terms of musical time. - + Attributes that identify a musical range in terms of musical time. + encodes the starting point of musical material in terms of musical time, i.e., a (potentially negative) count of measures plus a beat location. @@ -13775,7 +13849,7 @@ - + When @origin.tstamp2 is used @origin.tstamp must @@ -13786,8 +13860,8 @@ - Logical domain attributes. - + Logical domain attributes. + @@ -13795,14 +13869,14 @@ - Logical domain attributes. - + Logical domain attributes. + - Attributes that record page-level layout information. - + Attributes that record page-level layout information. + Specifies the height of the page; may be expressed in real-world units or staff steps. @@ -13859,10 +13933,10 @@ - Logical domain attributes. + Logical domain attributes. - Attributes for identifying the part in which the current feature appears. - + Attributes for identifying the part in which the current feature appears. + Indicates the part in which the current feature should appear. Use '%all' when the feature should occur in every part. @@ -13899,23 +13973,23 @@ - Logical domain attributes. + Logical domain attributes. - Logical domain attributes. - + Logical domain attributes. + - Logical domain attributes. - + Logical domain attributes. + - Attributes that record written pitch name. - + Attributes that record written pitch name. + pitch name Contains a written pitch name. @@ -13925,14 +13999,14 @@ - Attributes that record written pitch name and octave number. - + Attributes that record written pitch name and octave number. + - Attributes capturing placement on a staff. - + Attributes capturing placement on a staff. + Indicates the placement of the item within the staff. A value of 'true' means on the staff, and 'false' off the staff. @@ -13941,8 +14015,8 @@ - Attributes capturing placement information with respect to an event. - + Attributes capturing placement information with respect to an event. + Captures the placement of the item with respect to the event with which it is associated. @@ -13952,8 +14026,8 @@ - Attributes capturing placement information with respect to the staff. - + Attributes capturing placement information with respect to the staff. + Captures the placement of the item with respect to the staff with which it is associated. @@ -13963,8 +14037,8 @@ - Attributes listing the active participants in a user-defined collection. - + Attributes listing the active participants in a user-defined collection. + When the target attribute is present, plist identifies the active participants; that is, those entities pointed "from", in a relationship with the specified target(s). When @@ -13973,7 +14047,7 @@ - + @plist attribute @@ -13987,8 +14061,8 @@ - Attributes common to all pointing/linking elements. - + Attributes common to all pointing/linking elements. + Defines whether a link occurs automatically or must be requested by the user. @@ -14055,12 +14129,12 @@ - Attributes that specify a measurement in numerical terms. - + Attributes that specify a measurement in numerical terms. + - + Numeric value capturing a measurement or count. Can only be interpreted in combination with the unit attribute. @@ -14072,8 +14146,8 @@ - Groups attributes that describe a numerical range. - + Groups attributes that describe a numerical range. + Gives a minimum estimated value for an approximate measurement. @@ -14107,7 +14181,7 @@ - + The attributes @min and @max are required when @@ -14117,10 +14191,40 @@ + + Logical domain attributes. + + + + + + + + + Indicates the function of the mark, usually implying a corresponding form. + + + Coda (SMuFL E048 or Unicode 1D10C). + + + Segno (SMuFL E047 or Unicode 1D10B). + + + Dal segno (SMuFL E045 or Unicode 1D109). + + + Da capo (SMuFL E046 or Unicode 1D10A). + + + Fine. (text) + + + + - Attributes capturing information regarding responsibility for some aspect of the text's + Attributes capturing information regarding responsibility for some aspect of the text's creation, transcription, editing, or encoding. - + Indicates the agent(s) responsible for some aspect of the text’s transcription, editing, or encoding. Its value must point to one or more identifiers declared in the @@ -14128,7 +14232,7 @@ - + @resp attribute should @@ -14141,8 +14245,8 @@ - Logical domain attributes. - + Logical domain attributes. + @@ -14150,8 +14254,8 @@ - Attributes that express duration of rests in musical terms. - + Attributes that express duration of rests in musical terms. + Records the duration of a rest using the relative durational values provided by the data.DURATIONRESTS datatype. @@ -14161,13 +14265,13 @@ - Logical domain attributes. - + Logical domain attributes. + - Attributes that describe relative size. - + Attributes that describe relative size. + Scale factor to be applied to the feature to make it the desired display size. @@ -14176,12 +14280,12 @@ - Logical domain attributes. + Logical domain attributes. - Logical domain attributes for scoreDef in the CMN repertoire. The values set in these + Logical domain attributes for scoreDef in the CMN repertoire. The values set in these attributes act as score-wide defaults for attributes that are not set in descendant elements. - + @@ -14192,13 +14296,13 @@ - Logical domain attributes. - + Logical domain attributes. + - Attributes that describe order within a collection of features. - + Attributes that describe order within a collection of features. + Used to assign a sequence number related to the order in which the encoded features carrying this attribute are believed to have occurred. @@ -14208,8 +14312,8 @@ - Attributes for recording the number of slashes that accompany a feature. - + Attributes for recording the number of slashes that accompany a feature. + Indicates the number of slashes present. @@ -14218,8 +14322,8 @@ - Attributes for marking the presence of a slur. - + Attributes for marking the presence of a slur. + Indicates that this element participates in a slur. If visual information about the slur needs to be recorded, then a slur element should be @@ -14230,8 +14334,8 @@ - Attributes common to elements that may refer to a source. - + Attributes common to elements that may refer to a source. + Contains a list of one or more pointers indicating the sources which attest to a given reading. Each value should correspond to the ID of a source or manifestationelement located in the document header. @@ -14251,16 +14355,16 @@ - Logical domain attributes. - + Logical domain attributes. + - Attributes that capture notation spacing information. - + Attributes that capture notation spacing information. + Describes a note’s spacing relative to its time value. @@ -14292,17 +14396,17 @@ - Logical domain attributes. - + Logical domain attributes. + - + Provides a mechanism for linking the staff to a staffDef element. - + @def attribute should @@ -14315,8 +14419,8 @@ - Logical domain attributes for staffDef. - + Logical domain attributes for staffDef. + @@ -14327,7 +14431,7 @@ - + Indicates the number of staff lines. @@ -14336,8 +14440,8 @@ - Attributes that describe the symbol used to group a set of staves. - + Attributes that describe the symbol used to group a set of staves. + Specifies the symbol used to group a set of staves. @@ -14361,10 +14465,10 @@ - Logical domain attributes. + Logical domain attributes. - Attributes for identifying the staff associated with the current feature. - + Attributes for identifying the staff associated with the current feature. + Signifies the staff on which a notated event occurs or to which a control event applies. Mandatory when applicable. @@ -14374,8 +14478,8 @@ - Attributes that describe items printed near (above, below, or between) staves - + Attributes that describe items printed near (above, below, or between) staves + Describes vertical order of items printed above a staff, from closest to farthest away from the staff. @@ -14398,8 +14502,8 @@ - Attributes that identify location on a staff in terms of lines and spaces. - + Attributes that identify location on a staff in terms of lines and spaces. + Holds the staff location of the feature. @@ -14408,8 +14512,8 @@ - Attributes that identify location on a staff in terms of pitch and octave. - + Attributes that identify location on a staff in terms of pitch and octave. + Captures staff location in terms of written pitch name. @@ -14424,19 +14528,19 @@ - Attributes recording the identifiers of the first and last elements of a sequence of + Attributes recording the identifiers of the first and last elements of a sequence of elements to which the current element is associated. - + - + Indicates the final element in a sequence of events to which the feature applies. - + @endid attribute @@ -14450,15 +14554,15 @@ - Attributes that identify a relative starting point. - + Attributes that identify a relative starting point. + Holds a reference to the first element in a sequence of events to which the feature applies. - + @startid attribute @@ -14472,13 +14576,13 @@ - Attributes that describe the properties of stemmed features; that is, chords and + Attributes that describe the properties of stemmed features; that is, chords and notes. - + - + Describes the direction of a stem. @@ -14511,7 +14615,7 @@ - + @@ -14548,8 +14652,8 @@ - Logical domain attributes. - + Logical domain attributes. + Describes the symbols typically used to indicate breaks between syllables and their functions. @@ -14599,8 +14703,8 @@ - Attributes that hold associated sung text syllables. - + Attributes that hold associated sung text syllables. + Holds an associated sung text syllable. @@ -14609,13 +14713,13 @@ - Logical domain attributes. - + Logical domain attributes. + - Attributes that capture system layout information. - + Attributes that capture system layout information. + Indicates whether the system starts with a continuous line connecting all staves, including single-staff systems. Do not confuse this with the heavy vertical line used as a grouping @@ -14647,8 +14751,8 @@ - Attributes that deal with resolution of values in plist or target attributes. - + Attributes that deal with resolution of values in plist or target attributes. + Specifies the intended meaning when a participant in a relationship is itself a pointer. @@ -14673,14 +14777,14 @@ - Logical domain attributes. - + Logical domain attributes. + - + Records the function of a tempo indication. @@ -14706,8 +14810,8 @@ - Attributes that record renditional characteristics. - + Attributes that record renditional characteristics. + Used to extend the values of the rend attribute. @@ -14724,8 +14828,8 @@ - Attributes that describe default text typography. - + Attributes that describe default text typography. + Provides a default value for the font family name of text (other than lyrics) when this information is not provided on the individual elements. @@ -14763,8 +14867,8 @@ - Attributes that indicate the presence of a tie. - + Attributes that indicate the presence of a tie. + Indicates that this element participates in a tie. If visual information about the tie needs to be recorded, then a tie element should be employed. @@ -14774,9 +14878,9 @@ - Attributes that record a time stamp in terms of musical time, i.e., beats[.fractional beat + Attributes that record a time stamp in terms of musical time, i.e., beats[.fractional beat part]. - + time stamp Encodes the onset time in terms of musical time, i.e., beats[.fractional beat part], @@ -14787,9 +14891,9 @@ - Attributes that record a time stamp for the end of an event in terms of musical + Attributes that record a time stamp for the end of an event in terms of musical time. - + Encodes the ending point of an event, i.e., a count of measures plus a beat location in the ending measure. @@ -14799,8 +14903,8 @@ - Attributes that describe transposition. - + Attributes that describe transposition. + transposition (diatonic) Records the amount of diatonic pitch shift, e.g., C to C♯ = 0, C to D♭ = 1, necessary @@ -14818,14 +14922,14 @@ - +

Diatonic transposition requires both trans.diat and trans.semi attributes in order to distinguish the difference, for example, between a transposition from C to C♯ and one from C to D♭.

- Attributes that describe tuning. - + Attributes that describe tuning. + Holds a value for cycles per second, i.e., Hertz, for a tuning reference pitch. @@ -14846,8 +14950,8 @@ - Attributes for indicating the presence of a tuplet. - + Attributes for indicating the presence of a tuplet. + Indicates that this feature participates in a tuplet. If visual information about the tuplet needs to be recorded, then a tuplet element should be @@ -14858,11 +14962,11 @@ - Attributes which can be used to classify features. - + Attributes which can be used to classify features. + - + Designation which characterizes the element in some sense, using any convenient classification scheme or typology that employs single-token labels. @@ -14871,12 +14975,12 @@ - +

When appropriate, values from an established typology should be used.

- Typographical attributes. - + Typographical attributes. + Contains the name of a font-family. @@ -14924,8 +15028,8 @@ - Attributes that record vertical alignment. - + Attributes that record vertical alignment. + Records vertical alignment. @@ -14934,8 +15038,8 @@ - Attributes that record grouping of vertically aligned elements. - + Attributes that record grouping of vertically aligned elements. + Provides a label for members of a vertically aligned group. @@ -14944,8 +15048,8 @@ - Attributes describing whether a feature should be displayed. - + Attributes describing whether a feature should be displayed. + Indicates if a feature should be rendered when the notation is presented graphically or sounded when it is presented in an aural form. @@ -14955,18 +15059,18 @@ - Visual offset attributes. Some items may have their location recorded in terms of offsets + Visual offset attributes. Some items may have their location recorded in terms of offsets from their programmatically-determined location. The ho attribute records the horizontal offset while vo records the vertical. The to attribute holds a timestamp offset, the most common use of which is as an alternative to the ho attribute. - + - Horizontal offset attributes. - + Horizontal offset attributes. + Records a horizontal adjustment to a feature’s programmatically-determined location in terms of staff interline distance; that is, in units of 1/2 the distance between adjacent @@ -14977,8 +15081,8 @@ - Horizontal offset attributes specified in terms of time. - + Horizontal offset attributes specified in terms of time. + Records a timestamp adjustment of a feature’s programmatically-determined location in terms of musical time; that is, beats. @@ -14988,8 +15092,8 @@ - Vertical offset attributes. - + Vertical offset attributes. + Records the vertical adjustment of a feature’s programmatically-determined location in terms of staff interline distance; that is, in units of 1/2 the distance between adjacent @@ -15000,20 +15104,20 @@ - Visual offset attributes. Some items may have their location recorded in terms of pairs of + Visual offset attributes. Some items may have their location recorded in terms of pairs of offsets from their programmatically-determined location. The startho and endho attributes record the horizontal offsets of the start and end points of the item, respectively. Similarly, the startvo and endvo attributes record the vertical offsets of the start and end points of the item. The startto and endto attributes hold timestamp offsets, the most common use of which is as alternatives to the ho attributes. - + - Horizontal offset requiring a pair of attributes. - + Horizontal offset requiring a pair of attributes. + Records the horizontal adjustment of a feature’s programmatically-determined start point. @@ -15030,9 +15134,9 @@ - Horizontal offset attributes requiring a pair of attributes specified in terms of + Horizontal offset attributes requiring a pair of attributes specified in terms of time. - + Records a timestamp adjustment of a feature’s programmatically-determined start point. @@ -15049,8 +15153,8 @@ - Vertical offset attributes requiring a pair of attributes. - + Vertical offset attributes requiring a pair of attributes. + Records a vertical adjustment of a feature’s programmatically-determined start point. @@ -15067,8 +15171,8 @@ - Attributes that describe the symbol used to group volta elements. - + Attributes that describe the symbol used to group volta elements. + Specifies the symbol used to group lyrics. @@ -15092,9 +15196,9 @@ - Attributes that address whitespace processing. + Attributes that address whitespace processing. - + Allows one to signal to an application whether an element’s white space is "significant". The behavior of xml:space cascades to all descendant elements, but it can @@ -15112,8 +15216,8 @@ - Attributes that describe horizontal size. - + Attributes that describe horizontal size. + Measurement of the horizontal dimension of an entity. @@ -15121,22 +15225,22 @@ - +

The width attribute may be used to capture measure width data for interchange with music printing systems that utilize this information for printing. On barLine the width attribute captures the width of the preceding measure.

-
Output coordinate attributes. Some elements may have their exact rendered *output* + Output coordinate attributes. Some elements may have their exact rendered *output* coordinates recorded. x and y attributes indicate where to place the rendered output. Recording the coordinates of a feature in a facsimile requires the use of the facs - attribute. + attribute. Encodes an x coordinate for a feature in an output coordinate system. When it is necessary to record the placement of a feature in a facsimile image, use the facs attribute. - + Encodes a y coordinate for a feature in an output coordinate system. When it is necessary to record the placement of a feature in a facsimile image, use the facs attribute. @@ -15144,11 +15248,11 @@ - Output coordinate attributes. Some elements may need 2 coordinate pairs to record their + Output coordinate attributes. Some elements may need 2 coordinate pairs to record their rendered *output* coordinates. The attributes indicate where to place the rendered output. Recording the coordinates of a feature in a facsimile requires the use of the facs attribute. - + Encodes the optional 2nd x coordinate. @@ -15163,33 +15267,33 @@ - Groups elements used to represent a postal address. - + Groups elements used to represent a postal address. + - Groups annotation-like elements. - + Groups annotation-like elements. + - Groups elements containing a bibliographic description. - + Groups elements containing a bibliographic description. + - Groups elements that may appear as part of a bibliographic description. + Groups elements that may appear as part of a bibliographic description. - Groups elements that contain the text of a caption or other text displayed along with a + Groups elements that contain the text of a caption or other text displayed along with a figure. - Groups elements that may appear as part of the content of a chord element. + Groups elements that may appear as part of the content of a chord element. - Groups elements, such as dynamics, ties, phrase marks, pedal marks, etc., which depend + Groups elements, such as dynamics, ties, phrase marks, pedal marks, etc., which depend upon other events, such as notes or rests, for their existence. - + @@ -15197,257 +15301,257 @@ - Groups elements containing date expressions. - + Groups elements containing date expressions. + - Groups elements which describe a measurement forming part of the physical dimensions of an + Groups elements which describe a measurement forming part of the physical dimensions of an object. - + - Groups elements containing bibliographic edition information. - + Groups elements containing bibliographic edition information. + - Groups editorial intervention elements. - + Groups editorial intervention elements. + - Groups elements that represent alternative endings. - + Groups elements that represent alternative endings. + - Groups event elements that occur in all notational repertoires. - + Groups event elements that occur in all notational repertoires. + - Groups elements used to provide a heading at the start of a text division or other markup + Groups elements used to provide a heading at the start of a text division or other markup component. - Groups identifier-like elements. - + Groups identifier-like elements. + - Groups elements that may appear as part of a bibliographic imprint. + Groups elements that may appear as part of a bibliographic imprint. - Groups elements used to represent a textual or musical incipit. - + Groups elements used to represent a textual or musical incipit. + - Groups elements used to declare a MIDI instrument. + Groups elements used to declare a MIDI instrument. - Groups elements that represent accidentals in a key signature. + Groups elements that represent accidentals in a key signature. - Groups elements that have the same function as a key signature. - + Groups elements that have the same function as a key signature. + - Groups elements used to assign a label to other parts of a document. + Groups elements used to assign a label to other parts of a document. - Groups elements that permit declaration of layer properties. + Groups elements that permit declaration of layer properties. - Groups elements that function as notational layers within a staff. - + Groups elements that function as notational layers within a staff. + - Groups notated events that may appear at the layer level in all repertoires. + Groups notated events that may appear at the layer level in all repertoires. - Groups notated events at the layer level that are shared by the mensural and neume + Groups notated events at the layer level that are shared by the mensural and neume repertoires. - + - Groups elements that function like line beginnings. - + Groups elements that function like line beginnings. + - Groups elements used to represent generic structural divisions of music notation. + Groups elements used to represent generic structural divisions of music notation. - Groups elements that represent a measurement. - + Groups elements that represent a measurement. + - Groups elements that represent a meter signature. - + Groups elements that represent a meter signature. + - Groups milestone-style elements found in music notation. + Groups milestone-style elements found in music notation. - Groups milestone-style elements found in text. + Groups milestone-style elements found in text. - Groups elements that contain names. - + Groups elements that contain names. + - Groups elements that modify note-like features. - + Groups elements that modify note-like features. + - Groups elements that denote a number or a quantity. - + Groups elements that denote a number or a quantity. + - Groups elements which may appear as part of the paragraph content model. A paragraph may + Groups elements which may appear as part of the paragraph content model. A paragraph may contain inline elements and all other block-level elements except itself. - Groups elements that represent a separate performer part. + Groups elements that represent a separate performer part. - Groups elements that collect separate performer parts. + Groups elements that collect separate performer parts. - Groups page beginning-like elements. - + Groups page beginning-like elements. + - Groups paragraph-like elements. - + Groups paragraph-like elements. + - Collects elements that express a relationship. - + Collects elements that express a relationship. + - Groups elements that mark typographical features. - + Groups elements that mark typographical features. + - Groups elements that denote a corporate entity that holds a bibliographic item. - + Groups elements that denote a corporate entity that holds a bibliographic item. + - Groups non-text components that represent the content of the musical text. + Groups non-text components that represent the content of the musical text. - Groups elements that are used to indicate intellectual or other significant + Groups elements that are used to indicate intellectual or other significant responsibility, for example within a bibliographic citation. - + - Groups elements that delineate particular responsibilities as opposed to the respStmt + Groups elements that delineate particular responsibilities as opposed to the respStmt element that provides for generic statements of responsibility. - + - Groups elements that provide score meta-information. - + Groups elements that provide score meta-information. + - Groups elements that represent a score. + Groups elements that represent a score. - Groups elements that may appear as part of a score. + Groups elements that may appear as part of a score. - Groups elements that represent a segment of music notation. - + Groups elements that represent a segment of music notation. + - Groups elements that may appear as part of a section. + Groups elements that may appear as part of a section. - Groups elements that may appear as part of a section in the mensural and neume + Groups elements that may appear as part of a section in the mensural and neume repertoires. - + - Groups elements that permit declaration of staff properties. - + Groups elements that permit declaration of staff properties. + - Groups elements that may appear in the declaration of staff features. + Groups elements that may appear in the declaration of staff features. - Groups elements that permit declaration of staff group properties. + Groups elements that permit declaration of staff group properties. - Groups elements that function like staves. - + Groups elements that function like staves. + - Groups elements that are components of a staff. + Groups elements that are components of a staff. - Groups elements that are components of a staff in the mensural and neume + Groups elements that are components of a staff in the mensural and neume repertoires. - + - Groups elements that contain a lyric syllable. - + Groups elements that contain a lyric syllable. + - Groups block-level text elements. - + Groups block-level text elements. + - Groups textual elements that occur at the level of individual words or phrases. - + Groups textual elements that occur at the level of individual words or phrases. + - Groups textual elements that occur at the level of individual words or phrases. This class + Groups textual elements that occur at the level of individual words or phrases. This class is equivalent to the model.textPhraseLike class without the pb element. - + - Groups elements that denote the name of a bibliographic item. - + Groups elements that denote the name of a bibliographic item. + - Groups elements that may appear as part of a title page transcription. - accidentalRecords a temporary alteration to the pitch of a note. + Groups elements that may appear as part of a title page transcription. + accidentalRecords a temporary alteration to the pitch of a note. @@ -15456,9 +15560,9 @@ - + - +

An accidental may raise a pitch by one or two semitones or it may cancel a previous accidental or part of a key signature. This element provides an alternative to the accid and accid.ges attributes on the note @@ -15466,38 +15570,38 @@ be recorded for the accidental or when multiple accidentals occur on a single note. The func attribute can be used to differentiate between the accidental’s functions, such as 'cautionary' or 'editorial'.

-
Name of an actor appearing within a cast list. + Name of an actor appearing within a cast list. - + - +

The model of this element is based on the actor element of the Text Encoding Initiative (TEI).

-
Contains a postal address, for example of a publisher, an organization, or an - individual. + Contains a postal address, for example of a publisher, an organization, or an + individual. - + - +

The model of this element is based on the address element of the Text Encoding Initiative (TEI) and the address element of the Encoded Archival Description (EAD).

-
address lineSingle line of a postal address. + address lineSingle line of a postal address. - + - +

addrLine may be repeated as many times as necessary to enter all lines of an address.

-
+

The model of this element is based on the addrLine element of the Text Encoding Initiative (TEI) and the addressline element of the Encoded Archival Description (EAD).

-
Range of a voice, instrument or piece. + Range of a voice, instrument or piece. @@ -15505,20 +15609,20 @@ - + - Highest or lowest pitch in a score, staff, or layer. + Highest or lowest pitch in a score, staff, or layer. - + - analytic levelContains bibliographic elements describing an item (e.g., an article or - poem) published within a monograph or journal and not as an independent publication. + analytic levelContains bibliographic elements describing an item (e.g., an article or + poem) published within a monograph or journal and not as an independent publication. @@ -15526,12 +15630,12 @@ - + - annotationProvides a statement explaining the text or indicating the basis for an - assertion. + annotationProvides a statement explaining the text or indicating the basis for an + assertion. @@ -15546,16 +15650,16 @@ - + - + The @data attribute may only occur on an annotation within the notesStmt element. - +

The annot element can be used for both general comments and for annotations of the musical text. It provides a way to group participating *events* and/or *control events*, for example, the notes that form a descending bass line, and provide a @@ -15567,18 +15671,18 @@ recorded by either a dur, dur.ges or endid attribute. The resp attribute records the editor(s) responsible for identifying or creating the annotation.

-
A person or organization who transcribes a musical composition, usually for a different + A person or organization who transcribes a musical composition, usually for a different medium from that of the original; in an arrangement the musical substance remains essentially - unchanged. + unchanged. - + - articulationAn indication of how to play a note or chord. + articulationAn indication of how to play a note or chord. @@ -15587,29 +15691,29 @@ - + - +

Articulations typically affect duration, such as staccato marks, or the force of attack, such as accents. This element provides an alternative to the artic attribute on the note and chord elements. It may be used when specific display info, such as size or color, needs to be recorded for the articulation or when multiple articulation marks occur on a single note or chord.

-
The name of the creator of the intellectual content of a non-musical, literary - work. + The name of the creator of the intellectual content of a non-musical, literary + work. - + - +

The model of this element is based on the author element of the Text Encoding Initiative (TEI) and the author element of the Encoded Archival Description (EAD).

-
Vertical line drawn through one or more staves that divides musical notation into metrical - units. + Vertical line drawn through one or more staves that divides musical notation into metrical + units. @@ -15619,74 +15723,74 @@ - + - +

This element is provided for repertoires, such as mensural notation, that lack measures. Because the barLine element’s attributes, from which the logical and visual characteristics of the bar line can be discerned, largely duplicate those of measure, the use of barLine is not necessary within measure elements in CMN.

-
bibliographic referenceProvides a loosely-structured bibliographic citation in which - the sub-components may or may not be explicitly marked. + bibliographic referenceProvides a loosely-structured bibliographic citation in which + the sub-components may or may not be explicitly marked. - + - +

bibl may contain a mix of text and more specific elements such as title, edition, persName, and corpName. This element may also function as a hypertext reference to an external electronic resource. Do not confuse this element with ref, which does not provide special bibliographic sub-elements.

-
+

The model of this element is based on the bibl element of the Text Encoding Initiative (TEI) and the bibref element of the Encoded Archival Description (EAD).

-
List of bibliographic references. + List of bibliographic references. - + - + When labels are used, usually each bibliographic item has one. - +

The model of this element is based on the listBibl element of the Text Encoding Initiative (TEI).

-
scope of citationDefines the scope of a bibliographic reference, for example as a - list of page numbers, or a named subdivision of a larger work. + scope of citationDefines the scope of a bibliographic reference, for example as a + list of page numbers, or a named subdivision of a larger work. - + - + - + - +

Use the from and to attributes to regularize the beginning and ending values provided in the element content.

The model of this element is based on the biblScope element of the Text Encoding Initiative (TEI).

-
structured bibliographic citationContains a bibliographic citation in which - bibliographic sub-elements must appear in a specified order. + structured bibliographic citationContains a bibliographic citation in which + bibliographic sub-elements must appear in a specified order. @@ -15695,9 +15799,9 @@ - + - Contains the whole of a single musical text, excluding any front or back matter. + Contains the whole of a single musical text, excluding any front or back matter.

When the music can be broken into high-level, discrete, linear segments, such as movements of a symphony, there may be multiple mdiv elements within body. This is the highest level indication of the structure of the music.

@@ -15705,8 +15809,8 @@ notation to be interleaved. This permits the encoding of a wide range of musical documents, including those that are primarily textual with only occasional musical material or even those which completely lack music notation.

-
Break, pause, or interruption in the normal tempo of a composition. Typically indicated by - "railroad tracks", i.e., two diagonal slashes. + Break, pause, or interruption in the normal tempo of a composition. Typically indicated by + "railroad tracks", i.e., two diagonal slashes. @@ -15714,16 +15818,16 @@ - + - + Must have one of the attributes: startid, tstamp, tstamp.ges or tstamp.real. - +

The caesura often indicates an abrupt interruption in the performance followed by an equally sudden resumption. Its duration is typically shorter than a grand pause (G.P.) or long pause (L.P.), but longer than that indicated by a breath mark. @@ -15737,44 +15841,44 @@ attributes, a caesura will be rendered as a pair of slanted lines through the top line of the staff.

- A label which accompanies an illustration or a table. + A label which accompanies an illustration or a table. - + - cast groupGroups one or more individual castItem elements within a cast list. + cast groupGroups one or more individual castItem elements within a cast list. - + - +

The model of this element is based on the castGroup element of the Text Encoding Initiative (TEI).

-
Contains a single entry within a cast list, describing either a single role or a list of - non-speaking roles. + Contains a single entry within a cast list, describing either a single role or a list of + non-speaking roles. - + - +

The model of this element is based on the castItem element of the Text Encoding Initiative (TEI).

-
Contains a single cast list or dramatis personae. + Contains a single cast list or dramatis personae. - + - +

The model of this element is based on the castList element of the Text Encoding Initiative (TEI).

-
column beginningAn empty formatting element that forces text to begin in a new - column. + column beginningAn empty formatting element that forces text to begin in a new + column. @@ -15784,14 +15888,14 @@ - + - + Records the column number. - + @@ -15803,10 +15907,10 @@ - +

The model of this element is based on the cb element of the Text Encoding Initiative (TEI).

-
A simultaneous sounding of two or more notes in the same layer *with the same - duration*. + A simultaneous sounding of two or more notes in the same layer *with the same + duration*. @@ -15814,10 +15918,10 @@ - + - Indication of the exact location of a particular note on the staff and, therefore, the - other notes as well. + Indication of the exact location of a particular note on the staff and, therefore, the + other notes as well. @@ -15828,9 +15932,9 @@ - + - + @@ -15838,7 +15942,7 @@ staff. - + @@ -15846,13 +15950,13 @@ staff. - +

This element can be used as an alternative to the staff element's clef.* attributes. It should be used when specific display info, such as size or color, needs to be recorded for the clef or when multiple, simultaneous clefs occur on a single staff. This element may also be used within the staff context to indicate changes of clef.

-
clef groupA set of simultaneously-occurring clefs. + clef groupA set of simultaneously-occurring clefs. @@ -15862,49 +15966,49 @@ - + - column layoutAn empty formatting element that signals the start of columnar - layout. + column layoutAn empty formatting element that signals the start of columnar + layout. - + - + Records the number of columns. - The name of the creator of the intellectual content of a musical work. + The name of the creator of the intellectual content of a musical work. - + - Names of individuals, institutions, or organizations responsible for contributions to the + Names of individuals, institutions, or organizations responsible for contributions to the intellectual content of a work, where the specialized elements for authors, editors, etc. do - not suffice or do not apply. + not suffice or do not apply. - + - + The value of @role must not contain the name of another element available in this context. - + Used to specify the contributor’s function. @@ -15913,22 +16017,22 @@

When applicable, values from the MARC relator term list (http://www.loc.gov/marc/relators/relaterm.html) or code list (http://www.loc.gov/marc/relators/relacode.html) are recommended for role.

-
Non-bibliographic details of the creation of an intellectual entity, in narrative form, + Non-bibliographic details of the creation of an intellectual entity, in narrative form, such as the date, place, and circumstances of its composition. More detailed information may - be captured within the history element. + be captured within the history element. - + - +

The model of this element is based on the creation element of the Text Encoding Initiative (TEI).

-
Symbol placed at the end of a line of music to indicate the first note of the next line. - Sometimes called a "direct". + Symbol placed at the end of a line of music to indicate the first note of the next line. + Sometimes called a "direct". @@ -15937,13 +16041,13 @@ - + - +

The most common visual form is a sign resembling a mordent. Other graphical forms may be indicated by the altsym attribute. Together the pname and oct attributes identify the location where the custos appears.

-
A string identifying a point in time or the time period between two such points. + A string identifying a point in time or the time period between two such points. @@ -15952,55 +16056,55 @@ - + - +

The model of this element is based on the date element of the Text Encoding Initiative (TEI) and the date element of the Encoded Archival Description (EAD).

-
Entity to whom a creative work is formally offered. + Entity to whom a creative work is formally offered. - + - + The dedicatee element may not be recursively nested. - Description of a measurement taken through a three-dimensional object. + Description of a measurement taken through a three-dimensional object. - + - descriptionContainer for text that briefly describes the feature to which it is - attached, including its intended usage, purpose, or application as appropriate. + descriptionContainer for text that briefly describes the feature to which it is + attached, including its intended usage, purpose, or application as appropriate. - + - +

The model of this element is based on the desc element of the Text Encoding Initiative (TEI).

-
dimensionAny single dimensional specification. + dimensionAny single dimensional specification. - + - + Aspect of the object being measured. @@ -16047,9 +16151,9 @@ Extent from side to side; breadth. - +

The height, width, and depth elements are preferred when appropriate.

-
Information about the physical size of an entity; usually includes numerical data. + Information about the physical size of an entity; usually includes numerical data. @@ -16057,9 +16161,9 @@ - + - + The depth element may only appear @@ -16070,17 +16174,16 @@ once. - +

The elements height, width, depth, and dim are available for circumstances that require the capture of the individual dimensions of an object. Do not confuse this element with the extent element, which is used to indicate the quantity of described materials.

-
+

The model of this element is based on the dimensions element of the Text Encoding Initiative (TEI) and the dimensions element of the Encoded Archival Description (EAD).

-
directiveAn instruction expressed as a combination of text and symbols — such as - segno and coda symbols, fermatas over a bar line, etc., typically above, below, or between - staves, but not on the staff — that is not encoded elsewhere in more specific elements, like - tempo or dynam. + directiveAn instruction expressed as a combination of text and symbols, typically above, + below, or between staves, but not on the staff — that is not encoded elsewhere in more specific + elements, like tempo, dynam or repeatMark. @@ -16089,16 +16192,16 @@ - + - + Must have one of the attributes: startid, tstamp, tstamp.ges or tstamp.real. - +

Examples include text strings, such as 'affettuoso', and music symbols, such as segno and coda symbols, fermatas over a bar line, etc. Directives can be control elements. That is, they can be linked via their attributes to other events. The starting point of the directive @@ -16106,20 +16209,20 @@ or tstamp.real attribute, while the ending point may be recorded by either a dur, dur.ges, endid, or tstamp2 attribute. It is a semantic error not to specify a starting point attribute.

-
Person or agency, other than a publisher, from which access (including electronic access) - to a bibliographic entity may be obtained. + Person or agency, other than a publisher, from which access (including electronic access) + to a bibliographic entity may be obtained. - + - +

The model of this element is based on the distributor element of the Text Encoding Initiative (TEI).

-
divisionMajor structural division of text, such as a preface, chapter or - section. + divisionMajor structural division of text, such as a preface, chapter or + section. @@ -16130,10 +16233,10 @@ - + - + Characterizes the textual division in some sense, using any convenient classification scheme or typology that employs single-token labels. @@ -16187,10 +16290,10 @@ explains the content, purpose, or origin of the text. - +

Often, the head sub-element identifies the div’s purpose. The model of this element is based on the div element of the Text Encoding Initiative (TEI).

-
Dot of augmentation or division. + Dot of augmentation or division. @@ -16199,13 +16302,13 @@ - + - +

This element provides an alternative to the dots attribute on note and rest elements. It should be used when specific display info, such as size or color, needs to be recorded for the dot. This element may also be used for dots of division in the mensural repertoire.

-
dynamicIndication of the volume of a note, phrase, or section of music. + dynamicIndication of the volume of a note, phrase, or section of music. @@ -16214,23 +16317,23 @@ - + - + Must have one of the attributes: startid, tstamp, tstamp.ges or tstamp.real. - + When @val2 is present, either @dur, @dur.ges, @endid, or @tstamp2 must also be present. - +

This element may be used for instantaneous or continuous textual dynamics, e.g., 'p', 'mf', or 'cresc. poco a poco'. The hairpin element should be used for graphical, i.e., crescendo and diminuendo, dynamic markings. The @@ -16240,34 +16343,34 @@ endid, or tstamp2 attribute. It is a semantic error not to specify a starting point attribute. MIDI values associated with the graphical dynamic sign may be recorded in the val and val2 attributes.

-
edition designationA word or text phrase that indicates a difference in either + edition designationA word or text phrase that indicates a difference in either content or form between the item being described and a related item previously issued by the same publisher/distributor (e.g., 2nd edition, version 2.0, etc.), or simultaneously issued by either the same publisher/distributor or another publisher/distributor (e.g., large print - edition, British edition, etc.). + edition, British edition, etc.). - + - +

The model of this element is based on the edition element of the Text Encoding Initiative (TEI) and the edition element of the Encoded Archival Description (EAD).

-
The name of the individual(s), institution(s) or organization(s) acting in an editorial - capacity. + The name of the individual(s), institution(s) or organization(s) acting in an editorial + capacity. - + - +

The model of this element is based on the editor element of the Text Encoding Initiative (TEI).

-
Alternative ending for a repeated passage of music; i.e., prima volta, seconda volta, - etc. + Alternative ending for a repeated passage of music; i.e., prima volta, seconda volta, + etc. @@ -16277,16 +16380,16 @@ - + - +

The scoreDef element is allowed as a sub-element so that an ending may have its own meta-data without the overhead of child section elements. div sub-elements are not allowed within ending. They may, however, be contained by the children of ending, e.g., measures. Endings may not contain other ending elements.

-
Contains a free-text event description. + Contains a free-text event description. @@ -16294,22 +16397,22 @@ - + - Contains historical information given as a sequence of significant past events. + Contains historical information given as a sequence of significant past events. - + - +

An eventList contains event elements that capture a brief description of the associated event, including dates and locations where the event took place. An eventList describes events associated with a work @@ -16319,20 +16422,20 @@ type attribute may be used to distinguish between event lists with different functions, such as a list of events in the compositional process and a list of performance dates.

-
Indicates how a section may be programmatically expanded into its 'through-composed' - form. + Indicates how a section may be programmatically expanded into its 'through-composed' + form. - + - +

The plist attribute contains an ordered list of identifiers of descendant section, ending, lem, or rdg elements. For example, the sequence "#A #End1 #A #End2" indicates that the section labelled 'A' comes first, then the ending labelled 'End1', followed by the 'A' section again, and finally the ending labelled 'End2'.

-
Used to express size in terms other than physical dimensions, such as number of pages, - records, bytes, physical components, etc. + Used to express size in terms other than physical dimensions, such as number of pages, + records, bytes, physical components, etc. @@ -16340,129 +16443,141 @@ - + - +

Use the dimensions element when it is necessary to specify the physical size of materials being described, for example, height and width.

-
+

The model of this element is based on the extent element of the Text Encoding Initiative (TEI).

-
Names of individuals, institutions, or organizations responsible for funding. Funders + extended dataProvides a container element for non-MEI data formats. + + + + + + + + + + +

Container for holding non-MEI data formats, similar to extMeta but available in when rather than in meiHead. The content of this element, by virtue of being inside a when element, is associated with a particular point in time in a media file and this point in time may be linked to symbolic data, such as notes, chords, rests, etc., recorded elsewhere. When the data in extData contains left angle bracket (less-than) or ampersand characters, or when it contains white space that should be preserved (such as line breaks), then the data should be enclosed in a CDATA section (e.g., for JSON formatted data).

+
Names of individuals, institutions, or organizations responsible for funding. Funders provide financial support for a project; they are distinct from sponsors, who provide - intellectual support and authority. + intellectual support and authority. - + - +

The model of this element is based on the funder element of the Text Encoding Initiative (TEI).

-
Term or terms that designate a category characterizing a particular style, form, or - content. + Term or terms that designate a category characterizing a particular style, form, or + content. - + - Contains a composite musical text, grouping together a sequence of distinct musical texts + Contains a composite musical text, grouping together a sequence of distinct musical texts (or groups of such musical texts) which are regarded as a unit for some purpose, for example, - the collected works of a composer. + the collected works of a composer. - + - +

Because its model contains the music element, each of the subordinate MEI documents can have its own front and back matter.

-
+

The model of this element is based on the group element of the Text Encoding Initiative (TEI).

-
group symbolA brace or bracket used to group two or more staves of a score or - part. + group symbolA brace or bracket used to group two or more staves of a score or + part. - + - + In scoreDef, grpSym must have startid, endid, and level attributes. - + In staffGrp, grpSym must not have startid, endid, or level attributes. - +

This element provides an alternative to the staffGrp element's symbol attribute. It may be used when exact placement or editorial details for the grouping symbol must be recorded.

-
headingContains any heading, for example, the title of a section of text, or the - heading of a list. + headingContains any heading, for example, the title of a section of text, or the + heading of a list. - + - +

One or more head elements usually identify the parent element and/or its purpose.

-
+

The model of this element is based on the head element of the Encoded Archival Description (EAD), the head element of the Text Encoding Initiative (TEI), and the head element of HTML.

-
Description of the vertical size of an object. + Description of the vertical size of an object. - + - An alpha-numeric string that establishes the identity of the described material. + An alpha-numeric string that establishes the identity of the described material. - + - +

Examples include an International Standard Book/Music Number, Library of Congress Control Number, publisher’s number, a personal identification number, an entry in a bibliography or catalog, etc. The type attribute may be used to indicate the system from which the identifier was derived.

-
Information relating to the publication or distribution of a bibliographic item. + Information relating to the publication or distribution of a bibliographic item. - + - +

The model of this element is based on the imprint element of the Text Encoding Initiative (TEI).

-
incipitThe opening music and/or words of a musical or textual work. + incipitThe opening music and/or words of a musical or textual work. - + @@ -16472,13 +16587,13 @@ - +

The incipText element may be used to capture a text incipit, while score is available to provide an MEI-encoded musical incipit. Images of an incipit may be referenced using the graphic element. An incipit encoded in a text format other than MEI may be placed in the incipCode element.

-
key accidentalAccidental in a key signature. + key accidentalAccidental in a key signature. @@ -16486,16 +16601,16 @@ - + - + One of the following is required: @x and @y attribute pair, @pname attribute, or @loc attribute. - + Specifies whether enharmonic (written) values or implicit ("perform-able") values are allowed. @@ -16506,11 +16621,11 @@ All enharmonic (written) values allowed. - +

It is a semantic error not to provide one of the following: the x and y pair of attributes, the pname and oct pair of attributes, or the loc attribute.

-
key signatureWritten key signature. + key signatureWritten key signature. @@ -16518,9 +16633,9 @@ - + - + If the @oct attribute @@ -16528,37 +16643,37 @@ elements. - + Only keyAccid elements are allowed here. - A container for document text that identifies the feature to which it is attached. For a - "tool tip" or other generated label, use the label attribute. + A container for document text that identifies the feature to which it is attached. For a + "tool tip" or other generated label, use the label attribute. - + - +

The model of this element is based on the label element of the Text Encoding Initiative (TEI).

Don't confuse this element, which is used to capture labelling text appearing in the document, with the label attribute, which records text to be used to generate a designation for the element to which it’s attached, a "tool tip" or prefatory text, for example.

-
A label on the pages following the first. + A label on the pages following the first. - + - An independent stream of events on a staff. + An independent stream of events on a staff. @@ -16572,9 +16687,9 @@ - + - +

The term 'layer' is used instead of 'voice' in order to avoid confusion between 'voice' and 'voice leading' and 'voicing'. The def attribute may be used to create a connection with a layerDef element where logical and visual @@ -16583,7 +16698,7 @@ n attribute. If neither def nor n attributes are present, then encoding order of the layers is presumed to match the encoding order of the layer definitions.

-
layer definitionContainer for layer meta-information. + layer definitionContainer for layer meta-information. @@ -16596,28 +16711,28 @@ - + - line beginningAn empty formatting element that forces text to begin on a new - line. + line beginningAn empty formatting element that forces text to begin on a new + line. - + - +

The n attribute should be used to record a number associated with this textual line. See comment on verse element for description of func attribute. Do not confuse this element with the sb element, which performs a similar function for musical notation.

-
+

The model of this element is based on the lb element of the Text Encoding Initiative (TEI).

-
line groupMay be used for any section of text that is organized as a group of lines; + line groupMay be used for any section of text that is organized as a group of lines; however, it is most often used for a group of verse lines functioning as a formal unit, e.g., a - stanza, refrain, verse paragraph, etc. + stanza, refrain, verse paragraph, etc. @@ -16628,31 +16743,31 @@ - + - +

The model of this element is based on the lg element of the Text Encoding Initiative (TEI).

-
Person or organization who is a writer of the text of an opera, oratorio, etc. + Person or organization who is a writer of the text of an opera, oratorio, etc. - + - Person or organization who is a writer of the text of a song. + Person or organization who is a writer of the text of a song. - + - musical divisionContains a subdivision of the body of a musical text. + musical divisionContains a subdivision of the body of a musical text. @@ -16661,9 +16776,9 @@ - + - +

The mdiv element may contain one or both of 2 possible views of the music. The score view is the traditional full and open score while the parts view contains each performer’s view of the score; that is, his part. These 2 views are necessary because @@ -16674,45 +16789,45 @@ part layout) than the other movements. The mdiv element may be recursively nested in order to represent music which exhibits this kind of structure. For example, an opera is normally divided into acts, which are in turn divided into scenes.

-
Contains a single MEI-conformant document, consisting of an MEI header and a musical text, - either in isolation or as part of an meiCorpus element. + Contains a single MEI-conformant document, consisting of an MEI header and a musical text, + either in isolation or as part of an meiCorpus element. - + - + The values in @staff must correspond to @n attribute of a staffDef element. - +

The mei element defines an instance of a document encoded with the MEI schema. It is the document element for a single document containing a header and data. The name of this element should not be changed by any customization in order to assure an absolute minimum level of MEI compliance.

-
monograph levelContains bibliographic elements describing an item, for example, a - published book or journal, score, recording, or an unpublished manuscript. + monograph levelContains bibliographic elements describing an item, for example, a + published book or journal, score, recording, or an unpublished manuscript. - + - Contains a single musical text of any kind, whether unitary or composite, for example, an - etude, opera, song cycle, symphony, or anthology of piano solos. + Contains a single musical text of any kind, whether unitary or composite, for example, an + etude, opera, song cycle, symphony, or anthology of piano solos. - + - Proper noun or noun phrase. + Proper noun or noun phrase. @@ -16726,16 +16841,16 @@ - + - + Recommended practice is to use name elements to capture sub-parts of a generic name. - + Characterizes the name in some sense, using any convenient classification scheme or typology that employs single-token labels. @@ -16761,7 +16876,7 @@ Name of a period of time. - +

Contains the name of an entity that is difficult to tag more specifically, for example, as a corpName, geogName, persName, or title. The name element may be used in place of the more specific elements when it is not known what kind of name is @@ -16778,9 +16893,9 @@ Thesaurus of Geographic Names (TGN) or Library of Congress Name Authority File (LCNAF), and its electronically-available location may be recorded using the auth and auth.uri attributes.

-
+

The model of this element is based on the name element of the Encoded Archival Description (EAD).

-
A single pitched event. + A single pitched event. @@ -16789,9 +16904,9 @@ - + - +

The accid and artic sub-elements may be used instead of the note element’s attributes when accid and artic represent first-class objects, e.g., when they require attributes, such as x and y location @@ -16802,25 +16917,25 @@ imperfect. In the CMN repertoire, coloration is an inversion of the note head’s normal rendition, that is, the note head is void when it would otherwise be filled and vice versa. Do not confuse this with visual color.

-
numberNumeric information in any form. + numberNumeric information in any form. - + - + Numeric value capturing a measurement or count. Can only be interpreted in combination with the unit attribute. - +

Use this element only when it is necessary to display a number in a special way or to identify it with a type attribute.

-
An element indicating an ornament that is not a mordent, turn, or trill. + An element indicating an ornament that is not a mordent, turn, or trill. @@ -16828,47 +16943,47 @@ - + - + Must have one of the attributes: startid, tstamp, tstamp.ges or tstamp.real. - +

If it is not textual, the glyph of the ornament may be indicated with the altsym attribute, and it is recommended to provide an expansion of the ornament on the staff content. The starting point of the ornament may be indicated by either a startid, tstamp, tstamp.ges, or tstamp.real attribute. It is a semantic error not to specify one of these attributes.

-
paragraphOne or more text phrases that form a logical prose passage. + paragraphOne or more text phrases that form a logical prose passage. - + - +

A paragraph is usually typographically distinct: The text usually begins on a new line and the first letter of the content is often indented, enlarged, or both.

-
+

The model of this element is based on the p element of the Encoded Archival Description, the p element of the Text Encoding Initiative (TEI), and the p element of HTML.

-
paddingAn indication of extra visual space between notational elements. + paddingAn indication of extra visual space between notational elements. - + - An alternative visual rendition of the score from the point of view of a particular - performer (or group of performers). + An alternative visual rendition of the score from the point of view of a particular + performer (or group of performers). @@ -16876,9 +16991,9 @@ - + - +

part elements are not used in MEI to indicate voice leading. next attributes on event elements should be used for this purpose. part elements are useful for encoding individual parts when there is no score, such as early music part books, when the music has non-aligning bar lines, when @@ -16887,7 +17002,7 @@ a score is desired and there are non-aligning bar lines, bar lines which indicate points of alignment across all the parts may be marked as 'controlling', while non-aligning ones may be marked as 'non-controlling'.

-
Provides a container for performers' parts. + Provides a container for performers' parts. @@ -16895,10 +17010,10 @@ - + - page beginningAn empty formatting element that forces text to begin on a new - page. + page beginningAn empty formatting element that forces text to begin on a new + page. @@ -16908,71 +17023,71 @@ - + - +

The n attribute should be used to record the page number displayed in the source. It need not be an integer, e.g., 'iv', or 'p17-3'. The logical page number can be calculated by counting previous pb ancestor elements. When used in a score context, a page beginning implies an accompanying system beginning.

-
+

The model of this element is based on the pb element of the Text Encoding Initiative (TEI).

-
page descriptionContains a brief prose description of the appearance or description - of the content of a physical page. + page descriptionContains a brief prose description of the appearance or description + of the content of a physical page. - + - +

Best practice suggests the use of controlled vocabulary. Don't confuse this element with a figure caption. A caption is text primarily intended for display with an illustration. It may or may not function as a description of the illustration.

-
page footerA running footer. + page footerA running footer. - + - + Records horizontal alignment of the page footer. - + Records the function (i.e., placement) of the page footer. - +

This element is used to capture the textual data that often appears in printed music. It may also be used for similarly formatted material in manuscripts. When used within pb, it records a temporary suspension of the pattern of page footers established by the use of pgFoot within a previous scoreDef. Auto-generated page numbers may be indicated with a processing instruction. The pgHead and pgFoot elements should *not* be used to encode textual notes/annotations.

-
page headerA running header. + page headerA running header. - + - + Records horizontal alignment of the page header. - + Records the function (i.e., placement) of the page header. - +

This element is used to capture the textual data that often appears in printed music. It may also be used for similarly formatted material in manuscripts. When used within pb, it records a temporary suspension of the pattern of page headers established by the use of pgHead within a previous scoreDef. Auto-generated page numbers may be indicated with a processing instruction. The pgHead and pgFoot elements should *not* be used to encode textual notes/annotations.

-
Indication of 1) a "unified melodic idea" or 2) performance technique. + Indication of 1) a "unified melodic idea" or 2) performance technique. @@ -16980,9 +17095,9 @@ - + - + Must have one of the @@ -16991,7 +17106,7 @@ dur, dur.ges, endid, or tstamp2. - + The visual attributes of the phrase (@bezier, @bulge, @curvedir, @lform, @@ -17000,7 +17115,7 @@ elements. - +

Historically, the term "slur" indicated two notes performed legato, while the term "phrase" was used for a "unified melodic idea". Nowadays, however, "slur" often has the same meaning as "phrase" (See Read, p. 265-266), since the visual rendition of the two concepts is the @@ -17015,52 +17130,52 @@ bezier attributes may be used to record the curvature of the phrase/slur. The slur and tie elements may be used instead of the slur.* and tie.* attributes provided on chord and note elements when 1) they are required by software, or 2) multiple, alternative slurs are needed.

-
physical locationGroups information about the current physical location of a + physical locationGroups information about the current physical location of a bibliographic item, such as the repository in which it is located and its shelf mark(s), and - its previous locations. + its previous locations. - + - +

The model of this element is based on the physloc element of the Encoded Archival Description (EAD).

-
Name of the organization responsible for the publication of a bibliographic item. + Name of the organization responsible for the publication of a bibliographic item. - + - +

The model of this element is based on the publisher element of the Text Encoding Initiative (TEI).

-
publication placeName of the place where a bibliographic item was published. + publication placeName of the place where a bibliographic item was published. - + - +

The model of this element is based on the pubPlace element of the Text Encoding Initiative (TEI).

-
The name of the individual(s), institution(s) or organization(s) receiving - correspondence. + The name of the individual(s), institution(s) or organization(s) receiving + correspondence. - + - related itemContains or references another bibliographic item which is related to the - present one. + related itemContains or references another bibliographic item which is related to the + present one. @@ -17068,14 +17183,14 @@ - + - + Describes the relationship between the entity identified by the relatedItem element and the resource described in the parent element, i.e., bibl, source or relatedItem. - Describes a relationship or linkage amongst entities. + Describes a relationship or linkage amongst entities. @@ -17085,9 +17200,9 @@ - + - + @@ -17104,13 +17219,13 @@ must be present. - + Describes the relationship between the entities identified by the plist and target attributes. - +

The plist and target attributes identify the participants in a relationship, while the rel attribute describes the nature of their relationship. A mutual relationship can be described using only the plist attribute – the @@ -17119,16 +17234,17 @@ pointed "to". If the target attribute is present, but the plist is not, the relationship is presumed to exist between the parent of the current relation element and the entities identified by target.

-
Gathers relation elements. + Gathers relation elements. - + - renderA formatting element indicating special visual rendering, e.g., bold or - italicized, of a text word or phrase. + renderA formatting element indicating special visual rendering, e.g., bold or + italicized, of a text word or phrase. + @@ -17136,58 +17252,60 @@ - + - + A positive value for rotation rotates the text in a counter-clockwise fashion, while negative values produce clockwise rotation. - +

When an entire element should be rendered in a special way, a style sheet function should - be used instead of the rend element.

-
Institution, agency, or individual which holds a bibliographic item. + be used instead of the rend element. The glyph.auth and glyph.uri + attributes may be used to specify an external authority, e.g., SMuFL, to be used for + displaying code points in the textual content of the element.

+
Institution, agency, or individual which holds a bibliographic item. - + - +

Sub-units of the holding institution may be marked with repository sub-elements. The name of the list from which a controlled value is taken may be recorded using the auth attribute.

-
+

The model of this element is based on the repository element of the Encoded Archival Description (EAD).

-
responsibilityA phrase describing the nature of intellectual responsibility. + responsibilityA phrase describing the nature of intellectual responsibility. - + - +

The name of the list from which a controlled value is taken may be recorded using the auth attribute.

-
+

The model of this element is based on the resp element of the Text Encoding Initiative (TEI).

-
responsibility statementTranscription of text that names one or more individuals, + responsibility statementTranscription of text that names one or more individuals, groups, or in rare cases, mechanical processes, responsible for creation, realization, - production, funding, or distribution of the intellectual or artistic content. + production, funding, or distribution of the intellectual or artistic content. - + - + At least one element pair (a resp element and a name-like element) is @@ -17195,9 +17313,9 @@ attribute. - +

The model of this element is based on the respStmt element of the Text Encoding Initiative (TEI).

-
A non-sounding event found in the source being transcribed. + A non-sounding event found in the source being transcribed. @@ -17205,9 +17323,9 @@ - + - + @@ -17215,27 +17333,27 @@ staff. - +

See (Read, p. 96-102). Do not confuse this element with the space element, which is used as an aid for visual alignment.

-
Name of a dramatic role, as given in a cast list. + Name of a dramatic role, as given in a cast list. - + - +

The model of this element is based on the role element of the Text Encoding Initiative (TEI).

-
role descriptionDescribes a character’s role in a drama. + role descriptionDescribes a character’s role in a drama. - + - +

The model of this element is based on the roleDesc element of the Text Encoding Initiative (TEI).

-
system beginningAn empty formatting element that forces musical notation to begin on - a new line. + system beginningAn empty formatting element that forces musical notation to begin on + a new line. @@ -17244,12 +17362,12 @@ - + - +

Do not confuse this element with the lb element, which performs a similar function in prose.

-
Full score view of the musical content. + Full score view of the musical content. @@ -17257,21 +17375,21 @@ - + - +

Since the measure element is optional, a score may consist entirely of page beginnings, each of which points to a page image. div elements are allowed preceding and following sections of music data in order to accommodate blocks of explanatory text.

-
score definitionContainer for score meta-information. + score definitionContainer for score meta-information. - + @@ -17282,7 +17400,7 @@ - Segment of music data. + Segment of music data. @@ -17293,10 +17411,10 @@ - + - + A @@ -17304,24 +17422,24 @@ elements. - +

This element functions as a container for actual music data. Pointing attributes make it possible to connect this element to other internal or external entities, such as media objects or annotations.

-
Contains information about the serial publication in which a bibliographic item has - appeared. + Contains information about the serial publication in which a bibliographic item has + appeared. - + - +

The model of this element is based on the series element of the Text Encoding Initiative (TEI).

-
A placeholder used to fill an incomplete measure, layer, etc. most often so that the - combined duration of the events equals the number of beats in the measure. + A placeholder used to fill an incomplete measure, layer, etc. most often so that the + combined duration of the events equals the number of beats in the measure. @@ -17330,45 +17448,45 @@ - + - Contains a specialized form of heading or label, giving the name of one or more speakers - in a dramatic text or fragment. + Contains a specialized form of heading or label, giving the name of one or more speakers + in a dramatic text or fragment. - + - +

The model of this element is based on the speaker element of the Text Encoding Initiative (TEI).

-
Names of sponsoring individuals, organizations or institutions. Sponsors give their + Names of sponsoring individuals, organizations or institutions. Sponsors give their intellectual authority to a project; they are to be distinguished from funders, who provide - the funding but do not necessarily take intellectual responsibility. + the funding but do not necessarily take intellectual responsibility. - + - +

The model of this element is based on the sponsor element of the Text Encoding Initiative (TEI) and the sponsor element of the Encoded Archival Description (EAD).

-
stacked textAn inline table with a single column. + stacked textAn inline table with a single column. - + - + Indicates the delimiter used to mark the portions of text that are to be stacked. - + Specifies how the stacked text components should be aligned. @@ -17384,10 +17502,10 @@ Aligned on right-most digit. - A group of equidistant horizontal lines on which notes are placed in order to represent + A group of equidistant horizontal lines on which notes are placed in order to represent pitch or a grouping element for individual 'strands' of notes, rests, etc. that may or may not actually be rendered on staff lines; that is, both diastematic and non-diastematic - signs. + signs. @@ -17395,13 +17513,13 @@ a matching @n value containing a staffDef, or a staffDef child element. - +

The def attribute may be used to create a connection with a staffDef element where logical and visual information about the staff is recorded. Alternatively, the n attribute may be used as a reference to a staffDef element with the same value in its n attribute or the staff may contain a staffDef element that defines it. If neither def nor n attributes are present, then the encoding order of the staves is presumed to match the encoding order of the staff definitions.

-
staff definitionContainer for staff meta-information. + staff definitionContainer for staff meta-information. @@ -17414,11 +17532,11 @@ - + - + @@ -17430,7 +17548,7 @@ permitted. - + @@ -17438,7 +17556,7 @@ current staff. - + @@ -17447,14 +17565,14 @@ exist. - + The clef position must be less than or equal to the number of lines on the staff. - + @@ -17463,7 +17581,7 @@ less than or equal to the number of lines on the staff. - + @@ -17471,7 +17589,7 @@ number of values as there are staff lines. - + @@ -17481,7 +17599,7 @@ lines. - + @@ -17498,7 +17616,7 @@ - + @@ -17509,7 +17627,7 @@ - + @@ -17520,7 +17638,7 @@ - staff groupA group of bracketed or braced staves. + staff groupA group of bracketed or braced staves. @@ -17529,13 +17647,13 @@ - + - + @@ -17544,11 +17662,11 @@ for the n attribute. - +

System is the more proper name for this concept (Read, p. 37-38). Bracketed staff groups may contain other bracketed or braced staff groups or single staves. See Read, p. 35-38, examples p. 434, 438.

-
syllableIndividual lyric syllable. + syllableIndividual lyric syllable. @@ -17557,12 +17675,12 @@ - + - +

Do not confuse this element with the syllable element, which is used to organize neume notation.

-
A reference to a previously defined symbol. + A reference to a previously defined symbol. @@ -17570,9 +17688,9 @@ - + - + In the symbolDef context, symbol must have @@ -17582,7 +17700,7 @@ glyph.num. - +

The starting point, e.g., "hotspot", of the symbol may be identified in absolute output coordinate terms using the x and y attributes or relative to another element using the startid attribute. Attributes in the att.visualOffset class may @@ -17590,8 +17708,8 @@ from the location of the referenced element. The altsym attribute must contain the id of a symbolDef element. The scale attribute indicates that the printed output must be scaled by the specified percentage.

-
Text and symbols descriptive of tempo, mood, or style, e.g., "allarg.", "a tempo", - "cantabile", "Moderato", "♩=60", "Moderato ♩ =60"). + Text and symbols descriptive of tempo, mood, or style, e.g., "allarg.", "a tempo", + "cantabile", "Moderato", "♩=60", "Moderato ♩ =60"). @@ -17602,9 +17720,9 @@ - + - + Only analog, class, label, mm, mm.dots, mm.unit, n, translit, type, xml:base, xml:id, @@ -17612,29 +17730,29 @@ part. - + Must have one of the attributes: startid, tstamp, tstamp.ges or tstamp.real. - Keyword or phrase which describes a resource. + Keyword or phrase which describes a resource. - + - + The @data attribute may only occur on a term which is a descendant of a classification element. - +

The term element may include other term elements in order to allow the creation of coordinated terms; i.e., terms created from a combination of other, independent terms.

@@ -17642,30 +17760,30 @@ of class must contain a fragment identifier corresponding to the appropriate term element. To associate a term with category in an externally-defined taxonomy, class must contain an absolute URI, which may include the fragment identifier of the element containing the category label.

-
+

The model of this element is based on the term element of the Text Encoding Initiative (TEI).

-
text languageIdentifies the languages and writing systems within the work described - by a bibliographic description, not the language of the description. + text languageIdentifies the languages and writing systems within the work described + by a bibliographic description, not the language of the description. - + - + (main language) supplies a code which identifies the chief language used in the bibliographic work. - + (other languages) one or more codes identifying any other languages used in the bibliographic work. - Title of a bibliographic entity. + Title of a bibliographic entity. @@ -17678,9 +17796,9 @@ - + - + Indicates the bibliographic level of the title. @@ -17713,7 +17831,7 @@ press). - + Characterizes the title in some sense, using any convenient classification scheme or typology that employs single-token labels. @@ -17742,7 +17860,7 @@ Descriptive paraphrase of the work. - +

The type attribute may be used to classify the title according to some convenient typology. Sample values include: main (main title), subordinate (subtitle, title of part), abbreviated (abbreviated form of title), alternative (alternate title by which the @@ -17754,24 +17872,24 @@ may be recorded using the auth attribute. The number of initial characters (such as those constituting an article or preposition) that should not be used for sorting a title or name may be indicated in the nonfiling attribute.

-
+

The model of this element is based on the title element of the Text Encoding Initiative (TEI).

-
Contains a transcription of the title page of a text. + Contains a transcription of the title page of a text. - + - +

This element may be used within the physDesc element when no other transcription is provided.

-
+

The model of this element is based on the titlePage element of the Text Encoding Initiative (TEI).

-
Contains a subsection or division of the title of a bibliographic entity. + Contains a subsection or division of the title of a bibliographic entity. @@ -17784,9 +17902,9 @@ - + - + Characterizes this title component in some sense, using any convenient classification scheme or typology that employs single-token labels. @@ -17840,140 +17958,140 @@ Version. Analogous to MARC 240 subfield s. - +

The model of this element is based on the titlePart element of the Text Encoding Initiative (TEI).

-
Description of the horizontal size of an object. + Description of the horizontal size of an object. - + - Groups elements that may contain back matter. - + Groups elements that may contain back matter. + - Groups elements used to represent generic structural divisions of text. + Groups elements used to represent generic structural divisions of text. - Groups elements that may contain front matter. - + Groups elements that may contain front matter. + - Groups elements that have a line-grouping function. - + Groups elements that have a line-grouping function. + - Groups list-like elements. - + Groups list-like elements. + - Groups elements representing metrical components such as verse lines. + Groups elements representing metrical components such as verse lines. - Groups elements related to highlighting which can appear at the phrase-level. - + Groups elements related to highlighting which can appear at the phrase-level. + - Groups elements used to directly contain quotations. - + Groups elements used to directly contain quotations. + - Contains a formal list or prose description of topics addressed. + Contains a formal list or prose description of topics addressed. - + - +

The model of this element is based on the argument element of the Text Encoding Initiative (TEI).

-
back matterContains any appendixes, advertisements, indexes, etc. following the main - body of a musical text. + back matterContains any appendixes, advertisements, indexes, etc. following the main + body of a musical text. - + - +

The model of this element is based on the back element of the Text Encoding Initiative (TEI).

-
Contains a quotation, anonymous or attributed, appearing on a title page. + Contains a quotation, anonymous or attributed, appearing on a title page. - + - +

The model of this element is based on the epigraph element of the Text Encoding Initiative (TEI).

-
front matterBundles prefatory text found before the start of the musical text. + front matterBundles prefatory text found before the start of the musical text. - + - +

titlePage may be used to transcribe the item’s title page. Other front matter structures, such as a preface, dedication, or table of contents, may be encoded as textual divisions; that is, as div elements, with an optional head sub-element describing the nature of the division. The pb element is allowed here in order to accommodate page images, e.g., cover, endpapers, etc. before and after the actual textual matter.

-
+

The model of this element is based on the front element of the Text Encoding Initiative (TEI).

-
Contains a formal statement authorizing the publication of a work, sometimes required to - appear on a title page or its verso. + Contains a formal statement authorizing the publication of a work, sometimes required to + appear on a title page or its verso. - + - +

The model of this element is based on the imprimatur element of the Text Encoding Initiative (TEI).

-
line of textContains a single line of text within a line group. + line of textContains a single line of text within a line group. - + - + Used to specify a rhythm for the lyric syllables that differs from that of the notes on the staff, e.g., '4,4,4,4' when the rhythm of the notes is '4.,8,4.,8'. - +

Do not confuse this element with the line element, which is used for graphical lines that occur in music notation.

-
+

The model of this element is based on the l element of the Text Encoding Initiative (TEI).

-
list itemSingle item in a list. + list itemSingle item in a list. - + - +

The model of this element is based on the item elements of the Encoded Archival Description (EAD), the item element of the Text Encoding Initiative (TEI), and the li element of HTML.

-
A formatting element that contains a series of items separated from one another and - arranged in a linear, often vertical, sequence. + A formatting element that contains a series of items separated from one another and + arranged in a linear, often vertical, sequence. @@ -17984,17 +18102,17 @@ - + - + In a list of type "gloss" all items must be immediately preceded by a label. - + Used to indicate the format of a list. In a simple list, li elements are not numbered or bulleted. In a marked list, the sequence of the list items is not critical, and a bullet, box, dash, or other character is displayed at the start of @@ -18012,7 +18130,7 @@ Each item is numbered or lettered. - + Captures the nature of the content of a list. @@ -18042,12 +18160,12 @@

In a list of type gloss it is a semantic error not to precede each list item with a label.

-
+

The model of this element is based on the list element of the Encoded Archival Description (EAD), the list element of the Text Encoding Initiative (TEI), and the respective elements of HTML.

-
quotedContains material which is distinguished from the surrounding phrase-level text + quotedContains material which is distinguished from the surrounding phrase-level text using quotation marks or a similar method. Use quote for block-level - quotations. + quotations. @@ -18056,9 +18174,9 @@ - + - + @@ -18091,48 +18209,48 @@ Refering to itself, not its normal referent. - +

This element may be used for a variety of reasons including, but not limited to: direct speech or thought, technical terms or jargon, authorial distance, quotations from elsewhere, and passages that are mentioned but not used.

Do not confuse this element, used to capture phrase-level quotations, and quote, intended for block quotations.

-
+

The model of this element is based on the q element of HTML and the q element of the Text Encoding Initiative (TEI).

-
quoted materialContains a paragraph-like block of text attributed to an external + quoted materialContains a paragraph-like block of text attributed to an external source, normally set off from the surrounding text by spacing or other typographic - distinction. + distinction. - + - +

The source for the quote may be included in a bibl sub-element.

Do not confuse this element, used to capture block-level quotations, and q, intended for inline quotations.

-
+

The model of this element is based on the quote element of the Text Encoding Initiative (TEI) and the quote element of the Encoded Archival Description (EAD).

-
(arbitrary segment) represents any segmentation of text below the "text component" - level. + (arbitrary segment) represents any segmentation of text below the "text component" + level. - + - +

The model of this element is based on the seg element of the Text Encoding Initiative (TEI).

- Attributes supplying pointers to user-defined symbols. - + Attributes supplying pointers to user-defined symbols. + Provides a way of pointing to a user-defined symbol. It must contain a reference to an ID of a symbolDef element elsewhere in the document. - + @altsym attribute @@ -18148,11 +18266,11 @@ - Logical domain attributes. - + Logical domain attributes. + - + Indicates the function of the text. @@ -18166,11 +18284,11 @@ - Logical domain attributes. - + Logical domain attributes. + - + Indicates the function of the curve. @@ -18184,14 +18302,14 @@ - Attributes for describing the logical behavior of a line. - + Attributes for describing the logical behavior of a line. + - + Indicates the function of the line. @@ -18213,11 +18331,11 @@ - Groups elements that function as drawing primitives. + Groups elements that function as drawing primitives. - Groups elements that group symbol definitions. - Container for text that is fixed to a particular page location, regardless of changes made - to the layout of the measures around it. + Groups elements that group symbol definitions. + Container for text that is fixed to a particular page location, regardless of changes made + to the layout of the measures around it. @@ -18226,9 +18344,9 @@ - + - +

This element may be used where semantic markup of the text is neither possible nor desirable, such as in optical music recognition (OMR) applications. The content model here is similar to paragraph without model.textcomponent and pb @@ -18237,8 +18355,8 @@ another element using the startid attribute. The attributes in the att.visualOffset class may be used to record horizontal, vertical, or time offsets from the absolute coordinates or from the location of the referenced element.

-
A curved line that cannot be represented by a more specific element, such as a - slur. + A curved line that cannot be represented by a more specific element, such as a + slur. @@ -18246,9 +18364,9 @@ - + - + In the symbolDef context, curve must have @@ -18259,7 +18377,7 @@ bezier or bulge attribute. - +

The starting point of the curve may be identified in absolute output coordinate terms using the x and y attributes or relative to the location of another element using the startid attribute. The attributes in the att.visualOffset class may be @@ -18271,8 +18389,8 @@ bulge attribute or, alternatively, the bezier attribute, describe the shape of the curve and the lform and lwidth attributes capture its appearance.

-
A visual line that cannot be represented by a more specific; i.e., semantic, - element. + A visual line that cannot be represented by a more specific; i.e., semantic, + element. @@ -18280,9 +18398,9 @@ - + - + When used in the symbolDef context, must have @@ -18299,7 +18417,7 @@ y2 attributes. - +

The starting point of the line may be identified in absolute output coordinate terms using the x and y attributes. The attributes in the att.visualOffset class may be used to record horizontal, vertical, or time offsets from these absolute coordinates @@ -18309,20 +18427,20 @@ offsets of the ending point. Textual content of the line element, e.g., 'gliss.', may be rendered with the line. The appearance of the line is captured in the color, form and width attributes.

-
One or more characters which are related to the parent symbol in some respect, as - specified by the type attribute. + One or more characters which are related to the parent symbol in some respect, as + specified by the type attribute. - + - property nameName of a property of the symbol. + property nameName of a property of the symbol. - + - + Characterizes the property name. @@ -18332,45 +18450,45 @@ A locally defined name. - property valueA single property value. + property valueA single property value. - + - symbol definitionDeclaration of an individual symbol in a symbolTable. + symbol definitionDeclaration of an individual symbol in a symbolTable. - + - +

Like a chord table, a symbolTable may be shared between MEI instances through the use of an external parsed entity containing the symbolTable to be shared.

-
symbol nameContains the name of a symbol, expressed following Unicode - conventions. + symbol nameContains the name of a symbol, expressed following Unicode + conventions. - + - symbol propertyProvides a name and value for some property of the parent - symbol. + symbol propertyProvides a name and value for some property of the parent + symbol. - + - Contains a set of user-defined symbols. + Contains a set of user-defined symbols. - + - +

Like a chord table, a symbolTable may be shared between mei instances through the use of an external parsed entity containing the symbolTable to be shared.

- Visual domain attributes. - + Visual domain attributes. + @@ -18385,10 +18503,10 @@ - Visual domain attributes. + Visual domain attributes. - Visual domain attributes. - + Visual domain attributes. + @@ -18397,14 +18515,14 @@ - Visual domain attributes. - + Visual domain attributes. + - Visual domain attributes. - + Visual domain attributes. + Location of the annotation. @@ -18413,8 +18531,8 @@ - Visual domain attributes. - + Visual domain attributes. + @@ -18423,7 +18541,7 @@ - + Indicates if an arrowhead is to be drawn as part of the arpeggiation symbol. @@ -18468,8 +18586,8 @@ - Visual domain attributes. - + Visual domain attributes. + @@ -18483,8 +18601,8 @@ - Visual domain attributes. - + Visual domain attributes. + @@ -18494,15 +18612,15 @@ - Visual domain attributes. - + Visual domain attributes. + - + length States the length of bar lines in virtual units. The value must be greater than 0 and @@ -18539,17 +18657,17 @@ - Visual domain attributes. - + Visual domain attributes. + - Used by layerDef, staffDef, and scoreDef to provide default values for attributes in the + Used by layerDef, staffDef, and scoreDef to provide default values for attributes in the visual domain related to beaming. - + Color of beams, including those associated with tuplets. @@ -18578,20 +18696,20 @@ - Visual domain attributes. - + Visual domain attributes. + - Visual domain attributes. - + Visual domain attributes. + - + Indicates the number of slashes required to render the appropriate beat repeat symbol. When a single beat consisting of a single note or chord is repeated, the repetition symbol @@ -18605,13 +18723,13 @@ - Visual domain attributes. If the bulge or bezier attributes are present, the bend should + Visual domain attributes. If the bulge or bezier attributes are present, the bend should be rendered as a curve. Otherwise, it should be rendered using lines. The ho and vo attributes describe the visual offset of the entire rendered bend. The endho, endvo and startho, startvo attribute pairs may be used to encode start and end points relative to their programmatic placement. For exact placement of the endpoints of the bend, use the x and y attributes. - + @@ -18621,8 +18739,8 @@ - Visual domain attributes. - + Visual domain attributes. + @@ -18634,8 +18752,8 @@ - Visual domain attributes. - + Visual domain attributes. + @@ -18647,13 +18765,13 @@ - Visual domain attributes. - + Visual domain attributes. + - Visual domain attributes. - + Visual domain attributes. + @@ -18665,11 +18783,11 @@ - Visual domain attributes for chord. The slur, slur.dir, slur.rend, tie, tie.dir, and + Visual domain attributes for chord. The slur, slur.dir, slur.rend, tie, tie.dir, and tie.rend attributes here are syntactic sugar for these attributes on each of the chord's individual notes. The values here apply to all the notes in the chord. If some notes are slurred or tied while others aren't, then the individual note attributes must be used. - + @@ -18682,7 +18800,7 @@ - + Indicates a single, alternative note head should be displayed instead of individual note heads. The highest and lowest notes of the chord usually indicate the upper and lower @@ -18693,12 +18811,12 @@ - Visual domain attributes. + Visual domain attributes. - Visual domain attributes. + Visual domain attributes. - Visual domain attributes. - + Visual domain attributes. + @@ -18708,9 +18826,9 @@ - Used by staffDef and scoreDef to provide default values for attributes in the visual + Used by staffDef and scoreDef to provide default values for attributes in the visual domain related to clefs. - + Describes the color of the clef. @@ -18725,10 +18843,10 @@ - Visual domain attributes. + Visual domain attributes. - Visual domain attributes. - + Visual domain attributes. + @@ -18739,8 +18857,8 @@ - Visual domain attributes. - + Visual domain attributes. + @@ -18750,8 +18868,8 @@ - Visual domain attributes. - + Visual domain attributes. + @@ -18760,10 +18878,10 @@ - Visual domain attributes. + Visual domain attributes. - Visual domain attributes. - + Visual domain attributes. + @@ -18773,8 +18891,8 @@ - Visual domain attributes. - + Visual domain attributes. + @@ -18786,8 +18904,8 @@ - Visual domain attributes. - + Visual domain attributes. + @@ -18797,13 +18915,13 @@ - Visual domain attributes. - + Visual domain attributes. + - Visual domain attributes. - + Visual domain attributes. + @@ -18814,7 +18932,7 @@ - + @@ -18835,21 +18953,21 @@ - Visual domain attributes. - + Visual domain attributes. + - +

If tstamp2 is not provided, then the extender should be drawn based on the value of tstamp2 on the harm ancestor.

- Visual domain attributes. - + Visual domain attributes. + @@ -18859,7 +18977,7 @@ - + Describes the visual appearance of the fermata; that is, whether it occurs as upright or inverted. @@ -18889,28 +19007,28 @@ - Visual domain attributes. - + Visual domain attributes. + - +

If tstamp2 is not provided, then the extender should be drawn based on the value of tstamp2 on a fingering ancestor.

- Visual domain attributes. - + Visual domain attributes. + - + orientation @@ -18924,8 +19042,8 @@ - Visual domain attributes. - + Visual domain attributes. + Indicates the number of beams present. @@ -18940,7 +19058,7 @@ - + The number of floating beams must be less @@ -18957,8 +19075,8 @@ - Visual domain attributes. - + Visual domain attributes. + @@ -18970,13 +19088,13 @@ - Visual domain attributes. - + Visual domain attributes. + - Visual domain attributes. - + Visual domain attributes. + @@ -18985,7 +19103,7 @@ - Visual domain attributes. The startho and startvo attributes record the horizontal and + Visual domain attributes. The startho and startvo attributes record the horizontal and vertical offsets of the left end, endho and endvo record the horizontal and vertical offsets of the right end, and the opening attribute records the width of the opening in staff inter-line units. The x and y attributes give the absolute coordinates of the left end point, @@ -18993,7 +19111,7 @@ and horizontally bifurcates it. The so-called "pitch" of hairpin may be controlled by use of the startho, endho, startvo, and endvo attributes, while the placement of the entire rendered mark may be controlled by use of the ho and vo attributes. - + @@ -19003,7 +19121,7 @@ - + Specifies the distance between the lines at the open end of a hairpin dynamic mark. @@ -19031,8 +19149,8 @@ - Visual domain attributes. - + Visual domain attributes. + @@ -19041,8 +19159,8 @@ - Visual domain attributes. - + Visual domain attributes. + @@ -19050,7 +19168,7 @@ - + Describes how the harmonic indication should be rendered. @@ -19067,8 +19185,8 @@ - Visual domain attributes. - + Visual domain attributes. + @@ -19078,8 +19196,8 @@ - Visual domain attributes. - + Visual domain attributes. + @@ -19090,7 +19208,7 @@ - + Captures the placement of the tick mark with respect to the neume or neume component with which it is associated. @@ -19106,10 +19224,10 @@ - Visual domain attributes. + Visual domain attributes. - Visual domain attributes. - + Visual domain attributes. + @@ -19119,12 +19237,12 @@ - Visual domain attributes. - + Visual domain attributes. + - + Determines whether cautionary accidentals should be displayed at a key change. @@ -19133,40 +19251,40 @@ - Used by staffDef and scoreDef to provide default values for attributes in the visual + Used by staffDef and scoreDef to provide default values for attributes in the visual domain related to key signatures. - - - Indicates whether the key signature should be displayed. + + + Determines whether cautionary accidentals should be displayed at a key change. - - Determines whether cautionary accidentals should be displayed at a key change. + + Determines whether the key signature is to be displayed. - Visual domain attributes. - + Visual domain attributes. + - Visual domain attributes. - + Visual domain attributes. + - Visual domain attributes. - + Visual domain attributes. + - + Provides an indication of the function of the ligature. @@ -19175,8 +19293,8 @@ - Attributes for describing the visual appearance of a line. - + Attributes for describing the visual appearance of a line. + @@ -19184,7 +19302,7 @@ - + Visual form of the line. @@ -19227,8 +19345,8 @@ - Visual domain attributes. - + Visual domain attributes. + @@ -19239,7 +19357,7 @@ - + Records direction of curvature. @@ -19259,13 +19377,13 @@ - Visual domain attributes. The vo attribute is the vertical offset (from its normal + Visual domain attributes. The vo attribute is the vertical offset (from its normal position) of the entire rendered tie. The startho, startvo, endho, and endvo attributes describe the horizontal and vertical offsets of the start and end points of the sign in terms of staff interline distance; that is, in units of 1/2 the distance between adjacent staff lines. Startto and endto describe the start and end points in terms of time; that is, beats. - + @@ -19275,21 +19393,21 @@ - Visual domain attributes. - + Visual domain attributes. + - Visual domain attributes. - + Visual domain attributes. + - Visual domain attributes. These attributes describe the physical appearance of the + Visual domain attributes. These attributes describe the physical appearance of the mensuration sign/time signature of mensural notation. - + @@ -19297,7 +19415,7 @@ - + Specifies whether a dot is to be added to the base symbol. @@ -19329,9 +19447,9 @@ - Used by staffDef and scoreDef to provide default values for attributes in the visual + Used by staffDef and scoreDef to provide default values for attributes in the visual domain related to mensuration. - + Records the color of the mensuration sign. Do not confuse this with the musical term 'color' as used in pre-CMN notation. @@ -19389,20 +19507,21 @@ - Visual domain attributes. - + Visual domain attributes. + - Visual domain attributes. - + Visual domain attributes. + + - + Contains an indication of how the meter signature should be rendered. @@ -19411,9 +19530,9 @@ - Used by staffDef and scoreDef to provide default values for attributes in the visual + Used by staffDef and scoreDef to provide default values for attributes in the visual domain related to meter signature. - + Contains an indication of how the meter signature should be rendered. @@ -19427,12 +19546,18 @@ + + Determines whether the meter signature is to be displayed. + + + + - Visual domain attributes. + Visual domain attributes. - Visual domain attributes. - + Visual domain attributes. + @@ -19440,8 +19565,8 @@ - Visual domain attributes. - + Visual domain attributes. + @@ -19451,8 +19576,8 @@ - Visual domain attributes. - + Visual domain attributes. + @@ -19465,8 +19590,8 @@ - Visual domain attributes. - + Visual domain attributes. + @@ -19475,8 +19600,8 @@ - Visual domain attributes. - + Visual domain attributes. + @@ -19484,15 +19609,15 @@ - Visual domain attributes. - + Visual domain attributes. + - Visual domain attributes. - + Visual domain attributes. + @@ -19502,7 +19627,7 @@ - + The block attribute controls whether the multimeasure rest should be rendered as a block rest or as church rests ("Kirchenpausen"), that are combinations of longa, breve and semibreve rests. @@ -19512,8 +19637,8 @@ - Visual domain attributes. - + Visual domain attributes. + @@ -19521,8 +19646,8 @@ - Visual domain attributes. - + Visual domain attributes. + @@ -19534,8 +19659,8 @@ - Visual domain attributes. - + Visual domain attributes. + @@ -19544,8 +19669,8 @@ - Visual domain attributes. - + Visual domain attributes. + @@ -19557,8 +19682,8 @@ - Visual domain attributes. - + Visual domain attributes. + @@ -19575,8 +19700,8 @@ - Visual domain attributes. - + Visual domain attributes. + @@ -19585,8 +19710,8 @@ - Visual domain attributes. - + Visual domain attributes. + @@ -19598,8 +19723,8 @@ - Visual domain attributes. - + Visual domain attributes. + @@ -19610,16 +19735,16 @@ - Visual domain attributes. + Visual domain attributes. - Visual domain attributes. + Visual domain attributes. - Visual domain attributes. + Visual domain attributes. - Visual domain attributes. + Visual domain attributes. - Visual domain attributes. - + Visual domain attributes. + States the side of a leaf (as in a manuscript) on which the content following the pb element occurs. @@ -19633,11 +19758,11 @@ - Visual domain attributes. The place attribute captures the placement of the pedal marking + Visual domain attributes. The place attribute captures the placement of the pedal marking with respect to the staff with which it is associated. Modern publishing standards require the place to be below; however, for transcriptions of manuscript works, this attribute class allows the full range of values. - + @@ -19648,7 +19773,7 @@ - + Determines whether piano pedal marks should be rendered as lines or as terms. @@ -19657,8 +19782,8 @@ - Visual domain attributes. - + Visual domain attributes. + @@ -19667,8 +19792,8 @@ - Visual domain attributes that describe the properties of a plica stem in the mensural repertoire. - + Visual domain attributes that describe the properties of a plica stem in the mensural repertoire. + direction Describes the direction of a stem. @@ -19685,8 +19810,8 @@ - Visual domain attributes. - + Visual domain attributes. + @@ -19694,8 +19819,8 @@ - Visual domain attributes. - + Visual domain attributes. + @@ -19706,7 +19831,7 @@ - + Number of "crests" of a wavy line. @@ -19718,10 +19843,10 @@ - Visual domain attributes. + Visual domain attributes. - Visual domain attributes. - + Visual domain attributes. + @@ -19731,17 +19856,29 @@ - Visual domain attributes. - + Visual domain attributes. + + + Visual domain attributes. + + + + + + + + + + - Visual domain attributes. - + Visual domain attributes. + @@ -19755,13 +19892,13 @@ - Visual domain attributes. - + Visual domain attributes. + - + Indicates whether hash marks should be rendered between systems. See Read, p. 436, ex. 26-3. @@ -19773,10 +19910,10 @@ - Visual domain attributes. + Visual domain attributes. - Visual domain attributes for scoreDef in the CMN repertoire. - + Visual domain attributes for scoreDef in the CMN repertoire. + @@ -19797,7 +19934,7 @@ - + Defines the height of a "virtual unit" (vu) in terms of real-world units. A single vu is half the distance between adjacent staff lines where the interline space is measured @@ -19811,8 +19948,8 @@ - Visual domain attributes. - + Visual domain attributes. + Indicates that staves begin again with this section. @@ -19821,8 +19958,8 @@ - Visual domain attributes. - + Visual domain attributes. + @@ -19833,7 +19970,7 @@ - + Captures the placement of the sequence of characters with respect to the neume or neume component with which it is associated. @@ -19843,9 +19980,9 @@ - Visual domain attributes for slur. The vo attribute is the vertical offset (from its + Visual domain attributes for slur. The vo attribute is the vertical offset (from its normal position) of the entire rendered slur/phrase mark. - + @@ -19855,8 +19992,8 @@ - Visual domain attributes. - + Visual domain attributes. + @@ -19864,11 +20001,11 @@ - Visual domain attributes. - + Visual domain attributes. + - + Indicates whether a space is 'compressible', i.e., if it may be removed at the discretion of processing software. @@ -19878,13 +20015,13 @@ - Visual domain attributes. - + Visual domain attributes. + - Visual domain attributes for staffDef. - + Visual domain attributes for staffDef. + @@ -19901,7 +20038,7 @@ - + Determines whether to display guitar chord grids. @@ -19942,13 +20079,13 @@ - Visual domain attributes. - + Visual domain attributes. + - + bar lines through Indicates whether bar lines go across the space between staves (true) or are only @@ -19963,8 +20100,8 @@ - Visual domain attributes. - + Visual domain attributes. + @@ -19972,14 +20109,14 @@ - Visual domain attributes that describe the properties of a stem in the mensural repertoire. - + Visual domain attributes that describe the properties of a stem in the mensural repertoire. + - + position Records the position of the stem in relation to the note head(s). @@ -20021,8 +20158,8 @@ - Visual domain attributes. - + Visual domain attributes. + @@ -20034,8 +20171,8 @@ - Visual domain attributes. - + Visual domain attributes. + @@ -20045,10 +20182,10 @@ - Visual domain attributes. + Visual domain attributes. - Visual domain attributes. - + Visual domain attributes. + @@ -20058,8 +20195,8 @@ - Visual domain attributes. - + Visual domain attributes. + @@ -20069,13 +20206,13 @@ - Visual domain attributes. The vo attribute is the vertical offset (from its normal + Visual domain attributes. The vo attribute is the vertical offset (from its normal position) of the entire rendered tie. The startho, startvo, endho, and endvo attributes describe the horizontal and vertical offsets of the start and end points of the tie in terms of staff interline distance; that is, in units of 1/2 the distance between adjacent staff lines. Startto and endto describe the start and end points in terms of time; that is, beats. - + @@ -20085,8 +20222,8 @@ - Visual domain attributes. - + Visual domain attributes. + @@ -20100,12 +20237,12 @@ - Visual domain attributes. - + Visual domain attributes. + - + Used to state where a tuplet bracket will be placed in relation to the note heads. @@ -20138,13 +20275,13 @@ - Visual domain attributes. - + Visual domain attributes. + - Visual domain attributes. - + Visual domain attributes. + @@ -20155,8 +20292,8 @@ - Visual domain attributes. - + Visual domain attributes. + @@ -20166,8 +20303,8 @@ - Visual domain attributes. - + Visual domain attributes. + @@ -20405,7 +20542,7 @@ foo informationDummy element for enforcing that the att classes are used. -
+
\ No newline at end of file From 09cfbc2fdffc987090ee3146dfcb26d5b67e38fe Mon Sep 17 00:00:00 2001 From: Laurent Pugin Date: Thu, 1 Jun 2023 12:25:55 +0200 Subject: [PATCH 089/151] Fix datatype name changes --- libmei/datatypes.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libmei/datatypes.yml b/libmei/datatypes.yml index a9db84b0c0..42fd1aa163 100644 --- a/libmei/datatypes.yml +++ b/libmei/datatypes.yml @@ -96,7 +96,7 @@ mapped: std::string data.PGSCALE: std::string - data.PITCHNAME.GES: + data.PITCHNAME.GESTURAL: data_PITCHNAME data.PITCHCLASS: int From bf1e7862669d107a0a28a6a5a9f0e48cda956052 Mon Sep 17 00:00:00 2001 From: Laurent Pugin Date: Thu, 1 Jun 2023 12:35:36 +0200 Subject: [PATCH 090/151] Adjust header for att.extSym splitting (WIP) --- include/vrv/accid.h | 3 ++- include/vrv/artic.h | 3 ++- include/vrv/caesura.h | 3 ++- include/vrv/clef.h | 3 ++- include/vrv/custos.h | 7 ++++++- include/vrv/fermata.h | 3 ++- include/vrv/keyaccid.h | 3 ++- include/vrv/mordent.h | 3 ++- include/vrv/note.h | 3 ++- include/vrv/ornam.h | 3 ++- include/vrv/pedal.h | 3 ++- include/vrv/rest.h | 3 ++- include/vrv/symbol.h | 2 +- include/vrv/trill.h | 3 ++- include/vrv/turn.h | 3 ++- 15 files changed, 33 insertions(+), 15 deletions(-) diff --git a/include/vrv/accid.h b/include/vrv/accid.h index 6090bcdfe2..0cee989978 100644 --- a/include/vrv/accid.h +++ b/include/vrv/accid.h @@ -31,7 +31,8 @@ class Accid : public LayerElement, public AttAccidLog, public AttColor, public AttEnclosingChars, - public AttExtSym, + public AttExtSymAuth, + public AttExtSymNames, public AttPlacementOnStaff, public AttPlacementRelEvent { public: diff --git a/include/vrv/artic.h b/include/vrv/artic.h index e0cb911bb7..8a11d2707c 100644 --- a/include/vrv/artic.h +++ b/include/vrv/artic.h @@ -24,7 +24,8 @@ class Artic : public LayerElement, public AttArticulationGes, public AttColor, public AttEnclosingChars, - public AttExtSym, + public AttExtSymAuth, + public AttExtSymNames, public AttPlacementRelEvent { public: /** diff --git a/include/vrv/caesura.h b/include/vrv/caesura.h index 026fee817e..5125f911de 100644 --- a/include/vrv/caesura.h +++ b/include/vrv/caesura.h @@ -25,7 +25,8 @@ namespace vrv { class Caesura : public ControlElement, public TimePointInterface, public AttColor, - public AttExtSym, + public AttExtSymAuth, + public AttExtSymNames, public AttPlacementRelStaff { public: /** diff --git a/include/vrv/clef.h b/include/vrv/clef.h index cc867346c2..9dcd9e635b 100644 --- a/include/vrv/clef.h +++ b/include/vrv/clef.h @@ -29,7 +29,8 @@ class Clef : public LayerElement, public AttClefShape, public AttColor, public AttEnclosingChars, - public AttExtSym, + public AttExtSymAuth, + public AttExtSymNames, public AttLineLoc, public AttOctave, public AttOctaveDisplacement, diff --git a/include/vrv/custos.h b/include/vrv/custos.h index a69dba5427..b565c9596e 100644 --- a/include/vrv/custos.h +++ b/include/vrv/custos.h @@ -21,7 +21,12 @@ namespace vrv { // Custos //---------------------------------------------------------------------------- -class Custos : public LayerElement, public PitchInterface, public PositionInterface, public AttColor, public AttExtSym { +class Custos : public LayerElement, + public PitchInterface, + public PositionInterface, + public AttColor, + public AttExtSymAuth, + public AttExtSymNames { public: /** * @name Constructors, destructors, and other standard methods diff --git a/include/vrv/fermata.h b/include/vrv/fermata.h index 0cb05b2130..128368fd85 100644 --- a/include/vrv/fermata.h +++ b/include/vrv/fermata.h @@ -27,7 +27,8 @@ class Fermata : public ControlElement, public TimePointInterface, public AttColor, public AttEnclosingChars, - public AttExtSym, + public AttExtSymAuth, + public AttExtSymNames, public AttFermataVis, public AttPlacementRelStaff { public: diff --git a/include/vrv/keyaccid.h b/include/vrv/keyaccid.h index 86993eeeab..d7ad69d033 100644 --- a/include/vrv/keyaccid.h +++ b/include/vrv/keyaccid.h @@ -29,7 +29,8 @@ class KeyAccid : public LayerElement, public AttAccidental, public AttColor, public AttEnclosingChars, - public AttExtSym { + public AttExtSymAuth, + public AttExtSymNames { public: /** * @name Constructors, destructors, and other standard methods diff --git a/include/vrv/mordent.h b/include/vrv/mordent.h index 4e75c013c9..2eaf9ddeaf 100644 --- a/include/vrv/mordent.h +++ b/include/vrv/mordent.h @@ -26,7 +26,8 @@ namespace vrv { class Mordent : public ControlElement, public TimePointInterface, public AttColor, - public AttExtSym, + public AttExtSymAuth, + public AttExtSymNames, public AttOrnamentAccid, public AttPlacementRelStaff, public AttMordentLog { diff --git a/include/vrv/note.h b/include/vrv/note.h index 45c1e124a4..b6b8261ac6 100644 --- a/include/vrv/note.h +++ b/include/vrv/note.h @@ -51,7 +51,8 @@ class Note : public LayerElement, public AttColor, public AttColoration, public AttCue, - public AttExtSym, + public AttExtSymAuth, + public AttExtSymNames, public AttGraced, public AttHarmonicFunction, public AttMidiVelocity, diff --git a/include/vrv/ornam.h b/include/vrv/ornam.h index f638e333c6..4be994a1a0 100644 --- a/include/vrv/ornam.h +++ b/include/vrv/ornam.h @@ -29,7 +29,8 @@ class Ornam : public ControlElement, public TextDirInterface, public TimePointInterface, public AttColor, - public AttExtSym, + public AttExtSymAuth, + public AttExtSymNames, public AttOrnamentAccid { public: /** diff --git a/include/vrv/pedal.h b/include/vrv/pedal.h index 9070421b57..36b521be3a 100644 --- a/include/vrv/pedal.h +++ b/include/vrv/pedal.h @@ -27,7 +27,8 @@ class System; class Pedal : public ControlElement, public TimeSpanningInterface, public AttColor, - public AttExtSym, + public AttExtSymAuth, + public AttExtSymNames, public AttPedalLog, public AttPedalVis, public AttPlacementRelStaff, diff --git a/include/vrv/rest.h b/include/vrv/rest.h index 82a7926653..b737eebc0d 100644 --- a/include/vrv/rest.h +++ b/include/vrv/rest.h @@ -38,7 +38,8 @@ class Rest : public LayerElement, public PositionInterface, public AttColor, public AttCue, - public AttExtSym, + public AttExtSymAuth, + public AttExtSymNames, public AttRestVisMensural { public: /** diff --git a/include/vrv/symbol.h b/include/vrv/symbol.h index 3b029bf404..ad4d3eacd2 100644 --- a/include/vrv/symbol.h +++ b/include/vrv/symbol.h @@ -22,7 +22,7 @@ namespace vrv { /** * This class models the MEI element. */ -class Symbol : public TextElement, public AttColor, public AttExtSym, public AttTypography { +class Symbol : public TextElement, public AttColor, public AttExtSymAuth, public AttExtSymNames, public AttTypography { public: /** * @name Constructors, destructors, reset and class name methods diff --git a/include/vrv/trill.h b/include/vrv/trill.h index 28c1114558..da61ec3d25 100644 --- a/include/vrv/trill.h +++ b/include/vrv/trill.h @@ -27,7 +27,8 @@ class Trill : public ControlElement, public TimeSpanningInterface, public AttColor, public AttExtender, - public AttExtSym, + public AttExtSymAuth, + public AttExtSymNames, public AttLineRend, public AttNNumberLike, public AttOrnamentAccid, diff --git a/include/vrv/turn.h b/include/vrv/turn.h index 20dffe9ee3..f11f12e35a 100644 --- a/include/vrv/turn.h +++ b/include/vrv/turn.h @@ -26,7 +26,8 @@ namespace vrv { class Turn : public ControlElement, public TimePointInterface, public AttColor, - public AttExtSym, + public AttExtSymAuth, + public AttExtSymNames, public AttOrnamentAccid, public AttPlacementRelStaff, public AttTurnLog { From 2ddd66c68c95ac5df3ef9df6e1353c66d80a739b Mon Sep 17 00:00:00 2001 From: Laurent Pugin Date: Thu, 1 Jun 2023 12:36:03 +0200 Subject: [PATCH 091/151] Adjust implementation for att.extSym splitting --- src/accid.cpp | 9 ++++++--- src/artic.cpp | 9 ++++++--- src/caesura.cpp | 10 ++++++++-- src/clef.cpp | 8 ++++++-- src/convertfunctor.cpp | 3 ++- src/custos.cpp | 16 ++++++++++++---- src/fermata.cpp | 6 ++++-- src/keyaccid.cpp | 11 +++++++---- src/mordent.cpp | 9 ++++++--- src/note.cpp | 9 ++++++--- src/ornam.cpp | 9 ++++++--- src/pedal.cpp | 9 ++++++--- src/rest.cpp | 9 ++++++--- src/symbol.cpp | 8 +++++--- src/trill.cpp | 6 ++++-- src/turn.cpp | 9 ++++++--- 16 files changed, 96 insertions(+), 44 deletions(-) diff --git a/src/accid.cpp b/src/accid.cpp index cfd8ba299e..db5ef970cd 100644 --- a/src/accid.cpp +++ b/src/accid.cpp @@ -36,7 +36,8 @@ Accid::Accid() , AttAccidLog() , AttColor() , AttEnclosingChars() - , AttExtSym() + , AttExtSymAuth() + , AttExtSymNames() , AttPlacementOnStaff() , AttPlacementRelEvent() { @@ -47,7 +48,8 @@ Accid::Accid() this->RegisterAttClass(ATT_ACCIDLOG); this->RegisterAttClass(ATT_COLOR); this->RegisterAttClass(ATT_ENCLOSINGCHARS); - this->RegisterAttClass(ATT_EXTSYM); + this->RegisterAttClass(ATT_EXTSYMAUTH); + this->RegisterAttClass(ATT_EXTSYMNAMES); this->RegisterAttClass(ATT_PLACEMENTONSTAFF); this->RegisterAttClass(ATT_PLACEMENTRELEVENT); @@ -65,7 +67,8 @@ void Accid::Reset() this->ResetAccidLog(); this->ResetColor(); this->ResetEnclosingChars(); - this->ResetExtSym(); + this->ResetExtSymAuth(); + this->ResetExtSymNames(); this->ResetPlacementOnStaff(); this->ResetPlacementRelEvent(); diff --git a/src/artic.cpp b/src/artic.cpp index 542decf746..6e07f9b95a 100644 --- a/src/artic.cpp +++ b/src/artic.cpp @@ -47,14 +47,16 @@ Artic::Artic() , AttArticulationGes() , AttColor() , AttEnclosingChars() - , AttExtSym() + , AttExtSymAuth() + , AttExtSymNames() , AttPlacementRelEvent() { this->RegisterAttClass(ATT_ARTICULATION); this->RegisterAttClass(ATT_ARTICULATIONGES); this->RegisterAttClass(ATT_COLOR); this->RegisterAttClass(ATT_ENCLOSINGCHARS); - this->RegisterAttClass(ATT_EXTSYM); + this->RegisterAttClass(ATT_EXTSYMAUTH); + this->RegisterAttClass(ATT_EXTSYMNAMES); this->RegisterAttClass(ATT_PLACEMENTRELEVENT); this->Reset(); @@ -69,7 +71,8 @@ void Artic::Reset() this->ResetArticulationGes(); this->ResetColor(); this->ResetEnclosingChars(); - this->ResetExtSym(); + this->ResetExtSymAuth(); + this->ResetExtSymNames(); this->ResetPlacementRelEvent(); m_drawingPlace = STAFFREL_NONE; diff --git a/src/caesura.cpp b/src/caesura.cpp index c9c213942f..494baca028 100644 --- a/src/caesura.cpp +++ b/src/caesura.cpp @@ -27,11 +27,17 @@ namespace vrv { static const ClassRegistrar s_factory("caesura", CAESURA); Caesura::Caesura() - : ControlElement(CAESURA, "caesura-"), TimePointInterface(), AttColor(), AttExtSym(), AttPlacementRelStaff() + : ControlElement(CAESURA, "caesura-") + , TimePointInterface() + , AttColor() + , AttExtSymAuth() + , AttExtSymNames() + , AttPlacementRelStaff() { this->RegisterInterface(TimePointInterface::GetAttClasses(), TimePointInterface::IsInterface()); this->RegisterAttClass(ATT_COLOR); - this->RegisterAttClass(ATT_EXTSYM); + this->RegisterAttClass(ATT_EXTSYMAUTH); + this->RegisterAttClass(ATT_EXTSYMNAMES); this->RegisterAttClass(ATT_PLACEMENTRELSTAFF); this->Reset(); diff --git a/src/clef.cpp b/src/clef.cpp index 92d10e69e8..d14a60822d 100644 --- a/src/clef.cpp +++ b/src/clef.cpp @@ -35,6 +35,8 @@ Clef::Clef() , AttClefLog() , AttClefShape() , AttColor() + , AttExtSymAuth() + , AttExtSymNames() , AttLineLoc() , AttOctave() , AttOctaveDisplacement() @@ -45,7 +47,8 @@ Clef::Clef() this->RegisterAttClass(ATT_CLEFSHAPE); this->RegisterAttClass(ATT_COLOR); this->RegisterAttClass(ATT_ENCLOSINGCHARS); - this->RegisterAttClass(ATT_EXTSYM); + this->RegisterAttClass(ATT_EXTSYMAUTH); + this->RegisterAttClass(ATT_EXTSYMNAMES); this->RegisterAttClass(ATT_LINELOC); this->RegisterAttClass(ATT_OCTAVE); this->RegisterAttClass(ATT_OCTAVEDISPLACEMENT); @@ -64,7 +67,8 @@ void Clef::Reset() this->ResetClefShape(); this->ResetColor(); this->ResetEnclosingChars(); - this->ResetExtSym(); + this->ResetExtSymAuth(); + this->ResetExtSymNames(); this->ResetLineLoc(); this->ResetOctave(); this->ResetOctaveDisplacement(); diff --git a/src/convertfunctor.cpp b/src/convertfunctor.cpp index 04536104e0..a5ecb4d3b5 100644 --- a/src/convertfunctor.cpp +++ b/src/convertfunctor.cpp @@ -576,7 +576,8 @@ void ConvertMarkupArticFunctor::SplitMultival(Artic *artic) const articChild->SetArtic({ *iter }); articChild->AttColor::operator=(*artic); articChild->AttEnclosingChars::operator=(*artic); - articChild->AttExtSym::operator=(*artic); + articChild->AttExtSymAuth::operator=(*artic); + articChild->AttExtSymNames::operator=(*artic); articChild->AttPlacementRelEvent::operator=(*artic); parent->InsertChild(articChild, idx); ++idx; diff --git a/src/custos.cpp b/src/custos.cpp index 7157dff13a..58e4cb185b 100644 --- a/src/custos.cpp +++ b/src/custos.cpp @@ -25,13 +25,20 @@ namespace vrv { static const ClassRegistrar s_factory("custos", CUSTOS); -Custos::Custos() : LayerElement(CUSTOS, "custos-"), PitchInterface(), PositionInterface(), AttColor(), AttExtSym() +Custos::Custos() + : LayerElement(CUSTOS, "custos-") + , PitchInterface() + , PositionInterface() + , AttColor() + , AttExtSymAuth() + , AttExtSymNames() { this->RegisterInterface(PitchInterface::GetAttClasses(), PitchInterface::IsInterface()); this->RegisterInterface(PositionInterface::GetAttClasses(), PositionInterface::IsInterface()); this->RegisterAttClass(ATT_COLOR); - this->RegisterAttClass(ATT_EXTSYM); - + this->RegisterAttClass(ATT_EXTSYMAUTH); + this->RegisterAttClass(ATT_EXTSYMNAMES); + this->Reset(); } @@ -43,7 +50,8 @@ void Custos::Reset() PitchInterface::Reset(); PositionInterface::Reset(); this->ResetColor(); - this->ResetExtSym(); + this->ResetExtSymAuth(); + this->ResetExtSymNames(); } bool Custos::IsSupportedChild(Object *child) diff --git a/src/fermata.cpp b/src/fermata.cpp index 23fd96053b..02b1c87341 100644 --- a/src/fermata.cpp +++ b/src/fermata.cpp @@ -30,14 +30,16 @@ Fermata::Fermata() : ControlElement(FERMATA, "fermata-") , TimePointInterface() , AttColor() - , AttExtSym() + , AttExtSymAuth() + , AttExtSymNames() , AttFermataVis() , AttPlacementRelStaff() { this->RegisterInterface(TimePointInterface::GetAttClasses(), TimePointInterface::IsInterface()); this->RegisterAttClass(ATT_COLOR); this->RegisterAttClass(ATT_ENCLOSINGCHARS); - this->RegisterAttClass(ATT_EXTSYM); + this->RegisterAttClass(ATT_EXTSYMAUTH); + this->RegisterAttClass(ATT_EXTSYMNAMES); this->RegisterAttClass(ATT_FERMATAVIS); this->RegisterAttClass(ATT_PLACEMENTRELSTAFF); diff --git a/src/keyaccid.cpp b/src/keyaccid.cpp index 2afc838322..39ba71cab1 100644 --- a/src/keyaccid.cpp +++ b/src/keyaccid.cpp @@ -36,7 +36,8 @@ KeyAccid::KeyAccid() , AttAccidental() , AttColor() , AttEnclosingChars() - , AttExtSym() + , AttExtSymAuth() + , AttExtSymNames() { this->RegisterInterface(PitchInterface::GetAttClasses(), PitchInterface::IsInterface()); @@ -44,8 +45,9 @@ KeyAccid::KeyAccid() this->RegisterAttClass(ATT_ACCIDENTAL); this->RegisterAttClass(ATT_COLOR); this->RegisterAttClass(ATT_ENCLOSINGCHARS); - this->RegisterAttClass(ATT_EXTSYM); - + this->RegisterAttClass(ATT_EXTSYMAUTH); + this->RegisterAttClass(ATT_EXTSYMNAMES); + this->Reset(); } @@ -59,7 +61,8 @@ void KeyAccid::Reset() this->ResetAccidental(); this->ResetColor(); this->ResetEnclosingChars(); - this->ResetExtSym(); + this->ResetExtSymAuth(); + this->ResetExtSymNames(); } std::u32string KeyAccid::GetSymbolStr(data_NOTATIONTYPE notationType) const diff --git a/src/mordent.cpp b/src/mordent.cpp index f3e0c3579c..ac42882eef 100644 --- a/src/mordent.cpp +++ b/src/mordent.cpp @@ -30,14 +30,16 @@ Mordent::Mordent() : ControlElement(MORDENT, "mordent-") , TimePointInterface() , AttColor() - , AttExtSym() + , AttExtSymAuth() + , AttExtSymNames() , AttOrnamentAccid() , AttPlacementRelStaff() , AttMordentLog() { this->RegisterInterface(TimePointInterface::GetAttClasses(), TimePointInterface::IsInterface()); this->RegisterAttClass(ATT_COLOR); - this->RegisterAttClass(ATT_EXTSYM); + this->RegisterAttClass(ATT_EXTSYMAUTH); + this->RegisterAttClass(ATT_EXTSYMNAMES); this->RegisterAttClass(ATT_ORNAMENTACCID); this->RegisterAttClass(ATT_PLACEMENTRELSTAFF); this->RegisterAttClass(ATT_MORDENTLOG); @@ -52,7 +54,8 @@ void Mordent::Reset() ControlElement::Reset(); TimePointInterface::Reset(); this->ResetColor(); - this->ResetExtSym(); + this->ResetExtSymAuth(); + this->ResetExtSymNames(); this->ResetOrnamentAccid(); this->ResetPlacementRelStaff(); this->ResetMordentLog(); diff --git a/src/note.cpp b/src/note.cpp index 898fc3ad3d..30cf41da9b 100644 --- a/src/note.cpp +++ b/src/note.cpp @@ -58,7 +58,8 @@ Note::Note() , AttColor() , AttColoration() , AttCue() - , AttExtSym() + , AttExtSymAuth() + , AttExtSymNames() , AttGraced() , AttHarmonicFunction() , AttMidiVelocity() @@ -76,7 +77,8 @@ Note::Note() this->RegisterAttClass(ATT_COLOR); this->RegisterAttClass(ATT_COLORATION); this->RegisterAttClass(ATT_CUE); - this->RegisterAttClass(ATT_EXTSYM); + this->RegisterAttClass(ATT_EXTSYMAUTH); + this->RegisterAttClass(ATT_EXTSYMNAMES); this->RegisterAttClass(ATT_GRACED); this->RegisterAttClass(ATT_HARMONICFUNCTION); this->RegisterAttClass(ATT_NOTEGESTAB); @@ -103,7 +105,8 @@ void Note::Reset() this->ResetColor(); this->ResetColoration(); this->ResetCue(); - this->ResetExtSym(); + this->ResetExtSymAuth(); + this->ResetExtSymNames(); this->ResetGraced(); this->ResetHarmonicFunction(); this->ResetNoteGesTab(); diff --git a/src/ornam.cpp b/src/ornam.cpp index 4931b5dab5..23a6d516fa 100644 --- a/src/ornam.cpp +++ b/src/ornam.cpp @@ -35,13 +35,15 @@ Ornam::Ornam() , TextDirInterface() , TimePointInterface() , AttColor() - , AttExtSym() + , AttExtSymAuth() + , AttExtSymNames() , AttOrnamentAccid() { this->RegisterInterface(TextDirInterface::GetAttClasses(), TextDirInterface::IsInterface()); this->RegisterInterface(TimePointInterface::GetAttClasses(), TimePointInterface::IsInterface()); this->RegisterAttClass(ATT_COLOR); - this->RegisterAttClass(ATT_EXTSYM); + this->RegisterAttClass(ATT_EXTSYMAUTH); + this->RegisterAttClass(ATT_EXTSYMNAMES); this->RegisterAttClass(ATT_ORNAMENTACCID); this->Reset(); @@ -55,7 +57,8 @@ void Ornam::Reset() TextDirInterface::Reset(); TimePointInterface::Reset(); this->ResetColor(); - this->ResetExtSym(); + this->ResetExtSymAuth(); + this->ResetExtSymNames(); this->ResetOrnamentAccid(); this->ResetPlacementRelStaff(); } diff --git a/src/pedal.cpp b/src/pedal.cpp index 8eb25b9472..79a162cc67 100644 --- a/src/pedal.cpp +++ b/src/pedal.cpp @@ -38,7 +38,8 @@ Pedal::Pedal() : ControlElement(PEDAL, "pedal-") , TimeSpanningInterface() , AttColor() - , AttExtSym() + , AttExtSymAuth() + , AttExtSymNames() , AttPedalLog() , AttPedalVis() , AttPlacementRelStaff() @@ -46,7 +47,8 @@ Pedal::Pedal() { this->RegisterInterface(TimeSpanningInterface::GetAttClasses(), TimeSpanningInterface::IsInterface()); this->RegisterAttClass(ATT_COLOR); - this->RegisterAttClass(ATT_EXTSYM); + this->RegisterAttClass(ATT_EXTSYMAUTH); + this->RegisterAttClass(ATT_EXTSYMNAMES); this->RegisterAttClass(ATT_PEDALLOG); this->RegisterAttClass(ATT_PEDALVIS); this->RegisterAttClass(ATT_PLACEMENTRELSTAFF); @@ -62,7 +64,8 @@ void Pedal::Reset() ControlElement::Reset(); TimeSpanningInterface::Reset(); this->ResetColor(); - this->ResetExtSym(); + this->ResetExtSymAuth(); + this->ResetExtSymNames(); this->ResetPedalLog(); this->ResetPedalVis(); this->ResetPlacementRelStaff(); diff --git a/src/rest.cpp b/src/rest.cpp index 9f56a54f2d..faf74538a6 100644 --- a/src/rest.cpp +++ b/src/rest.cpp @@ -157,14 +157,16 @@ Rest::Rest() , PositionInterface() , AttColor() , AttCue() - , AttExtSym() + , AttExtSymAuth() + , AttExtSymNames() , AttRestVisMensural() { this->RegisterInterface(DurationInterface::GetAttClasses(), DurationInterface::IsInterface()); this->RegisterInterface(PositionInterface::GetAttClasses(), PositionInterface::IsInterface()); this->RegisterAttClass(ATT_COLOR); this->RegisterAttClass(ATT_CUE); - this->RegisterAttClass(ATT_EXTSYM); + this->RegisterAttClass(ATT_EXTSYMAUTH); + this->RegisterAttClass(ATT_EXTSYMNAMES); this->RegisterAttClass(ATT_RESTVISMENSURAL); this->Reset(); } @@ -178,7 +180,8 @@ void Rest::Reset() PositionInterface::Reset(); this->ResetColor(); this->ResetCue(); - this->ResetExtSym(); + this->ResetExtSymAuth(); + this->ResetExtSymNames(); this->ResetRestVisMensural(); } diff --git a/src/symbol.cpp b/src/symbol.cpp index b92913824d..b359c521ac 100644 --- a/src/symbol.cpp +++ b/src/symbol.cpp @@ -26,12 +26,13 @@ namespace vrv { static const ClassRegistrar s_factory("symbol", SYMBOL); -Symbol::Symbol() : TextElement(SYMBOL, "symbol-"), AttColor(), AttExtSym(), AttTypography() +Symbol::Symbol() : TextElement(SYMBOL, "symbol-"), AttColor(), AttExtSymAuth(), AttExtSymNames(), AttTypography() { this->Reset(); this->RegisterAttClass(ATT_COLOR); - this->RegisterAttClass(ATT_EXTSYM); + this->RegisterAttClass(ATT_EXTSYMAUTH); + this->RegisterAttClass(ATT_EXTSYMNAMES); this->RegisterAttClass(ATT_TYPOGRAPHY); } @@ -42,7 +43,8 @@ void Symbol::Reset() TextElement::Reset(); this->ResetColor(); - this->ResetExtSym(); + this->ResetExtSymAuth(); + this->ResetExtSymNames(); this->ResetTypography(); } diff --git a/src/trill.cpp b/src/trill.cpp index 58334943fa..6b99cba453 100644 --- a/src/trill.cpp +++ b/src/trill.cpp @@ -31,7 +31,8 @@ Trill::Trill() , TimeSpanningInterface() , AttColor() , AttExtender() - , AttExtSym() + , AttExtSymAuth() + , AttExtSymNames() , AttLineRend() , AttNNumberLike() , AttOrnamentAccid() @@ -40,7 +41,8 @@ Trill::Trill() this->RegisterInterface(TimeSpanningInterface::GetAttClasses(), TimeSpanningInterface::IsInterface()); this->RegisterAttClass(ATT_COLOR); this->RegisterAttClass(ATT_EXTENDER); - this->RegisterAttClass(ATT_EXTSYM); + this->RegisterAttClass(ATT_EXTSYMAUTH); + this->RegisterAttClass(ATT_EXTSYMNAMES); this->RegisterAttClass(ATT_LINEREND); this->RegisterAttClass(ATT_NNUMBERLIKE); this->RegisterAttClass(ATT_ORNAMENTACCID); diff --git a/src/turn.cpp b/src/turn.cpp index 4de99c0d33..15797caa73 100644 --- a/src/turn.cpp +++ b/src/turn.cpp @@ -32,14 +32,16 @@ Turn::Turn() : ControlElement(TURN, "turn-") , TimePointInterface() , AttColor() - , AttExtSym() + , AttExtSymAuth() + , AttExtSymNames() , AttOrnamentAccid() , AttPlacementRelStaff() , AttTurnLog() { this->RegisterInterface(TimePointInterface::GetAttClasses(), TimePointInterface::IsInterface()); this->RegisterAttClass(ATT_COLOR); - this->RegisterAttClass(ATT_EXTSYM); + this->RegisterAttClass(ATT_EXTSYMAUTH); + this->RegisterAttClass(ATT_EXTSYMNAMES); this->RegisterAttClass(ATT_ORNAMENTACCID); this->RegisterAttClass(ATT_PLACEMENTRELSTAFF); this->RegisterAttClass(ATT_TURNLOG); @@ -54,7 +56,8 @@ void Turn::Reset() ControlElement::Reset(); TimePointInterface::Reset(); this->ResetColor(); - this->ResetExtSym(); + this->ResetExtSymAuth(); + this->ResetExtSymNames(); this->ResetOrnamentAccid(); this->ResetPlacementRelStaff(); this->ResetTurnLog(); From eb49c8f489d17655df96b429c3d1c8725e29cf72 Mon Sep 17 00:00:00 2001 From: Laurent Pugin Date: Thu, 1 Jun 2023 12:52:26 +0200 Subject: [PATCH 092/151] Adjust reading / writing att.extSym splitt --- src/iomei.cpp | 90 ++++++++++++++++++++++++++++++++++----------------- 1 file changed, 60 insertions(+), 30 deletions(-) diff --git a/src/iomei.cpp b/src/iomei.cpp index 45b4ece315..fb13c6be80 100644 --- a/src/iomei.cpp +++ b/src/iomei.cpp @@ -1973,7 +1973,8 @@ void MEIOutput::WriteCaesura(pugi::xml_node currentNode, Caesura *caesura) this->WriteControlElement(currentNode, caesura); this->WriteTimePointInterface(currentNode, caesura); caesura->WriteColor(currentNode); - caesura->WriteExtSym(currentNode); + caesura->WriteExtSymAuth(currentNode); + caesura->WriteExtSymNames(currentNode); caesura->WritePlacementRelStaff(currentNode); } @@ -2013,7 +2014,8 @@ void MEIOutput::WriteFermata(pugi::xml_node currentNode, Fermata *fermata) this->WriteTimePointInterface(currentNode, fermata); fermata->WriteColor(currentNode); fermata->WriteEnclosingChars(currentNode); - fermata->WriteExtSym(currentNode); + fermata->WriteExtSymAuth(currentNode); + fermata->WriteExtSymNames(currentNode); fermata->WriteFermataVis(currentNode); fermata->WritePlacementRelStaff(currentNode); } @@ -2095,7 +2097,8 @@ void MEIOutput::WriteMordent(pugi::xml_node currentNode, Mordent *mordent) this->WriteControlElement(currentNode, mordent); this->WriteTimePointInterface(currentNode, mordent); mordent->WriteColor(currentNode); - mordent->WriteExtSym(currentNode); + mordent->WriteExtSymAuth(currentNode); + mordent->WriteExtSymNames(currentNode); mordent->WriteOrnamentAccid(currentNode); mordent->WritePlacementRelStaff(currentNode); mordent->WriteMordentLog(currentNode); @@ -2123,7 +2126,8 @@ void MEIOutput::WriteOrnam(pugi::xml_node currentNode, Ornam *ornam) this->WriteTextDirInterface(currentNode, ornam); this->WriteTimePointInterface(currentNode, ornam); ornam->WriteColor(currentNode); - ornam->WriteExtSym(currentNode); + ornam->WriteExtSymAuth(currentNode); + ornam->WriteExtSymNames(currentNode); ornam->WriteOrnamentAccid(currentNode); } @@ -2134,7 +2138,8 @@ void MEIOutput::WritePedal(pugi::xml_node currentNode, Pedal *pedal) this->WriteControlElement(currentNode, pedal); this->WriteTimeSpanningInterface(currentNode, pedal); pedal->WriteColor(currentNode); - pedal->WriteExtSym(currentNode); + pedal->WriteExtSymAuth(currentNode); + pedal->WriteExtSymNames(currentNode); pedal->WritePedalLog(currentNode); pedal->WritePedalVis(currentNode); pedal->WritePlacementRelStaff(currentNode); @@ -2229,7 +2234,8 @@ void MEIOutput::WriteTrill(pugi::xml_node currentNode, Trill *trill) this->WriteTimeSpanningInterface(currentNode, trill); trill->WriteColor(currentNode); trill->WriteExtender(currentNode); - trill->WriteExtSym(currentNode); + trill->WriteExtSymAuth(currentNode); + trill->WriteExtSymNames(currentNode); trill->WriteLineRend(currentNode); trill->WriteNNumberLike(currentNode); trill->WriteOrnamentAccid(currentNode); @@ -2243,7 +2249,8 @@ void MEIOutput::WriteTurn(pugi::xml_node currentNode, Turn *turn) this->WriteControlElement(currentNode, turn); this->WriteTimePointInterface(currentNode, turn); turn->WriteColor(currentNode); - turn->WriteExtSym(currentNode); + turn->WriteExtSymAuth(currentNode); + turn->WriteExtSymNames(currentNode); turn->WriteOrnamentAccid(currentNode); turn->WritePlacementRelStaff(currentNode); turn->WriteTurnLog(currentNode); @@ -2293,7 +2300,8 @@ void MEIOutput::WriteAccid(pugi::xml_node currentNode, Accid *accid) accid->WriteAccidLog(currentNode); accid->WriteColor(currentNode); accid->WriteEnclosingChars(currentNode); - accid->WriteExtSym(currentNode); + accid->WriteExtSymAuth(currentNode); + accid->WriteExtSymNames(currentNode); accid->WritePlacementOnStaff(currentNode); accid->WritePlacementRelEvent(currentNode); } @@ -2314,7 +2322,8 @@ void MEIOutput::WriteArtic(pugi::xml_node currentNode, Artic *artic) artic->WriteArticulationGes(currentNode); artic->WriteColor(currentNode); artic->WriteEnclosingChars(currentNode); - artic->WriteExtSym(currentNode); + artic->WriteExtSymAuth(currentNode); + artic->WriteExtSymNames(currentNode); artic->WritePlacementRelEvent(currentNode); } @@ -2402,7 +2411,8 @@ void MEIOutput::WriteClef(pugi::xml_node currentNode, Clef *clef) clef->WriteClefShape(currentNode); clef->WriteColor(currentNode); clef->WriteEnclosingChars(currentNode); - clef->WriteExtSym(currentNode); + clef->WriteExtSymAuth(currentNode); + clef->WriteExtSymNames(currentNode); clef->WriteLineLoc(currentNode); clef->WriteOctave(currentNode); clef->WriteOctaveDisplacement(currentNode); @@ -2419,7 +2429,8 @@ void MEIOutput::WriteCustos(pugi::xml_node currentNode, Custos *custos) this->WritePositionInterface(currentNode, custos); this->WriteLayerElement(currentNode, custos); custos->WriteColor(currentNode); - custos->WriteExtSym(currentNode); + custos->WriteExtSymAuth(currentNode); + custos->WriteExtSymNames(currentNode); } void MEIOutput::WriteDot(pugi::xml_node currentNode, Dot *dot) @@ -2469,7 +2480,8 @@ void MEIOutput::WriteKeyAccid(pugi::xml_node currentNode, KeyAccid *keyAccid) keyAccid->WriteAccidental(currentNode); keyAccid->WriteColor(currentNode); keyAccid->WriteEnclosingChars(currentNode); - keyAccid->WriteExtSym(currentNode); + keyAccid->WriteExtSymAuth(currentNode); + keyAccid->WriteExtSymNames(currentNode); } void MEIOutput::WriteKeySig(pugi::xml_node currentNode, KeySig *keySig) @@ -2665,7 +2677,8 @@ void MEIOutput::WriteNote(pugi::xml_node currentNode, Note *note) note->WriteColor(currentNode); note->WriteColoration(currentNode); note->WriteCue(currentNode); - note->WriteExtSym(currentNode); + note->WriteExtSymAuth(currentNode); + note->WriteExtSymNames(currentNode); note->WriteGraced(currentNode); note->WriteHarmonicFunction(currentNode); note->WriteMidiVelocity(currentNode); @@ -2687,7 +2700,8 @@ void MEIOutput::WriteRest(pugi::xml_node currentNode, Rest *rest) this->WritePositionInterface(currentNode, rest); rest->WriteColor(currentNode); rest->WriteCue(currentNode); - rest->WriteExtSym(currentNode); + rest->WriteExtSymAuth(currentNode); + rest->WriteExtSymNames(currentNode); rest->WriteRestVisMensural(currentNode); } @@ -2917,7 +2931,8 @@ void MEIOutput::WriteSymbol(pugi::xml_node currentNode, Symbol *symbol) this->WriteTextElement(currentNode, symbol); symbol->WriteColor(currentNode); - symbol->WriteExtSym(currentNode); + symbol->WriteExtSymAuth(currentNode); + symbol->WriteExtSymNames(currentNode); symbol->WriteTypography(currentNode); } @@ -5484,7 +5499,8 @@ bool MEIInput::ReadCaesura(Object *parent, pugi::xml_node caesura) this->ReadTimePointInterface(caesura, vrvCaesura); vrvCaesura->ReadColor(caesura); - vrvCaesura->ReadExtSym(caesura); + vrvCaesura->ReadExtSymAuth(caesura); + vrvCaesura->ReadExtSymNames(caesura); vrvCaesura->ReadPlacementRelStaff(caesura); parent->AddChild(vrvCaesura); @@ -5536,7 +5552,8 @@ bool MEIInput::ReadFermata(Object *parent, pugi::xml_node fermata) this->ReadTimePointInterface(fermata, vrvFermata); vrvFermata->ReadColor(fermata); vrvFermata->ReadEnclosingChars(fermata); - vrvFermata->ReadExtSym(fermata); + vrvFermata->ReadExtSymAuth(fermata); + vrvFermata->ReadExtSymNames(fermata); vrvFermata->ReadFermataVis(fermata); vrvFermata->ReadPlacementRelStaff(fermata); @@ -5649,7 +5666,8 @@ bool MEIInput::ReadMordent(Object *parent, pugi::xml_node mordent) this->ReadTimePointInterface(mordent, vrvMordent); vrvMordent->ReadColor(mordent); - vrvMordent->ReadExtSym(mordent); + vrvMordent->ReadExtSymAuth(mordent); + vrvMordent->ReadExtSymNames(mordent); vrvMordent->ReadOrnamentAccid(mordent); vrvMordent->ReadPlacementRelStaff(mordent); vrvMordent->ReadMordentLog(mordent); @@ -5685,7 +5703,8 @@ bool MEIInput::ReadOrnam(Object *parent, pugi::xml_node ornam) this->ReadTextDirInterface(ornam, vrvOrnam); this->ReadTimePointInterface(ornam, vrvOrnam); vrvOrnam->ReadColor(ornam); - vrvOrnam->ReadExtSym(ornam); + vrvOrnam->ReadExtSymAuth(ornam); + vrvOrnam->ReadExtSymNames(ornam); vrvOrnam->ReadOrnamentAccid(ornam); parent->AddChild(vrvOrnam); @@ -5700,7 +5719,8 @@ bool MEIInput::ReadPedal(Object *parent, pugi::xml_node pedal) this->ReadTimeSpanningInterface(pedal, vrvPedal); vrvPedal->ReadColor(pedal); - vrvPedal->ReadExtSym(pedal); + vrvPedal->ReadExtSymAuth(pedal); + vrvPedal->ReadExtSymNames(pedal); vrvPedal->ReadPedalLog(pedal); vrvPedal->ReadPedalVis(pedal); vrvPedal->ReadPlacementRelStaff(pedal); @@ -5811,7 +5831,8 @@ bool MEIInput::ReadTrill(Object *parent, pugi::xml_node trill) this->ReadTimeSpanningInterface(trill, vrvTrill); vrvTrill->ReadColor(trill); vrvTrill->ReadExtender(trill); - vrvTrill->ReadExtSym(trill); + vrvTrill->ReadExtSymAuth(trill); + vrvTrill->ReadExtSymNames(trill); vrvTrill->ReadLineRend(trill); vrvTrill->ReadNNumberLike(trill); vrvTrill->ReadOrnamentAccid(trill); @@ -5833,7 +5854,8 @@ bool MEIInput::ReadTurn(Object *parent, pugi::xml_node turn) this->ReadTimePointInterface(turn, vrvTurn); vrvTurn->ReadColor(turn); - vrvTurn->ReadExtSym(turn); + vrvTurn->ReadExtSymAuth(turn); + vrvTurn->ReadExtSymNames(turn); vrvTurn->ReadOrnamentAccid(turn); vrvTurn->ReadPlacementRelStaff(turn); vrvTurn->ReadTurnLog(turn); @@ -6147,7 +6169,8 @@ bool MEIInput::ReadAccid(Object *parent, pugi::xml_node accid) vrvAccid->ReadAccidLog(accid); vrvAccid->ReadColor(accid); vrvAccid->ReadEnclosingChars(accid); - vrvAccid->ReadExtSym(accid); + vrvAccid->ReadExtSymAuth(accid); + vrvAccid->ReadExtSymNames(accid); vrvAccid->ReadPlacementOnStaff(accid); vrvAccid->ReadPlacementRelEvent(accid); @@ -6165,7 +6188,8 @@ bool MEIInput::ReadArtic(Object *parent, pugi::xml_node artic) vrvArtic->ReadArticulationGes(artic); vrvArtic->ReadColor(artic); vrvArtic->ReadEnclosingChars(artic); - vrvArtic->ReadExtSym(artic); + vrvArtic->ReadExtSymAuth(artic); + vrvArtic->ReadExtSymNames(artic); vrvArtic->ReadPlacementRelEvent(artic); if (vrvArtic->GetArtic().size() > 1) { @@ -6290,7 +6314,8 @@ bool MEIInput::ReadClef(Object *parent, pugi::xml_node clef) vrvClef->ReadClefShape(clef); vrvClef->ReadColor(clef); vrvClef->ReadEnclosingChars(clef); - vrvClef->ReadExtSym(clef); + vrvClef->ReadExtSymAuth(clef); + vrvClef->ReadExtSymNames(clef); vrvClef->ReadLineLoc(clef); vrvClef->ReadOctave(clef); vrvClef->ReadOctaveDisplacement(clef); @@ -6326,7 +6351,8 @@ bool MEIInput::ReadCustos(Object *parent, pugi::xml_node custos) this->ReadPitchInterface(custos, vrvCustos); this->ReadPositionInterface(custos, vrvCustos); vrvCustos->ReadColor(custos); - vrvCustos->ReadExtSym(custos); + vrvCustos->ReadExtSymAuth(custos); + vrvCustos->ReadExtSymNames(custos); this->ReadAccidAttr(custos, vrvCustos); @@ -6402,7 +6428,8 @@ bool MEIInput::ReadKeyAccid(Object *parent, pugi::xml_node keyAccid) vrvKeyAccid->ReadAccidental(keyAccid); vrvKeyAccid->ReadColor(keyAccid); vrvKeyAccid->ReadEnclosingChars(keyAccid); - vrvKeyAccid->ReadExtSym(keyAccid); + vrvKeyAccid->ReadExtSymAuth(keyAccid); + vrvKeyAccid->ReadExtSymNames(keyAccid); parent->AddChild(vrvKeyAccid); this->ReadUnsupportedAttr(keyAccid, vrvKeyAccid); @@ -6626,7 +6653,8 @@ bool MEIInput::ReadNote(Object *parent, pugi::xml_node note) vrvNote->ReadColor(note); vrvNote->ReadColoration(note); vrvNote->ReadCue(note); - vrvNote->ReadExtSym(note); + vrvNote->ReadExtSymAuth(note); + rvNote->ReadExtSymNames(note); vrvNote->ReadGraced(note); vrvNote->ReadHarmonicFunction(note); vrvNote->ReadMidiVelocity(note); @@ -6677,7 +6705,8 @@ bool MEIInput::ReadRest(Object *parent, pugi::xml_node rest) this->ReadPositionInterface(rest, vrvRest); vrvRest->ReadColor(rest); vrvRest->ReadCue(rest); - vrvRest->ReadExtSym(rest); + vrvRest->ReadExtSymAuth(rest); + vrvRest->ReadExtSymNames(rest); vrvRest->ReadRestVisMensural(rest); parent->AddChild(vrvRest); @@ -7035,7 +7064,8 @@ bool MEIInput::ReadSymbol(Object *parent, pugi::xml_node symbol) this->ReadTextElement(symbol, vrvSymbol); vrvSymbol->ReadColor(symbol); - vrvSymbol->ReadExtSym(symbol); + vrvSymbol->ReadExtSymAuth(symbol); + vrvSymbol->ReadExtSymNames(symbol); vrvSymbol->ReadTypography(symbol); parent->AddChild(vrvSymbol); From 030b6c9adbe5f0b4f65e5a81834f397acc37bb0c Mon Sep 17 00:00:00 2001 From: Laurent Pugin Date: Thu, 1 Jun 2023 12:54:59 +0200 Subject: [PATCH 093/151] Add AttVisibility to MeterSig --- include/vrv/metersig.h | 6 +++++- src/iomei.cpp | 2 ++ src/metersig.cpp | 5 ++++- 3 files changed, 11 insertions(+), 2 deletions(-) diff --git a/include/vrv/metersig.h b/include/vrv/metersig.h index 47e1fcebda..df024fd514 100644 --- a/include/vrv/metersig.h +++ b/include/vrv/metersig.h @@ -23,7 +23,11 @@ class ScoreDefInterface; /** * This class models the MEI element. */ -class MeterSig : public LayerElement, public AttEnclosingChars, public AttMeterSigLog, public AttMeterSigVis { +class MeterSig : public LayerElement, + public AttEnclosingChars, + public AttMeterSigLog, + public AttMeterSigVis, + public AttVisibility { public: /** * @name Constructors, destructors, and other standard methods diff --git a/src/iomei.cpp b/src/iomei.cpp index fb13c6be80..0ac2749b09 100644 --- a/src/iomei.cpp +++ b/src/iomei.cpp @@ -2583,6 +2583,7 @@ void MEIOutput::WriteMeterSig(pugi::xml_node currentNode, MeterSig *meterSig) meterSig->WriteEnclosingChars(currentNode); meterSig->WriteMeterSigLog(currentNode); meterSig->WriteMeterSigVis(currentNode); + meterSig->WriteVisibility(currentNode); } void MEIOutput::WriteMRest(pugi::xml_node currentNode, MRest *mRest) @@ -6503,6 +6504,7 @@ bool MEIInput::ReadMeterSig(Object *parent, pugi::xml_node meterSig) vrvMeterSig->ReadEnclosingChars(meterSig); vrvMeterSig->ReadMeterSigLog(meterSig); vrvMeterSig->ReadMeterSigVis(meterSig); + vrvMeterSig->ReadVisibility(meterSig); parent->AddChild(vrvMeterSig); this->ReadUnsupportedAttr(meterSig, vrvMeterSig); diff --git a/src/metersig.cpp b/src/metersig.cpp index 204bb19a75..e27022f9d7 100644 --- a/src/metersig.cpp +++ b/src/metersig.cpp @@ -28,11 +28,13 @@ namespace vrv { static const ClassRegistrar s_factory("meterSig", METERSIG); -MeterSig::MeterSig() : LayerElement(METERSIG, "msig-"), AttEnclosingChars(), AttMeterSigLog(), AttMeterSigVis() +MeterSig::MeterSig() + : LayerElement(METERSIG, "msig-"), AttEnclosingChars(), AttMeterSigLog(), AttMeterSigVis(), AttVisibility() { this->RegisterAttClass(ATT_ENCLOSINGCHARS); this->RegisterAttClass(ATT_METERSIGLOG); this->RegisterAttClass(ATT_METERSIGVIS); + this->RegisterAttClass(ATT_VISIBILITY); this->Reset(); } @@ -45,6 +47,7 @@ void MeterSig::Reset() this->ResetEnclosingChars(); this->ResetMeterSigLog(); this->ResetMeterSigVis(); + this->ResetVisibility(); } int MeterSig::GetTotalCount() const From a48755eb402ef608072e9a001c2ac9b5eef8f3af Mon Sep 17 00:00:00 2001 From: Laurent Pugin Date: Thu, 1 Jun 2023 12:55:09 +0200 Subject: [PATCH 094/151] formatting --- src/custos.cpp | 2 +- src/keyaccid.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/custos.cpp b/src/custos.cpp index 58e4cb185b..390205303e 100644 --- a/src/custos.cpp +++ b/src/custos.cpp @@ -38,7 +38,7 @@ Custos::Custos() this->RegisterAttClass(ATT_COLOR); this->RegisterAttClass(ATT_EXTSYMAUTH); this->RegisterAttClass(ATT_EXTSYMNAMES); - + this->Reset(); } diff --git a/src/keyaccid.cpp b/src/keyaccid.cpp index 39ba71cab1..19cdf0f9c6 100644 --- a/src/keyaccid.cpp +++ b/src/keyaccid.cpp @@ -47,7 +47,7 @@ KeyAccid::KeyAccid() this->RegisterAttClass(ATT_ENCLOSINGCHARS); this->RegisterAttClass(ATT_EXTSYMAUTH); this->RegisterAttClass(ATT_EXTSYMNAMES); - + this->Reset(); } From b296826e89c7d3516a91d6e58645d5b47e5db042 Mon Sep 17 00:00:00 2001 From: Laurent Pugin Date: Thu, 1 Jun 2023 12:56:32 +0200 Subject: [PATCH 095/151] Fix typo --- src/iomei.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/iomei.cpp b/src/iomei.cpp index 0ac2749b09..f209fc4d47 100644 --- a/src/iomei.cpp +++ b/src/iomei.cpp @@ -6656,7 +6656,7 @@ bool MEIInput::ReadNote(Object *parent, pugi::xml_node note) vrvNote->ReadColoration(note); vrvNote->ReadCue(note); vrvNote->ReadExtSymAuth(note); - rvNote->ReadExtSymNames(note); + vrvNote->ReadExtSymNames(note); vrvNote->ReadGraced(note); vrvNote->ReadHarmonicFunction(note); vrvNote->ReadMidiVelocity(note); From 460fdd0b804adafd1927ba1af19b1f2beae443b4 Mon Sep 17 00:00:00 2001 From: Laurent Pugin Date: Thu, 1 Jun 2023 12:56:49 +0200 Subject: [PATCH 096/151] Change SetForm to SetVisible --- src/iomei.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/iomei.cpp b/src/iomei.cpp index f209fc4d47..23a1d3d2e0 100644 --- a/src/iomei.cpp +++ b/src/iomei.cpp @@ -1387,7 +1387,7 @@ void MEIOutput::AdjustStaffDef(StaffDef *staffDef, Measure *measure) ListOfObjects objects = staffDef->FindAllDescendantsByType(METERSIG); for (Object *object : objects) { MeterSig *meterSig = vrv_cast(object); - meterSig->SetForm(METERFORM_invis); + meterSig->SetVisible(BOOLEAN_false); } } } From 2c63bee2285b24a53912c791bc57cf63557a4c27 Mon Sep 17 00:00:00 2001 From: Laurent Pugin Date: Thu, 1 Jun 2023 13:42:31 +0200 Subject: [PATCH 097/151] Fix DURATION.GESTURAL data type name change --- libmei/datatypes.yml | 4 +-- libmei/dist/attconverter.cpp | 63 ----------------------------------- libmei/dist/attconverter.h | 3 -- libmei/dist/attmodule.cpp | 4 +-- libmei/dist/atts_gestural.cpp | 8 ++--- libmei/dist/atts_gestural.h | 6 ++-- libmei/dist/atttypes.h | 30 ----------------- 7 files changed, 11 insertions(+), 107 deletions(-) diff --git a/libmei/datatypes.yml b/libmei/datatypes.yml index 42fd1aa163..8c7697935c 100644 --- a/libmei/datatypes.yml +++ b/libmei/datatypes.yml @@ -6,7 +6,7 @@ excludes: data.DURATION, data.DURATION.cmn, data.DURATION.mensural, - data.DURATION.gestural, + data.DURATION.GESTURAL, data.DURATIONRESTS, data.HEXNUM, data.KEYSIGNATURE, @@ -52,7 +52,7 @@ mapped: int data.DURATION.cmn: data_DURATION - data.DURATION.gestural: + data.DURATION.GESTURAL: data_DURATION data.DURATION.mensural: data_DURATION diff --git a/libmei/dist/attconverter.cpp b/libmei/dist/attconverter.cpp index ad8e418602..1b86e618b0 100644 --- a/libmei/dist/attconverter.cpp +++ b/libmei/dist/attconverter.cpp @@ -1189,69 +1189,6 @@ data_DIVISIO AttConverterBase::StrToDivisio(const std::string &value, bool logWa return DIVISIO_NONE; } -std::string AttConverterBase::DurationGesturalToStr(data_DURATION_GESTURAL data) const -{ - std::string value; - switch (data) { - case DURATION_GESTURAL_long: value = "long"; break; - case DURATION_GESTURAL_breve: value = "breve"; break; - case DURATION_GESTURAL_1: value = "1"; break; - case DURATION_GESTURAL_2: value = "2"; break; - case DURATION_GESTURAL_4: value = "4"; break; - case DURATION_GESTURAL_8: value = "8"; break; - case DURATION_GESTURAL_16: value = "16"; break; - case DURATION_GESTURAL_32: value = "32"; break; - case DURATION_GESTURAL_64: value = "64"; break; - case DURATION_GESTURAL_128: value = "128"; break; - case DURATION_GESTURAL_256: value = "256"; break; - case DURATION_GESTURAL_512: value = "512"; break; - case DURATION_GESTURAL_1024: value = "1024"; break; - case DURATION_GESTURAL_2048: value = "2048"; break; - case DURATION_GESTURAL_maxima: value = "maxima"; break; - case DURATION_GESTURAL_longa: value = "longa"; break; - case DURATION_GESTURAL_brevis: value = "brevis"; break; - case DURATION_GESTURAL_semibrevis: value = "semibrevis"; break; - case DURATION_GESTURAL_minima: value = "minima"; break; - case DURATION_GESTURAL_semiminima: value = "semiminima"; break; - case DURATION_GESTURAL_fusa: value = "fusa"; break; - case DURATION_GESTURAL_semifusa: value = "semifusa"; break; - default: - LogWarning("Unknown value '%d' for data.DURATION.GESTURAL", data); - value = ""; - break; - } - return value; -} - -data_DURATION_GESTURAL AttConverterBase::StrToDurationGestural(const std::string &value, bool logWarning) const -{ - if (value == "long") return DURATION_GESTURAL_long; - if (value == "breve") return DURATION_GESTURAL_breve; - if (value == "1") return DURATION_GESTURAL_1; - if (value == "2") return DURATION_GESTURAL_2; - if (value == "4") return DURATION_GESTURAL_4; - if (value == "8") return DURATION_GESTURAL_8; - if (value == "16") return DURATION_GESTURAL_16; - if (value == "32") return DURATION_GESTURAL_32; - if (value == "64") return DURATION_GESTURAL_64; - if (value == "128") return DURATION_GESTURAL_128; - if (value == "256") return DURATION_GESTURAL_256; - if (value == "512") return DURATION_GESTURAL_512; - if (value == "1024") return DURATION_GESTURAL_1024; - if (value == "2048") return DURATION_GESTURAL_2048; - if (value == "maxima") return DURATION_GESTURAL_maxima; - if (value == "longa") return DURATION_GESTURAL_longa; - if (value == "brevis") return DURATION_GESTURAL_brevis; - if (value == "semibrevis") return DURATION_GESTURAL_semibrevis; - if (value == "minima") return DURATION_GESTURAL_minima; - if (value == "semiminima") return DURATION_GESTURAL_semiminima; - if (value == "fusa") return DURATION_GESTURAL_fusa; - if (value == "semifusa") return DURATION_GESTURAL_semifusa; - if (logWarning && !value.empty()) - LogWarning("Unsupported value '%s' for data.DURATION.GESTURAL", value.c_str()); - return DURATION_GESTURAL_NONE; -} - std::string AttConverterBase::DurationrestsMensuralToStr(data_DURATIONRESTS_mensural data) const { std::string value; diff --git a/libmei/dist/attconverter.h b/libmei/dist/attconverter.h index 3a5040169a..813ae1b281 100644 --- a/libmei/dist/attconverter.h +++ b/libmei/dist/attconverter.h @@ -102,9 +102,6 @@ class AttConverterBase { std::string DivisioToStr(data_DIVISIO data) const; data_DIVISIO StrToDivisio(const std::string &value, bool logWarning = true) const; - std::string DurationGesturalToStr(data_DURATION_GESTURAL data) const; - data_DURATION_GESTURAL StrToDurationGestural(const std::string &value, bool logWarning = true) const; - std::string DurationrestsMensuralToStr(data_DURATIONRESTS_mensural data) const; data_DURATIONRESTS_mensural StrToDurationrestsMensural(const std::string &value, bool logWarning = true) const; diff --git a/libmei/dist/attmodule.cpp b/libmei/dist/attmodule.cpp index 62250666b9..dcbdff79e1 100644 --- a/libmei/dist/attmodule.cpp +++ b/libmei/dist/attmodule.cpp @@ -1294,7 +1294,7 @@ bool AttModule::SetGestural(Object *element, const std::string &attrType, const AttDurationGes *att = dynamic_cast(element); assert(att); if (attrType == "dur.ges") { - att->SetDurGes(att->StrToDurationGestural(attrValue)); + att->SetDurGes(att->StrToDuration(attrValue)); return true; } if (attrType == "dots.ges") { @@ -1449,7 +1449,7 @@ void AttModule::GetGestural(const Object *element, ArrayOfStrAttr *attributes) const AttDurationGes *att = dynamic_cast(element); assert(att); if (att->HasDurGes()) { - attributes->push_back({ "dur.ges", att->DurationGesturalToStr(att->GetDurGes()) }); + attributes->push_back({ "dur.ges", att->DurationToStr(att->GetDurGes()) }); } if (att->HasDotsGes()) { attributes->push_back({ "dots.ges", att->IntToStr(att->GetDotsGes()) }); diff --git a/libmei/dist/atts_gestural.cpp b/libmei/dist/atts_gestural.cpp index a8804281d5..b448bd659a 100644 --- a/libmei/dist/atts_gestural.cpp +++ b/libmei/dist/atts_gestural.cpp @@ -153,7 +153,7 @@ AttDurationGes::AttDurationGes() : Att() void AttDurationGes::ResetDurationGes() { - m_durGes = DURATION_GESTURAL_NONE; + m_durGes = DURATION_NONE; m_dotsGes = MEI_UNSET; m_durMetrical = 0.0; m_durPpq = MEI_UNSET; @@ -165,7 +165,7 @@ bool AttDurationGes::ReadDurationGes(pugi::xml_node element, bool removeAttr) { bool hasAttribute = false; if (element.attribute("dur.ges")) { - this->SetDurGes(StrToDurationGestural(element.attribute("dur.ges").value())); + this->SetDurGes(StrToDuration(element.attribute("dur.ges").value())); if (removeAttr) element.remove_attribute("dur.ges"); hasAttribute = true; } @@ -201,7 +201,7 @@ bool AttDurationGes::WriteDurationGes(pugi::xml_node element) { bool wroteAttribute = false; if (this->HasDurGes()) { - element.append_attribute("dur.ges") = DurationGesturalToStr(this->GetDurGes()).c_str(); + element.append_attribute("dur.ges") = DurationToStr(this->GetDurGes()).c_str(); wroteAttribute = true; } if (this->HasDotsGes()) { @@ -229,7 +229,7 @@ bool AttDurationGes::WriteDurationGes(pugi::xml_node element) bool AttDurationGes::HasDurGes() const { - return (m_durGes != DURATION_GESTURAL_NONE); + return (m_durGes != DURATION_NONE); } bool AttDurationGes::HasDotsGes() const diff --git a/libmei/dist/atts_gestural.h b/libmei/dist/atts_gestural.h index dc02da9c9c..e49d7a8052 100644 --- a/libmei/dist/atts_gestural.h +++ b/libmei/dist/atts_gestural.h @@ -201,8 +201,8 @@ class AttDurationGes : public Att { * to the default value) **/ ///@{ - void SetDurGes(data_DURATION_GESTURAL durGes_) { m_durGes = durGes_; } - data_DURATION_GESTURAL GetDurGes() const { return m_durGes; } + void SetDurGes(data_DURATION durGes_) { m_durGes = durGes_; } + data_DURATION GetDurGes() const { return m_durGes; } bool HasDurGes() const; // void SetDotsGes(int dotsGes_) { m_dotsGes = dotsGes_; } @@ -228,7 +228,7 @@ class AttDurationGes : public Att { private: /** Records performed duration information that differs from the written duration. **/ - data_DURATION_GESTURAL m_durGes; + data_DURATION m_durGes; /** * Number of dots required for a gestural duration when different from that of the * written duration. diff --git a/libmei/dist/atttypes.h b/libmei/dist/atttypes.h index 4a9ae186c4..2bdbae4b8b 100644 --- a/libmei/dist/atttypes.h +++ b/libmei/dist/atttypes.h @@ -565,36 +565,6 @@ enum data_DIVISIO : int8_t { DIVISIO_MAX }; -/** - * MEI data.DURATION.GESTURAL - */ -enum data_DURATION_GESTURAL : int8_t { - DURATION_GESTURAL_NONE = 0, - DURATION_GESTURAL_long, - DURATION_GESTURAL_breve, - DURATION_GESTURAL_1, - DURATION_GESTURAL_2, - DURATION_GESTURAL_4, - DURATION_GESTURAL_8, - DURATION_GESTURAL_16, - DURATION_GESTURAL_32, - DURATION_GESTURAL_64, - DURATION_GESTURAL_128, - DURATION_GESTURAL_256, - DURATION_GESTURAL_512, - DURATION_GESTURAL_1024, - DURATION_GESTURAL_2048, - DURATION_GESTURAL_maxima, - DURATION_GESTURAL_longa, - DURATION_GESTURAL_brevis, - DURATION_GESTURAL_semibrevis, - DURATION_GESTURAL_minima, - DURATION_GESTURAL_semiminima, - DURATION_GESTURAL_fusa, - DURATION_GESTURAL_semifusa, - DURATION_GESTURAL_MAX -}; - /** * MEI data.DURATIONRESTS.mensural */ From 96c0414a0e947641cec20d4fab9fa962e1fced93 Mon Sep 17 00:00:00 2001 From: Laurent Pugin Date: Thu, 1 Jun 2023 13:43:38 +0200 Subject: [PATCH 098/151] Change GetForm to GetVisibility --- src/alignfunctor.cpp | 2 +- src/iomei.cpp | 1 + src/iomusxml.cpp | 2 +- src/scoredef.cpp | 2 +- src/view_element.cpp | 2 +- src/view_page.cpp | 2 +- 6 files changed, 6 insertions(+), 5 deletions(-) diff --git a/src/alignfunctor.cpp b/src/alignfunctor.cpp index 47f3dfaa22..251227ba26 100644 --- a/src/alignfunctor.cpp +++ b/src/alignfunctor.cpp @@ -75,7 +75,7 @@ FunctorCode AlignHorizontallyFunctor::VisitLayer(Layer *layer) this->ResetCode(); } else if (layer->GetStaffDefMeterSig()) { - if (layer->GetStaffDefMeterSig()->GetForm() != METERFORM_invis) { + if (layer->GetStaffDefMeterSig()->GetVisible() != BOOLEAN_false) { this->VisitMeterSig(layer->GetStaffDefMeterSig()); } } diff --git a/src/iomei.cpp b/src/iomei.cpp index 23a1d3d2e0..bd651c82aa 100644 --- a/src/iomei.cpp +++ b/src/iomei.cpp @@ -4662,6 +4662,7 @@ bool MEIInput::ReadScoreDefElement(pugi::xml_node element, ScoreDefElement *obje vrvMeterSig->SetSym(meterSigDefaultLog.GetMeterSym()); vrvMeterSig->SetUnit(meterSigDefaultLog.GetMeterUnit()); vrvMeterSig->SetForm(meterSigDefaultVis.GetMeterForm()); + vrvMeterSig->SetVisible(meterSigDefaultVis.GetMeterVisible()); object->AddChild(vrvMeterSig); } diff --git a/src/iomusxml.cpp b/src/iomusxml.cpp index 0d0a5ff85a..0ef666da4e 100644 --- a/src/iomusxml.cpp +++ b/src/iomusxml.cpp @@ -1544,7 +1544,7 @@ void MusicXmlInput::ReadMusicXMLMeterSig(const pugi::xml_node &time, Object *par meterSig->SetSym(METERSIGN_open); } else { - meterSig->SetForm(METERFORM_invis); + meterSig->SetVisible(BOOLEAN_false); } } parent->AddChild(meterSig); diff --git a/src/scoredef.cpp b/src/scoredef.cpp index 0f46e79732..d84f16f6d5 100644 --- a/src/scoredef.cpp +++ b/src/scoredef.cpp @@ -394,7 +394,7 @@ void ScoreDef::ReplaceDrawingValues(const StaffDef *newStaffDef) // If there is a mensur and the meterSig // is invisible, then print mensur instead data_METERFORM meterForm = meterSig->GetForm(); - if (meterForm == METERFORM_invis) { + if (meterSig->GetVisible() == BOOLEAN_false) { staffDef->SetDrawMeterSig(false); staffDef->SetDrawMensur(true); Mensur *mensur = newStaffDef->GetMensurCopy(); diff --git a/src/view_element.cpp b/src/view_element.cpp index 07c9fe8b89..3977b820f5 100644 --- a/src/view_element.cpp +++ b/src/view_element.cpp @@ -1049,7 +1049,7 @@ void View::DrawMeterSig(DeviceContext *dc, LayerElement *element, Layer *layer, assert(meterSig); // hidden time signature - if (meterSig->GetForm() == METERFORM_invis) { + if (meterSig->GetVisible() == BOOLEAN_false) { dc->StartGraphic(element, "", element->GetID()); meterSig->SetEmptyBB(); dc->EndGraphic(element, this); diff --git a/src/view_page.cpp b/src/view_page.cpp index 98fdd27732..5cebfaa9fe 100644 --- a/src/view_page.cpp +++ b/src/view_page.cpp @@ -1122,7 +1122,7 @@ void View::DrawMeterSigGrp(DeviceContext *dc, Layer *layer, Staff *staff) [](Object *object) { MeterSig *meterSig = vrv_cast(object); assert(meterSig); - return ((meterSig->GetForm() == METERFORM_invis) || !meterSig->HasCount()); + return ((meterSig->GetVisible() == BOOLEAN_false) || !meterSig->HasCount()); }), childList.end()); From e5a5bb51717e480a7a9c2b4c5ea953808cc2b413 Mon Sep 17 00:00:00 2001 From: Laurent Pugin Date: Thu, 1 Jun 2023 13:44:01 +0200 Subject: [PATCH 099/151] Fix Fermata and Trill Reset() --- src/fermata.cpp | 3 ++- src/trill.cpp | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/fermata.cpp b/src/fermata.cpp index 02b1c87341..830f9a4dca 100644 --- a/src/fermata.cpp +++ b/src/fermata.cpp @@ -55,7 +55,8 @@ void Fermata::Reset() TimePointInterface::Reset(); this->ResetColor(); this->ResetEnclosingChars(); - this->ResetExtSym(); + this->ResetExtSymAuth(); + this->ResetExtSymNames(); this->ResetFermataVis(); this->ResetPlacementRelStaff(); } diff --git a/src/trill.cpp b/src/trill.cpp index 6b99cba453..8d6b762ff3 100644 --- a/src/trill.cpp +++ b/src/trill.cpp @@ -59,7 +59,8 @@ void Trill::Reset() TimeSpanningInterface::Reset(); this->ResetColor(); this->ResetExtender(); - this->ResetExtSym(); + this->ResetExtSymAuth(); + this->ResetExtSymNames(); this->ResetLineRend(); this->ResetNNumberLike(); this->ResetOrnamentAccid(); From 02c788baf1fbe0c813bceaafac8e53b77e4c808e Mon Sep 17 00:00:00 2001 From: Laurent Pugin Date: Thu, 1 Jun 2023 13:44:22 +0200 Subject: [PATCH 100/151] Change note modifier from dblwhole to fences --- src/note.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/note.cpp b/src/note.cpp index 30cf41da9b..5e41b1c513 100644 --- a/src/note.cpp +++ b/src/note.cpp @@ -573,7 +573,7 @@ char32_t Note::GetNoteheadGlyph(const int duration) const } switch (this->GetHeadMod()) { - case NOTEHEADMODIFIER_dblwhole: return SMUFL_E0A0_noteheadDoubleWhole; + case NOTEHEADMODIFIER_fences: return SMUFL_E0A0_noteheadDoubleWhole; default: break; } From 5d7541e7751f19889a549ab16f3d8c861ac41617 Mon Sep 17 00:00:00 2001 From: Laurent Pugin Date: Thu, 1 Jun 2023 13:45:12 +0200 Subject: [PATCH 101/151] Add Upgrade methods for scroDef/StaffDef and meterSig --- include/vrv/iomei.h | 2 ++ src/iomei.cpp | 30 ++++++++++++++++++++++++++++++ 2 files changed, 32 insertions(+) diff --git a/include/vrv/iomei.h b/include/vrv/iomei.h index d50d0b75d6..0bfb7b64c9 100644 --- a/include/vrv/iomei.h +++ b/include/vrv/iomei.h @@ -882,6 +882,8 @@ class MEIInput : public Input { // to MEI 5.0.0 void UpgradePageTo_5_0_0(Page *page); void UpgradeMeasureTo_5_0_0(pugi::xml_node measure); + void UpgradeMeterSigTo_5_0_0(pugi::xml_node meterSig, MeterSig *vrvMeterSig); + void UpgradeScoreDefElementTo_5_0_0(pugi::xml_node scoreDefElement); void UpgradeStaffTo_5_0_0(pugi::xml_node staff); void UpgradeLayerElementTo_5_0_0(pugi::xml_node element); // to MEI 4.0.0 diff --git a/src/iomei.cpp b/src/iomei.cpp index bd651c82aa..16b1d4a8b3 100644 --- a/src/iomei.cpp +++ b/src/iomei.cpp @@ -4583,6 +4583,10 @@ bool MEIInput::ReadScoreDefElement(pugi::xml_node element, ScoreDefElement *obje object->ReadSystems(element); object->ReadTyped(element); + if (m_meiversion <= meiVersion_MEIVERSION_5_0_0_dev) { + UpgradeScoreDefElementTo_5_0_0(element); + } + InstCleffingLog cleffingLog; cleffingLog.ReadCleffingLog(element); InstCleffingVis cleffingVis; @@ -6502,6 +6506,10 @@ bool MEIInput::ReadMeterSig(Object *parent, pugi::xml_node meterSig) MeterSig *vrvMeterSig = new MeterSig(); this->ReadLayerElement(meterSig, vrvMeterSig); + if (m_meiversion <= meiVersion_MEIVERSION_5_0_0_dev) { + this->UpgradeMeterSigTo_5_0_0(meterSig, vrvMeterSig); + } + vrvMeterSig->ReadEnclosingChars(meterSig); vrvMeterSig->ReadMeterSigLog(meterSig); vrvMeterSig->ReadMeterSigVis(meterSig); @@ -7982,6 +7990,28 @@ void MEIInput::UpgradeMeasureTo_5_0_0(pugi::xml_node measure) } } +void MEIInput::UpgradeMeterSigTo_5_0_0(pugi::xml_node meterSig, MeterSig *vrvMeterSig) +{ + if (meterSig.attribute("form")) { + std::string value = meterSig.attribute("form").value(); + if (value == "invis") { + meterSig.remove_attribute("form"); + vrvMeterSig->SetVisible(BOOLEAN_false); + } + } +} + +void MEIInput::UpgradeScoreDefElementTo_5_0_0(pugi::xml_node scoreDefElement) +{ + if (scoreDefElement.attribute("meter.form")) { + std::string value = scoreDefElement.attribute("meter.form").value(); + if (value == "invis") { + scoreDefElement.remove_attribute("meter.form"); + scoreDefElement.append_attribute("meter.visible") = "false"; + } + } +} + void MEIInput::UpgradeStaffTo_5_0_0(pugi::xml_node staff) { if (staff.attribute("uly")) { From b92631e6b6158304c1bd24e34f02a53660dcfa8a Mon Sep 17 00:00:00 2001 From: Laurent Pugin Date: Thu, 1 Jun 2023 13:45:56 +0200 Subject: [PATCH 102/151] Adjust att.keySigDefaultVis attribute name change --- src/iomei.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/iomei.cpp b/src/iomei.cpp index 16b1d4a8b3..35b5f8a63d 100644 --- a/src/iomei.cpp +++ b/src/iomei.cpp @@ -2502,7 +2502,7 @@ void MEIOutput::WriteKeySig(pugi::xml_node currentNode, KeySig *keySig) attKeySigDefaultLog.SetKeySig(sig); attKeySigDefaultLog.WriteKeySigDefaultLog(currentNode); InstKeySigDefaultVis attKeySigDefaultVis; - attKeySigDefaultVis.SetKeysigShow(keySig->GetVisible()); + attKeySigDefaultVis.SetKeysigVisible(keySig->GetVisible()); attKeySigDefaultVis.SetKeysigShowchange(keySig->GetSigShowchange()); attKeySigDefaultVis.WriteKeySigDefaultVis(currentNode); return; @@ -4610,7 +4610,8 @@ bool MEIInput::ReadScoreDefElement(pugi::xml_node element, ScoreDefElement *obje InstKeySigDefaultVis keySigDefaultVis; keySigDefaultVis.ReadKeySigDefaultVis(element); if (keySigDefaultAnl.HasKeyAccid() || keySigDefaultAnl.HasKeyMode() || keySigDefaultAnl.HasKeyPname() - || keySigDefaultLog.HasKeySig() || keySigDefaultVis.HasKeysigShow() || keySigDefaultVis.HasKeysigShowchange()) { + || keySigDefaultLog.HasKeySig() || keySigDefaultVis.HasKeysigVisible() + || keySigDefaultVis.HasKeysigShowchange()) { KeySig *vrvKeySig = new KeySig(); vrvKeySig->IsAttribute(true); // Broken in MEI 4.0.2 - waiting for a fix @@ -4618,7 +4619,7 @@ bool MEIInput::ReadScoreDefElement(pugi::xml_node element, ScoreDefElement *obje vrvKeySig->SetMode(keySigDefaultAnl.GetKeyMode()); vrvKeySig->SetPname(keySigDefaultAnl.GetKeyPname()); vrvKeySig->SetSig(keySigDefaultLog.GetKeySig()); - vrvKeySig->SetVisible(keySigDefaultVis.GetKeysigShow()); + vrvKeySig->SetVisible(keySigDefaultVis.GetKeysigVisible()); vrvKeySig->SetSigShowchange(keySigDefaultVis.GetKeysigShowchange()); object->AddChild(vrvKeySig); } From d85210b21b1891608a3bb1a39d578562f62c9ef1 Mon Sep 17 00:00:00 2001 From: Laurent Pugin Date: Thu, 1 Jun 2023 13:52:53 +0200 Subject: [PATCH 103/151] Upgrade keysig.show to keysig.visible --- src/iomei.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/iomei.cpp b/src/iomei.cpp index 35b5f8a63d..974ba3bcd3 100644 --- a/src/iomei.cpp +++ b/src/iomei.cpp @@ -8011,6 +8011,9 @@ void MEIInput::UpgradeScoreDefElementTo_5_0_0(pugi::xml_node scoreDefElement) scoreDefElement.append_attribute("meter.visible") = "false"; } } + if (scoreDefElement.attribute("keysig.show")) { + scoreDefElement.attribute("keysig.show").set_name("keysig.visible"); + } } void MEIInput::UpgradeStaffTo_5_0_0(pugi::xml_node staff) From 5c13ebbc31105f0717867e4d6ae23ff09b235555 Mon Sep 17 00:00:00 2001 From: Laurent Pugin Date: Thu, 1 Jun 2023 14:37:11 +0200 Subject: [PATCH 104/151] Fix change to meterSig@visible in Humdrum importer --- src/iohumdrum.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/iohumdrum.cpp b/src/iohumdrum.cpp index 7979862ba0..34a6fabd0e 100644 --- a/src/iohumdrum.cpp +++ b/src/iohumdrum.cpp @@ -6520,7 +6520,7 @@ void HumdrumInput::setTimeSig(StaffDef *part, const std::string ×ig, const if (metertok) { if (*metertok == "*met()") { // set time signature to be invisible - vrvmeter->SetForm(METERFORM_invis); + vrvmeter->SetVisible(BOOLEAN_false); } } @@ -6549,7 +6549,7 @@ void HumdrumInput::setTimeSig(StaffDef *part, const std::string ×ig, const if (bot == 0) { if (mensuration) { // hide time signature - vrvmeter->SetForm(METERFORM_invis); + vrvmeter->SetVisible(BOOLEAN_false); } vrvmeter->SetCount({ { top * 2 }, MeterCountSign::None }); vrvmeter->SetUnit(1); @@ -6558,7 +6558,7 @@ void HumdrumInput::setTimeSig(StaffDef *part, const std::string ×ig, const if (mensuration) { // Can't add if there is a mensuration; otherwise, // a time signature will be shown. - vrvmeter->SetForm(METERFORM_invis); + vrvmeter->SetVisible(BOOLEAN_false); vrvmeter->SetCount({ { top }, MeterCountSign::None }); vrvmeter->SetUnit(bot); } @@ -6635,7 +6635,7 @@ void HumdrumInput::setTimeSig(ELEMENT element, hum::HTp timesigtok, hum::HTp met MeterSig *vrvmetersig = getMeterSig(element); vrvmetersig->SetCount({ { std::stoi(matches[1]) }, MeterCountSign::None }); vrvmetersig->SetUnit(unit); - vrvmetersig->SetForm(METERFORM_invis); + vrvmetersig->SetVisible(BOOLEAN_false); } else if (metersig == "3") { MeterSig *vrvmetersig = getMeterSig(element); @@ -6669,7 +6669,7 @@ void HumdrumInput::setTimeSig(ELEMENT element, hum::HTp timesigtok, hum::HTp met unit = 1; } MeterSig *vrvmetersig = getMeterSig(element); - vrvmetersig->SetForm(METERFORM_invis); + vrvmetersig->SetVisible(BOOLEAN_false); vrvmetersig->SetCount({ { count }, MeterCountSign::None }); vrvmetersig->SetUnit(unit); } From 7b26a30804994f0556b3d7f4850e295625ea852c Mon Sep 17 00:00:00 2001 From: Laurent Pugin Date: Thu, 1 Jun 2023 16:39:32 +0200 Subject: [PATCH 105/151] Make TextDrawingParams local to each staff rendering block * Fixes #3429 * Test suite evaluated locally --- src/view_control.cpp | 36 +++++++++++++----------------------- 1 file changed, 13 insertions(+), 23 deletions(-) diff --git a/src/view_control.cpp b/src/view_control.cpp index f53115feb7..45b4a5a506 100644 --- a/src/view_control.cpp +++ b/src/view_control.cpp @@ -1587,13 +1587,8 @@ void View::DrawDirOrOrnam(DeviceContext *dc, ControlElement *element, Measure *m dirTxt.SetStyle(FONTSTYLE_italic); } - TextDrawingParams params; - const int lineCount = interfaceTextDir->GetNumberOfLines(element); - // If we have not timestamp - params.m_x = start->GetDrawingX() + start->GetDrawingRadius(m_doc); - data_HORIZONTALALIGNMENT alignment = element->GetChildRendAlignment(); // dir are left aligned by default (with both @tstamp and @startid) if (alignment == HORIZONTALALIGNMENT_NONE) alignment = HORIZONTALALIGNMENT_left; @@ -1605,7 +1600,9 @@ void View::DrawDirOrOrnam(DeviceContext *dc, ControlElement *element, Measure *m } const int staffSize = staff->m_drawingStaffSize; - params.m_enclosedRend.clear(); + TextDrawingParams params; + // If we have not timestamp + params.m_x = start->GetDrawingX() + start->GetDrawingRadius(m_doc); params.m_y = element->GetDrawingY(); params.m_pointSize = m_doc->GetDrawingLyricFont(staffSize)->GetPointSize(); @@ -1665,13 +1662,8 @@ void View::DrawDynam(DeviceContext *dc, Dynam *dynam, Measure *measure, System * dynamTxt.SetStyle(FONTSTYLE_italic); } - TextDrawingParams params; - const int lineCount = dynam->GetNumberOfLines(dynam); - // If we have not timestamp - params.m_x = dynam->GetStart()->GetDrawingX() + dynam->GetStart()->GetDrawingRadius(m_doc); - data_HORIZONTALALIGNMENT alignment = dynam->GetChildRendAlignment(); // dynam are left aligned by default; if (alignment == 0) { @@ -1686,9 +1678,12 @@ void View::DrawDynam(DeviceContext *dc, Dynam *dynam, Measure *measure, System * } const int staffSize = staff->m_drawingStaffSize; - params.m_enclosedRend.clear(); + TextDrawingParams params; + // If we have not timestamp + params.m_x = dynam->GetStart()->GetDrawingX() + dynam->GetStart()->GetDrawingRadius(m_doc); params.m_y = dynam->GetDrawingY(); params.m_pointSize = m_doc->GetDrawingLyricFont(staffSize)->GetPointSize(); + if (dynam->HasEnclose()) { params.m_textEnclose = dynam->GetEnclose(); } @@ -1924,8 +1919,6 @@ void View::DrawFing(DeviceContext *dc, Fing *fing, Measure *measure, System *sys fingTxt.SetFaceName("Times"); } - TextDrawingParams params; - params.m_x = fing->GetStart()->GetDrawingX() + fing->GetStart()->GetDrawingRadius(m_doc); // center fingering data_HORIZONTALALIGNMENT alignment = HORIZONTALALIGNMENT_center; @@ -1936,7 +1929,8 @@ void View::DrawFing(DeviceContext *dc, Fing *fing, Measure *measure, System *sys } const int staffSize = staff->m_drawingStaffSize; - params.m_enclosedRend.clear(); + TextDrawingParams params; + params.m_x = fing->GetStart()->GetDrawingX() + fing->GetStart()->GetDrawingRadius(m_doc); params.m_y = fing->GetDrawingY(); params.m_pointSize = m_doc->GetFingeringFont(staffSize)->GetPointSize(); @@ -2116,11 +2110,6 @@ void View::DrawHarm(DeviceContext *dc, Harm *harm, Measure *measure, System *sys harmTxt.SetFaceName("Times"); } - TextDrawingParams params; - - // If we have not timestamp - params.m_x = harm->GetStart()->GetDrawingX() + harm->GetStart()->GetDrawingRadius(m_doc); - data_HORIZONTALALIGNMENT alignment = harm->GetChildRendAlignment(); // harm are centered aligned by default; if (alignment == 0) { @@ -2135,7 +2124,9 @@ void View::DrawHarm(DeviceContext *dc, Harm *harm, Measure *measure, System *sys } const int staffSize = staff->m_drawingStaffSize; - params.m_enclosedRend.clear(); + TextDrawingParams params; + // If we have not timestamp + params.m_x = harm->GetStart()->GetDrawingX() + harm->GetStart()->GetDrawingRadius(m_doc); params.m_y = harm->GetDrawingY(); if (harm->GetFirst() && harm->GetFirst()->Is(FB)) { @@ -2478,7 +2469,6 @@ void View::DrawTempo(DeviceContext *dc, Tempo *tempo, Measure *measure, System * int lineCount = tempo->GetNumberOfLines(tempo); - TextDrawingParams params; data_HORIZONTALALIGNMENT alignment = tempo->GetChildRendAlignment(); // Tempo are left aligned by default; if (alignment == 0) alignment = HORIZONTALALIGNMENT_left; @@ -2490,8 +2480,8 @@ void View::DrawTempo(DeviceContext *dc, Tempo *tempo, Measure *measure, System * } const int staffSize = staff->m_drawingStaffSize; + TextDrawingParams params; params.m_x = tempo->GetDrawingXRelativeToStaff(staff->GetN()); - params.m_enclosedRend.clear(); params.m_y = tempo->GetDrawingY(); params.m_pointSize = m_doc->GetDrawingLyricFont(staffSize)->GetPointSize(); From 41138dfaaa238cd91ce9098b5bdfca85a2a47283 Mon Sep 17 00:00:00 2001 From: Laurent Pugin Date: Thu, 1 Jun 2023 17:55:34 +0200 Subject: [PATCH 106/151] Use harm@n for ordering groups when n is a digit string * Fixes #3185 * Test suite evaluated locally --- include/vrv/vrv.h | 5 +++++ src/preparedatafunctor.cpp | 8 +++++++- src/vrv.cpp | 6 ++++++ 3 files changed, 18 insertions(+), 1 deletion(-) diff --git a/include/vrv/vrv.h b/include/vrv/vrv.h index beee9bd9a3..866458b9e7 100644 --- a/include/vrv/vrv.h +++ b/include/vrv/vrv.h @@ -66,6 +66,11 @@ bool IsValidInteger(const std::string &value); */ bool IsValidDouble(const std::string &value); +/** + * Utility to check if the string contains only digits (positive integer without sign) + */ +bool IsDigits(const std::string &value); + /** * Extract the ID from any URI */ diff --git a/src/preparedatafunctor.cpp b/src/preparedatafunctor.cpp index f4b7031ae8..bc2f920b99 100644 --- a/src/preparedatafunctor.cpp +++ b/src/preparedatafunctor.cpp @@ -1547,7 +1547,13 @@ FunctorCode PrepareFloatingGrpsFunctor::VisitHarm(Harm *harm) } // first harm@n, create a new group - harm->SetDrawingGrpObject(harm); + // If @n is a digit string, use it as group id - otherwise order them as they appear + if (IsDigits(n)) { + harm->SetDrawingGrpId((int)std::strtol(n.c_str(), NULL, 10)); + } + else { + harm->SetDrawingGrpObject(harm); + } m_harms.insert({ n, harm }); return FUNCTOR_CONTINUE; diff --git a/src/vrv.cpp b/src/vrv.cpp index 0a07d1949c..8e4353b086 100644 --- a/src/vrv.cpp +++ b/src/vrv.cpp @@ -247,6 +247,12 @@ bool IsValidDouble(const std::string &value) return std::regex_match(value, re); } +bool IsDigits(const std::string &value) +{ + std::regex re(R"(^\d+$)"); + return std::regex_match(value, re); +} + std::string ExtractIDFragment(std::string refID) { size_t pos = refID.find_last_of("#"); From 2bd23f938c86d05ee12b97eefa084823cbcfcaa1 Mon Sep 17 00:00:00 2001 From: Laurent Pugin Date: Fri, 2 Jun 2023 10:01:09 +0200 Subject: [PATCH 107/151] Add support for French style key signature cancellation (WIP) --- include/vrv/view.h | 2 ++ src/view_element.cpp | 51 ++++++++++++++++++++++++++++---------------- 2 files changed, 35 insertions(+), 18 deletions(-) diff --git a/include/vrv/view.h b/include/vrv/view.h index 4e3756a9a9..3c2c9a5796 100644 --- a/include/vrv/view.h +++ b/include/vrv/view.h @@ -350,6 +350,8 @@ class View { void DrawChordCluster(DeviceContext *dc, Chord *chord, Layer *layer, Staff *staff, Measure *measure); void DrawClefEnclosing(DeviceContext *dc, Clef *clef, Staff *staff, char32_t glyph, int x, int y); void DrawDotsPart(DeviceContext *dc, int x, int y, unsigned char dots, const Staff *staff, bool dimin = false); + void DrawKeySigCancellation( + DeviceContext *dc, KeySig *keySig, Staff *staff, Clef *clef, int clefLocOffset, int beginCancel, int &x); void DrawKeyAccid(DeviceContext *dc, KeyAccid *keyAccid, Staff *staff, Clef *clef, int clefLocOffset, int &x); void DrawMeterSig(DeviceContext *dc, MeterSig *meterSig, Staff *staff, int horizOffset); /** Returns the width of the drawn figures */ diff --git a/src/view_element.cpp b/src/view_element.cpp index 3977b820f5..5f28647a93 100644 --- a/src/view_element.cpp +++ b/src/view_element.cpp @@ -992,33 +992,22 @@ void View::DrawKeySig(DeviceContext *dc, LayerElement *element, Layer *layer, St dc->StartGraphic(element, "", element->GetID()); + bool showCancelAfter = false; + // Show cancellation if showchange is true (false by default) or if C major if ((keySig->GetScoreDefRole() != SCOREDEF_SYSTEM) && ((keySig->GetSigShowchange() == BOOLEAN_true) || (keySig->GetAccidCount() == 0))) { if (keySig->m_skipCancellation) { LogWarning("Cautionary accidentals are skipped if the new or previous KeySig contains KeyAccid children."); } + // For French style (after) test to add + else if (keySig->GetAccidType() == keySig->m_drawingCancelAccidType) { + showCancelAfter = true; + } else { const int beginCancel = (keySig->GetAccidType() == keySig->m_drawingCancelAccidType) ? keySig->GetAccidCount() : 0; - for (int i = beginCancel; i < keySig->m_drawingCancelAccidCount; ++i) { - data_PITCHNAME pitch = KeySig::GetAccidPnameAt(keySig->m_drawingCancelAccidType, i); - const int loc = PitchInterface::CalcLoc( - pitch, KeySig::GetOctave(keySig->m_drawingCancelAccidType, pitch, clef), clefLocOffset); - y = staff->GetDrawingY() + staff->CalcPitchPosYRel(m_doc, loc); - - dc->StartCustomGraphic("keyAccid"); - - this->DrawSmuflCode(dc, x, y, SMUFL_E261_accidentalNatural, staff->m_drawingStaffSize, false); - - dc->EndCustomGraphic(); - - x += naturalGlyphWidth + naturalStep; - if ((keySig->GetAccidCount() > 0) && (i + 1 == keySig->m_drawingCancelAccidCount)) { - // Add some extra space after last natural - x += step; - } - } + this->DrawKeySigCancellation(dc, keySig, staff, clef, clefLocOffset, beginCancel, x); } } @@ -1032,6 +1021,10 @@ void View::DrawKeySig(DeviceContext *dc, LayerElement *element, Layer *layer, St x += step; } + if (showCancelAfter) { + this->DrawKeySigCancellation(dc, keySig, staff, clef, clefLocOffset, keySig->GetAccidCount(), x); + } + dc->ResetFont(); dc->EndGraphic(element, this); @@ -1059,6 +1052,28 @@ void View::DrawMeterSig(DeviceContext *dc, LayerElement *element, Layer *layer, this->DrawMeterSig(dc, meterSig, staff, 0); } +void View::DrawKeySigCancellation( + DeviceContext *dc, KeySig *keySig, Staff *staff, Clef *clef, int clefLocOffset, int beginCancel, int &x) +{ + const int naturalGlyphWidth = m_doc->GetGlyphWidth(SMUFL_E261_accidentalNatural, staff->m_drawingStaffSize, false); + const int naturalStep = m_doc->GetDrawingUnit(staff->m_drawingStaffSize) * TEMP_KEYSIG_NATURAL_STEP; + + for (int i = beginCancel; i < keySig->m_drawingCancelAccidCount; ++i) { + data_PITCHNAME pitch = KeySig::GetAccidPnameAt(keySig->m_drawingCancelAccidType, i); + const int loc = PitchInterface::CalcLoc( + pitch, KeySig::GetOctave(keySig->m_drawingCancelAccidType, pitch, clef), clefLocOffset); + int y = staff->GetDrawingY() + staff->CalcPitchPosYRel(m_doc, loc); + + dc->StartCustomGraphic("keyAccid"); + + this->DrawSmuflCode(dc, x, y, SMUFL_E261_accidentalNatural, staff->m_drawingStaffSize, false); + + dc->EndCustomGraphic(); + + x += naturalGlyphWidth + naturalStep; + } +} + void View::DrawKeyAccid(DeviceContext *dc, KeyAccid *keyAccid, Staff *staff, Clef *clef, int clefLocOffset, int &x) { const std::u32string symbolStr = keyAccid->GetSymbolStr(staff->m_drawingNotationType); From f0cadacf05d53a302f0feb0ddf2307f19723ba65 Mon Sep 17 00:00:00 2001 From: Laurent Pugin Date: Fri, 2 Jun 2023 10:27:05 +0200 Subject: [PATCH 108/151] Remove unused variables --- src/view_element.cpp | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/view_element.cpp b/src/view_element.cpp index 5f28647a93..700c95d183 100644 --- a/src/view_element.cpp +++ b/src/view_element.cpp @@ -983,10 +983,7 @@ void View::DrawKeySig(DeviceContext *dc, LayerElement *element, Layer *layer, St x = element->GetDrawingX(); // HARDCODED - int naturalGlyphWidth = m_doc->GetGlyphWidth(SMUFL_E261_accidentalNatural, staff->m_drawingStaffSize, false); - int step = m_doc->GetDrawingUnit(staff->m_drawingStaffSize); - int naturalStep = step * TEMP_KEYSIG_NATURAL_STEP; - step *= TEMP_KEYSIG_STEP; + const int step = m_doc->GetDrawingUnit(staff->m_drawingStaffSize) * TEMP_KEYSIG_STEP; int clefLocOffset = layer->GetClefLocOffset(element); From 50b70de8de78eb6506557f19a773c23675443a8e Mon Sep 17 00:00:00 2001 From: Klaus Rettinghaus Date: Fri, 2 Jun 2023 10:53:32 +0200 Subject: [PATCH 109/151] update Leipzig --- fonts/Leipzig/Leipzig.svg | 245 ++++++++++++---- fonts/Leipzig/Leipzig.ttf | Bin 117020 -> 125424 bytes fonts/Leipzig/Leipzig.woff2 | Bin 40392 -> 172349 bytes fonts/Leipzig/leipzig_metadata.json | 426 ++++++++++++++++++++++++++-- 4 files changed, 585 insertions(+), 86 deletions(-) diff --git a/fonts/Leipzig/Leipzig.svg b/fonts/Leipzig/Leipzig.svg index 2b063296ee..a37bee4b74 100644 --- a/fonts/Leipzig/Leipzig.svg +++ b/fonts/Leipzig/Leipzig.svg @@ -2,11 +2,11 @@ -Created by FontForge 20230101 at Mon Mar 27 16:18:32 2023 +Created by FontForge 20201107 at Tue May 30 11:42:31 2023 By Klaus Rettinghaus Created by Etienne Darbellay, Jean-Francois Marti, Laurent Pugin, and Klaus Rettinghaus. This font is licensed under the SIL Open Font License \(http://scripts.sil.org/OFL\). -Version 5.2.83 +Version 5.2.84 @@ -55,7 +55,7 @@ c-57 0 -166 26 -166 132c0 47 30 86 89 116c-33 15 -79 60 -79 119c0 79 85 132 178 d="M139 107c0 -51 22 -104 66 -104c38 0 64 48 64 110c0 50 -31 100 -64 100c-40 0 -66 -56 -66 -106zM114 -74c40 0 72 -27 72 -65c0 -8 -3 -19 -9 -34l-7 -16l-5 -15c2 -8 12 -12 31 -12c56 0 84 73 84 219c-32 -24 -71 -36 -119 -36c-29 0 -56 6 -79 20 c-51 26 -57 78 -62 108c0 64 56 155 188 155c158 0 197 -151 197 -237c0 -145 -92 -263 -207 -263c-109 0 -155 68 -155 101c0 46 33 75 71 75z" /> @@ -300,7 +300,7 @@ c-23 -21 -45 -41 -68 -61c6 -11 13 -21 21 -31c17 -21 33 -31 50 -31c12 0 25 5 39 1 c42 -57 63 -118 63 -184zM379 227c-10 0 -20 -1 -31 -2s-18 -6 -22 -15s-7 -17 -8 -25s-2 -17 -2 -26v-20c28 0 46 9 55 28c5 11 8 31 8 60zM513 54c6 -13 16 -19 30 -19c16 0 30 8 43 24s19 39 20 70c0 25 -3 52 -10 80s-15 42 -25 43c-21 -9 -38 -26 -50 -52 s-18 -55 -18 -87c0 -23 3 -43 10 -59zM671 50c7 0 12 -3 17 -8s7 -11 7 -18s-3 -12 -8 -17s-12 -7 -19 -7s-12 3 -17 8s-7 12 -7 19c0 15 9 23 27 23z" /> - - - + + + @@ -2084,13 +2083,12 @@ v103.331l-26.6055 -8.66211v56.9248l26.6055 8.04395v104.568h10.5195v-100.856zM50 - - + + @@ -2103,50 +2101,44 @@ d="M203 126c29 0 53 -9 70 -24l4 -4l3 570h22l-2 -625c0 -85 -111 -169 -201 -169c-5 d="M290 672c7 0 14 -1 17 -15c16 -73 51 -137 94 -197c54 -76 96 -166 99 -262v-7c0 -49 -18 -117 -21 -125c-6 -11 -11 -14 -16 -14h-5c-6 3 -12 10 -12 20c0 4 0 7 2 11c15 35 20 72 20 107c0 46 -10 89 -20 116c-39 109 -105 135 -145 143l-3 1v-405 c0 -85 -111 -167 -201 -167c-55 0 -97 31 -97 82c0 86 89 168 201 168c29 0 53 -8 70 -23l5 -4v565c0 5 0 6 1 6h5h6z" /> +d="M510 328c0 -58 -24 -115 -24 -116c0 -3 2 -6 2 -8v-1c16 -32 26 -65 26 -102v-18c0 -42 -5 -93 -7 -95c-6 -11 -10 -14 -15 -14c-2 0 -16 5 -16 21c0 18 8 46 8 84c0 46 -9 88 -30 129c-51 105 -105 124 -156 127v-290c0 -85 -110 -167 -199 -167c-55 0 -97 31 -97 82 +c0 86 89 168 201 168c41 0 60 -15 75 -27v571h11c6 0 14 0 16 -7c14 -93 63 -109 109 -158c61 -65 96 -102 96 -179zM461 272c12 0 12 0 19 29c1 6 2 12 2 18c0 29 -9 55 -24 78c-28 42 -75 91 -129 91h-8c-7 0 -15 -5 -15 -10l2 -4c18 -71 59 -94 98 -139 +c17 -20 33 -36 47 -58c2 -4 5 -5 8 -5z" /> +d="M506 297c0 -49 -20 -106 -20 -107c-1 -2 -2 -4 -2 -6v-2c0 -5 2 -12 7 -12c10 0 17 69 19 89v-210c0 -39 -5 -81 -6 -85c-7 -10 -12 -14 -16 -14c-2 0 -3 1 -5 1c-5 3 -9 11 -9 21v6c4 26 6 52 6 77c0 44 -7 86 -28 126c-51 103 -104 120 -154 123v-259 +c0 -85 -110 -167 -199 -167c-55 0 -97 31 -97 82c0 86 89 168 201 168c41 0 60 -15 75 -27v709c1 2 4 10 7 10c5 0 16 -9 17 -16c16 -92 63 -107 109 -157c62 -66 83 -90 93 -143v-26c0 -35 -9 -73 -18 -97c8 -15 20 -38 20 -84zM478 293c0 71 -79 163 -157 163 +c-6 0 -15 -10 -15 -13c18 -71 61 -93 99 -138c3 -3 3 -3 45 -57c2 -4 7 -6 9 -6c11 0 14 12 16 19c0 3 1 7 1 11c1 7 2 13 2 21zM480 478c0 13 -4 27 -14 45c-50 85 -105 107 -156 107h-3l1 -2c15 -89 60 -106 103 -154c18 -20 39 -42 54 -61c4 15 10 31 13 45 +c0 7 2 13 2 20z" /> +d="M484 183c0 -7 22 -44 26 -108v-26c0 -38 -4 -78 -6 -85c-7 -9 -12 -12 -16 -12c-10 0 -14 9 -14 20v7c4 26 6 52 6 77c0 43 -7 85 -28 126c-51 103 -104 120 -154 123v-260c0 -85 -110 -167 -199 -167c-55 0 -97 31 -97 82c0 86 89 168 201 168c41 0 60 -15 75 -27v890 +c1 2 4 9 7 9c5 0 16 -8 17 -14c16 -92 63 -108 109 -157c80 -87 93 -105 93 -169c0 -38 -11 -78 -19 -101c19 -34 19 -48 19 -80c0 -35 -9 -73 -18 -97c8 -15 20 -38 20 -84c0 -49 -20 -106 -20 -107c0 -2 -2 -5 -2 -6v-2zM321 458c-4 -1 -15 -12 -15 -14 +c18 -71 60 -94 99 -138c29 -29 41 -62 54 -62c5 0 11 4 13 7c0 0 6 25 6 44c0 69 -80 163 -157 163zM480 479c0 30 -59 153 -170 153h-3l1 -3c15 -90 59 -105 103 -154c19 -20 40 -42 54 -60c4 15 10 30 13 44c0 7 2 13 2 20zM480 659c0 13 -4 27 -14 45 +c-50 84 -104 108 -156 108v-6l-2 1v-2c15 -92 58 -109 103 -157c18 -20 38 -39 53 -58l14 50c0 6 2 12 2 19z" /> +d="M484 183c0 -7 22 -44 26 -108v-26c0 -38 -4 -78 -6 -85c-7 -9 -12 -12 -16 -12c-10 0 -14 9 -14 20v7c4 26 6 52 6 77c0 43 -7 85 -28 126c-51 102 -102 120 -152 123v-260c0 -85 -111 -167 -201 -167c-55 0 -97 31 -97 82c0 86 89 168 201 168c41 0 59 -14 75 -27v1059 +c1 2 4 10 7 10c5 0 16 -9 17 -16c16 -92 63 -107 109 -157c84 -90 93 -108 93 -170c0 -34 -9 -69 -17 -92c17 -34 17 -42 17 -75c0 -38 -11 -78 -19 -101c19 -34 19 -48 19 -80c0 -35 -9 -73 -18 -97c8 -15 20 -38 20 -84c0 -49 -20 -106 -20 -107c0 -2 -2 -5 -2 -6v-2z +M321 458c-4 -1 -15 -12 -15 -14c18 -71 60 -94 99 -138c29 -29 41 -62 54 -62c5 0 11 4 13 7c0 0 6 25 6 44c0 69 -80 163 -157 163zM480 479c0 30 -59 153 -170 153h-3l1 -3c15 -90 59 -105 103 -154c19 -20 40 -42 54 -60c4 15 10 30 13 44c0 7 2 13 2 20zM480 659 +c0 13 -4 27 -14 45c-50 84 -104 108 -157 108v-6l-2 1s1 -1 1 -2c15 -92 58 -109 103 -157c18 -20 38 -39 53 -58l14 50c0 6 2 12 2 19zM480 828c0 34 -60 152 -171 152h-3l1 -2c16 -85 61 -101 104 -149c20 -22 41 -44 55 -63c4 13 9 31 12 43c0 7 2 12 2 19z" /> +d="M495 699c13 -26 17 -41 17 -73c0 -34 -9 -72 -17 -96c16 -32 17 -51 17 -74c0 -34 -8 -68 -16 -93c12 -44 12 -44 12 -68c0 -51 -17 -94 -22 -109v-14c15 -33 24 -67 26 -101v-26c0 -1 -1 -81 -7 -87c-4 -11 -9 -14 -15 -14c0 0 -16 0 -16 20l-1 1c0 1 9 50 9 84 +c0 44 -10 87 -28 127c-51 106 -104 124 -154 127v-258c0 -85 -111 -167 -201 -167c-55 0 -97 31 -97 82c0 86 89 168 201 168c41 0 59 -14 75 -27v1211c0 3 10 6 11 6h3c5 0 8 -1 8 -14c16 -90 66 -116 114 -166l16 -17c55 -59 82 -89 82 -153c0 -37 -9 -73 -17 -98 +c15 -29 17 -45 17 -73c0 -34 -9 -73 -17 -98zM480 290c0 68 -81 166 -154 166h-5c-9 0 -13 -7 -13 -14c12 -52 37 -78 66 -107c39 -39 55 -57 76 -91c2 -3 6 -6 10 -6c19 0 20 51 20 52zM469 410c3 10 11 35 11 49c0 13 -3 27 -13 45c-50 85 -107 108 -160 109l1 -4 +c22 -89 69 -77 161 -199zM467 570c13 52 13 52 13 60c0 11 -3 26 -13 44c-50 86 -106 108 -157 108h-3l1 -3c18 -78 64 -103 106 -150zM467 740c13 52 13 52 13 60c0 13 -3 25 -13 42c-50 88 -106 110 -157 110h-3l1 -4c18 -78 64 -102 106 -149zM310 1122h-3l1 -3 +c18 -78 64 -103 106 -150l53 -58c13 52 13 52 13 59c0 11 -3 26 -13 43c-50 88 -106 109 -157 109z" /> +d="M488 172v-8c15 -34 24 -67 26 -101v-26c0 -40 -5 -84 -7 -87c-6 -11 -11 -14 -15 -14s-16 0 -16 20c0 18 8 46 8 85c0 44 -9 86 -30 127c-51 106 -104 123 -154 126v-249c0 -85 -111 -167 -201 -167c-55 0 -97 31 -97 82c0 86 89 168 201 168c41 0 59 -14 75 -27v1372 +c0 3 9 6 11 6h4c5 0 8 -1 9 -13c16 -90 66 -114 112 -165l15 -16c53 -56 85 -90 85 -153c0 -37 -10 -75 -18 -101c10 -19 18 -41 18 -70c0 -35 -10 -74 -18 -99c10 -20 18 -43 18 -72c0 -35 -10 -73 -18 -99c10 -20 18 -40 18 -69c0 -37 -10 -75 -18 -100 +c10 -20 18 -42 18 -71c0 -33 -10 -70 -17 -96c6 -19 13 -44 13 -69c0 -56 -23 -112 -23 -112c0 -1 1 -2 1 -2zM482 281c0 77 -88 167 -155 167h-5c-9 0 -14 -8 -14 -15c20 -91 95 -114 145 -197c2 -3 5 -4 8 -4c5 0 11 2 13 7s8 36 8 42zM472 402c3 16 10 32 10 50 +c0 34 -61 150 -174 152c13 -50 25 -65 68 -102c6 -5 43 -37 96 -100zM467 563c4 18 15 34 15 59c0 12 -3 25 -14 43c-50 86 -107 109 -157 109h-3l1 -3c18 -78 63 -103 105 -151c22 -25 38 -40 53 -57zM467 732c14 41 15 49 15 59c0 12 -3 25 -14 43 +c-50 86 -107 110 -157 110h-3l1 -3c18 -78 64 -103 105 -151c23 -24 38 -40 53 -58zM482 962c0 33 -62 152 -171 152h-3l1 -3c18 -78 64 -102 105 -150c23 -25 38 -42 53 -59c8 24 15 45 15 60zM482 1132c0 29 -62 152 -171 152h-3l1 -4c18 -78 64 -101 105 -149 +c23 -24 38 -41 53 -59c15 49 15 49 15 60z" /> +d="M510 290c0 -59 -24 -111 -24 -112v-2c0 -3 2 -5 2 -7v-1c15 -33 23 -67 25 -101c0 -8 1 -18 1 -27c0 -40 -6 -83 -8 -86c-6 -11 -10 -14 -15 -14s-17 2 -17 19v1c0 1 8 45 8 85c0 44 -9 87 -28 127c-52 106 -105 123 -154 126v-241c0 -85 -111 -169 -201 -169 +c-55 0 -97 32 -97 83c0 87 89 169 201 169c28 0 53 -8 70 -23l5 -3v1534c0 3 9 7 11 7h3c6 0 9 -1 10 -14c16 -91 66 -115 112 -166c6 -7 13 -13 19 -20c60 -66 79 -88 79 -150c0 -35 -9 -74 -17 -100c17 -29 17 -47 17 -70c0 -35 -9 -74 -17 -99c17 -29 17 -46 17 -71 +c0 -35 -9 -75 -17 -100c17 -29 17 -47 17 -70c0 -37 -9 -74 -17 -100c17 -29 17 -47 17 -70c0 -35 -9 -74 -17 -99c17 -30 17 -48 17 -72c0 -33 -8 -70 -16 -96c3 -11 9 -22 10 -36c2 -10 4 -22 4 -32zM480 286c0 72 -84 166 -154 166h-5c-5 0 -13 -6 -13 -15 +c19 -88 82 -101 143 -198c2 -3 7 -5 10 -5c18 0 19 40 19 52zM471 406c4 18 11 38 11 49c0 14 -4 26 -14 44c-51 85 -108 108 -161 109l1 -4c17 -74 65 -90 106 -134c25 -27 41 -45 57 -64zM467 566c12 40 15 51 15 59c0 30 -58 153 -172 153h-3l1 -3 +c18 -78 64 -102 106 -150c19 -21 35 -40 53 -59zM467 735c0 1 15 51 15 60c0 35 -64 153 -172 153h-3l1 -4c18 -78 64 -102 106 -149zM482 966c0 31 -64 152 -172 152h-3l1 -4c18 -78 64 -101 106 -148c22 -24 35 -39 53 -60c9 29 15 49 15 60zM482 1136 +c0 27 -58 152 -172 152h-3l1 -3c18 -78 64 -102 106 -150l53 -59c11 34 15 53 15 60zM482 1305c0 30 -59 153 -172 153h-3l1 -4c18 -78 64 -102 106 -150c19 -22 36 -38 53 -58c14 45 15 54 15 59z" /> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/fonts/Leipzig/Leipzig.ttf b/fonts/Leipzig/Leipzig.ttf index 7143d8dc736f501472ed6608f25b7b4a8b586a04..5527ea96b9fe5ceacf842b6f3438827cc624d6ec 100644 GIT binary patch delta 18719 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�dS`76!K$jKXMDw>dM_`0^b;*~{p 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

2qU+Ph^*nX^mYhu%L!ZAi&aMgJ<;!(p}3v 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

9pZy9LK1% z-$nQ7@iV8+%plDP+oRK;U4-Fcm75=IC_2~>M@0|lo{;t=xX_$4#5n#UI?ue3bCX>H z6)_{yf(IH&_vN!nLS~AIy(}h#-K5|qzlz#C#J+rRcDlYh1QWmB@sR)y-+l6iqAe0` zS*U2nuQUD;93=#>Q)K*@J_`nrDd~Mwj3Z=LHw52SAQ$@`zwh=*;8snc14B_T2%l4J z*3i0Z<~*sIifWGgSWMx;*|cZ5cyk?%T7ML{*UOS64W}Kr_L$Z!%3{4=^QPYUy|wyd%{Zynx_+V4Pgh-ua=XJ zfOIH~Y|%taN`hR;y!i2hgfPuI-A`gI%GGm}2`o)RE=`j8Jgp-~$l>(5WK`jbCH$sT zg>p`b1X_w3|$h9D@Dn)oZf$T@)fgmPhMP{qQwq}Z-AIE z6Z?Oip)ka0jy~btP$L$(rhaFrT%iXilo7$@*wVhI^Wl%RrHn1PE0cj7EtcH1|EXRr znm?D$_Ld%M|1?$06TPiMmB>I73z6Zv6?c?dLv_uKb*&!vza8!9Zj<=%S<*cpq*;y! zQ9;Nh30Sb^#UfoPX6*lxQ!mTB(|U`LV!J{$kD`~RqP zt2x5?-#F`k#b;Pz-z@**Kl_lnrH8`*@M!!arcdqjUoGZfBda|xN#|`Lx2@1#2mQaw z%R5QjK>6e~&3`*S&9%n<>p=%O(SJQGSfqVMyd3#2iRzR`U623aQ$5cIOvbjQ|LQ0} z11?9NrEb1xPVmo~VgCn{%jo}2&-^6~PdWZq-Nn2c(m&)KlK($y{|E7B@!YOfUGnt) zT1su0>=Hw)<{6Gw=l{sP38Ygi S)4>lXzS{M-vKjyY;Qs)z<_E6; diff --git a/fonts/Leipzig/leipzig_metadata.json b/fonts/Leipzig/leipzig_metadata.json index c37282bfd9..e98549f530 100644 --- a/fonts/Leipzig/leipzig_metadata.json +++ b/fonts/Leipzig/leipzig_metadata.json @@ -30,7 +30,7 @@ "tupletBracketThickness": 0.16 }, "fontName": "Leipzig", - "fontVersion": "5.2.83", + "fontVersion": "5.2.84", "glyphBBoxes": { "4stringTabClef": { "bBoxNE": [ @@ -2712,6 +2712,26 @@ -4.332 ] }, + "keyboardPedalHalf2": { + "bBoxNE": [ + 1.724, + 0.836 + ], + "bBoxSW": [ + 0.0, + 0.0 + ] + }, + "keyboardPedalHalf3": { + "bBoxNE": [ + 1.724, + 1.672 + ], + "bBoxSW": [ + 0.0, + 0.836 + ] + }, "keyboardPedalP": { "bBoxNE": [ 1.28, @@ -2755,11 +2775,11 @@ "keyboardPedalUp": { "bBoxNE": [ 1.724, - 1.672 + 1.668 ], "bBoxSW": [ 0.0, - 0.0 + -0.004 ] }, "leftRepeatSmall": { @@ -3032,6 +3052,366 @@ 0.0 ] }, + "luteGermanALower": { + "bBoxNE": [ + 1.052, + 1.252 + ], + "bBoxSW": [ + 0.0, + -0.008 + ] + }, + "luteGermanAUpper": { + "bBoxNE": [ + 1.944, + 2.356 + ], + "bBoxSW": [ + -0.0, + 0.0 + ] + }, + "luteGermanBLower": { + "bBoxNE": [ + 1.08, + 2.236 + ], + "bBoxSW": [ + -0.004, + -0.012 + ] + }, + "luteGermanBUpper": { + "bBoxNE": [ + 2.396, + 2.36 + ], + "bBoxSW": [ + -0.0, + -0.008 + ] + }, + "luteGermanCLower": { + "bBoxNE": [ + 0.744, + 1.184 + ], + "bBoxSW": [ + 0.0, + 0.04 + ] + }, + "luteGermanCUpper": { + "bBoxNE": [ + 1.812, + 2.352 + ], + "bBoxSW": [ + -0.016, + -0.004 + ] + }, + "luteGermanDLower": { + "bBoxNE": [ + 1.272, + 2.372 + ], + "bBoxSW": [ + 0.0, + 0.024 + ] + }, + "luteGermanDUpper": { + "bBoxNE": [ + 2.304, + 2.44 + ], + "bBoxSW": [ + -0.04, + -0.004 + ] + }, + "luteGermanELower": { + "bBoxNE": [ + 0.736, + 1.252 + ], + "bBoxSW": [ + -0.004, + -0.012 + ] + }, + "luteGermanEUpper": { + "bBoxNE": [ + 1.796, + 2.36 + ], + "bBoxSW": [ + 0.0, + 0.0 + ] + }, + "luteGermanFLower": { + "bBoxNE": [ + 0.96, + 2.24 + ], + "bBoxSW": [ + 0.0, + -1.148 + ] + }, + "luteGermanFUpper": { + "bBoxNE": [ + 1.872, + 2.456 + ], + "bBoxSW": [ + -0.008, + -0.44 + ] + }, + "luteGermanGLower": { + "bBoxNE": [ + 1.416, + 1.252 + ], + "bBoxSW": [ + 0.0, + -1.124 + ] + }, + "luteGermanGUpper": { + "bBoxNE": [ + 2.12, + 2.344 + ], + "bBoxSW": [ + -0.004, + -0.0 + ] + }, + "luteGermanHLower": { + "bBoxNE": [ + 1.184, + 2.376 + ], + "bBoxSW": [ + 0.0, + -0.384 + ] + }, + "luteGermanHUpper": { + "bBoxNE": [ + 2.012, + 2.328 + ], + "bBoxSW": [ + 0.0, + -0.468 + ] + }, + "luteGermanILower": { + "bBoxNE": [ + 0.568, + 1.808 + ], + "bBoxSW": [ + 0.0, + 0.016 + ] + }, + "luteGermanIUpper": { + "bBoxNE": [ + 1.592, + 2.336 + ], + "bBoxSW": [ + -0.004, + -0.012 + ] + }, + "luteGermanKLower": { + "bBoxNE": [ + 1.08, + 2.276 + ], + "bBoxSW": [ + -0.004, + -0.092 + ] + }, + "luteGermanKUpper": { + "bBoxNE": [ + 2.068, + 2.344 + ], + "bBoxSW": [ + 0.0, + -0.016 + ] + }, + "luteGermanLLower": { + "bBoxNE": [ + 1.18, + 2.276 + ], + "bBoxSW": [ + -0.024, + -0.092 + ] + }, + "luteGermanLUpper": { + "bBoxNE": [ + 1.584, + 2.364 + ], + "bBoxSW": [ + 0.0, + -0.004 + ] + }, + "luteGermanMLower": { + "bBoxNE": [ + 1.832, + 1.204 + ], + "bBoxSW": [ + 0.0, + -0.004 + ] + }, + "luteGermanMUpper": { + "bBoxNE": [ + 2.944, + 2.372 + ], + "bBoxSW": [ + -0.0, + 0.0 + ] + }, + "luteGermanNLower": { + "bBoxNE": [ + 1.14, + 1.208 + ], + "bBoxSW": [ + -0.004, + -0.004 + ] + }, + "luteGermanNUpper": { + "bBoxNE": [ + 2.236, + 2.312 + ], + "bBoxSW": [ + -0.0, + -0.04 + ] + }, + "luteGermanOLower": { + "bBoxNE": [ + 0.984, + 1.264 + ], + "bBoxSW": [ + 0.0, + -0.024 + ] + }, + "luteGermanPLower": { + "bBoxNE": [ + 1.148, + 1.228 + ], + "bBoxSW": [ + -0.016, + -0.984 + ] + }, + "luteGermanQLower": { + "bBoxNE": [ + 1.016, + 1.276 + ], + "bBoxSW": [ + 0.0, + -0.984 + ] + }, + "luteGermanRLower": { + "bBoxNE": [ + 0.844, + 1.164 + ], + "bBoxSW": [ + 0.0, + 0.0 + ] + }, + "luteGermanSLower": { + "bBoxNE": [ + 1.132, + 1.288 + ], + "bBoxSW": [ + -0.016, + -0.004 + ] + }, + "luteGermanTLower": { + "bBoxNE": [ + 0.916, + 1.64 + ], + "bBoxSW": [ + 0.0, + -0.004 + ] + }, + "luteGermanVLower": { + "bBoxNE": [ + 1.276, + 1.164 + ], + "bBoxSW": [ + 0.0, + -0.196 + ] + }, + "luteGermanXLower": { + "bBoxNE": [ + 1.272, + 1.208 + ], + "bBoxSW": [ + 0.004, + -0.008 + ] + }, + "luteGermanYLower": { + "bBoxNE": [ + 1.064, + 1.112 + ], + "bBoxSW": [ + -0.016, + -0.692 + ] + }, + "luteGermanZLower": { + "bBoxNE": [ + 0.808, + 1.348 + ], + "bBoxSW": [ + -0.016, + -0.116 + ] + }, "luteItalianFret0": { "bBoxNE": [ 0.972, @@ -4254,22 +4634,22 @@ }, "metNoteDoubleWhole": { "bBoxNE": [ - 2.38, - 0.62 + 2.18, + 0.68 ], "bBoxSW": [ 0.0, - -0.608 + -0.68 ] }, "metNoteDoubleWholeSquare": { "bBoxNE": [ - 1.928, - 0.912 + 1.392, + 0.68 ], "bBoxSW": [ - 0.008, - -0.888 + 0.0, + -0.68 ] }, "metNoteHalfUp": { @@ -4384,22 +4764,22 @@ }, "noteDoubleWhole": { "bBoxNE": [ - 2.38, - 0.62 + 2.18, + 0.68 ], "bBoxSW": [ 0.0, - -0.608 + -0.68 ] }, "noteDoubleWholeSquare": { "bBoxNE": [ - 1.936, - 0.92 + 1.392, + 0.68 ], "bBoxSW": [ 0.0, - -0.896 + -0.68 ] }, "noteHalfUp": { @@ -4424,12 +4804,12 @@ }, "noteWhole": { "bBoxNE": [ - 1.668, - 0.492 + 1.62, + 0.532 ], "bBoxSW": [ 0.0, - -0.5 + -0.532 ] }, "noteheadBlack": { @@ -7252,14 +7632,6 @@ "cutOutSE": [ 1.568, -0.232 - ], - "stemDownNW": [ - 0.0, - 0.0 - ], - "stemUpSE": [ - 1.62, - 0.0 ] }, "noteheadWholeFilled": { From 4f86a556612e63f8960265d400ea921aafbc79a4 Mon Sep 17 00:00:00 2001 From: Klaus Rettinghaus Date: Fri, 2 Jun 2023 10:57:37 +0200 Subject: [PATCH 110/151] add German lute tab glyphs --- fonts/supported.xml | 1137 ++++++++++++++++++++++--------------------- 1 file changed, 586 insertions(+), 551 deletions(-) diff --git a/fonts/supported.xml b/fonts/supported.xml index fc38aee462..05fe1d61af 100644 --- a/fonts/supported.xml +++ b/fonts/supported.xml @@ -2,18 +2,18 @@ Standard Unicode Points (added by hand) - - - - + + + + Staff brackets and dividers - + - - + + @@ -72,15 +72,15 @@ - - - - - - - + + + + + + + - + U+E04F @@ -88,51 +88,51 @@ Clefs - - - - - - - + + + + + + + - - + + - - - - - + + + + + - - + + - - + + - - - - - + + + + + - - - + + + @@ -141,28 +141,28 @@ Time signatures - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + @@ -178,30 +178,30 @@ Noteheads - - - - - - + + + + + + - + - + - - - + + + @@ -235,12 +235,12 @@ - - - - - - + + + + + + @@ -263,12 +263,12 @@ - - + + - + U+E0FF @@ -277,9 +277,9 @@ Slash noteheads - - - + + + @@ -487,30 +487,30 @@ Individual notes - - - - + + + + - + - + - + - + - + - + - + - + - + - + U+E1EF U+E1D0 @@ -567,24 +567,24 @@ Tremolos - - - - - + + + + + - + - - - - + + + + @@ -593,22 +593,22 @@ Flags - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + U+E25F @@ -616,31 +616,31 @@ Standard accidentals (12-EDO) - - - - - - - - - - - - - - + + + + + + + + + + + + + + U+E26F U+E260 Gould arrow quartertone accidentals (24-EDO) - - - - - - + + + + + + @@ -653,10 +653,10 @@ Stein-Zimmermann accidentals (24-EDO) - - - - + + + + U+E28F @@ -1056,14 +1056,14 @@ Arel-Ezgi-Uzdilek (AEU) accidentals - - - - - - - - + + + + + + + + U+E44F U+E440 @@ -1124,161 +1124,172 @@ Articulation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + U+E4BF U+E4A0 Holds and pauses - - - - - - - - - - + + + + + + + + + + - + - - - - + + + + - - + U+E4DF U+E4C0 Rests - - - - - - - - - - - - - - + + + + + + + + + + + + + + - + - + U+E4FF U+E4E0 Bar repeats - - - - - - + + + + + + U+E50F U+E500 Octaves - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + U+E51F U+E510 Dynamics - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -1288,9 +1299,9 @@ Lyrics - - - + + + U+E55F @@ -1304,16 +1315,16 @@ - - - - - - - - - - + + + + + + + + + + U+E56F U+E560 @@ -1338,11 +1349,11 @@ - + - + U+E58F @@ -1363,8 +1374,8 @@ - - + + @@ -1380,32 +1391,56 @@ Precomposed trills and mordents - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + a - - - - - - - - - - + + + + + + + + + + U+E5CF U+E5B0 @@ -1432,9 +1467,9 @@ - - - + + + @@ -1475,11 +1510,11 @@ String techniques - - - - - + + + + + @@ -1503,15 +1538,15 @@ Plucked techniques - - - - + + + + - + @@ -1526,7 +1561,7 @@ - + @@ -1538,17 +1573,17 @@ Keyboard techniques - - + + - + - - + + @@ -1777,22 +1812,22 @@ Beaters pictograms - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + @@ -1874,8 +1909,8 @@ - - + + @@ -1892,9 +1927,9 @@ - - - + + + @@ -2044,17 +2079,17 @@ Tuplets - - - - - - - - - - - + + + + + + + + + + + U+E88F U+E880 @@ -2163,44 +2198,44 @@ Medieval and Renaissance clefs - - - - - - - - - - - + + + + + + + + + + + U+E90F U+E900 Medieval and Renaissance prolations - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + @@ -2224,27 +2259,27 @@ - - + + - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + U+E94F U+E930 @@ -2311,22 +2346,22 @@ Medieval and Renaissance plainchant single-note forms - - + + - + - + - - + + U+E9AF @@ -2338,15 +2373,15 @@ - - - - + + + + - - - - + + + + @@ -2376,10 +2411,10 @@ Medieval and Renaissance accidentals - - - - + + + + U+E9EF @@ -2387,15 +2422,15 @@ Medieval and Renaissance rests - - - - - - - - - + + + + + + + + + U+E9FF U+E9F0 @@ -2403,11 +2438,11 @@ Medieval and Renaissance miscellany - + - + @@ -2462,30 +2497,30 @@ Figured bass - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + @@ -2548,18 +2583,18 @@ - + - - + + - - - + + + @@ -2661,13 +2696,13 @@ - - - - - - - + + + + + + + @@ -2800,12 +2835,12 @@ - - - - - - + + + + + + @@ -2815,23 +2850,23 @@ French and English Renaissance lute tablature - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + @@ -2842,16 +2877,16 @@ Italian and Spanish Renaissance lute tablature - - - - - - - - - - + + + + + + + + + + @@ -2870,42 +2905,42 @@ German Renaissance lute tablature - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + U+EC2F U+EC00 From 8300a28871481e526abd55a44df1066da0ee41e5 Mon Sep 17 00:00:00 2001 From: Klaus Rettinghaus Date: Fri, 2 Jun 2023 11:09:29 +0200 Subject: [PATCH 111/151] regenerate fonts --- data/Bravura.css | 2 +- data/Bravura.xml | 36 +++++++++++++++++++++++++++++++ data/Bravura/EC00.xml | 1 + data/Bravura/EC01.xml | 1 + data/Bravura/EC02.xml | 1 + data/Bravura/EC03.xml | 1 + data/Bravura/EC04.xml | 1 + data/Bravura/EC05.xml | 1 + data/Bravura/EC06.xml | 1 + data/Bravura/EC07.xml | 1 + data/Bravura/EC08.xml | 1 + data/Bravura/EC09.xml | 1 + data/Bravura/EC0A.xml | 1 + data/Bravura/EC0B.xml | 1 + data/Bravura/EC0C.xml | 1 + data/Bravura/EC0D.xml | 1 + data/Bravura/EC0E.xml | 1 + data/Bravura/EC0F.xml | 1 + data/Bravura/EC10.xml | 1 + data/Bravura/EC11.xml | 1 + data/Bravura/EC12.xml | 1 + data/Bravura/EC13.xml | 1 + data/Bravura/EC14.xml | 1 + data/Bravura/EC15.xml | 1 + data/Bravura/EC16.xml | 1 + data/Bravura/EC17.xml | 1 + data/Bravura/EC18.xml | 1 + data/Bravura/EC19.xml | 1 + data/Bravura/EC1A.xml | 1 + data/Bravura/EC1B.xml | 1 + data/Bravura/EC1C.xml | 1 + data/Bravura/EC1D.xml | 1 + data/Bravura/EC1E.xml | 1 + data/Bravura/EC1F.xml | 1 + data/Bravura/EC20.xml | 1 + data/Bravura/EC21.xml | 1 + data/Bravura/EC22.xml | 1 + data/Bravura/EC23.xml | 1 + data/Leipzig.xml | 50 ++++++++++++++++++++++++++++++++++++------- data/Leipzig/E0A2.xml | 2 +- data/Leipzig/E1D0.xml | 2 +- data/Leipzig/E1D1.xml | 2 +- data/Leipzig/E1D2.xml | 2 +- data/Leipzig/E655.xml | 2 +- data/Leipzig/EC00.xml | 1 + data/Leipzig/EC01.xml | 1 + data/Leipzig/EC02.xml | 1 + data/Leipzig/EC03.xml | 1 + data/Leipzig/EC04.xml | 1 + data/Leipzig/EC05.xml | 1 + data/Leipzig/EC06.xml | 1 + data/Leipzig/EC07.xml | 1 + data/Leipzig/EC08.xml | 1 + data/Leipzig/EC09.xml | 1 + data/Leipzig/EC0A.xml | 1 + data/Leipzig/EC0B.xml | 1 + data/Leipzig/EC0C.xml | 1 + data/Leipzig/EC0D.xml | 1 + data/Leipzig/EC0E.xml | 1 + data/Leipzig/EC0F.xml | 1 + data/Leipzig/EC10.xml | 1 + data/Leipzig/EC11.xml | 1 + data/Leipzig/EC12.xml | 1 + data/Leipzig/EC13.xml | 1 + data/Leipzig/EC14.xml | 1 + data/Leipzig/EC15.xml | 1 + data/Leipzig/EC16.xml | 1 + data/Leipzig/EC17.xml | 1 + data/Leipzig/EC18.xml | 1 + data/Leipzig/EC19.xml | 1 + data/Leipzig/EC1A.xml | 1 + data/Leipzig/EC1B.xml | 1 + data/Leipzig/EC1C.xml | 1 + data/Leipzig/EC1D.xml | 1 + data/Leipzig/EC1E.xml | 1 + data/Leipzig/EC1F.xml | 1 + data/Leipzig/EC20.xml | 1 + data/Leipzig/EC21.xml | 1 + data/Leipzig/EC22.xml | 1 + data/Leipzig/EC23.xml | 1 + data/Leipzig/ECA0.xml | 2 +- data/Leipzig/ECA1.xml | 2 +- data/Leipzig/ECA9.xml | 2 +- data/Leipzig/ECAB.xml | 2 +- data/Leipzig/ECAD.xml | 2 +- data/Leipzig/ECAF.xml | 2 +- data/Leipzig/ECB1.xml | 2 +- data/Leipzig/ECB3.xml | 2 +- data/Leipzig/ECB5.xml | 2 +- include/vrv/smufl.h | 38 +++++++++++++++++++++++++++++++- 90 files changed, 202 insertions(+), 24 deletions(-) create mode 100644 data/Bravura/EC00.xml create mode 100644 data/Bravura/EC01.xml create mode 100644 data/Bravura/EC02.xml create mode 100644 data/Bravura/EC03.xml create mode 100644 data/Bravura/EC04.xml create mode 100644 data/Bravura/EC05.xml create mode 100644 data/Bravura/EC06.xml create mode 100644 data/Bravura/EC07.xml create mode 100644 data/Bravura/EC08.xml create mode 100644 data/Bravura/EC09.xml create mode 100644 data/Bravura/EC0A.xml create mode 100644 data/Bravura/EC0B.xml create mode 100644 data/Bravura/EC0C.xml create mode 100644 data/Bravura/EC0D.xml create mode 100644 data/Bravura/EC0E.xml create mode 100644 data/Bravura/EC0F.xml create mode 100644 data/Bravura/EC10.xml create mode 100644 data/Bravura/EC11.xml create mode 100644 data/Bravura/EC12.xml create mode 100644 data/Bravura/EC13.xml create mode 100644 data/Bravura/EC14.xml create mode 100644 data/Bravura/EC15.xml create mode 100644 data/Bravura/EC16.xml create mode 100644 data/Bravura/EC17.xml create mode 100644 data/Bravura/EC18.xml create mode 100644 data/Bravura/EC19.xml create mode 100644 data/Bravura/EC1A.xml create mode 100644 data/Bravura/EC1B.xml create mode 100644 data/Bravura/EC1C.xml create mode 100644 data/Bravura/EC1D.xml create mode 100644 data/Bravura/EC1E.xml create mode 100644 data/Bravura/EC1F.xml create mode 100644 data/Bravura/EC20.xml create mode 100644 data/Bravura/EC21.xml create mode 100644 data/Bravura/EC22.xml create mode 100644 data/Bravura/EC23.xml create mode 100644 data/Leipzig/EC00.xml create mode 100644 data/Leipzig/EC01.xml create mode 100644 data/Leipzig/EC02.xml create mode 100644 data/Leipzig/EC03.xml create mode 100644 data/Leipzig/EC04.xml create mode 100644 data/Leipzig/EC05.xml create mode 100644 data/Leipzig/EC06.xml create mode 100644 data/Leipzig/EC07.xml create mode 100644 data/Leipzig/EC08.xml create mode 100644 data/Leipzig/EC09.xml create mode 100644 data/Leipzig/EC0A.xml create mode 100644 data/Leipzig/EC0B.xml create mode 100644 data/Leipzig/EC0C.xml create mode 100644 data/Leipzig/EC0D.xml create mode 100644 data/Leipzig/EC0E.xml create mode 100644 data/Leipzig/EC0F.xml create mode 100644 data/Leipzig/EC10.xml create mode 100644 data/Leipzig/EC11.xml create mode 100644 data/Leipzig/EC12.xml create mode 100644 data/Leipzig/EC13.xml create mode 100644 data/Leipzig/EC14.xml create mode 100644 data/Leipzig/EC15.xml create mode 100644 data/Leipzig/EC16.xml create mode 100644 data/Leipzig/EC17.xml create mode 100644 data/Leipzig/EC18.xml create mode 100644 data/Leipzig/EC19.xml create mode 100644 data/Leipzig/EC1A.xml create mode 100644 data/Leipzig/EC1B.xml create mode 100644 data/Leipzig/EC1C.xml create mode 100644 data/Leipzig/EC1D.xml create mode 100644 data/Leipzig/EC1E.xml create mode 100644 data/Leipzig/EC1F.xml create mode 100644 data/Leipzig/EC20.xml create mode 100644 data/Leipzig/EC21.xml create mode 100644 data/Leipzig/EC22.xml create mode 100644 data/Leipzig/EC23.xml diff --git a/data/Bravura.css b/data/Bravura.css index d926021e68..ba57f7694e 100644 --- a/data/Bravura.css +++ b/data/Bravura.css @@ -1,6 +1,6 @@ @font-face { font-family: 'Bravura'; - src: url(data:application/font-woff2;charset=utf-8;base64,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) format('woff2'); + src: url(data:application/font-woff2;charset=utf-8;base64,gAFRFgAAJSFQUy1BZG9iZUZvbnQtMS4wOiBCcmF2dXJhIAolJVRpdGxlOiBCcmF2dXJhCiVWZXJzaW9uOiAobnVsbCkKJSVDcmVhdGlvbkRhdGU6IFRodSBNYXkgMTEgMTI6MzA6MzMgMjAyMwolJUNyZWF0b3I6IHJldHRpbmdoYXVzCiUgR2VuZXJhdGVkIGJ5IEZvbnRGb3JnZSAyMDIwMTEwNyAoaHR0cDovL2ZvbnRmb3JnZS5zZi5uZXQvKQolJUVuZENvbW1lbnRzCgoxMCBkaWN0IGJlZ2luCi9Gb250VHlwZSAxIGRlZgovRm9udE1hdHJpeCBbMC4wMDEgMCAwIDAuMDAxIDAgMCBdcmVhZG9ubHkgZGVmCi9Gb250TmFtZSAvQnJhdnVyYSBkZWYKL0ZvbnRCQm94IHstMzQ3IC0xMjAyIDIxMjggMTk1MSB9cmVhZG9ubHkgZGVmCi9QYWludFR5cGUgMCBkZWYKL0ZvbnRJbmZvIDcgZGljdCBkdXAgYmVnaW4KIC9GdWxsTmFtZSAoQnJhdnVyYSkgcmVhZG9ubHkgZGVmCiAvRmFtaWx5TmFtZSAoQnJhdnVyYSkgcmVhZG9ubHkgZGVmCiAvV2VpZ2h0IChSZWd1bGFyKSByZWFkb25seSBkZWYKIC9JdGFsaWNBbmdsZSAwIGRlZgogL2lzRml4ZWRQaXRjaCBmYWxzZSBkZWYKIC9VbmRlcmxpbmVQb3NpdGlvbiAtMTAwIGRlZgogL1VuZGVybGluZVRoaWNrbmVzcyA1MCBkZWYKZW5kIHJlYWRvbmx5IGRlZgovRW5jb2RpbmcgMjU2IGFycmF5CiAwIDEgMjU1IHsgMSBpbmRleCBleGNoIC8ubm90ZGVmIHB1dH0gZm9yCmR1cCAxL3NwYWNlIHB1dApkdXAgMi91bmkyNjZEIHB1dApkdXAgMy91bmkyNjZFIHB1dApkdXAgNC91bmkyNjZGIHB1dApkdXAgNS91bmlFMDAwIHB1dApkdXAgNi91bmlFMDAzIHB1dApkdXAgNy91bmlFMDA0IHB1dApkdXAgOC91bmlFMDQzIHB1dApkdXAgOS91bmlFMDQ0IHB1dApkdXAgMTAvdW5pRTA0NSBwdXQKZHVwIDExL3VuaUUwNDYgcHV0CmR1cCAxMi91bmlFMDQ3IHB1dApkdXAgMTMvdW5pRTA0OCBwdXQKZHVwIDE0L3VuaUUwNDkgcHV0CmR1cCAxNS91bmlFMDRBIHB1dApkdXAgMTYvdW5pRTA0QiBwdXQKZHVwIDE3L3VuaUUwNTAgcHV0CmR1cCAxOC91bmlFMDUxIHB1dApkdXAgMTkvdW5pRTA1MiBwdXQKZHVwIDIwL3VuaUUwNTMgcHV0CmR1cCAyMS91bmlFMDU0IHB1dApkdXAgMjIvdW5pRTA1NSBwdXQKZHVwIDIzL3VuaUUwNTYgcHV0CmR1cCAyNC91bmlFMDVDIHB1dApkdXAgMjUvdW5pRTA1RCBwdXQKZHVwIDI2L3VuaUUwNjIgcHV0CmR1cCAyNy91bmlFMDYzIHB1dApkdXAgMjgvdW5pRTA2NCBwdXQKZHVwIDI5L3VuaUUwNjUgcHV0CmR1cCAzMC91bmlFMDY2IHB1dApkdXAgMzEvdW5pRTA2OSBwdXQKZHVwIDMyL3VuaUUwNkEgcHV0CmR1cCAzMy91bmlFMDZEIHB1dApkdXAgMzQvdW5pRTA2RSBwdXQKZHVwIDM1L3VuaUUwNzMgcHV0CmR1cCAzNi91bmlFMDc0IHB1dApkdXAgMzcvdW5pRTA3NSBwdXQKZHVwIDM4L3VuaUUwNzYgcHV0CmR1cCAzOS91bmlFMDc3IHB1dApkdXAgNDAvdW5pRTA3QSBwdXQKZHVwIDQxL3VuaUUwN0IgcHV0CmR1cCA0Mi91bmlFMDdDIHB1dApkdXAgNDMvdW5pRTA4MCBwdXQKZHVwIDQ0L3VuaUUwODEgcHV0CmR1cCA0NS91bmlFMDgyIHB1dApkdXAgNDYvdW5pRTA4MyBwdXQKZHVwIDQ3L3VuaUUwODQgcHV0CmR1cCA0OC91bmlFMDg1IHB1dApkdXAgNDkvdW5pRTA4NiBwdXQKZHVwIDUwL3VuaUUwODcgcHV0CmR1cCA1MS91bmlFMDg4IHB1dApkdXAgNTIvdW5pRTA4OSBwdXQKZHVwIDUzL3VuaUUwOEEgcHV0CmR1cCA1NC91bmlFMDhCIHB1dApkdXAgNTUvdW5pRTA4QyBwdXQKZHVwIDU2L3VuaUUwOEQgcHV0CmR1cCA1Ny91bmlFMDhFIHB1dApkdXAgNTgvdW5pRTA4RiBwdXQKZHVwIDU5L3VuaUUwOTAgcHV0CmR1cCA2MC91bmlFMDkxIHB1dApkdXAgNjEvdW5pRTA5MiBwdXQKZHVwIDYyL3VuaUUwOTMgcHV0CmR1cCA2My91bmlFMDk0IHB1dApkdXAgNjQvdW5pRTA5NSBwdXQKZHVwIDY1L3VuaUUwQTAgcHV0CmR1cCA2Ni91bmlFMEExIHB1dApkdXAgNjcvdW5pRTBBMiBwdXQKZHVwIDY4L3VuaUUwQTMgcHV0CmR1cCA2OS91bmlFMEE0IHB1dApkdXAgNzAvdW5pRTBBNSBwdXQKZHVwIDcxL3VuaUUwQTkgcHV0CmR1cCA3Mi91bmlFMEFGIHB1dApkdXAgNzMvdW5pRTBCNSBwdXQKZHVwIDc0L3VuaUUwQjYgcHV0CmR1cCA3NS91bmlFMEI3IHB1dApkdXAgNzYvdW5pRTBEOSBwdXQKZHVwIDc3L3VuaUUwREEgcHV0CmR1cCA3OC91bmlFMERCIHB1dApkdXAgNzkvdW5pRTBEQyBwdXQKZHVwIDgwL3VuaUUwREQgcHV0CmR1cCA4MS91bmlFMERFIHB1dApkdXAgODIvdW5pRTBGNSBwdXQKZHVwIDgzL3VuaUUwRjYgcHV0CmR1cCA4NC91bmlFMEZBIHB1dApkdXAgODUvdW5pRTEwMSBwdXQKZHVwIDg2L3VuaUUxMDIgcHV0CmR1cCA4Ny91bmlFMTAzIHB1dApkdXAgODgvdW5pRTFEMCBwdXQKZHVwIDg5L3VuaUUxRDEgcHV0CmR1cCA5MC91bmlFMUQyIHB1dApkdXAgOTEvdW5pRTFEMyBwdXQKZHVwIDkyL3VuaUUxRDUgcHV0CmR1cCA5My91bmlFMUQ3IHB1dApkdXAgOTQvdW5pRTFEOSBwdXQKZHVwIDk1L3VuaUUxREIgcHV0CmR1cCA5Ni91bmlFMUREIHB1dApkdXAgOTcvdW5pRTFERiBwdXQKZHVwIDk4L3VuaUUxRTEgcHV0CmR1cCA5OS91bmlFMUUzIHB1dApkdXAgMTAwL3VuaUUxRTUgcHV0CmR1cCAxMDEvdW5pRTFFNyBwdXQKZHVwIDEwMi91bmlFMjIwIHB1dApkdXAgMTAzL3VuaUUyMjEgcHV0CmR1cCAxMDQvdW5pRTIyMiBwdXQKZHVwIDEwNS91bmlFMjIzIHB1dApkdXAgMTA2L3VuaUUyMjQgcHV0CmR1cCAxMDcvdW5pRTIyQSBwdXQKZHVwIDEwOC91bmlFMjJFIHB1dApkdXAgMTA5L3VuaUUyMkYgcHV0CmR1cCAxMTAvdW5pRTIzMCBwdXQKZHVwIDExMS91bmlFMjMxIHB1dApkdXAgMTEyL3VuaUUyNDAgcHV0CmR1cCAxMTMvdW5pRTI0MSBwdXQKZHVwIDExNC91bmlFMjQyIHB1dApkdXAgMTE1L3VuaUUyNDMgcHV0CmR1cCAxMTYvdW5pRTI0NCBwdXQKZHVwIDExNy91bmlFMjQ1IHB1dApkdXAgMTE4L3VuaUUyNDYgcHV0CmR1cCAxMTkvdW5pRTI0NyBwdXQKZHVwIDEyMC91bmlFMjQ4IHB1dApkdXAgMTIxL3VuaUUyNDkgcHV0CmR1cCAxMjIvdW5pRTI0QSBwdXQKZHVwIDEyMy91bmlFMjRCIHB1dApkdXAgMTI0L3VuaUUyNEMgcHV0CmR1cCAxMjUvdW5pRTI0RCBwdXQKZHVwIDEyNi91bmlFMjRFIHB1dApkdXAgMTI3L3VuaUUyNEYgcHV0CmR1cCAxMjgvdW5pRTI2MCBwdXQKZHVwIDEyOS91bmlFMjYxIHB1dApkdXAgMTMwL3VuaUUyNjIgcHV0CmR1cCAxMzEvdW5pRTI2MyBwdXQKZHVwIDEzMi91bmlFMjY0IHB1dApkdXAgMTMzL3VuaUUyNjUgcHV0CmR1cCAxMzQvdW5pRTI2NiBwdXQKZHVwIDEzNS91bmlFMjY3IHB1dApkdXAgMTM2L3VuaUUyNjggcHV0CmR1cCAxMzcvdW5pRTI2OSBwdXQKZHVwIDEzOC91bmlFMjZBIHB1dApkdXAgMTM5L3VuaUUyNkIgcHV0CmR1cCAxNDAvdW5pRTI2QyBwdXQKZHVwIDE0MS91bmlFMjZEIHB1dApkdXAgMTQyL3VuaUUyNzAgcHV0CmR1cCAxNDMvdW5pRTI3MSBwdXQKZHVwIDE0NC91bmlFMjcyIHB1dApkdXAgMTQ1L3VuaUUyNzMgcHV0CmR1cCAxNDYvdW5pRTI3NCBwdXQKZHVwIDE0Ny91bmlFMjc1IHB1dApkdXAgMTQ4L3VuaUUyODAgcHV0CmR1cCAxNDkvdW5pRTI4MSBwdXQKZHVwIDE1MC91bmlFMjgyIHB1dApkdXAgMTUxL3VuaUUyODMgcHV0CmR1cCAxNTIvdW5pRTQ0MCBwdXQKZHVwIDE1My91bmlFNDQxIHB1dApkdXAgMTU0L3VuaUU0NDIgcHV0CmR1cCAxNTUvdW5pRTQ0MyBwdXQKZHVwIDE1Ni91bmlFNDQ0IHB1dApkdXAgMTU3L3VuaUU0NDUgcHV0CmR1cCAxNTgvdW5pRTQ0NiBwdXQKZHVwIDE1OS91bmlFNDQ3IHB1dApkdXAgMTYwL3VuaUU0NjAgcHV0CmR1cCAxNjEvdW5pRTQ2MSBwdXQKZHVwIDE2Mi91bmlFNEEwIHB1dApkdXAgMTYzL3VuaUU0QTEgcHV0CmR1cCAxNjQvdW5pRTRBMiBwdXQKZHVwIDE2NS91bmlFNEEzIHB1dApkdXAgMTY2L3VuaUU0QTQgcHV0CmR1cCAxNjcvdW5pRTRBNSBwdXQKZHVwIDE2OC91bmlFNEE2IHB1dApkdXAgMTY5L3VuaUU0QTcgcHV0CmR1cCAxNzAvdW5pRTRBOCBwdXQKZHVwIDE3MS91bmlFNEE5IHB1dApkdXAgMTcyL3VuaUU0QUEgcHV0CmR1cCAxNzMvdW5pRTRBQiBwdXQKZHVwIDE3NC91bmlFNEFDIHB1dApkdXAgMTc1L3VuaUU0QUQgcHV0CmR1cCAxNzYvdW5pRTRBRSBwdXQKZHVwIDE3Ny91bmlFNEFGIHB1dApkdXAgMTc4L3VuaUU0QjAgcHV0CmR1cCAxNzkvdW5pRTRCMSBwdXQKZHVwIDE4MC91bmlFNEIyIHB1dApkdXAgMTgxL3VuaUU0QjMgcHV0CmR1cCAxODIvdW5pRTRCNCBwdXQKZHVwIDE4My91bmlFNEI1IHB1dApkdXAgMTg0L3VuaUU0QjYgcHV0CmR1cCAxODUvdW5pRTRCNyBwdXQKZHVwIDE4Ni91bmlFNEI4IHB1dApkdXAgMTg3L3VuaUU0QjkgcHV0CmR1cCAxODgvdW5pRTRCQSBwdXQKZHVwIDE4OS91bmlFNEJCIHB1dApkdXAgMTkwL3VuaUU0QkMgcHV0CmR1cCAxOTEvdW5pRTRCRCBwdXQKZHVwIDE5Mi91bmlFNEMwIHB1dApkdXAgMTkzL3VuaUU0QzEgcHV0CmR1cCAxOTQvdW5pRTRDMiBwdXQKZHVwIDE5NS91bmlFNEMzIHB1dApkdXAgMTk2L3VuaUU0QzQgcHV0CmR1cCAxOTcvdW5pRTRDNSBwdXQKZHVwIDE5OC91bmlFNEM2IHB1dApkdXAgMTk5L3VuaUU0QzcgcHV0CmR1cCAyMDAvdW5pRTRDOCBwdXQKZHVwIDIwMS91bmlFNEM5IHB1dApkdXAgMjAyL3VuaUU0Q0UgcHV0CmR1cCAyMDMvdW5pRTREMSBwdXQKZHVwIDIwNC91bmlFNEQyIHB1dApkdXAgMjA1L3VuaUU0RDMgcHV0CmR1cCAyMDYvdW5pRTRENCBwdXQKZHVwIDIwNy91bmlFNEUwIHB1dApkdXAgMjA4L3VuaUU0RTEgcHV0CmR1cCAyMDkvdW5pRTRFMiBwdXQKZHVwIDIxMC91bmlFNEUzIHB1dApkdXAgMjExL3VuaUU0RTQgcHV0CmR1cCAyMTIvdW5pRTRFNSBwdXQKZHVwIDIxMy91bmlFNEU2IHB1dApkdXAgMjE0L3VuaUU0RTcgcHV0CmR1cCAyMTUvdW5pRTRFOCBwdXQKZHVwIDIxNi91bmlFNEU5IHB1dApkdXAgMjE3L3VuaUU0RUEgcHV0CmR1cCAyMTgvdW5pRTRFQiBwdXQKZHVwIDIxOS91bmlFNEVDIHB1dApkdXAgMjIwL3VuaUU0RUQgcHV0CmR1cCAyMjEvdW5pRTRGMiBwdXQKZHVwIDIyMi91bmlFNEY2IHB1dApkdXAgMjIzL3VuaUU1MDAgcHV0CmR1cCAyMjQvdW5pRTUwMSBwdXQKZHVwIDIyNS91bmlFNTAyIHB1dApkdXAgMjI2L3VuaUU1MDMgcHV0CmR1cCAyMjcvdW5pRTUwNCBwdXQKZHVwIDIyOC91bmlFNTA1IHB1dApkdXAgMjI5L3VuaUU1MTAgcHV0CmR1cCAyMzAvdW5pRTUxMSBwdXQKZHVwIDIzMS91bmlFNTEyIHB1dApkdXAgMjMyL3VuaUU1MTMgcHV0CmR1cCAyMzMvdW5pRTUxNCBwdXQKZHVwIDIzNC91bmlFNTE1IHB1dApkdXAgMjM1L3VuaUU1MTYgcHV0CmR1cCAyMzYvdW5pRTUxNyBwdXQKZHVwIDIzNy91bmlFNTE4IHB1dApkdXAgMjM4L3VuaUU1MTkgcHV0CmR1cCAyMzkvdW5pRTUxQSBwdXQKZHVwIDI0MC91bmlFNTFCIHB1dApkdXAgMjQxL3VuaUU1MUMgcHV0CmR1cCAyNDIv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OYPmhzCxFyZQmQGl05XUtud9oCOm6rCjWTklpMQrlAxtVsC5dkZjElSUIU+OjeDDpysDVlRbSjKZX/ji4ce8Dquum9gTo7//4udGTuBOHPuMA3yJSmToBXty0vc/TbLRE5Z4Syk8QIdAgiIGUW2YjXt0v4s9LchZu3L92iSMhR0Hqfq63my8dgxAJUOqzQx+OlLEzagSKU8G5qDQuSIP/wtgT3OyIG2blr0gqn8MRi447LxsHD3Lqf/HwW+jiXiDTidOsX/NrgkxgOq6LtItQR0oF42WWj5Y2fjtjSlcXSA4W0EynuProLRG160/wfQ4qAYHqCeohFYhGfsmYnLngiVgRi8z2ABaxX7HWSnNwkzF/zNi3sUrwWD88DDhs1UeAY205gx/r5cHFB5Euy+t7Z8PDz9WWH40Ps0TI9gFAtppuyBq8w22CYVfp5Ssckrl/zdcfh2TPS/+jZbKyDHG765c+MNWEWHCABaqCh7xM3tgTKO3AMNj1YECOMY9Lz/0lMWx8G3sDG+9pdTQRBBo/teqEt5HE5JqJIE6Z3XoliXZmZDNxtJUi5pG+MAvSVo5iAeTDydVxZmN6kRA0xWzn+Q/GP0m148Ph4xhItAF2K7xawAj2E1UDoScYjz9DEq6vXButGKCcRn1AHdE9YahW3HWuvSaXGBNLhqCHQilD0ePjq1LbvqOHzNMBJ9uwPuAns5C+AHZduZqcima1topdgfZ8Qaav0YRKw89RPlrJtyaq+9wmSb6N0Fb9Rvah9msPP83gN0URRErqIeWBZbOhZvpMGqeBgDstwmXtVnGya+jK3HiDbIxOlkptgDLl5jW9I22Lznfkmam9iOSDiFuGjwuydSP0R9wnyiNEWtbiFMHUm4iw2r5uOCGzbGZIbTifaAN93Njh0deQfuAzYpXce+KUTsobwHclwrAi+1lUADOI52+KT/yYck32Ut6cYABFQIAAAowMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAowMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAowMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKY2xlYXJ0b21hcmsKgAM=) format('woff2'); font-weight: normal; font-style: normal; } \ No newline at end of file diff --git a/data/Bravura.xml b/data/Bravura.xml index 90c1d9fa98..3afe1afdda 100644 --- a/data/Bravura.xml +++ b/data/Bravura.xml @@ -820,6 +820,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data/Bravura/EC00.xml b/data/Bravura/EC00.xml new file mode 100644 index 0000000000..c9f54d0cd9 --- /dev/null +++ b/data/Bravura/EC00.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/data/Bravura/EC01.xml b/data/Bravura/EC01.xml new file mode 100644 index 0000000000..a3d8e2d549 --- /dev/null +++ b/data/Bravura/EC01.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/data/Bravura/EC02.xml b/data/Bravura/EC02.xml new file mode 100644 index 0000000000..439261dada --- /dev/null +++ b/data/Bravura/EC02.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/data/Bravura/EC03.xml b/data/Bravura/EC03.xml new file mode 100644 index 0000000000..40cf522fbb --- /dev/null +++ b/data/Bravura/EC03.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/data/Bravura/EC04.xml b/data/Bravura/EC04.xml new file mode 100644 index 0000000000..ac27523bb5 --- /dev/null +++ b/data/Bravura/EC04.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/data/Bravura/EC05.xml b/data/Bravura/EC05.xml new file mode 100644 index 0000000000..862f2027a0 --- /dev/null +++ b/data/Bravura/EC05.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/data/Bravura/EC06.xml b/data/Bravura/EC06.xml new file mode 100644 index 0000000000..c59e8f0558 --- /dev/null +++ b/data/Bravura/EC06.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/data/Bravura/EC07.xml b/data/Bravura/EC07.xml new file mode 100644 index 0000000000..4f4fe30c2d --- /dev/null +++ b/data/Bravura/EC07.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/data/Bravura/EC08.xml b/data/Bravura/EC08.xml new file mode 100644 index 0000000000..cb568ec7b7 --- /dev/null +++ b/data/Bravura/EC08.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/data/Bravura/EC09.xml b/data/Bravura/EC09.xml new file mode 100644 index 0000000000..4f06c7db99 --- /dev/null +++ b/data/Bravura/EC09.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/data/Bravura/EC0A.xml b/data/Bravura/EC0A.xml new file mode 100644 index 0000000000..4b39857a2a --- /dev/null +++ b/data/Bravura/EC0A.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/data/Bravura/EC0B.xml b/data/Bravura/EC0B.xml new file mode 100644 index 0000000000..d469c3e4be --- /dev/null +++ b/data/Bravura/EC0B.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/data/Bravura/EC0C.xml b/data/Bravura/EC0C.xml new file mode 100644 index 0000000000..88da6b8947 --- /dev/null +++ b/data/Bravura/EC0C.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/data/Bravura/EC0D.xml b/data/Bravura/EC0D.xml new file mode 100644 index 0000000000..c79d33c907 --- /dev/null +++ b/data/Bravura/EC0D.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/data/Bravura/EC0E.xml b/data/Bravura/EC0E.xml new file mode 100644 index 0000000000..fad11fabfc --- /dev/null +++ b/data/Bravura/EC0E.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/data/Bravura/EC0F.xml b/data/Bravura/EC0F.xml new file mode 100644 index 0000000000..f817f10111 --- /dev/null +++ b/data/Bravura/EC0F.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/data/Bravura/EC10.xml b/data/Bravura/EC10.xml new file mode 100644 index 0000000000..f902b34af6 --- /dev/null +++ b/data/Bravura/EC10.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/data/Bravura/EC11.xml b/data/Bravura/EC11.xml new file mode 100644 index 0000000000..921bf381e1 --- /dev/null +++ b/data/Bravura/EC11.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/data/Bravura/EC12.xml b/data/Bravura/EC12.xml new file mode 100644 index 0000000000..731b03337c --- /dev/null +++ b/data/Bravura/EC12.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/data/Bravura/EC13.xml b/data/Bravura/EC13.xml new file mode 100644 index 0000000000..4d869971b5 --- /dev/null +++ b/data/Bravura/EC13.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/data/Bravura/EC14.xml b/data/Bravura/EC14.xml new file mode 100644 index 0000000000..893f830682 --- /dev/null +++ b/data/Bravura/EC14.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/data/Bravura/EC15.xml b/data/Bravura/EC15.xml new file mode 100644 index 0000000000..6a65fad693 --- /dev/null +++ b/data/Bravura/EC15.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/data/Bravura/EC16.xml b/data/Bravura/EC16.xml new file mode 100644 index 0000000000..dea659b3a0 --- /dev/null +++ b/data/Bravura/EC16.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/data/Bravura/EC17.xml b/data/Bravura/EC17.xml new file mode 100644 index 0000000000..9fd9a21352 --- /dev/null +++ b/data/Bravura/EC17.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/data/Bravura/EC18.xml b/data/Bravura/EC18.xml new file mode 100644 index 0000000000..557324c6b3 --- /dev/null +++ b/data/Bravura/EC18.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/data/Bravura/EC19.xml b/data/Bravura/EC19.xml new file mode 100644 index 0000000000..7311f067a9 --- /dev/null +++ b/data/Bravura/EC19.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/data/Bravura/EC1A.xml b/data/Bravura/EC1A.xml new file mode 100644 index 0000000000..df8fbf1731 --- /dev/null +++ b/data/Bravura/EC1A.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/data/Bravura/EC1B.xml b/data/Bravura/EC1B.xml new file mode 100644 index 0000000000..a52febc1ad --- /dev/null +++ b/data/Bravura/EC1B.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/data/Bravura/EC1C.xml b/data/Bravura/EC1C.xml new file mode 100644 index 0000000000..51eaf98f97 --- /dev/null +++ b/data/Bravura/EC1C.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/data/Bravura/EC1D.xml b/data/Bravura/EC1D.xml new file mode 100644 index 0000000000..951545a1aa --- /dev/null +++ b/data/Bravura/EC1D.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/data/Bravura/EC1E.xml b/data/Bravura/EC1E.xml new file mode 100644 index 0000000000..c2cdce9c56 --- /dev/null +++ b/data/Bravura/EC1E.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/data/Bravura/EC1F.xml b/data/Bravura/EC1F.xml new file mode 100644 index 0000000000..011372f3f0 --- /dev/null +++ b/data/Bravura/EC1F.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/data/Bravura/EC20.xml b/data/Bravura/EC20.xml new file mode 100644 index 0000000000..1c3cd60dad --- /dev/null +++ b/data/Bravura/EC20.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/data/Bravura/EC21.xml b/data/Bravura/EC21.xml new file mode 100644 index 0000000000..0ef368e5a3 --- /dev/null +++ b/data/Bravura/EC21.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/data/Bravura/EC22.xml b/data/Bravura/EC22.xml new file mode 100644 index 0000000000..df27610ca0 --- /dev/null +++ b/data/Bravura/EC22.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/data/Bravura/EC23.xml b/data/Bravura/EC23.xml new file mode 100644 index 0000000000..94b61df51b --- /dev/null +++ b/data/Bravura/EC23.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/data/Leipzig.xml b/data/Leipzig.xml index 561598324b..7d5feaff8a 100644 --- a/data/Leipzig.xml +++ b/data/Leipzig.xml @@ -19,8 +19,6 @@ - - @@ -126,7 +124,7 @@ - + @@ -637,9 +635,9 @@ - - - + + + @@ -679,8 +677,8 @@ - - + + @@ -736,4 +734,40 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/data/Leipzig/E0A2.xml b/data/Leipzig/E0A2.xml index 6732716107..423aa798e7 100644 --- a/data/Leipzig/E0A2.xml +++ b/data/Leipzig/E0A2.xml @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/data/Leipzig/E1D0.xml b/data/Leipzig/E1D0.xml index 9c3f07e7b3..78b360e627 100644 --- a/data/Leipzig/E1D0.xml +++ b/data/Leipzig/E1D0.xml @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/data/Leipzig/E1D1.xml b/data/Leipzig/E1D1.xml index 548c2fe580..e57b9d1e6a 100644 --- a/data/Leipzig/E1D1.xml +++ b/data/Leipzig/E1D1.xml @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/data/Leipzig/E1D2.xml b/data/Leipzig/E1D2.xml index 02e0ee11a1..f93f6a5eb7 100644 --- a/data/Leipzig/E1D2.xml +++ b/data/Leipzig/E1D2.xml @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/data/Leipzig/E655.xml b/data/Leipzig/E655.xml index 7d145d6daa..0f97bc7c36 100644 --- a/data/Leipzig/E655.xml +++ b/data/Leipzig/E655.xml @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/data/Leipzig/EC00.xml b/data/Leipzig/EC00.xml new file mode 100644 index 0000000000..c98f4d7158 --- /dev/null +++ b/data/Leipzig/EC00.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/data/Leipzig/EC01.xml b/data/Leipzig/EC01.xml new file mode 100644 index 0000000000..406683f9ef --- /dev/null +++ b/data/Leipzig/EC01.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/data/Leipzig/EC02.xml b/data/Leipzig/EC02.xml new file mode 100644 index 0000000000..cb7f22b59b --- /dev/null +++ b/data/Leipzig/EC02.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/data/Leipzig/EC03.xml b/data/Leipzig/EC03.xml new file mode 100644 index 0000000000..e3f81b193c --- /dev/null +++ b/data/Leipzig/EC03.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/data/Leipzig/EC04.xml b/data/Leipzig/EC04.xml new file mode 100644 index 0000000000..2bf75daed5 --- /dev/null +++ b/data/Leipzig/EC04.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/data/Leipzig/EC05.xml b/data/Leipzig/EC05.xml new file mode 100644 index 0000000000..0aae8da5fc --- /dev/null +++ b/data/Leipzig/EC05.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/data/Leipzig/EC06.xml b/data/Leipzig/EC06.xml new file mode 100644 index 0000000000..df4d22323f --- /dev/null +++ b/data/Leipzig/EC06.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/data/Leipzig/EC07.xml b/data/Leipzig/EC07.xml new file mode 100644 index 0000000000..ffdda2cdac --- /dev/null +++ b/data/Leipzig/EC07.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/data/Leipzig/EC08.xml b/data/Leipzig/EC08.xml new file mode 100644 index 0000000000..99779d4369 --- /dev/null +++ b/data/Leipzig/EC08.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/data/Leipzig/EC09.xml b/data/Leipzig/EC09.xml new file mode 100644 index 0000000000..b47540fe72 --- /dev/null +++ b/data/Leipzig/EC09.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/data/Leipzig/EC0A.xml b/data/Leipzig/EC0A.xml new file mode 100644 index 0000000000..3680b32410 --- /dev/null +++ b/data/Leipzig/EC0A.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/data/Leipzig/EC0B.xml b/data/Leipzig/EC0B.xml new file mode 100644 index 0000000000..a0d10d6439 --- /dev/null +++ b/data/Leipzig/EC0B.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/data/Leipzig/EC0C.xml b/data/Leipzig/EC0C.xml new file mode 100644 index 0000000000..d1e6790e8a --- /dev/null +++ b/data/Leipzig/EC0C.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/data/Leipzig/EC0D.xml b/data/Leipzig/EC0D.xml new file mode 100644 index 0000000000..5c077ac7ad --- /dev/null +++ b/data/Leipzig/EC0D.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/data/Leipzig/EC0E.xml b/data/Leipzig/EC0E.xml new file mode 100644 index 0000000000..53811698da --- /dev/null +++ b/data/Leipzig/EC0E.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/data/Leipzig/EC0F.xml b/data/Leipzig/EC0F.xml new file mode 100644 index 0000000000..1c1dcf5e97 --- /dev/null +++ b/data/Leipzig/EC0F.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/data/Leipzig/EC10.xml b/data/Leipzig/EC10.xml new file mode 100644 index 0000000000..02af1174b6 --- /dev/null +++ b/data/Leipzig/EC10.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/data/Leipzig/EC11.xml b/data/Leipzig/EC11.xml new file mode 100644 index 0000000000..bc5814db0c --- /dev/null +++ b/data/Leipzig/EC11.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/data/Leipzig/EC12.xml b/data/Leipzig/EC12.xml new file mode 100644 index 0000000000..9d8c6c6a3c --- /dev/null +++ b/data/Leipzig/EC12.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/data/Leipzig/EC13.xml b/data/Leipzig/EC13.xml new file mode 100644 index 0000000000..f59175aa28 --- /dev/null +++ b/data/Leipzig/EC13.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/data/Leipzig/EC14.xml b/data/Leipzig/EC14.xml new file mode 100644 index 0000000000..cba2e57968 --- /dev/null +++ b/data/Leipzig/EC14.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/data/Leipzig/EC15.xml b/data/Leipzig/EC15.xml new file mode 100644 index 0000000000..dca19cc51b --- /dev/null +++ b/data/Leipzig/EC15.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/data/Leipzig/EC16.xml b/data/Leipzig/EC16.xml new file mode 100644 index 0000000000..073eccd85c --- /dev/null +++ b/data/Leipzig/EC16.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/data/Leipzig/EC17.xml b/data/Leipzig/EC17.xml new file mode 100644 index 0000000000..f89f7a998e --- /dev/null +++ b/data/Leipzig/EC17.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/data/Leipzig/EC18.xml b/data/Leipzig/EC18.xml new file mode 100644 index 0000000000..d7428ecaed --- /dev/null +++ b/data/Leipzig/EC18.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/data/Leipzig/EC19.xml b/data/Leipzig/EC19.xml new file mode 100644 index 0000000000..3b6d3600fd --- /dev/null +++ b/data/Leipzig/EC19.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/data/Leipzig/EC1A.xml b/data/Leipzig/EC1A.xml new file mode 100644 index 0000000000..dee64afc57 --- /dev/null +++ b/data/Leipzig/EC1A.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/data/Leipzig/EC1B.xml b/data/Leipzig/EC1B.xml new file mode 100644 index 0000000000..bb2b267c14 --- /dev/null +++ b/data/Leipzig/EC1B.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/data/Leipzig/EC1C.xml b/data/Leipzig/EC1C.xml new file mode 100644 index 0000000000..d8f413b783 --- /dev/null +++ b/data/Leipzig/EC1C.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/data/Leipzig/EC1D.xml b/data/Leipzig/EC1D.xml new file mode 100644 index 0000000000..c4fccdccb9 --- /dev/null +++ b/data/Leipzig/EC1D.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/data/Leipzig/EC1E.xml b/data/Leipzig/EC1E.xml new file mode 100644 index 0000000000..89c23ffbd9 --- /dev/null +++ b/data/Leipzig/EC1E.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/data/Leipzig/EC1F.xml b/data/Leipzig/EC1F.xml new file mode 100644 index 0000000000..211ee84518 --- /dev/null +++ b/data/Leipzig/EC1F.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/data/Leipzig/EC20.xml b/data/Leipzig/EC20.xml new file mode 100644 index 0000000000..af1e73cf49 --- /dev/null +++ b/data/Leipzig/EC20.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/data/Leipzig/EC21.xml b/data/Leipzig/EC21.xml new file mode 100644 index 0000000000..30280b9d2c --- /dev/null +++ b/data/Leipzig/EC21.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/data/Leipzig/EC22.xml b/data/Leipzig/EC22.xml new file mode 100644 index 0000000000..b7f672a818 --- /dev/null +++ b/data/Leipzig/EC22.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/data/Leipzig/EC23.xml b/data/Leipzig/EC23.xml new file mode 100644 index 0000000000..62e9c675b6 --- /dev/null +++ b/data/Leipzig/EC23.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/data/Leipzig/ECA0.xml b/data/Leipzig/ECA0.xml index 2dd941e43b..40e9872f46 100644 --- a/data/Leipzig/ECA0.xml +++ b/data/Leipzig/ECA0.xml @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/data/Leipzig/ECA1.xml b/data/Leipzig/ECA1.xml index 304056a71f..baf620bb45 100644 --- a/data/Leipzig/ECA1.xml +++ b/data/Leipzig/ECA1.xml @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/data/Leipzig/ECA9.xml b/data/Leipzig/ECA9.xml index c58eecbf99..cd5a3b9499 100644 --- a/data/Leipzig/ECA9.xml +++ b/data/Leipzig/ECA9.xml @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/data/Leipzig/ECAB.xml b/data/Leipzig/ECAB.xml index 5e6cfc1651..ef27b1609d 100644 --- a/data/Leipzig/ECAB.xml +++ b/data/Leipzig/ECAB.xml @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/data/Leipzig/ECAD.xml b/data/Leipzig/ECAD.xml index 9c88c72214..8f7e4409f8 100644 --- a/data/Leipzig/ECAD.xml +++ b/data/Leipzig/ECAD.xml @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/data/Leipzig/ECAF.xml b/data/Leipzig/ECAF.xml index 7c517dadd2..6ca1f44c1a 100644 --- a/data/Leipzig/ECAF.xml +++ b/data/Leipzig/ECAF.xml @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/data/Leipzig/ECB1.xml b/data/Leipzig/ECB1.xml index 1883aafe00..66838bfd18 100644 --- a/data/Leipzig/ECB1.xml +++ b/data/Leipzig/ECB1.xml @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/data/Leipzig/ECB3.xml b/data/Leipzig/ECB3.xml index a9b1a5a7a2..9df121ca21 100644 --- a/data/Leipzig/ECB3.xml +++ b/data/Leipzig/ECB3.xml @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/data/Leipzig/ECB5.xml b/data/Leipzig/ECB5.xml index 1395f7ff23..e5a844faae 100644 --- a/data/Leipzig/ECB5.xml +++ b/data/Leipzig/ECB5.xml @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/include/vrv/smufl.h b/include/vrv/smufl.h index 111fa1b65e..8eedbf6a16 100644 --- a/include/vrv/smufl.h +++ b/include/vrv/smufl.h @@ -558,6 +558,42 @@ enum { SMUFL_EBE7_luteItalianFret7 = 0xEBE7, SMUFL_EBE8_luteItalianFret8 = 0xEBE8, SMUFL_EBE9_luteItalianFret9 = 0xEBE9, + SMUFL_EC00_luteGermanALower = 0xEC00, + SMUFL_EC01_luteGermanBLower = 0xEC01, + SMUFL_EC02_luteGermanCLower = 0xEC02, + SMUFL_EC03_luteGermanDLower = 0xEC03, + SMUFL_EC04_luteGermanELower = 0xEC04, + SMUFL_EC05_luteGermanFLower = 0xEC05, + SMUFL_EC06_luteGermanGLower = 0xEC06, + SMUFL_EC07_luteGermanHLower = 0xEC07, + SMUFL_EC08_luteGermanILower = 0xEC08, + SMUFL_EC09_luteGermanKLower = 0xEC09, + SMUFL_EC0A_luteGermanLLower = 0xEC0A, + SMUFL_EC0B_luteGermanMLower = 0xEC0B, + SMUFL_EC0C_luteGermanNLower = 0xEC0C, + SMUFL_EC0D_luteGermanOLower = 0xEC0D, + SMUFL_EC0E_luteGermanPLower = 0xEC0E, + SMUFL_EC0F_luteGermanQLower = 0xEC0F, + SMUFL_EC10_luteGermanRLower = 0xEC10, + SMUFL_EC11_luteGermanSLower = 0xEC11, + SMUFL_EC12_luteGermanTLower = 0xEC12, + SMUFL_EC13_luteGermanVLower = 0xEC13, + SMUFL_EC14_luteGermanXLower = 0xEC14, + SMUFL_EC15_luteGermanYLower = 0xEC15, + SMUFL_EC16_luteGermanZLower = 0xEC16, + SMUFL_EC17_luteGermanAUpper = 0xEC17, + SMUFL_EC18_luteGermanBUpper = 0xEC18, + SMUFL_EC19_luteGermanCUpper = 0xEC19, + SMUFL_EC1A_luteGermanDUpper = 0xEC1A, + SMUFL_EC1B_luteGermanEUpper = 0xEC1B, + SMUFL_EC1C_luteGermanFUpper = 0xEC1C, + SMUFL_EC1D_luteGermanGUpper = 0xEC1D, + SMUFL_EC1E_luteGermanHUpper = 0xEC1E, + SMUFL_EC1F_luteGermanIUpper = 0xEC1F, + SMUFL_EC20_luteGermanKUpper = 0xEC20, + SMUFL_EC21_luteGermanLUpper = 0xEC21, + SMUFL_EC22_luteGermanMUpper = 0xEC22, + SMUFL_EC23_luteGermanNUpper = 0xEC23, SMUFL_EC80_timeSigBracketLeft = 0xEC80, SMUFL_EC81_timeSigBracketRight = 0xEC81, SMUFL_EC82_timeSigBracketLeftSmall = 0xEC82, @@ -585,7 +621,7 @@ enum { }; /** The number of glyphs for verification **/ -#define SMUFL_COUNT 560 +#define SMUFL_COUNT 596 } // namespace vrv From c0892cbf1d6d9128fb54401482d6953910044a32 Mon Sep 17 00:00:00 2001 From: Laurent Pugin Date: Fri, 2 Jun 2023 12:32:37 +0200 Subject: [PATCH 112/151] Fix harm spacing with right aligned rend * Fixes #3307 * Test suite evaluated locally --- src/adjustharmgrpsspacingfunctor.cpp | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/src/adjustharmgrpsspacingfunctor.cpp b/src/adjustharmgrpsspacingfunctor.cpp index 2ba6ed7f27..df74ceaaf0 100644 --- a/src/adjustharmgrpsspacingfunctor.cpp +++ b/src/adjustharmgrpsspacingfunctor.cpp @@ -82,12 +82,30 @@ FunctorCode AdjustHarmGrpsSpacingFunctor::VisitHarm(Harm *harm) return FUNCTOR_SIBLINGS; } + // If we have more than one harm at the same position, do not adjust them + // This situation makes sense when the first of them is right aligned + if (m_previousHarmStart && m_previousHarmStart == harm->GetStart()) { + m_previousHarmPositioner = harmPositioner; + return FUNCTOR_SIBLINGS; + } + /************** Calculate the adjustment **************/ assert(harm->GetStart()); assert(harmPositioner); - // Not much to do when we hit the first syllable of the system + // First harm in the system + if (!m_previousMeasure && !m_previousHarmPositioner) { + // Check that is it not overflowing the beginning of the measure + int overflow = harm->GetStart()->GetDrawingX() + harmPositioner->GetContentX1(); + Measure *measure = vrv_cast(harm->GetFirstAncestor(MEASURE)); + if ((overflow < 0) && measure && measure->GetLeftBarLine()) { + m_overlappingHarm.push_back(std::make_tuple( + measure->GetLeftBarLine()->GetAlignment(), harm->GetStart()->GetAlignment(), -overflow)); + } + } + + // Not much to do when we hit the first harm of the system if (m_previousHarmPositioner == NULL) { m_previousHarmStart = harm->GetStart(); m_previousHarmPositioner = harmPositioner; @@ -110,7 +128,7 @@ FunctorCode AdjustHarmGrpsSpacingFunctor::VisitHarm(Harm *harm) overlap += wordSpace; if (overlap > 0) { - // We are adjusting syl in two different measures - move only the right barline of the first measure + // We are adjusting harms in two different measures - move only the right barline of the first measure if (m_previousMeasure) { m_overlappingHarm.push_back(std::make_tuple( m_previousHarmStart->GetAlignment(), m_previousMeasure->GetRightBarLine()->GetAlignment(), overlap)); From 0690d4d35729a1facc640d52f32b49028b351206 Mon Sep 17 00:00:00 2001 From: David Bauer Date: Fri, 2 Jun 2023 08:50:10 +0200 Subject: [PATCH 113/151] Generalize collision avoidance for bracket --- include/vrv/adjusttupletsyfunctor.h | 3 +++ src/adjusttupletsyfunctor.cpp | 34 +++++++++++++++++++---------- 2 files changed, 25 insertions(+), 12 deletions(-) diff --git a/include/vrv/adjusttupletsyfunctor.h b/include/vrv/adjusttupletsyfunctor.h index 8adfe628ac..277df4eaeb 100644 --- a/include/vrv/adjusttupletsyfunctor.h +++ b/include/vrv/adjusttupletsyfunctor.h @@ -57,6 +57,9 @@ class AdjustTupletsYFunctor : public DocFunctor { */ void AdjustTupletBracketBeamY(Tuplet *tuplet, TupletBracket *bracket, const Beam *beam, const Staff *staff) const; + // Calculate the vertical bracket adjustment based on a list of point obstacles + int CalcBracketShift(Point referencePos, double slope, int sign, const std::list &obstacles) const; + public: // private: diff --git a/src/adjusttupletsyfunctor.cpp b/src/adjusttupletsyfunctor.cpp index 5f15d4764f..3c39120ce7 100644 --- a/src/adjusttupletsyfunctor.cpp +++ b/src/adjusttupletsyfunctor.cpp @@ -69,7 +69,8 @@ void AdjustTupletsYFunctor::AdjustTupletBracketY(Tuplet *tuplet, const Staff *st const data_STAFFREL_basic bracketPos = tuplet->GetDrawingBracketPos(); // Default position is above or below the staff - int yRel = (bracketPos == STAFFREL_basic_above) ? 0 : -m_doc->GetDrawingStaffSize(staffSize); + const int staffBoundary = (bracketPos == STAFFREL_basic_above) ? 0 : -m_doc->GetDrawingStaffSize(staffSize); + const Point referencePos(tupletBracket->GetDrawingX(), staff->GetDrawingY() + staffBoundary); // Check for overlap with content // Possible issue with beam above the tuplet - not sure this will be noticeable @@ -77,23 +78,20 @@ void AdjustTupletsYFunctor::AdjustTupletBracketY(Tuplet *tuplet, const Staff *st ClassIdsComparison comparison({ ARTIC, ACCID, BEAM, DOT, FLAG, NOTE, REST, STEM }); tuplet->FindAllDescendantsByComparison(&descendants, &comparison); - const int yReference = staff->GetDrawingY(); + std::list obstacles; for (Object *descendant : descendants) { if (!descendant->HasSelfBB()) continue; if (vrv_cast(descendant)->m_crossStaff) continue; - if (bracketPos == STAFFREL_basic_above) { - int dist = descendant->GetSelfTop() - yReference; - if (yRel < dist) yRel = dist; - } - else { - int dist = descendant->GetSelfBottom() - yReference; - if (yRel > dist) yRel = dist; - } + const int obstacleY + = (bracketPos == STAFFREL_basic_above) ? descendant->GetSelfTop() : descendant->GetSelfBottom(); + obstacles.push_back({ descendant->GetDrawingX(), obstacleY }); } const int sign = (bracketPos == STAFFREL_basic_above) ? 1 : -1; - const int bracketVerticalMargin = sign * m_doc->GetDrawingDoubleUnit(staffSize); - tupletBracket->SetDrawingYRel(tupletBracket->GetDrawingYRel() + yRel + bracketVerticalMargin); + const int horizontalBracketShift = this->CalcBracketShift(referencePos, 0.0, sign, obstacles); + + const int bracketVerticalMargin = m_doc->GetDrawingDoubleUnit(staffSize); + tupletBracket->SetDrawingYRel(staffBoundary + sign * (horizontalBracketShift + bracketVerticalMargin)); } void AdjustTupletsYFunctor::AdjustTupletNumY(Tuplet *tuplet, const Staff *staff) const @@ -280,6 +278,18 @@ void AdjustTupletsYFunctor::AdjustTupletBracketBeamY( } } +int AdjustTupletsYFunctor::CalcBracketShift( + Point referencePos, double slope, int sign, const std::list &obstacles) const +{ + int shift = 0; + for (Point obstacle : obstacles) { + const double lineShift = obstacle.y - slope * obstacle.x; + const int dist = slope * referencePos.x + lineShift - referencePos.y; + shift = std::max(dist * sign, shift); + } + return shift; +} + //---------------------------------------------------------------------------- // AdjustTupletNumOverlapFunctor //---------------------------------------------------------------------------- From a3ec878f3162b7be67a1f75857301b47b29e9cae Mon Sep 17 00:00:00 2001 From: David Bauer Date: Fri, 2 Jun 2023 11:17:08 +0200 Subject: [PATCH 114/151] Calculate angled brackets --- src/adjusttupletsyfunctor.cpp | 33 ++++++++++++++++++++++++++++----- src/elementpart.cpp | 4 ++-- src/view_tuplet.cpp | 4 ++-- 3 files changed, 32 insertions(+), 9 deletions(-) diff --git a/src/adjusttupletsyfunctor.cpp b/src/adjusttupletsyfunctor.cpp index 3c39120ce7..9b83d682c6 100644 --- a/src/adjusttupletsyfunctor.cpp +++ b/src/adjusttupletsyfunctor.cpp @@ -70,12 +70,12 @@ void AdjustTupletsYFunctor::AdjustTupletBracketY(Tuplet *tuplet, const Staff *st // Default position is above or below the staff const int staffBoundary = (bracketPos == STAFFREL_basic_above) ? 0 : -m_doc->GetDrawingStaffSize(staffSize); - const Point referencePos(tupletBracket->GetDrawingX(), staff->GetDrawingY() + staffBoundary); + const int bracketMidX = (tupletBracket->GetDrawingXLeft() + tupletBracket->GetDrawingXRight()) / 2; + const Point referencePos(bracketMidX, staff->GetDrawingY() + staffBoundary); // Check for overlap with content - // Possible issue with beam above the tuplet - not sure this will be noticeable ListOfObjects descendants; - ClassIdsComparison comparison({ ARTIC, ACCID, BEAM, DOT, FLAG, NOTE, REST, STEM }); + ClassIdsComparison comparison({ ARTIC, ACCID, DOT, FLAG, NOTE, REST, STEM }); tuplet->FindAllDescendantsByComparison(&descendants, &comparison); std::list obstacles; @@ -87,11 +87,34 @@ void AdjustTupletsYFunctor::AdjustTupletBracketY(Tuplet *tuplet, const Staff *st obstacles.push_back({ descendant->GetDrawingX(), obstacleY }); } + // Calculate the horizontal bracket first + const int unit = m_doc->GetDrawingUnit(staffSize); const int sign = (bracketPos == STAFFREL_basic_above) ? 1 : -1; const int horizontalBracketShift = this->CalcBracketShift(referencePos, 0.0, sign, obstacles); + int optimalTilt = 0; + int optimalShift = horizontalBracketShift; + + // Now try different angles and possibly find a better position + const int bracketWidth = tupletBracket->GetDrawingXRight() - tupletBracket->GetDrawingXLeft(); + for (int tilt : { -4, -2, 2, 4 }) { + if (bracketWidth == 0) continue; + const double slope = tilt * unit / double(bracketWidth); + const int shift = this->CalcBracketShift(referencePos, slope, sign, obstacles); + // Drop angled brackets that would go into the staff + if (shift < abs(tilt) * unit / 2) continue; + // Drop angled brackets where the midpoint is moved only slightly closer to the staff + if (shift > horizontalBracketShift - abs(tilt) * unit / 4) continue; + // Update the optimal tilt + if (shift < optimalShift) { + optimalShift = shift; + optimalTilt = tilt; + } + } - const int bracketVerticalMargin = m_doc->GetDrawingDoubleUnit(staffSize); - tupletBracket->SetDrawingYRel(staffBoundary + sign * (horizontalBracketShift + bracketVerticalMargin)); + const int verticalMargin = 2 * unit; + tupletBracket->SetDrawingYRel(staffBoundary + sign * (optimalShift + verticalMargin)); + tupletBracket->SetDrawingYRelLeft(-optimalTilt * unit / 2); + tupletBracket->SetDrawingYRelRight(optimalTilt * unit / 2); } void AdjustTupletsYFunctor::AdjustTupletNumY(Tuplet *tuplet, const Staff *staff) const diff --git a/src/elementpart.cpp b/src/elementpart.cpp index 4ee3275c0f..d7a1508e45 100644 --- a/src/elementpart.cpp +++ b/src/elementpart.cpp @@ -180,7 +180,7 @@ int TupletBracket::GetDrawingYLeft() const + m_drawingYRelLeft; } else { - return this->GetDrawingY(); + return this->GetDrawingY() + m_drawingYRelLeft; } } @@ -198,7 +198,7 @@ int TupletBracket::GetDrawingYRight() const + m_drawingYRelRight; } else { - return this->GetDrawingY(); + return this->GetDrawingY() + m_drawingYRelRight; } } diff --git a/src/view_tuplet.cpp b/src/view_tuplet.cpp index bc37cf129f..f79b9e8bd3 100644 --- a/src/view_tuplet.cpp +++ b/src/view_tuplet.cpp @@ -101,8 +101,8 @@ void View::DrawTupletBracket(DeviceContext *dc, LayerElement *element, Layer *la const int unit = m_doc->GetDrawingUnit(staff->m_drawingStaffSize); const int lineWidth = m_doc->GetDrawingUnit(staff->m_drawingStaffSize) * m_options->m_tupletBracketThickness.GetValue(); - const int xLeft = tuplet->GetDrawingLeft()->GetDrawingX() + tupletBracket->GetDrawingXRelLeft() + lineWidth / 2; - const int xRight = tuplet->GetDrawingRight()->GetDrawingX() + tupletBracket->GetDrawingXRelRight() - lineWidth / 2; + const int xLeft = tupletBracket->GetDrawingXLeft() + lineWidth / 2; + const int xRight = tupletBracket->GetDrawingXRight() - lineWidth / 2; const int yLeft = tupletBracket->GetDrawingYLeft(); const int yRight = tupletBracket->GetDrawingYRight(); int bracketHeight = (tuplet->GetDrawingBracketPos() == STAFFREL_basic_above) ? -1 : 1; From 29b3d5e3bb7168197999b32ea8f9d1b9655021e3 Mon Sep 17 00:00:00 2001 From: David Bauer Date: Fri, 2 Jun 2023 11:50:01 +0200 Subject: [PATCH 115/151] Check against melodic direction --- include/vrv/tuplet.h | 8 ++++++++ src/adjusttupletsyfunctor.cpp | 5 +++++ src/tuplet.cpp | 21 +++++++++++++++++++++ 3 files changed, 34 insertions(+) diff --git a/include/vrv/tuplet.h b/include/vrv/tuplet.h index ce96f6a51c..d16781344b 100644 --- a/include/vrv/tuplet.h +++ b/include/vrv/tuplet.h @@ -18,6 +18,9 @@ namespace vrv { class Note; class TupletBracket; +// Helper enum classes +enum class MelodicDirection { None, Up, Down }; + //---------------------------------------------------------------------------- // Tuplet //---------------------------------------------------------------------------- @@ -89,6 +92,11 @@ class Tuplet : public LayerElement, void ResetInnerSlurs() { m_innerSlurs.clear(); } ///@} + /** + * Determine the melodic direction + */ + MelodicDirection GetMelodicDirection() const; + /** * Calculate the position of the bracket and the num looking at the stem direction or at the encoded values (if * any). Called in View::DrawTuplet the first time it is called (and not trough a dedicated CalcTuplet functor) diff --git a/src/adjusttupletsyfunctor.cpp b/src/adjusttupletsyfunctor.cpp index 9b83d682c6..fc02178d36 100644 --- a/src/adjusttupletsyfunctor.cpp +++ b/src/adjusttupletsyfunctor.cpp @@ -96,8 +96,13 @@ void AdjustTupletsYFunctor::AdjustTupletBracketY(Tuplet *tuplet, const Staff *st // Now try different angles and possibly find a better position const int bracketWidth = tupletBracket->GetDrawingXRight() - tupletBracket->GetDrawingXLeft(); + const MelodicDirection direction = tuplet->GetMelodicDirection(); for (int tilt : { -4, -2, 2, 4 }) { if (bracketWidth == 0) continue; + // Drop if angle does not fit to the melodic direction + if ((direction == MelodicDirection::Up) && (tilt < 0)) continue; + if ((direction == MelodicDirection::Down) && (tilt > 0)) continue; + // Calculate the shift for the angle const double slope = tilt * unit / double(bracketWidth); const int shift = this->CalcBracketShift(referencePos, slope, sign, obstacles); // Drop angled brackets that would go into the staff diff --git a/src/tuplet.cpp b/src/tuplet.cpp index 5b7d2a29f5..9058f4b48d 100644 --- a/src/tuplet.cpp +++ b/src/tuplet.cpp @@ -156,6 +156,27 @@ void Tuplet::FilterList(ListOfConstObjects &childList) const } } +MelodicDirection Tuplet::GetMelodicDirection() const +{ + const LayerElement *leftElement = this->GetDrawingLeft(); + const Note *leftNote = NULL; + if (leftElement->Is(NOTE)) leftNote = vrv_cast(leftElement); + if (leftElement->Is(CHORD)) leftNote = vrv_cast(leftElement)->GetTopNote(); + + const LayerElement *rightElement = this->GetDrawingRight(); + const Note *rightNote = NULL; + if (rightElement->Is(NOTE)) rightNote = vrv_cast(rightElement); + if (rightElement->Is(CHORD)) rightNote = vrv_cast(rightElement)->GetTopNote(); + + if (leftNote && rightNote) { + const int leftPitch = leftNote->GetDiatonicPitch(); + const int rightPitch = rightNote->GetDiatonicPitch(); + if (leftPitch < rightPitch) return MelodicDirection::Up; + if (leftPitch > rightPitch) return MelodicDirection::Down; + } + return MelodicDirection::None; +} + void Tuplet::CalculateTupletNumCrossStaff(LayerElement *layerElement) { assert(layerElement); From e131d556266bae2a57b435aaeb999a40695df746 Mon Sep 17 00:00:00 2001 From: David Bauer Date: Fri, 2 Jun 2023 12:05:28 +0200 Subject: [PATCH 116/151] Improve code style Prefer ranged based loop and pre increment --- src/tuplet.cpp | 22 +++++++++------------- 1 file changed, 9 insertions(+), 13 deletions(-) diff --git a/src/tuplet.cpp b/src/tuplet.cpp index 9058f4b48d..13964ad033 100644 --- a/src/tuplet.cpp +++ b/src/tuplet.cpp @@ -267,29 +267,27 @@ void Tuplet::CalcDrawingBracketAndNumPos(bool tupletNumHead) // The first step is to calculate all the stem directions // cycle into the elements and count the up and down dirs - ListOfObjects::const_iterator iter = tupletChildren.begin(); - while (iter != tupletChildren.end()) { - if ((*iter)->Is(CHORD)) { - Chord *currentChord = vrv_cast(*iter); + for (Object *child : tupletChildren) { + if (child->Is(CHORD)) { + Chord *currentChord = vrv_cast(child); assert(currentChord); if (currentChord->GetDrawingStemDir() == STEMDIRECTION_up) { - ups++; + ++ups; } else { - downs++; + ++downs; } } - else if ((*iter)->Is(NOTE)) { - Note *currentNote = vrv_cast(*iter); + else if (child->Is(NOTE)) { + Note *currentNote = vrv_cast(child); assert(currentNote); if (!currentNote->IsChordTone() && (currentNote->GetDrawingStemDir() == STEMDIRECTION_up)) { - ups++; + ++ups; } if (!currentNote->IsChordTone() && (currentNote->GetDrawingStemDir() == STEMDIRECTION_down)) { - downs++; + ++downs; } } - ++iter; } // true means up m_drawingBracketPos = ups > downs ? STAFFREL_basic_above : STAFFREL_basic_below; @@ -303,8 +301,6 @@ void Tuplet::CalcDrawingBracketAndNumPos(bool tupletNumHead) if (m_drawingNumPos == STAFFREL_basic_NONE) { m_drawingNumPos = m_drawingBracketPos; } - - return; } void Tuplet::GetDrawingLeftRightXRel(int &xRelLeft, int &xRelRight, const Doc *doc) const From d50ee75e1aba4a200f1641c216a9a2d082270330 Mon Sep 17 00:00:00 2001 From: Klaus Rettinghaus Date: Mon, 5 Jun 2023 09:36:26 +0200 Subject: [PATCH 117/151] adjust circle enclosing to ellipse --- src/view_control.cpp | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/src/view_control.cpp b/src/view_control.cpp index 45b4a5a506..d2f9d15f5b 100644 --- a/src/view_control.cpp +++ b/src/view_control.cpp @@ -2953,13 +2953,14 @@ void View::DrawTextEnclosure(DeviceContext *dc, const TextDrawingParams ¶ms, this->DrawDiamond(dc, x1 - width / 2, yCenter, height * sqrt(2), width * 2, false, lineThickness); } else if (params.m_enclose == TEXTRENDITION_circle) { - if (width > height) { - y1 -= (width - height) / 2; - y2 += (width - height) / 2; + if (height > width) { + const int cx = x1 + (x2 - x1) / 2; + x1 = cx - height / 2; + x2 = cx + height / 2; } - else if (height > width) { - x1 -= (height - width) / 2; - x2 += (height - width) / 2; + else if (height < width) { + x1 -= width / 8; + x2 += width / 8; } this->DrawNotFilledEllipse(dc, x1, y1, x2, y2, lineThickness); } From 65a4e0e06ee0a3fe0a3b74f3b5edd7c0453f4964 Mon Sep 17 00:00:00 2001 From: Klaus Rettinghaus Date: Mon, 5 Jun 2023 16:22:09 +0200 Subject: [PATCH 118/151] add comment --- src/view_control.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/view_control.cpp b/src/view_control.cpp index d2f9d15f5b..aa711b1d72 100644 --- a/src/view_control.cpp +++ b/src/view_control.cpp @@ -2954,6 +2954,7 @@ void View::DrawTextEnclosure(DeviceContext *dc, const TextDrawingParams ¶ms, } else if (params.m_enclose == TEXTRENDITION_circle) { if (height > width) { + // in this case draw a perfect circle const int cx = x1 + (x2 - x1) / 2; x1 = cx - height / 2; x2 = cx + height / 2; From d1b6843e8451392f79816c5eb50198b84381197b Mon Sep 17 00:00:00 2001 From: David Bauer Date: Tue, 6 Jun 2023 08:38:47 +0200 Subject: [PATCH 119/151] Set plist reference during functor processing --- include/vrv/preparedatafunctor.h | 1 - include/vrv/vrvdef.h | 2 +- src/doc.cpp | 5 ----- src/preparedatafunctor.cpp | 11 +++++++---- 4 files changed, 8 insertions(+), 11 deletions(-) diff --git a/include/vrv/preparedatafunctor.h b/include/vrv/preparedatafunctor.h index dfacf5a80a..b54a5b885c 100644 --- a/include/vrv/preparedatafunctor.h +++ b/include/vrv/preparedatafunctor.h @@ -332,7 +332,6 @@ class PreparePlistFunctor : public Functor, public CollectAndProcess { ///@{ const ArrayOfPlistInterfaceIDTuples &GetInterfaceIDTuples() const { return m_interfaceIDTuples; } void InsertInterfaceIDTuple(const std::string &elementID, PlistInterface *interface); - void ClearInterfaceIDTuples() { m_interfaceIDTuples.clear(); } ///@} /* diff --git a/include/vrv/vrvdef.h b/include/vrv/vrvdef.h index 8aebcedb1e..ff1965c7d3 100644 --- a/include/vrv/vrvdef.h +++ b/include/vrv/vrvdef.h @@ -348,7 +348,7 @@ typedef std::multimap MapOfLinkingInterfaceIDPa typedef std::map MapOfNoteIDPairs; -typedef std::vector> ArrayOfPlistInterfaceIDTuples; +typedef std::vector> ArrayOfPlistInterfaceIDTuples; typedef std::vector ArrayOfCurveSpannedElements; diff --git a/src/doc.cpp b/src/doc.cpp index 41ac501f06..255ae89d5b 100644 --- a/src/doc.cpp +++ b/src/doc.cpp @@ -665,11 +665,6 @@ void Doc::PrepareData() // Process plist after all pairs have been collected if (!preparePlist.GetInterfaceIDTuples().empty()) { this->Process(preparePlist); - - for (const auto &[plistInterface, id, objectReference] : preparePlist.GetInterfaceIDTuples()) { - plistInterface->SetRef(objectReference); - } - preparePlist.ClearInterfaceIDTuples(); } // If some are still there, then it is probably an issue in the encoding diff --git a/src/preparedatafunctor.cpp b/src/preparedatafunctor.cpp index bc2f920b99..e0b11426c5 100644 --- a/src/preparedatafunctor.cpp +++ b/src/preparedatafunctor.cpp @@ -471,7 +471,7 @@ PreparePlistFunctor::PreparePlistFunctor() : Functor(), CollectAndProcess() {} void PreparePlistFunctor::InsertInterfaceIDTuple(const std::string &elementID, PlistInterface *interface) { - m_interfaceIDTuples.push_back(std::make_tuple(interface, elementID, (Object *)NULL)); + m_interfaceIDTuples.push_back(std::make_tuple(interface, elementID)); } FunctorCode PreparePlistFunctor::VisitObject(Object *object) @@ -486,11 +486,14 @@ FunctorCode PreparePlistFunctor::VisitObject(Object *object) else { if (!object->IsLayerElement()) return FUNCTOR_CONTINUE; - std::string id = object->GetID(); + const std::string &id = object->GetID(); auto i = std::find_if(m_interfaceIDTuples.begin(), m_interfaceIDTuples.end(), - [&id](std::tuple tuple) { return (std::get<1>(tuple) == id); }); + [&id](std::tuple tuple) { return (std::get<1>(tuple) == id); }); if (i != m_interfaceIDTuples.end()) { - std::get<2>(*i) = object; + // Set reference for matched tuple and erase it from the list + PlistInterface *interface = std::get<0>(*i); + interface->SetRef(object); + m_interfaceIDTuples.erase(i); } } From cb2ff7c3360cd9c5f0577494d35a369014f54210 Mon Sep 17 00:00:00 2001 From: David Bauer Date: Tue, 6 Jun 2023 09:08:15 +0200 Subject: [PATCH 120/151] Replace tuple by pair --- include/vrv/preparedatafunctor.h | 10 +++++----- include/vrv/vrvdef.h | 2 +- src/doc.cpp | 7 +++---- src/plistinterface.cpp | 2 +- src/preparedatafunctor.cpp | 15 +++++++-------- 5 files changed, 17 insertions(+), 19 deletions(-) diff --git a/include/vrv/preparedatafunctor.h b/include/vrv/preparedatafunctor.h index b54a5b885c..ba70385fbf 100644 --- a/include/vrv/preparedatafunctor.h +++ b/include/vrv/preparedatafunctor.h @@ -327,11 +327,11 @@ class PreparePlistFunctor : public Functor, public CollectAndProcess { bool ImplementsEndInterface() const override { return false; } /* - * Getter and modifier for the interface / id tuples + * Getter and modifier for the interface / id pairs */ ///@{ - const ArrayOfPlistInterfaceIDTuples &GetInterfaceIDTuples() const { return m_interfaceIDTuples; } - void InsertInterfaceIDTuple(const std::string &elementID, PlistInterface *interface); + const ArrayOfPlistInterfaceIDPairs &GetInterfaceIDPairs() const { return m_interfaceIDPairs; } + void InsertInterfaceIDPair(const std::string &elementID, PlistInterface *interface); ///@} /* @@ -348,8 +348,8 @@ class PreparePlistFunctor : public Functor, public CollectAndProcess { public: // private: - // Holds the interface / id tuples to match - ArrayOfPlistInterfaceIDTuples m_interfaceIDTuples; + // Holds the interface / id pairs to match + ArrayOfPlistInterfaceIDPairs m_interfaceIDPairs; }; //---------------------------------------------------------------------------- diff --git a/include/vrv/vrvdef.h b/include/vrv/vrvdef.h index ff1965c7d3..26d5072727 100644 --- a/include/vrv/vrvdef.h +++ b/include/vrv/vrvdef.h @@ -348,7 +348,7 @@ typedef std::multimap MapOfLinkingInterfaceIDPa typedef std::map MapOfNoteIDPairs; -typedef std::vector> ArrayOfPlistInterfaceIDTuples; +typedef std::vector> ArrayOfPlistInterfaceIDPairs; typedef std::vector ArrayOfCurveSpannedElements; diff --git a/src/doc.cpp b/src/doc.cpp index 255ae89d5b..dcdb1910a9 100644 --- a/src/doc.cpp +++ b/src/doc.cpp @@ -663,14 +663,13 @@ void Doc::PrepareData() preparePlist.SetDataCollectionCompleted(); // Process plist after all pairs have been collected - if (!preparePlist.GetInterfaceIDTuples().empty()) { + if (!preparePlist.GetInterfaceIDPairs().empty()) { this->Process(preparePlist); } // If some are still there, then it is probably an issue in the encoding - if (!preparePlist.GetInterfaceIDTuples().empty()) { - LogWarning( - "%d element(s) with a @plist could not match the target", preparePlist.GetInterfaceIDTuples().size()); + if (!preparePlist.GetInterfaceIDPairs().empty()) { + LogWarning("%d element(s) with a @plist could not match the target", preparePlist.GetInterfaceIDPairs().size()); } /************ Resolve cross staff ************/ diff --git a/src/plistinterface.cpp b/src/plistinterface.cpp index 65915ea426..157210045f 100644 --- a/src/plistinterface.cpp +++ b/src/plistinterface.cpp @@ -106,7 +106,7 @@ FunctorCode PlistInterface::InterfacePreparePlist(PreparePlistFunctor &functor, std::vector::iterator iter; for (iter = m_ids.begin(); iter != m_ids.end(); ++iter) { - functor.InsertInterfaceIDTuple(*iter, this); + functor.InsertInterfaceIDPair(*iter, this); } return FUNCTOR_CONTINUE; diff --git a/src/preparedatafunctor.cpp b/src/preparedatafunctor.cpp index e0b11426c5..ac7bcc38c7 100644 --- a/src/preparedatafunctor.cpp +++ b/src/preparedatafunctor.cpp @@ -469,9 +469,9 @@ void PrepareLinkingFunctor::ResolveStemSameas(Note *note) PreparePlistFunctor::PreparePlistFunctor() : Functor(), CollectAndProcess() {} -void PreparePlistFunctor::InsertInterfaceIDTuple(const std::string &elementID, PlistInterface *interface) +void PreparePlistFunctor::InsertInterfaceIDPair(const std::string &elementID, PlistInterface *interface) { - m_interfaceIDTuples.push_back(std::make_tuple(interface, elementID)); + m_interfaceIDPairs.push_back(std::make_pair(interface, elementID)); } FunctorCode PreparePlistFunctor::VisitObject(Object *object) @@ -487,13 +487,12 @@ FunctorCode PreparePlistFunctor::VisitObject(Object *object) if (!object->IsLayerElement()) return FUNCTOR_CONTINUE; const std::string &id = object->GetID(); - auto i = std::find_if(m_interfaceIDTuples.begin(), m_interfaceIDTuples.end(), - [&id](std::tuple tuple) { return (std::get<1>(tuple) == id); }); - if (i != m_interfaceIDTuples.end()) { + auto iter = std::find_if(m_interfaceIDPairs.begin(), m_interfaceIDPairs.end(), + [&id](const std::pair &pair) { return (pair.second == id); }); + if (iter != m_interfaceIDPairs.end()) { // Set reference for matched tuple and erase it from the list - PlistInterface *interface = std::get<0>(*i); - interface->SetRef(object); - m_interfaceIDTuples.erase(i); + iter->first->SetRef(object); + m_interfaceIDPairs.erase(iter); } } From d012ac234f609f701f9e96bfba03230b5ff93730 Mon Sep 17 00:00:00 2001 From: David Bauer Date: Tue, 6 Jun 2023 09:13:03 +0200 Subject: [PATCH 121/151] Remove unused variable --- src/scoredef.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/scoredef.cpp b/src/scoredef.cpp index d84f16f6d5..40ff1bfe4b 100644 --- a/src/scoredef.cpp +++ b/src/scoredef.cpp @@ -393,7 +393,6 @@ void ScoreDef::ReplaceDrawingValues(const StaffDef *newStaffDef) if (newStaffDef->HasMensurInfo()) { // If there is a mensur and the meterSig // is invisible, then print mensur instead - data_METERFORM meterForm = meterSig->GetForm(); if (meterSig->GetVisible() == BOOLEAN_false) { staffDef->SetDrawMeterSig(false); staffDef->SetDrawMensur(true); From b8c43580041de4e4fdf00a9011d19de46892c181 Mon Sep 17 00:00:00 2001 From: David Bauer Date: Tue, 6 Jun 2023 10:10:59 +0200 Subject: [PATCH 122/151] Update comment --- src/preparedatafunctor.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/preparedatafunctor.cpp b/src/preparedatafunctor.cpp index ac7bcc38c7..e3d69c70de 100644 --- a/src/preparedatafunctor.cpp +++ b/src/preparedatafunctor.cpp @@ -490,7 +490,7 @@ FunctorCode PreparePlistFunctor::VisitObject(Object *object) auto iter = std::find_if(m_interfaceIDPairs.begin(), m_interfaceIDPairs.end(), [&id](const std::pair &pair) { return (pair.second == id); }); if (iter != m_interfaceIDPairs.end()) { - // Set reference for matched tuple and erase it from the list + // Set reference for matched pair and erase it from the list iter->first->SetRef(object); m_interfaceIDPairs.erase(iter); } From 387ee17d72c3f203fe8d534ec102aeac80ced283 Mon Sep 17 00:00:00 2001 From: Alpha Date: Tue, 6 Jun 2023 10:33:45 -0400 Subject: [PATCH 123/151] support json UTF-16 surrogate decoding --- src/json/jsonxx.cc | 63 +++++++++++++++++++++++++++++++--------------- 1 file changed, 43 insertions(+), 20 deletions(-) diff --git a/src/json/jsonxx.cc b/src/json/jsonxx.cc index 302a155088..d051cb84d9 100644 --- a/src/json/jsonxx.cc +++ b/src/json/jsonxx.cc @@ -116,28 +116,51 @@ bool parse_string(std::istream& input, String& value) { break; case 'u': { int i; - std::stringstream ss; - for( i = 0; (!input.eof() && input.good()) && i < 4; ++i ) { - input.get(ch); - ss << std::hex << ch; + { + std::stringstream ss; + for (i = 0; (!input.eof() && input.good()) && i < 4; ++i) { + input.get(ch); + ss << std::hex << ch; + } + if (!input.good() || !(ss >> i)) { + break; + } } - if (input.good() && (ss >> i)) { - // Encode codepoint via utf-8. - if (i < 0x80) { - value.push_back(static_cast(i)); - } else if (i < 0x800) { - value.push_back(static_cast((i >> 6) | 0xc0)); - value.push_back(static_cast((i & 0x3f) | 0x80)); - } else if (i < 0x10000) { - value.push_back(static_cast((i >> 12) | 0xe0)); - value.push_back(static_cast(((i >> 6) & 0x3f) | 0x80)); - value.push_back(static_cast((i & 0x3f) | 0x80)); - } else { - value.push_back(static_cast((i >> 18) | 0xf0)); - value.push_back(static_cast(((i >> 12) & 0x3f) | 0x80)); - value.push_back(static_cast(((i >> 6) & 0x3f) | 0x80)); - value.push_back(static_cast((i & 0x3f) | 0x80)); + + // Decode UTF-16 surrogate pair. + if (0xd800 <= i && i <= 0xdbff) { + if (!match("\\u", input)) { + break; + } + int j; + std::stringstream ss; + for (j = 0; (!input.eof() && input.good()) && j < 4; ++j) { + input.get(ch); + ss << std::hex << ch; } + if (!input.good() || !(ss >> j)) { + break; + } + i = static_cast( + (static_cast(i) << 10) + + static_cast(j) - 0x35fdc00u); + } + + // Encode codepoint via UTF-8. + if (i < 0x80) { + value.push_back(static_cast(i)); + } else if (i < 0x800) { + value.push_back(static_cast((i >> 6) | 0xc0)); + value.push_back(static_cast((i & 0x3f) | 0x80)); + } else if (i < 0x10000) { + value.push_back(static_cast((i >> 12) | 0xe0)); + value.push_back(static_cast(((i >> 6) & 0x3f) | 0x80)); + value.push_back(static_cast((i & 0x3f) | 0x80)); + } else { + value.push_back(static_cast((i >> 18) | 0xf0)); + value.push_back(static_cast(((i >> 12) & 0x3f) | 0x80)); + value.push_back(static_cast(((i >> 6) & 0x3f) | 0x80)); + value.push_back(static_cast((i & 0x3f) | 0x80)); } } break; From 9547d8d842f0a776674d4843ca6b3796ae290b08 Mon Sep 17 00:00:00 2001 From: Chanjung Kim Date: Wed, 7 Jun 2023 10:11:34 +0900 Subject: [PATCH 124/151] Fix MusicXML spread handling Made MusicXmlInput ignore spread at the start of a crescendo or or the end of a diminuendo. --- src/iomusxml.cpp | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/src/iomusxml.cpp b/src/iomusxml.cpp index 0ef666da4e..4c4d0afb7f 100644 --- a/src/iomusxml.cpp +++ b/src/iomusxml.cpp @@ -2229,10 +2229,12 @@ void MusicXmlInput::ReadMusicXmlDirection( if (wedge->node().attribute("niente")) { iter->first->SetNiente(ConvertWordToBool(wedge->node().attribute("niente").as_string())); } - if (wedge->node().attribute("spread")) { - data_MEASUREMENTSIGNED opening; - opening.SetVu(wedge->node().attribute("spread").as_double() / 5); - iter->first->SetOpening(opening); + if (iter->first->GetForm() == hairpinLog_FORM_cres) { + if (wedge->node().attribute("spread")) { + data_MEASUREMENTSIGNED opening; + opening.SetVu(wedge->node().attribute("spread").as_double() / 5); + iter->first->SetOpening(opening); + } } matchedWedge = true; m_hairpinStack.erase(iter); @@ -2252,6 +2254,11 @@ void MusicXmlInput::ReadMusicXmlDirection( } else if (HasAttributeWithValue(wedge->node(), "type", "diminuendo")) { hairpin->SetForm(hairpinLog_FORM_dim); + if (wedge->node().attribute("spread")) { + data_MEASUREMENTSIGNED opening; + opening.SetVu(wedge->node().attribute("spread").as_double() / 5); + hairpin->SetOpening(opening); + } } else { delete hairpin; From fb076aee76cebec12150feff7907f4d43b52fb59 Mon Sep 17 00:00:00 2001 From: David Bauer Date: Wed, 7 Jun 2023 21:48:06 +0200 Subject: [PATCH 125/151] Get directional CutOut boundary --- include/vrv/boundingbox.h | 12 ++++++-- src/boundingbox.cpp | 63 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 72 insertions(+), 3 deletions(-) diff --git a/include/vrv/boundingbox.h b/include/vrv/boundingbox.h index 1790c1933e..c4c7e1a330 100644 --- a/include/vrv/boundingbox.h +++ b/include/vrv/boundingbox.h @@ -161,6 +161,9 @@ class BoundingBox { int GetCutOutBottom(const Resources &resources) const; int GetCutOutLeft(const Resources &resources) const; int GetCutOutRight(const Resources &resources) const; + // Restricted version which only considers the cutout rectangles from the top or bottom + int GetCutOutLeft(const Resources &resources, bool fromTop) const; + int GetCutOutRight(const Resources &resources, bool fromTop) const; ///@} /** @@ -267,13 +270,16 @@ class BoundingBox { private: /** - * Get the rectangles covering the inside of a bounding box given two anchors (e.g., NW and NE, or NE and SE) - * Looks at the anchors for the smufl glpyh (if any) and return the number of rectangles needed to represent the + * Get the rectangles covering the inside of a bounding box given one or two anchors (e.g., NW and NE, or NE and SE) + * Looks at the anchors for the smufl glyph (if any) and return the number of rectangles needed to represent the * bounding box. - * Return 1 with no smufl glyph or no anchor, 2 with on anchor point, and 3 with 2 anchor points. + * Return 1 with no smufl glyph or no anchor, 2 with one anchor point, and 3 with 2 anchor points. */ + ///@{ + int GetRectangles(const SMuFLGlyphAnchor &anchor, Point rect[2][2], const Resources &resources) const; int GetRectangles(const SMuFLGlyphAnchor &anchor1, const SMuFLGlyphAnchor &anchor2, Point rect[3][2], const Resources &resources) const; + ///@} /** * Calculate the rectangles with 2 anchor points. diff --git a/src/boundingbox.cpp b/src/boundingbox.cpp index 69b2bb6917..3949d41456 100644 --- a/src/boundingbox.cpp +++ b/src/boundingbox.cpp @@ -303,6 +303,31 @@ int BoundingBox::VerticalBottomOverlap(const BoundingBox *other, const Doc *doc, return overlap; } +int BoundingBox::GetRectangles(const SMuFLGlyphAnchor &anchor, Point rect[2][2], const Resources &resources) const +{ + const Glyph *glyph = NULL; + + bool glyphRect = true; + + if (m_smuflGlyph != 0) { + glyph = resources.GetGlyph(m_smuflGlyph); + assert(glyph); + + if (glyph->HasAnchor(anchor)) { + glyphRect = this->GetGlyph1PointRectangles(anchor, glyph, rect); + if (glyphRect) return 2; + } + } + if (!glyphRect) { + LogDebug("Illogical values for anchor points in glyph '%02x'", m_smuflGlyph); + } + + rect[0][0] = Point(this->GetSelfLeft(), this->GetSelfTop()); + rect[0][1] = Point(this->GetSelfRight(), this->GetSelfBottom()); + + return 1; +} + int BoundingBox::GetRectangles(const SMuFLGlyphAnchor &anchor1, const SMuFLGlyphAnchor &anchor2, Point rect[3][2], const Resources &resources) const { @@ -558,6 +583,44 @@ int BoundingBox::GetCutOutRight(const Resources &resources) const return rightValues[1]; } +int BoundingBox::GetCutOutLeft(const Resources &resources, bool fromTop) const +{ + const SMuFLGlyphAnchor anchor = fromTop ? SMUFL_cutOutNW : SMUFL_cutOutSW; + + Point BBrect[2][2]; + + const int rectangleCount = this->GetRectangles(anchor, BBrect, resources); + std::vector leftValues; + for (int i = 0; i < rectangleCount; ++i) { + leftValues.push_back(BBrect[i][0].x); + } + assert(!leftValues.empty()); + + // Return the second smallest value (if there are at least two) + if (leftValues.size() == 1) return leftValues[0]; + std::sort(leftValues.begin(), leftValues.end()); + return leftValues[1]; +} + +int BoundingBox::GetCutOutRight(const Resources &resources, bool fromTop) const +{ + const SMuFLGlyphAnchor anchor = fromTop ? SMUFL_cutOutNE : SMUFL_cutOutSE; + + Point BBrect[2][2]; + + const int rectangleCount = this->GetRectangles(anchor, BBrect, resources); + std::vector rightValues; + for (int i = 0; i < rectangleCount; ++i) { + rightValues.push_back(BBrect[i][1].x); + } + assert(!rightValues.empty()); + + // Return the second largest value (if there are at least two) + if (rightValues.size() == 1) return rightValues[0]; + std::sort(rightValues.begin(), rightValues.end(), std::greater()); + return rightValues[1]; +} + bool BoundingBox::Encloses(const Point point) const { if (this->GetContentRight() < point.x) return false; From 7e55712dc428c651b8ca5e8e49dd760704893667 Mon Sep 17 00:00:00 2001 From: David Bauer Date: Wed, 7 Jun 2023 21:58:08 +0200 Subject: [PATCH 126/151] Refine accid ledger line collision handling for flats --- src/accid.cpp | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/src/accid.cpp b/src/accid.cpp index db5ef970cd..4f3ba9b2de 100644 --- a/src/accid.cpp +++ b/src/accid.cpp @@ -91,14 +91,21 @@ void Accid::AdjustToLedgerLines(const Doc *doc, LayerElement *element, int staff const int rightMargin = doc->GetRightMargin(ACCID) * unit; if (element->Is(NOTE) && chord && chord->HasAdjacentNotesInStaff(staff)) { const int horizontalMargin = doc->GetOptions()->m_ledgerLineExtension.GetValue() * unit + 0.5 * rightMargin; - const int drawingUnit = doc->GetDrawingUnit(staffSize); const int staffTop = staff->GetDrawingY(); const int staffBottom = staffTop - doc->GetDrawingStaffSize(staffSize); if (this->HorizontalContentOverlap(element, 0)) { - if (((this->GetContentTop() > staffTop + 2 * drawingUnit) && (this->GetDrawingY() < element->GetDrawingY())) - || ((this->GetContentBottom() < staffBottom - 2 * drawingUnit) + if (((this->GetContentTop() > staffTop + 2 * unit) && (this->GetDrawingY() < element->GetDrawingY())) + || ((this->GetContentBottom() < staffBottom - 2 * unit) && (this->GetDrawingY() > element->GetDrawingY()))) { - const int xRelShift = this->GetSelfRight() - element->GetSelfLeft() + horizontalMargin; + int right = this->GetSelfRight(); + // Special case: Reduce shift for flats intersecting only the first ledger line above the staff + if ((this->GetAccid() == ACCIDENTAL_WRITTEN_f) || (this->GetAccid() == ACCIDENTAL_WRITTEN_ff)) { + if ((this->GetContentTop() > staffTop + 2 * unit) + && (this->GetContentTop() < staffTop + 4 * unit)) { + right = this->GetCutOutRight(doc->GetResources(), true); + } + } + const int xRelShift = right - element->GetSelfLeft() + horizontalMargin; if (xRelShift > 0) this->SetDrawingXRel(this->GetDrawingXRel() - xRelShift); } } From 65d33012e5227778c3fe89505e1926149ca71ea4 Mon Sep 17 00:00:00 2001 From: David Bauer Date: Wed, 7 Jun 2023 22:35:11 +0200 Subject: [PATCH 127/151] Add option to switch angled brackets on/off --- include/vrv/options.h | 1 + src/adjusttupletsyfunctor.cpp | 40 ++++++++++++++++++----------------- src/options.cpp | 4 ++++ 3 files changed, 26 insertions(+), 19 deletions(-) diff --git a/include/vrv/options.h b/include/vrv/options.h index 75686be529..30f05f065f 100644 --- a/include/vrv/options.h +++ b/include/vrv/options.h @@ -742,6 +742,7 @@ class Options { OptionDbl m_tieEndpointThickness; OptionDbl m_tieMidpointThickness; OptionDbl m_tieMinLength; + OptionBool m_tupletAngledOnBeams; OptionDbl m_tupletBracketThickness; OptionBool m_tupletNumHead; diff --git a/src/adjusttupletsyfunctor.cpp b/src/adjusttupletsyfunctor.cpp index fc02178d36..c387f0351c 100644 --- a/src/adjusttupletsyfunctor.cpp +++ b/src/adjusttupletsyfunctor.cpp @@ -94,25 +94,27 @@ void AdjustTupletsYFunctor::AdjustTupletBracketY(Tuplet *tuplet, const Staff *st int optimalTilt = 0; int optimalShift = horizontalBracketShift; - // Now try different angles and possibly find a better position - const int bracketWidth = tupletBracket->GetDrawingXRight() - tupletBracket->GetDrawingXLeft(); - const MelodicDirection direction = tuplet->GetMelodicDirection(); - for (int tilt : { -4, -2, 2, 4 }) { - if (bracketWidth == 0) continue; - // Drop if angle does not fit to the melodic direction - if ((direction == MelodicDirection::Up) && (tilt < 0)) continue; - if ((direction == MelodicDirection::Down) && (tilt > 0)) continue; - // Calculate the shift for the angle - const double slope = tilt * unit / double(bracketWidth); - const int shift = this->CalcBracketShift(referencePos, slope, sign, obstacles); - // Drop angled brackets that would go into the staff - if (shift < abs(tilt) * unit / 2) continue; - // Drop angled brackets where the midpoint is moved only slightly closer to the staff - if (shift > horizontalBracketShift - abs(tilt) * unit / 4) continue; - // Update the optimal tilt - if (shift < optimalShift) { - optimalShift = shift; - optimalTilt = tilt; + if (!m_doc->GetOptions()->m_tupletAngledOnBeams.GetValue()) { + // Now try different angles and possibly find a better position + const int bracketWidth = tupletBracket->GetDrawingXRight() - tupletBracket->GetDrawingXLeft(); + const MelodicDirection direction = tuplet->GetMelodicDirection(); + for (int tilt : { -4, -2, 2, 4 }) { + if (bracketWidth == 0) continue; + // Drop if angle does not fit to the melodic direction + if ((direction == MelodicDirection::Up) && (tilt < 0)) continue; + if ((direction == MelodicDirection::Down) && (tilt > 0)) continue; + // Calculate the shift for the angle + const double slope = tilt * unit / double(bracketWidth); + const int shift = this->CalcBracketShift(referencePos, slope, sign, obstacles); + // Drop angled brackets that would go into the staff + if (shift < abs(tilt) * unit / 2) continue; + // Drop angled brackets where the midpoint is moved only slightly closer to the staff + if (shift > horizontalBracketShift - abs(tilt) * unit / 4) continue; + // Update the optimal tilt + if (shift < optimalShift) { + optimalShift = shift; + optimalTilt = tilt; + } } } diff --git a/src/options.cpp b/src/options.cpp index acb5902a30..3f94e0f70f 100644 --- a/src/options.cpp +++ b/src/options.cpp @@ -1524,6 +1524,10 @@ Options::Options() m_tieMinLength.Init(2.0, 0.0, 10.0); this->Register(&m_tieMinLength, "tieMinLength", &m_generalLayout); + m_tupletAngledOnBeams.SetInfo("Tuplet angled on beams", "Tuplet brackets angled on beams only"); + m_tupletAngledOnBeams.Init(false); + this->Register(&m_tupletAngledOnBeams, "tupletAngledOnBeams", &m_generalLayout); + m_tupletBracketThickness.SetInfo("Tuplet bracket thickness", "The thickness of the tuplet bracket"); m_tupletBracketThickness.Init(0.2, 0.1, 0.8); this->Register(&m_tupletBracketThickness, "tupletBracketThickness", &m_generalLayout); From fca8a10342fdeec3b58d03f1d477cbfcdd393cd9 Mon Sep 17 00:00:00 2001 From: Klaus Rettinghaus Date: Fri, 9 Jun 2023 14:59:59 +0200 Subject: [PATCH 128/151] remove doubled attributes --- src/svgdevicecontext.cpp | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/src/svgdevicecontext.cpp b/src/svgdevicecontext.cpp index 77e5556d53..7e9587f34e 100644 --- a/src/svgdevicecontext.cpp +++ b/src/svgdevicecontext.cpp @@ -958,18 +958,6 @@ void SvgDeviceContext::DrawText( if (m_fontStack.top()->GetPointSize() != 0) { textChild.append_attribute("font-size") = StringFormat("%dpx", m_fontStack.top()->GetPointSize()).c_str(); } - if (m_fontStack.top()->GetStyle() != FONTSTYLE_NONE) { - if (m_fontStack.top()->GetStyle() == FONTSTYLE_italic) { - textChild.append_attribute("font-style") = "italic"; - } - else if (m_fontStack.top()->GetStyle() == FONTSTYLE_normal) { - textChild.append_attribute("font-style") = "normal"; - } - else if (m_fontStack.top()->GetStyle() == FONTSTYLE_oblique) { - textChild.append_attribute("font-style") = "oblique"; - } - } - textChild.append_attribute("class") = "text"; textChild.text().set(svgText.c_str()); if ((x != 0) && (y != 0) && (x != VRV_UNSET) && (y != VRV_UNSET) && (width != 0) && (height != 0) From 596ed5c8ea12c48bb563c585f06d5c7d00d404ba Mon Sep 17 00:00:00 2001 From: Klaus Rettinghaus Date: Fri, 9 Jun 2023 15:54:05 +0200 Subject: [PATCH 129/151] find ancestor --- src/svgdevicecontext.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/svgdevicecontext.cpp b/src/svgdevicecontext.cpp index 7e9587f34e..f4367c7d9c 100644 --- a/src/svgdevicecontext.cpp +++ b/src/svgdevicecontext.cpp @@ -931,8 +931,8 @@ void SvgDeviceContext::DrawText( svgText.replace(svgText.size() - 1, 1, "\xC2\xA0"); } - std::string currentFaceName - = (m_currentNode.attribute("font-family")) ? m_currentNode.attribute("font-family").value() : ""; + pugi::xpath_node fontNode = m_currentNode.select_node("ancestor::*[@font-family][1]"); + std::string currentFaceName = (fontNode) ? fontNode.node().attribute("font-family").value() : ""; std::string fontFaceName = m_fontStack.top()->GetFaceName(); pugi::xml_node textChild = AddChild("tspan"); From 7470414001cdeee82bcb951e6c202d6216ecbf78 Mon Sep 17 00:00:00 2001 From: Klaus Rettinghaus Date: Fri, 9 Jun 2023 18:28:37 +0200 Subject: [PATCH 130/151] suppress zero values for coordinates --- src/svgdevicecontext.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/svgdevicecontext.cpp b/src/svgdevicecontext.cpp index f4367c7d9c..fe02ccaf42 100644 --- a/src/svgdevicecontext.cpp +++ b/src/svgdevicecontext.cpp @@ -853,8 +853,8 @@ void SvgDeviceContext::StartText(int x, int y, data_HORIZONTALALIGNMENT alignmen m_currentNode = m_currentNode.append_child("text"); m_svgNodeStack.push_back(m_currentNode); - m_currentNode.append_attribute("x") = x; - m_currentNode.append_attribute("y") = y; + if (x) m_currentNode.append_attribute("x") = x; + if (y) m_currentNode.append_attribute("y") = y; // unless dx, dy have a value they don't need to be set // m_currentNode.append_attribute("dx") = 0; // m_currentNode.append_attribute("dy") = 0; From e5b96c72a68e51d02920b8ccf294f3e205b7c59f Mon Sep 17 00:00:00 2001 From: Laurent Pugin Date: Mon, 12 Jun 2023 21:54:02 +0200 Subject: [PATCH 131/151] Update LibMEI code with latest MEI Schema * https://github.com/music-encoding/music-encoding/commit/1e11bdf7593d6cf0a9edd1eedb8fc1ed40619144 * Update datatypes.yml according to changes in att.keySigDefault.log --- libmei/datatypes.yml | 2 +- libmei/dist/attconverter.cpp | 27 ++++++++++++++++ libmei/dist/attconverter.h | 3 ++ libmei/dist/attmodule.cpp | 24 +++++++------- libmei/dist/atts_shared.cpp | 16 +++++----- libmei/dist/atts_shared.h | 8 ++--- libmei/dist/atts_visual.cpp | 32 +++++++++---------- libmei/dist/atts_visual.h | 20 ++++++------ libmei/dist/atttypes.h | 12 +++++++ libmei/mei/develop/mei-verovio_compiled.odd | 35 ++++++++++++++++----- 10 files changed, 120 insertions(+), 59 deletions(-) diff --git a/libmei/datatypes.yml b/libmei/datatypes.yml index 8c7697935c..fe307d2a24 100644 --- a/libmei/datatypes.yml +++ b/libmei/datatypes.yml @@ -219,7 +219,7 @@ modules: sig: type: data_KEYSIGNATURE att.keySigDefault.log: - key.sig: + keysig: type: data_KEYSIGNATURE att.meterSig.log: count: diff --git a/libmei/dist/attconverter.cpp b/libmei/dist/attconverter.cpp index 1b86e618b0..659e5ecef6 100644 --- a/libmei/dist/attconverter.cpp +++ b/libmei/dist/attconverter.cpp @@ -634,6 +634,33 @@ data_BOOLEAN AttConverterBase::StrToBoolean(const std::string &value, bool logWa return BOOLEAN_NONE; } +std::string AttConverterBase::CancelaccidToStr(data_CANCELACCID data) const +{ + std::string value; + switch (data) { + case CANCELACCID_none: value = "none"; break; + case CANCELACCID_before: value = "before"; break; + case CANCELACCID_after: value = "after"; break; + case CANCELACCID_before_bar: value = "before-bar"; break; + default: + LogWarning("Unknown value '%d' for data.CANCELACCID", data); + value = ""; + break; + } + return value; +} + +data_CANCELACCID AttConverterBase::StrToCancelaccid(const std::string &value, bool logWarning) const +{ + if (value == "none") return CANCELACCID_none; + if (value == "before") return CANCELACCID_before; + if (value == "after") return CANCELACCID_after; + if (value == "before-bar") return CANCELACCID_before_bar; + if (logWarning && !value.empty()) + LogWarning("Unsupported value '%s' for data.CANCELACCID", value.c_str()); + return CANCELACCID_NONE; +} + std::string AttConverterBase::CertaintyToStr(data_CERTAINTY data) const { std::string value; diff --git a/libmei/dist/attconverter.h b/libmei/dist/attconverter.h index 813ae1b281..cc7724b062 100644 --- a/libmei/dist/attconverter.h +++ b/libmei/dist/attconverter.h @@ -75,6 +75,9 @@ class AttConverterBase { std::string BooleanToStr(data_BOOLEAN data) const; data_BOOLEAN StrToBoolean(const std::string &value, bool logWarning = true) const; + std::string CancelaccidToStr(data_CANCELACCID data) const; + data_CANCELACCID StrToCancelaccid(const std::string &value, bool logWarning = true) const; + std::string CertaintyToStr(data_CERTAINTY data) const; data_CERTAINTY StrToCertainty(const std::string &value, bool logWarning = true) const; diff --git a/libmei/dist/attmodule.cpp b/libmei/dist/attmodule.cpp index dcbdff79e1..4a81bdd5bf 100644 --- a/libmei/dist/attmodule.cpp +++ b/libmei/dist/attmodule.cpp @@ -2822,8 +2822,8 @@ bool AttModule::SetShared(Object *element, const std::string &attrType, const st if (element->HasAttClass(ATT_KEYSIGDEFAULTLOG)) { AttKeySigDefaultLog *att = dynamic_cast(element); assert(att); - if (attrType == "key.sig") { - att->SetKeySig(att->StrToKeysignature(attrValue)); + if (attrType == "keysig") { + att->SetKeysig(att->StrToKeysignature(attrValue)); return true; } } @@ -4366,8 +4366,8 @@ void AttModule::GetShared(const Object *element, ArrayOfStrAttr *attributes) if (element->HasAttClass(ATT_KEYSIGDEFAULTLOG)) { const AttKeySigDefaultLog *att = dynamic_cast(element); assert(att); - if (att->HasKeySig()) { - attributes->push_back({ "key.sig", att->KeysignatureToStr(att->GetKeySig()) }); + if (att->HasKeysig()) { + attributes->push_back({ "keysig", att->KeysignatureToStr(att->GetKeysig()) }); } } if (element->HasAttClass(ATT_LABELLED)) { @@ -5582,16 +5582,16 @@ bool AttModule::SetVisual(Object *element, const std::string &attrType, const st if (element->HasAttClass(ATT_KEYSIGVIS)) { AttKeySigVis *att = dynamic_cast(element); assert(att); - if (attrType == "sig.showchange") { - att->SetSigShowchange(att->StrToBoolean(attrValue)); + if (attrType == "cancelaccid") { + att->SetCancelaccid(att->StrToCancelaccid(attrValue)); return true; } } if (element->HasAttClass(ATT_KEYSIGDEFAULTVIS)) { AttKeySigDefaultVis *att = dynamic_cast(element); assert(att); - if (attrType == "keysig.showchange") { - att->SetKeysigShowchange(att->StrToBoolean(attrValue)); + if (attrType == "keysig.cancelaccid") { + att->SetKeysigCancelaccid(att->StrToCancelaccid(attrValue)); return true; } if (attrType == "keysig.visible") { @@ -6055,15 +6055,15 @@ void AttModule::GetVisual(const Object *element, ArrayOfStrAttr *attributes) if (element->HasAttClass(ATT_KEYSIGVIS)) { const AttKeySigVis *att = dynamic_cast(element); assert(att); - if (att->HasSigShowchange()) { - attributes->push_back({ "sig.showchange", att->BooleanToStr(att->GetSigShowchange()) }); + if (att->HasCancelaccid()) { + attributes->push_back({ "cancelaccid", att->CancelaccidToStr(att->GetCancelaccid()) }); } } if (element->HasAttClass(ATT_KEYSIGDEFAULTVIS)) { const AttKeySigDefaultVis *att = dynamic_cast(element); assert(att); - if (att->HasKeysigShowchange()) { - attributes->push_back({ "keysig.showchange", att->BooleanToStr(att->GetKeysigShowchange()) }); + if (att->HasKeysigCancelaccid()) { + attributes->push_back({ "keysig.cancelaccid", att->CancelaccidToStr(att->GetKeysigCancelaccid()) }); } if (att->HasKeysigVisible()) { attributes->push_back({ "keysig.visible", att->BooleanToStr(att->GetKeysigVisible()) }); diff --git a/libmei/dist/atts_shared.cpp b/libmei/dist/atts_shared.cpp index 2cc9b8a574..cf35eddc79 100644 --- a/libmei/dist/atts_shared.cpp +++ b/libmei/dist/atts_shared.cpp @@ -2368,15 +2368,15 @@ AttKeySigDefaultLog::AttKeySigDefaultLog() : Att() void AttKeySigDefaultLog::ResetKeySigDefaultLog() { - m_keySig = std::make_pair(-1, ACCIDENTAL_WRITTEN_NONE); + m_keysig = std::make_pair(-1, ACCIDENTAL_WRITTEN_NONE); } bool AttKeySigDefaultLog::ReadKeySigDefaultLog(pugi::xml_node element, bool removeAttr) { bool hasAttribute = false; - if (element.attribute("key.sig")) { - this->SetKeySig(StrToKeysignature(element.attribute("key.sig").value())); - if (removeAttr) element.remove_attribute("key.sig"); + if (element.attribute("keysig")) { + this->SetKeysig(StrToKeysignature(element.attribute("keysig").value())); + if (removeAttr) element.remove_attribute("keysig"); hasAttribute = true; } return hasAttribute; @@ -2385,16 +2385,16 @@ bool AttKeySigDefaultLog::ReadKeySigDefaultLog(pugi::xml_node element, bool remo bool AttKeySigDefaultLog::WriteKeySigDefaultLog(pugi::xml_node element) { bool wroteAttribute = false; - if (this->HasKeySig()) { - element.append_attribute("key.sig") = KeysignatureToStr(this->GetKeySig()).c_str(); + if (this->HasKeysig()) { + element.append_attribute("keysig") = KeysignatureToStr(this->GetKeysig()).c_str(); wroteAttribute = true; } return wroteAttribute; } -bool AttKeySigDefaultLog::HasKeySig() const +bool AttKeySigDefaultLog::HasKeysig() const { - return (m_keySig != std::make_pair(-1, ACCIDENTAL_WRITTEN_NONE)); + return (m_keysig != std::make_pair(-1, ACCIDENTAL_WRITTEN_NONE)); } //---------------------------------------------------------------------------- diff --git a/libmei/dist/atts_shared.h b/libmei/dist/atts_shared.h index 6afc35cc03..412610fbf4 100644 --- a/libmei/dist/atts_shared.h +++ b/libmei/dist/atts_shared.h @@ -2726,14 +2726,14 @@ class AttKeySigDefaultLog : public Att { * to the default value) **/ ///@{ - void SetKeySig(data_KEYSIGNATURE keySig_) { m_keySig = keySig_; } - data_KEYSIGNATURE GetKeySig() const { return m_keySig; } - bool HasKeySig() const; + void SetKeysig(data_KEYSIGNATURE keysig_) { m_keysig = keysig_; } + data_KEYSIGNATURE GetKeysig() const { return m_keysig; } + bool HasKeysig() const; ///@} private: /** Written key signature. **/ - data_KEYSIGNATURE m_keySig; + data_KEYSIGNATURE m_keysig; }; //---------------------------------------------------------------------------- diff --git a/libmei/dist/atts_visual.cpp b/libmei/dist/atts_visual.cpp index 11735ae6fb..832314ecc8 100644 --- a/libmei/dist/atts_visual.cpp +++ b/libmei/dist/atts_visual.cpp @@ -878,15 +878,15 @@ AttKeySigVis::AttKeySigVis() : Att() void AttKeySigVis::ResetKeySigVis() { - m_sigShowchange = BOOLEAN_NONE; + m_cancelaccid = CANCELACCID_NONE; } bool AttKeySigVis::ReadKeySigVis(pugi::xml_node element, bool removeAttr) { bool hasAttribute = false; - if (element.attribute("sig.showchange")) { - this->SetSigShowchange(StrToBoolean(element.attribute("sig.showchange").value())); - if (removeAttr) element.remove_attribute("sig.showchange"); + if (element.attribute("cancelaccid")) { + this->SetCancelaccid(StrToCancelaccid(element.attribute("cancelaccid").value())); + if (removeAttr) element.remove_attribute("cancelaccid"); hasAttribute = true; } return hasAttribute; @@ -895,16 +895,16 @@ bool AttKeySigVis::ReadKeySigVis(pugi::xml_node element, bool removeAttr) bool AttKeySigVis::WriteKeySigVis(pugi::xml_node element) { bool wroteAttribute = false; - if (this->HasSigShowchange()) { - element.append_attribute("sig.showchange") = BooleanToStr(this->GetSigShowchange()).c_str(); + if (this->HasCancelaccid()) { + element.append_attribute("cancelaccid") = CancelaccidToStr(this->GetCancelaccid()).c_str(); wroteAttribute = true; } return wroteAttribute; } -bool AttKeySigVis::HasSigShowchange() const +bool AttKeySigVis::HasCancelaccid() const { - return (m_sigShowchange != BOOLEAN_NONE); + return (m_cancelaccid != CANCELACCID_NONE); } //---------------------------------------------------------------------------- @@ -918,16 +918,16 @@ AttKeySigDefaultVis::AttKeySigDefaultVis() : Att() void AttKeySigDefaultVis::ResetKeySigDefaultVis() { - m_keysigShowchange = BOOLEAN_NONE; + m_keysigCancelaccid = CANCELACCID_NONE; m_keysigVisible = BOOLEAN_NONE; } bool AttKeySigDefaultVis::ReadKeySigDefaultVis(pugi::xml_node element, bool removeAttr) { bool hasAttribute = false; - if (element.attribute("keysig.showchange")) { - this->SetKeysigShowchange(StrToBoolean(element.attribute("keysig.showchange").value())); - if (removeAttr) element.remove_attribute("keysig.showchange"); + if (element.attribute("keysig.cancelaccid")) { + this->SetKeysigCancelaccid(StrToCancelaccid(element.attribute("keysig.cancelaccid").value())); + if (removeAttr) element.remove_attribute("keysig.cancelaccid"); hasAttribute = true; } if (element.attribute("keysig.visible")) { @@ -941,8 +941,8 @@ bool AttKeySigDefaultVis::ReadKeySigDefaultVis(pugi::xml_node element, bool remo bool AttKeySigDefaultVis::WriteKeySigDefaultVis(pugi::xml_node element) { bool wroteAttribute = false; - if (this->HasKeysigShowchange()) { - element.append_attribute("keysig.showchange") = BooleanToStr(this->GetKeysigShowchange()).c_str(); + if (this->HasKeysigCancelaccid()) { + element.append_attribute("keysig.cancelaccid") = CancelaccidToStr(this->GetKeysigCancelaccid()).c_str(); wroteAttribute = true; } if (this->HasKeysigVisible()) { @@ -952,9 +952,9 @@ bool AttKeySigDefaultVis::WriteKeySigDefaultVis(pugi::xml_node element) return wroteAttribute; } -bool AttKeySigDefaultVis::HasKeysigShowchange() const +bool AttKeySigDefaultVis::HasKeysigCancelaccid() const { - return (m_keysigShowchange != BOOLEAN_NONE); + return (m_keysigCancelaccid != CANCELACCID_NONE); } bool AttKeySigDefaultVis::HasKeysigVisible() const diff --git a/libmei/dist/atts_visual.h b/libmei/dist/atts_visual.h index cfd1585ce7..0e8ad06943 100644 --- a/libmei/dist/atts_visual.h +++ b/libmei/dist/atts_visual.h @@ -877,14 +877,14 @@ class AttKeySigVis : public Att { * to the default value) **/ ///@{ - void SetSigShowchange(data_BOOLEAN sigShowchange_) { m_sigShowchange = sigShowchange_; } - data_BOOLEAN GetSigShowchange() const { return m_sigShowchange; } - bool HasSigShowchange() const; + void SetCancelaccid(data_CANCELACCID cancelaccid_) { m_cancelaccid = cancelaccid_; } + data_CANCELACCID GetCancelaccid() const { return m_cancelaccid; } + bool HasCancelaccid() const; ///@} private: - /** Determines whether cautionary accidentals should be displayed at a key change. **/ - data_BOOLEAN m_sigShowchange; + /** Determines where cautionary accidentals should be displayed at a key change. **/ + data_CANCELACCID m_cancelaccid; }; //---------------------------------------------------------------------------- @@ -926,9 +926,9 @@ class AttKeySigDefaultVis : public Att { * to the default value) **/ ///@{ - void SetKeysigShowchange(data_BOOLEAN keysigShowchange_) { m_keysigShowchange = keysigShowchange_; } - data_BOOLEAN GetKeysigShowchange() const { return m_keysigShowchange; } - bool HasKeysigShowchange() const; + void SetKeysigCancelaccid(data_CANCELACCID keysigCancelaccid_) { m_keysigCancelaccid = keysigCancelaccid_; } + data_CANCELACCID GetKeysigCancelaccid() const { return m_keysigCancelaccid; } + bool HasKeysigCancelaccid() const; // void SetKeysigVisible(data_BOOLEAN keysigVisible_) { m_keysigVisible = keysigVisible_; } data_BOOLEAN GetKeysigVisible() const { return m_keysigVisible; } @@ -936,8 +936,8 @@ class AttKeySigDefaultVis : public Att { ///@} private: - /** Determines whether cautionary accidentals should be displayed at a key change. **/ - data_BOOLEAN m_keysigShowchange; + /** Determines where cautionary accidentals should be displayed at a key change. **/ + data_CANCELACCID m_keysigCancelaccid; /** Determines whether the key signature is to be displayed. **/ data_BOOLEAN m_keysigVisible; }; diff --git a/libmei/dist/atttypes.h b/libmei/dist/atttypes.h index 2bdbae4b8b..1743320a2b 100644 --- a/libmei/dist/atttypes.h +++ b/libmei/dist/atttypes.h @@ -301,6 +301,18 @@ enum data_BOOLEAN : int8_t { BOOLEAN_MAX }; +/** + * MEI data.CANCELACCID + */ +enum data_CANCELACCID : int8_t { + CANCELACCID_NONE = 0, + CANCELACCID_none, + CANCELACCID_before, + CANCELACCID_after, + CANCELACCID_before_bar, + CANCELACCID_MAX +}; + /** * MEI data.CERTAINTY */ diff --git a/libmei/mei/develop/mei-verovio_compiled.odd b/libmei/mei/develop/mei-verovio_compiled.odd index d6c9141eb6..351d5c8c34 100644 --- a/libmei/mei/develop/mei-verovio_compiled.odd +++ b/libmei/mei/develop/mei-verovio_compiled.odd @@ -514,6 +514,24 @@ + + Indicates where cancellation accidentals are shown in a key signature. + + + + Do not show cancellation accidentals. + + + Show cancellation accidentals before the new key accidentals. + + + Show cancellation accidentals after the new key accidentals ("Old style" or "French") + + + Show cancellation accidentals before the barline (also known as "Russian"). + + + Values for certainty attribute. Certainty may be expressed by one of the predefined symbolic values high, medium, or low. The value unknown should be used in cases where the encoder @@ -8605,7 +8623,7 @@ - + @@ -9874,6 +9892,7 @@ + @@ -12888,7 +12907,7 @@ Used by staffDef and scoreDef to provide default values for attributes in the logical domain that are related to key signatures. - + Written key signature. @@ -19243,10 +19262,10 @@ - - Determines whether cautionary accidentals should be displayed at a key change. + + Determines where cautionary accidentals should be displayed at a key change. - + @@ -19254,10 +19273,10 @@ Used by staffDef and scoreDef to provide default values for attributes in the visual domain related to key signatures. - - Determines whether cautionary accidentals should be displayed at a key change. + + Determines where cautionary accidentals should be displayed at a key change. - + From 68384a25e2e9ef0928fb591eb43c63e362bb0824 Mon Sep 17 00:00:00 2001 From: Laurent Pugin Date: Mon, 12 Jun 2023 21:55:13 +0200 Subject: [PATCH 132/151] Add UpgradeKeySigTo_5_0_0 and adjust other upgrade methods --- include/vrv/iomei.h | 1 + src/iomei.cpp | 43 +++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 42 insertions(+), 2 deletions(-) diff --git a/include/vrv/iomei.h b/include/vrv/iomei.h index 0bfb7b64c9..5ff0cc1ebd 100644 --- a/include/vrv/iomei.h +++ b/include/vrv/iomei.h @@ -880,6 +880,7 @@ class MEIInput : public Input { */ ///@{ // to MEI 5.0.0 + void UpgradeKeySigTo_5_0_0(pugi::xml_node keySig); void UpgradePageTo_5_0_0(Page *page); void UpgradeMeasureTo_5_0_0(pugi::xml_node measure); void UpgradeMeterSigTo_5_0_0(pugi::xml_node meterSig, MeterSig *vrvMeterSig); diff --git a/src/iomei.cpp b/src/iomei.cpp index 974ba3bcd3..11e6878baf 100644 --- a/src/iomei.cpp +++ b/src/iomei.cpp @@ -6447,6 +6447,10 @@ bool MEIInput::ReadKeySig(Object *parent, pugi::xml_node keySig) { KeySig *vrvKeySig = new KeySig(); this->ReadLayerElement(keySig, vrvKeySig); + + if (m_meiversion <= meiVersion_MEIVERSION_5_0_0_dev) { + UpgradeKeySigTo_5_0_0(keySig); + } vrvKeySig->ReadAccidental(keySig); vrvKeySig->ReadPitch(keySig); @@ -7961,6 +7965,22 @@ void MEIInput::NormalizeAttributes(pugi::xml_node &xmlElement) } } +void MEIInput::UpgradeKeySigTo_5_0_0(pugi::xml_node keySig) +{ + InstKeySigLog keySigLog; + + if (keySig.attribute("key.showchange")) { + data_BOOLEAN showchange = keySigLog.StrToBoolean(keySig.attribute("key.showchange").value()); + keySig.attribute("key.showchange").set_name("cancelaccid"); + if (showchange == BOOLEAN_true) { + keySig.attribute("cancelaccid") = keySigLog.CancelaccidToStr(CANCELACCID_before).c_str(); + } + else { + keySig.attribute("cancelaccid") = keySigLog.CancelaccidToStr(CANCELACCID_none).c_str(); + } + } +} + void MEIInput::UpgradePageTo_5_0_0(Page *page) { assert(page); @@ -8004,6 +8024,21 @@ void MEIInput::UpgradeMeterSigTo_5_0_0(pugi::xml_node meterSig, MeterSig *vrvMet void MEIInput::UpgradeScoreDefElementTo_5_0_0(pugi::xml_node scoreDefElement) { + InstKeySigLog keySigLog; + + if (scoreDefElement.attribute("key.sig")) { + scoreDefElement.attribute("key.sig").set_name("keysig"); + } + if (scoreDefElement.attribute("keysig.showchange")) { + data_BOOLEAN showchange = keySigLog.StrToBoolean(scoreDefElement.attribute("keysig.showchange").value()); + scoreDefElement.attribute("keysig.showchange").set_name("keysig.cancelaccid"); + if (showchange == BOOLEAN_true) { + scoreDefElement.attribute("keysig.cancelaccid") = keySigLog.CancelaccidToStr(CANCELACCID_before).c_str(); + } + else { + scoreDefElement.attribute("keysig.cancelaccid") = keySigLog.CancelaccidToStr(CANCELACCID_none).c_str(); + } + } if (scoreDefElement.attribute("meter.form")) { std::string value = scoreDefElement.attribute("meter.form").value(); if (value == "invis") { @@ -8132,8 +8167,12 @@ void MEIInput::UpgradeScoreDefElementTo_4_0_0(pugi::xml_node scoreDefElement, Sc } if (scoreDefElement.attribute("key.sig.showchange")) { if (keySig) { - keySig->SetSigShowchange( - keySig->AttKeySigVis::StrToBoolean(scoreDefElement.attribute("key.sig.showchange").value())); + if (keySig->AttKeySigVis::StrToBoolean(scoreDefElement.attribute("key.sig.showchange").value()) == BOOLEAN_true) { + keySig->SetCancelaccid(CANCELACCID_before); + } + else { + keySig->SetCancelaccid(CANCELACCID_none); + } scoreDefElement.remove_attribute("key.sig.showchange"); } else { From eb07211998cd939235bc0e4bac7246939ac10fe4 Mon Sep 17 00:00:00 2001 From: Laurent Pugin Date: Mon, 12 Jun 2023 21:55:41 +0200 Subject: [PATCH 133/151] Adjust importers --- src/iohumdrum.cpp | 4 ++-- src/iomei.cpp | 12 ++++++------ src/iomusxml.cpp | 2 +- src/iopae.cpp | 2 +- 4 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/iohumdrum.cpp b/src/iohumdrum.cpp index 34a6fabd0e..2e45c7016f 100644 --- a/src/iohumdrum.cpp +++ b/src/iohumdrum.cpp @@ -6874,10 +6874,10 @@ void HumdrumInput::setKeySig( if (secondary && (keyvalue == 0)) { // Force cancellation keysignature when there are no // sharps/flats in key signature change. - vrvkeysig->SetSigShowchange(BOOLEAN_true); + vrvkeysig->SetCancelaccid(CANCELACCID_before); } else if (m_show_cautionary_keysig) { - vrvkeysig->SetSigShowchange(BOOLEAN_true); + vrvkeysig->SetCancelaccid(CANCELACCID_before); } if (!keytok) { diff --git a/src/iomei.cpp b/src/iomei.cpp index 11e6878baf..0cae18e8e9 100644 --- a/src/iomei.cpp +++ b/src/iomei.cpp @@ -2499,11 +2499,11 @@ void MEIOutput::WriteKeySig(pugi::xml_node currentNode, KeySig *keySig) InstKeySigDefaultLog attKeySigDefaultLog; // If there is no @sig, try to build it from the keyAccid children. const data_KEYSIGNATURE sig = (keySig->HasSig()) ? keySig->GetSig() : keySig->ConvertToSig(); - attKeySigDefaultLog.SetKeySig(sig); + attKeySigDefaultLog.SetKeysig(sig); attKeySigDefaultLog.WriteKeySigDefaultLog(currentNode); InstKeySigDefaultVis attKeySigDefaultVis; attKeySigDefaultVis.SetKeysigVisible(keySig->GetVisible()); - attKeySigDefaultVis.SetKeysigShowchange(keySig->GetSigShowchange()); + attKeySigDefaultVis.SetKeysigCancelaccid(keySig->GetCancelaccid()); attKeySigDefaultVis.WriteKeySigDefaultVis(currentNode); return; } @@ -4610,17 +4610,17 @@ bool MEIInput::ReadScoreDefElement(pugi::xml_node element, ScoreDefElement *obje InstKeySigDefaultVis keySigDefaultVis; keySigDefaultVis.ReadKeySigDefaultVis(element); if (keySigDefaultAnl.HasKeyAccid() || keySigDefaultAnl.HasKeyMode() || keySigDefaultAnl.HasKeyPname() - || keySigDefaultLog.HasKeySig() || keySigDefaultVis.HasKeysigVisible() - || keySigDefaultVis.HasKeysigShowchange()) { + || keySigDefaultLog.HasKeysig() || keySigDefaultVis.HasKeysigVisible() + || keySigDefaultVis.HasKeysigCancelaccid()) { KeySig *vrvKeySig = new KeySig(); vrvKeySig->IsAttribute(true); // Broken in MEI 4.0.2 - waiting for a fix // vrvKeySig->SetAccid(keySigDefaultAnl.GetKeyAccid()); vrvKeySig->SetMode(keySigDefaultAnl.GetKeyMode()); vrvKeySig->SetPname(keySigDefaultAnl.GetKeyPname()); - vrvKeySig->SetSig(keySigDefaultLog.GetKeySig()); + vrvKeySig->SetSig(keySigDefaultLog.GetKeysig()); vrvKeySig->SetVisible(keySigDefaultVis.GetKeysigVisible()); - vrvKeySig->SetSigShowchange(keySigDefaultVis.GetKeysigShowchange()); + vrvKeySig->SetCancelaccid(keySigDefaultVis.GetKeysigCancelaccid()); object->AddChild(vrvKeySig); } diff --git a/src/iomusxml.cpp b/src/iomusxml.cpp index 0ef666da4e..28d480e823 100644 --- a/src/iomusxml.cpp +++ b/src/iomusxml.cpp @@ -3922,7 +3922,7 @@ KeySig *MusicXmlInput::ConvertKey(const pugi::xml_node &key) keySig->SetSig(keySig->AttKeySigLog::StrToKeysignature(keySigStr)); if (key.child("cancel")) { - keySig->SetSigShowchange(BOOLEAN_true); + keySig->SetCancelaccid(CANCELACCID_before); } if (key.child("mode")) { const std::string xmlMode = key.child("mode").text().as_string(); diff --git a/src/iopae.cpp b/src/iopae.cpp index 38d30416fe..0d508be5c1 100644 --- a/src/iopae.cpp +++ b/src/iopae.cpp @@ -4801,7 +4801,7 @@ bool PAEInput::ParseKeySig(KeySig *keySig, const std::string &paeStr, pae::Token keySig->SetSig({ altNumber, alterationType }); } if (cancel) { - keySig->SetSigShowchange(BOOLEAN_true); + keySig->SetCancelaccid(CANCELACCID_before); } } else { From d78f94360799d37e6ddfb1d51d4d8f2c86f5948c Mon Sep 17 00:00:00 2001 From: Laurent Pugin Date: Mon, 12 Jun 2023 21:56:27 +0200 Subject: [PATCH 134/151] Add test for appropriate cancelaccid rendering * before-after remains unsupported --- src/view_element.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/view_element.cpp b/src/view_element.cpp index 700c95d183..c9350b6ae1 100644 --- a/src/view_element.cpp +++ b/src/view_element.cpp @@ -993,12 +993,12 @@ void View::DrawKeySig(DeviceContext *dc, LayerElement *element, Layer *layer, St // Show cancellation if showchange is true (false by default) or if C major if ((keySig->GetScoreDefRole() != SCOREDEF_SYSTEM) - && ((keySig->GetSigShowchange() == BOOLEAN_true) || (keySig->GetAccidCount() == 0))) { + && ((keySig->HasCancelaccid() && (keySig->GetCancelaccid() != CANCELACCID_none)) || (keySig->GetAccidCount() == 0))) { if (keySig->m_skipCancellation) { LogWarning("Cautionary accidentals are skipped if the new or previous KeySig contains KeyAccid children."); } - // For French style (after) test to add - else if (keySig->GetAccidType() == keySig->m_drawingCancelAccidType) { + // For French style (after) + else if ((keySig->GetCancelaccid() == CANCELACCID_after) && (keySig->GetAccidType() == keySig->m_drawingCancelAccidType)) { showCancelAfter = true; } else { From f88d967abb0ae70a45cd033dbaf6aa266da4f03c Mon Sep 17 00:00:00 2001 From: Laurent Pugin Date: Mon, 12 Jun 2023 22:05:41 +0200 Subject: [PATCH 135/151] Fix formatting --- src/iomei.cpp | 9 +++++---- src/view_element.cpp | 6 ++++-- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/src/iomei.cpp b/src/iomei.cpp index 0cae18e8e9..e6d7576eb0 100644 --- a/src/iomei.cpp +++ b/src/iomei.cpp @@ -6447,7 +6447,7 @@ bool MEIInput::ReadKeySig(Object *parent, pugi::xml_node keySig) { KeySig *vrvKeySig = new KeySig(); this->ReadLayerElement(keySig, vrvKeySig); - + if (m_meiversion <= meiVersion_MEIVERSION_5_0_0_dev) { UpgradeKeySigTo_5_0_0(keySig); } @@ -7968,7 +7968,7 @@ void MEIInput::NormalizeAttributes(pugi::xml_node &xmlElement) void MEIInput::UpgradeKeySigTo_5_0_0(pugi::xml_node keySig) { InstKeySigLog keySigLog; - + if (keySig.attribute("key.showchange")) { data_BOOLEAN showchange = keySigLog.StrToBoolean(keySig.attribute("key.showchange").value()); keySig.attribute("key.showchange").set_name("cancelaccid"); @@ -8025,7 +8025,7 @@ void MEIInput::UpgradeMeterSigTo_5_0_0(pugi::xml_node meterSig, MeterSig *vrvMet void MEIInput::UpgradeScoreDefElementTo_5_0_0(pugi::xml_node scoreDefElement) { InstKeySigLog keySigLog; - + if (scoreDefElement.attribute("key.sig")) { scoreDefElement.attribute("key.sig").set_name("keysig"); } @@ -8167,7 +8167,8 @@ void MEIInput::UpgradeScoreDefElementTo_4_0_0(pugi::xml_node scoreDefElement, Sc } if (scoreDefElement.attribute("key.sig.showchange")) { if (keySig) { - if (keySig->AttKeySigVis::StrToBoolean(scoreDefElement.attribute("key.sig.showchange").value()) == BOOLEAN_true) { + if (keySig->AttKeySigVis::StrToBoolean(scoreDefElement.attribute("key.sig.showchange").value()) + == BOOLEAN_true) { keySig->SetCancelaccid(CANCELACCID_before); } else { diff --git a/src/view_element.cpp b/src/view_element.cpp index c9350b6ae1..d859c3cabe 100644 --- a/src/view_element.cpp +++ b/src/view_element.cpp @@ -993,12 +993,14 @@ void View::DrawKeySig(DeviceContext *dc, LayerElement *element, Layer *layer, St // Show cancellation if showchange is true (false by default) or if C major if ((keySig->GetScoreDefRole() != SCOREDEF_SYSTEM) - && ((keySig->HasCancelaccid() && (keySig->GetCancelaccid() != CANCELACCID_none)) || (keySig->GetAccidCount() == 0))) { + && ((keySig->HasCancelaccid() && (keySig->GetCancelaccid() != CANCELACCID_none)) + || (keySig->GetAccidCount() == 0))) { if (keySig->m_skipCancellation) { LogWarning("Cautionary accidentals are skipped if the new or previous KeySig contains KeyAccid children."); } // For French style (after) - else if ((keySig->GetCancelaccid() == CANCELACCID_after) && (keySig->GetAccidType() == keySig->m_drawingCancelAccidType)) { + else if ((keySig->GetCancelaccid() == CANCELACCID_after) + && (keySig->GetAccidType() == keySig->m_drawingCancelAccidType)) { showCancelAfter = true; } else { From 91a4c8098f45afb947ee786f64e11f958a5794be Mon Sep 17 00:00:00 2001 From: Laurent Pugin Date: Tue, 13 Jun 2023 07:42:51 +0200 Subject: [PATCH 136/151] Fix comment and wrong reset method in ornam --- include/vrv/ornam.h | 2 +- src/ornam.cpp | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/include/vrv/ornam.h b/include/vrv/ornam.h index 4be994a1a0..88b1da5c8e 100644 --- a/include/vrv/ornam.h +++ b/include/vrv/ornam.h @@ -22,7 +22,7 @@ namespace vrv { //---------------------------------------------------------------------------- /** - * This class models the MEI element. + * This class models the MEI element. */ class Ornam : public ControlElement, public TextListInterface, diff --git a/src/ornam.cpp b/src/ornam.cpp index 23a6d516fa..54e1fe96fc 100644 --- a/src/ornam.cpp +++ b/src/ornam.cpp @@ -60,7 +60,6 @@ void Ornam::Reset() this->ResetExtSymAuth(); this->ResetExtSymNames(); this->ResetOrnamentAccid(); - this->ResetPlacementRelStaff(); } bool Ornam::IsSupportedChild(Object *child) From b02746ea33dadf8ef7a6c4250165bebd5a6a45d5 Mon Sep 17 00:00:00 2001 From: Laurent Pugin Date: Tue, 13 Jun 2023 08:00:08 +0200 Subject: [PATCH 137/151] Add RepeatMark class --- Verovio.xcodeproj/project.pbxproj | 16 ++++ include/vrv/functorinterface.h | 5 ++ include/vrv/repeatmark.h | 96 ++++++++++++++++++++++++ include/vrv/vrvdef.h | 1 + src/functorinterface.cpp | 21 ++++++ src/repeatmark.cpp | 119 ++++++++++++++++++++++++++++++ 6 files changed, 258 insertions(+) create mode 100644 include/vrv/repeatmark.h create mode 100644 src/repeatmark.cpp diff --git a/Verovio.xcodeproj/project.pbxproj b/Verovio.xcodeproj/project.pbxproj index add36f2a53..06c2a2cb9b 100644 --- a/Verovio.xcodeproj/project.pbxproj +++ b/Verovio.xcodeproj/project.pbxproj @@ -886,6 +886,12 @@ 4DFB3E8823ABDFC200D688C7 /* pitchinflection.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4DFB3E8423ABDFC200D688C7 /* pitchinflection.cpp */; }; 4DFB3E8A23ABDFDA00D688C7 /* pitchinflection.h in Headers */ = {isa = PBXBuildFile; fileRef = 4DFB3E8923ABDFDA00D688C7 /* pitchinflection.h */; }; 4DFB3E8B23ABDFDA00D688C7 /* pitchinflection.h in Headers */ = {isa = PBXBuildFile; fileRef = 4DFB3E8923ABDFDA00D688C7 /* pitchinflection.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 4DFD82FB2A38398200A3E20B /* repeatmark.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4DFD82FA2A38398200A3E20B /* repeatmark.cpp */; }; + 4DFD82FC2A38398200A3E20B /* repeatmark.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4DFD82FA2A38398200A3E20B /* repeatmark.cpp */; }; + 4DFD82FD2A38398200A3E20B /* repeatmark.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4DFD82FA2A38398200A3E20B /* repeatmark.cpp */; }; + 4DFD82FE2A38398200A3E20B /* repeatmark.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4DFD82FA2A38398200A3E20B /* repeatmark.cpp */; }; + 4DFD83002A38399C00A3E20B /* repeatmark.h in Headers */ = {isa = PBXBuildFile; fileRef = 4DFD82FF2A38399C00A3E20B /* repeatmark.h */; }; + 4DFD83012A38399C00A3E20B /* repeatmark.h in Headers */ = {isa = PBXBuildFile; fileRef = 4DFD82FF2A38399C00A3E20B /* repeatmark.h */; settings = {ATTRIBUTES = (Public, ); }; }; 8F086EE2188539540037FD8E /* verticalaligner.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8F086EB6188539540037FD8E /* verticalaligner.cpp */; }; 8F086EE4188539540037FD8E /* barline.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8F086EB8188539540037FD8E /* barline.cpp */; }; 8F086EE5188539540037FD8E /* bboxdevicecontext.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8F086EB9188539540037FD8E /* bboxdevicecontext.cpp */; }; @@ -2048,6 +2054,8 @@ 4DF4407C1D511D0200152B7E /* systemmilestone.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = systemmilestone.cpp; path = src/systemmilestone.cpp; sourceTree = ""; }; 4DFB3E8423ABDFC200D688C7 /* pitchinflection.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = pitchinflection.cpp; path = src/pitchinflection.cpp; sourceTree = ""; }; 4DFB3E8923ABDFDA00D688C7 /* pitchinflection.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = pitchinflection.h; path = include/vrv/pitchinflection.h; sourceTree = ""; }; + 4DFD82FA2A38398200A3E20B /* repeatmark.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = repeatmark.cpp; path = src/repeatmark.cpp; sourceTree = ""; }; + 4DFD82FF2A38399C00A3E20B /* repeatmark.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = repeatmark.h; path = include/vrv/repeatmark.h; sourceTree = ""; }; 8F086EA9188534680037FD8E /* Verovio */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = Verovio; sourceTree = BUILT_PRODUCTS_DIR; }; 8F086EB6188539540037FD8E /* verticalaligner.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; lineEnding = 0; name = verticalaligner.cpp; path = src/verticalaligner.cpp; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.cpp; }; 8F086EB8188539540037FD8E /* barline.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = barline.cpp; path = src/barline.cpp; sourceTree = ""; }; @@ -2674,6 +2682,8 @@ 4DFB3E8923ABDFDA00D688C7 /* pitchinflection.h */, 40ACDEA824079F9000F82B8C /* reh.cpp */, 40ACDEA524079F5E00F82B8C /* reh.h */, + 4DFD82FA2A38398200A3E20B /* repeatmark.cpp */, + 4DFD82FF2A38399C00A3E20B /* repeatmark.h */, 8F086ED3188539540037FD8E /* slur.cpp */, 8F59292A18854BF800FE51AD /* slur.h */, 4DB351121C8040B1002DD057 /* tempo.cpp */, @@ -3273,6 +3283,7 @@ 4DACC9B22990F29A00B55913 /* atts_cmnornaments.h in Headers */, 4DC12A891F74111E000440E9 /* pgfoot.h in Headers */, 4DB3D8C91F83D10300B5FC2B /* dir.h in Headers */, + 4DFD83002A38399C00A3E20B /* repeatmark.h in Headers */, BD05622F2518CD12004057EB /* beamspan.h in Headers */, 4DEC4DDA21C8295700D1D273 /* damage.h in Headers */, 4DACC9CE2990F29A00B55913 /* atts_mei.h in Headers */, @@ -3543,6 +3554,7 @@ 4D79643226C6AA720026288B /* featureextractor.h in Headers */, 4DACC9EB2990F29A00B55913 /* attmodule.h in Headers */, BB4C4ABC22A932B6001F6AF0 /* instrdef.h in Headers */, + 4DFD83012A38399C00A3E20B /* repeatmark.h in Headers */, BB4C4B7622A932D7001F6AF0 /* syl.h in Headers */, E73E86262A069C640089DF74 /* transposefunctor.h in Headers */, BB4C4AEA22A932BC001F6AF0 /* del.h in Headers */, @@ -4075,6 +4087,7 @@ 4D16944F1E3A44F300569BF4 /* timeinterface.cpp in Sources */, 4D6331F61F46D2CB00A0D6BF /* arpeg.cpp in Sources */, 4D674B47255F40B7008AEF4C /* plica.cpp in Sources */, + 4DFD82FC2A38398200A3E20B /* repeatmark.cpp in Sources */, 4D1694511E3A44F300569BF4 /* glyph.cpp in Sources */, 4D1694521E3A44F300569BF4 /* syl.cpp in Sources */, E7876F2329C0A709002147DC /* adjusttupletsxfunctor.cpp in Sources */, @@ -4135,6 +4148,7 @@ 4DC12A781F7400B9000440E9 /* runningelement.cpp in Sources */, 4DA0EAEE22BB77C300A7EBEB /* editortoolkit_cmn.cpp in Sources */, E78F204A29D98D2300CD5910 /* adjustxrelfortranscriptionfunctor.cpp in Sources */, + 4DFD82FB2A38398200A3E20B /* repeatmark.cpp in Sources */, 4DACC9FC2990F29A00B55913 /* atts_fingering.cpp in Sources */, 4DC12A631F73F898000440E9 /* pghead2.cpp in Sources */, 4DACC9EC2990F29A00B55913 /* atts_shared.cpp in Sources */, @@ -4634,6 +4648,7 @@ 4DB3D8DC1F83D14900B5FC2B /* artic.cpp in Sources */, 4D674B48255F40B7008AEF4C /* plica.cpp in Sources */, 4D9A9C1F19A1DE2000028D93 /* syl.cpp in Sources */, + 4DFD82FD2A38398200A3E20B /* repeatmark.cpp in Sources */, 4DC3B9E9239E2AE3007F185E /* transposition.cpp in Sources */, 40ACDEAB24079F9000F82B8C /* reh.cpp in Sources */, E7876F2229C0A708002147DC /* adjusttupletsxfunctor.cpp in Sources */, @@ -4914,6 +4929,7 @@ BB4C4AFD22A932BC001F6AF0 /* subst.cpp in Sources */, BB4C4BBE22A932FC001F6AF0 /* MidiFile.cpp in Sources */, 4D674B49255F40B7008AEF4C /* plica.cpp in Sources */, + 4DFD82FE2A38398200A3E20B /* repeatmark.cpp in Sources */, BB4C4A9C22A9328F001F6AF0 /* options.cpp in Sources */, 4DC3B9E8239E2AE2007F185E /* transposition.cpp in Sources */, E7876F2129C0A708002147DC /* adjusttupletsxfunctor.cpp in Sources */, diff --git a/include/vrv/functorinterface.h b/include/vrv/functorinterface.h index 5d4a141262..4a84e54e12 100644 --- a/include/vrv/functorinterface.h +++ b/include/vrv/functorinterface.h @@ -101,6 +101,7 @@ class Phrase; class PitchInflection; class Plica; class Proport; +class RepeatMark; class Reh; class Rend; class Rest; @@ -316,6 +317,8 @@ class FunctorInterface { virtual FunctorCode VisitPitchInflectionEnd(PitchInflection *pitchInflection); virtual FunctorCode VisitReh(Reh *reh); virtual FunctorCode VisitRehEnd(Reh *reh); + virtual FunctorCode VisitRepeatMark(RepeatMark *repeatMark); + virtual FunctorCode VisitRepeatMarkEnd(RepeatMark *repeatMark); virtual FunctorCode VisitSlur(Slur *slur); virtual FunctorCode VisitSlurEnd(Slur *slur); virtual FunctorCode VisitTempo(Tempo *tempo); @@ -671,6 +674,8 @@ class ConstFunctorInterface { virtual FunctorCode VisitPitchInflectionEnd(const PitchInflection *pitchInflection); virtual FunctorCode VisitReh(const Reh *reh); virtual FunctorCode VisitRehEnd(const Reh *reh); + virtual FunctorCode VisitRepeatMark(const RepeatMark *repeatMark); + virtual FunctorCode VisitRepeatMarkEnd(const RepeatMark *repeatMark); virtual FunctorCode VisitSlur(const Slur *slur); virtual FunctorCode VisitSlurEnd(const Slur *slur); virtual FunctorCode VisitTempo(const Tempo *tempo); diff --git a/include/vrv/repeatmark.h b/include/vrv/repeatmark.h new file mode 100644 index 0000000000..2255e8aa92 --- /dev/null +++ b/include/vrv/repeatmark.h @@ -0,0 +1,96 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: repeatmark.h +// Author: Laurent Pugin +// Created: 2023 +// Copyright (c) Authors and others. All rights reserved. +///////////////////////////////////////////////////////////////////////////// + +#ifndef __VRV_REPEATMARK_H__ +#define __VRV_REPEATMARK_H__ + +#include "atts_cmn.h" +#include "atts_externalsymbols.h" +#include "controlelement.h" +#include "textdirinterface.h" +#include "timeinterface.h" + +namespace vrv { + +//---------------------------------------------------------------------------- +// RepeatMark +//---------------------------------------------------------------------------- + +/** + * This class models the MEI element. + */ +class RepeatMark : public ControlElement, + public TextListInterface, + public TextDirInterface, + public TimePointInterface, + public AttColor, + public AttExtSymAuth, + public AttExtSymNames { +public: + /** + * @name Constructors, destructors, and other standard methods + * Reset method reset all attribute classes + */ + ///@{ + RepeatMark(); + virtual ~RepeatMark(); + Object *Clone() const override { return new RepeatMark(*this); } + void Reset() override; + std::string GetClassName() const override { return "RepeatMark"; } + ///@} + + /** + * @name Getter to interfaces + */ + ///@{ + TextDirInterface *GetTextDirInterface() override { return vrv_cast(this); } + const TextDirInterface *GetTextDirInterface() const override { return vrv_cast(this); } + TimePointInterface *GetTimePointInterface() override { return vrv_cast(this); } + const TimePointInterface *GetTimePointInterface() const override + { + return vrv_cast(this); + } + ///@} + + /** + * Add an element (text, rend. etc.) to a ornam. + * Only supported elements will be actually added to the child list. + */ + bool IsSupportedChild(Object *object) override; + + /** + * Get the SMuFL glyph for the repeatMark based on func or glyph.num + */ + char32_t GetMarkGlyph() const; + + //----------// + // Functors // + //----------// + + /** + * Interface for class functor visitation + */ + ///@{ + FunctorCode Accept(Functor &functor) override; + FunctorCode Accept(ConstFunctor &functor) const override; + FunctorCode AcceptEnd(Functor &functor) override; + FunctorCode AcceptEnd(ConstFunctor &functor) const override; + ///@} + +protected: + // +private: + // +public: + // +private: + // +}; + +} // namespace vrv + +#endif diff --git a/include/vrv/vrvdef.h b/include/vrv/vrvdef.h index 26d5072727..811bddc893 100644 --- a/include/vrv/vrvdef.h +++ b/include/vrv/vrvdef.h @@ -198,6 +198,7 @@ enum ClassId : uint16_t { PHRASE, PITCHINFLECTION, REH, + REPEATMARK, SLUR, TEMPO, TIE, diff --git a/src/functorinterface.cpp b/src/functorinterface.cpp index c81cbf8bb7..279a5cd9a4 100644 --- a/src/functorinterface.cpp +++ b/src/functorinterface.cpp @@ -89,6 +89,7 @@ #include "proport.h" #include "reh.h" #include "rend.h" +#include "repeatmark.h" #include "rest.h" #include "sb.h" #include "score.h" @@ -694,6 +695,16 @@ FunctorCode FunctorInterface::VisitRehEnd(Reh *reh) return this->VisitControlElementEnd(reh); } +FunctorCode FunctorInterface::VisitRepeatMark(RepeatMark *repeatMark) +{ + return this->VisitControlElement(repeatMark); +} + +FunctorCode FunctorInterface::VisitRepeatMarkEnd(RepeatMark *repeatMark) +{ + return this->VisitControlElementEnd(repeatMark); +} + FunctorCode FunctorInterface::VisitSlur(Slur *slur) { return this->VisitControlElement(slur); @@ -1968,6 +1979,16 @@ FunctorCode ConstFunctorInterface::VisitRehEnd(const Reh *reh) return this->VisitControlElementEnd(reh); } +FunctorCode ConstFunctorInterface::VisitRepeatMark(const RepeatMark *repeatMark) +{ + return this->VisitControlElement(repeatMark); +} + +FunctorCode ConstFunctorInterface::VisitRepeatMarkEnd(const RepeatMark *repeatMark) +{ + return this->VisitControlElementEnd(repeatMark); +} + FunctorCode ConstFunctorInterface::VisitSlur(const Slur *slur) { return this->VisitControlElement(slur); diff --git a/src/repeatmark.cpp b/src/repeatmark.cpp new file mode 100644 index 0000000000..2156b707ca --- /dev/null +++ b/src/repeatmark.cpp @@ -0,0 +1,119 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: repeatmark.cpp +// Author: Laurent Pugin +// Created: 2023 +// Copyright (c) Authors and others. All rights reserved. +///////////////////////////////////////////////////////////////////////////// + +#include "repeatmark.h" + +//---------------------------------------------------------------------------- + +#include + +//---------------------------------------------------------------------------- + +#include "editorial.h" +#include "functor.h" +#include "layerelement.h" +#include "resources.h" +#include "smufl.h" +#include "symbol.h" +#include "text.h" + +namespace vrv { + +//---------------------------------------------------------------------------- +// RepeatMark +//---------------------------------------------------------------------------- + +static const ClassRegistrar s_factory("repeatMark", REPEATMARK); + +RepeatMark::RepeatMark() + : ControlElement(REPEATMARK, "repeatMark-") + , TextListInterface() + , TextDirInterface() + , TimePointInterface() + , AttColor() + , AttExtSymAuth() + , AttExtSymNames() +{ + this->RegisterInterface(TextDirInterface::GetAttClasses(), TextDirInterface::IsInterface()); + this->RegisterInterface(TimePointInterface::GetAttClasses(), TimePointInterface::IsInterface()); + this->RegisterAttClass(ATT_COLOR); + this->RegisterAttClass(ATT_EXTSYMAUTH); + this->RegisterAttClass(ATT_EXTSYMNAMES); + + this->Reset(); +} + +RepeatMark::~RepeatMark() {} + +void RepeatMark::Reset() +{ + ControlElement::Reset(); + TextDirInterface::Reset(); + TimePointInterface::Reset(); + this->ResetColor(); + this->ResetExtSymAuth(); + this->ResetExtSymNames(); +} + +bool RepeatMark::IsSupportedChild(Object *child) +{ + if (child->Is({ LB, REND, SYMBOL, TEXT })) { + assert(dynamic_cast(child)); + } + else if (child->IsEditorialElement()) { + assert(dynamic_cast(child)); + } + else { + return false; + } + return true; +} + +char32_t RepeatMark::GetMarkGlyph() const +{ + const Resources *resources = this->GetDocResources(); + if (!resources) return 0; + + // If there is glyph.num, prioritize it + if (this->HasGlyphNum()) { + char32_t code = this->GetGlyphNum(); + if (NULL != resources->GetGlyph(code)) return code; + } + // If there is glyph.name (second priority) + else if (this->HasGlyphName()) { + char32_t code = resources->GetGlyphCode(this->GetGlyphName()); + if (NULL != resources->GetGlyph(code)) return code; + } + + return SMUFL_E567_ornamentTurn; +} + +//---------------------------------------------------------------------------- +// RepeatMark functor methods +//---------------------------------------------------------------------------- + +FunctorCode RepeatMark::Accept(Functor &functor) +{ + return functor.VisitRepeatMark(this); +} + +FunctorCode RepeatMark::Accept(ConstFunctor &functor) const +{ + return functor.VisitRepeatMark(this); +} + +FunctorCode RepeatMark::AcceptEnd(Functor &functor) +{ + return functor.VisitRepeatMarkEnd(this); +} + +FunctorCode RepeatMark::AcceptEnd(ConstFunctor &functor) const +{ + return functor.VisitRepeatMarkEnd(this); +} + +} // namespace vrv From fe038e8d3ae578fb9048dd2a5df95a0ab243d3cc Mon Sep 17 00:00:00 2001 From: Laurent Pugin Date: Tue, 13 Jun 2023 08:26:15 +0200 Subject: [PATCH 138/151] Add reading and writing repeatMark --- include/vrv/iomei.h | 3 +++ src/iomei.cpp | 36 ++++++++++++++++++++++++++++++++++++ 2 files changed, 39 insertions(+) diff --git a/include/vrv/iomei.h b/include/vrv/iomei.h index 0bfb7b64c9..16d280c501 100644 --- a/include/vrv/iomei.h +++ b/include/vrv/iomei.h @@ -125,6 +125,7 @@ class Ref; class Reg; class Reh; class Rend; +class RepeatMark; class Rest; class Restore; class RunningElement; @@ -443,6 +444,7 @@ class MEIOutput : public Output { void WritePhrase(pugi::xml_node currentNode, Phrase *phrase); void WritePitchInflection(pugi::xml_node currentNode, PitchInflection *pitchInflection); void WriteReh(pugi::xml_node currentNode, Reh *reh); + void WriteRepeatMark(pugi::xml_node currentNode, RepeatMark *repeatMark); void WriteSlur(pugi::xml_node currentNode, Slur *slur); void WriteTempo(pugi::xml_node currentNode, Tempo *tempo); void WriteTie(pugi::xml_node currentNode, Tie *tie); @@ -752,6 +754,7 @@ class MEIInput : public Input { bool ReadPedal(Object *parent, pugi::xml_node pedal); bool ReadPhrase(Object *parent, pugi::xml_node phrase); bool ReadPitchInflection(Object *parent, pugi::xml_node pitchInflection); + bool ReadRepeatMark(Object *parent, pugi::xml_node repeatMark); bool ReadReh(Object *parent, pugi::xml_node reh); bool ReadSlur(Object *parent, pugi::xml_node slur); bool ReadTempo(Object *parent, pugi::xml_node tempo); diff --git a/src/iomei.cpp b/src/iomei.cpp index 974ba3bcd3..cfc59a163c 100644 --- a/src/iomei.cpp +++ b/src/iomei.cpp @@ -112,6 +112,7 @@ #include "ref.h" #include "reg.h" #include "reh.h" +#include "repeatmark.h" #include "rend.h" #include "rest.h" #include "restore.h" @@ -550,6 +551,10 @@ bool MEIOutput::WriteObjectInternal(Object *object, bool useCustomScoreDef) m_currentNode = m_currentNode.append_child("reh"); this->WriteReh(m_currentNode, vrv_cast(object)); } + else if (object->Is(REPEATMARK)) { + m_currentNode = m_currentNode.append_child("repeatMark"); + this->WriteRepeatMark(m_currentNode, vrv_cast(object)); + } else if (object->Is(SLUR)) { m_currentNode = m_currentNode.append_child("slur"); this->WriteSlur(m_currentNode, vrv_cast(object)); @@ -2173,6 +2178,18 @@ void MEIOutput::WriteReh(pugi::xml_node currentNode, Reh *reh) reh->WriteVerticalGroup(currentNode); } +void MEIOutput::WriteRepeatMark(pugi::xml_node currentNode, RepeatMark *repeatMark) +{ + assert(repeatMark); + + this->WriteControlElement(currentNode, repeatMark); + this->WriteTextDirInterface(currentNode, repeatMark); + this->WriteTimePointInterface(currentNode, repeatMark); + repeatMark->WriteColor(currentNode); + repeatMark->WriteExtSymAuth(currentNode); + repeatMark->WriteExtSymNames(currentNode); +} + void MEIOutput::WriteSlur(pugi::xml_node currentNode, Slur *slur) { assert(slur); @@ -5341,6 +5358,9 @@ bool MEIInput::ReadMeasureChildren(Object *parent, pugi::xml_node parentNode) else if (currentName == "reh") { success = this->ReadReh(parent, current); } + else if (currentName == "repeatMark") { + success = this->ReadRepeatMark(parent, current); + } else if (currentName == "slur") { success = this->ReadSlur(parent, current); } @@ -5782,6 +5802,22 @@ bool MEIInput::ReadReh(Object *parent, pugi::xml_node reh) return this->ReadTextChildren(vrvReh, reh, vrvReh); } +bool MEIInput::ReadRepeatMark(Object *parent, pugi::xml_node repeatMark) +{ + RepeatMark *vrvRepeatMark = new RepeatMark(); + this->ReadControlElement(repeatMark, vrvRepeatMark); + + this->ReadTextDirInterface(repeatMark, vrvRepeatMark); + this->ReadTimePointInterface(repeatMark, vrvRepeatMark); + vrvRepeatMark->ReadColor(repeatMark); + vrvRepeatMark->ReadExtSymAuth(repeatMark); + vrvRepeatMark->ReadExtSymNames(repeatMark); + + parent->AddChild(vrvRepeatMark); + this->ReadUnsupportedAttr(repeatMark, vrvRepeatMark); + return this->ReadTextChildren(vrvRepeatMark, repeatMark, vrvRepeatMark); +} + bool MEIInput::ReadSlur(Object *parent, pugi::xml_node slur) { Slur *vrvSlur = new Slur(); From c59158f5c66a7d0310f43e86644198c2522844cb Mon Sep 17 00:00:00 2001 From: Laurent Pugin Date: Tue, 13 Jun 2023 09:42:07 +0200 Subject: [PATCH 139/151] Add flag for generated Text --- include/vrv/savefunctor.h | 2 ++ include/vrv/text.h | 12 ++++++++++++ src/savefunctor.cpp | 21 +++++++++++++++++++++ src/text.cpp | 2 ++ 4 files changed, 37 insertions(+) diff --git a/include/vrv/savefunctor.h b/include/vrv/savefunctor.h index a8ed923304..b18c5e89bc 100644 --- a/include/vrv/savefunctor.h +++ b/include/vrv/savefunctor.h @@ -54,6 +54,8 @@ class SaveFunctor : public Functor { FunctorCode VisitObjectEnd(Object *object) override; FunctorCode VisitRunningElement(RunningElement *runningElement) override; FunctorCode VisitRunningElementEnd(RunningElement *runningElement) override; + FunctorCode VisitText(Text *text) override; + FunctorCode VisitTextEnd(Text *text) override; FunctorCode VisitTupletBracket(TupletBracket *tupletBracket) override; FunctorCode VisitTupletBracketEnd(TupletBracket *tupletBracket) override; FunctorCode VisitTupletNum(TupletNum *tupletNum) override; diff --git a/include/vrv/text.h b/include/vrv/text.h index aa86efd52b..f19e22bf56 100644 --- a/include/vrv/text.h +++ b/include/vrv/text.h @@ -44,6 +44,14 @@ class Text : public TextElement { std::u32string GetText() const { return m_text; } ///@} + /** + * @name Setter and getter of the generated flag + */ + ///@{ + bool IsGenerated() const { return m_isGenerated; } + void IsGenerated(bool isGenerated) { m_isGenerated = isGenerated; } + ///@} + /** * Interface for class functor visitation */ @@ -63,6 +71,10 @@ class Text : public TextElement { std::u32string m_text; private: + /** + * Flag indicating whether or not the text content was generated + */ + bool m_isGenerated; }; } // namespace vrv diff --git a/src/savefunctor.cpp b/src/savefunctor.cpp index 641845a126..2d9adb2245 100644 --- a/src/savefunctor.cpp +++ b/src/savefunctor.cpp @@ -14,6 +14,7 @@ #include "mdiv.h" #include "mnum.h" #include "runningelement.h" +#include "text.h" //---------------------------------------------------------------------------- @@ -149,6 +150,26 @@ FunctorCode SaveFunctor::VisitRunningElementEnd(RunningElement *runningElement) } } +FunctorCode SaveFunctor::VisitText(Text *text) +{ + if (text->IsGenerated()) { + return FUNCTOR_SIBLINGS; + } + else { + return this->VisitObject(text); + } +} + +FunctorCode SaveFunctor::VisitTextEnd(Text *text) +{ + if (text->IsGenerated()) { + return FUNCTOR_SIBLINGS; + } + else { + return this->VisitObjectEnd(text); + } +} + FunctorCode SaveFunctor::VisitTupletBracket(TupletBracket *tupletBracket) { // Ignore tuplet brackets during save diff --git a/src/text.cpp b/src/text.cpp index 7cc70355ae..4f8af6f28f 100644 --- a/src/text.cpp +++ b/src/text.cpp @@ -33,6 +33,8 @@ Text::~Text() {} void Text::Reset() { TextElement::Reset(); + + m_isGenerated = false; } FunctorCode Text::Accept(Functor &functor) From 95a3bda59a632d9235d3b1ca8f997fb79dede2ef Mon Sep 17 00:00:00 2001 From: Laurent Pugin Date: Tue, 13 Jun 2023 09:45:12 +0200 Subject: [PATCH 140/151] Add functors to prepare and reset repeatMark * Add a generated Text content for repeatMark with 'fine' (test on `@func` to be added) --- include/vrv/preparedatafunctor.h | 1 + include/vrv/resetfunctor.h | 1 + src/preparedatafunctor.cpp | 17 +++++++++++++++++ src/resetfunctor.cpp | 11 +++++++++++ 4 files changed, 30 insertions(+) diff --git a/include/vrv/preparedatafunctor.h b/include/vrv/preparedatafunctor.h index ba70385fbf..9267fc3ed0 100644 --- a/include/vrv/preparedatafunctor.h +++ b/include/vrv/preparedatafunctor.h @@ -45,6 +45,7 @@ class PrepareDataInitializationFunctor : public DocFunctor { FunctorCode VisitChord(Chord *chord) override; FunctorCode VisitFloatingObject(FloatingObject *floatingObject) override; FunctorCode VisitKeySig(KeySig *keySig) override; + FunctorCode VisitRepeatMark(RepeatMark *repeatMark) override; FunctorCode VisitRunningElement(RunningElement *runningElement) override; FunctorCode VisitScore(Score *score) override; ///@} diff --git a/include/vrv/resetfunctor.h b/include/vrv/resetfunctor.h index 09ad003db6..c254946f89 100644 --- a/include/vrv/resetfunctor.h +++ b/include/vrv/resetfunctor.h @@ -61,6 +61,7 @@ class ResetDataFunctor : public Functor { FunctorCode VisitMeasure(Measure *measure) override; FunctorCode VisitMRest(MRest *mRest) override; FunctorCode VisitNote(Note *note) override; + FunctorCode VisitRepeatMark(RepeatMark *repeatMark) override; FunctorCode VisitRest(Rest *rest) override; FunctorCode VisitSection(Section *section) override; FunctorCode VisitSlur(Slur *slur) override; diff --git a/src/preparedatafunctor.cpp b/src/preparedatafunctor.cpp index e3d69c70de..b3fc208d45 100644 --- a/src/preparedatafunctor.cpp +++ b/src/preparedatafunctor.cpp @@ -27,6 +27,7 @@ #include "pedal.h" #include "plistinterface.h" #include "reh.h" +#include "repeatmark.h" #include "rest.h" #include "runningelement.h" #include "score.h" @@ -38,6 +39,7 @@ #include "system.h" #include "tabdursym.h" #include "tabgrp.h" +#include "text.h" #include "timestamp.h" #include "tuplet.h" #include "turn.h" @@ -81,6 +83,21 @@ FunctorCode PrepareDataInitializationFunctor::VisitKeySig(KeySig *keySig) return FUNCTOR_CONTINUE; } +FunctorCode PrepareDataInitializationFunctor::VisitRepeatMark(RepeatMark *repeatMark) +{ + // Call parent one too + this->VisitControlElement(repeatMark); + + if (repeatMark->GetChildCount() == 0) { + Text *fine = new Text(); + fine->IsGenerated(true); + fine->SetText(U"Fine"); + repeatMark->AddChild(fine); + } + + return FUNCTOR_CONTINUE; +} + FunctorCode PrepareDataInitializationFunctor::VisitRunningElement(RunningElement *runningElement) { runningElement->ResetCells(); diff --git a/src/resetfunctor.cpp b/src/resetfunctor.cpp index afbc96b311..a719613c2d 100644 --- a/src/resetfunctor.cpp +++ b/src/resetfunctor.cpp @@ -24,6 +24,7 @@ #include "mrest.h" #include "octave.h" #include "page.h" +#include "repeatmark.h" #include "rest.h" #include "runningelement.h" #include "section.h" @@ -310,6 +311,16 @@ FunctorCode ResetDataFunctor::VisitNote(Note *note) return FUNCTOR_CONTINUE; } +FunctorCode ResetDataFunctor::VisitRepeatMark(RepeatMark *repeatMark) +{ + // Call parent one too + this->VisitControlElement(repeatMark); + + // For now doing nothing, but we should eventually remove generated text when the @func is not 'fine' anymore + + return FUNCTOR_CONTINUE; +} + FunctorCode ResetDataFunctor::VisitRest(Rest *rest) { // Call parent one too From 19f23084bce3125d6c939d01a32754ba2cc0cb40 Mon Sep 17 00:00:00 2001 From: Laurent Pugin Date: Tue, 13 Jun 2023 09:51:04 +0200 Subject: [PATCH 141/151] Add AttRepeatMarkLog to RepeatMark --- include/vrv/repeatmark.h | 3 ++- src/iomei.cpp | 4 +++- src/repeatmark.cpp | 3 +++ 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/include/vrv/repeatmark.h b/include/vrv/repeatmark.h index 2255e8aa92..87e3cadd8d 100644 --- a/include/vrv/repeatmark.h +++ b/include/vrv/repeatmark.h @@ -29,7 +29,8 @@ class RepeatMark : public ControlElement, public TimePointInterface, public AttColor, public AttExtSymAuth, - public AttExtSymNames { + public AttExtSymNames, + public AttRepeatMarkLog { public: /** * @name Constructors, destructors, and other standard methods diff --git a/src/iomei.cpp b/src/iomei.cpp index cfc59a163c..5ba5902a44 100644 --- a/src/iomei.cpp +++ b/src/iomei.cpp @@ -112,8 +112,8 @@ #include "ref.h" #include "reg.h" #include "reh.h" -#include "repeatmark.h" #include "rend.h" +#include "repeatmark.h" #include "rest.h" #include "restore.h" #include "sb.h" @@ -2188,6 +2188,7 @@ void MEIOutput::WriteRepeatMark(pugi::xml_node currentNode, RepeatMark *repeatMa repeatMark->WriteColor(currentNode); repeatMark->WriteExtSymAuth(currentNode); repeatMark->WriteExtSymNames(currentNode); + repeatMark->WriteRepeatMarkLog(currentNode); } void MEIOutput::WriteSlur(pugi::xml_node currentNode, Slur *slur) @@ -5812,6 +5813,7 @@ bool MEIInput::ReadRepeatMark(Object *parent, pugi::xml_node repeatMark) vrvRepeatMark->ReadColor(repeatMark); vrvRepeatMark->ReadExtSymAuth(repeatMark); vrvRepeatMark->ReadExtSymNames(repeatMark); + vrvRepeatMark->ReadRepeatMarkLog(repeatMark); parent->AddChild(vrvRepeatMark); this->ReadUnsupportedAttr(repeatMark, vrvRepeatMark); diff --git a/src/repeatmark.cpp b/src/repeatmark.cpp index 2156b707ca..7e3bdcc705 100644 --- a/src/repeatmark.cpp +++ b/src/repeatmark.cpp @@ -37,12 +37,14 @@ RepeatMark::RepeatMark() , AttColor() , AttExtSymAuth() , AttExtSymNames() + , AttRepeatMarkLog() { this->RegisterInterface(TextDirInterface::GetAttClasses(), TextDirInterface::IsInterface()); this->RegisterInterface(TimePointInterface::GetAttClasses(), TimePointInterface::IsInterface()); this->RegisterAttClass(ATT_COLOR); this->RegisterAttClass(ATT_EXTSYMAUTH); this->RegisterAttClass(ATT_EXTSYMNAMES); + this->RegisterAttClass(ATT_REPEATMARKLOG); this->Reset(); } @@ -57,6 +59,7 @@ void RepeatMark::Reset() this->ResetColor(); this->ResetExtSymAuth(); this->ResetExtSymNames(); + this->ResetRepeatMarkLog(); } bool RepeatMark::IsSupportedChild(Object *child) From aceccb37033b3a21e4e1ae8f1121b2d90383636c Mon Sep 17 00:00:00 2001 From: Laurent Pugin Date: Tue, 13 Jun 2023 09:52:57 +0200 Subject: [PATCH 142/151] Add `func` test to RepeatMark prepare data functor --- src/preparedatafunctor.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/preparedatafunctor.cpp b/src/preparedatafunctor.cpp index b3fc208d45..9975f8101a 100644 --- a/src/preparedatafunctor.cpp +++ b/src/preparedatafunctor.cpp @@ -88,7 +88,7 @@ FunctorCode PrepareDataInitializationFunctor::VisitRepeatMark(RepeatMark *repeat // Call parent one too this->VisitControlElement(repeatMark); - if (repeatMark->GetChildCount() == 0) { + if (repeatMark->GetChildCount() == 0 && repeatMark->HasFunc() && repeatMark->GetFunc() == repeatMarkLog_FUNC_fine) { Text *fine = new Text(); fine->IsGenerated(true); fine->SetText(U"Fine"); From 592ef8ced5c918510b64cb17f92eb88919cbfa01 Mon Sep 17 00:00:00 2001 From: Laurent Pugin Date: Tue, 13 Jun 2023 10:12:30 +0200 Subject: [PATCH 143/151] Implementation of rendering for RepeatMark --- include/vrv/view.h | 4 +- src/adjustfloatingpositionerfunctor.cpp | 3 + src/adjustxoverflowfunctor.cpp | 2 +- src/controlelement.cpp | 2 +- src/floatingobject.cpp | 8 +++ src/repeatmark.cpp | 8 ++- src/view_control.cpp | 77 ++++++++++++++++++++++++- src/view_text.cpp | 2 +- 8 files changed, 98 insertions(+), 8 deletions(-) diff --git a/include/vrv/view.h b/include/vrv/view.h index 4e3756a9a9..07008de232 100644 --- a/include/vrv/view.h +++ b/include/vrv/view.h @@ -67,6 +67,7 @@ class PgHead2; class PitchInflection; class Reh; class Rend; +class RepeatMark; class RunningElement; class Slur; class Staff; @@ -427,7 +428,7 @@ class View { char32_t endGlyph, int x, int y, int height, bool cueSize); void DrawBreath(DeviceContext *dc, Breath *breath, Measure *measure, System *system); void DrawCaesura(DeviceContext *dc, Caesura *caesura, Measure *measure, System *system); - void DrawDirOrOrnam(DeviceContext *dc, ControlElement *element, Measure *measure, System *system); + void DrawControlElementText(DeviceContext *dc, ControlElement *element, Measure *measure, System *system); void DrawDynam(DeviceContext *dc, Dynam *dynam, Measure *measure, System *system); void DrawDynamSymbolOnly(DeviceContext *dc, Staff *staff, Dynam *dynam, const std::u32string &dynamSymbol, data_HORIZONTALALIGNMENT alignment, TextDrawingParams ¶ms); @@ -437,6 +438,7 @@ class View { void DrawMordent(DeviceContext *dc, Mordent *mordent, Measure *measure, System *system); void DrawPedal(DeviceContext *dc, Pedal *pedal, Measure *measure, System *system); void DrawReh(DeviceContext *dc, Reh *reh, Measure *measure, System *system); + void DrawRepeatMark(DeviceContext *dc, RepeatMark *repeatMark, Measure *measure, System *system); void DrawTempo(DeviceContext *dc, Tempo *tempo, Measure *measure, System *system); void DrawTrill(DeviceContext *dc, Trill *trill, Measure *measure, System *system); void DrawTurn(DeviceContext *dc, Turn *turn, Measure *measure, System *system); diff --git a/src/adjustfloatingpositionerfunctor.cpp b/src/adjustfloatingpositionerfunctor.cpp index daf8517896..205b7eb446 100644 --- a/src/adjustfloatingpositionerfunctor.cpp +++ b/src/adjustfloatingpositionerfunctor.cpp @@ -214,6 +214,9 @@ FunctorCode AdjustFloatingPositionersFunctor::VisitSystem(System *system) adjustFloatingPositionerGrps.SetPlace(STAFFREL_below); system->m_systemAligner.Process(adjustFloatingPositionerGrps); + m_classId = REPEATMARK; + system->m_systemAligner.Process(*this); + m_classId = TEMPO; system->m_systemAligner.Process(*this); diff --git a/src/adjustxoverflowfunctor.cpp b/src/adjustxoverflowfunctor.cpp index 07991256a0..f095f61a52 100644 --- a/src/adjustxoverflowfunctor.cpp +++ b/src/adjustxoverflowfunctor.cpp @@ -32,7 +32,7 @@ AdjustXOverflowFunctor::AdjustXOverflowFunctor(int margin) : Functor() FunctorCode AdjustXOverflowFunctor::VisitControlElement(ControlElement *controlElement) { - if (!controlElement->Is({ DIR, DYNAM, ORNAM, TEMPO })) { + if (!controlElement->Is({ DIR, DYNAM, ORNAM, REPEATMARK, TEMPO })) { return FUNCTOR_SIBLINGS; } diff --git a/src/controlelement.cpp b/src/controlelement.cpp index 910e205492..9891f5aaeb 100644 --- a/src/controlelement.cpp +++ b/src/controlelement.cpp @@ -82,7 +82,7 @@ data_HORIZONTALALIGNMENT ControlElement::GetChildRendAlignment() const data_STAFFREL ControlElement::GetLayerPlace(data_STAFFREL defaultValue) const { // Do this only for the following elements - if (!this->Is({ TRILL, MORDENT, ORNAM, TURN })) return defaultValue; + if (!this->Is({ TRILL, MORDENT, ORNAM, REPEATMARK, TURN })) return defaultValue; const TimePointInterface *interface = this->GetTimePointInterface(); assert(interface); diff --git a/src/floatingobject.cpp b/src/floatingobject.cpp index 86cda0cb43..56fc4dbe58 100644 --- a/src/floatingobject.cpp +++ b/src/floatingobject.cpp @@ -33,6 +33,7 @@ #include "pedal.h" #include "pitchinflection.h" #include "reh.h" +#include "repeatmark.h" #include "slur.h" #include "staff.h" #include "tempo.h" @@ -314,6 +315,13 @@ FloatingPositioner::FloatingPositioner(FloatingObject *object, StaffAlignment *a // reh above by default m_place = (reh->GetPlace() != STAFFREL_NONE) ? reh->GetPlace() : STAFFREL_above; } + else if (object->Is(REPEATMARK)) { + RepeatMark *repeatMark = vrv_cast(object); + assert(repeatMark); + // repeatMark above by default + m_place = (repeatMark->GetPlace() != STAFFREL_NONE) ? repeatMark->GetPlace() + : repeatMark->GetLayerPlace(STAFFREL_above); + } else if (object->Is(TEMPO)) { Tempo *tempo = vrv_cast(object); assert(tempo); diff --git a/src/repeatmark.cpp b/src/repeatmark.cpp index 7e3bdcc705..02d4fa6df0 100644 --- a/src/repeatmark.cpp +++ b/src/repeatmark.cpp @@ -92,7 +92,13 @@ char32_t RepeatMark::GetMarkGlyph() const if (NULL != resources->GetGlyph(code)) return code; } - return SMUFL_E567_ornamentTurn; + switch (this->GetFunc()) { + case (repeatMarkLog_FUNC_coda): return SMUFL_E048_coda; + case (repeatMarkLog_FUNC_segno): return SMUFL_E047_segno; + case (repeatMarkLog_FUNC_daCapo): return SMUFL_E046_daCapo; + case (repeatMarkLog_FUNC_dalSegno): return SMUFL_E045_dalSegno; + default: return SMUFL_E047_segno; + } } //---------------------------------------------------------------------------- diff --git a/src/view_control.cpp b/src/view_control.cpp index aa711b1d72..4622b6a891 100644 --- a/src/view_control.cpp +++ b/src/view_control.cpp @@ -46,6 +46,7 @@ #include "pitchinflection.h" #include "reh.h" #include "rend.h" +#include "repeatmark.h" #include "score.h" #include "slur.h" #include "smufl.h" @@ -99,7 +100,7 @@ void View::DrawControlElement(DeviceContext *dc, ControlElement *element, Measur else if (element->Is(DIR)) { Dir *dir = vrv_cast

(element); assert(dir); - this->DrawDirOrOrnam(dc, dir, measure, system); + this->DrawControlElementText(dc, dir, measure, system); system->AddToDrawingListIfNecessary(dir); } else if (element->Is(DYNAM)) { @@ -131,7 +132,7 @@ void View::DrawControlElement(DeviceContext *dc, ControlElement *element, Measur else if (element->Is(ORNAM)) { Ornam *ornam = vrv_cast(element); assert(ornam); - this->DrawDirOrOrnam(dc, ornam, measure, system); + this->DrawControlElementText(dc, ornam, measure, system); } else if (element->Is(PEDAL)) { Pedal *pedal = vrv_cast(element); @@ -144,6 +145,11 @@ void View::DrawControlElement(DeviceContext *dc, ControlElement *element, Measur assert(reh); this->DrawReh(dc, reh, measure, system); } + else if (element->Is(REPEATMARK)) { + RepeatMark *repeatMark = vrv_cast(element); + assert(repeatMark); + this->DrawRepeatMark(dc, repeatMark, measure, system); + } else if (element->Is(TEMPO)) { Tempo *tempo = vrv_cast(element); assert(tempo); @@ -1561,7 +1567,7 @@ void View::DrawCaesura(DeviceContext *dc, Caesura *caesura, Measure *measure, Sy dc->EndGraphic(caesura, this); } -void View::DrawDirOrOrnam(DeviceContext *dc, ControlElement *element, Measure *measure, System *system) +void View::DrawControlElementText(DeviceContext *dc, ControlElement *element, Measure *measure, System *system) { assert(dc); assert(system); @@ -2449,6 +2455,71 @@ void View::DrawReh(DeviceContext *dc, Reh *reh, Measure *measure, System *system dc->EndGraphic(reh, this); } +void View::DrawRepeatMark(DeviceContext *dc, RepeatMark *repeatMark, Measure *measure, System *system) +{ + assert(dc); + assert(system); + assert(measure); + assert(repeatMark); + + // Cannot draw a turn that has no start position + if (!repeatMark->GetStart()) return; + + if (repeatMark->GetChildCount() > 0) { + this->DrawControlElementText(dc, repeatMark, measure, system); + return; + } + + dc->StartGraphic(repeatMark, "", repeatMark->GetID()); + + SymbolDef *symbolDef = NULL; + if (repeatMark->HasAltsym() && repeatMark->HasAltSymbolDef()) { + symbolDef = repeatMark->GetAltSymbolDef(); + } + + int x = repeatMark->GetStart()->GetDrawingX() + repeatMark->GetStart()->GetDrawingRadius(m_doc); + + // set norm as default + int code = repeatMark->GetMarkGlyph(); + + data_HORIZONTALALIGNMENT alignment = HORIZONTALALIGNMENT_center; + // center the turn only with @startid + if (repeatMark->GetStart()->Is(TIMESTAMP_ATTR)) { + alignment = HORIZONTALALIGNMENT_left; + } + + std::u32string str; + str.push_back(code); + + std::vector staffList = repeatMark->GetTstampStaves(measure, repeatMark); + for (Staff *staff : staffList) { + if (!system->SetCurrentFloatingPositioner(staff->GetN(), repeatMark, repeatMark->GetStart(), staff)) { + continue; + } + const int staffSize = staff->m_drawingStaffSize; + + const int y = repeatMark->GetDrawingY(); + + const int turnHeight = (symbolDef) ? symbolDef->GetSymbolHeight(m_doc, staffSize, false) + : m_doc->GetGlyphHeight(code, staffSize, false); + const int turnWidth = (symbolDef) ? symbolDef->GetSymbolWidth(m_doc, staffSize, false) + : m_doc->GetGlyphWidth(code, staffSize, false); + + dc->SetFont(m_doc->GetDrawingSmuflFont(staffSize, false)); + + if (symbolDef) { + this->DrawSymbolDef(dc, repeatMark, symbolDef, x, y, staffSize, false, alignment); + } + else { + this->DrawSmuflString(dc, x, y, str, alignment, staffSize); + } + + dc->ResetFont(); + } + + dc->EndGraphic(repeatMark, this); +} + void View::DrawTempo(DeviceContext *dc, Tempo *tempo, Measure *measure, System *system) { assert(dc); diff --git a/src/view_text.cpp b/src/view_text.cpp index 56ab13022d..24317ea76e 100644 --- a/src/view_text.cpp +++ b/src/view_text.cpp @@ -489,7 +489,7 @@ void View::DrawText(DeviceContext *dc, Text *text, TextDrawingParams ¶ms) } // special case where we want to replace some unicode music points to SMuFL - if (text->GetFirstAncestor(DIR) || text->GetFirstAncestor(ORNAM)) { + if (text->GetFirstAncestor(DIR) || text->GetFirstAncestor(ORNAM) || text->GetFirstAncestor(REPEATMARK)) { this->DrawDirString(dc, text->GetText(), params); } else if (text->GetFirstAncestor(DYNAM)) { From f7b12dc761be2a6ab95e77272ceeb30a131f5932 Mon Sep 17 00:00:00 2001 From: Laurent Pugin Date: Tue, 13 Jun 2023 10:31:39 +0200 Subject: [PATCH 144/151] Allow symbol within repeatMark --- src/iomei.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/iomei.cpp b/src/iomei.cpp index 5ba5902a44..c714558c3c 100644 --- a/src/iomei.cpp +++ b/src/iomei.cpp @@ -3381,7 +3381,7 @@ bool MEIInput::IsAllowed(std::string element, Object *filterParent) } } // filter for dir or tempo - else if (filterParent->Is({ DIR, ORNAM, TEMPO })) { + else if (filterParent->Is({ DIR, ORNAM, REPEATMARK, TEMPO })) { if (element == "") { return true; } From 33cb93a855277ef1d2a4ab19bc1b550e460b80c7 Mon Sep 17 00:00:00 2001 From: Laurent Pugin Date: Tue, 13 Jun 2023 10:41:10 +0200 Subject: [PATCH 145/151] Remove unused variables --- src/view_control.cpp | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/view_control.cpp b/src/view_control.cpp index 4622b6a891..c17d573f98 100644 --- a/src/view_control.cpp +++ b/src/view_control.cpp @@ -2500,11 +2500,6 @@ void View::DrawRepeatMark(DeviceContext *dc, RepeatMark *repeatMark, Measure *me const int y = repeatMark->GetDrawingY(); - const int turnHeight = (symbolDef) ? symbolDef->GetSymbolHeight(m_doc, staffSize, false) - : m_doc->GetGlyphHeight(code, staffSize, false); - const int turnWidth = (symbolDef) ? symbolDef->GetSymbolWidth(m_doc, staffSize, false) - : m_doc->GetGlyphWidth(code, staffSize, false); - dc->SetFont(m_doc->GetDrawingSmuflFont(staffSize, false)); if (symbolDef) { From 1da4b14310b75241ae890e28a083b743bf49fb6b Mon Sep 17 00:00:00 2001 From: Laurent Pugin Date: Tue, 13 Jun 2023 13:10:16 +0200 Subject: [PATCH 146/151] Fix keySig attribute name in upgrade method --- src/iomei.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/iomei.cpp b/src/iomei.cpp index e6d7576eb0..0000108b4c 100644 --- a/src/iomei.cpp +++ b/src/iomei.cpp @@ -7969,9 +7969,9 @@ void MEIInput::UpgradeKeySigTo_5_0_0(pugi::xml_node keySig) { InstKeySigLog keySigLog; - if (keySig.attribute("key.showchange")) { - data_BOOLEAN showchange = keySigLog.StrToBoolean(keySig.attribute("key.showchange").value()); - keySig.attribute("key.showchange").set_name("cancelaccid"); + if (keySig.attribute("sig.showchange")) { + data_BOOLEAN showchange = keySigLog.StrToBoolean(keySig.attribute("sig.showchange").value()); + keySig.attribute("sig.showchange").set_name("cancelaccid"); if (showchange == BOOLEAN_true) { keySig.attribute("cancelaccid") = keySigLog.CancelaccidToStr(CANCELACCID_before).c_str(); } From 3f4242a67e1213c785d25d89cda3004be289aa7b Mon Sep 17 00:00:00 2001 From: Laurent Pugin Date: Tue, 13 Jun 2023 14:23:32 +0200 Subject: [PATCH 147/151] Add const and fix comments --- src/view_control.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/view_control.cpp b/src/view_control.cpp index c17d573f98..584b7f76f4 100644 --- a/src/view_control.cpp +++ b/src/view_control.cpp @@ -2462,7 +2462,7 @@ void View::DrawRepeatMark(DeviceContext *dc, RepeatMark *repeatMark, Measure *me assert(measure); assert(repeatMark); - // Cannot draw a turn that has no start position + // Cannot draw a mark that has no start position if (!repeatMark->GetStart()) return; if (repeatMark->GetChildCount() > 0) { @@ -2477,13 +2477,13 @@ void View::DrawRepeatMark(DeviceContext *dc, RepeatMark *repeatMark, Measure *me symbolDef = repeatMark->GetAltSymbolDef(); } - int x = repeatMark->GetStart()->GetDrawingX() + repeatMark->GetStart()->GetDrawingRadius(m_doc); + const int x = repeatMark->GetStart()->GetDrawingX() + repeatMark->GetStart()->GetDrawingRadius(m_doc); // set norm as default - int code = repeatMark->GetMarkGlyph(); + const int code = repeatMark->GetMarkGlyph(); data_HORIZONTALALIGNMENT alignment = HORIZONTALALIGNMENT_center; - // center the turn only with @startid + // center the mark only with @startid if (repeatMark->GetStart()->Is(TIMESTAMP_ATTR)) { alignment = HORIZONTALALIGNMENT_left; } From d5f9b30d6b8378ffc828248469426b9e740d6027 Mon Sep 17 00:00:00 2001 From: Laurent Pugin Date: Wed, 14 Jun 2023 08:53:59 +0200 Subject: [PATCH 148/151] Add #include for gcc 13 [skip-ci] --- libmei/dist/atttypes.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/libmei/dist/atttypes.h b/libmei/dist/atttypes.h index 2bdbae4b8b..9b03bdca8c 100644 --- a/libmei/dist/atttypes.h +++ b/libmei/dist/atttypes.h @@ -15,6 +15,8 @@ #ifndef __LIBMEI_ATT_TYPES_H__ #define __LIBMEI_ATT_TYPES_H__ +#include + //---------------------------------------------------------------------------- namespace vrv { From 2e4881c06d87106cc1ccffbbc46921203357a519 Mon Sep 17 00:00:00 2001 From: Laurent Pugin Date: Wed, 14 Jun 2023 08:57:41 +0200 Subject: [PATCH 149/151] Add include to libmei cpp.py [skip-ci] --- libmei/tools/cpp.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/libmei/tools/cpp.py b/libmei/tools/cpp.py index 234dc733d5..dea418be85 100644 --- a/libmei/tools/cpp.py +++ b/libmei/tools/cpp.py @@ -289,6 +289,8 @@ class {elementNameUpper} : public Element{attClasses} {{ #ifndef __LIBMEI_ATT_TYPES_H__ #define __LIBMEI_ATT_TYPES_H__ +#include + //---------------------------------------------------------------------------- namespace {ns} {{ From ed9a8c8a03c70d80dd25968290c844cce387ee78 Mon Sep 17 00:00:00 2001 From: Laurent Pugin Date: Wed, 14 Jun 2023 08:58:13 +0200 Subject: [PATCH 150/151] Update MEI-Basic ODD --- libmei/mei/develop/mei-basic_compiled.odd | 287 +++++++--------------- 1 file changed, 90 insertions(+), 197 deletions(-) diff --git a/libmei/mei/develop/mei-basic_compiled.odd b/libmei/mei/develop/mei-basic_compiled.odd index a10dbc9e4a..2b0686e6db 100644 --- a/libmei/mei/develop/mei-basic_compiled.odd +++ b/libmei/mei/develop/mei-basic_compiled.odd @@ -7,6 +7,10 @@ Authored by Johannes Kepper + + Revisions + Laurent Pugin + In collaboration with The MEI Community @@ -26,6 +30,9 @@ Revisions following the discussions on GitHub, and at the Nashville Hackathon. + + Revisions at the MEI Developers Conference, Charlottesville. + @@ -456,6 +463,24 @@ + + Indicates where cancellation accidentals are shown in a key signature. + + + + Do not show cancellation accidentals. + + + Show cancellation accidentals before the new key accidentals. + + + Show cancellation accidentals after the new key accidentals ("Old style" or "French") + + + Show cancellation accidentals before the barline (also known as "Russian"). + + + Clef line attribute values. The value must be in the range between 1 and the number of lines on the staff. The numbering of lines starts with the lowest line of the staff. @@ -1312,64 +1337,6 @@ - - A token indicating diatonic interval quality and size. - - - [AdMmP][0-9]+ - - - - A token indicating direction of the interval but not its precise value, a diatonic - interval (with optional direction and quality), or a decimal value in half steps. Decimal - values are permitted to accommodate micro-tuning. - - - u|d|s|n|sd|su - - (\+|\-)?([AdMmP])?[0-9]+ - - (\+|\-)?\d+(\.\d+)?hs - - - -

- - Interval direction only: - u = up/higher, - d = down/lower, - s = same, - n = neutral/unknown, - sd = same or lower (but not higher), - su = same or higher (but not lower) - -

-

- - Interval direction, quality, and size: - optional sign, - - - optional quality indicator: - A = augmented, - d = diminished, - M = major, - m = minor, - P = perfect - - - integer value - -

-

- - Interval in half steps: - optional sign, - decimal value - "hs" - -

-
ISO date formats. @@ -1584,97 +1551,6 @@ - - Indication of melodic function, i.e., anticipation, lower neighbor, escape tone, - etc. - - - - Accented lower neighbor. - - - Anticipation. - - - Appogiatura. - - - Accented passing tone. - - - Arpeggio tone (chordal tone). - - - Arpeggio tone (7th added to the chord). - - - Accented upper neighbor. - - - Changing tone. - - - Chromatic lower neighbor. - - - Chord tone (i.e., not an embellishment). - - - Chord tone (7th added to the chord). - - - Chromatic upper neighbor. - - - Chromatic unaccented passing tone. - - - Escape tone. - - - Lower neighbor. - - - Pedal tone. - - - Repeated tone. - - - Retardation. - - - 2-3 retardation. - - - 7-8 retardation. - - - Suspension. - - - 4-3 suspension. - - - 9-8 suspension. - - - 7-6 suspension. - - - Upper neighbor. - - - Upper neighbor (7th added to the chord). - - - Unaccented passing tone. - - - Unaccented passing tone (7th added to the chord). - - - Mensuration signs attribute values. @@ -2655,13 +2531,6 @@

An alternating pattern with "alt1" and "alt2" starts from the first page. However, if header or footer with a func="first" is also defined, it will shift the pattern by one page. A header or footer with func="last" will interupt the pattern.

-
- Pclass (pitch class) attribute values. - - - 11 - - The pitch names (gamut) used within a single octave. The default values conform to Acoustical Society of America representation. @@ -2723,13 +2592,6 @@ - - Scale degree values. - - - (\^|v)?[1-7](\+|\-)? - - The number of slashes to be rendered for tremolandi. @@ -2968,12 +2830,6 @@ Surrounded by double quotes. - - Italicized (slanted to right). - - - Oblique (slanted to left). - Small capitals. @@ -3098,9 +2954,7 @@ (\p{L}|\p{N}|\p{P}|\p{S})* - - Analytical domain attributes. - + Analytical domain attributes. Logical, that is, written, duration attribute values for the CMN repertoire. @@ -4999,7 +4853,7 @@ chord definitionChord tablature definition. - + @@ -5860,6 +5714,11 @@ + + Logical domain attributes. + + + Attributes that apply to all written events, e.g., note, chord, rest, etc. Attributes that record horizontal alignment. @@ -5886,7 +5745,7 @@ Used by staffDef and scoreDef to provide default values for attributes in the logical domain that are related to key signatures. - + Written key signature. @@ -6330,27 +6189,7 @@ - - Logical domain attributes. - - - - - - - - - Attributes that express duration of rests in musical terms. - - - Records the duration of a rest using the relative durational values provided by the - data.DURATIONRESTS datatype. - - - - - - + Logical domain attributes. Logical domain attributes. @@ -7067,7 +6906,18 @@ be recorded for the accidental or when multiple accidentals occur on a single note. The func attribute can be used to differentiate between the accidental’s functions, such as 'cautionary' or 'editorial'.

-
articulationAn indication of how to play a note or chord. + A person or organization who transcribes a musical composition, usually for a different + medium from that of the original; in an arrangement the musical substance remains essentially + unchanged. + + + + + + + + + articulationAn indication of how to play a note or chord. @@ -7179,6 +7029,15 @@ + The name of the creator of the intellectual content of a musical work. + + + + + + + + A string identifying a point in time or the time period between two such points.

This element is modelled on elements in the Text Encoding Initiative (TEI) and Encoded Archival Description (EAD) standards.

directiveAn instruction expressed as a combination of text and symbols, typically above, @@ -7244,6 +7103,26 @@ endid, or tstamp2 attribute. It is a semantic error not to specify a starting point attribute. MIDI values associated with the graphical dynamic sign may be recorded in the val and val2 attributes.

+
Alternative ending for a repeated passage of music; i.e., prima volta, seconda volta, + etc. + + + + + + + + + + + + + +

The scoreDef element is allowed as a sub-element so that an ending + may have its own meta-data without the overhead of child section + elements. div sub-elements are not allowed within ending. They may, + however, be contained by the children of ending, e.g., measures. Endings may not contain + other ending elements.

A container for document text that identifies the feature to which it is attached. For a "tool tip" or other generated label, use the label attribute. @@ -7307,7 +7186,16 @@ performs a similar function for musical notation.

The model of this element is based on the lb element of the Text Encoding Initiative (TEI).

-
musical division(musical division) – Contains a subdivision of the body of a musical text. + Person or organization who is a writer of the text of a song. + + + + + + + + + musical division(musical division) – Contains a subdivision of the body of a musical text. Provides a number-like designation that indicates an element's position in a sequence of similar elements. May not contain space characters. @@ -8138,6 +8026,11 @@ + + + Visual domain attributes. + + Visual domain attributes. From cc675f1098e363fbbf3325ffa6ebb857d136026d Mon Sep 17 00:00:00 2001 From: David Bauer Date: Wed, 14 Jun 2023 17:05:39 +0200 Subject: [PATCH 151/151] Avoid exclusive handling of interfaces --- src/resetfunctor.cpp | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/src/resetfunctor.cpp b/src/resetfunctor.cpp index a719613c2d..3a9ec89483 100644 --- a/src/resetfunctor.cpp +++ b/src/resetfunctor.cpp @@ -64,7 +64,9 @@ FunctorCode ResetDataFunctor::VisitArpeg(Arpeg *arpeg) PlistInterface *interface = arpeg->GetPlistInterface(); assert(interface); - return interface->InterfaceResetData(*this, arpeg); + interface->InterfaceResetData(*this, arpeg); + + return FUNCTOR_CONTINUE; } FunctorCode ResetDataFunctor::VisitArtic(Artic *artic) @@ -125,12 +127,12 @@ FunctorCode ResetDataFunctor::VisitControlElement(ControlElement *controlElement if (controlElement->HasInterface(INTERFACE_ALT_SYM)) { AltSymInterface *interface = controlElement->GetAltSymInterface(); assert(interface); - return interface->InterfaceResetData(*this, controlElement); + interface->InterfaceResetData(*this, controlElement); } if (controlElement->HasInterface(INTERFACE_LINKING)) { LinkingInterface *interface = controlElement->GetLinkingInterface(); assert(interface); - return interface->InterfaceResetData(*this, controlElement); + interface->InterfaceResetData(*this, controlElement); } return FUNCTOR_CONTINUE; @@ -192,7 +194,9 @@ FunctorCode ResetDataFunctor::VisitF(F *f) TimeSpanningInterface *interface = f->GetTimeSpanningInterface(); assert(interface); - return interface->InterfaceResetData(*this, f); + interface->InterfaceResetData(*this, f); + + return FUNCTOR_CONTINUE; } FunctorCode ResetDataFunctor::VisitFlag(Flag *flag) @@ -213,12 +217,12 @@ FunctorCode ResetDataFunctor::VisitFloatingObject(FloatingObject *floatingObject if (floatingObject->HasInterface(INTERFACE_TIME_SPANNING)) { TimeSpanningInterface *interface = floatingObject->GetTimeSpanningInterface(); assert(interface); - return interface->InterfaceResetData(*this, floatingObject); + interface->InterfaceResetData(*this, floatingObject); } else if (floatingObject->HasInterface(INTERFACE_TIME_POINT)) { TimePointInterface *interface = floatingObject->GetTimePointInterface(); assert(interface); - return interface->InterfaceResetData(*this, floatingObject); + interface->InterfaceResetData(*this, floatingObject); } return FUNCTOR_CONTINUE; } @@ -373,11 +377,11 @@ FunctorCode ResetDataFunctor::VisitSyl(Syl *syl) { // Call parent one too this->VisitLayerElement(syl); + syl->TimeSpanningInterface::InterfaceResetData(*this, syl); syl->m_nextWordSyl = NULL; - // Pass it to the pseudo functor of the interface - return syl->TimeSpanningInterface::InterfaceResetData(*this, syl); + return FUNCTOR_CONTINUE; } FunctorCode ResetDataFunctor::VisitSystemMilestone(SystemMilestoneEnd *systemMilestoneEnd)