diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md new file mode 100644 index 00000000000..6ea330c1d20 --- /dev/null +++ b/.github/CONTRIBUTING.md @@ -0,0 +1,11 @@ +# Contribution guidelines + +This document sets out the methods and practices for contributing to the Verovio project. + +## Contributor License Agreement + +In order to contribute the the project you need to sign and send us a [Contributor License Agreement](https://rism.digital/resources/verovio-cla.pdf) (CLA). However, following a generally accepted practice, very small contributions (below 20 lines of code) will be accepted without signing the CLA. + +## Coding Guidelines + +Please follow the [coding guidelines](https://book.verovio.org/contributing/guidelines.html). diff --git a/.github/workflows/ci_build.yml b/.github/workflows/ci_build.yml index 1b2a06a5f05..08437b037dc 100644 --- a/.github/workflows/ci_build.yml +++ b/.github/workflows/ci_build.yml @@ -112,7 +112,7 @@ jobs: steps: - name: Checkout main repo - uses: actions/checkout@v3 + uses: actions/checkout@v4 # Installation step for Ubuntu - name: Configure Ubuntu with ${{ matrix.compiler }}-${{ matrix.version }} @@ -239,7 +239,7 @@ jobs: steps: - name: Checkout main repo - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: Create TEMP_DIR working-directory: ${{ github.workspace }} @@ -291,7 +291,7 @@ jobs: steps: - name: Checkout main repo - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: Create TEMP_DIR working-directory: ${{ github.workspace }} @@ -353,7 +353,7 @@ jobs: steps: - name: Checkout GH_PAGES_REPO into GH_PAGES_DIR - uses: actions/checkout@v3 + uses: actions/checkout@v4 with: # repository to check out repository: ${{ env.GH_PAGES_REPO }} @@ -435,7 +435,7 @@ jobs: steps: - name: Checkout main repo - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: Install doxygen run: | @@ -472,7 +472,7 @@ jobs: steps: - name: Checkout DOXYGEN_REPO into DOXYGEN_DIR - uses: actions/checkout@v3 + uses: actions/checkout@v4 with: # repository to check out repository: ${{ env.DOXYGEN_REPO }} diff --git a/.github/workflows/clang-format-check.yml b/.github/workflows/clang-format-check.yml index 2bd967fee70..e00c94d00fa 100644 --- a/.github/workflows/clang-format-check.yml +++ b/.github/workflows/clang-format-check.yml @@ -16,7 +16,7 @@ jobs: name: Check for ${{ matrix.path['check'] }} steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Run clang-format style check for C/C++ programs. uses: jidicula/clang-format-action@v4.9.0 with: diff --git a/.github/workflows/python-ci-wheel.yml b/.github/workflows/python-ci-wheel.yml index 4eba9e8bbda..219ed29ce00 100644 --- a/.github/workflows/python-ci-wheel.yml +++ b/.github/workflows/python-ci-wheel.yml @@ -24,7 +24,7 @@ jobs: # Build the wheels for Linux, Windows and macOS matrix: os: [macos-latest, windows-latest, ubuntu-latest] - python-version: ["3.7", "3.8", "3.9", "3.10", "3.11"] + python-version: ["3.8", "3.9", "3.10", "3.11", "3.12"] architecture: [x86, x64] include: - os: macos-latest @@ -48,7 +48,7 @@ jobs: steps: #===============================================# # Set up - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 with: fetch-depth: 0 @@ -82,7 +82,7 @@ jobs: #===============================================# # wheels - name: Build wheels - uses: pypa/cibuildwheel@v2.11.1 + uses: pypa/cibuildwheel@v2.16.1 with: output-dir: wheelhouse env: @@ -147,7 +147,7 @@ jobs: steps: #===============================================# # Set up - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 with: fetch-depth: 0 @@ -224,7 +224,7 @@ jobs: steps: #===============================================# # Set up - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Set up Python 3.9 uses: actions/setup-python@v4 diff --git a/.github/workflows/tests_build.yml b/.github/workflows/tests_build.yml index ecbedf0219d..042d65eaf72 100644 --- a/.github/workflows/tests_build.yml +++ b/.github/workflows/tests_build.yml @@ -2,7 +2,7 @@ name: Test Suite Evaluation on: pull_request: - branches: develop + branches: [develop] # TODO: run this task only on PR in production; use push event for testing #push: #branches: @@ -45,7 +45,7 @@ jobs: echo "OUTPUT_DIR=${{ github.event.pull_request.number }}/${{ env.SHORT_SHA }}" >> $GITHUB_ENV - name: Checkout GH_PAGES_BRANCH into GH_PAGES_DIR - uses: actions/checkout@v3 + uses: actions/checkout@v4 with: repository: ${{ env.GH_PAGES_REPO }} ref: ${{ env.GH_PAGES_BRANCH }} @@ -67,7 +67,7 @@ jobs: python3 -m pip install diffimg jsondiff lxml xmldiff cairosvg - name: Checkout the dev branch - uses: actions/checkout@v3 + uses: actions/checkout@v4 with: ref: develop path: ${{ env.DEV_DIR }}/ @@ -88,7 +88,7 @@ jobs: python3 ../../doc/test-suite.py ${{ github.workspace }}/${{env.GH_PAGES_DIR}}/musicxmlTestSuite ${{ github.workspace }}/${{ env.TEMP_DIR }}/${{ env.DEV_DIR }}/ - name: Checkout the PR - uses: actions/checkout@v3 + uses: actions/checkout@v4 with: ref: ${{ github.event.pull_request.head.sha }} path: ${{ env.PR_DIR }}/ diff --git a/CHANGELOG.md b/CHANGELOG.md index bb361c12a29..c6317595eca 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,10 +1,22 @@ # Changelog -## [unreleased] +## [4.0.1] - 2023-09-05 +* Fix MEI version in output + +## [4.0.0] - 2023-09-05 +* Update schemas to MEI 5.0 and corresponding adjustments +* Support for `space` within `beam` + +## [3.16.0] - 2023-07-03 +* Support for rectangular tone clusters (@eNote-GmbH) * Support for delayed turns on chords (@eNote-GmbH) +* Support for `pgHead@func` and `pgFoot@func` instead of `pgHead2` and `pgFoot2` +* Support for `ending@lform` and `ending@label` +* Update key signature handling according to the latest changes in MEI * Improve endpoint location for spanning slurs (@eNote-GmbH) * Improve layout for inner slurs in cross-staff situations (@eNote-GmbH) * Fix validity of MEI output by ensuring correct element order +* Option --neume-as-note to render neumes as CMWN notes * Option --octave-no-spanning-parentheses to prevent () in spanning octave displacements (@eNote-GmbH) ## [3.15.0] - 2023-03-01 diff --git a/Verovio.podspec b/Verovio.podspec index 535d50d4e67..8f86ea829c2 100644 --- a/Verovio.podspec +++ b/Verovio.podspec @@ -1,21 +1,21 @@ Pod::Spec.new do |s| s.name = 'Verovio' - s.version = '3.16.0-dev' - s.license = { :type => 'LGPL' } + s.version = '4.1.0-dev' + s.license = { :type => 'LGPL', :file => 'COPYING' } s.homepage = 'https://www.verovio.org/index.xhtml' s.authors = { 'Contributors List' => 'https://github.com/rism-digital/verovio/graphs/contributors' } s.summary = 'Verovio' s.source = { :git => 'https://github.com/rism-digital/verovio.git', :tag => 'version-' + s.version.to_s } - s.swift_versions = ['3.0', '4.0', '4.1', '4.2', '5.0','5.1'] + s.swift_versions = ['3.0', '4.0', '4.1', '4.2', '5.0', '5.1', '5.2', '5.3', '5.4', '5.5', '5.6', '5.7'] s.source_files = 'src/**/*.{h,cpp,cc}', - 'include/{crc,hum,json,midi,pugi,utf8,vrv,zip}/*.{h,hpp}', - 'libmei/{dist,addons}/*.{h,cpp}' + 'include/{crc,hum,json,midi,pugi,utf8,vrv,zip}/*.{h,hpp}', + 'libmei/{dist,addons}/*.{h,cpp}' s.public_header_files = 'src/**/*.{h}', 'include/{crc,hum,json,midi,pugi,utf8,vrv,zip}/*.{h,hpp}', 'libmei/{dist,addons}/*.{h}' s.resources = 'data' - s.ios.deployment_target = '10.0' - s.osx.deployment_target = '10.13' + s.ios.deployment_target = '14.0' + s.osx.deployment_target = '10.15' s.pod_target_xcconfig = { "CLANG_CXX_LANGUAGE_STANDARD" => "c++17", "CLANG_CXX_LIBRARY" => "libc++", @@ -29,7 +29,7 @@ Pod::Spec.new do |s| "MTL_FAST_MATH" => "YES", "SUPPORTS_UIKITFORMAC" => "NO", "MTL_ENABLE_DEBUG_INFO" => "NO", - "PRODUCT_BUNDLE_IDENTIFIER" => "com.rism.VerovioFramework" + "PRODUCT_BUNDLE_IDENTIFIER" => "digital.rism.VerovioFramework" } end diff --git a/Verovio.xcodeproj/project.pbxproj b/Verovio.xcodeproj/project.pbxproj index 5631c4bf3b7..b129cb6e9af 100644 --- a/Verovio.xcodeproj/project.pbxproj +++ b/Verovio.xcodeproj/project.pbxproj @@ -209,6 +209,18 @@ 4D1D733E1A1D08CD001E08F6 /* glyph.h in Headers */ = {isa = PBXBuildFile; fileRef = 4D1D733D1A1D08CD001E08F6 /* glyph.h */; }; 4D1D73401A1D08DC001E08F6 /* glyph.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4D1D733F1A1D08DC001E08F6 /* glyph.cpp */; }; 4D1D73411A1D08DC001E08F6 /* glyph.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4D1D733F1A1D08DC001E08F6 /* glyph.cpp */; }; + 4D1EB6A12A2A40B400AF2F98 /* textlayoutelement.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4D1EB6A02A2A40B400AF2F98 /* textlayoutelement.cpp */; }; + 4D1EB6A22A2A40B400AF2F98 /* textlayoutelement.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4D1EB6A02A2A40B400AF2F98 /* textlayoutelement.cpp */; }; + 4D1EB6A32A2A40B400AF2F98 /* textlayoutelement.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4D1EB6A02A2A40B400AF2F98 /* textlayoutelement.cpp */; }; + 4D1EB6A42A2A40B400AF2F98 /* textlayoutelement.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4D1EB6A02A2A40B400AF2F98 /* textlayoutelement.cpp */; }; + 4D1EB6A62A2A40CB00AF2F98 /* textlayoutelement.h in Headers */ = {isa = PBXBuildFile; fileRef = 4D1EB6A52A2A40CB00AF2F98 /* textlayoutelement.h */; }; + 4D1EB6A72A2A40CB00AF2F98 /* textlayoutelement.h in Headers */ = {isa = PBXBuildFile; fileRef = 4D1EB6A52A2A40CB00AF2F98 /* textlayoutelement.h */; }; + 4D1EB6A92A2A7C5100AF2F98 /* div.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4D1EB6A82A2A7C5100AF2F98 /* div.cpp */; }; + 4D1EB6AA2A2A7C5100AF2F98 /* div.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4D1EB6A82A2A7C5100AF2F98 /* div.cpp */; }; + 4D1EB6AB2A2A7C5100AF2F98 /* div.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4D1EB6A82A2A7C5100AF2F98 /* div.cpp */; }; + 4D1EB6AC2A2A7C5100AF2F98 /* div.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4D1EB6A82A2A7C5100AF2F98 /* div.cpp */; }; + 4D1EB6AE2A2A7C6400AF2F98 /* div.h in Headers */ = {isa = PBXBuildFile; fileRef = 4D1EB6AD2A2A7C6400AF2F98 /* div.h */; }; + 4D1EB6AF2A2A7C6400AF2F98 /* div.h in Headers */ = {isa = PBXBuildFile; fileRef = 4D1EB6AD2A2A7C6400AF2F98 /* div.h */; }; 4D2073F522A3BCE000E0765F /* tuning.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4D2073F222A3BCDF00E0765F /* tuning.cpp */; }; 4D2073F622A3BCE000E0765F /* tuning.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4D2073F222A3BCDF00E0765F /* tuning.cpp */; }; 4D2073F722A3BCE000E0765F /* tuning.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4D2073F222A3BCDF00E0765F /* tuning.cpp */; }; @@ -363,6 +375,12 @@ 4D796B5E1D78641900A15238 /* harm.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4D796B5D1D78641900A15238 /* harm.cpp */; }; 4D798CBD1B8AEDBA007281CA /* drawinginterface.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4D798CBC1B8AEDBA007281CA /* drawinginterface.cpp */; }; 4D798CBE1B8AEDBA007281CA /* drawinginterface.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4D798CBC1B8AEDBA007281CA /* drawinginterface.cpp */; }; + 4D7AFDC72A5554A100835ED1 /* divline.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4D7AFDC62A5554A100835ED1 /* divline.cpp */; }; + 4D7AFDC82A5554A100835ED1 /* divline.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4D7AFDC62A5554A100835ED1 /* divline.cpp */; }; + 4D7AFDC92A5554A100835ED1 /* divline.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4D7AFDC62A5554A100835ED1 /* divline.cpp */; }; + 4D7AFDCA2A5554A100835ED1 /* divline.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4D7AFDC62A5554A100835ED1 /* divline.cpp */; }; + 4D7AFDCC2A5554C100835ED1 /* divline.h in Headers */ = {isa = PBXBuildFile; fileRef = 4D7AFDCB2A5554C100835ED1 /* divline.h */; }; + 4D7AFDCD2A5554C100835ED1 /* divline.h in Headers */ = {isa = PBXBuildFile; fileRef = 4D7AFDCB2A5554C100835ED1 /* divline.h */; settings = {ATTRIBUTES = (Public, ); }; }; 4D81351B2322C2CC00F59C01 /* keyaccid.h in Headers */ = {isa = PBXBuildFile; fileRef = 4D81351A2322C2CC00F59C01 /* keyaccid.h */; }; 4D81351C2322C2CC00F59C01 /* keyaccid.h in Headers */ = {isa = PBXBuildFile; fileRef = 4D81351A2322C2CC00F59C01 /* keyaccid.h */; settings = {ATTRIBUTES = (Public, ); }; }; 4D81351E2322C41800F59C01 /* keyaccid.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4D81351D2322C41800F59C01 /* keyaccid.cpp */; }; @@ -721,29 +739,24 @@ 4DBDD67A2939E1D1009EC466 /* symboldef.h in Headers */ = {isa = PBXBuildFile; fileRef = 4DBDD66E2939E19A009EC466 /* symboldef.h */; settings = {ATTRIBUTES = (Public, ); }; }; 4DBDD67B2939E1D7009EC466 /* symboltable.h in Headers */ = {isa = PBXBuildFile; fileRef = 4DBDD66D2939E19A009EC466 /* symboltable.h */; }; 4DBDD67C2939E1D8009EC466 /* symboltable.h in Headers */ = {isa = PBXBuildFile; fileRef = 4DBDD66D2939E19A009EC466 /* symboltable.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 4DC07F662A4DBB7200360070 /* liquescent.h in Headers */ = {isa = PBXBuildFile; fileRef = 4DC07F652A4DBB7200360070 /* liquescent.h */; }; + 4DC07F672A4DBB7200360070 /* liquescent.h in Headers */ = {isa = PBXBuildFile; fileRef = 4DC07F652A4DBB7200360070 /* liquescent.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 4DC07F692A4DBB8500360070 /* liquescent.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4DC07F682A4DBB8500360070 /* liquescent.cpp */; }; + 4DC07F6A2A4DBB8500360070 /* liquescent.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4DC07F682A4DBB8500360070 /* liquescent.cpp */; }; + 4DC07F6B2A4DBB8500360070 /* liquescent.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4DC07F682A4DBB8500360070 /* liquescent.cpp */; }; + 4DC07F6C2A4DBB8500360070 /* liquescent.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4DC07F682A4DBB8500360070 /* liquescent.cpp */; }; 4DC12A571F716E1C000440E9 /* pghead.h in Headers */ = {isa = PBXBuildFile; fileRef = 4DC12A561F716E1C000440E9 /* pghead.h */; }; 4DC12A591F716E27000440E9 /* pghead.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4DC12A581F716E27000440E9 /* pghead.cpp */; }; 4DC12A5A1F716E27000440E9 /* pghead.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4DC12A581F716E27000440E9 /* pghead.cpp */; }; 4DC12A5B1F716E27000440E9 /* pghead.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4DC12A581F716E27000440E9 /* pghead.cpp */; }; - 4DC12A5D1F73F888000440E9 /* pghead2.h in Headers */ = {isa = PBXBuildFile; fileRef = 4DC12A5C1F73F888000440E9 /* pghead2.h */; }; - 4DC12A631F73F898000440E9 /* pghead2.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4DC12A621F73F898000440E9 /* pghead2.cpp */; }; - 4DC12A641F73F898000440E9 /* pghead2.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4DC12A621F73F898000440E9 /* pghead2.cpp */; }; - 4DC12A651F73F898000440E9 /* pghead2.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4DC12A621F73F898000440E9 /* pghead2.cpp */; }; 4DC12A751F73FF92000440E9 /* runningelement.h in Headers */ = {isa = PBXBuildFile; fileRef = 4DC12A741F73FF92000440E9 /* runningelement.h */; }; 4DC12A781F7400B9000440E9 /* runningelement.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4DC12A771F7400B9000440E9 /* runningelement.cpp */; }; 4DC12A791F7400B9000440E9 /* runningelement.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4DC12A771F7400B9000440E9 /* runningelement.cpp */; }; 4DC12A7A1F7400B9000440E9 /* runningelement.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4DC12A771F7400B9000440E9 /* runningelement.cpp */; }; - 4DC12A7C1F740FB9000440E9 /* view_running.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4DC12A7B1F740FB9000440E9 /* view_running.cpp */; }; - 4DC12A7D1F740FB9000440E9 /* view_running.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4DC12A7B1F740FB9000440E9 /* view_running.cpp */; }; - 4DC12A7E1F740FB9000440E9 /* view_running.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4DC12A7B1F740FB9000440E9 /* view_running.cpp */; }; 4DC12A811F741110000440E9 /* pgfoot.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4DC12A7F1F741110000440E9 /* pgfoot.cpp */; }; 4DC12A821F741110000440E9 /* pgfoot.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4DC12A7F1F741110000440E9 /* pgfoot.cpp */; }; 4DC12A831F741110000440E9 /* pgfoot.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4DC12A7F1F741110000440E9 /* pgfoot.cpp */; }; - 4DC12A841F741110000440E9 /* pgfoot2.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4DC12A801F741110000440E9 /* pgfoot2.cpp */; }; - 4DC12A851F741110000440E9 /* pgfoot2.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4DC12A801F741110000440E9 /* pgfoot2.cpp */; }; - 4DC12A861F741110000440E9 /* pgfoot2.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4DC12A801F741110000440E9 /* pgfoot2.cpp */; }; 4DC12A891F74111E000440E9 /* pgfoot.h in Headers */ = {isa = PBXBuildFile; fileRef = 4DC12A871F74111E000440E9 /* pgfoot.h */; }; - 4DC12A8A1F74111E000440E9 /* pgfoot2.h in Headers */ = {isa = PBXBuildFile; fileRef = 4DC12A881F74111E000440E9 /* pgfoot2.h */; }; 4DC34BA219BC4A71006175CD /* accid.h in Headers */ = {isa = PBXBuildFile; fileRef = 4DC34B9F19BC4A70006175CD /* accid.h */; }; 4DC34BA319BC4A71006175CD /* custos.h in Headers */ = {isa = PBXBuildFile; fileRef = 4DC34BA019BC4A70006175CD /* custos.h */; }; 4DC34BA419BC4A71006175CD /* dot.h in Headers */ = {isa = PBXBuildFile; fileRef = 4DC34BA119BC4A70006175CD /* dot.h */; }; @@ -879,7 +892,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 */; }; @@ -887,6 +899,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 */; }; @@ -1017,7 +1035,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 */; }; @@ -1129,12 +1146,8 @@ BB4C4B0422A932C3001F6AF0 /* runningelement.h in Headers */ = {isa = PBXBuildFile; fileRef = 4DC12A741F73FF92000440E9 /* runningelement.h */; settings = {ATTRIBUTES = (Public, ); }; }; BB4C4B0522A932C3001F6AF0 /* pgfoot.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4DC12A7F1F741110000440E9 /* pgfoot.cpp */; }; BB4C4B0622A932C3001F6AF0 /* pgfoot.h in Headers */ = {isa = PBXBuildFile; fileRef = 4DC12A871F74111E000440E9 /* pgfoot.h */; settings = {ATTRIBUTES = (Public, ); }; }; - BB4C4B0722A932C3001F6AF0 /* pgfoot2.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4DC12A801F741110000440E9 /* pgfoot2.cpp */; }; - BB4C4B0822A932C3001F6AF0 /* pgfoot2.h in Headers */ = {isa = PBXBuildFile; fileRef = 4DC12A881F74111E000440E9 /* pgfoot2.h */; settings = {ATTRIBUTES = (Public, ); }; }; BB4C4B0922A932C3001F6AF0 /* pghead.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4DC12A581F716E27000440E9 /* pghead.cpp */; }; BB4C4B0A22A932C3001F6AF0 /* pghead.h in Headers */ = {isa = PBXBuildFile; fileRef = 4DC12A561F716E1C000440E9 /* pghead.h */; settings = {ATTRIBUTES = (Public, ); }; }; - BB4C4B0B22A932C3001F6AF0 /* pghead2.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4DC12A621F73F898000440E9 /* pghead2.cpp */; }; - BB4C4B0C22A932C3001F6AF0 /* pghead2.h in Headers */ = {isa = PBXBuildFile; fileRef = 4DC12A5C1F73F888000440E9 /* pghead2.h */; settings = {ATTRIBUTES = (Public, ); }; }; BB4C4B0D22A932C8001F6AF0 /* systemmilestone.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4DF4407C1D511D0200152B7E /* systemmilestone.cpp */; }; BB4C4B0E22A932C8001F6AF0 /* systemmilestone.h in Headers */ = {isa = PBXBuildFile; fileRef = 4DF4407B1D511CEE00152B7E /* systemmilestone.h */; settings = {ATTRIBUTES = (Public, ); }; }; BB4C4B0F22A932C8001F6AF0 /* ending.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4DF440761D39575500152B7E /* ending.cpp */; }; @@ -1300,7 +1313,6 @@ BB4C4BAF22A932EB001F6AF0 /* view_mensural.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4D43C30B1A9BB22A00EA28F3 /* view_mensural.cpp */; }; BB4C4BB022A932EB001F6AF0 /* view_neume.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4D766EF820ACAD62006875D8 /* view_neume.cpp */; }; BB4C4BB122A932EB001F6AF0 /* view_page.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8F086EDE188539540037FD8E /* view_page.cpp */; }; - BB4C4BB222A932EB001F6AF0 /* view_running.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4DC12A7B1F740FB9000440E9 /* view_running.cpp */; }; BB4C4BB322A932EB001F6AF0 /* view_slur.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4D7927CF20ECCC6D0002A45D /* view_slur.cpp */; }; BB4C4BB422A932EB001F6AF0 /* view_text.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4DDBBCC41C2EBAE7001AB50A /* view_text.cpp */; }; BB4C4BB522A932EB001F6AF0 /* view_tuplet.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8F086EDF188539540037FD8E /* view_tuplet.cpp */; }; @@ -1370,6 +1382,12 @@ E708AA6629D2B98B001F937A /* adjustfloatingpositionerfunctor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E708AA6429D2B985001F937A /* adjustfloatingpositionerfunctor.cpp */; }; E708AA6729D2B98B001F937A /* adjustfloatingpositionerfunctor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E708AA6429D2B985001F937A /* adjustfloatingpositionerfunctor.cpp */; }; E708AA6829D2B98C001F937A /* adjustfloatingpositionerfunctor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E708AA6429D2B985001F937A /* adjustfloatingpositionerfunctor.cpp */; }; + E70E2AA029F262A200DB3044 /* miscfunctor.h in Headers */ = {isa = PBXBuildFile; fileRef = E70E2A9F29F262A200DB3044 /* miscfunctor.h */; }; + E70E2AA129F262A200DB3044 /* miscfunctor.h in Headers */ = {isa = PBXBuildFile; fileRef = E70E2A9F29F262A200DB3044 /* miscfunctor.h */; settings = {ATTRIBUTES = (Public, ); }; }; + E70E2AA329F262DB00DB3044 /* miscfunctor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E70E2AA229F262DB00DB3044 /* miscfunctor.cpp */; }; + E70E2AA429F262DB00DB3044 /* miscfunctor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E70E2AA229F262DB00DB3044 /* miscfunctor.cpp */; }; + E70E2AA529F262F800DB3044 /* miscfunctor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E70E2AA229F262DB00DB3044 /* miscfunctor.cpp */; }; + E70E2AA629F262F800DB3044 /* miscfunctor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E70E2AA229F262DB00DB3044 /* miscfunctor.cpp */; }; E71EF3C32975E4DC00D36264 /* resetfunctor.h in Headers */ = {isa = PBXBuildFile; fileRef = E71EF3C22975E4DC00D36264 /* resetfunctor.h */; }; E71EF3C42975E4DC00D36264 /* resetfunctor.h in Headers */ = {isa = PBXBuildFile; fileRef = E71EF3C22975E4DC00D36264 /* resetfunctor.h */; settings = {ATTRIBUTES = (Public, ); }; }; E71EF3C62975ED3800D36264 /* resetfunctor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E71EF3C52975ED3800D36264 /* resetfunctor.cpp */; }; @@ -1400,6 +1418,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 */; }; @@ -1434,6 +1458,12 @@ E76046C128D4829000C36204 /* calcledgerlinesfunctor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E76046BF28D4829000C36204 /* calcledgerlinesfunctor.cpp */; }; E76046C228D496B300C36204 /* calcledgerlinesfunctor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E76046BF28D4829000C36204 /* calcledgerlinesfunctor.cpp */; }; E76046C328D496B400C36204 /* calcledgerlinesfunctor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E76046BF28D4829000C36204 /* calcledgerlinesfunctor.cpp */; }; + E763EF3F29E939C00029E56D /* convertfunctor.h in Headers */ = {isa = PBXBuildFile; fileRef = E763EF3E29E939C00029E56D /* convertfunctor.h */; }; + E763EF4029E939C00029E56D /* convertfunctor.h in Headers */ = {isa = PBXBuildFile; fileRef = E763EF3E29E939C00029E56D /* convertfunctor.h */; settings = {ATTRIBUTES = (Public, ); }; }; + E763EF4229E939FB0029E56D /* convertfunctor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E763EF4129E939FB0029E56D /* convertfunctor.cpp */; }; + E763EF4329E939FB0029E56D /* convertfunctor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E763EF4129E939FB0029E56D /* convertfunctor.cpp */; }; + E763EF4429E93A0B0029E56D /* convertfunctor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E763EF4129E939FB0029E56D /* convertfunctor.cpp */; }; + E763EF4529E93A0C0029E56D /* convertfunctor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E763EF4129E939FB0029E56D /* convertfunctor.cpp */; }; E765675928BBFBA400BC6490 /* functorinterface.h in Headers */ = {isa = PBXBuildFile; fileRef = E765675828BBFBA400BC6490 /* functorinterface.h */; }; E765675A28BBFBA400BC6490 /* functorinterface.h in Headers */ = {isa = PBXBuildFile; fileRef = E765675828BBFBA400BC6490 /* functorinterface.h */; settings = {ATTRIBUTES = (Public, ); }; }; E765675C28BC01A000BC6490 /* functor.h in Headers */ = {isa = PBXBuildFile; fileRef = E765675B28BC019F00BC6490 /* functor.h */; }; @@ -1564,6 +1594,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 */; }; @@ -1624,6 +1660,12 @@ E7ED8A6929C111CA00735875 /* cachehorizontallayoutfunctor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E7ED8A6729C111C300735875 /* cachehorizontallayoutfunctor.cpp */; }; E7ED8A6A29C111CA00735875 /* cachehorizontallayoutfunctor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E7ED8A6729C111C300735875 /* cachehorizontallayoutfunctor.cpp */; }; E7ED8A6B29C111CB00735875 /* cachehorizontallayoutfunctor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E7ED8A6729C111C300735875 /* cachehorizontallayoutfunctor.cpp */; }; + E7F1C36429F033FB007E12C1 /* savefunctor.h in Headers */ = {isa = PBXBuildFile; fileRef = E7F1C36329F033FB007E12C1 /* savefunctor.h */; }; + E7F1C36529F033FC007E12C1 /* savefunctor.h in Headers */ = {isa = PBXBuildFile; fileRef = E7F1C36329F033FB007E12C1 /* savefunctor.h */; settings = {ATTRIBUTES = (Public, ); }; }; + E7F1C36729F0345D007E12C1 /* savefunctor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E7F1C36629F0345D007E12C1 /* savefunctor.cpp */; }; + E7F1C36829F0345D007E12C1 /* savefunctor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E7F1C36629F0345D007E12C1 /* savefunctor.cpp */; }; + E7F1C36929F03461007E12C1 /* savefunctor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E7F1C36629F0345D007E12C1 /* savefunctor.cpp */; }; + E7F1C36A29F03462007E12C1 /* savefunctor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E7F1C36629F0345D007E12C1 /* savefunctor.cpp */; }; E7F39C5E29A62B260055DBE0 /* adjustclefchangesfunctor.h in Headers */ = {isa = PBXBuildFile; fileRef = E7F39C5D29A62B1F0055DBE0 /* adjustclefchangesfunctor.h */; }; E7F39C5F29A62B270055DBE0 /* adjustclefchangesfunctor.h in Headers */ = {isa = PBXBuildFile; fileRef = E7F39C5D29A62B1F0055DBE0 /* adjustclefchangesfunctor.h */; settings = {ATTRIBUTES = (Public, ); }; }; E7F39C6129A62B3E0055DBE0 /* adjustclefchangesfunctor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E7F39C6029A62B3E0055DBE0 /* adjustclefchangesfunctor.cpp */; }; @@ -1733,6 +1775,10 @@ 4D1D733B1A1D0390001E08F6 /* smufl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; lineEnding = 0; name = smufl.h; path = include/vrv/smufl.h; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objcpp; }; 4D1D733D1A1D08CD001E08F6 /* glyph.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = glyph.h; path = include/vrv/glyph.h; sourceTree = ""; }; 4D1D733F1A1D08DC001E08F6 /* glyph.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = glyph.cpp; path = src/glyph.cpp; sourceTree = ""; }; + 4D1EB6A02A2A40B400AF2F98 /* textlayoutelement.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = textlayoutelement.cpp; path = src/textlayoutelement.cpp; sourceTree = ""; }; + 4D1EB6A52A2A40CB00AF2F98 /* textlayoutelement.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = textlayoutelement.h; path = include/vrv/textlayoutelement.h; sourceTree = ""; }; + 4D1EB6A82A2A7C5100AF2F98 /* div.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = div.cpp; path = src/div.cpp; sourceTree = ""; }; + 4D1EB6AD2A2A7C6400AF2F98 /* div.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = div.h; path = include/vrv/div.h; sourceTree = ""; }; 4D2073EF22A3BCB700E0765F /* tabdursym.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = tabdursym.h; path = include/vrv/tabdursym.h; sourceTree = ""; }; 4D2073F022A3BCB700E0765F /* tuning.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = tuning.h; path = include/vrv/tuning.h; sourceTree = ""; }; 4D2073F122A3BCB700E0765F /* tabgrp.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = tabgrp.h; path = include/vrv/tabgrp.h; sourceTree = ""; }; @@ -1804,6 +1850,8 @@ 4D796B5D1D78641900A15238 /* harm.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = harm.cpp; path = src/harm.cpp; sourceTree = ""; }; 4D797B041A67C55F007637BD /* devicecontextbase.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = devicecontextbase.h; path = include/vrv/devicecontextbase.h; sourceTree = ""; }; 4D798CBC1B8AEDBA007281CA /* drawinginterface.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = drawinginterface.cpp; path = src/drawinginterface.cpp; sourceTree = ""; }; + 4D7AFDC62A5554A100835ED1 /* divline.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = divline.cpp; path = src/divline.cpp; sourceTree = ""; }; + 4D7AFDCB2A5554C100835ED1 /* divline.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = divline.h; path = include/vrv/divline.h; sourceTree = ""; }; 4D81351A2322C2CC00F59C01 /* keyaccid.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = keyaccid.h; path = include/vrv/keyaccid.h; sourceTree = ""; }; 4D81351D2322C41800F59C01 /* keyaccid.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = keyaccid.cpp; path = src/keyaccid.cpp; sourceTree = ""; }; 4D88AD07289673D50006D7DA /* symbol.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = symbol.h; path = include/vrv/symbol.h; sourceTree = ""; }; @@ -1933,17 +1981,14 @@ 4DBDD66E2939E19A009EC466 /* symboldef.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = symboldef.h; path = include/vrv/symboldef.h; sourceTree = ""; }; 4DBDD66F2939E1AE009EC466 /* symboltable.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = symboltable.cpp; path = src/symboltable.cpp; sourceTree = ""; }; 4DBDD6702939E1AE009EC466 /* symboldef.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = symboldef.cpp; path = src/symboldef.cpp; sourceTree = ""; }; + 4DC07F652A4DBB7200360070 /* liquescent.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = liquescent.h; path = include/vrv/liquescent.h; sourceTree = ""; }; + 4DC07F682A4DBB8500360070 /* liquescent.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = liquescent.cpp; path = src/liquescent.cpp; sourceTree = ""; }; 4DC12A561F716E1C000440E9 /* pghead.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = pghead.h; path = include/vrv/pghead.h; sourceTree = ""; }; 4DC12A581F716E27000440E9 /* pghead.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = pghead.cpp; path = src/pghead.cpp; sourceTree = ""; }; - 4DC12A5C1F73F888000440E9 /* pghead2.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = pghead2.h; path = include/vrv/pghead2.h; sourceTree = ""; }; - 4DC12A621F73F898000440E9 /* pghead2.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = pghead2.cpp; path = src/pghead2.cpp; sourceTree = ""; }; 4DC12A741F73FF92000440E9 /* runningelement.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = runningelement.h; path = include/vrv/runningelement.h; sourceTree = ""; }; 4DC12A771F7400B9000440E9 /* runningelement.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = runningelement.cpp; path = src/runningelement.cpp; sourceTree = ""; }; - 4DC12A7B1F740FB9000440E9 /* view_running.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = view_running.cpp; path = src/view_running.cpp; sourceTree = ""; }; 4DC12A7F1F741110000440E9 /* pgfoot.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = pgfoot.cpp; path = src/pgfoot.cpp; sourceTree = ""; }; - 4DC12A801F741110000440E9 /* pgfoot2.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = pgfoot2.cpp; path = src/pgfoot2.cpp; sourceTree = ""; }; 4DC12A871F74111E000440E9 /* pgfoot.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = pgfoot.h; path = include/vrv/pgfoot.h; sourceTree = ""; }; - 4DC12A881F74111E000440E9 /* pgfoot2.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = pgfoot2.h; path = include/vrv/pgfoot2.h; sourceTree = ""; }; 4DC34B9F19BC4A70006175CD /* accid.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = accid.h; path = include/vrv/accid.h; sourceTree = ""; }; 4DC34BA019BC4A70006175CD /* custos.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = custos.h; path = include/vrv/custos.h; sourceTree = ""; }; 4DC34BA119BC4A70006175CD /* dot.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = dot.h; path = include/vrv/dot.h; sourceTree = ""; }; @@ -2016,11 +2061,12 @@ 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 = ""; }; 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 = ""; }; @@ -2119,6 +2165,8 @@ BDEF9ECB26725248008A3A47 /* caesura.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = caesura.h; path = include/vrv/caesura.h; sourceTree = ""; }; E708AA6129D2B965001F937A /* adjustfloatingpositionerfunctor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = adjustfloatingpositionerfunctor.h; path = include/vrv/adjustfloatingpositionerfunctor.h; sourceTree = ""; }; E708AA6429D2B985001F937A /* adjustfloatingpositionerfunctor.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = adjustfloatingpositionerfunctor.cpp; path = src/adjustfloatingpositionerfunctor.cpp; sourceTree = ""; }; + E70E2A9F29F262A200DB3044 /* miscfunctor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = miscfunctor.h; path = include/vrv/miscfunctor.h; sourceTree = ""; }; + E70E2AA229F262DB00DB3044 /* miscfunctor.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = miscfunctor.cpp; path = src/miscfunctor.cpp; sourceTree = ""; }; E71EF3C22975E4DC00D36264 /* resetfunctor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = resetfunctor.h; path = include/vrv/resetfunctor.h; sourceTree = ""; }; E71EF3C52975ED3800D36264 /* resetfunctor.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = resetfunctor.cpp; path = src/resetfunctor.cpp; sourceTree = ""; }; E722106228F8569F002CD6E9 /* findlayerelementsfunctor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = findlayerelementsfunctor.h; path = include/vrv/findlayerelementsfunctor.h; sourceTree = ""; }; @@ -2129,6 +2177,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 = ""; }; @@ -2140,6 +2190,8 @@ E75EA9FC29CC3A88003A97A7 /* calcarticfunctor.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = calcarticfunctor.cpp; path = src/calcarticfunctor.cpp; sourceTree = ""; }; E76046BC28D4828200C36204 /* calcledgerlinesfunctor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = calcledgerlinesfunctor.h; path = include/vrv/calcledgerlinesfunctor.h; sourceTree = ""; }; E76046BF28D4829000C36204 /* calcledgerlinesfunctor.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = calcledgerlinesfunctor.cpp; path = src/calcledgerlinesfunctor.cpp; sourceTree = ""; }; + E763EF3E29E939C00029E56D /* convertfunctor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = convertfunctor.h; path = include/vrv/convertfunctor.h; sourceTree = ""; }; + E763EF4129E939FB0029E56D /* convertfunctor.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = convertfunctor.cpp; path = src/convertfunctor.cpp; sourceTree = ""; }; E765675828BBFBA400BC6490 /* functorinterface.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = functorinterface.h; path = include/vrv/functorinterface.h; sourceTree = ""; }; E765675B28BC019F00BC6490 /* functor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = functor.h; path = include/vrv/functor.h; sourceTree = ""; }; E76A9D4629A74E060044682D /* adjustdotsfunctor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = adjustdotsfunctor.h; path = include/vrv/adjustdotsfunctor.h; sourceTree = ""; }; @@ -2184,6 +2236,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 = ""; }; @@ -2204,6 +2258,8 @@ E7E9C11C29B0EFB400CFCE2F /* adjusttempofunctor.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = adjusttempofunctor.cpp; path = src/adjusttempofunctor.cpp; sourceTree = ""; }; E7ED8A6429C1119000735875 /* cachehorizontallayoutfunctor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = cachehorizontallayoutfunctor.h; path = include/vrv/cachehorizontallayoutfunctor.h; sourceTree = ""; }; E7ED8A6729C111C300735875 /* cachehorizontallayoutfunctor.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = cachehorizontallayoutfunctor.cpp; path = src/cachehorizontallayoutfunctor.cpp; sourceTree = ""; }; + E7F1C36329F033FB007E12C1 /* savefunctor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = savefunctor.h; path = include/vrv/savefunctor.h; sourceTree = ""; }; + E7F1C36629F0345D007E12C1 /* savefunctor.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = savefunctor.cpp; path = src/savefunctor.cpp; sourceTree = ""; }; E7F39C5D29A62B1F0055DBE0 /* adjustclefchangesfunctor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = adjustclefchangesfunctor.h; path = include/vrv/adjustclefchangesfunctor.h; sourceTree = ""; }; E7F39C6029A62B3E0055DBE0 /* adjustclefchangesfunctor.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = adjustclefchangesfunctor.cpp; path = src/adjustclefchangesfunctor.cpp; sourceTree = ""; }; /* End PBXFileReference section */ @@ -2373,6 +2429,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 */, @@ -2424,8 +2484,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 */, @@ -2529,21 +2587,21 @@ name = symbolelements; sourceTree = ""; }; - 4DC12A761F740089000440E9 /* runningelements */ = { + 4DC12A761F740089000440E9 /* textlayoutelements */ = { isa = PBXGroup; children = ( + 4D1EB6A82A2A7C5100AF2F98 /* div.cpp */, + 4D1EB6AD2A2A7C6400AF2F98 /* div.h */, 4DC12A771F7400B9000440E9 /* runningelement.cpp */, 4DC12A741F73FF92000440E9 /* runningelement.h */, 4DC12A7F1F741110000440E9 /* pgfoot.cpp */, 4DC12A871F74111E000440E9 /* pgfoot.h */, - 4DC12A801F741110000440E9 /* pgfoot2.cpp */, - 4DC12A881F74111E000440E9 /* pgfoot2.h */, 4DC12A581F716E27000440E9 /* pghead.cpp */, 4DC12A561F716E1C000440E9 /* pghead.h */, - 4DC12A621F73F898000440E9 /* pghead2.cpp */, - 4DC12A5C1F73F888000440E9 /* pghead2.h */, + 4D1EB6A02A2A40B400AF2F98 /* textlayoutelement.cpp */, + 4D1EB6A52A2A40CB00AF2F98 /* textlayoutelement.h */, ); - name = runningelements; + name = textlayoutelements; sourceTree = ""; }; 4DC34B9E19BC33A0006175CD /* interfaces */ = { @@ -2557,8 +2615,9 @@ 4DF2AF7D1A62F6A50016F869 /* drawinginterface.h */, 8F086EBE188539540037FD8E /* durationinterface.cpp */, 8F59291518854BF800FE51AD /* durationinterface.h */, - 4DA0EAD322BB77AF00A7EBEB /* facsimileinterface.h */, 4DA0EAE922BB77C300A7EBEB /* facsimileinterface.cpp */, + 4DA0EAD322BB77AF00A7EBEB /* facsimileinterface.h */, + 4DE0B9A02988070C00D4C939 /* interface.h */, 4D94721E20CA702C00C780C8 /* linkinginterface.cpp */, 4D94721C20CA701000C780C8 /* linkinginterface.h */, 8F086ECF188539540037FD8E /* pitchinterface.cpp */, @@ -2619,6 +2678,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 */, @@ -2633,6 +2694,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 */, @@ -2684,7 +2747,7 @@ 8F086F38188539F00037FD8E /* containers */, 4D3080F9203DA03600BC44F6 /* editorialelements */, 4DA0EABF22BB775F00A7EBEB /* facselements */, - 4DC12A761F740089000440E9 /* runningelements */, + 4DC12A761F740089000440E9 /* textlayoutelements */, 4D95D4F31D717CD600B2B856 /* systemelements */, 4D79641626C151250026288B /* pageelements */, 4DF28A011A754DAA00BA9F7D /* controlelements */, @@ -2707,10 +2770,8 @@ 4D79643026C6AA720026288B /* featureextractor.h */, 4DF28A041A754DF000BA9F7D /* floatingobject.cpp */, 4D95D4F41D7185DE00B2B856 /* floatingobject.h */, - 4DF440791D3D085600152B7E /* functorparams.h */, 4D09D3EC1EA8AD8500A420E6 /* horizontalaligner.cpp */, 4D14600F1EA8A913007DB90C /* horizontalaligner.h */, - 4DE0B9A02988070C00D4C939 /* interface.h */, 4DACC93F2990ED2600B55913 /* libmei.h */, 8F086ECD188539540037FD8E /* object.cpp */, 8F59292418854BF800FE51AD /* object.h */, @@ -2795,10 +2856,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 */, @@ -2829,7 +2886,6 @@ 4D43C30B1A9BB22A00EA28F3 /* view_mensural.cpp */, 4D766EF820ACAD62006875D8 /* view_neume.cpp */, 8F086EDE188539540037FD8E /* view_page.cpp */, - 4DC12A7B1F740FB9000440E9 /* view_running.cpp */, 4D7927CF20ECCC6D0002A45D /* view_slur.cpp */, 4DDBBCC41C2EBAE7001AB50A /* view_text.cpp */, 4D20741122A708C600E0765F /* view_tab.cpp */, @@ -2859,6 +2915,8 @@ 8F59291218854BF800FE51AD /* clef.h */, 4DC34BA619BC4A83006175CD /* custos.cpp */, 4DC34BA019BC4A70006175CD /* custos.h */, + 4D7AFDC62A5554A100835ED1 /* divline.cpp */, + 4D7AFDCB2A5554C100835ED1 /* divline.h */, 4DC34BA719BC4A83006175CD /* dot.cpp */, 4DC34BA119BC4A70006175CD /* dot.h */, 4DEEDE631E617C930087E8BC /* elementpart.cpp */, @@ -2877,6 +2935,8 @@ 8F59291E18854BF800FE51AD /* layerelement.h */, 152886C41C9CA86100B515BB /* ligature.cpp */, 152886C11C9CA2E000B515BB /* ligature.h */, + 4DC07F682A4DBB8500360070 /* liquescent.cpp */, + 4DC07F652A4DBB7200360070 /* liquescent.h */, 8F086ECA188539540037FD8E /* mensur.cpp */, 8F59292118854BF800FE51AD /* mensur.h */, 4D763EC51987D04D003FCAB5 /* metersig.cpp */, @@ -2946,22 +3006,35 @@ children = ( E786CD09298AA3BC009BAC58 /* horizontal-layout */, E786CD0A298AA3D8009BAC58 /* vertical-layout */, - E786CD0B298AA450009BAC58 /* search */, E7908EA12985829F0004C1F9 /* alignfunctor.cpp */, E7908E9E298582090004C1F9 /* alignfunctor.h */, E7265E7029DC700800D11F41 /* castofffunctor.cpp */, E7265E6D29DC6FD200D11F41 /* castofffunctor.h */, + E763EF4129E939FB0029E56D /* convertfunctor.cpp */, + E763EF3E29E939C00029E56D /* convertfunctor.h */, + E74A806028BC9111005274E7 /* findfunctor.cpp */, + E74A806528BC97D5005274E7 /* findfunctor.h */, + E722106528F856C4002CD6E9 /* findlayerelementsfunctor.cpp */, + E722106228F8569F002CD6E9 /* findlayerelementsfunctor.h */, E765675B28BC019F00BC6490 /* functor.h */, E74A806828BC9842005274E7 /* functorinterface.cpp */, E765675828BBFBA400BC6490 /* functorinterface.h */, E7BF80E629E3625700EA38F0 /* justifyfunctor.cpp */, E7BF80E329E3374600EA38F0 /* justifyfunctor.h */, + E7B17DA829F665C50076E75F /* midifunctor.cpp */, + E7B17DA529F6657B0076E75F /* midifunctor.h */, + E70E2AA229F262DB00DB3044 /* miscfunctor.cpp */, + E70E2A9F29F262A200DB3044 /* miscfunctor.h */, E7C3AED8295501A5002DE5AB /* preparedatafunctor.cpp */, E7C3AED52955018F002DE5AB /* preparedatafunctor.h */, E71EF3C52975ED3800D36264 /* resetfunctor.cpp */, E71EF3C22975E4DC00D36264 /* resetfunctor.h */, + E7F1C36629F0345D007E12C1 /* savefunctor.cpp */, + E7F1C36329F033FB007E12C1 /* savefunctor.h */, E7D3389C293E05A800C40B81 /* setscoredeffunctor.cpp */, E7D33899293E057100C40B81 /* setscoredeffunctor.h */, + E73E86272A069C920089DF74 /* transposefunctor.cpp */, + E73E86242A069C640089DF74 /* transposefunctor.h */, ); name = functors; sourceTree = ""; @@ -3044,17 +3117,6 @@ name = "vertical-layout"; sourceTree = ""; }; - E786CD0B298AA450009BAC58 /* search */ = { - isa = PBXGroup; - children = ( - E74A806028BC9111005274E7 /* findfunctor.cpp */, - E74A806528BC97D5005274E7 /* findfunctor.h */, - E722106528F856C4002CD6E9 /* findlayerelementsfunctor.cpp */, - E722106228F8569F002CD6E9 /* findlayerelementsfunctor.h */, - ); - name = search; - sourceTree = ""; - }; /* End PBXGroup section */ /* Begin PBXHeadersBuildPhase section */ @@ -3087,6 +3149,7 @@ 8F59293818854BF800FE51AD /* beam.h in Headers */, 4D6331F31F46D2B400A0D6BF /* arpeg.h in Headers */, 4DB3D8D81F83D13900B5FC2B /* trill.h in Headers */, + E70E2AA029F262A200DB3044 /* miscfunctor.h in Headers */, 4D1BE7801C69434C0086DC0E /* MidiEvent.h in Headers */, 4DB3D8C11F83D0E100B5FC2B /* systemelement.h in Headers */, 8F59293918854BF800FE51AD /* clef.h in Headers */, @@ -3103,6 +3166,7 @@ E78F204F29D9B02600CD5910 /* calcbboxoverflowsfunctor.h in Headers */, 8F59293C18854BF800FE51AD /* durationinterface.h in Headers */, 8F59293D18854BF800FE51AD /* toolkit.h in Headers */, + E763EF3F29E939C00029E56D /* convertfunctor.h in Headers */, 4D1D733C1A1D0390001E08F6 /* smufl.h in Headers */, 40C2E4212052A6EC0003625F /* pb.h in Headers */, 40BD9393206B95120037BF8E /* annot.h in Headers */, @@ -3121,7 +3185,6 @@ 403BEFF1206C00D500D022D5 /* mrpt2.h in Headers */, 4DC12A571F716E1C000440E9 /* pghead.h in Headers */, 4DA0EADF22BB77AF00A7EBEB /* facsimileinterface.h in Headers */, - 4DC12A8A1F74111E000440E9 /* pgfoot2.h in Headers */, 8F59294018854BF800FE51AD /* iomei.h in Headers */, 4DACC9A02990F29A00B55913 /* atts_gestural.h in Headers */, 4DACC9CC2990F29A00B55913 /* attclasses.h in Headers */, @@ -3152,10 +3215,11 @@ 4DACCA112990F2E600B55913 /* attalternates.h in Headers */, 4DACC98C2990F29A00B55913 /* atts_usersymbols.h in Headers */, 8F59294418854BF800FE51AD /* layer.h in Headers */, + 4D7AFDCC2A5554C100835ED1 /* divline.h in Headers */, + E7F1C36429F033FB007E12C1 /* savefunctor.h in Headers */, 4DACCA172990F2E600B55913 /* attdef.h in Headers */, 4DB3D8EC1F83D18300B5FC2B /* proport.h in Headers */, 4DEC4DDE21C8295700D1D273 /* lem.h in Headers */, - 4DC12A5D1F73F888000440E9 /* pghead2.h in Headers */, E778BDAE29D5BD3D00672D51 /* adjuststaffoverlapfunctor.h in Headers */, E7E9C11A29B0EF9600CFCE2F /* adjusttempofunctor.h in Headers */, 8F59294518854BF800FE51AD /* layerelement.h in Headers */, @@ -3168,6 +3232,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 */, @@ -3231,7 +3296,9 @@ 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 */, + 4D1EB6AE2A2A7C6400AF2F98 /* div.h in Headers */, 4DEC4DDA21C8295700D1D273 /* damage.h in Headers */, 4DACC9CE2990F29A00B55913 /* atts_mei.h in Headers */, 8F59294E18854BF800FE51AD /* positioninterface.h in Headers */, @@ -3240,6 +3307,7 @@ BDC366E02576AFA500E4D826 /* grpsym.h in Headers */, 4DF289FD1A7545CC00BA9F7D /* timeinterface.h in Headers */, 8F59295018854BF800FE51AD /* scoredef.h in Headers */, + 4DC07F662A4DBB7200360070 /* liquescent.h in Headers */, E708AA6229D2B96A001F937A /* adjustfloatingpositionerfunctor.h in Headers */, E7D48C7129D21F040031D89D /* adjustyposfunctor.h in Headers */, 4DFB3E8A23ABDFDA00D688C7 /* pitchinflection.h in Headers */, @@ -3288,6 +3356,7 @@ 4D1BE7791C6942930086DC0E /* pugixml.hpp in Headers */, 400FEDD4206FA74A000D3233 /* gracegrp.h in Headers */, 4DF440751D39567A00152B7E /* ending.h in Headers */, + 4D1EB6A62A2A40CB00AF2F98 /* textlayoutelement.h in Headers */, 4DE96E3921C4370E00CB85BE /* bracketspan.h in Headers */, E7E1698B29A8BA3900FFF482 /* adjustgracexposfunctor.h in Headers */, E7265E6E29DC6FD300D11F41 /* castofffunctor.h in Headers */, @@ -3296,6 +3365,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 */, @@ -3308,7 +3378,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 */, @@ -3357,6 +3426,7 @@ BB4C4BC422A9330D001F6AF0 /* pugixml.hpp in Headers */, 4DACC9F52990F29A00B55913 /* atts_visual.h in Headers */, BBC19FC322B38C1400100F42 /* VerovioFramework.h in Headers */, + 4D1EB6AF2A2A7C6400AF2F98 /* div.h in Headers */, BB4C4BC222A9330D001F6AF0 /* pugiconfig.hpp in Headers */, 4DACC9F12990F29A00B55913 /* atts_critapp.h in Headers */, 4D81351C2322C2CC00F59C01 /* keyaccid.h in Headers */, @@ -3398,6 +3468,7 @@ 4D723AF525E8DB0B0062E0A2 /* zip_file.hpp in Headers */, E765675A28BBFBA400BC6490 /* functorinterface.h in Headers */, E722106428F8569F002CD6E9 /* findlayerelementsfunctor.h in Headers */, + E7F1C36529F033FC007E12C1 /* savefunctor.h in Headers */, BDC366DB2576AFA400E4D826 /* grpsym.h in Headers */, BB4C4B0622A932C3001F6AF0 /* pgfoot.h in Headers */, BB4C4AFA22A932BC001F6AF0 /* restore.h in Headers */, @@ -3410,6 +3481,7 @@ BB4C4B5222A932D7001F6AF0 /* ftrem.h in Headers */, E7E9C11329B0A1E200CFCE2F /* adjustaccidxfunctor.h in Headers */, 4D88AD0B289673F50006D7DA /* symbol.h in Headers */, + 4D1EB6A72A2A40CB00AF2F98 /* textlayoutelement.h in Headers */, 4D2E759022BC2B71004C51F0 /* course.h in Headers */, BB4C4AA722A932A0001F6AF0 /* bboxdevicecontext.h in Headers */, BB4C4AF822A932BC001F6AF0 /* reg.h in Headers */, @@ -3424,11 +3496,13 @@ BB4C4B2A22A932CF001F6AF0 /* harm.h in Headers */, 4DD7C10027A55CFD00B9C017 /* timemap.h in Headers */, BB4C4AAC22A932A0001F6AF0 /* svgdevicecontext.h in Headers */, + 4DC07F672A4DBB7200360070 /* liquescent.h in Headers */, E788335E2994EC5800D44B01 /* calcchordnoteheadsfunctor.h in Headers */, BB4C4ADE22A932BC001F6AF0 /* add.h in Headers */, BB4C4B4C22A932D7001F6AF0 /* custos.h in Headers */, 4DACCA182990F2E600B55913 /* attdef.h in Headers */, BB4C4ADA22A932B6001F6AF0 /* system.h in Headers */, + 4D7AFDCD2A5554C100835ED1 /* divline.h in Headers */, 4DACC9CD2990F29A00B55913 /* attclasses.h in Headers */, E76A9D4829A74E180044682D /* adjustdotsfunctor.h in Headers */, 4DA0EAE422BB77AF00A7EBEB /* surface.h in Headers */, @@ -3453,7 +3527,7 @@ 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 */, 4DBDD67A2939E1D1009EC466 /* symboldef.h in Headers */, @@ -3479,7 +3553,6 @@ BB4C4AB422A932A6001F6AF0 /* iohumdrum.h in Headers */, 40ACDEA724079F6900F82B8C /* reh.h in Headers */, BB4C4B6822A932D7001F6AF0 /* multirpt.h in Headers */, - BB4C4B0822A932C3001F6AF0 /* pgfoot2.h in Headers */, 4D94E0E32995411100F49F89 /* meibasic.h in Headers */, 4DA0EAD822BB77AF00A7EBEB /* editortoolkit_cmn.h in Headers */, 4DACCA102990F2E600B55913 /* att.h in Headers */, @@ -3487,7 +3560,6 @@ BB4C4AF222A932BC001F6AF0 /* orig.h in Headers */, E7A03CD229D6172D00C02941 /* adjusttupletsyfunctor.h in Headers */, BB4C4AD622A932B6001F6AF0 /* staffgrp.h in Headers */, - BB4C4B0C22A932C3001F6AF0 /* pghead2.h in Headers */, 4DACC9F72990F29A00B55913 /* atts_mensural.h in Headers */, BB4C4ACE22A932B6001F6AF0 /* sb.h in Headers */, 4DA0EADA22BB77AF00A7EBEB /* facsimile.h in Headers */, @@ -3500,7 +3572,9 @@ 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 */, BB4C4B3422A932CF001F6AF0 /* tempo.h in Headers */, 4DACC9E12990F29A00B55913 /* attconverter.h in Headers */, @@ -3591,6 +3665,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 */, @@ -3605,6 +3680,7 @@ 4DACC9BF2990F29A00B55913 /* atts_midi.h in Headers */, E78F204829D98CFD00CD5910 /* adjustxrelfortranscriptionfunctor.h in Headers */, BB4C4BBD22A932FC001F6AF0 /* MidiEventList.h in Headers */, + E763EF4029E939C00029E56D /* convertfunctor.h in Headers */, BB4C4BBB22A932FC001F6AF0 /* MidiEvent.h in Headers */, BB4C4B4A22A932D7001F6AF0 /* clef.h in Headers */, BB4C4B4222A932D7001F6AF0 /* beam.h in Headers */, @@ -3781,6 +3857,7 @@ buildActionMask = 2147483647; files = ( 4D1693F51E3A44F300569BF4 /* verticalaligner.cpp in Sources */, + 4D7AFDC82A5554A100835ED1 /* divline.cpp in Sources */, 4D1693F61E3A44F300569BF4 /* barline.cpp in Sources */, E7901661298BCB2C008FDB4E /* calcalignmentxposfunctor.cpp in Sources */, 400FEDD6206FA74D000D3233 /* gracegrp.cpp in Sources */, @@ -3794,12 +3871,12 @@ 4DEC4DB321C826E000D1D273 /* supplied.cpp in Sources */, E7E1698729A898CE00FFF482 /* adjustlayersfunctor.cpp in Sources */, E7ED8A6929C111CA00735875 /* cachehorizontallayoutfunctor.cpp in Sources */, - 4DC12A851F741110000440E9 /* pgfoot2.cpp in Sources */, 40E1CEE0205060FD0007C8AF /* labelabbr.cpp in Sources */, 35F6580F24F92B6100C99A2D /* fing.cpp in Sources */, 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 */, @@ -3824,6 +3901,7 @@ 4DB3D8DE1F83D15200B5FC2B /* btrem.cpp in Sources */, 4D1694041E3A44F300569BF4 /* space.cpp in Sources */, 4DEC4D8321C804E000D1D273 /* app.cpp in Sources */, + E7F1C36929F03461007E12C1 /* savefunctor.cpp in Sources */, 4DF092A62497711800239195 /* phrase.cpp in Sources */, 4DB3D8D91F83D13C00B5FC2B /* turn.cpp in Sources */, 4DA0EAC422BB779400A7EBEB /* surface.cpp in Sources */, @@ -3831,6 +3909,7 @@ 4DEC4DAF21C81F0600D1D273 /* sic.cpp in Sources */, E75EA9FE29CC3A8B003A97A7 /* calcarticfunctor.cpp in Sources */, 4D81351F2322C41800F59C01 /* keyaccid.cpp in Sources */, + 4D1EB6A22A2A40B400AF2F98 /* textlayoutelement.cpp in Sources */, 4D79642226C167100026288B /* pagemilestone.cpp in Sources */, 4DB3D8E31F83D16300B5FC2B /* elementpart.cpp in Sources */, E741AD03299A3D6300854426 /* calcslurdirectionfunctor.cpp in Sources */, @@ -3853,9 +3932,11 @@ E7ADB3AF29D1923500825D5D /* adjustarticfunctor.cpp in Sources */, 4DE96E3C21C4373200CB85BE /* bracketspan.cpp in Sources */, 4D16940D1E3A44F300569BF4 /* hairpin.cpp in Sources */, + 4DC07F6A2A4DBB8500360070 /* liquescent.cpp in Sources */, 4DB3D8FC1F83D1FD00B5FC2B /* horizontalaligner.cpp in Sources */, BD2E4D982875880600B04350 /* stem.cpp in Sources */, 4D16940E1E3A44F300569BF4 /* view_mensural.cpp in Sources */, + E70E2AA529F262F800DB3044 /* miscfunctor.cpp in Sources */, 4D16940F1E3A44F300569BF4 /* layer.cpp in Sources */, 4D1694101E3A44F300569BF4 /* proport.cpp in Sources */, 4DEC4DBF21C828AC00D1D273 /* corr.cpp in Sources */, @@ -3872,7 +3953,6 @@ E78F204B29D98D2B00CD5910 /* adjustxrelfortranscriptionfunctor.cpp in Sources */, BD0562372518CD20004057EB /* beamspan.cpp in Sources */, 4D1694181E3A44F300569BF4 /* text.cpp in Sources */, - 4DC12A7D1F740FB9000440E9 /* view_running.cpp in Sources */, E7265E7329DC701000D11F41 /* castofffunctor.cpp in Sources */, E7D48C7529D21F2B0031D89D /* adjustyposfunctor.cpp in Sources */, E77C198228CD31AC00F5BADA /* calcdotsfunctor.cpp in Sources */, @@ -3883,7 +3963,6 @@ 4D16946A1E3A455100569BF4 /* humlib.cpp in Sources */, 4D72A5E3208A3822009DEC1E /* beatrpt.cpp in Sources */, 4D16941A1E3A44F300569BF4 /* view_text.cpp in Sources */, - 4DC12A641F73F898000440E9 /* pghead2.cpp in Sources */, 4D94722020CA702C00C780C8 /* linkinginterface.cpp in Sources */, 4DEC4DAB21C81EEC00D1D273 /* restore.cpp in Sources */, 4D766EFE20ACAD6D006875D8 /* nc.cpp in Sources */, @@ -3903,10 +3982,12 @@ 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 */, 4D1694221E3A44F300569BF4 /* page.cpp in Sources */, + E763EF4429E93A0B0029E56D /* convertfunctor.cpp in Sources */, 4DC12A791F7400B9000440E9 /* runningelement.cpp in Sources */, 4D1694231E3A44F300569BF4 /* pitchinterface.cpp in Sources */, 4DACCA032990F29A00B55913 /* atts_usersymbols.cpp in Sources */, @@ -3931,6 +4012,7 @@ 4D16942C1E3A44F300569BF4 /* staff.cpp in Sources */, 4DB3D8E61F83D16A00B5FC2B /* ftrem.cpp in Sources */, 4DACCA072990F29A00B55913 /* atts_harmony.cpp in Sources */, + 4D1EB6AA2A2A7C5100AF2F98 /* div.cpp in Sources */, 4DC12A5A1F716E27000440E9 /* pghead.cpp in Sources */, 4DACC9A72990F29A00B55913 /* atts_externalsymbols.cpp in Sources */, 4DACC9F92990F29A00B55913 /* atts_figtable.cpp in Sources */, @@ -4024,6 +4106,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 */, @@ -4062,7 +4145,6 @@ 4DEC4D9621C81E3B00D1D273 /* expan.cpp in Sources */, 4D508C3026D4E64C00020F35 /* crc.cpp in Sources */, 8F086EE4188539540037FD8E /* barline.cpp in Sources */, - 4DC12A7C1F740FB9000440E9 /* view_running.cpp in Sources */, E7E9C11529B0A1FF00CFCE2F /* adjustaccidxfunctor.cpp in Sources */, 4DACC9A62990F29A00B55913 /* atts_externalsymbols.cpp in Sources */, 8F086EE5188539540037FD8E /* bboxdevicecontext.cpp in Sources */, @@ -4084,18 +4166,20 @@ 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 */, 4DA0EAEA22BB77C300A7EBEB /* editortoolkit_neume.cpp in Sources */, 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 */, E7BF80E929E3625F00EA38F0 /* justifyfunctor.cpp in Sources */, E78833602994EC7900D44B01 /* calcchordnoteheadsfunctor.cpp in Sources */, + E763EF4529E93A0C0029E56D /* convertfunctor.cpp in Sources */, 40D0D5E21E3BD7FE00E6BF5C /* turn.cpp in Sources */, 40C2E41E2052A6E00003625F /* sb.cpp in Sources */, E79320672991453C00D80975 /* calcstemfunctor.cpp in Sources */, @@ -4144,6 +4228,7 @@ 406916DC23833770009E6B04 /* mspace.cpp in Sources */, E7A1640C29AF34750099BD6A /* adjustharmgrpsspacingfunctor.cpp in Sources */, 4D95D4F91D718D4A00B2B856 /* systemelement.cpp in Sources */, + 4D1EB6A92A2A7C5100AF2F98 /* div.cpp in Sources */, 4DDBBB5B1C7AE45900054AFF /* dynam.cpp in Sources */, E7E1698E29A8BA5200FFF482 /* adjustgracexposfunctor.cpp in Sources */, 4D5572441CF57B5C008D06A0 /* pedal.cpp in Sources */, @@ -4158,6 +4243,7 @@ 4D798CBD1B8AEDBA007281CA /* drawinginterface.cpp in Sources */, 4DDBBCC51C2EBAE7001AB50A /* view_text.cpp in Sources */, 4D6122BE1F77E1E000FC90A0 /* rend.cpp in Sources */, + 4DC07F692A4DBB8500360070 /* liquescent.cpp in Sources */, 403BEFF0206C00B500D022D5 /* multirpt.cpp in Sources */, 4D766EFA20ACAD63006875D8 /* syllable.cpp in Sources */, 8F086EF7188539540037FD8E /* multirest.cpp in Sources */, @@ -4174,7 +4260,6 @@ 8F086EF8188539540037FD8E /* note.cpp in Sources */, 409B3DD91F2D1C2A0098A265 /* ftrem.cpp in Sources */, 4D5FA9111E16A93F00F3B919 /* boundingbox.cpp in Sources */, - 4DC12A841F741110000440E9 /* pgfoot2.cpp in Sources */, 8F086EF9188539540037FD8E /* object.cpp in Sources */, 4DD7C10227A5650600B9C017 /* timemap.cpp in Sources */, E797C460298EC2C600CAD67E /* calcalignmentpitchposfunctor.cpp in Sources */, @@ -4186,6 +4271,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 */, @@ -4249,6 +4335,7 @@ 8F086F0A188539540037FD8E /* view_page.cpp in Sources */, E7876F2029C0A702002147DC /* adjusttupletsxfunctor.cpp in Sources */, E79C87C3269440570098FE85 /* lv.cpp in Sources */, + 4D7AFDC72A5554A100835ED1 /* divline.cpp in Sources */, 4DEC4DA621C81ED400D1D273 /* reg.cpp in Sources */, 8F086F0B188539540037FD8E /* view_tuplet.cpp in Sources */, 4D4C26ED1EF7E75400681770 /* label.cpp in Sources */, @@ -4264,6 +4351,7 @@ 4DA60EE61B6307B9006E2DFC /* textdirinterface.cpp in Sources */, 4DACC9C02990F29A00B55913 /* atts_cmn.cpp in Sources */, 40ABF1FF1E5DF23B00F32F41 /* expansion.cpp in Sources */, + E7F1C36A29F03462007E12C1 /* savefunctor.cpp in Sources */, E7876F1829C07F16002147DC /* adjustsylspacingfunctor.cpp in Sources */, 152886C51C9CA86100B515BB /* ligature.cpp in Sources */, 4DEC4D8221C804E000D1D273 /* app.cpp in Sources */, @@ -4272,6 +4360,7 @@ 4DEEDE641E617C930087E8BC /* elementpart.cpp in Sources */, 4D95D4F61D71866200B2B856 /* controlelement.cpp in Sources */, BDC366C72576AF9300E4D826 /* grpsym.cpp in Sources */, + E70E2AA629F262F800DB3044 /* miscfunctor.cpp in Sources */, 4D983005192E959E00320037 /* main.cpp in Sources */, 4DACC9802990F29A00B55913 /* atts_edittrans.cpp in Sources */, 4DEC4D8E21C81DEE00D1D273 /* damage.cpp in Sources */, @@ -4285,6 +4374,7 @@ 4D4FCD0C1F5455FF0009C455 /* staffgrp.cpp in Sources */, 4DEC4DBE21C828AC00D1D273 /* corr.cpp in Sources */, 4D1BD1B521908D6B000D35B2 /* halfmrpt.cpp in Sources */, + 4D1EB6A12A2A40B400AF2F98 /* textlayoutelement.cpp in Sources */, 4D09D3ED1EA8AD8500A420E6 /* horizontalaligner.cpp in Sources */, 4DEC4DA221C81EB300D1D273 /* rdg.cpp in Sources */, 4D9A9C19199F561200028D93 /* verse.cpp in Sources */, @@ -4330,12 +4420,12 @@ buildActionMask = 2147483647; files = ( 4DEF8A6621B7AAF90093A76B /* f.cpp in Sources */, + 4D7AFDC92A5554A100835ED1 /* divline.cpp in Sources */, 4DB3D8F01F83D1A700B5FC2B /* fig.cpp in Sources */, E790165F298BCB27008FDB4E /* calcalignmentxposfunctor.cpp in Sources */, 8F3DD36718854B410051330C /* verticalaligner.cpp in Sources */, 4D766F0220ACAD6E006875D8 /* nc.cpp in Sources */, 4DEC4D9821C81E3B00D1D273 /* expan.cpp in Sources */, - 4DC12A651F73F898000440E9 /* pghead2.cpp in Sources */, 4D3C3F0E294B89AF009993E6 /* ornam.cpp in Sources */, E7770F8829D0DA2000A9BECF /* adjustslursfunctor.cpp in Sources */, 4DB3D8C81F83D10000B5FC2B /* dir.cpp in Sources */, @@ -4349,6 +4439,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 */, @@ -4373,6 +4464,7 @@ 4D1D73411A1D08DC001E08F6 /* glyph.cpp in Sources */, 4D79641A26C1522B0026288B /* pageelement.cpp in Sources */, 8F3DD36418854B390051330C /* view_page.cpp in Sources */, + E7F1C36729F0345D007E12C1 /* savefunctor.cpp in Sources */, 4DEC4D8021C804C500D1D273 /* add.cpp in Sources */, 8F3DD36518854B390051330C /* view_tuplet.cpp in Sources */, 4DF092A72497711800239195 /* phrase.cpp in Sources */, @@ -4380,6 +4472,7 @@ 4D1BE7861C6A40A80086DC0E /* pugixml.cpp in Sources */, E75EA9FF29CC3A8B003A97A7 /* calcarticfunctor.cpp in Sources */, 400FEDD5206FA74D000D3233 /* gracegrp.cpp in Sources */, + 4D1EB6A32A2A40B400AF2F98 /* textlayoutelement.cpp in Sources */, 4DA0EAC522BB779400A7EBEB /* surface.cpp in Sources */, 4DB726C61B8BB0E80040231B /* text.cpp in Sources */, 4D79642326C167100026288B /* pagemilestone.cpp in Sources */, @@ -4402,9 +4495,11 @@ E7ADB3B029D1923600825D5D /* adjustarticfunctor.cpp in Sources */, 4D4C26F01EF7E75E00681770 /* score.cpp in Sources */, 8F3DD34018854B2E0051330C /* clef.cpp in Sources */, + 4DC07F6B2A4DBB8500360070 /* liquescent.cpp in Sources */, 8F3DD34218854B2E0051330C /* durationinterface.cpp in Sources */, 4DEC4D9C21C81E6600D1D273 /* lem.cpp in Sources */, 4DDBBB5C1C7AE45900054AFF /* dynam.cpp in Sources */, + E70E2AA329F262DB00DB3044 /* miscfunctor.cpp in Sources */, 4DB3D8D31F83D12300B5FC2B /* pedal.cpp in Sources */, 8F7DD0571EAF3682001B072A /* fb.cpp in Sources */, BD2E4D972875880500B04350 /* stem.cpp in Sources */, @@ -4448,14 +4543,15 @@ 403BEFF2206C00D700D022D5 /* mrpt2.cpp in Sources */, 4D508C3226D4E64C00020F35 /* crc.cpp in Sources */, 8F3DD34E18854B2E0051330C /* pitchinterface.cpp in Sources */, - 4DC12A861F741110000440E9 /* pgfoot2.cpp in Sources */, 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 */, E74A806128BC9111005274E7 /* findfunctor.cpp in Sources */, + E763EF4229E939FB0029E56D /* convertfunctor.cpp in Sources */, 8F3DD35218854B2E0051330C /* rest.cpp in Sources */, 4DEC4D9421C81E0B00D1D273 /* del.cpp in Sources */, 4DACCA042990F29A00B55913 /* atts_usersymbols.cpp in Sources */, @@ -4480,6 +4576,7 @@ 8F3DD32E18854B250051330C /* layer.cpp in Sources */, 8F3DD33018854B250051330C /* measure.cpp in Sources */, 4DACCA082990F29A00B55913 /* atts_harmony.cpp in Sources */, + 4D1EB6AB2A2A7C5100AF2F98 /* div.cpp in Sources */, 8F3DD33218854B250051330C /* page.cpp in Sources */, 4DACC9A82990F29A00B55913 /* atts_externalsymbols.cpp in Sources */, 4DACC9FA2990F29A00B55913 /* atts_figtable.cpp in Sources */, @@ -4533,7 +4630,6 @@ 4DACC9EE2990F29A00B55913 /* atts_shared.cpp in Sources */, 8F3DD32018854AFB0051330C /* devicecontext.cpp in Sources */, 4DACC9AC2990F29A00B55913 /* attmodule.cpp in Sources */, - 4DC12A7E1F740FB9000440E9 /* view_running.cpp in Sources */, 8F3DD32218854AFB0051330C /* svgdevicecontext.cpp in Sources */, 4DCA95D91A515D0E008AD7E9 /* editorial.cpp in Sources */, 4DA80D971A6ACF5D0089802D /* options.cpp in Sources */, @@ -4573,6 +4669,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 */, @@ -4605,6 +4702,7 @@ buildActionMask = 2147483647; files = ( BB4C4AF522A932BC001F6AF0 /* ref.cpp in Sources */, + 4D7AFDCA2A5554A100835ED1 /* divline.cpp in Sources */, BB4C4B9322A932E5001F6AF0 /* areaposinterface.cpp in Sources */, E7901660298BCB27008FDB4E /* calcalignmentxposfunctor.cpp in Sources */, BB4C4AA122A9328F001F6AF0 /* verticalaligner.cpp in Sources */, @@ -4624,13 +4722,13 @@ 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 */, 4DACC98B2990F29A00B55913 /* atts_mei.cpp in Sources */, E787035A299CF07700156DC4 /* adjustarpegfunctor.cpp in Sources */, E76046C128D4829000C36204 /* calcledgerlinesfunctor.cpp in Sources */, - BB4C4B0B22A932C3001F6AF0 /* pghead2.cpp in Sources */, BB4C4BBA22A932FC001F6AF0 /* MidiEvent.cpp in Sources */, BB4C4B8B22A932DF001F6AF0 /* rend.cpp in Sources */, E7876F1B29C07F23002147DC /* adjustsylspacingfunctor.cpp in Sources */, @@ -4648,6 +4746,7 @@ 4D79641B26C1522B0026288B /* pageelement.cpp in Sources */, BB4C4B9722A932E5001F6AF0 /* durationinterface.cpp in Sources */, BB4C4B4F22A932D7001F6AF0 /* elementpart.cpp in Sources */, + E7F1C36829F0345D007E12C1 /* savefunctor.cpp in Sources */, BB4C4AC122A932B6001F6AF0 /* layer.cpp in Sources */, BB4C4B0522A932C3001F6AF0 /* pgfoot.cpp in Sources */, 4DF092A82497711800239195 /* phrase.cpp in Sources */, @@ -4655,6 +4754,7 @@ 4DA0EAC622BB779400A7EBEB /* surface.cpp in Sources */, E75EAA0029CC3A8C003A97A7 /* calcarticfunctor.cpp in Sources */, BB4C4ADB22A932BC001F6AF0 /* abbr.cpp in Sources */, + 4D1EB6A42A2A40B400AF2F98 /* textlayoutelement.cpp in Sources */, 4D79642426C167100026288B /* pagemilestone.cpp in Sources */, E741AD05299A3D6500854426 /* calcslurdirectionfunctor.cpp in Sources */, BB4C4A9322A9328F001F6AF0 /* doc.cpp in Sources */, @@ -4677,9 +4777,11 @@ E7ADB3B129D1923700825D5D /* adjustarticfunctor.cpp in Sources */, BB4C4B6922A932D7001F6AF0 /* nc.cpp in Sources */, BB4C4B5F22A932D7001F6AF0 /* mrest.cpp in Sources */, + 4DC07F6C2A4DBB8500360070 /* liquescent.cpp in Sources */, BB4C4B5722A932D7001F6AF0 /* layerelement.cpp in Sources */, BD2E4D962875880500B04350 /* stem.cpp in Sources */, BB4C4ACB22A932B6001F6AF0 /* pb.cpp in Sources */, + E70E2AA429F262DB00DB3044 /* miscfunctor.cpp in Sources */, BB4C4BB422A932EB001F6AF0 /* view_text.cpp in Sources */, BB4C4B4522A932D7001F6AF0 /* btrem.cpp in Sources */, BB4C4B6B22A932D7001F6AF0 /* neume.cpp in Sources */, @@ -4727,13 +4829,14 @@ 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 */, BB4C4A5A22A9318B001F6AF0 /* humlib.cpp in Sources */, + E763EF4329E939FB0029E56D /* convertfunctor.cpp in Sources */, 4DA0EAF522BB77C300A7EBEB /* facsimileinterface.cpp in Sources */, 4DACCA052990F29A00B55913 /* atts_usersymbols.cpp in Sources */, - BB4C4B0722A932C3001F6AF0 /* pgfoot2.cpp in Sources */, BB4C4B6122A932D7001F6AF0 /* mrpt.cpp in Sources */, BB4C4AE722A932BC001F6AF0 /* damage.cpp in Sources */, 4DA0EACA22BB779400A7EBEB /* facsimile.cpp in Sources */, @@ -4755,6 +4858,7 @@ BB4C4BB122A932EB001F6AF0 /* view_page.cpp in Sources */, 4DACCA092990F29A00B55913 /* atts_harmony.cpp in Sources */, BB4C4A9F22A9328F001F6AF0 /* toolkit.cpp in Sources */, + 4D1EB6AC2A2A7C5100AF2F98 /* div.cpp in Sources */, 4DACC9A92990F29A00B55913 /* atts_externalsymbols.cpp in Sources */, 4DACC9FB2990F29A00B55913 /* atts_figtable.cpp in Sources */, E797C465298EC30800CAD67E /* calcalignmentpitchposfunctor.cpp in Sources */, @@ -4762,7 +4866,6 @@ 4DACC9E52990F29A00B55913 /* atts_midi.cpp in Sources */, BB4C4AE922A932BC001F6AF0 /* del.cpp in Sources */, BB4C4B7122A932D7001F6AF0 /* rest.cpp in Sources */, - BB4C4BB222A932EB001F6AF0 /* view_running.cpp in Sources */, BB4C4B9D22A932E5001F6AF0 /* plistinterface.cpp in Sources */, BB4C4B8522A932DF001F6AF0 /* lb.cpp in Sources */, BB4C4AA322A9328F001F6AF0 /* vrv.cpp in Sources */, @@ -4848,6 +4951,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/bindings/iOS/all.h b/bindings/iOS/all.h index 0e18f27856d..9c77adf6e96 100644 --- a/bindings/iOS/all.h +++ b/bindings/iOS/all.h @@ -1,232 +1,251 @@ #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 #endif /* all_h */ - diff --git a/bindings/iOS/create_ios_framework_headers.sh b/bindings/iOS/create_ios_framework_headers.sh index 7f5e329d9e4..d20d7c3125a 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" diff --git a/bindings/java/build.sh b/bindings/java/build.sh index fbf4cbeed5b..37b6c01435d 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 ../../libmei/dist/*.cpp ../../libmei/addons/*.cpp) FILES="$SRCFILES \ ../../src/pugi/pugixml.cpp \ @@ -22,32 +22,16 @@ 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) 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 diff --git a/bindings/java/pom.xml b/bindings/java/pom.xml index 82385a1a276..7274152b02e 100644 --- a/bindings/java/pom.xml +++ b/bindings/java/pom.xml @@ -4,7 +4,7 @@ org.rism.verovio VerovioToolkit - 3.16.0-dev + 4.1.0-dev jar VerovioToolkit @@ -12,8 +12,8 @@ UTF-8 - 1.7 - 1.7 + 1.8 + 1.8 diff --git a/bindings/python/.pypi-version b/bindings/python/.pypi-version index 02e36b1641e..e41fa9d0265 100644 --- a/bindings/python/.pypi-version +++ b/bindings/python/.pypi-version @@ -1,3 +1,3 @@ # dummy file used by setup.py for counting revisions when publishing to test.pypi # counting can be reset by making a change to this file -3.16.0 +4.1.0 diff --git a/codemeta.json b/codemeta.json index c7fa88d235b..6500f6e0ea9 100644 --- a/codemeta.json +++ b/codemeta.json @@ -4,8 +4,8 @@ "identifier": "Verovio", "name": "Verovio", "description": "Verovio is a fast, portable and lightweight open-source library for engraving Music Encoding Initiative (MEI) music scores into SVG.", - "softwareVersion": "3.16.0-dev", - "datePublished": "2023-03-01", + "softwareVersion": "4.1.0-dev", + "datePublished": "2023-09-05", "license": "https://www.gnu.org/licenses/lgpl-3.0", "programmingLanguage": [{ "@type": "ComputerLanguage", diff --git a/data/Bravura.css b/data/Bravura.css index c53ee3524e9..c4c899e374f 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 b872d005faf..6c8403f057e 100644 --- a/data/Bravura.xml +++ b/data/Bravura.xml @@ -639,6 +639,12 @@ + + + + + + @@ -787,6 +793,23 @@ + + + + + + + + + + + + + + + + + @@ -806,6 +829,10 @@ + + + + @@ -816,6 +843,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -957,6 +1020,18 @@ + + + + + + + + + + + + diff --git a/data/Bravura/E8F3.xml b/data/Bravura/E8F3.xml new file mode 100644 index 00000000000..4e527f34fab --- /dev/null +++ b/data/Bravura/E8F3.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/data/Bravura/E8F4.xml b/data/Bravura/E8F4.xml new file mode 100644 index 00000000000..30ca5667feb --- /dev/null +++ b/data/Bravura/E8F4.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/data/Bravura/E8F5.xml b/data/Bravura/E8F5.xml new file mode 100644 index 00000000000..cd24e14d6f0 --- /dev/null +++ b/data/Bravura/E8F5.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/data/Bravura/E8F6.xml b/data/Bravura/E8F6.xml new file mode 100644 index 00000000000..cca6632b796 --- /dev/null +++ b/data/Bravura/E8F6.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/data/Bravura/E8F7.xml b/data/Bravura/E8F7.xml new file mode 100644 index 00000000000..a93dfaf4e20 --- /dev/null +++ b/data/Bravura/E8F7.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/data/Bravura/E8F8.xml b/data/Bravura/E8F8.xml new file mode 100644 index 00000000000..e9f05634f16 --- /dev/null +++ b/data/Bravura/E8F8.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/data/Bravura/EB90.xml b/data/Bravura/EB90.xml new file mode 100644 index 00000000000..1173905057b --- /dev/null +++ b/data/Bravura/EB90.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/data/Bravura/EB91.xml b/data/Bravura/EB91.xml new file mode 100644 index 00000000000..e45b7c6b9c3 --- /dev/null +++ b/data/Bravura/EB91.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/data/Bravura/EB92.xml b/data/Bravura/EB92.xml new file mode 100644 index 00000000000..d9a2835d90b --- /dev/null +++ b/data/Bravura/EB92.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/data/Bravura/EB93.xml b/data/Bravura/EB93.xml new file mode 100644 index 00000000000..6e46d2cb72c --- /dev/null +++ b/data/Bravura/EB93.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/data/Bravura/EB94.xml b/data/Bravura/EB94.xml new file mode 100644 index 00000000000..d1e123e037e --- /dev/null +++ b/data/Bravura/EB94.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/data/Bravura/EB95.xml b/data/Bravura/EB95.xml new file mode 100644 index 00000000000..2024e44a925 --- /dev/null +++ b/data/Bravura/EB95.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/data/Bravura/EB96.xml b/data/Bravura/EB96.xml new file mode 100644 index 00000000000..72ba6837aaa --- /dev/null +++ b/data/Bravura/EB96.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/data/Bravura/EB97.xml b/data/Bravura/EB97.xml new file mode 100644 index 00000000000..432903ca543 --- /dev/null +++ b/data/Bravura/EB97.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/data/Bravura/EB98.xml b/data/Bravura/EB98.xml new file mode 100644 index 00000000000..fb797416863 --- /dev/null +++ b/data/Bravura/EB98.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/data/Bravura/EB99.xml b/data/Bravura/EB99.xml new file mode 100644 index 00000000000..0326201f090 --- /dev/null +++ b/data/Bravura/EB99.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/data/Bravura/EB9A.xml b/data/Bravura/EB9A.xml new file mode 100644 index 00000000000..7b228994f43 --- /dev/null +++ b/data/Bravura/EB9A.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/data/Bravura/EB9B.xml b/data/Bravura/EB9B.xml new file mode 100644 index 00000000000..0f9eface4e1 --- /dev/null +++ b/data/Bravura/EB9B.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/data/Bravura/EB9C.xml b/data/Bravura/EB9C.xml new file mode 100644 index 00000000000..2f68eec488c --- /dev/null +++ b/data/Bravura/EB9C.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/data/Bravura/EB9D.xml b/data/Bravura/EB9D.xml new file mode 100644 index 00000000000..83f738a6d39 --- /dev/null +++ b/data/Bravura/EB9D.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/data/Bravura/EB9E.xml b/data/Bravura/EB9E.xml new file mode 100644 index 00000000000..8c6b480628d --- /dev/null +++ b/data/Bravura/EB9E.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/data/Bravura/EB9F.xml b/data/Bravura/EB9F.xml new file mode 100644 index 00000000000..bfbba5c5de9 --- /dev/null +++ b/data/Bravura/EB9F.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/data/Bravura/EBA6.xml b/data/Bravura/EBA6.xml new file mode 100644 index 00000000000..9ff55298b55 --- /dev/null +++ b/data/Bravura/EBA6.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/data/Bravura/EBCD.xml b/data/Bravura/EBCD.xml new file mode 100644 index 00000000000..2a874b8ed82 --- /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 00000000000..78a99730856 --- /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 00000000000..bd2aba9966c --- /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 00000000000..8db4a3818cf --- /dev/null +++ b/data/Bravura/EBD0.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/data/Bravura/EC00.xml b/data/Bravura/EC00.xml new file mode 100644 index 00000000000..c9f54d0cd92 --- /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 00000000000..a3d8e2d5490 --- /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 00000000000..439261dadab --- /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 00000000000..40cf522fbb2 --- /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 00000000000..ac27523bb5c --- /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 00000000000..862f2027a0c --- /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 00000000000..c59e8f05584 --- /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 00000000000..4f4fe30c2db --- /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 00000000000..cb568ec7b70 --- /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 00000000000..4f06c7db998 --- /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 00000000000..4b39857a2a5 --- /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 00000000000..d469c3e4be4 --- /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 00000000000..88da6b89477 --- /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 00000000000..c79d33c9072 --- /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 00000000000..fad11fabfcd --- /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 00000000000..f817f101111 --- /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 00000000000..f902b34af60 --- /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 00000000000..921bf381e10 --- /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 00000000000..731b03337ca --- /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 00000000000..4d869971b5c --- /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 00000000000..893f8306820 --- /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 00000000000..6a65fad693c --- /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 00000000000..dea659b3a0c --- /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 00000000000..9fd9a213525 --- /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 00000000000..557324c6b32 --- /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 00000000000..7311f067a9e --- /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 00000000000..df8fbf1731d --- /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 00000000000..a52febc1ad5 --- /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 00000000000..51eaf98f973 --- /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 00000000000..951545a1aad --- /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 00000000000..c2cdce9c56a --- /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 00000000000..011372f3f08 --- /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 00000000000..1c3cd60dad4 --- /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 00000000000..0ef368e5a34 --- /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 00000000000..df27610ca03 --- /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 00000000000..94b61df51b3 --- /dev/null +++ b/data/Bravura/EC23.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 00000000000..1cbfe8ca5bb --- /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 00000000000..9031cc5d1cd --- /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 00000000000..99d5eacc45b --- /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 00000000000..a4f7e20b597 --- /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 00000000000..14afceeabe4 --- /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 00000000000..a632d64066b --- /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 00000000000..96406613939 --- /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 00000000000..cfbf9d8b4f1 --- /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 00000000000..01ce5bfe57a --- /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 00000000000..810fcf2bd9d --- /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 00000000000..65e835054a3 --- /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 00000000000..1f6e78e9e2d --- /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 b14efec3d2a..68ce50f6a2c 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,d09GMgABAAAAACWcAA8AAAAAm3wAACU8AAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP0ZGVE0cGiQbIByCTgZWAIgyEQgKgosQgdZPC4MUAAE2AiQDhiQEIAWDGwePWRuefhXcGLph4wBgznuyiArWDUVRRjmRxP8fE6TIURpzaYfnC4mLoDXdJko0kIYdBYi50jslutV7monFUUZXeUwf78K2KNSUjdqBe7Cw6qfENy6N3sq0I5NQOJiCQCz59thv3s+0v87YGvNfdi87QmOf5MLzVFf1fkRmlrOlGsOr0/o2cHUPRMbwtM1/knfHcSAcGVIitJSBio0VuXBrF11urX+R7Y+uDVzLr94AT2j8nVfRwDMY8P43Z/mVmZLUsiGwy0kGF5hta6AEhyuQ/Hpz2psdZyYLFKAFDs8iy1bhRPDuSGC7H3QlFkrCaZhxQBEnmsgG5hlyHuGDCDInKWOrr/D93EIdGIopCiYNPZgE6/vH/Q0WBRcsq3Jz++d+/bsb2aBJK1JF+kZnfFMX+J9vDRhF2JzhSzuhCtNiYk5eIkCHq3LrNITwSVo6yp+5+abZS0e211+bVvrjv1dEgkaj8UiaGa1lydomu6fs3V53uVJVrZXXTbcpvbHfWoH/P57SaKkFUHtTCwrgnZAAFojCgmBeaAAODOTh4fv92tadf88KcMFD1BCa6MrDrWnCM5mQGFomhYTNIVYE23avqwrcuST5ZUyriNZ2a2M2gfLefhsjNUnn+CIciOMRe5YAAbg5fnkLuL031SCQLoIihDU1HbYmBYFUtwkWGivQ/KT1pUJq1g7mgwHxnpgJctv/zIyCjJY/fm2qAQNWWTGzwKvGi0gQm2iFZH+OcnAJ07Hx8mvjsGjVZ2FvSmfGurWDXtuPYgkPSjQFOEF8yFbvWfMQTcrAIUq8vS8clqz6Xex82xCWE0QPI2MQWC5aFQuoZcpVlsLiLJeMRsdqMiWjGZ2nqLpcIhLoLBI/C4v0BGEnDhGpxyrWJDx9y4DIAhmNjVdF1HYgA3x75DbFggC2w3JficbvtNF0JtaDOeB3OqtxKy1G3R1snHR95mFkVhdkgrr+k3Q0gObmusQCqL9qLEic5FNBB4tYw24O8D4jdDQdqlebBjTbya7xYZ/yHd/ufjNNtM7cmsfyi7q0Lui7+9FpUHvMBkR2simnlhmsZPtxz3G+kFO6qVqt6tYM+13t7T7hy74cxwNHk2vMLQ/8WS0ts1sOvLz5j9OEluXWWY4Dk3mBQtrdaK+zE3ug/u7S0BWOJ8r9mgxmWmwpWG6ngw4767KHHgdBgpJZDAApL9myUKaCTJWZMl8WgqwEMpORUwBAdipqYTS0dPQMwhlFMDGzsAJAcXYAKMkpkoubh5dPlGgxYvktLK2sbWzt7B2cnF1c3dw9PL28fUBgCBQGRyBRaAwWhycQSWQKlUZnMFlsDpfHFwhFYolUJlcoVWr9DTDQIIMBDDHUMMMBRKTLMALASKOMNsZY44wHMAHARJNMNsVU00w3w0yzzDbXcKN5bjTfmVlgoUUWW2KpZZZbQe/E3PDw4sNPgCAhXKKIFoqFDcfBxcMncMQqq60BsNY6622w0WawxVbbbLfDTrvstsdS3Wu/A/mtHXTIYYjTJmxRHaEr/2EjkGrpHYsYU/iWI6KMFWWzWDTypmWWbTt8xEH8eHGw0Kgnrjy0CZR8dGwsogNqBQQBaECzzHhPDx4cZhOYo1ZQuiMSF0Go25a4pdgN+s1Mu4jmTluQawb3ilkkglBMY3bflds4SUATon+KaUEvdf5G3OYSdX4yFEFXWmFV7XVS+4JIhsmkkouuaEYYlGEpGuwGWxuHhaQgicmAxh1jIBM5G0MRg8yBaBEdfkoSulMNNi0kV4w20KoJ9pVhNQSpJY5XCsn1EeKdEISiKOkWLAg6WL7I7rS5xCQbh4YegwojlTVWwnQo5uAzKwgq5yO+yednCTIw0nR0kFQuQ2SwCkFUMKxFTNTC2XAkGw5jv7X4PNxSDIP1oEqahIob4fAibyWJ5HapZhMyjzG7lkRiEiNJRB4PgjCMNx5QIMAgDGKqUL0XHxJAXHlSOZwSjqN6rGZxuDe1WMil0cQ+l4vFivMxG0ym+Ei6zZakdBj5fLMc2lQSCNjlAacgSOFESAoz/16w1DX1fCZNrqqWpREwG8EUphkRNFVleZ1bJ7oIOOZ0zQZEDEfasAKRQChi9n8r3RSD/IOSSP0czOtHNchG+nEFhdxRYNUm2BuUnt/VNs4S8iu1EA5EIttAspKXpHzWJkWIezSCtm3/TPnFp+9FvWWWEgUQzZVOnxZHVJgIrkqilwRNd0HeKiKoFp8UELAlHLmM2aqSaR40OM2a1E/BO4aarG8/KCjO91u12fyCNkM/9E/RV9FKfRSz26aXFy4hGpLmjlRPgRxHkUZk0Yhnv1Riw0hDcto9SgiL/fhj7aiTXgIKsYKbT2Zf9yhKGwsnwE3LvZ+Ob0vWpFtZ9B79zPJiO6/LP2CYakmfT0aWz/m+tN/m48L7Ypg56j2jqPTP66IWtSdgVQeuetopXZ9reUwKpeNOmLDogzIAdSBrLRczqSBrKVDKFJk7faor5ErgofNEskdzJMedyJOsrj+5ogNtySqhQTWp67Qxxsc9EJN0T7uyp6vgP/RL9x/P8tZ3YMbMsIPXTHXY90MgiDxIVTEnjNba2rCnD6cj0TPgeW0OIJhzxo9UG+iAbwyk3s7fFOIQKwWC27QCnzkRLpznJVAv7pR0gBJbn4asAadMSBsTCZwXVMlLTZzkdp1XZMxb4MX3KXupcePt6BmFxvyFRd+vdK39wckgNLLuOkmER9cDXI9MQ3PzeFcLvaKCWroz0WJlLb4DtulvqacqR5uvqLyWkZxuUQDg/prbjeKlOf10/W4C5N5UhnEP8yiaDYhBs6KrzbjMnouBrGq6SwTjsB7urXtXQ/A48QQ8mNsVnAt/QuYxTJ8yj2jB0BkOTvY4wMYFZaeIGpxXMS+U8upVCI5h8tcG6wHw56XB7knqO6IcNtIgKDYG/beRRlbVxvzEG/2jmBlR52LHsbiDpkdkjFhGrK5ck1qUx4xPiv5q32X3rbufFKFodmWF3n/rG92FAu68U+4t6dckypnFbDw/OUx3++L57deOH9rOYPvwT/ZHh8CV7XGJPLV/VA4E+1uixwinm13TRs0EuFfNldJHDrBuMjdTAA2r1T0BPrxY0+ubuEei7e7XyUfPlrGy//BoMVsHObB+wVyuLCwUa/XrtZqjFVnthCremQwtp8sfssfWU7vSGJNvYyb/7lc5B8OL1a3XH95ZiLDGpv1/PyIIw3T/pX1n+GRn+MUdoEQUPS/b/teGI+lp+37gqPXJNRPfbLZ6W89pO3RGbTZkhed4+jGKEwn49f9xWHssmnONkylUgLp2ByCJttnCU/dKu23exWsyx64pEi/Yc+sdtuXQvkohUTp+4MgBc//h/ceKVr6892AZbzGsgsxRszjvv7elbSWhtN6+jIAZrb4JoA1s5Cvv+8aianf63MRsLK6NuYjdeQ7DwViYMXCZ+YDqYz+phbIBKF84E/WejKHRUPXxqxCEVtV3ifVfEbRYIbPQ0+awY51p/ntFU6tg3a6/MRXgbOuCru6Umpu10YrvsX5sClswTiW4FapixiITRRe44YxFhWbNcBlW7j8P2DZupxBB7BBr7mAuLmKmgrYFvdy1FUDAztLqSTQ8k9J2IKQ2ojs8vOlZNvgI8wLTc9pgc+vwNh4xv2eLTGZgud1Ve0BgQGAzJY4S/7h5Oz1sym1Dg3nrOt75jNnx32KJzypwytdRBk1VzC5MQpVlb1ZH9mHb/gAJXFlAhU4JrwuOiMSLyVK6AbLZ3Ho5BVZUA9wV5o69BdIORcac8XqReHpaVaGK/c2kjMGxSEqSAFWgZ0cylVzaRUbIjmb7jqbsTh4vVBgHd1vEdSPyKC4g/Y7SWgLX0OlKnageeQDY1Oj/KgO7um5bRfZSMw5Qit7ILwfvp2U33O2ZJrpOGiZz0q1zC8SDF5zNsKNz+btR4TnqrbpM/dVjIIFEJ1hp+MZ0OpwebL0DKUxoi7/OWGQH2WAWmUjd7trLGlYTDXl6pRn330FLYQ71pU+Lzt6DTYZj+ZSwyMtCM+WI87pGgwcbUAGQ7rSZlbcSjrQBS82edH96yBuAov1Dy1l6Pv+KhnkxXN6Z8MD0x811uC9gR8Mewg6ihRynBoL6/HVO5r3vHCL7V81bfy/awFOncU+IvpZEb03dZlcg23IHk9ohN0Rs72wWq9/jcUCik9ySWVQUhOgMU0mFqETr+PsIGI6Mt/OsIMsPEpOt3BnCd676bCXWUbeXRrZcu1DFnH4ceiiqQ7mxqmluwgkd4qqNo1v++dkKcqWabGLMv0NRcqouaEcin2xbyfBhIzkslNyhwsfzlkJU9Px0oKh5vKEZsiFge8lYyUjtxDQgX6r0KJt+pZf4+gklR0BbX1ZxrZNu9vrnbrOi7wXBy7v1J4r8uznxTVjjvOq3fSjKioZ168oziqaGqTqoudAx7lI6HTam3Vy9kXollO4dfJDHDNyQcGE8PfHOnPjJRCYkJvfBOXCBctc/tjcwBxWEtfeoLoCcVopdz1RJlVI0BeOlXabuNAReYZhAQx8NVVzaMRnqmw635Lat7lXuL4e6gC1oDF0C9Z2346Zhkn/Lsaar2rZEoGFWz4QiJ8lWHs+t1pYJeM2E7t2DNQkmlUo8a0WP9igFnOKw61raroBG5j6ndMAOgDQCAVmiIDDW1nyIm0lq3o1JMY9za7VavSDjj0BVwZtGssDOzKLrcdE9TpnS8OTZI75+kQ+Q8wL6T6IMcg0keM9/9bJoGBU/cEEKDY69QooLFk+7xbcn4utpTHo88toRJMlcb7kcKwgd4yH2QsT9ghMR9C/e7XWPyxShqfSA7nBwP4EXtL5RlXkOAIhlvntMs73hwRfORuA+DR/yD15RteKUgNd33aIIrcp5frnM5EPGxrLRx+3vlnB49Cs6rPuk74dAFSFYfqJb32OWE8CLLTmJrZ/EjF4AyxwCWbrZ3WKC4wM1oMNZh04oppTiyb1jXw0hvO0Pty+wYLDCQ+Moxy4osknZ8vZB2X1gqE8sWboO1nbCnK+XwcOW++DBjZpVtWXUXO0/dWRYS8J0/vtiqPuUC6yceAECXLpR91GqpgC2e9smr8NDldbr7dNZDTVjsCgmHRK/c1t9PlsQ9VQ/wJVlBntrmMTpf0cyfCT4M4X/C9RPoLb7FvmG7PT1brxhj0TuC1J7SSsLmq6fv0vwiV4f1MlscoGDE5G0MUydEdUVVdOZcraPxLyMIGiBKBInOSjD8GW4DJq9BdUAXJCFWPV8YShZYY18l03FldX2mgw5I6ydYrQ1fs3p0UJjjqyQxAdbOyqqTejQgkX+ra8J14ZtXDCuYKXCRHIzycDdcU1HJhYUXWHPaIQpVJEbfkyapktt0RFfH165cD4f5F+63HmJr0inJY4hmaORL9mTxDPz6dkvE9/iPJeGvKeylkBdHbFDsGhD2XMhFox7eDSjXzNmn5lrz3xag5hbQKVnJah1o4nyXFy2797oyBVS/AAjLo+oRT7+AAjKZw8t69uIGEFlKKo5I+lMFIsMbfGNrFCvnvG2bkuz83dWc+l+a+812sI9fhyXuy6FoLeFQC0O8OVN5FGYx94KNcmnD5V1dnIyetZXn+EmsXUtME2SMrQ9bckjVLlng5Je4LLiyUiiLB2FGZGUOnlMkhVxowxLGZ1R8J0MIpPMmDOkobFcRXCpDCKTBoK2JbqRKIVVyzD72nMxShvIJxS1YeWaoiQJkPUhGByiQrZh+CjRsmCCFeed03IIc3mx11RLZm8SgeSrHr+hM5nHxmKhYGX1K/1i8D9CIHlUKEPG2XhDjp9CozHIw/uoEPOuKi1WSAn3Od57xVd8rs/K646JxKx7CASEJxPKlo7+yFBiFmuViyXAVCurO5X8ggDUx/eH0cSx+AFASY4H6LbT7p6ySPHnaal3ZMCXPLFTTD2VncVPZTOQ0MLaBUxInZSh5alE0MPcXK6fQd1Mgak+n+cUWa6lek+KUP8Iw/n1+mIFEWoNCn0878rPOPcN9zk8TPnfwUi8/MxMH86GNvjJieJgU32s9pmMYxz7ocqZc5H6mk6bckaytx0+RfhU80+JZUHh33pcarX5u/sDj3J+X9oKmmxkGytP7jD3ui98gsxfN4tnQC8OrRhgKgNUBqTKSSF9B0FU+6XtNWRudZz4+M90LCAOYOpEt5ZX3iHgz98A0UFe9GmgFc/nsxow7kBcmCfsR62qV3D+GANJbmSz2CiT5X1cLdIGLDq5X5VT6mDk1hZoPTRNf3/7qztL3PTbadQO/q786VwF/Lbg0pp7h6LH4TdLjaFLI5MZlgKtaplUIq46e2Y/9X2J74CBw+ZcPEyB9ji3ACxFH4PLx51chDGojURi7jWD9oLal1WREjmLypC8PzLnZ1W6XhUmAQe+ZXrdR2fJyAMhBMSxiT9Z3CdaDPxxlGarpeUt6jIC6UgCc2PAQ0T1f8snWuUt265BOLEWlAaymdsS5pMPgPc5fO3UQhuBTEXy0uOro+foEwFolOidhuro9Pg8hErOPbXwGvwtqDDcv9hiLnxT0DwMmjQj6asHIbegoX3cgKZqKDUqNtejTXEa8Pm44kYdzGLPx10NTcnq/bwdNJzFaXdvVv3pGsCxG/xkFak4ezgJisBxeAOJHJEEZQ+TilWE6gP0gxvWBK7S5e0hnSFJzjD96oQAyL5G8yTVh6ckLO2UHVCdSiYaz6oxqJxSHZB1QlRpIBQXMnMwN2cml51eXpY88+aJIPo97rCWg815/PX6O1b+httnJ7oNzRmxjoaoomIYUzFCIxnBNiVTrtu/vu0aX8J7sEmioCMj8l8BjY5KgkcIOr4T0bBN4jvkeu7wMqiUVhg6UaH/RxD0jg2fkt2VU5hpOB6I0Q7e9GTgjJI/ravSmip3FOSqD+/gNsxfWpNZPisola2IKO+ZUiq53BOlNYzkjxh0qbUWR1p1Qy4XK+np8RgX33tUUdi3ZkO9Hk6tPOII6BTvbB+GKfMpPd3WoZjMDj9bvrG5oWR0XzlOz6roSIgr3ZQWliz2ZC3snZdS8ntsgyeppDLdrVNIHC0iWKrUBDuRdJl+GUIhBG1AEXeFY/SlHDappL447/e/UBP2FtJZGD0Uw3kTMHa/WHgZ553uJ1AhRgUHpZBJTr7ESaKSqejCNpNsXFEh07QlRQcQ0qovyvvFkNq3TvsmaoKcnEmWs12/y1WvNWHfmHnxYtZ0/t0PHmrBZ58e/tkOIV8Qpsgn4JylHBXFLi/Enu/HUumXx1mML8abOuYs0Ba358cyU9u/TC9Qn4mF3g48VoVv5+LIp88RpAFBAGMvXNFy3T+/FtPsCRWG+pKDZvwd8fkApOzU5gd0mGMZR6C0KQWGcqercPrkqvLOmTmybxxFjqJvZDmdM8urpk8udJU7DXznhbPMgekC2vxOJRQ4L34HNycHfaHCUE9M8zVLC9V64859raUg6W4bpwCw4dlnMj+gHWgsmlTS40ohh/6f0Xxe8ub31w0fXtJbGLWlceK82lUxQYafSJmfPl1esLI5r+BIlTR+sLslvFrXZmEKYbU/R5mraj17snxxLGpPUeVGc88ebHbdtPNNrNFHMxGK9WRR7jx93J4e82w9sWGzqVdPh46nkT9ipBJBPgRmf/TBtgimgr+ZI1WMn6weW00vHv0g+3uHKPOiqxcjYfbOqN6oTbujdsN1l28nJvnSNSou1TL6Q7+GP2/7bd+utYsNObk5hkVP/KO3RJdGW6p+WZ/0CAHdr09bPiLo/H6S2PEE3wryZc1l8gofYfMUABW35lIKqYkKzRAsZ/DV/Lvt+sFYLpAktJZg+8HLiqlF2l6drDZTFW3RCQOOgNBWZU9Ma4ybVls0WiV9vThWZ+1j4qHncFSTka8xcVsUsppVEA4W839AdX6pSHtab/Uma5hCpva5Vr9FqewbN73MFcORt0jPxNEPRjlagvGJVQ7QCi9ITTmRzIWPwCglwLCtaUYjvXGTIBh5T3uZSW0myrVih59bPEY9bfTa0JjSXE63X2dc8TeMsCByHqWGwqUxXg9ZPEOv2QhdwPklXWny/UKuXRif1lm8sKksYHl9Qq/hRRXe4shwXX8rIrbSlG5Ld2GB4fgSd3tBoGzS2g2tXw5+CTr6EDo0TqH/dbsQmJ6DC5YnQyhNHznngqt8Okp1kIepOmZ8/lI0MTZjgc9R1Ycxvl4aIwRlMskPk6L9Valbq1L9+qm8j1TJQ9nB1GlFibHm1CS36ieesjw+V5vue5fnF+4CekOEQZECGqzXVemeOQDcurxrri5Y0Rrb4XdJNng3SMQpO/Y7shyVUyZ6a1PT8krtGB9L7qhMaQUlJwYXVyJb9vYTNsnETzLzTUzqlv6FSPmszVTffOKUvgoMQ8HJQ1QUJqUZOxBjRxoJRqlDgCEoyMLnIAJ1EMbuGd6dZgzZCSTMYy7aMT1+ZGb8jkUKAcxsn77hzkuRuRURsmvqYe7C97XdBpzdffhSAjk69TY0g/4JDEtPwYjvp/ZDnC5avo8T4OxbLqJvHgxwdw9nnp2b2T3XmUvdbfoIQFhgUlOWzR8ZDo5Usbim44vDBm/6CqAfmdteOz3CXAS+zyrobnxBBaz7MPrgACX4esEtU2Yps/R92lsLXiNG2v6Kqc5O5l0l7ppuTzE/LmMhd6FCP83jRq1QgSXp33tvQXNwxeGUzUO3ImwzG9+mlJxJxIqYXLADl2FDWRoxnr1snJDZAXaApmoTENiUq24AWvrFJs4u6fhMas7gZOhX1A/+DKEoVP70irza2NU1tVElBeC2tHfWxkFjsnzlaTmD+jPxsFfYeUXm1Gnfz99s8h/RRBS+M/iBFfNzMzq8ZMR6OMamga4aqeQeQZg6vc+SqeKkXh8AJkp/1d5QfpgWhOzzR3V/vmqyKP3QJXlAW4GtmrB9VnsyHbxrKZA1vmY0lVxM7X3Te+JibQjzNXddSV9tmgL6k7z2SBC11Y42CFa75u3ec5Ek6whzfOoYW096+mD4b1ejdnf3VZzau77v6J3+/sdrfM7cR9d4Kmlb9U3rU0TH5UIQb9wX87iNe3Z7ESRpPd4bJaA1pJeiMM+BKNwz5i7gM5RVxRT2daFD36e6tkGFLizVbEXYhxxs43OG8PTR0nasvXTUf/3UFDod+WOuxc2KCH1/IPSK/tEBmZdZk2c6aKFq9lq63lkVQHiyOIueFYUR2C77p74mPUCejK4tRC3X97XojH1S8TY8XQ2hkxR5G/P306r46jY6Rn1Ba7iWy/0RsQhlUGelRGZVBL16VfrPc0b2SsKYevb/VUQP+P7hQd/De+xR6lRQcoo2ABFEvSxZlwAeC5ixEepvceSWRViJDMaZdzYVXoX0oidUtWxWQCwsy0mhOxdzxi1lfIwztkf99ixum7XNtJCVM1Ghn4f9GYUfs96kkvmSgsfmIvOpj/SGZW0IEHWmJDClUicqtGNCQCHFjtHegqqpj7Z3uXRSQSEGUayfDeQyc281vEGJkIaaj86YEgv6oN6gdGVQ2gvxmJx44Ty6s3HwJrjC+FRbLbP2ZtcRzvHBo4O6mXkxWCkQNnypfTDmZ/47gM34JbU4tfgXBvUcdcfy9p10ShFTLkYcJbUVwEbrVIk8kHwtIJcMU6w0PXISfksBNzAncwsdg3kt6hYejNG9usCb1g6so/WNPq0DnEkxCmv0Yp9sOql3LgyRHMSQvrkEAgWxExNDCJlwBmygQhTg4NwCDgjNr5BuCw7Z5+aVDmLbszczdLECKKvxPW+/AFOHUkxtvb3rqRTg9VKIiziayrv0UDUm6Ld8GQG4Sy9cwOZHWMqVcqsPzvtdqw5ywq911HIpmDvPrWW4iFC+0HMuhFQXGoKOtjBhK2VPKOuryZ/2raDS4V+FjCt6YTpxPq6CILxCK2aFoZoNWBD+QJ/6VzvnBlgLGqpGaXlvGedz8Dlc+IHJ4kHjJInCD7KBDcXxeTeHD/hwMZ34HgIWt7136+Hm4cRdmokIJylKSZ+bOCnldx2QvLCHHQGh6qwuPDLvn1tBMplUZ3OwVgoBZpfI3p0KM8C0mXTcp0kQ8DrzwwNJj5FWPg85R6ZgQ6Xvm5Kyl9eT6csQMvqsTisEIAf4H2b5KAL/nSMRpIWDhNMNCGzX/2f6bfkQjdIYFdeR/X0BBUEZ26d6b/2nDucHpf0QnU6dlUPjVzxwOUcmUGCEWt+VBqbIz/nPySVqf6gowYtiDCKhtTW91RxOnz78EZjIY5q2YpPDpPbSicqwep6WMZo37UB79KoPIu5Innhj++W/5atsZmCoF4cfSy1hr4Q9Ctf3wZRM+V8nWlvBHJ05MWeXIdhXWJic43N61/xmdgfz6lX2hLb0RI/hjk3TL5ZnRSdr4lve4Ty4Y70dqZqecgiAnGLGj26ruLC1BWJgutmXmklNZCh+uoBkFIrV4mvfFCnuS3nvmnalfC8yBKpi9MdUxitCGIIpBBJexKsnhjGw22UWz6Y/2RDCG7HnKE2+UV7t2/EJ5am+rBmtabH5RiAs3FLj1P/nUMT5VRVHYt6W8N7lubo8KQnFTqdGk/D94fF66fz4iCj9Tyo2z/wtFYHDmorVES88cvUvSOhEuoY9NHwU4T7377I6o9/2+vsPRgW/rSDib+F4coP+74PB4Yo+UO7AfJi7yVbnh+AJee9QyRSyorOWJaddpFKL+m3ujESzyxrDZ2Vv3rxHK129Scjkff3ggn6AizBKIdMwcHen5ts72tpqa4tkL8QCq4BZ+hadtZElPChzpOTTpc3wHXTIDgpTg/S3SpltQPxCVsSGO4wO+86gdGz2cfkFcV17T8/EgvwRB8JzHjawUZvmblWR+6YMNQ9Br/D6QoiB4bfk7k4c+0fraVYk5ooFZXCbCmXRbdhqaM1u9tDJ3+6GT2M6b6TfTsQjdszeycpMtgD9z9VSVnFfexkNJRcwiY2N7q3ziQQXailwNKekrIcte/NHxg0BVoeGulFacgycY/gxOBHgGImzcTBxh6zXsfoQEFjMIRApEPctM+DMw7cj4JjpTfkbU2/FcHYVj88erhiXBMfypmNBieL7+O9BJ1OWRKAGOfoeLadgz5II/z0N2LMW95Sm1Od5lINi4X45HaFOL+ew+lm6lEirNlkoSUhQun3ZTCRuwy0FyxZTGSH4iCeR5iaQc+7jpt4YttVTyE8umykl0FC6JEv8doIhxW+qsHv92c64r9zHRFGd1/9iUJydvX08hSsVQ1HBR4dsfjX7VI3d4qrzt5S6tBLmARyjoWzDRrV4fFcPj/8vDcMxluRMgvKNYXJGWJyaoc3y9c1xPY5QLibk274YACX/fs2bnxl0G6owCk5z2CM4ZwrXqEBVdIb5jcYyLCQAs6B6ZO4UDj7C5pwWABv4eaby4sMJv+b+6jQA2jmyXalgEuYv+EzMHSBRKJibsiba4M8pEAfsi0gDXPSpvRy1QmkvO/Lx0zpY2Up2bC13QOzYXxpMm7ZYj+uLtZ22hjqYRZ7COb+CL1zO79Q2z6pGMaI+QEQ//ruMa5ke30e3sG08gZcIwhQEDO0vSBCNlEaI6t4jYbQBGknE4mln7yLav4iWm1Xr73nfPLFN6wor+U23jhXRyhftFtGZllVdwPUA8gd0sy5rmSukaH8JKPwAqrz5IZfLpg5/S76xGjyHzEw3oWdWHradfqyZkT1UL43MgB2YnJWWgitMFRYLYeF/oZneLwtDhN/10Zt86XBj/r/Xt2aNrJoKglk5mKkoFBSqT3JyIKI259WDzDYZbkyxfHaHRnC1HimsFpHZmpdbvwb6kfWOORy+x04gcmNpzPqqQiD9J2GVNttdEn4Kf/KtL0roedG0e8xv+66w8H/TTVUkU2t7KoqMtOWwOT2c2urb3GzLet1Qgcu2yooGM0U1YZZODukpkPZml4i5hGO6Jcz8kO6m75HdfIn1WqOYhvrjpa2zqFveiY9m3UPowgC+3kSa3pTvbddF7WZlPFspar4PFHWTaR5mhLbIm8WpZTKJCiZDvqrFCTLxhoiICx/xm9MKD4WnNTnN6Fg0W6ZtAlzrOFDnG3lMLF89diVPK1wyT2vq+ulYas+0TaJrHUfvvlCHNc33hRT6c0Gjzurq/1+YLkad5qkTSaBPDFfjf6Z/Ahq1t52ZfLDjkj4LADYmFvnJS654hXRnF8G5jNlYTu3Af6+t9kdvU4PcZrLIvXLzi+GtPcIZ8XeYvwP8rLd+cHkUv84AVl8K+FP5v7KaLEr2FMuOafplah3xX/V0GAlZUTXdMC3bcT1en1AsbDgOLh5+0vITEhGTkJKRU1BSUQujoaWjZxDOKIKJmYWVjZ2DUyQXNw8vnyjRYsTyL5ar9Wa72x+Op/Plers/nq/3B4RgBMVwgqRohuV4QZRkRdV0w7Rsx/X8IIziJM3yoqxqAIRgBMVwgqRohuV4QZRkRdV0w7Rsx/X8IIziJM3yoqzqpu36YZzmZd3247xu98fz9f58f39dbz4D/3/PkaDSxnGtF1+aUGDIhVTaOO7r/QWCiDHeih8XIjYEk4ZS6Zh0ocDQjc0AQy60ic0SCgy5kEqbONlgGJ4jFBhGN9Y4ro2Xn1cxpaIQNvhyChQKDLmQKjpDKDA0cUo+pZRSrlYlABQWDRERERcyqypEmWtjgCEXUmk39uAAZCIyr1DkQiodr+xgD54mYMiFVDqmfP3RgUpCadb6O0KhWEIe0QiptGvjlUbpoSML0+pQ5VSoUAgrxsKK54ZXfjHDQRvrdT8AAA==) 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 0959068d4d2..1c5ceaffd16 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 b7da2888781..e9ec64193a3 100644 --- a/data/Leipzig.xml +++ b/data/Leipzig.xml @@ -19,8 +19,6 @@ - - @@ -126,7 +124,7 @@ - + @@ -574,6 +572,7 @@ + @@ -585,6 +584,10 @@ + + + + @@ -633,9 +636,9 @@ - - - + + + @@ -675,8 +678,8 @@ - - + + @@ -732,4 +735,61 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/data/Leipzig/E0A2.xml b/data/Leipzig/E0A2.xml index 67327161079..423aa798e72 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 9c3f07e7b30..78b360e627a 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 548c2fe5807..e57b9d1e6ae 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 02e0ee11a1e..f93f6a5eb72 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 7d145d6daa3..0f97bc7c36f 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/E8F3.xml b/data/Leipzig/E8F3.xml new file mode 100644 index 00000000000..b2c86ff13b1 --- /dev/null +++ b/data/Leipzig/E8F3.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/data/Leipzig/E8F4.xml b/data/Leipzig/E8F4.xml new file mode 100644 index 00000000000..b18a3e2d7c4 --- /dev/null +++ b/data/Leipzig/E8F4.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/data/Leipzig/E8F5.xml b/data/Leipzig/E8F5.xml new file mode 100644 index 00000000000..ef53035d514 --- /dev/null +++ b/data/Leipzig/E8F5.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/data/Leipzig/E8F6.xml b/data/Leipzig/E8F6.xml new file mode 100644 index 00000000000..d6115c53666 --- /dev/null +++ b/data/Leipzig/E8F6.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/data/Leipzig/E8F7.xml b/data/Leipzig/E8F7.xml new file mode 100644 index 00000000000..4476af41227 --- /dev/null +++ b/data/Leipzig/E8F7.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/data/Leipzig/E8F8.xml b/data/Leipzig/E8F8.xml new file mode 100644 index 00000000000..dd25ac4801a --- /dev/null +++ b/data/Leipzig/E8F8.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/data/Leipzig/EB90.xml b/data/Leipzig/EB90.xml new file mode 100644 index 00000000000..1173905057b --- /dev/null +++ b/data/Leipzig/EB90.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/data/Leipzig/EB91.xml b/data/Leipzig/EB91.xml new file mode 100644 index 00000000000..e45b7c6b9c3 --- /dev/null +++ b/data/Leipzig/EB91.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/data/Leipzig/EB92.xml b/data/Leipzig/EB92.xml new file mode 100644 index 00000000000..d9a2835d90b --- /dev/null +++ b/data/Leipzig/EB92.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/data/Leipzig/EB93.xml b/data/Leipzig/EB93.xml new file mode 100644 index 00000000000..6e46d2cb72c --- /dev/null +++ b/data/Leipzig/EB93.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/data/Leipzig/EB94.xml b/data/Leipzig/EB94.xml new file mode 100644 index 00000000000..d1e123e037e --- /dev/null +++ b/data/Leipzig/EB94.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/data/Leipzig/EB95.xml b/data/Leipzig/EB95.xml new file mode 100644 index 00000000000..2024e44a925 --- /dev/null +++ b/data/Leipzig/EB95.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/data/Leipzig/EB96.xml b/data/Leipzig/EB96.xml new file mode 100644 index 00000000000..72ba6837aaa --- /dev/null +++ b/data/Leipzig/EB96.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/data/Leipzig/EB97.xml b/data/Leipzig/EB97.xml new file mode 100644 index 00000000000..432903ca543 --- /dev/null +++ b/data/Leipzig/EB97.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/data/Leipzig/EB98.xml b/data/Leipzig/EB98.xml new file mode 100644 index 00000000000..fb797416863 --- /dev/null +++ b/data/Leipzig/EB98.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/data/Leipzig/EB99.xml b/data/Leipzig/EB99.xml new file mode 100644 index 00000000000..0326201f090 --- /dev/null +++ b/data/Leipzig/EB99.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/data/Leipzig/EB9A.xml b/data/Leipzig/EB9A.xml new file mode 100644 index 00000000000..7b228994f43 --- /dev/null +++ b/data/Leipzig/EB9A.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/data/Leipzig/EB9B.xml b/data/Leipzig/EB9B.xml new file mode 100644 index 00000000000..0f9eface4e1 --- /dev/null +++ b/data/Leipzig/EB9B.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/data/Leipzig/EB9C.xml b/data/Leipzig/EB9C.xml new file mode 100644 index 00000000000..2f68eec488c --- /dev/null +++ b/data/Leipzig/EB9C.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/data/Leipzig/EB9D.xml b/data/Leipzig/EB9D.xml new file mode 100644 index 00000000000..83f738a6d39 --- /dev/null +++ b/data/Leipzig/EB9D.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/data/Leipzig/EB9E.xml b/data/Leipzig/EB9E.xml new file mode 100644 index 00000000000..8c6b480628d --- /dev/null +++ b/data/Leipzig/EB9E.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/data/Leipzig/EBA6.xml b/data/Leipzig/EBA6.xml new file mode 100644 index 00000000000..0c45cc9dca9 --- /dev/null +++ b/data/Leipzig/EBA6.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/data/Leipzig/EBCD.xml b/data/Leipzig/EBCD.xml new file mode 100644 index 00000000000..8619d5df01b --- /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 00000000000..22b56ab04c4 --- /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 00000000000..13a879ef7a4 --- /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 00000000000..0ef02b3e40f --- /dev/null +++ b/data/Leipzig/EBD0.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/data/Leipzig/EC00.xml b/data/Leipzig/EC00.xml new file mode 100644 index 00000000000..c98f4d71580 --- /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 00000000000..406683f9ef8 --- /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 00000000000..cb7f22b59b4 --- /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 00000000000..e3f81b193c0 --- /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 00000000000..2bf75daed5a --- /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 00000000000..0aae8da5fc3 --- /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 00000000000..df4d22323f6 --- /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 00000000000..ffdda2cdacb --- /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 00000000000..99779d4369e --- /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 00000000000..b47540fe726 --- /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 00000000000..3680b324109 --- /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 00000000000..a0d10d6439c --- /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 00000000000..d1e6790e8a0 --- /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 00000000000..5c077ac7ad9 --- /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 00000000000..53811698dac --- /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 00000000000..1c1dcf5e97d --- /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 00000000000..02af1174b61 --- /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 00000000000..bc5814db0cb --- /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 00000000000..9d8c6c6a3c0 --- /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 00000000000..f59175aa28f --- /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 00000000000..cba2e57968e --- /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 00000000000..dca19cc51b9 --- /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 00000000000..073eccd85cc --- /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 00000000000..f89f7a998e3 --- /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 00000000000..d7428ecaedb --- /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 00000000000..3b6d3600fd2 --- /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 00000000000..dee64afc577 --- /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 00000000000..bb2b267c14f --- /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 00000000000..d8f413b783a --- /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 00000000000..c4fccdccb97 --- /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 00000000000..89c23ffbd91 --- /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 00000000000..211ee845188 --- /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 00000000000..af1e73cf499 --- /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 00000000000..30280b9d2c9 --- /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 00000000000..b7f672a8187 --- /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 00000000000..62e9c675b68 --- /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 2dd941e43be..40e9872f460 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 304056a71f8..baf620bb453 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 c58eecbf991..cd5a3b94993 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 5e6cfc1651a..ef27b1609d5 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 9c88c72214e..8f7e4409f85 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 7c517dadd2d..6ca1f44c1a1 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 1883aafe004..66838bfd18c 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 a9b1a5a7a26..9df121ca21f 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 1395f7ff230..e5a844faae9 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/data/Leland.css b/data/Leland.css index b655ef583a6..35db26c5b3a 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 4a9640ec91d..f0a19c22553 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,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) format('woff2'); + src: url(data:application/font-woff2;charset=utf-8;base64,d09GMgABAAAAASQQAA0AAAACdfAAASO0AAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP0ZGVE0cGh4GVgCOdBEIComMWIb4UwuQJAABNgIkA5AgBCAFgw8HqFpb4eJxovD2txYo3QkVLZRa3ZEFcvNouW1AolvM3K1UGcjtQKRI4ofL/v//nKRjDGHmACRLe/8xKTR3FcKUUWdyDhUhIUXlbsjMrkvHQHeGWuI77KkqDuElM+pWz9Cl8nEZIcuTqsSfys/IVI8utmy/9xrq7Xec8OzxBVNN5N1lx2zPtg8bTMy2EK5XNnAw5xZX3x9favtDc2hC5PinyUPC6QThBGaQZshxaPKQWy2SsqGxhZpmiIQMugupDKyDdm/LwNhlUCJajFjnjPcn/tR3939QpxyUApy61ODEthOYzkyzFGCG59fm+3n/+v+r4K6JuqDiiiPyiBQkUkWJtAFFFAsVMRNdiDa6zYo5q6cLVy7URTtwOushRHv39Q8lGHDYyNwakZIZqRLzzRQRbbDOOoP/5znZ/dvOGVkUYaIFGjBFwfO/V9f73vzuaX63WQIJtEGLCGmzhNiQIZ97L3yHmIrOVemi9Lhz70ogh8p52LaxzSbawijkOsYTspyYVjqfncRtMoW4gNMS+oQ+VnROeg/GFdCFmsogpNM4yH1Fh6fp/Ht6nrvLRZuk8YqRilEkSVOTVAyrUYq3WIHBKOITZIwB22AwYcywwURhxgzY/uT/GVMBtj+xxW3kTK7kpHLMd0Ft0tb/0JMku8nG12712flzvS8iWjF02lFU0EFFRVHRUv+g17FhrDB+fPpjTfuq2mV7jk78CaeHCBx7gQf2cpWuquuTngoMiVVsCNuOndgdoE6zqrQIIQD/r8veu4UNnfkpHX0CAyvdIh5ETvCnftpnxZbslF4BsbXz/6nz//e+r++9+NtlipqtkUbFjeBSMYGeECAnUxBcEgyH27l5pTn8yL/27xQVFzCyJbnSAnbHwEmFPuW18tvsS/WVT1R199VhSElOqehcVKloKNIplp7eHXfc7WsvaHB/AAbg4BRIOpUKqQWBGZf+v7XKk9XT23uEYTaCWTgSevv/qu6rqgY66jnsCfYkrHb3aIgPSe3zIU3gwjpGxPse1zIvKjIyMjY2ETrw9L/2aucGZ8K8LoBGR5qF0OzflxKwBFStRFeXU2OAXY2rj6v8rrpW1uoI7TvP/v6t1Pt/YptL+BDT5lA+jMF4A+gGxrkKTtTdfDrr2s4ijPZLWYg7SwxVJS7OCUxpaSWyzf9/KzXTalLyAb1SXulMx5HG3oNsTTJHSdV9v7qr3/sFVL9fTTV+NTjNX00JKEAcogqUhtVNz7LRO72sWzah2A15ASQvkCNNZgeZHSROnTkM93wNnTl0kDkPzfPpovnrf+dGVp4wnlyZhGyoIRS3kmVs9H+TBZjsogyYCr7on3kMZw6o/DudVZQYJYTAhVwIlbn8b8dw5rpVNu9M/70WgSCBwCGa7I8xq7r/77mdjTf7IU+I253VFgUFhVxUwf/7zZcdWfTn+9xa8rK1gZEoPueaDb1o38CHVIw25Ihocnv5NKHmkd5FAIBS+PsafXN3BefbNAIhF24UGY5XtyQwDRCQPwQAoZvkKEDH9d8pgEaWIk66S9PzJr8eMZj7Tq4fq0gwf3wgv6gzyf923y+dMZt4Zi3fWkhNlmi0gqS6/+dAJnMUMABSGlM4JMeB480J4iRzdsJROAUX4Ab85cy0RVsnV4GYSSY3i1vBbHhhvFbeZ14/b6I9ta/ts9tT2mt6dntnh9QQOSR0+HfVz2uWup6jy4WteruxPRwjEL22dSclPCb+d1X6KwCMSRyASY4rJ5ATzsngHNT4y1+DH5zxNm97z2USP2LjhnJLmTkvlHeQveVxeCPt1pM+qz26vaK/2Ld3MAbTzUrXrlIl66pTW+l28OMB25bBo7ubqwfgCxz/8AXHn1v1Ve8DFcgf0wXizZHIaHwA/rvUdazMtlRFn54qV60ddjlvhPxLTZgZiUSRxGwYlr2v3MIqVh1/hDa/P9n8lycGCghMyABCBRCel9wQEHsuvM/xrutRSVEAknmZrvoA3QkA0F1nkVgilckVSlWGjBgzYcrMamustc565jZg4RdbsPTpVqzZsGXHnsPWa46cONfp1/TFV99898NPv/z2x1//cLTh+o+nXYdOXbr18OXy+AKxRCqTK5QqtUar7NvE+9s7dM11N9wEcOsuHLe5w13ucZ8HPOTR5x9vxKgx4yZMKlkPU6bNmG2LrbbZboeddtltj732adKsxX4HdnF188hjTzz1zHMvsLV66dWTjfKgQw474qhj+3jjrXdRgQZ0EABBEAJhEEGFHomCGDCIkyBJijQZiyy2xFLLLLfCSqswyZIjT4EiJcpUqFKjDgDguBNOOuW0M84657wLLgIAuOSyK66u1mgNjYxNTM3MLSytrG0s3hhupEGTFm06dDfZYGFpZW1ja2fv4Ojk7BKAH38BAgUJFiJUmHARIkWJFiNWnHgJEiVJliJVmnQZMmXJxtbqJReu3Ljz4MmLNx++u5qxngp8UGgMFocnEElkCpVGZzBZbA6XxxcI06PPYDd88NEnnxV7eUNUfbIcBkf0xFM8PJv+Vs+92Jx5C/gYMMIYE5jEFEyFHLny5CtQqEixEqXKlKtQqUq1GrXq1GvQaKNNfvkNAOCPv/6tV59+AwYNGe61N94Kb97zQT4afOIzX/wr8I3v/2t+4GjD9R9Puw6dunTr0atPvwGDhgwbMWrMuAmTpkybMWvOvAV8BAghfD0IxaCZLA5OLjYv3tw8LBTDCZKi2Rwuj68gEIrEEsEACMEIiuEkpTcYTWbaYrXZHU5XuT2Ml4XC4AgkCo2JD4cnEElkCpVGZzBZ7ADrg052xGq0lnb884jv539Wb/WyVuvR+unPjX9bgfpVz05PJGOSeskduKpYv3hBqXklfDgy9Qfliq1KR4FM7rjVFOXsTHtaa+WaOCRQTVUTVINyUNRfxiisWFZXg7bgmJpq90RZd2SSyqUG2GYqZNDIYTZ4R84brfsmZ6MekZmY0JrGyvlMXYZlpqfNOYJuitVQu9WWw2atK31hKKlQXHvSOxJPGbk6gKvRcH2r2Y6tFHHChiNFdJlwmsZjHnGQJk5QkqELx9YkDfmn0lMqYAVMNKSXZwTLuveABREfGYMHPXxzf2qPFV7trrN3FVaFRTJJLoLlpEim7uqpuRfBwQ90UK1onaZxzHkhKpdLSpXqStYLShWK1WqRkCTxvJrv13XAtVUwPBWmMWMJq3I/AwlfAhTjvw+hDts16GFDzYT+IBIvAElmWcGLJeLb5V35VCmZ/Jb8ZdIJKfc4srFNSoPuNKiUP0nptPTrrmq+LdStHbBZOiuAEnIJVwwkv01pOSHlYiAxC38ckawxsmz5vmXL56/aMjOb7Vo5uqjRePgrVZZtqW++QCE4M//DllB/Cwe7z/x/yIKbu3if/+WrL8VUTa5srJi3YvY8tuJhBmMr5jRWzMxrsE+LGstGl402iKiOrJjdO2f13r3rDDOhg9lcU1dvaqKIhzmwwECtZJAezPeO1mo9pJ1NQzJD4BKCzSUmNvZmDZjbkYNGdqcBcI7tozkMjDMI5nLmGTOXy6GTMJ+H3wNwAoDvc/k8HCMLyQaymHwEb4ROVTXSJhHWVKtVtIt8QFerfKhNJdqPw9QLkpITx4LNd7iKWWlsUq0RYj0y6D7LwtFRSoDBfqCE88cOlibxtOpknRVCSRfbPWsJazA2uxA2p0iBVTebxeoqhg2vE2m5PG9R7/w5s2dcjxbC2FBOENjjwmIKO0qpVTDjMp+70vPVSpOahGJhpkPPC/0GYp5tuf4Kwq3LbuiJgt7OuOZGEFEWaW6nbsG1bXUKA0gIswS1HcticVqfXjWYXVR3KnXLr1tzVxldKGsAkt8mpOysdtlz+k18cL2F1hC0FnN03BJ8DpIkz49Tooy92EIM33MTSvaYmBgEGccsS2DGoOWQC8apzLU1mzMza9ncFnOoTYpWKuy0GjKJK1G1o6nUViyHo7mMot2jC+fPFFVXSmiTbJ+Nu4gjnIHYT4tTY+WKu9c8mVNY60frzMhmcSmroW1kDOgJ39K2q7UKY2Uj3GKniGIbtSSYtjSRSBBaWT5ZqC3D5WWTBTw0oBI3qeTqGm11bZQmDNdWNE/yDWd3cKAWVDIr0XeO7bCo0O6gohiBue8yDMJcJgcBWbvuyeSHs25/dnXNhvefbj949kHtqYsPS68u72ZRdHwWZdWaRuIg1YugaZAteeO7zFYuPmUxASb0pR9FzrrONReubT7+kJetTZO0T8wJiiXSIJfAwGZMr80Bi2qWZVb6qHV5CsE/HRZ4zT31EimVCJn7ho0mBoIyIo4sr12xe0GnqrVq1s1m74vwrBk7lO7stqZaCbD+8gl4iUW2ErbmHleOFkLb/bYQnlbKdSLlSK2apkiqZ/Fp86y7hlxMMEDgEDRyRaaCny1FxwSKGN5ijhnplnD2ktCA2sXETBfSCjWDq/P3rAPrMG60rKBW1bZtEAHTIGlW/T2Pse5GOUBLSMu0EMa0QOyvkYi8W2COwzyIEErRAESISgXuIEw/hFBdEAGauUW7TDk4rlHH8QD3wAstywKB5/GKZW6p+XLt/IpNTqKC7A8BVhpceQpCBM5Zom/SFprc2j8JKMu0wmlVxWd13pdphHKzwrnYBpcGLdHwMqFt/c2rM8RWKQdEpLLfTRKkRO5N1B2FL1qp0f2tQkEIAUS22/opGQFA2WdTXv2ssZVCBDJ9s76i4BjHqdwQlQoM9lu2+4UsbM77fOisIjHaQpu6AhDlEQsSh+o6RMQmeIoFIbjmuJgE9i10O7cUBJxuQW2DiNmqBB5/uYdOIcFQRawiBwhAdJtMA3V5FrlSg3f3saZ4z5o95KEXkl1cNbBtwXpC9LYfJZEmnZc6cHaESBQldKfgtXbidvNnOkK4fd+lAXRPnqA1iHWkiKpOhn3IvtrWOfhfpXZZCBrdqtvl4+3y/xkAglSURjTZ+HWhY3j1ofIG7hGnsm5vZtxOzSPmiHJahYuji2xU++I+4yJHrHaxxEAa+GyNym7DE0Ii5ightbGCaQLARHT3tNHO0S50jA5siPuiwJXLU3Wcg033RehzONvyJgmuJ4wUxPgY6/RhnRtbJw1XhMbENC7CLQVWn4MEquBe0K0IKYH7ffdirGWxA2YknTckMJOK0i1VJlO4hXnYaJsrV7vawglu922iWVe3tAoPGlFJ0z7bBh+/64tDLoJeAQ739xMKOhgoGZKVQbfylH2PqEI+lly+Z2KZFZmikKXkpQXH+xxVZ8GmfMGsWDOgAxJCcGh7EDVipgXzOLo2tvoMq17shIQoCtFZRAHRQ6zp6ZLYoHvzs/PMCyQbVdo51mirKGcvAtNWqcBiHgT3wzjOuVVe9dS9N3OPur7Yl2WTJDjEbBgCog634l2PXOBq+XXvfsh9zqMWOgfUMFnp25KgIE5dmNSqim2AD0gEGShUKHUgAohkN++gKuVZFIvAgYiABfwQmQhyLyUeAQUQHW7CM8Eqr3BZTtE1Ti2jQ190QemHwrpgdmCjQPLgfsjLKe342RfzkLeKvk10sAKUiOk6aTbK0TgM131qwq/5BzpsBc8RmdCW3F+GSHQ0UJQeLULIe7mYe+iwTN3nCibNeFE2V5j3UkXcLgCEbftbLPqD+MhUa/dldhiQTKtYuUnGakz9f8rzVqQpIpCy2cX/hirWeRSk12+lOKln44Hfw3+kIeDsvofUrtKFM+kwNEXrhOFgAX/dl8naLjRicN6IRPn35p/s+Rk3K4Mhi6CgbHFlqa6Jo47TsVCjRbkrftedbom8Sf6YBoGaziSxxNFd5qBhVuc+vFZyY0NrJiQ7moYO2zPAMyDOz8i5SH8SDpUstpZYLFfc7hpR1nL+ztRNhQDlDhoszRhz+EUQ7hSPn01xYyl1/N7titQIWItoMI2nnL/CDDH5NC0mc6Wcsea+ngr9lGM69eDyQN4BfmTcHw3ILG72TJPMMf6sS3qkbrHBE6NsFm5KPaWnCszAGHUUxNu1gmZYw86zHhKj0KZx3cYj0e80maXnChpCRCj7a9c5PgoQ+zXkod8DI0LUgAATcHfx8S1iPRdmn+YsDnmgdClRrg3Z5eCRTzlSTgtLVZOJgHCZgHi83HkWNuvpp+QKPCLL9JRbcBeerwhAgF/u6Ow0y9kPLP0RX1Pq2Mdzio77gPqdm/YPGM2OnTcgkRXLxgs+KTD2jD1ZxNXrfcKyx5frPTJxZ+O2CNytP2i0rQJpiqUWST1LyKbA+oz7iJcBtdaOOg/DvV9BVJTL7pTyH4BfxnZ0qyIjy+D9Fc+i5Pm/EpUK8xxF4w6qJPJVynnLSH6dvkgLAiWLyHL2/ZyPb2c6WiRT7xIZclUM1TwMz+bmXOsMZgJkkuyPOd8LmOt7tW8aQfRiBrhSc7i4XvtzBsoi/SzXdNCdx1GwSI/ArfPblirD2lzo6cZdmgZuF9ywabL5W/Adx/fIfuW9DqYeUQVP3x51XUS8Wfe4QuFmxdZe/lG/7m8J2sDcvEYX7EQSLjq8zedh/BuGMeUij0pFvX69vbgOBHQJjEzFjtaKhClMuI/tak/rjgG18IbzczhdGVEjxJogVcOgVXC7PlF/bKnfl1/kGZYRH1a5LB0hEomsit6mfHwFz6giaT+kd+04wStUKlvpKcRFYW0iBgMMDrdpSFDPhdeY5FnxwfGyK5+JXaj+rnHbybgX75rjUBbwPC3u6PDEfpzfQCTw2j5E6AbGgfeWKhSCxvTsOwAaQIE7RroQn2nFn9OwPmV+syO99LX8uxQkgLo9ofniPSOCZacPEbvhsLau8TqvI+sEMf8dPAnOvB1nSxVJTECcXbWw8jzpn4ssERXozh2TurwOgfzQKz2NTE9363ZH9sM4ZV3HdPPKesnfCebR5YLZWeK4HTrd+YSTyhKAxlj1zH8KmUl+qP+moxiNCazyuI8/TF4wP/mcHsHpqE9T+kv0hhNEv3nXePeN67INlDcEok/iCJFL+fCoTAIY4C1ufRaz+92cQO73hKKxcwCEAzw2YIqg6MrDZbubU7PedZRacPg65SAJ7VnUYuCg62EQYPU0qz5M/vMgsnWGfJF24pb2L3NrfwjzEagnKtGLcmYNy9yxeR9/ZaP/l/XNSb40K9T1rTe6cV9myuIzfH0+2u3MegdtRXpyEDoPba8F4V08kbFWB2cFQliHy3cq2YM4YuQsRIhZNtyYCqPcj7YBmo68ucZBs0ldrALe9RRQp1Ci2Rpk4E5poHFM59hIHWCrLhxoRHl1SwqDS/wvJVuAZ0yP7X8/DiFyWvFvOqZvFLQV9WpSYdAmTC488CesalWxpRdK/vcG+74RlCPmtS6E30wwKsOYw03ze0ykDw3xhDTvsCCu2cyuuTNERcHCoPY1Hf7ZLILTXRArtUBaH8gIedueJ+gZ8YDfZL3lxfq6VCcj/TCEMDqF2HmO3PwUe/PlfxCx5R9hEWwcgLOJjE/qUe8ZAcGafcScYLl6IuaxkZZxbRx1zmP9mHQqfsBV+0Z2utglwNLd1A0nleRBvBxqcRJNw5lGtUJMo07yRxk4/7kP6/UpWtgFt8EugZVSvi3a1ahkI9/8nh519E8wsDbk8AzdS644sh9n2t02BJLi+uSIgF28Pzz91j6iIZYcSRMIl7LjdnN5ZIwJKyfPHhIAaHHG+QQxLRzkxkm7phEELp/cBg36pRpzOIYys0WUQ55Sm7xcuaHAucuoNwfPx8XqneIQoAm3vfSSv76c3xHegZqVBO1dPAmBOy0CyH6AEmnV5FSPv4I0DzSPW0k5Dus7yK/bja7IuHukGM/uaH2/R7W0gWHdQXbbHyfXg6T4bhSFpnWIHtZU//vW7rX+MPbvtGBYY51pUWuR6eqb0BnLzEUtVgUNsOm89hu36Paw/rZfG8fYb74MayjJMSMWFOo79YLaChg+FbloY4HHaEXSD2Psn4mNsg3U4LycoQpsEWVJeE+v/H1MQOjouPuEx2GoIkR9inmHK+iZVj7Q7ycVzY5ZFcS2rtjGed2MMNLy2c5Vxt57lOyG0gPs3YBfWEfv9Hi0dITvA4u6n2JSOSMPRp375+bVdiM+bmcdtw/9dr5a9u98v2xpT/IWFfXkFVGCfEDA3DUa/rh3/PsIHRZjlpv5BPdnsws5ZYeL5SG8oIigSI8BngZXnLqI5WcuYExmj5ygrOyXIpaj6b3RnTOT0Wu5HK4r1ywCpTIYQNH0YBlAOOhlBrkko8cqMrIqAwRRC7g9exaXK2Qec4LVMnWh5xvIKjdc/1FycJWR5DkKvEJ0kCFpgKkbux3dCAAeGvHsbDWQGYvNKizQcNcHv6lIZ4CdbtCY0XbP4/yaj1rYFi0J/cpBHScsdkzCIcwjXiYS+68Zi1jJLwl2ewo8SBHM1lr1BXeYO4Sh3fXR0NRwTIjrt4OQN/Eyi7PaML0O8PI53wv2CntB/qDIrrwNiBYvoDqREULyWMnfeKExzBaNdca7TkumTQSw2nAeACnIecbrD7NbTpRneRHL7IW/ZjEv+OdFTG69sPOjlDWBnFdKTWRt/uU9hKOgy5vFS/dUwxJWsHgnwk2c+qCxrQ08gYM+ab03JHccbnwfPnuIQo3UgLZ9yvUXv2kE5bFYe70R4/Ou9rW24fSh39ZLL70jK0N66uBav+L5bQPAv2GSF0j/xF7QumXGQ3j0osZ220v8DlGg5p8Qo40xbcCphQV6MPAW5R54llVsqVm7gy67vzE7kCOZvlw7TI0EWzV3A60QN885MtG7kxQfCDEkaAFyQlAkAzw8x72CeR1qd6dfL9oLCoG8RgmDj5MgfwgJGnfCxVZMYCgrL6L1wGiaBNabSVFbYf9fsN6SdUnjJuMOzuFhA7NQg5h7pDGUgB1vfekJANC+M1JYVkMQBZG6YjWI/lJJI0cUARa2LbablNBKj16IDHMD/LQYt+EWILJaMYrCf97wpi1yMm6w2CEy1BZdAzhZjJ9y1dGKTyBcP7yYY02NjBlpGWj6U28lvwzSLAl4xPOWX3be1p1+qn7TNWFcgM9hNKrbsZkQBg9zJ6x+38xDTg0P9skZtxS8mHmZ90H18fp8TTTkumurQOC7PdjcimnFZRvWbfioJ61/SNcBBIGxKRWaL9aNrIveaLOFFqi+hsybnbUHuosIgBN3C7rjkYCyrNix9bWfRQLZm8DrgsnShzld8eZEBUZSLoHExNvl9rkFpS7YG7jN0SzNnN0eUUmgb+iICxgmsMJVTPd3G1wVRbh/QaRbKwHiXIHux9DqhZGHBX9+evo0oJ9jIVadumtbowTEze7mSqreKIbx4NIQ3+Ev5p08dVJ2Tk6qE076FQbmoH9cgdEoX4HLTqvr55iluCZznFJltsiAxrisVn275nVYuRqXJQgjCdFj3yoKpGjbjYey7YpW78EiMQaPYp0gtt+I5XRsq9+1McdpiPDCGRCB9q+EgJVudRYA0yoi+2gI3mJyk/7wMU3xuZfy+JLnlEecF+KDPYxbDzEttha3nD12ko5dQDN+JRVijY1yI6LntiTub1s6kPqph7e1eLw9scZ8eUChvtXhG37DxauR4PUhssP4293EKfz6xFYMdVVR55WXmSIKZ/W3sW2bzcUpWEGpDI/6YD2P2+5yXZ/i8RH7Y6VQLnJiaZL/RBt5EOot+4O0w1+eDzQ1ejNi+nCQiASz9/CFfOivV9fdfb6UEZHFoPCwkHEmwBxeUsTTddWGP2lLPGFld4fVqW1OKSCV/+4kqrdMu/dPV/Nuz7elHk4x35xan1JeO+4FudGUpeFqQGnQ4IjUuK1GJNOjPljO8lW7WVZH3SNefIi505I3qcB7AsQk+MllXrUftzvZZd0R3qRmIt8dBAgrM73EsLVogTCskUzmnuX56o8ZBkUdGvIedA0yQLlrpbVVAERAhO5mPaCk2ZRHbjR4qlu4Dtn7MQ9QlXVcLzK6K2s/Ozuehoz/GBjnqst8PprjLptmC7WVN4kaOItHlzweMeKxXl7e5+tAehltSnGHn30xSWCnAao596dp522iVriNAlx9Fz7r5TF/e8gUVkb8Sbd4txc0zuMQUl4ksg1WyAzrsoxxSNpYoHVlcOTM4aCug2ZxJmcLt6pdbrS4BhIa9+f+/jvuemhGpsH3Nq4fJAooRdevRjRFaA/P7wC5Kaix3NeI8W4rIZ5ADjOHU9P2jxwQZgWGDU4BCQm9HPXog9VMPDp4URLFj/3iA7rkCRRia582+/a3XdqRrxEdF8rsgg1WhSeEuaZ6nftcjyKQ6vSm0UJKmbgO9NCymNtfzst/y/eFZXfN60nm5ag7ghC13p4Ku22HLHpFWqPn6UzWcL89g0atRtCtYsOLm4LisZMjgcmNeG6jjHiMkPa0niuAeXRnzygEQsrT4zO2QRU5ZX3p5egHMwh5nM+Zf31ZEZk5jt3S8Tq0fe5iNfWVTWAyh/BQ+BSGXwRQvnKS/k4jP70DrF/iM14nRxTq/qnmtK36cWHzyni7mG9zOl6pMm7I8Xzlc/JvToBrhLL8+aG4CUhAyQKcBfqQlr7HqzSFrJc+cGezC6ZLqg3CseGFXhsyQ7rZsGorrV75hS9NsAXeChw0mF5dKJGgLf69ubx2rxY8qT0hNokaf/3xXDhtA9v7GwRSdM1Vl4ONKQIfu58qKsjzUbgCoVSMcebThv/+heAYmnjpP7cJ82TXbMFrRWN1wxzWa6tqyJ1jPGp7aUNRJxPFz9eR503swg5hpNc1As8yXcZn/B5vb9g+qe/86jqv990bh9A1agiL6cnJxX2nCasrpQQi+R1M8p6YKKQvj7fCL+mzELfrCKFcEv3ed+n9XdEyn9jHVS0Te0NGouK6LKAb3mdkBjxWn9EUeZGM8ziKYV9oLEsIwBxPjT6EeimJpnBWt7/HCdbZ62XioRAamUmYknL/B1n67KwUsBD7IRx77J/CYT4DJVY1qvk1HL/XjvI6DCHYFsttcQ4HKpOppJge+vZyJ534o/21lH2HsWnEdhmNRbfufpccQOsCtO6oZ+dWgisz2CFwSkOSnuCGQxQtxENYwP1lNbBIzNXAe6JHuQcxlUHknrrdfy/i5MD3+rpHrCUgfEzAjBMyVFp3tpu79zVge0N+3A/vh3L94Y1aepyPP11wVc+xpkIxz/PMUnSjS3lov9O/FfF9kx6Aoh6n6T3iDp5stxzli0YgJfBYeZJVFVZtIOL0qfhMl2bwyxMKVx15jPOwhKiIA44kN2z7O+SxKxsfIaDd22QCAbwxh8fyHsSW1FxoThGfmlWjSvfjyF9HAh9fR/ygFhHEdts345d93WQ/lOncWHmLAhqANm3xGere3lD0sXnMk0ZjDgIcb5E74CsKptBSD88VnGJk3/nguA/7U0Ruba+uXuh1tRzOc5bhdet5G9BB2cujem/P37zO4LWC63x5EUfsI256OM8PqEQuPs92rTnHd1ca8P1M3DSYkWmCbUksRMoHOwXjLgSCzEhxvDgStk+e33FfncfKU4GyQtHv83eIu5fxVQeWa4hKcN3n0j6+hJA6X1B+j1Di33ZkH8dZDHsHBYpEanxwNhUEw/Xqsoo8v0OCEEJDZdggHppm20Nk8umcluNOTdnA3yvsyVzKBrfqutlKrhsqBLY2vD7l7M7Z2d8DF5mk4KJxwHNzXVvg9Gcc3AHaPXdCrcdFyyZeJvS8k1AC5RjWecyrDHxD0aT3tvlYzeOtl7nMvVYCBrEQPFRKcPPA4Kz6y6pfardsGtjWiTfIRO+6kOG6vRVHhkYXKEZq0rLRHIgOt9VRracBAH+KXz5PeDkf2ht+DaVufYCchY9DmVunSN4nxVoH0VzF+oRD/o9AesKS6rkdcbCq1ooubvN7Dpdf/kk3qO7bDsKb+N7yxkQGv4ivTjcIvbYrgfhOFIhsbCj6Dv6Vsy13wZ9XGd26DdedPuQmT52JPB0foSxsj+5OCySyI2NTvBG6DWULZUoqRKsa37TB4IISApExlVtZfYVeV3D2n+Q0hFvBakFgpgJ0EBqau+ABfk8CrchkLjz1S9zD/9ZouuCKIAVMrTIFPQV1nBFfazULcdJhtk5CO8mfsk2gVCRLVdDPQQf9BCC9Lm6kHY0xgKmItCynE+PdgQP3v7oxxtI6TkMdG/tdL+nf510YkARFptMiTlUjLOvOsxCk+lTkBMDWBnEfexb10xLfAjoKxNNhTJHGEmCaCF2GCEE4CzdEVl0OMfQ+YE2iwOySt+F5WJ7ecTPuwda3n+91ACf3d0GB+pTMBScjXV8H56fKhVhyRoohzqAN6Wtemab1jJfUJt6fkxba63Wl9xSByy5ZGQ+vmjUXjLsPEXyGYWeuxnjlUnrrI9s8nkodRK2kgRh9fmbkiAhQTZpgaspI1OSc3NupgWVmJOM+eNN28nMoPDJpJqKBkr1u3Lg4wanJ2vS886CQi2OWtXbCSdpPc9VCdRJHebAGeoIun0+niLfsGL1iyATcnSbblyBiTmP1zgFnSTpMmeYRly97qvvwS7J+2lESDaSNqXKY2CtRIgcegHG9jDwrJ5zypp1f9iTTb3/ODPh7vY0B+TUSZb3hPObyNGGNk214itYlAra6gkyy8YuD27n1uwkXjdmPf+Ywa0UdOCo4n3saKTw2zAQdLM7ky4BhOjcZBem9PKacU0aYRt7ouYdJN0MF9UcKRKTgnHrdH4+W+4PDfAJN8oTCUyTQCnm9DowM7wMx6sBLYgBFQJ2OdMlVYQVWQ8+TGWhUKh2yHuR57NXE6OUzmFG57YOO6ckGI7vd0XBZ7rbKJBffZ0szwgbLMJvNRZu1IcByCo5oyBO9ov5xG5gNPEaNMoE9Tvjt1pyFBZy4ES6k/kr/0cnI7PcSxVG1lvc+TQJyGDSIcnC+5cKpyqBrFM2qfb5NSJWaxnbMkujNinixSniCltzGxyyE0kK7dDBpoBp7NZiJdnBPjSspJXLkkDEWMrsZ56/X5hK0FF6jzS6MfNx39bNvXBaAD3sPqS90qxzkf7oiGKC9ubxp4rRDnD4m6Isa74vyBp5Q78DEEXrNrYaa2GeTUzzN2LjT0HuWe5joZISxjEq6J7KvloCDuz5OMm61PXU2EWFuCpb1I0GisOb90VwVy+doN8M2GNwXggSCKD6f2tVEhqtUs2qBoDdCzE1WbqdDdzPDfiZYRGpGYSmxo0bnLU5+ixDtacBYv9J+51zy+eocd5h7O0yumxpa9CO5T201Al3W19aWEbdCuZv8fszB5kcMmUF437RTa4VPyLmsACpB7Hafw2n+7JHZPLcpQgZJykcfVIw6C7g9ZQ9zXHb3H8aLMkDwYreXCW1GBC4ErooFQu3Tb7KMe2MLNTICRRLYfrVexx0BxvyEVXggRjedyEGY2LiT5yOXBsBmY3qRsIYFV0xRIuuV26HM8EAi0EnEWcDHHIaLpDJFZuJ5vWNJ47WiUDZEBajnvKTRckKm94LIGGFhdJfYI0n9uJ/tRNc1ph94iWlQfS2PzRb6xutugm0qYUzNjIcYFlyZ4eYkhgzUr4mejPO/RCrdeHnz9eahLOigO+TDnS9QX17MfXENXdQZ09uHnDPjfD6kTxBo+pwW3laKFAIhdmoPLULwvGewMCM45K/Uq4J35JLh69RdHhq/dXPwv30MDKgcqXzIHSPp+k7SKZqxRbSzDIfKA47lSPm6x+XLO1LaTgZbl4sxZ1pebnSzx/eOuez0HM459PTqCO6KCOmNTn2EPcBfT7qBlQZ07fEFtemHwp3bm/brSJ1Qcqc/Q6rH1+brbTNst3dyqEFooc3KnptVhWRhbGewiwPdZh3+ij+NME0YxPoBUbfllaPmDm9teEdXng0gTxfPevyKSkY0Zho8tHWakXWebjiv8/D/J5Xlqvde5Uzd9XfDzf9w25HxaU7jkYdMIJqHWxUJkqdCajsTmqJAcweiwkRFC9e2QU1PLyc44lb1/Ci5Bey5ExGUoOBs/tOkxTQ1ky0uOhrAIntOhVbtn0AG6TehA/gEsY+V3gSJ6xUCRRMsdZ1MdDj/MxcTzsFjQJ52ZFShIG0Xj1QrjPH0o7E5vvBWooQPhOBLde71FnIGs2nneYcfsqinaWpGKXJwnea3VYGemTBr6WgJBt6PO4ps05/SA67W37LBQ/xKXyU0JUj137spctNVGMlSwrhetd0kcQVC4IKPilOU1In3R30sgQwioPtbqWpqSJneq9poSCPgo/ytCvOtdZe+RMiBm+3MO1PrnAKUksTMbQ7oBE8zGQWTxYoxchqJUgzWWi5Z3I75dfEzQcfu7coUP1cGlyhTjQgEBVhCd7ZtJjvnI17twOQ2jZcXDD0vfBj5+WJJKq+1QWAR+8gbP7iyJgzy69kZ3omiCaQj+lW+jll7lfAC5sGkOKvJK+FBczX9MTHszJe7ZPqR6639G8OkJ6xx/Xbp+/L41EWFEwsLPEtHiooA+J46OOwKQJJeFp/IPhMsIsAYc6mb4jc5ATTsylfpI+MLLfIwuuduvduR/e1ULhmTprZY9kSQ0WuL/Jl/dw+Fd/mvRqTwTYrnkR+lgXK9XIvDejRXaRg5CsmWFdHoUEDTNVyV2HDBrMum9R2YBhTHATtO9xb3YY4J7EY2Ozy1wTqaMt0M7BBewdmxmGBfkCk7MSeFEznb0LtFmsJ8qJsRywpv/fGMw3tNLoPIF0fykZlLNah+gc6412RuFgbGzVUYF9OiAcKuN7XOmxMy3eM1gWJqKhOMtsbH+UR7oATIRiyI2I/jeupg40CgQ/IEyPcZ3BR7jETJNHgn92W7Z0/+ipD45/HPKXl1pc7vpFmEydFifpIDkkRdjFda2IDvv7JIScy53kp+EU9sUOcWbMgv4yPJlRr8NA0gswrQgUc8/qGEgGnlnShdaqXhiV+XmwbEqUnmwRTKfSiQBYXJX6yngYYsAarTj9R0KR/KSsn6QUlnOaBafMuHYcrFpdrKr885EJGJihFQjRA7L7lnkRBx17Bi9Ryq0MxyC1rWG+DBwTtnTtJS476X3/7WnxWnTuV7VOf4cV+XweEtKAknLvpiPT21GIWUqJqvSB2vHgK5pXgpZ4NGrO5I77zyu2/e68tQI1bAL1cUpv1qRaGR0neOae4ZZxGmLd/PRanuwiAQQOQHRbCOK/IpAOQJxdzynTR7iuBPcqWT4n+ioeijWZFCfAaBETmASt5OkCAlyxPX8dO4CuyidGaZnh5Y7LFSb7TaxtJx/Zwf0NzdTldw535ux15v4Dl54qEwRCoRjGhM97mb3I/SEeEo7akzLuDIZbIgWAVEodgIFZNebYa6q3b2eNePFkTukXaCl0HF2dsbhr29jyzr4Lp74K8e43LjwjQqrKKuV7GAwQWbEX4XNATeznBirbjvmfBuM87jp31TZasDfx0G7/mG/kY4xa9405T8aO3UZffGFECREKfidtGLBdyINjjKL58Vqvbpnr8NmF35CzfL3+zq3mxlrbLn7DEJcjv373BRNAahLjyiAT9QAE//aAtFCl0gMpFRFILiURLSZnUCL1ag8DyxP0PHvZx4ZBAhIu67+9X16pwud16TRHiQaYw7JE8GzgYf5VK5AKbT3Yl5cLeLeU/trOvTp4X2uAkB4DcjT6TFuQTpEPKt0ZML2Sgnglz74e7mANf5FM+8e6TsFPvp7gd9D9ukNF52/DsoDkGnDmxQU5mSJ4nEiYgFit6lWYWkw2baiMUU88/lLuREk6XVDOd5IwT0lxMv0/2qNA95DqHB+51Moi3NJYQkJrUSfNwIetRxVrm8Ym/NBx0jI0OU8TsxgqBZoJQdOMZ1XXVdXqVqcNBp2im+S9N2qbHRjmuDnmtESiwE9uhaXKEK5o3/ZFxy2/fReRFsdfoRvrvQ1LeCQcxG5vGudebjVvvgw0v10FEWDaccFbOI9uCKQtFZLl3XUjIuspX2LKws4IwtBrEVEIYfgSC+T0L61s+b2ji8n7QRO39G+f654396SXJnhywAdB5q0KjNg6TwQ6uTeJ5jMrpWj6MhGKelk5HG5h/AUN3qQXFks5ptuSiXm7b2NmnR2AF0UUHK4Bz9jmSSBEgft/wuG0UKk53ewXb+cR+DUu/z1NdphxdIQfsLGOiGdzQjfvuHXc17EayRbDHHauok8qGBw/qguXsHKuAzMIRRwTs6o2kB5diBX2hNL+gu7dqOEsaSlRT6oZpMZjtLfu7jC9hDbxuT5CfMHypkLvLyuYciE7/APDxtbYUE7EJE+vdkGn6nCSReLrzMIOom8phmmVXBqj65/kizZb6wfraLzEnAGKkI+Dbo0lnBbHgAAO0lH/z9h/tDwDAUbTqkN5btXD0ugtym//mxn27IsmdPRrBO/RtDRqJM8h4I3PFmK3uLb5l7sPrh8lYg6ZjvNinXXhTtD1h0gqcHSfa4YCYR3YVy2d5x/p0yf2BuGoHjjVCYnk3EbMe+N7xKvTzkZ7QnIm1qG1QRIJcxOy/u/Yb72cIQY9pFGyvyEha55hDP3HLHAjkNLQw8MjR/iSWah+pz6CgBj8OQEu+9k4efSJDGQvfDArxfeS7gu/p+dU6IIfMgVQnqwy+nw1BXgeRZdAnKcHFenGHX4kFzoCDe0g8ZogxWC/2Q2NFB8BxnEe15jZ7zNgwUiUDO+cF7tPR2cbB9sIs/brMtEJq5yeqbQjf4+OOgYHwf4zNIoRyIrcUltrl/yMTbPakm+N9UcglsgDCaTID8IBTE+qaAFGemJlyTwmjnRkUjNdcwNCHaymGn1tFKhBWSeOiHbWMLLtkBx43nArlj9b6nOHjPgcv1bf5YdDrzw7iem/A5J54HZvXy9Y6oLEJ382aZgTavv1t+LIMXPnw+JReSKW+0aATGA6ZP3flcp4ar75OzvFXEdPe4tQt3Emlgv+0JRrlYsskpZSymQAa+pe/s6rFzc1GsF5IXwdcSxqo7mlnLnl0XWym3Up1ap1y8CViUJGUuudWmzaol9Fm22q51RMfe/LSyEiOqNXMXbV64sr7Qdavm7oq7UMpmJSeOuWnDG5+OBCJfnxPBpRsLOz26m9ETQvHagB5LA+leg5M+jLY1/1RXjzW2IV557Ru9SQXkWAeWcSM5R20+wffGhXIsaI+IWZiDKTi6EB0y0+GF1jMPWRRHdypBsg0CIXaxuERJrwCIF0ruJHu5lAJsRiqr/rBEtTU9E+S+n2mtS6e9u2efKUfzlg8A67Z4wbIr1Q8XesPwniSKP5qHLzPbXD5Y/5HgUdUsJ+FxN6rZfsWES99g/RM3NZwS1ffjgKhd49mXKMvYaXG9Apl5Q3wza10TEcJ3/of9NOt3PkPayyReBjTBvMB4VnX5AKuT9OuCbEGk4tJ0bIE6luOZvMKcsoAbs6xy6zwhbUYaZSAdHyO2Qn5JY7JxCHFYkwW5plhyQ1tMjo3Kr48UuMWknWlZdQaldTBlQWcmj8AGuVLKLLTEYJJaxL+Ck2OIRI1UgLJRxeGbK6T+NrSjm7p7l3hGU6D/b8rajDmw4vJs9U3mSMn0L+oOdUFysav+xXvkgs48b/d4V/bFDIEuDQm2mYU9BYo7TVN5Sd1zxSZZ9QYrWscGWQlWdOeeTd0qJZiY2FBITDNO9TuRzJbkBTHvHv8v3zuko4K5mcYMZKzg4//UQ9H1RTgLs+m0IRzWLG8K7rovkHjNqs2oErPk0ca+aA2SiiowCUYqdcxrbUsp+8zGGj3W/40nCw3rKN7nQI63xZb2Aj0djXk3S9Nx4j3mAoll13r8qVI9q79NRxE4T8DKSMymlPJSmwYW5DNZMcSVJB7VEcEujScs+YJpZ3sA4/3qHD/Lamj6dLTSu7RK07LU7Y6xPJg63NMv9/OIt8dsFzSWnLm+JPMZdMoE/SF/qxkqyf+M1Hui9MpyONlzTA6Zv2uIJHrG0lb3MOYjIECVRMxpBrqn80XSvs4o/X/WEC7DGqyNLZu+R0Q3l0aDa+SEs0EouIQLnxv52ZFB0/IDMTFRrbqaZr6SOvKwspLYUOnM0W1gplB6FfLvmFaL0hIC4M7KAyLpS/6/I3UCtic7zBiIjc3tCBgerKDsW0XVI1TCefMY6GQpPegNARfHUV0KoBVBGwEGGgnZU2CWD0eGoMBEew7q11aVPMPJ5zBWQG7QFCB1c83HWD2ub33Pp1SF2aHtfH/Ns1oZlpgauvLAWoxL3WALk746NHal2kV8I7ORfQ8YzXDXRqbndQAj7vU6LG6x9x7V+i2+ThPa9ldnsVZMxbeQcdw9fbgh9lE3pMyLGrn9z/adxy2IfaiaZ9VsNx1+NUWWpSNFj8IpfOC64o+sbtInNMUDVGz6/cX3GjWlmLDaGHGCvt9wi+6g5o7OQLTNZSkUS5qxxZ3KOeiX4MufogTzQx2nw5TgjR3dRvTH4/OlDchCjzCGwyjIrT/evScQt2C7x7MkJ2bSNFuc9Hr+WkqmSyJE1DDHfvrBLwCB+bADxYKFaAhmZoyRat0kj5wuU9czue5r3L1XXoStA2VE1uoczx91vLUE00Rm+ZvmbnNV71eEocf+J37Pc+mwJGhNXTaXkbOvaCcI4hxomqQdnXgZD8IfFyqVJefj8iiAeSZZO/2uEwRV6QJYfPBpNA9KbzLAbfpwXuqU21RvOxYSnj7nbUhTztjFgjEhkL+augwXtH2wW7pL9s+1dmqqGMM5/V4lIDHvIgzbTkfZEYwDBFtuEvB1xtt7y7Kj/gnV839i5kAYNRb06fzOuLG5Imgt5ifBv3xSLp8cZmVn5nDz6e4Ho/SjE3HMmdxg9D3GqJXlthd2UQqdSyk+Xd2dIaQUx2TCP9Rs0yd3TP5bBhljqjGyQbA68NKSN313WujZrSHHUoYoKq2aB3qKe/axIWx/1YMP2PCDNHUle6ay+xYUM5tg2dIN1kONuykqlE7U2wHjX/+zOQYg1mJaTxMSNahaLJi8IkBk+pn6qPi4J6GrCnebzpLaAqG0GzkFhm4jdt+QCeYlEZhsXcj2PjKxARZBi8DIUugJ8ti4dB0FDIg2o0Tg/ka9myurJ4OWXKqbzfJqp+anfNpFR49fkFfKueCMfqan6sd4EwgnqnNSxXwz3pWfx2+A9+cgrtJQWtlNVjqSKX0clzVq/nhaFKgs7R/9bb6TT0cSmi/1PCdXjX8i2pHEqDUq+JTfsbsW5D515Bdq+l1HRXAP5rPJWe8OaejrXWoNrjcBsJGHHKyig2zXwIJTvjk9Sx8FOSCWp8KvLlgdI04Q2bo6vk9ilnkvlkIfaqG24cbFAP91oW6m0YpGTuYc7rxdtETmh9TDAoMRt1UMb2mEeH0ngHNYMhSBWjIJYQbdwn2siK4Bl1Q3vzivryCuFElD7lw9CH0fTW+FgXyU7YT8CyZ35Sd3CnGNrw/Nx1ZL5TXeN6m7nKPxg9/VjvTuDhsKXIeT4xfejcMiK9yCaEtDzhVinWHIuV9vJy186Q1zCQVMVHMreWcx5vC5iWy3V/tuJUiWj12SgOYNpPp5xaZTbLy+mSQHpMI6FCm+jd6FpPaLsvu2QNF6DabDjmht2ryff9GPJoYC2aHCuhVFH+Px6Ci35PElWOnDPp2Do3sM9B0Ag9YEzHnbxGdiW9B636i096epNKJht06MHpgggbC5C3Rdnf75lOkVLWdS6sum6IQbxnXsJn0T0/2yTIv0gnpErTzgyGsh8L5nMf42w9h5QrrVvtgQAkEk3x5gmUwrFG3FLh5131KpjcjpmpMAO6wcPYfCSmmlQdSN/UJyyqKHXcb9M8amc2yiWk3ySg1pFSGkH50Gr07n6hzrAO8Mwqhi1zBuxbNFLma2YK4BGY4V4vNtmm80qEfS2xVWBC+l5WnzBiZOJkjlt/KhJ8THNa8gEy+me2x9XbTpPFttpR/+FpSyY4eBWTZlAKOYeFZdGTSV3BfKVpURM4a/FPyh6+E0+wVzhd4s1wTQEkdZkG71jz/Swtwh9m2ohib6gFfynIFHnPLngtQ2Q/P0ANDBDIxWO9478z9/PaoVumaCI6nvoGQEmL7RJLNppZFZnJ+aB/sQRhy/V1of9vCILr0Ld7u0ZWLj7WItuLRCctPne6bhoxcx4VjogUbEYpGSFnSV3qmL4ePEuL5JA54OzPxEcMpUAUHnE67jJEJHTu7TaNc1euFXx01f3GkhM8RNkDJtby2LkKVzm7Fgl/aKdz558pfUnUraa3ssy7mHw2C7w+n9HwjM/Nbqzx//t/AoYM/+a12gzbsynd/zueQp0CBJxy+yp8r0POyTfmOd59t/yr7/2IzStykImHtlb6RkhGYB5FlWGKfdS36SDKrtKVtmIjqWJTRmISyHzPnuz5Qpn1pIobGs2llVzFDPuQxgSHrod4tdJnA/hY5Nu/RqpHcx+KEra9LUZOmMb7AsGod8/Z3glVUaZ0ISkXUP7DLQ+xAMpRNjqvj9yQ7T5VrUCrtetkR7yr2ehqt9p8ZH23hds1LsMnDU6flY9rVXP1uZVcde7uaBHDXTKWHORLMEKVyvnCYBbL17V+hF26c4XePWkaJH19L70wJuxHgZycONgOUzXF0nz2tRj/Iz2+hktP4ylDHyP+r2eb7nNme8CRmBvO8dY0UZpOnra1sR/1gneV5oaT0taGlbUr5QcgNoefBUD0NrEdpc+2sxyzrSKS8T1kLePsybKQJwRTBeuhgAHsNKC6v5AjjuBJ8TUIsR3BzN/IEw4oJlac1BSWJWoRMYXZguU6V+dtOZvNYJ9o6+76qckNWFFBzM2x4D9OEyw4c4ngVsM8s/HIjwsPKQEdGewh7048XE3egdWOVTWRXdY7ticfH042EN0BEFeEq6vmX6PvMgFW8MTgBnibWbbjFtp4vfDQVS7tvlRMwzG5fuMy32IUgs6q4x17ALjlqxSeyyXbMbQDk41eTO+mqWby40x0eaL2PCrxGXK00gSxjY8cHDgXwZ7z/KwQty94y/2iBtar4MR42TtDOm9/AwzygX+yJ53yeOtRk46B6Plktk4ZknwVGy8Y4aiG1abTVNfzh24aUfR3KRDlbYm+2+3QgKvlaymGP3lOMBo64Tsvp7Q3xkJ0YnsKvKpJ+gw75+iZwS3uz1U6TsRtBSKRaATQnDVVa5fhaID/0KV5Hfdh+tfdwaLM5T/3LJ7QNfzmI6G80NCkIdfoI3nkoUMXiZyKD/OU3cfWLv8QdHyauaF/ePYFijWVw9CnJG7B1uYzipGkgFDlDtGS6uVYCiKo24mNOTwLVA147wwcKy+QEmdQhNGUoarndpLKvWmoKl6xnGvzXCRRdI7AbS7qC4IORgOgughTkFHPvK5v37wFcXUmlzV8RULpMWKDyeojZBvvcTf+/YNn/rkb1IvN2SiM53mzqd5f0/+K9utkG499Xsg+bz+wu3QRpJfd2D8+5REXTwsg08VYiN1HQOgSqz8BhrhDKFy2iX/M6qWJoW/KIzDV1jkP3+994KTU6nxFMcXT3Jlb9s8dww2CwVCERSdAnyysdgLfowi/nusBuJFKkmvNQ0TCNndL4hq2h8h7LzbI2qR0QhTi3RJFM+OLrLLvxvJjwiHEk2kSM0ppePknwC8sfdAIRrJfMeKNn1bpKblufXecq6PNELcn3sW98/m3I5Dc4ogYV/IIPuScCAMoHkqLfV6ArR5riAwq8jvdKfc2D9BT7Oy2XNfWtmmcY75Zs3xuj0et4Qeco45bDDKPkcLqLninVVZXSEN2Ex39jlZr6kWJRPMsPIEpkLTElepGNwRXvM8OkwYo+lOFJOum9btDd8F8t8fbmZCsRKdU+vZ6lDqYxid4dbrt3Z74iMMXJboqzlWKiYYWZtzD1RFdHNzM+m0XkHiELEeRzu3GNEdkX/QC5RiKlq2WXXLzd4hD/HMffE4aCueDLDcMiWe9qFcl/SaSuhnUecCsqBjwmBOLaq0MF8eMsiaaQO/lPiU6d3w8X2wM1EWcse0tHKHhvwvY0kpmO3Wv69DUiHd9dyWcAkW+TZHATahx/KwSOLgwrMxN6Dbc52eG+DXVJ+FXpuFoQj3HR8+iAWHXGwIDKVQldMDGZBGhzO9KrxD7BRz+Uxh2XmlZ1YQaSPJk1TLpB0kplCdHaBu2U00cTR/FeSVPTSe0iEyCVqYBBEB1Fwww5va+bJvCEiudesuZnLil1jEtMUcoLbs1yG36TWJIsTR951OeIk2X9dBHdKFrqAvJZMZ8fi497bnH5xe2KChJDKcLZUIBTvTn5WRi2SrajnjxQdRAEqoGyg6w0Icha4KKb/DxfmKUQyp9tpPoO6vJ4gyFIW1Sxgz7SZBIRs9DUcaU9CzTmPAgl1XFaKUZZWe6a3Iu+z5FkQd316rM8TZWAhPKvVMGhekQF96bpAiaciSiLSN4b5bUP//Uewl25dgC6XVJiVsuHmm8JW8AWZDpJQAOEPslOf55u6vRssTz2URng1F8TWFpM581+bu8JsJJxOUrPNN6YaIHbB6uXFZbgIZUU6jKBpwSx1U7mlaVroaMzhtoB2AxzBnSElCgN90zAvSvj8hD6lslJKJyHW6NX8q7RQQI68l3gw5J2QdfLDBLsKVvFFcGkOF1/kiGuLtSJySccDdD+ZZZHOKJDusWQJ340QUkC+mnDgQpS315NZOMlQSp/GzRQ3JQ8+QopPM0MpyZMTY2+FofKiSARgQjvMR7Jj3LAFyPhj2xpJ29hPYW/TsgpaVrNj6SLmtQII4ymj+CH3Ocw6M+ihpxwnZ3LsiMwWBpwJUpB7Qto6MluViJEbYgKaeIlZRUTwnOMsymr6UISyGsobzc24apdBdwh1hEcocISuGVWFO0PTopyG3WkwWCwEZGwZdVUdaQPsOCzqS3Mkm6dpY/p+s0ivM9JA3IrtFp4YjP+IRQOEkKJP9mXE8M6l5mRLGo7TTpCaxW/m8NDwGfJx603V2YDUIi/aAUvCiUlxJRxyGl4Q+MjpQpkmANOF9kAfxeQL540EZbu2eoqx26ScLDnema5BJNtXOfZ8HFt+WdZn4N8vcPx/1UAMWxlhqY4mxHfLEkFpjVfGyZL5NTzfM2oP/KQkgtFn4v2ecFUsMuk4ctewUQQ4GLRdXVQq0hYyJqYvi1a8D+B1x/M8zFbUXo+AAHdJAJ78DRmtFNVxVUiTNCyRu/EYIBYAAkqQEoHU+OJruAhjtJRWSWF4oMJiLEGWUO3uJMH+Ue0Y3ITM1aKJS9gJofSZ8bvu9db0XdJzOueQCMKLz6/GRMjCCtgifnqSzZEwUl5UmIX6iP4T9X+M/jnyBBf/iJ7MQa4VKgzzm8eehGgt5v3JXMVVM+WHlTS6KS62ZLLqhcr+bVIbnaEfxsvrVTnzOU0zIPVCg42PFSlZitR6mej18ZHxKFWK4nb4/yp+gG+GA2tdBgC/TOpsddWTvfiU0dxakiRgRC/nZkRdxAZzvqGSqu1lbgGkcaZpC48cBOk9AHUauh9GtspZnp1FKVZFcl6CFGC8sSBtLwvYyOjwrq/GzoGlPixVd7X5hhYnunMPIGWizdjpd0iC4yzIFWP/ADAWdygrqLN8tYBJSvpt6lA2suBicogrQ0vT5LSHnWNAIjR/YongS47hS3scE/ApipqIedRXVk4eqssjyLK20npNRfYId8GdNww87l/iPaK1O0YXnpVGBkeac4Ehhpkr9RpZbY7AYYKAZOqAUK4EYJ4YrJuy+U6NCeHPI3cH/VH54FtGvubNhUP412GTznojvBVxfK7ONoagHoJUvOzm9RgNhR16WdwM6EvvkqbxpzBc6nTTGGUSk0VjFs3xSWPFgm6+M9Nlpxvt3ciVlcYO0bM43P8Uul8CL/NkwAbGn3L0xJrxNEr5p1eiFvXW7by5WS5EJ7URoo10rm2CzIhY5w9ZwFgIwYxGlmkQulaxwIEKyn04Ylm6vED7le2nZb3KrO0sMR2nvrsFiK990/xR12TjUJQtCPCKH+ZzPETJBPOdVJSUsCfe+eTSQjY8XgKPwyO+RJPhyNweA/Nc1LRFPLCn+u8gCdxhZV6Kl3joaCwAhQVbxxLGIYlildy09XE+Dvlj7ey82KqXDMN06e54p/4IBhI/Y5Dxf57w/0wJ/kk5x+T9kD6ucvebQdkTLUN0P/jB68gKrKqCmIu17QoLph55usqLsLw0CkbsopwN/XXwPi4FZQqWwnjJonWSIzP2zBnlGxmaz4llfKafv8dEa6fvKpEpFGI2CZKTJxiOKYbvwmWp3Sx7YxAMXZm4Y6Rf06JcKFZhvvXaylH+Z77D5Xf88aKkWc337xR6PvQ4GS//uT/wzq9PwI4vh/jWD8jiTuSqXlDS8zBvZDV6EgwA+Iw4KNEeqZRO8/dh+mrUgWzHA8hoA4beB2eDzcgKSFPGfC9D1wTjNchpDaZEnUeEOSiz7T1a21v6yOgH3iFwe5a1IEB7OJA2d/XOgDjrZ5UfSU07GB9DpY35tyN1XmwFjJGJEiI0lUgGbIx8XGf6jODjaqlaWWUF9jxEqjRma0R8ty/vjEfAmNdmUHgqbFHhUXlVXkuRe+oVGRQfjoNKgjUhknIN7qS28v4iuqM98F1nYOM1G6OUBOcqZNuAvy9afjnPG67pHmzUGiTZRSYK8O6uendBY68VTMbsB5EcGTF+0GRDlXz8xCWQ8XhCghH+dbXxywL4hmz5h2GfnCyiTvMPDptuvkNKNpr8oazmPoUS0bERRugHbklJjTUoH7ErnHXUH+weFUmI1a+b+gy/8jbBLKkrd3Wy0B9mPQAf+m8qXUuYnGgYIsgZnQhtCfxV++oDmXcFxyo7cXlag5c6keI5qSzqlECKgN0tM8HuCrTnErUywL0yZ/cXbVIkPyzN57B8FqvpDWcSN1DEQwMQdPTkmFO+AkP1cS3B3cAIW9vLOLbCtD9dTPRpF6MrQZmeb6nHYV5SaamR7V9syPH/zta+aSR57a2kM/9brlQ2/Zv93DNDTUOibHmXby5wk4F9MdcL4B4CbsKLDXR6MycMujH9N5OdnrAItWEint6dWVdxu/7M/Y30LM33+jsqZbiXxwzkBHJwr6eGJksLrBpcAYLBN1Jpf9tweB4maSvQq195wZBwUUEKfzBx47lal9AgarW6X2WiI+qP6Tb3YG/aCekJZ0F4FcZns2eRoJu9evVniJkrD2FCnm4QLF2ORz/CfOFDhtywscUVSYhA8/gDS1x+CUg6kK5GLcgGuyAchp0CSand/DUVvpPRDbtUVAbkdTU/2D7Gf4usqE2IVegdsOY/0pmPPS/aBUPqwEkLyqjI49HQ613fVy4I4GVmc+cAYDpuLcxS3qGp0J5ncCPc4mIO18wLQWdHs230OVU3T4VYh3x/+WTbxxlmOUjRf+B+yLv7PVRf2YjjiaaeoudgsMCQC0SUTrQidvwkoVqM7xmk3dVa+jKt47JbzxBIwunygeHUlyHepqP+pJhNs2y1B6Y0YE1e6udoErzYfaWLYWZSKn8sH2mAAj4e5pkd1kHTrH6TTy1QJNynPk+7un0YKeZavp/4KlcAdr3PvdybhA12KLqUXx6JzInIhvhr5wLUdwnO0dsh1wK4P9CIinlnHiKdGJmwI686qsMnNI843LL6UHpGNot0mRS3QeglWnnUfCPKG3rSSjpzu+Qeb+cXH2dDzJ9wxu0ogHRZIdFeh8o6mYPPQy3hkibX6fBtASXt0469iY2XtBTQ+88YH82+DCyCeH4StiRg7MWeJbh/45FFGn+mJI9tgZQsZCbxduqyzyhuNzUyxmnG8k8axUHGXlE/7pVqGMk3+OqchCDdugHWf1xTGeUXiEqMGXKqu0QrrmCHvLDQr57zQ63l8Xwg0crihtpmxwbengHMpAUuhxKvqnJ+Nm1YuGSgo+wbx4ateuFNii+JbrYUZHGhobXKs1/2wtCmE/Osk4ehkijXpJLu7k6vEC0S2v/xaxR7ztJdC5RLoAY1L1tcnYQhcEH4kyli3lah+V6RG6RjaVt1NtC/LNSc2qmlhYKUktSInQKLLlcszgyKcgpAsHkV94F3pbqzNIJCvzFcB2bs70o7RKmwpJABOCWhbPWpo0VUzDVcXsImrycFD4oz6A1Gra5pFzLRsZZQ6A7x5ioDUpZUs4AwWYiTA8nIhf9gYoqUeexPHBfLZQGATwiJCahfcK/TYOW96O1wVCCunbtxilVnT48zdmWKU3wezzPwyADmx4AwULKw0IFxKeDWFlBZKl0sUn1N36KOAqxjSGvQSSUiKlWiJh4PWxJ0NDfxJlxRanx/g+qNJOo4c3jBJLeb30KlMgAIUdX5XwI42aeVDlATku6u7W3RyscgAB6LZj8oMO1Qqi+FeMvm6GAv7gOVq7a9rP61+OhCicS1pbhKA6/ea5PpqCRyLbL2vh6tSVTfymleIWUdc8gcVkjiCxmQPW7DVxXEABKnqWB4cE+08NqxBLGg3koEsPPuaA48hUIxeiPERkmQEVB83plVvKDZoAN+ZzKkrTacCrNieVVP1uHH5HLQpDYFq6G7TugPdzB0sA7FU3YP2lCypsmfyIJujiK+ylEUnkWnjwU+8pe09BJR5LE8TteY2BBM+0EL1RjSgnNByTsN0LDQ8uyt7jM33+scJxU67cVsoNqHSDeQSk/aBlcctauG+PgPFi2buPq0nb6NXXL2CRGmQzZ0XFP/WtiO70ZrcjXbKq4AFw7hc8cuh9l4ZC8fqx0pOcngTsyAGbCQPdZdcDeLjXcO6eQEI4meNtFrE4Vje4HWRUKMxUVgKpNY2xbtw8Lp5OEylJZBxi0stPOqtwc2h24L8cGEIg3qEqJRNAODVZf7JuqxLlilXeisMLYl2XTKn7udSObjXiNdsSrrgfsY2HFGC8pHXLHW7YE1bfCJIyytn7J2gJGZHedWt8qqp/0RbsnWob4yhjl+3OiTcDcFI8o1GcU39cagnxdOi9h4RKZP/EdT26zJ0+sG/rzxYJQincjAMI7uMj1sCmUpmuFdRZkgkFGZrHGEGQAOfmZHH7aQwtYrep9nH5CLMc94WqOfQXyxIF1NUrzyQuRIwqD/TdCacAtEaDI332+ystVdERaYD+ud1sT3FX/MFkIiatPrvNpAYfFahbAStJOU85i3rg5vGFuOOnH3qWQH1vN1FWmGM7HyJfPh6lqQ7QKbZJc/wFuolQf47XnyNBSo9RJQ3yQ29lVz7Bcqzd9hQPaKUiwdwk/hyEoeOZaGywsgQH0XNDUnIq+13Ep1jhvphkfcUAPci+jZn8hCWZQobqi2IeBTd/R52FQElmqcab3W3hkxwZKEdMl6yxQYjLJzQhtWvW3fGTQCIjC1QEQuQYTXOcGsteD8Sh2Jd5ml1hjOZruf/k0IDSQmMF9nl46oflEJgPoDKCIu98TNT9E+6x2ZXjij4MS8QbTyJSjSG8T4z/9VtBGvlXb16jUID+gVwU6Oq1cdysXjkTNARnhbdAaX0gHeDl+OIdTa20v/DIZtqS9ZMkhHEnAXQio89ZYhMMEOmNYbIc2lIE9YI6AX2hk+FjKIoaUpLcqu+ly5ZsxjPksLcr2ydqzlF5tTgIYhHG+kWj8CDtlnkLsLGPio60GpcXF+Bus4/oxfOaC8xyuKb35ngXgTYF+8Xs7G+a2o93x7qMf5ZgMUIO7LWk2VmQJGjnFnbjy+pLphlpCCETeJ+dSnc/Me4nuVYajLMW/kcg6iuqEAtFid361xjeCt/ImiivsTzoVYL2YXGjVu69HHuiUM1gxc61joMGSxpMXKplyij5ZyYpI8UamMZXna4vVjiXkIgFGQKQcDH3UBPjr/PUnX2Mnk8N8aQR460xQT3CTbDWtpMYNIV41F6YhbE96K5/VveZKN/I311J2WRInmWwK04rurW9cnED4lFysZWSDF3zzO8mosQh6c+a/8+AQohisNdSQPwz3xzs3KI9cI/V93ZrjTI6nSQB3DXJgZKUqQaQfkWuUjAL6hXWJTPiWyBKr2xLS5G3rsVJrPoq7P3YtPMNO383AoU/DeblPcbOMPxQLJlUkSK9ajZVl3XjoxeUO7pavfZ650DwihndHpczxPQQkjJ6udAaT6bl3frpiZPU8erUnisdnfH3apnWkUyeWUc6UmjX2nYw4fx3WSQtAGksQB+PWjafwMhnDrhOWNI3OCzQPttC/Q9SoH7n7zj7LO0rfF1QKjlUfC7CujHMQuxShWe8lkkjCs8sqjchRbOdKBmOEfw3ODs0DnLuSlByPTxnOQK3b/Tw8sg1E20xz/2c6/ztDdDNxAHpMlxZmizkjPEvKaWV/GbUjCNInA6nVa+PmJRGnWGKRn/DBZYk/9ERBCwe48c8i/j6jZuPzFO32EMLAiAj5xgFaVR0z8phGEFcSAMxz9Cme1Udsn04YawdDerSsYTr7HuTl8yCJQ1L/Qe9stWuQEjmZz0+sMkhV0OWLFWiI0PyAMK4QXi4U3J+hAsVVUXUTdwf7u/DB2XG/Nz8YdfG3t70SW/rK+jPvC0C5otMFzuzqWXI9962JcqtCXEhCyA0+IQdNdIgVJ/oSgnmQ1gfQEu/r6TQrZwhkBOmp6EnIZezuuQOhCVXbHnOKF1966Wpp556kmKD0YSWl4jA0f8PiVB+SG/Uljt2seOiYnQhCQ4Y+ZVhGCdAs6BuXjqShh46LbDu5osjU1ys+WBFHU1UmDDVA6V2RscsT/1V9JLMRchlBwD2g5QC9PU1w7eetPtB38FCJ3M4ZNcVduj/EtzqkxneWwLi6fWdMSuU6VFVsHGRqdI9HzzNWbQjSFhQJ6fRMmnnWAOP0ko7MNy2AMzooBtVlnsxmvC3W4Dail9ag2DY7QFG9HPaFP3W5OalG0aaRk/nW1S91Ra5yn3ZnnLLoZQ/EyvucbmtBvIjg1h8A0XQaDyG1S4fC4OLNiZjAs94jcRYDTpUS2wj5WT9pTrGtNHCebDqi7AugYtBahgig1RKVfgF4GwdJAdhz5A0lcVGplaJ+bN/2o3+3bvrXq4VCpzfWkMVlDfoo6UUu9DBWHeaht26S2Oy7WehID+oYyFGbTMPLa67siUaaaL0SfHMb9EDaeAmrawCePPgzk2mQQ37SGDluRbBPY+0/4rEVpdhSmVC495tzw1bsjWO+pNjnTZHddzKBUVRo3gP01lqzZNMLu7Fzg2FyhOcsQ3eNTQBMPzaHPeQkMNQ3pxJSIS948OYlytyQLY5LfV9ofd6a0HT6jHSwzcJjdySdbkhGX2MHmIZb96gLAB9AyPVYXoIY7OpSl0emi6SXwdpwbee4LNrlhnt6hvPAQh5+8Jp6ykk8C+D32Ymh2IHcI9HLFAI8jxpZYhJY3YaMLJyWyu0kPfUwoj5tssX/Al63m/r4aLy7whCBLku+6py6l30SHnGGfATI4GSRY2WGSV4daeOrbRsx+b6Uhr7dNqx44fPt2CURUDzxcFGyETfXnoHcNgOWKbzSfj89Qfp563KyW6Qity1qVQVj/tasp5PWrzK8EmWk3mTGqYOwJyrC3RUDEDj8TDBCL6fcJNxWjheeraFCqxThYrZGvSaXfOf6GohQI1OjNgNq13Jimw3ad3hDgwPbwd2SxcOnLIqQW+hv2Bc1f011UMejQudJxsNxLMHzc2poK3ZXDoOx981Hyq9bnQ6yd5n9bxaHORU4djmY36FX5w7UdZqtmR1F60tbD8OV7A3umO6hRtBTkZWfuiDJkbNaOHpVl+om7A8/rX+dHLzbmhy409Y3lVD6Uv8o8gYEWy0dCSNCSdQfW8+snBnnarJeRR7dEkI6CDqR5MpIFOxz6cZ+7e7CNc3ZPHh/zrevD+P/MkbAPMaHqgyAijIe8GianwxajImFwvTYolvaYJyv3tHwu1+Q9AUqlcVHkS/ai7bPtPplbzYY8BuTg2ShHVgzZT0Z7KN6de5lfZj05CDJAqA9DAkz4ma+UICTUajfFCk+IBzTvN6aWT2V/mCBYXV6/zmGI29tJEiBj34LEG05uKcTTK+JJ+CVW54oTu8X4XYGZkPmwVGHD7CtW34lb5gRfBSW11iOdA9TcMMScS3YFupSJ43TM+Gx/cf7OcHGLPSr3CcEQD4sF8Z6LN8rKiTrFwRvmg9wdqLLgdrV6MBMcrvnxPcL6h8NcP/ZqbqFRJWNg72LRaIPalQgJGyBncJedBB3KAeIdC7Zkw8RqnBKlobiI7eduxBHbooWixsvMtAwnFsKJi8d4+aJg8GBlR1G+oywO8fZ2G5BkMieb0NyBn6D2KY1Tl78O8LFgbAMdBUD2exryc9fXA+WrB1dKjd1tXizOr1iBcwexsO/559x2t0lp0lTEYagDBZPg1eD6WbfxaQgLZQjbVtIXRmMnMzgwf/ULKavujX7bypHFZSYeNc9uuL3+NFy9zCXMqWln+jx1zl07yXmOe8bvmnARmxsni9ffyt9/ycdq79LiWCJgbG42ZQHrxwBNRUzmfjaLCvyWKE8FRM7aiVdNBG8eiTpCPFsNVUhW8ThrIOrrzEFpFFMOxC7cS8hvfrJmQlyO287EZRC5aF5xe456ytZfdrbPJoop/TzplIUEHgmGFb8ydbupVnjOVzCyDMMwn8py/3NOq447MTiof+EKyDLvzIdjEPqLRUGFS+s3QnVvwZBa0LF1znv0YrukDpS126LRsw4D1UmFjCUHF8bfHBOXq5nBhIicI7RPLv/cp7z9UaYswnEgIVm4q1S9ym1qcR3nH4F32x3CFoqRzo983Cn+mruyC7mEvbY6bu7ci2NpPVhZEZLxvNYc2kEY7JsZm3e3NamgiwmBzmgTwBNeaL5k60e5o1kVEuy5Silm+NjSr4c658noxQfr63I6gfXTNwyho/fz+WOJZo82QVUSjW7kkid+NHrHCZ+5R9uzEcz7KSO/TrbpKOmea4yORj2yVqIAeb3dITsvCZSzhpV0IbUdJCNcVlYFyyYF/ZOyl89Deeez1Yf07piaS5+3X6brlAbZvIyTmknY4wd8f3Nsoh7T7GI3ZkVTWINZYYU20GqNhXZNI2ngneI33O+PlPo3WAFGM7rvH+VOQ3L4WE9wxBhID/X0oS8GbjEytVp4Ed3q1qOxOzwcg8X4hKSI/PeGobEiVNEKR96kAB7Xt0u9HHvUOEmUyYWiPiA8aRErB4+wfXY63A+/fMBJ75dnaMvvJHCNaf3P0k5NeJejMw7gdw67NKspN2kdA6+xo5zFaPi0vuYWo+7Yg1lzN8B+91Tp57Hu1rPaBt1dvRdhCyXLrDYxwDBscTHV3hH8rqluD+Cp66zjzpeW+of9I4MMitnce5AxRvrZSuUyWbYiLwRuvE3blJQFv7a0dsWjQU9nxigmqhMabgqJ5/YS6Hy8v+zfimxdnrjoy7/LZ8MkGhRYLG+XpE13h+dTmTFjlVLbhyurPK3xBP2BSJDg4M8dJonu0d6QeJAj8fFc5F7w/jGTsM6+Dh8XyYsOr3jqgsIhHbVUhiqfEjuY9r87/QPhmVOZYZ9LPwArZJCpbVglnRlZsKadVbcKBmDLfLIaXZpXS+83GhY+8PSdhOK4vDVhJYgmkq9f7IVqTKUAD9hoOZk7+azXljqYBdOK8GJ8InMvtntJ45fxMl8WmwFVaFRs0EW75muIcUzoGtY1zuxeaAWrp1WarU5Wl5bXgYQmKB3LMu8FuBVm04q2/Si+fAWnC8VtlMcCI2y+0yDt/8Jp1WsNyJsFtb89FhOGqLDGdpfZ3RPljRoyBNuH3bht8BWOsrmnLSM0eXX888yfHJ/HmOyUQBBKLFhFkM/a/cvmrlmOfjoKilLKN+U78nRowuYBTTkcn7i8tqvzKdms77r0Rckor4dlqGs9KBpoxwhe2UgcGEM2x49NvFWe+/8Xdxo7yjWPa4KIpIQ+diN3ClGMjXiNDS9+0JUxywTO+HvihOdBMXxD7RNjM5/KbpB+8WPG0OzGhohd2PVrZ5lZJB38t/N+cgtZrYwQWZacsd6fhPYGEeBfvPfQd1Zf9tXrJdaLZlqECodReTDIwFFJ7g+tDy6HlnV12RRO70CX6P1qeRTpHE6c3z1+XK8PuCBNeEB5w9FSwmLM6nyXDdr4gFrlC7yiwJuUAWi2sN6kesHMzW/lgQJP9Bc/q3wwfnlKcYZbqpZgT4I9wCFw9yUQzkUoB+wwl8XEPPP21dibxjoSEs1YppcSBnNUpkGGHoi1k9PDSOmi975D+X86z2SeJc6NkR3SPUJFxxTky4qCeJNso583nuJ/ohcLKurYh64YxM1vt0nQ/XcPMr8fnGRWVA20XNW4mkwrAzkR2dsrgfSEeu27vF4psBoJkLvjIblPOFSNt+4URLSFpo35yijbd04swzyJkFXxSbq9ZbPdjBNUE9FD/JMPr5JK1nLi6WIaEP19LwaN2OMQcHyH/QGw1/9HKMC6anMNDSvcgvVBpuNvfNvXRLBocUsaZTRbTp3jC65hmuYDe2ToaDzzbj0PT+STrRlID4eMnt3EqYO1A8r5oWBBl5LvuBhYPalLStZILsG/iiSx6ECqSbz71UxyvQJZPUTyPvsVJ/L1bYaEpCEU5AafYvo3FWBEXcCq5VI+azQuxbJGAmDg5Ov9iqoMU8S4VlI40RP0O9O+m4dByfrlX9GQ0/swCbC6029InD3Tgb259IYP1UwqalLRTm7Wiw9GQbClAYv8z1M0Xxr9FOweShP1U74jHMfUxauyMsDFmcuJCmr9nnHE/1AWkrfMxzNsLdB9ZN6pPNXz6dMKKQVJ749YpW+roxwar5nem8KV/k7N37Gq/Y59/5M/qVZBbIPJuuOnBbA5I38DlyKduT/wcfcbkRs19+DMFWPGf2GH1HLOw1i3D/1zmQ86mUGGgU7cxWkA/Wtti1+uIhDvBUdpKRYUbv5KHe3LGBgWXvSWp79oooQ+9mmUQqqv9hjO1klpyJlA3F/BmAjY8Tk3mx2C3VuSfIi12OCszK3FT3y3dBa9b5sRk+Kmvs4vrMxkJS1NPzcWcTyr1t2Uo3XgKX0or69hwAqHd9Wyr9qh1s63fVSCMsYqdUuZmB2MzGUqBII73lx7dYNV4KCtlMvqc35eJMBatR45ElGF8bzs5akDGkY0phVlr0xXbNoHZ5buCjJt3UJKDbKM+3qFS/FMFNUEn33IESKEiwfxLNvXIEzIl54wH3vRTdI7qdC7UC5owrVOeAb57vFROqsMaQUl+D8ahP7wUDe2CNj0H+Or5VXqRtdcJcO7hgmiHugA4c3UtYEX+mES5VxfwDXYUL9jrYgoiFr3OCwfg8X89DOvaxsHhdL01zX4JUq3PJbzFF8wfSA8hLlC6l1uat3gfbapOnHb1xmS/geEePsd5y06veLzAFqJehgKwq+oVa3OuXMcc9C46biGxsyt0RW8vUymtc8xn8hdE9l+XLN1C5bZga9QLgb8bLXKYWNDqflPtvIu875fNsWR269myjUEpqDSzwKZE3lt3iTgfHgde9ggh6Q5ECduZzVYJIroVDADRdQirwJRq7feJ9GcKm+nhY35ylH7iCY/Jz9Q0Dmf8XOkXcy3eVx2SN8jPU+Ay9o5PI6VPOkbGef49Y78XhwvhPMTF9Al4X1oXu+5WJNL5rzbh8DfL9IHPiahZt3RKw5CawBVpFiuxnRbYUvaih8XihGADrox78whjSqCE7veR+9OIYxKL6LGn/0HaK8hx0NEqW3gdglTpXLQj/h97JsVJTe04KpRFKr55/KYB2MV7s8gbpviZN2EIxbjGXy1bfrg8V70inrOJb53uiqtyRBCPN6655J0Q1p4r6N3bbL45N22cjcjaYsntMQtxMcot2vo4PoGCkz6E6XTIn+0jKdjUByvmnanohHw9Ro+M2yKD1yzrpRp+vLJNAFKY1G72MsilA2s0lkm95VqHoLWhhhg9CQ1aKAHUau2pjNVjvdlsEDwIXYWutywDj+ILVndR006ivdlnx21nQ8ylr2yZfpmMA6x8rIJ7o8uhk1OCtz4wEv01+ofnCANmPy5I9lfG/4LNdv4yCRp1UG1GcjuuozT6kQ5ueiNEWhV7/MpUSesOLeXOt4Uea7neRI8Zgs06f++gKBlMQ0DqV3i7Uj66qKEhGTLHL8zhHvePcOAlPP4I1Ph2Hwtqejtq5MoL9O4eBQ13ydtQCBkXZcOKJ3nJenLc1fgeRv/sKF/dXTq9bxIoJAJNF0Ta5V51gkCUAiql0lT6g6jKA6aaDAW20usIH5vps/WesSOSqQNezimTGQ/ZsmpBNPLLperKEIfKVpZsL/aR+s/nOMPV8Vhu7uCaFqqnEiHAS11lo7cwfqfTU0sHBHD8nHDRuK1dXcHxi750AjSJ2XeIoXz7j8Lqj2l0T9qtX4KaUgdzfhTTQjh6SosgWwutgI5ryL/+8vlDSGNhl55ZyheiYwtQwOG/BAmzsLz/7ePmyrsUh/vxihzmQccrdy/HnJPYv5/NqHoBgS8G26B7v5GqpqJMMRkVSwDEpIv3U6+/nMiOjXmS0qdjnIJeFIjSoLGW4sRNdwv0I5OippF8iwVXUBsdQSaKga76ZRS8I9MFoSdiZsQilFAdHPOqFicRyz9mNlInkcVp8QU46Tt8+BW+OfCibtjT8dm3RtNdlIlvhKBWZXFZe71QqxhSmTgxs7HHBusPE+WnDsoaPv349ttiTOXERqDqFERC40vQnVM4y1qkAuV1MijJLwiqi6HKXfzvn7SRquy/bC13DcxqXFSXO9yfAoC/swr2dunVWgMyYdmtFCdyf6JdjsPaqQR9yGOZeEeTM5O8aIUlwt3l6Rc2pvI2sYfUnFUxVAmUjVNEwLI4d4CXcpF80oUfKySJPS1MNEVdXRBlxMwUYt1L5ThJBkTnH6uLU6ARmmlnWs0I4hslrziLfVH4IK5Xu34RDVRV2RI0NPy8Dhml50ZZbm205ox2/ViPx9K3QCzRqnyr3iHU/IuWQC8Sy7ATeQBrGhin5UabrFuYPlpKVYv2oSfpx2uo1N/jZdB1MMx0c7B7E/IaXzD5OeiBKgzNhF3q0dSL/pBa6VO0nZEnc2hL+Ry7icxlH2lfeV08xx+dZZfiJ/2PNy/jlGNz7Z543hFaTtmnRheOkEkusp5VCPeLb8ZlvQ6EulHlHWX+5okM1hEkHPELPQQ5/BFwZTjmyPugvthiv/HXVTsAL3HXbm0QU/cIu4u0f/GsakpnyKRpQpBzzUd6F4R4e0NAeGwHnbkOqhBTRNxyfy8bHQM4J4jX3OYrFfBtsPRxv+foGuxUrhM9tPelblZb0I3xAvvj+HPHzh23GnfYnBnmMxDa5+wA42ChGzD+4JMTkagOFO/y9FKvY0hVO2790XmMMtWy05dw67K7cC1X8cIGA5LyHwElsv3Iv+m6pqO3+v+mYi63M0cKmB033uvOq5+F4Jm0gMr/p0VKUVAz7ePKQUsP19WJ0mUELjCOY11z1nptU8BmqiFPF3JFhstGrMXl2PxGX9CbhCdFDyWSht0aK62eaOXn6e+q4MCO0nQQ88sZCxB6CjESXm4gDvBO0pYZuFROqdPgdllVBU4Zcv6vWxQvATBTwXYKDDZL+ti8rs4XG6dp8isklLh0o6xtljZWwdl9xjYK1Ji+v1hhF3d3Alo1seGdDCDVT1AN31Gy0xl63KXXgN6VwEm6ndb3eEn2INChC8dcmT3bkTxGe/GtgJidmu3uC0T1Uil6ciPlgA1DgZ7VHh+Mk3gLmASEdNPLAEebnuGgG+sxTUeiWJgQWqrCvniq6LUm9Cd4n5RSftsX8Y56LoJ6R1ir9lUQZHZraGyn/lKQUdaBOMHr9AqpIGS+uZ6O2vrIqdTDSRrYRqRZAePdBHg3E4hzMmoaKQt2tqsh2MdQk4xG7gjyM7bXJPKtWUqYytgItZLLyjP3KMFWeY5dKdAXFAUuLQ7JcNdApIDbYRU8S1XS7aEOkegQ3MO8OshVI+T9xecfBwJTljMtVvYP5o8ZcV8SEhBZMlsVKeTX5K+OmNXYzqZHjP6lBaYw/thMrFUaHrPTwf+m+rBZNdaLH9inqnP54INOHhORQl8jaKT+fmFtjJMsyYtvsH15UgwV+XBwZ59BIJSdubG0r5J3jXiO+5As4gAPtO4Voi+iKTSplnAgQVGSh9C2/joVYSQ7cn4df49PCnQTua4r14ZNcyvIMLCdcPofDI4y60x2w5hMgGFYBCPqEXKwhyCqGoO7ZrOuCqpdfJZX/jAa3iWFuM/fRqqNAg0S5R4QnTnPKMkbHysx7gFudF/3bZIcXoBkYUoHcmTWEiFP/6aGsonnBYIK3TGkS+l+Gl9fGTmpYRyErJ6Vrc3qWWeHgz0EvhsKLrv3M8GgXevYTYUxERCbknDDkBhYWiM+Jz3Ed8Tdm+45uooZtpmzf8WlNtuwBdujS49N+VV2sz1Xezfn5w5CXvJQ9boSIXVCkxYtmp7Q2KLocHlc9szknoBslarHNH1ij7y7BmP5bFp+86p4fBCy6zoC0bMYEjgD9fHU8FDYqXAgtZSx/itglxJ5d/DlZxlgvf59vATw+CzXYjiYDlxHPPpVSdCF1VcOK8L33v9jWvDC9HabIymlyepHdByQI5wRz2TRHQkTu47aatNnQYidZl9yERWnqhUv6PNjjqAZ+jYxb5WMt2ZXpoSMDOkVI6aMe68ljh+2i7sb5mw7lKg0ymdVe62LhXiCZMhc3lZaJ7HXlzSaAQeSDE9ueKo323VizXwUK6l0mkYRXJk85Gn/yel9gWL0kQI6W/g2zzKMTVmoex73ULQ8hTEJa2kR1pxp9UlnI1ID6hfUzDVMt18L1A8kxWqyadb+TasEyNbgfuxbqEQSJsquJBK0saZYrrUcirtzGvlalI8fdwh3Hd+9scfLvY/JSqF7f/wH8q/YkFgAgKk8Kmrp6s0+8w5EPu9688u8SgORfWipnxcJON52r+mfTQA80Yvs7J4TgXRgT9kH19xDXLACmQnAkhqPuLHlqxaogsso6N++enwprjraXNknY+g08JN9khPVdYqs7OSCBsS0PT32p4gSPT0nQ+xUBRxilrIvjCklapxijQF8Zlyz7k8A3/NFgkzxIultTWpXDLeIFnbTgPLyJWSVwA/sqT4ZJemFUMg5zglzBvUPLLEkH0u+8c23KObXs/+X1kwDARiU/1/nGSyBebLuVKuPYEL4Sr16QdM0jo/nqJF8HgURxymuP2tJizNicvUi5dzWPm+QjzouQHxcmeYGkng0DXBEJBIkQlwPZelSYIIf45LyWWvRWHv/HrZt/YI3ZVqiql3ThlZJEyfkvrFqLhcUStct4ZhhuPZbK7b9cl8Y3ngR5sH0TjUMyYDdMjH5HtFfxa//ACg20UhsG59Z8X5unbZtPy2Oe1mItkJo3Gq/srhp0TybzaWsFpVOVfAXlyTuhLik2rpswSkVf4amjfOczVmukXUanamN7TwPagXoyj2QTIYfoYD7jH2KU3mYGEND+ScmmAmmK/XebnW3E4Kg6Fo/yCXXaQq8AF3XANjviX/Vf87sPf237ByOGrW40wOOjk5B1xhBhyJJvlZBOdFpYHDLfea/dPGih0BdLBsfXrmNPBcwVghS5sEDPSbei2KZjG39Y1YcvYah72CUTgzsdsw9go1hnyomAmJhfmqG9A33RrG/m1PH+ehNMa6gvnymoxSKnKuomTDz/OPJLpD6mkYgZLGTZS/yLmlVP1X3iQr18+y3EZvzrdjaot+bvpvYIcmW8IKAfP8KNhVafLMQKrbGdsFbdK6556kImkhRaDGi+dUYycxUL4yxjaSZWJE4kgk+8GBeT6Ymn3DXadKkPMrhL1Pabdi1vVlEj6h65k60EL3KmQmc2HYLt/Fjc+MHLoDP+/r2HWOR+v34fW2y4Md3vjXRF9jyaOb4pPD6dNlBH9nloDv9tV3MOBTuPH9Hejtf/jWq9fDKpQMAz6A7d/mQxblr2TXcKxy+0qWI6vS3rGR/d7RUsAGs2UJ3NnitGyzG4X565fSF3TxIlx2qqVWNJh9kOc6+HEduRsOsIPZApccjqzGhqAHiNeH72AMgipVzH6few7AcBjDO7zcsMXiBShmsoE5fjFBNIOaBEarRyB5ZoS4HAf6y7e94qxqj92QzFCWPsdQ7zB7PWoJc/E6XqGAG3yNuNI4zdZFhahu4ZCVtSf6QRnhvon33bNaBoNjyfBk2vjVC7RANwEqonSNbvOWrXIS3mFA2AJBsp4fHVzPinHjAazLbNT4EctBSWVqq9BgAvxrrEPSKzj6MHSAFG9lu9jKKvZEBncWvNQMe1JIh9l79asy/ckxpRtymENJeS3mOV4ZmTXwA5Au6hjpHFOPtAWnNplZyE6t4csbnXs2dqvdrEzhkl9NLFTMnuT2BevhCqBy1hXTET6hJugRpJCqhBBLg53vu4W2wGL6LJgVHczyDleI1QJXAQZHp5EbYxON5ka1+/NvXxIZFkEz/6S0S2AW4gShP/XzHYqi86kvvSuVC0ge09JENsmBsuSZ6N88tdpKDOZADdNdK4Sh9uVNJBX9bfF2MUa5F4GtLzy172B4HZLJcqSIUtSBKPTOBF3ySZTLwYL1ttjfnN4xHOAVU9Mc/dKPybnxkjHw3bb+8i1yV94MtWTqCWKWghqzmCD650A2UwwBXgtscSfiHZjhMHv8PdqVaInq8WbfQQrPdXGFqg2g2tPDE6ZxraYQEVVOz3hoT4kItVtWP8JUIrnyofn+7MN+OqwyKi4TPA5NF62vQZexsl2Y2t6hLWynGdhZCTtwg8expzm0JYUC3GZBuzkBc2R7GxTmsiMcD1V87CRz4gPn5oqH/HCn/oqaioZC9/mXydwOlSMM2WcgBtWS9fFF5zDWUCErSBGwzoKxMu8m9eGRsSHUoFu7S+72iIZJbRL/ZRMrr9KdD9asWl0jEOx8wq8mIjFqq/Pb7RyzKRSVMgeutkIRxvbOHRJRgU1iAZK/liwgMP/wrtP/mDyYE/ggm/b/GQm8XRrt3wqpkBOSDTTa0vRrM20tTChox5EPEcZOYTUSC5axSXtXABgvEr8ASgyce1zx6MtmRDMlpGSxpW/QRPr5I9jEiqslOhQT8FxzP+VQdtT3mIiU6GCVabG8HnzYH8jITTDcGmVgDXdl8l3uQD1PvFAvRkaslMlBA/uAVL6OcLG7bQydYQLA8mYEblCfuJafofvlq+3hK98ySJtxwqPH6HTB5vBy6bVHhmk4WLQ8Id3QWr8ock0BoMrytyB0DfN7QML0DMNnQ/0H5q8kkMYurWSFvWHmdjZjKR6/x/8k1r4gpr4Kuue4jznDYtUSJ+4HAVs3c+QddwU2CI3UmazGO/fGZpgHaxiYkOCRe9ZLvnrvJ3CbeJQ5bjESA+8KFcH7goH9KU5/8tt6YRt7FASPzdS/sCUz9YUHqhYF5fNTK1E6bl/+K4pZ5Ll6fQXryk+4uRDxZD4M1uzd8Gs/6wqgtpsUZtq747GcYktz85HrFtOmSA5GNWkFbGtyf4FZymaqEaAdD/zZ2RF0PModhvjyXZk8xtbYkspTB4D0LBPBM2sLFhu5REAyh0+Mg7hZ190U/95gQXPBR5iXFR7wUyJTTZNrrBesjE9OM56d8+wEqJ3k9U09/atgLfESGEvY8i9G8XEqg57iAzSp3FSb2frBHxbp83/zPmx89hMTmdEFL9Zz8f31iRUdmtZFNP664Mqgg+H4xRNNYkmIy7NOstibLeAUDflwzm367eDZ0hsxKEtwAo89gufqn25gFj1E3mF3IQDHnoe8N4T8YMa9m1r93uut7kpgcWujrfjNCSOhk7d/enC3bOLxGctivtlW2uta9x45ivfrKVSYmd/Sdcp4vwvH42AwkZlMTXqyKzd0JoOmmNZ+QpoTg3AcprFvVpVARxPtGcpB34OgPvQcEXqBDfAioNalqiMIvAOzXD2wAUa5oR6o7d0HN2dRxHDoMMOUB6QwzC+aN4N3qOU7cLF1DcyTIcgL18r7IYs1vaC2V3qRe4dpg1PdFLr40cuTrym/uWXtmWaOc8jmV+7t/arqWMfCycLudCYvOGK9xmnK4l6pX1BBr9pLRnl+BOlO0hO7HXWpH092/0RW0HVjG0JNjMezJhLhup6px8PHgXdR8gb8UtSbLrW6E4fIb4xe7G3thVTBbwfHbfX4M8V2goSezQECitqMegVd/YmzolLP5RlRPlKQX5Hd9JST5A4WPNMz+XcVIz4hyfBBdlNoRViEbnT/vyfhk7Ag8z9hSr5XqWiMkXNoQCh3Tq2wrAtMjxsOtp6R3t2Gcplu1leYO90TmMFIJQPNwRnHWBJLp+QnxGTEA3Onh/tYdyaHF90tPdO6zWNIz1xXYXFOdYNV2yYERIhsvr3WZRmp1XiErM96HjeTKU/8F435sZjZMQNl02KO/06qqMOPe74KEjzegU5LrauAnh0hJmcwaddW0OB4iEXXAxO3DkV+TMqPP7Jl3pS73u3nGz5cHt/ehcDB2x7+t0uyHYQaY5qoacrsajI4gn1YTB8SAmIjigSMSQBAFB0GexQbYWZ3QNczbCSo9i9cADsPg7QoAgFIMgYiSKMYEIbmdilHVF4nrh71EPWwMB1BCZnzmigw7Mzhl55gSvdTbVSMo1TN5tPObyidJUsccYgWFu2NMXGq9UBRwHDMk9DabJSObGwtg5RZpq3vle5E35SwsUGvN+nCDKOeNI8pbJIPMSqZDpe5sjJx+Rvx6n1nJh92BtTlDKesCL/m2M+bah0Xl3gWy8wLw04EmCIZxgfqe+9fSvPz5przm8JHdX+8N3Vw+MMM18b9UUsi6y5bOiLmn51dUuF44k4MxImv7J5cPjpN6djmfbN7KzB7hFHhN9QHCTfyU0L6j8MvdzAFw56I7ZBh3vTJqTdiz/+wUIp3V+2eKJCv6ZhmZ+C7bwtRFvopos6qwZMKxr4VFSR0mT/q/cs6zhZ/Tn40YgiW5x1sTmhKHW3cOuzKM2JqKV4SXcgbhLZQ8YcZQe/wvaWM6Zv6S4UOVFttfufDgaWTvpN3x6xxkPmstXgkKoVV+NZQ8UeZQX3HrYQObOxPF4r4moZv6hdWlym6YxY4fqjEcksnD+xlcVXXHCbfj+m949EytuN3VDLDSzY3c3GQsMtu3TZSJbiztihyTbGva/TGGvCKPe/G2v8DLsSev8irvIjTazuSLfgy9REBrHBdYl/kT2okRMcUuJ3lwwwE8L73oRT1J9JSggxqoALCoJ0nUea4pKwg0yvVD5zP7i3VBEbyGFVEyq1LzW/LyIeD0cMC40j3iX81qcn/JC9los9wvZLBBl0rB3NS40o7vF1y705UHCOmK8cQlbkpqSjwOMI/XluqCSqRMELMRJGxEwqUjok9W/BneaazpXVJakdZO6ndcRH8GKSv2z1fjNSfyC/2f7WWP49zLFsUSZWD5nuVbcGhX/50zmyr6Pk9C1ofdCpkdlNSzTS+/YECaTOvLH6sL316YeSmzZvp2N6dk+3wrvV6q0U4II2qd03KSxuMNPD48Zau/YY1sMmb2SzaapMVWWONy2xFG+mozjKYnHS3rqtmdXGbf12hulBUxi78+dvPlSWWpSHjryFz264ak1ML8hJCL7bMrXV/sq28mSBG21oiAaNYLOZOp9RrY8Svtpt6PRqawEkCoA7IBh3SO8+fN9AF09tazXE3QrxUTjBEIAH6upZemnK9ug2ap6IEiZiLKE6N0mxobzKGfS/X7LJ7EE7MMGx4+XUqcKukwB33/o7WdvRCIW0RytuC5/pGCqKDJrmEq9KFlP8uuQJgMsNNd1RFdjo8wRAjCnN/6JT2i4ITF0f6/M7d7RmTE2IjbNs70YTf5NLx7tuasmUG+HlUzXpfIRhGWm4SVgyNNs7qOlLzhw9nRkt5OPztI5NBYyoR7tTGxGqPQHNSc5hJFV7oFGygQitqEiOtpwDuAGHFy5+rItqgsI2TXQ2TuKf8H/f47BCPc74ZEntwKGVSdujKqco+0qx2pOSu/8KjalYIJjP/CIreRrC/PSAWdgAEAGX6lxkpNiZEtCQ+2T+O+plmCmKlMNo2nbl4CojA5qWv+eNNWBS/lW9Jw840L4fHtb7YhDfahuR3uWznKpGOgldzZvarN72rlwy7+YEI8PywT+DY33l61T6sGpS/L2VUZQZM2v9WtAuRclmSd8sGYyrwl7kFZeHxeLnRr497UVtavbiG96NI6MHaRqdU5Lck1cyx5B6OS99VlOA1w79XH2dsZSP7d14+Fp86l6JrrxPOVyeWHt0QR8GOjK6rp//SlH6bAccvetuuLZJjU9RaHSiNSPB1lWS34B7lDMQgFLCCKg1bCZ/LiVwa3afjNU6fuII34VDgsVRXmn3qQrvi3PdQBAbT8K1e9gWV5omMhCxU8fqDpPIxmf02SicvQ+vIrtUxiWul08SuQUFjWiKoMVpQ+9P0n5tm+td/q3M+/kSMwMlZ0aHp4Sx383HhkxnotiPlNxkEOpbgFfKAGbjlfdws03xvkZBYZcz1qWzLfj3cBvwT0amcz3KnKWAAPA3D8OrhUDtPzPfzxP/aAsYWMK1MvB8pdaPlibCK9Xe4eZ90JUpcXeGEFcRqwcHEORrgBsiUCxnztecFE0rugFAOJqDeotCybLsxxHJWXlwLCL7pA4Nc0W5wRHBPuSvs9ohhWBh80zzmSi7r7TnL1QpzuwLsJViLIbiRbofz/fFQXjzkLhMPI8KL00qF0rx4/LAQyvuWahULYt0J8b9XKNv59MCZ5uC/VDFXTKObNS3BMq0isi5wEEMWe6ncQBChim9tddOdXlHYhk9fgEYdho0T7QXRMt8N/3q38Fcs3Ty+dW3ACklsCa/17Bv5d+DltnqMyj65SJSOjAaoWWJN2ilCsN61IgvVTY5rlc71Q/DrvzuKRNvk6Wzam7F2Hs+y9iUQfd3uPaGUfWXR/ubkPJiKfx/qT7F3FzhOf2H3Mlgsg1dAhmHoSiB1tEsqNh5RmieBbFDhKRe0fm6zTZ68gz2ktbdUMqfExGBvcEfVkT+VbnGlzcJXHICq/P2WqPjL2HQxYd/2eAYLc1JMhvCDwMiYm91o8nySPZnp3QPE/NXRKiMCvieFP9DI3nZkmzDsZF9Zn7iSL0LnMjA9Q1qEX/yYTCNjyz3JG6/Pq67eJ8AKu82ToUMak25DzCpbOYUHy43EXOQ8sUjMxHKZ05JW8EU1quWFaFDqhvVHJOpptP+rZXxfB1uxE6fQ0dMuyJWUg+j/0AMg7s8yfO4J1hmUxn6gvQfehMmNCA1c8wbiXfCjxGQOzQk01uofKdy+lmzpwqn3JZS9a4Z1j6jkDkN3RpJCzouf+U2kx9MmD52F7k2dKbBjKwCll8rDB2WLMf1GgULghnEZfRkA59PS6hUMhs+ud+k8/C9bHIzTK5HWORr1tMzN6HPjfXPeRSqqheWMSd2MuDpC5O1gaT99Q6ff5a80p9LFjn8FfxrLYtIh4gxH4fVwBzpCnrP/zuJC4fO3Iy5EmziaS6OzUJZMsVr1bRpiuTrvvqyMXge+xiKY77sWpD5FO0o7zhBKRENrsRJWIAFRAVOc6+s1H/R8YfrCReskEcQFGLKAB8MJTDUioyfLArz/YmGPdpBTuDSthMNtKWXz0GvElzcI5uNhvPD6ZVA5mAwexhi+Nn4v4KlQC74vgDUbQSO8SEt+6nfJIA3jqXxj/wtg13ZDm7UEcfCiej6z7AYvNEfl5F71OBvnLu4aucxkg/X3S/avpI/+vy8luno3WlTwepwdEX10Htq3oMQcedM7dCzWPtUn7eKLKl2bbR5fWCgk0EMcRvaS6gYpNUwtktl0llcuMRITkfELl3IML3ePCPFy1DDdyuWsKEssSkrAhqozsVtwoIb+96v8+j2rMbpkZzgTueQTOgUEeTEby2Ha45NPZfVjuLUyLl/t92S9NeSrPAFjDEzLJ290ApPosI9IjiqBPDbDJocvWXJWf6iTsW6+WGVnLpMZVgQwpOumQrhzDY6D89IPt0A6AGNjKMCxYibtyiomRICGIaooXHfs8CflNVy0DUHCJE9tyvZNe6e1fhBhBuyxJts3NoJfWucjJZC5UocweIeLwSrD4dysi/5O25eJxCMP4x13GS66YI/yBO459ufxL549OHmnwse6+C2QtBApa7NmDVz/O+d/eyq+NJquIpSDUlmAA8nue8GpIHaN4f6WLvRx2juewbRJeepdDulAi/Atr1qH9ylpN3v6Sfbk6f6+sRONZdLmgvek+vykGtomtrNU/CCc9f+K1W3Ohj9/M41xte3NgWocEWHvAQLr89aCRt0W66ac+b0r8J9UZF2/ex5yUiPVhZe5GsVFCWHR1lXbm779uTVKEQs9Hf51xW2razjhE1RVUr2oDvkeiErG7eI3B0AEcKAgNTnplXyrOv6aPzNV0+qhQJO9dIcrJobgBM62lqd4tp8BSWOi2D4e5VcH24civBB+1IqmIPmPRLDFm6LecqtrotXgRl1bavMvGroYS19/1RNTkkihDK6RUSnez2Raw8aGA/7LNN4vJLw9f1cPHIbgaT10zq/+OOdINq2nPXqafQHHgaPTW2x42LLmTlN1n1ahBBGDo1RqQYOkLrMncpooQZrW6HbFxFR/NY85o0/n7ck7/o4nuFlkUXw3rGdD87Anfh7LPGXaRQYaniou387k8+O6fLgdb8QopuESe0aXtVBTzlZouNiV4Ow3u+hwuOh2V1i5mjoiBYYKdvCDbDpiKpi8lWNDRnt2Ga5Y6iGCcxC4I3qC6fk+YG5mymHY0CBn4hxCtSiwpLBLaavo+sLNqwTxrxvXj0n7jgR3QHvFMeaUBZUF1NAO9uzZNtvn+fzyRDVoBpPMrlMbEyXtcpp5pclQz1wRDYoMiZEvThc4uu0pP5KEe4JOYWtV8+a2N065aMzl7U0yMX38l+IoiXBsMnSAXmEBAJrpP9v2asTZTV+o4xAu9ZdDD3LCJkgUpulTTSjGjUnXGyNWGFApROa3yQIqwuGH5V9xeUrx3317/d1/T7Bg42LWlFVlMALigQ8z8t8/yqrkh7L5rCsBAzlu9Z7+oGoi0r4YtkJlaYrO4a5Q6ddsbZ44cUa005lYWJLUxU2kSFn4stXsr2GX6ammvsSIu+JfoFO4ojar7lyz+Jn73MkBPelEYOVEQ8lz9EKxTH0zsjHuZFT1yzxmusQn135vuJnvO5mpS41bfuyskjv7+NQ84DTRNzAE2m5QWiDynWv20y2tIKwM7lcTovd5++B7RHXFKoXQRomuL+YFayPxNrCVB6qM4vOopXXdRy69ohbqCEuptDvsVZQEv+WaLT0Q5pMU5DGIKsExwmUzmJTMEnPPuX9fJZM22pMHhQApM9tTR89wTOda6II12W7UfRBBD0WEehbANaETGF0Qo+IQXYQCxFCKX/4S4ss/FvIYYL2sF0WSg5VzrjidrDnlJvpMs6Ho4KuvxpjyJ4TmFvSulfhnBPX0xcTCMUPGd1uZW45WZdojbS8EDRDm7qn4Loi7RDQ+fs/8BZ/YDbGNrjtvlByaoI6Z76WrL0LZ4P9Zyrj9o0lJU4if26K0yHgBzPjDtnxHOeQBbKcZT71Gb85ZyN3lYyeaa67fEXKqsCI7cRIGPWq33SGillPg7x74otDxYaROZEtKJBu7ZgosYEsUlR7XvtpzkKfC8qacSnMO0fbul2F+B3qM5clEnOh2ZL2R5yOOFfi9NKGHAs1kb0DHGpYHsxrXOBnviEe4liUsUoYdMFUcFuRVOgdZlB8e3IAJZkRtEGWKuNb/4f/d5Kyt0AygfuvJ7EfD4Kn8sd98tXNG/mJ6Rw+dtjHG9CfRZdtyoS3tJlQMsHx6nfgYlvB1riDmG/xIXWHTlG3JT8+o/eGylzKUTW0nvhxhG27yQNi+RZ9/Efd2jF3wS+hf/w7e4hdDA1ukGMRv4si7vzwoodlD3MRzP9Rm5KdvSdCE1RWfG1JNsdzvZOSYuM6fZwMivsnPZl4ukfnK/mAhnDOganYq33sQc8d7d07IU/9tqpalvTBWCMwzdWVwi0P+609qUXvmhcQhGyM7Ji7Iq8LRyZnjjoUnWKCrG4ZGzDzy1hhrLQrWHAeQeVXHY7HnHdwkpklWfnylI073TdQ+90f3fnB/NFWBhTHl8+jy6t1C28FkVIwO0dP/0ywnCbcnuASpwb8TPWFNC6Ou7avajzZ4KazeLSmZsIxtqDIDvH2PI0dJvev954CNfnP812uoq9mxZwgF5iqOvGxCia2bzyqJt35U+1V6PqPFG05U/21IjQnKNsmIY/iOPz8UZeKqgxLzPT1sfp07WMD+gdeheRdPLTkr+1/6Pnnqv7fcgOZI2cV5gTfmO+n7T18om3lLvb/frfB9/IFpJoaXtS8v3Pu/Llt9nzbUzRJg4IV+JmLm2okUoVENt8Ep+eMiWdm1lhnaA94It1vHPxXLM5GemJLLaZ+av0Jq24orK3l2y9uZI1m4VFgYTzvOkP7378MYwyhb2p//MXpEpLw3EYqV7X0QIxslI5MrLQu737jeG7YQWsVtyk7dckMBl+3ZSKe7hwgXp1hVBuzOziNOpxXm8dW2vREzOSMNqbkSU/qeh4vp9J7APxzuxNA96RsZ7LE91JK9BR5ErD864E7S3iF2X1i/biCf0frY/RPzdt+mmX1HPjtRT2OX5u/56Rtf2VhYFr6lC6MjSy6PBzFHq01mHqalz3s/9v4cGyM9q2VUuraEpdVJSl387bX5Qe8strp3V1po0NDdOa/wtNZ9Z6PoeKTAs5AAtll4ISrReJY+I1Tx1VRgvB7z64C0/xvnNStbWgy1nmN59hsMltUZPOku3dY1LhzFe8kmLF2aKL3079eivtcxbtWB1tg7WZEj3J0tNKnNR/gt/w++VngIjR+xnXF/V/iOacga0Wh/njjDZ7IUzLzn3MshhitkLC9J9CAUAixBeOCnxsMEWfC8li/XzPktix5xE+M0jWNvoUYcbQfQQKpX2CpMWB/D4UUPzqdxrTHiCCOsm+XgiWK5NUHsA67rkJSFhfoZUmE9nVrPUYJhTN8n+xXDixYIGasFW0t7MdTaMhy/q4rVRATHuU2MHhrOzEi8wBnaxiqNFZA3z+P4E75LaV+tCDhWrrJusizTzUJLjK7T6oyKnos0uaVeBDLkZ2qJUBmD3by++sUBtF9rOdLVALidoj5OPBXAiQXT7ymfuu2z/63xY7v4sVqaZsrj2vPvcvGrRcYKUKHp2HDzGRLBkAZb1MoGhpvlp3GW5oQW0JB7bgGDVhX4n9xuwrAQQuHUF1kw6EZ3GAGG3B0HZ9hr70imX/S2Hug4+dTk2fpAh3Hg+bHvMWH+3DciMdJNQ+bHTQ3f/67WRs3TqlmNjEyIWQJP8aSm8jBNDmPBZBTW9ui2/Ocvc2lnMNCwK5DybG/E8BeMAh3yR77EXpuQS2doYvySvLOtqhWDhUctltl+WbnfZgOp1cjfhtRxE4kkcmthFXAEkdb7htYw2b67xGPYai6U05j8A5ddU6eyOiP1qDeRzfvgEK8vhwayrO/ALJKql4tniR6WjXadB01xvHSu8WvP28NqR7q92Kv5f11LG7zTQodsgCHo7auOzisUpYC6VzcirWhKqAJtKSztr5GYDfe2FjbLDe/gc21NM5DnzjRjVDPj2fS1nqhW7BKkqVz+Z7MZi+TqDMd6VrRdKdPdm3c/cFHYH2RC/rw2t8wil+7p6aOwgsWLbvS6mbvnP11LhycIbLeLiusP52jKTEukwDi1c3mOYBhlfX5EB0t+W5Wu9MaWT3Sk8j8nBpvLDOLiWO0HNXC3enkT0sLMMAwBWSAFb3/lHT6wnoovDTdeu46tR5R9y31QPOeru7DGtqbPLa6UyWvxsupte7fx4no/Zq97kJjLsjxxadsfaZuRKfgWaj6i5PwxSWE3FmSyC5Woo0z7f0ziSMH82rdIrvpnR42FJZ7fDMab9QPMthtdtkmeNPWcN9XlsQImnnUMQCExksaFcDd0xplpGbu0F9bXMhHx9BLU3Fkw9EuLwVlkvP20bmPeWib1LqDzIism7+2WJ3wgIzbyv6Z/Ft+7jxuMpGLImvW0t0i1O/uy9O/0vM7Ifvk2YW9oYZdTEmpimW07Q4mHRh4lQSNEw2n5rh14yEgOMhL3ZpLiM96pb7xRMiqgXSiHJ7kXqiu9UhhT54R7Dpm4xBkhZ60Q1kLSlP32qrP4Rf97abMaPBj1bMeSwjYjaz9mcZ+e4OTa/vlXJCQNjfB0xkFXL/GNc3HIipshxupZZfulxIuLaR3yIfwg1/sVe+uUKcAtRov+bMakFdPBt341Rm50C75Q+o/RjqURDdKi6WK3OfHFb+9TczP8qouoksyD323bsOIgjcsDSHp8VmJ1kWJRM0pDbUGPGLrpjVK//iYiYn32Q/K//Dmxo04Rrci1zbjx6ks14ZPbli+sVg6utGo0f1DQuOwavU7dMinKqZ6K59RF8fe0mntvo34sxLaWHz9QzuBIwe9rajOlPztmPvrcFFAXT8emWtich9PeMV8/z9z+sIOO4wvJgkvhjq7UG64jl4adNFG1ul8Oq4gEFD758gqDZp+UhBb9W2+X30jUUKg+Ndw1fJGm2k2OJb4fS6MnBNu/Z9BsaiOQ/LrkDcZ4rtJhm1Ey5WDsyeUwFSrirmdqyvk1BCfVSz5tfuKseBplfnudjW0t/kBo6MS4GdPx2m/254bQz3658buRW7UdZROuwt3APiQ0JnJ9fXTDTY8HSvwskk3Y8fX3iXgPAOCzVTi42vL8ZwsUlo1y4pj4CN8uTkspH8J/fu+T2LO8QK+/DQ0wlmFB5q8NR6N95FE2V20j/ffvAoHZHab2BMkC+okfnKHUICDzzX//VtnO0GDNzMBV3PXL6IjPyGYI2MYkeB231Obv6CAitwwVDXkwNinxvyGL5OWr9BoEHdJi/jYswvWITyEGnGggLwGtw06ijQ3zFpKPv40rcAjEg4BBePbvx5qOt7Ha8zb67GvL2ZBsJecsSkX2+R7edws/0N1DGCoahJeKBiUldwtcu9NrHjGMk2T61/0HcO+94P3xx0XOy0yzaHBvejvqngSbAajLeb+Gxj3FRAp+J+wiFggl2aVN1dXjRvlMQdUM5uLLBxl5fozu+lqw6+TvV3OtddejSdWnfdyhp7H9cHxmv/Amzk9f+FA8kpDzksQ0OTJzSzMOhmD0Y18hfy9vLUP5I0Gyoq7NHOf5y0dhlj/mbcx+EDXhNDCFgdnsQ+CZDcoOzj3wQL/dvnQKXTeRGs6YnMfPINa7lp0vVed8qalxWPmL4ekP7UvjwAhGXoTS8gfqRfeSmKs2G6vYlQecF8aG3FAVL54NdTRYsw8zgwd08UGRsiFq9wATDa9mKgX8zipF+r9O1iGQUax31DLY7IU0yMIUbsYwzXWLV+ojUE6H5xqT5pyWoF9OuTIzVy/QJ634s3rSMxSQrJ0tj5tDw7jMEv+x9QnquPANHoCganuhvWiiH2mCdIV5PXeh1ZifviO8JlnKeORERG+iRMgHCLJvjDTvWRaIu29CPoUnJFsT99ulZPvcvrD2rOAOqBFy92ahSbzFwQoam3JEKH9eiaOxPs+XVZR1JvuY2DDGB0kfkWH8kL+HCbR6Ed7zTbCnAFfQXrhckWpp8zd/P23zuzl20x6Gp2ceExJQ7n4go1BKyfaEbGvZwU3/Ho4EtVEUGcY/U+rkXKV+8XZN8LDXwqzonRdAqnr89XFpoEK+VUOTljV6er3bRfAAYrS2v14z+//ejRqeCPd674q2qA0v0b2tebTdWM65hew80Ah5a4n2Cd+cW81O/5IVtc2uOeLle+2kUPi1OiQ2NiHR370ZPPifAEuTCCg4I2/AhsqRxBGdbEyAII1bY2buvSE+jVt+tapUbG9CKljfzlmWJhPntkeMlkkxtI9wuSv5KUvM9HrGA72YnulX1wnHGJUxFVT5fb8Xe3txUxbXi69HWyi0kvzGFRBD4Nz8w574TQyy4G2hzFWaKNyn3Hfr3DG2a6Ufb28FHTkDlkWOqoqKZlrAzNE6GkvibvVlcY4XfkZ6ZCAnSEjEQcBC6svO+JwOaAQABqHyQMpWWLppuLOWThacjUklLv6TpAij9zUDs2lqhTY6Ijdva4p7ZMFyeahxpQfhN2gImnSs+/pIq2l49OnG+KI5oa2Ucdxi4XbUnMlwjou/XYGjWMv8+DuHV0DN8DPCdPlaIVlPb+BFqUk7JdIWf7k6IMw66mSjMz13/n5pYvbfPJLvnXdwA0lBGPZadr7KxsSpG6SsgxPFyRz1+EW2Y5mjdbPmLhZ7jEJ8tdHpouLYaYQ4zxdD39Kc+GzB8wGOVCiTJtiori/893yKc6thSHJH2oPuqabZrZ5VLH84PKPq1AJu4lazEMj+FwTvuVNJSL/dTAd+ok3jFLtSO/HxxRRHvXdTE9ftwvCfl8l92w/gZHto79dGAxXqcScV8wtkb+cHsIUgR/3UZpqnDy/mm4WtfpiyKZF3x9I6ZVN2tgGVRnM1jB6AK/6bK7c3wY1klEkQVRI175SvCXZN6eGIlYzWVgJ/VtkpMwl3zdiZZGyPqVd/azQaMpZPWXGP8t7biLCx7d1DEN947+xVmDjcJ1KzUW5oCFp8h3x8SbhRxR/chtLiRBGXTs0rhIpXdMqPYRZpgRAtPXQxGycLsJDwwsMYNpZCLFgSJ9Lit5xZS65k3wq86Xq+HO1EkG4gwZ6rSQL09q5nmz+5H7E4bnwFXR23xLAdNbuYe+d4f/YKtr5SmcWXbmrBTR+cdJJrI3BOH0Jz+HBzZtCMCU5GiNdf7sVJq+JcyBMezqYZzn/SxRuAZqlhQJqSAYPIt5qZVExjmZU3xdPL8IVNLu7pqqPkH1X/wdlekAoQMjISW0OPeM458lRykqEZHhDRRqKX1Ces9LI/uIoHtLY5BIXjd70gXerdaxhqe4ZYLKTdIw4Wt2m8+sABaJG12nfNMmWIEXiO/ISqg1HeIirnQ80GSnphFU2/N7YnutMOecQLLEoFSpvEO+2XZz1U5e3QbQnwHZEob4s5/abr0DRnw1izwMuQmJNdoiJqOq59Nzm4TLoL7lU1441BHrIYc8YPbgQRQjoaTE1Y48OiazTwYaKsMvSekba/eK49xyCI+3f9DaAqzTUvfH18c/C8iqUFr3av+stntEzJhblcrb2cMf7G/5owLbmJVtWFNTLzpB1lcS+RiVsWclSzY+0qTJz/Op/0FbOZ8F6Dik2V2Da6IQnRo+ooTMMkwGNe54Qbhl00ZvSpYPgKDc7qojYzaPbz3MSX9RWzfJ1ywmYaQaBagrv60769x9Duvn0hh8o+MPZ45k4FT4QxuWt5qwXK0DYM5rf5oI2dPYhZHVLMbwx/m2O/ee0QnfsuJppCLiSk7o1LVkJcmloZeFSaNYmW0FaXdonUBn/+LTrv49g4zBaff0USvtNXdFFi3sYcvUkUppumlofbDbamC+etBJeXqxfR5OuL/6zCbMZ//DuRo4Hjvt268XIFp/jbSCJsUh9uhlgxd4oHkeofCiaIREDBRbry4vzz8+fO19dEr25Uxpl8aDqH37J9oJagi0VDwode5fgKq0M/METrh1bWwE4LRieVyYbxS6jWZei6wgdP8TUhfpzp/+Ew1JAGq+dDxRqYYy8NvmZq8Lcg9sLZyndBdHlvaLxzLY2fB4rNlc4qlPanWmVU5jxaVoflpUIypb+vMOiuCzhvYjCaAQr2HZln6Ikh7eO0CKBCQ3CKwczRff25H2BNvkGc/WBj7QCd2/OMY3qgLlOMmk0roTDBZG5ip7Y/T7GGntSsp/kDfZ1rGZDuvo/yu/+vdDMSaUcLkdZiYd6AZ2weTb3nb4HbVNeY30mDZLFidDz8A7bIbaQsrTkBbQ/clkAX4glSoTq92vI2mdixFAFVtjeycUkBDIjPts50tlegdPF4lgA2e6gMtq64rKvIicwwpy5lCsr/36vcRfBrptT7KOqlNxEReB19DbFiw1V1Vv5sXHr3676LdENvjykO89k/BGJwFNbt0tQe29aIN6dCZojI4Lg1DoyTFT1XJ54rKlLqHLUms88QgJs7J31r2IUNfI7t6PyljZW9+dfvYh145lXCxZqx1fAxRMwnxk5qGTAeXIHZ9QMHBZOqo98FN85R544R7KYvH3XQId0ALNX1uDht8tTp4nmN6HSRHPA50Mxnj9IML2ANlzShmxm/jF7CbB/1ETR3YMeCRxXYziPqzzCxsBYdGjtLDwYIPopQQhYHu4KGp/jdyfGBLkHam9fTeRzjpk0dfcpR71lLWxSC9Ug+Up5I0Iswae2v0xyWijaiFk+sDhasKS9DA5ouyqEX7lbRxDkvNpxDhWgZPkyvXEbHvQbgnB+rnww/uFtxkOu95RRM2Lw7mj0wW333TXHefJrq0Osg3XWJjm1p0NJaFlsndzXS8lgao7esRKV51y4gETf5QSM2Y97DS6Mv6I2Z+btVDQl+cxV5z23gHRlfdAjm5760CpGv2fRcpRwlgwntooaE8F6vwJ53ImTCt38T4hnJSDMkZm5IQEzdQQeCDkimTsg5IZTeOH/rcwa7Le3jNho39/vB7YQ4eLueu0CLG8Vhot2SlZ5iLYRoVsuULYsToPV8XpeXlOnOLVrIZLNVsyGljbszDduRq8ClSwvv+y2f63eCxp28MMm1IIGx/TbL8VAkv5qYdik2b5S5dqJ2ekZEV4ghCZEBYeC9JvQCYnrtfaZhNVEvjC5/E+VzeWmzV+XGjJCvw0PMyisURBuhGUt8lrGm8LXji1cd+nM4oCFyfm4k9xMnA6nqs9/bpyWoNi44/oVWI5ayWX1mxaGMvQWGo6jN+4qU9BDuUlP0eGvjhNjTfG/UfxaC2jtPNyNQqF8+k8Skfp+sqKnnqP3z1UxLGudj99baiJzDEqP/Pd28SVmBvlWbHreHfmxqe0NneRND4OUH9jx9CDGMEvaLnxM0d70zVunkgPT5ylxgiBGxHBas9gDJmfQniv2Fibo/LyZ3T6Y/mc2DYp2kReyVfstliHgVySRz+t6QvYJJIuoidM0mKvU7VaDZRn8Tndg93tP4YF0al5lc+bLX7++wGWQfPdOkIaToGDXOTg7+yxs0H1q9HvStEBra9q0UYrDDQ8buswWJM66YwIBrM0G3nHNI/KNvQAd1tDBVFUj0baowwno+PkCerO4U0N64dIwqyir2OyYfjoA1KhXzq9ch5lTsvbF/hR3pwNxYxGRAAEY61q3xjYHmA+J3GMTbHF2lRH/cFOk46zN9ohUeP9qKQ+dWWnEgY9mbjaaKQBk75hClW5418unOoJs7eDEeur/XjsBCAPm7Z4cCQUgyQ7zzw9R3Ly29edv8ghMBrsoLBohzt++4hHMrJx8QoFG4h2L98P+ee855GVcEtpcww+8yfQeA/nr0GSNbZoug2YdFdItPEtFKoirmaLYxN3fwyrpOjbdYIEiGkN09xwaDRiRYzJBu31IC9u7Qm7e116kvMzoM8288fAkTptyYTLZXYsAEbz+Ul+54qTcEtE5ghz9hOUG9TKJAJ07Gi9ilkmZ+TQ9/AJgXgwD+LlhYC1xakUaKuodO/NAMYN28J8cCIM8pHBEyx4fnGSXfX5jBJC4KaoMpYm5uj341UEjo9qKDAii5VzBfmxcFEI/5HuwOc/lwMGa/xbOaf4yJxCXePkVl/PAwW/tvcgTCGDUWXXOI7sie7eNlWOZyN0yE4cVNitQE9CrR9hSddj2V0shZfl5kRV0WafNWxu6faJKERuFMEmKuAUH0pHo2wQcHMNzSSn5F4PKy36e/mbixTktgOA7XpHusltUSoVfNNB+c/INbx/U9zWVPemD2/vGwTjAa5ckzTd6vftt8PRmb24pDj3CffU1Pk6lMYAMoRsI7vTpU1whhFCUOVmCSGRPrSCKAQGFhiD5ZgHcIhK71JtZpDNLUh+N1zoVAD5PT285D7SeWg+h+vXn4K5H4s+R8z0D4XO3tXTSyabVKSH0cVLAe1bAOVogvWC9kU988DyWYWzHZNT75hq6oFFY9vjyIFRqBMG41kSqs+UYgiPAyAGN5K9PWIFC5EDERjhJLhj6kHeXISnYoUgtOCHw/oc27vvK8z7nVFM6Mv/2jRNbA0SaqSMheELkfoWkUpGAZuQwGaiAqt0HMlKt+HV1L2Ek3EKyP2RPC7WdI6OwBPA0WKr6RAcokMKcRUsqspjbC1T5AQZZJQfETIveHlahwkodw6UHQINP6SYxyCAUaEi6aaHJVho/zNAh67C8gaLzPqW0ppQpshOUk1sOmeXwRBiiNyzp/Eadol3F5m2Gm7NPnIsFx27AX81FtBcZINR+nLvTuANdd6cY3f0BVQPxaacf9mzStn2RqPXwrEBb/57CJQTJoK/JNPdsGphjM5t+hVHNBRL1m3/pKoj+3C8wKddGVDwc+83Ke1jjP6woZGWPspwFui4p7BPENFZFpFviC8NqbVYqG1pYDIBMU5k7qS7645HjEGBNCIAhH77pmba4NUrVfjh665w7aOjmMtguC9aRjyPHzR2/oSwtC71p1GhiYagQbq1Rzdp+c8zNZvZt8Pmc1RoyNKyuPkh8lf766ULdwk0gMg0WgUzN/+s13GsYtSvrYGZtuy2p2zu9Oey9vldOxf/7rdzykjykzmCiyl0ODY80RvzNQdfncWXmh+up2qZYLh4D92QamtNLlaIKc+hKw+Kesmm3WNqLeNYTN3u4j1z1v4P08UIMEeowQIwJMCRp7Z6+4raf3dWZGiHPhIFaEFObJxW2SrRMHL7da/JuKDu2gEn5ehaqN63IObSy6ePv+k9yikLKmVbkrOQ+WQE97mLkFlkr90G/Q12Mypp72l9n7kc5sKct7ZWoxGCexElcNM7jPpdm7Qq3binFu9jcy//jtFQuNHqAYIkN6kfUkbwr6ScilNCzYdKaAYM4RDIGDwS3Fehv0Xccz5cb8jDdOtdDt8z6TGu5DayAGtP6YpmyUQTQDqxqH9KvowsCTPJ4Bu7Lr+xMRVuUTMwpSHAsUTB53dVZ235vn6wvvO8zVGXvT+MrWfSP7F88SsEeCp819pd4Kxbd9kQ30SPXolNG3KrWKilutBg1Q1k63Q1DDjLFsMBssAkCwWNDPFvn6vaYdCEJIG4YW/Y9k1yzyTZ6wsna3zSN2WDX+o/hX2yeuj5v1CkLEc5jONlnbp5ykIcQ0sSjUKCNHTV0Kjp2E3R5NdYnbIZQ2wUQpFa2iAWRbj2GBKlxpqwrNzGFjV54oEu75ZpQf9FpF1skEjKD2VJ1zsskqxRyPFExZyoqsCcVN5oPhksXmag4J+awAsAIGAq8KEstTg9UAEOwougvbUYNjIkL5GIQQIFRgEvvg1I0ahX56DAZqI0E7WM0Y6/RjbAFUt7FQJtQ3w8OflZO66aZEUlNfUHkEuh0GEDHWbolLVjHAyUkCrkz4+bcL8kBlt58eJjHgJSN5vPolTaAGscISwuaT7EUeySgnp4i3V1MpYV4oWWRMaX7gsq6cNTBylJkqBbU4ICH2XnIKNyUc342xcx5US9FHCyoeYdOYJEpi59KdA/3XtK2gAeT6Oo58O8Q8SJV1vshberNkKDTMaCbPJoI5kA1Eb5z7pSfCWgKXg5M77338BQoA8PuZfUfH/j0+sxvpRYzQ2sBWlIqkk9U450S5rlBiJ1GuL14+mLnOUdAd4V2OXeRRG+bOffTqo6QS/pZ87wn0kUsy8/Mx6oTkNv6WpBLzljwcHhup8SK23Fu0zFGwLnPQU0700UmsVFjHnujkNLaTiBQzEig3W2aqG9pbZntvETfmK2R2SnA7pmDFDFSAcnUrSJmZUnHop9wTvKLa28oqNMJGRLCKcyDt6fT8NehftL+y5Av+7rxx87hA8+f1tvT36IyqvGh8WnGbuNF7S8vshnbQD2GIoxCPtKV/TCEHtwqIERZHXFW3I2p5j+X+dKgipcEHWPVc5Yz58bwR/ieO3GJERAv5B2zp9Z/rmwEHxUOsFWUapLisWuwrcpPlH81NF4BmM0XNWtIws8L2GQz9FiYAOct8S31jK4C38ohQFBZTnXcMC2VtlVdVGlMvhZK0oDHPE5XXidn09imoUHQ+aC7yAbxrsGqrcO8CXbHovrAwNw1w0PiQtw0UAhAEeimzNrFqDiWbh+W8ThcLovkRLuMdW+H0LfN1okmMyA/hZ5Js47BKSqL1qhk0m+rmfi5vSZauEKlyXDJkIivr3BjVkrbwhkos9m9cJ7yjanCY9tBoY9D5CAG3z/FnGbHcwigOOQj3V1ZSq2Zh1ZmJyaTBLvaxlNJQTiQzMC89SKWMhMsAIX8y88fLjC7H8h//76+WAAHYJGq2iCpbz7m4meKxTbfeAGMgz/dMiSu0rw3/u0TgCjtNuz0JreYNz/zoeuYnLmJsmJV2oDwlDFTdx9toMlzAxDHnPy9IiyaGlJVYZx3g+h0n+qSFEzxTprEBhjeIdRvmtf03LXq22xahRBMGJLDg3//GLUMvI+bED4C3HwFmeGmGRIPpeZkNdkuIUsqKfXbSkJyYSapXzqF6K+H9MAepqzmqMx1bmWIgJe1pn38WLIInnpo28u6Dqgq6U7b4SeGxnPRZasjSN7TIQk/CiKkznBMY4asBjocJUKm6XjYl256W9pPO4FBc6ZXRMpZ1q0MxgaqAFJE4vViWVY7cKW2p8AAIQL8FrKZphn8MSz474fF0Mu3uRScYqN/uT++iOLMpGpx0plwuN0uIgzXGeaQ8SYqlZZ3E9M6QlsWAVVZS5BgPqUnLwk70boiPfaUkyX/kLlA9yPk+NX/+aVQIFt6/0Yfe41n47uMfLl8B11+jLXmdfHIyKE2KTWKr83g1MIekZtnRfcYYMkWEnNbl77f3I8JjbSq7OBL3nPiqg/OPQWNXQxY/BAwDmE6hfe18TpIiAVBlUhxWXcZySaW/S3EY/D+kpdmzZVOWJHNhAuTtKy5cuZx96x0jG77tc9v+8KCAn82fD44seV+1IPdvb+L6LD62QTVC1DaG1IwXORJKAPtQdNg3AdcRv1aSM2AKty4WgyYwUpINemhmEO40ZJLUdRTfNoFMQJkE8arUGZfMXJPAYBwm7vgxNrvNQKB1udr3pICHC3KswcMJXL25WmrtS+exZXZzspwuymupcFjSBmi8DmqS+oHelyWaXvvCJ+4EkXeKphViTypm/Fta92vIu74dKcTTUTxnusU1mhJNgoYlh4Ro1+YV7pgPvA85zTmptMDDKdXBKWWxC2Gqe7r2z93sxYgcopP+pBoImq1gg7FAC/exxXQ52WwvoxnrqsT2/hy+UnbYYM1ZAPOmJ7We5WJIgm3m8d+vSI33revI6X47bWeopPKIZLo5gecVVuG1db4E+NW4FPRkl4AR0GS9rtUUtgxEa35ShxNSjZ3/OCZUdxWrdQoXTo0NTknhcp4C/vI2C/Mh7w/cMTvkU+8JD3VwgqS65IhrjYDjwaHnhSm+74b8XFr3b52ytnRioejOSMat1OeTTwUiI5JbbRatov/2iZT70M68IkdCvr9yKwfWgZQ2QjOiIbfFkVTnBa5x66DaZNANGBBzU6DKJ/1jr7CqklyZVDBZj9uZmEDC7tnQtk/mMpPu7nZnMFJDXVtL/MuLp6j8o/kimXh/SeO5lPt13j1SzCfNDM9v4knBg8k6fUJCXWreCBhfS7/5x5UY7B9NvDkJuv1ma/8rqMa7J/+nJ4PoAztY1aXwnTEV8aZze8JiGW5x0QcDdeG4bhG3stQi5j1clEyVl1YDdm5CdCQvVVYXp/urthkkY1No4Uwjj+17NP77fTi+9hcNkS1tc3WJc4v9y0u2mrp8hfL67l1GcfST5dC1u2WBcYwPDkwOS6pkS2qFNfK/kVczm4QEYINuMIFq3Q2uSawzOixuNGTUuLYUAOsMyq3+bY6EvKKd21XatE060SoKneqUajdVVXQ4RMypdHIXqftK0geeRljr3WExfDNeMXHcnXB1Kcu+efnghAkaUPNda7982slJNxNHqw2JsX++B1ZfQZyVs1zJlZbFDBaRU7nxsRbRlt2ukHncDev9LH8TM3E1LmMWrSiEvTAWi00kd/jokBUzAy/QuiJkBzoS+LNElOY0WNK/DONoO7Zqjo1+olrvCc+Gz0kE7KKmGb6CYcEUrX2dzwc84cBiZeagHoL0HyNyDtfeWQZ2PlM0Z2Zk+ORmeaJh+hszrKV5bjTrs4hJadyn+0vTYs3TCpo2SYzJWpiZOLXGcq+1zpFLHHpW33ehfbNVLaNPd4zZNPhjZlHkez//eHV23deHHnpSAPTzUayn3IEljo/BMdhbuAJhsUxXe4n8TTTuO7az3WwTLWOVuDq1vighppRwLbdIcRVyk/9Tu8dS9KM/gIHBQNd1WxjGD3zWSX1TWjh82gwBdWHB9hycXRjPIMW0jXLNitspV/Clf07DFJY46U/9CKp2FNtpL+gzRWDu/7pu9tUff77mSXnI/HhwINgxna6W2YIaijjuF+r7nvXlMhw1MSsysbgh2mKt8/pNWBs7pf+X21ML6JfQ1nJr6QxoUm3EZ+AXlfqMzBzFq44wTxYj9kP7i4OldirdYqomsTD+S+uihPZCQ5jZyNKYr3pyQ63OSMzyIgGaZSwf2WNQc2lU4W2FlJGSC4i0RJRYeawBMQImWj5m7rE9DxiTLFMc/aU1G8Foa0RShNnAsnVMtD/vEOiGN3PGkOsh1a1CuBl2/IK04anMJwtuX8rQLzGdBBEwrNKcHdaBRO8yeg2LQXOpX9mmZMq/2nYLd/MGPgPJ3Nh6Z05As1TK1QHmOU3GtBYaec6j4QoqSQ8ZalbFnmaDoVoArwcie7hJQJt+ac2mOTCDcsd1o6HkVjOp7cQmwmqcW5ZYMOz9xbIwV8LctPoU3lbA8/H4KKzW0As8BjxKruHDDl/bkHJHFC671PKkTVQpog6FDGYO3RxlfBR+CiLFxhHUkGQAKYcTsj04bVlGGYF24ZWKFIGux1ff5uW4FR1S5lRlZfP7Cku0V65evnNd8bOoqaRR4k8i3RPG5//nkMkmISueiujQvMwxjn7i/aWzeFO3fwz/HD8dyJ+jCc/8PJnrSyUcxqoH7QADo1+wcz+YmAjdKlNqYBFaErF5J0LEw84cczwtriTXXFAucn+jaSpCm81iQv5d6nL7RKgVJwQi7IhAnLZgIGjoZM543f/h/vCr4n00eiRv9bq8p7TW4MlX0bOtZeaxTV+F1y06w5Wfvcjs2bTSyK2Gqse3uJrzMDx9ZOJQO/mKzaOlT0J3X5ic4Ez/8yPR1cZ9xmhGeHTW+1Lue5yrKX43UufkR5I4+tkkwhrJmusEE3l20/59o79AzMZ8CM4Anoro7f0/CM6taae9tFX+753mxvG1xIWs6b+emMsJq6KJUQxBWn3YpzMDG0MbspFo5QeLaNzyOXM+vF7fvUqDQErJ15uW6QqqPmMdFU9DwzmMDHDcKOcY2y+abYhYOibRtAdwm0UcZNspNiOqawOnrg3g7MC/fdvarL90CGhexrOvZE1tpYtond3Z1P1MJIhxq2cMvwUTqer/9KKGEarnrlS2VBemF3fxJkHlLC3VMPT6cpnCWXOba3EyfXb91BpwrfpOk815A04+cYbHP0bJYoXKFq83X4W2o2pkEQPrKu265Ta4Sxin2YWMp8Vj/aD8O+aBz0zNrOXmTz+1sI3cVEmx86EeCDJYMQotSaziu1HF0JSVcxBGQ8yPYLRyVK/wONhrZpTqaQDJd7NKzB5umZAY9GsA52Ee2HRDlyLPJaqesA4OPwl1K5vZuC6MRclBiAp8RYC2eLBgP7jI9zw5WoYnQf60j1MbpZchFsvYBn05zIqIRNjPKcKfRjgcs+5C70DzLL52Ed4D9hkjhQRCR4LE3ezWFqQ1w/UxiaHBbHTUFk+ikUq57AGR3ZNOG3B3aT6tJasgIv/H3UCgaSgsbfjwETEbNSFZIbQVQ5Ziis169ALNszMvSDWvfnGArd4u0oEp8c07wHiEcySw3RzMwg8H2r64q7qGzemcSPCIVXL4+I4yNNzIVNTO/CjenBiT/H+aTYeg5KZo7clCxa8XCG0ueLbuEHFVXu6MOG2wj1esYz7bocoUTD6DuovgW7mNyuA0S0aGmUieXQW/bMRH0aPsJAnpyOlpp79BSfoqr5TrgEdW3qMmDpDjNOFWG6oZIAuVDwURRvgWTun1Lpss234VGLK+/DMnz2+7dCchvuz5fAdB7At8DxRObVmx9daAzUQhBiRLss7Hlq9YMrHpVK8Pc5ZdcV9H3qSBbcbKvOnA9jzz9oIlBQ1s7n/+i5pU53paygv2andT8Ls1h5YLxt7iIy9wf/Qjp+UphOQViqf97ZRszP79N9fEZdOSRu+x3wvfSy/4fsvAn8BYlcLbA57zIfQaA8ysjUNyzdS0ITFbHFXvgGj3R0YSjSi5Geh2cpyYcYsxO8Zkp2UAFrOIIJM3CuPp00Spdfw0ZjvIZpIzmUK+uN1S09Bl3B4kZ70fytGc4ioYrbOWC2LKaaW97sxPktY4BqU0lFGtifi3NfqHsFEbjnorNBnkc+b2mV6cdm1C2+RNNR+kHz4OFn2IF+twjUlSJFFjKSGiLCVPwKKMVB2S+p0Sd1jJpDpzYCYtbg6Bx/iFaC1jnRFA1viFhnDcNF6JzMQG0XbvGuwRg8PSgeeztZj/FGIYMAdixlEgI2OLRWSk7tTa6Se43QK8gcKCYIEopmgTBR1C2eQs1gSzDut0d6JlWfJbbjXTtVoU/S5Ml+PRXC9uX1SVv9WgjW92h8wLvInkycv3tvsVRrU8xxfAy9vg0Q0kwAGS13aDnYVE69icQZPHUREhswanLFoMBr832QhIoUPnnEhYEGFjDV8gKpK8ZoAhwtlEvgqxzjEKMoHvhibujtmz85AhmDAbyCvMZl0CiiCdygITSPcdLJqNBWbf8Rvzm+zj2/3kEvc0U9gcneDBt4jA5C2tjkmCl+jHCunSl9mLX+Yx+IMusmA2yu3cCWK2mrvC5xbFt0T/Iw38z6wNILPhKdiBZPmipjFUgI13ZIDiOZ3FtEa2lz94ved4/UbcOupgb+1kEvWzx6Bl0xgzkJ1EJNcjpoEG//uU5mDcbJZexV5BmK2IpPJkUa2cvUQ7Ba8ENs3xinsBSNnczE22pPlGI1fPUefy2ueVKG8Eb0GD4DVoAPJIVsTvGcr7J5+2der2SGaCVEJoLfv+9GZpGnxfazE26fe3T6cWUhOCv4nfS1gIUja/pimWdC8pu+ehGayrzSUQA+Wd0rlUkTtz8ogspqT6OnFRsMGVcZlZK5q6V4lSal7O7amfv0z5XuKALwAEeQm2ZpwtqpowieApryHONmCPZVK2ZDHTygJSXOHWZnkub+LuwjhjsIh8EO4DERFVmIxvmyG5IS0gkoyOK6cv1zmtpPCYIQ2PVZu1cxyJ1uVLdMtsZGYpO7UyZK3+ab5Z2JSXtebYVSboUUKZMAKDzay6dnf0pBtkrWZq5bQ0aAwHOYiF9A3OtSe1dalR0iyBlOQ889m0jl/oKUJqU78ovnLRHTBxq3+Zv3t99Ohs9XG2052AfMx2AarTRUWsn6AZE8mwHaLgLDoZDPMCkaLGpPxJ2cnv1CV7FpcJ4r4JT/AhKoY3Ggu8vX9NSAj1J+PslK67HyYuWlf71NpnY1rECkFO10qXTBcc2vpZ3JSMCn0w3UqrC8qdge9xY22lE6bKpbHPaR6hrilJRcPQnTTkdEa/qUKc94+K1j31w8Lp96yJXP2vd5GzlOlkNsbpYEoWmdLjC5rhsmW+zCFfD96OQwKwedwVmKR7SsJ/VtTzO0u8HNPFmJb85pe7LNKpa+k3wpRNyQgVn9RjHFTHCDHphH5snCunx7m+KwVTTln72I5U9nYfylJ2olJ6/QzhZxlpdH38czWpV8EcmzHrx4SWYvIHrdl2/a1FuiZ7DXi2I4V5eF67t4v1zlzcXLWRIAhrm9LSa9weUkq3I5XZk52the/Pk0KdqtYJlSULXeat2AfU1jUgbUsWOz2QkS5EFk+T5vLmSg/M8tYny+QSnDw1ToVhVefZFb/PkoNJNfGjCA5wzIXwyP7bPp+q4ro1/qIwV2JF1RLzHWt6OyCxTKGXm2zDNC79Fd0E6wF5p3/unKLQMqU6Vhkuc/Q/01kFiGEbQJWhziX5P83uFC667Ig7nDNB63yZ7jQLifcOOGK//x17Uy/Zs0RzNA4UGBOvC7v8qWtxRaF40+6rFJvztqNHZRatuYF7PBuCDLsyQ8q5LUn+Nt79+uiq/F0ItWONWxgGUzc3c5LNaUnGcGuT9A22B1gZb3MalngjqDZMWEnr8wYUYJfc13JuhK8X6kplR3NCeGlIu2qxZBo0OIuLRVT90ujdrpfuwPJ6xo7I0UVL19kcxYiEkIaoYt/xX5apsEQydvcqHG/CxQia93qNWWY0R3wcG+2PXQDh07I899ifgH7LOJzkXwL2yh/peBHdy3U37apoC+eRCHVhRjw5OBy/pAJPwnu8vYprYdxNLNPViEglem1xxQtvb5Bjm1+qWvv8TB7LSpzX340rPRBYyhnzkUN/81QlYq2FR3/WTq64NNOLKFh6/mKqs8rrXYQlOjG/WlORaNKod9G8zibg8sVB2dbAmlj9T8dwo/QM10ybMJdoGBxvmoBDyeAGkJG3WgUXLQ5m7gRxI8pOQE1TV3fXQoXbZz7v0rblUtVJS0pFqa8JATKnZ2aU+rBCc4XGFUNYYgwku09BGBXDB3zHvCDGtBQnW5xhMlbHgSKaZHZusTGU+12xaQckRVWmbhZPeLsj2HZ6IKL8AnWX5UG4Ue1jVu0aFL4QprGRqA0scOXVw9edmRuB8RK++cX+Zx2c8Fjyuoeb2axdO10vUoAChdPTaDWcOL96LHP/LpRz8846zb9v4xv6vO6duqBLxOh6i58i/nd0x0P8fLwxuPxmWfQiq08Mvi0wf8J9R+IsefKHfzO03c7VJhIVkI4R67K2qCZmzkVfhHlKbDnVsxLe0Ocn30NHAjL+Zs90MrV0MTlJ8h//Uk21ZCyIFarWvfUAADFFJtB9nSpJWoNH19OMEgkBb473pkEBeha5I4EyPyNNzG+UCI2IL3wr27Ily00TofUoeWeB0Vvnt1hOUifGDuGq2WFNaSCpVOIThZK0He4RKuFnNRLgtK7onMx4L8ZnruD0QYKJL4qcIgwbnXQQkKc0+Ak9bKPO39L91Xquh3W/5F0VVvFXYXYW3/3ZXiOrXO3uVHiOq9PTlQUOk7pfpK/5dztgnuLgvgzTuNttzOOfkEg+7IBRaQuZ9adoP/NeZqghNJmJP4ELI/8maJieSgwV7zrCop21MscnL7mGP5wMA0sSC83744XlDUYodRyE4e7WfQJ0DOEGfCw8CgcSg40iIY75wrfefBDdkpWPiXCRYdGIyRVOD5iB8CnhhO24anKZUxpIVmTakY3AO5tzc8pXa9sRnAS0AwJ5o6O9Rm/K/en4Kv08rwaKi9svfwpEMkc2COfTNQ6E19qNA9qKBM2WvD5TT5EbNnFaq91xo4p6jdKtYfCLJfJunP2FHXXdCQi8eBP1XE4mPo/HOQy0sBu7mIHIcrHzfD4q5la6+5CjsGu9xBiS492hpUZSL1G7Fk7nJhieK1Mlx4yUGxj8AvGx4N+EKXbT2lyact0Stroq6Xo7f3FRJBxydxbsp7sbUuMFUbRIcDtkXRjxaTjSKJYxa6aWxWS7ZoE2ziiWsCwSj+8sope641ebv5EVphjCDS0kADhWyMQ+P+Pydyj1tD/5bcue7wM/Z+aND5tEIlRForV3cD2z0uafXV7+POwt1JUKmj1NVCmsEzB4HGDcOhjAHiNuj7kzOErKyG9w6Ia9R3mH/1m0EKEVBS95Rz1IODePUP/+u6nW9Tv4WmuOP3fxgtUTDFixkOouOo7KHWogJ6d5SRhSJVaHHA9T3pNZdQLHd4Lh4uDabSJbrXy9xc2m1L4SKJFPFZJXbukJL9WztRKxK5F5Xnb1RLEyuVRPlQNs5DWDp59Vbbl9ia4eGeBZTmqezPn/2FSwztvWp5mUzTIyT9b+s9rN7zWrTP3BHNPMJWb8E66nE8KfcsSHO2YUMGKt2eCXzTeh5YtAB6j0IlYq6bVF9FEhXl2TIS7zn6Lo9nuTTl9YkpzJEZjojcMLg3o1z69Sfh1epEIr9az58kLuo5g/thf4zVRf7hGMJsd8cqTGQ7WNKRsldSxmYYrdvCyP/tgaRnuXPe1LMT/ycnfn2jHGJivNbQPz++zOWoqleOS1i9biyUfeHz9h+SfviWmNtdrZM7X62mu7Izm8LL46otQjXUM34GHAqaehhzg0A0BZqUtPHQu/jLJklFjY0vughsZnPnLm31yPySulNoHknTWCMbVHOnmyJhZ/dTseKpGEReA4x5L8M4xNLIMJC8n6/liwUDb8GQ1cAqdKPoyygx547dTokRtVstPOuKocUAYeZw2evWiIywoi0eVoNHn9XR2zqCCsFODbKIonLSk+ZSzdsh5Y70yMUJtM+1YHXmWo1pfmgw0CBgTaRFoMEFdlDgHpc0gFMAcTRqkl4ilV7r/akeubImm1QOdQFttuK7WOmLwikz6pLjnT0K5gkpw85FMnQTpA6+PqCndcX+NEBFRTXP3Z6zV7+9m3Do9SRaWDW7V5ixtUJyxspf1MR4oKgJOxNVe1p0g7r6toA2FoA9Dp9hlrncWIVGeNitUQ2inxGhXfh/xr4r9xd9XuP650mD8KH5V5/7f6Vf0Mibnj7asMh2GkLpTJgS9tKN79fTlPOD/fP9CK0bZN598IXhbT0Ke2gK0azSCIi3tBNa2a9zNk5Jh6uJc3gh+nJuP9TOXif5gGzbvVFvCpiVr+J7hyvraW0RpI92LFIiXcMLF4A1gi5fByU7pv6ODM7N8gEvTAnxYwq6Mf59lz0MIV+iSrMYhprBXHTf1Ri8mjOG5t+63A0xHDZEFmiE1tjeE4aLQmBVaE4+ZW+wsTtb7MOPR8nGCRS2JeYGwg4Jcmbt1YltY+n0X5HA3DxUzhuHb1L/mtKD3aTvZHNYEdjDUR3yWpon5DPOHHwzP7anBu4PBXoUbBwYYbT6+40/Iymx4dq65YwdY0qWb9XEc1hqsu/WgHDQwgaH+XGrWIasJ14jm+WQ8e5P3nyMG5+wlda5/0me8HGseiLc1gl/ntihZc/Gz4MSNonpjhnqUMmFIunoyOutZZsj4MXb1fvZrb8MPZcF3XGUsGYBQ7ALWIkraNOxzIeqqVLqwVLawqIvRE4/ylamdp+Wug71c32B24tPO3fWd1ujdRn6lwyElrZ1615Ak5GVw4GJ9CNnHG3NDik8akMjAKXIaaRcMDrNlpWfNyCaHvi5zY+YTuV2bN1TjyGm4lagbMuURc9PyMRQbZ6lJmumRHSs+EfZT5PXPWPEMkjayge+SmFGDGTClAyOQBLaIu7CXmJ2X94zTGdjlTeJwuC6M5clty82xg1Mo1Piq2rC+ZopOtijgoyY6MuugVlHmvJUgqsklfA+W+1kGkMb8jYs7B+eMEDuqikjWxl6Q5Qeb5WUBZU3Z5E8QQ4uRi2HM0ozzfHmWqnqt15qV/Unhr6eZ3Vc7GavqMoC2doS+w5O75+CRZ7kB4P1VyquI3zRsA3ZamS2+133Y3/XCCgsnqSTNAuQXMyg2zvNwawdgxmfPUSL/2lraqvTMjPKwJQQPKXkPSvAJmtnjRP23WtGYfjvldMz2o4b2qJBdttvd+kb7HyxzJnGD+ytwfbNrYqEp9AOGFAUIlv+9unRb9RN9l/Yt3/tnJW4D2nIeVYkdOZ+OKAbAXoX0aCGcuWDMEDLLBc4m48/TlH9JStWp5Dh7BiANIRrnvJtkbGwHgliagcFNlamKiY/UIG0uYhZDFMlKea7n4VntwOCfQIX5S+V24b0vPd3vY2AmpFiKLNQR9PiZqWnWJKoGw8ryExwcGKq7qEER6yYLK/o3UN62tl1XJRQUVKGQGyzAVTiRjsqJnQEvUNPCu/v3ws1AtK9+kyxpC90ymAahTkI8SDm1xPJF/syGkDGuWHDlHxFg4geUVdMVokpk3pfunoiKiMGLID1u/TTOri3tke4JfWbJA/AJ02lg4OSMUcVBM3Vnav4hinpXCI9rWHorJ1Xby+kTjGnNTpk2jmFd2ltdBnY+WFZYUvnJ4NCicde7f9BonSIiwni2kHbl7ddxTQRoN558Mr1kKfpdefiv7V8XAA3mknrXN36jpLyibOG5oF1ThWH5sx0jlPAWHbYakGhwtnteQncxhFm/yoxC8YXcOdHSsJcRESX6YRDAnn7n1SQe8UeYwPF9VNalslRimsacAAVqZed3v9EP26w0YMX8XzaSQCGtKwp8/H31CKy0SDyZlGIs6+GmKpFoEi8KamBXfs5es3P1eRBU0hxXZxNWAAJOCJTyysebfQiawEI6LhVdGrXKyHLNupKSLx9Z5WOMBAtyUzGLX7NDkOl7iFnOCFZaVS9uTQbo3UlMTcUtaOCP8qB2DFPjsyPEt65ZlZJm2l4rzM+N/zRgBCdn0kTBBeFy7tZc64qhmUSWvwRm5clYe/JJJDqawxN4Ztsd1lfKu6hkHMeo6XlzkCu3eubOT+UI6X76HdWA98Pb2aiJMVkGhdRfAI1XGtVNNMdTGJqVKL5oB7gLRrdMnmqCrK5jD5Fnt3qEONpfIGpOnMkaunW2PLZUm3OiNEfsYqJjD1W5y45ybs9aLWBpj5s19d8Yb6246VVBPh3EjLSnZuenZa1jYQc1p3GkzQLn+6Z4UZ9x7OcF2//OXjgzgWVQ7C6NoOchZPyvruJ94XRRBzBe3j1bbsu5q+0FwHKWFABuBleayL1rcFtBqTmRXMkI6xS6z7fozkGAi0yesun13yoA4lixJ1SXTxHt9bTWE9reYLeFyiyCV3bJQbkj+1mCYSbBbop7Af+MNpZ8+Im94PaU0quX3ayu/g8Nc1Z0dW12/mQARQot/Xs98gGVKTrZMdfja0Lgmsi4s9atwkc/1bGzMaaYFDHTCD9PCGMrThbQR33WLrCMYm4gVlHVv/8iw+K0S+oZ71wfsWWwkovzQkms94YL8Xc3wotpxVMhIvfikra60FFTCpzIZxonWDXnLFtQ+tVcKMhdeXpCT+xR0NoOPctmPXv3oMcOEFJR5OHt5H/h063F1UXZ0QCRIxjad7n5fe9/GvXKQbc3hCHkwe/cN7Qs7MpP+5xQ6ZrgQ2N/uud+x+rgkBktE1G3+PO2Mc/0ScoC6Qc6mpIonIYYBcwLM3dERP9u2cILFUwIMBmriG//IOSHlUigkPJrAkiV/zB7622tMov5OxbFffd4lzYqNLCgi1pgCswS8+119n+upWMAYJ0zBn6/JTbtaM+BYHTYWisj8qWfkI21zR5NykTYZNlDMfPTLXLeyEEWMfMAYDCTlwUX4ehx/coRbZLDDbpt6EBYm1MLjy0Kmp2GrRH2lVjQT0aRWcDWtqtcg178hRvwJWqE5uAQmXMHbamlmA4yetG66dmrS+iTv5OaK2JT/oXxedk5PRLNYJoj19u3642kHmUCtkiNTTL2/brIlM18o7IYYRvYnw1tHHZvP1QlupxuzEt89kGQ4bQbIYhITR6nKtj/2Zn/4B3ldSeymVUvTdjEIIgmG0pbq7EhG4KlKOrabOWpIe+zfFSvW4jzQuPS9S1a/gxjvIuhxhghZCKP/PNm+QbNUsxhjE72I9UUtq+dRjIEvBx2zcw18KxF2B1zT/T21dz5qUMs84Og+YKnGsfMWDBIglbzg78cia8drdepSy028SFQCqWJOngLexl7oRCUJ41p6Zm1CXh6ob0blVDui7vf+29gELL1RcK6CR6oMELJmNRq7dhZY12raKaKGMd/Gb14IYprA29Teo29z3v3Wk6I5gpe67zJDlFfANC05fEWErVjlpKQ2+UPXzqyliIaRG5s/8+y+qZUXD+c4YNJoS6MEP27f9bn2kW9TnI69XGRiaBjxyC2R/l2Dij4VdcD0SeQT17auzqfudnaEoWqztUHGk9hrF67xIYVTSijBL352PY8oM5wkcU6QqZzntD2XW/xFkwjpVPbuG9pTe4AkVohfvMsMoD/A1M1xxntVDkDibJOcjl9UY1WfkWOHVSaqQJe8cpTjcDcFsIT5EQxwUAR6U3rAzVXfRjvJlCnjSbC3KprpjubZmHQMwn6eCbGiF96Pms6qyHMmGwoMJAJda4ah1t4oWfmUke7KXTNRm3VfpOVplcY5djF+mIaF/v5tKNreVkE6rdHMYDViK5E4kM5QdN2YDX5eYO3YVu5TyskeJFMikr5vai53LlJ+q2JTb/+nrUI/gQJMHYhLrOtPDmO+YgrhrJxzqCfLE3NnSy4TJ5O0jLMNycrPfGuD+yvsQUUisVbpN2sfA/3OiEvT87vTahbEtDh0dplg3sfQnjAZuAZOuqdwHOTOcDmoVs0+p12JOA6OU6M9AwNr4dMMCXEQUQHbccK3WYnV1T95TEEoACSi7DvHpk4FXTHGqypPgkSXvXLhSpNGCzHXj5Dt1WeIXA5SoPzw+c9bRn/q9ZBJS5FbCswUZbpZ36nL21eCukrTWlGCVbB3ute6rlDnmhsuA14Z+NjD4K+VpEfJDb2gVd2jcvJeeffgUmCQzZ2VCvYGvP/sx+PZlSQSUEi5aclaihF5M8MVf/2cWpQfw6slE1k60Doyj2Ul0HpjOIHcs08WkM54//WWVDHvQtxdZgB9AQZqZr3zCpFYEEpIHkeJ4b7OquJObWJeeYVXAHJ3kdgXYK7s+ZL9Ge9G4uPZl15rT+w4zhLMJkE9SdKZzIfb/gu5EQ8JUpBmeGnd0LkFHCRSc7K4ywxgToB5ethVZbGvCENQOtU0efjhCY7ACvoJEuKt4Pp7j5gk25bBUfzEq0Rbfvr8ftyh6hMzOTrdvWWWSjG2StIpsTx0cIf2j4U00ZrocnBkoCa1o/Y/YYBkspjpLMAKbci5oTf0YQcNajRsKlmJ/Ar2pK+Dai1sr0PnPX2p1E4Sc/Kt9PKS1hxeu4HFMnK7Z+pZLfXLJBuK+LLnmxLEkEJvuNFsnLzIy1wtJtI3jBmK0ZY441lADrFjfg2eastY5sfxpkO+iTPlVK7iQhonmgBBJn82Kis66O/9erT9zaSk/Jc4M/9D9F+T5L5EMDRjcq266EO0b5vZTow/frz+4r/Sr8I8pLW4aZ5Ok/MeeXx4QWmk8C5Nie0+Ol74X5RROD3tq2rWWUxMrhdNMh+mEE5KEdIeBzWRDO1tm1QbY91zdfypQ2OWQOKaVburnOKBT6+BgmaENyCA83a54zf0A+QBJwrof/8z2tKJswZif+PJfz0F/y0inkaNGAtOO7ZnvTy6kxqw9mkX8CPlBZn19bXgI4YIHQjbsRAQGzfMUn9g9/BdbGjqpcGed/TxEF569crJcVsPz5J68VVzVVraOP4S058giXtuXhm12YNBaeM//5RPQy8W2bAtx86fOsgjQm4MdG7oAgXNwPyVe3ZJrnclOhn0OS2wFZfVzzS9zFT7JZUsI2mxZrKtNDZvnCuPYm1hANNCYTsyuBBOZNPL23DcU2pN1tOgA+xK56YqNQ9uB87fQshrwhRMNEnsw2xrna4No2kOLO9ZeOl2eD0u6snJZtFCGzRohU72Wg0YAozo1TJ3wJSlRWuIwTzHDMUWF84mT2RNcUEY0aEVctrEFfNIwwGLXwlQQ+G4X+kVEAFBHdXxzwyw1H0cEibmbfAXwHLl6ZcFyzhDCPmsjLKp6Gn3BoYcetNoqQ545xdoGLIp2Vh6+FFXuFM3wyLg2oZInYa0CdDaN9uLPTTDtZuh3jE3pkKddxQWYEKurQFLSSh9bwlHYGIv17lxmYESX7iJUpGU6eKUcam+hbMlk5VILyAsJ1iMtjFG0UokhiRxVr3Eh8EFdpyKNM3FWdvWmEUpiGYndIL0KyeFlHXvlIxJ1Gwi3vzrxRnheHa47Z3HF2twRFw+m33HlJ+y43qXizHvRPJcVMlKadPxntGsc023WLyyRLxyiEkpt+hPTuMPN2KkhErfAeD4kftHRW9cktOOabRO4SjaslisnV4daSfqubuXgbcxL4486y5F4u7IS+1Lj2PH3bc3u2mOT4HEWXPTrn2I4I4yi70OFu1+raMahPygR4Qsc0m7gt6WQoGHuQQcHBMQCIkooOE81VGtIWy6zrMzrYPSI4zoRMIs+8DMhQjCRat0CHYw7ozkqxFbPiL1E9/zqQVyRfFkjOscDTUFcCB1BHpJZIbZM/Hw7EHKWZt5w6RO5np9dns21Oq/07m2xL4111adYqyH0wV2DCtg3YCMjN+nB5nSyRX/YWEIklTLCiMwQz0b8VM+glv8XdRR2ZnFf9ysmv3kA17O10SblW03oaWRQXrP/6G6IssSEktN7uzM37MZ89W1f0yxg66gcjXbknjgEAl2+IMWpZtBfQKwd0xrBD6mMo/p2YLMALYjbORNNuqrmH/XQeO3LIFqxwc5l6qhxjEBc4VoP0tk/Mo+1EHge7tGN3UqX+MXHZ39qh3WJDgMt8FavtEi4NLfGIb7rKiHqySBteGpVXCVzCIfJOCjU41mHI+4jJNn1kogY0vJWBeR8QSts6P40DkNkrFqGVnhFDdWFKM3BDRKKmIYvdsgHEyA4zQxn7XtyKolRAwYLOrWSkTURFRKiQDHeRTNZLV1I9sRWA3MAlG6QZ0d6x5u5rZz9j81Dp9eEALKgjajOhpk0MToPHmNqi3L7/WY3AxH9Er8MMwr/m9Hb82azmuZw96a6yeg0uJSrDiZTOoHe9kKcqMqlTSnN5XSb4lYtFbVniJr4Iv2usBtMMqBFHwc78rgWi2tvPK4OaFTVdOgpTPBs4+wAgm0W3175Dhw8EBC6P2s9rkh1zAc1MrjtAP8R0t2/yz7ID0DHkUjC3TSxOToSz4CZlPAS1Ls24oY4uyzHdWFQS/5d+u08Ffts+Ol8vmAOGumREfVejE7H3FhF0laUtW+5XiuezI7W1IGFsO4qGQVoe+vrwcWI1MRVPW+F8KYfcEe8OgLRrMwTbJB+VmIZnwXvjbF89FIVoShouOtm2HtbMkUp3woDk6Y0EXE2j6+h5fXsh3GRX16auGxAZMWahpkPrW7Zs/06oUU3+I8wSAAF00yUAJfiGqT1Z7jVqRbxtrLtVpbfK7eZv1h6Tj3b49Smh9+UZEXpHwvbZkYEEhm6M/ROJgA0l1W1Cxz8i4l7nBEpWOjURFd9LBUxOVmyaycgVFuCvPJ3xVO9utkDg2GdE5BZhGnSq8T3To9vtb5TwJkNWIB0lkY195rqPetc1fOPtPw3aJpjuC3qLGyMIPnZFa6AyJVsuCQ7+rPvntBFkoB48oB8+qkVXRrf8KAHLu/t5U2eZ/FIqQmORRlaqw15AWjmgmlDAqLeyDiSHHed/iDocKPNRuEkPTAFluGtSz10eLRKuplHqMSDLFKd6/73OEZq9tjkza4BYZceWPQlMkUVEEfWC5zya4a2ct//5/0Zu737CUF6qpAMWnWqa7ahsDg3jmNgHk2i2Yj3XYMCIrzxzAzdVm6qZigzpPzuU/pfXnCMyNaycrtJCHp2IlFpYQxe6UnkFx1IH5G9ePcLHgwdE9KpHeJWbOCgOkNGOXqNvCYOjelAbnVK+QsN05rqcwmB/ikfVA9Pqv0UCXuCCv0+qHKr4Wz82PLyR+5NdHOIGcs8fJAXqI7GbByVbPomswq5StKJ65N1BbZ7zRa+NpYmIEajIyt7maKPCoOawaO84jY88v+40vbWybMyyGTEgpdoSelhE/7v48lBDApPhqguuzqNTJHdiwnsQa6ppQwfrZ5CvMQyzZNOzkLar62RWA0f8YPTk0NH2Oom2SzB7Hv9lGm86lxzXFAFyJdmjsXVIxDz1JP8yYnRPi2/bhvFlSptzVkA3QgRBRZTdPTQQ/oBI1MsoCmWzSzTCaKJN8KxQzuUm55/Xpt5JLUdbl3GfRJZyB20suJ1qdgDPAQwCWrA6rDN3dt/67Nl0cujlC28pbB0w8QscakAug1YTP0G7O+8AK/tagVQlFYR7PKdePWvrat/JRbWbDPDTeb6Gmb5dFv7zjkfIZUtGTaNJfBwOz2qQ2fmTpRGGqnGbeGL4O+O2GzLgqQmW/fVLEr09Z/H8Njt/bk1RV/vfJeZ2SE3mTNSPDf/4mmwuW6Nv1ECzQdPn7ShRpiATuZJJoPQLJZuWZH4fHvrCunIdtppiZpwJT9Xx8B2een9fuILGq1CTqRTHfXysovT0G9gYnapKXAoCt5JLO23JgqWItWTi31ZoVmKhQ++sue8AlL5BpFfPo9q678N5k8HiBazlwe6HmdppjeaufGCrKV+657fZ/r6vg2IlyZwf6mBrqOax7Mz0m7VlCAjnP0bBaeLohkIMKOHLxJYAWRF8aTK+Oy0tBhP75AcIKFY+3si9OjxlVNkOeNVwTdOQqhmRcFmrGcLBdOSkmoZE+FRcT8XVKEnLpz+xS2MB0LVt3mPAiR2lCOPEF0bWiTS1Ij4ij8LSPlETGh+Qi1zhQY3ZLtxvw6UDv/5gN4Nlivv/wx21I6Gt8eo3gZWXVMZ1PBBn+NvDzx397GG/US86zNqW7HX5GG902DS9MLElRlV/mSZSg/cppzTThkIYsheHlabZVwbAXI+OtwWlmzr8YI97k0zTJxgbIhpHm20+e9SCed7/DjU/BgF4krLJa7AhB1uHIrY0H3ILaFc/NKY+gHMcT2qCz1NSGGLKgMpg9JiTCK5CUYHJhT52oylBnxWcwWnjjSxVC/ZVJklArdF1pawFbvtR+Ymsdan+ndJKnxgPlEdV/VR6ub9iICHPN0Q3Wu7stAOelo2GjbFYYp+4HX9Ln7i6GDe+dOmJo/Q1V7aPe3LfDL6Ry5andyXsxDejkhVndRe3hXLnkOwjA+ujawIvRcDjf/bycDMj6e4GtPZRVO4dz0Gk9Q4zt6xS68eJqaKVVnJ+IliZkDKazkBsPovF085TBJMznIHjLB2RMm8EFIOpo2JGSlhJhDf//1x5/hbSnsEsSxY6l4DMI6C963lslqLDd22ncHKxMGmzOmz0ZKhcavhtVSCavxhox5+qKsRSiXValPXiHnhNRRTfD2GhmJCKbVZRlOd0RpmFYzF+rDix9pr3mbzXwALvBu0M8R1dId1GA9Mvpu2ebqA3qN6f3j27uvirMqOCU982dNyf7KzpePzAwaXB8fQxqus1Sm5srkjYuMmoTfDm6PoKmuTCG/Y23C6L85KvPnOsOsWA3L4+454kSGkjYFOWJ2j0fJnXZkLfqkIYfDo1kQ1yZ+Ad/oR3KW/byqIIu+HVOI927vU2i7OfCyELMjOOp0lwcopvmhEusOWe2dcbpjeS5PvcFk866RU2K/Rhf6UwzbM6JGsaYYTJ/GnLzeM6U+jaawOHJkdG1lMvU867OkqaXTnJzCHTmXA7hO5oy3YF36ziIktsVGd36b9Zc9yfp8RuXxzIhgPpe+7MHST6VvhSPx67/Ftb7f+Ivu/+9mBdwhfLK8s9QZ/K2d6f7ickOM7Y2QrtSUwG+8qRw1REIZDBG7tgqlMvrepRHd6cxR70Yaw2IYICr0gAafPc8Optu7YlxPGKsiFp9t3C/4yDuhYwDVziDYnwqKQEXG/fqxzhhMoTYqyseA0JdQVxwJO/INDjjoTFzlL0hbkaA19w0hXndPhAGpeS+FWeK7Z379mfpvKYGxcrd74p9hVSZYfT1Fxrm5ZeGGYQFzb+w/kVlS05DdIO0Shp2Oz2pjrGhfdrpf2sHeSz58fk7TwkUu0OmfYUjh3p5TYG3PBauS/f0t9zmsyJrht76POyJu+atSKye12LSC8AqCM/IE3yZvjezOjGwUhmZLL6wb/dEas/+1nQFXd4P0sC2MLls6yRPxyJrKcSvAHxOw6wUOyxY8PtkcHTlA55ii5bRD4/am+Tdy0C2tnxIJd60k8OyCGHmQLrR+sTj7GxbfcYz+EkhLwkJWc4o3HW6XzWnKknRdfjxf1j535lHhs+WmXt+EMTv8FobU0BU+tM1vDz9XI1TLYpzuSKdaERGR8M7BdHlVy/29tRMMmSQRgNpDm1Jw5jCsJ3vea7Vp2V4E2U2eOtSuj51mEXZIpbpA+eEJ8fTlfyStEwPfyWOyy/cfXmcIHG4Au2lKoFKz0/peVr33TSVCjAKLv22PV9jsXjryImiYxAHxk1+WCJX2r67ZjQkw7VihamSaYARCvEiGaIIJEIg9mebVJot2BpTptLSNjMWcSxBmPFZ73pmHsWnFweLxRJHrL3Z/7zCfHqTxFWZjeml0DbFVmBKfzTE/mKRfJk255dYkZd3DfmzbpnKvHGpYyIzyM1TvJrIy1LIlmuLda/6edOLL/eORmV/e0yZX3vnOmkOxNZaQJalCvI5nMJnDKdZ7otYKAjvgoNkX+bjus3x1eRvqY9Xh/AqUuWO2VaqME3Mhd4g6IPQWbIel4R8UKV0Z+TFLIebYkKlAAxOMie8mW2f55mH2DhiMctRbu0Tl0XxPwkGhsTuc10Ytj/6eZTebEgIWaeGXbyHeYOLrxEKmkj4h5qK7VTOvsHteVfMzO8dYYtmWEFtqXxZ0C0lzVKrYj0kqok+dbeI08eSXfL7Hgea2sj8uYa2Duj1xjd+Cf9PF4+nRlaG6XWhNWwu20AvCgbTDoQyPb0gurTA5uXpUj3KcXr07+iZn87GI7TZm4uLrpjGlvuGfDLN5H6SwzWPO6tMeVoz8BBKR14RZ6JCDt/scWvJVyNjWyhbxC/6GYzlJlFhXsJ+N2TdCg6nN9CHJaSWFzqVXlqdN36y7ZkNQfdFKIWMfA3O9iy7tXd+IZSjh6/VGvt4TMvrbigvnbhcpziQUgD0xVydO2vc4w9fsCZ+FteYmPvk2o9DUs9z0SfNKNv/rz/w2AeCyrDMItrUo7EJo+S+819ybhOxpcJ+1hVRKd6q3SK2QFWgjmdQFLTWuii95OLJek6J/Gp4XmZQpico7VPP0pxLwA6xjiG+fWOv40hU99C+dm1DIRP9MpJeMPURJ+yiI8JHLo6nChEXW9DtZKx8xIcp2tl6koigunUGd25/rM6beCZIvMB50F6A1xYguA96+q8Pg21CMZg/N+hO69epvY1tyKhMqoj/JDL8ZrL0dT8w0yHYe8ZaDPQcYyJzEOS7EhQRJADiG7VDygNIm4mGpqAfKbQTP0AWO5wmUl60g7G/kxWPaGtrGM99Db4lxd1hRMYIUYZTNVMjdNjalSI6bNCBga04z1l3Vzbcbtm7hdMtGAFA7nwWQxOMQs8hoNcyStltNyG5MTwgx4ku38ISUybKyVFg2H7flO6Cnp9X+B5lBDhxVYEE0JdRGCYtF7dVJI+95W6NQHqMaZRTY0Hz19tQ4mcqMm7ZAdXdJS6/C8rOXOL3fG1VxSwxtLAQOhhoBOM8OTHxzNb3PUZaaJKuilRvZd2nQjmhcRTg2DlTPUZQAsWO8iWMOKw/jAqPxMeI1YQusWBaByxRhMKyQQHIWvUPL+NsXQ1aYiwx56IZguWy+0cT12XF6S0q2FrZJtZrMM/RPJgg4t58UkekpEaQOTOOd1kLROQlkmmb5OwyjEOt0bIdOiND13v2iL8uA5avyEXEWvUNGAKaroQ8DHfbGrR70WaZo0ULbhC74u4thzTMQ+KBA9xBFdTGML+htGgAAKCbPNj65774Xk5NoVxiqSiUT1fULA4qZFrSPy4Sc1am1wBhBnkU+5qv+LBPjqE+GrKmOnFCOCXGAUNJCwQ3Ub5zZb6DdgzRiYTTCUCM0DtZyiNVMUNxDBGMUbGYT3qqREOY4hJyQb17PBMbtok42I/6thhtvOBGVLN0VafrLwU7HciNDC6cKbBFm7cWGt2j9pi9QGRsY09oWr4zGg1AIUmw1C6nntRWfgW9mQDZUFlkiK4zmaaYwOIBTLSpv8ShPDTk9IStqiWxsxpLqDYsaw5x/Hl1Rx5DNS18ELUV/QhMugdnoD4PVVMmqb4kC20OW/yoxd31krccGzMbZqppAsftqdLKR5j1B43v8Ddg0VMYVOhIY+7+gvm2IohXiV2y/PBRDTJSDRa4HlZGNhw2encW3jDH6J20KYuHZfZkE4qCoja4X28Z6ZObob8Ov2hv5htvKYArcP6SlyZvS6Nr/jvOEhXIArHgvUcvQRfvEZQM+WVOgVE6fGTUtEWWPHqjsuRVMRNv+aJFlMi49X7IgHJUgPIMIAzmETgndI/Ed+kcSX61VyIcu3m1HGqUqzrancFBgNghxQfMWEvVRHntxLuXtv4lc+gA1J31RS971kggHjNm1pWApKhhRxJNgpaO44xneAwLH91+rKtM++LTjVgsd2mCNoyFinE455cATv1IhBDiGeFBnZ92s1Ug93cvLMUVPNN+zwnwBkXAZTAUTGLMreWckIEM5ASNfAbjBmB6YhME1OkP8zHZXREKKT2c5ao4nC4eKGAdQrowXF7Rmf+im95gBQhlkiaVWPOlkYMOzMr3MFOF40a3yekZvsr1EflVwxMvweWuOeJU3V7BXqx0809wzsExRfGBbqlD07ZKG0+pu07RX64XYOmG9SIqEyTdTq0XF124FNt+/MaTmPbrOq6IP6gAmDR/HR3FQyLh7/Wis28i7eLjwVpP/pwLDeBMSpODWtC/hRY41oNBQDu5ENiLCmG+PMWjNQ5FZ3P2Bb3MipsmqwKdiyHWMOLzfk04s777AXL3ttuVoIWH4YbR1LfP98sInAgPabI6h2fnlznzGrv8YU6ri7jRzQjlD/nbDJHX+jkkS9buuEWUwM+x/iO2sbqlrU/bPmhEplSfUP2TRrozEj3eAo5q7eBuQwTw8hTlzmx1womdkMbzbIY0jp+77amf/aE2zr4rAuOxGnUPfC5S9RydEZuzWf2G4Josm51gnMglbkgih4O/6bay2Dt9SQ8p3nIHYnL0ag6jNC/y4gp1Y1olxE1czpmr8WmdnjPOw764f+fvOR6SM45f9fD6pLJrHmSFzRA/8fIBzWB73E+/y9SoLTMvPz1Fk72oHH0Az4VTFvZjYplwmgBSILz5voctTaDLFdiy9CdGAFdxBWhgfayPWcx+ueFcLDRU4WyoJKMw3rC4rv63uPWjOnWqalMeue4LPYtbAYkJcCg2BcqAvAzzNg7MxFW3Dz1OhsnuO5qKzgPIIV1jLMNz7PA9bBlw8TYGOf+FxeAsWhxfkYoSa+kwHbqCAycI/OepgKiU9zjcyzPez5D9Spv8bw/6R8ntqNokXLgI4N8jw105ztc3cvgt3Od6Jnh6WUK5ztEc6eYUm/ofEbXOpmmkJ3QchM8xmrJXhp3iTo9xj1VmKMPTHSWEctREZOEsn7V5q2YDN9pY2/qXxMEL6Q2zTAzJ1qsVWa6k/KONziJ2lrZsk1rocRZo44mncCw68glBuFSi91/A8uyI6UdGun3/6rqlha0uPMBFSY6ml1bhH1BM9xbS+0LceCHVG6E8xKri+KlosPIQslkVrl2WbtGLDfbVc7ODirXWnFx9Lep/f6wleRbS3RvlRGZ2fulzbAwIXDQ2kEHDKBrB0oz9zyk+Q0sliz2XCxmmhYYRRVQz/fsAX1nJnAS9Trc0BfR6wiJmYJnUcRUMQeeixe9ECtLJ2oz1sA7phWFGKKDSbr8wVZ3bW8jAiGihVJ0Mn6AtbGNqLz18zIMnDNCdGSiTHoF//S2OIuB/jCAX/h83ZzfmidMZ/NSJ6/Mbc/ZOwJPSNXfqX4qCNkZUmyv3+7g951rXez8F/KfJm1gWl2W4e0TF+6yI1lZ8k8lZLFDeAYBre60XlmTId9nAfs1awyn0Hs+aCDX1qvPp4JFdRxAgL5zRKU+sjce5D5tufuZ4p8o8KUWEfVm+23xl8d0XqrP0mpm41tti8HVc+Fx0D9dk2k1WA6/ipPxTNwZ7f+rSWNeu4V5IzqTE28JA1SJ30rxQ4CmdrWEJZ+QY4vIPh6bje1ysgmThtk7wlLKZtaQmd27J9w9kxtm32KpgT8iyez/JMrPfc2j9tMOhOLGBKkq61p3CdZ3LLUQUnMFynXs+fLB7hHpkY9h2DjGDHdWsiUAkiM6gwkEvYeaF7ZBhOGbav9p6ONUq1bMKRE5NdnSiCQYOwhqF52RBV/8fjLi6nkFOU+XsEPIOgbb+J/HSAtFRKlvBOSpI3sWzv/5wPdSQlYN+frNg+kgtBhoBzHzoXurzOMvB0xXQatywPo3fIHV9I9hz5JJFgW0tpPPk36Zfslq8HKCzGEXv4yp8VinVpwz5waQtdkVZwvXgbGcKodAdgZ3/YWoYu8RlJGaTEsLwFi3x5TMgqXB+PtsHHWKU1U7vBu+alWMe8Wbrcv/JyJ8vwclPhrONSN37iv6ETJ1r3etqTf3W8+GDNUFJ59rSUGCEYuOy/mhvqt4V/7dU9hCc9tbu85srh2WYAngKPV9qx/zkCJhS9XzzqsUMH9pFR7Pebo80sHwTh9atExk8i6yfodCv15bbuG7l1gjxWZlswH1vyHnrHlRchdSnmryGWBABd2OsMik03T9P7ssuNwLM8tM5imsXUnKcri2OYC0saQFj8K0XecflNPH/e2lXJLPgJ2bN7p3eiu6i7Yjgzse9Pwa1YuuXbmtHumN25PSz22DNf+zJVlxX4kGVZEHWVjgpsxeojrLrGcfVx0LJMktPy6OnIcTq3x5WU9mwc4wc/KqnIYw2UJerbaHCg6cSvuzlaj5oQLk6gcOxOFzcrDN5tOj9F22R9iUa/vD0roWSX+Xn161OqWgeOE9zvsyZ0hPXTuYKT+Gh/8sdN3LQjpgnNwBoGx4aAcu7euXnEQEfG4zyC3xNSluyaznt8oPv/teC+duXePN19CeCueR1K1lR4n01vRviTiuGK1cOsE+J5YN30PIbl8sG4glOvEWH8Wx7BB16sj3zj8wKMHfDEmNV1QBdgDJl1FTpMcnP/cCEce9o4ghBm1fUPoF83VOB4HTayBpd27fPk+hYIOBbtJX9p5TwX7OqpASkLP63yIPRhnzLVneGNxtQyfW0jbO4BE57Duqom02YwZdEobXM1ihaWsiyH2Ucd4rEZNfyHkqbiPI0CRuism6Hs0Z4b0ReWTsoMWyyWcvsR8t5tRlcbxELc7g3vfED+bWLYPY14Tc9XoqTXyTr8Da9Z2b47X6+WTF1qN15DbssG1VqFNWwMtDE+C0x98wudPUv3/XjtKgJ6YlHrOa4hm/InDvEUBA2/oM/U5brsdw7g9qw+D+U8DjxWZXOGVjyfkcFLqErmssVE6C0Lz7QY1p/2ow6WR3aWFIqum6Zo3/11FoW+9/oRrMwJ5g2kjiWl9pGInz3YXVkTOjUR6grMtPXpmgnx4QsZC8d+qBOj/bhdn11+8w0hokdDWK60fSX7wfWrPuTNJ0kVpE9YEFgWB2JWKVoRn0b0zIHviD2jSoLo2b+OdXvzEeS9zM2JOhDOa8ko0wIpDPr2BGyWxTZ9BD3e07MyU6SotTTnnrVBHOsSasaeXkW3beILht2NmEM4qNO/NAPsnGhudV1bYDHoDucN2jHauMoJfV/vBYvv2p6JQHYv7dhmL+f65nv0HnXepmeJn+g+YD3zZL5OKpYmHcuVMCGII4UEkI0sYaW1wlZ5wuB2HFdN/0PLc4SazDwyvKRpIb6hQfG/ViqMfLVP1jTD7/+ONJ7M28KiTRlrhymy9iVI02hGKx8KKBE/m4sQNPEstADyWR6OP+zzy1noUnfxTgqM2TQGNsvQFAMXHLuIMpywD+eU6OrhbEAkTQGKBNgJkstn4FoydxBCCqNumbobZwMabzd2Qlagp7VYCbbinlM7UdaP2Ixqlrk1YVIQNJdRgfOpQqlQP2jNY8SOyfdVcHUx+eUcjj2hnTals8IsL5HDLaT0IxPVFaR+FEqIZHhRujux0kbQdPqJ0GRy7DrKMT1xO9A5BanNbOspGLwGKtR5AWWzap9K/m4LysVS17FhYeK1fI60EyseEh0r926Tl/SIz5FgSWe5gUEx6rBgN1prXZGBdDSBwLwj8l0sIXwU3cnNsd2WFPKIV4v4PZgI7zlZp79b59cE0ox8AZvExitAquk+BKmgQfrdwBtymdHz71H/RnX042+iRN9OXEzM/DLQeNtkftaVqqDhbP+/AuzNn7PTv3nVWa4+8ZZzlSK9MxFHb4Ed37+U+65QtrdGHK1RmvPItWoYJWAheG1Gvbrrw7l+gr7tHzu/Y/lUr8VF4vZ8xRqGrVxpFUudcXFpcM0n2VnNaBhYqumDjvk3oHz0LRNn3Xf+IBH2MOlJ3jYnF/jt39c8V/o/hVKf20ndhYgXB5CxYKJWPbnsC/RpSiMFWWbJ0Jks1fFmaf35CmreSWLSpqeSv/93XXPwmyQSU8HJZDghR5FJkr8PqBT4nxdWLXRdphbpjBiZHwqyBHKe+XiHt0LgsDr3NhQCvGQD02whK3tDXhmgEO/wYmJtkWuSQfuyiGh/Y8FBbLVX6aYs8mw0G8BojMwJGfwV48NCzzSe3XaahTruj42JwAwmW3d86Oa/tqo2qQdXqgVJn5IpPgGHhslPFvJRbPFEfCPeKpBoUu+h/nnq3X0ozc0RpMeqfIsGYlrRvMB977JWOJGCbMx2ivU03+fOTzDPbs4u85KLUrjSxfmswQqvO2trtYsB8A//Bt1vEj3BMi+CWWl3GkT5G7yUm82Aijzik+pP/vc+w/71rFJu3sTGl5xpe3Y3eM8zhXWbX/CUmmoqycE8Rw9iYbO0I/e9CkkC9EnXA5VBk0TshGwjAj6ALSQKe6yUx8KY5j3OIGOCtC3Yp1JCL+k71yny29zuS8Oazhnd9pNBru10kZgsGDNkpgv/fgHhedKJpt8x+wwVEIrTyHZoChkTUJw7dZJz1RQS58TAP1KEjzN4aTm5VyC0gI04s9w7UVEH3qWgh3STKGPnnfI2UWLOjZtvcsWXquyWiWfUEzpfDWGm8yd/iNKNZZ0fX1srciz4uHTmH6RMrrktuHTWgfjK3+3JizBWGuccKi2eX7GsZUmCz1M6RuW1FXuZTjDkikFqmYIjaf5b8waGyXucdUZCBxfcVv8z1+yfrwjx3hTovK+CkB1xYsv7J4ccLb3JoN/46HpZT0OY+g7K1yaxatvEMMbmhkTZoa2EJPB456E3J9MIrlRFdMsVcv60gB0apkKDKGcQuc8LuMiNXXCxa2lwgV2pHPWo6NJ0aE1FPBOkJNd7FYI+QF+r/o41zrO5Ai9NSGTy9hVFXxwHkXgybv77H6Vts7QC3vyb3Tn5PtwCVBhXWey8JYJvRGTD/8DS9SKV7njsa9L/ONckTd4FctJrkvwSM59XWiGPJME6i9vdups3K0/geueuuOY9GbFe/2fNV/uUJu4pH9t3oDFK/32blPfFS4bU7vFWYt5lMb+PEBAyNaIsCB9Tf5Sfoj34IwVCNJzjy9eTQBCxx86s5PX5BB74WSgXbQI7ID7c7XAakVVtmGsR+wTIi8Yo4HTBBCSK8kSlAwyrB4IRK5kqEakXckhgmtwv/j4aLup++pTDtXfw2RTn1JiIYUJZcDiiRjkEz0xtjmt2pHgn1Lp+9x3b8h2Q4+33xiZJKwpT0sp+zIrulzGu4Mq9iGsaJd8h69bp037r+LPqlf+s61kgC1N0cqg23NHboxvnrCN9/afXaXdEndAtmhFYnsVl3utt6WUR7FHckzczXGhwW2ecn4sSAQGKJU5KlKmNeq8bVjyQ1MuHR2HvjkSMv3xGZMUWjxFwUEg7rl/A6G3XT4KSLrZkAwzsq0LS5vsc7EhXeQsezS0APVxzQ4ddtVdcWmhgLYllK5xlNpDXNcmlH/naJ60+Sccgp3RC/pomcOvJbLlcWB279sZ6ZMLshBCF8m1CXjIW7/GUXf45L1kdlOHKnamZRLoeZpfyKKOJ5laEbsFuOmDqgFmQ9vXbouIDQoqHwzmZQIlDsvH1VP9ZEwBbSvnX7tGV7XTt4URtWSudfXrgi7xf87KLPyS1j/cfMjw8lPgPk4+1OkvWiz/vYxo/sE7PZDDKfgRIbWiOI6Qva6bvYdMb6ofp3PHl+15sG1ZEfulMTeuVh0GUWp7k22NJGnjr1bzS+Nu3wuYnKpV1VfzpE9aXZ20Y16eU/nhC4ji26K+jfR042fPG96N1Utott0CLzHt0j2e63rtqebjR9EeepyPt6BQbva7af/DLTw4wpUNTlm3OnLMSGTWrE1ccO7MNlKk03ZKSvzLZ7p2Pi4HciR5m8yOsfVP5FgkJhxVWOEtviM9njIz5vtyciA1x/HvTa8oHQsN/c/ac6Pw0//OQT6CPULKoTxB77KXOS0rNXbEOZ6cldhxk21V5A8e8uZFnlhpX1z9ertYyjzydYN9Nl15HI5U/06Xdqdxq2Jt8be2Rm2ceuxZNp1dXj3O0J/9LeFP0w2hoaVAmt1neUnoT9KNNJlv1bFpYWdfuT9A49dPtZCB/Cr21qvMpR7108mJBBiXPa3p3GufjCY0LucKra9PdhusU2vJ1+tqg3jSnfb4Xp3CAOwGjwY1VUwJWBcwOnOey2Nwex1//r68FVr4o1UieWfG/yRCqdrkqmVJmxf9/gHXhkAqGnpAe1tUMPxN+7GusKPArrCo8qSgdb1i0x06Zqg6YK26i5GFzSxHeG/V77qDOd/TuJ3j2+pj06WtoOPjxsX6cWzLGbr6vyTd+96gh/8/TWd8ItX/FcytPAWtNfQ5Xb5RNoX3F136ZUNf4/iYaLrMDV93e2JSU6rhZS6iVs+nso1f3fbkwPXvatLS0JY+1b++sziHtVy5sb1+ydLx7Lshh5rWHGm1Z/4vL+bxYWhIu2/NEm5ITluTMFjrOzDenfL/udi/deLB4UQmj8w7fMr5LN5YsM9Y3MuhdR2s31L5rbkNYuTQnpyxpVPvFYUI+Pnl8IzQzb6AZ45Y28ipFVRMWCUX2bv0w9FzjLq78qvZPIMXT8l3LC2IcGYmJJVqZavP0lL+2VwLT2bM8kzPqxIus9gx7xZ6tTHQUnlRcuWF6CUqSrIiORN+b4W81p/h7urqdV3C+5WLARpXl+IOnDIesP5XGS96y/MalDRBlQrD4EkmH9cKw8Hsb/hzHKgvjKkL+G6uYxldOhszwuEBFuGpyGJKU/65g1No6xkgkHvswtum/DOsXaeSMpa7wyvq2P7JhwvTDEFI9TcDJ7GVGsZdei1yGzpMPwnKLXmLIZ6Th8jv81yPDYMlIsKKa1czWFfZ8kXlrs3u9S2R9ylx5c5BGr+M1NPg8odnwiX8kqJw3rjcj92T42Gn9kfu0IzjZXR3oSfiKLY+fvwk3+fdcW36le8mCn5jy6++Wi9ygwJjcsTd5Bd8w3dVGP8ng75z9BaMm2LlF9uTN4KqvjidieBD5K71TdC0tIngGIkl2oAs4xQsinboDsqdvhk82XiDohz/7lRcQ34/3ZWOo6sDhxQmXfsnbvZKyDKcE19JUA3fAj7LUw1zsvkmzph3+LNFteslZkTPV1mE3lLqCK0IjrO6zr086ZLlrGa0b0Af981/iGy/mO/M/IujL/xsQj+zSbUD6rSCZV8XlzlK2wjr0B2K75eb+/+/obP0Mow+88Nl26rfLC5qvP5w850+GcnV5TiXEGKh5vPTbbVZe+BpPwa7AaxvnZhE82GJxyQQRfB/SN5shbtOBW0PCNxfi7IrWuolC40hnWm5LnOZ8vcWnSRLORFjliZyJvTazV2w87n02jU8FRuBFqBF9pFhmL0tU3pOQM9/ZyC5Rje6HvZsiVoma6AG5/RhPeXK872nk3Lm8T1XVvtHMuQcKk/WLoUgIEj9gEKl6RL/UOs3jjjZ38Gv9C1TtF1vBoqIBP0O04cQKtmB4/HjwjL0TMDo7Ojngke/AlV9HarYW4V3t5mheRktKZGL5M+8KbVEjhPwso7/iZYrAWLGvedELpvRxqp1plmdP062hQXN1RHAeh/WkVGR1RSvjPgjqtpn/Ol5OiHWb3/uoasZ9ScPPP73rUtaf38Rtm4Gxs2esTkueNqWD6j4AFISvGNp1g4qBuNE9JVO+d73PO1DwXufxHDon39MsKS8T3Fwy9H7NdRo9eidiMHLBETtOvoBerNvLSLDkDtyacTz8aahGhrGZrMEFvOf9Gpd9f/oMqZ3czlbqvsPyw0jVdcGTwIQDPP1A9+73w+81fitQx0wLZpXplaFclnIFdgORxTUrDevu3aSNnZr5b49sp2PCyQRKc9+4Qlk1LYbFNXMugpM3McbksjYJxEBn+t3t6xTD+yEIGLRhgKCDcd77+rr/uK1G25c+np6FcPkkWuOyNv4sbfmNA0BEfRn21R+49ic9NaepKlnVXhEGWtJWiSsX+xSWZZz26YJqjIyiP6punDxldtjqOaP72OrBC4rO1Mj/CJo+hITVR/ynHh2npVgdPzYdxLaw2UqTcgbGARsI23SOux7eIhwUNi2HSGkJcy2w6/yDZIFu/WfO8bvim0ixORrbZt0Xt6VrwUg7iYl5b2/D0rRZs7fT9UeHBc1ZvvmTafQ6IqffsD+rw8OCYVRPJMZ5/zs6J/za/Va6dFtkqD9V2050HPTu8h18wVYe9W5NQfys6Wvb1Imr0yTz3J0v/Z2WK+8ze8OLUFFSJ/7wpD+Fpi/1YzoNyeUB4IEAHvOOzOwDuM+iKiyHOB+ohpO5ZdnNYLJpZk57D8afnJHkgTNmQ6kBDFBUL2CcFn3c54HZ9NkdYZ0LBvPY2uVhZkMpZDW1IDg2VjvuXbkUftiL8cMvEspGozeeF8wDOjcQvbUx750w+0iZrGkBLfbgGnH5/7qj3d/3ki01jRlEo1hVXOl9r6y+vDQ6u1Ex4wWlv3tQHk+Zm7NgO7BZyNfeU7pHJ3t3pqK4c+ObD0d2WpIIpvTcvTJlfnfjH4fp6lrTnA6f/bcFz80IqPpfsAVw32PVEri6bMJfTO3RPm18HlAxxfDSQAq4/s6kmU9dgot+00+8cgSaj3+dHxkJ3xu1Nmf2jE9fpoZ1/11/ntT/86ehL2ItQffriKDyZyGGAf2ECTKAG6GKBzYeEVkn77m8k3chY2JcxefDdhxN+rkpLy+SOBh875FdTO3QHxk9B5dgdMUN7G2GBKYJ3CTE6a4+6XCe03visU1H0gsDPt/jGQqck1Z1mv53CTABhh7wAJSbzBTl90pqje53o9vdMzC0asrvs8qeU8oPP1nrCxt1y3nX8ZQVjVsjMqxvaKsiX2tN0hgLeAOH9TpZ64gxtllkKym80Peo+zTn6JaA6JZB4GWxvxLZtqULpRm+rq+XUON0Y33DUVpsfrRhkjFYWgC28FsCmpY26CuJkeTd/HyRpJ8NTatJUr9Sv6pR9uRv+8UMr2Sa6nn/n5PWeXRq/U1K/bgoZG4xlGwqxbNNejJIqhmt/VK1OWagHxqReelhbsZUeHbBYBVGZzXzV2uqZlF1bGl8YetrQJKjCaa6164qsOnUUgmJxOB109NyhUs4W/3LhFejvP8di/KfRXhjbYQEkA9TRuv0pohx3oqI6l//uS0h/9E5qDKm0VsJWoXEZ2Hk50C7IuGH2RYe/EgIO0OmMxP/WKjbuozApXoRCLRyjY90VVkwSLn92RT/jkc9f8vml4r9q+cFV0Z1LbvvgufmW5jpFeNiYXcGR8PmGVnuSWFu0R5ycydcMpJrajWMeeFBTBt/AaktbHg7meI97806pV2hvcQ2bB8LqB3j9XYR7KYK3jZd2fLvgp4w2+6jcQ/k+5dyEg/5/jr9sv/bP1l9ne/Xl+IoN4XRaE153fYuQzmZMGMWxs65/sRynvY3IZ3MmV+IkHZ/eUV1/5/lTPjoj+oaFRpgrDG2IeV72Zm2vl4QpK+cESRye/dC6Y0f32AcC2lMiCqvTF1c6JY0+4q2c0bKjx+zZqol7NsVEg9tPs2Rf9xvrNs5OlH3/N6wL9W/2Lo21WtAq00kcwWBQuswDIx+ZmoxpNsEW4bf+1L92a3gpluDONkSV29RRzQb+kgMU2b+VWdZuWn68QVc48RC02mCXjkplwIj7HqKMRQ+ZzkuTbAs5T8S4a4oaHYf95L191dp60tpZPePQTtPrDrKXxe+Jmlp9zqXPTfZblFNP61cVT7hyVq/HlXFxAOk4VhJUmP4xxGrueKS13PFUlViqf/kOho2cCS4DbvOWR0wU1mW3F3QzGJS2HmvPYMamRxXD2QzpejlpibNAqZhWMwe8+pXg58ZLPf5lJRHAlX5Rv7P8px6jP5995J3+Mr5NymzP8APxE/ffJurLovq/X4Ka+sta+V7M24Mmyiqhlv8ogfMUb7vGZ65rN4/XsqYs90vMmvriaeCT25GdAiXonjSqpfhBxc9Z8qouuuv3TT+/oUxHaYE2cMxOt0rdDRopojUqFn5zDae9tDW0GgDa2WBr+K0gBdPXwromrqDeNNtq8vnF1sH+8VNR835rwn7XnT8gsmOi4yiMV8y3BmhNffCuoJ80rg5/FH9U1cN/WJ9a2XbII2bRPZnBTmjTYpudLHzvXqpdVgytrvoH5Ygnwqe+Tc0z7/bZWK53oKdprqgB9sYyoHgiKE07qQa0dmt/OQfw+Fqk8XNLMvtpT0iUSY21zNYrj8995lk7ybOeLEjvTZs3xvK3t0T0HokZWw3U975KnhuyucJBTju8pXvQR7YwsG9+aYUYG9tporA84JP85oo03nRjmzy5fKozkC7beLv+rlpaG4yk/pK+c7XNnMt7V1VVS/U2M5ouxZ6KmyeIMFclVm+eVtTZW5yJnwUmLr9e1QEYtcsi247ZuIy8nPfs/2jxvxjhLSGrZa02224ALvBGoy9x72MN5OynzDs6AT6+GGz5TUcOWPEnNlelt6TvxzqVBNOCG++HwBTI6PijlWEsLmAQXPW8pEBp78Jp0PuN4YAs1xTpBUwwzxTOc+NQewzRs1xUw8UrCR3fP/uGILTJ2Rzg/SZntfh9AbpGjrX24QZ/GkvyuxEnnWGYC/VVjqlufqdcGMorPFBiFueAxvzJKfPZWureW3/bNEVclk1E7/FgXTm1yU0/8Raozi2db0b5T4ZY5JjmMxQj4ZwgAfPknR7v0i2G8JyveONxKF/aydDYdh4q8M71IGTGIMUbvPiyvLyK3pTqhlSRcUW9h4WLlUweQwx8CTnGZfI+VlSAG//p+qD1lWYsGojns28R9UmhLQ0VqyovsmQnpQHvcDI3/nCCnHpdtIs2aZhttT/3L9a7cMkDNpc+iixj1/o+AdNOCycsPJHVd5STk9enh3XW1LajaKBQ/2HEtO1Ip3vTZzrK7lf/6UVRqvWEmTBB54kQr7UecZ8cpepLDn+musTe7eQSFHMpNHkTnTgAb6sUK1YHhZmCuc5F+r44vgYy7ClXLuSp08IiYbzWziWBCZbzWYEwyLFnZNnwtEq2Dx9siNrdEbMdm0wqTS2z6a+PgoeSvvacjNBKkrmNcPy/wwZnj6vqVnKV7TtH350Ljk9PWS3hXL9HgQ7YLoeS/lH/P4+6/gJ/sTvY5d0q3c0Hyjr/WuaZjg2VttJiFszo03BUn6+MyM1kut379Gckv3y8yEn1J9YhT007vppfMOpnRx5954TvSh3Gnyfd5TGHsmb3HGFwd/sdLeLI5PA5bNYBQNX5GggrCnHGph1wWlBwam+M6IMVIEJnQWMPflCEsYvwdauyLLSqWPCJmijc4IyF0jGZEnpFsM/YiWflouNkOKfsIO4dnwgbNsHQQL0zel1+S2DbNCTbbLN5B0sgjLNcSAwlT5OtvbA8HAhmgFVxlyUoYyOIv3C5LbA5KMftpYLihpUngEI3Au1CsypjXrmUqC9f/mNrhtqv9Zf6r80giF+71fj0Pzk67Ey9NNE2ZBIuIFtB+6kYBGvzKa6F7IaxVVhD6d0kob38kOtKtIHQ4gzt9TMdMhsuInMXc7c6TjstzuH5eKr8SGm8UAamj2kzb51sNDWwCxcPZpAKWjJAbT7KEabWX8eGbdgw8RqeDL7flYisj/B8v8+QhwUJ8gGcs1CZkGuv80kD3OSFYjCChEfUzAnlJXRDW4MFg54Op8S/Pn4coSqBgoXnKsui5fKCyem/9x4u1eJHh8rf4XfpHd8/y/tATf/arHxxnUsrnDoq+em0P1hUQfzIGy/zkCl+OLE0NpE4z/XmQm2tW8AiAZrklJ9Hmxq/a1HPvVK4d6cf+D8lWzrZn5/ZCvruB9XGfFOu2P7IXjSC29I7ZzR/744zv8uWgk8Xw9O9Lb/Ck5oeevtnHhiBs6L2Iwff4JBrJibmKE8JMBkd6nd9y/32HECF9bb1RLOQ3GwST0MqchkAYUi0g43SzjX6MVWJCAVogALgnpNZsDgdbXdLle5JNnhRQ/+MOY3tzlJTgABxVMOo+m8iV/X6AM3T/uGA5wGQ9le+JYNWM3KzQB/Md6+LIj3GRKnANiDw1JOdn/tfFI75x3qQZKtjOQ/0p8IlvbCGn+ak0lxGk6EavZ9tITH2IkuskGvZiuQKr+ojPUN8AU8e5uCnFbeTZ4ZunpAzSj/Zv4OCedGS4mtMMqAbPMxR/XKJzCaQh6HFwrGbQyBWenwdsAhXuFJRXQ7sLWKuRtlgoV32lUvM5z6TbmJmcg5o01FqIkiESkX67DFzE94NhHiBb1ZMqRg5f+mF4Er8CHP4qOCZZryOUkfbJcuMpNndBBJ4blWJvY2QN2oPjgncgHRNX5cqfGKple9/kQkkb9m/Xc2Uzh/y9z26wYh+Z0qXPg3/I1PdOqY0OFctWiUTqoqfe8x3f9iNq4+TyL+IdCi22rdXD1/pf1LR9KvUhZlqzETMCEYY5rRXvvDHSu7EkXBHgN1i1WeP0n+LUetnDUgcWWQsI/jeGHP3o48NTFYCFfyU/hHSdMKdoEtbgfNY5lSj6qItt/3+KrUuqDAZHOf9tLDLWdeRcHRABbKb6s39zGuTdVrHp+/ci7GVDrJ33P9eQEZ7hnlcAhtLRxET1PqvVy+aR3XeCJy3Jht4mtkxQ3EkPYBmP7TkC3+NtPgTtoV97hAg6hhPMG6XxgkC5SCBxtYxhPJQvcQINRsQ0pPWPl7olbNJ20bbucy8w+vYdpSB97Sc24OIzhn8+blQr50i/jF6yHmn80emnjtFxrEw9yXNNzl5GcXE9vXlHMUGn1HjK3VgsGU5ICPrslGBIsrNLv8rzkPFn2GRPKQlXknqKXMp5cqlkl6D505y81vjFW9t1WOSK1fgZpiglqbigEMobUKiwurz3LdSa9TIXXMOxF5b8Nc22igWvPfHVfmuPE0XzBk5NWKlK9qba/eeNH/zvoz0N/k1gq5DwYcZ/knFWC4f0N49rTzuxSJD6ZYPov/x/zVNFkZzzq1UVY0Cg59shMTCau49vHialu3eGX1TZr/Pi0XMK+cQfgMa5VezCGL8nJoK7Bn/uc3ruMzJeYmbOris66C3DQD0vbCL2sS+/8Z/nqn+QzL9bOmPmhxkLupZpbubeeZjc4qSUWOibMpnPqEM9Jq6TYACicvkbh6KrXeOR9zKMvq3qXj27nuh53ROm7pfpW4hI+G4KgvlX0fJr6VL8/t5DX7v7BPeUcaoK3dbypD7fB6ZeKB+fymWOyFN51nP7tpkZenXP7x2Wkt3ovdRQCx9n7+XpKQCmvW0XSBimxO2hnupVpF50esqgX+V8+KFeCoW6Ecmz0ZV+M/7CXZKjInCIfDitVaOVeIejWHM5z6NWX66+kizjG2IQ/Sxiif/Ma2/O7eKHNtUiYsiZKNnqTJkn4pHy4fFjXeLT4vAjxA3TtsROhOKIV52jzvwWFCSdfG2Ns1C3y/9nrAsEzeYbxPs0s+Y5bh5mOxT8VWfA5o/6FxaanepG6+8XxAxn0sz/D2g1xbErRK6a9P3C1iPT6hHt7CjzMyHOVfNgTjWMMVl40R3AwBoNnZQIjdFKlP2p6zUmh0ZB2Mzm67EMSF/IxV3/O/8PFp5nL9TRd3ROi2yadVlouVdULuhAK4cuBh53wv4R1grlbFbrHF8KmA9PybJR7OMtKbgqOd1hDdKnlSvO2/7xTyu4rmSvlw8jxIDGL5BALWi7se6tSz+/w9FntFQksT22n1vtBKPZq7CqM5D4vYidv+LHF0Bb/Vb/r65/Avb8v6fV+JNG5qDTi6+HknoL95DJudnmxd8ROjaYqyLlU9NrRb7S+xrDoWtPZE7HCY27TclAU8UGfHFF3jylYQ8bkXQRtvLh2JfemPkozxb8XwE50197f2XMmLERYeY0XgN3anLvcy5rEgpbvkNl3CX9mGry69leebm6SLSpbdSeQlnN9ILy2seSY3vnCJ4oWmmIY0cnG825YQY07oYOt84sA4SXiKm9QXHbudC8IGfdIor1Vu1Y8P+/hrzUezjwoKcEqd3GgyTWr9998xgaSsia7frYH7BRjmasx67fLX2yQ47WF+k3BeUrReRfUUTGrlRCf8duGy9ak1PnfzVkdc3w22QQiXTYKe8h65LFrjtVo+838PEk/nMgaOPHhlOjmV47warfui680yrT+l8jzX/tApjAia4/6zz5pmcTBhH2tenei/lcVX3eC4sSrZsoQVdK465gcJv0eL4LkHs63akdxdWXxQ2M1Sc7MthucLgzs0Qoo3XYqXn53W57tg4qeFvimsuFCjZe3UxtRNX2Fy4qXfgNHf9DioNQO85YvH7KKKmKoGbwfsBgMv7SZI+6WoivzGG8LR1X/fKgSHj4Pb/62+wH0zB9P5EMIhlcBueCwyBeD2q8Kli+txQK8ssIIYfIugnmpIzempICFDvzzc65sCfdxtNm111sjmX6bPuVZrR8Cx2ntw+4q1FU/ow3RTS8/695zpn0LqEP3jUoyRvDK2GW3iyfYhlHtYvd2qxXBI47rWueS1ySxEmvBR3LsG83JNZ12aF2hkxoOV7evKW6IuRVf+0uUa4p1+809wJPMTZWYL0DO+tpJSpL3vNK8oHJZvurqRFVMMGRqbbDVE5AnvLpE3Dy5Tzctpw9iMCUbXs0ErLi4YlDDcAX7OrIKQ3qHySci28hc3K5NFClEw60CScQoWpvUZqxKjVl7FI4BAbAVSjJGc/2UUrmGnhA5gMw5fVJP0YyjyFy92K+wzrf16aaXYm0OEQVUHKLhhTkhHAKviC5Is+dZx09uJmeWD7i6WuCd/JHfOG6lWwzsEZDEpLfgkOb8r/n3RIXqlaVHlzZgeCBZ2zmbQ3T1Tn3ZcfZo7AFa8h3tDlW89ARakOfm5dh97s8+YAiwqWQ4/xH4bmGdR0QynyQooCumeHd5mxsUUTgtNSzACbGJBkvsVCOXEyJ0Kw+e3UlwRG7Ou5IJ8bZEH72lFaIlP0d6sLKoZ3bt3UmSrHtN+t1E4+Z9eGLjN3YU+pOjS6gxdzzfR0BdKjsnrgkiRCjeITwSc4YPuNKPJINlR3uGrtMrmPKpZTTSzDnklIR5iirBz0HTObbOooRroJh8QCILt8jNhAimH/Hhs0FSUiyxgfKLbgCLe7029rIREyMLKrobm35vh9Lx9N9FntvGmbEqsWG3jwrBivG5KkIdAUqEpYxQOjDNV5EjnY2UmO4CdYB/L5h+Z88PzgZmIB0NIB54jGYLUvISrYm7aZWqf9XAW/kulAqkpeLFO8etGBcgh/+OdrNIxH1jLhqjOkD543djTbRSMgeH3IWb3tUolYp42eqXvbox78/lorbYVZxBoDyNjH4Ai+LmNJLuOcT8hW9mUuvwEiHgXxvpCbGLTh7UZy5AFDkVz/QTZck5EGj3rg4pV1rB4RVmN5v2dTTROgD4umAD2lIA0o5NJcRYJeHGCT2cQzk8AU1TOjSonW/9+myuVtdsiZyV99EP1zAZXdsg1boyOjChDsytp2ZbTqfCMpdTjzdoBnP2ilcl9WmR+pXv0/WRU1EcxhiqzhJl+podBOmDheNcx2izPCZpI5ADCAZ45GEIoBdPQtCsO8xrWx2eCNF4enF/XEv515SK1Y1zQaRXV/x/LMrP4gMmzBKrCj2jrYhQaVn1Ghsy3g2plMo0rMJ721nO6bB2GCd6EzNfsFxo63kJXE7Ztt0vhDP5BUVFMxHrYzKsarfkN8vtRKgkeW0EUlrEYZyZymGnRQa2uDf/W3ILRdodBMLPmiqy2LCHjbo4wQzdVkFhyYZ6yRCIldw3Mh9R+WoVBZwiATRyYlqC5NVOYHz+h1lEk22+kkEMcuGuGKPSFIsnadrMZaUSn1g9hNps8OfTHmso/6/J5uJfZzcMEMK/6i1Nf5Ot3l+9kDhvhNA3FtHdWfvs7ZWRAj4UUIIaB6HCJhGY7LJYxn5A4NwEUKWhmREaM4RsQQ+ZiCmLAJ1h8bm6VJzAuYfayHjYsczF4+YPyE31MmzNrwpVrlwWMi+nZE284ZtsAzTALLPpvM2Iwg3DRCTh7tepQAcpJhC8zjaFlJr8kiz6PpjcySMAF7o8EsLpUKK0lRJYdS5SnH5618chi6YGvMZ7nGXpicZsY3kgx8gjniyCiCW5X4mU5mOuUxzt1BgHsZ8G19v3joZLJIbE2fKKZZVV0FeBAApiWO/5niSoroEIXk8YaAEkHAcHLlKn+WwM3qj1MfxKPKjePjFvD9qEVB5BjmLxdHHg5X7rLlal4tR3Yaap9osE/ZwLbv79bHFLVRlrfGzArzjHDlGy04HDFlK0HEHEF+FgRE1Tw2YhGham518GNMG7wg4jM2Mnc7PwGdDjlYN7ka6NnKvj6F9HxLL5vGMS5TN2lITOBtxFFjRTzkIIM2Z06JozVUrm/ISrM171WI7fonY3qxvJFiW28axLbgY+b/0VmDa0GDpF28B17AmtZkPUJQIEH0NR6gbklm8lu9zUqAJELiEFA6CIqFFwvlHInWhhhuyBwKUJ4+4dkgVubwNMbYU3ijrMKEiEkomwFwVw2BTVAdq3KJsrJsn3GOvDo5yENUZOEaqSaAWYBUe4NDsAvXR4gB8LaIGXPoRfEw9GB74w3sKJxjfOiKVZO4WChh/CCvJ+V+M4g1mI2Dd0ph0NAMXHZbMrV8ofLwxJICadchJCJBUGuHK52DwFVq8Mn9p2C2IylMS5H0c3Yanr814Zu9M62osbIsUpcNKWbJcsUxu9XGRwvJ8tDFUMVDE2kOQc6mw8wbb4q2T9uXKckPu6VwUnmIhDUAiE1PNWY/taX2Ergmm3c7u5JhMveHPBN0am9W/KImRXSRc+XStnNLEE6pjCSVe3/nCgiO8iL+7FGDvD+KkCAW+golxIekqzJAaZULtX9aWjmuNCVFVfXGFZKGfmQlQmwm26bAlZZwpL3vVMlChAAgKFOYHJ46JefhWDtOI2wJIhqDt7OH+Ln/DYvVOrOyNCPcnw86FbGVXt3vR/DxIEvuPH/mT4KygxBA0/eWb5NkvUiI8ybumNNmctIgcgVvsN+j9nB5amyGXF63Pcu/2F5euD4+9AEND6pOqHDnKImfZ/oMIFiyA52I0zqmIS51vfu+7MmFxMRHB/x9c/WJE+sDAiEMzTdZVLHDVGaZcERJRv8Fryq+WJS74oDtX7zDf1VXvFm9cfKigluZY1P34Bcgp3Jjab+OdRCuSkwqzRpWl/wcGdxDUF7fwoMteEbaPfO7ucx1ydT37Aa6N/1ZGo3XwDDar7Jar/sa0XchWzU3apZx3VcNlb62yXtf7QiLB1rAK6lOSqVujlP1vi+xJSqmtS58rJIbJj2THTNtL8ioqBA+wEXBJgOrUreptrX5EsfvnQo8tz//ag9WKbCvvbeuLKfrBfaRcnrH4X6HembXA8eVWXzSbwt/AWXKSyOjr01e29MNp17DIY79mRsLuREE8wBFXHZaZd3fU/zKQvYn6F0TRMjc01sppIX5e5Z27eShBMU++35e7JSirvJ7JsQDZIMR8mZw9O9HfMhR8rNzbAUypC9qcMbDx0Rtmi59jTnhry0TFdZIHPs20ohb3bQbsGJr6/geAyhn+YLB8ocirvwAwi7tpTt+KLEJ2yZtO3b2Gn3LR3b4Nlg9mXc42Jdv+3LNEQ4uc2bI+edNYQHWKOQ5mLMQaOFb6UWE45aEAcUs1NC7Rn2GZUErwbYCeHCbxkyXIKmVhV9tBUELJx+udZiI1U75mq0av6OUU39z7pfJvXRxaLCiNdwHv0Qg0550hdx0LfVZ/KSs8A0UO2jwSpZzw739PtEuC8y2UsGzH0c8sakoDma44ZFmWnXKo25gBGd8Qk3fXWe0TuEFM+InhE7512QZRUrxG23nZdaDxfT2VhcqR/eFly1VVW+yUPZHz7nCnz9TOSLQs+4itjb5juT50/EYrDSXCXaP4ku//Gmwrartb5jpkDXIWZ99BPwQaHWhu1a5YSET0Y+oYr/ZamUTSXHlnsPFlJkO/31t5k16VrX19u1Wt4uLv/kxmM5u2KWioZKttFeBEf3xfcUOakxWmvk3e2Oywsj+rYs8SwIKO7IeNqtL/wcMiFo7a+IW0h7QjZrbcdUVqPys958Ybn54jl2A0H8bVfdMR98LiwV8sas66u7KrDYuHOGLJc703F+aUnqzAymGIuCbTuCy2MOsMvM0ifJDFo/wSTjFO3T/xPjp03L+a2xu+HPxp/mhnSELjgR19XUW0IfpWo7ygStLf62bGFZaEXM3vb0k4rvuu3Tk2nKDwOfBRTkNoctmMLRjlpKgdXGaFWdzFzWZEe4MysHnHHD9KYHdw4oPK9ucGdW9TGz5rwRWBLeD9becuKQ/A7m+Pp8wUXT3eqs3QUiTg+vSnPpn+g2NrUXvBjHFYvvhikXwIL3aUUMviNEtxqZYpT0eVQVtgiPjaZ6+D6570ZzQ+uUNFmaxwUXyyK/+MFdl2hC8s10U7S/ubF4J8ZZctlXEc/ZbaZFW0Of+7Z6mVkOB+Z6ND0FZ36Sw3ni/yobzC8vYsD4AjrEZpjwq2vsYn94OwQ3ascAu6nQ19T4kjm8CT7wmjOc2T2piG2c53BwcTo6inj/2+JM0ue2bJMXFdwubhQs96Ao//zLR0f0QPsCbK9BhoeeY1c0bvYczU8auJWbm6se+CHI9IpQbBygz5DDNB2BCrIeMbBp5XYLoQ9HM5aZWWBBWtpO4i2yz1/Urslpfo85JIkyfUEKKTAy788xDFhCoHIQkw2t6a63zAg3bQPWNhrPNjkvIEYzmYsklK8dleTm2rCwWPJEEOVMP5MuuAQv9o+9qqKofymUZqlwAp+7idIiJt7rnMS9QX9zZFULk19b1AGvubY1Z6EKMXFlUbugqYBVIRKnmANpKdR4IEuhjjIN3cQ3ZxUhFE756XeUyy88nCpGuu0i/JdkPxVG9pKGZRfAziGMvcR1utJ+/UU5GSLFrO0ZDXkVpPz+HIeYdaFnziQy5TsH1yzsp5GN33dN+v54Pw1jEIiyh1tzNvfk7KVD7v7k1MKu35jPXPlZwHMVs1NTF7KWbknKeaFKyR3AV3d19r2+5IUBtLgmtbuOHGAwtasgtjt40+zyNvk1u3MoNZghwaHMXt+Oe4s5sjlwR6Z68MfUKHdLadjcnQqtzMqsuAtP3yql+hspdewHgt3LAqas/vSPKNdAP4abfuCVLKZt5IxN5OFHCSuubaoF8+8j5lAkuHJGUtz5ScPhS+OeQfvT6bOZD2MPx3ZW8UzPEZStOjp4VBEW1B9WPNptXua3NO5kx4nF06ZHdemYJRfUGBXDW8JvHWlSjYh7Z9qUH1SjNejnh366KzKdMypq6B6G8R9OIs/JKw1VhljwSMbFf9NGHA+BvTUH8vnxBUHn4Wcyvjbgdd0BzIMx0qXEckQryBRJ7/u0H2sRki6WescaB+GlzAIQ0voDdsQVNfeylSdJNjTPaorrZzRzVV4df06pFl+QlzJfIGkRI+mwaUz5QSGuNqRiRuQbpHZsRtcOXkstFcPZHYZ3KkTy89mYpOqCddpWX5V7oTlr5zSxdzXnxEBMbQFGH9ns8J7I/BsjXEpptmzN2Cas5CafNbKK7wrPVPZr2gM3kRvgmHb8VxvxboPFcYBBKHcNsG32rqQn8/mBMmZ2VTjEC6hRzD2cCAmwhjdjlxhl/HmVl7ZtF05SNtLCzYjZ8vw3TGFp+fj3I1H9M9WzitE58/39ByIrmtkq5Qd54/xJolaf1/c1mRoZLVFeUQ2Zdn3GWpoBdjJLC5gyn8MjARbmoQnZmJ/Si/BZk3ft9W4RephqWGYWI/6TRYO6Mt4C9JJeMm8xlTmoB0ywkTnIUIRyQXj4vv8bxIEyIY+Chask1dxspqLJxp5oz0wvdXytBo1QN1KY9GSzZcmIxKzCx9ljECdiRoZ+PaLZjgpzjfMnVrRPEc6VesgxhmDPNpTW8vbodtD4WmXypPCaNd4epmGMDLIZ1LS0vuBNxSO+JlZcrkAeJZnak8jtOjhE76dxExXv0+e/Mh3E9UxlSlv1H9EwxB+1sWRqozpnvQlKhSGgBYhg7atuob9NCFxUkMw5V3+3fEKIKmV9yTmnCrW37DJ4mHod35WbZkx84s507nLdQz0BO6tvyXJkMvdLs8E5mxvnum3OLTu/CzuIPeOjrnPm/hbtgQ9upVM/qzx9/vvACCHMMZq2ZCf8Hu3VH2Ma2SyWc/iv7lNuo1QsmThI9keMKCZJtwsOVkCZXDbneH17MnOncDt6FFZtkMfVuHMhSF5+OvVXBYAM9dz6Thcs+eRju8nyLFOzCFECWPUX6uPd3zLEbz2xNaF4yHvRRrdNraztxEWjbyvhHQJnKEdqYlQoT5JgtmdXK0pzzy24zSDjRfduTElP+wjl7RvpJF0oHe82jFFvBOkalsfWNOjs2KCHVRTn9Dtvct9O4kLVlfEjKncdAIQnQchlqnWL9W0GK4pLF5dj4qSSoIYaMLvGNoeQbnn0sEugrD5LMq8pqNb5eqKYBRHVc/dKlJbW+vuhAVoZrE5Ic4QFlp+gMGPiCY7+qUdR4fvzbCjNSVFMkAVqTlhBUPTcyK8ODFwmw1swa6hPPY8CFpu9UZSOo6S/hBPsyPqf+cD2ITK18HwopIY3K9VjKMkBp9U3W0b0lYjtRqF0agwKbYSxYXEFDzVgbk3WcrrwyO77E6cJDf+ZCxnqxhUZIQtVAIHHSXG0MnGQdWgr5GH3kukpSWGMKs8i8SkoEbN8TNRmsG+8Tfo1ZWxtp9WODBBA7/sVPTk5GUNk30HyRliqGRfQ0ATEj9rKyUcePliPGOb/h/wSk2Pk573dLHFv8+S6mlE2Fyds94iuPsP6Kmex+ymi9X7envTkmvT0jjo6SV7F2qTZTH1AZQ9T/onvOgW6LOuPJx6fdgM/TojoeogR75jbP2vOaH5niU6y3JtpfpvD8r9HQTuRkrv4VZhOdHX7xpDTj543oS8A5a2TVfD68jRoiM7Eju+z2k4FfZDSQgPf+tUAqr1WzHuWzRuTNzocZNVlVd8bsEAj0q3uG2nZPM39XgLE5z0Ejb8wggNIn4tsqkiirGh1fCYQ3hNQJRlKGDXgX/MQdEMFqHH9yVWyT/5K57bcUEwdg5UhvE58U7YdmTDDvX63y1fGdtvsHX/5DpaUunnX6AHksC+sqm9S+XvHdy013qYA2+PBDqZfZ8I37OZ9ts3qAu9d7aSOYO0A8wkejpwLiCtbyElw0vsgLaPwpl3L+z36TcodknhICX/95TwygeF/RkIne38bEfjSB30igZ2jP8Tdlhc2IYO+D1JsY/DnWj5hRAFg1Tatwnx+6xxLzy9pVnPQ7EAMenp5M3bnKET403Z/j9h91rve6ht+/iNAueugaL1837xp/AW/CPAtIIshLvjzSs4r7DBs5E/f6EN85RK9Bf0EhXOtQ8guwEzsYaFd0ldVQnKz5ZtXKCAuGjKTa0ZmuiX/NGHf4e68XzvHbwtq3RhilKQX561AK/UqoUrhDuS5FxD8Hu75xpR9iO83rV25Lcg5fvEkyP+CLFKYSJcGI0ytzHVSiFMot8AsN//a8Hn7O/kvJfNHEPBnv3t+cE9IQyI+biEylY7TnZUICEKBQlHMFkoopYZ8yqml5elI/Gc6roLeplkSJlvj+9SQvtMosobEXFX7RPmzIYyMq3TWovBnMPJLcGYjCgSh8wqUkRDydx60TIAm9qwSlsLWK7AEgIrCZW5+/FoBBFVozGlCxgAMsWO9rM62PaLHdD6yK7x+6A6Z5TGfGCj+rWfLaBpCWnk/plPoFqhC9BgIgeAMx7xQoWYqFduQIebeBKDD1pJsrN2D0O8EnRiUilE5xTWGqKn5OEZucek585cgLhDhkjwJrQUEYxK6nyCxN4Nkb28dobaFWETxVVD4DMlsHm2ALtsaWvGLWGiKXSOJ44vdQkpUhVo8620w6grMzzgFlHhziK3ipUTvFZTNW8hliLqRm5N/o4ijmy8zI//KS8WczWRJR6skVaewxWDzXENS19KkTi+JVOLVDrTnWUg+loT8GJtTcVbPn8OJgNlnA9SzBYtuwYEluwwtR1G6lLij+GcaYlvMfdNQ8fdH/tUnx9fDKvivw1n7ZidffQAbNOvj61O57p4WFLUN/GVaAB3PjoXnK9eN3vFC4VcO6v0BTkuTWrDs2HPGRPJY4qgkxpFMNSyHQSlXo+EAHQ47Y0ex61iicE5hX1NTtDmEMD/9ESlv6Hls0vqmrU1vc8vn+f67NhduZ4m2F+9AYQ4V4lJuJEL7Y+e+aHeYKelapBZyB0Y3gpYioBWYji2hkwU8oxDomO7gsTDs2kLhFjpILK/DQAP16wiQV8DJrF26jgJC8JFTd3yotRKRAoTB2HUYRGHZdQRY0+dkaQeuo4CM25xaX/eXqyiZwiTKkuRp4PrODEvMShrcfc1jViQRThrYf5fFbABrKZJlTnl6nB6FSY8WHZzYDHN/VPCKPk2GWqlHJ9YHD5D5vC9Ij4liNrV0mGbMUvUn0dc01HwgRfuGqhFvfKAlZVxViky65dvwQLeeekNLB3QNMezT8a9JT4jpH+UPayEHCJg600D35mGeQigCYk71DbgrE1c31KUhpTSclE0mVdZwajaguYxsqZmBnYAjY7NuOKYBxtwLYNk8sWalq7JComkwNOsgWf5v7Onlw6cvb7/89u3HcT0/CKM4SbO8KKu6aTsAESaUcSFVP4zTrJd124/zuh/zWhTDCZKiGZbjBVGSFVXTDdOyHdfzgzCKkzTLi7Kqm7brh8Vytd5sd/vD8XS+XG/3x/P1RlAMJ0iKZliOF0RJVlRNN0zLdlzPD8IoTtIsL8qqbtrhaDyZzuaL5Wq92e72h+PpfLneRElWVE03TMt2XM9HQRjFSZrlRVnVTdsBJpT1wzjNy7rtx3nlUlHrY6597kvEJ4BABCYIgiQoBJWW9cf94YH7xZr+4/Ae//VUCQOhjCeqCQOhjAuptLHOy9+j2xhjjDHGGGMytxERDITGno+PmGSEgVDGba4chDKutMurEMq40GbsNHchlTbWefkFwkAoawIAAAAAhBBCCCGEEEIiV2NhUQyEMi6k0sY6L7+cMBDK+Cf93ZX9g1IMhDIupNLGOi+/gjAQ2rHgbfKiGAhlXEiVV8dAhk4+wkCYUMbl12PCRkw3wkw1Nt95FsUDu7B6bxPBQJhQxuXXMGEjZrcq7byl6v8rEcFA8osJA6GMC6m0sc7L39ANAABwlAgGQhkXUmmT3aFSiJNDrPPyqwgDoYwLqdLPMdbl1a7z8veZ5pxzzp2nxMuvTxgIZXz8dU6xCAZCuZBKG+u8/GLCQBkXUulMQRkXUjU5TQQDoSq/xniirrSxLq++8dELokUwEMq4kEob6/IqpY81fYymtwtRDIQL2SacIYKBUMaFVNpY5+X3sZcxxhhjbNO5BUIIIYTQl97NMBDKuJBKG5urj+GTiaFt+riakqETThgIZVxIpY3NVRKGxlqHCOecX6RiMQyEMi6k0sY6L7+KMBDa5yJtqrXWWnsDRDEQqr38Dm240oRFMRDKuJDqu33yowYAAAA=) format('woff2'); font-weight: normal; font-style: normal; } \ No newline at end of file diff --git a/doc/contributing.md b/doc/contributing.md deleted file mode 100644 index f0b1e86b104..00000000000 --- a/doc/contributing.md +++ /dev/null @@ -1,53 +0,0 @@ -# Contribution guidelines - -This document sets out the methods and practices for contributing to the Verovio project. - -## Contributor License Agreement - -In order to contribute the the project you need to sign and send us a [Contributor License Agreement](https://rism.digital/resources/verovio-cla.pdf) (CLA). However, following a generally accepted practice, very small contributions (below 20 lines of code) will be accepted without signing the CLA. - -## How to contribute - -Adapted from the [Music Encoding Initiative Guidelines](https://raw.githubusercontent.com/music-encoding/music-encoding/master/CONTRIBUTING.md). - -Please use the "Pull Request" mechanism for proposing contributions to the code base. A brief overview of this process: - - 1. Fork the `rism-digital/verovio` repository into your own account. - 2. Create a dedicated branch from the `verovio:develop` branch for your developments on your repository. For example, you might create a `verovio:develop-noteheads` branch if you're proposing a developments for the note heads. - 3. Make your changes. You can commit to your branch as many times as you like. - 4. When you're ready to provide your changes "upstream," you can open a pull request to the `rism-digital/verovio:develop` branch. **NB:** You will want to make sure you're proposing a merge to `develop` and not `master`. - 5. We will then review your submission. If you are asked to make changes, you can push these changes to your original branch and the pull request will be automatically updated. - 6. Once the changes have gone through our review process, we will merge your changes into our repository. You may then delete your dedicated branch. - -For proposing changes to the `verovio:gh-pages` branch of Verovio (e.g., its website), follow the same workflow but make the pull request to the `rism-digital/verovio:gh-pages-develop` branch. - -For updating the tutorial fork the submodule [verovio-tutorial](https://github.com/rism-digital/verovio-tutorial), make a PR there (on its main branch `verovio-tutorial:gh-pages`) and wait for a merge. Afterwards create a pull request in the parent module (i.e. `verovio:gh-pages`) to point to the latest commit of the submodule by doing the following: - -- checkout a dedicated branch from the `verovio:gh-pages` branch for your changes (e.g. `verovio:gh-pages-update`) - -- change to the directory of the tutorials submodule - ``` - cd gh-tutorial - ``` - - - checkout the main branch of the submodule (it is called `gh-pages`, too) - ``` - git checkout gh-pages - ``` - - - pull latest changes of remote submodule & check if it really has the latest commit - ``` - git pull - git log -1 (should show commit hash of latest commit in submodule repository) - ``` - -- change back to the project root directory (Verovio main folder) - ``` - cd .. - ``` - - - check the status to see that the submodule is now in the state you want, then commit with a concise commit message (make sure to push your changes to add them to your pull request) - ``` - git status # should declare: modified gh-tutorial - git commit -am "Pulled down update to tutorial submodule" - ``` \ No newline at end of file diff --git a/doc/diffTests.sh b/doc/diffTests.sh index 348d9731425..2e4513c57e4 100755 --- a/doc/diffTests.sh +++ b/doc/diffTests.sh @@ -17,7 +17,7 @@ devdir="/Users/laurent/projects/verovio_lpugin" shortlist="/Users/laurent/tmp/shortlist.txt" # The version of python we want to use (we can be more specific here, e.g., python3.8) -PYTHON=python3.10 +PYTHON=python3 # Store the path where we are home=`pwd` diff --git a/doc/guidelines.md b/doc/guidelines.md deleted file mode 100644 index f5fc5cb4bbc..00000000000 --- a/doc/guidelines.md +++ /dev/null @@ -1,194 +0,0 @@ -# Coding guidelines - -This document describes the coding style for the Verovio project. - -## Table of Contents - -* [General remarks](#general-remarks) -* [Includes and forward declarations](#includes-and-forward-declarations) -* [Null and boolean](#null-and-boolean) -* [Class, method and member names](#class-method-and-member-names) -* [Comments](#comments) -* [LibMEI](#libmei) - -## General remarks - -Verovio uses a [Clang-Format](http://clang.llvm.org/docs/ClangFormat.html) (**5.0**) coding style based on the [WebKit](https://webkit.org/code-style-guidelines/) style, with a few minor modifications. The modifications include: - - AllowShortIfStatementsOnASingleLine: true - AllowShortLoopsOnASingleLine: true - ColumnLimit: 120 - ConstructorInitializerAllOnOneLineOrOnePerLine: true - PointerAlignment: Right - -The simplest way to fullfil the Verovio coding style is to use a clang-format tool and to apply the style defined in the -[.clang-format](../.clang-format) file available in the project root directory. - -### Downloading clang-format for OS X - -An easy way to install clang-format on OS X computers is to use [Hombrew](http://brew.sh). Type this command in the terminal to install: - -``` -brew install clang-format -``` - -### Running clang-format - -*Please make sure you use version 5.0* - -To use clang-format to adjust a single file: - -``` -clang-format -style=file -i some-directory/some-file.cpp -``` - -The `-style=file` option instructs clang-format to search for the .clang-format configuration file (recursively in some parent directory). The `-i` option is used to alter the file "in-place". If you don't give the `-i` option, a fomatted copy of the file will be sent to standard output. - - -## Includes and forward declarations - -Includes in the header files must list first the system includes followed by the Verovio includes, if any, and then the includes for the libraries included in Verovio. All includes have to be ordered alphabetically: - - #include - #include - #include - - //---------------------------------------------------------------------------- - - #include "attclasses.h" - #include "atttypes.h" - - //---------------------------------------------------------------------------- - - #include "pugixml.hpp" - #include "utf8.h" - -In the header files, always use forward declarations (and not includes) whenever possible. Forward declaration have to be ordered alphabetically: - - class DeviceContext; - class Layer; - class StaffAlignment; - class Syl; - class TimeSpanningInterface; - - -In the implementation files, the first include in always the include of the corresponding header file, followed by the system includes and then the other Verovio includes with libraries at the end too, if any, also ordered alphabetically: - - #include "att.h" - - //---------------------------------------------------------------------------- - - #include - #include - - //---------------------------------------------------------------------------- - - #include "object.h" - #include "vrv.h" - - //---------------------------------------------------------------------------- - - #include "pugixml.hpp" - -## Null and boolean - -The null pointer value should be written as ```NULL```. Boolean values should be written as ```true``` and ```false```. - -## Class, method and member names - -All class names must be in upper CamelCase. The internal capitalization follows the MEI one: - - class Measure; - class ScoreDef; - class StaffDef; - - -All method names must also be in upper CamelCase: - - void Measure::AddStaff(Staff *staff) {} - -All member names must be in lower camelCase. Instance members must be prefixed with ```m_``` and class (static) members with ```s_```: - - class Glyph { - public: - - /** An instance member */ - int m_unitsPerEm; - - /** A static member */ - static std::string s_systemPath; - }; - -In the class declaration, the methods are declared first, and then the member variables. For both, the declaration order is ```public```, ```protected```, and ```private```. - -## Comments - -Comments for describing methods can be grouped using `///@{` and `///@}` delimiters together with the `@name` indication: - - /** - * @name Add children to an editorial element. - */ - ///@{ - void AddFloatingElement(FloatingElement *child); - void AddLayerElement(LayerElement *child); - void AddTextElement(TextElement *child); - ///@} - -## LibMEI - -The code for the attribute classes of Verovio are generated from the MEI schema using a modified version of LibMEI available [here](https://github.com/rism-digital/libmei). The code generated is included in the Verovio repository in ./libmei and the LibMEI repository does not need to be cloned for building Verovio. - -The attribute classes generated from the MEI schema provide all the members for the element classes of Verovio. They are implemented via multiple inheritance in element classes. The element classes corresponding to the MEI elements are not generated by LibMEI but are implemented explicitly in Verovio. They all inherit from the `Object` class (of the `vrv` namespace) or from a `Object` child class. They can inherit from various interfaces used for the rendering. All the MEI member are defined through the inheritance of generated attribute classes, either grouped as interfaces or individually. - -For example, the MEI <note> is implemented as a `Note` class that inherit from `Object` through `LayerElement`. It also inherit from the StemmedDrawingInterface that holds data used for the rendering. - -Its MEI members are defined through the `DurationInterface` and `PitchInterface` that regroup common functionnalities for durational and pitched MEI elements respectively plus some additional individual attribute classes. - -The inheritance should always list `Object` (or the `Object` child class) first, followed by the rendering interfaces, followed by the attribute class interfaces, followed by the individual attribute classes, each of them ordered alphabetically: - - class Note : public LayerElement, - public StemmedDrawingInterface, - public DurationInterface, - public PitchInterface, - public AttColoration, - public AttGraced, - public AttStems, - public AttTiepresent - -In the implementation, the same order must be followed, for the constructor calls and for the registration of the interfaces and individual attribute classes: - - Note::Note() - : LayerElement("note-") - , StemmedDrawingInterface() - , DurationInterface() - , PitchInterface() - , AttColoration() - , AttGraced() - , AttStems() - , AttTiepresent() - { - RegisterInterface(DurationInterface::GetAttClasses(), DurationInterface::IsInterface()); - RegisterInterface(PitchInterface::GetAttClasses(), PitchInterface::IsInterface()); - RegisterAttClass(ATT_COLORATION); - RegisterAttClass(ATT_GRACED); - RegisterAttClass(ATT_STEMS); - RegisterAttClass(ATT_TIEPRESENT); - - Reset(); - } - -Resetting the attributes is required and follows the same order - - void Note::Reset() - { - LayerElement::Reset(); - StemmedDrawingInterface::Reset(); - DurationInterface::Reset(); - PitchInterface::Reset(); - ResetColoration(); - ResetGraced(); - ResetStems(); - ResetTiepresent(); - - // ... - } diff --git a/doc/test-suite-diff.py b/doc/test-suite-diff.py index a9f25131ad8..e65ae80bcaa 100644 --- a/doc/test-suite-diff.py +++ b/doc/test-suite-diff.py @@ -138,11 +138,11 @@ def end_webpage(html, body, htmlOutFile): timeMap1 = json.load(open(jsonFile1, 'r')) timeMap2 = json.load(open(jsonFile2, 'r')) if jsondiff(timeMap1, timeMap2) != 1: - print(f'{name} produced a changed time map') + print(f'::warning title=changes in time map detected::{name} produced a different time map') diffValue = pngdiff(pngFile1, pngFile2, delete_diff_file=True) if (diffValue > (args.threshold / 100.0)): - print(f'Img diff: {diffValue}') + print(f'::warning title=changes in rendering detected::{name} produced a different rendering') row = etree.SubElement(table, 'tr') col = etree.SubElement(row, 'td') p = etree.SubElement(col, 'p') diff --git a/doc/test-suite.py b/doc/test-suite.py index acbee748698..dc08966a1f8 100644 --- a/doc/test-suite.py +++ b/doc/test-suite.py @@ -1,12 +1,11 @@ # This script it expected to be run from ./bindings/python import argparse -import hashlib import json import os import sys import xml.etree.ElementTree as ET -import cairosvg +from cairosvg import svg2png # Add path for toolkit built in-place sys.path.append('.') @@ -55,23 +54,23 @@ path2 = args.output_dir.replace("\ ", " ") dir1 = sorted(os.listdir(path1)) for item1 in dir1: - if not(os.path.isdir(os.path.join(path1, item1))): + if not (os.path.isdir(os.path.join(path1, item1))): continue # create the output directory if necessary - if not(os.path.isdir(os.path.join(path2, item1))): + if not (os.path.isdir(os.path.join(path2, item1))): os.mkdir(os.path.join(path2, item1)) dir2 = sorted(os.listdir(os.path.join(path1, item1))) for item2 in dir2: # skip directories - if not(os.path.isfile(os.path.join(path1, item1, item2))): + if not (os.path.isfile(os.path.join(path1, item1, item2))): continue # skip hidden files if item2.startswith('.'): continue - if shortlist and not(os.path.join(item1, item2) in shortlist): + if shortlist and not (os.path.join(item1, item2) in shortlist): continue # reset the options @@ -79,8 +78,7 @@ # filenames (input MEI/XML and output SVG) inputFile = os.path.join(path1, item1, item2) - options.update({"xmlIdSeed": int(hashlib.sha256( - inputFile.encode("utf-8")).hexdigest(), 16) % 10**9}) + options.update({"xmlIdChecksum": True}) print(f'Rendering {item2}') name, ext = os.path.splitext(item2) svgFile = os.path.join(path2, item1, name + '.svg') @@ -106,7 +104,7 @@ svgString = svgString.replace( "overflow=\"inherit\"", "overflow=\"visible\"") ET.ElementTree(ET.fromstring(svgString)).write(svgFile) - cairosvg.svg2png(bytestring=svgString, scale=2, write_to=pngFile) + svg2png(bytestring=svgString, scale=2, write_to=pngFile) # create time map tk.renderToTimemapFile(timeMapFile) tk.resetOptions() diff --git a/doc/verovio.conf b/doc/verovio.conf index fca82f9c188..313b4f84fa1 100644 --- a/doc/verovio.conf +++ b/doc/verovio.conf @@ -1,4 +1,4 @@ -# Doxyfile 1.9.1 +# Doxyfile 1.9.6 # This file describes the settings to be used by the documentation system # doxygen (www.doxygen.org) for a project. @@ -12,6 +12,16 @@ # For lists, items can also be appended using: # TAG += value [value, ...] # Values that contain spaces should be placed between quotes (\" \"). +# +# Note: +# +# Use doxygen to compare the used configuration file with the template +# configuration file: +# doxygen -x [configFile] +# Use doxygen to compare the used configuration file with the template +# configuration file without replacing the environment variables or CMake type +# replacement variables: +# doxygen -x_noenv [configFile] #--------------------------------------------------------------------------- # Project related configuration options @@ -60,16 +70,28 @@ PROJECT_LOGO = verovio-logo.png OUTPUT_DIRECTORY = ./doxygen -# If the CREATE_SUBDIRS tag is set to YES then doxygen will create 4096 sub- -# directories (in 2 levels) under the output directory of each output format and -# will distribute the generated files over these directories. Enabling this +# If the CREATE_SUBDIRS tag is set to YES then doxygen will create up to 4096 +# sub-directories (in 2 levels) under the output directory of each output format +# and will distribute the generated files over these directories. Enabling this # option can be useful when feeding doxygen a huge amount of source files, where # putting all generated files in the same directory would otherwise causes -# performance problems for the file system. +# performance problems for the file system. Adapt CREATE_SUBDIRS_LEVEL to +# control the number of sub-directories. # The default value is: NO. CREATE_SUBDIRS = NO +# Controls the number of sub-directories that will be created when +# CREATE_SUBDIRS tag is set to YES. Level 0 represents 16 directories, and every +# level increment doubles the number of directories, resulting in 4096 +# directories at level 8 which is the default and also the maximum value. The +# sub-directories are organized in 2 levels, the first level always has a fixed +# number of 16 directories. +# Minimum value: 0, maximum value: 8, default value: 8. +# This tag requires that the tag CREATE_SUBDIRS is set to YES. + +CREATE_SUBDIRS_LEVEL = 8 + # If the ALLOW_UNICODE_NAMES tag is set to YES, doxygen will allow non-ASCII # characters to appear in the names of generated files. If set to NO, non-ASCII # characters will be escaped, for example _xE3_x81_x84 will be used for Unicode @@ -81,14 +103,14 @@ ALLOW_UNICODE_NAMES = NO # The OUTPUT_LANGUAGE tag is used to specify the language in which all # documentation generated by doxygen is written. Doxygen will use this # information to generate all constant output in the proper language. -# Possible values are: Afrikaans, Arabic, Armenian, Brazilian, Catalan, Chinese, -# Chinese-Traditional, Croatian, Czech, Danish, Dutch, English (United States), -# Esperanto, Farsi (Persian), Finnish, French, German, Greek, Hungarian, -# Indonesian, Italian, Japanese, Japanese-en (Japanese with English messages), -# Korean, Korean-en (Korean with English messages), Latvian, Lithuanian, -# Macedonian, Norwegian, Persian (Farsi), Polish, Portuguese, Romanian, Russian, -# Serbian, Serbian-Cyrillic, Slovak, Slovene, Spanish, Swedish, Turkish, -# Ukrainian and Vietnamese. +# Possible values are: Afrikaans, Arabic, Armenian, Brazilian, Bulgarian, +# Catalan, Chinese, Chinese-Traditional, Croatian, Czech, Danish, Dutch, English +# (United States), Esperanto, Farsi (Persian), Finnish, French, German, Greek, +# Hindi, Hungarian, Indonesian, Italian, Japanese, Japanese-en (Japanese with +# English messages), Korean, Korean-en (Korean with English messages), Latvian, +# Lithuanian, Macedonian, Norwegian, Persian (Farsi), Polish, Portuguese, +# Romanian, Russian, Serbian, Serbian-Cyrillic, Slovak, Slovene, Spanish, +# Swedish, Turkish, Ukrainian and Vietnamese. # The default value is: English. OUTPUT_LANGUAGE = English @@ -240,16 +262,16 @@ TAB_SIZE = 8 # the documentation. An alias has the form: # name=value # For example adding -# "sideeffect=@par Side Effects:\n" +# "sideeffect=@par Side Effects:^^" # will allow you to put the command \sideeffect (or @sideeffect) in the # documentation, which will result in a user-defined paragraph with heading -# "Side Effects:". You can put \n's in the value part of an alias to insert -# newlines (in the resulting output). You can put ^^ in the value part of an -# alias to insert a newline as if a physical newline was in the original file. -# When you need a literal { or } or , in the value part of an alias you have to -# escape them by means of a backslash (\), this can lead to conflicts with the -# commands \{ and \} for these it is advised to use the version @{ and @} or use -# a double escape (\\{ and \\}) +# "Side Effects:". Note that you cannot put \n's in the value part of an alias +# to insert newlines (in the resulting output). You can put ^^ in the value part +# of an alias to insert a newline as if a physical newline was in the original +# file. When you need a literal { or } or , in the value part of an alias you +# have to escape them by means of a backslash (\), this can lead to conflicts +# with the commands \{ and \} for these it is advised to use the version @{ and +# @} or use a double escape (\\{ and \\}) ALIASES = @@ -294,8 +316,8 @@ OPTIMIZE_OUTPUT_SLICE = NO # extension. Doxygen has a built-in mapping, but you can override or extend it # using this tag. The format is ext=language, where ext is a file extension, and # language is one of the parsers supported by doxygen: IDL, Java, JavaScript, -# Csharp (C#), C, C++, D, PHP, md (Markdown), Objective-C, Python, Slice, VHDL, -# Fortran (fixed format Fortran: FortranFixed, free formatted Fortran: +# Csharp (C#), C, C++, Lex, D, PHP, md (Markdown), Objective-C, Python, Slice, +# VHDL, Fortran (fixed format Fortran: FortranFixed, free formatted Fortran: # FortranFree, unknown formatted Fortran: Fortran. In the later case the parser # tries to guess whether the code is fixed or free formatted code, this is the # default for Fortran type files). For instance to make doxygen treat .inc files @@ -442,13 +464,13 @@ TYPEDEF_HIDES_STRUCT = NO LOOKUP_CACHE_SIZE = 0 -# The NUM_PROC_THREADS specifies the number threads doxygen is allowed to use +# The NUM_PROC_THREADS specifies the number of threads doxygen is allowed to use # during processing. When set to 0 doxygen will based this on the number of # cores available in the system. You can set it explicitly to a value larger # than 0 to get more control over the balance between CPU load and processing # speed. At this moment only the input processing can be done using multiple # threads. Since this is still an experimental feature the default is set to 1, -# which efficively disables parallel processing. Please report any issues you +# which effectively disables parallel processing. Please report any issues you # encounter. Generating dot graphs in parallel is controlled by the # DOT_NUM_THREADS setting. # Minimum value: 0, maximum value: 32, default value: 1. @@ -536,7 +558,8 @@ HIDE_UNDOC_MEMBERS = NO # If the HIDE_UNDOC_CLASSES tag is set to YES, doxygen will hide all # undocumented classes that are normally visible in the class hierarchy. If set # to NO, these classes will be included in the various overviews. This option -# has no effect if EXTRACT_ALL is enabled. +# will also hide undocumented C++ concepts if enabled. This option has no effect +# if EXTRACT_ALL is enabled. # The default value is: NO. HIDE_UNDOC_CLASSES = NO @@ -567,14 +590,15 @@ INTERNAL_DOCS = NO # filesystem is case sensitive (i.e. it supports files in the same directory # whose names only differ in casing), the option must be set to YES to properly # deal with such files in case they appear in the input. For filesystems that -# are not case sensitive the option should be be set to NO to properly deal with +# are not case sensitive the option should be set to NO to properly deal with # output files written for symbols that only differ in casing, such as for two # classes, one named CLASS and the other named Class, and to also support # references to files without having to specify the exact matching casing. On # Windows (including Cygwin) and MacOS, users should typically set this option # to NO, whereas on Linux or other Unix flavors it should typically be set to # YES. -# The default value is: system dependent. +# Possible values are: SYSTEM, NO and YES. +# The default value is: SYSTEM. CASE_SENSE_NAMES = NO @@ -592,6 +616,12 @@ HIDE_SCOPE_NAMES = NO HIDE_COMPOUND_REFERENCE= NO +# If the SHOW_HEADERFILE tag is set to YES then the documentation for a class +# will show which file needs to be included to use the class. +# The default value is: YES. + +SHOW_HEADERFILE = YES + # If the SHOW_INCLUDE_FILES tag is set to YES then doxygen will put a list of # the files that are included by a file in the documentation of that file. # The default value is: YES. @@ -749,7 +779,8 @@ FILE_VERSION_FILTER = # output files in an output format independent way. To create the layout file # that represents doxygen's defaults, run doxygen with the -l option. You can # optionally specify a file name after the option, if omitted DoxygenLayout.xml -# will be used as the name of the layout file. +# will be used as the name of the layout file. See also section "Changing the +# layout of pages" for information. # # Note that if you run doxygen from a directory containing a file called # DoxygenLayout.xml, doxygen will parse it automatically even if the LAYOUT_FILE @@ -795,22 +826,38 @@ WARNINGS = NO WARN_IF_UNDOCUMENTED = NO # If the WARN_IF_DOC_ERROR tag is set to YES, doxygen will generate warnings for -# potential errors in the documentation, such as not documenting some parameters -# in a documented function, or documenting parameters that don't exist or using -# markup commands wrongly. +# potential errors in the documentation, such as documenting some parameters in +# a documented function twice, or documenting parameters that don't exist or +# using markup commands wrongly. # The default value is: YES. WARN_IF_DOC_ERROR = NO +# If WARN_IF_INCOMPLETE_DOC is set to YES, doxygen will warn about incomplete +# function parameter documentation. If set to NO, doxygen will accept that some +# parameters have no documentation without warning. +# The default value is: YES. + +WARN_IF_INCOMPLETE_DOC = YES + # This WARN_NO_PARAMDOC option can be enabled to get warnings for functions that # are documented, but have no documentation for their parameters or return -# value. If set to NO, doxygen will only warn about wrong or incomplete -# parameter documentation, but not about the absence of documentation. If -# EXTRACT_ALL is set to YES then this flag will automatically be disabled. +# value. If set to NO, doxygen will only warn about wrong parameter +# documentation, but not about the absence of documentation. If EXTRACT_ALL is +# set to YES then this flag will automatically be disabled. See also +# WARN_IF_INCOMPLETE_DOC # The default value is: NO. WARN_NO_PARAMDOC = NO +# If WARN_IF_UNDOC_ENUM_VAL option is set to YES, doxygen will warn about +# undocumented enumeration values. If set to NO, doxygen will accept +# undocumented enumeration values. If EXTRACT_ALL is set to YES then this flag +# will automatically be disabled. +# The default value is: NO. + +WARN_IF_UNDOC_ENUM_VAL = NO + # If the WARN_AS_ERROR tag is set to YES then doxygen will immediately stop when # a warning is encountered. If the WARN_AS_ERROR tag is set to FAIL_ON_WARNINGS # then doxygen will continue running as if WARN_AS_ERROR tag is set to NO, but @@ -826,13 +873,27 @@ WARN_AS_ERROR = NO # and the warning text. Optionally the format may contain $version, which will # be replaced by the version of the file (if it could be obtained via # FILE_VERSION_FILTER) +# See also: WARN_LINE_FORMAT # The default value is: $file:$line: $text. WARN_FORMAT = "$file:$line: $text" +# In the $text part of the WARN_FORMAT command it is possible that a reference +# to a more specific place is given. To make it easier to jump to this place +# (outside of doxygen) the user can define a custom "cut" / "paste" string. +# Example: +# WARN_LINE_FORMAT = "'vi $file +$line'" +# See also: WARN_FORMAT +# The default value is: at line $line of file $file. + +WARN_LINE_FORMAT = "at line $line of file $file" + # The WARN_LOGFILE tag can be used to specify a file to which warning and error # messages should be written. If left blank the output is written to standard -# error (stderr). +# error (stderr). In case the file specified cannot be opened for writing the +# warning and error messages are written to standard error. When as file - is +# specified the warning and error messages are written to standard output +# (stdout). WARN_LOGFILE = @@ -854,10 +915,21 @@ INPUT = ../include/vrv \ # libiconv (or the iconv built into libc) for the transcoding. See the libiconv # documentation (see: # https://www.gnu.org/software/libiconv/) for the list of possible encodings. +# See also: INPUT_FILE_ENCODING # The default value is: UTF-8. INPUT_ENCODING = UTF-8 +# This tag can be used to specify the character encoding of the source files +# that doxygen parses The INPUT_FILE_ENCODING tag can be used to specify +# character encoding on a per file pattern basis. Doxygen will compare the file +# name with each pattern and apply the encoding instead of the default +# INPUT_ENCODING) if there is a match. The character encodings are a list of the +# form: pattern=encoding (like *.php=ISO-8859-1). See cfg_input_encoding +# "INPUT_ENCODING" for further information on supported encodings. + +INPUT_FILE_ENCODING = + # If the value of the INPUT tag contains directories, you can use the # FILE_PATTERNS tag to specify one or more wildcard patterns (like *.cpp and # *.h) to filter out the source-files in the directories. @@ -871,10 +943,10 @@ INPUT_ENCODING = UTF-8 # # If left blank the following patterns are tested:*.c, *.cc, *.cxx, *.cpp, # *.c++, *.java, *.ii, *.ixx, *.ipp, *.i++, *.inl, *.idl, *.ddl, *.odl, *.h, -# *.hh, *.hxx, *.hpp, *.h++, *.cs, *.d, *.php, *.php4, *.php5, *.phtml, *.inc, -# *.m, *.markdown, *.md, *.mm, *.dox (to be provided as doxygen C comment), -# *.py, *.pyw, *.f90, *.f95, *.f03, *.f08, *.f18, *.f, *.for, *.vhd, *.vhdl, -# *.ucf, *.qsf and *.ice. +# *.hh, *.hxx, *.hpp, *.h++, *.l, *.cs, *.d, *.php, *.php4, *.php5, *.phtml, +# *.inc, *.m, *.markdown, *.md, *.mm, *.dox (to be provided as doxygen C +# comment), *.py, *.pyw, *.f90, *.f95, *.f03, *.f08, *.f18, *.f, *.for, *.vhd, +# *.vhdl, *.ucf, *.qsf and *.ice. FILE_PATTERNS = @@ -915,7 +987,7 @@ EXCLUDE_PATTERNS = # (namespaces, classes, functions, etc.) that should be excluded from the # output. The symbol name can be a fully qualified name, a word, or if the # wildcard * is used, a substring. Examples: ANamespace, AClass, -# AClass::ANamespace, ANamespace::*Test +# ANamespace::AClass, ANamespace::*Test # # Note that the wildcards are matched against the file with absolute path, so to # exclude all test directories use the pattern */test/* @@ -965,6 +1037,11 @@ IMAGE_PATH = # code is scanned, but not when the output code is generated. If lines are added # or removed, the anchors will not be placed correctly. # +# Note that doxygen will use the data processed and written to standard output +# for further processing, therefore nothing else, like debug statements or used +# commands (so in case of a Windows batch file always use @echo OFF), should be +# written to standard output. +# # Note that for custom extensions or not directly supported extensions you also # need to set EXTENSION_MAPPING for the extension otherwise the files are not # properly processed by doxygen. @@ -1006,6 +1083,15 @@ FILTER_SOURCE_PATTERNS = USE_MDFILE_AS_MAINPAGE = +# The Fortran standard specifies that for fixed formatted Fortran code all +# characters from position 72 are to be considered as comment. A common +# extension is to allow longer lines before the automatic comment starts. The +# setting FORTRAN_COMMENT_AFTER will also make it possible that longer lines can +# be processed before the automatic comment starts. +# Minimum value: 7, maximum value: 10000, default value: 72. + +FORTRAN_COMMENT_AFTER = 72 + #--------------------------------------------------------------------------- # Configuration options related to source browsing #--------------------------------------------------------------------------- @@ -1103,10 +1189,11 @@ VERBATIM_HEADERS = YES ALPHABETICAL_INDEX = YES -# In case all classes in a project start with a common prefix, all classes will -# be put under the same header in the alphabetical index. The IGNORE_PREFIX tag -# can be used to specify a prefix (or a list of prefixes) that should be ignored -# while generating the index headers. +# The IGNORE_PREFIX tag can be used to specify a prefix (or a list of prefixes) +# that should be ignored while generating the index headers. The IGNORE_PREFIX +# tag works for classes, function and member names. The entity will be placed in +# the alphabetical list under the first letter of the entity name that remains +# after removing the prefix. # This tag requires that the tag ALPHABETICAL_INDEX is set to YES. IGNORE_PREFIX = @@ -1185,7 +1272,12 @@ HTML_STYLESHEET = # Doxygen will copy the style sheet files to the output directory. # Note: The order of the extra style sheet files is of importance (e.g. the last # style sheet in the list overrules the setting of the previous ones in the -# list). For an example see the documentation. +# list). +# Note: Since the styling of scrollbars can currently not be overruled in +# Webkit/Chromium, the styling will be left out of the default doxygen.css if +# one or more extra stylesheets have been specified. So if scrollbar +# customization is desired it has to be added explicitly. For an example see the +# documentation. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_EXTRA_STYLESHEET = @@ -1200,9 +1292,22 @@ HTML_EXTRA_STYLESHEET = HTML_EXTRA_FILES = +# The HTML_COLORSTYLE tag can be used to specify if the generated HTML output +# should be rendered with a dark or light theme. +# Possible values are: LIGHT always generate light mode output, DARK always +# generate dark mode output, AUTO_LIGHT automatically set the mode according to +# the user preference, use light mode if no preference is set (the default), +# AUTO_DARK automatically set the mode according to the user preference, use +# dark mode if no preference is set and TOGGLE allow to user to switch between +# light and dark mode via a button. +# The default value is: AUTO_LIGHT. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_COLORSTYLE = AUTO_LIGHT + # The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. Doxygen # will adjust the colors in the style sheet and background images according to -# this color. Hue is specified as an angle on a colorwheel, see +# this color. Hue is specified as an angle on a color-wheel, see # https://en.wikipedia.org/wiki/Hue for more information. For instance the value # 0 represents red, 60 is yellow, 120 is green, 180 is cyan, 240 is blue, 300 # purple, and 360 is red again. @@ -1212,7 +1317,7 @@ HTML_EXTRA_FILES = HTML_COLORSTYLE_HUE = 220 # The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of the colors -# in the HTML output. For a value of 0 the output will use grayscales only. A +# in the HTML output. For a value of 0 the output will use gray-scales only. A # value of 255 will produce the most vivid colors. # Minimum value: 0, maximum value: 255, default value: 100. # This tag requires that the tag GENERATE_HTML is set to YES. @@ -1294,6 +1399,13 @@ GENERATE_DOCSET = NO DOCSET_FEEDNAME = "Doxygen generated docs" +# This tag determines the URL of the docset feed. A documentation feed provides +# an umbrella under which multiple documentation sets from a single provider +# (such as a company or product suite) can be grouped. +# This tag requires that the tag GENERATE_DOCSET is set to YES. + +DOCSET_FEEDURL = + # This tag specifies a string that should uniquely identify the documentation # set bundle. This should be a reverse domain-name style string, e.g. # com.mycompany.MyDocSet. Doxygen will append .docset to the name. @@ -1319,8 +1431,12 @@ DOCSET_PUBLISHER_NAME = Publisher # If the GENERATE_HTMLHELP tag is set to YES then doxygen generates three # additional HTML index files: index.hhp, index.hhc, and index.hhk. The # index.hhp is a project file that can be read by Microsoft's HTML Help Workshop -# (see: -# https://www.microsoft.com/en-us/download/details.aspx?id=21138) on Windows. +# on Windows. In the beginning of 2021 Microsoft took the original page, with +# a.o. the download links, offline the HTML help workshop was already many years +# in maintenance mode). You can download the HTML help workshop from the web +# archives at Installation executable (see: +# http://web.archive.org/web/20160201063255/http://download.microsoft.com/downlo +# ad/0/A/9/0A939EF6-E31C-430F-A3DF-DFAE7960D564/htmlhelp.exe). # # The HTML Help Workshop contains a compiler that can convert all HTML output # generated by doxygen into a single compiled HTML file (.chm). Compiled HTML @@ -1479,16 +1595,28 @@ DISABLE_INDEX = NO # to work a browser that supports JavaScript, DHTML, CSS and frames is required # (i.e. any modern browser). Windows users are probably better off using the # HTML help feature. Via custom style sheets (see HTML_EXTRA_STYLESHEET) one can -# further fine-tune the look of the index. As an example, the default style -# sheet generated by doxygen has an example that shows how to put an image at -# the root of the tree instead of the PROJECT_NAME. Since the tree basically has -# the same information as the tab index, you could consider setting -# DISABLE_INDEX to YES when enabling this option. +# further fine tune the look of the index (see "Fine-tuning the output"). As an +# example, the default style sheet generated by doxygen has an example that +# shows how to put an image at the root of the tree instead of the PROJECT_NAME. +# Since the tree basically has the same information as the tab index, you could +# consider setting DISABLE_INDEX to YES when enabling this option. # The default value is: NO. # This tag requires that the tag GENERATE_HTML is set to YES. GENERATE_TREEVIEW = YES +# When both GENERATE_TREEVIEW and DISABLE_INDEX are set to YES, then the +# FULL_SIDEBAR option determines if the side bar is limited to only the treeview +# area (value NO) or if it should extend to the full height of the window (value +# YES). Setting this to YES gives a layout similar to +# https://docs.readthedocs.io with more room for contents, but less room for the +# project logo, title, and description. If either GENERATE_TREEVIEW or +# DISABLE_INDEX is set to NO, this option has no effect. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +FULL_SIDEBAR = NO + # The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values that # doxygen will group on one line in the generated HTML documentation. # @@ -1513,6 +1641,13 @@ TREEVIEW_WIDTH = 250 EXT_LINKS_IN_WINDOW = NO +# If the OBFUSCATE_EMAILS tag is set to YES, doxygen will obfuscate email +# addresses. +# The default value is: YES. +# This tag requires that the tag GENERATE_HTML is set to YES. + +OBFUSCATE_EMAILS = YES + # If the HTML_FORMULA_FORMAT option is set to svg, doxygen will use the pdf2svg # tool (see https://github.com/dawbarton/pdf2svg) or inkscape (see # https://inkscape.org) to generate formulas as SVG images instead of PNGs for @@ -1550,11 +1685,29 @@ FORMULA_MACROFILE = USE_MATHJAX = NO +# With MATHJAX_VERSION it is possible to specify the MathJax version to be used. +# Note that the different versions of MathJax have different requirements with +# regards to the different settings, so it is possible that also other MathJax +# settings have to be changed when switching between the different MathJax +# versions. +# Possible values are: MathJax_2 and MathJax_3. +# The default value is: MathJax_2. +# This tag requires that the tag USE_MATHJAX is set to YES. + +MATHJAX_VERSION = MathJax_2 + # When MathJax is enabled you can set the default output format to be used for -# the MathJax output. See the MathJax site (see: -# http://docs.mathjax.org/en/v2.7-latest/output.html) for more details. +# the MathJax output. For more details about the output format see MathJax +# version 2 (see: +# http://docs.mathjax.org/en/v2.7-latest/output.html) and MathJax version 3 +# (see: +# http://docs.mathjax.org/en/latest/web/components/output.html). # Possible values are: HTML-CSS (which is slower, but has the best -# compatibility), NativeMML (i.e. MathML) and SVG. +# compatibility. This is the name for Mathjax version 2, for MathJax version 3 +# this will be translated into chtml), NativeMML (i.e. MathML. Only supported +# for NathJax 2. For MathJax version 3 chtml will be used instead.), chtml (This +# is the name for Mathjax version 3, for MathJax version 2 this will be +# translated into HTML-CSS) and SVG. # The default value is: HTML-CSS. # This tag requires that the tag USE_MATHJAX is set to YES. @@ -1567,15 +1720,21 @@ MATHJAX_FORMAT = HTML-CSS # MATHJAX_RELPATH should be ../mathjax. The default value points to the MathJax # Content Delivery Network so you can quickly see the result without installing # MathJax. However, it is strongly recommended to install a local copy of -# MathJax from https://www.mathjax.org before deployment. -# The default value is: https://cdn.jsdelivr.net/npm/mathjax@2. +# MathJax from https://www.mathjax.org before deployment. The default value is: +# - in case of MathJax version 2: https://cdn.jsdelivr.net/npm/mathjax@2 +# - in case of MathJax version 3: https://cdn.jsdelivr.net/npm/mathjax@3 # This tag requires that the tag USE_MATHJAX is set to YES. MATHJAX_RELPATH = http://www.mathjax.org/mathjax # The MATHJAX_EXTENSIONS tag can be used to specify one or more MathJax # extension names that should be enabled during MathJax rendering. For example +# for MathJax version 2 (see +# https://docs.mathjax.org/en/v2.7-latest/tex.html#tex-and-latex-extensions): # MATHJAX_EXTENSIONS = TeX/AMSmath TeX/AMSsymbols +# For example for MathJax version 3 (see +# http://docs.mathjax.org/en/latest/input/tex/extensions/index.html): +# MATHJAX_EXTENSIONS = ams # This tag requires that the tag USE_MATHJAX is set to YES. MATHJAX_EXTENSIONS = @@ -1755,29 +1914,31 @@ PAPER_TYPE = a4 EXTRA_PACKAGES = -# The LATEX_HEADER tag can be used to specify a personal LaTeX header for the -# generated LaTeX document. The header should contain everything until the first -# chapter. If it is left blank doxygen will generate a standard header. See -# section "Doxygen usage" for information on how to let doxygen write the -# default header to a separate file. +# The LATEX_HEADER tag can be used to specify a user-defined LaTeX header for +# the generated LaTeX document. The header should contain everything until the +# first chapter. If it is left blank doxygen will generate a standard header. It +# is highly recommended to start with a default header using +# doxygen -w latex new_header.tex new_footer.tex new_stylesheet.sty +# and then modify the file new_header.tex. See also section "Doxygen usage" for +# information on how to generate the default header that doxygen normally uses. # -# Note: Only use a user-defined header if you know what you are doing! The -# following commands have a special meaning inside the header: $title, -# $datetime, $date, $doxygenversion, $projectname, $projectnumber, -# $projectbrief, $projectlogo. Doxygen will replace $title with the empty -# string, for the replacement values of the other commands the user is referred -# to HTML_HEADER. +# Note: Only use a user-defined header if you know what you are doing! +# Note: The header is subject to change so you typically have to regenerate the +# default header when upgrading to a newer version of doxygen. The following +# commands have a special meaning inside the header (and footer): For a +# description of the possible markers and block names see the documentation. # This tag requires that the tag GENERATE_LATEX is set to YES. LATEX_HEADER = -# The LATEX_FOOTER tag can be used to specify a personal LaTeX footer for the -# generated LaTeX document. The footer should contain everything after the last -# chapter. If it is left blank doxygen will generate a standard footer. See +# The LATEX_FOOTER tag can be used to specify a user-defined LaTeX footer for +# the generated LaTeX document. The footer should contain everything after the +# last chapter. If it is left blank doxygen will generate a standard footer. See # LATEX_HEADER for more information on how to generate a default footer and what -# special commands can be used inside the footer. -# -# Note: Only use a user-defined footer if you know what you are doing! +# special commands can be used inside the footer. See also section "Doxygen +# usage" for information on how to generate the default footer that doxygen +# normally uses. Note: Only use a user-defined footer if you know what you are +# doing! # This tag requires that the tag GENERATE_LATEX is set to YES. LATEX_FOOTER = @@ -1822,8 +1983,7 @@ USE_PDFLATEX = YES # If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \batchmode # command to the generated LaTeX files. This will instruct LaTeX to keep running -# if errors occur, instead of asking the user for help. This option is also used -# when generating formulas in HTML. +# if errors occur, instead of asking the user for help. # The default value is: NO. # This tag requires that the tag GENERATE_LATEX is set to YES. @@ -2098,7 +2258,8 @@ SEARCH_INCLUDES = YES # The INCLUDE_PATH tag can be used to specify one or more directories that # contain include files that are not input files but should be processed by the -# preprocessor. +# preprocessor. Note that the INCLUDE_PATH is not recursive, so the setting of +# RECURSIVE has no effect here. # This tag requires that the tag SEARCH_INCLUDES is set to YES. INCLUDE_PATH = @@ -2222,18 +2383,50 @@ HAVE_DOT = NO DOT_NUM_THREADS = 0 -# By default doxygen will tell dot to use the default font as specified with -# DOT_FONTNAME. If you specify a different font using DOT_FONTNAME you can set -# the path where dot can find it using this tag. +# DOT_COMMON_ATTR is common attributes for nodes, edges and labels of +# subgraphs. When you want a differently looking font in the dot files that +# doxygen generates you can specify fontname, fontcolor and fontsize attributes. +# For details please see Node, +# Edge and Graph Attributes specification You need to make sure dot is able +# to find the font, which can be done by putting it in a standard location or by +# setting the DOTFONTPATH environment variable or by setting DOT_FONTPATH to the +# directory containing the font. Default graphviz fontsize is 14. +# The default value is: fontname=Helvetica,fontsize=10. +# This tag requires that the tag HAVE_DOT is set to YES. + +DOT_COMMON_ATTR = "fontname=Helvetica,fontsize=10" + +# DOT_EDGE_ATTR is concatenated with DOT_COMMON_ATTR. For elegant style you can +# add 'arrowhead=open, arrowtail=open, arrowsize=0.5'. Complete documentation about +# arrows shapes. +# The default value is: labelfontname=Helvetica,labelfontsize=10. +# This tag requires that the tag HAVE_DOT is set to YES. + +DOT_EDGE_ATTR = "labelfontname=Helvetica,labelfontsize=10" + +# DOT_NODE_ATTR is concatenated with DOT_COMMON_ATTR. For view without boxes +# around nodes set 'shape=plain' or 'shape=plaintext' Shapes specification +# The default value is: shape=box,height=0.2,width=0.4. +# This tag requires that the tag HAVE_DOT is set to YES. + +DOT_NODE_ATTR = "shape=box,height=0.2,width=0.4" + +# You can set the path where dot can find font specified with fontname in +# DOT_COMMON_ATTR and others dot attributes. # This tag requires that the tag HAVE_DOT is set to YES. DOT_FONTPATH = -# If the CLASS_GRAPH tag is set to YES then doxygen will generate a graph for -# each documented class showing the direct and indirect inheritance relations. -# Setting this tag to YES will force the CLASS_DIAGRAMS tag to NO. +# If the CLASS_GRAPH tag is set to YES (or GRAPH) then doxygen will generate a +# graph for each documented class showing the direct and indirect inheritance +# relations. In case HAVE_DOT is set as well dot will be used to draw the graph, +# otherwise the built-in generator will be used. If the CLASS_GRAPH tag is set +# to TEXT the direct and indirect inheritance relations will be shown as texts / +# links. +# Possible values are: NO, YES, TEXT and GRAPH. # The default value is: YES. -# This tag requires that the tag HAVE_DOT is set to YES. CLASS_GRAPH = YES @@ -2247,7 +2440,8 @@ CLASS_GRAPH = YES COLLABORATION_GRAPH = YES # If the GROUP_GRAPHS tag is set to YES then doxygen will generate a graph for -# groups, showing the direct groups dependencies. +# groups, showing the direct groups dependencies. See also the chapter Grouping +# in the manual. # The default value is: YES. # This tag requires that the tag HAVE_DOT is set to YES. @@ -2362,6 +2556,13 @@ GRAPHICAL_HIERARCHY = YES DIRECTORY_GRAPH = YES +# The DIR_GRAPH_MAX_DEPTH tag can be used to limit the maximum number of levels +# of child directories generated in directory dependency graphs by dot. +# Minimum value: 1, maximum value: 25, default value: 1. +# This tag requires that the tag DIRECTORY_GRAPH is set to YES. + +DIR_GRAPH_MAX_DEPTH = 1 + # The DOT_IMAGE_FORMAT tag can be used to set the image format of the images # generated by dot. For an explanation of the image formats see the section # output formats in the documentation of the dot tool (Graphviz (see: @@ -2415,10 +2616,10 @@ MSCFILE_DIRS = DIAFILE_DIRS = # When using plantuml, the PLANTUML_JAR_PATH tag should be used to specify the -# path where java can find the plantuml.jar file. If left blank, it is assumed -# PlantUML is not used or called during a preprocessing step. Doxygen will -# generate a warning when it encounters a \startuml command in this case and -# will not generate output for the diagram. +# path where java can find the plantuml.jar file or to the filename of jar file +# to be used. If left blank, it is assumed PlantUML is not used or called during +# a preprocessing step. Doxygen will generate a warning when it encounters a +# \startuml command in this case and will not generate output for the diagram. PLANTUML_JAR_PATH = @@ -2468,6 +2669,8 @@ DOT_MULTI_TARGETS = NO # If the GENERATE_LEGEND tag is set to YES doxygen will generate a legend page # explaining the meaning of the various boxes and arrows in the dot generated # graphs. +# Note: This tag requires that UML_LOOK isn't set, i.e. the doxygen internal +# graphical representation for inheritance and collaboration diagrams is used. # The default value is: YES. # This tag requires that the tag HAVE_DOT is set to YES. @@ -2476,8 +2679,8 @@ GENERATE_LEGEND = YES # If the DOT_CLEANUP tag is set to YES, doxygen will remove the intermediate # files that are used to generate the various graphs. # -# Note: This setting is not only used for dot files but also for msc and -# plantuml temporary files. +# Note: This setting is not only used for dot files but also for msc temporary +# files. # The default value is: YES. DOT_CLEANUP = YES diff --git a/emscripten/buildToolkit b/emscripten/buildToolkit index 649fb415fa5..b6f20e5a7ae 100755 --- a/emscripten/buildToolkit +++ b/emscripten/buildToolkit @@ -122,6 +122,7 @@ if ($wasmQ) { $LFLAGS .= " -s INITIAL_MEMORY=512MB"; $LFLAGS .= " -s STACK_SIZE=256MB"; $LFLAGS .= " -s SINGLE_FILE=1"; + $LFLAGS .= " -s INCOMING_MODULE_JS_API=onRuntimeInitialized"; $FLAGS_NAME = "-wasm"; } @@ -240,16 +241,17 @@ if ($makeQ) { print "*************\nBuilding makefile...\n"; my $cmakeCmd = "$EMCMAKE cmake ../cmake $cmake -DCMAKE_CXX_FLAGS=\"$FLAGS\""; +print "$cmakeCmd\n" if $CHATTY; system($cmakeCmd) == 0 or die "system $cmakeCmd failed: $?"; print "*************\nCompiling...\n"; my $makeCmd = "$EMMAKE make -j 8"; +print "$makeCmd\n" if $CHATTY; system($makeCmd); print "*************\nLinking...\n"; my $ccCmd = "$EMCC $CHATTY libverovio.a $LFLAGS $FLAGS $embed $exports $extra_exports $output $modularize"; print "$ccCmd\n" if $CHATTY; - system($ccCmd); if ($? == 0) { diff --git a/emscripten/npm/package.json b/emscripten/npm/package.json index 206ff61766c..61df76651f5 100644 --- a/emscripten/npm/package.json +++ b/emscripten/npm/package.json @@ -1,6 +1,6 @@ { "name": "verovio", - "version": "3.16.0-alpha", + "version": "4.1.0-alpha", "description": "This is the stable version of the verovio package", "main": "dist/verovio-toolkit-wasm.js", "exports": { @@ -17,7 +17,7 @@ ], "scripts": { "build": "rollup --config", - "prebundle": "rollup --config rollup.config.prebundle.js" + "prebundle": "rollup --config rollup.config.prebundle.mjs" }, "keywords": [ "music", @@ -38,10 +38,10 @@ }, "homepage": "https://www.verovio.org", "engines": { - "node": ">= 14.17.0" + "node": ">= 14.18.0" }, "devDependencies": { - "@rollup/plugin-commonjs": "^22.0.0", - "rollup": "^2.75.6" + "@rollup/plugin-commonjs": "^24.1.0", + "rollup": "^3.20.6" } } diff --git a/emscripten/npm/rollup.config.js b/emscripten/npm/rollup.config.mjs similarity index 100% rename from emscripten/npm/rollup.config.js rename to emscripten/npm/rollup.config.mjs diff --git a/emscripten/npm/rollup.config.prebundle.js b/emscripten/npm/rollup.config.prebundle.mjs similarity index 98% rename from emscripten/npm/rollup.config.prebundle.js rename to emscripten/npm/rollup.config.prebundle.mjs index 3b6b7c69eef..d3b7482d650 100644 --- a/emscripten/npm/rollup.config.prebundle.js +++ b/emscripten/npm/rollup.config.prebundle.mjs @@ -1,5 +1,5 @@ import commonjs from "@rollup/plugin-commonjs"; -import addModuleExports from "./src/rollup-plugin-add-module-exports.js"; +import addModuleExports from "./src/rollup-plugin-add-module-exports.mjs"; export default [ { diff --git a/emscripten/npm/src/rollup-plugin-add-module-exports.js b/emscripten/npm/src/rollup-plugin-add-module-exports.mjs similarity index 100% rename from emscripten/npm/src/rollup-plugin-add-module-exports.js rename to emscripten/npm/src/rollup-plugin-add-module-exports.mjs diff --git a/fonts/Leipzig/Leipzig.svg b/fonts/Leipzig/Leipzig.svg index 2b063296eea..5ea289cf111 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 - By Klaus Rettinghaus +Created by FontForge 20220308 at Sun Jul 2 12:58:41 2023 + By Laurent Pugin 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.85 @@ -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 7143d8dc736..5527ea96b9f 100644 Binary files a/fonts/Leipzig/Leipzig.ttf and b/fonts/Leipzig/Leipzig.ttf differ diff --git a/fonts/Leipzig/Leipzig.woff2 b/fonts/Leipzig/Leipzig.woff2 index 701ed87014e..e1cfe002396 100644 Binary files a/fonts/Leipzig/Leipzig.woff2 and b/fonts/Leipzig/Leipzig.woff2 differ diff --git a/fonts/Leipzig/leipzig_metadata.json b/fonts/Leipzig/leipzig_metadata.json index c37282bfd9f..83e976a9651 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.86", "glyphBBoxes": { "4stringTabClef": { "bBoxNE": [ @@ -1072,6 +1072,16 @@ -0.464 ] }, + "chantCaesura": { + "bBoxNE": [ + 0.5493, + 1.9931 + ], + "bBoxSW": [ + -0.0005, + 1.0547 + ] + }, "chantCclef": { "bBoxNE": [ 0.724, @@ -1212,6 +1222,46 @@ -0.484 ] }, + "chantDivisioFinalis": { + "bBoxNE": [ + 0.456, + 1.5 + ], + "bBoxSW": [ + 0.0, + -1.5 + ] + }, + "chantDivisioMaior": { + "bBoxNE": [ + 0.056, + 1.0 + ], + "bBoxSW": [ + 0.0, + -1.0 + ] + }, + "chantDivisioMaxima": { + "bBoxNE": [ + 0.056, + 1.5 + ], + "bBoxSW": [ + 0.0, + -1.5 + ] + }, + "chantDivisioMinima": { + "bBoxNE": [ + 0.056, + 2.0 + ], + "bBoxSW": [ + 0.0, + 1.0 + ] + }, "chantEntryLineAsc2nd": { "bBoxNE": [ 0.052, @@ -1442,6 +1492,16 @@ -0.324 ] }, + "chantVirgula": { + "bBoxNE": [ + 0.34, + 1.992 + ], + "bBoxSW": [ + 0.0, + 1.056 + ] + }, "clef15": { "bBoxNE": [ 0.92, @@ -2712,6 +2772,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 +2835,11 @@ "keyboardPedalUp": { "bBoxNE": [ 1.724, - 1.672 + 1.668 ], "bBoxSW": [ 0.0, - 0.0 + -0.004 ] }, "leftRepeatSmall": { @@ -3032,6 +3112,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 +4694,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 +4824,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 +4864,12 @@ }, "noteWhole": { "bBoxNE": [ - 1.668, - 0.492 + 1.62, + 0.532 ], "bBoxSW": [ 0.0, - -0.5 + -0.532 ] }, "noteheadBlack": { @@ -5942,6 +6382,156 @@ -0.136 ] }, + "staffPosLower1": { + "bBoxNE": [ + 0.0, + 0.0 + ], + "bBoxSW": [ + 0.0, + 0.0 + ] + }, + "staffPosLower2": { + "bBoxNE": [ + 0.0, + 0.0 + ], + "bBoxSW": [ + 0.0, + 0.0 + ] + }, + "staffPosLower3": { + "bBoxNE": [ + 0.0, + 0.0 + ], + "bBoxSW": [ + 0.0, + 0.0 + ] + }, + "staffPosLower4": { + "bBoxNE": [ + 0.0, + 0.0 + ], + "bBoxSW": [ + 0.0, + 0.0 + ] + }, + "staffPosLower5": { + "bBoxNE": [ + 0.0, + 0.0 + ], + "bBoxSW": [ + 0.0, + 0.0 + ] + }, + "staffPosLower6": { + "bBoxNE": [ + 0.0, + 0.0 + ], + "bBoxSW": [ + 0.0, + 0.0 + ] + }, + "staffPosLower7": { + "bBoxNE": [ + 0.0, + 0.0 + ], + "bBoxSW": [ + 0.0, + 0.0 + ] + }, + "staffPosRaise1": { + "bBoxNE": [ + 0.0, + 0.0 + ], + "bBoxSW": [ + 0.0, + 0.0 + ] + }, + "staffPosRaise2": { + "bBoxNE": [ + 0.0, + 0.0 + ], + "bBoxSW": [ + 0.0, + 0.0 + ] + }, + "staffPosRaise3": { + "bBoxNE": [ + 0.0, + 0.0 + ], + "bBoxSW": [ + 0.0, + 0.0 + ] + }, + "staffPosRaise4": { + "bBoxNE": [ + 0.0, + 0.0 + ], + "bBoxSW": [ + 0.0, + 0.0 + ] + }, + "staffPosRaise5": { + "bBoxNE": [ + 0.0, + 0.0 + ], + "bBoxSW": [ + 0.0, + 0.0 + ] + }, + "staffPosRaise6": { + "bBoxNE": [ + 0.0, + 0.0 + ], + "bBoxSW": [ + 0.0, + 0.0 + ] + }, + "staffPosRaise7": { + "bBoxNE": [ + 0.0, + 0.0 + ], + "bBoxSW": [ + 0.0, + 0.0 + ] + }, + "staffPosRaise8": { + "bBoxNE": [ + 0.0, + 0.0 + ], + "bBoxSW": [ + 0.0, + 0.0 + ] + }, "stringsDownBow": { "bBoxNE": [ 1.24, @@ -7252,14 +7842,6 @@ "cutOutSE": [ 1.568, -0.232 - ], - "stemDownNW": [ - 0.0, - 0.0 - ], - "stemUpSE": [ - 1.62, - 0.0 ] }, "noteheadWholeFilled": { diff --git a/fonts/poetry.lock b/fonts/poetry.lock index e7f2ff99d5b..7c516f071b4 100644 --- a/fonts/poetry.lock +++ b/fonts/poetry.lock @@ -1,10 +1,9 @@ -# This file is automatically @generated by Poetry and should not be changed by hand. +# This file is automatically @generated by Poetry 1.5.1 and should not be changed by hand. [[package]] name = "appnope" version = "0.1.3" description = "Disable App Nap on macOS >= 10.9" -category = "dev" optional = false python-versions = "*" files = [ @@ -16,7 +15,6 @@ files = [ name = "astroid" version = "2.14.2" description = "An abstract syntax tree for Python with inference support." -category = "dev" optional = false python-versions = ">=3.7.2" files = [ @@ -36,7 +34,6 @@ wrapt = [ name = "asttokens" version = "2.2.1" description = "Annotate AST trees with source code positions" -category = "dev" optional = false python-versions = "*" files = [ @@ -54,7 +51,6 @@ test = ["astroid", "pytest"] name = "backcall" version = "0.2.0" description = "Specifications for callback functions passed in to an API" -category = "dev" optional = false python-versions = "*" files = [ @@ -66,7 +62,6 @@ files = [ name = "black" version = "22.12.0" description = "The uncompromising code formatter." -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -102,7 +97,6 @@ uvloop = ["uvloop (>=0.15.2)"] name = "click" version = "8.1.3" description = "Composable command line interface toolkit" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -117,7 +111,6 @@ colorama = {version = "*", markers = "platform_system == \"Windows\""} name = "colorama" version = "0.4.6" description = "Cross-platform colored terminal text." -category = "dev" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" files = [ @@ -129,7 +122,6 @@ files = [ name = "decorator" version = "5.1.1" description = "Decorators for Humans" -category = "dev" optional = false python-versions = ">=3.5" files = [ @@ -141,7 +133,6 @@ files = [ name = "dill" version = "0.3.6" description = "serialize all of python" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -156,7 +147,6 @@ graph = ["objgraph (>=1.7.2)"] name = "executing" version = "1.2.0" description = "Get the currently executing AST node of a frame, and other information" -category = "dev" optional = false python-versions = "*" files = [ @@ -171,7 +161,6 @@ tests = ["asttokens", "littleutils", "pytest", "rich"] name = "ipython" version = "8.10.0" description = "IPython: Productive Interactive Computing" -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -210,7 +199,6 @@ test-extra = ["curio", "matplotlib (!=3.2.0)", "nbformat", "numpy (>=1.21)", "pa name = "isort" version = "5.12.0" description = "A Python utility / library to sort Python imports." -category = "dev" optional = false python-versions = ">=3.8.0" files = [ @@ -228,7 +216,6 @@ requirements-deprecated-finder = ["pip-api", "pipreqs"] name = "jedi" version = "0.18.2" description = "An autocompletion tool for Python that can be used for text editors." -category = "dev" optional = false python-versions = ">=3.6" files = [ @@ -248,7 +235,6 @@ testing = ["Django (<3.1)", "attrs", "colorama", "docopt", "pytest (<7.0.0)"] name = "lazy-object-proxy" version = "1.9.0" description = "A fast and thorough lazy object proxy." -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -294,7 +280,6 @@ files = [ name = "matplotlib-inline" version = "0.1.6" description = "Inline Matplotlib backend for Jupyter" -category = "dev" optional = false python-versions = ">=3.5" files = [ @@ -309,7 +294,6 @@ traitlets = "*" name = "mccabe" version = "0.7.0" description = "McCabe checker, plugin for flake8" -category = "dev" optional = false python-versions = ">=3.6" files = [ @@ -321,7 +305,6 @@ files = [ name = "mypy" version = "0.971" description = "Optional static typing for Python" -category = "dev" optional = false python-versions = ">=3.6" files = [ @@ -364,7 +347,6 @@ reports = ["lxml"] name = "mypy-extensions" version = "1.0.0" description = "Type system extensions for programs checked with the mypy type checker." -category = "dev" optional = false python-versions = ">=3.5" files = [ @@ -376,7 +358,6 @@ files = [ name = "numpy" version = "1.24.2" description = "Fundamental package for array computing in Python" -category = "main" optional = false python-versions = ">=3.8" files = [ @@ -414,7 +395,6 @@ files = [ name = "parso" version = "0.8.3" description = "A Python Parser" -category = "dev" optional = false python-versions = ">=3.6" files = [ @@ -430,7 +410,6 @@ testing = ["docopt", "pytest (<6.0.0)"] name = "pathspec" version = "0.11.0" description = "Utility library for gitignore style pattern matching of file paths." -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -442,7 +421,6 @@ files = [ name = "pexpect" version = "4.8.0" description = "Pexpect allows easy control of interactive console applications." -category = "dev" optional = false python-versions = "*" files = [ @@ -457,7 +435,6 @@ ptyprocess = ">=0.5" name = "pickleshare" version = "0.7.5" description = "Tiny 'shelve'-like database with concurrency support" -category = "dev" optional = false python-versions = "*" files = [ @@ -469,7 +446,6 @@ files = [ name = "platformdirs" version = "3.0.0" description = "A small Python package for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -485,7 +461,6 @@ test = ["appdirs (==1.4.4)", "covdefaults (>=2.2.2)", "pytest (>=7.2.1)", "pytes name = "prompt-toolkit" version = "3.0.36" description = "Library for building powerful interactive command lines in Python" -category = "dev" optional = false python-versions = ">=3.6.2" files = [ @@ -500,7 +475,6 @@ wcwidth = "*" name = "ptyprocess" version = "0.7.0" description = "Run a subprocess in a pseudo terminal" -category = "dev" optional = false python-versions = "*" files = [ @@ -512,7 +486,6 @@ files = [ name = "pure-eval" version = "0.2.2" description = "Safely evaluate AST nodes without side effects" -category = "dev" optional = false python-versions = "*" files = [ @@ -525,14 +498,13 @@ tests = ["pytest"] [[package]] name = "pygments" -version = "2.14.0" +version = "2.15.0" description = "Pygments is a syntax highlighting package written in Python." -category = "dev" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" files = [ - {file = "Pygments-2.14.0-py3-none-any.whl", hash = "sha256:fa7bd7bd2771287c0de303af8bfdfc731f51bd2c6a47ab69d117138893b82717"}, - {file = "Pygments-2.14.0.tar.gz", hash = "sha256:b3ed06a9e8ac9a9aae5a6f5dbe78a8a58655d17b43b93c078f094ddc476ae297"}, + {file = "Pygments-2.15.0-py3-none-any.whl", hash = "sha256:77a3299119af881904cd5ecd1ac6a66214b6e9bed1f2db16993b54adede64094"}, + {file = "Pygments-2.15.0.tar.gz", hash = "sha256:f7e36cffc4c517fbc252861b9a6e4644ca0e5abadf9a113c72d1358ad09b9500"}, ] [package.extras] @@ -542,7 +514,6 @@ plugins = ["importlib-metadata"] name = "pylint" version = "2.16.2" description = "python code static checker" -category = "dev" optional = false python-versions = ">=3.7.2" files = [ @@ -572,7 +543,6 @@ testutils = ["gitpython (>3)"] name = "scipy" version = "1.9.3" description = "Fundamental algorithms for scientific computing in Python" -category = "main" optional = false python-versions = ">=3.8" files = [ @@ -611,7 +581,6 @@ test = ["asv", "gmpy2", "mpmath", "pytest", "pytest-cov", "pytest-xdist", "sciki name = "six" version = "1.16.0" description = "Python 2 and 3 compatibility utilities" -category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" files = [ @@ -623,7 +592,6 @@ files = [ name = "stack-data" version = "0.6.2" description = "Extract data from python stack frames and tracebacks for informative displays" -category = "dev" optional = false python-versions = "*" files = [ @@ -643,7 +611,6 @@ tests = ["cython", "littleutils", "pygments", "pytest", "typeguard"] name = "svgpathtools" version = "1.6.0" description = "A collection of tools for manipulating and analyzing SVG Path objects and Bezier curves." -category = "main" optional = false python-versions = "*" files = [ @@ -660,7 +627,6 @@ svgwrite = "*" name = "svgwrite" version = "1.4.3" description = "A Python library to create SVG drawings." -category = "main" optional = false python-versions = ">=3.6" files = [ @@ -672,7 +638,6 @@ files = [ name = "tomli" version = "2.0.1" description = "A lil' TOML parser" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -684,7 +649,6 @@ files = [ name = "tomlkit" version = "0.11.6" description = "Style preserving TOML library" -category = "dev" optional = false python-versions = ">=3.6" files = [ @@ -696,7 +660,6 @@ files = [ name = "traitlets" version = "5.9.0" description = "Traitlets Python configuration system" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -712,7 +675,6 @@ test = ["argcomplete (>=2.0)", "pre-commit", "pytest", "pytest-mock"] name = "typing-extensions" version = "4.5.0" description = "Backported and Experimental Type Hints for Python 3.7+" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -724,7 +686,6 @@ files = [ name = "wcwidth" version = "0.2.6" description = "Measures the displayed width of unicode strings in a terminal" -category = "dev" optional = false python-versions = "*" files = [ @@ -736,7 +697,6 @@ files = [ name = "wrapt" version = "1.14.1" description = "Module for decorators, wrappers and monkey patching." -category = "dev" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" files = [ diff --git a/fonts/supported.xml b/fonts/supported.xml index 4cc5383b7a4..ccd9a8d22d7 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 @@ -2151,56 +2186,56 @@ - - - - - - + + + + + + U+E8FF U+E8F0 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 @@ - - - - - - - + + + + + + + @@ -2772,22 +2807,22 @@ Combining staff positions - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + U+EB9F U+EB90 @@ -2799,13 +2834,13 @@ - - - - - - - + + + + + + + @@ -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 diff --git a/include/hum/.download b/include/hum/.download index ae3293fb191..f7d50d15a27 100755 --- a/include/hum/.download +++ b/include/hum/.download @@ -1,2 +1,2 @@ -wget https://raw.githubusercontent.com/craigsapp/humlib/master/include/humlib.h -O humlib.h +wget https://raw.githubusercontent.com/craigsapp/humlib/master/min/humlib.h -O humlib.h diff --git a/include/hum/humlib.h b/include/hum/humlib.h index 42fea3f0d8d..e54c967dfb7 100644 --- a/include/hum/humlib.h +++ b/include/hum/humlib.h @@ -1,9 +1,9 @@ // // Programmer: Craig Stuart Sapp // Creation Date: Sat Aug 8 12:24:49 PDT 2015 -// Last Modified: Sat Apr 15 11:52:53 PDT 2023 -// Filename: humlib.h -// URL: https://github.com/craigsapp/humlib/blob/master/include/humlib.h +// Last Modified: Tue Aug 22 22:41:40 CEST 2023 +// Filename: min/humlib.h +// URL: https://github.com/craigsapp/humlib/blob/master/min/humlib.h // Syntax: C++11 // vim: ts=3 // @@ -50,6 +50,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include #include #include +#include #include #include #include @@ -1230,6 +1231,7 @@ class HumdrumLine : public std::string, public HumHash { bool isCommentGlobal (void) const; bool isCommentUniversal (void) const; bool isReference (void) const; + bool isReferenceRecord (void) const { return isReference(); } bool isGlobalReference (void) const; bool isUniversalReference (void) const; bool isSignifier (void) const; @@ -1544,9 +1546,12 @@ class HumdrumToken : public std::string, public HumHash { bool isModernMensurationSymbol (void); bool isOriginalMensuration (void) { return isOriginalMensurationSymbol(); } bool isModernMensuration (void) { return isModernMensurationSymbol(); } - bool isInstrumentDesignation (void); bool isInstrumentName (void); bool isInstrumentAbbreviation (void); + bool isInstrumentDesignation (void); + bool isInstrumentCode (void) { return isInstrumentDesignation(); } + bool isInstrumentClass (void); + bool isInstrumentGroup (void); bool isModernInstrumentName (void); bool isModernInstrumentAbbreviation(void); bool isOriginalInstrumentName (void); @@ -2313,6 +2318,26 @@ std::ostream& operator<<(std::ostream& out, HumdrumFileBase& infile); +////////////////////////////// +// +// HumdrumFileBase::initializeArray -- adjust the size of the input array +// to the same dimensions as the HumdrumFile, filling in each cell of the +// array with the given value as a default. +// + +template +void HumdrumFileBase::initializeArray(std::vector>& array, TYPE value) { + HumdrumFileBase& infile = *this; + array.clear(); + array.resize(infile.getLineCount()); + for (int i=0; i 0) { \ infile.readNoRhythm(interface.getArgument(1)); \ } else { \ - infile.readNoRhythm(cin); \ + infile.readNoRhythm(std::cin); \ } \ - int status = interface.run(infile, cout); \ + int status = interface.run(infile, std::cout); \ if (interface.hasWarning()) { \ - interface.getWarning(cerr); \ + interface.getWarning(std::cerr); \ return 0; \ } \ if (interface.hasError()) { \ - interface.getError(cerr); \ + interface.getError(std::cerr); \ return -1; \ } \ interface.finally(); \ @@ -5278,39 +5301,37 @@ int main(int argc, char** argv) { \ // usage implementation). // -#define STREAM_INTERFACE(CLASS) \ -using namespace std; \ -using namespace hum; \ -int main(int argc, char** argv) { \ - CLASS interface; \ - if (!interface.process(argc, argv)) { \ - interface.getError(cerr); \ - return -1; \ - } \ - HumdrumFileStream instream(static_cast(interface)); \ - HumdrumFileSet infiles; \ - bool status = true; \ - while (instream.readSingleSegment(infiles)) { \ - status &= interface.run(infiles); \ - if (interface.hasWarning()) { \ - interface.getWarning(cerr); \ - } \ - if (interface.hasAnyText()) { \ - interface.getAllText(cout); \ - } \ - if (interface.hasError()) { \ - interface.getError(cerr); \ - return -1; \ - } \ - if (!interface.hasAnyText()) { \ - for (int i=0; i(interface)); \ + hum::HumdrumFileSet infiles; \ + bool status = true; \ + while (instream.readSingleSegment(infiles)) { \ + status &= interface.run(infiles); \ + if (interface.hasWarning()) { \ + interface.getWarning(std::cerr); \ + } \ + if (interface.hasAnyText()) { \ + interface.getAllText(std::cout); \ + } \ + if (interface.hasError()) { \ + interface.getError(std::cerr); \ + return -1; \ + } \ + if (!interface.hasAnyText()) { \ + for (int i=0; i(interface)); \ - bool status = interface.run(instream); \ - if (interface.hasWarning()) { \ - interface.getWarning(cerr); \ - } \ - if (interface.hasAnyText()) { \ - interface.getAllText(cout); \ - } \ - if (interface.hasError()) { \ - interface.getError(cerr); \ - return -1; \ - } \ - interface.finally(); \ - interface.clearOutput(); \ - return !status; \ +#define RAW_STREAM_INTERFACE(CLASS) \ +int main(int argc, char** argv) { \ + hum::CLASS interface; \ + if (!interface.process(argc, argv)) { \ + interface.getError(std::cerr); \ + return -1; \ + } \ + hum::HumdrumFileStream instream(static_cast(interface)); \ + bool status = interface.run(instream); \ + if (interface.hasWarning()) { \ + interface.getWarning(std::cerr); \ + } \ + if (interface.hasAnyText()) { \ + interface.getAllText(std::cout); \ + } \ + if (interface.hasError()) { \ + interface.getError(std::cerr); \ + return -1; \ + } \ + interface.finally(); \ + interface.clearOutput(); \ + return !status; \ } @@ -5356,37 +5375,35 @@ int main(int argc, char** argv) { \ // usage implementation). // -#define SET_INTERFACE(CLASS) \ -using namespace std; \ -using namespace hum; \ -int main(int argc, char** argv) { \ - CLASS interface; \ - if (!interface.process(argc, argv)) { \ - interface.getError(cerr); \ - return -1; \ - } \ - HumdrumFileStream instream(static_cast(interface)); \ - HumdrumFileSet infiles; \ - instream.read(infiles); \ - bool status = interface.run(infiles); \ - if (interface.hasWarning()) { \ - interface.getWarning(cerr); \ - } \ - if (interface.hasAnyText()) { \ - interface.getAllText(cout); \ - } \ - if (interface.hasError()) { \ - interface.getError(cerr); \ - return -1; \ - } \ - if (!interface.hasAnyText()) { \ - for (int i=0; i(interface)); \ + hum::HumdrumFileSet infiles; \ + instream.read(infiles); \ + bool status = interface.run(infiles); \ + if (interface.hasWarning()) { \ + interface.getWarning(std::cerr); \ + } \ + if (interface.hasAnyText()) { \ + interface.getAllText(std::cout); \ + } \ + if (interface.hasError()) { \ + interface.getError(std::cerr); \ + return -1; \ + } \ + if (!interface.hasAnyText()) { \ + for (int i=0; i getMidiNotes(std::vector& kernNotes); - std::vector getChordPositions(std::vector& midiNotes); - void labelChordPositions(std::vector& kernNotes, std::vector& chordPositions); - - private: - std::string m_root_marker = "@"; - std::string m_third_marker = "N"; - std::string m_fifth_marker = "Z"; - - std::string m_root_color = "crimson"; - std::string m_third_color = "limegreen"; - std::string m_fifth_color = "royalblue"; - - bool m_colorThirds = true; - bool m_colorFifths = true; - bool m_colorTriads = true; - -}; - - class Tool_colortriads : public HumTool { public: Tool_colortriads (void); @@ -6454,10 +6438,11 @@ class Tool_composite : public HumTool { int m_groupAssignmentIndex = 0; int m_verseLabelIndex = 0; - int m_coincidenceEventCount = -1; - int m_fullCompositeEventCount = -1; - int m_groupAEventCount = -1; - int m_groupBEventCount = -1; + // analytic counts: + int m_coincidenceEventCount = -1; // number of events in coincidence + int m_fullCompositeEventCount = -1; // number of events in full composite rhythm + int m_groupAEventCount = -1; // number of events in group A composite rhythm + int m_groupBEventCount = -1; // number of events in group B composite rhythm double m_scoreSize = 100.0; double m_analysisSize = 100.0; @@ -7124,7 +7109,7 @@ class Tool_esac2hum : public HumTool { void getLyrics (vector& lyrics, const string& buffer); void cleanupLyrics (vector& lyrics); bool getFileContents (vector& array, const string& filename); - void chopExtraInfo (char* holdbuffer); + void chopExtraInfo (string& buffer); void printHumdrumHeaderInfo(ostream& out, vector& song); void printHumdrumFooterInfo(ostream& out, vector& song); @@ -7275,7 +7260,7 @@ class Tool_extract : public HumTool { class FiguredBassNumber { public: - FiguredBassNumber(int num, string accid, bool showAccid, int voiceIndex, int lineIndex, bool isAttack, bool intervallsatz); + FiguredBassNumber(int num, string accid, bool showAccid, int voiceIndex, int lineIndex, bool isAttack, bool intervallsatz, string intervalQuality, bool hint); std::string toString(bool nonCompoundIntervalsQ, bool noAccidentalsQ, bool hideThreeQ); int getNumberWithinOctave(void); @@ -7288,6 +7273,8 @@ class FiguredBassNumber { bool m_isAttack; bool m_convert2To9 = false; bool m_intervallsatz = false; + std::string m_intervalQuality; + bool m_hint = false; }; @@ -7334,6 +7321,7 @@ class Tool_fb : public HumTool { string getNumberString (vector numbers); string getKeySignature (HumdrumFile& infile, int lineIndex); int getLowestBase40Pitch (vector base40Pitches); + string getIntervalQuality (int basePitchBase40, int targetPitchBase40); private: @@ -7351,6 +7339,7 @@ class Tool_fb : public HumTool { bool m_showNegativeQ = false; bool m_aboveQ = false; string m_rateQ = ""; + bool m_hintQ = false; string m_spineTracks = ""; // used with -s option string m_kernTracks = ""; // used with -k option @@ -9293,6 +9282,35 @@ class Tool_myank : public HumTool { }; +class Tool_ordergps : public HumTool { + public: + Tool_ordergps (void); + ~Tool_ordergps () {}; + + bool run (HumdrumFileSet& infiles); + bool run (HumdrumFile& infile); + bool run (const string& indata, ostream& out); + bool run (HumdrumFile& infile, ostream& out); + + protected: + void initialize (void); + void processFile (HumdrumFile& infile); + void printStaffLine (HumdrumFile& infile); + void printFile (HumdrumFile& infile, int gindex, int pindex, int sindex); + void printFileTop (HumdrumFile& infile, int gindex, int pindex, int sindex); + + private: + bool m_emptyQ = false; + bool m_fileQ = false; + bool m_listQ = false; + bool m_problemQ = false; + bool m_reverseQ = false; + bool m_staffQ = false; + bool m_topQ = false; + +}; + + class Tool_pccount : public HumTool { public: @@ -10344,6 +10362,105 @@ class Tool_trillspell : public HumTool { +class Tool_tspos : public HumTool { + public: + Tool_tspos (void); + ~Tool_tspos () {}; + + bool run (HumdrumFileSet& infiles); + bool run (HumdrumFile& infile); + bool run (const string& indata, ostream& out); + bool run (HumdrumFile& infile, ostream& out); + + protected: + void initialize (HumdrumFile& infile); + void processFile (HumdrumFile& infile); + std::vector getMidiNotes(std::vector& kernNotes); + std::vector getChordPositions(std::vector& midiNotes); + std::vector getNoteMods(std::vector& midiNotes); + std::vector getThirds(std::vector& midiNotes); + std::vector getFifths(std::vector& midiNotes); + void labelChordPositions(std::vector& kernNotes, std::vector& chordPositions); + void labelThirds(std::vector& kernNotes, std::vector& thirdPositions); + void labelFifths(std::vector& kernNotes, std::vector& fifthPositions); + void keepOnlyDoubles(std::vector& output); + void checkForTriadicSonority(std::vector& positions, int line); + std::string generateStatistics(HumdrumFile& infile); + std::vector getTrackNames(HumdrumFile& infile); + int getVectorSum(std::vector& input); + void analyzeVoiceCount(HumdrumFile& infile); + int countVoicesOnLine(HumdrumFile& infile, int line); + std::string generateTable(HumdrumFile& infile, std::vector& name); + bool hasFullTriadAttack(HumdrumLine& line); + void avoidRdfCollisions(HumdrumFile& infile); + void printUsedMarkers(void); + std::string makeOpacityColor(std::string& color, double value, double total); + int getToolCounter(HumdrumFile& infile); + std::string makePercentString(double value, double total, int digits); + + private: + std::string m_root_marker = "@"; + std::string m_third_marker = "N"; + std::string m_fifth_marker = "Z"; + std::string m_3rd_root_marker = "j"; + std::string m_3rd_third_marker = "l"; + std::string m_5th_root_marker = "V"; + std::string m_5th_fifth_marker = "|"; + + std::vector m_used_markers; + + std::string m_root_color = "#DC143C"; // crimson + std::string m_third_color = "#32CD32"; // limegreen + std::string m_fifth_color = "#4169E1"; // royalblue + std::string m_3rd_root_color = "#8B0000"; // darkred + std::string m_3rd_third_color = "#008000"; // green + std::string m_5th_root_color = "#8B0000"; // darkred + std::string m_5th_fifth_color = "#4682B4"; // steelblue + + bool m_colorThirds = true; // used with -3 option (to negate) + bool m_colorFifths = true; // used with -5 option (to negate) + bool m_colorTriads = true; // used with -T option (to negate) + bool m_doubleQ = false; // used with -d option + + bool m_topQ = false; // used with --top option + bool m_tableQ = false; // used with -t option + bool m_triadAttack = false; // used with -x option + + // Statistical data variables: + vector m_triadState; + + // m_partTriadPositions -- count the number of chordal positions by + // voice. The first dimention is the track number of the part, and + // the second dimension is the counts for 7 categories: + // 0 = count of root positions in full triadic chords + // 1 = count of third positions in full triadic chords + // 2 = count of fifth positions in full triadic chords + // 3 = count of root positions in partial triadic chords ("open thirds") + // 4 = count of third positions in partial triadic chords + // 5 = count of root positions in partial triadic chords ("open fifths") + // 6 = count of fifth positions in partial triadic chords + std::vector> m_partTriadPositions; + int m_positionCount = 7; // entries in 2nd dim. of m_partTriadPositions + + string m_toolName = "tspos"; + + std::vector m_voiceCount; + // m_voice: used with -v option to limit analysis to sonorities that + // have the given voice count. 0 means analyze any voice counts. + int m_voice = 0; + + bool m_compressedQ = false; + + bool m_minorQ = true; + bool m_majorQ = true; + + bool m_questionQ = true; + int m_toolCount = 0; + + std::vector m_fullNames; +}; + + } // end of namespace hum diff --git a/include/pugi/pugiconfig.hpp b/include/pugi/pugiconfig.hpp index 77496aefe7c..3dc839da6ec 100644 --- a/include/pugi/pugiconfig.hpp +++ b/include/pugi/pugiconfig.hpp @@ -1,77 +1,77 @@ -/** - * pugixml parser - version 1.13 - * -------------------------------------------------------- - * Copyright (C) 2006-2022, by Arseny Kapoulkine (arseny.kapoulkine@gmail.com) - * Report bugs and download new versions at https://pugixml.org/ - * - * This library is distributed under the MIT License. See notice at the end - * of this file. - * - * This work is based on the pugxml parser, which is: - * Copyright (C) 2003, by Kristen Wegner (kristen@tima.net) - */ - -#ifndef HEADER_PUGICONFIG_HPP -#define HEADER_PUGICONFIG_HPP - -// Uncomment this to enable wchar_t mode -// #define PUGIXML_WCHAR_MODE - -// Uncomment this to enable compact mode -// #define PUGIXML_COMPACT - -// Uncomment this to disable XPath -// #define PUGIXML_NO_XPATH - -// Uncomment this to disable STL -// #define PUGIXML_NO_STL - -// Uncomment this to disable exceptions -// #define PUGIXML_NO_EXCEPTIONS - -// Set this to control attributes for public classes/functions, i.e.: -// #define PUGIXML_API __declspec(dllexport) // to export all public symbols from DLL -// #define PUGIXML_CLASS __declspec(dllimport) // to import all classes from DLL -// #define PUGIXML_FUNCTION __fastcall // to set calling conventions to all public functions to fastcall -// In absence of PUGIXML_CLASS/PUGIXML_FUNCTION definitions PUGIXML_API is used instead - -// Tune these constants to adjust memory-related behavior -// #define PUGIXML_MEMORY_PAGE_SIZE 32768 -// #define PUGIXML_MEMORY_OUTPUT_STACK 10240 -// #define PUGIXML_MEMORY_XPATH_PAGE_SIZE 4096 - -// Tune this constant to adjust max nesting for XPath queries -// #define PUGIXML_XPATH_DEPTH_LIMIT 1024 - -// Uncomment this to switch to header-only version -// #define PUGIXML_HEADER_ONLY - -// Uncomment this to enable long long support -// #define PUGIXML_HAS_LONG_LONG - -#endif - -/** - * Copyright (c) 2006-2022 Arseny Kapoulkine - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, - * copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following - * conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES - * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT - * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, - * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - * OTHER DEALINGS IN THE SOFTWARE. - */ +/** + * pugixml parser - version 1.14 + * -------------------------------------------------------- + * Copyright (C) 2006-2023, by Arseny Kapoulkine (arseny.kapoulkine@gmail.com) + * Report bugs and download new versions at https://pugixml.org/ + * + * This library is distributed under the MIT License. See notice at the end + * of this file. + * + * This work is based on the pugxml parser, which is: + * Copyright (C) 2003, by Kristen Wegner (kristen@tima.net) + */ + +#ifndef HEADER_PUGICONFIG_HPP +#define HEADER_PUGICONFIG_HPP + +// Uncomment this to enable wchar_t mode +// #define PUGIXML_WCHAR_MODE + +// Uncomment this to enable compact mode +// #define PUGIXML_COMPACT + +// Uncomment this to disable XPath +// #define PUGIXML_NO_XPATH + +// Uncomment this to disable STL +// #define PUGIXML_NO_STL + +// Uncomment this to disable exceptions +// #define PUGIXML_NO_EXCEPTIONS + +// Set this to control attributes for public classes/functions, i.e.: +// #define PUGIXML_API __declspec(dllexport) // to export all public symbols from DLL +// #define PUGIXML_CLASS __declspec(dllimport) // to import all classes from DLL +// #define PUGIXML_FUNCTION __fastcall // to set calling conventions to all public functions to fastcall +// In absence of PUGIXML_CLASS/PUGIXML_FUNCTION definitions PUGIXML_API is used instead + +// Tune these constants to adjust memory-related behavior +// #define PUGIXML_MEMORY_PAGE_SIZE 32768 +// #define PUGIXML_MEMORY_OUTPUT_STACK 10240 +// #define PUGIXML_MEMORY_XPATH_PAGE_SIZE 4096 + +// Tune this constant to adjust max nesting for XPath queries +// #define PUGIXML_XPATH_DEPTH_LIMIT 1024 + +// Uncomment this to switch to header-only version +// #define PUGIXML_HEADER_ONLY + +// Uncomment this to enable long long support +// #define PUGIXML_HAS_LONG_LONG + +#endif + +/** + * Copyright (c) 2006-2023 Arseny Kapoulkine + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, + * copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following + * conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + * OTHER DEALINGS IN THE SOFTWARE. + */ diff --git a/include/pugi/pugixml.hpp b/include/pugi/pugixml.hpp index 59c0c58641e..d17a7e6930e 100644 --- a/include/pugi/pugixml.hpp +++ b/include/pugi/pugixml.hpp @@ -1,1506 +1,1516 @@ -/** - * pugixml parser - version 1.13 - * -------------------------------------------------------- - * Copyright (C) 2006-2022, by Arseny Kapoulkine (arseny.kapoulkine@gmail.com) - * Report bugs and download new versions at https://pugixml.org/ - * - * This library is distributed under the MIT License. See notice at the end - * of this file. - * - * This work is based on the pugxml parser, which is: - * Copyright (C) 2003, by Kristen Wegner (kristen@tima.net) - */ - -// Define version macro; evaluates to major * 1000 + minor * 10 + patch so that it's safe to use in less-than comparisons -// Note: pugixml used major * 100 + minor * 10 + patch format up until 1.9 (which had version identifier 190); starting from pugixml 1.10, the minor version number is two digits -#ifndef PUGIXML_VERSION -# define PUGIXML_VERSION 1130 // 1.13 -#endif - -// Include user configuration file (this can define various configuration macros) -#include "pugiconfig.hpp" - -#ifndef HEADER_PUGIXML_HPP -#define HEADER_PUGIXML_HPP - -// Include stddef.h for size_t and ptrdiff_t -#include - -// Include exception header for XPath -#if !defined(PUGIXML_NO_XPATH) && !defined(PUGIXML_NO_EXCEPTIONS) -# include -#endif - -// Include STL headers -#ifndef PUGIXML_NO_STL -# include -# include -# include -#endif - -// Macro for deprecated features -#ifndef PUGIXML_DEPRECATED -# if defined(__GNUC__) -# define PUGIXML_DEPRECATED __attribute__((deprecated)) -# elif defined(_MSC_VER) && _MSC_VER >= 1300 -# define PUGIXML_DEPRECATED __declspec(deprecated) -# else -# define PUGIXML_DEPRECATED -# endif -#endif - -// If no API is defined, assume default -#ifndef PUGIXML_API -# define PUGIXML_API -#endif - -// If no API for classes is defined, assume default -#ifndef PUGIXML_CLASS -# define PUGIXML_CLASS PUGIXML_API -#endif - -// If no API for functions is defined, assume default -#ifndef PUGIXML_FUNCTION -# define PUGIXML_FUNCTION PUGIXML_API -#endif - -// If the platform is known to have long long support, enable long long functions -#ifndef PUGIXML_HAS_LONG_LONG -# if __cplusplus >= 201103 -# define PUGIXML_HAS_LONG_LONG -# elif defined(_MSC_VER) && _MSC_VER >= 1400 -# define PUGIXML_HAS_LONG_LONG -# endif -#endif - -// If the platform is known to have move semantics support, compile move ctor/operator implementation -#ifndef PUGIXML_HAS_MOVE -# if __cplusplus >= 201103 -# define PUGIXML_HAS_MOVE -# elif defined(_MSC_VER) && _MSC_VER >= 1600 -# define PUGIXML_HAS_MOVE -# endif -#endif - -// If C++ is 2011 or higher, add 'noexcept' specifiers -#ifndef PUGIXML_NOEXCEPT -# if __cplusplus >= 201103 -# define PUGIXML_NOEXCEPT noexcept -# elif defined(_MSC_VER) && _MSC_VER >= 1900 -# define PUGIXML_NOEXCEPT noexcept -# else -# define PUGIXML_NOEXCEPT -# endif -#endif - -// Some functions can not be noexcept in compact mode -#ifdef PUGIXML_COMPACT -# define PUGIXML_NOEXCEPT_IF_NOT_COMPACT -#else -# define PUGIXML_NOEXCEPT_IF_NOT_COMPACT PUGIXML_NOEXCEPT -#endif - -// If C++ is 2011 or higher, add 'override' qualifiers -#ifndef PUGIXML_OVERRIDE -# if __cplusplus >= 201103 -# define PUGIXML_OVERRIDE override -# elif defined(_MSC_VER) && _MSC_VER >= 1700 -# define PUGIXML_OVERRIDE override -# else -# define PUGIXML_OVERRIDE -# endif -#endif - -// If C++ is 2011 or higher, use 'nullptr' -#ifndef PUGIXML_NULL -# if __cplusplus >= 201103 -# define PUGIXML_NULL nullptr -# elif defined(_MSC_VER) && _MSC_VER >= 1600 -# define PUGIXML_NULL nullptr -# else -# define PUGIXML_NULL 0 -# endif -#endif - -// Character interface macros -#ifdef PUGIXML_WCHAR_MODE -# define PUGIXML_TEXT(t) L ## t -# define PUGIXML_CHAR wchar_t -#else -# define PUGIXML_TEXT(t) t -# define PUGIXML_CHAR char -#endif - -namespace pugi -{ - // Character type used for all internal storage and operations; depends on PUGIXML_WCHAR_MODE - typedef PUGIXML_CHAR char_t; - -#ifndef PUGIXML_NO_STL - // String type used for operations that work with STL string; depends on PUGIXML_WCHAR_MODE - typedef std::basic_string, std::allocator > string_t; -#endif -} - -// The PugiXML namespace -namespace pugi -{ - // Tree node types - enum xml_node_type - { - node_null, // Empty (null) node handle - node_document, // A document tree's absolute root - node_element, // Element tag, i.e. '' - node_pcdata, // Plain character data, i.e. 'text' - node_cdata, // Character data, i.e. '' - node_comment, // Comment tag, i.e. '' - node_pi, // Processing instruction, i.e. '' - node_declaration, // Document declaration, i.e. '' - node_doctype // Document type declaration, i.e. '' - }; - - // Parsing options - - // Minimal parsing mode (equivalent to turning all other flags off). - // Only elements and PCDATA sections are added to the DOM tree, no text conversions are performed. - const unsigned int parse_minimal = 0x0000; - - // This flag determines if processing instructions (node_pi) are added to the DOM tree. This flag is off by default. - const unsigned int parse_pi = 0x0001; - - // This flag determines if comments (node_comment) are added to the DOM tree. This flag is off by default. - const unsigned int parse_comments = 0x0002; - - // This flag determines if CDATA sections (node_cdata) are added to the DOM tree. This flag is on by default. - const unsigned int parse_cdata = 0x0004; - - // This flag determines if plain character data (node_pcdata) that consist only of whitespace are added to the DOM tree. - // This flag is off by default; turning it on usually results in slower parsing and more memory consumption. - const unsigned int parse_ws_pcdata = 0x0008; - - // This flag determines if character and entity references are expanded during parsing. This flag is on by default. - const unsigned int parse_escapes = 0x0010; - - // This flag determines if EOL characters are normalized (converted to #xA) during parsing. This flag is on by default. - const unsigned int parse_eol = 0x0020; - - // This flag determines if attribute values are normalized using CDATA normalization rules during parsing. This flag is on by default. - const unsigned int parse_wconv_attribute = 0x0040; - - // This flag determines if attribute values are normalized using NMTOKENS normalization rules during parsing. This flag is off by default. - const unsigned int parse_wnorm_attribute = 0x0080; - - // This flag determines if document declaration (node_declaration) is added to the DOM tree. This flag is off by default. - const unsigned int parse_declaration = 0x0100; - - // This flag determines if document type declaration (node_doctype) is added to the DOM tree. This flag is off by default. - const unsigned int parse_doctype = 0x0200; - - // This flag determines if plain character data (node_pcdata) that is the only child of the parent node and that consists only - // of whitespace is added to the DOM tree. - // This flag is off by default; turning it on may result in slower parsing and more memory consumption. - const unsigned int parse_ws_pcdata_single = 0x0400; - - // This flag determines if leading and trailing whitespace is to be removed from plain character data. This flag is off by default. - const unsigned int parse_trim_pcdata = 0x0800; - - // This flag determines if plain character data that does not have a parent node is added to the DOM tree, and if an empty document - // is a valid document. This flag is off by default. - const unsigned int parse_fragment = 0x1000; - - // This flag determines if plain character data is be stored in the parent element's value. This significantly changes the structure of - // the document; this flag is only recommended for parsing documents with many PCDATA nodes in memory-constrained environments. - // This flag is off by default. - const unsigned int parse_embed_pcdata = 0x2000; - - // The default parsing mode. - // Elements, PCDATA and CDATA sections are added to the DOM tree, character/reference entities are expanded, - // End-of-Line characters are normalized, attribute values are normalized using CDATA normalization rules. - const unsigned int parse_default = parse_cdata | parse_escapes | parse_wconv_attribute | parse_eol; - - // The full parsing mode. - // Nodes of all types are added to the DOM tree, character/reference entities are expanded, - // End-of-Line characters are normalized, attribute values are normalized using CDATA normalization rules. - const unsigned int parse_full = parse_default | parse_pi | parse_comments | parse_declaration | parse_doctype; - - // These flags determine the encoding of input data for XML document - enum xml_encoding - { - encoding_auto, // Auto-detect input encoding using BOM or < / class xml_object_range - { - public: - typedef It const_iterator; - typedef It iterator; - - xml_object_range(It b, It e): _begin(b), _end(e) - { - } - - It begin() const { return _begin; } - It end() const { return _end; } - - bool empty() const { return _begin == _end; } - - private: - It _begin, _end; - }; - - // Writer interface for node printing (see xml_node::print) - class PUGIXML_CLASS xml_writer - { - public: - virtual ~xml_writer() {} - - // Write memory chunk into stream/file/whatever - virtual void write(const void* data, size_t size) = 0; - }; - - // xml_writer implementation for FILE* - class PUGIXML_CLASS xml_writer_file: public xml_writer - { - public: - // Construct writer from a FILE* object; void* is used to avoid header dependencies on stdio - xml_writer_file(void* file); - - virtual void write(const void* data, size_t size) PUGIXML_OVERRIDE; - - private: - void* file; - }; - - #ifndef PUGIXML_NO_STL - // xml_writer implementation for streams - class PUGIXML_CLASS xml_writer_stream: public xml_writer - { - public: - // Construct writer from an output stream object - xml_writer_stream(std::basic_ostream >& stream); - xml_writer_stream(std::basic_ostream >& stream); - - virtual void write(const void* data, size_t size) PUGIXML_OVERRIDE; - - private: - std::basic_ostream >* narrow_stream; - std::basic_ostream >* wide_stream; - }; - #endif - - // A light-weight handle for manipulating attributes in DOM tree - class PUGIXML_CLASS xml_attribute - { - friend class xml_attribute_iterator; - friend class xml_node; - - private: - xml_attribute_struct* _attr; - - typedef void (*unspecified_bool_type)(xml_attribute***); - - public: - // Default constructor. Constructs an empty attribute. - xml_attribute(); - - // Constructs attribute from internal pointer - explicit xml_attribute(xml_attribute_struct* attr); - - // Safe bool conversion operator - operator unspecified_bool_type() const; - - // Borland C++ workaround - bool operator!() const; - - // Comparison operators (compares wrapped attribute pointers) - bool operator==(const xml_attribute& r) const; - bool operator!=(const xml_attribute& r) const; - bool operator<(const xml_attribute& r) const; - bool operator>(const xml_attribute& r) const; - bool operator<=(const xml_attribute& r) const; - bool operator>=(const xml_attribute& r) const; - - // Check if attribute is empty - bool empty() const; - - // Get attribute name/value, or "" if attribute is empty - const char_t* name() const; - const char_t* value() const; - - // Get attribute value, or the default value if attribute is empty - const char_t* as_string(const char_t* def = PUGIXML_TEXT("")) const; - - // Get attribute value as a number, or the default value if conversion did not succeed or attribute is empty - int as_int(int def = 0) const; - unsigned int as_uint(unsigned int def = 0) const; - double as_double(double def = 0) const; - float as_float(float def = 0) const; - - #ifdef PUGIXML_HAS_LONG_LONG - long long as_llong(long long def = 0) const; - unsigned long long as_ullong(unsigned long long def = 0) const; - #endif - - // Get attribute value as bool (returns true if first character is in '1tTyY' set), or the default value if attribute is empty - bool as_bool(bool def = false) const; - - // Set attribute name/value (returns false if attribute is empty or there is not enough memory) - bool set_name(const char_t* rhs); - bool set_value(const char_t* rhs, size_t sz); - bool set_value(const char_t* rhs); - - // Set attribute value with type conversion (numbers are converted to strings, boolean is converted to "true"/"false") - bool set_value(int rhs); - bool set_value(unsigned int rhs); - bool set_value(long rhs); - bool set_value(unsigned long rhs); - bool set_value(double rhs); - bool set_value(double rhs, int precision); - bool set_value(float rhs); - bool set_value(float rhs, int precision); - bool set_value(bool rhs); - - #ifdef PUGIXML_HAS_LONG_LONG - bool set_value(long long rhs); - bool set_value(unsigned long long rhs); - #endif - - // Set attribute value (equivalent to set_value without error checking) - xml_attribute& operator=(const char_t* rhs); - xml_attribute& operator=(int rhs); - xml_attribute& operator=(unsigned int rhs); - xml_attribute& operator=(long rhs); - xml_attribute& operator=(unsigned long rhs); - xml_attribute& operator=(double rhs); - xml_attribute& operator=(float rhs); - xml_attribute& operator=(bool rhs); - - #ifdef PUGIXML_HAS_LONG_LONG - xml_attribute& operator=(long long rhs); - xml_attribute& operator=(unsigned long long rhs); - #endif - - // Get next/previous attribute in the attribute list of the parent node - xml_attribute next_attribute() const; - xml_attribute previous_attribute() const; - - // Get hash value (unique for handles to the same object) - size_t hash_value() const; - - // Get internal pointer - xml_attribute_struct* internal_object() const; - }; - -#ifdef __BORLANDC__ - // Borland C++ workaround - bool PUGIXML_FUNCTION operator&&(const xml_attribute& lhs, bool rhs); - bool PUGIXML_FUNCTION operator||(const xml_attribute& lhs, bool rhs); -#endif - - // A light-weight handle for manipulating nodes in DOM tree - class PUGIXML_CLASS xml_node - { - friend class xml_attribute_iterator; - friend class xml_node_iterator; - friend class xml_named_node_iterator; - - protected: - xml_node_struct* _root; - - typedef void (*unspecified_bool_type)(xml_node***); - - public: - // Default constructor. Constructs an empty node. - xml_node(); - - // Constructs node from internal pointer - explicit xml_node(xml_node_struct* p); - - // Safe bool conversion operator - operator unspecified_bool_type() const; - - // Borland C++ workaround - bool operator!() const; - - // Comparison operators (compares wrapped node pointers) - bool operator==(const xml_node& r) const; - bool operator!=(const xml_node& r) const; - bool operator<(const xml_node& r) const; - bool operator>(const xml_node& r) const; - bool operator<=(const xml_node& r) const; - bool operator>=(const xml_node& r) const; - - // Check if node is empty. - bool empty() const; - - // Get node type - xml_node_type type() const; - - // Get node name, or "" if node is empty or it has no name - const char_t* name() const; - - // Get node value, or "" if node is empty or it has no value - // Note: For text node.value() does not return "text"! Use child_value() or text() methods to access text inside nodes. - const char_t* value() const; - - // Get attribute list - xml_attribute first_attribute() const; - xml_attribute last_attribute() const; - - // Get children list - xml_node first_child() const; - xml_node last_child() const; - - // Get next/previous sibling in the children list of the parent node - xml_node next_sibling() const; - xml_node previous_sibling() const; - - // Get parent node - xml_node parent() const; - - // Get root of DOM tree this node belongs to - xml_node root() const; - - // Get text object for the current node - xml_text text() const; - - // Get child, attribute or next/previous sibling with the specified name - xml_node child(const char_t* name) const; - xml_attribute attribute(const char_t* name) const; - xml_node next_sibling(const char_t* name) const; - xml_node previous_sibling(const char_t* name) const; - - // Get attribute, starting the search from a hint (and updating hint so that searching for a sequence of attributes is fast) - xml_attribute attribute(const char_t* name, xml_attribute& hint) const; - - // Get child value of current node; that is, value of the first child node of type PCDATA/CDATA - const char_t* child_value() const; - - // Get child value of child with specified name. Equivalent to child(name).child_value(). - const char_t* child_value(const char_t* name) const; - - // Set node name/value (returns false if node is empty, there is not enough memory, or node can not have name/value) - bool set_name(const char_t* rhs); - bool set_value(const char_t* rhs, size_t sz); - bool set_value(const char_t* rhs); - - // Add attribute with specified name. Returns added attribute, or empty attribute on errors. - xml_attribute append_attribute(const char_t* name); - xml_attribute prepend_attribute(const char_t* name); - xml_attribute insert_attribute_after(const char_t* name, const xml_attribute& attr); - xml_attribute insert_attribute_before(const char_t* name, const xml_attribute& attr); - - // Add a copy of the specified attribute. Returns added attribute, or empty attribute on errors. - xml_attribute append_copy(const xml_attribute& proto); - xml_attribute prepend_copy(const xml_attribute& proto); - xml_attribute insert_copy_after(const xml_attribute& proto, const xml_attribute& attr); - xml_attribute insert_copy_before(const xml_attribute& proto, const xml_attribute& attr); - - // Add child node with specified type. Returns added node, or empty node on errors. - xml_node append_child(xml_node_type type = node_element); - xml_node prepend_child(xml_node_type type = node_element); - xml_node insert_child_after(xml_node_type type, const xml_node& node); - xml_node insert_child_before(xml_node_type type, const xml_node& node); - - // Add child element with specified name. Returns added node, or empty node on errors. - xml_node append_child(const char_t* name); - xml_node prepend_child(const char_t* name); - xml_node insert_child_after(const char_t* name, const xml_node& node); - xml_node insert_child_before(const char_t* name, const xml_node& node); - - // Add a copy of the specified node as a child. Returns added node, or empty node on errors. - xml_node append_copy(const xml_node& proto); - xml_node prepend_copy(const xml_node& proto); - xml_node insert_copy_after(const xml_node& proto, const xml_node& node); - xml_node insert_copy_before(const xml_node& proto, const xml_node& node); - - // Move the specified node to become a child of this node. Returns moved node, or empty node on errors. - xml_node append_move(const xml_node& moved); - xml_node prepend_move(const xml_node& moved); - xml_node insert_move_after(const xml_node& moved, const xml_node& node); - xml_node insert_move_before(const xml_node& moved, const xml_node& node); - - // Remove specified attribute - bool remove_attribute(const xml_attribute& a); - bool remove_attribute(const char_t* name); - - // Remove all attributes - bool remove_attributes(); - - // Remove specified child - bool remove_child(const xml_node& n); - bool remove_child(const char_t* name); - - // Remove all children - bool remove_children(); - - // Parses buffer as an XML document fragment and appends all nodes as children of the current node. - // Copies/converts the buffer, so it may be deleted or changed after the function returns. - // Note: append_buffer allocates memory that has the lifetime of the owning document; removing the appended nodes does not immediately reclaim that memory. - xml_parse_result append_buffer(const void* contents, size_t size, unsigned int options = parse_default, xml_encoding encoding = encoding_auto); - - // Find attribute using predicate. Returns first attribute for which predicate returned true. - template xml_attribute find_attribute(Predicate pred) const - { - if (!_root) return xml_attribute(); - - for (xml_attribute attrib = first_attribute(); attrib; attrib = attrib.next_attribute()) - if (pred(attrib)) - return attrib; - - return xml_attribute(); - } - - // Find child node using predicate. Returns first child for which predicate returned true. - template xml_node find_child(Predicate pred) const - { - if (!_root) return xml_node(); - - for (xml_node node = first_child(); node; node = node.next_sibling()) - if (pred(node)) - return node; - - return xml_node(); - } - - // Find node from subtree using predicate. Returns first node from subtree (depth-first), for which predicate returned true. - template xml_node find_node(Predicate pred) const - { - if (!_root) return xml_node(); - - xml_node cur = first_child(); - - while (cur._root && cur._root != _root) - { - if (pred(cur)) return cur; - - if (cur.first_child()) cur = cur.first_child(); - else if (cur.next_sibling()) cur = cur.next_sibling(); - else - { - while (!cur.next_sibling() && cur._root != _root) cur = cur.parent(); - - if (cur._root != _root) cur = cur.next_sibling(); - } - } - - return xml_node(); - } - - // Find child node by attribute name/value - xml_node find_child_by_attribute(const char_t* name, const char_t* attr_name, const char_t* attr_value) const; - xml_node find_child_by_attribute(const char_t* attr_name, const char_t* attr_value) const; - - #ifndef PUGIXML_NO_STL - // Get the absolute node path from root as a text string. - string_t path(char_t delimiter = '/') const; - #endif - - // Search for a node by path consisting of node names and . or .. elements. - xml_node first_element_by_path(const char_t* path, char_t delimiter = '/') const; - - // Recursively traverse subtree with xml_tree_walker - bool traverse(xml_tree_walker& walker); - - #ifndef PUGIXML_NO_XPATH - // Select single node by evaluating XPath query. Returns first node from the resulting node set. - xpath_node select_node(const char_t* query, xpath_variable_set* variables = PUGIXML_NULL) const; - xpath_node select_node(const xpath_query& query) const; - - // Select node set by evaluating XPath query - xpath_node_set select_nodes(const char_t* query, xpath_variable_set* variables = PUGIXML_NULL) const; - xpath_node_set select_nodes(const xpath_query& query) const; - - // (deprecated: use select_node instead) Select single node by evaluating XPath query. - PUGIXML_DEPRECATED xpath_node select_single_node(const char_t* query, xpath_variable_set* variables = PUGIXML_NULL) const; - PUGIXML_DEPRECATED xpath_node select_single_node(const xpath_query& query) const; - - #endif - - // Print subtree using a writer object - void print(xml_writer& writer, const char_t* indent = PUGIXML_TEXT("\t"), unsigned int flags = format_default, xml_encoding encoding = encoding_auto, unsigned int depth = 0) const; - - #ifndef PUGIXML_NO_STL - // Print subtree to stream - void print(std::basic_ostream >& os, const char_t* indent = PUGIXML_TEXT("\t"), unsigned int flags = format_default, xml_encoding encoding = encoding_auto, unsigned int depth = 0) const; - void print(std::basic_ostream >& os, const char_t* indent = PUGIXML_TEXT("\t"), unsigned int flags = format_default, unsigned int depth = 0) const; - #endif - - // Child nodes iterators - typedef xml_node_iterator iterator; - - iterator begin() const; - iterator end() const; - - // Attribute iterators - typedef xml_attribute_iterator attribute_iterator; - - attribute_iterator attributes_begin() const; - attribute_iterator attributes_end() const; - - // Range-based for support - xml_object_range children() const; - xml_object_range children(const char_t* name) const; - xml_object_range attributes() const; - - // Get node offset in parsed file/string (in char_t units) for debugging purposes - ptrdiff_t offset_debug() const; - - // Get hash value (unique for handles to the same object) - size_t hash_value() const; - - // Get internal pointer - xml_node_struct* internal_object() const; - }; - -#ifdef __BORLANDC__ - // Borland C++ workaround - bool PUGIXML_FUNCTION operator&&(const xml_node& lhs, bool rhs); - bool PUGIXML_FUNCTION operator||(const xml_node& lhs, bool rhs); -#endif - - // A helper for working with text inside PCDATA nodes - class PUGIXML_CLASS xml_text - { - friend class xml_node; - - xml_node_struct* _root; - - typedef void (*unspecified_bool_type)(xml_text***); - - explicit xml_text(xml_node_struct* root); - - xml_node_struct* _data_new(); - xml_node_struct* _data() const; - - public: - // Default constructor. Constructs an empty object. - xml_text(); - - // Safe bool conversion operator - operator unspecified_bool_type() const; - - // Borland C++ workaround - bool operator!() const; - - // Check if text object is empty - bool empty() const; - - // Get text, or "" if object is empty - const char_t* get() const; - - // Get text, or the default value if object is empty - const char_t* as_string(const char_t* def = PUGIXML_TEXT("")) const; - - // Get text as a number, or the default value if conversion did not succeed or object is empty - int as_int(int def = 0) const; - unsigned int as_uint(unsigned int def = 0) const; - double as_double(double def = 0) const; - float as_float(float def = 0) const; - - #ifdef PUGIXML_HAS_LONG_LONG - long long as_llong(long long def = 0) const; - unsigned long long as_ullong(unsigned long long def = 0) const; - #endif - - // Get text as bool (returns true if first character is in '1tTyY' set), or the default value if object is empty - bool as_bool(bool def = false) const; - - // Set text (returns false if object is empty or there is not enough memory) - bool set(const char_t* rhs, size_t sz); - bool set(const char_t* rhs); - - // Set text with type conversion (numbers are converted to strings, boolean is converted to "true"/"false") - bool set(int rhs); - bool set(unsigned int rhs); - bool set(long rhs); - bool set(unsigned long rhs); - bool set(double rhs); - bool set(double rhs, int precision); - bool set(float rhs); - bool set(float rhs, int precision); - bool set(bool rhs); - - #ifdef PUGIXML_HAS_LONG_LONG - bool set(long long rhs); - bool set(unsigned long long rhs); - #endif - - // Set text (equivalent to set without error checking) - xml_text& operator=(const char_t* rhs); - xml_text& operator=(int rhs); - xml_text& operator=(unsigned int rhs); - xml_text& operator=(long rhs); - xml_text& operator=(unsigned long rhs); - xml_text& operator=(double rhs); - xml_text& operator=(float rhs); - xml_text& operator=(bool rhs); - - #ifdef PUGIXML_HAS_LONG_LONG - xml_text& operator=(long long rhs); - xml_text& operator=(unsigned long long rhs); - #endif - - // Get the data node (node_pcdata or node_cdata) for this object - xml_node data() const; - }; - -#ifdef __BORLANDC__ - // Borland C++ workaround - bool PUGIXML_FUNCTION operator&&(const xml_text& lhs, bool rhs); - bool PUGIXML_FUNCTION operator||(const xml_text& lhs, bool rhs); -#endif - - // Child node iterator (a bidirectional iterator over a collection of xml_node) - class PUGIXML_CLASS xml_node_iterator - { - friend class xml_node; - - private: - mutable xml_node _wrap; - xml_node _parent; - - xml_node_iterator(xml_node_struct* ref, xml_node_struct* parent); - - public: - // Iterator traits - typedef ptrdiff_t difference_type; - typedef xml_node value_type; - typedef xml_node* pointer; - typedef xml_node& reference; - - #ifndef PUGIXML_NO_STL - typedef std::bidirectional_iterator_tag iterator_category; - #endif - - // Default constructor - xml_node_iterator(); - - // Construct an iterator which points to the specified node - xml_node_iterator(const xml_node& node); - - // Iterator operators - bool operator==(const xml_node_iterator& rhs) const; - bool operator!=(const xml_node_iterator& rhs) const; - - xml_node& operator*() const; - xml_node* operator->() const; - - xml_node_iterator& operator++(); - xml_node_iterator operator++(int); - - xml_node_iterator& operator--(); - xml_node_iterator operator--(int); - }; - - // Attribute iterator (a bidirectional iterator over a collection of xml_attribute) - class PUGIXML_CLASS xml_attribute_iterator - { - friend class xml_node; - - private: - mutable xml_attribute _wrap; - xml_node _parent; - - xml_attribute_iterator(xml_attribute_struct* ref, xml_node_struct* parent); - - public: - // Iterator traits - typedef ptrdiff_t difference_type; - typedef xml_attribute value_type; - typedef xml_attribute* pointer; - typedef xml_attribute& reference; - - #ifndef PUGIXML_NO_STL - typedef std::bidirectional_iterator_tag iterator_category; - #endif - - // Default constructor - xml_attribute_iterator(); - - // Construct an iterator which points to the specified attribute - xml_attribute_iterator(const xml_attribute& attr, const xml_node& parent); - - // Iterator operators - bool operator==(const xml_attribute_iterator& rhs) const; - bool operator!=(const xml_attribute_iterator& rhs) const; - - xml_attribute& operator*() const; - xml_attribute* operator->() const; - - xml_attribute_iterator& operator++(); - xml_attribute_iterator operator++(int); - - xml_attribute_iterator& operator--(); - xml_attribute_iterator operator--(int); - }; - - // Named node range helper - class PUGIXML_CLASS xml_named_node_iterator - { - friend class xml_node; - - public: - // Iterator traits - typedef ptrdiff_t difference_type; - typedef xml_node value_type; - typedef xml_node* pointer; - typedef xml_node& reference; - - #ifndef PUGIXML_NO_STL - typedef std::bidirectional_iterator_tag iterator_category; - #endif - - // Default constructor - xml_named_node_iterator(); - - // Construct an iterator which points to the specified node - xml_named_node_iterator(const xml_node& node, const char_t* name); - - // Iterator operators - bool operator==(const xml_named_node_iterator& rhs) const; - bool operator!=(const xml_named_node_iterator& rhs) const; - - xml_node& operator*() const; - xml_node* operator->() const; - - xml_named_node_iterator& operator++(); - xml_named_node_iterator operator++(int); - - xml_named_node_iterator& operator--(); - xml_named_node_iterator operator--(int); - - private: - mutable xml_node _wrap; - xml_node _parent; - const char_t* _name; - - xml_named_node_iterator(xml_node_struct* ref, xml_node_struct* parent, const char_t* name); - }; - - // Abstract tree walker class (see xml_node::traverse) - class PUGIXML_CLASS xml_tree_walker - { - friend class xml_node; - - private: - int _depth; - - protected: - // Get current traversal depth - int depth() const; - - public: - xml_tree_walker(); - virtual ~xml_tree_walker(); - - // Callback that is called when traversal begins - virtual bool begin(xml_node& node); - - // Callback that is called for each node traversed - virtual bool for_each(xml_node& node) = 0; - - // Callback that is called when traversal ends - virtual bool end(xml_node& node); - }; - - // Parsing status, returned as part of xml_parse_result object - enum xml_parse_status - { - status_ok = 0, // No error - - status_file_not_found, // File was not found during load_file() - status_io_error, // Error reading from file/stream - status_out_of_memory, // Could not allocate memory - status_internal_error, // Internal error occurred - - status_unrecognized_tag, // Parser could not determine tag type - - status_bad_pi, // Parsing error occurred while parsing document declaration/processing instruction - status_bad_comment, // Parsing error occurred while parsing comment - status_bad_cdata, // Parsing error occurred while parsing CDATA section - status_bad_doctype, // Parsing error occurred while parsing document type declaration - status_bad_pcdata, // Parsing error occurred while parsing PCDATA section - status_bad_start_element, // Parsing error occurred while parsing start element tag - status_bad_attribute, // Parsing error occurred while parsing element attribute - status_bad_end_element, // Parsing error occurred while parsing end element tag - status_end_element_mismatch,// There was a mismatch of start-end tags (closing tag had incorrect name, some tag was not closed or there was an excessive closing tag) - - status_append_invalid_root, // Unable to append nodes since root type is not node_element or node_document (exclusive to xml_node::append_buffer) - - status_no_document_element // Parsing resulted in a document without element nodes - }; - - // Parsing result - struct PUGIXML_CLASS xml_parse_result - { - // Parsing status (see xml_parse_status) - xml_parse_status status; - - // Last parsed offset (in char_t units from start of input data) - ptrdiff_t offset; - - // Source document encoding - xml_encoding encoding; - - // Default constructor, initializes object to failed state - xml_parse_result(); - - // Cast to bool operator - operator bool() const; - - // Get error description - const char* description() const; - }; - - // Document class (DOM tree root) - class PUGIXML_CLASS xml_document: public xml_node - { - private: - char_t* _buffer; - - char _memory[192]; - - // Non-copyable semantics - xml_document(const xml_document&); - xml_document& operator=(const xml_document&); - - void _create(); - void _destroy(); - void _move(xml_document& rhs) PUGIXML_NOEXCEPT_IF_NOT_COMPACT; - - public: - // Default constructor, makes empty document - xml_document(); - - // Destructor, invalidates all node/attribute handles to this document - ~xml_document(); - - #ifdef PUGIXML_HAS_MOVE - // Move semantics support - xml_document(xml_document&& rhs) PUGIXML_NOEXCEPT_IF_NOT_COMPACT; - xml_document& operator=(xml_document&& rhs) PUGIXML_NOEXCEPT_IF_NOT_COMPACT; - #endif - - // Removes all nodes, leaving the empty document - void reset(); - - // Removes all nodes, then copies the entire contents of the specified document - void reset(const xml_document& proto); - - #ifndef PUGIXML_NO_STL - // Load document from stream. - xml_parse_result load(std::basic_istream >& stream, unsigned int options = parse_default, xml_encoding encoding = encoding_auto); - xml_parse_result load(std::basic_istream >& stream, unsigned int options = parse_default); - #endif - - // (deprecated: use load_string instead) Load document from zero-terminated string. No encoding conversions are applied. - PUGIXML_DEPRECATED xml_parse_result load(const char_t* contents, unsigned int options = parse_default); - - // Load document from zero-terminated string. No encoding conversions are applied. - xml_parse_result load_string(const char_t* contents, unsigned int options = parse_default); - - // Load document from file - xml_parse_result load_file(const char* path, unsigned int options = parse_default, xml_encoding encoding = encoding_auto); - xml_parse_result load_file(const wchar_t* path, unsigned int options = parse_default, xml_encoding encoding = encoding_auto); - - // Load document from buffer. Copies/converts the buffer, so it may be deleted or changed after the function returns. - xml_parse_result load_buffer(const void* contents, size_t size, unsigned int options = parse_default, xml_encoding encoding = encoding_auto); - - // Load document from buffer, using the buffer for in-place parsing (the buffer is modified and used for storage of document data). - // You should ensure that buffer data will persist throughout the document's lifetime, and free the buffer memory manually once document is destroyed. - xml_parse_result load_buffer_inplace(void* contents, size_t size, unsigned int options = parse_default, xml_encoding encoding = encoding_auto); - - // Load document from buffer, using the buffer for in-place parsing (the buffer is modified and used for storage of document data). - // You should allocate the buffer with pugixml allocation function; document will free the buffer when it is no longer needed (you can't use it anymore). - xml_parse_result load_buffer_inplace_own(void* contents, size_t size, unsigned int options = parse_default, xml_encoding encoding = encoding_auto); - - // Save XML document to writer (semantics is slightly different from xml_node::print, see documentation for details). - void save(xml_writer& writer, const char_t* indent = PUGIXML_TEXT("\t"), unsigned int flags = format_default, xml_encoding encoding = encoding_auto) const; - - #ifndef PUGIXML_NO_STL - // Save XML document to stream (semantics is slightly different from xml_node::print, see documentation for details). - void save(std::basic_ostream >& stream, const char_t* indent = PUGIXML_TEXT("\t"), unsigned int flags = format_default, xml_encoding encoding = encoding_auto) const; - void save(std::basic_ostream >& stream, const char_t* indent = PUGIXML_TEXT("\t"), unsigned int flags = format_default) const; - #endif - - // Save XML to file - bool save_file(const char* path, const char_t* indent = PUGIXML_TEXT("\t"), unsigned int flags = format_default, xml_encoding encoding = encoding_auto) const; - bool save_file(const wchar_t* path, const char_t* indent = PUGIXML_TEXT("\t"), unsigned int flags = format_default, xml_encoding encoding = encoding_auto) const; - - // Get document element - xml_node document_element() const; - }; - -#ifndef PUGIXML_NO_XPATH - // XPath query return type - enum xpath_value_type - { - xpath_type_none, // Unknown type (query failed to compile) - xpath_type_node_set, // Node set (xpath_node_set) - xpath_type_number, // Number - xpath_type_string, // String - xpath_type_boolean // Boolean - }; - - // XPath parsing result - struct PUGIXML_CLASS xpath_parse_result - { - // Error message (0 if no error) - const char* error; - - // Last parsed offset (in char_t units from string start) - ptrdiff_t offset; - - // Default constructor, initializes object to failed state - xpath_parse_result(); - - // Cast to bool operator - operator bool() const; - - // Get error description - const char* description() const; - }; - - // A single XPath variable - class PUGIXML_CLASS xpath_variable - { - friend class xpath_variable_set; - - protected: - xpath_value_type _type; - xpath_variable* _next; - - xpath_variable(xpath_value_type type); - - // Non-copyable semantics - xpath_variable(const xpath_variable&); - xpath_variable& operator=(const xpath_variable&); - - public: - // Get variable name - const char_t* name() const; - - // Get variable type - xpath_value_type type() const; - - // Get variable value; no type conversion is performed, default value (false, NaN, empty string, empty node set) is returned on type mismatch error - bool get_boolean() const; - double get_number() const; - const char_t* get_string() const; - const xpath_node_set& get_node_set() const; - - // Set variable value; no type conversion is performed, false is returned on type mismatch error - bool set(bool value); - bool set(double value); - bool set(const char_t* value); - bool set(const xpath_node_set& value); - }; - - // A set of XPath variables - class PUGIXML_CLASS xpath_variable_set - { - private: - xpath_variable* _data[64]; - - void _assign(const xpath_variable_set& rhs); - void _swap(xpath_variable_set& rhs); - - xpath_variable* _find(const char_t* name) const; - - static bool _clone(xpath_variable* var, xpath_variable** out_result); - static void _destroy(xpath_variable* var); - - public: - // Default constructor/destructor - xpath_variable_set(); - ~xpath_variable_set(); - - // Copy constructor/assignment operator - xpath_variable_set(const xpath_variable_set& rhs); - xpath_variable_set& operator=(const xpath_variable_set& rhs); - - #ifdef PUGIXML_HAS_MOVE - // Move semantics support - xpath_variable_set(xpath_variable_set&& rhs) PUGIXML_NOEXCEPT; - xpath_variable_set& operator=(xpath_variable_set&& rhs) PUGIXML_NOEXCEPT; - #endif - - // Add a new variable or get the existing one, if the types match - xpath_variable* add(const char_t* name, xpath_value_type type); - - // Set value of an existing variable; no type conversion is performed, false is returned if there is no such variable or if types mismatch - bool set(const char_t* name, bool value); - bool set(const char_t* name, double value); - bool set(const char_t* name, const char_t* value); - bool set(const char_t* name, const xpath_node_set& value); - - // Get existing variable by name - xpath_variable* get(const char_t* name); - const xpath_variable* get(const char_t* name) const; - }; - - // A compiled XPath query object - class PUGIXML_CLASS xpath_query - { - private: - void* _impl; - xpath_parse_result _result; - - typedef void (*unspecified_bool_type)(xpath_query***); - - // Non-copyable semantics - xpath_query(const xpath_query&); - xpath_query& operator=(const xpath_query&); - - public: - // Construct a compiled object from XPath expression. - // If PUGIXML_NO_EXCEPTIONS is not defined, throws xpath_exception on compilation errors. - explicit xpath_query(const char_t* query, xpath_variable_set* variables = PUGIXML_NULL); - - // Constructor - xpath_query(); - - // Destructor - ~xpath_query(); - - #ifdef PUGIXML_HAS_MOVE - // Move semantics support - xpath_query(xpath_query&& rhs) PUGIXML_NOEXCEPT; - xpath_query& operator=(xpath_query&& rhs) PUGIXML_NOEXCEPT; - #endif - - // Get query expression return type - xpath_value_type return_type() const; - - // Evaluate expression as boolean value in the specified context; performs type conversion if necessary. - // If PUGIXML_NO_EXCEPTIONS is not defined, throws std::bad_alloc on out of memory errors. - bool evaluate_boolean(const xpath_node& n) const; - - // Evaluate expression as double value in the specified context; performs type conversion if necessary. - // If PUGIXML_NO_EXCEPTIONS is not defined, throws std::bad_alloc on out of memory errors. - double evaluate_number(const xpath_node& n) const; - - #ifndef PUGIXML_NO_STL - // Evaluate expression as string value in the specified context; performs type conversion if necessary. - // If PUGIXML_NO_EXCEPTIONS is not defined, throws std::bad_alloc on out of memory errors. - string_t evaluate_string(const xpath_node& n) const; - #endif - - // Evaluate expression as string value in the specified context; performs type conversion if necessary. - // At most capacity characters are written to the destination buffer, full result size is returned (includes terminating zero). - // If PUGIXML_NO_EXCEPTIONS is not defined, throws std::bad_alloc on out of memory errors. - // If PUGIXML_NO_EXCEPTIONS is defined, returns empty set instead. - size_t evaluate_string(char_t* buffer, size_t capacity, const xpath_node& n) const; - - // Evaluate expression as node set in the specified context. - // If PUGIXML_NO_EXCEPTIONS is not defined, throws xpath_exception on type mismatch and std::bad_alloc on out of memory errors. - // If PUGIXML_NO_EXCEPTIONS is defined, returns empty node set instead. - xpath_node_set evaluate_node_set(const xpath_node& n) const; - - // Evaluate expression as node set in the specified context. - // Return first node in document order, or empty node if node set is empty. - // If PUGIXML_NO_EXCEPTIONS is not defined, throws xpath_exception on type mismatch and std::bad_alloc on out of memory errors. - // If PUGIXML_NO_EXCEPTIONS is defined, returns empty node instead. - xpath_node evaluate_node(const xpath_node& n) const; - - // Get parsing result (used to get compilation errors in PUGIXML_NO_EXCEPTIONS mode) - const xpath_parse_result& result() const; - - // Safe bool conversion operator - operator unspecified_bool_type() const; - - // Borland C++ workaround - bool operator!() const; - }; - - #ifndef PUGIXML_NO_EXCEPTIONS - #if defined(_MSC_VER) - // C4275 can be ignored in Visual C++ if you are deriving - // from a type in the Standard C++ Library - #pragma warning(push) - #pragma warning(disable: 4275) - #endif - // XPath exception class - class PUGIXML_CLASS xpath_exception: public std::exception - { - private: - xpath_parse_result _result; - - public: - // Construct exception from parse result - explicit xpath_exception(const xpath_parse_result& result); - - // Get error message - virtual const char* what() const throw() PUGIXML_OVERRIDE; - - // Get parse result - const xpath_parse_result& result() const; - }; - #if defined(_MSC_VER) - #pragma warning(pop) - #endif - #endif - - // XPath node class (either xml_node or xml_attribute) - class PUGIXML_CLASS xpath_node - { - private: - xml_node _node; - xml_attribute _attribute; - - typedef void (*unspecified_bool_type)(xpath_node***); - - public: - // Default constructor; constructs empty XPath node - xpath_node(); - - // Construct XPath node from XML node/attribute - xpath_node(const xml_node& node); - xpath_node(const xml_attribute& attribute, const xml_node& parent); - - // Get node/attribute, if any - xml_node node() const; - xml_attribute attribute() const; - - // Get parent of contained node/attribute - xml_node parent() const; - - // Safe bool conversion operator - operator unspecified_bool_type() const; - - // Borland C++ workaround - bool operator!() const; - - // Comparison operators - bool operator==(const xpath_node& n) const; - bool operator!=(const xpath_node& n) const; - }; - -#ifdef __BORLANDC__ - // Borland C++ workaround - bool PUGIXML_FUNCTION operator&&(const xpath_node& lhs, bool rhs); - bool PUGIXML_FUNCTION operator||(const xpath_node& lhs, bool rhs); -#endif - - // A fixed-size collection of XPath nodes - class PUGIXML_CLASS xpath_node_set - { - public: - // Collection type - enum type_t - { - type_unsorted, // Not ordered - type_sorted, // Sorted by document order (ascending) - type_sorted_reverse // Sorted by document order (descending) - }; - - // Constant iterator type - typedef const xpath_node* const_iterator; - - // We define non-constant iterator to be the same as constant iterator so that various generic algorithms (i.e. boost foreach) work - typedef const xpath_node* iterator; - - // Default constructor. Constructs empty set. - xpath_node_set(); - - // Constructs a set from iterator range; data is not checked for duplicates and is not sorted according to provided type, so be careful - xpath_node_set(const_iterator begin, const_iterator end, type_t type = type_unsorted); - - // Destructor - ~xpath_node_set(); - - // Copy constructor/assignment operator - xpath_node_set(const xpath_node_set& ns); - xpath_node_set& operator=(const xpath_node_set& ns); - - #ifdef PUGIXML_HAS_MOVE - // Move semantics support - xpath_node_set(xpath_node_set&& rhs) PUGIXML_NOEXCEPT; - xpath_node_set& operator=(xpath_node_set&& rhs) PUGIXML_NOEXCEPT; - #endif - - // Get collection type - type_t type() const; - - // Get collection size - size_t size() const; - - // Indexing operator - const xpath_node& operator[](size_t index) const; - - // Collection iterators - const_iterator begin() const; - const_iterator end() const; - - // Sort the collection in ascending/descending order by document order - void sort(bool reverse = false); - - // Get first node in the collection by document order - xpath_node first() const; - - // Check if collection is empty - bool empty() const; - - private: - type_t _type; - - xpath_node _storage[1]; - - xpath_node* _begin; - xpath_node* _end; - - void _assign(const_iterator begin, const_iterator end, type_t type); - void _move(xpath_node_set& rhs) PUGIXML_NOEXCEPT; - }; -#endif - -#ifndef PUGIXML_NO_STL - // Convert wide string to UTF8 - std::basic_string, std::allocator > PUGIXML_FUNCTION as_utf8(const wchar_t* str); - std::basic_string, std::allocator > PUGIXML_FUNCTION as_utf8(const std::basic_string, std::allocator >& str); - - // Convert UTF8 to wide string - std::basic_string, std::allocator > PUGIXML_FUNCTION as_wide(const char* str); - std::basic_string, std::allocator > PUGIXML_FUNCTION as_wide(const std::basic_string, std::allocator >& str); -#endif - - // Memory allocation function interface; returns pointer to allocated memory or NULL on failure - typedef void* (*allocation_function)(size_t size); - - // Memory deallocation function interface - typedef void (*deallocation_function)(void* ptr); - - // Override default memory management functions. All subsequent allocations/deallocations will be performed via supplied functions. - void PUGIXML_FUNCTION set_memory_management_functions(allocation_function allocate, deallocation_function deallocate); - - // Get current memory management functions - allocation_function PUGIXML_FUNCTION get_memory_allocation_function(); - deallocation_function PUGIXML_FUNCTION get_memory_deallocation_function(); -} - -#if !defined(PUGIXML_NO_STL) && (defined(_MSC_VER) || defined(__ICC)) -namespace std -{ - // Workarounds for (non-standard) iterator category detection for older versions (MSVC7/IC8 and earlier) - std::bidirectional_iterator_tag PUGIXML_FUNCTION _Iter_cat(const pugi::xml_node_iterator&); - std::bidirectional_iterator_tag PUGIXML_FUNCTION _Iter_cat(const pugi::xml_attribute_iterator&); - std::bidirectional_iterator_tag PUGIXML_FUNCTION _Iter_cat(const pugi::xml_named_node_iterator&); -} -#endif - -#if !defined(PUGIXML_NO_STL) && defined(__SUNPRO_CC) -namespace std -{ - // Workarounds for (non-standard) iterator category detection - std::bidirectional_iterator_tag PUGIXML_FUNCTION __iterator_category(const pugi::xml_node_iterator&); - std::bidirectional_iterator_tag PUGIXML_FUNCTION __iterator_category(const pugi::xml_attribute_iterator&); - std::bidirectional_iterator_tag PUGIXML_FUNCTION __iterator_category(const pugi::xml_named_node_iterator&); -} -#endif - -#endif - -// Make sure implementation is included in header-only mode -// Use macro expansion in #include to work around QMake (QTBUG-11923) -#if defined(PUGIXML_HEADER_ONLY) && !defined(PUGIXML_SOURCE) -# define PUGIXML_SOURCE "pugixml.cpp" -# include PUGIXML_SOURCE -#endif - -/** - * Copyright (c) 2006-2022 Arseny Kapoulkine - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, - * copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following - * conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES - * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT - * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, - * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - * OTHER DEALINGS IN THE SOFTWARE. - */ +/** + * pugixml parser - version 1.14 + * -------------------------------------------------------- + * Copyright (C) 2006-2023, by Arseny Kapoulkine (arseny.kapoulkine@gmail.com) + * Report bugs and download new versions at https://pugixml.org/ + * + * This library is distributed under the MIT License. See notice at the end + * of this file. + * + * This work is based on the pugxml parser, which is: + * Copyright (C) 2003, by Kristen Wegner (kristen@tima.net) + */ + +// Define version macro; evaluates to major * 1000 + minor * 10 + patch so that it's safe to use in less-than comparisons +// Note: pugixml used major * 100 + minor * 10 + patch format up until 1.9 (which had version identifier 190); starting from pugixml 1.10, the minor version number is two digits +#ifndef PUGIXML_VERSION +# define PUGIXML_VERSION 1140 // 1.14 +#endif + +// Include user configuration file (this can define various configuration macros) +#include "pugiconfig.hpp" + +#ifndef HEADER_PUGIXML_HPP +#define HEADER_PUGIXML_HPP + +// Include stddef.h for size_t and ptrdiff_t +#include + +// Include exception header for XPath +#if !defined(PUGIXML_NO_XPATH) && !defined(PUGIXML_NO_EXCEPTIONS) +# include +#endif + +// Include STL headers +#ifndef PUGIXML_NO_STL +# include +# include +# include +#endif + +// Macro for deprecated features +#ifndef PUGIXML_DEPRECATED +# if defined(__GNUC__) +# define PUGIXML_DEPRECATED __attribute__((deprecated)) +# elif defined(_MSC_VER) && _MSC_VER >= 1300 +# define PUGIXML_DEPRECATED __declspec(deprecated) +# else +# define PUGIXML_DEPRECATED +# endif +#endif + +// If no API is defined, assume default +#ifndef PUGIXML_API +# define PUGIXML_API +#endif + +// If no API for classes is defined, assume default +#ifndef PUGIXML_CLASS +# define PUGIXML_CLASS PUGIXML_API +#endif + +// If no API for functions is defined, assume default +#ifndef PUGIXML_FUNCTION +# define PUGIXML_FUNCTION PUGIXML_API +#endif + +// If the platform is known to have long long support, enable long long functions +#ifndef PUGIXML_HAS_LONG_LONG +# if __cplusplus >= 201103 +# define PUGIXML_HAS_LONG_LONG +# elif defined(_MSC_VER) && _MSC_VER >= 1400 +# define PUGIXML_HAS_LONG_LONG +# endif +#endif + +// If the platform is known to have move semantics support, compile move ctor/operator implementation +#ifndef PUGIXML_HAS_MOVE +# if __cplusplus >= 201103 +# define PUGIXML_HAS_MOVE +# elif defined(_MSC_VER) && _MSC_VER >= 1600 +# define PUGIXML_HAS_MOVE +# endif +#endif + +// If C++ is 2011 or higher, add 'noexcept' specifiers +#ifndef PUGIXML_NOEXCEPT +# if __cplusplus >= 201103 +# define PUGIXML_NOEXCEPT noexcept +# elif defined(_MSC_VER) && _MSC_VER >= 1900 +# define PUGIXML_NOEXCEPT noexcept +# else +# define PUGIXML_NOEXCEPT +# endif +#endif + +// Some functions can not be noexcept in compact mode +#ifdef PUGIXML_COMPACT +# define PUGIXML_NOEXCEPT_IF_NOT_COMPACT +#else +# define PUGIXML_NOEXCEPT_IF_NOT_COMPACT PUGIXML_NOEXCEPT +#endif + +// If C++ is 2011 or higher, add 'override' qualifiers +#ifndef PUGIXML_OVERRIDE +# if __cplusplus >= 201103 +# define PUGIXML_OVERRIDE override +# elif defined(_MSC_VER) && _MSC_VER >= 1700 +# define PUGIXML_OVERRIDE override +# else +# define PUGIXML_OVERRIDE +# endif +#endif + +// If C++ is 2011 or higher, use 'nullptr' +#ifndef PUGIXML_NULL +# if __cplusplus >= 201103 +# define PUGIXML_NULL nullptr +# elif defined(_MSC_VER) && _MSC_VER >= 1600 +# define PUGIXML_NULL nullptr +# else +# define PUGIXML_NULL 0 +# endif +#endif + +// Character interface macros +#ifdef PUGIXML_WCHAR_MODE +# define PUGIXML_TEXT(t) L ## t +# define PUGIXML_CHAR wchar_t +#else +# define PUGIXML_TEXT(t) t +# define PUGIXML_CHAR char +#endif + +namespace pugi +{ + // Character type used for all internal storage and operations; depends on PUGIXML_WCHAR_MODE + typedef PUGIXML_CHAR char_t; + +#ifndef PUGIXML_NO_STL + // String type used for operations that work with STL string; depends on PUGIXML_WCHAR_MODE + typedef std::basic_string, std::allocator > string_t; +#endif +} + +// The PugiXML namespace +namespace pugi +{ + // Tree node types + enum xml_node_type + { + node_null, // Empty (null) node handle + node_document, // A document tree's absolute root + node_element, // Element tag, i.e. '' + node_pcdata, // Plain character data, i.e. 'text' + node_cdata, // Character data, i.e. '' + node_comment, // Comment tag, i.e. '' + node_pi, // Processing instruction, i.e. '' + node_declaration, // Document declaration, i.e. '' + node_doctype // Document type declaration, i.e. '' + }; + + // Parsing options + + // Minimal parsing mode (equivalent to turning all other flags off). + // Only elements and PCDATA sections are added to the DOM tree, no text conversions are performed. + const unsigned int parse_minimal = 0x0000; + + // This flag determines if processing instructions (node_pi) are added to the DOM tree. This flag is off by default. + const unsigned int parse_pi = 0x0001; + + // This flag determines if comments (node_comment) are added to the DOM tree. This flag is off by default. + const unsigned int parse_comments = 0x0002; + + // This flag determines if CDATA sections (node_cdata) are added to the DOM tree. This flag is on by default. + const unsigned int parse_cdata = 0x0004; + + // This flag determines if plain character data (node_pcdata) that consist only of whitespace are added to the DOM tree. + // This flag is off by default; turning it on usually results in slower parsing and more memory consumption. + const unsigned int parse_ws_pcdata = 0x0008; + + // This flag determines if character and entity references are expanded during parsing. This flag is on by default. + const unsigned int parse_escapes = 0x0010; + + // This flag determines if EOL characters are normalized (converted to #xA) during parsing. This flag is on by default. + const unsigned int parse_eol = 0x0020; + + // This flag determines if attribute values are normalized using CDATA normalization rules during parsing. This flag is on by default. + const unsigned int parse_wconv_attribute = 0x0040; + + // This flag determines if attribute values are normalized using NMTOKENS normalization rules during parsing. This flag is off by default. + const unsigned int parse_wnorm_attribute = 0x0080; + + // This flag determines if document declaration (node_declaration) is added to the DOM tree. This flag is off by default. + const unsigned int parse_declaration = 0x0100; + + // This flag determines if document type declaration (node_doctype) is added to the DOM tree. This flag is off by default. + const unsigned int parse_doctype = 0x0200; + + // This flag determines if plain character data (node_pcdata) that is the only child of the parent node and that consists only + // of whitespace is added to the DOM tree. + // This flag is off by default; turning it on may result in slower parsing and more memory consumption. + const unsigned int parse_ws_pcdata_single = 0x0400; + + // This flag determines if leading and trailing whitespace is to be removed from plain character data. This flag is off by default. + const unsigned int parse_trim_pcdata = 0x0800; + + // This flag determines if plain character data that does not have a parent node is added to the DOM tree, and if an empty document + // is a valid document. This flag is off by default. + const unsigned int parse_fragment = 0x1000; + + // This flag determines if plain character data is be stored in the parent element's value. This significantly changes the structure of + // the document; this flag is only recommended for parsing documents with many PCDATA nodes in memory-constrained environments. + // This flag is off by default. + const unsigned int parse_embed_pcdata = 0x2000; + + // This flag determines whether determines whether the the two pcdata should be merged or not, if no intermediatory data are parsed in the document. + // This flag is off by default. + const unsigned int parse_merge_pcdata = 0x4000; + + // The default parsing mode. + // Elements, PCDATA and CDATA sections are added to the DOM tree, character/reference entities are expanded, + // End-of-Line characters are normalized, attribute values are normalized using CDATA normalization rules. + const unsigned int parse_default = parse_cdata | parse_escapes | parse_wconv_attribute | parse_eol; + + // The full parsing mode. + // Nodes of all types are added to the DOM tree, character/reference entities are expanded, + // End-of-Line characters are normalized, attribute values are normalized using CDATA normalization rules. + const unsigned int parse_full = parse_default | parse_pi | parse_comments | parse_declaration | parse_doctype; + + // These flags determine the encoding of input data for XML document + enum xml_encoding + { + encoding_auto, // Auto-detect input encoding using BOM or < / class xml_object_range + { + public: + typedef It const_iterator; + typedef It iterator; + + xml_object_range(It b, It e): _begin(b), _end(e) + { + } + + It begin() const { return _begin; } + It end() const { return _end; } + + bool empty() const { return _begin == _end; } + + private: + It _begin, _end; + }; + + // Writer interface for node printing (see xml_node::print) + class PUGIXML_CLASS xml_writer + { + public: + virtual ~xml_writer(); + + // Write memory chunk into stream/file/whatever + virtual void write(const void* data, size_t size) = 0; + }; + + // xml_writer implementation for FILE* + class PUGIXML_CLASS xml_writer_file: public xml_writer + { + public: + // Construct writer from a FILE* object; void* is used to avoid header dependencies on stdio + xml_writer_file(void* file); + + virtual void write(const void* data, size_t size) PUGIXML_OVERRIDE; + + private: + void* file; + }; + + #ifndef PUGIXML_NO_STL + // xml_writer implementation for streams + class PUGIXML_CLASS xml_writer_stream: public xml_writer + { + public: + // Construct writer from an output stream object + xml_writer_stream(std::basic_ostream >& stream); + xml_writer_stream(std::basic_ostream >& stream); + + virtual void write(const void* data, size_t size) PUGIXML_OVERRIDE; + + private: + std::basic_ostream >* narrow_stream; + std::basic_ostream >* wide_stream; + }; + #endif + + // A light-weight handle for manipulating attributes in DOM tree + class PUGIXML_CLASS xml_attribute + { + friend class xml_attribute_iterator; + friend class xml_node; + + private: + xml_attribute_struct* _attr; + + typedef void (*unspecified_bool_type)(xml_attribute***); + + public: + // Default constructor. Constructs an empty attribute. + xml_attribute(); + + // Constructs attribute from internal pointer + explicit xml_attribute(xml_attribute_struct* attr); + + // Safe bool conversion operator + operator unspecified_bool_type() const; + + // Borland C++ workaround + bool operator!() const; + + // Comparison operators (compares wrapped attribute pointers) + bool operator==(const xml_attribute& r) const; + bool operator!=(const xml_attribute& r) const; + bool operator<(const xml_attribute& r) const; + bool operator>(const xml_attribute& r) const; + bool operator<=(const xml_attribute& r) const; + bool operator>=(const xml_attribute& r) const; + + // Check if attribute is empty + bool empty() const; + + // Get attribute name/value, or "" if attribute is empty + const char_t* name() const; + const char_t* value() const; + + // Get attribute value, or the default value if attribute is empty + const char_t* as_string(const char_t* def = PUGIXML_TEXT("")) const; + + // Get attribute value as a number, or the default value if conversion did not succeed or attribute is empty + int as_int(int def = 0) const; + unsigned int as_uint(unsigned int def = 0) const; + double as_double(double def = 0) const; + float as_float(float def = 0) const; + + #ifdef PUGIXML_HAS_LONG_LONG + long long as_llong(long long def = 0) const; + unsigned long long as_ullong(unsigned long long def = 0) const; + #endif + + // Get attribute value as bool (returns true if first character is in '1tTyY' set), or the default value if attribute is empty + bool as_bool(bool def = false) const; + + // Set attribute name/value (returns false if attribute is empty or there is not enough memory) + bool set_name(const char_t* rhs); + bool set_name(const char_t* rhs, size_t size); + bool set_value(const char_t* rhs); + bool set_value(const char_t* rhs, size_t size); + + // Set attribute value with type conversion (numbers are converted to strings, boolean is converted to "true"/"false") + bool set_value(int rhs); + bool set_value(unsigned int rhs); + bool set_value(long rhs); + bool set_value(unsigned long rhs); + bool set_value(double rhs); + bool set_value(double rhs, int precision); + bool set_value(float rhs); + bool set_value(float rhs, int precision); + bool set_value(bool rhs); + + #ifdef PUGIXML_HAS_LONG_LONG + bool set_value(long long rhs); + bool set_value(unsigned long long rhs); + #endif + + // Set attribute value (equivalent to set_value without error checking) + xml_attribute& operator=(const char_t* rhs); + xml_attribute& operator=(int rhs); + xml_attribute& operator=(unsigned int rhs); + xml_attribute& operator=(long rhs); + xml_attribute& operator=(unsigned long rhs); + xml_attribute& operator=(double rhs); + xml_attribute& operator=(float rhs); + xml_attribute& operator=(bool rhs); + + #ifdef PUGIXML_HAS_LONG_LONG + xml_attribute& operator=(long long rhs); + xml_attribute& operator=(unsigned long long rhs); + #endif + + // Get next/previous attribute in the attribute list of the parent node + xml_attribute next_attribute() const; + xml_attribute previous_attribute() const; + + // Get hash value (unique for handles to the same object) + size_t hash_value() const; + + // Get internal pointer + xml_attribute_struct* internal_object() const; + }; + +#ifdef __BORLANDC__ + // Borland C++ workaround + bool PUGIXML_FUNCTION operator&&(const xml_attribute& lhs, bool rhs); + bool PUGIXML_FUNCTION operator||(const xml_attribute& lhs, bool rhs); +#endif + + // A light-weight handle for manipulating nodes in DOM tree + class PUGIXML_CLASS xml_node + { + friend class xml_attribute_iterator; + friend class xml_node_iterator; + friend class xml_named_node_iterator; + + protected: + xml_node_struct* _root; + + typedef void (*unspecified_bool_type)(xml_node***); + + public: + // Default constructor. Constructs an empty node. + xml_node(); + + // Constructs node from internal pointer + explicit xml_node(xml_node_struct* p); + + // Safe bool conversion operator + operator unspecified_bool_type() const; + + // Borland C++ workaround + bool operator!() const; + + // Comparison operators (compares wrapped node pointers) + bool operator==(const xml_node& r) const; + bool operator!=(const xml_node& r) const; + bool operator<(const xml_node& r) const; + bool operator>(const xml_node& r) const; + bool operator<=(const xml_node& r) const; + bool operator>=(const xml_node& r) const; + + // Check if node is empty. + bool empty() const; + + // Get node type + xml_node_type type() const; + + // Get node name, or "" if node is empty or it has no name + const char_t* name() const; + + // Get node value, or "" if node is empty or it has no value + // Note: For text node.value() does not return "text"! Use child_value() or text() methods to access text inside nodes. + const char_t* value() const; + + // Get attribute list + xml_attribute first_attribute() const; + xml_attribute last_attribute() const; + + // Get children list + xml_node first_child() const; + xml_node last_child() const; + + // Get next/previous sibling in the children list of the parent node + xml_node next_sibling() const; + xml_node previous_sibling() const; + + // Get parent node + xml_node parent() const; + + // Get root of DOM tree this node belongs to + xml_node root() const; + + // Get text object for the current node + xml_text text() const; + + // Get child, attribute or next/previous sibling with the specified name + xml_node child(const char_t* name) const; + xml_attribute attribute(const char_t* name) const; + xml_node next_sibling(const char_t* name) const; + xml_node previous_sibling(const char_t* name) const; + + // Get attribute, starting the search from a hint (and updating hint so that searching for a sequence of attributes is fast) + xml_attribute attribute(const char_t* name, xml_attribute& hint) const; + + // Get child value of current node; that is, value of the first child node of type PCDATA/CDATA + const char_t* child_value() const; + + // Get child value of child with specified name. Equivalent to child(name).child_value(). + const char_t* child_value(const char_t* name) const; + + // Set node name/value (returns false if node is empty, there is not enough memory, or node can not have name/value) + bool set_name(const char_t* rhs); + bool set_name(const char_t* rhs, size_t size); + bool set_value(const char_t* rhs); + bool set_value(const char_t* rhs, size_t size); + + // Add attribute with specified name. Returns added attribute, or empty attribute on errors. + xml_attribute append_attribute(const char_t* name); + xml_attribute prepend_attribute(const char_t* name); + xml_attribute insert_attribute_after(const char_t* name, const xml_attribute& attr); + xml_attribute insert_attribute_before(const char_t* name, const xml_attribute& attr); + + // Add a copy of the specified attribute. Returns added attribute, or empty attribute on errors. + xml_attribute append_copy(const xml_attribute& proto); + xml_attribute prepend_copy(const xml_attribute& proto); + xml_attribute insert_copy_after(const xml_attribute& proto, const xml_attribute& attr); + xml_attribute insert_copy_before(const xml_attribute& proto, const xml_attribute& attr); + + // Add child node with specified type. Returns added node, or empty node on errors. + xml_node append_child(xml_node_type type = node_element); + xml_node prepend_child(xml_node_type type = node_element); + xml_node insert_child_after(xml_node_type type, const xml_node& node); + xml_node insert_child_before(xml_node_type type, const xml_node& node); + + // Add child element with specified name. Returns added node, or empty node on errors. + xml_node append_child(const char_t* name); + xml_node prepend_child(const char_t* name); + xml_node insert_child_after(const char_t* name, const xml_node& node); + xml_node insert_child_before(const char_t* name, const xml_node& node); + + // Add a copy of the specified node as a child. Returns added node, or empty node on errors. + xml_node append_copy(const xml_node& proto); + xml_node prepend_copy(const xml_node& proto); + xml_node insert_copy_after(const xml_node& proto, const xml_node& node); + xml_node insert_copy_before(const xml_node& proto, const xml_node& node); + + // Move the specified node to become a child of this node. Returns moved node, or empty node on errors. + xml_node append_move(const xml_node& moved); + xml_node prepend_move(const xml_node& moved); + xml_node insert_move_after(const xml_node& moved, const xml_node& node); + xml_node insert_move_before(const xml_node& moved, const xml_node& node); + + // Remove specified attribute + bool remove_attribute(const xml_attribute& a); + bool remove_attribute(const char_t* name); + + // Remove all attributes + bool remove_attributes(); + + // Remove specified child + bool remove_child(const xml_node& n); + bool remove_child(const char_t* name); + + // Remove all children + bool remove_children(); + + // Parses buffer as an XML document fragment and appends all nodes as children of the current node. + // Copies/converts the buffer, so it may be deleted or changed after the function returns. + // Note: append_buffer allocates memory that has the lifetime of the owning document; removing the appended nodes does not immediately reclaim that memory. + xml_parse_result append_buffer(const void* contents, size_t size, unsigned int options = parse_default, xml_encoding encoding = encoding_auto); + + // Find attribute using predicate. Returns first attribute for which predicate returned true. + template xml_attribute find_attribute(Predicate pred) const + { + if (!_root) return xml_attribute(); + + for (xml_attribute attrib = first_attribute(); attrib; attrib = attrib.next_attribute()) + if (pred(attrib)) + return attrib; + + return xml_attribute(); + } + + // Find child node using predicate. Returns first child for which predicate returned true. + template xml_node find_child(Predicate pred) const + { + if (!_root) return xml_node(); + + for (xml_node node = first_child(); node; node = node.next_sibling()) + if (pred(node)) + return node; + + return xml_node(); + } + + // Find node from subtree using predicate. Returns first node from subtree (depth-first), for which predicate returned true. + template xml_node find_node(Predicate pred) const + { + if (!_root) return xml_node(); + + xml_node cur = first_child(); + + while (cur._root && cur._root != _root) + { + if (pred(cur)) return cur; + + if (cur.first_child()) cur = cur.first_child(); + else if (cur.next_sibling()) cur = cur.next_sibling(); + else + { + while (!cur.next_sibling() && cur._root != _root) cur = cur.parent(); + + if (cur._root != _root) cur = cur.next_sibling(); + } + } + + return xml_node(); + } + + // Find child node by attribute name/value + xml_node find_child_by_attribute(const char_t* name, const char_t* attr_name, const char_t* attr_value) const; + xml_node find_child_by_attribute(const char_t* attr_name, const char_t* attr_value) const; + + #ifndef PUGIXML_NO_STL + // Get the absolute node path from root as a text string. + string_t path(char_t delimiter = '/') const; + #endif + + // Search for a node by path consisting of node names and . or .. elements. + xml_node first_element_by_path(const char_t* path, char_t delimiter = '/') const; + + // Recursively traverse subtree with xml_tree_walker + bool traverse(xml_tree_walker& walker); + + #ifndef PUGIXML_NO_XPATH + // Select single node by evaluating XPath query. Returns first node from the resulting node set. + xpath_node select_node(const char_t* query, xpath_variable_set* variables = PUGIXML_NULL) const; + xpath_node select_node(const xpath_query& query) const; + + // Select node set by evaluating XPath query + xpath_node_set select_nodes(const char_t* query, xpath_variable_set* variables = PUGIXML_NULL) const; + xpath_node_set select_nodes(const xpath_query& query) const; + + // (deprecated: use select_node instead) Select single node by evaluating XPath query. + PUGIXML_DEPRECATED xpath_node select_single_node(const char_t* query, xpath_variable_set* variables = PUGIXML_NULL) const; + PUGIXML_DEPRECATED xpath_node select_single_node(const xpath_query& query) const; + + #endif + + // Print subtree using a writer object + void print(xml_writer& writer, const char_t* indent = PUGIXML_TEXT("\t"), unsigned int flags = format_default, xml_encoding encoding = encoding_auto, unsigned int depth = 0) const; + + #ifndef PUGIXML_NO_STL + // Print subtree to stream + void print(std::basic_ostream >& os, const char_t* indent = PUGIXML_TEXT("\t"), unsigned int flags = format_default, xml_encoding encoding = encoding_auto, unsigned int depth = 0) const; + void print(std::basic_ostream >& os, const char_t* indent = PUGIXML_TEXT("\t"), unsigned int flags = format_default, unsigned int depth = 0) const; + #endif + + // Child nodes iterators + typedef xml_node_iterator iterator; + + iterator begin() const; + iterator end() const; + + // Attribute iterators + typedef xml_attribute_iterator attribute_iterator; + + attribute_iterator attributes_begin() const; + attribute_iterator attributes_end() const; + + // Range-based for support + xml_object_range children() const; + xml_object_range attributes() const; + + // Range-based for support for all children with the specified name + // Note: name pointer must have a longer lifetime than the returned object; be careful with passing temporaries! + xml_object_range children(const char_t* name) const; + + // Get node offset in parsed file/string (in char_t units) for debugging purposes + ptrdiff_t offset_debug() const; + + // Get hash value (unique for handles to the same object) + size_t hash_value() const; + + // Get internal pointer + xml_node_struct* internal_object() const; + }; + +#ifdef __BORLANDC__ + // Borland C++ workaround + bool PUGIXML_FUNCTION operator&&(const xml_node& lhs, bool rhs); + bool PUGIXML_FUNCTION operator||(const xml_node& lhs, bool rhs); +#endif + + // A helper for working with text inside PCDATA nodes + class PUGIXML_CLASS xml_text + { + friend class xml_node; + + xml_node_struct* _root; + + typedef void (*unspecified_bool_type)(xml_text***); + + explicit xml_text(xml_node_struct* root); + + xml_node_struct* _data_new(); + xml_node_struct* _data() const; + + public: + // Default constructor. Constructs an empty object. + xml_text(); + + // Safe bool conversion operator + operator unspecified_bool_type() const; + + // Borland C++ workaround + bool operator!() const; + + // Check if text object is empty + bool empty() const; + + // Get text, or "" if object is empty + const char_t* get() const; + + // Get text, or the default value if object is empty + const char_t* as_string(const char_t* def = PUGIXML_TEXT("")) const; + + // Get text as a number, or the default value if conversion did not succeed or object is empty + int as_int(int def = 0) const; + unsigned int as_uint(unsigned int def = 0) const; + double as_double(double def = 0) const; + float as_float(float def = 0) const; + + #ifdef PUGIXML_HAS_LONG_LONG + long long as_llong(long long def = 0) const; + unsigned long long as_ullong(unsigned long long def = 0) const; + #endif + + // Get text as bool (returns true if first character is in '1tTyY' set), or the default value if object is empty + bool as_bool(bool def = false) const; + + // Set text (returns false if object is empty or there is not enough memory) + bool set(const char_t* rhs); + bool set(const char_t* rhs, size_t size); + + // Set text with type conversion (numbers are converted to strings, boolean is converted to "true"/"false") + bool set(int rhs); + bool set(unsigned int rhs); + bool set(long rhs); + bool set(unsigned long rhs); + bool set(double rhs); + bool set(double rhs, int precision); + bool set(float rhs); + bool set(float rhs, int precision); + bool set(bool rhs); + + #ifdef PUGIXML_HAS_LONG_LONG + bool set(long long rhs); + bool set(unsigned long long rhs); + #endif + + // Set text (equivalent to set without error checking) + xml_text& operator=(const char_t* rhs); + xml_text& operator=(int rhs); + xml_text& operator=(unsigned int rhs); + xml_text& operator=(long rhs); + xml_text& operator=(unsigned long rhs); + xml_text& operator=(double rhs); + xml_text& operator=(float rhs); + xml_text& operator=(bool rhs); + + #ifdef PUGIXML_HAS_LONG_LONG + xml_text& operator=(long long rhs); + xml_text& operator=(unsigned long long rhs); + #endif + + // Get the data node (node_pcdata or node_cdata) for this object + xml_node data() const; + }; + +#ifdef __BORLANDC__ + // Borland C++ workaround + bool PUGIXML_FUNCTION operator&&(const xml_text& lhs, bool rhs); + bool PUGIXML_FUNCTION operator||(const xml_text& lhs, bool rhs); +#endif + + // Child node iterator (a bidirectional iterator over a collection of xml_node) + class PUGIXML_CLASS xml_node_iterator + { + friend class xml_node; + + private: + mutable xml_node _wrap; + xml_node _parent; + + xml_node_iterator(xml_node_struct* ref, xml_node_struct* parent); + + public: + // Iterator traits + typedef ptrdiff_t difference_type; + typedef xml_node value_type; + typedef xml_node* pointer; + typedef xml_node& reference; + + #ifndef PUGIXML_NO_STL + typedef std::bidirectional_iterator_tag iterator_category; + #endif + + // Default constructor + xml_node_iterator(); + + // Construct an iterator which points to the specified node + xml_node_iterator(const xml_node& node); + + // Iterator operators + bool operator==(const xml_node_iterator& rhs) const; + bool operator!=(const xml_node_iterator& rhs) const; + + xml_node& operator*() const; + xml_node* operator->() const; + + xml_node_iterator& operator++(); + xml_node_iterator operator++(int); + + xml_node_iterator& operator--(); + xml_node_iterator operator--(int); + }; + + // Attribute iterator (a bidirectional iterator over a collection of xml_attribute) + class PUGIXML_CLASS xml_attribute_iterator + { + friend class xml_node; + + private: + mutable xml_attribute _wrap; + xml_node _parent; + + xml_attribute_iterator(xml_attribute_struct* ref, xml_node_struct* parent); + + public: + // Iterator traits + typedef ptrdiff_t difference_type; + typedef xml_attribute value_type; + typedef xml_attribute* pointer; + typedef xml_attribute& reference; + + #ifndef PUGIXML_NO_STL + typedef std::bidirectional_iterator_tag iterator_category; + #endif + + // Default constructor + xml_attribute_iterator(); + + // Construct an iterator which points to the specified attribute + xml_attribute_iterator(const xml_attribute& attr, const xml_node& parent); + + // Iterator operators + bool operator==(const xml_attribute_iterator& rhs) const; + bool operator!=(const xml_attribute_iterator& rhs) const; + + xml_attribute& operator*() const; + xml_attribute* operator->() const; + + xml_attribute_iterator& operator++(); + xml_attribute_iterator operator++(int); + + xml_attribute_iterator& operator--(); + xml_attribute_iterator operator--(int); + }; + + // Named node range helper + class PUGIXML_CLASS xml_named_node_iterator + { + friend class xml_node; + + public: + // Iterator traits + typedef ptrdiff_t difference_type; + typedef xml_node value_type; + typedef xml_node* pointer; + typedef xml_node& reference; + + #ifndef PUGIXML_NO_STL + typedef std::bidirectional_iterator_tag iterator_category; + #endif + + // Default constructor + xml_named_node_iterator(); + + // Construct an iterator which points to the specified node + // Note: name pointer is stored in the iterator and must have a longer lifetime than iterator itself + xml_named_node_iterator(const xml_node& node, const char_t* name); + + // Iterator operators + bool operator==(const xml_named_node_iterator& rhs) const; + bool operator!=(const xml_named_node_iterator& rhs) const; + + xml_node& operator*() const; + xml_node* operator->() const; + + xml_named_node_iterator& operator++(); + xml_named_node_iterator operator++(int); + + xml_named_node_iterator& operator--(); + xml_named_node_iterator operator--(int); + + private: + mutable xml_node _wrap; + xml_node _parent; + const char_t* _name; + + xml_named_node_iterator(xml_node_struct* ref, xml_node_struct* parent, const char_t* name); + }; + + // Abstract tree walker class (see xml_node::traverse) + class PUGIXML_CLASS xml_tree_walker + { + friend class xml_node; + + private: + int _depth; + + protected: + // Get current traversal depth + int depth() const; + + public: + xml_tree_walker(); + virtual ~xml_tree_walker(); + + // Callback that is called when traversal begins + virtual bool begin(xml_node& node); + + // Callback that is called for each node traversed + virtual bool for_each(xml_node& node) = 0; + + // Callback that is called when traversal ends + virtual bool end(xml_node& node); + }; + + // Parsing status, returned as part of xml_parse_result object + enum xml_parse_status + { + status_ok = 0, // No error + + status_file_not_found, // File was not found during load_file() + status_io_error, // Error reading from file/stream + status_out_of_memory, // Could not allocate memory + status_internal_error, // Internal error occurred + + status_unrecognized_tag, // Parser could not determine tag type + + status_bad_pi, // Parsing error occurred while parsing document declaration/processing instruction + status_bad_comment, // Parsing error occurred while parsing comment + status_bad_cdata, // Parsing error occurred while parsing CDATA section + status_bad_doctype, // Parsing error occurred while parsing document type declaration + status_bad_pcdata, // Parsing error occurred while parsing PCDATA section + status_bad_start_element, // Parsing error occurred while parsing start element tag + status_bad_attribute, // Parsing error occurred while parsing element attribute + status_bad_end_element, // Parsing error occurred while parsing end element tag + status_end_element_mismatch,// There was a mismatch of start-end tags (closing tag had incorrect name, some tag was not closed or there was an excessive closing tag) + + status_append_invalid_root, // Unable to append nodes since root type is not node_element or node_document (exclusive to xml_node::append_buffer) + + status_no_document_element // Parsing resulted in a document without element nodes + }; + + // Parsing result + struct PUGIXML_CLASS xml_parse_result + { + // Parsing status (see xml_parse_status) + xml_parse_status status; + + // Last parsed offset (in char_t units from start of input data) + ptrdiff_t offset; + + // Source document encoding + xml_encoding encoding; + + // Default constructor, initializes object to failed state + xml_parse_result(); + + // Cast to bool operator + operator bool() const; + + // Get error description + const char* description() const; + }; + + // Document class (DOM tree root) + class PUGIXML_CLASS xml_document: public xml_node + { + private: + char_t* _buffer; + + char _memory[192]; + + // Non-copyable semantics + xml_document(const xml_document&); + xml_document& operator=(const xml_document&); + + void _create(); + void _destroy(); + void _move(xml_document& rhs) PUGIXML_NOEXCEPT_IF_NOT_COMPACT; + + public: + // Default constructor, makes empty document + xml_document(); + + // Destructor, invalidates all node/attribute handles to this document + ~xml_document(); + + #ifdef PUGIXML_HAS_MOVE + // Move semantics support + xml_document(xml_document&& rhs) PUGIXML_NOEXCEPT_IF_NOT_COMPACT; + xml_document& operator=(xml_document&& rhs) PUGIXML_NOEXCEPT_IF_NOT_COMPACT; + #endif + + // Removes all nodes, leaving the empty document + void reset(); + + // Removes all nodes, then copies the entire contents of the specified document + void reset(const xml_document& proto); + + #ifndef PUGIXML_NO_STL + // Load document from stream. + xml_parse_result load(std::basic_istream >& stream, unsigned int options = parse_default, xml_encoding encoding = encoding_auto); + xml_parse_result load(std::basic_istream >& stream, unsigned int options = parse_default); + #endif + + // (deprecated: use load_string instead) Load document from zero-terminated string. No encoding conversions are applied. + PUGIXML_DEPRECATED xml_parse_result load(const char_t* contents, unsigned int options = parse_default); + + // Load document from zero-terminated string. No encoding conversions are applied. + xml_parse_result load_string(const char_t* contents, unsigned int options = parse_default); + + // Load document from file + xml_parse_result load_file(const char* path, unsigned int options = parse_default, xml_encoding encoding = encoding_auto); + xml_parse_result load_file(const wchar_t* path, unsigned int options = parse_default, xml_encoding encoding = encoding_auto); + + // Load document from buffer. Copies/converts the buffer, so it may be deleted or changed after the function returns. + xml_parse_result load_buffer(const void* contents, size_t size, unsigned int options = parse_default, xml_encoding encoding = encoding_auto); + + // Load document from buffer, using the buffer for in-place parsing (the buffer is modified and used for storage of document data). + // You should ensure that buffer data will persist throughout the document's lifetime, and free the buffer memory manually once document is destroyed. + xml_parse_result load_buffer_inplace(void* contents, size_t size, unsigned int options = parse_default, xml_encoding encoding = encoding_auto); + + // Load document from buffer, using the buffer for in-place parsing (the buffer is modified and used for storage of document data). + // You should allocate the buffer with pugixml allocation function; document will free the buffer when it is no longer needed (you can't use it anymore). + xml_parse_result load_buffer_inplace_own(void* contents, size_t size, unsigned int options = parse_default, xml_encoding encoding = encoding_auto); + + // Save XML document to writer (semantics is slightly different from xml_node::print, see documentation for details). + void save(xml_writer& writer, const char_t* indent = PUGIXML_TEXT("\t"), unsigned int flags = format_default, xml_encoding encoding = encoding_auto) const; + + #ifndef PUGIXML_NO_STL + // Save XML document to stream (semantics is slightly different from xml_node::print, see documentation for details). + void save(std::basic_ostream >& stream, const char_t* indent = PUGIXML_TEXT("\t"), unsigned int flags = format_default, xml_encoding encoding = encoding_auto) const; + void save(std::basic_ostream >& stream, const char_t* indent = PUGIXML_TEXT("\t"), unsigned int flags = format_default) const; + #endif + + // Save XML to file + bool save_file(const char* path, const char_t* indent = PUGIXML_TEXT("\t"), unsigned int flags = format_default, xml_encoding encoding = encoding_auto) const; + bool save_file(const wchar_t* path, const char_t* indent = PUGIXML_TEXT("\t"), unsigned int flags = format_default, xml_encoding encoding = encoding_auto) const; + + // Get document element + xml_node document_element() const; + }; + +#ifndef PUGIXML_NO_XPATH + // XPath query return type + enum xpath_value_type + { + xpath_type_none, // Unknown type (query failed to compile) + xpath_type_node_set, // Node set (xpath_node_set) + xpath_type_number, // Number + xpath_type_string, // String + xpath_type_boolean // Boolean + }; + + // XPath parsing result + struct PUGIXML_CLASS xpath_parse_result + { + // Error message (0 if no error) + const char* error; + + // Last parsed offset (in char_t units from string start) + ptrdiff_t offset; + + // Default constructor, initializes object to failed state + xpath_parse_result(); + + // Cast to bool operator + operator bool() const; + + // Get error description + const char* description() const; + }; + + // A single XPath variable + class PUGIXML_CLASS xpath_variable + { + friend class xpath_variable_set; + + protected: + xpath_value_type _type; + xpath_variable* _next; + + xpath_variable(xpath_value_type type); + + // Non-copyable semantics + xpath_variable(const xpath_variable&); + xpath_variable& operator=(const xpath_variable&); + + public: + // Get variable name + const char_t* name() const; + + // Get variable type + xpath_value_type type() const; + + // Get variable value; no type conversion is performed, default value (false, NaN, empty string, empty node set) is returned on type mismatch error + bool get_boolean() const; + double get_number() const; + const char_t* get_string() const; + const xpath_node_set& get_node_set() const; + + // Set variable value; no type conversion is performed, false is returned on type mismatch error + bool set(bool value); + bool set(double value); + bool set(const char_t* value); + bool set(const xpath_node_set& value); + }; + + // A set of XPath variables + class PUGIXML_CLASS xpath_variable_set + { + private: + xpath_variable* _data[64]; + + void _assign(const xpath_variable_set& rhs); + void _swap(xpath_variable_set& rhs); + + xpath_variable* _find(const char_t* name) const; + + static bool _clone(xpath_variable* var, xpath_variable** out_result); + static void _destroy(xpath_variable* var); + + public: + // Default constructor/destructor + xpath_variable_set(); + ~xpath_variable_set(); + + // Copy constructor/assignment operator + xpath_variable_set(const xpath_variable_set& rhs); + xpath_variable_set& operator=(const xpath_variable_set& rhs); + + #ifdef PUGIXML_HAS_MOVE + // Move semantics support + xpath_variable_set(xpath_variable_set&& rhs) PUGIXML_NOEXCEPT; + xpath_variable_set& operator=(xpath_variable_set&& rhs) PUGIXML_NOEXCEPT; + #endif + + // Add a new variable or get the existing one, if the types match + xpath_variable* add(const char_t* name, xpath_value_type type); + + // Set value of an existing variable; no type conversion is performed, false is returned if there is no such variable or if types mismatch + bool set(const char_t* name, bool value); + bool set(const char_t* name, double value); + bool set(const char_t* name, const char_t* value); + bool set(const char_t* name, const xpath_node_set& value); + + // Get existing variable by name + xpath_variable* get(const char_t* name); + const xpath_variable* get(const char_t* name) const; + }; + + // A compiled XPath query object + class PUGIXML_CLASS xpath_query + { + private: + void* _impl; + xpath_parse_result _result; + + typedef void (*unspecified_bool_type)(xpath_query***); + + // Non-copyable semantics + xpath_query(const xpath_query&); + xpath_query& operator=(const xpath_query&); + + public: + // Construct a compiled object from XPath expression. + // If PUGIXML_NO_EXCEPTIONS is not defined, throws xpath_exception on compilation errors. + explicit xpath_query(const char_t* query, xpath_variable_set* variables = PUGIXML_NULL); + + // Constructor + xpath_query(); + + // Destructor + ~xpath_query(); + + #ifdef PUGIXML_HAS_MOVE + // Move semantics support + xpath_query(xpath_query&& rhs) PUGIXML_NOEXCEPT; + xpath_query& operator=(xpath_query&& rhs) PUGIXML_NOEXCEPT; + #endif + + // Get query expression return type + xpath_value_type return_type() const; + + // Evaluate expression as boolean value in the specified context; performs type conversion if necessary. + // If PUGIXML_NO_EXCEPTIONS is not defined, throws std::bad_alloc on out of memory errors. + bool evaluate_boolean(const xpath_node& n) const; + + // Evaluate expression as double value in the specified context; performs type conversion if necessary. + // If PUGIXML_NO_EXCEPTIONS is not defined, throws std::bad_alloc on out of memory errors. + double evaluate_number(const xpath_node& n) const; + + #ifndef PUGIXML_NO_STL + // Evaluate expression as string value in the specified context; performs type conversion if necessary. + // If PUGIXML_NO_EXCEPTIONS is not defined, throws std::bad_alloc on out of memory errors. + string_t evaluate_string(const xpath_node& n) const; + #endif + + // Evaluate expression as string value in the specified context; performs type conversion if necessary. + // At most capacity characters are written to the destination buffer, full result size is returned (includes terminating zero). + // If PUGIXML_NO_EXCEPTIONS is not defined, throws std::bad_alloc on out of memory errors. + // If PUGIXML_NO_EXCEPTIONS is defined, returns empty set instead. + size_t evaluate_string(char_t* buffer, size_t capacity, const xpath_node& n) const; + + // Evaluate expression as node set in the specified context. + // If PUGIXML_NO_EXCEPTIONS is not defined, throws xpath_exception on type mismatch and std::bad_alloc on out of memory errors. + // If PUGIXML_NO_EXCEPTIONS is defined, returns empty node set instead. + xpath_node_set evaluate_node_set(const xpath_node& n) const; + + // Evaluate expression as node set in the specified context. + // Return first node in document order, or empty node if node set is empty. + // If PUGIXML_NO_EXCEPTIONS is not defined, throws xpath_exception on type mismatch and std::bad_alloc on out of memory errors. + // If PUGIXML_NO_EXCEPTIONS is defined, returns empty node instead. + xpath_node evaluate_node(const xpath_node& n) const; + + // Get parsing result (used to get compilation errors in PUGIXML_NO_EXCEPTIONS mode) + const xpath_parse_result& result() const; + + // Safe bool conversion operator + operator unspecified_bool_type() const; + + // Borland C++ workaround + bool operator!() const; + }; + + #ifndef PUGIXML_NO_EXCEPTIONS + #if defined(_MSC_VER) + // C4275 can be ignored in Visual C++ if you are deriving + // from a type in the Standard C++ Library + #pragma warning(push) + #pragma warning(disable: 4275) + #endif + // XPath exception class + class PUGIXML_CLASS xpath_exception: public std::exception + { + private: + xpath_parse_result _result; + + public: + // Construct exception from parse result + explicit xpath_exception(const xpath_parse_result& result); + + // Get error message + virtual const char* what() const throw() PUGIXML_OVERRIDE; + + // Get parse result + const xpath_parse_result& result() const; + }; + #if defined(_MSC_VER) + #pragma warning(pop) + #endif + #endif + + // XPath node class (either xml_node or xml_attribute) + class PUGIXML_CLASS xpath_node + { + private: + xml_node _node; + xml_attribute _attribute; + + typedef void (*unspecified_bool_type)(xpath_node***); + + public: + // Default constructor; constructs empty XPath node + xpath_node(); + + // Construct XPath node from XML node/attribute + xpath_node(const xml_node& node); + xpath_node(const xml_attribute& attribute, const xml_node& parent); + + // Get node/attribute, if any + xml_node node() const; + xml_attribute attribute() const; + + // Get parent of contained node/attribute + xml_node parent() const; + + // Safe bool conversion operator + operator unspecified_bool_type() const; + + // Borland C++ workaround + bool operator!() const; + + // Comparison operators + bool operator==(const xpath_node& n) const; + bool operator!=(const xpath_node& n) const; + }; + +#ifdef __BORLANDC__ + // Borland C++ workaround + bool PUGIXML_FUNCTION operator&&(const xpath_node& lhs, bool rhs); + bool PUGIXML_FUNCTION operator||(const xpath_node& lhs, bool rhs); +#endif + + // A fixed-size collection of XPath nodes + class PUGIXML_CLASS xpath_node_set + { + public: + // Collection type + enum type_t + { + type_unsorted, // Not ordered + type_sorted, // Sorted by document order (ascending) + type_sorted_reverse // Sorted by document order (descending) + }; + + // Constant iterator type + typedef const xpath_node* const_iterator; + + // We define non-constant iterator to be the same as constant iterator so that various generic algorithms (i.e. boost foreach) work + typedef const xpath_node* iterator; + + // Default constructor. Constructs empty set. + xpath_node_set(); + + // Constructs a set from iterator range; data is not checked for duplicates and is not sorted according to provided type, so be careful + xpath_node_set(const_iterator begin, const_iterator end, type_t type = type_unsorted); + + // Destructor + ~xpath_node_set(); + + // Copy constructor/assignment operator + xpath_node_set(const xpath_node_set& ns); + xpath_node_set& operator=(const xpath_node_set& ns); + + #ifdef PUGIXML_HAS_MOVE + // Move semantics support + xpath_node_set(xpath_node_set&& rhs) PUGIXML_NOEXCEPT; + xpath_node_set& operator=(xpath_node_set&& rhs) PUGIXML_NOEXCEPT; + #endif + + // Get collection type + type_t type() const; + + // Get collection size + size_t size() const; + + // Indexing operator + const xpath_node& operator[](size_t index) const; + + // Collection iterators + const_iterator begin() const; + const_iterator end() const; + + // Sort the collection in ascending/descending order by document order + void sort(bool reverse = false); + + // Get first node in the collection by document order + xpath_node first() const; + + // Check if collection is empty + bool empty() const; + + private: + type_t _type; + + xpath_node _storage[1]; + + xpath_node* _begin; + xpath_node* _end; + + void _assign(const_iterator begin, const_iterator end, type_t type); + void _move(xpath_node_set& rhs) PUGIXML_NOEXCEPT; + }; +#endif + +#ifndef PUGIXML_NO_STL + // Convert wide string to UTF8 + std::basic_string, std::allocator > PUGIXML_FUNCTION as_utf8(const wchar_t* str); + std::basic_string, std::allocator > PUGIXML_FUNCTION as_utf8(const std::basic_string, std::allocator >& str); + + // Convert UTF8 to wide string + std::basic_string, std::allocator > PUGIXML_FUNCTION as_wide(const char* str); + std::basic_string, std::allocator > PUGIXML_FUNCTION as_wide(const std::basic_string, std::allocator >& str); +#endif + + // Memory allocation function interface; returns pointer to allocated memory or NULL on failure + typedef void* (*allocation_function)(size_t size); + + // Memory deallocation function interface + typedef void (*deallocation_function)(void* ptr); + + // Override default memory management functions. All subsequent allocations/deallocations will be performed via supplied functions. + void PUGIXML_FUNCTION set_memory_management_functions(allocation_function allocate, deallocation_function deallocate); + + // Get current memory management functions + allocation_function PUGIXML_FUNCTION get_memory_allocation_function(); + deallocation_function PUGIXML_FUNCTION get_memory_deallocation_function(); +} + +#if !defined(PUGIXML_NO_STL) && (defined(_MSC_VER) || defined(__ICC)) +namespace std +{ + // Workarounds for (non-standard) iterator category detection for older versions (MSVC7/IC8 and earlier) + std::bidirectional_iterator_tag PUGIXML_FUNCTION _Iter_cat(const pugi::xml_node_iterator&); + std::bidirectional_iterator_tag PUGIXML_FUNCTION _Iter_cat(const pugi::xml_attribute_iterator&); + std::bidirectional_iterator_tag PUGIXML_FUNCTION _Iter_cat(const pugi::xml_named_node_iterator&); +} +#endif + +#if !defined(PUGIXML_NO_STL) && defined(__SUNPRO_CC) +namespace std +{ + // Workarounds for (non-standard) iterator category detection + std::bidirectional_iterator_tag PUGIXML_FUNCTION __iterator_category(const pugi::xml_node_iterator&); + std::bidirectional_iterator_tag PUGIXML_FUNCTION __iterator_category(const pugi::xml_attribute_iterator&); + std::bidirectional_iterator_tag PUGIXML_FUNCTION __iterator_category(const pugi::xml_named_node_iterator&); +} +#endif + +#endif + +// Make sure implementation is included in header-only mode +// Use macro expansion in #include to work around QMake (QTBUG-11923) +#if defined(PUGIXML_HEADER_ONLY) && !defined(PUGIXML_SOURCE) +# define PUGIXML_SOURCE "pugixml.cpp" +# include PUGIXML_SOURCE +#endif + +/** + * Copyright (c) 2006-2023 Arseny Kapoulkine + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, + * copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following + * conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + * OTHER DEALINGS IN THE SOFTWARE. + */ diff --git a/include/vrv/accid.h b/include/vrv/accid.h index e0a21b93f0e..0cee9899784 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: @@ -119,9 +120,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/adjustaccidxfunctor.h b/include/vrv/adjustaccidxfunctor.h index f3b07b3e35c..ab304d0629d 100644 --- a/include/vrv/adjustaccidxfunctor.h +++ b/include/vrv/adjustaccidxfunctor.h @@ -46,12 +46,30 @@ class AdjustAccidXFunctor : public DocFunctor { protected: // private: - // + /* + * Get the accidentals for adjustment + */ + std::vector GetAccidentalsForAdjustment(AlignmentReference *alignmentReference) const; + + /** + * Sets whether the accidental should be aligned with all elements of the alignmentReference + * or elements from the same layer only. + */ + void SetAccidLayerAlignment(Accid *accid, const AlignmentReference *alignmentReference) const; + + /** + * Adjust an accidental horizontally + */ + void AdjustAccidWithSpace(Accid *accid, AlignmentReference *alignmentReference, int staffSize); + public: // private: // The current measure Measure *m_currentMeasure; + + // The accidentals that were already adjusted + std::set m_adjustedAccids; }; } // namespace vrv diff --git a/include/vrv/adjustslursfunctor.h b/include/vrv/adjustslursfunctor.h index af32d918c71..cc4665938fc 100644 --- a/include/vrv/adjustslursfunctor.h +++ b/include/vrv/adjustslursfunctor.h @@ -9,9 +9,36 @@ #define __VRV_ADJUSTSLURSFUNCTOR_H__ #include "functor.h" +#include "slur.h" namespace vrv { +//---------------------------------------------------------------------------- +// ControlPointConstraint +//---------------------------------------------------------------------------- +/** + * This represents a constraint ax + by >= c where x and y are + * vertical control point adjustments + */ +struct ControlPointConstraint { + double a; + double b; + double c; +}; + +//---------------------------------------------------------------------------- +// ControlPointAdjustment +//---------------------------------------------------------------------------- +/** + * A vertical adjustment of bezier control points + */ +struct ControlPointAdjustment { + int leftShift; + int rightShift; + bool moveUpwards; + int requestedStaffSpace; +}; + //---------------------------------------------------------------------------- // AdjustSlursFunctor //---------------------------------------------------------------------------- @@ -39,6 +66,11 @@ class AdjustSlursFunctor : public DocFunctor { */ bool HasCrossStaffSlurs() const { return m_crossStaffSlurs; } + /* + * Reset the current slur and curve + */ + void ResetCurrent(); + /* * Functor interface */ @@ -50,12 +82,97 @@ class AdjustSlursFunctor : public DocFunctor { protected: // private: - // + /** + * High level helper functions + */ + ///@{ + void AdjustSlur(int unit) const; + + void AdjustOuterSlur(const ArrayOfFloatingCurvePositioners &innerCurves, int unit) const; + ///@} + + /** + * Intermediate level helper functions + */ + ///@{ + // Discard certain spanned elements + void FilterSpannedElements(const BezierCurve &bezierCurve, int margin) const; + + // Detect collisions near the endpoints + NearEndCollision DetectCollisionsNearEnd(const BezierCurve &bezierCurve, int margin) const; + + // Calculate the vertical shift of the slur end points + std::pair CalcEndPointShift(const BezierCurve &bezierCurve, double flexibility, int margin) const; + + // Apply the vertical shift of the slur end points + void ApplyEndPointShift(BezierCurve &bezierCurve, int endPointShiftLeft, int endPointShiftRight) const; + + // Calculate slur from bulge values + void AdjustSlurFromBulge(BezierCurve &bezierCurve, int unit) const; + + // Check whether control points should be adjusted horizontally + bool AllowControlOffsetAdjustment(const BezierCurve &bezierCurve, double symmetry, int unit) const; + + // Calculate the horizontal control point offset + std::tuple CalcControlPointOffset(const BezierCurve &bezierCurve, int margin) const; + + // Calculate the vertical control point shift + ControlPointAdjustment CalcControlPointVerticalShift( + const BezierCurve &bezierCurve, double symmetry, int margin) const; + + // Solve the constraints for vertical control point adjustment + std::pair SolveControlPointConstraints( + const std::list &constraints, double symmetry = 0.0) const; + + // Improve the slur shape by adjusting the control point heights + void AdjustSlurShape(BezierCurve &bezierCurve, curvature_CURVEDIR dir, int unit) const; + ///@} + + /** + * Intermediate level helper functions for adjustment w.r.t. inner slurs + */ + ///@{ + // Calculate the vertical control point shift + ControlPointAdjustment CalcControlPointShift(const BezierCurve &bezierCurve, + const ArrayOfFloatingCurvePositioners &innerCurves, double symmetry, int margin) const; + + // Calculate the vertical shift of the slur end points + std::pair CalcEndPointShift(const BezierCurve &bezierCurve, + const ArrayOfFloatingCurvePositioners &innerCurves, double flexibility, int margin) const; + ///@} + + /** + * Low level helper functions + */ + ///@{ + // Shift end points for collisions nearby + void ShiftEndPoints(int &shiftLeft, int &shiftRight, double ratio, int intersection, double flexibility, + bool isBelow, char spanningType) const; + + // Calculate the full and partial shift radii + std::pair CalcShiftRadii(bool forShiftLeft, double flexibility, char spanningType) const; + + // Determine a quadratic interpolation function between zero and one and evaluate it + double CalcQuadraticInterpolation(double zeroAt, double oneAt, double arg) const; + + // Rotate the slope by a given number of degrees, but choose smaller angles if already close to the vertical axis + // Choose doublingBound as the positive slope value where doubling has the same effect as rotating: + // tan(atan(doublingBound) + degrees * PI / 180.0) ≈ 2.0 * doublingBound + double RotateSlope(double slope, double degrees, double doublingBound, bool upwards) const; + + // Calculate the minimal angle <)C1P1P2 or <)P1P2C2 + float GetMinControlPointAngle(const BezierCurve &bezierCurve, float angle, int unit) const; + ///@} + public: // private: // Indicates that there is at least one cross-staff slur bool m_crossStaffSlurs; + // The current slur + Slur *m_currentSlur; + // The curve positioner + FloatingCurvePositioner *m_currentCurve; }; } // namespace vrv diff --git a/include/vrv/adjusttupletsyfunctor.h b/include/vrv/adjusttupletsyfunctor.h index 8adfe628ac4..277df4eaeb1 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/include/vrv/adjustxoverflowfunctor.h b/include/vrv/adjustxoverflowfunctor.h index 861ce5b4a7d..31f3a12a9af 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 32e2c632471..029bbbddd5e 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/adjustyposfunctor.h b/include/vrv/adjustyposfunctor.h index b2773c9d66c..e817bf5a3f1 100644 --- a/include/vrv/adjustyposfunctor.h +++ b/include/vrv/adjustyposfunctor.h @@ -38,6 +38,7 @@ class AdjustYPosFunctor : public DocFunctor { * Functor interface */ ///@{ + FunctorCode VisitDiv(Div *div) override; FunctorCode VisitStaffAlignment(StaffAlignment *staffAlignment) override; FunctorCode VisitSystem(System *system) override; ///@} diff --git a/include/vrv/alignfunctor.h b/include/vrv/alignfunctor.h index 536a66361cc..78d4f841e4f 100644 --- a/include/vrv/alignfunctor.h +++ b/include/vrv/alignfunctor.h @@ -108,6 +108,7 @@ class AlignMeasuresFunctor : public DocFunctor { * Functor interface */ ///@{ + FunctorCode VisitDiv(Div *div) override; FunctorCode VisitMeasure(Measure *measure) override; FunctorCode VisitScoreDef(ScoreDef *scoreDef) override; FunctorCode VisitSection(Section *section) override; @@ -159,6 +160,7 @@ class AlignVerticallyFunctor : public DocFunctor { * Functor interface */ ///@{ + FunctorCode VisitDiv(Div *div) override; FunctorCode VisitFig(Fig *fig) override; FunctorCode VisitMeasure(Measure *measure) override; FunctorCode VisitPageEnd(Page *page) override; @@ -188,7 +190,7 @@ class AlignVerticallyFunctor : public DocFunctor { int m_cumulatedShift; // The sum of justification factors per page int m_justificationSum; - // The page width + // The page width - used for setting the horizontal position of withing text layout elements int m_pageWidth; }; diff --git a/include/vrv/anchoredtext.h b/include/vrv/anchoredtext.h index 8605486c8b3..60595e38f7f 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 343a2c44900..48673780377 100644 --- a/include/vrv/arpeg.h +++ b/include/vrv/arpeg.h @@ -107,17 +107,12 @@ 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; ///@} - /** - * See Object::InitMIDI - */ - int InitMIDI(FunctorParams *functorParams) override; - protected: // private: diff --git a/include/vrv/artic.h b/include/vrv/artic.h index 622093b9c09..8a11d2707c6 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: /** @@ -47,12 +48,6 @@ class Artic : public LayerElement, data_ARTICULATION GetArticFirst() const; - /** - * Split the multi-valued artic attributes into distinct artic elements. - * Applied by ConvertMarkupArtic functor. - */ - void SplitMultival(Object *parent); - void GetAllArtics(bool direction, std::vector &artics); /** @@ -112,17 +107,12 @@ 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; ///@} - /** - * See Object::ConvertMarkupArtic - */ - int ConvertMarkupArtic(FunctorParams *functorParams) override; - private: bool IsInsideArtic(data_ARTICULATION artic) const; diff --git a/include/vrv/barline.h b/include/vrv/barline.h index f8e795a4bc4..164c2214130 100644 --- a/include/vrv/barline.h +++ b/include/vrv/barline.h @@ -89,17 +89,12 @@ 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; ///@} - /** - * See Object::ConvertToCastOffMensural - */ - int ConvertToCastOffMensural(FunctorParams *functorParams) override; - private: // public: diff --git a/include/vrv/bboxdevicecontext.h b/include/vrv/bboxdevicecontext.h index cb92131cff3..e22c3408618 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/beam.h b/include/vrv/beam.h index 9f84d1a8eb1..54683186f3d 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 d342653ab6f..b66631bb923 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; } ///@} @@ -108,9 +109,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 b2b27b0fe4b..d4d8a4d9b5d 100644 --- a/include/vrv/beatrpt.h +++ b/include/vrv/beatrpt.h @@ -60,19 +60,12 @@ 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; ///@} - /** - * @name See Object::GenerateMIDI - */ - ///@{ - int GenerateMIDI(FunctorParams *functorParams) override; - ///@} - private: // public: diff --git a/include/vrv/boundingbox.h b/include/vrv/boundingbox.h index 1790c1933ef..20a437657c5 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; ///@} /** @@ -179,7 +182,8 @@ class BoundingBox { * A segment of the beam that matches horizontal position of the bounding box is taken to find whether there is * intersection. */ - int Intersects(const BeamDrawingInterface *beamInterface, Accessor type, int margin = 0) const; + int Intersects(const BeamDrawingInterface *beamInterface, Accessor type, int margin = 0, + bool fromBeamContentSide = false) const; //----------------// // Static methods // @@ -267,13 +271,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/include/vrv/bracketspan.h b/include/vrv/bracketspan.h index 22b3eb4e938..22e8c1aa698 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 7626f7779c3..502b510e25f 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 03fdde6a907..9d64e26e046 100644 --- a/include/vrv/btrem.h +++ b/include/vrv/btrem.h @@ -21,9 +21,9 @@ namespace vrv { * This class models the MEI element. */ class BTrem : public LayerElement, - public AttBTremLog, public AttNumbered, public AttNumberPlacement, + public AttTremForm, public AttTremMeasured { public: /** @@ -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 // //----------// @@ -57,26 +62,18 @@ 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; ///@} - /** - * See Object::GenerateMIDI - */ - 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/caesura.h b/include/vrv/caesura.h index 47cfd783a0a..5125f911ded 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: /** @@ -66,9 +67,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 700245b7646..fa968871809 100644 --- a/include/vrv/castofffunctor.h +++ b/include/vrv/castofffunctor.h @@ -49,6 +49,7 @@ class CastOffSystemsFunctor : public DocFunctor { * Functor interface */ ///@{ + FunctorCode VisitDiv(Div *div) override; FunctorCode VisitEditorialElement(EditorialElement *editorialElement) override; FunctorCode VisitEnding(Ending *ending) override; FunctorCode VisitMeasure(Measure *measure) override; @@ -183,6 +184,7 @@ class CastOffEncodingFunctor : public DocFunctor { * Functor interface */ ///@{ + FunctorCode VisitDiv(Div *div) override; FunctorCode VisitEditorialElement(EditorialElement *editorialElement) override; FunctorCode VisitEnding(Ending *ending) override; FunctorCode VisitMeasure(Measure *measure) override; @@ -221,7 +223,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 @@ -296,6 +298,7 @@ class CastOffToSelectionFunctor : public DocFunctor { * Functor interface */ ///@{ + FunctorCode VisitDiv(Div *div) override; FunctorCode VisitEditorialElement(EditorialElement *editorialElement) override; FunctorCode VisitMeasure(Measure *measure) override; FunctorCode VisitPageElement(PageElement *pageElement) override; diff --git a/include/vrv/chord.h b/include/vrv/chord.h index 36b4e1662dd..2e6f4e84eee 100644 --- a/include/vrv/chord.h +++ b/include/vrv/chord.h @@ -34,6 +34,7 @@ class Chord : public LayerElement, public DrawingListInterface, public StemmedDrawingInterface, public DurationInterface, + public AttChordVis, public AttColor, public AttCue, public AttGraced, @@ -173,9 +174,9 @@ class Chord : public LayerElement, std::list GetAdjacentNotesList(const Staff *staff, int loc) const; /** - * Recalculate the m_clusters vector + * Recalculate the m_noteGroups vector */ - void CalculateClusters(); + void CalculateNoteGroups(); //----------// // Functors // @@ -185,30 +186,12 @@ 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; ///@} - /** - * See Object::ConvertMarkupAnalytical - */ - ///@{ - int ConvertMarkupAnalytical(FunctorParams *functorParams) override; - int ConvertMarkupAnalyticalEnd(FunctorParams *functorParams) override; - ///@} - - /** - * See Object::InitOnsetOffsetEnd - */ - int InitOnsetOffsetEnd(FunctorParams *functorParams) override; - - /** - * See Object::GenerateMIDI - */ - int GenerateMIDI(FunctorParams *functorParams) override; - protected: /** * The note locations w.r.t. each staff @@ -223,9 +206,9 @@ class Chord : public LayerElement, MapOfDotLocs CalcDotLocations(int layerCount, bool primary) const override; /** - * Clear the m_clusters vector and delete all the objects. + * Clear the m_noteGroups vector and delete all the objects. */ - void ClearClusters() const; + void ClearNoteGroups() const; /** * Filter the flat list and keep only Note elements. @@ -236,9 +219,9 @@ class Chord : public LayerElement, // private: /** - * The list of chord clusters + * The list of chord note groups */ - mutable std::list m_clusters; + mutable std::list m_noteGroups; }; } // namespace vrv diff --git a/include/vrv/clef.h b/include/vrv/clef.h index 43343b40132..9dcd9e635b7 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, @@ -76,9 +77,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/comparison.h b/include/vrv/comparison.h index b0a54e08dfe..d338ee2a7ce 100644 --- a/include/vrv/comparison.h +++ b/include/vrv/comparison.h @@ -380,6 +380,32 @@ class AttVisibilityComparison : public ClassIdComparison { data_BOOLEAN m_isVisible; }; +//---------------------------------------------------------------------------- +// AttFormeworkComparison +//---------------------------------------------------------------------------- + +/** + * This class evaluates if the object is of a certain ClassId and has a @func of value func. + */ +class AttFormeworkComparison : public ClassIdComparison { + +public: + AttFormeworkComparison(ClassId classId, data_PGFUNC func) : ClassIdComparison(classId) { m_func = func; } + + bool operator()(const Object *object) override + { + if (!MatchesType(object)) return false; + // This should not happen, but just in case + if (!object->HasAttClass(ATT_FORMEWORK)) return false; + const AttFormework *element = dynamic_cast(object); + assert(element); + return (element->GetFunc() == m_func); + } + +private: + data_PGFUNC m_func; +}; + //---------------------------------------------------------------------------- // CrossAlignmentReferenceComparison //---------------------------------------------------------------------------- diff --git a/include/vrv/controlelement.h b/include/vrv/controlelement.h index 2f0e60624f2..6d595ddfbc9 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 new file mode 100644 index 00000000000..b651ea6bb16 --- /dev/null +++ b/include/vrv/convertfunctor.h @@ -0,0 +1,345 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: convertfunctor.h +// Author: David Bauer +// Created: 2023 +// Copyright (c) Authors and others. All rights reserved. +///////////////////////////////////////////////////////////////////////////// + +#ifndef __VRV_CONVERTFUNCTOR_H__ +#define __VRV_CONVERTFUNCTOR_H__ + +#include "functor.h" + +namespace vrv { + +//---------------------------------------------------------------------------- +// ConvertToPageBasedFunctor +//---------------------------------------------------------------------------- + +/** + * This class converts all top-level containers (section, endings) and editorial elements to milestone elements. + */ +class ConvertToPageBasedFunctor : public Functor { +public: + /** + * @name Constructors, destructors + */ + ///@{ + ConvertToPageBasedFunctor(Page *page); + virtual ~ConvertToPageBasedFunctor() = default; + ///@} + + /* + * Abstract base implementation + */ + bool ImplementsEndInterface() const override { return true; } + + /* + * Functor interface + */ + ///@{ + FunctorCode VisitDiv(Div *div) override; + FunctorCode VisitEditorialElement(EditorialElement *editorialElement) override; + FunctorCode VisitEditorialElementEnd(EditorialElement *editorialElement) override; + FunctorCode VisitEnding(Ending *ending) override; + FunctorCode VisitEndingEnd(Ending *ending) override; + FunctorCode VisitMeasure(Measure *measure) override; + FunctorCode VisitMdiv(Mdiv *mdiv) override; + FunctorCode VisitMdivEnd(Mdiv *mdiv) override; + FunctorCode VisitScore(Score *score) override; + FunctorCode VisitScoreEnd(Score *score) override; + FunctorCode VisitScoreDef(ScoreDef *scoreDef) override; + FunctorCode VisitSection(Section *section) override; + FunctorCode VisitSectionEnd(Section *section) override; + FunctorCode VisitSystemElement(SystemElement *systemElement) override; + ///@} + +protected: + // +private: + // +public: + // +private: + // The system we are moving the content to + System *m_currentSystem; + // The page being processed + Page *m_page; +}; + +//---------------------------------------------------------------------------- +// ConvertToCastOffMensuralFunctor +//---------------------------------------------------------------------------- + +/** + * This class converts mensural MEI into cast-off (measure) segments looking at the barLine objects. + * Segment positions occur where a barLine is set on all staves. + */ +class ConvertToCastOffMensuralFunctor : public DocFunctor { +public: + /** + * @name Constructors, destructors + */ + ///@{ + ConvertToCastOffMensuralFunctor(Doc *doc, System *targetSystem, const IntTree *layerTree); + virtual ~ConvertToCastOffMensuralFunctor() = default; + ///@} + + /* + * Abstract base implementation + */ + bool ImplementsEndInterface() const override { return false; } + + /* + * Setter for staff @n + */ + ///@{ + void AddStaffN(int staffN) { m_staffNs.push_back(staffN); } + void ClearStaffNs() { m_staffNs.clear(); } + ///@} + + /* + * Functor interface + */ + ///@{ + FunctorCode VisitBarLine(BarLine *barLine) override; + FunctorCode VisitLayer(Layer *layer) override; + FunctorCode VisitMeasure(Measure *measure) override; + FunctorCode VisitObject(Object *object) override; + FunctorCode VisitScoreDef(ScoreDef *scoreDef) override; + FunctorCode VisitStaff(Staff *staff) override; + FunctorCode VisitSyllable(Syllable *syllable) override; + FunctorCode VisitSystemElement(SystemElement *systemElement) override; + ///@} + +protected: + // +private: + // +public: + // +private: + // The staff @n for finding splitting bar lines + std::vector m_staffNs; + // The content layer from which we are copying the elements + Layer *m_contentLayer; + // The target system, measure, staff & layer + System *m_targetSystem; + Measure *m_targetMeasure; + Staff *m_targetStaff; + Layer *m_targetLayer; + // A sub-system (e.g., section) to add measure segments + System *m_targetSubSystem; + // A counter for segments in the sub-system (section) + int m_segmentIdx; + // The total number of segments (previous sections) + int m_segmentTotal; + // An IntTree for processing by layer + const IntTree *m_layerTree; +}; + +//---------------------------------------------------------------------------- +// ConvertToUnCastOffMensuralFunctor +//---------------------------------------------------------------------------- + +/** + * This class converts cast-off (measure) mensural segments MEI into mensural. + */ +class ConvertToUnCastOffMensuralFunctor : public Functor { +public: + /** + * @name Constructors, destructors + */ + ///@{ + ConvertToUnCastOffMensuralFunctor(); + virtual ~ConvertToUnCastOffMensuralFunctor() = default; + ///@} + + /* + * Abstract base implementation + */ + bool ImplementsEndInterface() const override { return false; } + + /* + * Getter and setter for various properties + */ + ///@{ + void ResetContent(); + void TrackSegmentsToDelete(bool trackSegments) { m_trackSegmentsToDelete = trackSegments; } + const ArrayOfObjects &GetSegmentsToDelete() const { return m_segmentsToDelete; } + ///@} + + /* + * Functor interface + */ + ///@{ + FunctorCode VisitLayer(Layer *layer) override; + FunctorCode VisitMeasure(Measure *measure) override; + FunctorCode VisitSection(Section *section) override; + ///@} + +protected: + // +private: + // +public: + // +private: + // The content/target measure and layer => NULL at the beginning of a section + Measure *m_contentMeasure; + Layer *m_contentLayer; + // Indicates if we keep a reference of the measure segments to delete at the end + bool m_trackSegmentsToDelete; + // Measure segments to delete at the end (fill in the first pass only) + ArrayOfObjects m_segmentsToDelete; +}; + +//---------------------------------------------------------------------------- +// ConvertMarkupAnalyticalFunctor +//---------------------------------------------------------------------------- + +/** + * This class converts analytical markup (\@fermata, \@tie) to elements. + */ +class ConvertMarkupAnalyticalFunctor : public Functor { +public: + /** + * @name Constructors, destructors + */ + ///@{ + ConvertMarkupAnalyticalFunctor(bool permanent); + virtual ~ConvertMarkupAnalyticalFunctor() = default; + ///@} + + /* + * Abstract base implementation + */ + bool ImplementsEndInterface() const override { return true; } + + /* + * Get the notes with unresolved open ties + */ + const std::vector &GetCurrentNotes() const { return m_currentNotes; } + + /* + * Functor interface + */ + ///@{ + FunctorCode VisitChord(Chord *chord) override; + FunctorCode VisitChordEnd(Chord *chord) override; + FunctorCode VisitMeasureEnd(Measure *measure) override; + FunctorCode VisitMRest(MRest *mRest) override; + FunctorCode VisitNote(Note *note) override; + FunctorCode VisitRest(Rest *rest) override; + ///@} + +protected: + // +private: + // Helper for converting markup + void ConvertToFermata(Fermata *fermata, AttFermataPresent *fermataPresent, const std::string &id); + +public: + // +private: + // The current notes with open ties + std::vector m_currentNotes; + // The current chord (if in a chord) + Chord *m_currentChord; + // Control events to be added to the measure (at its end) + ArrayOfObjects m_controlEvents; + // Indicates whether the conversion is permanent + bool m_permanent; +}; + +//---------------------------------------------------------------------------- +// ConvertMarkupArticFunctor +//---------------------------------------------------------------------------- + +/** + * This class converts markup of artic@artic multi value into distinct artic elements. + */ +class ConvertMarkupArticFunctor : public Functor { +public: + /** + * @name Constructors, destructors + */ + ///@{ + ConvertMarkupArticFunctor(); + virtual ~ConvertMarkupArticFunctor() = default; + ///@} + + /* + * Abstract base implementation + */ + bool ImplementsEndInterface() const override { return true; } + + /* + * Functor interface + */ + ///@{ + FunctorCode VisitArtic(Artic *artic) override; + FunctorCode VisitLayerEnd(Layer *layer) override; + ///@} + +protected: + // +private: + /** + * Split the multi-valued artic attributes into distinct artic elements. + */ + void SplitMultival(Artic *artic) const; + +public: + // +private: + // The articulations that need to be converted + std::vector m_articsToConvert; +}; + +//---------------------------------------------------------------------------- +// ConvertMarkupScoreDefFunctor +//---------------------------------------------------------------------------- + +/** + * This class moves scoreDef clef, keySig, meterSig and mensur to staffDef. + * When a staffDef already has one, it is not replaced. + */ +class ConvertMarkupScoreDefFunctor : public DocFunctor { +public: + /** + * @name Constructors, destructors + */ + ///@{ + ConvertMarkupScoreDefFunctor(Doc *doc); + virtual ~ConvertMarkupScoreDefFunctor() = default; + ///@} + + /* + * Abstract base implementation + */ + bool ImplementsEndInterface() const override { return true; } + + /* + * Functor interface + */ + ///@{ + FunctorCode VisitScore(Score *score) override; + FunctorCode VisitScoreDefElement(ScoreDefElement *scoreDefElement) override; + FunctorCode VisitScoreDefElementEnd(ScoreDefElement *scoreDefElement) override; + ///@} + +protected: + // +private: + // +public: + // +private: + // The scoreDef we are moving the content from + ScoreDefElement *m_currentScoreDef; +}; + +} // namespace vrv + +#endif // __VRV_CONVERTFUNCTOR_H__ diff --git a/include/vrv/course.h b/include/vrv/course.h index 6939e9d7dbd..5f19e5ae4ff 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 ec49727933f..b565c9596e9 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 @@ -64,9 +69,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/devicecontext.h b/include/vrv/devicecontext.h index a9653842005..f0255c0b125 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). */ @@ -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; } @@ -135,18 +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(); - virtual void SetBackground(int colour, int style = AxSOLID) = 0; + void ResetPushBack() { m_pushBack = false; } + 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; ///} @@ -313,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: @@ -330,6 +334,9 @@ class DeviceContext { bool m_isDeactivatedX; bool m_isDeactivatedY; + /** push back mode */ + bool m_pushBack; + Zone *m_facsimile = NULL; private: diff --git a/include/vrv/devicecontextbase.h b/include/vrv/devicecontextbase.h index bacb4383029..3db45409c47 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/dir.h b/include/vrv/dir.h index 401d91abe9f..946067744b6 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/div.h b/include/vrv/div.h new file mode 100644 index 00000000000..8c488866910 --- /dev/null +++ b/include/vrv/div.h @@ -0,0 +1,111 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: div.h +// Author: Laurent Pugin +// Created: 2023 +// Copyright (c) Authors and others. All rights reserved. +///////////////////////////////////////////////////////////////////////////// + +#ifndef __VRV_DIV_H__ +#define __VRV_DIV_H__ + +#include "textlayoutelement.h" + +namespace vrv { + +//---------------------------------------------------------------------------- +// Div +//---------------------------------------------------------------------------- + +/** + * This class represents an MEI Div. + * The current implementation accepts rend as child of div, which is not valid + * See https://github.com/music-encoding/music-encoding/issues/1189 + */ +class Div : public TextLayoutElement { +public: + /** + * @name Constructors, destructors, and other standard methods + * Reset method resets all attribute classes + */ + ///@{ + Div(); + virtual ~Div(); + void Reset() override; + std::string GetClassName() const override { return "Div"; } + ///@} + + /** + * @name Get and set the inline drawing flag + */ + ///@{ + bool GetDrawingInline() const { return m_drawingInline; } + void SetDrawingInline(bool drawingInline) { m_drawingInline = drawingInline; } + ///@} + + /** + * @name Get the X and Y drawing position + */ + ///@{ + int GetDrawingX() const override; + int GetDrawingY() const override; + ///@} + + /** + * @name Get and set the X and Y drawing relative positions + */ + ///@{ + int GetDrawingXRel() const { return m_drawingXRel; } + virtual void SetDrawingXRel(int drawingXRel); + void CacheXRel(bool restore = false); + int GetDrawingYRel() const { return m_drawingYRel; } + virtual void SetDrawingYRel(int drawingYRel); + void CacheYRel(bool restore = false); + ///@} + + /** + * Overriden to get the appropriate margin + */ + int GetTotalHeight(const Doc *doc) const override; + + int GetTotalWidth(const Doc *doc) const override; + + //----------// + // 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; + ///@} + +private: + // +public: + // +private: + /** + * The Y drawing relative position of the object. + * It is re-computed everytime the object is drawn and it is not stored in the file. + */ + int m_drawingYRel; + + /** + * The X drawing relative position of the object. + * It is re-computed everytime the object is drawn and it is not stored in the file. + */ + int m_drawingXRel; + + /** + * A flag indicating that the div should be displayed inline + */ + bool m_drawingInline; +}; + +} // namespace vrv + +#endif diff --git a/include/vrv/divline.h b/include/vrv/divline.h new file mode 100644 index 00000000000..98622e62d5f --- /dev/null +++ b/include/vrv/divline.h @@ -0,0 +1,104 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: divline.h +// Author: Yinan Zhou +// Created: 2021 +// Copyright (c) Authors and others. All rights reserved. +///////////////////////////////////////////////////////////////////////////// + +#ifndef __VRV_DIVLINE_H__ +#define __VRV_DIVLINE_H__ + +#include "atts_externalsymbols.h" +#include "atts_neumes.h" +#include "atts_shared.h" +#include "layerelement.h" + +namespace vrv { + +//---------------------------------------------------------------------------- +// DivLine +//---------------------------------------------------------------------------- + +/** + * This class models the MEI element. + */ +class DivLine : public LayerElement, + public AttColor, + public AttDivLineLog, + public AttExtSymAuth, + public AttExtSymNames, + public AttNNumberLike, + public AttVisibility { +public: + /** + * @name Constructors, destructors, and other standard methods + * Reset method resets all attribute classes. + */ + ///@{ + DivLine(); + virtual ~DivLine(); + virtual Object *Clone() const { return new DivLine(*this); } + virtual void Reset(); + virtual std::string GetClassName() const { return "DivLine"; } + ///@} + + /** Override the method since alignment is required */ + virtual bool HasToBeAligned() const { return true; } + + /** + * Use to set the alignment for the Measure BarLine members. + * This is as special case where we need to add to the measure aligner. + */ + bool SetAlignment(Alignment *alignment); + + /** + * Retrieve SMuFL string for the divLine. + */ + std::wstring GetSymbolStr() const; + + /** + * @name Method used for drawing divLine on ornaments + */ + static wchar_t GetDivLineGlyph(divLineLog_FORM); + +private: + // +public: + // +private: +}; + +//---------------------------------------------------------------------------- +// DivLineAttr +//---------------------------------------------------------------------------- + +/** + * This class models the divLine related attributes of a MEI measure. + */ +class DivLineAttr : public DivLine { +public: + /** + * @name Constructors, destructors, and other standard methods + * No Reset() method is required. + */ + ///@{ + DivLineAttr(); + virtual ~DivLineAttr(); + virtual Object *Clone() const { return new DivLineAttr(*this); } + virtual std::string GetClassName() const { return "DivLineAttr"; } + ///@} + + // void SetLeft() { m_isLeft = true; } + +private: + // +public: + // +private: + /** A flag for left barlines (right if false) */ + // bool m_isLeft; +}; + +} // namespace vrv + +#endif diff --git a/include/vrv/doc.h b/include/vrv/doc.h index b21f05d92cc..710d73c3ef0 100644 --- a/include/vrv/doc.h +++ b/include/vrv/doc.h @@ -90,12 +90,12 @@ class Doc : public Object { /** * Generate a document pgFoot if none is provided */ - bool GenerateFooter(); + void GenerateFooter(); /** * Generate a document pgHead from the MEI header if none is provided */ - bool GenerateHeader(); + void GenerateHeader(); /** * Generate measure numbers from measure attributes @@ -121,11 +121,6 @@ class Doc : public Object { */ bool HasPage(int pageIdx) const; - /** - * Get all the Score in the visible Mdiv. - */ - std::list GetScores(); - /** * Get the Pages in the visible Mdiv. * Will find it only when having read a pages-based MEI file, @@ -141,6 +136,31 @@ class Doc : public Object { */ int GetPageCount() const; + /** + * Get the first scoreDef + */ + ///@{ + ScoreDef *GetFirstScoreDef(); + const ScoreDef *GetFirstScoreDef() const; + ///@} + + /** + * Get all visible scores / the first visible score + * Lazily updates the visible scores, hence not const + */ + ///@{ + std::list GetVisibleScores(); + Score *GetFirstVisibleScore(); + ///@} + + /** + * Get the corresponding score for a node + */ + ///@{ + Score *GetCorrespondingScore(const Object *object); + const Score *GetCorrespondingScore(const Object *object) const; + ///@} + /** * Return true if the MIDI generation is already done */ @@ -225,7 +245,7 @@ class Doc : public Object { * Get the default distance from the staff for the object * The distance is given in x * MEI UNIT */ - data_MEASUREMENTSIGNED GetStaffDistance(const ClassId classId, int staffIndex, data_STAFFREL staffPosition); + data_MEASUREMENTSIGNED GetStaffDistance(const Object *object, int staffIndex, data_STAFFREL staffPosition) const; /** * Prepare the timemap for MIDI and timemap file export. @@ -418,19 +438,6 @@ class Doc : public Object { bool HasFacsimile() const { return m_facsimile != NULL; } ///@} - /** - * @name Setter and getter for the current Score/ScoreDef. - * If not set, then looks for the first Score in the Document and use that. - * The currentScoreDef is also changed by the Object::Process whenever as Score is reached. - * When processing backward, the ScoreDef is changed when reaching the corresponding PageMilestoneEnd - */ - ///@{ - Score *GetCurrentScore(); - ScoreDef *GetCurrentScoreDef(); - void SetCurrentScore(Score *score); - bool HasCurrentScore() const { return m_currentScore != NULL; } - ///@} - /** * Return true if the document has been cast off already. */ @@ -460,9 +467,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; ///@} @@ -477,6 +484,11 @@ class Doc : public Object { */ void PrepareMeasureIndices(); + /** + * Determine all visible scores + */ + void CollectVisibleScores(); + public: Page *m_selectionPreceding; Page *m_selectionFollowing; @@ -546,12 +558,10 @@ class Doc : public Object { Resources m_resources; /** - * @name Holds a pointer to the current score/scoreDef. - * Set by Doc::GetCurrentScoreDef or explicitly through Doc::SetCurrentScoreDef + * The list of all visible scores + * Used in Doc::GetCorrespondingScore to quickly determine the score for an object */ - ///@{ - Score *m_currentScore; - ///@} + std::list m_visibleScores; /** * A flag indicating if the document has been cast off or not. diff --git a/include/vrv/dot.h b/include/vrv/dot.h index 77da9e564c6..69ece3f71df 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/drawinginterface.h b/include/vrv/drawinginterface.h index cd915eaa3c0..a7932dfc8cd 100644 --- a/include/vrv/drawinginterface.h +++ b/include/vrv/drawinginterface.h @@ -95,12 +95,10 @@ class BeamDrawingInterface : public ObjectListInterface { /** * Return information about the position in the beam. - * (no const since the cached list is updated) - * Object * is a pointer to the object implementing the interface (e.g., Beam, fTrem) */ ///@{ - bool IsFirstIn(const Object *object, const LayerElement *element) const; - bool IsLastIn(const Object *object, const LayerElement *element) const; + bool IsFirstIn(const LayerElement *element) const; + bool IsLastIn(const LayerElement *element) const; ///@} /** @@ -163,7 +161,7 @@ class BeamDrawingInterface : public ObjectListInterface { * Return the position of the element in the beam. * For notes, lookup the position of the parent chord. */ - int GetPosition(const Object *object, const LayerElement *element) const; + int GetPosition(const LayerElement *element) const; // private: diff --git a/include/vrv/dynam.h b/include/vrv/dynam.h index d418a52e3f6..bc5aaf38485 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 3cb2f8f97ba..0bd73a54fb0 100644 --- a/include/vrv/editorial.h +++ b/include/vrv/editorial.h @@ -64,26 +64,12 @@ 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; ///@} - /** - * See Object::Save - */ - ///@{ - int Save(FunctorParams *functorParams) override; - int SaveEnd(FunctorParams *functorParams) override; - ///@} - - /** - * See Object::ConvertToPageBased - */ - int ConvertToPageBased(FunctorParams *functorParams) override; - int ConvertToPageBasedEnd(FunctorParams *functorParams) override; - private: // public: diff --git a/include/vrv/editortoolkit_neume.h b/include/vrv/editortoolkit_neume.h index e265398335f..dfeb65043e5 100644 --- a/include/vrv/editortoolkit_neume.h +++ b/include/vrv/editortoolkit_neume.h @@ -17,6 +17,7 @@ #include "doc.h" #include "editortoolkit.h" #include "view.h" +#include "vrv.h" #include "zone.h" #include "jsonxx.h" @@ -38,36 +39,46 @@ class EditorToolkitNeume : public EditorToolkit { */ ///@{ bool Chain(jsonxx::Array actions); + bool DisplaceClefOctave(std::string elementId, std::string direction); bool Drag(std::string elementId, int x, int y); bool Insert(std::string elementType, std::string staffId, int ulx, int uly, int lrx, int lry, std::vector> attributes); + bool InsertToSyllable(std::string elementId); bool Merge(std::vector elementIds); + bool MoveOutsideSyllable(std::string elementId); bool Set(std::string elementId, std::string attrType, std::string attrValue); bool SetText(std::string elementId, const std::string &text); bool SetClef(std::string elementId, std::string shape); bool Split(std::string elementId, int x); + bool SplitNeume(std::string elementId, std::string ncId); bool Remove(std::string elementId); bool Resize(std::string elementId, int ulx, int uly, int lrx, int lry, float resize = NAN); bool Group(std::string groupType, std::vector elementIds); bool Ungroup(std::string groupType, std::vector elementIds); bool ChangeGroup(std::string elementId, std::string contour); - bool ToggleLigature(std::vector elementIds, std::string isLigature); + bool ToggleLigature(std::vector elementIds); bool ChangeStaff(std::string elementId); + bool ChangeStaffTo(std::string elementId, std::string staffId); + bool ClefMovementHandler(Clef *clef, int x, int y); ///@} protected: /** * Parse JSON instructions for experimental editor functions. */ ///@{ + bool ParseDisplaceClefAction(jsonxx::Object param, std::string *elementId, std::string *direction); bool ParseDragAction(jsonxx::Object param, std::string *elementId, int *x, int *y); bool ParseInsertAction(jsonxx::Object param, std::string *elementType, std::string *startId, std::string *endId); bool ParseInsertAction(jsonxx::Object param, std::string *elementType, std::string *staffId, int *ulx, int *uly, int *lrx, int *lry, std::vector> *attributes); + bool ParseInsertToSyllableAction(jsonxx::Object param, std::string *elementId); bool ParseMergeAction(jsonxx::Object param, std::vector *elementIds); + bool ParseMoveOutsideSyllableAction(jsonxx::Object param, std::string *elementId); bool ParseSetAction(jsonxx::Object param, std::string *elementId, std::string *attrType, std::string *attrValue); bool ParseSetTextAction(jsonxx::Object param, std::string *elementId, std::string *text); bool ParseSetClefAction(jsonxx::Object param, std::string *elementId, std::string *shape); bool ParseSplitAction(jsonxx::Object param, std::string *elementId, int *x); + bool ParseSplitNeumeAction(jsonxx::Object param, std::string *elementId, std::string *ncId); bool ParseRemoveAction(jsonxx::Object param, std::string *elementId); bool ParseResizeAction(jsonxx::Object param, std::string *elementId, int *ulx, int *uly, int *lrx, int *lry); bool ParseResizeRotateAction( @@ -75,8 +86,9 @@ class EditorToolkitNeume : public EditorToolkit { bool ParseGroupAction(jsonxx::Object param, std::string *groupType, std::vector *elementIds); bool ParseUngroupAction(jsonxx::Object param, std::string *groupType, std::vector *elementIds); bool ParseChangeGroupAction(jsonxx::Object param, std::string *elementId, std::string *contour); - bool ParseToggleLigatureAction(jsonxx::Object param, std::vector *elementIds, std::string *isLigature); + bool ParseToggleLigatureAction(jsonxx::Object param, std::vector *elementIds); bool ParseChangeStaffAction(jsonxx::Object param, std::string *elementId); + bool ParseChangeStaffToAction(jsonxx::Object param, std::string *elementId, std::string *staffId); ///@} /** @@ -104,8 +116,8 @@ struct ClosestBB { int distanceToBB(int ulx, int uly, int lrx, int lry, double rotate = 0) { int offset = (x - ulx) * tan(rotate * M_PI / 180.0); - uly = uly - offset; - lry = lry - offset; + uly = uly + offset; + lry = lry + offset; int xDiff = std::max((ulx > x ? ulx - x : 0), (x > lrx ? x - lrx : 0)); int yDiff = std::max((uly > y ? uly - y : 0), (y > lry ? y - lry : 0)); @@ -126,11 +138,45 @@ struct ClosestBB { } }; +// To be used with std::stable_sort to find the position to insert a new accid / divLine +struct ClosestNeume { + int x; + int y; + + bool operator()(Object *a, Object *b) + { + // check if neume has neume components + if (!a->GetFirst(NC)) { + LogError("Neume %s doesn't have neume components.", a->GetID().c_str()); + return true; + } + if (!b->GetFirst(NC)) { + LogError("Neume %s doesn't have neume components.", b->GetID().c_str()); + return true; + } + if (!a->GetFirst(NC)->GetFacsimileInterface()) { + LogError("Neume component %s doesn't have facsimile.", a->GetFirst(NC)->GetID().c_str()); + return true; + } + if (!b->GetFirst(NC)->GetFacsimileInterface()) { + LogError("Neume component %s doesn't have facsimile.", b->GetFirst(NC)->GetID().c_str()); + return true; + } + Zone *zoneA = a->GetFirst(NC)->GetFacsimileInterface()->GetZone(); + Zone *zoneB = b->GetFirst(NC)->GetFacsimileInterface()->GetZone(); + + int distA = std::abs(x - zoneA->GetUlx()); + int distB = std::abs(x - zoneB->GetUlx()); + + return (distA < distB); + } +}; + // To be used with std::stable_sort to find the position to insert a new staff struct StaffSort { // Sort staves left-to-right and top-to-bottom - // Sort by y if there is no intersection, by x if there is + // Sort by y if there is no intersection, by x if there is x intersection is smaller than half length of staff line bool operator()(Object *a, Object *b) { if (!a->GetFacsimileInterface() || !b->GetFacsimileInterface()) return true; @@ -156,8 +202,11 @@ struct StaffSort { : zoneB->GetUly() - (zoneB->GetLrx() - zoneB->GetUlx()) * tan(zoneB->GetRotate() * M_PI / 180.0); // Check for y intersection - if ((aLowest <= bLowest && aLowest >= bHighest) || (aHighest <= bLowest && aHighest >= bHighest) - || (bLowest <= aLowest && bLowest >= aHighest) || (bHighest <= aLowest && bHighest >= aHighest)) { + // if the x intersection part is smaller than half of length of staffA + // sort by x coordinate + if (((aLowest <= bLowest && aLowest >= bHighest) || (aHighest <= bLowest && aHighest >= bHighest) + || (bLowest <= aLowest && bLowest >= aHighest) || (bHighest <= aLowest && bHighest >= aHighest)) + && (zoneA->GetLrx() - zoneB->GetUlx() <= 0.5 * (zoneA->GetLrx() - zoneA->GetUlx()))) { // sort by x center return (zoneA->GetUlx() < zoneB->GetUlx()); } diff --git a/include/vrv/elementpart.h b/include/vrv/elementpart.h index 38933ee6c5a..4387902979c 100644 --- a/include/vrv/elementpart.h +++ b/include/vrv/elementpart.h @@ -59,20 +59,12 @@ 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; ///@} - /** - * Overwritten version of Save that avoids anything to be written - */ - ///@{ - int Save(FunctorParams *functorParams) override { return FUNCTOR_CONTINUE; } - int SaveEnd(FunctorParams *functorParams) override { return FUNCTOR_CONTINUE; } - ///@} - /** * Set/get methods for the flagShift */ @@ -132,20 +124,12 @@ 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; ///@} - /** - * Overwritten version of Save that avoids anything to be written - */ - ///@{ - int Save(FunctorParams *functorParams) override { return FUNCTOR_CONTINUE; } - int SaveEnd(FunctorParams *functorParams) override { return FUNCTOR_CONTINUE; } - ///@} - private: // public: @@ -221,20 +205,12 @@ 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; ///@} - /** - * Overwritten version of Save that avoids anything to be written - */ - ///@{ - int Save(FunctorParams *functorParams) override { return FUNCTOR_CONTINUE; } - int SaveEnd(FunctorParams *functorParams) override { return FUNCTOR_CONTINUE; } - ///@} - private: // public: @@ -312,20 +288,12 @@ 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; ///@} - /** - * Overwritten version of Save that avoids anything to be written - */ - ///@{ - int Save(FunctorParams *functorParams) override { return FUNCTOR_CONTINUE; } - int SaveEnd(FunctorParams *functorParams) override { return FUNCTOR_CONTINUE; } - ///@} - private: // public: diff --git a/include/vrv/ending.h b/include/vrv/ending.h index e252d59763d..63d86d5b284 100644 --- a/include/vrv/ending.h +++ b/include/vrv/ending.h @@ -25,7 +25,12 @@ class Measure; * It can be both a container (in score-based MEI) and a milestone (in page-based MEI). * It inherits from FloatingElement for spanning drawing features. */ -class Ending : public SystemElement, public SystemMilestoneInterface, public AttLineRend, public AttNNumberLike { +class Ending : public SystemElement, + public SystemMilestoneInterface, + public AttLabelled, + public AttLineRend, + public AttLineRendBase, + public AttNNumberLike { public: /** * @name Constructors, destructors, and other standard methods @@ -52,20 +57,12 @@ 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; ///@} - /** - * See Object::ConvertToPageBased - */ - ///@{ - int ConvertToPageBased(FunctorParams *functorParams) override; - int ConvertToPageBasedEnd(FunctorParams *functorParams) override; - ///@} - private: // public: diff --git a/include/vrv/expansion.h b/include/vrv/expansion.h index cc824679e9e..d3290fd9ee5 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 2e9bb9c2325..85235d0d209 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 7765247ff7c..92b7d94e54d 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/featureextractor.h b/include/vrv/featureextractor.h index 0a595c7eeb1..0c049af5ec3 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/fermata.h b/include/vrv/fermata.h index 5169f03ce62..128368fd856 100644 --- a/include/vrv/fermata.h +++ b/include/vrv/fermata.h @@ -16,8 +16,6 @@ namespace vrv { -class ConvertMarkupAnalyticalParams; - //---------------------------------------------------------------------------- // Fermata //---------------------------------------------------------------------------- @@ -29,7 +27,8 @@ class Fermata : public ControlElement, public TimePointInterface, public AttColor, public AttEnclosingChars, - public AttExtSym, + public AttExtSymAuth, + public AttExtSymNames, public AttFermataVis, public AttPlacementRelStaff { public: @@ -56,12 +55,6 @@ class Fermata : public ControlElement, } ///@} - /** - * Helper for converting markup (from Note, Chord, Rest, MRest) - */ - void ConvertFromAnalyticalMarkup( - AttFermataPresent *fermataPresent, const std::string &id, ConvertMarkupAnalyticalParams *params); - /** * Get the SMuFL glyph for the fermata based on type, shape or glyph.num */ @@ -89,9 +82,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 f72a1f02f8f..aab71304a57 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 da6f66bea54..90d0a4da6ff 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 @@ -490,6 +490,46 @@ class FindElementInLayerStaffDefFunctor : public ConstFunctor { std::string m_id; }; +//---------------------------------------------------------------------------- +// AddToFlatListFunctor +//---------------------------------------------------------------------------- + +/** + * This class adds elements and its children to a flat list. + */ +class AddToFlatListFunctor : public ConstFunctor { +public: + /** + * @name Constructors, destructors + */ + ///@{ + AddToFlatListFunctor(ListOfConstObjects *flatList); + virtual ~AddToFlatListFunctor() = default; + ///@} + + /* + * Abstract base implementation + */ + bool ImplementsEndInterface() const override { return false; } + + /* + * Functor interface + */ + ///@{ + FunctorCode VisitObject(const Object *object) override; + ///@} + +protected: + // +private: + // +public: + // +private: + // The list of elements + ListOfConstObjects *m_flatList; +}; + } // namespace vrv #endif // __VRV_FINDFUNCTOR_H__ diff --git a/include/vrv/findlayerelementsfunctor.h b/include/vrv/findlayerelementsfunctor.h index 4fcff428039..50e6bde99fb 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/include/vrv/fing.h b/include/vrv/fing.h index 814d27347b2..f16496aef67 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 75959827f44..f6cd1f450a3 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; ///@} @@ -251,7 +251,7 @@ class FloatingPositioner : public BoundingBox { /** * Update the Y drawing relative position based on collision detection with the overlapping bounding box */ - void CalcDrawingYRel(Doc *doc, const StaffAlignment *staffAlignment, const BoundingBox *horizOverlappingBBox); + void CalcDrawingYRel(const Doc *doc, const StaffAlignment *staffAlignment, const BoundingBox *horizOverlappingBBox); /** * Align extender elements across systems diff --git a/include/vrv/ftrem.h b/include/vrv/ftrem.h index 636dafe37e4..79e1e805775 100644 --- a/include/vrv/ftrem.h +++ b/include/vrv/ftrem.h @@ -76,17 +76,12 @@ 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; ///@} - /** - * See Object::GenerateMIDI - */ - int GenerateMIDI(FunctorParams *functorParams) override; - private: // protected: diff --git a/include/vrv/functor.h b/include/vrv/functor.h index edaec778db4..6a08fac2bea 100644 --- a/include/vrv/functor.h +++ b/include/vrv/functor.h @@ -29,7 +29,7 @@ class FunctorBase { * @name Constructors, destructors */ ///@{ - FunctorBase(){}; + FunctorBase() {} virtual ~FunctorBase() = default; ///@} @@ -43,15 +43,32 @@ class FunctorBase { ///@} /** - * Getters/Setters for the properties + * Getter/Setter 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 filters and direction + * Here setters return the previous value + */ + ///@{ + Filters *GetFilters() const { return m_filters; } + Filters *SetFilters(Filters *filters) + { + Filters *previous = m_filters; + m_filters = filters; + return previous; + } bool GetDirection() const { return m_direction; } - void SetDirection(bool direction) { m_direction = direction; } + bool SetDirection(bool direction) + { + bool previous = m_direction; + m_direction = direction; + return previous; + } ///@} /** @@ -75,20 +92,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: @@ -112,7 +129,7 @@ class ConstFunctor : public FunctorBase, public ConstFunctorInterface { * @name Constructors, destructors */ ///@{ - ConstFunctor(){}; + ConstFunctor() {} virtual ~ConstFunctor() = default; ///@} @@ -131,7 +148,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 @@ -192,6 +209,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__ diff --git a/include/vrv/functorinterface.h b/include/vrv/functorinterface.h index 5d4a1412626..38424282880 100644 --- a/include/vrv/functorinterface.h +++ b/include/vrv/functorinterface.h @@ -32,6 +32,7 @@ class ControlElement; class Course; class Custos; class Dir; +class Div; class Dot; class Dots; class Doc; @@ -94,13 +95,12 @@ class Pages; class Pb; class Pedal; class PgFoot; -class PgFoot2; class PgHead; -class PgHead2; class Phrase; class PitchInflection; class Plica; class Proport; +class RepeatMark; class Reh; class Rend; class Rest; @@ -130,6 +130,7 @@ class TabGrp; class Tempo; class Text; class TextElement; +class TextLayoutElement; class Tie; class TimestampAligner; class TimestampAttr; @@ -223,19 +224,19 @@ class FunctorInterface { ///@} /** - * @name Visit running elements + * @name Visit text layout elements */ ///@{ + virtual FunctorCode VisitDiv(Div *div); + virtual FunctorCode VisitDivEnd(Div *div); virtual FunctorCode VisitRunningElement(RunningElement *runningElement); virtual FunctorCode VisitRunningElementEnd(RunningElement *runningElement); virtual FunctorCode VisitPgFoot(PgFoot *pgFoot); virtual FunctorCode VisitPgFootEnd(PgFoot *pgFoot); - virtual FunctorCode VisitPgFoot2(PgFoot2 *pgFoot2); - virtual FunctorCode VisitPgFoot2End(PgFoot2 *pgFoot2); virtual FunctorCode VisitPgHead(PgHead *pgHead); virtual FunctorCode VisitPgHeadEnd(PgHead *pgHead); - virtual FunctorCode VisitPgHead2(PgHead2 *pgHead2); - virtual FunctorCode VisitPgHead2End(PgHead2 *pgHead2); + virtual FunctorCode VisitTextLayoutElement(TextLayoutElement *textLayoutElement); + virtual FunctorCode VisitTextLayoutElementEnd(TextLayoutElement *textLayoutElement); ///@} /** @@ -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); @@ -578,19 +581,19 @@ class ConstFunctorInterface { ///@} /** - * @name Visit running elements + * @name Visit text layout elements */ ///@{ + virtual FunctorCode VisitDiv(const Div *div); + virtual FunctorCode VisitDivEnd(const Div *div); virtual FunctorCode VisitRunningElement(const RunningElement *runningElement); virtual FunctorCode VisitRunningElementEnd(const RunningElement *runningElement); virtual FunctorCode VisitPgFoot(const PgFoot *pgFoot); virtual FunctorCode VisitPgFootEnd(const PgFoot *pgFoot); - virtual FunctorCode VisitPgFoot2(const PgFoot2 *pgFoot2); - virtual FunctorCode VisitPgFoot2End(const PgFoot2 *pgFoot2); virtual FunctorCode VisitPgHead(const PgHead *pgHead); virtual FunctorCode VisitPgHeadEnd(const PgHead *pgHead); - virtual FunctorCode VisitPgHead2(const PgHead2 *pgHead2); - virtual FunctorCode VisitPgHead2End(const PgHead2 *pgHead2); + virtual FunctorCode VisitTextLayoutElement(const TextLayoutElement *textLayoutElement); + virtual FunctorCode VisitTextLayoutElementEnd(const TextLayoutElement *textLayoutElement); ///@} /** @@ -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/functorparams.h b/include/vrv/functorparams.h deleted file mode 100644 index a8bba349d2f..00000000000 --- a/include/vrv/functorparams.h +++ /dev/null @@ -1,628 +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; -}; - -//---------------------------------------------------------------------------- -// AddLayerElementToFlatListParams -//---------------------------------------------------------------------------- - -/** - * member 0: the ArrayOfObjects - **/ - -class AddLayerElementToFlatListParams : public FunctorParams { -public: - AddLayerElementToFlatListParams(ListOfConstObjects *flatList) { m_flatList = flatList; } - ListOfConstObjects *m_flatList; -}; - -//---------------------------------------------------------------------------- -// ApplyPPUFactorParams -//---------------------------------------------------------------------------- - -/** - * member 0: the current page - */ - -class ApplyPPUFactorParams : public FunctorParams { -public: - ApplyPPUFactorParams() { m_page = NULL; } - Page *m_page; -}; - -//---------------------------------------------------------------------------- -// ConvertMarkupAnalyticalParams -//---------------------------------------------------------------------------- - -/** - * member 0: std::vector* that holds the current notes with open ties - * member 1: Chord** currentChord for the current chord if in a chord - * member 2: an array of control events to be added to the measure (at its end) - * member 3: a flag indicating whereas the conversion is permanent of not - **/ - -class ConvertMarkupAnalyticalParams : public FunctorParams { -public: - ConvertMarkupAnalyticalParams(bool permanent) - { - m_currentChord = NULL; - m_permanent = permanent; - } - std::vector m_currentNotes; - Chord *m_currentChord; - ArrayOfObjects m_controlEvents; - bool m_permanent; -}; - -//---------------------------------------------------------------------------- -// ConvertMarkupArticParams -//---------------------------------------------------------------------------- - -/** - * member 0: std::vector* that needs to be converted - **/ - -class ConvertMarkupArticParams : public FunctorParams { -public: - ConvertMarkupArticParams() {} - std::vector> m_articPairsToConvert; -}; - -//---------------------------------------------------------------------------- -// ConvertMarkupScoreDefParams -//---------------------------------------------------------------------------- - -/** - * member 0: a pointer to the scoreDef we are moving the content from - * member 1: the doc - * member 2: the functor - * member 3: the end functor - **/ - -class ConvertMarkupScoreDefParams : public FunctorParams { -public: - ConvertMarkupScoreDefParams(Doc *doc, Functor *functor, Functor *functorEnd) - { - m_currentScoreDef = NULL; - m_doc = doc; - m_functor = functor; - m_functorEnd = functorEnd; - } - ScoreDefElement *m_currentScoreDef; - Doc *m_doc; - Functor *m_functor; - Functor *m_functorEnd; -}; - -//---------------------------------------------------------------------------- -// ConvertToCastOffMensuralParams -//---------------------------------------------------------------------------- - -/** - * member 0: a pointer the document we are adding pages to - * member 1: a vector of all the staff @n for finding spliting bar lines - * member 2: a pointer to the content Layer from which we are copying the elements - * member 3: a pointer to the target destination System - * member 4: a pointer to a sub-system (e.g., section) to add measure segments - * member 4: a pointer to the target destination System - * member 5: a pointer to the target destination Measure - * member 6: a pointer to the target destination Staff - * member 7: a pointer to the target destination Layer - * member 8: a counter for segments in the sub-system (section) - * member 9 a counter for the total number of segments (previous sections) - * member 10: a IntTree for precessing by Layer - **/ - -class ConvertToCastOffMensuralParams : public FunctorParams { -public: - ConvertToCastOffMensuralParams(Doc *doc, System *targetSystem, IntTree *layerTree) - { - m_doc = doc; - m_contentLayer = NULL; - m_targetSystem = targetSystem; - m_targetSubSystem = NULL; - m_targetMeasure = NULL; - m_targetStaff = NULL; - m_targetLayer = NULL; - m_segmentIdx = 0; - m_segmentTotal = 0; - m_layerTree = layerTree; - } - Doc *m_doc; - std::vector m_staffNs; - Layer *m_contentLayer; - System *m_targetSystem; - System *m_targetSubSystem; - Measure *m_targetMeasure; - Staff *m_targetStaff; - Layer *m_targetLayer; - int m_segmentIdx; - int m_segmentTotal; - IntTree *m_layerTree; -}; - -//---------------------------------------------------------------------------- -// ConvertToPageBasedParams -//---------------------------------------------------------------------------- - -/** - * member 0: a pointer to the system we are moving the content to - **/ - -class ConvertToPageBasedParams : public FunctorParams { -public: - ConvertToPageBasedParams(Page *page) - { - m_currentSystem = NULL; - m_page = page; - } - System *m_currentSystem; - Page *m_page; -}; - -//---------------------------------------------------------------------------- -// ConvertToUnCastOffMensuralParams -//---------------------------------------------------------------------------- - -/** - * member 0: a pointer to the content / target Measure (NULL at the beginning of a section) - * member 1: a pointer to the content / target Layer (NULL at the beginning of a section) - * member 2: a flag indicating if we keep a reference of the measure segments to delete at the end - * member 3: a list of measure segments to delete at the end (fill in the first pass only) - **/ - -class ConvertToUnCastOffMensuralParams : public FunctorParams { -public: - ConvertToUnCastOffMensuralParams() - { - m_contentMeasure = NULL; - m_contentLayer = NULL; - m_addSegmentsToDelete = true; - } - Measure *m_contentMeasure; - Layer *m_contentLayer; - bool m_addSegmentsToDelete; - ArrayOfObjects m_segmentsToDelete; -}; - -//---------------------------------------------------------------------------- -// 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; -}; - -//---------------------------------------------------------------------------- -// 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; -}; - -//---------------------------------------------------------------------------- -// 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 -//---------------------------------------------------------------------------- - -/** - * 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; -}; - -//---------------------------------------------------------------------------- -// GetAlignmentLeftRightParams -//---------------------------------------------------------------------------- - -/** - * member 0: the min left - * member 1: the max right - **/ - -class GetAlignmentLeftRightParams : public FunctorParams { -public: - GetAlignmentLeftRightParams(Functor *functor) - { - m_minLeft = -VRV_UNSET; - m_maxRight = VRV_UNSET; - m_functor = functor; - } - int m_minLeft; - int m_maxRight; - std::vector m_excludeClasses; - 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; -}; - -//---------------------------------------------------------------------------- -// 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; -}; - -//---------------------------------------------------------------------------- -// InitProcessingListsParams -//---------------------------------------------------------------------------- - -/** - * member 0: the IntTree* for staff/layer/verse - * member 1: the IntTree* for staff/layer - **/ - -class InitProcessingListsParams : public FunctorParams { -public: - InitProcessingListsParams() {} - IntTree m_verseTree; - IntTree m_layerTree; -}; - -//---------------------------------------------------------------------------- -// 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; -}; - -//---------------------------------------------------------------------------- -// ReorderByXPosParams -//---------------------------------------------------------------------------- - -/** - * member 0: a pointer to the current object whose children we (may) reorder - **/ -class ReorderByXPosParams : public FunctorParams { -public: - int modifications = 0; -}; - -//---------------------------------------------------------------------------- -// SaveParams -//---------------------------------------------------------------------------- - -/** - * member 0: output stream - * member 1: flag for MEI basic output for filtering out editorial markup - **/ - -class SaveParams : public FunctorParams { -public: - SaveParams(Output *output, bool basic) - { - m_output = output; - m_basic = basic; - } - Output *m_output; - bool m_basic; -}; - -//---------------------------------------------------------------------------- -// 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/gliss.h b/include/vrv/gliss.h index e529e3f1d1e..3eb6c553786 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 153ed22250d..4b2a944600d 100644 --- a/include/vrv/gracegrp.h +++ b/include/vrv/gracegrp.h @@ -44,19 +44,12 @@ 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; ///@} - /** - * @name See Object::GenerateMIDIEnd - */ - ///@{ - int GenerateMIDIEnd(FunctorParams *functorParams) override; - ///@} - protected: // private: diff --git a/include/vrv/grpsym.h b/include/vrv/grpsym.h index 9c21356fdbe..53ba6268e06 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 467e9cbe56e..8a81dd1d3de 100644 --- a/include/vrv/hairpin.h +++ b/include/vrv/hairpin.h @@ -27,6 +27,7 @@ class Hairpin : public ControlElement, public AttColor, public AttHairpinLog, public AttHairpinVis, + public AttLineRendBase, public AttPlacementRelStaff, public AttVerticalGroup { public: @@ -96,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 00084490292..dcc439dcebb 100644 --- a/include/vrv/halfmrpt.h +++ b/include/vrv/halfmrpt.h @@ -48,19 +48,12 @@ 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; ///@} - /** - * @name See Object::GenerateMIDI - */ - ///@{ - int GenerateMIDI(FunctorParams *functorParams) override; - ///@} - private: // public: diff --git a/include/vrv/harm.h b/include/vrv/harm.h index 17a04c9b992..f8d345c0405 100644 --- a/include/vrv/harm.h +++ b/include/vrv/harm.h @@ -83,17 +83,12 @@ 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; ///@} - /** - * See Object::Transpose - */ - int Transpose(FunctorParams *functorParams) override; - protected: // private: diff --git a/include/vrv/horizontalaligner.h b/include/vrv/horizontalaligner.h index 7d30c935e3a..9c8a8da8160 100644 --- a/include/vrv/horizontalaligner.h +++ b/include/vrv/horizontalaligner.h @@ -45,6 +45,7 @@ enum AlignmentType { ALIGNMENT_ACCID, ALIGNMENT_GRACENOTE, ALIGNMENT_BARLINE, + ALIGNMENT_DIVLINE, ALIGNMENT_DEFAULT, // Non-justifiable ALIGNMENT_MEASURE_RIGHT_BARLINE, @@ -125,13 +126,13 @@ class Alignment : public Object { bool IsOfType(const std::vector &types) const; /** - * Retrive the minimum left and maximum right position for the objects in an alignment. - * Returns (-)VRV_UNSET in nothing for the staff specified. - * Uses Object::GetAlignmentLeftRight + * Retrieve the minimum left and maximum right position for the objects in an alignment. + * Returns (-)VRV_UNSET if there is nothing for the staff specified. + * Internally uses GetAlignmentLeftRightFunctor */ - void GetLeftRight(const std::vector &staffNs, int &minLeft, int &maxRight, - const std::vector &m_excludes = {}) const; - void GetLeftRight(int staffN, int &minLeft, int &maxRight, const std::vector &m_excludes = {}) const; + void GetLeftRight( + const std::vector &staffNs, int &minLeft, int &maxRight, const std::vector &excludes = {}) const; + void GetLeftRight(int staffN, int &minLeft, int &maxRight, const std::vector &excludes = {}) const; /** * Return all GraceAligners for the Alignment. @@ -168,12 +169,6 @@ class Alignment : public Object { */ std::pair GetAlignmentTopBottom() const; - /** - * Add an accidental to the accidSpace of the AlignmentReference holding it. - * The Alignment has to have a AlignmentReference holding it. - */ - void AddToAccidSpace(Accid *accid); - /** * Return true if there is vertical overlap with accidentals from another alignment for specific staffN */ @@ -219,9 +214,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; ///@} @@ -295,16 +290,6 @@ class AlignmentReference : public Object, public AttNInteger { */ void AddChild(Object *object) override; - /** - * Add an accidental to the accidSpace of the AlignmentReference. - */ - void AddToAccidSpace(Accid *accid); - - /** - * See AdjustAccidXFunctor - */ - void AdjustAccidWithAccidSpace(Accid *accid, const Doc *doc, int staffSize, std::set &adjustedAccids); - /** * Return true if one of objects overlaps with accidentals from current reference (i.e. if there are accidentals) */ @@ -320,12 +305,6 @@ class AlignmentReference : public Object, public AttNInteger { */ bool HasCrossStaffElements() const; - /** - * Set whether accidentals should be aligned with all elements of alignmentReference or elements from same layer - * only. Set for each accidental in accidSpace separately - */ - void SetAccidLayerAlignment(); - //----------// // Functors // //----------// @@ -334,20 +313,16 @@ 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; ///@} private: // public: - /** - * The accid space of the AlignmentReference. - */ - std::vector m_accidSpace; - + // private: /** * @@ -391,9 +366,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 +504,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 +609,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 +671,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 3437e5de09b..935cac6977c 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/iohumdrum.h b/include/vrv/iohumdrum.h index 9036fe2cfde..b0c6bb6a1d5 100644 --- a/include/vrv/iohumdrum.h +++ b/include/vrv/iohumdrum.h @@ -22,6 +22,7 @@ #include "clef.h" #include "dir.h" #include "ending.h" +#include "fing.h" #include "ftrem.h" #include "harm.h" #include "io.h" @@ -657,7 +658,7 @@ class HumdrumInput : public vrv::Input { void removeInstrumentAbbreviation(StaffDef *sd); std::string getEndIdForOttava(hum::HTp token); void prepareInitialOttavas(hum::HTp measure); - void linkFingeringToNote(Dir *dir, hum::HTp token, int xstaffindex); + void linkFingeringToNote(Fing *fing, hum::HTp token, int xstaffindex); bool checkForTupletForcedBreak(const std::vector &duritems, int index); void extractSlurNoteAttachmentInformation(std::vector> &data, hum::HTp token, char slurtype); void extractPhraseNoteAttachmentInformation( @@ -830,6 +831,14 @@ class HumdrumInput : public vrv::Input { int staffadj, int trackdiff); bool hasNoStaves(hum::HumdrumFile &infile); hum::HTp getVisualKeySignature(hum::HTp keysigtok); + bool isNotAtStartOfMeasure(std::vector &layerdata, int index); + void analyzeFingerings(hum::HumdrumFile &infile); + void analyzeFingerings(hum::HTp sstart); + void insertMidMeasureKeySignature( + int staffindex, std::vector &elements, std::vector &pointers, hum::HTp token); + int getKeySignatureNumber(const std::string &humkeysig); + int getStaffNumForSpine(hum::HTp token); + bool checkIfReversedSpineOrder(std::vector staffstarts); // header related functions: /////////////////////////////////////////// void createHeader(); diff --git a/include/vrv/iomei.h b/include/vrv/iomei.h index d50d0b75d64..6b0d7800119 100644 --- a/include/vrv/iomei.h +++ b/include/vrv/iomei.h @@ -51,6 +51,8 @@ class Damage; class Del; class Dot; class Dir; +class Div; +class DivLine; class DurationInterface; class Dynam; class Ending; @@ -82,6 +84,7 @@ class LayerElement; class Lb; class Lem; class Ligature; +class Liquescent; class Lv; class Mdiv; class Measure; @@ -110,9 +113,7 @@ class Pages; class Pb; class Pedal; class PgFoot; -class PgFoot2; class PgHead; -class PgHead2; class Phrase; class PitchInflection; class PitchInterface; @@ -125,6 +126,7 @@ class Ref; class Reg; class Reh; class Rend; +class RepeatMark; class Rest; class Restore; class RunningElement; @@ -157,6 +159,7 @@ class Tempo; class Text; class TextDirInterface; class TextElement; +class TextLayoutElement; class Tie; class TimePointInterface; class TimeSpanningInterface; @@ -303,7 +306,7 @@ class MEIOutput : public Output { * Scoredef manipulation */ ///@{ - void WriteCustomScoreDef(); + void WriteCustomScoreDef(ScoreDef *scoreDef); void AdjustStaffDef(StaffDef *staffDef, Measure *measure); bool AdjustLabel(Label *label); ///@} @@ -355,9 +358,8 @@ class MEIOutput : public Output { void WriteScoreDef(pugi::xml_node currentNode, ScoreDef *scoreDef); void WriteGrpSym(pugi::xml_node currentNode, GrpSym *grmSym); void WritePgFoot(pugi::xml_node currentNode, PgFoot *pgFoot); - void WritePgFoot2(pugi::xml_node currentNode, PgFoot2 *pgFoot2); void WritePgHead(pugi::xml_node currentNode, PgHead *pgHead); - void WritePgHead2(pugi::xml_node currentNode, PgHead2 *pgHead2); + void WriteDiv(pugi::xml_node currentNode, Div *div); void WriteStaffGrp(pugi::xml_node currentNode, StaffGrp *staffGrp); void WriteStaffDef(pugi::xml_node currentNode, StaffDef *staffDef); void WriteInstrDef(pugi::xml_node currentNode, InstrDef *instrDef); @@ -388,6 +390,7 @@ class MEIOutput : public Output { void WriteChord(pugi::xml_node currentNode, Chord *chord); void WriteClef(pugi::xml_node currentNode, Clef *clef); void WriteCustos(pugi::xml_node currentNode, Custos *custos); + void WriteDivLine(pugi::xml_node currentNode, DivLine *divLine); void WriteDot(pugi::xml_node currentNode, Dot *dot); void WriteFTrem(pugi::xml_node currentNode, FTrem *fTrem); void WriteGraceGrp(pugi::xml_node currentNode, GraceGrp *graceGrp); @@ -395,6 +398,7 @@ class MEIOutput : public Output { void WriteKeyAccid(pugi::xml_node currentNode, KeyAccid *keyAccid); void WriteKeySig(pugi::xml_node currentNode, KeySig *keySig); void WriteLigature(pugi::xml_node currentNode, Ligature *ligature); + void WriteLiquescent(pugi::xml_node currentNode, Liquescent *liquescent); void WriteMensur(pugi::xml_node currentNode, Mensur *mensur); void WriteMeterSig(pugi::xml_node currentNode, MeterSig *meterSig); void WriteMRest(pugi::xml_node currentNode, MRest *mRest); @@ -443,6 +447,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); @@ -515,6 +520,7 @@ class MEIOutput : public Output { void WriteControlElement(pugi::xml_node element, ControlElement *object); void WriteEditorialElement(pugi::xml_node element, EditorialElement *object); void WriteLayerElement(pugi::xml_node element, LayerElement *object); + void WriteTextLayoutElement(pugi::xml_node element, TextLayoutElement *object); void WriteRunningElement(pugi::xml_node element, RunningElement *object); void WriteScoreDefElement(pugi::xml_node element, ScoreDefElement *object); void WriteSystemElement(pugi::xml_node element, SystemElement *object); @@ -651,9 +657,8 @@ class MEIInput : public Input { bool ReadScoreDefChildren(Object *parent, pugi::xml_node parentNode); bool ReadGrpSym(Object *parent, pugi::xml_node grpSym); bool ReadPgFoot(Object *parent, pugi::xml_node pgFoot); - bool ReadPgFoot2(Object *parent, pugi::xml_node pgFoot2); bool ReadPgHead(Object *parent, pugi::xml_node pgHead); - bool ReadPgHead2(Object *parent, pugi::xml_node pgHead2); + bool ReadDiv(Object *parent, pugi::xml_node div); bool ReadRunningChildren(Object *parent, pugi::xml_node parentNode, Object *filter = NULL); bool ReadStaffGrp(Object *parent, pugi::xml_node staffGrp); bool ReadStaffGrpChildren(Object *parent, pugi::xml_node parentNode); @@ -696,6 +701,7 @@ class MEIInput : public Input { bool ReadChord(Object *parent, pugi::xml_node chord); bool ReadClef(Object *parent, pugi::xml_node clef); bool ReadCustos(Object *parent, pugi::xml_node custos); + bool ReadDivLine(Object *parent, pugi::xml_node divLine); bool ReadDot(Object *parent, pugi::xml_node dot); bool ReadFTrem(Object *parent, pugi::xml_node fTrem); bool ReadGraceGrp(Object *parent, pugi::xml_node graceGrp); @@ -703,6 +709,7 @@ class MEIInput : public Input { bool ReadKeyAccid(Object *parent, pugi::xml_node keyAccid); bool ReadKeySig(Object *parent, pugi::xml_node keySig); bool ReadLigature(Object *parent, pugi::xml_node ligature); + bool ReadLiquescent(Object *parent, pugi::xml_node liquescent); bool ReadMensur(Object *parent, pugi::xml_node mensur); bool ReadMeterSig(Object *parent, pugi::xml_node meterSig); bool ReadMRest(Object *parent, pugi::xml_node mRest); @@ -752,6 +759,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); @@ -812,6 +820,7 @@ class MEIInput : public Input { bool ReadControlElement(pugi::xml_node element, ControlElement *object); bool ReadEditorialElement(pugi::xml_node element, EditorialElement *object); bool ReadLayerElement(pugi::xml_node element, LayerElement *object); + bool ReadTextLayoutElement(pugi::xml_node element, TextLayoutElement *object); bool ReadRunningElement(pugi::xml_node element, RunningElement *object); bool ReadScoreDefElement(pugi::xml_node element, ScoreDefElement *object); bool ReadSystemElement(pugi::xml_node element, SystemElement *object); @@ -880,15 +889,20 @@ 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 UpgradeStaffTo_5_0_0(pugi::xml_node staff); - void UpgradeLayerElementTo_5_0_0(pugi::xml_node element); + void UpgradeKeySigTo_5_0(pugi::xml_node keySig); + void UpgradePageTo_5_0(Page *page); + void UpgradePgHeadFootTo_5_0(pugi::xml_node element); + void UpgradeMeasureTo_5_0(pugi::xml_node measure); + void UpgradeMeterSigTo_5_0(pugi::xml_node meterSig, MeterSig *vrvMeterSig); + void UpgradeScoreDefElementTo_5_0(pugi::xml_node scoreDefElement); + void UpgradeStaffTo_5_0(pugi::xml_node staff); + void UpgradeLayerElementTo_5_0(pugi::xml_node element); + void UpgradeRendTo_5_0(pugi::xml_node element); // to MEI 4.0.0 void UpgradeBeatRptTo_4_0_0(pugi::xml_node beatRpt, BeatRpt *vrvBeatRpt); void UpgradeDurGesTo_4_0_0(pugi::xml_node element, DurationInterface *interface); void UpgradeFTremTo_4_0_0(pugi::xml_node fTrem, FTrem *vrvFTrem); - void UpgradeMensurTo_5_0_0(pugi::xml_node mensur, Mensur *vrvMensur); + void UpgradeMensurTo_5_0(pugi::xml_node mensur, Mensur *vrvMensur); void UpgradeMordentTo_4_0_0(pugi::xml_node mordent, Mordent *vrvMordent); void UpgradeScoreDefElementTo_4_0_0(pugi::xml_node scoreDefElement, ScoreDefElement *vrvScoreDefElement); void UpgradeStaffDefTo_4_0_0(pugi::xml_node staffDef, StaffDef *vrvStaffDef); diff --git a/include/vrv/iomusxml.h b/include/vrv/iomusxml.h index 2b81d6d83a8..2d6decc245c 100644 --- a/include/vrv/iomusxml.h +++ b/include/vrv/iomusxml.h @@ -197,7 +197,14 @@ class MusicXmlInput : public Input { MusicXmlInput(Doc *doc); virtual ~MusicXmlInput(); +private: + /* + * Objects that were not successfully added and should be destroyed at the end of the import + */ + ListOfObjects m_garbage; + #ifndef NO_MUSICXML_SUPPORT +public: bool Import(const std::string &musicxml) override; private: @@ -277,9 +284,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. diff --git a/include/vrv/keyaccid.h b/include/vrv/keyaccid.h index ffc20eda48d..d7ad69d0332 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 @@ -72,9 +73,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 c45edf87fb9..edaf86d536a 100644 --- a/include/vrv/keysig.h +++ b/include/vrv/keysig.h @@ -44,10 +44,11 @@ struct KeyAccidInfo { class KeySig : public LayerElement, public ObjectListInterface, public AttAccidental, - public AttPitch, - public AttKeySigAnl, + public AttColor, + public AttKeyMode, public AttKeySigLog, public AttKeySigVis, + public AttPitch, public AttVisibility { public: /** @@ -119,17 +120,12 @@ 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; ///@} - /** - * See Object::Transpose - */ - int Transpose(FunctorParams *functorParams) override; - protected: /** * Filter the flat list and keep only StaffDef elements. diff --git a/include/vrv/label.h b/include/vrv/label.h index b305db7f3a3..b304d1823f3 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 5b468ac8757..82b496ebd2e 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 a8625152dc3..45fefba99a1 100644 --- a/include/vrv/layer.h +++ b/include/vrv/layer.h @@ -240,51 +240,12 @@ 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; ///@} - /** - * See Object::ConvertMarkupArtic - */ - int ConvertMarkupArticEnd(FunctorParams *functorParams) override; - - /** - * See Object::ConvertToCastOffMensural - */ - int ConvertToCastOffMensural(FunctorParams *functorParams) override; - - /** - * See Object::ConvertToUnCastOffMensural - */ - int ConvertToUnCastOffMensural(FunctorParams *functorParams) override; - - /** - * See Object::InitProcessingLists - */ - int InitProcessingLists(FunctorParams *functorParams) override; - - /** - * See Object::InitOnsetOffset - */ - ///@{ - int InitOnsetOffset(FunctorParams *functorParams) 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/layerdef.h b/include/vrv/layerdef.h index 5d5c1f21aeb..3243d8bc93d 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 16f8b74ebd5..af0917a61d7 100644 --- a/include/vrv/layerelement.h +++ b/include/vrv/layerelement.h @@ -24,6 +24,7 @@ class Beam; class BeamElementCoord; class FTrem; class Layer; +class Liquescent; class Mensur; class MeterSig; class Staff; @@ -332,48 +333,12 @@ 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; ///@} - /** - * See Object::ApplyPPUFactor - */ - int ApplyPPUFactor(FunctorParams *functorParams) override; - - /** - * See Object::InitOnsetOffset - */ - ///@{ - int InitOnsetOffset(FunctorParams *functorParams) override; - ///@} - - /** - * See Object::InitTimemapTies - */ - ///@{ - int InitTimemapTies(FunctorParams *functorParams) override; - ///@} - - /** - * @name See Object::GenerateMIDI - */ - ///@{ - int GenerateMIDI(FunctorParams *functorParams) override; - ///@} - - /** - * See Object::GenerateTimemap - */ - 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/lb.h b/include/vrv/lb.h index 4fb575a8f84..9b044f6d25b 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 d71f3f2e273..c59998f0dc2 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/liquescent.h b/include/vrv/liquescent.h new file mode 100644 index 00000000000..e64d63c15aa --- /dev/null +++ b/include/vrv/liquescent.h @@ -0,0 +1,56 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: liquescent.h +// Author: Gabby Halpin +// Created: 2021 +// Copyright (c) Authors and others. All rights reserved. +///////////////////////////////////////////////////////////////////////////// + +#ifndef __VRV_LIQUESCENT_H__ +#define __VRV_LIQUESCENT_H__ + +#include "atts_analytical.h" +#include "atts_shared.h" +#include "layerelement.h" +#include "pitchinterface.h" +#include "positioninterface.h" + +namespace vrv { + +//---------------------------------------------------------------------------- +// Liquescent +//---------------------------------------------------------------------------- + +class Liquescent : public LayerElement, public PitchInterface, public PositionInterface, public AttColor { +public: + /** + * @name Constructors, destructors, and other standard methods + * Reset method resets all attribute classes + */ + ///@{ + Liquescent(); + virtual ~Liquescent(); + virtual Object *Clone() const { return new Liquescent(*this); } + virtual void Reset(); + virtual std::string GetClassName() const { return "Liquescent"; } + ///@} + + /** + * @name Getter to interfaces + */ + ///@{ + virtual PitchInterface *GetPitchInterface() { return dynamic_cast(this); } + ///@} + + /** Override the method since alignment is required */ + virtual bool HasToBeAligned() const { return true; } + +private: + // +public: + // +private: +}; + +} // namespace vrv + +#endif diff --git a/include/vrv/lv.h b/include/vrv/lv.h index 3e054c89eb3..d1f5c94051e 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 e40e008fdc4..8512e8a9bb1 100644 --- a/include/vrv/mdiv.h +++ b/include/vrv/mdiv.h @@ -56,34 +56,12 @@ 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; ///@} - /** - * See Object::Save - * Invisible Mdiv elements are not saved in page-based MEI - */ - ///@{ - int Save(FunctorParams *functorParams) override; - int SaveEnd(FunctorParams *functorParams) override; - ///@} - - /** - * See Object::ConvertToPageBased - */ - ///@{ - int ConvertToPageBased(FunctorParams *functorParams) override; - int ConvertToPageBasedEnd(FunctorParams *functorParams) override; - ///@} - - /** - * See Object::Transpose - */ - int Transpose(FunctorParams *functorParams) override; - private: // public: diff --git a/include/vrv/measure.h b/include/vrv/measure.h index d085c44079f..e9fe0cef9ca 100644 --- a/include/vrv/measure.h +++ b/include/vrv/measure.h @@ -295,96 +295,56 @@ class Measure : public Object, */ int EnclosesTime(int time) const; - /** - * Return the real time offset in millisecond for the repeat (1-based). - */ - double GetRealTimeOffsetMilliseconds(int repeat) const; - - /** - * Return vector with tie endpoints for ties that start and end in current measure - */ - std::vector> GetInternalTieEndpoints(); - /** * Read only access to m_scoreTimeOffset */ double GetLastTimeOffset() const { return m_scoreTimeOffset.back(); } - //----------// - // Functors // - //----------// - /** - * Interface for class functor visitation + * Return the real time offset in milliseconds */ ///@{ - FunctorCode Accept(MutableFunctor &functor) override; - FunctorCode Accept(ConstFunctor &functor) const override; - FunctorCode AcceptEnd(MutableFunctor &functor) override; - FunctorCode AcceptEnd(ConstFunctor &functor) const override; + double GetLastRealTimeOffset() const { return m_realTimeOffsetMilliseconds.back(); } + double GetRealTimeOffsetMilliseconds(int repeat) const; ///@} /** - * See Object::ConvertMarkupAnalytical - */ - int ConvertMarkupAnalyticalEnd(FunctorParams *functorParams) override; - - /** - * See Object::ConvertToPageBased - */ - int ConvertToPageBased(FunctorParams *functorParams) override; - - /** - * See Object::ConvertToCastOffMensural - */ - int ConvertToCastOffMensural(FunctorParams *functorParams) override; - - /** - * See Object::ConvertToUnCastOffMensural - */ - int ConvertToUnCastOffMensural(FunctorParams *functorParams) override; - - /** - * See Object::Save + * Setter for the time offset */ ///@{ - int Save(FunctorParams *functorParams) override; - int SaveEnd(FunctorParams *functorParams) override; + 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); } ///@} /** - * See Object::ApplyPPUFactor - */ - int ApplyPPUFactor(FunctorParams *functorParams) override; - - /** - * See Object::InitMIDI + * Setter and getter for the current tempo */ - int InitMIDI(FunctorParams *functorParams) override; + ///@{ + void SetCurrentTempo(double tempo) { m_currentTempo = tempo; } + double GetCurrentTempo() const { return m_currentTempo; } + ///@} /** - * See Object::GenerateMIDI + * Return vector with tie endpoints for ties that start and end in current measure */ - int GenerateMIDI(FunctorParams *functorParams) override; + std::vector> GetInternalTieEndpoints(); - /** - * See Object::GenerateTimemap - */ - int GenerateTimemap(FunctorParams *functorParams) override; + //----------// + // Functors // + //----------// /** - * See Object::CalcMaxMeasureDuration + * Interface for class functor visitation */ ///@{ - int InitMaxMeasureDuration(FunctorParams *functorParams) override; - int InitMaxMeasureDurationEnd(FunctorParams *functorParams) override; + FunctorCode Accept(Functor &functor) override; + FunctorCode Accept(ConstFunctor &functor) const override; + FunctorCode AcceptEnd(Functor &functor) override; + FunctorCode AcceptEnd(ConstFunctor &functor) const 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/mensur.h b/include/vrv/mensur.h index 4d7b649a2a4..de8351493bc 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 7ae672198d3..df024fd5149 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 @@ -60,9 +64,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 f433c846573..f98baad03cf 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 */ @@ -85,9 +72,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 new file mode 100644 index 00000000000..9900ea45f6a --- /dev/null +++ b/include/vrv/midifunctor.h @@ -0,0 +1,466 @@ +///////////////////////////////////////////////////////////////////////////// +// 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 smf { +class MidiFile; +} + +namespace vrv { + +class FeatureExtractor; +class Timemap; + +//---------------------------------------------------------------------------- +// InitOnsetOffsetFunctor +//---------------------------------------------------------------------------- + +/** + * This class prepares Note onsets. + */ +class InitOnsetOffsetFunctor : public Functor { +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; +}; + +//---------------------------------------------------------------------------- +// InitMaxMeasureDurationFunctor +//---------------------------------------------------------------------------- + +/** + * This class calculates the maximum duration of each measure. + */ +class InitMaxMeasureDurationFunctor : public Functor { +public: + /** + * @name Constructors, destructors + */ + ///@{ + InitMaxMeasureDurationFunctor(); + virtual ~InitMaxMeasureDurationFunctor() = default; + ///@} + + /* + * Abstract base implementation + */ + 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 + */ + ///@{ + 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: + // Returns the current tempo with adjustment + double GetAdjustedTempo() const { return m_currentTempo * m_tempoAdjustment; } + +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; +}; + +//---------------------------------------------------------------------------- +// InitTimemapTiesFunctor +//---------------------------------------------------------------------------- + +/** + * This class adjusts note timings based on ties. + */ +class InitTimemapTiesFunctor : public Functor { +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: + // +}; + +//---------------------------------------------------------------------------- +// 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; } + + /* + * Setter and getter for properties + */ + ///@{ + void SetCurrentTempo(double tempo) { m_currentTempo = tempo; } + const std::map &GetDeferredNotes() const { return m_deferredNotes; } + ///@} + + /* + * 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; +}; + +//---------------------------------------------------------------------------- +// 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. + */ +class GenerateMIDIFunctor : public ConstFunctor { +public: + /** + * @name Constructors, destructors + */ + ///@{ + GenerateMIDIFunctor(smf::MidiFile *midiFile); + virtual ~GenerateMIDIFunctor() = default; + ///@} + + /* + * Abstract base implementation + */ + 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 + */ + ///@{ + 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: + /** + * 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: + // 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; +}; + +//---------------------------------------------------------------------------- +// 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; } + + /* + * Set the cue exclusion flag + */ + void SetCueExclusion(bool cueExclusion) { m_cueExclusion = cueExclusion; } + + /* + * 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; +}; + +//---------------------------------------------------------------------------- +// 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/include/vrv/miscfunctor.h b/include/vrv/miscfunctor.h new file mode 100644 index 00000000000..fbfe04cfc37 --- /dev/null +++ b/include/vrv/miscfunctor.h @@ -0,0 +1,207 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: miscfunctor.h +// Author: David Bauer +// Created: 2023 +// Copyright (c) Authors and others. All rights reserved. +///////////////////////////////////////////////////////////////////////////// + +#ifndef __VRV_MISCFUNCTOR_H__ +#define __VRV_MISCFUNCTOR_H__ + +#include "functor.h" + +namespace vrv { + +//---------------------------------------------------------------------------- +// ApplyPPUFactorFunctor +//---------------------------------------------------------------------------- + +/** + * This class applies the Pixel Per Unit factor of the page to its elements. + */ +class ApplyPPUFactorFunctor : public Functor { +public: + /** + * @name Constructors, destructors + */ + ///@{ + ApplyPPUFactorFunctor(); + virtual ~ApplyPPUFactorFunctor() = default; + ///@} + + /* + * Abstract base implementation + */ + bool ImplementsEndInterface() const override { return false; } + + /* + * Functor interface + */ + ///@{ + FunctorCode VisitLayerElement(LayerElement *layerElement) override; + FunctorCode VisitMeasure(Measure *measure) override; + FunctorCode VisitPage(Page *page) override; + FunctorCode VisitStaff(Staff *staff) override; + FunctorCode VisitSystem(System *system) override; + ///@} + +protected: + // +private: + // +public: + // +private: + // The current page + Page *m_page; +}; + +//---------------------------------------------------------------------------- +// GetAlignmentLeftRightFunctor +//---------------------------------------------------------------------------- + +/** + * This class retrieves the minimum left and maximum right for an alignment. + */ +class GetAlignmentLeftRightFunctor : public ConstFunctor { +public: + /** + * @name Constructors, destructors + */ + ///@{ + GetAlignmentLeftRightFunctor(); + virtual ~GetAlignmentLeftRightFunctor() = default; + ///@} + + /* + * Abstract base implementation + */ + bool ImplementsEndInterface() const override { return false; } + + /* + * Set the classes to exclude + */ + void ExcludeClasses(const std::vector &excludeClasses) { m_excludeClasses = excludeClasses; } + + /* + * Get the minimum left and maximum right + */ + ///@{ + int GetMinLeft() const { return m_minLeft; } + int GetMaxRight() const { return m_maxRight; } + ///@} + + /* + * Functor interface + */ + ///@{ + FunctorCode VisitObject(const Object *object) override; + ///@} + +protected: + // +private: + // +public: + // +private: + // The min left and right + int m_minLeft; + int m_maxRight; + // The classes which are ignored + std::vector m_excludeClasses; +}; + +//---------------------------------------------------------------------------- +// InitProcessingListsFunctor +//---------------------------------------------------------------------------- + +/** + * This class builds a tree of ints (IntTree) with the staff/layer/verse numbers. + */ +class InitProcessingListsFunctor : public ConstFunctor { +public: + /** + * @name Constructors, destructors + */ + ///@{ + InitProcessingListsFunctor(); + virtual ~InitProcessingListsFunctor() = default; + ///@} + + /* + * Abstract base implementation + */ + bool ImplementsEndInterface() const override { return false; } + + /* + * Getter for the int trees + */ + ///@{ + const IntTree &GetLayerTree() const { return m_layerTree; } + const IntTree &GetVerseTree() const { return m_verseTree; } + ///@} + + /* + * Functor interface + */ + ///@{ + FunctorCode VisitLayer(const Layer *layer) override; + FunctorCode VisitVerse(const Verse *verse) override; + ///@} + +protected: + // +private: + // +public: + // +private: + // The IntTree for staff/layer + IntTree m_layerTree; + // The IntTree for staff/layer/verse + IntTree m_verseTree; +}; + +//---------------------------------------------------------------------------- +// ReorderByXPosFunctor +//---------------------------------------------------------------------------- + +/** + * This class reorders elements by x-position. + */ +class ReorderByXPosFunctor : public Functor { +public: + /** + * @name Constructors, destructors + */ + ///@{ + ReorderByXPosFunctor(); + virtual ~ReorderByXPosFunctor() = default; + ///@} + + /* + * Abstract base implementation + */ + bool ImplementsEndInterface() const override { return false; } + + /* + * Functor interface + */ + ///@{ + FunctorCode VisitObject(Object *object) override; + ///@} + +protected: + // +private: + // +public: + // +private: + // +}; + +} // namespace vrv + +#endif // __VRV_MISCFUNCTOR_H__ diff --git a/include/vrv/mnum.h b/include/vrv/mnum.h index 6015cc0a991..a8d32b1de05 100644 --- a/include/vrv/mnum.h +++ b/include/vrv/mnum.h @@ -78,20 +78,12 @@ 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; ///@} - /** - * See Object::Save - */ - ///@{ - int Save(FunctorParams *functorParams) override; - int SaveEnd(FunctorParams *functorParams) override; - ///@} - private: /** * Flag indicating whether or not the element was generated diff --git a/include/vrv/mordent.h b/include/vrv/mordent.h index 8fae4d86424..2eaf9ddeaf2 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 { @@ -67,9 +68,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 93a7731c6b2..7fbc22712c8 100644 --- a/include/vrv/mrest.h +++ b/include/vrv/mrest.h @@ -64,17 +64,12 @@ 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; ///@} - /** - * See Object::ConvertMarkupAnalytical - */ - int ConvertMarkupAnalytical(FunctorParams *functorParams) override; - private: // public: diff --git a/include/vrv/mrpt.h b/include/vrv/mrpt.h index ecba3261a8b..f4375be3551 100644 --- a/include/vrv/mrpt.h +++ b/include/vrv/mrpt.h @@ -45,19 +45,12 @@ 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; ///@} - /** - * @name See Object::GenerateMIDI - */ - ///@{ - int GenerateMIDI(FunctorParams *functorParams) override; - ///@} - private: // public: diff --git a/include/vrv/mrpt2.h b/include/vrv/mrpt2.h index 619aac796d6..a40e4a8e99d 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 90035dbe738..39c7f34a0cf 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 7eed8bd039f..574b44f41af 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 8a97f84aa3f..4f70e23123e 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 b3d78bfc9e7..4f02ea5430b 100644 --- a/include/vrv/nc.h +++ b/include/vrv/nc.h @@ -15,6 +15,7 @@ #include "atts_analytical.h" #include "atts_neumes.h" #include "atts_shared.h" +#include "atts_visual.h" #include "durationinterface.h" #include "layerelement.h" #include "pitchinterface.h" @@ -35,6 +36,7 @@ class Nc : public LayerElement, public PitchInterface, public PositionInterface, public AttColor, + public AttCurvatureDirection, public AttIntervalMelodic, public AttNcForm { public: @@ -50,6 +52,8 @@ class Nc : public LayerElement, std::string GetClassName() const override { return "Nc"; } ///@} + bool IsSupportedChild(Object *object) override; + /** * @name Getter to interfaces */ @@ -64,9 +68,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 0b3730c9d15..9ca466cbe7d 100644 --- a/include/vrv/neume.h +++ b/include/vrv/neume.h @@ -77,6 +77,7 @@ class Neume : public LayerElement, public ObjectListInterface, public AttColor { */ bool IsSupportedChild(Object *object) override; + int GetLigatureCount(int position); bool IsLastInNeume(const LayerElement *element) const; bool GenerateChildMelodic(); @@ -92,9 +93,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 f6925d3fa17..b6b8261ac6f 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; //---------------------------------------------------------------------------- @@ -52,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, @@ -147,7 +147,7 @@ class Note : public LayerElement, Chord *IsChordTone(); const Chord *IsChordTone() const; int GetDrawingDur() const; - bool IsClusterExtreme() const; // used to find if it is the highest or lowest note in a cluster + bool IsNoteGroupExtreme() const; // used to find if it is the highest or lowest note in a note group ///@} /** @@ -172,12 +172,12 @@ class Note : public LayerElement, bool IsUnisonWith(const Note *note, bool ignoreAccid = false) const; /** - * @name Setter and getter for the chord cluster and the position of the note + * @name Setter and getter for the chord note group and the position of the note */ ///@{ - void SetCluster(ChordCluster *cluster, int position); - ChordCluster *GetCluster() { return m_cluster; } - int GetClusterPosition() const { return m_clusterPosition; } + void SetNoteGroup(ChordNoteGroup *noteGroup, int position); + ChordNoteGroup *GetNoteGroup() { return m_noteGroup; } + int GetNoteGroupPosition() const { return m_noteGroupPosition; } ///@} /** @@ -191,7 +191,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. @@ -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 // //----------// @@ -290,32 +298,12 @@ 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; ///@} - /** - * See Object::ConvertMarkupAnalytical - */ - int ConvertMarkupAnalytical(FunctorParams *functorParams) override; - - /** - * See Object::GenerateMIDI - */ - int GenerateMIDI(FunctorParams *functorParams) override; - - /** - * See Object::GenerateTimemap - */ - int GenerateTimemap(FunctorParams *functorParams) override; - - /** - * See Object::Transpose - */ - int Transpose(FunctorParams *functorParams) override; - protected: /** * The note locations w.r.t. each staff @@ -335,20 +323,6 @@ class Note : public LayerElement, */ int GetChromaticAlteration() const; - TransPitch GetTransPitch() const; - - 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: @@ -363,14 +337,14 @@ class Note : public LayerElement, bool m_flippedNotehead; /** - * flags for determining clusters in chord (cluster this belongs to) + * flags for determining note groups in chord (note group this belongs to) */ - ChordCluster *m_cluster; + ChordNoteGroup *m_noteGroup; /** - * Position in the cluster (1-indexed position in said cluster; 0 if does not have position) + * Position in the note group (1-indexed position in said note group; 0 if does not have position) */ - int m_clusterPosition; + int m_noteGroupPosition; /** * A pointer to a note with which the note shares its stem and implementing @stem.sameas. diff --git a/include/vrv/num.h b/include/vrv/num.h index a927bafec2e..abd0728d3ee 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 ab517ed3d01..1cb3f41ff41 100644 --- a/include/vrv/object.h +++ b/include/vrv/object.h @@ -32,14 +32,13 @@ class Output; class Filters; class Functor; class FunctorParams; -class MutableFunctor; +class Functor; class ConstFunctor; class LinkingInterface; class FacsimileInterface; class PitchInterface; class PositionInterface; class Resources; -class SaveParams; class ScoreDefInterface; class StemmedDrawingInterface; class TextDirInterface; @@ -621,9 +620,8 @@ class Object : public BoundingBox { /** * Saves the object (and its children) using the specified output stream. - * Creates functors that will parse the tree. */ - int SaveObject(SaveParams &saveParams); + void SaveObject(Output *output, bool basic); /** * Sort the child elements using std::stable_sort @@ -633,28 +631,22 @@ class Object : public BoundingBox { std::stable_sort(m_children.begin(), m_children.end(), comp); } - virtual void ReorderByXPos(); + void ReorderByXPos(); 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(Functor &functor, int deepness = UNLIMITED_DEPTH, bool skipFirst = false); void Process(ConstFunctor &functor, int deepness = UNLIMITED_DEPTH, bool skipFirst = false) const; ///@} @@ -662,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; ///@} @@ -685,190 +677,6 @@ class Object : public BoundingBox { */ static bool IsPreOrdered(const Object *left, const Object *right); - //----------// - // Functors // - //----------// - - /** - * Add each LayerElements and its children to a flat list - */ - virtual int AddLayerElementToFlatList(FunctorParams *functorParams) const; - - /** - * Builds a tree of ints (IntTree) with the staff/layer/verse numbers and for staff/layer to be then processed. - */ - virtual int InitProcessingLists(FunctorParams *) { return FUNCTOR_CONTINUE; } - - /** - * @name Functors for finding objects - */ - ///@{ - - /** - * Retrieve the minimum left and maximum right for an alignment. - * Used in GraceAligner::GetGraceGroupLeft and GraceAligner::GetGraceGroupRight. - */ - virtual int GetAlignmentLeftRight(FunctorParams *functorParams) const; - - ///@} - - /** - * @name Functors for loading and saving the document - */ - ///@{ - - /** - * Convert top-level all container (section, endings) and editorial elements to milestone elements. - */ - virtual int ConvertToPageBased(FunctorParams *) { return FUNCTOR_CONTINUE; } - - /** - * End Functor for Object::ConvertToPageBased - */ - virtual int ConvertToPageBasedEnd(FunctorParams *) { return FUNCTOR_CONTINUE; } - - /** - * Convert mensural MEI into cast-off (measure) segments looking at the barLine objects. - * Segment positions occur where a barLine is set on all staves. - */ - virtual int ConvertToCastOffMensural(FunctorParams *functorParams); - - /** - * Convert cast-off (measure) mensural segments MEI into mensural. - */ - virtual int ConvertToUnCastOffMensural(FunctorParams *) { return FUNCTOR_CONTINUE; } - - /** - * Convert analytical markup (\@fermata, \@tie) to elements. - * See Doc::ConvertMarkupAnalyticalDoc - */ - virtual int ConvertMarkupAnalytical(FunctorParams *) { return FUNCTOR_CONTINUE; } - - /** - * End Functor for Object::ConvertMarkupAnalytical - */ - virtual int ConvertMarkupAnalyticalEnd(FunctorParams *) { return FUNCTOR_CONTINUE; } - - /** - * Convert markup of artic@artic multi value into distinct artic elements. - * See Doc::ConvertMarkupAnalyticalDoc - */ - virtual int ConvertMarkupArtic(FunctorParams *) { return FUNCTOR_CONTINUE; } - - /** - * End Functor for Object::ConvertMarkupArtic - */ - virtual int ConvertMarkupArticEnd(FunctorParams *) { return FUNCTOR_CONTINUE; } - - /** - * Move scoreDef clef, keySig, meterSig and mensur to staffDef. - * When a staffDef already has one, it is not replaced. - */ - virtual int ConvertMarkupScoreDef(FunctorParams *) { return FUNCTOR_CONTINUE; } - - /** - * End Functor for Object::ConvertMarkupScoreDef - */ - virtual int ConvertMarkupScoreDefEnd(FunctorParams *) { return FUNCTOR_CONTINUE; } - - /** - * Save the content of any object by calling the appropriate FileOutputStream method. - */ - virtual int Save(FunctorParams *functorParams); - - /** - * End Functor for Object::Save - */ - virtual int SaveEnd(FunctorParams *functorParams); - - ///@} - - /** - * @name Functors for aligning the pages. - */ - ///@{ - - /** - * Apply the Pixel Per Unit factor of the page to its elements. - */ - virtual int ApplyPPUFactor(FunctorParams *) { return FUNCTOR_CONTINUE; } - - ///@} - - /** - * @name Functors for generating MIDI output. - */ - ///@{ - - /** - * 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. - */ - 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 - */ - virtual int InitTimemapTies(FunctorParams *) { return FUNCTOR_CONTINUE; } - - /** - * 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 - */ - 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. - */ - virtual int GenerateTimemap(FunctorParams *) { return FUNCTOR_CONTINUE; } - - /** - * Export the object to a JSON feature file. - */ - virtual int GenerateFeatures(FunctorParams *functorParams); - - ///@} - - /** - * Reorder elements by x-position. - */ - virtual int ReorderByXPos(FunctorParams *); - - /** - * 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. @@ -884,7 +692,6 @@ class Object : public BoundingBox { * Helper methods for functor processing */ ///@{ - void UpdateDocumentScore(bool direction); bool SkipChildren(bool visibleOnly) const; bool FiltersApply(const Filters *filters, Object *object) const; ///@} @@ -1001,6 +808,7 @@ class Object : public BoundingBox { * children LayerElement for processing. * The list is a flatten list of pointers to children elements. * It is not an abstract class but should not be instanciated directly. + * It is expected to be used as a base class of element classes derived from Object. */ class ObjectListInterface { public: @@ -1008,7 +816,7 @@ class ObjectListInterface { ObjectListInterface(){}; virtual ~ObjectListInterface(){}; ObjectListInterface(const ObjectListInterface &listInterface); // copy constructor; - ObjectListInterface &operator=(const ObjectListInterface &listInterface); // copy assignement; + ObjectListInterface &operator=(const ObjectListInterface &listInterface); // copy assignment; /** * Look for the Object in the list and return its position (-1 if not found) @@ -1045,29 +853,30 @@ class ObjectListInterface { * Return the list. * Before returning the list, it checks that the list is up-to-date with Object::IsModified * If not, it updates the list and also calls FilterList. - * Because this is an interface, we need to pass the object - not the best design. */ ///@{ - const ListOfConstObjects &GetList(const Object *node) const; - ListOfObjects GetList(const Object *node); + const ListOfConstObjects &GetList() const; + ListOfObjects GetList(); ///@} + /** + * Reset the list of children and call FilterList(). + */ + void ResetList() const; + /** * Convenience functions that check if the list is up-to-date * If not, the list is updated before returning the result */ ///@{ - bool HasEmptyList(const Object *node) const; - int GetListSize(const Object *node) const; - const Object *GetListFront(const Object *node) const; - Object *GetListFront(const Object *node); - const Object *GetListBack(const Object *node) const; - Object *GetListBack(const Object *node); + bool HasEmptyList() const; + int GetListSize() const; + const Object *GetListFront() const; + Object *GetListFront(); + const Object *GetListBack() const; + Object *GetListBack(); ///@} -private: - mutable ListOfConstObjects m_list; - protected: /** * Filter the list for a specific class. @@ -1075,12 +884,19 @@ class ObjectListInterface { */ virtual void FilterList(ListOfConstObjects &childList) const {}; -public: +private: /** - * Reset the list of children and call FilterList(). - * As for GetList, we need to pass the object. + * Retrieve the owner object of the interface. */ - void ResetList(const Object *node) const; + const Object *GetInterfaceOwner() const; + +public: + // +private: + // The flat list of children + mutable ListOfConstObjects m_list; + // The owner object + mutable const Object *m_owner = NULL; }; //---------------------------------------------------------------------------- @@ -1102,12 +918,12 @@ class TextListInterface : public ObjectListInterface { /** * Returns a contatenated version of all the text children */ - std::u32string GetText(const Object *node) const; + std::u32string GetText() const; /** * Fill an array of lines with concatenated content of each line */ - void GetTextLines(const Object *node, std::vector &lines) const; + void GetTextLines(std::vector &lines) const; protected: /** @@ -1120,46 +936,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/include/vrv/octave.h b/include/vrv/octave.h index f199c1cc11e..c9f59f76519 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/options.h b/include/vrv/options.h index 75686be529c..7e4a351d223 100644 --- a/include/vrv/options.h +++ b/include/vrv/options.h @@ -631,6 +631,7 @@ class Options { OptionDbl m_minLastJustification; OptionBool m_mmOutput; OptionBool m_moveScoreDefinitionToStaff; + OptionBool m_neumeAsNote; OptionBool m_noJustification; OptionBool m_openControlEvents; OptionBool m_outputFormatRaw; @@ -742,6 +743,7 @@ class Options { OptionDbl m_tieEndpointThickness; OptionDbl m_tieMidpointThickness; OptionDbl m_tieMinLength; + OptionBool m_tupletAngledOnBeams; OptionDbl m_tupletBracketThickness; OptionBool m_tupletNumHead; diff --git a/include/vrv/ornam.h b/include/vrv/ornam.h index 66bc65dbf1b..25950ab63b3 100644 --- a/include/vrv/ornam.h +++ b/include/vrv/ornam.h @@ -22,14 +22,13 @@ namespace vrv { //---------------------------------------------------------------------------- /** - * This class models the MEI element. + * This class models the MEI element. */ class Ornam : public ControlElement, public TextListInterface, public TextDirInterface, public TimePointInterface, public AttColor, - public AttExtSym, public AttOrnamentAccid { public: /** @@ -63,11 +62,6 @@ class Ornam : public ControlElement, */ bool IsSupportedChild(Object *object) override; - /** - * Get the SMuFL glyph for the ornam based glyph.num - */ - char32_t GetOrnamGlyph() const; - //----------// // Functors // //----------// @@ -76,9 +70,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 3d3c8397719..f1751100c99 100644 --- a/include/vrv/page.h +++ b/include/vrv/page.h @@ -14,7 +14,6 @@ namespace vrv { class DeviceContext; -class InitProcessingListsParams; class RunningElement; class Score; class Staff; @@ -49,11 +48,6 @@ class Page : public Object { bool IsSupportedChild(Object *object) override; ///@} - /** - * Return the number of system (children are System object only) - */ - int GetSystemCount() const { return (int)GetChildren().size(); } - /** * @name Get and set the pixel per unit factor. */ @@ -159,22 +153,17 @@ 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; ///@} - /** - * Apply the Pixel Per Unit factor of the page to its elements. - */ - int ApplyPPUFactor(FunctorParams *functorParams) override; - private: /** * Adjust the horizontal position of the syl processing verse by verse */ - void AdjustSylSpacingByVerse(InitProcessingListsParams &listsParams, Doc *doc); + void AdjustSylSpacingByVerse(const IntTree &verseTree, Doc *doc); /** * Check whether vertical justification is required for the current page diff --git a/include/vrv/pageelement.h b/include/vrv/pageelement.h index f910a445b97..e4b2abb7fc6 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 b9278cda5ca..0a339ba7128 100644 --- a/include/vrv/pagemilestone.h +++ b/include/vrv/pagemilestone.h @@ -53,17 +53,12 @@ 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; ///@} - /** - * See Object::Transpose - */ - int Transpose(FunctorParams *functorParams) override; - protected: // private: diff --git a/include/vrv/pages.h b/include/vrv/pages.h index 38822ebb677..6b87e690d03 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 6b764bbc47e..92cecf39fd6 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 c5ae684fce8..36b521be3a7 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, @@ -87,17 +88,12 @@ 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; ///@} - /** - * See Object::GenerateMIDI - */ - int GenerateMIDI(FunctorParams *functorParams) override; - private: /** * Flag indicating if following pedal mark is a bounce diff --git a/include/vrv/pgfoot.h b/include/vrv/pgfoot.h index 88bdedf0ce8..124536d5b7f 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 deleted file mode 100644 index 819de3e6ee5..00000000000 --- a/include/vrv/pgfoot2.h +++ /dev/null @@ -1,64 +0,0 @@ -///////////////////////////////////////////////////////////////////////////// -// Name: pgfoot2.h -// Author: Laurent Pugin -// Created: 2017 -// Copyright (c) Authors and others. All rights reserved. -///////////////////////////////////////////////////////////////////////////// - -#ifndef __VRV_PGFOOT2_H__ -#define __VRV_PGFOOT2_H__ - -#include "runningelement.h" - -namespace vrv { - -//---------------------------------------------------------------------------- -// PgFoot2 -//---------------------------------------------------------------------------- - -/** - * This class represents an MEI pgFoot2. - */ -class PgFoot2 : public RunningElement { -public: - /** - * @name Constructors, destructors, and other standard methods - * Reset method resets all attribute classes - */ - ///@{ - PgFoot2(); - virtual ~PgFoot2(); - void Reset() override; - std::string GetClassName() const override { return "PgFoot2"; } - ///@} - - /** - * Overriden to get the appropriate margin - */ - int GetTotalHeight(const Doc *doc) const override; - - //----------// - // Functors // - //----------// - - /** - * Interface for class functor visitation - */ - ///@{ - FunctorCode Accept(MutableFunctor &functor) override; - FunctorCode Accept(ConstFunctor &functor) const override; - FunctorCode AcceptEnd(MutableFunctor &functor) override; - FunctorCode AcceptEnd(ConstFunctor &functor) const override; - ///@} - -private: - // -public: - // -private: - // -}; - -} // namespace vrv - -#endif diff --git a/include/vrv/pghead.h b/include/vrv/pghead.h index 312d03c7659..8e450d8103f 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 deleted file mode 100644 index 7d0f8277cef..00000000000 --- a/include/vrv/pghead2.h +++ /dev/null @@ -1,64 +0,0 @@ -///////////////////////////////////////////////////////////////////////////// -// Name: pghead2.h -// Author: Laurent Pugin -// Created: 2017 -// Copyright (c) Authors and others. All rights reserved. -///////////////////////////////////////////////////////////////////////////// - -#ifndef __VRV_PGHEAD2_H__ -#define __VRV_PGHEAD2_H__ - -#include "runningelement.h" - -namespace vrv { - -//---------------------------------------------------------------------------- -// PgHead2 -//---------------------------------------------------------------------------- - -/** - * This class represents an MEI pgHead2. - */ -class PgHead2 : public RunningElement { -public: - /** - * @name Constructors, destructors, and other standard methods - * Reset method resets all attribute classes - */ - ///@{ - PgHead2(); - virtual ~PgHead2(); - void Reset() override; - std::string GetClassName() const override { return "PgHead2"; } - ///@} - - /** - * Overriden to get the appropriate margin - */ - int GetTotalHeight(const Doc *doc) const override; - - //----------// - // Functors // - //----------// - - /** - * Interface for class functor visitation - */ - ///@{ - FunctorCode Accept(MutableFunctor &functor) override; - FunctorCode Accept(ConstFunctor &functor) const override; - FunctorCode AcceptEnd(MutableFunctor &functor) override; - FunctorCode AcceptEnd(ConstFunctor &functor) const override; - ///@} - -private: - // -public: - // -private: - // -}; - -} // namespace vrv - -#endif diff --git a/include/vrv/phrase.h b/include/vrv/phrase.h index 53fc3cf088a..5ccbd59f469 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 6491315cc8e..252f0da9bdc 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/pitchinterface.h b/include/vrv/pitchinterface.h index ed9d397659a..15226365474 100644 --- a/include/vrv/pitchinterface.h +++ b/include/vrv/pitchinterface.h @@ -25,7 +25,7 @@ class Layer; * This class is an interface for elements with pitch, such as notes and neumes. * It is not an abstract class but should not be instanciated directly. */ -class PitchInterface : public Interface, public AttNoteGes, public AttOctave, public AttPitch { +class PitchInterface : public Interface, public AttNoteGes, public AttOctave, public AttPitch, public AttPitchGes { public: /** * @name Constructors, destructors, reset methods diff --git a/include/vrv/plica.h b/include/vrv/plica.h index 7eab5686b15..cc39b69a570 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 74dc17f4471..412ef9f3918 100644 --- a/include/vrv/preparedatafunctor.h +++ b/include/vrv/preparedatafunctor.h @@ -42,11 +42,13 @@ class PrepareDataInitializationFunctor : public DocFunctor { * Functor interface */ ///@{ + FunctorCode VisitDiv(Div *div) override; FunctorCode VisitChord(Chord *chord) override; FunctorCode VisitFloatingObject(FloatingObject *floatingObject) override; FunctorCode VisitKeySig(KeySig *keySig) override; - FunctorCode VisitRunningElement(RunningElement *runningElement) override; + FunctorCode VisitRepeatMark(RepeatMark *repeatMark) override; FunctorCode VisitScore(Score *score) override; + FunctorCode VisitTextLayoutElement(TextLayoutElement *textLayoutElement) override; ///@} protected: @@ -66,7 +68,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 +107,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 +153,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 +198,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 +245,7 @@ class PrepareFacsimileFunctor : public MutableFunctor { /** * This class matches linking elements (e.g, @next). */ -class PrepareLinkingFunctor : public MutableFunctor { +class PrepareLinkingFunctor : public Functor, public CollectAndProcess { public: /** * @name Constructors, destructors @@ -258,14 +260,6 @@ class PrepareLinkingFunctor : public MutableFunctor { */ 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 +304,6 @@ class PrepareLinkingFunctor : public MutableFunctor { 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; }; //---------------------------------------------------------------------------- @@ -321,7 +313,7 @@ class PrepareLinkingFunctor : public MutableFunctor { /** * This class matches elements of @plist. */ -class PreparePlistFunctor : public MutableFunctor { +class PreparePlistFunctor : public Functor, public CollectAndProcess { public: /** * @name Constructors, destructors @@ -337,20 +329,11 @@ class PreparePlistFunctor : public MutableFunctor { 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 + * Getter and modifier for the interface / id pairs */ ///@{ - const ArrayOfPlistInterfaceIDTuples &GetInterfaceIDTuples() const { return m_interfaceIDTuples; } - void InsertInterfaceIDTuple(const std::string &elementID, PlistInterface *interface); - void ClearInterfaceIDTuples() { m_interfaceIDTuples.clear(); } + const ArrayOfPlistInterfaceIDPairs &GetInterfaceIDPairs() const { return m_interfaceIDPairs; } + void InsertInterfaceIDPair(const std::string &elementID, PlistInterface *interface); ///@} /* @@ -367,10 +350,8 @@ class PreparePlistFunctor : public MutableFunctor { public: // private: - // Holds the interface / id tuples to match - ArrayOfPlistInterfaceIDTuples m_interfaceIDTuples; - // Indicates the current mode: fill vs process - bool m_fillMode; + // Holds the interface / id pairs to match + ArrayOfPlistInterfaceIDPairs m_interfaceIDPairs; }; //---------------------------------------------------------------------------- @@ -380,7 +361,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 +406,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 +458,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 CollectAndProcess { public: /** * @name Constructors, destructors @@ -492,14 +473,6 @@ class PrepareTimeSpanningFunctor : public MutableFunctor { */ 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 */ @@ -527,8 +500,6 @@ class PrepareTimeSpanningFunctor : public MutableFunctor { private: // The interface list that holds the current elements to match ListOfSpanningInterOwnerPairs m_timeSpanningInterfaces; - // Indicates the current mode: fill vs process - bool m_fillMode; }; //---------------------------------------------------------------------------- @@ -540,7 +511,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 @@ -587,6 +558,47 @@ class PrepareTimestampsFunctor : public MutableFunctor { ListOfObjectBeatPairs m_tstamps; }; +//---------------------------------------------------------------------------- +// PreparePedalsFunctor +//---------------------------------------------------------------------------- + +/** + * This class matches down and up pedal lines. + */ +class PreparePedalsFunctor : public DocFunctor { +public: + /** + * @name Constructors, destructors + */ + ///@{ + PreparePedalsFunctor(Doc *doc); + virtual ~PreparePedalsFunctor() = default; + ///@} + + /* + * Abstract base implementation + */ + bool ImplementsEndInterface() const override { return true; } + + /* + * Functor interface + */ + ///@{ + FunctorCode VisitMeasureEnd(Measure *measure) override; + FunctorCode VisitPedal(Pedal *pedal) override; + ///@} + +protected: + // +private: + // +public: + // +private: + // The current pedals to be linked / grouped + std::list m_pedalLines; +}; + //---------------------------------------------------------------------------- // PreparePointersByLayerFunctor //---------------------------------------------------------------------------- @@ -595,7 +607,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 @@ -608,7 +620,7 @@ class PreparePointersByLayerFunctor : public MutableFunctor { /* * Abstract base implementation */ - bool ImplementsEndInterface() const override { return false; } + bool ImplementsEndInterface() const override { return true; } /* * Functor interface @@ -616,6 +628,7 @@ class PreparePointersByLayerFunctor : public MutableFunctor { ///@{ FunctorCode VisitDot(Dot *dot) override; FunctorCode VisitLayerElement(LayerElement *layerElement) override; + FunctorCode VisitMeasureEnd(Measure *measure) override; ///@} protected: @@ -640,7 +653,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 +700,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 @@ -716,7 +729,13 @@ class PrepareLayerElementPartsFunctor : public MutableFunctor { protected: // private: - // + // Create stem if it does not exist + Stem *EnsureStemExists(Stem *stem, Object *parent) const; + // Create dots if they should exist, otherwise remove them + Dots *ProcessDots(Dots *dots, Object *parent, bool shouldExist) const; + // Create flag if it should exist, otherwise remove it + Flag *ProcessFlag(Flag *flag, Object *parent, bool shouldExist) const; + public: // private: @@ -776,7 +795,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 CollectAndProcess { public: /** * @name Constructors, destructors @@ -791,14 +810,6 @@ class PrepareDelayedTurnsFunctor : public MutableFunctor { */ 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 */ @@ -832,8 +843,6 @@ class PrepareDelayedTurnsFunctor : public MutableFunctor { 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; }; //---------------------------------------------------------------------------- @@ -843,7 +852,7 @@ class PrepareDelayedTurnsFunctor : public MutableFunctor { /** * This class sets the Measure of Ending. */ -class PrepareMilestonesFunctor : public MutableFunctor { +class PrepareMilestonesFunctor : public Functor { public: /** * @name Constructors, destructors @@ -900,13 +909,13 @@ class PrepareMilestonesFunctor : public MutableFunctor { * This class groups FloatingObjects by drawingGrpId. * Also chains the Dynam and Hairpin. */ -class PrepareFloatingGrpsFunctor : public DocFunctor { +class PrepareFloatingGrpsFunctor : public Functor { public: /** * @name Constructors, destructors */ ///@{ - PrepareFloatingGrpsFunctor(Doc *doc); + PrepareFloatingGrpsFunctor(); virtual ~PrepareFloatingGrpsFunctor() = default; ///@} @@ -945,8 +954,6 @@ class PrepareFloatingGrpsFunctor : public DocFunctor { std::vector m_hairpins; // The map of existing harms (based on @n) std::map m_harms; - // The current pedals to be linked / grouped - std::list m_pedalLines; }; //---------------------------------------------------------------------------- @@ -958,7 +965,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 +1017,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 +1057,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 268a2c11570..ad3db4c2f2b 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 3cb238b62cd..51f837a32fb 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 b980e4fadb4..a2cb201e818 100644 --- a/include/vrv/rend.h +++ b/include/vrv/rend.h @@ -9,6 +9,7 @@ #define __VRV_REND_H__ #include "areaposinterface.h" +#include "atts_externalsymbols.h" #include "atts_shared.h" #include "textelement.h" @@ -24,7 +25,9 @@ namespace vrv { class Rend : public TextElement, public AreaPosInterface, public AttColor, + public AttExtSymAuth, public AttLang, + public AttNNumberLike, public AttTextRendition, public AttTypography, public AttWhitespace { @@ -58,6 +61,11 @@ class Rend : public TextElement, */ bool IsSupportedChild(Object *object) override; + /** + * Check if rend has an enclosing. + */ + bool HasEnclosure() const; + //----------// // Functors // //----------// @@ -66,9 +74,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/repeatmark.h b/include/vrv/repeatmark.h new file mode 100644 index 00000000000..87e3cadd8dc --- /dev/null +++ b/include/vrv/repeatmark.h @@ -0,0 +1,97 @@ +///////////////////////////////////////////////////////////////////////////// +// 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 AttRepeatMarkLog { +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/resetfunctor.h b/include/vrv/resetfunctor.h index 9a71fb3d22d..2e681f1d877 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 @@ -42,9 +42,11 @@ class ResetDataFunctor : public MutableFunctor { 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; + FunctorCode VisitDiv(Div *div) override; FunctorCode VisitDot(Dot *dot) override; FunctorCode VisitDots(Dots *dots) override; FunctorCode VisitEditorialElement(EditorialElement *editorialElement) override; @@ -60,6 +62,7 @@ class ResetDataFunctor : public MutableFunctor { 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; @@ -90,7 +93,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 @@ -114,6 +117,7 @@ class ResetHorizontalAlignmentFunctor : public MutableFunctor { FunctorCode VisitBeam(Beam *beam) override; FunctorCode VisitBeamSpan(BeamSpan *beamSpan) override; FunctorCode VisitCustos(Custos *custos) override; + FunctorCode VisitDiv(Div *div) override; FunctorCode VisitDot(Dot *dot) override; FunctorCode VisitDots(Dots *dots) override; FunctorCode VisitFloatingObject(FloatingObject *floatingObject) override; @@ -147,7 +151,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 f22cbb5c2ca..b737eebc0d7 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: /** @@ -91,6 +92,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 // //----------// @@ -99,38 +105,18 @@ 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; ///@} - /** - * See Object::ConvertMarkupAnalytical - */ - int ConvertMarkupAnalytical(FunctorParams *functorParams) override; - - /** - * See Object::Transpose - */ - 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 - */ - void UpdateFromTransLoc(const TransPitch &tp); - /** * Get the rest vertical location relative to location of elements placed on other layers */ std::pair GetLocationRelativeToOtherLayers( - const ListOfConstObjects &layersList, const Layer *currentLayer, bool isTopLayer, bool &restOverlap) const; + const Layer *currentLayer, bool isTopLayer, bool &restOverlap) const; /** * Get the rest vertical location relative to location of elements placed on current layers @@ -160,6 +146,12 @@ class Rest : public LayerElement, int GetRestOffsetFromOptions( RestLayer layer, const std::pair &location, bool isTopLayer) const; + /** + * Find whether there is correct number of rests for automatic placement and determine position of the rest + * (top/bottom) if there is. + */ + bool DetermineRestPosition(const Staff *staff, const Layer *layer, bool &isTopLayer) const; + public: // private: diff --git a/include/vrv/runningelement.h b/include/vrv/runningelement.h index 303785d2dea..a561c64cee0 100644 --- a/include/vrv/runningelement.h +++ b/include/vrv/runningelement.h @@ -9,7 +9,7 @@ #define __VRV_RUNNING_ELEMENT_H__ #include "atts_shared.h" -#include "object.h" +#include "textlayoutelement.h" namespace vrv { @@ -25,15 +25,15 @@ class TextElement; * This class represents running elements (headers and footers). * It is not an abstract class but should not be instanciated directly. */ -class RunningElement : public Object, public ObjectListInterface, public AttHorizontalAlign, public AttTyped { +class RunningElement : public TextLayoutElement, public AttFormework { public: /** * @name Constructors, destructors, reset methods * Reset method resets all attribute classes */ ///@{ - RunningElement(); - RunningElement(ClassId classId); + // RunningElement(); + // RunningElement(ClassId classId); RunningElement(ClassId classId, const std::string &classIdStr); virtual ~RunningElement(); void Reset() override; @@ -45,13 +45,6 @@ class RunningElement : public Object, public ObjectListInterface, public AttHori */ Object *Clone() const override { return NULL; } - /** - * @name Methods for adding allowed content - */ - ///@{ - bool IsSupportedChild(Object *object) override; - ///@} - /** * @name Setter and getter of the generated flag */ @@ -68,7 +61,7 @@ class RunningElement : public Object, public ObjectListInterface, public AttHori int GetDrawingY() const override; ///@} - int GetWidth() const; + int GetTotalWidth(const Doc *doc) const override; /* * @name Setter and getter for the current drawing page @@ -87,49 +80,6 @@ class RunningElement : public Object, public ObjectListInterface, public AttHori virtual void SetDrawingYRel(int drawingYRel); ///@} - /** - * @name Setter and getter for the text element cells - */ - ///@{ - void ResetCells(); - void AppendTextToCell(int index, TextElement *text); - ///@} - - /** - * @name Setter and getter for the drawing scaling - */ - ///@{ - void ResetDrawingScaling(); - ///@} - - /** - * @name Get the size of row, cols or cells - */ - ///@{ - /** Height including margins */ - virtual int GetTotalHeight(const Doc *doc) const = 0; - /** Content height */ - int GetContentHeight() const; - /** Row from 0 to 2 */ - int GetRowHeight(int row) const; - /** Col from 0 to 2 */ - int GetColHeight(int col) const; - /** Row from 0 to 8 */ - int GetCellHeight(int cell) const; - ///@} - - /** - * Scale the content of the running element. - * Currently unused. - */ - bool AdjustDrawingScaling(int width); - - /** - * Adjust the postition of the content of the running element. - * First adjust the content of each cell, and then the cells themselves. - */ - bool AdjustRunningElementYPos(); - /** * Set the current page number by looking for a # element. */ @@ -140,11 +90,6 @@ class RunningElement : public Object, public ObjectListInterface, public AttHori */ void LoadFooter(const Doc *doc); - /** - * Calculate the cell position - */ - int GetAlignmentPos(data_HORIZONTALALIGNMENT h, data_VERTICALALIGNMENT v) const; - /** * Add page numbering to the running element. */ @@ -158,27 +103,12 @@ 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; ///@} - /** - * See Object::Save - */ - ///@{ - int Save(FunctorParams *functorParams) override; - int SaveEnd(FunctorParams *functorParams) override; - ///@} - -protected: - /** - * Filter the list for a specific class. - * Keep only the top and - */ - void FilterList(ListOfConstObjects &childList) const override; - private: // @@ -195,21 +125,10 @@ class RunningElement : public Object, public ObjectListInterface, public AttHori */ int m_drawingYRel; - /** - * Stored the top or with the 9 possible positioning combinations, from - * top-left to bottom-right (going left to right first) - */ - ArrayOfTextElements m_cells[9]; - /** * Flag indicating whether or not the element was generated */ bool m_isGenerated; - - /** - * - */ - int m_drawingScalingPercent[3]; }; } // namespace vrv diff --git a/include/vrv/savefunctor.h b/include/vrv/savefunctor.h new file mode 100644 index 00000000000..b18c5e89bc0 --- /dev/null +++ b/include/vrv/savefunctor.h @@ -0,0 +1,80 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: savefunctor.h +// Author: David Bauer +// Created: 2023 +// Copyright (c) Authors and others. All rights reserved. +///////////////////////////////////////////////////////////////////////////// + +#ifndef __VRV_SAVEFUNCTOR_H__ +#define __VRV_SAVEFUNCTOR_H__ + +#include "functor.h" + +namespace vrv { + +//---------------------------------------------------------------------------- +// SaveFunctor +//---------------------------------------------------------------------------- + +/** + * This class saves the content of any object by calling the appropriate FileOutputStream method. + */ +class SaveFunctor : public Functor { +public: + /** + * @name Constructors, destructors + */ + ///@{ + SaveFunctor(Output *output, bool basic); + virtual ~SaveFunctor() = default; + ///@} + + /* + * Abstract base implementation + */ + bool ImplementsEndInterface() const override { return true; } + + /* + * Functor interface + */ + ///@{ + FunctorCode VisitDots(Dots *dots) override; + FunctorCode VisitDotsEnd(Dots *dots) override; + FunctorCode VisitEditorialElement(EditorialElement *editorialElement) override; + FunctorCode VisitEditorialElementEnd(EditorialElement *editorialElement) override; + FunctorCode VisitFlag(Flag *flag) override; + FunctorCode VisitFlagEnd(Flag *flag) override; + FunctorCode VisitMdiv(Mdiv *mdiv) override; + FunctorCode VisitMdivEnd(Mdiv *mdiv) override; + FunctorCode VisitMeasure(Measure *measure) override; + FunctorCode VisitMeasureEnd(Measure *measure) override; + FunctorCode VisitMNum(MNum *mNum) override; + FunctorCode VisitMNumEnd(MNum *mNum) override; + FunctorCode VisitObject(Object *object) override; + 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; + FunctorCode VisitTupletNumEnd(TupletNum *tupletNum) override; + ///@} + +protected: + // +private: + // +public: + // +private: + // The output stream + Output *m_output; + // Indicates MEI basic output i.e. filtering out editorial markup + bool m_basic; +}; + +} // namespace vrv + +#endif // __VRV_SAVEFUNCTOR_H__ diff --git a/include/vrv/sb.h b/include/vrv/sb.h index 8b16735b69e..83d4812dd7a 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 7cf00708a0c..975909c70b9 100644 --- a/include/vrv/score.h +++ b/include/vrv/score.h @@ -56,12 +56,6 @@ class Score : public PageElement, public PageMilestoneInterface, public AttLabel const ScoreDef *GetScoreDef() const { return &m_scoreDef; } ///@} - /** - * Helper looking at the parent Doc and set its scoreDef as current one. - * Called from Object::Process - */ - void SetAsCurrent(); - /** * Calculate the height of the pgHead/pgHead2 and pgFoot/pgFoot2 (if any) * Requires the Doc to have an empty Pages object because it adds temporary pages @@ -82,30 +76,12 @@ 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; ///@} - /** - * See Object::ConvertToPageBased - */ - ///@{ - int ConvertToPageBased(FunctorParams *functorParams) override; - int ConvertToPageBasedEnd(FunctorParams *functorParams) override; - ///@} - - /** - * See Object::ConvertMarkupScoreDef - */ - int ConvertMarkupScoreDef(FunctorParams *) 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 0a22d96d0d5..a0ff8e9863c 100644 --- a/include/vrv/scoredef.h +++ b/include/vrv/scoredef.h @@ -23,9 +23,7 @@ class Mensur; class MeterSig; class MeterSigGrp; class PgFoot; -class PgFoot2; class PgHead; -class PgHead2; class StaffGrp; class StaffDef; @@ -107,22 +105,12 @@ 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; ///@} - /** - * See Object::ConvertMarkupScoreDef - */ - int ConvertMarkupScoreDef(FunctorParams *) override; - - /** - * See Object::ConvertMarkupScoreDef - */ - int ConvertMarkupScoreDefEnd(FunctorParams *) override; - private: // public: @@ -217,7 +205,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); @@ -250,14 +237,10 @@ class ScoreDef : public ScoreDefElement, * @name Getters for running elements */ ///@{ - PgFoot *GetPgFoot(); - const PgFoot *GetPgFoot() const; - PgFoot2 *GetPgFoot2(); - const PgFoot2 *GetPgFoot2() const; - PgHead *GetPgHead(); - const PgHead *GetPgHead() const; - PgHead2 *GetPgHead2(); - const PgHead2 *GetPgHead2() const; + PgFoot *GetPgFoot(data_PGFUNC func); + const PgFoot *GetPgFoot(data_PGFUNC func) const; + PgHead *GetPgHead(data_PGFUNC func); + const PgHead *GetPgHead(data_PGFUNC func) const; ///@} /** @@ -280,40 +263,12 @@ 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; ///@} - /** - * See Object::ConvertToPageBased - */ - int ConvertToPageBased(FunctorParams *functorParams) override; - - /** - * See Object::ConvertToCastOffMensural - */ - int ConvertToCastOffMensural(FunctorParams *functorParams) override; - - /** - * See Object::CalcMaxMeasureDuration - */ - int InitMaxMeasureDuration(FunctorParams *functorParams) override; - - /** - * See Object::GenerateMIDI - */ - int GenerateMIDI(FunctorParams *functorParams) 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/section.h b/include/vrv/section.h index a1951e7e63b..0eed82735f7 100644 --- a/include/vrv/section.h +++ b/include/vrv/section.h @@ -52,25 +52,12 @@ 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; ///@} - /** - * See Object::ConvertToPageBased - */ - ///@{ - int ConvertToPageBased(FunctorParams *functorParams) override; - int ConvertToPageBasedEnd(FunctorParams *functorParams) override; - ///@} - - /** - * See Object::ConvertToUnCastOffMensural - */ - int ConvertToUnCastOffMensural(FunctorParams *functorParams) override; - private: // public: diff --git a/include/vrv/setscoredeffunctor.h b/include/vrv/setscoredeffunctor.h index c963a95697d..5d4d417c455 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 @@ -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: @@ -219,7 +230,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 +272,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 +312,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 +369,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 af1791eacae..15fb1174a3c 100644 --- a/include/vrv/slur.h +++ b/include/vrv/slur.h @@ -42,32 +42,6 @@ struct NearEndCollision { bool endPointsAdjusted; }; -//---------------------------------------------------------------------------- -// ControlPointConstraint -//---------------------------------------------------------------------------- -/** - * This represents a constraint ax + by >= c where x and y are - * vertical control point adjustments - */ -struct ControlPointConstraint { - double a; - double b; - double c; -}; - -//---------------------------------------------------------------------------- -// ControlPointAdjustment -//---------------------------------------------------------------------------- -/** - * A vertical adjustment of bezier control points - */ -struct ControlPointAdjustment { - int leftShift; - int rightShift; - bool moveUpwards; - int requestedStaffSpace; -}; - // Helper enum classes enum class SlurCurveDirection { None, Above, Below, AboveBelow, BelowAbove }; enum class PortatoSlurType { None, StemSide, Centered }; @@ -80,8 +54,8 @@ class Slur : public ControlElement, public TimeSpanningInterface, public AttColor, public AttCurvature, - public AttCurveRend, - public AttLayerIdent { + public AttLayerIdent, + public AttLineRendBase { public: /** * @name Constructors, destructors, reset and class name methods @@ -195,18 +169,6 @@ class Slur : public ControlElement, */ void InitBezierControlSides(BezierCurve &bezier, curvature_CURVEDIR curveDir) const; - /** - * Slur adjustment - */ - ///@{ - void AdjustSlur(const Doc *doc, FloatingCurvePositioner *curve, int unit); - - void AdjustOuterSlur( - const Doc *doc, FloatingCurvePositioner *curve, const ArrayOfFloatingCurvePositioners &innerCurves, int unit); - - float GetAdjustedSlurAngle(const Doc *doc, Point &p1, Point &p2, curvature_CURVEDIR curveDir) const; - ///@} - //----------// // Functors // //----------// @@ -215,9 +177,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; ///@} @@ -258,83 +220,8 @@ class Slur : public ControlElement, bool StartsOnBeam() const { return this->HasBoundaryOnBeam(true); } bool EndsOnBeam() const { return this->HasBoundaryOnBeam(false); } bool HasBoundaryOnBeam(bool isStart) const; - ///@} - - /** - * Adjust slur position based on overlapping objects within its spanning elements - */ - ///@{ - // Discard certain spanned elements - void FilterSpannedElements(FloatingCurvePositioner *curve, const BezierCurve &bezierCurve, int margin); - - // Detect collisions near the endpoints - NearEndCollision DetectCollisionsNearEnd( - FloatingCurvePositioner *curve, const BezierCurve &bezierCurve, int margin); - - // Calculate the vertical shift of the slur end points - std::pair CalcEndPointShift( - FloatingCurvePositioner *curve, const BezierCurve &bezierCurve, double flexibility, int margin); - - // Apply the vertical shift of the slur end points - void ApplyEndPointShift( - FloatingCurvePositioner *curve, BezierCurve &bezierCurve, int endPointShiftLeft, int endPointShiftRight); - - // Calculate slur from bulge values - void AdjustSlurFromBulge(FloatingCurvePositioner *curve, BezierCurve &bezierCurve, int unit); - - // Check whether control points should be adjusted horizontally - bool AllowControlOffsetAdjustment(const BezierCurve &bezierCurve, double symmetry, int unit) const; - - // Calculate the horizontal control point offset - std::tuple CalcControlPointOffset( - FloatingCurvePositioner *curve, const BezierCurve &bezierCurve, int margin); - - // Calculate the vertical control point shift - ControlPointAdjustment CalcControlPointVerticalShift( - FloatingCurvePositioner *curve, const BezierCurve &bezierCurve, double symmetry, int margin); - - // Solve the constraints for vertical control point adjustment - std::pair SolveControlPointConstraints( - const std::list &constraints, double symmetry = 0.0) const; - - // Improve the slur shape by adjusting the control point heights - void AdjustSlurShape(BezierCurve &bezierCurve, curvature_CURVEDIR dir, int unit); - ///@} - - /** - * Adjust slur position based on inner slurs - */ - ///@{ - // Calculate the vertical control point shift - ControlPointAdjustment CalcControlPointShift(FloatingCurvePositioner *curve, const BezierCurve &bezierCurve, - const ArrayOfFloatingCurvePositioners &innerCurves, double symmetry, int margin); - - // Calculate the vertical shift of the slur end points - std::pair CalcEndPointShift(FloatingCurvePositioner *curve, const BezierCurve &bezierCurve, - const ArrayOfFloatingCurvePositioners &innerCurves, double flexibility, int margin); - ///@} - - /** - * Low level helper functions for slur adjustment - */ - ///@{ - // Shift end points for collisions nearby - void ShiftEndPoints(int &shiftLeft, int &shiftRight, double ratio, int intersection, double flexibility, - bool isBelow, char spanningType) const; - - // Calculate the full and partial shift radii - std::pair CalcShiftRadii(bool forShiftLeft, double flexibility, char spanningType) const; - - // Determine a quadratic interpolation function between zero and one and evaluate it - double CalcQuadraticInterpolation(double zeroAt, double oneAt, double arg) const; - - // Rotate the slope by a given number of degrees, but choose smaller angles if already close to the vertical axis - // Choose doublingBound as the positive slope value where doubling has the same effect as rotating: - // tan(atan(doublingBound) + degrees * PI / 180.0) ≈ 2.0 * doublingBound - double RotateSlope(double slope, double degrees, double doublingBound, bool upwards) const; - - // Calculate the minimal angle <)C1P1P2 or <)P1P2C2 - float GetMinControlPointAngle(const BezierCurve &bezierCurve, float angle, int unit) const; + // Angle adjustment + float GetAdjustedSlurAngle(const Doc *doc, Point &p1, Point &p2, curvature_CURVEDIR curveDir) const; ///@} public: diff --git a/include/vrv/smufl.h b/include/vrv/smufl.h index f5420223206..5e70fa53c69 100644 --- a/include/vrv/smufl.h +++ b/include/vrv/smufl.h @@ -392,6 +392,12 @@ enum { SMUFL_E888_tuplet8 = 0xE888, SMUFL_E889_tuplet9 = 0xE889, SMUFL_E88A_tupletColon = 0xE88A, + SMUFL_E8F3_chantDivisioMinima = 0xE8F3, + SMUFL_E8F4_chantDivisioMaior = 0xE8F4, + SMUFL_E8F5_chantDivisioMaxima = 0xE8F5, + SMUFL_E8F6_chantDivisioFinalis = 0xE8F6, + SMUFL_E8F7_chantVirgula = 0xE8F7, + SMUFL_E8F8_chantCaesura = 0xE8F8, SMUFL_E901_mensuralGclefPetrucci = 0xE901, SMUFL_E902_chantFclef = 0xE902, SMUFL_E903_mensuralFclef = 0xE903, @@ -525,6 +531,23 @@ enum { SMUFL_EB20_elecRewind = 0xEB20, SMUFL_EB21_elecSkipForwards = 0xEB21, SMUFL_EB22_elecSkipBackwards = 0xEB22, + SMUFL_EB90_staffPosRaise1 = 0xEB90, + SMUFL_EB91_staffPosRaise2 = 0xEB91, + SMUFL_EB92_staffPosRaise3 = 0xEB92, + SMUFL_EB93_staffPosRaise4 = 0xEB93, + SMUFL_EB94_staffPosRaise5 = 0xEB94, + SMUFL_EB95_staffPosRaise6 = 0xEB95, + SMUFL_EB96_staffPosRaise7 = 0xEB96, + SMUFL_EB97_staffPosRaise8 = 0xEB97, + SMUFL_EB98_staffPosLower1 = 0xEB98, + SMUFL_EB99_staffPosLower2 = 0xEB99, + SMUFL_EB9A_staffPosLower3 = 0xEB9A, + SMUFL_EB9B_staffPosLower4 = 0xEB9B, + SMUFL_EB9C_staffPosLower5 = 0xEB9C, + SMUFL_EB9D_staffPosLower6 = 0xEB9D, + SMUFL_EB9E_staffPosLower7 = 0xEB9E, + SMUFL_EB9F_staffPosLower8 = 0xEB9F, + SMUFL_EBA6_luteDurationDoubleWhole = 0xEBA6, SMUFL_EBA7_luteDurationWhole = 0xEBA7, SMUFL_EBA8_luteDurationHalf = 0xEBA8, SMUFL_EBA9_luteDurationQuarter = 0xEBA9, @@ -544,6 +567,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, @@ -554,6 +581,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, @@ -581,7 +644,7 @@ enum { }; /** The number of glyphs for verification **/ -#define SMUFL_COUNT 556 +#define SMUFL_COUNT 619 } // namespace vrv diff --git a/include/vrv/space.h b/include/vrv/space.h index eddf6b4987b..93f47528d0a 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 011f33787d8..db2edc25618 100644 --- a/include/vrv/staff.h +++ b/include/vrv/staff.h @@ -163,7 +163,7 @@ class Staff : public Object, ///@} /** - * Used for calculating clustered information/dot position. + * Used for calculating note groups information/dot position. * The *Doc is the parent doc but passed as param in order to avoid look-up */ bool IsOnStaffLine(int y, const Doc *doc) const; @@ -189,39 +189,12 @@ 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; ///@} - /** - * See Object::ConvertToCastOffMensural - */ - int ConvertToCastOffMensural(FunctorParams *functorParams) override; - - /** - * See Object::ApplyPPUFactor - */ - int ApplyPPUFactor(FunctorParams *functorParams) override; - - /** - * See Object::InitOnsetOffset - */ - ///@{ - int InitOnsetOffset(FunctorParams *functorParams) override; - ///@} - - /** - * See Object::GenerateMIDI - */ - int GenerateMIDI(FunctorParams *functorParams) 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 4ab0fbb3be1..7e779f3df01 100644 --- a/include/vrv/staffdef.h +++ b/include/vrv/staffdef.h @@ -78,22 +78,12 @@ 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; ///@} - /** - * See Object::GenerateMIDI - */ - int GenerateMIDI(FunctorParams *functorParams) override; - - /** - * See Object::Transpose - */ - int Transpose(FunctorParams *functorParams) override; - private: // public: diff --git a/include/vrv/staffgrp.h b/include/vrv/staffgrp.h index 74a74860d8a..c3218412399 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 b946c0d5a9d..641c0895bbd 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/surface.h b/include/vrv/surface.h index 5d155a3d876..f6cc1eb8eec 100644 --- a/include/vrv/surface.h +++ b/include/vrv/surface.h @@ -27,7 +27,7 @@ namespace vrv { * in MEI */ -class Surface : public Object, public AttTyped, public AttCoordinated { +class Surface : public Object, public AttTyped, public AttCoordinated, public AttCoordinatedUl { public: /** * @name Constructors, destructors, reset, and class name methods diff --git a/include/vrv/svg.h b/include/vrv/svg.h index d96e40ed65b..79d5aa78974 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/svgdevicecontext.h b/include/vrv/svgdevicecontext.h index 43972ae1155..9eed0baa79a 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,9 +286,9 @@ class SvgDeviceContext : public DeviceContext { void WriteLine(std::string); - std::string GetColour(int colour); + std::string GetColor(int color); - pugi::xml_node AppendChild(std::string name); + pugi::xml_node AddChild(std::string name); /** * Transform pen properties into stroke attributes diff --git a/include/vrv/syl.h b/include/vrv/syl.h index d82ddc9f498..47d0f654a23 100644 --- a/include/vrv/syl.h +++ b/include/vrv/syl.h @@ -102,17 +102,12 @@ 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; ///@} - /** - * 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/syllable.h b/include/vrv/syllable.h index 1d7edf67b54..7813479caff 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 498447b9f12..ad4d3eacd20 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 @@ -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 d6229ec00b6..a8900f2a9c5 100644 --- a/include/vrv/system.h +++ b/include/vrv/system.h @@ -173,22 +173,12 @@ 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; ///@} - /** - * See Object::ApplyPPUFactor - */ - int ApplyPPUFactor(FunctorParams *functorParams) override; - - /** - * See Object::Transpose - */ - int Transpose(FunctorParams *functorParams) override; - public: SystemAligner m_systemAligner; diff --git a/include/vrv/systemelement.h b/include/vrv/systemelement.h index 1803b613d0d..dbb85c00655 100644 --- a/include/vrv/systemelement.h +++ b/include/vrv/systemelement.h @@ -44,22 +44,12 @@ 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; ///@} - /** - * See Object::ConvertToPageBased - */ - int ConvertToPageBased(FunctorParams *functorParams) override; - - /** - * See Object::ConvertToCastOffMensural - */ - int ConvertToCastOffMensural(FunctorParams *functorParams) override; - private: // public: diff --git a/include/vrv/systemmilestone.h b/include/vrv/systemmilestone.h index c535ad4a798..cc79e921e0a 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 e18296322c9..87e39ab2188 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 c15c6a9f000..14e9f8ba4d1 100644 --- a/include/vrv/tabgrp.h +++ b/include/vrv/tabgrp.h @@ -66,17 +66,12 @@ 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; ///@} - /** - * See Object::InitOnsetOffsetEnd - */ - virtual int InitOnsetOffsetEnd(FunctorParams *functorParams) override; - protected: /** * Filter the flat list and keep only Note elements. diff --git a/include/vrv/tempo.h b/include/vrv/tempo.h index 636e93a663d..f8b708b30e8 100644 --- a/include/vrv/tempo.h +++ b/include/vrv/tempo.h @@ -90,17 +90,12 @@ 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; ///@} - /** - * See Object::CalcMaxMeasureDuration - */ - int InitMaxMeasureDuration(FunctorParams *functorParams) override; - //----------// // Static // //----------// diff --git a/include/vrv/text.h b/include/vrv/text.h index 39cfd16843c..f19e22bf562 100644 --- a/include/vrv/text.h +++ b/include/vrv/text.h @@ -44,13 +44,21 @@ 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 */ ///@{ - 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; ///@} @@ -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/include/vrv/textelement.h b/include/vrv/textelement.h index c3e8801f5e9..2c334275484 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/textlayoutelement.h b/include/vrv/textlayoutelement.h new file mode 100644 index 00000000000..4dcf20978b8 --- /dev/null +++ b/include/vrv/textlayoutelement.h @@ -0,0 +1,140 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: textlayoutelement.h +// Author: Laurent Pugin +// Created: 2023 +// Copyright (c) Authors and others. All rights reserved. +///////////////////////////////////////////////////////////////////////////// + +#ifndef __VRV_TEXT_LAYOUT_ELEMENT_H__ +#define __VRV_TEXT_LAYOUT_ELEMENT_H__ + +#include "atts_shared.h" +#include "object.h" + +namespace vrv { + +//---------------------------------------------------------------------------- +// TextLayoutElement +//---------------------------------------------------------------------------- + +/** + * This class represents a text element featuring horizontal and vertical layout. + * It is not an abstract class but should not be instanciated directly. + */ +class TextLayoutElement : public Object, public ObjectListInterface, public AttTyped { +public: + /** + * @name Constructors, destructors, and other standard methods + * Reset method resets all attribute classes + */ + ///@{ + TextLayoutElement(ClassId classId, const std::string &classIdStr); + virtual ~TextLayoutElement(); + void Reset() override; + ///@} + + /** + * @name Methods for adding allowed content + */ + ///@{ + bool IsSupportedChild(Object *object) override; + ///@} + + /** + * @name Setter and getter for the text element cells + */ + ///@{ + void ResetCells(); + void AppendTextToCell(int index, TextElement *text); + ///@} + + /** + * @name Setter and getter for the drawing scaling + */ + ///@{ + void ResetDrawingScaling(); + ///@} + + /** + * Scale the content of the running element. + * Currently unused. + */ + bool AdjustDrawingScaling(int width); + + /** + * Adjust the postition of the content of the running element. + * First adjust the content of each cell, and then the cells themselves. + */ + bool AdjustRunningElementYPos(); + + /** + * @name Get the size of row, cols or cells + */ + ///@{ + /** Height including margins */ + virtual int GetTotalHeight(const Doc *doc) const = 0; + /** Content height */ + int GetContentHeight() const; + /** Row from 0 to 2 */ + int GetRowHeight(int row) const; + /** Col from 0 to 2 */ + int GetColHeight(int col) const; + /** Row from 0 to 8 */ + int GetCellHeight(int cell) const; + // Width including margins */ + virtual int GetTotalWidth(const Doc *doc) const = 0; + /** Content width */ + int GetContentWidth() const; + /** Row from 0 to 2 */ + int GetRowWidth(int col) const; + /** Col from 0 to 2 */ + int GetColWidth(int col) const; + /** Row from 0 to 8 */ + int GetCellWidth(int cell) const; + + /** + * Calculate the cell position + */ + int GetAlignmentPos(data_HORIZONTALALIGNMENT h, data_VERTICALALIGNMENT v) 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: + /** + * Filter the list for a specific class. + * Keep only the top and + */ + void FilterList(ListOfConstObjects &childList) const override; + +private: + // +public: + // +private: + /** + * Stored the top or with the 9 possible positioning combinations, from + * top-left to bottom-right (going left to right first) + */ + ArrayOfTextElements m_cells[9]; + + /** + * + */ + int m_drawingScalingPercent[3]; +}; + +} // namespace vrv + +#endif diff --git a/include/vrv/tie.h b/include/vrv/tie.h index 17f8d86712b..ccd92e5e5e7 100644 --- a/include/vrv/tie.h +++ b/include/vrv/tie.h @@ -28,7 +28,7 @@ class Tie : public ControlElement, public TimeSpanningInterface, public AttColor, public AttCurvature, - public AttCurveRend { + public AttLineRendBase { public: /** * @name Constructors, destructors, and other standard methods @@ -77,26 +77,19 @@ 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; ///@} - /** - * 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], const Note *startNote, const Note *endNote, curvature_CURVEDIR drawingCurveDir) const; - // Calculate initial position X position and return stem direction of the startNote - void CalculateXPosition(const Doc *doc, const Staff *staff, const Chord *startParentChord, + // Calculate the initial X position and return true if the tie endpoints should be adjusted vertically + bool CalculateXPosition(const Doc *doc, const Staff *staff, const Chord *startParentChord, const Chord *endParentChord, int spanningType, bool isOuterChordNote, Point &startPoint, Point &endPoint, curvature_CURVEDIR drawingCurveDir) const; diff --git a/include/vrv/timemap.h b/include/vrv/timemap.h index ea5612819ed..2545af4fca6 100644 --- a/include/vrv/timemap.h +++ b/include/vrv/timemap.h @@ -18,7 +18,6 @@ namespace vrv { class Object; -class GenerateTimemapParams; //---------------------------------------------------------------------------- // TimemapEntry @@ -58,10 +57,9 @@ class Timemap { void Reset(); /** - * Add an entry to the timemap. - * Currently support note and rest (duration interfaces) and measure. + * Return (and possibly add) an entry for the given time. */ - void AddEntry(Object *object, GenerateTimemapParams *params); + TimemapEntry &GetEntry(double time) { return m_map[time]; } /** * Write the current timemap to a JSON string diff --git a/include/vrv/timestamp.h b/include/vrv/timestamp.h index 398bcc6b50d..c715b569ec0 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/toolkit.h b/include/vrv/toolkit.h index 3078f7e420c..268175e3217 100644 --- a/include/vrv/toolkit.h +++ b/include/vrv/toolkit.h @@ -500,9 +500,10 @@ class Toolkit { /** * Get the MEI as a string. * - * @param jsonOptions A stringified JSON object with the output options + * @param jsonOptions A stringified JSON object with the output options; * pageNo: integer; (1-based), all pages if none (or 0) specified; * scoreBased: true or false; true by default; + * basic: true or false; false by default; * removeIds: true or false; false by default - remove all \@xml:id not used in the data; */ std::string GetMEI(const std::string &jsonOptions = ""); diff --git a/include/vrv/transposefunctor.h b/include/vrv/transposefunctor.h new file mode 100644 index 00000000000..e488e0e55d3 --- /dev/null +++ b/include/vrv/transposefunctor.h @@ -0,0 +1,170 @@ +///////////////////////////////////////////////////////////////////////////// +// 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 false; } + + /* + * Setter for the transposition + */ + void SetTransposition(const std::string &transposition) { m_transposition = transposition; } + + /* + * Functor interface + */ + ///@{ + FunctorCode VisitHarm(Harm *harm) override; + FunctorCode VisitKeySig(KeySig *keySig) override; + FunctorCode VisitMdiv(Mdiv *mdiv) override; + FunctorCode VisitNote(Note *note) override; + FunctorCode VisitRest(Rest *rest) override; + FunctorCode VisitScore(Score *score) override; + ///@} + +protected: + // +private: + // +public: + // +protected: + // The transposer + Transposer *m_transposer; + // The current KeySig for staffN (ScoreDef key signatures are mapped to -1) + std::map m_keySigForStaffN; + +private: + // The transposition to be applied + std::string m_transposition; +}; + +//---------------------------------------------------------------------------- +// TransposeSelectedMdivFunctor +//---------------------------------------------------------------------------- + +/** + * This class transposes the selected mdiv. + */ +class TransposeSelectedMdivFunctor : public TransposeFunctor { +public: + /** + * @name Constructors, destructors + */ + ///@{ + TransposeSelectedMdivFunctor(Doc *doc, Transposer *transposer); + virtual ~TransposeSelectedMdivFunctor() = default; + ///@} + + /* + * Abstract base implementation + */ + bool ImplementsEndInterface() const override { return false; } + + /* + * Setter for the selected Mdiv + */ + void SetSelectedMdivID(const std::string &selectedID) { m_selectedMdivID = selectedID; } + + /* + * Functor interface + */ + ///@{ + FunctorCode VisitMdiv(Mdiv *mdiv) override; + FunctorCode VisitPageMilestone(PageMilestoneEnd *pageMilestoneEnd) override; + FunctorCode VisitScore(Score *score) override; + FunctorCode VisitSystem(System *system) override; + ///@} + +protected: + // +private: + // +public: + // +private: + // The mdiv selected for transposition + std::string m_selectedMdivID; + // The list of current (nested) mdivs + std::list m_currentMdivIDs; +}; + +//---------------------------------------------------------------------------- +// TransposeToSoundingPitchFunctor +//---------------------------------------------------------------------------- + +/** + * This class transposes the content to sounding pitch (by evaluating @trans.semi). + */ +class TransposeToSoundingPitchFunctor : public TransposeFunctor { +public: + /** + * @name Constructors, destructors + */ + ///@{ + TransposeToSoundingPitchFunctor(Doc *doc, Transposer *transposer); + virtual ~TransposeToSoundingPitchFunctor() = default; + ///@} + + /* + * Abstract base implementation + */ + bool ImplementsEndInterface() const override { return true; } + + /* + * Functor interface + */ + ///@{ + FunctorCode VisitMdiv(Mdiv *mdiv) 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; + ///@} + +protected: + // +private: + // Update the current transposition + void UpdateTranspositionFromStaffN(const AttNInteger *staffN); + +public: + // +private: + // The transposition interval for staffN + std::map m_transposeIntervalForStaffN; +}; + +} // namespace vrv + +#endif // __VRV_TRANSPOSEFUNCTOR_H__ diff --git a/include/vrv/trill.h b/include/vrv/trill.h index 90a98aaac6d..da61ec3d259 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, @@ -74,9 +75,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 025e3f41e01..bdb78867b98 100644 --- a/include/vrv/tuning.h +++ b/include/vrv/tuning.h @@ -45,13 +45,13 @@ class Tuning : public Object, public AttCourseLog { int CalcPitchPos(int course, data_NOTATIONTYPE notationType, int lines) const; /** - * Calclate the MIDI pitch number for course/fret + * Calculate the MIDI note number for course/fret * - * @param[in] course - * @param[in] fret - * @param[in] notationType, used to default tuning if not otherwise specified + * @param[in] course The course number + * @param[in] fret The fret number + * @param[in] notationType The notationType used to default tuning if not otherwise specified * - * @return MIDI pitch + * @return MIDI note number */ int CalcPitchNumber(int course, int fret, data_NOTATIONTYPE notationType) const; @@ -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 7f67ed32b94..d16781344ba 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) @@ -120,9 +128,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 6933bd008f5..f11f12e35a5 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 { @@ -72,9 +73,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 391ee97c13a..c67711eb1be 100644 --- a/include/vrv/verse.h +++ b/include/vrv/verse.h @@ -64,22 +64,12 @@ 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; ///@} - /** - * See Object::InitProcessingLists - */ - int InitProcessingLists(FunctorParams *functorParams) override; - - /** - * See Object::GenerateMIDI - */ - int GenerateMIDI(FunctorParams *) override; - private: // public: diff --git a/include/vrv/verticalaligner.h b/include/vrv/verticalaligner.h index c193d4ac393..5a209b611c7 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/include/vrv/view.h b/include/vrv/view.h index a73ae1ce763..2c5473db68d 100644 --- a/include/vrv/view.h +++ b/include/vrv/view.h @@ -30,6 +30,8 @@ class Chord; class ControlElement; class DeviceContext; class Dir; +class Div; +class DivLine; class Doc; class Dynam; class EditorialElement; @@ -48,6 +50,7 @@ class KeyAccid; class Layer; class LayerElement; class Lb; +class Liquescent; class Measure; class MNum; class Mordent; @@ -61,12 +64,11 @@ class Page; class PageElement; class Pedal; class PgFoot; -class PgFoot; class PgHead; -class PgHead2; class PitchInflection; class Reh; class Rend; +class RepeatMark; class RunningElement; class Slur; class Staff; @@ -81,6 +83,7 @@ class Tempo; class Text; class TextDrawingParams; class TextElement; +class TextLayoutElement; class Tie; class Trill; class Turn; @@ -227,7 +230,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); @@ -238,13 +241,13 @@ class View { ///@} /** - * @name Methods for drawing RunningElements (PgHead, PgFoot, etc.) - * Defined in view_running.cpp + * @name Methods for drawing TextLayoutElement (Div, PgHead, PgFoot, etc.) + * Defined in view_text.cpp */ ///@{ + void DrawDiv(DeviceContext *dc, Div *div, System *system); void DrawRunningElements(DeviceContext *dc, Page *page); - void DrawPgFooter(DeviceContext *dc, RunningElement *pgFooter); - void DrawPgHeader(DeviceContext *dc, RunningElement *pgHeader); + void DrawTextLayoutElement(DeviceContext *dc, TextLayoutElement *textLayoutElement); ///@} /** @@ -347,8 +350,11 @@ class View { */ ///@{ void DrawAcciaccaturaSlash(DeviceContext *dc, Stem *stem, Staff *staff); + 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 */ @@ -408,10 +414,20 @@ class View { * Defined in view_neume.cpp */ ///@{ + void DrawDivLine(DeviceContext *dc, LayerElement *element, Layer *layer, Staff *staff, Measure *measure); void DrawSyllable(DeviceContext *dc, LayerElement *element, Layer *layer, Staff *staff, Measure *measure); void DrawNc(DeviceContext *dc, LayerElement *element, Layer *layer, Staff *staff, Measure *measure); void DrawNeume(DeviceContext *dc, LayerElement *element, Layer *layer, Staff *staff, Measure *measure); ///@} + + /** + * @name Methods for drawing parts of neume LayerElement child classes. + * Defined in view_neumes.cpp + */ + ///@{ + void DrawNcAsNotehead(DeviceContext *dc, Nc *nc, Layer *layer, Staff *staff, Measure *measure); + ///@} + /** * @name Methods for drawing Floating child classes. * They are base drawing methods that are called directly from DrawFloatingElement. @@ -426,7 +442,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); @@ -436,6 +452,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); @@ -659,10 +676,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/include/vrv/vrv.h b/include/vrv/vrv.h index beee9bd9a3e..866458b9e70 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/include/vrv/vrvdef.h b/include/vrv/vrvdef.h index 78e901a9fd8..03128926e46 100644 --- a/include/vrv/vrvdef.h +++ b/include/vrv/vrvdef.h @@ -38,8 +38,8 @@ namespace vrv { // Version //---------------------------------------------------------------------------- -#define VERSION_MAJOR 3 -#define VERSION_MINOR 16 +#define VERSION_MAJOR 4 +#define VERSION_MINOR 1 #define VERSION_REVISION 0 // Adds "-dev" in the version number - should be set to false for releases #define VERSION_DEV true @@ -115,7 +115,6 @@ enum ClassId : uint16_t { MEASURE_ALIGNER, MENSUR_ATTR, METERSIG_ATTR, - METERSIGGRP, PAGE, PAGES, STAFF, @@ -153,13 +152,15 @@ enum ClassId : uint16_t { SUPPLIED, UNCLEAR, EDITORIAL_ELEMENT_max, + // Ids for TextLayoutElement child classes + TEXT_LAYOUT_ELEMENT, + DIV, // Ids for RunningElement child classes RUNNING_ELEMENT, PGFOOT, - PGFOOT2, PGHEAD, - PGHEAD2, RUNNING_ELEMENT_max, + TEXT_LAYOUT_ELEMENT_max, // Ids for PageElement child classes PAGE_ELEMENT, PAGE_MILESTONE_END, @@ -199,6 +200,7 @@ enum ClassId : uint16_t { PHRASE, PITCHINFLECTION, REH, + REPEATMARK, SLUR, TEMPO, TIE, @@ -216,6 +218,7 @@ enum ClassId : uint16_t { CHORD, CLEF, CUSTOS, + DIVLINE, DOT, DOTS, FLAG, @@ -225,8 +228,10 @@ enum ClassId : uint16_t { KEYSIG, KEYACCID, LIGATURE, + LIQUESCENT, MENSUR, METERSIG, + METERSIGGRP, MREST, MRPT, MRPT2, @@ -307,6 +312,7 @@ class BeamElementCoord; class BoundingBox; class Comparison; class CurveSpannedElement; +class DivLine; class FloatingPositioner; class FloatingCurvePositioner; class GraceAligner; @@ -314,6 +320,7 @@ class InterfaceComparison; class LayerElement; class LedgerLine; class LinkingInterface; +class Liquescent; class Nc; class Note; class Neume; @@ -334,7 +341,7 @@ typedef std::list ListOfObjects; typedef std::list ListOfConstObjects; -typedef std::vector ChordCluster; +typedef std::vector ChordNoteGroup; typedef std::vector> ArrayOfAdjustmentTuples; @@ -348,7 +355,7 @@ typedef std::multimap MapOfLinkingInterfaceIDPa typedef std::map MapOfNoteIDPairs; -typedef std::vector> ArrayOfPlistInterfaceIDTuples; +typedef std::vector> ArrayOfPlistInterfaceIDPairs; typedef std::vector ArrayOfCurveSpannedElements; @@ -677,6 +684,13 @@ enum GraphicID { PRIMARY = 0, SPANNING, SYMBOLREF }; #define SUPER_SCRIPT_POSITION -0.20 // lowered down from the midline #define SUB_SCRIPT_POSITION -0.17 // lowered down from the baseline +//---------------------------------------------------------------------------- +// Neume notation note size to staff size ratio defines +//---------------------------------------------------------------------------- + +#define NOTE_HEIGHT_TO_STAFF_SIZE_RATIO 2 +#define NOTE_WIDTH_TO_STAFF_SIZE_RATIO 1.4 + } // namespace vrv #endif // __VRV_DEF_H__ diff --git a/include/vrv/zone.h b/include/vrv/zone.h index bbe0c1b90c4..c9e3e44ebc7 100644 --- a/include/vrv/zone.h +++ b/include/vrv/zone.h @@ -27,7 +27,7 @@ namespace vrv { * in MEI */ -class Zone : public Object, public AttTyped, public AttCoordinated { +class Zone : public Object, public AttTyped, public AttCoordinated, public AttCoordinatedUl { public: /** * @name Constructors, destructors, reset, and class name methods diff --git a/libmei/addons/element.h b/libmei/addons/element.h index 4748f57da0b..bf94a39560a 100644 --- a/libmei/addons/element.h +++ b/libmei/addons/element.h @@ -21,8 +21,11 @@ namespace vrv { */ class Element { public: - Element(std::string name) {} + Element(std::string name) { m_name = name; } virtual ~Element() {} + + std::string m_name; + std::string m_xmlId; }; } // namespace vrv diff --git a/libmei/config.yml b/libmei/config.yml index fcb10ef424f..e2f1f42844d 100644 --- a/libmei/config.yml +++ b/libmei/config.yml @@ -5,4 +5,4 @@ addons_dir: "./addons" elements: false namespace: "vrv" datatypes: "./datatypes.yml" -basic_odd: "./mei/develop/mei-basic_compiled.odd" \ No newline at end of file +basic_odd: "./mei/mei-basic_compiled.odd" \ No newline at end of file diff --git a/libmei/datatypes.yml b/libmei/datatypes.yml index a9db84b0c0e..5bc7ca2dab1 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 @@ -96,7 +96,7 @@ mapped: std::string data.PGSCALE: std::string - data.PITCHNAME.GES: + data.PITCHNAME.GESTURAL: data_PITCHNAME data.PITCHCLASS: int @@ -208,6 +208,11 @@ modules: type: double default: -1.0 + neumes: + att.divLine.log: + form: + type: divLineLog_FORM + shared: att.articulation: artic: @@ -219,7 +224,7 @@ modules: sig: type: data_KEYSIGNATURE att.keySigDefault.log: - key.sig: + keysig: type: data_KEYSIGNATURE att.meterSig.log: count: @@ -253,3 +258,9 @@ modules: tab.fret: type: int default: -1 + + visual: + att.mensural.vis: + mensur.slash: + type: char + default: 0 diff --git a/libmei/dist/attclasses.h b/libmei/dist/attclasses.h index 8d5369fcb4a..114d32e45ef 100644 --- a/libmei/dist/attclasses.h +++ b/libmei/dist/attclasses.h @@ -26,13 +26,11 @@ enum AttClassId { ATT_HARMONICFUNCTION, ATT_INTERVALHARMONIC, ATT_INTERVALMELODIC, - ATT_KEYSIGANL, ATT_KEYSIGDEFAULTANL, ATT_MELODICFUNCTION, ATT_PITCHCLASS, ATT_SOLFA, ATT_ARPEGLOG, - ATT_BTREMLOG, ATT_BEAMPRESENT, ATT_BEAMREND, ATT_BEAMSECONDARY, @@ -42,7 +40,6 @@ enum AttClassId { ATT_BRACKETSPANLOG, ATT_CUTOUT, ATT_EXPANDABLE, - ATT_FTREMLOG, ATT_GLISSPRESENT, ATT_GRACEGRPLOG, ATT_GRACED, @@ -57,10 +54,10 @@ enum AttClassId { ATT_PEDALLOG, ATT_PIANOPEDALS, ATT_REHEARSAL, - ATT_SCOREDEFVISCMN, ATT_SLURREND, ATT_STEMSCMN, ATT_TIEREND, + ATT_TREMFORM, ATT_TREMMEASURED, ATT_MORDENTLOG, ATT_ORNAMPRESENT, @@ -69,7 +66,8 @@ enum AttClassId { ATT_CRIT, ATT_AGENTIDENT, ATT_REASONIDENT, - ATT_EXTSYM, + ATT_EXTSYMAUTH, + ATT_EXTSYMNAMES, ATT_FACSIMILE, ATT_TABULAR, ATT_FINGGRPLOG, @@ -77,19 +75,21 @@ enum AttClassId { ATT_NOTEGESTAB, ATT_ACCIDENTALGES, ATT_ARTICULATIONGES, + ATT_ATTACKING, ATT_BENDGES, ATT_DURATIONGES, - ATT_MDIVGES, - ATT_NCGES, ATT_NOTEGES, ATT_ORNAMENTACCIDGES, - ATT_SECTIONGES, + ATT_PITCHGES, ATT_SOUNDLOCATION, ATT_TIMESTAMPGES, ATT_TIMESTAMP2GES, ATT_HARMLOG, + ATT_ADLIBITUM, ATT_BIFOLIUMSURFACES, ATT_FOLIUMSURFACES, + ATT_PERFRES, + ATT_PERFRESBASIC, ATT_RECORDTYPE, ATT_REGULARMETHOD, ATT_DURATIONQUALITY, @@ -107,8 +107,10 @@ enum AttClassId { ATT_MIDIVALUE2, ATT_MIDIVELOCITY, ATT_TIMEBASE, + ATT_DIVLINELOG, ATT_NCLOG, ATT_NCFORM, + ATT_NEUMETYPE, ATT_MARGINS, ATT_ALIGNMENT, ATT_ACCIDLOG, @@ -134,9 +136,9 @@ enum AttClassId { ATT_COORDX2, ATT_COORDY1, ATT_COORDINATED, + ATT_COORDINATEDUL, ATT_CUE, ATT_CURVATURE, - ATT_CURVEREND, ATT_CUSTOSLOG, ATT_DATAPOINTING, ATT_DATABLE, @@ -153,12 +155,14 @@ enum AttClassId { ATT_EXTENT, ATT_FERMATAPRESENT, ATT_FILING, + ATT_FORMEWORK, ATT_GRPSYMLOG, ATT_HANDIDENT, ATT_HEIGHT, ATT_HORIZONTALALIGN, ATT_INTERNETMEDIA, ATT_JOINED, + ATT_KEYMODE, ATT_KEYSIGLOG, ATT_KEYSIGDEFAULTLOG, ATT_LABELLED, @@ -175,6 +179,7 @@ enum AttClassId { ATT_MEDIABOUNDS, ATT_MEDIUM, ATT_MEIVERSION, + ATT_MENSURLOG, ATT_METADATAPOINTING, ATT_METERCONFORMANCE, ATT_METERCONFORMANCEBAR, @@ -206,6 +211,7 @@ enum AttClassId { ATT_POINTING, ATT_QUANTITY, ATT_RANGING, + ATT_REPEATMARKLOG, ATT_RESPONSIBILITY, ATT_RESTDURATIONLOG, ATT_SCALABLE, @@ -264,10 +270,12 @@ enum AttClassId { ATT_BEATRPTVIS, ATT_CHORDVIS, ATT_CLEFFINGVIS, + ATT_CURVATUREDIRECTION, ATT_EPISEMAVIS, ATT_FTREMVIS, ATT_FERMATAVIS, ATT_FINGGRPVIS, + ATT_GUITARGRIDVIS, ATT_HAIRPINVIS, ATT_HARMVIS, ATT_HISPANTICKVIS, diff --git a/libmei/dist/attconverter.cpp b/libmei/dist/attconverter.cpp index 1f19a8e49c2..d97e5b5a880 100644 --- a/libmei/dist/attconverter.cpp +++ b/libmei/dist/attconverter.cpp @@ -43,6 +43,8 @@ std::string AttConverterBase::AccidentalGesturalToStr(data_ACCIDENTAL_GESTURAL d case ACCIDENTAL_GESTURAL_sd: value = "sd"; break; case ACCIDENTAL_GESTURAL_fu: value = "fu"; break; case ACCIDENTAL_GESTURAL_fd: value = "fd"; break; + case ACCIDENTAL_GESTURAL_xu: value = "xu"; break; + case ACCIDENTAL_GESTURAL_ffd: value = "ffd"; break; case ACCIDENTAL_GESTURAL_bms: value = "bms"; break; case ACCIDENTAL_GESTURAL_kms: value = "kms"; break; case ACCIDENTAL_GESTURAL_bs: value = "bs"; break; @@ -74,6 +76,8 @@ data_ACCIDENTAL_GESTURAL AttConverterBase::StrToAccidentalGestural(const std::st if (value == "sd") return ACCIDENTAL_GESTURAL_sd; if (value == "fu") return ACCIDENTAL_GESTURAL_fu; if (value == "fd") return ACCIDENTAL_GESTURAL_fd; + if (value == "xu") return ACCIDENTAL_GESTURAL_xu; + if (value == "ffd") return ACCIDENTAL_GESTURAL_ffd; if (value == "bms") return ACCIDENTAL_GESTURAL_bms; if (value == "kms") return ACCIDENTAL_GESTURAL_kms; if (value == "bs") return ACCIDENTAL_GESTURAL_bs; @@ -130,6 +134,8 @@ std::string AttConverterBase::AccidentalGesturalExtendedToStr(data_ACCIDENTAL_GE case ACCIDENTAL_GESTURAL_extended_sd: value = "sd"; break; case ACCIDENTAL_GESTURAL_extended_fu: value = "fu"; break; case ACCIDENTAL_GESTURAL_extended_fd: value = "fd"; break; + case ACCIDENTAL_GESTURAL_extended_xu: value = "xu"; break; + case ACCIDENTAL_GESTURAL_extended_ffd: value = "ffd"; break; default: LogWarning("Unknown value '%d' for data.ACCIDENTAL.GESTURAL.extended", data); value = ""; @@ -144,6 +150,8 @@ data_ACCIDENTAL_GESTURAL_extended AttConverterBase::StrToAccidentalGesturalExten if (value == "sd") return ACCIDENTAL_GESTURAL_extended_sd; if (value == "fu") return ACCIDENTAL_GESTURAL_extended_fu; if (value == "fd") return ACCIDENTAL_GESTURAL_extended_fd; + if (value == "xu") return ACCIDENTAL_GESTURAL_extended_xu; + if (value == "ffd") return ACCIDENTAL_GESTURAL_extended_ffd; if (logWarning && !value.empty()) LogWarning("Unsupported value '%s' for data.ACCIDENTAL.GESTURAL.extended", value.c_str()); return ACCIDENTAL_GESTURAL_extended_NONE; @@ -171,6 +179,10 @@ std::string AttConverterBase::AccidentalWrittenToStr(data_ACCIDENTAL_WRITTEN dat case ACCIDENTAL_WRITTEN_fd: value = "fd"; break; case ACCIDENTAL_WRITTEN_nu: value = "nu"; break; case ACCIDENTAL_WRITTEN_nd: value = "nd"; break; + case ACCIDENTAL_WRITTEN_xu: value = "xu"; break; + case ACCIDENTAL_WRITTEN_xd: value = "xd"; break; + case ACCIDENTAL_WRITTEN_ffu: value = "ffu"; break; + case ACCIDENTAL_WRITTEN_ffd: value = "ffd"; break; case ACCIDENTAL_WRITTEN_1qf: value = "1qf"; break; case ACCIDENTAL_WRITTEN_3qf: value = "3qf"; break; case ACCIDENTAL_WRITTEN_1qs: value = "1qs"; break; @@ -213,6 +225,10 @@ data_ACCIDENTAL_WRITTEN AttConverterBase::StrToAccidentalWritten(const std::stri if (value == "fd") return ACCIDENTAL_WRITTEN_fd; if (value == "nu") return ACCIDENTAL_WRITTEN_nu; if (value == "nd") return ACCIDENTAL_WRITTEN_nd; + if (value == "xu") return ACCIDENTAL_WRITTEN_xu; + if (value == "xd") return ACCIDENTAL_WRITTEN_xd; + if (value == "ffu") return ACCIDENTAL_WRITTEN_ffu; + if (value == "ffd") return ACCIDENTAL_WRITTEN_ffd; if (value == "1qf") return ACCIDENTAL_WRITTEN_1qf; if (value == "3qf") return ACCIDENTAL_WRITTEN_3qf; if (value == "1qs") return ACCIDENTAL_WRITTEN_1qs; @@ -285,6 +301,10 @@ std::string AttConverterBase::AccidentalWrittenExtendedToStr(data_ACCIDENTAL_WRI case ACCIDENTAL_WRITTEN_extended_fd: value = "fd"; break; case ACCIDENTAL_WRITTEN_extended_nu: value = "nu"; break; case ACCIDENTAL_WRITTEN_extended_nd: value = "nd"; break; + case ACCIDENTAL_WRITTEN_extended_xu: value = "xu"; break; + case ACCIDENTAL_WRITTEN_extended_xd: value = "xd"; break; + case ACCIDENTAL_WRITTEN_extended_ffu: value = "ffu"; break; + case ACCIDENTAL_WRITTEN_extended_ffd: value = "ffd"; break; case ACCIDENTAL_WRITTEN_extended_1qf: value = "1qf"; break; case ACCIDENTAL_WRITTEN_extended_3qf: value = "3qf"; break; case ACCIDENTAL_WRITTEN_extended_1qs: value = "1qs"; break; @@ -305,6 +325,10 @@ data_ACCIDENTAL_WRITTEN_extended AttConverterBase::StrToAccidentalWrittenExtende if (value == "fd") return ACCIDENTAL_WRITTEN_extended_fd; if (value == "nu") return ACCIDENTAL_WRITTEN_extended_nu; if (value == "nd") return ACCIDENTAL_WRITTEN_extended_nd; + if (value == "xu") return ACCIDENTAL_WRITTEN_extended_xu; + if (value == "xd") return ACCIDENTAL_WRITTEN_extended_xd; + if (value == "ffu") return ACCIDENTAL_WRITTEN_extended_ffu; + if (value == "ffd") return ACCIDENTAL_WRITTEN_extended_ffd; if (value == "1qf") return ACCIDENTAL_WRITTEN_extended_1qf; if (value == "3qf") return ACCIDENTAL_WRITTEN_extended_3qf; if (value == "1qs") return ACCIDENTAL_WRITTEN_extended_1qs; @@ -385,6 +409,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 +457,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; @@ -630,6 +658,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; @@ -2108,7 +2163,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 +2177,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 +2900,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 +2920,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 +2939,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 +2959,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; @@ -3882,29 +3935,6 @@ audience_AUDIENCE AttConverterBase::StrToAudienceAudience(const std::string &val return audience_AUDIENCE_NONE; } -std::string AttConverterBase::BTremLogFormToStr(bTremLog_FORM data) const -{ - std::string value; - switch (data) { - case bTremLog_FORM_meas: value = "meas"; break; - case bTremLog_FORM_unmeas: value = "unmeas"; break; - default: - LogWarning("Unknown value '%d' for att.bTrem.log@form", data); - value = ""; - break; - } - return value; -} - -bTremLog_FORM AttConverterBase::StrToBTremLogForm(const std::string &value, bool logWarning) const -{ - if (value == "meas") return bTremLog_FORM_meas; - if (value == "unmeas") return bTremLog_FORM_unmeas; - if (logWarning && !value.empty()) - LogWarning("Unsupported value '%s' for att.bTrem.log@form", value.c_str()); - return bTremLog_FORM_NONE; -} - std::string AttConverterBase::BeamRendFormToStr(beamRend_FORM data) const { std::string value; @@ -4007,6 +4037,29 @@ curvature_CURVEDIR AttConverterBase::StrToCurvatureCurvedir(const std::string &v return curvature_CURVEDIR_NONE; } +std::string AttConverterBase::CurvatureDirectionCurveToStr(curvatureDirection_CURVE data) const +{ + std::string value; + switch (data) { + case curvatureDirection_CURVE_a: value = "a"; break; + case curvatureDirection_CURVE_c: value = "c"; break; + default: + LogWarning("Unknown value '%d' for att.curvatureDirection@curve", data); + value = ""; + break; + } + return value; +} + +curvatureDirection_CURVE AttConverterBase::StrToCurvatureDirectionCurve(const std::string &value, bool logWarning) const +{ + if (value == "a") return curvatureDirection_CURVE_a; + if (value == "c") return curvatureDirection_CURVE_c; + if (logWarning && !value.empty()) + LogWarning("Unsupported value '%s' for att.curvatureDirection@curve", value.c_str()); + return curvatureDirection_CURVE_NONE; +} + std::string AttConverterBase::CurveLogFuncToStr(curveLog_FUNC data) const { std::string value; @@ -4049,6 +4102,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,48 +4229,25 @@ evidence_EVIDENCE AttConverterBase::StrToEvidenceEvidence(const std::string &val return evidence_EVIDENCE_NONE; } -std::string AttConverterBase::ExtSymGlyphauthToStr(extSym_GLYPHAUTH data) const -{ - std::string value; - switch (data) { - case extSym_GLYPHAUTH_smufl: value = "smufl"; break; - default: - LogWarning("Unknown value '%d' for att.extSym@glyph.auth", data); - value = ""; - break; - } - return value; -} - -extSym_GLYPHAUTH AttConverterBase::StrToExtSymGlyphauth(const std::string &value, bool logWarning) const -{ - if (value == "smufl") return extSym_GLYPHAUTH_smufl; - if (logWarning && !value.empty()) - LogWarning("Unsupported value '%s' for att.extSym@glyph.auth", value.c_str()); - return extSym_GLYPHAUTH_NONE; -} - -std::string AttConverterBase::FTremLogFormToStr(fTremLog_FORM data) const +std::string AttConverterBase::ExtSymAuthGlyphauthToStr(extSymAuth_GLYPHAUTH data) const { std::string value; switch (data) { - case fTremLog_FORM_meas: value = "meas"; break; - case fTremLog_FORM_unmeas: value = "unmeas"; break; + case extSymAuth_GLYPHAUTH_smufl: value = "smufl"; break; default: - LogWarning("Unknown value '%d' for att.fTrem.log@form", data); + LogWarning("Unknown value '%d' for att.extSym.auth@glyph.auth", data); value = ""; break; } return value; } -fTremLog_FORM AttConverterBase::StrToFTremLogForm(const std::string &value, bool logWarning) const +extSymAuth_GLYPHAUTH AttConverterBase::StrToExtSymAuthGlyphauth(const std::string &value, bool logWarning) const { - if (value == "meas") return fTremLog_FORM_meas; - if (value == "unmeas") return fTremLog_FORM_unmeas; + if (value == "smufl") return extSymAuth_GLYPHAUTH_smufl; if (logWarning && !value.empty()) - LogWarning("Unsupported value '%s' for att.fTrem.log@form", value.c_str()); - return fTremLog_FORM_NONE; + LogWarning("Unsupported value '%s' for att.extSym.auth@glyph.auth", value.c_str()); + return extSymAuth_GLYPHAUTH_NONE; } std::string AttConverterBase::FermataVisFormToStr(fermataVis_FORM data) const @@ -4581,29 +4642,6 @@ lineLog_FUNC AttConverterBase::StrToLineLogFunc(const std::string &value, bool l return lineLog_FUNC_NONE; } -std::string AttConverterBase::LiquescentVisCurveToStr(liquescentVis_CURVE data) const -{ - std::string value; - switch (data) { - case liquescentVis_CURVE_a: value = "a"; break; - case liquescentVis_CURVE_c: value = "c"; break; - default: - LogWarning("Unknown value '%d' for att.liquescent.vis@curve", data); - value = ""; - break; - } - return value; -} - -liquescentVis_CURVE AttConverterBase::StrToLiquescentVisCurve(const std::string &value, bool logWarning) const -{ - if (value == "a") return liquescentVis_CURVE_a; - if (value == "c") return liquescentVis_CURVE_c; - if (logWarning && !value.empty()) - LogWarning("Unsupported value '%s' for att.liquescent.vis@curve", value.c_str()); - return liquescentVis_CURVE_NONE; -} - std::string AttConverterBase::MeasurementUnitToStr(measurement_UNIT data) const { std::string value; @@ -4665,8 +4703,11 @@ std::string AttConverterBase::MeiVersionMeiversionToStr(meiVersion_MEIVERSION da case meiVersion_MEIVERSION_3_0_0: value = "3.0.0"; break; case meiVersion_MEIVERSION_4_0_0: value = "4.0.0"; break; case meiVersion_MEIVERSION_4_0_1: value = "4.0.1"; break; - case meiVersion_MEIVERSION_5_0_0_devplusbasic: value = "5.0.0-dev+basic"; break; - case meiVersion_MEIVERSION_5_0_0_dev: value = "5.0.0-dev"; break; + case meiVersion_MEIVERSION_5_0: value = "5.0"; break; + case meiVersion_MEIVERSION_5_0plusbasic: value = "5.0+basic"; break; + case meiVersion_MEIVERSION_5_0plusCMN: value = "5.0+CMN"; break; + case meiVersion_MEIVERSION_5_0plusMensural: value = "5.0+Mensural"; break; + case meiVersion_MEIVERSION_5_0plusNeumes: value = "5.0+Neumes"; break; default: LogWarning("Unknown value '%d' for att.meiVersion@meiversion", data); value = ""; @@ -4681,8 +4722,11 @@ meiVersion_MEIVERSION AttConverterBase::StrToMeiVersionMeiversion(const std::str if (value == "3.0.0") return meiVersion_MEIVERSION_3_0_0; if (value == "4.0.0") return meiVersion_MEIVERSION_4_0_0; if (value == "4.0.1") return meiVersion_MEIVERSION_4_0_1; - if (value == "5.0.0-dev+basic") return meiVersion_MEIVERSION_5_0_0_devplusbasic; - if (value == "5.0.0-dev") return meiVersion_MEIVERSION_5_0_0_dev; + if (value == "5.0") return meiVersion_MEIVERSION_5_0; + if (value == "5.0+basic") return meiVersion_MEIVERSION_5_0plusbasic; + if (value == "5.0+CMN") return meiVersion_MEIVERSION_5_0plusCMN; + if (value == "5.0+Mensural") return meiVersion_MEIVERSION_5_0plusMensural; + if (value == "5.0+Neumes") return meiVersion_MEIVERSION_5_0plusNeumes; if (logWarning && !value.empty()) LogWarning("Unsupported value '%s' for att.meiVersion@meiversion", value.c_str()); return meiVersion_MEIVERSION_NONE; @@ -4834,50 +4878,86 @@ ncForm_CON AttConverterBase::StrToNcFormCon(const std::string &value, bool logWa return ncForm_CON_NONE; } -std::string AttConverterBase::NcFormCurveToStr(ncForm_CURVE data) const +std::string AttConverterBase::NcFormRellenToStr(ncForm_RELLEN data) const { std::string value; switch (data) { - case ncForm_CURVE_a: value = "a"; break; - case ncForm_CURVE_c: value = "c"; break; + case ncForm_RELLEN_l: value = "l"; break; + case ncForm_RELLEN_s: value = "s"; break; default: - LogWarning("Unknown value '%d' for att.ncForm@curve", data); + LogWarning("Unknown value '%d' for att.ncForm@rellen", data); value = ""; break; } return value; } -ncForm_CURVE AttConverterBase::StrToNcFormCurve(const std::string &value, bool logWarning) const +ncForm_RELLEN AttConverterBase::StrToNcFormRellen(const std::string &value, bool logWarning) const { - if (value == "a") return ncForm_CURVE_a; - if (value == "c") return ncForm_CURVE_c; + if (value == "l") return ncForm_RELLEN_l; + if (value == "s") return ncForm_RELLEN_s; if (logWarning && !value.empty()) - LogWarning("Unsupported value '%s' for att.ncForm@curve", value.c_str()); - return ncForm_CURVE_NONE; + LogWarning("Unsupported value '%s' for att.ncForm@rellen", value.c_str()); + return ncForm_RELLEN_NONE; } -std::string AttConverterBase::NcFormRellenToStr(ncForm_RELLEN data) const +std::string AttConverterBase::NeumeTypeTypeToStr(neumeType_TYPE data) const { std::string value; switch (data) { - case ncForm_RELLEN_l: value = "l"; break; - case ncForm_RELLEN_s: value = "s"; break; + case neumeType_TYPE_apostropha: value = "apostropha"; break; + case neumeType_TYPE_bistropha: value = "bistropha"; break; + case neumeType_TYPE_climacus: value = "climacus"; break; + case neumeType_TYPE_clivis: value = "clivis"; break; + case neumeType_TYPE_oriscus: value = "oriscus"; break; + case neumeType_TYPE_pes: value = "pes"; break; + case neumeType_TYPE_pessubpunctis: value = "pessubpunctis"; break; + case neumeType_TYPE_porrectus: value = "porrectus"; break; + case neumeType_TYPE_porrectusflexus: value = "porrectusflexus"; break; + case neumeType_TYPE_pressusmaior: value = "pressusmaior"; break; + case neumeType_TYPE_pressusminor: value = "pressusminor"; break; + case neumeType_TYPE_punctum: value = "punctum"; break; + case neumeType_TYPE_quilisma: value = "quilisma"; break; + case neumeType_TYPE_scandicus: value = "scandicus"; break; + case neumeType_TYPE_strophicus: value = "strophicus"; break; + case neumeType_TYPE_torculus: value = "torculus"; break; + case neumeType_TYPE_torculusresupinus: value = "torculusresupinus"; break; + case neumeType_TYPE_tristropha: value = "tristropha"; break; + case neumeType_TYPE_virga: value = "virga"; break; + case neumeType_TYPE_virgastrata: value = "virgastrata"; break; default: - LogWarning("Unknown value '%d' for att.ncForm@rellen", data); + LogWarning("Unknown value '%d' for att.neumeType@type", data); value = ""; break; } return value; } -ncForm_RELLEN AttConverterBase::StrToNcFormRellen(const std::string &value, bool logWarning) const +neumeType_TYPE AttConverterBase::StrToNeumeTypeType(const std::string &value, bool logWarning) const { - if (value == "l") return ncForm_RELLEN_l; - if (value == "s") return ncForm_RELLEN_s; + if (value == "apostropha") return neumeType_TYPE_apostropha; + if (value == "bistropha") return neumeType_TYPE_bistropha; + if (value == "climacus") return neumeType_TYPE_climacus; + if (value == "clivis") return neumeType_TYPE_clivis; + if (value == "oriscus") return neumeType_TYPE_oriscus; + if (value == "pes") return neumeType_TYPE_pes; + if (value == "pessubpunctis") return neumeType_TYPE_pessubpunctis; + if (value == "porrectus") return neumeType_TYPE_porrectus; + if (value == "porrectusflexus") return neumeType_TYPE_porrectusflexus; + if (value == "pressusmaior") return neumeType_TYPE_pressusmaior; + if (value == "pressusminor") return neumeType_TYPE_pressusminor; + if (value == "punctum") return neumeType_TYPE_punctum; + if (value == "quilisma") return neumeType_TYPE_quilisma; + if (value == "scandicus") return neumeType_TYPE_scandicus; + if (value == "strophicus") return neumeType_TYPE_strophicus; + if (value == "torculus") return neumeType_TYPE_torculus; + if (value == "torculusresupinus") return neumeType_TYPE_torculusresupinus; + if (value == "tristropha") return neumeType_TYPE_tristropha; + if (value == "virga") return neumeType_TYPE_virga; + if (value == "virgastrata") return neumeType_TYPE_virgastrata; if (logWarning && !value.empty()) - LogWarning("Unsupported value '%s' for att.ncForm@rellen", value.c_str()); - return ncForm_RELLEN_NONE; + LogWarning("Unsupported value '%s' for att.neumeType@type", value.c_str()); + return neumeType_TYPE_NONE; } std::string AttConverterBase::NoteGesExtremisToStr(noteGes_EXTREMIS data) const @@ -5173,6 +5253,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; @@ -5337,6 +5446,29 @@ tempoLog_FUNC AttConverterBase::StrToTempoLogFunc(const std::string &value, bool return tempoLog_FUNC_NONE; } +std::string AttConverterBase::TremFormFormToStr(tremForm_FORM data) const +{ + std::string value; + switch (data) { + case tremForm_FORM_meas: value = "meas"; break; + case tremForm_FORM_unmeas: value = "unmeas"; break; + default: + LogWarning("Unknown value '%d' for att.tremForm@form", data); + value = ""; + break; + } + return value; +} + +tremForm_FORM AttConverterBase::StrToTremFormForm(const std::string &value, bool logWarning) const +{ + if (value == "meas") return tremForm_FORM_meas; + if (value == "unmeas") return tremForm_FORM_unmeas; + if (logWarning && !value.empty()) + LogWarning("Unsupported value '%s' for att.tremForm@form", value.c_str()); + return tremForm_FORM_NONE; +} + std::string AttConverterBase::TupletVisNumformatToStr(tupletVis_NUMFORMAT data) const { std::string value; diff --git a/libmei/dist/attconverter.h b/libmei/dist/attconverter.h index 284bf7daf44..5d158e75565 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; @@ -297,9 +300,6 @@ class AttConverterBase { std::string AudienceAudienceToStr(audience_AUDIENCE data) const; audience_AUDIENCE StrToAudienceAudience(const std::string &value, bool logWarning = true) const; - std::string BTremLogFormToStr(bTremLog_FORM data) const; - bTremLog_FORM StrToBTremLogForm(const std::string &value, bool logWarning = true) const; - std::string BeamRendFormToStr(beamRend_FORM data) const; beamRend_FORM StrToBeamRendForm(const std::string &value, bool logWarning = true) const; @@ -312,12 +312,18 @@ class AttConverterBase { std::string CurvatureCurvedirToStr(curvature_CURVEDIR data) const; curvature_CURVEDIR StrToCurvatureCurvedir(const std::string &value, bool logWarning = true) const; + std::string CurvatureDirectionCurveToStr(curvatureDirection_CURVE data) const; + curvatureDirection_CURVE StrToCurvatureDirectionCurve(const std::string &value, bool logWarning = true) const; + std::string CurveLogFuncToStr(curveLog_FUNC data) const; curveLog_FUNC StrToCurveLogFunc(const std::string &value, bool logWarning = true) const; 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,11 +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 FTremLogFormToStr(fTremLog_FORM data) const; - fTremLog_FORM StrToFTremLogForm(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 FermataVisFormToStr(fermataVis_FORM data) const; fermataVis_FORM StrToFermataVisForm(const std::string &value, bool logWarning = true) const; @@ -384,9 +387,6 @@ class AttConverterBase { std::string LineLogFuncToStr(lineLog_FUNC data) const; lineLog_FUNC StrToLineLogFunc(const std::string &value, bool logWarning = true) const; - std::string LiquescentVisCurveToStr(liquescentVis_CURVE data) const; - liquescentVis_CURVE StrToLiquescentVisCurve(const std::string &value, bool logWarning = true) const; - std::string MeasurementUnitToStr(measurement_UNIT data) const; measurement_UNIT StrToMeasurementUnit(const std::string &value, bool logWarning = true) const; @@ -411,12 +411,12 @@ class AttConverterBase { std::string NcFormConToStr(ncForm_CON data) const; ncForm_CON StrToNcFormCon(const std::string &value, bool logWarning = true) const; - std::string NcFormCurveToStr(ncForm_CURVE data) const; - ncForm_CURVE StrToNcFormCurve(const std::string &value, bool logWarning = true) const; - std::string NcFormRellenToStr(ncForm_RELLEN data) const; ncForm_RELLEN StrToNcFormRellen(const std::string &value, bool logWarning = true) const; + std::string NeumeTypeTypeToStr(neumeType_TYPE data) const; + neumeType_TYPE StrToNeumeTypeType(const std::string &value, bool logWarning = true) const; + std::string NoteGesExtremisToStr(noteGes_EXTREMIS data) const; noteGes_EXTREMIS StrToNoteGesExtremis(const std::string &value, bool logWarning = true) const; @@ -450,6 +450,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; @@ -468,6 +471,9 @@ class AttConverterBase { std::string TempoLogFuncToStr(tempoLog_FUNC data) const; tempoLog_FUNC StrToTempoLogFunc(const std::string &value, bool logWarning = true) const; + std::string TremFormFormToStr(tremForm_FORM data) const; + tremForm_FORM StrToTremFormForm(const std::string &value, bool logWarning = true) const; + std::string TupletVisNumformatToStr(tupletVis_NUMFORMAT data) const; tupletVis_NUMFORMAT StrToTupletVisNumformat(const std::string &value, bool logWarning = true) const; diff --git a/libmei/dist/attmodule.cpp b/libmei/dist/attmodule.cpp index c1db66d316c..74f400b5c03 100644 --- a/libmei/dist/attmodule.cpp +++ b/libmei/dist/attmodule.cpp @@ -106,14 +106,6 @@ bool AttModule::SetAnalytical(Object *element, const std::string &attrType, cons return true; } } - if (element->HasAttClass(ATT_KEYSIGANL)) { - AttKeySigAnl *att = dynamic_cast(element); - assert(att); - if (attrType == "mode") { - att->SetMode(att->StrToMode(attrValue)); - return true; - } - } if (element->HasAttClass(ATT_KEYSIGDEFAULTANL)) { AttKeySigDefaultAnl *att = dynamic_cast(element); assert(att); @@ -188,13 +180,6 @@ void AttModule::GetAnalytical(const Object *element, ArrayOfStrAttr *attributes) attributes->push_back({ "intm", att->StrToStr(att->GetIntm()) }); } } - if (element->HasAttClass(ATT_KEYSIGANL)) { - const AttKeySigAnl *att = dynamic_cast(element); - assert(att); - if (att->HasMode()) { - attributes->push_back({ "mode", att->ModeToStr(att->GetMode()) }); - } - } if (element->HasAttClass(ATT_KEYSIGDEFAULTANL)) { const AttKeySigDefaultAnl *att = dynamic_cast(element); assert(att); @@ -251,14 +236,6 @@ bool AttModule::SetCmn(Object *element, const std::string &attrType, const std:: return true; } } - if (element->HasAttClass(ATT_BTREMLOG)) { - AttBTremLog *att = dynamic_cast(element); - assert(att); - if (attrType == "form") { - att->SetForm(att->StrToBTremLogForm(attrValue)); - return true; - } - } if (element->HasAttClass(ATT_BEAMPRESENT)) { AttBeamPresent *att = dynamic_cast(element); assert(att); @@ -347,14 +324,6 @@ bool AttModule::SetCmn(Object *element, const std::string &attrType, const std:: return true; } } - if (element->HasAttClass(ATT_FTREMLOG)) { - AttFTremLog *att = dynamic_cast(element); - assert(att); - if (attrType == "form") { - att->SetForm(att->StrToFTremLogForm(attrValue)); - return true; - } - } if (element->HasAttClass(ATT_GLISSPRESENT)) { AttGlissPresent *att = dynamic_cast(element); assert(att); @@ -511,14 +480,6 @@ bool AttModule::SetCmn(Object *element, const std::string &attrType, const std:: return true; } } - if (element->HasAttClass(ATT_SCOREDEFVISCMN)) { - AttScoreDefVisCmn *att = dynamic_cast(element); - assert(att); - if (attrType == "grid.show") { - att->SetGridShow(att->StrToBoolean(attrValue)); - return true; - } - } if (element->HasAttClass(ATT_SLURREND)) { AttSlurRend *att = dynamic_cast(element); assert(att); @@ -551,6 +512,14 @@ bool AttModule::SetCmn(Object *element, const std::string &attrType, const std:: return true; } } + if (element->HasAttClass(ATT_TREMFORM)) { + AttTremForm *att = dynamic_cast(element); + assert(att); + if (attrType == "form") { + att->SetForm(att->StrToTremFormForm(attrValue)); + return true; + } + } if (element->HasAttClass(ATT_TREMMEASURED)) { AttTremMeasured *att = dynamic_cast(element); assert(att); @@ -572,13 +541,6 @@ void AttModule::GetCmn(const Object *element, ArrayOfStrAttr *attributes) attributes->push_back({ "order", att->ArpegLogOrderToStr(att->GetOrder()) }); } } - if (element->HasAttClass(ATT_BTREMLOG)) { - const AttBTremLog *att = dynamic_cast(element); - assert(att); - if (att->HasForm()) { - attributes->push_back({ "form", att->BTremLogFormToStr(att->GetForm()) }); - } - } if (element->HasAttClass(ATT_BEAMPRESENT)) { const AttBeamPresent *att = dynamic_cast(element); assert(att); @@ -654,13 +616,6 @@ void AttModule::GetCmn(const Object *element, ArrayOfStrAttr *attributes) attributes->push_back({ "expand", att->BooleanToStr(att->GetExpand()) }); } } - if (element->HasAttClass(ATT_FTREMLOG)) { - const AttFTremLog *att = dynamic_cast(element); - assert(att); - if (att->HasForm()) { - attributes->push_back({ "form", att->FTremLogFormToStr(att->GetForm()) }); - } - } if (element->HasAttClass(ATT_GLISSPRESENT)) { const AttGlissPresent *att = dynamic_cast(element); assert(att); @@ -792,13 +747,6 @@ void AttModule::GetCmn(const Object *element, ArrayOfStrAttr *attributes) attributes->push_back({ "reh.enclose", att->RehearsalRehencloseToStr(att->GetRehEnclose()) }); } } - if (element->HasAttClass(ATT_SCOREDEFVISCMN)) { - const AttScoreDefVisCmn *att = dynamic_cast(element); - assert(att); - if (att->HasGridShow()) { - attributes->push_back({ "grid.show", att->BooleanToStr(att->GetGridShow()) }); - } - } if (element->HasAttClass(ATT_SLURREND)) { const AttSlurRend *att = dynamic_cast(element); assert(att); @@ -826,6 +774,13 @@ void AttModule::GetCmn(const Object *element, ArrayOfStrAttr *attributes) attributes->push_back({ "tie.lwidth", att->LinewidthToStr(att->GetTieLwidth()) }); } } + if (element->HasAttClass(ATT_TREMFORM)) { + const AttTremForm *att = dynamic_cast(element); + assert(att); + if (att->HasForm()) { + attributes->push_back({ "form", att->TremFormFormToStr(att->GetForm()) }); + } + } if (element->HasAttClass(ATT_TREMMEASURED)) { const AttTremMeasured *att = dynamic_cast(element); assert(att); @@ -1033,13 +988,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 +1011,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 +1018,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()) }); - } } } @@ -1274,6 +1237,14 @@ bool AttModule::SetGestural(Object *element, const std::string &attrType, const return true; } } + if (element->HasAttClass(ATT_ATTACKING)) { + AttAttacking *att = dynamic_cast(element); + assert(att); + if (attrType == "attacca") { + att->SetAttacca(att->StrToBoolean(attrValue)); + return true; + } + } if (element->HasAttClass(ATT_BENDGES)) { AttBendGes *att = dynamic_cast(element); assert(att); @@ -1310,30 +1281,6 @@ bool AttModule::SetGestural(Object *element, const std::string &attrType, const return true; } } - if (element->HasAttClass(ATT_MDIVGES)) { - AttMdivGes *att = dynamic_cast(element); - assert(att); - if (attrType == "attacca") { - att->SetAttacca(att->StrToBoolean(attrValue)); - return true; - } - } - if (element->HasAttClass(ATT_NCGES)) { - AttNcGes *att = dynamic_cast(element); - assert(att); - if (attrType == "oct.ges") { - att->SetOctGes(att->StrToOctave(attrValue)); - return true; - } - if (attrType == "pname.ges") { - att->SetPnameGes(att->StrToPitchname(attrValue)); - return true; - } - if (attrType == "pnum") { - att->SetPnum(att->StrToInt(attrValue)); - return true; - } - } if (element->HasAttClass(ATT_NOTEGES)) { AttNoteGes *att = dynamic_cast(element); assert(att); @@ -1341,18 +1288,6 @@ bool AttModule::SetGestural(Object *element, const std::string &attrType, const att->SetExtremis(att->StrToNoteGesExtremis(attrValue)); return true; } - if (attrType == "oct.ges") { - att->SetOctGes(att->StrToOctave(attrValue)); - return true; - } - if (attrType == "pname.ges") { - att->SetPnameGes(att->StrToPitchname(attrValue)); - return true; - } - if (attrType == "pnum") { - att->SetPnum(att->StrToInt(attrValue)); - return true; - } } if (element->HasAttClass(ATT_ORNAMENTACCIDGES)) { AttOrnamentAccidGes *att = dynamic_cast(element); @@ -1366,11 +1301,19 @@ bool AttModule::SetGestural(Object *element, const std::string &attrType, const return true; } } - if (element->HasAttClass(ATT_SECTIONGES)) { - AttSectionGes *att = dynamic_cast(element); + if (element->HasAttClass(ATT_PITCHGES)) { + AttPitchGes *att = dynamic_cast(element); assert(att); - if (attrType == "attacca") { - att->SetAttacca(att->StrToBoolean(attrValue)); + if (attrType == "oct.ges") { + att->SetOctGes(att->StrToOctave(attrValue)); + return true; + } + if (attrType == "pname.ges") { + att->SetPnameGes(att->StrToPitchname(attrValue)); + return true; + } + if (attrType == "pnum") { + att->SetPnum(att->StrToInt(attrValue)); return true; } } @@ -1430,6 +1373,13 @@ void AttModule::GetGestural(const Object *element, ArrayOfStrAttr *attributes) attributes->push_back({ "artic.ges", att->ArticulationListToStr(att->GetArticGes()) }); } } + if (element->HasAttClass(ATT_ATTACKING)) { + const AttAttacking *att = dynamic_cast(element); + assert(att); + if (att->HasAttacca()) { + attributes->push_back({ "attacca", att->BooleanToStr(att->GetAttacca()) }); + } + } if (element->HasAttClass(ATT_BENDGES)) { const AttBendGes *att = dynamic_cast(element); assert(att); @@ -1459,41 +1409,12 @@ void AttModule::GetGestural(const Object *element, ArrayOfStrAttr *attributes) attributes->push_back({ "dur.recip", att->StrToStr(att->GetDurRecip()) }); } } - if (element->HasAttClass(ATT_MDIVGES)) { - const AttMdivGes *att = dynamic_cast(element); - assert(att); - if (att->HasAttacca()) { - attributes->push_back({ "attacca", att->BooleanToStr(att->GetAttacca()) }); - } - } - if (element->HasAttClass(ATT_NCGES)) { - const AttNcGes *att = dynamic_cast(element); - assert(att); - if (att->HasOctGes()) { - attributes->push_back({ "oct.ges", att->OctaveToStr(att->GetOctGes()) }); - } - if (att->HasPnameGes()) { - attributes->push_back({ "pname.ges", att->PitchnameToStr(att->GetPnameGes()) }); - } - if (att->HasPnum()) { - attributes->push_back({ "pnum", att->IntToStr(att->GetPnum()) }); - } - } if (element->HasAttClass(ATT_NOTEGES)) { const AttNoteGes *att = dynamic_cast(element); assert(att); if (att->HasExtremis()) { attributes->push_back({ "extremis", att->NoteGesExtremisToStr(att->GetExtremis()) }); } - if (att->HasOctGes()) { - attributes->push_back({ "oct.ges", att->OctaveToStr(att->GetOctGes()) }); - } - if (att->HasPnameGes()) { - attributes->push_back({ "pname.ges", att->PitchnameToStr(att->GetPnameGes()) }); - } - if (att->HasPnum()) { - attributes->push_back({ "pnum", att->IntToStr(att->GetPnum()) }); - } } if (element->HasAttClass(ATT_ORNAMENTACCIDGES)) { const AttOrnamentAccidGes *att = dynamic_cast(element); @@ -1505,11 +1426,17 @@ void AttModule::GetGestural(const Object *element, ArrayOfStrAttr *attributes) attributes->push_back({ "accidlower.ges", att->AccidentalGesturalToStr(att->GetAccidlowerGes()) }); } } - if (element->HasAttClass(ATT_SECTIONGES)) { - const AttSectionGes *att = dynamic_cast(element); + if (element->HasAttClass(ATT_PITCHGES)) { + const AttPitchGes *att = dynamic_cast(element); assert(att); - if (att->HasAttacca()) { - attributes->push_back({ "attacca", att->BooleanToStr(att->GetAttacca()) }); + if (att->HasOctGes()) { + attributes->push_back({ "oct.ges", att->OctaveToStr(att->GetOctGes()) }); + } + if (att->HasPnameGes()) { + attributes->push_back({ "pname.ges", att->PitchnameToStr(att->GetPnameGes()) }); + } + if (att->HasPnum()) { + attributes->push_back({ "pnum", att->IntToStr(att->GetPnum()) }); } } if (element->HasAttClass(ATT_SOUNDLOCATION)) { @@ -1591,6 +1518,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 +1558,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 +1596,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 +1629,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 +2034,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->StrToDivLineLogForm(attrValue)); + return true; + } + } if (element->HasAttClass(ATT_NCLOG)) { AttNcLog *att = dynamic_cast(element); assert(att); @@ -2085,10 +2065,6 @@ bool AttModule::SetNeumes(Object *element, const std::string &attrType, const st att->SetCon(att->StrToNcFormCon(attrValue)); return true; } - if (attrType == "curve") { - att->SetCurve(att->StrToNcFormCurve(attrValue)); - return true; - } if (attrType == "hooked") { att->SetHooked(att->StrToBoolean(attrValue)); return true; @@ -2110,12 +2086,27 @@ bool AttModule::SetNeumes(Object *element, const std::string &attrType, const st return true; } } + if (element->HasAttClass(ATT_NEUMETYPE)) { + AttNeumeType *att = dynamic_cast(element); + assert(att); + if (attrType == "type") { + att->SetType(att->StrToStr(attrValue)); + return true; + } + } return false; } 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->DivLineLogFormToStr(att->GetForm()) }); + } + } if (element->HasAttClass(ATT_NCLOG)) { const AttNcLog *att = dynamic_cast(element); assert(att); @@ -2135,9 +2126,6 @@ void AttModule::GetNeumes(const Object *element, ArrayOfStrAttr *attributes) if (att->HasCon()) { attributes->push_back({ "con", att->NcFormConToStr(att->GetCon()) }); } - if (att->HasCurve()) { - attributes->push_back({ "curve", att->NcFormCurveToStr(att->GetCurve()) }); - } if (att->HasHooked()) { attributes->push_back({ "hooked", att->BooleanToStr(att->GetHooked()) }); } @@ -2154,6 +2142,13 @@ void AttModule::GetNeumes(const Object *element, ArrayOfStrAttr *attributes) attributes->push_back({ "tilt", att->CompassdirectionToStr(att->GetTilt()) }); } } + if (element->HasAttClass(ATT_NEUMETYPE)) { + const AttNeumeType *att = dynamic_cast(element); + assert(att); + if (att->HasType()) { + attributes->push_back({ "type", att->StrToStr(att->GetType()) }); + } + } } } // namespace vrv @@ -2462,14 +2457,6 @@ bool AttModule::SetShared(Object *element, const std::string &attrType, const st if (element->HasAttClass(ATT_COORDINATED)) { AttCoordinated *att = dynamic_cast(element); assert(att); - if (attrType == "ulx") { - att->SetUlx(att->StrToInt(attrValue)); - return true; - } - if (attrType == "uly") { - att->SetUly(att->StrToInt(attrValue)); - return true; - } if (attrType == "lrx") { att->SetLrx(att->StrToInt(attrValue)); return true; @@ -2483,6 +2470,18 @@ bool AttModule::SetShared(Object *element, const std::string &attrType, const st return true; } } + if (element->HasAttClass(ATT_COORDINATEDUL)) { + AttCoordinatedUl *att = dynamic_cast(element); + assert(att); + if (attrType == "ulx") { + att->SetUlx(att->StrToInt(attrValue)); + return true; + } + if (attrType == "uly") { + att->SetUly(att->StrToInt(attrValue)); + return true; + } + } if (element->HasAttClass(ATT_CUE)) { AttCue *att = dynamic_cast(element); assert(att); @@ -2507,18 +2506,6 @@ bool AttModule::SetShared(Object *element, const std::string &attrType, const st return true; } } - if (element->HasAttClass(ATT_CURVEREND)) { - AttCurveRend *att = dynamic_cast(element); - assert(att); - if (attrType == "lform") { - att->SetLform(att->StrToLineform(attrValue)); - return true; - } - if (attrType == "lwidth") { - att->SetLwidth(att->StrToLinewidth(attrValue)); - return true; - } - } if (element->HasAttClass(ATT_CUSTOSLOG)) { AttCustosLog *att = dynamic_cast(element); assert(att); @@ -2695,6 +2682,14 @@ bool AttModule::SetShared(Object *element, const std::string &attrType, const st return true; } } + if (element->HasAttClass(ATT_FORMEWORK)) { + AttFormework *att = dynamic_cast(element); + assert(att); + if (attrType == "func") { + att->SetFunc(att->StrToPgfunc(attrValue)); + return true; + } + } if (element->HasAttClass(ATT_GRPSYMLOG)) { AttGrpSymLog *att = dynamic_cast(element); assert(att); @@ -2743,6 +2738,14 @@ bool AttModule::SetShared(Object *element, const std::string &attrType, const st return true; } } + if (element->HasAttClass(ATT_KEYMODE)) { + AttKeyMode *att = dynamic_cast(element); + assert(att); + if (attrType == "mode") { + att->SetMode(att->StrToMode(attrValue)); + return true; + } + } if (element->HasAttClass(ATT_KEYSIGLOG)) { AttKeySigLog *att = dynamic_cast(element); assert(att); @@ -2754,8 +2757,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; } } @@ -2830,14 +2833,14 @@ bool AttModule::SetShared(Object *element, const std::string &attrType, const st att->SetLform(att->StrToLineform(attrValue)); return true; } - if (attrType == "lsegs") { - att->SetLsegs(att->StrToInt(attrValue)); - return true; - } if (attrType == "lwidth") { att->SetLwidth(att->StrToLinewidth(attrValue)); return true; } + if (attrType == "lsegs") { + att->SetLsegs(att->StrToInt(attrValue)); + return true; + } } if (element->HasAttClass(ATT_LINKING)) { AttLinking *att = dynamic_cast(element); @@ -2951,6 +2954,14 @@ bool AttModule::SetShared(Object *element, const std::string &attrType, const st return true; } } + if (element->HasAttClass(ATT_MENSURLOG)) { + AttMensurLog *att = dynamic_cast(element); + assert(att); + if (attrType == "level") { + att->SetLevel(att->StrToDuration(attrValue)); + return true; + } + } if (element->HasAttClass(ATT_METADATAPOINTING)) { AttMetadataPointing *att = dynamic_cast(element); assert(att); @@ -3343,6 +3354,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); @@ -4044,12 +4063,6 @@ void AttModule::GetShared(const Object *element, ArrayOfStrAttr *attributes) if (element->HasAttClass(ATT_COORDINATED)) { const AttCoordinated *att = dynamic_cast(element); assert(att); - if (att->HasUlx()) { - attributes->push_back({ "ulx", att->IntToStr(att->GetUlx()) }); - } - if (att->HasUly()) { - attributes->push_back({ "uly", att->IntToStr(att->GetUly()) }); - } if (att->HasLrx()) { attributes->push_back({ "lrx", att->IntToStr(att->GetLrx()) }); } @@ -4060,6 +4073,16 @@ void AttModule::GetShared(const Object *element, ArrayOfStrAttr *attributes) attributes->push_back({ "rotate", att->DblToStr(att->GetRotate()) }); } } + if (element->HasAttClass(ATT_COORDINATEDUL)) { + const AttCoordinatedUl *att = dynamic_cast(element); + assert(att); + if (att->HasUlx()) { + attributes->push_back({ "ulx", att->IntToStr(att->GetUlx()) }); + } + if (att->HasUly()) { + attributes->push_back({ "uly", att->IntToStr(att->GetUly()) }); + } + } if (element->HasAttClass(ATT_CUE)) { const AttCue *att = dynamic_cast(element); assert(att); @@ -4080,16 +4103,6 @@ void AttModule::GetShared(const Object *element, ArrayOfStrAttr *attributes) attributes->push_back({ "curvedir", att->CurvatureCurvedirToStr(att->GetCurvedir()) }); } } - if (element->HasAttClass(ATT_CURVEREND)) { - const AttCurveRend *att = dynamic_cast(element); - assert(att); - if (att->HasLform()) { - attributes->push_back({ "lform", att->LineformToStr(att->GetLform()) }); - } - if (att->HasLwidth()) { - attributes->push_back({ "lwidth", att->LinewidthToStr(att->GetLwidth()) }); - } - } if (element->HasAttClass(ATT_CUSTOSLOG)) { const AttCustosLog *att = dynamic_cast(element); assert(att); @@ -4238,6 +4251,13 @@ void AttModule::GetShared(const Object *element, ArrayOfStrAttr *attributes) attributes->push_back({ "nonfiling", att->IntToStr(att->GetNonfiling()) }); } } + if (element->HasAttClass(ATT_FORMEWORK)) { + const AttFormework *att = dynamic_cast(element); + assert(att); + if (att->HasFunc()) { + attributes->push_back({ "func", att->PgfuncToStr(att->GetFunc()) }); + } + } if (element->HasAttClass(ATT_GRPSYMLOG)) { const AttGrpSymLog *att = dynamic_cast(element); assert(att); @@ -4280,6 +4300,13 @@ void AttModule::GetShared(const Object *element, ArrayOfStrAttr *attributes) attributes->push_back({ "join", att->StrToStr(att->GetJoin()) }); } } + if (element->HasAttClass(ATT_KEYMODE)) { + const AttKeyMode *att = dynamic_cast(element); + assert(att); + if (att->HasMode()) { + attributes->push_back({ "mode", att->ModeToStr(att->GetMode()) }); + } + } if (element->HasAttClass(ATT_KEYSIGLOG)) { const AttKeySigLog *att = dynamic_cast(element); assert(att); @@ -4290,8 +4317,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)) { @@ -4354,12 +4381,12 @@ void AttModule::GetShared(const Object *element, ArrayOfStrAttr *attributes) if (att->HasLform()) { attributes->push_back({ "lform", att->LineformToStr(att->GetLform()) }); } - if (att->HasLsegs()) { - attributes->push_back({ "lsegs", att->IntToStr(att->GetLsegs()) }); - } if (att->HasLwidth()) { attributes->push_back({ "lwidth", att->LinewidthToStr(att->GetLwidth()) }); } + if (att->HasLsegs()) { + attributes->push_back({ "lsegs", att->IntToStr(att->GetLsegs()) }); + } } if (element->HasAttClass(ATT_LINKING)) { const AttLinking *att = dynamic_cast(element); @@ -4452,6 +4479,13 @@ void AttModule::GetShared(const Object *element, ArrayOfStrAttr *attributes) attributes->push_back({ "meiversion", att->MeiVersionMeiversionToStr(att->GetMeiversion()) }); } } + if (element->HasAttClass(ATT_MENSURLOG)) { + const AttMensurLog *att = dynamic_cast(element); + assert(att); + if (att->HasLevel()) { + attributes->push_back({ "level", att->DurationToStr(att->GetLevel()) }); + } + } if (element->HasAttClass(ATT_METADATAPOINTING)) { const AttMetadataPointing *att = dynamic_cast(element); assert(att); @@ -4777,6 +4811,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); @@ -5339,14 +5380,6 @@ bool AttModule::SetVisual(Object *element, const std::string &attrType, const st att->SetArrowFillcolor(att->StrToStr(attrValue)); return true; } - if (attrType == "line.form") { - att->SetLineForm(att->StrToLineform(attrValue)); - return true; - } - if (attrType == "line.width") { - att->SetLineWidth(att->StrToLinewidth(attrValue)); - return true; - } } if (element->HasAttClass(ATT_BARLINEVIS)) { AttBarLineVis *att = dynamic_cast(element); @@ -5408,6 +5441,14 @@ bool AttModule::SetVisual(Object *element, const std::string &attrType, const st return true; } } + if (element->HasAttClass(ATT_CURVATUREDIRECTION)) { + AttCurvatureDirection *att = dynamic_cast(element); + assert(att); + if (attrType == "curve") { + att->SetCurve(att->StrToCurvatureDirectionCurve(attrValue)); + return true; + } + } if (element->HasAttClass(ATT_EPISEMAVIS)) { AttEpisemaVis *att = dynamic_cast(element); assert(att); @@ -5456,6 +5497,14 @@ bool AttModule::SetVisual(Object *element, const std::string &attrType, const st return true; } } + if (element->HasAttClass(ATT_GUITARGRIDVIS)) { + AttGuitarGridVis *att = dynamic_cast(element); + assert(att); + if (attrType == "grid.show") { + att->SetGridShow(att->StrToBoolean(attrValue)); + return true; + } + } if (element->HasAttClass(ATT_HAIRPINVIS)) { AttHairpinVis *att = dynamic_cast(element); assert(att); @@ -5499,20 +5548,20 @@ 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.show") { - att->SetKeysigShow(att->StrToBoolean(attrValue)); + if (attrType == "keysig.cancelaccid") { + att->SetKeysigCancelaccid(att->StrToCancelaccid(attrValue)); return true; } - if (attrType == "keysig.showchange") { - att->SetKeysigShowchange(att->StrToBoolean(attrValue)); + if (attrType == "keysig.visible") { + att->SetKeysigVisible(att->StrToBoolean(attrValue)); return true; } } @@ -5555,10 +5604,6 @@ bool AttModule::SetVisual(Object *element, const std::string &attrType, const st if (element->HasAttClass(ATT_LIQUESCENTVIS)) { AttLiquescentVis *att = dynamic_cast(element); assert(att); - if (attrType == "curve") { - att->SetCurve(att->StrToLiquescentVisCurve(attrValue)); - return true; - } if (attrType == "looped") { att->SetLooped(att->StrToBoolean(attrValue)); return true; @@ -5639,6 +5684,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); @@ -5727,10 +5776,6 @@ bool AttModule::SetVisual(Object *element, const std::string &attrType, const st if (element->HasAttClass(ATT_STAFFDEFVIS)) { AttStaffDefVis *att = dynamic_cast(element); assert(att); - if (attrType == "grid.show") { - att->SetGridShow(att->StrToBoolean(attrValue)); - return true; - } if (attrType == "layerscheme") { att->SetLayerscheme(att->StrToLayerscheme(attrValue)); return true; @@ -5835,12 +5880,6 @@ void AttModule::GetVisual(const Object *element, ArrayOfStrAttr *attributes) if (att->HasArrowFillcolor()) { attributes->push_back({ "arrow.fillcolor", att->StrToStr(att->GetArrowFillcolor()) }); } - if (att->HasLineForm()) { - attributes->push_back({ "line.form", att->LineformToStr(att->GetLineForm()) }); - } - if (att->HasLineWidth()) { - attributes->push_back({ "line.width", att->LinewidthToStr(att->GetLineWidth()) }); - } } if (element->HasAttClass(ATT_BARLINEVIS)) { const AttBarLineVis *att = dynamic_cast(element); @@ -5892,6 +5931,13 @@ void AttModule::GetVisual(const Object *element, ArrayOfStrAttr *attributes) attributes->push_back({ "clef.visible", att->BooleanToStr(att->GetClefVisible()) }); } } + if (element->HasAttClass(ATT_CURVATUREDIRECTION)) { + const AttCurvatureDirection *att = dynamic_cast(element); + assert(att); + if (att->HasCurve()) { + attributes->push_back({ "curve", att->CurvatureDirectionCurveToStr(att->GetCurve()) }); + } + } if (element->HasAttClass(ATT_EPISEMAVIS)) { const AttEpisemaVis *att = dynamic_cast(element); assert(att); @@ -5932,6 +5978,13 @@ void AttModule::GetVisual(const Object *element, ArrayOfStrAttr *attributes) attributes->push_back({ "orient", att->FingGrpVisOrientToStr(att->GetOrient()) }); } } + if (element->HasAttClass(ATT_GUITARGRIDVIS)) { + const AttGuitarGridVis *att = dynamic_cast(element); + assert(att); + if (att->HasGridShow()) { + attributes->push_back({ "grid.show", att->BooleanToStr(att->GetGridShow()) }); + } + } if (element->HasAttClass(ATT_HAIRPINVIS)) { const AttHairpinVis *att = dynamic_cast(element); assert(att); @@ -5968,18 +6021,18 @@ 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->HasKeysigShow()) { - attributes->push_back({ "keysig.show", att->BooleanToStr(att->GetKeysigShow()) }); + if (att->HasKeysigCancelaccid()) { + attributes->push_back({ "keysig.cancelaccid", att->CancelaccidToStr(att->GetKeysigCancelaccid()) }); } - 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)) { @@ -6014,9 +6067,6 @@ void AttModule::GetVisual(const Object *element, ArrayOfStrAttr *attributes) if (element->HasAttClass(ATT_LIQUESCENTVIS)) { const AttLiquescentVis *att = dynamic_cast(element); assert(att); - if (att->HasCurve()) { - attributes->push_back({ "curve", att->LiquescentVisCurveToStr(att->GetCurve()) }); - } if (att->HasLooped()) { attributes->push_back({ "looped", att->BooleanToStr(att->GetLooped()) }); } @@ -6081,6 +6131,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); @@ -6158,9 +6211,6 @@ void AttModule::GetVisual(const Object *element, ArrayOfStrAttr *attributes) if (element->HasAttClass(ATT_STAFFDEFVIS)) { const AttStaffDefVis *att = dynamic_cast(element); assert(att); - if (att->HasGridShow()) { - attributes->push_back({ "grid.show", att->BooleanToStr(att->GetGridShow()) }); - } if (att->HasLayerscheme()) { attributes->push_back({ "layerscheme", att->LayerschemeToStr(att->GetLayerscheme()) }); } diff --git a/libmei/dist/atts_analytical.cpp b/libmei/dist/atts_analytical.cpp index 205f2acaa2f..e913cbb8e29 100644 --- a/libmei/dist/atts_analytical.cpp +++ b/libmei/dist/atts_analytical.cpp @@ -182,46 +182,6 @@ bool AttIntervalMelodic::HasIntm() const return (m_intm != ""); } -//---------------------------------------------------------------------------- -// AttKeySigAnl -//---------------------------------------------------------------------------- - -AttKeySigAnl::AttKeySigAnl() : Att() -{ - ResetKeySigAnl(); -} - -void AttKeySigAnl::ResetKeySigAnl() -{ - m_mode = MODE_NONE; -} - -bool AttKeySigAnl::ReadKeySigAnl(pugi::xml_node element, bool removeAttr) -{ - bool hasAttribute = false; - if (element.attribute("mode")) { - this->SetMode(StrToMode(element.attribute("mode").value())); - if (removeAttr) element.remove_attribute("mode"); - hasAttribute = true; - } - return hasAttribute; -} - -bool AttKeySigAnl::WriteKeySigAnl(pugi::xml_node element) -{ - bool wroteAttribute = false; - if (this->HasMode()) { - element.append_attribute("mode") = ModeToStr(this->GetMode()).c_str(); - wroteAttribute = true; - } - return wroteAttribute; -} - -bool AttKeySigAnl::HasMode() const -{ - return (m_mode != MODE_NONE); -} - //---------------------------------------------------------------------------- // AttKeySigDefaultAnl //---------------------------------------------------------------------------- diff --git a/libmei/dist/atts_analytical.h b/libmei/dist/atts_analytical.h index f214943cf8e..8381b948639 100644 --- a/libmei/dist/atts_analytical.h +++ b/libmei/dist/atts_analytical.h @@ -232,55 +232,6 @@ class InstIntervalMelodic : public AttIntervalMelodic { virtual ~InstIntervalMelodic() = default; }; -//---------------------------------------------------------------------------- -// AttKeySigAnl -//---------------------------------------------------------------------------- - -class AttKeySigAnl : public Att { -protected: - AttKeySigAnl(); - ~AttKeySigAnl() = default; - -public: - /** Reset the default values for the attribute class **/ - void ResetKeySigAnl(); - - /** Read the values for the attribute class **/ - bool ReadKeySigAnl(pugi::xml_node element, bool removeAttr = true); - - /** Write the values for the attribute class **/ - bool WriteKeySigAnl(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 SetMode(data_MODE mode_) { m_mode = mode_; } - data_MODE GetMode() const { return m_mode; } - bool HasMode() const; - ///@} - -private: - /** Indicates major, minor, or other tonality. **/ - data_MODE m_mode; -}; - -//---------------------------------------------------------------------------- -// InstKeySigAnl -//---------------------------------------------------------------------------- - -/** - * Instantiable version of AttKeySigAnl - */ - -class InstKeySigAnl : public AttKeySigAnl { -public: - InstKeySigAnl() = default; - virtual ~InstKeySigAnl() = default; -}; - //---------------------------------------------------------------------------- // AttKeySigDefaultAnl //---------------------------------------------------------------------------- diff --git a/libmei/dist/atts_cmn.cpp b/libmei/dist/atts_cmn.cpp index b36be4bd036..837e1dd4f66 100644 --- a/libmei/dist/atts_cmn.cpp +++ b/libmei/dist/atts_cmn.cpp @@ -62,46 +62,6 @@ bool AttArpegLog::HasOrder() const return (m_order != arpegLog_ORDER_NONE); } -//---------------------------------------------------------------------------- -// AttBTremLog -//---------------------------------------------------------------------------- - -AttBTremLog::AttBTremLog() : Att() -{ - ResetBTremLog(); -} - -void AttBTremLog::ResetBTremLog() -{ - m_form = bTremLog_FORM_NONE; -} - -bool AttBTremLog::ReadBTremLog(pugi::xml_node element, bool removeAttr) -{ - bool hasAttribute = false; - if (element.attribute("form")) { - this->SetForm(StrToBTremLogForm(element.attribute("form").value())); - if (removeAttr) element.remove_attribute("form"); - hasAttribute = true; - } - return hasAttribute; -} - -bool AttBTremLog::WriteBTremLog(pugi::xml_node element) -{ - bool wroteAttribute = false; - if (this->HasForm()) { - element.append_attribute("form") = BTremLogFormToStr(this->GetForm()).c_str(); - wroteAttribute = true; - } - return wroteAttribute; -} - -bool AttBTremLog::HasForm() const -{ - return (m_form != bTremLog_FORM_NONE); -} - //---------------------------------------------------------------------------- // AttBeamPresent //---------------------------------------------------------------------------- @@ -522,46 +482,6 @@ bool AttExpandable::HasExpand() const return (m_expand != BOOLEAN_NONE); } -//---------------------------------------------------------------------------- -// AttFTremLog -//---------------------------------------------------------------------------- - -AttFTremLog::AttFTremLog() : Att() -{ - ResetFTremLog(); -} - -void AttFTremLog::ResetFTremLog() -{ - m_form = fTremLog_FORM_NONE; -} - -bool AttFTremLog::ReadFTremLog(pugi::xml_node element, bool removeAttr) -{ - bool hasAttribute = false; - if (element.attribute("form")) { - this->SetForm(StrToFTremLogForm(element.attribute("form").value())); - if (removeAttr) element.remove_attribute("form"); - hasAttribute = true; - } - return hasAttribute; -} - -bool AttFTremLog::WriteFTremLog(pugi::xml_node element) -{ - bool wroteAttribute = false; - if (this->HasForm()) { - element.append_attribute("form") = FTremLogFormToStr(this->GetForm()).c_str(); - wroteAttribute = true; - } - return wroteAttribute; -} - -bool AttFTremLog::HasForm() const -{ - return (m_form != fTremLog_FORM_NONE); -} - //---------------------------------------------------------------------------- // AttGlissPresent //---------------------------------------------------------------------------- @@ -1287,46 +1207,6 @@ bool AttRehearsal::HasRehEnclose() const return (m_rehEnclose != rehearsal_REHENCLOSE_NONE); } -//---------------------------------------------------------------------------- -// AttScoreDefVisCmn -//---------------------------------------------------------------------------- - -AttScoreDefVisCmn::AttScoreDefVisCmn() : Att() -{ - ResetScoreDefVisCmn(); -} - -void AttScoreDefVisCmn::ResetScoreDefVisCmn() -{ - m_gridShow = BOOLEAN_NONE; -} - -bool AttScoreDefVisCmn::ReadScoreDefVisCmn(pugi::xml_node element, bool removeAttr) -{ - bool hasAttribute = false; - if (element.attribute("grid.show")) { - this->SetGridShow(StrToBoolean(element.attribute("grid.show").value())); - if (removeAttr) element.remove_attribute("grid.show"); - hasAttribute = true; - } - return hasAttribute; -} - -bool AttScoreDefVisCmn::WriteScoreDefVisCmn(pugi::xml_node element) -{ - bool wroteAttribute = false; - if (this->HasGridShow()) { - element.append_attribute("grid.show") = BooleanToStr(this->GetGridShow()).c_str(); - wroteAttribute = true; - } - return wroteAttribute; -} - -bool AttScoreDefVisCmn::HasGridShow() const -{ - return (m_gridShow != BOOLEAN_NONE); -} - //---------------------------------------------------------------------------- // AttSlurRend //---------------------------------------------------------------------------- @@ -1477,6 +1357,46 @@ bool AttTieRend::HasTieLwidth() const return (m_tieLwidth.HasValue()); } +//---------------------------------------------------------------------------- +// AttTremForm +//---------------------------------------------------------------------------- + +AttTremForm::AttTremForm() : Att() +{ + ResetTremForm(); +} + +void AttTremForm::ResetTremForm() +{ + m_form = tremForm_FORM_NONE; +} + +bool AttTremForm::ReadTremForm(pugi::xml_node element, bool removeAttr) +{ + bool hasAttribute = false; + if (element.attribute("form")) { + this->SetForm(StrToTremFormForm(element.attribute("form").value())); + if (removeAttr) element.remove_attribute("form"); + hasAttribute = true; + } + return hasAttribute; +} + +bool AttTremForm::WriteTremForm(pugi::xml_node element) +{ + bool wroteAttribute = false; + if (this->HasForm()) { + element.append_attribute("form") = TremFormFormToStr(this->GetForm()).c_str(); + wroteAttribute = true; + } + return wroteAttribute; +} + +bool AttTremForm::HasForm() const +{ + return (m_form != tremForm_FORM_NONE); +} + //---------------------------------------------------------------------------- // AttTremMeasured //---------------------------------------------------------------------------- diff --git a/libmei/dist/atts_cmn.h b/libmei/dist/atts_cmn.h index 747223483ae..83f97531ef0 100644 --- a/libmei/dist/atts_cmn.h +++ b/libmei/dist/atts_cmn.h @@ -74,55 +74,6 @@ class InstArpegLog : public AttArpegLog { virtual ~InstArpegLog() = default; }; -//---------------------------------------------------------------------------- -// AttBTremLog -//---------------------------------------------------------------------------- - -class AttBTremLog : public Att { -protected: - AttBTremLog(); - ~AttBTremLog() = default; - -public: - /** Reset the default values for the attribute class **/ - void ResetBTremLog(); - - /** Read the values for the attribute class **/ - bool ReadBTremLog(pugi::xml_node element, bool removeAttr = true); - - /** Write the values for the attribute class **/ - bool WriteBTremLog(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(bTremLog_FORM form_) { m_form = form_; } - bTremLog_FORM GetForm() const { return m_form; } - bool HasForm() const; - ///@} - -private: - /** Indicates to what degree the harmonic label is supported by the notation. **/ - bTremLog_FORM m_form; -}; - -//---------------------------------------------------------------------------- -// InstBTremLog -//---------------------------------------------------------------------------- - -/** - * Instantiable version of AttBTremLog - */ - -class InstBTremLog : public AttBTremLog { -public: - InstBTremLog() = default; - virtual ~InstBTremLog() = default; -}; - //---------------------------------------------------------------------------- // AttBeamPresent //---------------------------------------------------------------------------- @@ -611,55 +562,6 @@ class InstExpandable : public AttExpandable { virtual ~InstExpandable() = default; }; -//---------------------------------------------------------------------------- -// AttFTremLog -//---------------------------------------------------------------------------- - -class AttFTremLog : public Att { -protected: - AttFTremLog(); - ~AttFTremLog() = default; - -public: - /** Reset the default values for the attribute class **/ - void ResetFTremLog(); - - /** Read the values for the attribute class **/ - bool ReadFTremLog(pugi::xml_node element, bool removeAttr = true); - - /** Write the values for the attribute class **/ - bool WriteFTremLog(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(fTremLog_FORM form_) { m_form = form_; } - fTremLog_FORM GetForm() const { return m_form; } - bool HasForm() const; - ///@} - -private: - /** Indicates to what degree the harmonic label is supported by the notation. **/ - fTremLog_FORM m_form; -}; - -//---------------------------------------------------------------------------- -// InstFTremLog -//---------------------------------------------------------------------------- - -/** - * Instantiable version of AttFTremLog - */ - -class InstFTremLog : public AttFTremLog { -public: - InstFTremLog() = default; - virtual ~InstFTremLog() = default; -}; - //---------------------------------------------------------------------------- // AttGlissPresent //---------------------------------------------------------------------------- @@ -1440,55 +1342,6 @@ class InstRehearsal : public AttRehearsal { virtual ~InstRehearsal() = default; }; -//---------------------------------------------------------------------------- -// AttScoreDefVisCmn -//---------------------------------------------------------------------------- - -class AttScoreDefVisCmn : public Att { -protected: - AttScoreDefVisCmn(); - ~AttScoreDefVisCmn() = default; - -public: - /** Reset the default values for the attribute class **/ - void ResetScoreDefVisCmn(); - - /** Read the values for the attribute class **/ - bool ReadScoreDefVisCmn(pugi::xml_node element, bool removeAttr = true); - - /** Write the values for the attribute class **/ - bool WriteScoreDefVisCmn(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 SetGridShow(data_BOOLEAN gridShow_) { m_gridShow = gridShow_; } - data_BOOLEAN GetGridShow() const { return m_gridShow; } - bool HasGridShow() const; - ///@} - -private: - /** Determines whether to display guitar chord grids. **/ - data_BOOLEAN m_gridShow; -}; - -//---------------------------------------------------------------------------- -// InstScoreDefVisCmn -//---------------------------------------------------------------------------- - -/** - * Instantiable version of AttScoreDefVisCmn - */ - -class InstScoreDefVisCmn : public AttScoreDefVisCmn { -public: - InstScoreDefVisCmn() = default; - virtual ~InstScoreDefVisCmn() = default; -}; - //---------------------------------------------------------------------------- // AttSlurRend //---------------------------------------------------------------------------- @@ -1656,6 +1509,55 @@ class InstTieRend : public AttTieRend { virtual ~InstTieRend() = default; }; +//---------------------------------------------------------------------------- +// AttTremForm +//---------------------------------------------------------------------------- + +class AttTremForm : public Att { +protected: + AttTremForm(); + ~AttTremForm() = default; + +public: + /** Reset the default values for the attribute class **/ + void ResetTremForm(); + + /** Read the values for the attribute class **/ + bool ReadTremForm(pugi::xml_node element, bool removeAttr = true); + + /** Write the values for the attribute class **/ + bool WriteTremForm(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(tremForm_FORM form_) { m_form = form_; } + tremForm_FORM GetForm() const { return m_form; } + bool HasForm() const; + ///@} + +private: + /** Indicates to what degree the harmonic label is supported by the notation. **/ + tremForm_FORM m_form; +}; + +//---------------------------------------------------------------------------- +// InstTremForm +//---------------------------------------------------------------------------- + +/** + * Instantiable version of AttTremForm + */ + +class InstTremForm : public AttTremForm { +public: + InstTremForm() = default; + virtual ~InstTremForm() = default; +}; + //---------------------------------------------------------------------------- // AttTremMeasured //---------------------------------------------------------------------------- diff --git a/libmei/dist/atts_externalsymbols.cpp b/libmei/dist/atts_externalsymbols.cpp index 6b21dfdfcda..8e752de5a7f 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 3c1f35d72fa..c36db9705af 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 d2083ac936a..f5b8af11914 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 b448bd659a6..8407ed57ca5 100644 --- a/libmei/dist/atts_gestural.cpp +++ b/libmei/dist/atts_gestural.cpp @@ -102,6 +102,46 @@ bool AttArticulationGes::HasArticGes() const return (m_articGes != std::vector()); } +//---------------------------------------------------------------------------- +// AttAttacking +//---------------------------------------------------------------------------- + +AttAttacking::AttAttacking() : Att() +{ + ResetAttacking(); +} + +void AttAttacking::ResetAttacking() +{ + m_attacca = BOOLEAN_NONE; +} + +bool AttAttacking::ReadAttacking(pugi::xml_node element, bool removeAttr) +{ + bool hasAttribute = false; + if (element.attribute("attacca")) { + this->SetAttacca(StrToBoolean(element.attribute("attacca").value())); + if (removeAttr) element.remove_attribute("attacca"); + hasAttribute = true; + } + return hasAttribute; +} + +bool AttAttacking::WriteAttacking(pugi::xml_node element) +{ + bool wroteAttribute = false; + if (this->HasAttacca()) { + element.append_attribute("attacca") = BooleanToStr(this->GetAttacca()).c_str(); + wroteAttribute = true; + } + return wroteAttribute; +} + +bool AttAttacking::HasAttacca() const +{ + return (m_attacca != BOOLEAN_NONE); +} + //---------------------------------------------------------------------------- // AttBendGes //---------------------------------------------------------------------------- @@ -257,116 +297,6 @@ bool AttDurationGes::HasDurRecip() const return (m_durRecip != ""); } -//---------------------------------------------------------------------------- -// AttMdivGes -//---------------------------------------------------------------------------- - -AttMdivGes::AttMdivGes() : Att() -{ - ResetMdivGes(); -} - -void AttMdivGes::ResetMdivGes() -{ - m_attacca = BOOLEAN_NONE; -} - -bool AttMdivGes::ReadMdivGes(pugi::xml_node element, bool removeAttr) -{ - bool hasAttribute = false; - if (element.attribute("attacca")) { - this->SetAttacca(StrToBoolean(element.attribute("attacca").value())); - if (removeAttr) element.remove_attribute("attacca"); - hasAttribute = true; - } - return hasAttribute; -} - -bool AttMdivGes::WriteMdivGes(pugi::xml_node element) -{ - bool wroteAttribute = false; - if (this->HasAttacca()) { - element.append_attribute("attacca") = BooleanToStr(this->GetAttacca()).c_str(); - wroteAttribute = true; - } - return wroteAttribute; -} - -bool AttMdivGes::HasAttacca() const -{ - return (m_attacca != BOOLEAN_NONE); -} - -//---------------------------------------------------------------------------- -// AttNcGes -//---------------------------------------------------------------------------- - -AttNcGes::AttNcGes() : Att() -{ - ResetNcGes(); -} - -void AttNcGes::ResetNcGes() -{ - m_octGes = -127; - m_pnameGes = PITCHNAME_NONE; - m_pnum = MEI_UNSET; -} - -bool AttNcGes::ReadNcGes(pugi::xml_node element, bool removeAttr) -{ - bool hasAttribute = false; - if (element.attribute("oct.ges")) { - this->SetOctGes(StrToOctave(element.attribute("oct.ges").value())); - if (removeAttr) element.remove_attribute("oct.ges"); - hasAttribute = true; - } - if (element.attribute("pname.ges")) { - this->SetPnameGes(StrToPitchname(element.attribute("pname.ges").value())); - if (removeAttr) element.remove_attribute("pname.ges"); - hasAttribute = true; - } - if (element.attribute("pnum")) { - this->SetPnum(StrToInt(element.attribute("pnum").value())); - if (removeAttr) element.remove_attribute("pnum"); - hasAttribute = true; - } - return hasAttribute; -} - -bool AttNcGes::WriteNcGes(pugi::xml_node element) -{ - bool wroteAttribute = false; - if (this->HasOctGes()) { - element.append_attribute("oct.ges") = OctaveToStr(this->GetOctGes()).c_str(); - wroteAttribute = true; - } - if (this->HasPnameGes()) { - element.append_attribute("pname.ges") = PitchnameToStr(this->GetPnameGes()).c_str(); - wroteAttribute = true; - } - if (this->HasPnum()) { - element.append_attribute("pnum") = IntToStr(this->GetPnum()).c_str(); - wroteAttribute = true; - } - return wroteAttribute; -} - -bool AttNcGes::HasOctGes() const -{ - return (m_octGes != -127); -} - -bool AttNcGes::HasPnameGes() const -{ - return (m_pnameGes != PITCHNAME_NONE); -} - -bool AttNcGes::HasPnum() const -{ - return (m_pnum != MEI_UNSET); -} - //---------------------------------------------------------------------------- // AttNoteGes //---------------------------------------------------------------------------- @@ -379,9 +309,6 @@ AttNoteGes::AttNoteGes() : Att() void AttNoteGes::ResetNoteGes() { m_extremis = noteGes_EXTREMIS_NONE; - m_octGes = -127; - m_pnameGes = PITCHNAME_NONE; - m_pnum = MEI_UNSET; } bool AttNoteGes::ReadNoteGes(pugi::xml_node element, bool removeAttr) @@ -392,21 +319,6 @@ bool AttNoteGes::ReadNoteGes(pugi::xml_node element, bool removeAttr) if (removeAttr) element.remove_attribute("extremis"); hasAttribute = true; } - if (element.attribute("oct.ges")) { - this->SetOctGes(StrToOctave(element.attribute("oct.ges").value())); - if (removeAttr) element.remove_attribute("oct.ges"); - hasAttribute = true; - } - if (element.attribute("pname.ges")) { - this->SetPnameGes(StrToPitchname(element.attribute("pname.ges").value())); - if (removeAttr) element.remove_attribute("pname.ges"); - hasAttribute = true; - } - if (element.attribute("pnum")) { - this->SetPnum(StrToInt(element.attribute("pnum").value())); - if (removeAttr) element.remove_attribute("pnum"); - hasAttribute = true; - } return hasAttribute; } @@ -417,18 +329,6 @@ bool AttNoteGes::WriteNoteGes(pugi::xml_node element) element.append_attribute("extremis") = NoteGesExtremisToStr(this->GetExtremis()).c_str(); wroteAttribute = true; } - if (this->HasOctGes()) { - element.append_attribute("oct.ges") = OctaveToStr(this->GetOctGes()).c_str(); - wroteAttribute = true; - } - if (this->HasPnameGes()) { - element.append_attribute("pname.ges") = PitchnameToStr(this->GetPnameGes()).c_str(); - wroteAttribute = true; - } - if (this->HasPnum()) { - element.append_attribute("pnum") = IntToStr(this->GetPnum()).c_str(); - wroteAttribute = true; - } return wroteAttribute; } @@ -437,21 +337,6 @@ bool AttNoteGes::HasExtremis() const return (m_extremis != noteGes_EXTREMIS_NONE); } -bool AttNoteGes::HasOctGes() const -{ - return (m_octGes != -127); -} - -bool AttNoteGes::HasPnameGes() const -{ - return (m_pnameGes != PITCHNAME_NONE); -} - -bool AttNoteGes::HasPnum() const -{ - return (m_pnum != MEI_UNSET); -} - //---------------------------------------------------------------------------- // AttOrnamentAccidGes //---------------------------------------------------------------------------- @@ -508,43 +393,73 @@ bool AttOrnamentAccidGes::HasAccidlowerGes() const } //---------------------------------------------------------------------------- -// AttSectionGes +// AttPitchGes //---------------------------------------------------------------------------- -AttSectionGes::AttSectionGes() : Att() +AttPitchGes::AttPitchGes() : Att() { - ResetSectionGes(); + ResetPitchGes(); } -void AttSectionGes::ResetSectionGes() +void AttPitchGes::ResetPitchGes() { - m_attacca = BOOLEAN_NONE; + m_octGes = -127; + m_pnameGes = PITCHNAME_NONE; + m_pnum = MEI_UNSET; } -bool AttSectionGes::ReadSectionGes(pugi::xml_node element, bool removeAttr) +bool AttPitchGes::ReadPitchGes(pugi::xml_node element, bool removeAttr) { bool hasAttribute = false; - if (element.attribute("attacca")) { - this->SetAttacca(StrToBoolean(element.attribute("attacca").value())); - if (removeAttr) element.remove_attribute("attacca"); + if (element.attribute("oct.ges")) { + this->SetOctGes(StrToOctave(element.attribute("oct.ges").value())); + if (removeAttr) element.remove_attribute("oct.ges"); + hasAttribute = true; + } + if (element.attribute("pname.ges")) { + this->SetPnameGes(StrToPitchname(element.attribute("pname.ges").value())); + if (removeAttr) element.remove_attribute("pname.ges"); + hasAttribute = true; + } + if (element.attribute("pnum")) { + this->SetPnum(StrToInt(element.attribute("pnum").value())); + if (removeAttr) element.remove_attribute("pnum"); hasAttribute = true; } return hasAttribute; } -bool AttSectionGes::WriteSectionGes(pugi::xml_node element) +bool AttPitchGes::WritePitchGes(pugi::xml_node element) { bool wroteAttribute = false; - if (this->HasAttacca()) { - element.append_attribute("attacca") = BooleanToStr(this->GetAttacca()).c_str(); + if (this->HasOctGes()) { + element.append_attribute("oct.ges") = OctaveToStr(this->GetOctGes()).c_str(); + wroteAttribute = true; + } + if (this->HasPnameGes()) { + element.append_attribute("pname.ges") = PitchnameToStr(this->GetPnameGes()).c_str(); + wroteAttribute = true; + } + if (this->HasPnum()) { + element.append_attribute("pnum") = IntToStr(this->GetPnum()).c_str(); wroteAttribute = true; } return wroteAttribute; } -bool AttSectionGes::HasAttacca() const +bool AttPitchGes::HasOctGes() const { - return (m_attacca != BOOLEAN_NONE); + return (m_octGes != -127); +} + +bool AttPitchGes::HasPnameGes() const +{ + return (m_pnameGes != PITCHNAME_NONE); +} + +bool AttPitchGes::HasPnum() const +{ + return (m_pnum != MEI_UNSET); } //---------------------------------------------------------------------------- diff --git a/libmei/dist/atts_gestural.h b/libmei/dist/atts_gestural.h index e49d7a8052d..9400a9d9bf1 100644 --- a/libmei/dist/atts_gestural.h +++ b/libmei/dist/atts_gestural.h @@ -123,6 +123,58 @@ class InstArticulationGes : public AttArticulationGes { virtual ~InstArticulationGes() = default; }; +//---------------------------------------------------------------------------- +// AttAttacking +//---------------------------------------------------------------------------- + +class AttAttacking : public Att { +protected: + AttAttacking(); + ~AttAttacking() = default; + +public: + /** Reset the default values for the attribute class **/ + void ResetAttacking(); + + /** Read the values for the attribute class **/ + bool ReadAttacking(pugi::xml_node element, bool removeAttr = true); + + /** Write the values for the attribute class **/ + bool WriteAttacking(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 SetAttacca(data_BOOLEAN attacca_) { m_attacca = attacca_; } + data_BOOLEAN GetAttacca() const { return m_attacca; } + bool HasAttacca() const; + ///@} + +private: + /** + * Indicates that the performance of the next musical division should begin + * immediately following this one. + **/ + data_BOOLEAN m_attacca; +}; + +//---------------------------------------------------------------------------- +// InstAttacking +//---------------------------------------------------------------------------- + +/** + * Instantiable version of AttAttacking + */ + +class InstAttacking : public AttAttacking { +public: + InstAttacking() = default; + virtual ~InstAttacking() = default; +}; + //---------------------------------------------------------------------------- // AttBendGes //---------------------------------------------------------------------------- @@ -261,119 +313,6 @@ class InstDurationGes : public AttDurationGes { virtual ~InstDurationGes() = default; }; -//---------------------------------------------------------------------------- -// AttMdivGes -//---------------------------------------------------------------------------- - -class AttMdivGes : public Att { -protected: - AttMdivGes(); - ~AttMdivGes() = default; - -public: - /** Reset the default values for the attribute class **/ - void ResetMdivGes(); - - /** Read the values for the attribute class **/ - bool ReadMdivGes(pugi::xml_node element, bool removeAttr = true); - - /** Write the values for the attribute class **/ - bool WriteMdivGes(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 SetAttacca(data_BOOLEAN attacca_) { m_attacca = attacca_; } - data_BOOLEAN GetAttacca() const { return m_attacca; } - bool HasAttacca() const; - ///@} - -private: - /** - * Indicates that the performance of the next musical division should begin - * immediately following this one. - **/ - data_BOOLEAN m_attacca; -}; - -//---------------------------------------------------------------------------- -// InstMdivGes -//---------------------------------------------------------------------------- - -/** - * Instantiable version of AttMdivGes - */ - -class InstMdivGes : public AttMdivGes { -public: - InstMdivGes() = default; - virtual ~InstMdivGes() = default; -}; - -//---------------------------------------------------------------------------- -// AttNcGes -//---------------------------------------------------------------------------- - -class AttNcGes : public Att { -protected: - AttNcGes(); - ~AttNcGes() = default; - -public: - /** Reset the default values for the attribute class **/ - void ResetNcGes(); - - /** Read the values for the attribute class **/ - bool ReadNcGes(pugi::xml_node element, bool removeAttr = true); - - /** Write the values for the attribute class **/ - bool WriteNcGes(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 SetOctGes(data_OCTAVE octGes_) { m_octGes = octGes_; } - data_OCTAVE GetOctGes() const { return m_octGes; } - bool HasOctGes() const; - // - void SetPnameGes(data_PITCHNAME pnameGes_) { m_pnameGes = pnameGes_; } - data_PITCHNAME GetPnameGes() const { return m_pnameGes; } - bool HasPnameGes() const; - // - void SetPnum(int pnum_) { m_pnum = pnum_; } - int GetPnum() const { return m_pnum; } - bool HasPnum() const; - ///@} - -private: - /** Records performed octave information that differs from the written value. **/ - data_OCTAVE m_octGes; - /** Contains a performed pitch name that differs from the written value. **/ - data_PITCHNAME m_pnameGes; - /** Holds a pitch-to-number mapping, a base-40 or MIDI note number, for example. **/ - int m_pnum; -}; - -//---------------------------------------------------------------------------- -// InstNcGes -//---------------------------------------------------------------------------- - -/** - * Instantiable version of AttNcGes - */ - -class InstNcGes : public AttNcGes { -public: - InstNcGes() = default; - virtual ~InstNcGes() = default; -}; - //---------------------------------------------------------------------------- // AttNoteGes //---------------------------------------------------------------------------- @@ -402,29 +341,11 @@ class AttNoteGes : public Att { void SetExtremis(noteGes_EXTREMIS extremis_) { m_extremis = extremis_; } noteGes_EXTREMIS GetExtremis() const { return m_extremis; } bool HasExtremis() const; - // - void SetOctGes(data_OCTAVE octGes_) { m_octGes = octGes_; } - data_OCTAVE GetOctGes() const { return m_octGes; } - bool HasOctGes() const; - // - void SetPnameGes(data_PITCHNAME pnameGes_) { m_pnameGes = pnameGes_; } - data_PITCHNAME GetPnameGes() const { return m_pnameGes; } - bool HasPnameGes() const; - // - void SetPnum(int pnum_) { m_pnum = pnum_; } - int GetPnum() const { return m_pnum; } - bool HasPnum() const; ///@} private: /** Indicates an extreme, indefinite performed pitch. **/ noteGes_EXTREMIS m_extremis; - /** Records performed octave information that differs from the written value. **/ - data_OCTAVE m_octGes; - /** Contains a performed pitch name that differs from the written value. **/ - data_PITCHNAME m_pnameGes; - /** Holds a pitch-to-number mapping, a base-40 or MIDI note number, for example. **/ - int m_pnum; }; //---------------------------------------------------------------------------- @@ -497,23 +418,23 @@ class InstOrnamentAccidGes : public AttOrnamentAccidGes { }; //---------------------------------------------------------------------------- -// AttSectionGes +// AttPitchGes //---------------------------------------------------------------------------- -class AttSectionGes : public Att { +class AttPitchGes : public Att { protected: - AttSectionGes(); - ~AttSectionGes() = default; + AttPitchGes(); + ~AttPitchGes() = default; public: /** Reset the default values for the attribute class **/ - void ResetSectionGes(); + void ResetPitchGes(); /** Read the values for the attribute class **/ - bool ReadSectionGes(pugi::xml_node element, bool removeAttr = true); + bool ReadPitchGes(pugi::xml_node element, bool removeAttr = true); /** Write the values for the attribute class **/ - bool WriteSectionGes(pugi::xml_node element); + bool WritePitchGes(pugi::xml_node element); /** * @name Setters, getters and presence checker for class members. @@ -521,31 +442,40 @@ class AttSectionGes : public Att { * to the default value) **/ ///@{ - void SetAttacca(data_BOOLEAN attacca_) { m_attacca = attacca_; } - data_BOOLEAN GetAttacca() const { return m_attacca; } - bool HasAttacca() const; + void SetOctGes(data_OCTAVE octGes_) { m_octGes = octGes_; } + data_OCTAVE GetOctGes() const { return m_octGes; } + bool HasOctGes() const; + // + void SetPnameGes(data_PITCHNAME pnameGes_) { m_pnameGes = pnameGes_; } + data_PITCHNAME GetPnameGes() const { return m_pnameGes; } + bool HasPnameGes() const; + // + void SetPnum(int pnum_) { m_pnum = pnum_; } + int GetPnum() const { return m_pnum; } + bool HasPnum() const; ///@} private: - /** - * Indicates that the performance of the next musical division should begin - * immediately following this one. - **/ - data_BOOLEAN m_attacca; + /** Records performed octave information that differs from the written value. **/ + data_OCTAVE m_octGes; + /** Contains a performed pitch name that differs from the written value. **/ + data_PITCHNAME m_pnameGes; + /** Holds a pitch-to-number mapping, a base-40 or MIDI note number, for example. **/ + int m_pnum; }; //---------------------------------------------------------------------------- -// InstSectionGes +// InstPitchGes //---------------------------------------------------------------------------- /** - * Instantiable version of AttSectionGes + * Instantiable version of AttPitchGes */ -class InstSectionGes : public AttSectionGes { +class InstPitchGes : public AttPitchGes { public: - InstSectionGes() = default; - virtual ~InstSectionGes() = default; + InstPitchGes() = default; + virtual ~InstPitchGes() = default; }; //---------------------------------------------------------------------------- diff --git a/libmei/dist/atts_header.cpp b/libmei/dist/atts_header.cpp index 567f2bfa4eb..a44b6620411 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 e3a8d59a56f..fdd325e3b79 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 83bfadb579e..f9c9eb06fb1 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 = divLineLog_FORM_NONE; +} + +bool AttDivLineLog::ReadDivLineLog(pugi::xml_node element, bool removeAttr) +{ + bool hasAttribute = false; + if (element.attribute("form")) { + this->SetForm(StrToDivLineLogForm(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") = DivLineLogFormToStr(this->GetForm()).c_str(); + wroteAttribute = true; + } + return wroteAttribute; +} + +bool AttDivLineLog::HasForm() const +{ + return (m_form != divLineLog_FORM_NONE); +} + //---------------------------------------------------------------------------- // AttNcLog //---------------------------------------------------------------------------- @@ -90,7 +130,6 @@ void AttNcForm::ResetNcForm() { m_angled = BOOLEAN_NONE; m_con = ncForm_CON_NONE; - m_curve = ncForm_CURVE_NONE; m_hooked = BOOLEAN_NONE; m_ligated = BOOLEAN_NONE; m_rellen = ncForm_RELLEN_NONE; @@ -111,11 +150,6 @@ bool AttNcForm::ReadNcForm(pugi::xml_node element, bool removeAttr) if (removeAttr) element.remove_attribute("con"); hasAttribute = true; } - if (element.attribute("curve")) { - this->SetCurve(StrToNcFormCurve(element.attribute("curve").value())); - if (removeAttr) element.remove_attribute("curve"); - hasAttribute = true; - } if (element.attribute("hooked")) { this->SetHooked(StrToBoolean(element.attribute("hooked").value())); if (removeAttr) element.remove_attribute("hooked"); @@ -155,10 +189,6 @@ bool AttNcForm::WriteNcForm(pugi::xml_node element) element.append_attribute("con") = NcFormConToStr(this->GetCon()).c_str(); wroteAttribute = true; } - if (this->HasCurve()) { - element.append_attribute("curve") = NcFormCurveToStr(this->GetCurve()).c_str(); - wroteAttribute = true; - } if (this->HasHooked()) { element.append_attribute("hooked") = BooleanToStr(this->GetHooked()).c_str(); wroteAttribute = true; @@ -192,11 +222,6 @@ bool AttNcForm::HasCon() const return (m_con != ncForm_CON_NONE); } -bool AttNcForm::HasCurve() const -{ - return (m_curve != ncForm_CURVE_NONE); -} - bool AttNcForm::HasHooked() const { return (m_hooked != BOOLEAN_NONE); @@ -222,4 +247,44 @@ bool AttNcForm::HasTilt() const return (m_tilt != data_COMPASSDIRECTION()); } +//---------------------------------------------------------------------------- +// AttNeumeType +//---------------------------------------------------------------------------- + +AttNeumeType::AttNeumeType() : Att() +{ + ResetNeumeType(); +} + +void AttNeumeType::ResetNeumeType() +{ + m_type = ""; +} + +bool AttNeumeType::ReadNeumeType(pugi::xml_node element, bool removeAttr) +{ + bool hasAttribute = false; + if (element.attribute("type")) { + this->SetType(StrToStr(element.attribute("type").value())); + if (removeAttr) element.remove_attribute("type"); + hasAttribute = true; + } + return hasAttribute; +} + +bool AttNeumeType::WriteNeumeType(pugi::xml_node element) +{ + bool wroteAttribute = false; + if (this->HasType()) { + element.append_attribute("type") = StrToStr(this->GetType()).c_str(); + wroteAttribute = true; + } + return wroteAttribute; +} + +bool AttNeumeType::HasType() const +{ + return (m_type != ""); +} + } // namespace vrv diff --git a/libmei/dist/atts_neumes.h b/libmei/dist/atts_neumes.h index b6dc3b87eac..77f76e4d717 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(divLineLog_FORM form_) { m_form = form_; } + divLineLog_FORM GetForm() const { return m_form; } + bool HasForm() const; + ///@} + +private: + /** Indicates to what degree the harmonic label is supported by the notation. **/ + divLineLog_FORM m_form; +}; + +//---------------------------------------------------------------------------- +// InstDivLineLog +//---------------------------------------------------------------------------- + +/** + * Instantiable version of AttDivLineLog + */ + +class InstDivLineLog : public AttDivLineLog { +public: + InstDivLineLog() = default; + virtual ~InstDivLineLog() = default; +}; + //---------------------------------------------------------------------------- // AttNcLog //---------------------------------------------------------------------------- @@ -113,10 +162,6 @@ class AttNcForm : public Att { ncForm_CON GetCon() const { return m_con; } bool HasCon() const; // - void SetCurve(ncForm_CURVE curve_) { m_curve = curve_; } - ncForm_CURVE GetCurve() const { return m_curve; } - bool HasCurve() const; - // void SetHooked(data_BOOLEAN hooked_) { m_hooked = hooked_; } data_BOOLEAN GetHooked() const { return m_hooked; } bool HasHooked() const; @@ -146,8 +191,6 @@ class AttNcForm : public Att { * should not be used for the first component of a neume. **/ ncForm_CON m_con; - /** Records direction of curvature. **/ - ncForm_CURVE m_curve; /** Pen stroke has an extension; specific to Hispanic notation. **/ data_BOOLEAN m_hooked; /** Indicates participation in a ligature. **/ @@ -177,6 +220,58 @@ class InstNcForm : public AttNcForm { virtual ~InstNcForm() = default; }; +//---------------------------------------------------------------------------- +// AttNeumeType +//---------------------------------------------------------------------------- + +class AttNeumeType : public Att { +protected: + AttNeumeType(); + ~AttNeumeType() = default; + +public: + /** Reset the default values for the attribute class **/ + void ResetNeumeType(); + + /** Read the values for the attribute class **/ + bool ReadNeumeType(pugi::xml_node element, bool removeAttr = true); + + /** Write the values for the attribute class **/ + bool WriteNeumeType(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 SetType(std::string type_) { m_type = type_; } + std::string GetType() const { return m_type; } + bool HasType() const; + ///@} + +private: + /** + * Provides a description of the relationship between the current and the target + * categories. + **/ + std::string m_type; +}; + +//---------------------------------------------------------------------------- +// InstNeumeType +//---------------------------------------------------------------------------- + +/** + * Instantiable version of AttNeumeType + */ + +class InstNeumeType : public AttNeumeType { +public: + InstNeumeType() = default; + virtual ~InstNeumeType() = default; +}; + } // namespace vrv #endif // __LIBMEI_ATTS_NEUMES_H__ diff --git a/libmei/dist/atts_shared.cpp b/libmei/dist/atts_shared.cpp index 7eefde0b06e..251894587a2 100644 --- a/libmei/dist/atts_shared.cpp +++ b/libmei/dist/atts_shared.cpp @@ -1003,8 +1003,6 @@ AttCoordinated::AttCoordinated() : Att() void AttCoordinated::ResetCoordinated() { - m_ulx = MEI_UNSET; - m_uly = MEI_UNSET; m_lrx = MEI_UNSET; m_lry = MEI_UNSET; m_rotate = 0.0; @@ -1013,16 +1011,6 @@ void AttCoordinated::ResetCoordinated() bool AttCoordinated::ReadCoordinated(pugi::xml_node element, bool removeAttr) { bool hasAttribute = false; - if (element.attribute("ulx")) { - this->SetUlx(StrToInt(element.attribute("ulx").value())); - if (removeAttr) element.remove_attribute("ulx"); - hasAttribute = true; - } - if (element.attribute("uly")) { - this->SetUly(StrToInt(element.attribute("uly").value())); - if (removeAttr) element.remove_attribute("uly"); - hasAttribute = true; - } if (element.attribute("lrx")) { this->SetLrx(StrToInt(element.attribute("lrx").value())); if (removeAttr) element.remove_attribute("lrx"); @@ -1044,14 +1032,6 @@ bool AttCoordinated::ReadCoordinated(pugi::xml_node element, bool removeAttr) bool AttCoordinated::WriteCoordinated(pugi::xml_node element) { bool wroteAttribute = false; - if (this->HasUlx()) { - element.append_attribute("ulx") = IntToStr(this->GetUlx()).c_str(); - wroteAttribute = true; - } - if (this->HasUly()) { - element.append_attribute("uly") = IntToStr(this->GetUly()).c_str(); - wroteAttribute = true; - } if (this->HasLrx()) { element.append_attribute("lrx") = IntToStr(this->GetLrx()).c_str(); wroteAttribute = true; @@ -1067,16 +1047,6 @@ bool AttCoordinated::WriteCoordinated(pugi::xml_node element) return wroteAttribute; } -bool AttCoordinated::HasUlx() const -{ - return (m_ulx != MEI_UNSET); -} - -bool AttCoordinated::HasUly() const -{ - return (m_uly != MEI_UNSET); -} - bool AttCoordinated::HasLrx() const { return (m_lrx != MEI_UNSET); @@ -1092,6 +1062,61 @@ bool AttCoordinated::HasRotate() const return (m_rotate != 0.0); } +//---------------------------------------------------------------------------- +// AttCoordinatedUl +//---------------------------------------------------------------------------- + +AttCoordinatedUl::AttCoordinatedUl() : Att() +{ + ResetCoordinatedUl(); +} + +void AttCoordinatedUl::ResetCoordinatedUl() +{ + m_ulx = MEI_UNSET; + m_uly = MEI_UNSET; +} + +bool AttCoordinatedUl::ReadCoordinatedUl(pugi::xml_node element, bool removeAttr) +{ + bool hasAttribute = false; + if (element.attribute("ulx")) { + this->SetUlx(StrToInt(element.attribute("ulx").value())); + if (removeAttr) element.remove_attribute("ulx"); + hasAttribute = true; + } + if (element.attribute("uly")) { + this->SetUly(StrToInt(element.attribute("uly").value())); + if (removeAttr) element.remove_attribute("uly"); + hasAttribute = true; + } + return hasAttribute; +} + +bool AttCoordinatedUl::WriteCoordinatedUl(pugi::xml_node element) +{ + bool wroteAttribute = false; + if (this->HasUlx()) { + element.append_attribute("ulx") = IntToStr(this->GetUlx()).c_str(); + wroteAttribute = true; + } + if (this->HasUly()) { + element.append_attribute("uly") = IntToStr(this->GetUly()).c_str(); + wroteAttribute = true; + } + return wroteAttribute; +} + +bool AttCoordinatedUl::HasUlx() const +{ + return (m_ulx != MEI_UNSET); +} + +bool AttCoordinatedUl::HasUly() const +{ + return (m_uly != MEI_UNSET); +} + //---------------------------------------------------------------------------- // AttCue //---------------------------------------------------------------------------- @@ -1202,61 +1227,6 @@ bool AttCurvature::HasCurvedir() const return (m_curvedir != curvature_CURVEDIR_NONE); } -//---------------------------------------------------------------------------- -// AttCurveRend -//---------------------------------------------------------------------------- - -AttCurveRend::AttCurveRend() : Att() -{ - ResetCurveRend(); -} - -void AttCurveRend::ResetCurveRend() -{ - m_lform = LINEFORM_NONE; - m_lwidth = data_LINEWIDTH(); -} - -bool AttCurveRend::ReadCurveRend(pugi::xml_node element, bool removeAttr) -{ - bool hasAttribute = false; - if (element.attribute("lform")) { - this->SetLform(StrToLineform(element.attribute("lform").value())); - if (removeAttr) element.remove_attribute("lform"); - hasAttribute = true; - } - if (element.attribute("lwidth")) { - this->SetLwidth(StrToLinewidth(element.attribute("lwidth").value())); - if (removeAttr) element.remove_attribute("lwidth"); - hasAttribute = true; - } - return hasAttribute; -} - -bool AttCurveRend::WriteCurveRend(pugi::xml_node element) -{ - bool wroteAttribute = false; - if (this->HasLform()) { - element.append_attribute("lform") = LineformToStr(this->GetLform()).c_str(); - wroteAttribute = true; - } - if (this->HasLwidth()) { - element.append_attribute("lwidth") = LinewidthToStr(this->GetLwidth()).c_str(); - wroteAttribute = true; - } - return wroteAttribute; -} - -bool AttCurveRend::HasLform() const -{ - return (m_lform != LINEFORM_NONE); -} - -bool AttCurveRend::HasLwidth() const -{ - return (m_lwidth.HasValue()); -} - //---------------------------------------------------------------------------- // AttCustosLog //---------------------------------------------------------------------------- @@ -2077,6 +2047,46 @@ bool AttFiling::HasNonfiling() const return (m_nonfiling != MEI_UNSET); } +//---------------------------------------------------------------------------- +// AttFormework +//---------------------------------------------------------------------------- + +AttFormework::AttFormework() : Att() +{ + ResetFormework(); +} + +void AttFormework::ResetFormework() +{ + m_func = PGFUNC_NONE; +} + +bool AttFormework::ReadFormework(pugi::xml_node element, bool removeAttr) +{ + bool hasAttribute = false; + if (element.attribute("func")) { + this->SetFunc(StrToPgfunc(element.attribute("func").value())); + if (removeAttr) element.remove_attribute("func"); + hasAttribute = true; + } + return hasAttribute; +} + +bool AttFormework::WriteFormework(pugi::xml_node element) +{ + bool wroteAttribute = false; + if (this->HasFunc()) { + element.append_attribute("func") = PgfuncToStr(this->GetFunc()).c_str(); + wroteAttribute = true; + } + return wroteAttribute; +} + +bool AttFormework::HasFunc() const +{ + return (m_func != PGFUNC_NONE); +} + //---------------------------------------------------------------------------- // AttGrpSymLog //---------------------------------------------------------------------------- @@ -2317,6 +2327,46 @@ bool AttJoined::HasJoin() const return (m_join != ""); } +//---------------------------------------------------------------------------- +// AttKeyMode +//---------------------------------------------------------------------------- + +AttKeyMode::AttKeyMode() : Att() +{ + ResetKeyMode(); +} + +void AttKeyMode::ResetKeyMode() +{ + m_mode = MODE_NONE; +} + +bool AttKeyMode::ReadKeyMode(pugi::xml_node element, bool removeAttr) +{ + bool hasAttribute = false; + if (element.attribute("mode")) { + this->SetMode(StrToMode(element.attribute("mode").value())); + if (removeAttr) element.remove_attribute("mode"); + hasAttribute = true; + } + return hasAttribute; +} + +bool AttKeyMode::WriteKeyMode(pugi::xml_node element) +{ + bool wroteAttribute = false; + if (this->HasMode()) { + element.append_attribute("mode") = ModeToStr(this->GetMode()).c_str(); + wroteAttribute = true; + } + return wroteAttribute; +} + +bool AttKeyMode::HasMode() const +{ + return (m_mode != MODE_NONE); +} + //---------------------------------------------------------------------------- // AttKeySigLog //---------------------------------------------------------------------------- @@ -2368,15 +2418,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 +2435,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)); } //---------------------------------------------------------------------------- @@ -2709,8 +2759,8 @@ AttLineRendBase::AttLineRendBase() : Att() void AttLineRendBase::ResetLineRendBase() { m_lform = LINEFORM_NONE; - m_lsegs = MEI_UNSET; m_lwidth = data_LINEWIDTH(); + m_lsegs = MEI_UNSET; } bool AttLineRendBase::ReadLineRendBase(pugi::xml_node element, bool removeAttr) @@ -2721,16 +2771,16 @@ bool AttLineRendBase::ReadLineRendBase(pugi::xml_node element, bool removeAttr) if (removeAttr) element.remove_attribute("lform"); hasAttribute = true; } - if (element.attribute("lsegs")) { - this->SetLsegs(StrToInt(element.attribute("lsegs").value())); - if (removeAttr) element.remove_attribute("lsegs"); - hasAttribute = true; - } if (element.attribute("lwidth")) { this->SetLwidth(StrToLinewidth(element.attribute("lwidth").value())); if (removeAttr) element.remove_attribute("lwidth"); hasAttribute = true; } + if (element.attribute("lsegs")) { + this->SetLsegs(StrToInt(element.attribute("lsegs").value())); + if (removeAttr) element.remove_attribute("lsegs"); + hasAttribute = true; + } return hasAttribute; } @@ -2741,14 +2791,14 @@ bool AttLineRendBase::WriteLineRendBase(pugi::xml_node element) element.append_attribute("lform") = LineformToStr(this->GetLform()).c_str(); wroteAttribute = true; } - if (this->HasLsegs()) { - element.append_attribute("lsegs") = IntToStr(this->GetLsegs()).c_str(); - wroteAttribute = true; - } if (this->HasLwidth()) { element.append_attribute("lwidth") = LinewidthToStr(this->GetLwidth()).c_str(); wroteAttribute = true; } + if (this->HasLsegs()) { + element.append_attribute("lsegs") = IntToStr(this->GetLsegs()).c_str(); + wroteAttribute = true; + } return wroteAttribute; } @@ -2757,14 +2807,14 @@ bool AttLineRendBase::HasLform() const return (m_lform != LINEFORM_NONE); } -bool AttLineRendBase::HasLsegs() const +bool AttLineRendBase::HasLwidth() const { - return (m_lsegs != MEI_UNSET); + return (m_lwidth.HasValue()); } -bool AttLineRendBase::HasLwidth() const +bool AttLineRendBase::HasLsegs() const { - return (m_lwidth.HasValue()); + return (m_lsegs != MEI_UNSET); } //---------------------------------------------------------------------------- @@ -3257,6 +3307,46 @@ bool AttMeiVersion::HasMeiversion() const return (m_meiversion != meiVersion_MEIVERSION_NONE); } +//---------------------------------------------------------------------------- +// AttMensurLog +//---------------------------------------------------------------------------- + +AttMensurLog::AttMensurLog() : Att() +{ + ResetMensurLog(); +} + +void AttMensurLog::ResetMensurLog() +{ + m_level = DURATION_NONE; +} + +bool AttMensurLog::ReadMensurLog(pugi::xml_node element, bool removeAttr) +{ + bool hasAttribute = false; + if (element.attribute("level")) { + this->SetLevel(StrToDuration(element.attribute("level").value())); + if (removeAttr) element.remove_attribute("level"); + hasAttribute = true; + } + return hasAttribute; +} + +bool AttMensurLog::WriteMensurLog(pugi::xml_node element) +{ + bool wroteAttribute = false; + if (this->HasLevel()) { + element.append_attribute("level") = DurationToStr(this->GetLevel()).c_str(); + wroteAttribute = true; + } + return wroteAttribute; +} + +bool AttMensurLog::HasLevel() const +{ + return (m_level != DURATION_NONE); +} + //---------------------------------------------------------------------------- // AttMetadataPointing //---------------------------------------------------------------------------- @@ -5037,6 +5127,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 696a227abb5..b86e2877bab 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. **/ @@ -1215,14 +1215,6 @@ class AttCoordinated : public Att { * to the default value) **/ ///@{ - void SetUlx(int ulx_) { m_ulx = ulx_; } - int GetUlx() const { return m_ulx; } - bool HasUlx() const; - // - void SetUly(int uly_) { m_uly = uly_; } - int GetUly() const { return m_uly; } - bool HasUly() const; - // void SetLrx(int lrx_) { m_lrx = lrx_; } int GetLrx() const { return m_lrx; } bool HasLrx() const; @@ -1237,10 +1229,6 @@ class AttCoordinated : public Att { ///@} private: - /** Indicates the upper-left corner x coordinate. **/ - int m_ulx; - /** Indicates the upper-left corner y coordinate. **/ - int m_uly; /** Indicates the lower-right corner x coordinate. **/ int m_lrx; /** Indicates the lower-left corner x coordinate. **/ @@ -1268,6 +1256,61 @@ class InstCoordinated : public AttCoordinated { virtual ~InstCoordinated() = default; }; +//---------------------------------------------------------------------------- +// AttCoordinatedUl +//---------------------------------------------------------------------------- + +class AttCoordinatedUl : public Att { +protected: + AttCoordinatedUl(); + ~AttCoordinatedUl() = default; + +public: + /** Reset the default values for the attribute class **/ + void ResetCoordinatedUl(); + + /** Read the values for the attribute class **/ + bool ReadCoordinatedUl(pugi::xml_node element, bool removeAttr = true); + + /** Write the values for the attribute class **/ + bool WriteCoordinatedUl(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 SetUlx(int ulx_) { m_ulx = ulx_; } + int GetUlx() const { return m_ulx; } + bool HasUlx() const; + // + void SetUly(int uly_) { m_uly = uly_; } + int GetUly() const { return m_uly; } + bool HasUly() const; + ///@} + +private: + /** Indicates the upper-left corner x coordinate. **/ + int m_ulx; + /** Indicates the upper-left corner y coordinate. **/ + int m_uly; +}; + +//---------------------------------------------------------------------------- +// InstCoordinatedUl +//---------------------------------------------------------------------------- + +/** + * Instantiable version of AttCoordinatedUl + */ + +class InstCoordinatedUl : public AttCoordinatedUl { +public: + InstCoordinatedUl() = default; + virtual ~InstCoordinatedUl() = default; +}; + //---------------------------------------------------------------------------- // AttCue //---------------------------------------------------------------------------- @@ -1390,63 +1433,6 @@ class InstCurvature : public AttCurvature { virtual ~InstCurvature() = default; }; -//---------------------------------------------------------------------------- -// AttCurveRend -//---------------------------------------------------------------------------- - -class AttCurveRend : public Att { -protected: - AttCurveRend(); - ~AttCurveRend() = default; - -public: - /** Reset the default values for the attribute class **/ - void ResetCurveRend(); - - /** Read the values for the attribute class **/ - bool ReadCurveRend(pugi::xml_node element, bool removeAttr = true); - - /** Write the values for the attribute class **/ - bool WriteCurveRend(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 SetLform(data_LINEFORM lform_) { m_lform = lform_; } - data_LINEFORM GetLform() const { return m_lform; } - bool HasLform() const; - // - void SetLwidth(data_LINEWIDTH lwidth_) { m_lwidth = lwidth_; } - data_LINEWIDTH GetLwidth() const { return m_lwidth; } - bool HasLwidth() const; - /** Getter for reference (for alternate type only) */ - data_LINEWIDTH *GetLwidthAlternate() { return &m_lwidth; } - ///@} - -private: - /** Describes the line style of a curve. **/ - data_LINEFORM m_lform; - /** Width of a curved line. **/ - data_LINEWIDTH m_lwidth; -}; - -//---------------------------------------------------------------------------- -// InstCurveRend -//---------------------------------------------------------------------------- - -/** - * Instantiable version of AttCurveRend - */ - -class InstCurveRend : public AttCurveRend { -public: - InstCurveRend() = default; - virtual ~InstCurveRend() = default; -}; - //---------------------------------------------------------------------------- // AttCustosLog //---------------------------------------------------------------------------- @@ -2344,6 +2330,55 @@ class InstFiling : public AttFiling { virtual ~InstFiling() = default; }; +//---------------------------------------------------------------------------- +// AttFormework +//---------------------------------------------------------------------------- + +class AttFormework : public Att { +protected: + AttFormework(); + ~AttFormework() = default; + +public: + /** Reset the default values for the attribute class **/ + void ResetFormework(); + + /** Read the values for the attribute class **/ + bool ReadFormework(pugi::xml_node element, bool removeAttr = true); + + /** Write the values for the attribute class **/ + bool WriteFormework(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(data_PGFUNC func_) { m_func = func_; } + data_PGFUNC GetFunc() const { return m_func; } + bool HasFunc() const; + ///@} + +private: + /** Describes the function of the bracketed event sequence. **/ + data_PGFUNC m_func; +}; + +//---------------------------------------------------------------------------- +// InstFormework +//---------------------------------------------------------------------------- + +/** + * Instantiable version of AttFormework + */ + +class InstFormework : public AttFormework { +public: + InstFormework() = default; + virtual ~InstFormework() = default; +}; + //---------------------------------------------------------------------------- // AttGrpSymLog //---------------------------------------------------------------------------- @@ -2652,6 +2687,55 @@ class InstJoined : public AttJoined { virtual ~InstJoined() = default; }; +//---------------------------------------------------------------------------- +// AttKeyMode +//---------------------------------------------------------------------------- + +class AttKeyMode : public Att { +protected: + AttKeyMode(); + ~AttKeyMode() = default; + +public: + /** Reset the default values for the attribute class **/ + void ResetKeyMode(); + + /** Read the values for the attribute class **/ + bool ReadKeyMode(pugi::xml_node element, bool removeAttr = true); + + /** Write the values for the attribute class **/ + bool WriteKeyMode(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 SetMode(data_MODE mode_) { m_mode = mode_; } + data_MODE GetMode() const { return m_mode; } + bool HasMode() const; + ///@} + +private: + /** Indicates major, minor, or other tonality. **/ + data_MODE m_mode; +}; + +//---------------------------------------------------------------------------- +// InstKeyMode +//---------------------------------------------------------------------------- + +/** + * Instantiable version of AttKeyMode + */ + +class InstKeyMode : public AttKeyMode { +public: + InstKeyMode() = default; + virtual ~InstKeyMode() = default; +}; + //---------------------------------------------------------------------------- // AttKeySigLog //---------------------------------------------------------------------------- @@ -2726,14 +2810,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; }; //---------------------------------------------------------------------------- @@ -3105,20 +3189,22 @@ class AttLineRendBase : public Att { data_LINEFORM GetLform() const { return m_lform; } bool HasLform() const; // - void SetLsegs(int lsegs_) { m_lsegs = lsegs_; } - int GetLsegs() const { return m_lsegs; } - bool HasLsegs() const; - // void SetLwidth(data_LINEWIDTH lwidth_) { m_lwidth = lwidth_; } data_LINEWIDTH GetLwidth() const { return m_lwidth; } bool HasLwidth() const; /** Getter for reference (for alternate type only) */ data_LINEWIDTH *GetLwidthAlternate() { return &m_lwidth; } + // + void SetLsegs(int lsegs_) { m_lsegs = lsegs_; } + int GetLsegs() const { return m_lsegs; } + bool HasLsegs() const; ///@} private: - /** Describes the line style of a curve. **/ + /** Describes the style of a line. **/ data_LINEFORM m_lform; + /** Width of a line. **/ + data_LINEWIDTH m_lwidth; /** * Describes the number of segments into which a dashed or dotted line may be * divided, or the number of "peaks" of a wavy line; a pair of space-separated @@ -3127,8 +3213,6 @@ class AttLineRendBase : public Att { * amount of space; that is, the minimum and maximum values are equal. **/ int m_lsegs; - /** Width of a curved line. **/ - data_LINEWIDTH m_lwidth; }; //---------------------------------------------------------------------------- @@ -3599,6 +3683,55 @@ class InstMeiVersion : public AttMeiVersion { virtual ~InstMeiVersion() = default; }; +//---------------------------------------------------------------------------- +// AttMensurLog +//---------------------------------------------------------------------------- + +class AttMensurLog : public Att { +protected: + AttMensurLog(); + ~AttMensurLog() = default; + +public: + /** Reset the default values for the attribute class **/ + void ResetMensurLog(); + + /** Read the values for the attribute class **/ + bool ReadMensurLog(pugi::xml_node element, bool removeAttr = true); + + /** Write the values for the attribute class **/ + bool WriteMensurLog(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 SetLevel(data_DURATION level_) { m_level = level_; } + data_DURATION GetLevel() const { return m_level; } + bool HasLevel() const; + ///@} + +private: + /** Indicates the nesting level of staff grouping symbols. **/ + data_DURATION m_level; +}; + +//---------------------------------------------------------------------------- +// InstMensurLog +//---------------------------------------------------------------------------- + +/** + * Instantiable version of AttMensurLog + */ + +class InstMensurLog : public AttMensurLog { +public: + InstMensurLog() = default; + virtual ~InstMensurLog() = default; +}; + //---------------------------------------------------------------------------- // AttMetadataPointing //---------------------------------------------------------------------------- @@ -3749,7 +3882,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 +5597,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 7710550a628..6106237605c 100644 --- a/libmei/dist/atts_visual.cpp +++ b/libmei/dist/atts_visual.cpp @@ -78,8 +78,6 @@ void AttArpegVis::ResetArpegVis() m_arrowSize = MEI_UNSET; m_arrowColor = ""; m_arrowFillcolor = ""; - m_lineForm = LINEFORM_NONE; - m_lineWidth = data_LINEWIDTH(); } bool AttArpegVis::ReadArpegVis(pugi::xml_node element, bool removeAttr) @@ -110,16 +108,6 @@ bool AttArpegVis::ReadArpegVis(pugi::xml_node element, bool removeAttr) if (removeAttr) element.remove_attribute("arrow.fillcolor"); hasAttribute = true; } - if (element.attribute("line.form")) { - this->SetLineForm(StrToLineform(element.attribute("line.form").value())); - if (removeAttr) element.remove_attribute("line.form"); - hasAttribute = true; - } - if (element.attribute("line.width")) { - this->SetLineWidth(StrToLinewidth(element.attribute("line.width").value())); - if (removeAttr) element.remove_attribute("line.width"); - hasAttribute = true; - } return hasAttribute; } @@ -146,14 +134,6 @@ bool AttArpegVis::WriteArpegVis(pugi::xml_node element) element.append_attribute("arrow.fillcolor") = StrToStr(this->GetArrowFillcolor()).c_str(); wroteAttribute = true; } - if (this->HasLineForm()) { - element.append_attribute("line.form") = LineformToStr(this->GetLineForm()).c_str(); - wroteAttribute = true; - } - if (this->HasLineWidth()) { - element.append_attribute("line.width") = LinewidthToStr(this->GetLineWidth()).c_str(); - wroteAttribute = true; - } return wroteAttribute; } @@ -182,16 +162,6 @@ bool AttArpegVis::HasArrowFillcolor() const return (m_arrowFillcolor != ""); } -bool AttArpegVis::HasLineForm() const -{ - return (m_lineForm != LINEFORM_NONE); -} - -bool AttArpegVis::HasLineWidth() const -{ - return (m_lineWidth.HasValue()); -} - //---------------------------------------------------------------------------- // AttBarLineVis //---------------------------------------------------------------------------- @@ -467,6 +437,46 @@ bool AttCleffingVis::HasClefVisible() const return (m_clefVisible != BOOLEAN_NONE); } +//---------------------------------------------------------------------------- +// AttCurvatureDirection +//---------------------------------------------------------------------------- + +AttCurvatureDirection::AttCurvatureDirection() : Att() +{ + ResetCurvatureDirection(); +} + +void AttCurvatureDirection::ResetCurvatureDirection() +{ + m_curve = curvatureDirection_CURVE_NONE; +} + +bool AttCurvatureDirection::ReadCurvatureDirection(pugi::xml_node element, bool removeAttr) +{ + bool hasAttribute = false; + if (element.attribute("curve")) { + this->SetCurve(StrToCurvatureDirectionCurve(element.attribute("curve").value())); + if (removeAttr) element.remove_attribute("curve"); + hasAttribute = true; + } + return hasAttribute; +} + +bool AttCurvatureDirection::WriteCurvatureDirection(pugi::xml_node element) +{ + bool wroteAttribute = false; + if (this->HasCurve()) { + element.append_attribute("curve") = CurvatureDirectionCurveToStr(this->GetCurve()).c_str(); + wroteAttribute = true; + } + return wroteAttribute; +} + +bool AttCurvatureDirection::HasCurve() const +{ + return (m_curve != curvatureDirection_CURVE_NONE); +} + //---------------------------------------------------------------------------- // AttEpisemaVis //---------------------------------------------------------------------------- @@ -687,6 +697,46 @@ bool AttFingGrpVis::HasOrient() const return (m_orient != fingGrpVis_ORIENT_NONE); } +//---------------------------------------------------------------------------- +// AttGuitarGridVis +//---------------------------------------------------------------------------- + +AttGuitarGridVis::AttGuitarGridVis() : Att() +{ + ResetGuitarGridVis(); +} + +void AttGuitarGridVis::ResetGuitarGridVis() +{ + m_gridShow = BOOLEAN_NONE; +} + +bool AttGuitarGridVis::ReadGuitarGridVis(pugi::xml_node element, bool removeAttr) +{ + bool hasAttribute = false; + if (element.attribute("grid.show")) { + this->SetGridShow(StrToBoolean(element.attribute("grid.show").value())); + if (removeAttr) element.remove_attribute("grid.show"); + hasAttribute = true; + } + return hasAttribute; +} + +bool AttGuitarGridVis::WriteGuitarGridVis(pugi::xml_node element) +{ + bool wroteAttribute = false; + if (this->HasGridShow()) { + element.append_attribute("grid.show") = BooleanToStr(this->GetGridShow()).c_str(); + wroteAttribute = true; + } + return wroteAttribute; +} + +bool AttGuitarGridVis::HasGridShow() const +{ + return (m_gridShow != BOOLEAN_NONE); +} + //---------------------------------------------------------------------------- // AttHairpinVis //---------------------------------------------------------------------------- @@ -878,15 +928,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 +945,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,21 +968,21 @@ AttKeySigDefaultVis::AttKeySigDefaultVis() : Att() void AttKeySigDefaultVis::ResetKeySigDefaultVis() { - m_keysigShow = BOOLEAN_NONE; - 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.show")) { - this->SetKeysigShow(StrToBoolean(element.attribute("keysig.show").value())); - if (removeAttr) element.remove_attribute("keysig.show"); + 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.showchange")) { - this->SetKeysigShowchange(StrToBoolean(element.attribute("keysig.showchange").value())); - if (removeAttr) element.remove_attribute("keysig.showchange"); + if (element.attribute("keysig.visible")) { + this->SetKeysigVisible(StrToBoolean(element.attribute("keysig.visible").value())); + if (removeAttr) element.remove_attribute("keysig.visible"); hasAttribute = true; } return hasAttribute; @@ -941,25 +991,25 @@ bool AttKeySigDefaultVis::ReadKeySigDefaultVis(pugi::xml_node element, bool remo bool AttKeySigDefaultVis::WriteKeySigDefaultVis(pugi::xml_node element) { bool wroteAttribute = false; - if (this->HasKeysigShow()) { - element.append_attribute("keysig.show") = BooleanToStr(this->GetKeysigShow()).c_str(); + if (this->HasKeysigCancelaccid()) { + element.append_attribute("keysig.cancelaccid") = CancelaccidToStr(this->GetKeysigCancelaccid()).c_str(); wroteAttribute = true; } - if (this->HasKeysigShowchange()) { - element.append_attribute("keysig.showchange") = BooleanToStr(this->GetKeysigShowchange()).c_str(); + if (this->HasKeysigVisible()) { + element.append_attribute("keysig.visible") = BooleanToStr(this->GetKeysigVisible()).c_str(); wroteAttribute = true; } return wroteAttribute; } -bool AttKeySigDefaultVis::HasKeysigShow() const +bool AttKeySigDefaultVis::HasKeysigCancelaccid() const { - return (m_keysigShow != BOOLEAN_NONE); + return (m_keysigCancelaccid != CANCELACCID_NONE); } -bool AttKeySigDefaultVis::HasKeysigShowchange() const +bool AttKeySigDefaultVis::HasKeysigVisible() const { - return (m_keysigShowchange != BOOLEAN_NONE); + return (m_keysigVisible != BOOLEAN_NONE); } //---------------------------------------------------------------------------- @@ -1128,18 +1178,12 @@ AttLiquescentVis::AttLiquescentVis() : Att() void AttLiquescentVis::ResetLiquescentVis() { - m_curve = liquescentVis_CURVE_NONE; m_looped = BOOLEAN_NONE; } bool AttLiquescentVis::ReadLiquescentVis(pugi::xml_node element, bool removeAttr) { bool hasAttribute = false; - if (element.attribute("curve")) { - this->SetCurve(StrToLiquescentVisCurve(element.attribute("curve").value())); - if (removeAttr) element.remove_attribute("curve"); - hasAttribute = true; - } if (element.attribute("looped")) { this->SetLooped(StrToBoolean(element.attribute("looped").value())); if (removeAttr) element.remove_attribute("looped"); @@ -1151,10 +1195,6 @@ bool AttLiquescentVis::ReadLiquescentVis(pugi::xml_node element, bool removeAttr bool AttLiquescentVis::WriteLiquescentVis(pugi::xml_node element) { bool wroteAttribute = false; - if (this->HasCurve()) { - element.append_attribute("curve") = LiquescentVisCurveToStr(this->GetCurve()).c_str(); - wroteAttribute = true; - } if (this->HasLooped()) { element.append_attribute("looped") = BooleanToStr(this->GetLooped()).c_str(); wroteAttribute = true; @@ -1162,11 +1202,6 @@ bool AttLiquescentVis::WriteLiquescentVis(pugi::xml_node element) return wroteAttribute; } -bool AttLiquescentVis::HasCurve() const -{ - return (m_curve != liquescentVis_CURVE_NONE); -} - bool AttLiquescentVis::HasLooped() const { return (m_looped != BOOLEAN_NONE); @@ -1275,7 +1310,7 @@ void AttMensuralVis::ResetMensuralVis() m_mensurOrient = ORIENTATION_NONE; m_mensurSign = MENSURATIONSIGN_NONE; m_mensurSize = data_FONTSIZE(); - m_mensurSlash = MEI_UNSET; + m_mensurSlash = 0; } bool AttMensuralVis::ReadMensuralVis(pugi::xml_node element, bool removeAttr) @@ -1399,7 +1434,7 @@ bool AttMensuralVis::HasMensurSize() const bool AttMensuralVis::HasMensurSlash() const { - return (m_mensurSlash != MEI_UNSET); + return (m_mensurSlash != 0); } //---------------------------------------------------------------------------- @@ -1455,6 +1490,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 +1506,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 +1525,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 +1542,11 @@ bool AttMeterSigDefaultVis::HasMeterShowchange() const return (m_meterShowchange != BOOLEAN_NONE); } +bool AttMeterSigDefaultVis::HasMeterVisible() const +{ + return (m_meterVisible != BOOLEAN_NONE); +} + //---------------------------------------------------------------------------- // AttMultiRestVis //---------------------------------------------------------------------------- @@ -1923,7 +1973,6 @@ AttStaffDefVis::AttStaffDefVis() : Att() void AttStaffDefVis::ResetStaffDefVis() { - m_gridShow = BOOLEAN_NONE; m_layerscheme = LAYERSCHEME_NONE; m_linesColor = ""; m_linesVisible = BOOLEAN_NONE; @@ -1933,11 +1982,6 @@ void AttStaffDefVis::ResetStaffDefVis() bool AttStaffDefVis::ReadStaffDefVis(pugi::xml_node element, bool removeAttr) { bool hasAttribute = false; - if (element.attribute("grid.show")) { - this->SetGridShow(StrToBoolean(element.attribute("grid.show").value())); - if (removeAttr) element.remove_attribute("grid.show"); - hasAttribute = true; - } if (element.attribute("layerscheme")) { this->SetLayerscheme(StrToLayerscheme(element.attribute("layerscheme").value())); if (removeAttr) element.remove_attribute("layerscheme"); @@ -1964,10 +2008,6 @@ bool AttStaffDefVis::ReadStaffDefVis(pugi::xml_node element, bool removeAttr) bool AttStaffDefVis::WriteStaffDefVis(pugi::xml_node element) { bool wroteAttribute = false; - if (this->HasGridShow()) { - element.append_attribute("grid.show") = BooleanToStr(this->GetGridShow()).c_str(); - wroteAttribute = true; - } if (this->HasLayerscheme()) { element.append_attribute("layerscheme") = LayerschemeToStr(this->GetLayerscheme()).c_str(); wroteAttribute = true; @@ -1987,11 +2027,6 @@ bool AttStaffDefVis::WriteStaffDefVis(pugi::xml_node element) return wroteAttribute; } -bool AttStaffDefVis::HasGridShow() const -{ - return (m_gridShow != BOOLEAN_NONE); -} - bool AttStaffDefVis::HasLayerscheme() const { return (m_layerscheme != LAYERSCHEME_NONE); diff --git a/libmei/dist/atts_visual.h b/libmei/dist/atts_visual.h index 1f7fdbbcd4e..29586bee1fe 100644 --- a/libmei/dist/atts_visual.h +++ b/libmei/dist/atts_visual.h @@ -120,16 +120,6 @@ class AttArpegVis : public Att { void SetArrowFillcolor(std::string arrowFillcolor_) { m_arrowFillcolor = arrowFillcolor_; } std::string GetArrowFillcolor() const { return m_arrowFillcolor; } bool HasArrowFillcolor() const; - // - void SetLineForm(data_LINEFORM lineForm_) { m_lineForm = lineForm_; } - data_LINEFORM GetLineForm() const { return m_lineForm; } - bool HasLineForm() const; - // - void SetLineWidth(data_LINEWIDTH lineWidth_) { m_lineWidth = lineWidth_; } - data_LINEWIDTH GetLineWidth() const { return m_lineWidth; } - bool HasLineWidth() const; - /** Getter for reference (for alternate type only) */ - data_LINEWIDTH *GetLineWidthAlternate() { return &m_lineWidth; } ///@} private: @@ -143,10 +133,6 @@ class AttArpegVis : public Att { std::string m_arrowColor; /** Captures the fill color of the arrow if different from the line color. **/ std::string m_arrowFillcolor; - /** Visual form of the line. **/ - data_LINEFORM m_lineForm; - /** Width of the line. **/ - data_LINEWIDTH m_lineWidth; }; //---------------------------------------------------------------------------- @@ -203,7 +189,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. **/ @@ -447,6 +433,55 @@ class InstCleffingVis : public AttCleffingVis { virtual ~InstCleffingVis() = default; }; +//---------------------------------------------------------------------------- +// AttCurvatureDirection +//---------------------------------------------------------------------------- + +class AttCurvatureDirection : public Att { +protected: + AttCurvatureDirection(); + ~AttCurvatureDirection() = default; + +public: + /** Reset the default values for the attribute class **/ + void ResetCurvatureDirection(); + + /** Read the values for the attribute class **/ + bool ReadCurvatureDirection(pugi::xml_node element, bool removeAttr = true); + + /** Write the values for the attribute class **/ + bool WriteCurvatureDirection(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 SetCurve(curvatureDirection_CURVE curve_) { m_curve = curve_; } + curvatureDirection_CURVE GetCurve() const { return m_curve; } + bool HasCurve() const; + ///@} + +private: + /** Records direction of curvature. **/ + curvatureDirection_CURVE m_curve; +}; + +//---------------------------------------------------------------------------- +// InstCurvatureDirection +//---------------------------------------------------------------------------- + +/** + * Instantiable version of AttCurvatureDirection + */ + +class InstCurvatureDirection : public AttCurvatureDirection { +public: + InstCurvatureDirection() = default; + virtual ~InstCurvatureDirection() = default; +}; + //---------------------------------------------------------------------------- // AttEpisemaVis //---------------------------------------------------------------------------- @@ -667,6 +702,55 @@ class InstFingGrpVis : public AttFingGrpVis { virtual ~InstFingGrpVis() = default; }; +//---------------------------------------------------------------------------- +// AttGuitarGridVis +//---------------------------------------------------------------------------- + +class AttGuitarGridVis : public Att { +protected: + AttGuitarGridVis(); + ~AttGuitarGridVis() = default; + +public: + /** Reset the default values for the attribute class **/ + void ResetGuitarGridVis(); + + /** Read the values for the attribute class **/ + bool ReadGuitarGridVis(pugi::xml_node element, bool removeAttr = true); + + /** Write the values for the attribute class **/ + bool WriteGuitarGridVis(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 SetGridShow(data_BOOLEAN gridShow_) { m_gridShow = gridShow_; } + data_BOOLEAN GetGridShow() const { return m_gridShow; } + bool HasGridShow() const; + ///@} + +private: + /** Determines whether to display guitar chord grids. **/ + data_BOOLEAN m_gridShow; +}; + +//---------------------------------------------------------------------------- +// InstGuitarGridVis +//---------------------------------------------------------------------------- + +/** + * Instantiable version of AttGuitarGridVis + */ + +class InstGuitarGridVis : public AttGuitarGridVis { +public: + InstGuitarGridVis() = default; + virtual ~InstGuitarGridVis() = default; +}; + //---------------------------------------------------------------------------- // AttHairpinVis //---------------------------------------------------------------------------- @@ -877,14 +961,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,20 +1010,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 SetKeysigCancelaccid(data_CANCELACCID keysigCancelaccid_) { m_keysigCancelaccid = keysigCancelaccid_; } + data_CANCELACCID GetKeysigCancelaccid() const { return m_keysigCancelaccid; } + bool HasKeysigCancelaccid() 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 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; }; //---------------------------------------------------------------------------- @@ -1111,18 +1195,12 @@ class AttLiquescentVis : public Att { * to the default value) **/ ///@{ - void SetCurve(liquescentVis_CURVE curve_) { m_curve = curve_; } - liquescentVis_CURVE GetCurve() const { return m_curve; } - bool HasCurve() const; - // void SetLooped(data_BOOLEAN looped_) { m_looped = looped_; } data_BOOLEAN GetLooped() const { return m_looped; } bool HasLooped() const; ///@} private: - /** Records direction of curvature. **/ - liquescentVis_CURVE m_curve; /** Indicates whether curve is closed. **/ data_BOOLEAN m_looped; }; @@ -1263,8 +1341,8 @@ class AttMensuralVis : public Att { /** Getter for reference (for alternate type only) */ data_FONTSIZE *GetMensurSizeAlternate() { return &m_mensurSize; } // - void SetMensurSlash(int mensurSlash_) { m_mensurSlash = mensurSlash_; } - int GetMensurSlash() const { return m_mensurSlash; } + void SetMensurSlash(char mensurSlash_) { m_mensurSlash = mensurSlash_; } + char GetMensurSlash() const { return m_mensurSlash; } bool HasMensurSlash() const; ///@} @@ -1290,7 +1368,7 @@ class AttMensuralVis : public Att { * Indicates the number lines added to the mensuration sign. * For example, one slash is added for what we now call 'alla breve'. **/ - int m_mensurSlash; + char m_mensurSlash; }; //---------------------------------------------------------------------------- @@ -1388,6 +1466,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 +1480,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 +1690,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. **/ @@ -1953,10 +2037,6 @@ class AttStaffDefVis : public Att { * to the default value) **/ ///@{ - void SetGridShow(data_BOOLEAN gridShow_) { m_gridShow = gridShow_; } - data_BOOLEAN GetGridShow() const { return m_gridShow; } - bool HasGridShow() const; - // void SetLayerscheme(data_LAYERSCHEME layerscheme_) { m_layerscheme = layerscheme_; } data_LAYERSCHEME GetLayerscheme() const { return m_layerscheme; } bool HasLayerscheme() const; @@ -1975,8 +2055,6 @@ class AttStaffDefVis : public Att { ///@} private: - /** Determines whether to display guitar chord grids. **/ - data_BOOLEAN m_gridShow; /** Indicates the number of layers and their stem directions. **/ data_LAYERSCHEME m_layerscheme; /** Captures the colors of the staff lines. **/ @@ -2112,7 +2190,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 ef49d5a4e28..7d15953404c 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 { @@ -35,6 +37,8 @@ enum data_ACCIDENTAL_GESTURAL : int8_t { ACCIDENTAL_GESTURAL_sd, ACCIDENTAL_GESTURAL_fu, ACCIDENTAL_GESTURAL_fd, + ACCIDENTAL_GESTURAL_xu, + ACCIDENTAL_GESTURAL_ffd, ACCIDENTAL_GESTURAL_bms, ACCIDENTAL_GESTURAL_kms, ACCIDENTAL_GESTURAL_bs, @@ -72,6 +76,8 @@ enum data_ACCIDENTAL_GESTURAL_extended : int8_t { ACCIDENTAL_GESTURAL_extended_sd, ACCIDENTAL_GESTURAL_extended_fu, ACCIDENTAL_GESTURAL_extended_fd, + ACCIDENTAL_GESTURAL_extended_xu, + ACCIDENTAL_GESTURAL_extended_ffd, ACCIDENTAL_GESTURAL_extended_MAX }; @@ -98,6 +104,10 @@ enum data_ACCIDENTAL_WRITTEN : int8_t { ACCIDENTAL_WRITTEN_fd, ACCIDENTAL_WRITTEN_nu, ACCIDENTAL_WRITTEN_nd, + ACCIDENTAL_WRITTEN_xu, + ACCIDENTAL_WRITTEN_xd, + ACCIDENTAL_WRITTEN_ffu, + ACCIDENTAL_WRITTEN_ffd, ACCIDENTAL_WRITTEN_1qf, ACCIDENTAL_WRITTEN_3qf, ACCIDENTAL_WRITTEN_1qs, @@ -146,6 +156,10 @@ enum data_ACCIDENTAL_WRITTEN_extended : int8_t { ACCIDENTAL_WRITTEN_extended_fd, ACCIDENTAL_WRITTEN_extended_nu, ACCIDENTAL_WRITTEN_extended_nd, + ACCIDENTAL_WRITTEN_extended_xu, + ACCIDENTAL_WRITTEN_extended_xd, + ACCIDENTAL_WRITTEN_extended_ffu, + ACCIDENTAL_WRITTEN_extended_ffd, ACCIDENTAL_WRITTEN_extended_1qf, ACCIDENTAL_WRITTEN_extended_3qf, ACCIDENTAL_WRITTEN_extended_1qs, @@ -193,6 +207,8 @@ enum data_ARTICULATION : int8_t { ARTICULATION_stacciss, ARTICULATION_marc, ARTICULATION_spicc, + ARTICULATION_stress, + ARTICULATION_unstress, ARTICULATION_doit, ARTICULATION_scoop, ARTICULATION_rip, @@ -299,6 +315,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 */ @@ -992,7 +1020,6 @@ enum data_METERFORM : int8_t { METERFORM_denomsym, METERFORM_norm, METERFORM_symplusnorm, - METERFORM_invis, METERFORM_MAX }; @@ -1346,7 +1373,7 @@ enum data_NOTEHEADMODIFIER : int8_t { NOTEHEADMODIFIER_brack, NOTEHEADMODIFIER_box, NOTEHEADMODIFIER_circle, - NOTEHEADMODIFIER_dblwhole, + NOTEHEADMODIFIER_fences, NOTEHEADMODIFIER_MAX }; @@ -1364,7 +1391,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 }; @@ -1775,7 +1802,7 @@ enum data_VERTICALALIGNMENT : int8_t { }; /** - * MEI att.accid.log@func + * MEI att.accid.log\@func */ enum accidLog_FUNC : int8_t { accidLog_FUNC_NONE = 0, @@ -1785,7 +1812,7 @@ enum accidLog_FUNC : int8_t { }; /** - * MEI att.anchoredText.log@func + * MEI att.anchoredText.log\@func */ enum anchoredTextLog_FUNC : int8_t { anchoredTextLog_FUNC_NONE = 0, @@ -1794,7 +1821,7 @@ enum anchoredTextLog_FUNC : int8_t { }; /** - * MEI att.arpeg.log@order + * MEI att.arpeg.log\@order */ enum arpegLog_ORDER : int8_t { arpegLog_ORDER_NONE = 0, @@ -1805,7 +1832,7 @@ enum arpegLog_ORDER : int8_t { }; /** - * MEI att.audience@audience + * MEI att.audience\@audience */ enum audience_AUDIENCE : int8_t { audience_AUDIENCE_NONE = 0, @@ -1815,17 +1842,7 @@ enum audience_AUDIENCE : int8_t { }; /** - * MEI att.bTrem.log@form - */ -enum bTremLog_FORM : int8_t { - bTremLog_FORM_NONE = 0, - bTremLog_FORM_meas, - bTremLog_FORM_unmeas, - bTremLog_FORM_MAX -}; - -/** - * MEI att.beamRend@form + * MEI att.beamRend\@form */ enum beamRend_FORM : int8_t { beamRend_FORM_NONE = 0, @@ -1837,7 +1854,7 @@ enum beamRend_FORM : int8_t { }; /** - * MEI att.beaming.vis@beam.rend + * MEI att.beaming.vis\@beam.rend */ enum beamingVis_BEAMREND : int8_t { beamingVis_BEAMREND_NONE = 0, @@ -1848,7 +1865,7 @@ enum beamingVis_BEAMREND : int8_t { }; /** - * MEI att.bracketSpan.log@func + * MEI att.bracketSpan.log\@func */ enum bracketSpanLog_FUNC : int8_t { bracketSpanLog_FUNC_NONE = 0, @@ -1859,7 +1876,7 @@ enum bracketSpanLog_FUNC : int8_t { }; /** - * MEI att.curvature@curvedir + * MEI att.curvature\@curvedir */ enum curvature_CURVEDIR : int8_t { curvature_CURVEDIR_NONE = 0, @@ -1870,7 +1887,17 @@ enum curvature_CURVEDIR : int8_t { }; /** - * MEI att.curve.log@func + * MEI att.curvatureDirection\@curve + */ +enum curvatureDirection_CURVE : int8_t { + curvatureDirection_CURVE_NONE = 0, + curvatureDirection_CURVE_a, + curvatureDirection_CURVE_c, + curvatureDirection_CURVE_MAX +}; + +/** + * MEI att.curve.log\@func */ enum curveLog_FUNC : int8_t { curveLog_FUNC_NONE = 0, @@ -1879,7 +1906,7 @@ enum curveLog_FUNC : int8_t { }; /** - * MEI att.cutout@cutout + * MEI att.cutout\@cutout */ enum cutout_CUTOUT : int8_t { cutout_CUTOUT_NONE = 0, @@ -1888,7 +1915,21 @@ enum cutout_CUTOUT : int8_t { }; /** - * MEI att.dot.log@form + * 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 */ enum dotLog_FORM : int8_t { dotLog_FORM_NONE = 0, @@ -1898,7 +1939,7 @@ enum dotLog_FORM : int8_t { }; /** - * MEI att.endings@ending.rend + * MEI att.endings\@ending.rend */ enum endings_ENDINGREND : int8_t { endings_ENDINGREND_NONE = 0, @@ -1909,7 +1950,7 @@ enum endings_ENDINGREND : int8_t { }; /** - * MEI att.episema.vis@form + * MEI att.episema.vis\@form */ enum episemaVis_FORM : int8_t { episemaVis_FORM_NONE = 0, @@ -1919,7 +1960,7 @@ enum episemaVis_FORM : int8_t { }; /** - * MEI att.evidence@evidence + * MEI att.evidence\@evidence */ enum evidence_EVIDENCE : int8_t { evidence_EVIDENCE_NONE = 0, @@ -1930,26 +1971,16 @@ enum evidence_EVIDENCE : int8_t { }; /** - * MEI att.extSym@glyph.auth - */ -enum extSym_GLYPHAUTH : int8_t { - extSym_GLYPHAUTH_NONE = 0, - extSym_GLYPHAUTH_smufl, - extSym_GLYPHAUTH_MAX -}; - -/** - * MEI att.fTrem.log@form + * MEI att.extSym.auth\@glyph.auth */ -enum fTremLog_FORM : int8_t { - fTremLog_FORM_NONE = 0, - fTremLog_FORM_meas, - fTremLog_FORM_unmeas, - fTremLog_FORM_MAX +enum extSymAuth_GLYPHAUTH : int8_t { + extSymAuth_GLYPHAUTH_NONE = 0, + extSymAuth_GLYPHAUTH_smufl, + extSymAuth_GLYPHAUTH_MAX }; /** - * MEI att.fermata.vis@form + * MEI att.fermata.vis\@form */ enum fermataVis_FORM : int8_t { fermataVis_FORM_NONE = 0, @@ -1959,7 +1990,7 @@ enum fermataVis_FORM : int8_t { }; /** - * MEI att.fermata.vis@shape + * MEI att.fermata.vis\@shape */ enum fermataVis_SHAPE : int8_t { fermataVis_SHAPE_NONE = 0, @@ -1970,7 +2001,7 @@ enum fermataVis_SHAPE : int8_t { }; /** - * MEI att.fingGrp.log@form + * MEI att.fingGrp.log\@form */ enum fingGrpLog_FORM : int8_t { fingGrpLog_FORM_NONE = 0, @@ -1981,7 +2012,7 @@ enum fingGrpLog_FORM : int8_t { }; /** - * MEI att.fingGrp.vis@orient + * MEI att.fingGrp.vis\@orient */ enum fingGrpVis_ORIENT : int8_t { fingGrpVis_ORIENT_NONE = 0, @@ -1991,7 +2022,7 @@ enum fingGrpVis_ORIENT : int8_t { }; /** - * MEI att.graceGrp.log@attach + * MEI att.graceGrp.log\@attach */ enum graceGrpLog_ATTACH : int8_t { graceGrpLog_ATTACH_NONE = 0, @@ -2002,7 +2033,7 @@ enum graceGrpLog_ATTACH : int8_t { }; /** - * MEI att.hairpin.log@form + * MEI att.hairpin.log\@form */ enum hairpinLog_FORM : int8_t { hairpinLog_FORM_NONE = 0, @@ -2012,7 +2043,7 @@ enum hairpinLog_FORM : int8_t { }; /** - * MEI att.harm.anl@form + * MEI att.harm.anl\@form */ enum harmAnl_FORM : int8_t { harmAnl_FORM_NONE = 0, @@ -2022,7 +2053,7 @@ enum harmAnl_FORM : int8_t { }; /** - * MEI att.harm.vis@rendgrid + * MEI att.harm.vis\@rendgrid */ enum harmVis_RENDGRID : int8_t { harmVis_RENDGRID_NONE = 0, @@ -2033,7 +2064,7 @@ enum harmVis_RENDGRID : int8_t { }; /** - * MEI att.harpPedal.log@a + * MEI att.harpPedal.log\@a */ enum harpPedalLog_A : int8_t { harpPedalLog_A_NONE = 0, @@ -2044,7 +2075,7 @@ enum harpPedalLog_A : int8_t { }; /** - * MEI att.harpPedal.log@b + * MEI att.harpPedal.log\@b */ enum harpPedalLog_B : int8_t { harpPedalLog_B_NONE = 0, @@ -2055,7 +2086,7 @@ enum harpPedalLog_B : int8_t { }; /** - * MEI att.harpPedal.log@c + * MEI att.harpPedal.log\@c */ enum harpPedalLog_C : int8_t { harpPedalLog_C_NONE = 0, @@ -2066,7 +2097,7 @@ enum harpPedalLog_C : int8_t { }; /** - * MEI att.harpPedal.log@d + * MEI att.harpPedal.log\@d */ enum harpPedalLog_D : int8_t { harpPedalLog_D_NONE = 0, @@ -2077,7 +2108,7 @@ enum harpPedalLog_D : int8_t { }; /** - * MEI att.harpPedal.log@e + * MEI att.harpPedal.log\@e */ enum harpPedalLog_E : int8_t { harpPedalLog_E_NONE = 0, @@ -2088,7 +2119,7 @@ enum harpPedalLog_E : int8_t { }; /** - * MEI att.harpPedal.log@f + * MEI att.harpPedal.log\@f */ enum harpPedalLog_F : int8_t { harpPedalLog_F_NONE = 0, @@ -2099,7 +2130,7 @@ enum harpPedalLog_F : int8_t { }; /** - * MEI att.harpPedal.log@g + * MEI att.harpPedal.log\@g */ enum harpPedalLog_G : int8_t { harpPedalLog_G_NONE = 0, @@ -2110,7 +2141,7 @@ enum harpPedalLog_G : int8_t { }; /** - * MEI att.line.log@func + * MEI att.line.log\@func */ enum lineLog_FUNC : int8_t { lineLog_FUNC_NONE = 0, @@ -2121,17 +2152,7 @@ enum lineLog_FUNC : int8_t { }; /** - * MEI att.liquescent.vis@curve - */ -enum liquescentVis_CURVE : int8_t { - liquescentVis_CURVE_NONE = 0, - liquescentVis_CURVE_a, - liquescentVis_CURVE_c, - liquescentVis_CURVE_MAX -}; - -/** - * MEI att.measurement@unit + * MEI att.measurement\@unit */ enum measurement_UNIT : int8_t { measurement_UNIT_NONE = 0, @@ -2156,7 +2177,7 @@ enum measurement_UNIT : int8_t { }; /** - * MEI att.meiVersion@meiversion + * MEI att.meiVersion\@meiversion */ enum meiVersion_MEIVERSION : int8_t { meiVersion_MEIVERSION_NONE = 0, @@ -2164,13 +2185,16 @@ enum meiVersion_MEIVERSION : int8_t { meiVersion_MEIVERSION_3_0_0, meiVersion_MEIVERSION_4_0_0, meiVersion_MEIVERSION_4_0_1, - meiVersion_MEIVERSION_5_0_0_devplusbasic, - meiVersion_MEIVERSION_5_0_0_dev, + meiVersion_MEIVERSION_5_0, + meiVersion_MEIVERSION_5_0plusbasic, + meiVersion_MEIVERSION_5_0plusCMN, + meiVersion_MEIVERSION_5_0plusMensural, + meiVersion_MEIVERSION_5_0plusNeumes, meiVersion_MEIVERSION_MAX }; /** - * MEI att.mensur.vis@form + * MEI att.mensur.vis\@form */ enum mensurVis_FORM : int8_t { mensurVis_FORM_NONE = 0, @@ -2180,7 +2204,7 @@ enum mensurVis_FORM : int8_t { }; /** - * MEI att.mensural.vis@mensur.form + * MEI att.mensural.vis\@mensur.form */ enum mensuralVis_MENSURFORM : int8_t { mensuralVis_MENSURFORM_NONE = 0, @@ -2190,7 +2214,7 @@ enum mensuralVis_MENSURFORM : int8_t { }; /** - * MEI att.meterConformance@metcon + * MEI att.meterConformance\@metcon */ enum meterConformance_METCON : int8_t { meterConformance_METCON_NONE = 0, @@ -2201,7 +2225,7 @@ enum meterConformance_METCON : int8_t { }; /** - * MEI att.meterSigGrp.log@func + * MEI att.meterSigGrp.log\@func */ enum meterSigGrpLog_FUNC : int8_t { meterSigGrpLog_FUNC_NONE = 0, @@ -2213,7 +2237,7 @@ enum meterSigGrpLog_FUNC : int8_t { }; /** - * MEI att.mordent.log@form + * MEI att.mordent.log\@form */ enum mordentLog_FORM : int8_t { mordentLog_FORM_NONE = 0, @@ -2223,7 +2247,7 @@ enum mordentLog_FORM : int8_t { }; /** - * MEI att.ncForm@con + * MEI att.ncForm\@con */ enum ncForm_CON : int8_t { ncForm_CON_NONE = 0, @@ -2234,17 +2258,7 @@ enum ncForm_CON : int8_t { }; /** - * MEI att.ncForm@curve - */ -enum ncForm_CURVE : int8_t { - ncForm_CURVE_NONE = 0, - ncForm_CURVE_a, - ncForm_CURVE_c, - ncForm_CURVE_MAX -}; - -/** - * MEI att.ncForm@rellen + * MEI att.ncForm\@rellen */ enum ncForm_RELLEN : int8_t { ncForm_RELLEN_NONE = 0, @@ -2254,7 +2268,35 @@ enum ncForm_RELLEN : int8_t { }; /** - * MEI att.note.ges@extremis + * MEI att.neumeType\@type + */ +enum neumeType_TYPE : int8_t { + neumeType_TYPE_NONE = 0, + neumeType_TYPE_apostropha, + neumeType_TYPE_bistropha, + neumeType_TYPE_climacus, + neumeType_TYPE_clivis, + neumeType_TYPE_oriscus, + neumeType_TYPE_pes, + neumeType_TYPE_pessubpunctis, + neumeType_TYPE_porrectus, + neumeType_TYPE_porrectusflexus, + neumeType_TYPE_pressusmaior, + neumeType_TYPE_pressusminor, + neumeType_TYPE_punctum, + neumeType_TYPE_quilisma, + neumeType_TYPE_scandicus, + neumeType_TYPE_strophicus, + neumeType_TYPE_torculus, + neumeType_TYPE_torculusresupinus, + neumeType_TYPE_tristropha, + neumeType_TYPE_virga, + neumeType_TYPE_virgastrata, + neumeType_TYPE_MAX +}; + +/** + * MEI att.note.ges\@extremis */ enum noteGes_EXTREMIS : int8_t { noteGes_EXTREMIS_NONE = 0, @@ -2264,7 +2306,7 @@ enum noteGes_EXTREMIS : int8_t { }; /** - * MEI att.noteHeads@head.auth + * MEI att.noteHeads\@head.auth */ enum noteHeads_HEADAUTH : int8_t { noteHeads_HEADAUTH_NONE = 0, @@ -2273,7 +2315,7 @@ enum noteHeads_HEADAUTH : int8_t { }; /** - * MEI att.octave.log@coll + * MEI att.octave.log\@coll */ enum octaveLog_COLL : int8_t { octaveLog_COLL_NONE = 0, @@ -2282,7 +2324,7 @@ enum octaveLog_COLL : int8_t { }; /** - * MEI att.pb.vis@folium + * MEI att.pb.vis\@folium */ enum pbVis_FOLIUM : int8_t { pbVis_FOLIUM_NONE = 0, @@ -2292,7 +2334,7 @@ enum pbVis_FOLIUM : int8_t { }; /** - * MEI att.pedal.log@dir + * MEI att.pedal.log\@dir */ enum pedalLog_DIR : int8_t { pedalLog_DIR_NONE = 0, @@ -2304,7 +2346,7 @@ enum pedalLog_DIR : int8_t { }; /** - * MEI att.pedal.log@func + * MEI att.pedal.log\@func */ enum pedalLog_FUNC : int8_t { pedalLog_FUNC_NONE = 0, @@ -2316,7 +2358,7 @@ enum pedalLog_FUNC : int8_t { }; /** - * MEI att.pointing@xlink:actuate + * MEI att.pointing\@xlink:actuate */ enum pointing_XLINKACTUATE : int8_t { pointing_XLINKACTUATE_NONE = 0, @@ -2328,7 +2370,7 @@ enum pointing_XLINKACTUATE : int8_t { }; /** - * MEI att.pointing@xlink:show + * MEI att.pointing\@xlink:show */ enum pointing_XLINKSHOW : int8_t { pointing_XLINKSHOW_NONE = 0, @@ -2341,7 +2383,7 @@ enum pointing_XLINKSHOW : int8_t { }; /** - * MEI att.recordType@recordtype + * MEI att.recordType\@recordtype */ enum recordType_RECORDTYPE : int8_t { recordType_RECORDTYPE_NONE = 0, @@ -2363,7 +2405,7 @@ enum recordType_RECORDTYPE : int8_t { }; /** - * MEI att.regularMethod@method + * MEI att.regularMethod\@method */ enum regularMethod_METHOD : int8_t { regularMethod_METHOD_NONE = 0, @@ -2373,7 +2415,7 @@ enum regularMethod_METHOD : int8_t { }; /** - * MEI att.rehearsal@reh.enclose + * MEI att.rehearsal\@reh.enclose */ enum rehearsal_REHENCLOSE : int8_t { rehearsal_REHENCLOSE_NONE = 0, @@ -2384,7 +2426,20 @@ enum rehearsal_REHENCLOSE : int8_t { }; /** - * MEI att.sb.vis@form + * 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 */ enum sbVis_FORM : int8_t { sbVis_FORM_NONE = 0, @@ -2393,7 +2448,7 @@ enum sbVis_FORM : int8_t { }; /** - * MEI att.staffGroupingSym@symbol + * MEI att.staffGroupingSym\@symbol */ enum staffGroupingSym_SYMBOL : int8_t { staffGroupingSym_SYMBOL_NONE = 0, @@ -2406,7 +2461,7 @@ enum staffGroupingSym_SYMBOL : int8_t { }; /** - * MEI att.syl.log@con + * MEI att.syl.log\@con */ enum sylLog_CON : int8_t { sylLog_CON_NONE = 0, @@ -2422,7 +2477,7 @@ enum sylLog_CON : int8_t { }; /** - * MEI att.syl.log@wordpos + * MEI att.syl.log\@wordpos */ enum sylLog_WORDPOS : int8_t { sylLog_WORDPOS_NONE = 0, @@ -2434,7 +2489,7 @@ enum sylLog_WORDPOS : int8_t { }; /** - * MEI att.targetEval@evaluate + * MEI att.targetEval\@evaluate */ enum targetEval_EVALUATE : int8_t { targetEval_EVALUATE_NONE = 0, @@ -2445,7 +2500,7 @@ enum targetEval_EVALUATE : int8_t { }; /** - * MEI att.tempo.log@func + * MEI att.tempo.log\@func */ enum tempoLog_FUNC : int8_t { tempoLog_FUNC_NONE = 0, @@ -2457,7 +2512,17 @@ enum tempoLog_FUNC : int8_t { }; /** - * MEI att.tuplet.vis@num.format + * MEI att.tremForm\@form + */ +enum tremForm_FORM : int8_t { + tremForm_FORM_NONE = 0, + tremForm_FORM_meas, + tremForm_FORM_unmeas, + tremForm_FORM_MAX +}; + +/** + * MEI att.tuplet.vis\@num.format */ enum tupletVis_NUMFORMAT : int8_t { tupletVis_NUMFORMAT_NONE = 0, @@ -2467,7 +2532,7 @@ enum tupletVis_NUMFORMAT : int8_t { }; /** - * MEI att.turn.log@form + * MEI att.turn.log\@form */ enum turnLog_FORM : int8_t { turnLog_FORM_NONE = 0, @@ -2477,7 +2542,7 @@ enum turnLog_FORM : int8_t { }; /** - * MEI att.voltaGroupingSym@voltasym + * MEI att.voltaGroupingSym\@voltasym */ enum voltaGroupingSym_VOLTASYM : int8_t { voltaGroupingSym_VOLTASYM_NONE = 0, @@ -2490,7 +2555,7 @@ enum voltaGroupingSym_VOLTASYM : int8_t { }; /** - * MEI att.whitespace@xml:space + * MEI att.whitespace\@xml:space */ enum whitespace_XMLSPACE : int8_t { whitespace_XMLSPACE_NONE = 0, diff --git a/libmei/dist/meibasic.h b/libmei/dist/meibasic.h index 17d292f0571..ef66762c8aa 100644 --- a/libmei/dist/meibasic.h +++ b/libmei/dist/meibasic.h @@ -12,228 +12,96 @@ 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", "color", "glyph.auth", "glyph.uri", "glyph.name", "glyph.num", "lform", "lwidth", "lsegs", "fontfam", "fontname", "fontsize", "fontstyle", "fontweight", "letterspacing", "lineheight", "ho", "vo"}}, + {"beam", {"label", "type", "layer", "staff", "color", "cue"}}, + {"beatRpt", {"label", "type", "beatdef", "layer", "staff", "slash", "color", "expand", "glyph.auth", "glyph.uri", "glyph.name", "glyph.num", "plist"}}, + {"breath", {"label", "type", "layer", "staff", "startid", "tstamp", "color", "glyph.auth", "glyph.uri", "glyph.name", "glyph.num", "ho", "vo"}}, + {"bTrem", {"label", "type", "layer", "staff", "dots", "dur", "num", "form", "num.place", "num.visible", "unitdur"}}, + {"fermata", {"label", "type", "layer", "plist", "staff", "tstamp", "endid", "startid", "form", "shape", "color", "glyph.auth", "glyph.uri", "glyph.name", "glyph.num", "place", "ho", "vo"}}, + {"fTrem", {"label", "type", "layer", "staff", "dots", "dur", "form", "unitdur"}}, + {"gliss", {"label", "type", "layer", "plist", "staff", "tstamp", "dur", "endid", "startid", "tstamp2", "color", "glyph.auth", "glyph.uri", "glyph.name", "glyph.num", "fontfam", "fontname", "fontsize", "fontstyle", "fontweight", "letterspacing", "lineheight", "ho", "vo", "startho", "endho", "startvo", "endvo", "lendsym", "lendsym.size", "lstartsym", "lstartsym.size", "lform", "lwidth", "lsegs"}}, + {"graceGrp", {"label", "type", "attach", "layer", "staff", "grace", "grace.time", "color"}}, + {"hairpin", {"label", "type", "form", "niente", "layer", "plist", "staff", "tstamp", "dur", "endid", "startid", "tstamp2", "opening", "closed", "opening.vertical", "angle.optimize", "color", "lform", "lwidth", "lsegs", "place", "ho", "vo", "startho", "endho", "startvo", "endvo", "val", "val2"}}, + {"halfmRpt", {"label", "type", "layer", "staff", "dur", "color", "expand", "glyph.auth", "glyph.uri", "glyph.name", "glyph.num", "fontfam", "fontname", "fontsize", "fontstyle", "fontweight", "letterspacing", "lineheight", "ho", "vo"}}, + {"harpPedal", {"label", "type", "c", "d", "e", "f", "g", "a", "b", "layer", "plist", "staff", "tstamp", "endid", "startid", "color", "glyph.auth", "glyph.uri", "glyph.name", "glyph.num", "place", "fontfam", "fontname", "fontsize", "fontstyle", "fontweight", "letterspacing", "lineheight", "ho", "vo"}}, + {"lv", {"label", "type", "layer", "plist", "staff", "tstamp", "endid", "startid", "tstamp2", "color", "curvedir", "lform", "lwidth", "lsegs", "ho", "vo", "startho", "endho", "startvo", "endvo"}}, + {"measure", {"label", "type", "left", "right", "metcon", "n"}}, + {"mNum", {"label", "type", "xml:lang", "color", "place", "fontfam", "fontname", "fontsize", "fontstyle", "fontweight", "letterspacing", "lineheight", "ho", "vo"}}, + {"mRest", {"label", "type", "cue", "dur", "layer", "staff", "color", "cutout", "glyph.auth", "glyph.uri", "glyph.name", "glyph.num", "fontfam", "fontname", "fontsize", "fontstyle", "fontweight", "letterspacing", "lineheight", "ho", "vo"}}, + {"mRpt", {"label", "type", "layer", "staff", "num", "color", "expand", "glyph.auth", "glyph.uri", "glyph.name", "glyph.num", "num.place", "num.visible", "fontfam", "fontname", "fontsize", "fontstyle", "fontweight", "letterspacing", "lineheight"}}, + {"multiRest", {"label", "type", "layer", "staff", "num", "block", "color", "glyph.auth", "glyph.uri", "glyph.name", "glyph.num", "num.place", "num.visible", "fontfam", "fontname", "fontsize", "fontstyle", "fontweight", "letterspacing", "lineheight", "width"}}, + {"multiRpt", {"label", "type", "layer", "staff", "num", "color", "expand", "glyph.auth", "glyph.uri", "glyph.name", "glyph.num", "fontfam", "fontname", "fontsize", "fontstyle", "fontweight", "letterspacing", "lineheight"}}, + {"octave", {"label", "type", "coll", "layer", "plist", "staff", "tstamp", "dur", "dis", "dis.place", "endid", "startid", "tstamp2", "color", "extender", "lendsym", "lendsym.size", "lstartsym", "lstartsym.size", "lform", "lwidth", "lsegs", "ho", "vo", "startho", "endho"}}, + {"pedal", {"label", "type", "dir", "func", "layer", "plist", "staff", "tstamp", "endid", "startid", "tstamp2", "form", "color", "glyph.auth", "glyph.uri", "glyph.name", "glyph.num", "lendsym", "lendsym.size", "lstartsym", "lstartsym.size", "lform", "lwidth", "lsegs", "place", "fontfam", "fontname", "fontsize", "fontstyle", "fontweight", "letterspacing", "lineheight", "ho", "vo"}}, + {"reh", {"label", "type", "xml:lang", "staff", "startid", "tstamp", "color", "place", "fontfam", "fontname", "fontsize", "fontstyle", "fontweight", "letterspacing", "lineheight", "ho", "vo"}}, + {"repeatMark", {"label", "type", "xml:lang", "func", "layer", "plist", "staff", "tstamp", "dur", "endid", "startid", "tstamp2", "extender", "lendsym", "lendsym.size", "lstartsym", "lstartsym.size", "lform", "lwidth", "lsegs", "glyph.auth", "glyph.uri", "glyph.name", "glyph.num", "place", "ho", "vo", "startho", "endho"}}, + {"slur", {"label", "type", "layer", "plist", "staff", "tstamp", "dur", "endid", "startid", "tstamp2", "color", "curvedir", "lform", "lwidth", "lsegs", "ho", "vo", "startho", "endho", "startvo", "endvo"}}, + {"tie", {"label", "type", "layer", "plist", "staff", "tstamp", "endid", "startid", "tstamp2", "color", "curvedir", "lform", "lwidth", "lsegs", "ho", "vo", "startho", "endho", "startvo", "endvo"}}, + {"tuplet", {"label", "type", "dur", "num", "numbase", "layer", "staff", "endid", "startid", "bracket.place", "bracket.visible", "dur.visible", "num.format", "color", "num.place", "num.visible"}}, + {"mordent", {"label", "type", "form", "long", "layer", "plist", "staff", "tstamp", "endid", "startid", "accidupper", "accidlower", "accidupper.ges", "accidlower.ges", "color", "glyph.auth", "glyph.uri", "glyph.name", "glyph.num", "place", "fontfam", "fontname", "fontsize", "fontstyle", "fontweight", "letterspacing", "lineheight", "ho", "vo"}}, + {"trill", {"label", "type", "layer", "plist", "staff", "tstamp", "dur", "accidupper", "accidlower", "accidupper.ges", "accidlower.ges", "endid", "startid", "tstamp2", "color", "extender", "lendsym", "lendsym.size", "lstartsym", "lstartsym.size", "lform", "lwidth", "lsegs", "place", "glyph.auth", "glyph.uri", "glyph.name", "glyph.num", "fontfam", "fontname", "fontsize", "fontstyle", "fontweight", "letterspacing", "lineheight", "ho", "vo", "startho", "endho"}}, + {"turn", {"label", "type", "delayed", "form", "layer", "plist", "staff", "tstamp", "accidupper", "accidlower", "accidupper.ges", "accidlower.ges", "startid", "color", "glyph.auth", "glyph.uri", "glyph.name", "glyph.num", "place", "fontfam", "fontname", "fontsize", "fontstyle", "fontweight", "letterspacing", "lineheight", "ho", "vo"}}, + {"fing", {"label", "type", "layer", "plist", "staff", "tstamp", "dur", "endid", "startid", "tstamp2", "extender", "lendsym", "lendsym.size", "lstartsym", "lstartsym.size", "lform", "lwidth", "lsegs", "place", "ho", "vo"}}, + {"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", "extender", "lendsym", "lendsym.size", "lstartsym", "lstartsym.size", "lform", "lwidth", "lsegs", "place", "ho", "vo"}}, + {"fb", {"label", "type"}}, + {"harm", {"label", "type", "chordref", "layer", "plist", "staff", "tstamp", "dur", "endid", "startid", "tstamp2", "rendgrid", "extender", "lendsym", "lendsym.size", "lstartsym", "lstartsym.size", "lform", "lwidth", "lsegs", "place", "ho", "vo", "startho", "endho"}}, + {"availability", {"label", "type", "data"}}, + {"fileDesc", {"label", "type", "corresp"}}, + {"meiHead", {"label", "xml:lang", "type"}}, + {"pubStmt", {"label", "type"}}, + {"titleStmt", {"label", "type"}}, + {"refrain", {"label", "type", "xml:lang", "color", "place", "fontfam", "fontname", "fontsize", "fontstyle", "fontweight", "letterspacing", "lineheight", "vo", "voltasym"}}, + {"verse", {"label", "type", "color", "place", "fontfam", "fontname", "fontsize", "fontstyle", "fontweight", "letterspacing", "lineheight", "vo", "voltasym", "n"}}, + {"volta", {"label", "type", "xml:lang", "color", "fontfam", "fontname", "fontsize", "fontstyle", "fontweight", "letterspacing", "lineheight", "vo"}}, + {"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", "color", "glyph.auth", "glyph.uri", "glyph.name", "glyph.num", "ho", "vo", "accid.ges"}}, + {"arranger", {"label", "type", "xml:lang"}}, + {"artic", {"label", "type", "artic", "layer", "plist", "staff", "tstamp", "color", "glyph.auth", "glyph.uri", "glyph.name", "glyph.num", "place", "ho", "vo"}}, + {"body", {"label", "type"}}, + {"caesura", {"label", "type", "layer", "staff", "startid", "tstamp", "color", "glyph.auth", "glyph.uri", "glyph.name", "glyph.num", "ho", "vo"}}, + {"chord", {"label", "type", "dots", "grace", "grace.time", "cue", "dur", "layer", "staff", "cluster", "color", "glyph.auth", "glyph.uri", "glyph.name", "glyph.num", "stem.dir", "stem.len", "stem.mod", "ho", "breaksec", "instr"}}, + {"clef", {"label", "type", "layer", "staff", "cautionary", "shape", "line", "oct", "dis", "dis.place", "color", "glyph.auth", "glyph.uri", "glyph.name", "glyph.num", "fontfam", "fontname", "fontsize", "fontstyle", "fontweight", "letterspacing", "lineheight", "ho", "vo"}}, + {"clefGrp", {"label", "type", "layer", "staff"}}, + {"composer", {"label", "type", "xml:lang"}}, + {"date", {"label", "type", "calendar", "enddate", "isodate", "notafter", "notbefore", "startdate", "xml:lang"}}, + {"dir", {"label", "type", "xml:lang", "layer", "plist", "staff", "tstamp", "dur", "endid", "startid", "tstamp2", "extender", "lendsym", "lendsym.size", "lstartsym", "lstartsym.size", "lform", "lwidth", "lsegs", "place", "ho", "vo", "startho", "endho"}}, + {"dynam", {"label", "type", "layer", "plist", "staff", "tstamp", "dur", "endid", "startid", "tstamp2", "extender", "lendsym", "lendsym.size", "lstartsym", "lstartsym.size", "lform", "lwidth", "lsegs", "place", "ho", "vo", "startho", "endho", "xml:lang"}}, + {"ending", {"label", "type", "lendsym", "lendsym.size", "lstartsym", "lstartsym.size", "lform", "lwidth", "lsegs"}}, + {"label", {"label", "type", "xml:lang"}}, + {"labelAbbr", {"label", "type", "xml:lang"}}, + {"layer", {"label", "n", "type"}}, + {"lb", {"label", "type"}}, + {"lyricist", {"label", "type", "xml:lang"}}, + {"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", "color", "glyph.auth", "glyph.uri", "glyph.name", "glyph.num", "stem.dir", "stem.len", "stem.mod", "fontfam", "fontname", "fontsize", "fontstyle", "fontweight", "letterspacing", "lineheight", "ho", "breaksec", "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", "color", "place", "ho", "vo", "startho", "endho"}}, + {"pb", {"label", "type", "folium"}}, + {"pgFoot", {"label", "type", "func", "halign", "xml:lang"}}, + {"pgHead", {"label", "type", "func", "halign", "xml:lang"}}, + {"pubPlace", {"label", "type", "xml:lang"}}, + {"rend", {"color", "label", "type", "glyph.auth", "glyph.uri", "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", "color", "breaksec", "ho", "vo", "instr"}}, + {"sb", {"label", "type", "form", "glyph.auth", "glyph.uri", "glyph.name", "glyph.num", "fontfam", "fontname", "fontsize", "fontstyle", "fontweight", "letterspacing", "lineheight"}}, + {"score", {"label", "type"}}, + {"scoreDef", {"label", "type", "keysig", "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", "keysig", "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", "ho", "vo", "halign"}}, + {"symbol", {"label", "type", "color", "glyph.auth", "glyph.uri", "glyph.name", "glyph.num", "scale", "ho", "vo"}}, + {"tempo", {"label", "type", "xml:lang", "func", "layer", "plist", "staff", "tstamp", "mm", "mm.unit", "mm.dots", "endid", "startid", "tstamp2", "extender", "lendsym", "lendsym.size", "lstartsym", "lstartsym.size", "lform", "lwidth", "lsegs", "place", "ho", "vo", "startho", "endho", "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-verovio_compiled.odd b/libmei/mei/develop/mei-verovio_compiled.odd deleted file mode 100644 index 827821c0d6e..00000000000 --- a/libmei/mei/develop/mei-verovio_compiled.odd +++ /dev/null @@ -1,27290 +0,0 @@ - - - - - - - Music Encoding Initiative Guidelines – Verovio customization - - Authored by - Laurent Pugin - Andrew Hankinson - Perry Roland - Klaus Rettinghaus - - - -

- - -

- - - - - Added att.margins. - - - Moved to PureODD. - - - Add all supported versions of MEI. - - - Include tablature preliminary proposal. - - - Changing to /measure/staff organisation; adding /pages container in /mdiv; adding /page@position; changing scb to - secb. - - - Adding /staff/measure organisation and other fixes. - - - Fixing naming according to MEI convention and other small fixes. - - - Initial setup of the customization. - - - - - - - - - - - Written accidental values. - - - - - - - - - -

- -

- - - - Written standard accidental - values. - - - - Sharp. - - - Flat. - - - Double sharp (written as 2 sharps). - - - Double sharp (written using croix). - - - Double flat. - - - Triple sharp (written as a croix followed by a sharp). - - - Triple sharp (written as a sharp followed by a croix). - - - Triple sharp (written as 3 sharps). - - - Triple flat. - - - Natural. - - - Natural + flat; used to cancel preceding double flat. - - - Natural + sharp; used to cancel preceding double sharp. - - - - - - Written quarter-tone accidental - values. - - - - Sharp note raised by quarter tone (sharp modified by arrow). - - - Sharp note lowered by quarter tone (sharp modified by arrow). - - - Flat note raised by quarter tone (flat modified by arrow). - - - Flat note lowered by quarter tone (flat modified by arrow). - - - Natural note raised by quarter tone (natural modified by arrow). - - - Natural note lowered by quarter tone (natural modified by arrow). - - - 1/4-tone flat accidental. - - - 3/4-tone flat accidental. - - - 1/4-tone sharp accidental. - - - 3/4-tone sharp accidental. - - - - - - Arel-Ezgi-Uzdilek (AEU) accidental - values (written and gestural/performed). - - - - Büyük mücenneb (sharp). - - - Küçük mücenneb (sharp). - - - Bakiye (sharp). - - - Koma (sharp). - - - Koma (flat). - - - Bakiye (flat). - - - Küçük mücenneb (flat). - - - Büyük mücenneb (flat). - - - - -

- -

-
-
- - Persian accidental values (written - and gestural/performed). - - - - Koron (quarter tone flat). - - - Sori (quarter tone sharp). - - - - - - Gestural/performed standard - accidental values. - - - - - - - - - - - Gestural/performed accidental - values. - - - - Sharp. - - - Flat. - - - Double sharp. - - - Double flat. - - - Triple sharp. - - - Triple flat. - - - Natural. - - - - - - Gestural/performed quarter-tone - accidental values. - - - - Three quarter-tones sharp. - - - Quarter-tone sharp. - - - Quarter-tone flat. - - - Three quarter-tones flat. - - - - - - 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). - - - Inverted accent. - - - Long accent, used to indicate an elongated accent mark. It is the responsibility of the encoder to distinguish - between accents and hairpins. - - - Soft accent, see SMuFL Articulation supplement (U+ED40–U+ED4F). - - - Staccato (Unicode 1D17C). - - - Tenuto (Unicode 1D17D). - - - Staccatissimo (Unicode 1D17E). - - - Marcato (Unicode 1D17F). - - - Spiccato. - - - Main note followed by short slide to higher, indeterminate pitch (Unicode 1D185). - - - Main note preceded by short slide from lower, indeterminate pitch (Unicode 1D186). - - - Main note preceded by long slide from lower, often indeterminate pitch; also known as "squeeze". - - - Main note preceded by "slide" from higher, indeterminate pitch. - - - Main note followed by short "slide" to lower, indeterminate pitch. - - - Main note followed by long "slide" to lower, indeterminate pitch. - - - "lip slur" to lower pitch, then return to written pitch. - - - Main note followed by quick upward rise, then descent in pitch (Unicode 1D187). - - - (Unicode 1D188). - - - Alternation between written pitch and next highest overtone (brass instruments) or note minor third higher - (woodwinds). - - - Down bow (Unicode 1D1AA). - - - Up bow (Unicode 1D1AB). - - - Harmonic (Unicode 1D1AC). - - - Snap pizzicato (Unicode 1D1AD). - - - Fingernail (Unicode 1D1B3). - - - Stop harp string from sounding (Unicode 1D1B4). - - - Stop all harp strings from sounding (Unicode 1D1B5). - - - Full (as opposed to stopped) tone. - - - "muffled" tone. - - - Double tongue (Unicode 1D18A). - - - Triple tongue (Unicode 1D18B). - - - Use heel (organ pedal). - - - Use toe (organ pedal). - - - Percussive effect on guitar string(s). - - - Left-hand pizzicato. - - - Uninterpreted dot. - - - Uninterpreted stroke. - - - - - - - "" - contains a deprecated value. - - - "" - contains a deprecated value. - - - - - - 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 of bar lines. - - - - Between staves only. - - - Between and across staves as necessary. - - - Short bar line through a subset of staff lines. - - - - - - Renderings of bar lines. Some values - correspond to the Western Musical Symbols portion of the Unicode Standard. - - - - Dashed line (SMuFL E036 and Unicode 1D104). - - - Dotted line (SMuFL E037). - - - Double barline (SMuFL E031 and Unicode 1D101). - - - Double dashed line. - - - Double dotted line. - - - Heavy double barline (SMuFL E035). - - - Segno serpent with vertical lines (SMuFL E04B). - - - End barline (SMuFL E032 and Unicode 1D102). - - - Heavy barline (SMuFL E034). - - - Bar line not rendered. - - - Repeat start (SMuFL E040 and Unicode 1D106). - - - Repeat start and end (SMuFL E042). - - - Repeat end (SMuFL E041 and Unicode 1D107). - - - Segno serpent. - - - Single barline (SMuFL E030 and Unicode 1D100). - - - - - - 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. - - - - The beam is above the events it affects. - - - The beam is below the events it affects. - - - The beam is above and below the events it affects. - - - - - - 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. - - - - 1|2|3|4|5 - - - mixed - - - - - - 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 - - - [0-9](\.25|\.5|\.75)? - - - full - - - - - - Boolean attribute values. - - - - True. - - - False. - - - - - - 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. - - - Medium certainty. - - - Low certainty. - - - An unknown level of certainty. - - - - - - 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 Standard. - - - - G clef (Unicode 1D11E). - - - Double G clef. - - - F clef (Unicode 1D122). - - - C clef (Unicode 1D121). - - - Drum clef (Unicode 1D125 or Unicode 1D126). - - - Tablature "clef"; i.e., usually "TAB" rendered vertically. - - - - - - Tone-cluster rendition. - - - - White keys. - - - Black keys. - - - Mixed black and white keys. - - - - - - 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. - - - - Hex: #f0f8ff / RGB: 240,248,255 - - - Hex: #faebd7 / RGB: 250,235,215 - - - Hex: #00ffff / RGB: 0,255,255 - - - Hex: #7fffd4 / RGB: 127,255,212 - - - Hex: #f0ffff / RGB: 240,255,255 - - - Hex: #f5f5dc / RGB: 245,245,220 - - - Hex: #ffe4c4 / RGB: 255,228,196 - - - Hex: #000000 / RGB: 0,0,0 - - - Hex: #ffebcd / RGB: 255,235,205 - - - Hex: #0000ff / RGB: 0,0,255 - - - Hex: #8a2be2 / RGB: 138,43,226 - - - Hex: #a52a2a / RGB: 165,42,42 - - - Hex: #deb887 / RGB: 222,184,135 - - - Hex: #5f9ea0 / RGB: 95,158,160 - - - Hex: #7fff00 / RGB: 127,255,0 - - - Hex: #d2691e / RGB: 210,105,30 - - - Hex: #ff7f50 / RGB: 255,127,80 - - - Hex: #6495ed / RGB: 100,149,237 - - - Hex: #fff8dc / RGB: 255,248,220 - - - Hex: #dc143c / RGB: 220,20,60 - - - Hex: #00ffff / RGB: 0,255,255 - - - Hex: #00008b / RGB: 0,0,139 - - - Hex: #008b8b / RGB: 0,139,139 - - - Hex: #b8860b / RGB: 184,134,11 - - - Hex: #a9a9a9 / RGB: 169,169,169 - - - Hex: #006400 / RGB: 0,100,0 - - - Hex: #a9a9a9 / RGB: 169,169,169 - - - Hex: #bdb76b / RGB: 189,183,107 - - - Hex: #8b008b / RGB: 139,0,139 - - - Hex: #556b2f / RGB: 85,107,47 - - - Hex: #ff8c00 / RGB: 255,140,0 - - - Hex: #9932cc / RGB: 153,50,204 - - - Hex: #8b0000 / RGB: 139,0,0 - - - Hex: #e9967a / RGB: 233,150,122 - - - Hex: #8fbc8f / RGB: 143,188,143 - - - Hex: #483d8b / RGB: 72,61,139 - - - Hex: #2f4f4f / RGB: 47,79,79 - - - Hex: #2f4f4f / RGB: 47,79,79 - - - Hex: #00ced1 / RGB: 0,206,209 - - - Hex: #9400d3 / RGB: 148,0,211 - - - Hex: #ff1493 / RGB: 255,20,147 - - - Hex: #00bfff / RGB: 0,191,255 - - - Hex: #696969 / RGB: 105,105,105 - - - Hex: #696969 / RGB: 105,105,105 - - - Hex: #1e90ff / RGB: 30,144,255 - - - Hex: #b22222 / RGB: 178,34,34 - - - Hex: #fffaf0 / RGB: 255,250,240 - - - Hex: #228b22 / RGB: 34,139,34 - - - Hex: #ff00ff / RGB: 255,0,255 - - - Hex: #dcdcdc / RGB: 220,220,220 - - - Hex: #f8f8ff / RGB: 248,248,255 - - - Hex: #ffd700 / RGB: 255,215,0 - - - Hex: #daa520 / RGB: 218,165,32 - - - Hex: #808080 / RGB: 128,128,128 - - - Hex: #008000 / RGB: 0,128,0 - - - Hex: #adff2f / RGB: 173,255,47 - - - Hex: #808080 / RGB: 128,128,128 - - - Hex: #f0fff0 / RGB: 240,255,240 - - - Hex: #ff69b4 / RGB: 255,105,180 - - - Hex: #cd5c5c / RGB: 205,92,92 - - - Hex: #4b0082 / RGB: 75,0,130 - - - Hex: #fffff0 / RGB: 255,255,240 - - - Hex: #f0e68c / RGB: 240,230,140 - - - Hex: #e6e6fa / RGB: 230,230,250 - - - Hex: #fff0f5 / RGB: 255,240,245 - - - Hex: #7cfc00 / RGB: 124,252,0 - - - Hex: #fffacd / RGB: 255,250,205 - - - Hex: #add8e6 / RGB: 173,216,230 - - - Hex: #f08080 / RGB: 240,128,128 - - - Hex: #e0ffff / RGB: 224,255,255 - - - Hex: #fafad2 / RGB: 250,250,210 - - - Hex: #d3d3d3 / RGB: 211,211,211 - - - Hex: #90ee90 / RGB: 144,238,144 - - - Hex: #d3d3d3 / RGB: 211,211,211 - - - Hex: #ffb6c1 / RGB: 255,182,193 - - - Hex: #ffa07a / RGB: 255,160,122 - - - Hex: #20b2aa / RGB: 32,178,170 - - - Hex: #87cefa / RGB: 135,206,250 - - - Hex: #778899 / RGB: 119,136,153 - - - Hex: #778899 / RGB: 119,136,153 - - - Hex: #b0c4de / RGB: 176,196,222 - - - Hex: #ffffe0 / RGB: 255,255,224 - - - Hex: #00ff00 / RGB: 0,255,0 - - - Hex: #32cd32 / RGB: 50,205,50 - - - Hex: #faf0e6 / RGB: 250,240,230 - - - Hex: #ff00ff / RGB: 255,0,255 - - - Hex: #800000 / RGB: 128,0,0 - - - Hex: #66cdaa / RGB: 102,205,170 - - - Hex: #0000cd / RGB: 0,0,205 - - - Hex: #ba55d3 / RGB: 186,85,211 - - - Hex: #9370db / RGB: 147,112,219 - - - Hex: #3cb371 / RGB: 60,179,113 - - - Hex: #7b68ee / RGB: 123,104,238 - - - Hex: #00fa9a / RGB: 0,250,154 - - - Hex: #48d1cc / RGB: 72,209,204 - - - Hex: #c71585 / RGB: 199,21,133 - - - Hex: #191970 / RGB: 25,25,112 - - - Hex: #f5fffa / RGB: 245,255,250 - - - Hex: #ffe4e1 / RGB: 255,228,225 - - - Hex: #ffe4b5 / RGB: 255,228,181 - - - Hex: #ffdead / RGB: 255,222,173 - - - Hex: #000080 / RGB: 0,0,128 - - - Hex: #fdf5e6 / RGB: 253,245,230 - - - Hex: #808000 / RGB: 128,128,0 - - - Hex: #6b8e23 / RGB: 107,142,35 - - - Hex: #ffa500 / RGB: 255,165,0 - - - Hex: #ff4500 / RGB: 255,69,0 - - - Hex: #da70d6 / RGB: 218,112,214 - - - Hex: #eee8aa / RGB: 238,232,170 - - - Hex: #98fb98 / RGB: 152,251,152 - - - Hex: #afeeee / RGB: 175,238,238 - - - Hex: #db7093 / RGB: 219,112,147 - - - Hex: #ffefd5 / RGB: 255,239,213 - - - Hex: #ffdab9 / RGB: 255,218,185 - - - Hex: #cd853f / RGB: 205,133,63 - - - Hex: #ffc0cb / RGB: 255,192,203 - - - Hex: #dda0dd / RGB: 221,160,221 - - - Hex: #b0e0e6 / RGB: 176,224,230 - - - Hex: #800080 / RGB: 128,0,128 - - - Hex: #663399 / RGB: 102,51,153 - - - Hex: #ff0000 / RGB: 255,0,0 - - - Hex: #bc8f8f / RGB: 188,143,143 - - - Hex: #4169e1 / RGB: 65,105,225 - - - Hex: #8b4513 / RGB: 139,69,19 - - - Hex: #fa8072 / RGB: 250,128,114 - - - Hex: #f4a460 / RGB: 244,164,96 - - - Hex: #2e8b57 / RGB: 46,139,87 - - - Hex: #fff5ee / RGB: 255,245,238 - - - Hex: #a0522d / RGB: 160,82,45 - - - Hex: #c0c0c0 / RGB: 192,192,192 - - - Hex: #87ceeb / RGB: 135,206,235 - - - Hex: #6a5acd / RGB: 106,90,205 - - - Hex: #708090 / RGB: 112,128,144 - - - Hex: #708090 / RGB: 112,128,144 - - - Hex: #fffafa / RGB: 255,250,250 - - - Hex: #00ff7f / RGB: 0,255,127 - - - Hex: #4682b4 / RGB: 70,130,180 - - - Hex: #d2b48c / RGB: 210,180,140 - - - Hex: #008080 / RGB: 0,128,128 - - - Hex: #d8bfd8 / RGB: 216,191,216 - - - Hex: #ff6347 / RGB: 255,99,71 - - - Hex: #40e0d0 / RGB: 64,224,208 - - - Hex: #ee82ee / RGB: 238,130,238 - - - Hex: #f5deb3 / RGB: 245,222,179 - - - Hex: #ffffff / RGB: 255,255,255 - - - Hex: #f5f5f5 / RGB: 245,245,245 - - - Hex: #ffff00 / RGB: 255,255,0 - - - Hex: #9acd32 / RGB: 154,205,50 - - - - -

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 - - - - #[0-9A-Fa-f]{6,6} - - - #[0-9A-Fa-f]{8,8} - - - rgb\((\s*(([01]?[0-9]?[0-9])|2[0-4][0-9]|25[0-5])\s*,\s*){2}([01]?[0-9]?[0-9]|2[0-4][0-9]|25[0-5])\s*\) - - - rgba\(\s*(([01]?[0-9]?[0-9]|2[0-4][0-9]|25[0-5])\s*,\s*){3}(0(\.\d+)?|1(\.0+)?)\s*\)|rgba\(\s*(((\d{1,2})?%|100%)\s*,\s*){2}(\d{1,2}%|100%)\s*,\s*(0(\.\d+)?|1(\.0+)?)\s*\) - - - hsl\(\s*((\d{1,2})|[12]\d{2}|3[0-5]\d|360)\s*,\s*(\d{1,2}%|100%)\s*,\s*(\d{1,2}%|100%)\s*\) - - - hsla\(\s*(\d{1,2}|[12]\d{2}|3[0-5]\d|360)\s*,\s*(\d{1,2}%|100%)\s*,\s*(\d{1,2}%|100%)\s*,\s*(0(\.\d+)?|1(\.0+)?)\s*\) - - - - - - 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. - - - - - - - - - Basic compass directions. - - - - In a northern direction. - - - In an eastern direction. - - - In a southern direction. - - - In a western direction. - - - - - - Additional compass directions. - - - - In a north-eastern direction. - - - In a north-western direction. - - - In a south-eastern direction. - - - In a south-western direction. - - - - - - 360th-unit measure of a circle’s - circumference; optionally signed decimal number between -360 and 360. - - - 360.0 - -360.0 - - - - - Divisio values. - - - - Divisio ternaria. Three semibreves in a breve. - - - Divisio quaternaria. Foursemibreves in a breve. - - - Divisio senaria imperfecta. Six semibreves in a breve (breve is divided into two, then into three). Aka senaria - gallica. - - - Divisio senaria perfecta. Six semibreves in a breve (breve is divided into three, then into two). Aka senaria - italica. - - - Divisio octonaria. Eight semibreves in a breve. - - - Divisio novenaria. Nine semibreves in a breve. - - - Divisio duodenaria. Twelve semibreves in a breve. - - - - - - Logical, that is, written, duration - attribute values. - - - - - - - - - Logical, that is, written, duration - attribute values for rests. - - - - - - - - - Performed duration attribute - values. - - - - - - - - - Enclosures for editorial notes, - accidentals, articulations, etc. - - - - Parentheses: ( and ). - - - Square brackets: [ and ]. - - - Box. - - - None. - - - - - - 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. - - - - Above. - - - Below. - - - Left. - - - Right. - - - - - - Location of musical material relative - to a symbol other than a staff. - - - - Above and left; north-west. - - - Above and right; north-east. - - - Below and left; south-west. - - - Below and right; south-east. - - - - - - 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 - - - Filled - - - Top half filled - - - Bottom half filled - - - Left half filled - - - Right half filled - - - - - - Font family (for text) attribute - values. - - - - - - Font name (for text) attribute - values. - - - - - - Font size expressions. - - - - - - - - - - Font size expressed as numbers; - i.e., points or virtual units. - - - \d*(\.\d+)?(pt|vu) - - - - (pt|vu) - - - 0+(pt|vu) - - - 0+(\.0+)?(pt|vu) - - - \.0+(pt|vu) - - - - - - - - Relative size of symbol that may - begin/end a line. - - - 1 - 9 - - - - - Font size expressed as relative - term. - - - - Smaller than x-small. - - - Smaller than small, larger than xx-small. - - - Smaller than normal, larger than x-small. - - - Smaller than large, larger than small. - - - Smaller than x-large, larger than normal. - - - Smaller than xx-large, larger than large. - - - Larger than x-large. - - - One size smaller than the current size. - - - One size larger than the current size. - - - - - - Font style (for text) attribute - values. - - - - Text slants to right. - - - Unadorned. - - - Text slants to the left. - - - - - - Font weight (for text) attribute - values. - - - - Bold or heavy. - - - Not bold. - - - - - - In string tablature, the fret number. - The value 0 (zero) indicates the open string. - - - - - - Analytical glissando attribute - values. - - - - First note/chord in glissando. - - - Note/chord that’s neither first nor last in glissando. - - - Last note in glissando. - - - - - - Do grace notes get time from the - current (acc) or previous (unacc) one? - - - - Time "stolen" from following note. - - - Time "stolen" from previous note. - - - No interpretation regarding performed value of grace note. - - - - - - Note head shapes. - - - - - - - - - - Enumerated note head shapes. - - - - Filled, rotated oval (Unicode 1D158). - - - Unfilled, rotated oval (Unicode 1D157). - - - Unfilled, rotated oval (Unicode 1D15D). - - - Unfilled backslash (~ reflection of Unicode 1D10D). - - - Unfilled circle (Unicode 25CB). - - - Plus sign (Unicode 1D144). - - - Unfilled diamond (Unicode 1D1B9). - - - Unfilled isosceles triangle (Unicode 1D148). - - - Unfilled, unrotated oval (Unicode 2B2D). - - - Unfilled downward-pointing wedge (Unicode 1D154). - - - Unfilled rectangle (Unicode 25AD). - - - Unfilled right triangle (Unicode 1D14A). - - - Unfilled semi-circle (Unicode 1D152). - - - Unfilled slash (~ Unicode 1D10D). - - - Unfilled square (Unicode 1D146). - - - X (Unicode 1D143). - - - - - - Hexadecimal number. - - - (#x|U\+)[A-F0-9]+ - - - - - Data values for attributes that - capture horizontal alignment. - - - - Left aligned. - - - Right aligned. - - - Centered. - - - Left and right aligned. - - - - - - 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. - - - - - - - - - - - - [0-9.,DHMPRSTWYZ/:+\-]+ - - - - - - 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. - - - mixed|0|([1-9]|1[0-2])[f|s] - - - - - 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. - - - Two layers with opposing stems. - - - Two layers with 'floating' stems. - - - Three layers with opposing stems. - - - Three layers with 'floating' stems. - - - - - - Ligature forms. - - - - Notes are "squeezed" together. - - - Individual notes are replaced by an oblique figure. - - - - - - Visual form of a line. - - - - Dashed line. - - - Dotted line. - - - Straight, uninterrupted line. - - - Undulating line. - - - - - - Symbol that may begin/end a - line. - - - - 90 degree turn down (similar to Unicode 231D at end of line, 231C at start). - - - 90 degree turn up (similar to Unicode 231F at end of line, 231E at start). - - - 90 degree turn right (syntactic sugar for "angledown" for vertical or angled lines). - - - 90 degree turn left (syntactic sugar for "angleup" for vertical or angled lines). - - - Filled, triangular arrowhead (similar to Unicode U+25C0 or SMuFL U+EB78). - - - Open triangular arrowhead (similar to Unicode U+02C3 or SMuFL U+EB8A). - - - Unfilled, triangular arrowhead (similar to Unicode U+25C1 or SMuFL U+EB82). - - - Harpoon-shaped arrowhead left of line (similar to arrowhead of Unicode U+21BD). - - - Harpoon-shaped arrowhead right of line (similar to arrowhead of Unicode U+21BC). - - - Hauptstimme (Unicode U+1D1A6 or SMuFL U+E860). - - - Nebenstimme (Unicode U+1D1A7 or SMuFL U+E861). - - - Theme (SMuFL U+E864). - - - Theme, retrograde (SMuFL U+E865). - - - Theme, retrograde inversion (SMuFL U+E866). - - - Theme, inverted (SMuFL U+E867). - - - Theme (SMuFL U+E868). - - - Theme, inverted (SMuFL U+E869). - - - Choralemelodie (SMuFL U+E86A). - - - Hauptrhythmus (SMuFL U+E86B). - - - No start/end symbol. - - - - - - Datatype of line width - measurements. - - - - - - - - - Relative width of a line. - - - - Default line width. - - - Twice as wide as narrow. - - - Twice as wide as medium. - - - - - - A count of measures plus a beat - location, i.e., [0-9]+m *\+ *[0-9]+(\.?[0-9]*)?. The measure count is the number of barlines 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 in the range of 0 to the number of remaining measures, while the beat - number must be in the range from 0 to the numerator of the time signature plus 1. For example, in 6/8 the beat number must be within the - range from 0 (the left barline) to 7 (the right barline). 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 measure count is the number of barlines 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 measure number, such as "1m+3", indicates a point in the - following measure, while a value with a negative measure number, such as "-1m+3", marks a point in the preceding measure. The beat number - must be in the range from 0 to the numerator of the time signature plus 1. For example, in 6/8 the beat number must be within the range - from 0 (the left barline) to 7 (the right barline). 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, 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, 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 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 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 positive values are allowed. - - - - - - - - - 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, 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. - - - - Sign for tempus imperfectum. - - - Sign for tempus perfectum. - - - Sign for divisio ternaria. - - - Sign for divisio quaternaria. - - - Sign for divisio senaria imperfecta. - - - Sign for divisio senaria imperfecta. - - - Sign for divisio senaria gallica. - - - Sign for divisio senaria gallica. - - - Sign for divisio senaria perfecta. - - - Sign for divisio senaria perfecta. - - - Sign for divisio senaria ytalica. - - - Sign for divisio senaria ytalica. - - - Sign for divisio novenaria. - - - Sign for divisio octonaria. - - - Sign for divisio duodenaria. - - - - - - Contains an indication of how a meter - signature should be rendered. - - - - Show only the number of beats. - - - The lower number in the meter signature is replaced by a note symbol. - - - Meter signature rendered using traditional numeric values. - - - Meter signature rendered using both the symbol and the traditional numeric values. - - - Meter signature not rendered. - - - - - - Meter.sym attribute values for - CMN. - - - - Common time; i.e., 4/4. - - - Cut time; i.e., 2/2. - - - Open time signature, i.e., Senza misura. See Gould pp. 611–615. - - - - - - 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". - - - 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. - - - - - - - - - - Common modes. - - - - Major mode. - - - Minor mode. - - - - - - Gregorian modes. - - - - Dorian mode (the first mode). - - - Hypodorian mode (the second mode). - - - Phrygian mode (the third mode). - - - Hypophrygian mode (the fourth mode). - - - Hypolydian mode (the fifth mode). - - - Lydian mode (the sixth mode). - - - Mixolydian mode (the seventh mode). - - - Hypomixolydian mode (the eighth mode). - - - Tonus peregrinus (the ninth mode). - - - - - - Modern modes. - - - - Ionian mode. - - - Hypoionian mode. - - - Aeolian mode. - - - Hypoaeolian mode. - - - Locrian mode. - - - Hypolocrian mode. - - - - - - Bibliographic relationship values - based on MODS version 3.4. - - - - Temporal predecessor of the resource. - - - Temporal successor to the resource. - - - Original form of the resource. - - - Parent containing the resource. - - - Intellectual or physical component of the resource. - - - Version of the resource’s intellectual content not changed enough to be a different work. - - - Version of the resource in a different physical format. - - - Published bibliographic description, review, abstract, or index of the resource's content. - - - Cited or referred to in the resource. - - - - - - Maxima-long relationship - values. - - - 2 - 3 - - - - - Long-breve relationship - values. - - - 2 - 3 - - - - - Music font family. - - - - - - "Convenience" datatype that permits - combining enumerated values with a user-supplied name. - - - - - - "Convenience" datatype that permits - combining enumerated values with user-supplied values. - - - - - - Non-staff location. - - - - At the foot of the page. - - - At the top of the page. - - - At the left of the page. - - - At the right of the page. - - - On the opposite, i.e., facing, page. - - - On the other side of the leaf. - - - At the end of this division; e.g., chapter, volume, etc. - - - Within a line text; i.e., an insertion. - - - Between the lines of text, less exact than "sub" or "super". - - - Above a line of text, more exact than "intra(linear)". Do not confuse with superscript rendition. - - - Below a line of text, more exact than "intra(linear)". Do not confuse with subscript rendition. - - - In a predefined space; i.e., that left by an earlier scribe. - - - Obscures original text; e.g., via overstrike, addition of new writing surface material, etc. - - - - - - Notation type and subtype - - - - Common Music Notation. - - - Mensural notation. - - - Black mensural notation. - - - White mensural notation. - - - Letters for fret and courses closest to the ground when playing are at the top of the stave. - - - Numbers for fret and courses closest to the ground when playing are at the bottom of the stave. - - - No staff lines, although vertical position may imply voicing and symbols (based on letters) for fret and - course. - - - Numbers for frets and courses closest to the ground when playing are at the top of the stave. - - - Neumatic notation. - - - Tablature notation. - - - - - - Captures any notehead "modifiers"; - that is, symbols added to the notehead, such as slashes, lines, text, and enclosures, etc. - - - - - - - - - Enumerated note head modifier - values. - - - - Slash (upper right to lower left). - - - Backslash (upper left to lower right). - - - Vertical line. - - - Horizontal line. - - - Center dot. - - - Enclosing parentheses. - - - Enclosing square brackets. - - - Enclosing box. - - - Enclosing circle. - - - Enclosing "fences". - - - - - - Captures text rendered in the center - of the notehead. - - - - centertext\((A|B|C|D|E|F|G)(f|♭|n|♮|s|♯)?\) - - - centertext\(H(s|♯)?\) - - - - - - 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 octaves), or rarely '22' (for 3 octaves). - - - 8|15|22 - - - - - 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 relative to the current one; i.e., the layer above or the - layer below. - - - - The layer immediately above. - - - The layer immediately below. - - - - - - The number of panels per page. - - - 1 - 2 - - - - - Styling of piano pedal marks. - - - - Continuous line with start and end positions rendered by vertical bars and bounces shown by upward-pointing - "blips". - - - Pedal down and half pedal rendered with "Ped." followed by a line with end position rendered by vertical bars and - bounces shown by upward-pointing "blips". - - - Pedal down and half pedal rendered with "Ped.", pedal up rendered by "*", pedal "bounce" rendered with "* - Ped.". - - - Pedal up and down indications same as with "pedstar", but bounce is rendered with "Ped." only. - - - - - - Positive decimal number plus '%', - i.e., [0-9]+(\.?[0-9]*)?\%. - - - [0-9]+(\.?[0-9]*)?% - - - - - Positive decimal number between 0 and - 100, followed by a percent sign "%". - - - (([0-9]|[1-9][0-9])(\.[0-9]+)?|100(\.0+)?)% - - - - - Positive decimal number between -100 - and 100, followed by a percent sign "%". - - - (\+|-)?(([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. - - - - 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. - - - Header or footer for the first page only. - - - Header or footer for the last page only. - - - The first of an alternating pattern of headers or footers. - - - The second of an alternating pattern of headers or footers. - - - - -

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. - - - - - - - - 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. - - - [a-g] - - - - - 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. - - - - - - Location information. - - - - - - - - - - - Other values not permitted when 'above', 'below', 'between' or 'within' is present. - - - - - - Semibreve-minim relationship - values. - - - 2 - 3 - - - - - General-purpose relationships - - - - - - - - - - Rotation. - - - - - - - - - Rotation term. - - - - No rotation. - - - Rotated 180 degrees. - - - Rotated 270 degrees clockwise. - - - Rotated 45 degrees clockwise. - - - Rotated 315 degrees clockwise. - - - Rotated 135 degrees clockwise. - - - Rotated 225 degrees clockwise. - - - - - - Scale degree values. - - - (\^|v)?[1-7](\+|\-)? - - - - - 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 are nested or overlap. - - - [i|m|t][1-6] - - - - - - - - - - - - Items that may be printed above, - below, or between staves. - - - - - - - - - - - Items in all repertoires that may be - printed near a staff. - - - - Accidentals. - - - Annotations. - - - Articulations. - - - Directives. - - - Dynamics. - - - Harmony indications. - - - Ornaments. - - - Spoken text. - - - Stage directions. - - - Tempo markings. - - - - - - 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. - - - - - - - - - - The @staff attribute must contain 2 - numerically-adjacent integer values. - - - - Staves and are not - adjacent. - - - - - - Location of symbol relative to a - staff. - - - - Above the staff. - - - Below the staff. - - - - - - Location of symbol relative to a - staff. - - - - Between staves. - - - Within/on the staff. - - - - - - Stem direction. - - - - - - - - - Common stem directions. - - - - Stem points upwards. - - - Stem points downwards. - - - - - - Additional stem directions. - - - - Stem points left. - - - Stem points right. - - - Stem points up and right. - - - Stem points down and right. - - - Stem points up and left. - - - Stem points down and left. - - - - - - Stem modification. - - - - No modifications to stem. - - - 1 slash through stem. - - - 2 slashes through stem. - - - 3 slashes through stem. - - - 4 slashes through stem. - - - 5 slashes through stem. - - - 6 slashes through stem. - - - X placed on stem. - - - Z placed on stem. - - - - - - Position of a note’s stem relative to - the head of the note. - - - - Stem attached to left side of note head. - - - Stem attached to right side of note head. - - - Stem is originates from center of note head. - - - - - - Temperament or tuning system. - - - - Equal or 12-tone temperament. - - - Just intonation. - - - Meantone intonation. - - - Pythagorean tuning. - - - - - - Beats (meter signature denominator) - per minute, e.g., 120. - - - - - - Breve-semibreve relationship - values. - - - 2 - 3 - - - - - Closed list of text rendition - values. - - - - Surrounded by single quotes. - - - Surrounded by double quotes. - - - Italicized (slanted to right). - - - Oblique (slanted to left). - - - Small capitals. - - - Relative font weight. - - - Relative font weight. - - - Relative font weight. - - - Enclosed in box. - - - Enclosed in ellipse/circle. - - - Enclosed in diamond. - - - Enclosed in triangle. - - - Struck through by '\' (back slash). - - - Struck through by '/' (forward slash). - - - Struck through by '-'; may be qualified to indicate multiple parallel lines, e.g., - line-through(2). - - - Not rendered, invisible. - - - Line above the text; may be qualified to indicate multiple parallel lines, e.g., overline(3). - - - Use for deleted text fully or partially obscured by other text (such as 'XXXXX') or musical symbols (such as - notes, rests, etc.). - - - Struck through by '-'; equivalent to line-through; may be qualified to indicate multiple parallel lines, - e.g., strike(3). - - - Subscript. - - - Superscript. - - - Use for added text or musical symbols that fully or partially obscure text from an earlier writing stage. - - - Underlined; may be qualified to indicate multiple parallel lines, e.g., underline(2). - - - Crossed-out; equivalent to 'bslash' (\) plus 'fslash' (/); that is, a hand-written 'X'; may be qualified to - indicate multiple parallel lines, e.g., x-through(2). - - - Left-to-right (BIDI embed). - - - Right-to-left (BIDI embed). - - - Left-to-right (BIDI override). - - - Right-to-left (BIDI override). - - - - - - Parameterized text rendition - values. - - - (underline|overline|line-through|strike|x-through)\(\d+\) - - - - - Text rendition values. - - - - - - - - - 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 musical time, i.e., beats[.fractional beat part]. - - - - - - Tuplet attribute values: initial, - medial, terminal. - - - [i|m|t][1-6] - - - - - A Uniform Resource Identifier, see - [RFC2396]. - - - - - - Data values for attributes that - capture vertical alignment. - - - - Top aligned. - - - Middle aligned. - - - Bottom aligned. - - - Baseline aligned. - - - - - - 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. - - - Contains classification of the notation contained or described by the element bearing this attribute. - - - - - - Provides any sub-classification of the notation contained or described by the element, additional to that given by - its notationtype attribute. - - - - - - - An element with a notationsubtype attribute must have a notationtype attribute. - - - - - - - - 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. - - - The notation contains all the notes necessary for the harmonic label, e.g., the notes "D F♯ A" for - the harmonic label "D". - - - The harmonic label relies on notes implied, but not actually present, in the notation, e.g., the - notes "D F♯ C" for the harmonic label "D7". The note "A" is missing from the notation, but can be implied. - - - - - - - Analytical domain attributes. - - - Attributes describing the harmonic - function of a single pitch. - - - Captures scale degree information using Humdrum **deg syntax -- - an optional indicator of melodic approach (^ = ascending approach, v = descending approach), a scale degree value (1 = tonic ... 7 = - leading tone), and an optional indication of chromatic alteration, 1, v7, ^1, or v5+, for - example. The amount of chromatic alternation is not indicated. - - - - - - - - Analytical domain attributes. - - - Analytical domain attributes. - - - Analytical domain attributes. - - - Attributes that describe harmonic - intervals. - - - Encodes the harmonic interval between pitches occurring at the same time. - - - - - - - - Attributes that provide for - description of intervallic content. - - - Encodes the melodic interval from the previous pitch. The value may be a general directional indication (u, d, s, - etc.), an indication of diatonic interval direction, quality, and size, or a precise numeric value in half steps. - - - - - - - - Analytical domain attributes. - - - Analytical domain attributes. - - - - - - - Indicates major, minor, or other tonality. - - - - - - - - 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. - - - - - - Indicates major, minor, or other tonality. - - - - - - Holds the pitch name of the tonic key, e.g., c for the key of C. - - - - - - - - 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. - - - Describes melodic function using Humdrum **embel - syntax. - - - - - - - - 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. - - - Analytical domain attributes. - - - 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. - - - - - - - - - - - - - - - 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. - - - Holds pitch class information. - - - - - - - - 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. - - - Attributes that specify pitch using - sol-fa. - - - Contains sol-fa designation, e.g., do, re, mi, etc., in either a fixed or movable Do system. - - - - - - - - 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. - - - 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. - - - - Quadruple whole note. - - - Double whole note. - - - Whole note. - - - Half note. - - - Quarter note. - - - 8th note. - - - 16th note. - - - 32nd note. - - - 64th note. - - - 128th note. - - - 256th note. - - - 512th note. - - - 1024th note. - - - 2048th note. - - - - - - Items in the CMN repertoire that may - be printed near a staff. - - - - Beams. - - - Bend indications. - - - Brackets, e.g., for transcribed ligatures. - - - Breath marks. - - - Copy marks. - - - Fermatas. - - - Fingerings. - - - Hairpin dynamics. - - - Harp pedals. - - - Laissez vibrer indications, sometimes called "open ties". - - - Mordents. - - - Octaviation marks. - - - Piano pedal marks. - - - Rehearsal marks. - - - Ties. - - - Trills. - - - Tuplets. - - - Turns. - - - - - - Logical domain attributes. - - - - - - - Describes the direction in which an arpeggio is to be performed. - - - Lowest to highest pitch. - - - Highest to lowest pitch. - - - Non-arpeggiated style (usually rendered with a preceding bracket instead of a wavy line). - - - - - - - Logical domain attributes. - - - - - - - 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. - - - - - - - - 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. - - - - - - Indicates whether automatically-drawn beams should include rests shorter than a quarter note duration. - - - - - - -

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' indicates each quarter note worth of shorter notes would be beamed together. Parentheses can be used to indicate sub-groupings - of secondary beams. For example, '(4.,4.,4.)' in 9/8 meter indicates one outer beam per measure with secondary beams broken at each - dotted quarter duration, while a measure of 16th notes in 4/4 with beam.group equal to '(4,4),(4,4)' will result in a primary - beam covering all the notes and secondary beams for each group of 4 notes. This beaming "directive" can be overridden by using beam elements. If neither beam elements or the beam.group attribute is used, then - no beaming is rendered. Beaming can be explicitly 'turned off' by setting beam.group to an empty string.

-
-
- - Attributes that indicate whether an - event lies under a beam. - - - Indicates that this event is "under a beam". - - - - - - - - Attributes that record the visual - rendition of beams. - - - Captures whether a beam is "feathered" and in which direction. - - - accelerando - means that the secondary beams become progressively more distant toward the end of the beam. - - - mixed acc and rit - for beams that are "feathered" in both directions. - - - ritardando - indicates that the secondary beams get progressively closer together toward the end of the beam. - - - normal - indicates that the secondary beams are equidistant along the course of the beam. - - - - - Records the placement of the beam relative to the events it affects. - - - - - - - Stem direction must be specified for all notes and chords under the beam. - Opposing stem directions are required for a beam with @place="mixed". - - - Opposing stem directions are required for a beam with @place="mixed". - - - - - - Indicates presence of slash through the beam. - - - - - - Records the slope of the beam. - - - - - - - - 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 should remain unbroken. - - - - - - - - Logical domain attributes. - - - - - - - - - - Logical domain attributes. - - - - - - Indicates the performed duration represented by the beatRpt symbol; expressed in time signature denominator - units. - - - \d+(\.\d+)? - - - - - - - Logical domain attributes. - - - - - - - - - Logical domain attributes. - - - - - - - - - Describes the function of the bracketed event sequence. - - - - - - Represents coloration in the mensural notation source material. - - - Marks a sequence which does not match the current meter. - - - Represents a ligature in the mensural notation source material. - - - - - - - Logical domain attributes. - - - - - - - - - - - Logical domain attributes. - - - - - - - - - Indicates whether the tremolo is measured or unmeasured. - - - Measured tremolo. - - - Unmeasured tremolo. - - - - - - - Analytical domain attributes in the - CMN repertoire. - - - - - - - - - - - - Gestural domain attributes for CMN - features. - - - Logical domain attributes in the CMN - repertoire. - - - - - - 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 element belonging to this attribute class. - - - "Cut-out" style. - - - The staff lines should not be drawn. - - - - - - - Logical domain attributes. - - - 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 symbol. - - - - - - - - Logical domain attributes. - - - - - - - Logical domain attributes. - - - - - - - - Describes the style of the tremolo. - - - Measured tremolo. - - - Unmeasured tremolo. - - - - - - - Attributes that indicate whether an - event participates in a glissando. - - - Indicates that this element participates in a glissando. If visual information about the glissando needs to be - recorded, then a gliss element should be employed instead. - - - - - - - - Logical domain attributes. - - - - - - - - - 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. - - - - - - Records the amount of time to be "stolen" from a non-grace note/chord. - - - - - - - - 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". - - - Attached to the preceding event. - - - Attached to the following event. - - - Attachment is ambiguous. - - - - - - - Logical domain attributes. - - - - - - - - - Captures the visual rendition and function of the hairpin; that is, whether it indicates an increase or a decrease - in volume. - - - Crescendo; i.e., louder. - - - Diminuendo; i.e., softer. - - - - - Indicates that the hairpin starts from or ends in silence. Often rendered as a small circle attached to the closed - end of the hairpin. See Gould, p. 108. - - - - - - - - Logical domain attributes. - - - - - - - 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 - - - Flat. - - - Natural. - - - Sharp. - - - - - Indicates the pedal setting for the harp’s D strings. - n - - - Flat. - - - Natural. - - - Sharp. - - - - - Indicates the pedal setting for the harp’s E strings. - n - - - Flat. - - - Natural. - - - Sharp. - - - - - Indicates the pedal setting for the harp’s F strings. - n - - - Flat. - - - Natural. - - - Sharp. - - - - - Indicates the pedal setting for the harp’s G strings. - n - - - Flat. - - - Natural. - - - Sharp. - - - - - Indicates the pedal setting for the harp’s A strings. - n - - - Flat. - - - Natural. - - - Sharp. - - - - - Indicates the pedal setting for the harp’s B strings. - n - - - Flat. - - - Natural. - - - Sharp. - - - - - - - Logical domain attributes. - - - - - - Logical domain attributes. - - - - - - - - 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. - - - - - - - - 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 or analytical uses of MEI, that are entirely non-numeric strings. Measure - numbers may be 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 ignored. - - - - - - Indicates the function of the right bar line and is structurally important. - - - - - - - - Logical domain attributes. - - - Function of the meter signature group. - - - Meter signatures apply to alternating measures. - - - Meter signatures are interchangeable, e.g., 3/4 and 6/8. - - - Meter signatures with different unit values are used to express a complex metrical pattern that is not - expressible using traditional means, such as 2/4+1/8. - - - Meter signatures in a relationship not covered by the values alternating, interchanging or mixed. - - - - - - - Logical domain attributes. - - - - - - - - Logical domain attributes. - - - - - - - Logical domain attributes. - - - - - - Logical domain attributes in the CMN - repertoire. - - - - - - - Logical domain attributes. - - - - - - - Logical domain attributes. - - - - - - - Analytical domain attributes in the - CMN repertoire. - - - - - - - - - - - - - Logical domain attributes. - - - - - - Visual domain attributes. - - - - - - Attributes that record numbers to be - displayed with a feature. - - - Records a number or count accompanying a notational feature. - - - - - - - - Attributes that record the placement - and visibility of numbers that accompany a bowed tremolo or tuplet. - - - States where the tuplet number will be placed in relation to the note heads. - - - - - - Determines if the tuplet number is visible. - - - - - - - - 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 broken lines, coll' ottava typically uses an - unbroken line or a series of longer broken lines, ending with a short vertical stroke. See Read, p. 47-48. - - - Coll' ottava (with the octave). - - - - - - - Logical domain attributes. - - - Logical domain attributes. - - - - - - - - Records the position of the piano damper pedal. - - - Depress the pedal. - - - Release the pedal. - - - Half pedal. - - - Release then immediately depress the pedal. - - - - - Indicates the function of the depressed pedal, but not necessarily the text associated with its use. Use the - dir element for such text. - - - - - - The sustain pedal, also referred to as the "damper" pedal, allows the piano strings to vibrate sympathetically - with the struck strings. It is the right-most and the most frequently used pedal on modern pianos. - - - The soft pedal, sometimes called the "una corda", "piano", or "half-blow" pedal, reduces the volume and modifies - the timbre of the piano. On the modern piano, it is the left-most pedal. - - - The sostenuto or tone-sustaining pedal allows notes already undamped to continue to ring while other notes are - damped normally; that is, on their release by the fingers. This is usually the center pedal of the modern piano. - - - The silent or practice pedal mutes the volume of the piano so that one may practice quietly. It is sometimes a - replacement for the sostenuto pedal, especially on an upright or vertical instrument. - - - - - - - Visual domain attributes. - - - - - - - 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. - - - - - - - - Logical domain attributes. - - - - - - - - - - - Attributes used by scoreDef and - staffDef to provide default information about rehearsal numbers/letters. - - - Describes the enclosing shape for rehearsal marks. - - - Enclosed by box. - - - Enclosed by circle. - - - No enclosing shape. - - - - - - - Analytical domain attributes in the - CMN repertoire. - - - - - - - - Logical domain attributes in the CMN - repertoire. - - - Visual domain attributes. - - - - - - Logical domain attributes. - - - - - - Visual domain attributes. - - - - - - - - - - Determines whether to display guitar chord grids. - - - - - - - - Logical domain attributes. - - - - - - - - - Attributes that describe the - rendition of slurs. - - - - - - - - - - - - - - - Analytical domain attributes in the - CMN repertoire. - - - - - - - - Logical domain attributes in the CMN - repertoire. - - - Logical domain attributes for - staffDef in the CMN repertoire. - - - - - - Visual domain attributes for staffDef - in the CMN repertoire. - - - - - - - - - - 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 below. - - - - - - - - Logical domain attributes. - - - - - - - - Attributes that describe the - rendition of ties. - - - - - - - - - - - - - - - Attributes that describe measured - tremolandi. - - - The performed duration of an individual note in a measured tremolo. - - - - - - - - Logical domain attributes. - - - - - - - - - - Logical domain attributes. - - - - - - - - - - - Groups control events that appear in - CMN. - - - - - - - - Groups events that appear in - CMN. - - - - - - Groups events that completely fill a - CMN measure. - - - - - - Groups notated events that may appear - at the layer level in CMN. - - - - - - Groups CMN measure-like - elements. - - - - - - Groups elements that may appear - within a CMN measure. - - - Groups elements that function like - ossia. - - - - - - - Groups elements that may appear as - part of a section. - - - - - - arpeggiation - Indicates that the notes of a chord - are to be performed successively rather than simultaneously, usually from lowest to highest. Sometimes called a "roll". - - - - - - - - - - - - - -

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 upper end of the line for the sake of consistency or when the direction of successive arpeggios alternates. In music for keyboard - instruments, sometimes a distinction is made between a single arpeggio in which both hands play successively and simultaneous arpeggios - in two hands. In the case of the former, multiple values may be required in the 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. - - - - - - - - - - - - - - - - - - - - - - - - - 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, - 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 a starting point - attribute.

-
-
- - A container for a series of - explicitly beamed events that begins and ends entirely within a measure. - - - - - - - - - - - - - - - - - - - - - - - - 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 - span - Alternative element for explicitly - encoding beams, particularly those which extend across bar lines. - - - - - - - - - - - - - - - - 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 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 - repeat - An indication that material on a - preceding beat should be repeated. - - - - - - - - - - - - - - - -

- 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. - - - - - - - - - - - - - - - - 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. - - - - - - Marks a sequence of notational events - grouped by a bracket. - - - - - - - - - - - - - - - - - - - - - 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. - - - - -

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 - mark - An indication of a point at which the - performer on an instrument requiring breath (including the voice) may breathe. - - - - - - - - - - - - - - - - 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, - tstamp.ges, or tstamp.real attribute. It is a semantic error not to specify a starting point attribute.

-

Since the breath mark does not disrupt the normal tempo of a performance, it has no directly encode-able duration.

-

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 - tremolo - A rapid alternation on a single pitch - or chord. - - - - - - - - - - - - - - - - - - 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'. - - - - - - - - - - - - - - - - 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 bracket below the dot. Other visual forms of a fermata may be indicated via the 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 - tremolo - A 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. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - glissando - A continuous or sliding movement from - one pitch to another, usually indicated by a straight or wavy line. - - - - - - - - - - - - - - - - - - - - - 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. - - - - -

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 - 'portamento'. The visual appearance of the indicating line may be recorded in the lform and lwidth attributes. The - starting point of the glissando 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.

-
-
- - A container for a sequence of grace - notes. - - - - - - - - - - - - - - - - - - - - - - - - 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 >. - - - - - - - - - - - - - - - - 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 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 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. MIDI values associated with the graphical dynamic sign may be recorded in the val - and val2 attributes.

-
-
- - half-measure repeat - A half-measure repeat in any - meter. - - - - - - - - - - - - - - - harp - pedal - Harp pedal diagram. - - - - - - - - - - - - - - - - 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 - vibrer - A "tie-like" indication that a note - should ring beyond its written duration. - - - - - - - - - - - - - - - - - - Must have one of the attributes: startid, tstamp, tstamp.ges or - tstamp.real. - - - - - - - The visual attributes of the lv element (@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. - - - - -

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. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

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 - signature - Written meter signature. - - - - - - - - - - - - - - - meter - signature group - Used to capture alternating, - interchanging, mixed or other non-standard meter signatures. - - - - - - - - - - - - - - - - - - meterSigGrp must have at least 2 child meterSig elements. - - - - - - measure - number - Designation, 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. - - - - - - - - - - - - - - - - - - - -

- mNum uses a subset of model.textPhraseLike.limited.

-
-
- - measure - rest - Complete measure rest in any meter. - - - - - - - - - - - - - -

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

-
-
- - measure - repeat - An indication that the previous - measure should be repeated. - - - - - - - - - - - - - -

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

-
-
- - 2-measure - repeat - An indication that the previous two - measures should be repeated. - - - - - - - - - - - - - - - measure - space - A measure containing only empty space - in any meter. - - - - - - - - - - - - - -

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

-
-
- - multiple - rest - Multiple measures of rest compressed - into a single symbol, frequently found in performer parts. - - - - - - - - - - - - - - - multiple - repeat - Multiple repeated measures. - - - - - - - - - - - - - -

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. - - - - - - - - - - - - - - - - - - - - - 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 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 starting point of the octave displacement 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. Also, note that the dur attribute is not required because the octave displacement can be visually - instantaneous.

-
-
- - ossia - layer - A layer that contains an alternative - to material in another layer. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Captures original notation and a - differently notated version *present in the source being transcribed*. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - In a measure, ossia may only contain staff and oStaff - elements. - - - In a staff, ossia may only contain layer and oLayer - elements. - - - - - -

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 - staff - A staff that holds an alternative - passage which may be played instead of the original material. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Piano pedal mark. - - - - - - - - - - - - - - - - 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 - mark - In an orchestral score and its - corresponding parts, a mark indicating a convenient point from which to resume rehearsal after a break. - - - - - - - - - - - - - - - - - - - - -

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. - - - - - - - - - - - - - - - - - - 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 slur (@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.

-
-
- - An indication that two notes of the - same pitch form a single note with their combined rhythmic values. - - - - - - - - - - - - - - - - - - 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 tie (@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. - - - - -

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. - - - - - - - - - - - - - - - - - - - - - -

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 bowed tremolo (Read, p. 394) and double, triple, or flutter tonguing (Read, p. 348-349); that is, for repetition of the same pitch. - In the case of irrational durations, such as such as two quarter notes in the time of five 8th notes in a measure of 5/8 time, decimal - values may be used in the dur.ges attribute. For example, the dur.ges attribute would take the value - 2.5 if the midi.div attribute’s value was 1. The num and numbase attributes may - be used for explicit labelling of a 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 - span - Alternative element for encoding - tuplets, especially useful for tuplets that extend across bar lines. - - - - - - - - - - - - - - - - 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 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 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. - - - - - - - - Records semantic meaning, i.e., intended performance, of the mordent. The altsym, - glyph.name, or glyph.num attributes may be used to specify the appropriate symbol. - - - Starts with the written note, followed by its lower neighbor, with a return to the written note. In modern - practice, this is called an "inverted mordent" and indicated by a short wavy line with a vertical line through it. - - - Starts with the written note, followed by its upper neighbor, with a return to the principal note. In modern - practice, the symbol lacks the vertical line used for the inverted form. - - - - - When set to 'true', a double or long mordent, sometimes called a "pincé double", consisting of 5 notes, is - indicated. - - - - - - - - Accidentals associated with - ornaments. - - - - - - Records the written accidental associated with an upper neighboring note. - - - - - - Records the written accidental associated with a lower neighboring note. - - - - - - - - Attributes for marking the presence - of an ornament. - - - Indicates that this element has an attached ornament. If visual information about the ornament is needed, then one - of the elements that represents an ornament (mordent, trill, or turn) should be employed. - - - - - - - - Logical domain attributes. - - - - - - - - - - Logical domain attributes. - - - - - - - - When set to 'true', the turn begins on the second half of the beat. - - - - - - Records meaning; i.e., intended performance, of the turn. The altsym, glyph.name, - or glyph.num attributes may be used to specify the appropriate symbol. - - - Begins on the note below the written note. - - - Begins on the note above the written note. - - - - - - - Groups CMN ornament elements. - - - - - - An ornament indicating rapid - alternation of the main note with a secondary note, usually a step below, but sometimes a step above. - - - - - - - - - - - - - - - - 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). - - - - - - - - - - - - - - - - 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 starting point of the trill 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 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. - - - - - - - - - - - - - - - - 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 - corpus - A 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. - - - - - - - - Classifies the cause for the variant reading, according to any appropriate typology of possible origins. - - - - - - - - Logical domain attributes. - - - 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 musical variant. - - - - - - Groups elements that may appear as - part of a textual variant. - - - - - - (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. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

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 ambiguity, precisely which portion of the main text the variation applies to. Those who prefer to work without the notion of a - base text may prefer not to use it at all. An integer indicating the position of this reading in a sequence, when there is reason to - presume a sequence of the variant readings, may be captured in the seq attribute.

-

In no case should lem 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, 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. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

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. - - - - - - - - Groups elements containing stage - directions in performance texts. - - - - - - - speech - Contains an individual speech in a - performance text. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 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, tstamp.real, startho, endho, to, startto, endto, - staff, layer, place, or 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 - direction - Contains any kind of stage direction - within a dramatic text or fragment. - - - - - - - - - - - - - - - - - - - - - - - - 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, tstamp.real, startho, endho, to, startto, endto, - staff, layer, place, or 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. - - - Signifies the causative agent of damage, illegibility, or other loss of original text. - - - - - - - - Logical domain attributes. - - - - - - - - - - - - - Attributes describing the nature of - an encoded scholarly intervention or interpretation. - - - - - - - Logical domain attributes. - - - - - - - - - - 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). - - - - - - - - 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 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 in music notation. - - - - - - 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. - - - - - - abbreviation - A 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).

-
-
- - addition - Marks an addition to the text. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 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 - transcriber responsible for identifying the hand of the addition. The cert attribute signifies the degree of certainty - ascribed to the identification of the hand of the addition. The editor(s) responsible for asserting this particular reading may be - recorded in the resp attribute. The value of resp must point to one or more identifiers declared in the document header.

-

In no case should add 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, 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. - - - - - - - - - - - - -

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).

-
-
- - correction - Contains the correct form of an - apparent erroneous passage. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

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 corr element. If the correction was made in the source, resp should be used to identify the hand of the - corrector. The value of resp must point to one or more identifiers declared in the document header.

-

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 mark - A verbal or graphical indication to - copy musical material written elsewhere. - - - - - - - - - - - - - - - - - - - - - - - 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 - - - - - - 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 - attributes tstamp and staff. The area to be filled should contain space or mSpace elements. The material to be used to fill the gap can be identified by the attributes origin.tstamp, - origin.tstamp2, origin.staff, and origin.layer. If origin.tstamp2 is not provided, a - duration similar to that of the local omission (as encoded in the combination of tstamp and tstamp2) is assumed. - Any missing @origin.* attributes are assumed to take the same values as information associated with the cpMark. For example, when only - the origin.staff attribute is provided, it is assumed that the referenced part comes from a different staff in the same - measure. If a different measure is provided by origin.tstamp, but no origin.staff is given, then it is assumed - that the material is to be taken from the same staff.

-

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. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 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).

-
-
- - deletion - Contains information deleted, marked - as deleted, or otherwise indicated as superfluous or spurious in the copy text by an author, scribe, annotator, or corrector. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

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 of - the hand of the deletion. The hand of the agent which made the deletion should be pointed to using the hand attribute. The - rend attribute may be used to record the method used to make the deletion (overstrike, strike[through], etc.).

-

In no case should del 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, 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).

-
-
- - expansion - Contains the expansion of an - 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. - - - - - - - - - - - - -

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 text by an author, scribe, annotator, or corrector. An - indication of how much material has been omitted from the transcription may be recorded in the extent attribute. The - unit attribute names the unit used for describing the extent of the gap. The reason attribute gives the reason - for omission. Sample values include sampling, irrelevant, cancelled. The resp attribute - contains an ID reference to an element containing the name of the editor, transcriber or encoder responsible for the decision not to - provide any transcription of the material and hence the application of the gap tag. The hand attribute - signifies the hand which made 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. - - - - - - - - - - - - - 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 have content. - The value in @new - should correspond to the @xml:id attribute of a hand element. - - - - - - Identifies the old hand. The value must contain the ID of a hand element given elsewhere in the document. - - - - - - - @old attribute should have content. - The value in @old - should correspond to the @xml:id attribute of a hand element. - - - - - - -

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 in the medium - attribute. The new hand may be identified using the new attribute, while the previous hand may be recorded in the - old attribute. The resp attribute contains an ID reference to an element containing the name of the 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 musical text. The textual consequences of this intervention are encoded independently via - other means; that is, with elements such as <add>, <del>, etc. - - - - - - - - - - - - - - - - - - - - - - - - - - Must have one of the attributes: startid, tstamp, tstamp.ges or - tstamp.real - - - - - - Describes the purpose of the metaMark. - - - - - - confirmation of a previous textual decision; i.e., cancellation of a deleted passage in a different - writing medium. - - - denoted material is to be inserted in the musical text. - - - denoted material is no longer part of the musical text. - - - denoted material is replaced, either by the musical text pointed at with the @target attribute or the musical - content of the metaMark element itself. - - - attempt to clarify a potentially illegible or otherwise unclear part of the musical text. - - - marks a section of the musical text which is to be considered further. - - - marks a section of the musical text as an investigation of the consequences of certain compositional decisions - or potential alternatives. - - - declares a formerly cancelled part of the musical text as valid again. - - - clarification of the reading order of the musical text. - - - - - -

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

-
-
- - original - Contains material which is marked as - following the original, rather than being normalized or corrected. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

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 - in the document header. The cert attribute signifies the degree of certainty ascribed to the transcription of the original - text.

-

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).

-
-
- - regularization - Contains material which has been - regularized or normalized in some sense. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

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 material may be recorded in the resp attribute. The value of resp must point to one or more - identifiers declared in the document header. The cert attribute signifies the degree of certainty ascribed to the regularized - reading.

-

In no case should reg 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, 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. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 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. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

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).

-
-
- - substitution - Groups 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. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

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 - responsible for the action. The reason attribute indicates why the text has to be supplied, e.g., - overbinding, faded ink, lost folio, omitted in original, etc. The source - attribute contains the source of the supplied text. The editor(s) responsible for supplied material may be recorded in the - resp attribute. The value of resp must point to one or more identifiers declared in the document header. The - cert attribute signifies the degree of certainty ascribed to the supplied material.

-

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. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

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 the unclear element. Where the difficulty in transcription arises from action (partial deletion, etc.) assignable to an - identifiable hand, the hand attribute signifies the hand responsible for the action. The reason attribute - indicates why the material is difficult to transcribe. The resp attribute indicates the individual responsible for the - transcription of the word, phrase, or passage contained with the unclear element. The value of resp - must point to one or more identifiers declared in the document header.

-

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. - - - A name or label associated with the controlled vocabulary from which the value of glyph.name or - glyph.num is taken. - - - - - - Standard Music Font Layout. - - - - - Glyph name. - - - - - - - @glyph.name attribute should have content. - - - - - - Numeric glyph reference in hexadecimal notation, e.g., "#xE000" or "U+E000". N.B. SMuFL version 1.18 - uses the range U+E000 - U+ECBF. - - - - - - - SMuFL version - 1.18 uses the range U+E000 - U+ECBF. - - - - - - The web-accessible location of the controlled vocabulary from which the value of glyph.name or - glyph.num is taken. - - - - - - - - Attributes that associate a feature - corresponding with all or part of an image. - - - Permits the current element to reference a facsimile surface or image zone which corresponds to it. - - - - - - - @facs attribute should have content. - Each value in @facs should correspond to the @xml:id attribute of a surface or zone element. - - - - - - - - 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. When each page is represented by a different graphic, use a surface 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 one or more graphic representations of that space, and rectangular zones of interest - within 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. - - - - - - - - - - - - - - -

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. - - - The number of columns spanned by this cell. - - - - - - The number of rows spanned by this cell. - - - - - - - - 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 figure. - - - - - - Groups elements that indicate the - location of an inline graphic, illustration, or figure. - - - Groups table-like elements. - - - - - - - figure - Groups 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 - description - Contains 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 - data - Designates 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 - header - Designates 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 - row - A 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. - - - - - - - - - - - alternation of fingers. - - - combination of fingers. - - - substitution of fingers. - - - - - - - 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. - - - - - - - - - - - - - - - - - - - - - - - Must have one of the attributes: startid, tstamp, tstamp.ges or - tstamp.real. - - - - - - - The stack element is not allowed as a descendant of fing. - - - - - - (finger group)– A group of individual - fingers in a fingering indication. - - - - - - - - - - - - - - - - - - - - - - At least 2 fing or fingGrp elements are required. - - - - - - - - When @tstamp or @startid is present on fingGrp, its child elements cannot - have a @tstamp or @startid attribute. - - - When - @tstamp or @startid is not present on fingGrp, each of its child elements must have a @tstamp or @startid attribute. - - - - - - - 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. - - - - - - Attributes for capturing momentary - pitch inflection in the gestural domain. - - - Records the performed pitch inflection. - - - - - - - The value of @accid.ges should not duplicate the value of - @accid. - - - - - - - - Gestural domain attributes. - - - Gestural domain attributes. - - - Gestural domain attributes. - - - Gestural domain attributes. - - - - - - - - Gestural domain attributes. - - - Gestural domain attributes. - - - - - - Attributes describing the method of - performance. - - - Records performed articulation that differs from the written value. - - - - - - - - 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. - - - - - - - - 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. - - - - - - - - Gestural domain attributes. - - - - - - - Gestural domain attributes. - - - Attributes that record performed - duration that differs from a feature’s written duration. - - - Records performed duration information that differs from the written duration. - - - - - - Number of dots required for a gestural duration when different from that of the written duration. - - - - - - Duration as a count of units provided in the time signature denominator. - - - \d+(\.\d+)? - - - - - Duration recorded as pulses-per-quarter note, e.g., MIDI clicks or MusicXML divisions. - - - - - - Duration in seconds, e.g., 1.732. - - - \d+(\.\d+)? - - - - - Duration as an optionally dotted Humdrum **recip - value. - - - [0-9]+(%[0-9]+)?\.*q? - - - - - - - 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. - - - - - - - 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 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. - - - - - - - - - - Records performed octave information that differs from the written value. - - - - - - Contains a performed pitch name that differs from the written value. - - - - - - Holds a pitch-to-number mapping, a base-40 or MIDI note number, for example. - - - - - - - - Gestural domain attributes. - - - - - - Gestural domain attributes. - - - - - - Gestural domain attributes. - - - - - - - - - - - - When the @extremis attribute is used, the @pname.ges and @oct.ges attributes are - not allowed. - - - - - - Indicates an extreme, indefinite performed pitch. - - - Highest note the performer can play. - - - Lowest note the performer can play. - - - -

On a wind instrument, the "highest note possible" depends on the player’s abilities. On a string instrument, the "lowest note - possible" depends on how much a string is de-tuned; that is, loosened using the tuning peg. Use of the pname and - oct or ploc and oloc or loc attributes is necessary to record the written pitch and - octave of the symbol for this note.

-
-
- - Records performed octave information that differs from the written value. - - - - - - Contains a performed pitch name that differs from the written value. - - - - - - Holds a pitch-to-number mapping, a base-40 or MIDI note number, for example. - - - - -
-
- - Gestural domain attributes. - - - - - - - Gestural domain attributes. - - - Gestural domain attributes. - - - - - - - Gestural accidentals associated with - ornaments. - - - Records the sounding accidental associated with an upper neighboring note. - - - - - - Records the sounding accidental associated with a lower neighboring note. - - - - - - - - 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. - - - 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 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. - - - - - - - - - - Gestural domain attributes. - - - Indicates that the performance of the next section should begin immediately following this one. - - - - - - - - Gestural domain attributes. - - - Gestural domain attributes. - - - - - - - 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. - - - Gestural domain attributes for - staffDef in the CMN repertoire. - - - - - - - - Gestural domain attributes. - - - - - - Gestural domain attributes. - - - - - - 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. - - - - - - 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. - - - - - - Records the onset time in terms of ISO time. - - - - - - - - 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. - - - - - - Records the ending point of an event in terms of ISO time. - - - - - - - - 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. - - - - - - - - - Contains a reference to a chordDef element elsewhere in the document. - - - - - - - @chordref attribute should have content. - The value in - @chordref should correspond to the @xml:id attribute of a chordDef element. - - - - - - - - Groups elements that group playable - chord definitions. - - - 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 represent single - figured bass elements. - - - Groups elements that record - indications of harmony. - - - - - - chord - definition - Chord 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. - - - - - - - - - - - -

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. - - - - - - - - - - -

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

-
-
- - figure - Single element of a figured bass - indication. - - - - - - - - - - - - - - - - - - - - - - figured - bass - Symbols added to a bass line that - indicate harmony. Used to improvise a chordal accompaniment. Sometimes called Generalbass, thoroughbass, or basso continuo. - - - - - - - - - - - - - - - - - harmony - An indication of harmony, - e.g., chord names, tablature grids, harmonic analysis, figured bass. - - - - - - - - - - - - - - - - - - - - - - - - - Must have one of the attributes: startid, tstamp, tstamp.ges or - tstamp.real. - - - - - - 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 bibliographic description. - - - - - - - - - - - - - - - - - - - - - - - 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. - - - - - - A reference to a surface element positioned on the inner verso side of a (folded) - sheet. - - - - - - A reference to a surface element positioned on the inner recto side of a (folded) - sheet. - - - - - - A reference to a surface element positioned on the outer verso side of a (folded) - sheet. - - - - - - - - Attributes that link a folium element - with a surface element. - - - A reference to a surface element positioned on the recto side of the sheet. - - - - - - A reference to a surface element positioned on the verso side of the sheet. - - - - - - - - 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. - -

-
-
- - Attributes that describe correction - and normalization methods. - - - Indicates the method employed to mark corrections and normalizations. - - - Corrections and normalizations made silently. - - - Corrections and normalizations indicated using elements. - - - - - - - Collects bifoliumlike - elements. - - - 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. - - - Collects foliumlike elements. - - - 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 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 item. - - - Groups elements that assist in the - identification of a work. - - - Collects work-like elements. - - - access - restriction - Describes 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. - - - - - - - - - - -

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

-
-
- - alternative - identifier - May 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. - - - - - - - - - - - - - - -

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

-
-
- - application - information - Groups 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. - - - - - - - - - - - - - - - - - - - - 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. - - - - - - - - - - - - - @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., children, young adults, adults, etc.), educational level - (e.g., primary, secondary, etc.), or other categorization. - - - - - - - - - - - - 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. - - - - - - - - - - - - - - - - - - - - - - - - Contains the primary statement of - responsibility given for a work on its title page. - - - - - - - - - - - - - - - - - - - capture - mode - The means used to record notation, - sound, or images in the production of a source/manifestation (e.g., analogue, acoustic, electric, digital, optical - etc.). - - - - - - - - - - - - - carrier - form - The 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.). - - - - - - - - - - - - - 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 - relationship - Contains the name of a related - category. - - - - - - - - - - - - - - - - - - - - Provides a description of the relationship between the current and the target categories. - - - Category to which the current category is hierarchically subordinate. - - - Category which is hierarchically subordinate to the current category. - - - Category that is associatively but not hierarchically linked to the current category. - - - Non-preferred category; often a synonym or near-synonym for the preferred category label. - - - - - - - Individual change within the revision - description. - - - - - - - - - - - - - - - - - - The date of the change must be recorded in an isodate attribute or date element. - It is recommended that the agent - responsible for the change be recorded in a resp attribute or in a name, corpName, or persName element in the respStmt - 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 - resp attribute contains a pointer to an element containing info about the 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 - description - Description of a revision of the MEI - file. - - - - - - - - - - - - - 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. - - - - - - - - - - - - - - - - -

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. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Only child elements of the same name as the parent of the componentList are allowed. - - - - - - - When any child element has a comptype - attribute, it is recommended that comptype appear on all child 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 prevent confusion with musical terminology. Work, expression, and item components must be the same type as the - parent of componentList: work children are allowed within work, etc. Manifestations; - i.e., sources, may have 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 of the item and that of other copies of the same item (e.g., missing - pages or plates, 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. - - - - - - - - - - - - - - - - - - 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 ; - Flexibility ; Ornaments

-
-
-
- - - - Contents - Sonata in D major, op. V, no. 1 / - Corelli - Sonata in G minor / Purcell (with Robert Donington, - gamba) - Forlane from Concert royal no. 3 / - 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 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. - - - - - - - - - - - - States how and under what - circumstances corrections have been made in the text. - - - - - - - - - - - - - - - - - - - Indicates the degree of correction applied to the text. - - - The text has been thoroughly checked and proofread. - - - The text has been checked at least once. - - - The text has not been checked. - - - 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. - - - - - - - - - - - - - - - - - - - - Describes the position of the cutout on the parent folium / bifolium. - - - removed from outer recto side of bifolium. - - - removed from inner verso side of bifolium. - - - removed from inner recto side of bifolium. - - - removed from outer verso side of bifolium. - - - removed from recto side of folium. - - - removed from verso side of folium. - - - - - Describes the method of removing the cutout. - - - - - - section is cleanly cut by a knife, scissor or other sharp blade. - - - 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 - to indicate the upper left point on the original page. If, however, the removed section is 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. - - - - - - - - - - - - - - - - - - - - - - - - - - -

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

-
-
- - domains - declaration - Indicates which domains are included - in the encoding. - - - - - - - - - - - - - - - - - - - - - - - - edition - statement - Container 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 - declaration - Used 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 - description - Documents 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. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

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

-
-
- - exhibition - history - A record of public exhibitions, - including dates, venues, etc. - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

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

-
-
- - extended - metadata - Provides a container element for - non-MEI metadata formats. - - - - - - - - - - - - - - - - - - file - characteristics - Standards 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. - - - - - - - - - - - - file - description - Contains a full bibliographic - description of the MEI file. - - - - - - - - - - - - - - - - - - - - - - - - -

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. - - - - - - - - - - - - - - - - - - -

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. - - - - - - - - - - - - - -

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. - - - - - - - - - - - - - - - - - - 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. The - resp attribute contains an ID reference to an element containing the name of the editor or transcriber responsible for - identifying the hand. The characteristics of the 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. - - - - - - - - - - - - - - - - - - - - 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. - - - - - - - - - - - - - - - - - - - - - - - - - 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. - - - - - - - - - - - - - - incipCode must have a form or mimetype attribute. - - - - - - Form of the encoded incipit. - - - - - - Plaine & Easie Code. - - - Humdrum Kern format. - - - Parsons code. - - - - - - - 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. - - - - - - - - - - - - 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. - - - - - - - - - - - - - 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. - - - - - - - - - - - - - - - -

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 - usage - Groups 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 - header - Supplies the descriptive and - declarative metadata prefixed to every MEI-conformant text. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - The meiHead type attribute can have the value 'music' only when the document element is - "mei". - - - The meiHead type attribute can have the value 'corpus' only when the document element is - "meiCorpus". - - - The meiHead type attribute can have the value '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. - - - Header is attached to a music document. - - - Header is attached to a corpus. - - - Header is independent; i.e., not attached to either a music or a corpus 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 - encoded in the following order: altId(optional), fileDesc(required), encodingDesc(optional), workList(optional), and revisionDesc(optional). These - elements and their sub-elements provide: a unique identifier for the MEI file, bibliographic information about the MEI file and its - sources, information about the encoding process, 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 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. - - - - - - - - - - - - - - - - - - - - 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. - - - - - - - - - - - - - - - - - -

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. - - - - - - - - - - - - - -

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

-
-
- - other - distinguishing characteristic - Any characteristic that serves to - differentiate a work or expression from another. - - - - - - - - - - - Describes a physical writing surface - attached to the original document. - - - - - - - - - - - - - - - - - - The allowed positions of a patch depend on its parent element. - A patch element must contain either a folium or a bifolium element. - - - - - - Describes the position of the patch on the parent folium / bifolium. - - - patch attached to outer recto side of bifolium. - - - patch attached to inner verso side of bifolium. - - - patch attached to inner recto side of bifolium. - - - patch attached to outer verso side of bifolium. - - - patch attached to recto side of folium. - - - patch attached to verso side of folium. - - - - - Describes the method of attachment of the patch. - - - - - - patch is glued on surface beneath. - - - patch is sewn on surface beneath. - - - patch is pinned to the surface beneath. - - - patch is taped on surface beneath using an adhesive strip. - - - 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 - duration - Used to express the duration of - performance of printed or manuscript music or the playing time for a sound recording, videorecording, etc. - - - - - - - - - - - - - - - Holds a W3C duration value, e.g., "PT2H34M45.67S". - - - - - - -

- - - - performance - medium - Indicates 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 - resource - Name of an instrument on which a - performer plays, a performer's voice range, or a standard performing ensemble designation. - - - - - - - - - - - - - - - - - - - Indicates the number of performers. - - - - - - Marks this instrument or vocal part as a soloist. Do not use this attribute for a solo instrument which is not - accompanied. - - - - - - - - Several instrumental or vocal - resources treated as a group. - - - - - - - - - - - - - - - - - - - - - - Indicates the number of performers. - - - - - - -

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 - description - Container for information about the - appearance, construction, or handling of physical materials, such as their dimension, quantity, color, style, and technique 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 - medium - Records 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 - number - Designation 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.). - - - - - - - - - - - - The cost of access to a bibliographic - item. - - - - - - - - - - - - - - - - - - - - Numeric value capturing a cost. Can only be interpreted in combination with the currency attribute. - - - [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 - description - Project-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. - - - - - - - - - - - - - - - -

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 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 - statement - Container 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. - - - - - - - - - - - - - - - - - - -

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 - description - Container 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 - declaration - Contains 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 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 - statement - Groups 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 - channels - Reflects 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. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @target attribute should have content. - Each value in @target should correspond to the @xml:id attribute of a source or 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 - description - A 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 characteristic - The equalization system, noise - reduction system, etc. used in making the recording (e.g., NAB, DBX, Dolby, etc.). - - - - - - - - - - - - - standard - values - Specifies 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 - requirements - System requirements for using the - electronic item. - - - - - - - - - - - - tagging - declaration - Provides 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. - - - - - - - - - - - - - - - - @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. - - - - - - - - - - - - - - - - - - - - - - - - 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 - statement - Container for title and - responsibility meta-data. - - - - - - - - - - - - - - - - - - -

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

-
-
- - track - configuration - Number 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 - history - A 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 - scheduled - Scheduled 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).

-
-
- - unpublished - Used 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 - restrictions - Container 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. - - - - - - - - - - - -

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 — specifically its history, language use, and high-level musical attributes - (e.g., key, tempo, meter, medium of performance, and intended duration). - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

The perfDuration element captures the intended duration of the work.

-
-
- - work - list - Grouping mechanism for information - describing non-bibliographic aspects of a text. - - - - - - - - - - - - - - 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. - - - - - - - - Recurring lyrics, especially at the - end of each verse or stanza of a poem or song lyrics; a chorus. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

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. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

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. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

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. - - - - Two or three times as long as a longa. - - - Two or three times as long as a brevis. - - - Two or three times as long as a semibreve. - - - Half or one-third as long as a breve/brevis. - - - Half or one-third as long as a semibreve/semibrevis. - - - Half as long as a minima. - - - Half as long as a semiminima. - - - Half as long as a fusa. - - - - - - Logical, that is, written, duration - attribute values for multi-breve rests in the mensural repertoire. - - - - A two-breve rest. - - - A three-breve rest. - - - - - - Logical, that is, written, duration - attribute values for mensural rests. - - - - - - - - - Duration attribute values of a given - note symbol for the mensural repertoire. - - - - Three times the duration of the note in the next smaller degree. - - - Two times the duration of the note in the next smaller degree. - - - Twice the original duration of the note (only usable in perfect mensurations). - - - Category of a regular semibrevis in Ars antiqua, equivalent to a third of a brevis. - - - Category of an altered semibrevis in Ars antiqua, equivalent to two minor semibrevis. - - - One of the three categories of a longa in Ars antiqua ('duplex', 'perfecta', and 'imperfecta'). A duplex longa is - twice as long as a regular longa. - - - - - - Form of the flag. - - - - Flag is a straight horizontal line. - - - Flag is a straight line at an angle. - - - Flag is curled. - - - Flag is flared. - - - Flag looks extended. - - - Flag is hooked-form. - - - - -

-
-
- - Position of the flag relative to the - stem. - - - - Flag lies at the left side of the stem. - - - Flag lies at the right side of the stem. - - - Flag is centered in the stem. - - - - - - Items in the Mensural repertoire that - may be printed near a staff. - - - - Ligatures. - - - - - - Form of the stem attached to the - note. - - - - Stem has a circular form. - - - Stem has an oblique form. - - - Stem has a swallowtail form. - - - Stem has a virgula-like form. - - - - - - Attribute that expresses duration for - a given mensural note symbol. - - - - Duplex quality can only be used with longas (in Ars antiqua). - - - - - - - Maior / minor quality can only be used with semibreves (in Ars antiqua). - - - - - - 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). - - - - - - - - Logical domain attributes. - - - 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. Modusminor describes the long-breve relationship, while - tempus describes the breve-semibreve, 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. - - - - - - Together, proport.num and proport.numbase specify a proportional change as a ratio, e.g., 1:3. - Proport.numbase is for the second value in the ratio. - - - - - - - - Shared attributes in the mensural - repertoire. - - - - When the @divisio attribute is used, the @tempus and @prolatio attributes are not - allowed. - - - - - - Describes the maxima-long relationship. - - - - - - Describes the long-breve relationship. - - - - - - Describes the semibreve-minim relationship. - - - - - - Describes the breve-semibreve relationship. - - - - - - Describes the divisions of the breve in use in 14th-century Italy. - - - - - - - - Analytical domain attributes in the - Mensural repertoire. - - - Gestural domain attributes in the - Mensural repertoire. - - - - - - Logical domain attributes in the - Mensural repertoire. - - - Visual domain attributes in the - Mensural repertoire. - - - Indicates this element’s participation in a ligature. - - - - - - - - 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 normal value of the notes in mensural notation as a ratio. - - - - - - Gestural domain attributes. - - - - - - Visual domain attributes. - - - States how many spaces are covered by the rest. - - - - - - - - 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. - - - - - - Logical domain attributes for - staffDef in the mensural repertoire. - - - - - - Visual domain attributes for 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. - - - Records the form of the stem. - - - - - - - - Groups event elements that occur in - the mensural repertoire. - - - - - - 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 are components - of a staff in the mensural repertoire. - - - - - - A mensural notation symbol that - combines two or more notes into a single sign. - - - - - - - - - - - - - - - - - - - - - - -

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.

-
-
- - mensuration - Collects information about the - metrical relationship between a note value and the next smaller value; that is, either triple or duple. - - - - - - - - - - - - - - -

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 - - - - - - - - - - - - Only one plica is allowed. - - - - - - proportion - Description of note duration as - arithmetic ratio. - - - - - - - - - - - - - - -

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 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. - - - 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. - - - - - - - @instr attribute should have content. - The value in - @instr should correspond to the @xml:id attribute of an instrDef element. - - - - - - - - Attributes common to MIDI - events. - - - - - - - - - - Logical domain attributes. - - - - - - - - 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. - - - - - - Provides a General MIDI label for the MIDI instrument. - - - - - - 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. - - - - - - Records a non-General MIDI patch/instrument name. - - - - - - Records a non-General MIDI patch/instrument number. - - - - - - Sets the instrument’s volume. - - - - - - - - Attributes that record MIDI - numbers. - - - MIDI number in the range set by data.MIDIVALUE. - - - - - - - - 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*. - - - - - - 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. - - - - - - - - Attributes that record MIDI - values. - - - MIDI number. - - - - - - - - Attributes that record terminal MIDI - values. - - - MIDI number. - - - - - - - - MIDI attributes pertaining to key - velocity. - - - MIDI Note-on/off velocity. - - - - - - - - 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. - - - - - - - - Groups elements which group MIDI-like - elements. - - - - - - - - control - change - MIDI 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.

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

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

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

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

-
-
- - instrument - definition - MIDI 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 - group - Collects MIDI instrument - definitions. - - - - - - - - - - - MIDI marker meta-event. - - - - - - - - - - - MIDI text meta-event. - - - - - - - - - - - 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-on event. - - - - - - - - - - - MIDI port. - - - - - - - - - - - program - MIDI program change. - - - - - - - - - - - sequence - number - MIDI sequence number. - - - - - - - - - - Number in the range 0-65535. - - - 65535 - - - - - - - track - name - MIDI track/sequence name. - - - - - - - - - - - velocity - MIDI Note-on/off velocity. - - - - - - - - - - - Indicates whether this is note-on or note-off velocity data. - - - Note-on velocity. - - - Note-off velocity. - - - - - - - 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 form part of a - personal name. - - - additional - name - Contains 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 - name - Identifies 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 - name - Contains 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 component - Contains 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 name - Contains 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 - name - The proper noun designation for a - place, natural feature, or political jurisdiction. - - - - - - - - - - - - - - - - - - - - -

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 - link - Contains 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 - name - A label that describes a period of - time, such as 'Baroque' or '3rd Style period'. - - - - - - - - - - - - - - - - - - - - -

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

-
-
- - personal - name - Designation for an individual, - including any or all of that individual's forenames, surnames, honorific titles, and added names. - - - - - - - - - - - - - - - - - - - - - -

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. - - - - - - - - - - - - - - - - -

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 - name - Contains 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 - name - A 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.

-
-
- - Items in the Neume repertoire that - may be printed near a staff. - - - Logical domain attributes. - - - - - - - - - - - Logical domain attributes. - - - - - - - - - - - Logical domain attributes. - - - Logical domain attributes. - - - - - - - - Captures written octave information. - - - - 9 - - - unknown - - - - - - Contains a written pitch name. - - - [a-g]|unknown - - - - - - - Attributes that record visual details - of neume notation. - - - - - - - - - Connection to the previous component within the same neume; this attribute should not be used for the first - component of a neume. - - - Gapped; not connected. - - - Looped. - - - Extended. - - - - - Records direction of curvature. - - - Anti-clockwise curvature. - - - Clockwise curvature. - - - - - Pen stroke has an extension; specific to Hispanic notation. - - - - - - Indicates participation in a ligature. - - - - - - Length of the pen stroke relative to the previous component within the same neume; this attribute should not be used - for the first component of a neume. - - - Longer. - - - Shorter. - - - - - Direction of the initial direction for an s-shaped pen stroke; i.e., "w" for the standard letter S, "e" - for its mirror image, "s" for the letter S turned 90-degrees anti-clockwise, and "n" for its mirror image. - - - - - - Direction of the pen stroke. - - - - - - - - Logical domain attributes. - - - - - - - - - Logical domain attributes. - - - - - - - - - Logical domain attributes. - - - Logical domain attributes. - - - Logical domain attributes. - - - - - - - - - - - Logical domain attributes. - - - Logical domain attributes. - - - - - - Groups event elements that occur 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-like features. - - - Groups elements that may occur within - a neume. - - - Groups elements that accommodate - neumed text. - - - - - - Groups elements that may appear as - part of the content of a syllable. - - - Episema. - - - - - - - - - - - - Hispanic tick. - - - - - - - - - - - - - - - Liquescent. - - - - - - - - - - - - Sign representing a single pitched - event, although the exact pitch may not be known. - - - - - - - - - - - - - - - - - - - - - - - - - - - - Designation which characterizes the element in some sense, using any convenient classification scheme or typology - that employs single-token labels. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Collection of one or more neume - components. - - - - - - - - - - - - - - - - - - - - - - - - Sign representing one or more musical - pitches. - - - - - - - - - - - - - - - - - - - - - - - - - - - - Designation which characterizes the element in some sense, using any convenient classification scheme or typology - that employs single-token labels. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Oriscus. - - - - - - - - - - - - Quilisma. - - - - - - - - - - - - Significantive letter(s). - - - - - - - - - - - - - - - - - - - - - - - Strophicus. - - - - - - - - - - - - Neume notation can be thought of as - "neumed text". Therefore, the syllable element provides high-level organization in this repertoire. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Represents a division (divisio) in - neume notation. Divisions indicate short, medium, or long pauses similar to breath marks in modern notation. - - - - - - - - - - - - - - - - - - - Identifies the different kinds of division. - - - - - - - - - - - - - - - - Temporal alignment attributes. - - - - @when attribute should have content. - A value in @when should - correspond to the @xml:id attribute of a when element. - - - - - - 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. - - - - - - - - audio/video - file - References 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. - - - - - - - - - - - - - - - - - - - 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. - - - - - - - - - - - -

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. - - - - - - - - - - - - - - - - - - - - - - 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). - - - - - - - - - - - @since must be present when @interval is used. - The value in @since - should correspond to the @xml:id attribute of a when element. - - - When @interval contains an integer value, @inttype cannot be 'time'. - - - When @interval contains a time value, @inttype must be 'time'. - - - - - - - When @absolute is present, @abstype should be present or - @betype should be present on an 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. - - - - 1 - - - - - - - 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 attribute is omitted and the absolute attribute is not specified, then the reference point is understood to be the immediately - preceding when element. - - - - - - - @since attribute should have content. - The value in @since - should correspond to the @xml:id attribute of a when element. - - - - - - -

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. - - - - - - pointer - Defines 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).

-
-
- - reference - Defines a traversible reference to - another location. May contain text and sub-elements that describe the destination. - - - - - - - - - - - - - - - - - - -

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. - - - - - - - - - - - - - - - - - - - - - - - - Groups elements that contain - meta-data about a single page. - - - - - - - - - - - - - - Groups elements that may appear as - part of the music element. - - - - - - - - - - - - - - - - - Provides a choice between structured - and unstructured/mixed content. - - - - - - - - - - - - - - - - - - - - - Groups elements that may appear as - part of a bibliographic title. - - - - - - - - - - - - - - - - - - - - - - - - - Datatypes for values in begin, end, - abstype and inttype attributes. - - - - Bytes. - - - Synchronized Multimedia Integration Language. - - - MIDI clicks. - - - MIDI machine code. - - - MIDI time code. - - - SMPTE 25 EBU. - - - SMPTE 24 Film Sync. - - - SMPTE 30 Drop. - - - SMPTE 30 Non-Drop. - - - SMPTE 29.97 Drop. - - - SMPTE 29.97 Non-Drop. - - - AES Time-code character format. - - - ISO 24-hour time format: HH:MM:SS.ss. - - - - - - Logical domain attributes. - - - - - - - Records the function of an accidental. - - - Cautionary accidental. - - - Editorial accidental. - - - - - - - Attributes for capturing momentary - pitch inflection. - - - Captures a written accidental. - - - - - - - - Logical domain attributes. - - - Logical domain attributes. - - - - - - - - - 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. - - - - - - - - - - - - - Logical domain attributes. - - - - - - - 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. Only articulations should be encoded in the artic attribute; for - example, fingerings should be encoded using the fing element. - - - - - - - - Logical domain attributes. - - - - - - - - Indicates the next section or movement to be performed. - - - - - - - @target attribute should have content. - The value in @target should correspond to the @xml:id attribute of a section or mdiv element. - - - - - - - - Attributes that describe the intended - audience. - - - The intended audience. - - - Internal use only. - - - Available to all audiences. - - - - - - - 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 attribute. - - - - - - -

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. - - - - - - A name or label associated with a controlled vocabulary or other authoritative source for this element or its - content. - - - - - - A web-accessible location of the controlled vocabulary or other authoritative source of identification or definition - for this element or its content. This attribute may contain a complete URI or a partial URI which is completed by the value of the - codedval attribute. - - - - - - - - Logical domain attributes. - - - - - - Records the appearance and usually the function of the bar line. - - - - - - - - Attributes that capture the placement - of bar lines. - - - States the length of barlines 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. - - - 0 - - - -

This attribute is ignored if the value of the bar.style attribute is mensur.

-
-
- - Records the method of barring. - - - - - - - "mensur" not allowed in this context. - - - - - - Denotes the staff location of bar lines, if the length is non-standard; that is, not equal to 2 times (the number of - staff lines - 1). - - - - -

The location may include staff lines, the spaces between the lines, and the spaces directly above and below the staff. The value - ranges between 0 (just below the staff) to 2 * number of staff lines (directly above the staff). For example, on a 5-line staff the - lines would be numbered 1, 3, 5, 7, and 9 while the spaces would be numbered 0, 2, 4, 6, 8, and 10. So, a value of 9 puts - the bar line through the top line of the staff.

-

This attribute is ignored if the value of the bar.style attribute is mensur.

-
-
-
-
- - Attributes that form the basis of the - att.common class. - - - - - - Provides a base URI reference with which applications can resolve relative URI references into absolute URI - references. - - - - - - - - Bibliographic attributes. - - - Contains a reference to a field or element in another descriptive encoding system to which this MEI element is - comparable. - - - - - - -

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. - - - - - - - - - - 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. - - - - - - - - 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 auth.uri attributes. - - - - - - - - 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. - - - - - - - - - - - - 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 element or be an external URL. - - - - - - - - Logical domain attributes. - - - - - - - - - Records the function of the clef. A "cautionary" clef does not change the following pitches. - - - - - - - - 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 specified. - - - A TAB or percussion clef requires that the number of lines be specified. - - - - - - Encodes a value for the clef symbol. - - - - - - Contains a default value for the position of the clef. 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. - - - - - - Records the amount of octave displacement to be applied to the clef. - - - - - - Records the direction of octave displacement to be applied to the clef. - - - - - - - - Logical domain attributes. - - - Attributes that record the shape of a - clef. - - - - When @shape is present, @line must also be specified. - - - - - - Describes a clef’s shape. - - - - - - - - Visual color attributes. - - - Used to indicate visual appearance. Do not confuse this with the musical term 'color' as used in pre-CMN - notation. - - - - - - - - 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, black, etc.) where void notes would otherwise occur. In CMN, coloration is - indicated by an inverse color; that is, the note head is void when it would otherwise be filled and vice versa. - - - - - - - - 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. - - - - - - - - - - - - - This attribute class records the - position of a feature within a two-dimensional coordinate system. - - - Indicates the upper-left corner x coordinate. - - - - - - Indicates the upper-left corner y coordinate. - - - - - - Indicates the lower-right corner x coordinate. - - - - - - Indicates the lower-left corner x coordinate. - - - - - - Indicates the amount by which the contents of this element have been rotated clockwise or, if applicable, how the - orientation of the element self should be interpreted, with respect to the normal orientation of the parent surface. The orientation - is expressed in arc degrees. - - - - 0 - -

This attribute is based on the TEI attribute of the same name.

-
-
-
-
- - Attributes that describe - "cue-ness". - - - - - - - - - - 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. - - - - - - - - - - - Describes a curve as one or more pairs of values with respect to an imaginary line connecting the starting and - ending points of the curve. The first value captures a distance to the left (positive value) or right (negative value) of the line, - expressed in virtual units. The second value of each pair represents a point along the line, expressed as a percentage of the line’s - length. N.B. An MEI virtual unit (vu) is half the distance between adjacent staff lines where the interline space is measured from the - middle of a staff line. - - - - - - - - - - - Describes a curve with a generic term indicating the direction of curvature. - - - Upward curve. - - - Downward curve. - - - A "meandering" curve, both above and below the items it pertains to. - - - - - - - Attributes that record the visual - rendition of curves. - - - Describes the line style of a curve. - - - - - - Width of a curved line. - - - - - - - - Logical domain attributes. - - - - - - - Encodes the target note when its pitch differs from the pitch at which the custos appears. - - - - - - - @target attribute should have content. - The value in @target - should correspond to the @xml:id attribute of a note element. - - - - - - - - Attributes common to dates. - - - Contains the end point of a date range in standard ISO form. - - - - - - Provides the value of a textual date in standard ISO form. - - - - - - Contains an upper boundary for an uncertain date in standard ISO form. - - - - - - Contains a lower boundary, in standard ISO form, for an uncertain date. - - - - - - Contains the starting point of a date range in standard ISO form. - - - - - - - - Attributes for linking metadata to - data. - - - Used to link metadata elements to one or more data-containing elements. - - - - - - - @data attribute should have content. - The value in @data should correspond to the @xml:id attribute of a descendant of the music element. - - - - - - - - Logical domain attributes. - - - - - - 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 content. - - - - - - - @decls attribute should have content. - Each value in @decls should correspond to the @xml:id attribute of an element within the metadata header. - No value in @decls should - correspond to the @xml:id attribute of a classification term. Use @class for this purpose. - - - - - - - - Attributes that capture the - dimensions of an entity. - - - - - - - Logical domain attributes. - - - - - - - - - Attributes that describe distance - from the staff. - - - Records the default distance from the staff for directives. - - - - - - Records the default distance from the staff for dynamic marks. - - - - - - Records the default distance from the staff of harmonic indications, such as guitar chord grids or functional - labels. - - - - - - Records the default distance from the staff for rehearsal marks. - - - - - - Records the default distance from the staff for tempo marks. - - - - - - - - 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. - - - When a duration cannot be represented as a single power-of-two value, multiple space-separated values that add up to - the total duration may be used. - - - - - - - - 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. - - - - - - Along with numbase.default, describes the default duration as a ratio. num.default is the first value in the - ratio. - - - - - - Along with num.default, describes the default duration as a ratio. numbase.default is the second value in the - ratio. - - - - - - - - Attributes that express duration in - musical terms. - - - Records the duration of a feature using the relative durational values provided by the data.DURATION - datatype. - - - - - - - - Attributes that describe duration as - a ratio. - - - Along with numbase, describes duration as a ratio. num is the first value in the ratio, while numbase is the - second. - - - - - - Along with num, describes duration as a ratio. num is the first value in the ratio, while numbase is the - second. - - - - - - - - Logical domain attributes. - - - - - - - - - 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 accidentals enclosed in parentheses, see Read, p. 131, ex. 9-14. - - - - - - - - Logical domain attributes. - - - - - - Attributes that record ending style - information - - - Describes where ending marks should be displayed. - - - Ending rendered only above top staff. - - - Ending rendered above staves that have bar lines drawn across them. - - - Endings rendered above staff groups. - - - - - - - Attributes that apply to all written - events, e.g., note, chord, rest, etc. - - - - - - - - - - Attributes describing the support for - and the certainty of an assertion. - - - Signifies the degree of certainty or precision associated with a feature. - - - - - - Indicates the nature of the evidence supporting the reliability or accuracy of the intervention or - interpretation. - - - - - - There is evidence within the document to support the intervention. - - - There is evidence outside the document to support the intervention. - - - The assertion has been made by the editor, cataloguer, or scholar on the basis of their expertise. - - - - - - - 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. - - - - - - - - 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. - - - - - - - - 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 employed instead. - - - - - - - - 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. - - - - - - - - Logical domain attributes. - - - - - - - Indicates the nesting level of staff grouping symbols. - - - - - - - - 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 have content. - Each value in @hand - should correspond to the @xml:id attribute of a hand element. - - - - - - - - Attributes that describe vertical - size. - - - Measurement of the vertical dimension of an entity. - - - - - - - - Attributes that record horizontal - alignment. - - - Records horizontal alignment. - - - - - - - - Attributes that uniquely identify an - element. - - - Regularizes the naming of an element and thus facilitates building links between it and other resources. Each id - attribute within a document must have a unique value. - - - - - - - - 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. - - - - - - - - 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. Also used to indicate a measure which metrically completes the current one. - Record the identifiers of the separately encoded components, excluding the one carrying the attribute. - - - - - - - @join attribute should have content. - Each value in @join - should correspond to the @xml:id attribute of an element. - - - - - - - - Logical domain attributes. - - - - - - - Logical domain attributes. - - - Written key signature. - - - - - - -

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 domain that are related to key signatures. - - - Written key signature. - - - - - - -

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 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. - - - Identifies the language of the element’s content. The values for this attribute are language 'tags' as defined in - BCP 47. All language tags that make use of private use sub-tags must be documented in a corresponding language element in the MEI - header whose id attribute is the same as the language tag’s value. - - - - - - Specifies the transliteration technique used. - - - - -

There is no standard list of transliteration schemes.

-
-
-
- -

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. - - - - - - - Provides a mechanism for linking the layer to a layerDef element. - - - - - - - @def attribute should have content. - The value in - @def should correspond to the @xml:id attribute of a layerDef element. - - - - - - - - Logical domain attributes. - - - - - - - - - Attributes that identify the layer to - which a feature applies. - - - Identifies the layer to which a feature applies. - - - - - - - - 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 of the staff. - - - - - - - - Attributes that record the visual - rendition of lines. - - - - - - Symbol rendered at end of line. - - - - - - Holds the relative size of the line-end symbol. - - - - - - Symbol rendered at start of line. - - - - - - Holds the relative size of the line-start symbol. - - - - - - - - Attributes that record the basic - visual rendition of lines. - - - Describes the line style of a line. - - - - - - Describes the number of segments into which a dashed or dotted line may be divided, or the number of "peaks" of a - wavy line; a pair of space-separated values (minimum and maximum, respectively) provides a range between which a rendering - system-supplied value may fall, while a single value indicates a fixed amount of space; that is, the minimum and maximum values are - equal. - - - 2 - - - - - - @lform attribute matching "dashed", "dotted", or "wavy" - required. - - - - - - Width of a line. - - - - - - - - Attributes that specify - element-to-element relationships. - - - Points to an element of which the current element is a copy. - - - - - - - An element with a copyof attribute can only - have comment or processing instruction descendents. - - - - - - - @copyof attribute should have content. - The value in @copyof - should correspond to the @xml:id attribute of an element. - - - - - - Used to point to other elements that correspond to this one in a generic fashion. - - - - - - - @corresp attribute should have content. - Each value in @corresp - should correspond to the @xml:id attribute of an element. - - - - - - points to one or more events in a user-defined collection that are known to be predecessors of the current - element. - - - - - - - @follows attribute should have content. - Each value in @follows - must correspond to the @xml:id attribute of an element. - - - - - - Used to point to the next event(s) in a user-defined collection. - - - - - - - @next attribute should have content. - Each value in @next - should correspond to the @xml:id attribute of an element. - - - - - - Points to one or more events in a user-defined collection that are known to be successors of the current - element. - - - - - - - @precedes attribute should have content. - Each value in @precedes - must correspond to the @xml:id attribute of an element. - - - - - - Points to the previous event(s) in a user-defined collection. - - - - - - - @prev attribute should have content. - Each value in @prev - should correspond to the @xml:id attribute of an element. - - - - - - Points to an element that is the same as the current element but is not a literal copy of the current - element. - - - - - - - @sameas attribute should have content. - Each value in @sameas - should correspond to the @xml:id attribute of an element. - - - - - - Points to elements that are synchronous with the current element. - - - - - - - @synch attribute should have content. - Each value in @synch - should correspond to the @xml:id attribute of an element. - - - - - - - - Attributes that describe default - typography of lyrics. - - - Describes the alignment of lyric syllables associated with a note or chord. - - - - - - Sets the font family default value for lyrics. - - - - - - Sets the font name default value for lyrics. - - - - - - Sets the default font size value for lyrics. - - - - - - Sets the default font style value for lyrics. - - - - - - Sets the default font weight value for lyrics. - - - - - - - - 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 pertaining to measure - numbers - - - Indicates whether measure numbers should be displayed. - - - - - - - - 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. - - - - - - Specifies a point where the relevant content ends. If not specified, the end of the content is assumed to be the end - point. A numerical value must be greater and a time value must be later than that given by the begin attribute. - - - - - - Type of values used in the begin/end attributes. The begin and end attributes can only be interpreted meaningfully - in conjunction with this attribute. - - - - - - - - Attributes describing a writing - medium, such as pencil or ink. - - - Describes the writing medium. - - - - - - - - Attributes that record the version of MEI supported. - - - Specifies a generic MEI version label. - 5.0.0-dev - - - MEI 2013 - - - MEI 3.0.0 - - - MEI 4.0.0 - - - MEI 4.0.1 - - - MEI basic - - - Development version of MEI 5.0.0 - - - - - - - Logical domain attributes. - - - - - - - Attributes that provide information - about a structure’s conformance to the prevailing meter. - - - Indicates the relationship between the content of a staff or layer and the prevailing meter. - - - Complete; i.e., conformant with the prevailing meter. - - - Incomplete; i.e., not enough beats. - - - Overfull; i.e., too many beats. - - - - - - - Attributes that provide information - about a measure’s conformance to the prevailing meter. - - - Indicates the relationship between the content of a measure and the prevailing meter. - - - - - - Indicates whether or not a bar line is "controlling"; that is, if it indicates a 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. - - - - - - - - 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 decimal number, such as 2+3 or 3*2. - - - \d+(\.\d+)?(\s*[\+\-\*/]\s*\d+(\.\d+)?)* - - - - - Indicates the use of a meter symbol instead of a numeric meter signature, that is, 'C' for common time or 'C' with a - slash for cut time. - - - - - - Contains the number indicating the beat unit, that is, the bottom number of the meter signature. - - - - - - - - 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 decimal number, such as 2+3 or 3*2. - - - \d+(\.\d+)?(\s*[\+\-\*/]\s*\d+(\.\d+)?)* - - - - - Contains the number indicating the beat unit, that is, the bottom number of the meter signature. - - - 0 - - - - - Indicates the use of a meter symbol instead of a numeric meter signature, that is, 'C' for common time or 'C' with a - slash for cut time. - - - - - - - - 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 midi.mspb. In MIDI, a beat is always defined as a quarter note, *not the - numerator of the time signature or the metronomic indication*. - - - - - - Captures the metronomic unit. - - - - - - Records the number of augmentation dots required by a dotted metronome unit. - - - - - - - - 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. - - - - - - - - Attributes shared by names. - - - - - - - - Used to record a pointer to the regularized form of the name elsewhere in the document. - - - - - - - @nymref attribute should have content. - The value in @nymref - should correspond to the @xml:id attribute of an element. - - - - - - Used to specify further information about the entity referenced by this name, for example, the occupation of a - person or the status of a place. - - - - -

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.

-
-
-
-
- - 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. - - - - - - - - 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. - - - - - - - - Attributes that capture music font - name and size. - - - Sets the default music font name. - - - - - - Sets the default music font size. - - - - - - - - Logical domain attributes. - - - - - - - - - - - - - - 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 should have content. - The value in - @head.altsym should correspond to the @xml:id attribute of a symbolDef element. - - - - - - A name or label associated with the controlled vocabulary from which a numerical value of head.shape is - taken. - - - - - - - When @head.auth matches 'smufl', @head.shape must - contain a numeric glyph reference in hexadecimal notation, like "#xE000" or "U+E000". - - - - - - Standard Music Font Layout. - - - - - Captures the overall color of a notehead. - - - - - - Describes how/if the notehead is filled. - - - - - - Captures the fill color of a notehead if different from the overall note color. - - - - - - Records any additional symbols applied to the notehead. - - - - - - Describes rotation applied to the basic notehead shape. A positive value rotates the notehead in a counter-clockwise - fashion, while negative values produce clockwise rotation. - - - - - - Used to override the head shape normally used for the given duration. - - - - - - - SMuFL version - 1.18 uses the range U+E000 - U+ECBF. - - - - - - Indicates if a feature should be rendered when the notation is presented graphically or sounded when it is presented - in an aural form. - - - - - - - - Attributes that record written - octave. - - - Captures written octave information. - - - - - - - - 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. - - - - - - - - Attributes describing the amount and - direction of octave displacement. - - - Records the amount of octave displacement. - - - - - - Records the direction of octave displacement. - - - - - - - - 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 stems-down notes below the line. - - - - - - - - Attributes pertaining to layout - optimization. - - - Indicates whether staves without notes, rests, etc. should be displayed. When the value is 'true', empty staves are - displayed. - - - - - - - - Attributes that identify the layer - associated with a distant feature. - - - identifies the layer on which referenced notation occurs. - - - - - - - - - - - - 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. - - - - - - - - - - - - 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. - - - - - - indicates the final element in a sequence of events. - - - - - - - - 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. - - - - - - encodes the ending point of musical material in terms of musical time, i.e., a count of measures plus a - beat location. The values are relative to the measure identified by origin.tstamp. - - - - - - - When @origin.tstamp2 is used @origin.tstamp must also be present. - - - - - - - - Logical domain attributes. - - - - - - - - - - Logical domain attributes. - - - - - - - Attributes that record page-level - layout information. - - - Specifies the height of the page; may be expressed in real-world units or staff steps. - - - - - - Describes the width of the page; may be expressed in real-world units or staff steps. - - - - - - Indicates the amount of whitespace at the top of a page. - - - - - - Indicates the amount of whitespace at the bottom of a page. - - - - - - Indicates the amount of whitespace at the left side of a page. - - - - - - Indicates the amount of whitespace at the right side of a page. - - - - - - Indicates the number of logical pages to be rendered on a single physical page. - - - - - - Indicates how the page should be scaled when rendered. - - - - - - - - Logical domain attributes. - - - 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. - - - (%all|#[\i][\c]+) - - - - - - '%all' cannot be mixed with other values. - - - - - - Signifies the part staff on which a notated feature occurs. Use '%all' when the feature should occur on every - staff. - - - (%all|\d+(-\d+)?) - - - - - - '%all' cannot be mixed with other values. - - - - - - - - Logical domain attributes. - - - Logical domain attributes. - - - - - - Logical domain attributes. - - - - - - - - - Attributes that record written pitch - name. - - - Contains a written pitch name. - - - - - - - - Attributes that record written pitch - name and octave number. - - - - - - - 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. - - - - - - - - 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. - - - - - - - - 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. - - - - - - - - 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 the target attribute is not present, it identifies participants in a - mutual relationship. - - - - - - - @plist attribute should have content. - Each value in @plist - should correspond to the @xml:id attribute of an element. - - - - - - - - Attributes common to all - pointing/linking elements. - - - Defines whether a link occurs automatically or must be requested by the user. - - - Load the target resource(s) immediately. - - - Load the target resource(s) upon user request. - - - Do not permit loading of the target resource(s). - - - Behavior other than allowed by the other values of this attribute. - - - - - Characterization of the relationship between resources. The value of the role attribute must be a URI. - - - - - - Defines how a remote resource is rendered. - - - Open in a new window. - - - Load the referenced resource in the same window. - - - Embed the referenced resource at the point of the link. - - - Do not permit traversal to the referenced resource. - - - Behavior other than permitted by the other values of this attribute. - - - - - Identifies passive participants in a relationship; that is, the entities pointed "to". - - - - - - Characterization of target resource(s) using any convenient classification scheme or typology. - - - - - - - - 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. - - - - - - - - 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 document header. - - - - - - - @resp attribute should have content. - The value in @resp should correspond to the @xml:id attribute of an element within the metadata header. - - - - - - - - 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. - - - - - - 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 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. - - - - - - - - - - - - - Logical domain attributes. - - - - - - 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. - - - - - - - - Attributes for recording the number - of slashes that accompany a feature. - - - Indicates the number of slashes present. - - - - - - - - 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 employed. - - - - - - - - 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. - - - - - - - @source attribute should have content. - Each value in @source should correspond to the @xml:id attribute of a source or manifestation element. - - - - - - - - Logical domain attributes. - - - - - - - - - Attributes that capture notation - spacing information. - - - Describes a note’s spacing relative to its time value. - - - - - - Describes the note spacing of output. - - - - - - Specifies the minimum amount of space between adjacent staves in the same system; measured from the bottom line of - the staff above to the top line of the staff below. - - - - - - Describes the space between adjacent systems; a pair of space-separated values (minimum and maximum, respectively) - provides a range between which a rendering system-supplied value may fall, while a single value indicates a fixed amount of space; - that is, the minimum and maximum values are equal. - - - - - - - - Logical domain attributes. - - - - - - Provides a mechanism for linking the staff to a staffDef element. - - - - - - - @def attribute should have content. - The value in - @def should correspond to the @xml:id attribute of a staffDef element. - - - - - - - - Logical domain attributes for - staffDef. - - - - - - - - - - - - - - Indicates the number of staff lines. - - - - - - - - Attributes that describe the symbol - used to group a set of staves. - - - Specifies the symbol used to group a set of staves. - - - Curved symbol, i.e., {. - - - Square symbol, i.e., [, but with curved/angled top and bottom segments. - - - Square symbol, i.e., [, with horizontal top and bottom segments. - - - Line symbol, i.e., |, (wide) line without top and bottom curved/horizontal segments. - - - Grouping symbol missing. - - - - - - - Logical domain attributes. - - - 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. - - - - - - - - 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. - - - - - - Describes vertical order of items printed below a staff, from closest to farthest away from the staff. - - - - - - Describes vertical order of items printed between staves, from top to bottom. - - - - - - - - Attributes that identify location on - a staff in terms of lines and spaces. - - - Holds the staff location of the feature. - - - - - - - - Attributes that identify location on - a staff in terms of pitch and octave. - - - Captures staff location in terms of written pitch name. - - - - - - Records staff location in terms of written octave. - - - - - - - - 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 should have content. - The value in @endid - should correspond to the @xml:id attribute of an element. - - - - - - - - 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 should have content. - The value in @startid - should correspond to the @xml:id attribute of an element. - - - - - - - - Attributes that describe the - properties of stemmed features; that is, chords and notes. - - - - - - - Describes the direction of a stem. - - - - - - Encodes the stem length. - - - - - - Encodes any stem "modifiers"; that is, symbols rendered on the stem, such as tremolo or Sprechstimme - indicators. - - - - - - Records the position of the stem in relation to the note head(s). - - - - - - Points to a note element in a different layer whose stem is shared. The linked notes should be rendered like a chord - though they are part of different layers. - - - - - - - - - @stem.sameas attribute should have content. - The value in - @stem.sameas should correspond to the @xml:id attribute of the linked note element of a different layer. - The linked notes by @stem.sameas should have the same - @dur values. - - - - - - Determines whether a stem should be displayed. - - - - - - Records the output x coordinate of the stem’s attachment point. - - - - - - Records the output y coordinate of the stem’s attachment point. - - - - - - - - Logical domain attributes. - - - Describes the symbols typically used to indicate breaks between syllables and their functions. - - - Space (word separator). - - - Dash (syllable separator). - - - Underscore (syllable extension). - - - Tilde (syllable elision). - - - Circumflex [angled line above] (syllable elision). - - - Caron [angled line below] (syllable elision). - - - Inverted breve [curved line above] (syllable elision). - - - Breve [curved line below] (syllable elision). - - - - - Records the position of a syllable within a word. - - - (initial) first syllable. - - - (medial) neither first nor last syllable. - - - (single) single syllable. - - - (terminal) last syllable. - - - - - - - Attributes that hold associated sung - text syllables. - - - Holds an associated sung text syllable. - - - - - - - - Logical domain attributes. - - - - - - 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 symbol. - - - - - - Describes the amount of whitespace at the left system margin relative to page.leftmar. - - - - - - Describes the amount of whitespace at the right system margin relative to page.rightmar. - - - - - - Describes the distance from page’s top edge to the first system; used for first page only. - - - - - - - - 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. - - - If an element pointed to is itself a pointer, then the target of that pointer will be taken, and so on, until an - element is found which is not a pointer. - - - If an element pointed to is itself a pointer, then its target (whether a pointer or not) is taken as the target - of this pointer. - - - No further evaluation of targets is carried out beyond that needed to find the element(s) specified in plist or - target attribute. - - - -

If no value is given, the application program is responsible for deciding (possibly on the basis of user input) how far to trace a - chain of pointers.

-
-
-
-
- - Logical domain attributes. - - - - - - - - - Records the function of a tempo indication. - - - Marks a gradual change of tempo, such as "accel." or "rit." - - - Represents a static tempo instruction, such as a textual term like "Adagio", a metronome marking like "♩=70", or - a combination of text and metronome indication. - - - Captures a change in pulse rate (tempo) and/or pulse grouping (subdivision) in an "equation" of the form [tempo - before change] = [tempo after change]. - - - Indicates a change in pulse rate (tempo) and/or pulse grouping (subdivision) in an "equation" of the form [tempo - after change] = [tempo before change]. The term "precedente" often appears following the "equation" to distinguish this kind of - historical usage from the modern metric modulation form. - - - - - - - Attributes that record renditional - characteristics. - - - Used to extend the values of the rend attribute. - - - - - - Captures the appearance of the element’s contents using MEI-defined descriptors. - - - - - - - - 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. - - - - - - Provides a default value for the font name of text (other than lyrics) when this information is not provided on the - individual elements. - - - - - - Provides a default value for the font size of text (other than lyrics) when this information is not provided on the - individual elements. - - - - - - Provides a default value for the font style of text (other than lyrics) when this information is not provided on the - individual elements. - - - - - - Provides a default value for the font weight for text (other than lyrics) when this information is not provided on - the individual elements. - - - - - - - - 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. - - - - - - - - Attributes that record a time stamp - in terms of musical time, i.e., beats[.fractional beat part]. - - - Encodes the onset time in terms of musical time, i.e., beats[.fractional beat part], as expressed in - the written time signature. - - - - - - - - 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. - - - - - - - - Attributes that describe - transposition. - - - Records the amount of diatonic pitch shift, e.g., C to C♯ = 0, C to D♭ = 1, necessary to calculate the - sounded pitch from the written one. - - - - - - Records the amount of pitch shift in semitones, e.g., C to C♯ = 1, C to D♭ = 1, necessary to calculate - the sounded pitch from the written one. - - - - - - -

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. - - - Holds a value for cycles per second, i.e., Hertz, for a tuning reference pitch. - - - - - - Holds the pitch name of a tuning reference pitch, i.e., the central tone of a tuning system. - - - - - - Provides an indication of the tuning system, just, for example. - - - - - - - - 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 employed. - - - - - - - - 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. - - - Contains the name of a font-family. - - - - - - Holds the name of a font. - - - - - - Indicates the size of a font expressed in printers' points, i.e., 1/72nd of an inch, relative terms, - e.g., small, larger, etc., or percentage values relative to normal size, - e.g., 125%. - - - - - - Records the style of a font, i.e., italic, oblique, or normal. - - - - - - Used to indicate bold type. - - - - - - Indicates letter spacing (aka tracking) in analogy to the CSS letter-spacing property. - - - - - - Indicates line height in analogy to the CSS line-height property. - - - - - - - - - - - Attributes that record vertical - alignment. - - - Records vertical alignment. - - - - - - - - Attributes that record grouping of - vertically aligned elements. - - - Provides a label for members of a vertically aligned group. - - - - - - - - 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. - - - - - - - - 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. - - - 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 staff lines. - - - - - - - - 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. - - - - - - - - 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 staff lines. - - - - - - - - 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. - - - Records the horizontal adjustment of a feature’s programmatically-determined start point. - - - - - - Records the horizontal adjustment of a feature’s programmatically-determined end point. - - - - - - - - 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. - - - - - - Records a timestamp adjustment of a feature’s programmatically-determined end point. - - - - - - - - Vertical offset attributes requiring - a pair of attributes. - - - Records a vertical adjustment of a feature’s programmatically-determined start point. - - - - - - Records a vertical adjustment of a feature’s programmatically-determined end point. - - - - - - - - Attributes that describe the symbol - used to group volta elements. - - - Specifies the symbol used to group lyrics. - - - Curved symbol, i.e., {. - - - Square symbol, i.e., [, but with curved/angled top and bottom segments. - - - Square symbol, i.e., [, with horizontal top and bottom segments. - - - Line symbol, i.e., |, (wide) line without top and bottom curved/horizontal segments. - - - Grouping symbol missing. - - - - - - - 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 be turned off locally by setting the xml:space attribute to the value - "default". - - - Allows the application to handle white space as necessary. Not including an xml:space attribute produces the - same result as using the default value. - - - Instructs the application to maintain white space "as-is", suggesting that it might have meaning. - - - - - - - Attributes that describe horizontal - size. - - - Measurement of the horizontal dimension of an entity. - - - - - - -

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* 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. - - - - - - 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. - - - - - - - - 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. - - - - - - Encodes the optional 2nd y coordinate. - - - - - - - - Groups elements used to represent a - postal address. - - - - - - - - Groups annotation-like - elements. - - - - - - Groups elements containing 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 figure. - - - 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 upon other events, such as notes or rests, for their existence. - - - - - - - - - - Groups elements containing date - expressions. - - - - - - - - - Groups elements which describe a - measurement forming part of the physical dimensions of an object. - - - - - - Groups elements containing - bibliographic edition information. - - - - - - - Groups editorial intervention - elements. - - - - - - - Groups elements that represent - alternative endings. - - - - - - - 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 component. - - - Groups identifier-like - elements. - - - - - - - - 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. - - - Groups elements that represent - accidentals in 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 that permit - declaration of layer properties. - - - 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 at the layer - level that are shared by the mensural and neume repertoires. - - - - - - Groups elements that function like - line beginnings. - - - - - - - Groups elements used to represent - generic structural divisions of music notation. - - - Groups elements that represent a - measurement. - - - - - - Groups elements that represent a - meter signature. - - - - - - - Groups milestone-style elements found - in music notation. - - - Groups milestone-style elements found - in text. - - - Groups elements that contain - names. - - - - - - Groups elements that modify note-like - features. - - - - - - Groups elements that denote a number - or a quantity. - - - - - - 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 collect separate - performer parts. - - - Groups page beginning-like - elements. - - - - - - - - Groups paragraph-like - elements. - - - - - - Collects elements that express a - relationship. - - - - - - Groups elements that mark - typographical features. - - - - - - 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 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. - - - - - - Groups elements that represent a - score. - - - Groups elements that may appear as - part of a score. - - - 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 in the mensural and neume repertoires. - - - - - - Groups elements that permit - declaration of staff properties. - - - - - - Groups elements that may appear in - the declaration of staff features. - - - Groups elements that permit - declaration of staff group properties. - - - Groups elements that function like - staves. - - - - - - - Groups elements that are components - of a staff. - - - Groups elements that are components - of a staff in the mensural and neume repertoires. - - - - - - Groups elements that contain a lyric - syllable. - - - - - - - - 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. 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 may appear as - part of a title page transcription. - - - accidental - Records a temporary alteration to the - pitch of a note. - - - - - - - - - - - - - - -

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 element. The - element may be used when specific display info, such as size or color, needs to 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 - line - Single 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 - level - Contains bibliographic elements - describing an item (e.g., an article or poem) published within a monograph or journal and not as an independent - publication. - - - - - - - - - - - - - - - - - - - - - - - - - - annotation - Provides a statement explaining the - text or indicating the basis for an assertion. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 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 - label for and comment regarding the group. Participating entities may be identified in the plist attribute. An editorial or - analytical comment or observation may be included directly within the annot element. The starting point of the - annotation may be indicated by either a tstamp, tstamp.ges, tstamp.real or startid - attribute, while the ending point may be 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 medium from that of the original; in an arrangement the musical substance - remains essentially unchanged. - - - - - - - - - - - - - - - - - - - articulation - An indication of how to play a note - or chord. - - - - - - - - - - - - - - -

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 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. - - - - - - - - - - - - - - - -

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 reference - Provides 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 - citation - Defines 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 citation - Contains 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. - - - - - - - - - - - - - - - -

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.

-

The content model of body also allows blocks of text and music 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. - - - - - - - - - - - - - - - - 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. - When combined with a fermata a longer silence is usually implied. The starting point of the caesura 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.

-

Unlike the breath mark, a caesura may have a performed duration. Also, while the default value for - place on the breath mark is above, the default value for place for a caesura is within. - Unless indicated by other 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 - group - Groups 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).

-
-
- - column - beginning - An empty formatting element that - forces text to begin in a new column. - - - - - - - - - - - - - - - - - Records the column number. - - - - - - - - Column beginning must be preceded by a colLayout element. - The value of @n should be less than or equal to the value of @cols () of the preceding colLayout element. - - - - - - -

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*. - - - - - - - - - - - - - - - - - - - - - - - - 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 - group - A set of simultaneously-occurring - clefs. - - - - - - - - - - - - - - - - - - - column - layout - An 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. - - - - - - - - - - - - - - - - - - - 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).

-
-
- - Symbol placed at the end of a line of - music to indicate the first note of the next line. Sometimes called a "direct". - - - - - - - - - - - - - - - - -

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. - - - - - - - - - - - - - - - - - - - -

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. - - - - - - - - - - - - - - - - - - - The dedicatee element may not be recursively nested. - - - - - - Description of a measurement taken - through a three-dimensional object. - - - - - - - - - - - - - - - - - - description - Container 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).

-
-
- - dimension - Any 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 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).

-
-
- - directive - An 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. - - - - - - - - - - - - - - - - - - - - - - - - - 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 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 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).

-
-
- - division - Major structural division of text, - such as a preface, chapter or section. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Characterizes the textual division in some sense, using any convenient classification scheme or typology that - employs single-token labels. - - - - - - A summary of the content of a text as continuous prose. - - - A formal declaration of acknowledgment by the author in which persons and institutions are thanked for their - part in the creation of a text. - - - An ancillary self-contained section of a work, often providing additional but in some sense extra-canonical - text. - - - A list of bibliographic citations. - - - A statement appearing at the end of a book describing the conditions of its physical production. - - - A table of contents, specifying the structure of a work and listing its constituents. The list element should be - used to mark its structure. - - - A formal offering or dedication of a text to one or more persons or institutions by the author. - - - A pictorial frontispiece, possibly including some text. - - - A list of terms associated with definition texts (‘glosses’). - - - A page containing only the title of a book — as opposed to the title page, which also lists subtitle, author, - imprint and similar data. - - - Any form of index to the work. - - - A section in which annotations on the text are gathered together. - - - A foreword or preface addressed to the reader in which the author or publisher 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. - - - - - - - - - - - - - - -

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.

-
-
- - dynamic - Indication of the volume of a note, - phrase, or section of music. - - - - - - - - - - - - - - - - - - - - - - - - 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 starting point of the dynamic marking 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 a starting point - attribute. MIDI values associated with the graphical dynamic sign may be recorded in the val and val2 - attributes.

-
-
- - edition - designation - A 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. - - - - - - - - - - - - - - - - - - - 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. - - - - - - - - - - - - - - - - - -

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 - symbol - A 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.

-
-
- - heading - Contains 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).

-
-
- - incipit - The 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 - accidental - Accidental 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.

-
-
- - key - signature - Written key signature. - - - - - - - - - - - - - - - - - - - - - If the @oct attribute appears on any keyAccid element, it must be - provided on all keyAccid 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. - - - - - - - - - - - - - - - - - - -

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. - - - - - - - - - - - - - - - - - - - - An independent stream of events on a - staff. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

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 - 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 - definition - Container for layer - meta-information. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - line - beginning - An 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 - group - May 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. - - - - - - - - - - - - - - - - - - - musical - division - Contains a subdivision of the body of - a musical text. - - - - - - - - - - - - - - - - - - - - - - - - - - -

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 - it is not always possible or desirable to generate one from the other. The score and parts - elements are placed here and not directly within the body element because score and part characteristics may - change from mdiv to mdiv. For example, the 2nd movement of a symphony may require different - performing forces (and therefore different score and 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. - - - - - - - - - - - - - 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 - level - Contains 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. - - - - - - - - - - - - - - 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. - - - - - - - - - - - - - - - - - - - - - - - - - -

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 attributes. Similarly, the syl sub-element may be used instead of the syl attribute. The verse - sub-element may be used to group text syllables by verse. The colored attribute may be used to indicate coloration. In the - mensural repertoire, coloration is a temporary change in the underlying mensuration from perfect to 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.

-
-
- - number - Numeric 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. - - - - - - - - - - - - - - - - - - - - - - - - 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.

-
-
- - paragraph - One 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.

-
-
- - padding - An 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). - - - - - - - - - - - - - - - - - - - - - - - - - - -

- 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 different layout, such as page turns, are needed for the score - and parts, or for accommodating software that requires part-by-part encoding. When assembly of the parts into 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. - - - - - - - - - - - - - - - - - page - beginning - An empty formatting element that - forces text to begin on a new page. - - - - - - - - - - - - - - - -

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 - description - Contains 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 - footer - A 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 - header - A 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. - - - - - - - - - - - - - - - - - - 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 - location - Groups 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 - place - Name 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 - item - Contains 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. - - - - - - - - Describes a relationship or linkage - amongst entities. - - - - - - - - - - - - - - - - - - Within work, expression, source, or item, the value of the rel attribute must match one of the following: hasAbridgement, - isAbridgementOf, hasAdaptation, isAdaptationOf, hasAlternate, isAlternateOf, hasArrangement, isArrangementOf, hasComplement, - isComplementOf, hasEmbodiment, isEmbodimentOf, hasExemplar, isExemplarOf, hasImitation, isImitationOf, hasPart, isPartOf, - hasRealization, isRealizationOf, hasReconfiguration, isReconfigurationOf, hasReproduction, isReproductionOf, hasRevision, - isRevisionOf, hasSuccessor, isSuccessorOf, hasSummarization, isSummarizationOf, hasSupplement, isSupplementOf, hasTransformation, - isTransformationOf, hasTranslation, isTranslationOf - Within work, expression, source or item, the target attribute 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 - target attribute is not necessary. In a non-mutual relationship, plist identifies the entities pointed "from", - while target specifies the entities 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. - - - - - - - - - - - - - - - render - A formatting element indicating - special visual rendering, e.g., bold or italicized, of a text word or phrase. - - - - - - - - - - - - - - - - - - - - - - - - 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. - - - - - - - - - - - - - - - - - -

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).

-
-
- - responsibility - A 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 statement - Transcription 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. - - - - - - - - - - - - - - - - - - - - - - - At least one element pair (a resp element and a name-like element) is recommended. Alternatively, each name-like - element may have a @role 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. - - - - - - - - - - - - - - - - - - - - - - - - The value of @line must be - less than or equal to the number of lines on the 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. - - - - - - - - - - - - - - -

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

-
-
- - role - description - Describes 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 - beginning - An empty formatting element that - forces musical notation to begin on a new line. - - - - - - - - - - - - - - -

Do not confuse this element with the lb element, which performs a similar function in prose.

-
-
- - Full score view of the musical - content. - - - - - - - - - - - - - - - - - - - - - - - - - - - -

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 - definition - Container for score - meta-information. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Segment of music data. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - A section containing an expansion element must - have descendant section, ending, or rdg 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. - - - - - - - - - - - - - - - - - - - - - - - - -

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. - - - - - - - - - - - - - - - - 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 - text - An 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 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. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - There - must be a preceding staffDef with a matching value of @n, a preceding staff with 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 - definition - Container for staff - meta-information. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - StaffDef must have an n attribute. - Either @lines must be present or a preceding staffDef - with the same value for @n and @lines must exist. - Only one clef or clefGrp is permitted. - - - - - - - - @n must have the same value as the current staff. - - - - - - - - Either @lines must be present or a preceding staffDef - with matching @n value and @lines must exist. - - - - - - - The clef position must be less than or equal to the number of lines on the - staff. - - - - - - - - - The clef position must be less than or equal to the number of lines on - the staff. - - - - - - - - The tab.strings attribute must have the same number of values as there are staff - lines. - - - - - - - - - The tab.strings attribute must have the - same number of values as there are staff lines. - - - - - - - - - The lines.color attribute must have either 1) a single value or 2) the - same number of values as there are staff lines. - - - - - The lines.color - attribute must have either 1) a single value or 2) the same number of values as there are staff lines. - - - - - - - - - - - The value of ppq must be a factor of the value of ppq on an ancestor - scoreDef. - - - - - - - - - - - The value of ppq must be a factor of the value of ppq on a preceding - scoreDef. - - - - - - - staff - group - A group of bracketed or braced - staves. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Each staffDef must have a unique value 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.

-
-
- - syllable - Individual lyric syllable. - - - - - - - - - - - - - - - - - - - - - - -

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"). - - - - - - - - - - - - - - - - - - - - - - - - - - - - Only analog, class, label, mm, mm.dots, mm.unit, n, translit, type, xml:base, xml:id, and xml:lang attributes are allowed when - tempo is not a descendant of a score or 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 - language - Identifies 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. - - - - - - - - - - - - - - - - - - - - - - - - - - - - Indicates the bibliographic level of the title. - - - Analyzed component, such as an article or chapter, within a larger bibliographic entity. - - - Collection. A group of items that were not originally published, distributed, or produced together. - - - Subunit of a collection, e.g., item, folder, box, archival series, subgroup, or - subcollection. - - - Integrating resource, such as a continuously updated loose-leaf service or Web site. - - - Monograph. - - - Journal. - - - Series. - - - Unpublished (including theses and dissertations unless published by a commercial press). - - - - - Characterizes the title in some sense, using any convenient classification scheme or typology that employs - single-token labels. - - - - - - Main title. - - - Subtitle or title of part. - - - Abbreviated form of title. - - - Alternate title by which the item is also known. - - - Translated form of title. - - - Collective title. - - - 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 - work is also known), translated (translated form of title), uniform (collective title), and desc (descriptive title). The - type attribute is provided for convenience in analysing titles and processing them according to their type; where such - specialized processing is not necessary, there is no need for such analysis, and the entire title, including subtitles and any parallel - titles, may be enclosed within a single title element. Title parts may be encoded in titlePart sub-elements. The name of the list from which a controlled value is taken 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. - - - - - - - - - - - - - - - - - - - - - - - - -

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. - - - - - - - - - - - - - - - - - - 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).

-
-
- - back - matter - Contains 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. - - - - - - - - - - - - - - - - - -

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

-
-
- - front - matter - Bundles 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. - - - - - - - - - - - - - - - - -

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

-
-
- - line of - text - Contains 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 - item - Single 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.

-
-
- - quoted - Contains 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 - material - Contains 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).

-
-
- - 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 should have content. - The value in - @altsym should correspond to the @xml:id attribute of a symbolDef element. - The value in @altsym must not correspond to the @xml:id - attribute of a symbolDef ancestor. - - - - - - - - Logical domain attributes. - - - - - - Indicates the function of the text. - - - - - - The function of the text is unknown. - - - - - - - Logical domain attributes. - - - - - - Indicates the function of the curve. - - - - - - The function of the curve is unknown. - - - - - - - Attributes for describing the logical - behavior of a line. - - - - - - - - - Indicates the function of the line. - - - - - - Indicates coloration in material transcribed from a source originally in mensural notation. - - - Marks a ligature in material transcribed from a source originally in mensural notation. - - - The function of the line is unknown. - - - - - - - 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. - - - - - - - - - - - - - - - - - - - - - -

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 - sub-elements. The starting point of the text 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 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. - - - - - - - - - - - - - - - - In the symbolDef context, curve must have either a startid attribute or x and y - attributes. - In the symbolDef context, curve must have either an endid attribute or both x2 and y2 - attributes. - In the symbolDef context, curve must have either a 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 used to record horizontal, vertical, or time offsets from the absolute coordinates or from the location of the referenced - element. Similarly, the terminal point of the curve may be recorded using either the x2 and y2 coordinates or in - relation to the location of another element using the endid attribute. Attributes in the att.visualOffset2 class maybe used - to record the offsets of the ending point. The 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. - - - - - - - - - - - - - - - - - - - - - When used in the symbolDef context, must have either a startid attribute or x and y - attributes. - When used in the symbolDef context, must have either an endid attribute or both x2 and y2 - attributes. - - - When used in the score context, must have a - startid, tstamp, tstamp.ges or tstamp.real attribute or both x and y attributes. - When used in the score context, must have an endid, dur, - dur.ges, or tstamp2 attribute or both x2 and 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 or from the location of the element reference in the startid attribute. Similarly, the terminal point of the line - may be recorded using the x2 and y2 attributes. Attributes in the att.visualOffset2 class maybe used to record the - 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. - - - - - - - - - - - - - - property - name - Name of a property of the - symbol. - - - - - - - - - - - - - Characterizes the property name. - - - A registered Unicode normative or informative property name. - - - A locally defined name. - - - - - - - property - value - A single property value. - - - - - - - - - symbol - definition - Declaration 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 - name - Contains the name of a symbol, - expressed following Unicode conventions. - - - - - - - - - symbol - property - Provides a name and value for some - property of the parent symbol. - - - - - - - - - - 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. - - - Visual domain attributes. - - - - - - - - - - - Visual domain attributes. - - - - - - - Visual domain attributes. - - - Location of the annotation. - - - - - - - - Visual domain attributes. - - - - - - - - - - - - Indicates if an arrowhead is to be drawn as part of the arpeggiation symbol. - - - - - - Symbol rendered at end of the line. - - - - - - Holds the relative size of the arrow symbol. - - - - - - Captures the overall color of the arrow. - - - - - - Captures the fill color of the arrow if different from the line color. - - - - - - Visual form of the line. - - - - - - Width of the line. - - - - - - - - Visual domain attributes. - - - - - - - - - - - - - - - - Visual domain attributes. - - - - - - - - - - - - Visual domain attributes. - - - - - - - - - - States the length of barlines 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. - - - 0 - - - -

This attribute is ignored if the value of the style attribute is mensur.

-
-
- - Records the method of barring. - - - - - - Denotes the staff location of the bar line if its length is non-standard. - - - - -

The location may include staff lines, the spaces between the lines, and the spaces directly above and below the staff. The value - ranges between 0 (just below the staff) to 2 * number of staff lines (directly above the staff). For example, on a 5-line staff the - lines would be numbered 1, 3, 5, 7, and 9 while the spaces would be numbered 0, 2, 4, 6, 8, and 10. So, a value of 9 puts - the bar line through the top line of the staff.

-

This attribute is ignored if the value of the style attribute is mensur.

-
-
-
-
- - Visual domain attributes. - - - - - - - - - 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. - - - - - - Encodes whether a beam is "feathered" and in which direction. - - - Beam lines grow farther apart from left to right. - - - Beam lines grow closer together from left to right. - - - Beam lines are equally-spaced over the entire length of the beam. - - - - - Captures beam slope. - - - - - - - - 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 is a single thick, slanting slash; therefore, the value 1 - should be used. When the beat is divided into even notes, the following values should be used: 4ths or 8ths=1, 16ths=2, 32nds=3, - 64ths=4, 128ths=5. When the beat is comprised of mixed duration values, the default rendition is 2 slashes and 2 dots. - - - - - - - - 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. - - - - - - - - - - - - Visual domain attributes. - - - - - - - - - - - - - - Visual domain attributes. - - - - - - - - - - - - - - Visual domain attributes. - - - - - - Visual domain attributes. - - - - - - - - - - - - - - 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. - - - - - - - - - - - - - - - - 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 boundaries of the cluster note head. - - - - - - - - Visual domain attributes. - - - Visual domain attributes. - - - Visual domain attributes. - - - - - - - - - - - - Used by staffDef and scoreDef to - provide default values for attributes in the visual domain related to clefs. - - - Describes the color of the clef. - - - - - - Determines whether the clef is to be displayed. - - - - - - - - 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. - - - - - - - - - - - - - - - - Horizontal stroke. - - - Vertical stroke. - - - - - Captures the placement of the episema with respect to the neume or neume component with which it is - associated. - - - - - - - - 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. - - - - - - - - - - - - - Describes the visual appearance of the fermata; that is, whether it occurs as upright or inverted. - - - Inverted, i.e., curve or bracket below the dot. - - - Upright; i.e., curve or bracket above the dot. - - - - - Describes the visual appearance of the fermata; that is, whether it has a curved, square, or angular shape. - - - A curve above or below the dot. - - - A bracket above or below the dot. - - - A triangle above or below the dot. - - - - - - - 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. - - - - - - - - - - - - Combination expressed horizontally, as for brass instruments. - - - Combination expressed vertically, as for woodwind instruments or piano. - - - - - - - Visual domain attributes. - - - Indicates the number of beams present. - - - 1 - 6 - - - - - Captures the number of "floating" beams, i.e., those not attached to stems. - - - - - - - The number of floating beams must be less than or equal to the total number of - beams. - - - - - - Records the amount of separation between floating beams and stems. - - - - - - - - Visual domain attributes. - - - - - - - - - - - - - - Visual domain attributes. - - - - - - Visual domain attributes. - - - - - - - - - - - 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, and x2 and y2 the right end point, of an imaginary line that defines the length of - the hairpin 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. - - - - - - - - - - - - - Specifies the distance between the lines at the open end of a hairpin dynamic mark. - - - - - - Applies to a "Rossini" hairpin, i.e., one where the normally open side is closed by a connecting line. - - - - - - Indicates that the opening points are aligned with an imaginary line that is always 90° perpendicular to the - horizontal plane, regardless of any angle or start/end adjustments, including when the hairpin is angled with @angle.optimize or - through @endvo/@startvo adjustments. - - - - - - Indicates that the slope of the hairpin can be adjusted to follow the content in order to optimize spacing. - - - - - - - - Visual domain attributes. - - - - - - - - - - - Visual domain attributes. - - - - - - - - - - - Describes how the harmonic indication should be rendered. - - - Chord tablature grid. - - - Chord tablature grid and the element’s textual content. - - - Textual content of the element. - - - - - - - Visual domain attributes. - - - - - - - - - - - - Visual domain attributes. - - - - - - - - - - - - - - Captures the placement of the tick mark with respect to the neume or neume component with which it is - associated. - - - - - - Direction toward which the mark points. - - - - - - - - Visual domain attributes. - - - Visual domain attributes. - - - - - - - - - - - - Visual domain attributes. - - - - - - - Determines whether cautionary accidentals should be displayed at a key change. - - - - - - - - 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. - - - - - - - - Visual domain attributes. - - - - - - Visual domain attributes. - - - - - - - - Visual domain attributes. - - - - - - Provides an indication of the function of the ligature. - - - - - - - - Attributes for describing the visual - appearance of a line. - - - - - - - - - - - Visual form of the line. - - - - - - Width of the line. - - - - - - Symbol rendered at end of line. - - - - - - Holds the relative size of the line-end symbol. - - - - - - Symbol rendered at start of line. - - - - - - Holds the relative size of the line-start symbol. - - - - - - - - Visual domain attributes. - - - - - - - - - - - - - - Records direction of curvature. - - - Anti-clockwise curvature. - - - Clockwise curvature. - - - - - Indicates whether curve is closed. - - - - - - - - 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. - - - - - - - - - - - - Visual domain attributes. - - - - - - - Visual domain attributes. - - - - - - - Visual domain attributes. These - attributes describe the physical appearance of the mensuration sign/time signature of mensural notation. - - - - - - - - - - - Specifies whether a dot is to be added to the base symbol. - - - - - - Indicates whether the base symbol is written vertically or horizontally. - - - Horizontally oriented. - - - Vertically oriented. - - - - - Describes the rotation or reflection of the base symbol. - - - - - - The base symbol in the mensuration sign/time signature of mensural notation. - - - - - - - - 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. - - - - - - Determines if a dot is to be added to the base symbol. - - - - - - Indicates whether the base symbol is written vertically or horizontally. - - - Horizontally oriented. - - - Vertically oriented. - - - - - Holds the staff location of the mensuration sign. - - - - - - Describes the rotation or reflection of the base symbol. - - - - - - The base symbol in the mensuration sign/time signature of mensural notation. - - - - - - Describes the relative size of the mensuration sign. - - - - - - Indicates the number lines added to the mensuration sign. For example, one slash is added for what we now call 'alla - breve'. - - - - - - - - Visual domain attributes. - - - - - - Visual domain attributes. - - - - - - - - - - Contains an indication of how the meter signature should be rendered. - - - - - - - - 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. - - - - - - Determines whether the old meter signature should be displayed when the meter signature changes. - - - - - - - - Visual domain attributes. - - - Visual domain attributes. - - - - - - - - - - Visual domain attributes. - - - - - - - - - - - - Visual domain attributes. - - - - - - - - - - - - - - - Visual domain attributes. - - - - - - - - - - - Visual domain attributes. - - - - - - - - - - Visual domain attributes. - - - - - - - - Visual domain attributes. - - - - - - - - - - - - - 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. - - - - - - - - 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. - - - 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. - - - The back of a manuscript page. - - - The front of a manuscript page. - - - - - - - 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. - - - - - - - - - - - - - - Determines whether piano pedal marks should be rendered as lines or as terms. - - - - - - - - Visual domain attributes. - - - - - - - - - - - Visual domain attributes that - describe the properties of a plica stem in the mensural repertoire. - - - Describes the direction of a stem. - - - - - - Encodes the stem length. - - - - - - - - Visual domain attributes. - - - - - - - - - - Visual domain attributes. - - - - - - - - - - - - - - Number of "crests" of a wavy line. - - - 2 - 4 - - - - - - - Visual domain attributes. - - - Visual domain attributes. - - - - - - - - - - - - Visual domain attributes. - - - - - - - - - - Visual domain attributes. - - - - - - - - - - - - - - - - Visual domain attributes. - - - - - - - - Indicates whether hash marks should be rendered between systems. See Read, p. 436, ex. 26-3. - - - Display hash marks between systems. - - - - - - - Visual domain attributes. - - - Visual domain attributes for scoreDef - in the CMN repertoire. - - - - - - - - - - - - - - - - - - - - - - - - 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 from the middle of a staff line. - - - \d+(\.\d+)?(cm|mm|in|pt|pc) - - - - - - - Visual domain attributes. - - - Indicates that staves begin again with this section. - - - - - - - - Visual domain attributes. - - - - - - - - - - - - - - Captures the placement of the sequence of characters with respect to the neume or neume component with which it is - associated. - - - - - - - - Visual domain attributes for slur. - The vo attribute is the vertical offset (from its normal position) of the entire rendered slur/phrase mark. - - - - - - - - - - - - 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. - - - - - - - - Visual domain attributes. - - - - - - Visual domain attributes for - staffDef. - - - - - - - - - - - - - - - - - - - - Determines whether to display guitar chord grids. - - - - - - Indicates the number of layers and their stem directions. - - - - - - Captures the colors of the staff lines. - - - - -

The value is structured; that is, it should contain a single color value or have the same number of space-separated values as the - number of lines indicated by the lines attribute. The first value then applies to the lowest line of the staff.

-

All values from data.COLOR are allowed.

-
-
- - Records whether all staff lines are visible. - - - - - - Records the absolute distance (as opposed to the relative distances recorded in scoreDef - elements) between this staff and the preceding one in the same system. This value is meaningless for the first staff in a system since - the spacing.system attribute indicates the spacing between systems. - - - - -
-
- - Visual domain attributes. - - - - - - - - Indicates whether bar lines go across the space between staves (true) or are only drawn across the lines of each - staff (false). - - - - -

This attribute is ignored when the bar.method attribute’s value is mensur or takt.

-
-
-
-
- - Visual domain attributes. - - - - - - - - - - Visual domain attributes that - describe the properties of a stem in the mensural repertoire. - - - - - - - - - Records the position of the stem in relation to the note head(s). - - - - - - Encodes the stem length. - - - - - - Encodes the form of the stem using the values provided by the data.STEMFORM.mensural datatype. - - - - - - Describes the direction of a stem. - - - - - - Records the position of the flag using the values provided by the data.FLAGPOS.mensural datatype. - - - - - - Encodes the form of the flag using the values provided by the data.FLAGFORM.mensural datatype. - - - - - - - - Visual domain attributes. - - - - - - - - - - - - - - Visual domain attributes. - - - - - - - - - - Visual domain attributes. - - - Visual domain attributes. - - - - - - - - - - - - Visual domain attributes. - - - - - - - - - - - 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. - - - - - - - - - - - - Visual domain attributes. - - - - - - - - - - - - - - - - Visual domain attributes. - - - - - - - Used to state where a tuplet bracket will be placed in relation to the note heads. - - - - - - States whether a bracket should be rendered with a tuplet. - - - - - - Determines if the tuplet duration is visible. - - - - - - Controls how the num:numbase ratio is to be displayed. - - - Only the num attribute is displayed, e.g., '7'. - - - Both the num and numbase attributes are displayed, e.g., '7:4'. - - - - - - - Visual domain attributes. - - - - - - Visual domain attributes. - - - - - - - - - - - - - Visual domain attributes. - - - - - - - - - - - - Visual domain attributes. - - - - - - - - - - - - - Collects pagesLike elements. - - - A set of pages in a page-based encoding - - - - - - - - - - - - Collects pageLike elements. - - - A page in a page-base encoding - - - - - - - - - - - - - - - - - - - - - - Collects systemLike elements. - - - A system in a page-based encoding - - - - - - - - - - - - - - - - - - - - Collects secbLike (section beginning) elements. - - - section beginning - A milestone element indicating the start of a new section in page-based MEI. - - - - - - - - - - Collects mdivbLike (mdiv beginning) elements. - - - mdiv beginning - A milestone element indicating the start of a new mdiv in page-based MEI. - - - - - - - - - - score beginning - A milestone element indicating the start of a new score in page-based MEI. - - - - - - - - - -

This element is necessary to allow round-tripping between page-based and score-based (regular) MEI.

-
-
- - parts beginning - A milestone element indicating the start of new parts in page-based MEI. - - - - - - - -

This element is necessary to allow round-tripping between page-based and score-based (regular) MEI.

-
-
- - part beginning - A milestone element indicating the start of a new part in page-based MEI. - - - - - - - - - -

This element is necessary to allow round-tripping between page-based and score-based (regular) MEI.

-
-
- - Collects milestone like elements. - - - milestone - A generic milestone element that can be used as anchor in an MEI file. - - - - - - - - - - - - milestone end - A milestone element that can be used to indicate the end of an arbitrary feature in MEI. - - - - - - - - - - - - - - milestoneEnd needs a @startid attribute. - - - - -

The @startid attribute should be used to point to the element starting the feature that is ended by an milestoneEnd.

-
-
- - Attributes that record the x coordinate of the left side of a feature. - - - gives coordinates for the left side of a feature. - - - 0 - - - - - - - Attributes that record the x coordinate of the right side of a feature. - - - gives coordinates for the right side of a feature. - - - 0 - - - - - - - Attributes that record the y coordinate of the top left of a feature. - - - gives y coordinates for the top left of a feature. - - - 0 - - - - - - - Attributes for left/right coordinates. - - - - - - - Attribute that define margins of a page. - - - top margin - Indicates the amount of whitespace at the top of a page. - - - - - - bottom margin - Indicates the amount of whitespace at the bottom of a page. - - - - - - left margin - Indicates the amount of whitespace at the left side of a page. - - - - - - right margin - Indicates the amount of whitespace at the right side of a page. - - - - - - - - - - - In string tablature, the number of the course to be played, i.e., [1-9]+. - - - - - - Standard course tunings. - - - - Standard tuning for current guitars. The courses are tuned to E2 A2 D3 G3 B3 E4. - - - Drop D tuning for guitars. The lowest course is tuned down to D, while all other courses are kept to their regular - pitches. D2 A2 D3 G3 B3 E4. - - - Open D tuning for guitars. D2 A2 D3 F3s A3 D4. - - - Open G tuning for guitars. D2 G2 D2 G2 B3 D4. - - - Open A tuning for guitars. E2 A2 E3 A3 C4s E4. - - - Renaissance tuning for lutes with 10 strings on 6 courses. G2G3 C3C4 F3F4 A4A4 D4 G4. - - - Baroque tuning for lutes with 6 stable courses, and additional bass courses tuned to the key of D Major. - - - Baroque tuning for lutes with 6 stable courses, and additional bass courses tuned to the key of D minor. - - - - - - - - Records which course is to be played. - - - - - - Records which course is to be played. - - - - - - - - - - Indicates a tuning standard for the course. - - - - - - - - course tuning information - Describes the tuning of a course on a lute. - - - - - - foo information - Dummy element for enforcing that the att classes are used. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
diff --git a/libmei/mei/develop/mei-all_compiled.odd b/libmei/mei/mei-all_compiled.odd similarity index 93% rename from libmei/mei/develop/mei-all_compiled.odd rename to libmei/mei/mei-all_compiled.odd index 8be4d4eb9c5..9e03cdf81a3 100644 --- a/libmei/mei/develop/mei-all_compiled.odd +++ b/libmei/mei/mei-all_compiled.odd @@ -1,16 +1,18 @@ - + - Music Encoding Initiative Guidelines: <title type="sub">All - Customization + Music Encoding Initiative Guidelines: <title type="sub">All Customization Authored by Perry Roland -

+ Music Encoding Initiative (MEI) Board + + Licensed under the Educational Community License version 2.0 +

@@ -29,7 +31,7 @@ - + Written accidental values. @@ -104,6 +106,18 @@ Natural note lowered by quarter tone (natural modified by arrow). + + Double sharp note raised by quarter tone (double sharp modified by arrow). + + + Double sharp note lowered by quarter tone (double sharp modified by arrow). + + + Double flat note raised by quarter tone (double flat modified by arrow). + + + Double flat note lowered by quarter tone (double flat modified by arrow). + 1/4-tone flat accidental. @@ -214,6 +228,12 @@ Three quarter-tones flat. + + Five quarter-tones sharp. + + + Five quarter-tones flat. + @@ -249,6 +269,12 @@ Spiccato. + + Stress (Unicode 00B4). + + + Unstress (Unicode 02D8). + Main note followed by short slide to higher, indeterminate pitch (Unicode 1D185). @@ -337,7 +363,7 @@ - + "" contains a deprecated value. @@ -382,7 +408,7 @@ Dotted line (SMuFL E037). - Double barline (SMuFL E031 and Unicode 1D101). + Double bar line (SMuFL E031 and Unicode 1D101). Double dashed line. @@ -391,16 +417,16 @@ Double dotted line. - Heavy double barline (SMuFL E035). + Heavy double bar line (SMuFL E035). Segno serpent with vertical lines (SMuFL E04B). - End barline (SMuFL E032 and Unicode 1D102). + End bar line (SMuFL E032 and Unicode 1D102). - Heavy barline (SMuFL E034). + Heavy bar line (SMuFL E034). Bar line not rendered. @@ -418,7 +444,7 @@ Segno serpent. - Single barline (SMuFL E030 and Unicode 1D100). + Single bar line (SMuFL E030 and Unicode 1D100). @@ -487,6 +513,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 @@ -522,7 +566,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). @@ -538,6 +582,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. +

+ Tone-cluster rendition. @@ -1126,7 +1178,7 @@ - + Performed duration attribute values. @@ -1677,12 +1729,12 @@ A count of measures plus a beat location, i.e., [0-9]+m *\+ *[0-9]+(\.?[0-9]*)?. The - measure count is the number of barlines crossed by the event, while the beat location is a + 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 in the range of 0 to the number of remaining measures, while the beat number must be in the range from 0 to the numerator of the time signature plus 1. For example, in 6/8 the beat - number must be within the range from 0 (the left barline) to 7 (the right barline). A value + 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. @@ -1692,14 +1744,14 @@ A count of measures plus a beat location, i.e., (\+|-)?[0-9]+m\+[0-9]+(\.?[0-9]*)?. The - measure count is the number of barlines crossed by the event, while the beat location is a + 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 measure number, such as "1m+3", indicates a point in the following measure, while a value with a negative measure number, such as "-1m+3", marks a point in the preceding measure. The beat number must be in the range from 0 to the numerator of the time signature plus 1. For example, - in 6/8 the beat number must be within the range from 0 (the left barline) to 7 (the right - barline). A value with a measure number of "0", such as "0m+2", indicates a point within the + 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. @@ -1910,8 +1962,8 @@ Meter signature rendered using traditional numeric values. - - Meter signature not rendered. + + Meter signature rendered using both the symbol and the traditional numeric values. @@ -2761,7 +2813,7 @@ Enclosing circle. - + Enclosing "fences". @@ -2776,8 +2828,7 @@ - Oct attribute values. The default values conform to Acoustical Society of America - representation. Read, p. 44. + Octave number. The default values conform to the Scientific Pitch Notation (SPN). 9 @@ -2842,26 +2893,50 @@ - 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. + + + + 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. + + + Header or footer for the first page only. + + + Header or footer for the last page only. + + + The first of an alternating pattern of headers or footers. + + + The second of an alternating pattern of headers or footers. + + + + +

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. @@ -2882,7 +2957,7 @@ [a-g] - + Gestural pitch names need an additional value for when the notated pitch is not to be sounded. @@ -2900,7 +2975,7 @@ - + Other values not permitted when 'above', 'below', 'between' or 'within' is @@ -3027,7 +3102,7 @@ - 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. @@ -3039,7 +3114,7 @@ - + The @staff @@ -3377,7 +3452,7 @@ - + An element with a notationsubtype attribute must have @@ -3389,8 +3464,15 @@ Analytical domain attributes. + + Analytical domain attributes. + + + Analytical domain attributes. + + Analytical domain attributes. Analytical domain attributes. @@ -3490,10 +3572,13 @@ + + Analytical domain attributes. Attributes describing the harmonic function of a single pitch. + degree Captures scale degree information using Humdrum **deg syntax -- an optional indicator of melodic approach (^ = ascending approach, v = descending approach), a scale degree value (1 = tonic ... 7 = leading tone), and an optional indication of chromatic @@ -3514,6 +3599,7 @@ Attributes that describe harmonic intervals. + interval harmonic Encodes the harmonic interval between pitches occurring at the same time. @@ -3524,6 +3610,7 @@ Attributes that provide for description of intervallic content. + interval melodic Encodes the melodic interval from the previous pitch. The value may be a general directional indication (u, d, s, etc.), an indication of diatonic interval direction, quality, and size, or a precise numeric value in half steps. @@ -3538,16 +3625,9 @@ Analytical domain attributes. + - - - Indicates major, minor, or other tonality. - - - - - Used by staffDef and scoreDef to provide default values for attributes in the analytical domain that are related to key signatures. @@ -3584,6 +3664,8 @@ Analytical domain attributes. Analytical domain attributes. + + Analytical domain attributes. Analytical domain attributes. @@ -3601,12 +3683,16 @@ Analytical domain attributes. + + Analytical domain attributes. Analytical domain attributes. Analytical domain attributes. Analytical domain attributes. + + Analytical domain attributes. Analytical domain attributes. @@ -3634,6 +3720,7 @@ + @@ -3641,6 +3728,9 @@ Analytical domain attributes. Analytical domain attributes. + + + Analytical domain attributes. @@ -3682,12 +3772,15 @@ Attributes that describe pitch class. + pitch class Holds pitch class information. + + Analytical domain attributes that describe the properties of a plica in the mensural repertoire. Analytical domain attributes. @@ -3698,6 +3791,8 @@ Analytical domain attributes. Analytical domain attributes. + + Analytical domain attributes. Analytical domain attributes. @@ -3725,6 +3820,7 @@ 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 system. @@ -3750,6 +3846,8 @@ Analytical domain attributes. Analytical domain attributes. + + Analytical domain attributes that describe the properties of a stem in the mensural repertoire. Analytical domain attributes. @@ -4007,7 +4105,7 @@ - + Stem direction must be specified for all notes and chords under the @@ -4052,7 +4150,7 @@ - + Logical domain attributes. @@ -4076,7 +4174,7 @@ - + Logical domain attributes. @@ -4084,10 +4182,11 @@ - + + function Describes the function of the bracketed event sequence. @@ -4113,29 +4212,17 @@ - + Logical domain attributes. - + + - - - Indicates whether the tremolo is measured or unmeasured. - - - Measured tremolo. - - - Unmeasured tremolo. - - - - Analytical domain attributes in the CMN repertoire. @@ -4175,21 +4262,8 @@ - - Analytical domain attributes. - - Gestural domain attributes. Logical domain attributes. - - Visual domain attributes. - - - - - - - Attributes that indicate whether to render a repeat symbol or the source material to which it refers. @@ -4214,25 +4288,14 @@ - + + - - - Describes the style of the tremolo. - - - Measured tremolo. - - - Unmeasured tremolo. - - - - Attributes that indicate whether an event participates in a glissando. + glissando Indicates that this element participates in a glissando. If visual information about the glissando needs to be recorded, then a gliss element should be employed instead. @@ -4247,7 +4310,7 @@ - + Attributes that mark a note or chord as a "grace", how it should "steal" time, and how @@ -4267,10 +4330,6 @@ - - Analytical domain attributes. - - Gestural domain attributes. Logical domain attributes. @@ -4294,18 +4353,13 @@ - - Visual domain attributes. - - - Logical domain attributes. - + @@ -4332,7 +4386,7 @@ Logical domain attributes. - + Logical domain attributes. The pedal setting, i.e., flat, natural, or sharp, for each @@ -4458,7 +4512,7 @@ - + Attributes that indicate the presence of an l.v. (laissez vibrer) marking attached to a @@ -4504,6 +4558,7 @@ Logical domain attributes. + function Function of the meter signature group. @@ -4516,6 +4571,9 @@ Meter signatures with different unit values are used to express a complex metrical pattern that is not expressible using traditional means, such as 2/4+1/8. + + Meter signatures in a relationship not covered by the values alternating, interchanging or mixed. + @@ -4581,6 +4639,7 @@ Attributes that record numbers to be displayed with a feature. + number Records a number or count accompanying a notational feature. @@ -4592,6 +4651,7 @@ tremolo or tuplet. + number placement States where the tuplet number will be placed in relation to the note heads. @@ -4611,7 +4671,7 @@ - + @@ -4633,10 +4693,11 @@ - + + direction Records the position of the piano damper pedal. @@ -4654,6 +4715,7 @@ + function Indicates the function of the depressed pedal, but not necessarily the text associated with its use. Use the dir element for such text. @@ -4687,7 +4749,7 @@ Visual domain attributes. - + Used by scoreDef and staffDef to provide default description of piano pedal @@ -4707,8 +4769,8 @@ - - + + Attributes used by scoreDef and staffDef to provide default information about rehearsal @@ -4752,26 +4814,19 @@ Visual domain attributes. + - - - Determines whether to display guitar chord grids. - - - - - Logical domain attributes. - + Attributes that describe the rendition of slurs. @@ -4794,6 +4849,8 @@ + + Logical domain attributes in the CMN repertoire. Logical domain attributes for staffDef in the CMN repertoire. @@ -4826,7 +4883,7 @@ - + Attributes that describe the rendition of ties. @@ -4842,6 +4899,21 @@ + + Attributes describing the form of a tremolo. + + + Describes the style of the tremolo. + + + Measured tremolo. + + + Unmeasured tremolo. + + + + Attributes that describe measured tremolandi. @@ -4869,7 +4941,7 @@ - + Groups control events that appear in CMN. @@ -4946,7 +5018,7 @@ - + Must have one of the @@ -4972,10 +5044,10 @@ - + - - A beam without a copyof attribute must have at least 2 note, rest, chord, or space + + A beam that contains neither a copyof nor sameas attribute must have at least 2 note, rest, chord, or space descendants. @@ -4996,7 +5068,7 @@ - + Must have one of the @@ -5039,7 +5111,7 @@ - + Must have one of the @@ -5058,7 +5130,7 @@ - + Must have one of the @@ -5085,7 +5157,7 @@ - + Must have one of the @@ -5125,7 +5197,7 @@ - + Must have one of the @@ -5162,7 +5234,7 @@ - + Must have one of the @@ -5181,7 +5253,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. + grace groupA container for a sequence of grace notes. @@ -5191,14 +5263,14 @@ - + A graceGrp without a copyof attribute must have at least 1 note, rest, chord, or space descendants. - + The grace attribute is not allowed on @@ -5216,7 +5288,7 @@ - + Must have one of the @@ -5255,7 +5327,7 @@ - + Must have one of the @@ -5276,14 +5348,14 @@ - + Must have one of the attributes: startid, tstamp, tstamp.ges or tstamp.real. - + The visual attributes of the lv element (@bezier, @bulge, @curvedir, @@ -5326,7 +5398,7 @@ - meter signature groupUsed to capture alternating, interchanging, and mixed meter signatures. + meter signature groupUsed to capture alternating, interchanging, mixed or other non-standard meter signatures. @@ -5336,7 +5408,7 @@ - + meterSigGrp must have at least 2 child @@ -5444,7 +5516,7 @@ - + Must have one of the @@ -5489,7 +5561,7 @@ - + @@ -5535,7 +5607,7 @@ - + Must have one of the @@ -5562,6 +5634,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. @@ -5572,7 +5675,7 @@ - + Must have one of the @@ -5581,7 +5684,7 @@ dur, dur.ges, endid, or tstamp2. - + The visual attributes of the slur (@bezier, @bulge, @curvedir, @lform, @@ -5616,7 +5719,7 @@ - + Must have one of the @@ -5625,7 +5728,7 @@ dur, dur.ges, endid, or tstamp2. - + The visual attributes of the tie (@bezier, @bulge, @curvedir, @lform, @@ -5672,7 +5775,7 @@ - + Must have one of the @@ -5755,6 +5858,7 @@ Attributes for marking the presence of an ornament. + ornament Indicates that this element has an attached ornament. If visual information about the ornament is needed, then one of the elements that represents an ornament (mordent, trill, or turn) should be employed. @@ -5770,7 +5874,7 @@ - +
Logical domain attributes. @@ -5817,7 +5921,7 @@ - + Must have one of the @@ -5839,7 +5943,7 @@ - + Must have one of the @@ -5866,7 +5970,7 @@ - + Must have one of the @@ -5885,8 +5989,7 @@ -

This element is modelled on the teiCorpus element in the Text Encoding Initiative (TEI) - standard. The MEI instances making up the corpus may be related in a number of ways, for +

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.

@@ -5922,7 +6025,7 @@ -
(apparatus) – Contains one or more alternative encodings. + apparatusContains one or more alternative encodings. @@ -5937,8 +6040,8 @@ unclear), or the nature of the variation or the principles required to understand it (e.g., lectio difficilior, usus auctoris, etc.).

-

This element is modelled on an element in the Text Encoding Initiative (TEI) standard.

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

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

+
lemmaContains the lemma, or base text, of a textual variation. @@ -5962,8 +6065,8 @@ example, when used as a descendent of verse, lem should only contain those elements allowed within verse.

-

This element is modelled on an element in the Text Encoding Initiative (TEI) standard.

-
(reading) – Contains a single reading within a textual variation. +

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

+
readingContains a single reading within a textual variation. @@ -5985,20 +6088,20 @@ example, when used as a descendent of verse, rdg should only contain those elements allowed within verse.

-

This element is modelled on an element in the Text Encoding Initiative (TEI) standard.

+

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

Logical domain attributes. - + Logical domain attributes. - + Groups elements containing stage directions in performance texts. @@ -6020,14 +6123,14 @@ - + 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, @@ -6040,7 +6143,7 @@ not a descendant of sp. In a textual content sp must NOT have any musical attributes.

-

This element is modelled on an element in the Text Encoding Initiative (TEI) standard.

+

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. @@ -6053,14 +6156,14 @@ - + 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, @@ -6072,7 +6175,7 @@

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.

-

This element is modelled on an element in the Text Encoding Initiative (TEI) standard.

+

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. @@ -6088,13 +6191,13 @@ Logical domain attributes. - + - + Attributes describing the nature of an encoded scholarly intervention or @@ -6103,27 +6206,15 @@ - - Analytical domain attributes. - - Gestural domain attributes. - - - Logical domain attributes. - + - - Visual domain attributes. - - - Attributes that identify the reason why an editorial feature is used. @@ -6192,8 +6283,8 @@ 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.

-

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

+

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. @@ -6223,7 +6314,7 @@ example, when used as a descendent of verse, add should only contain those elements allowed within verse.

-

This element is modelled on an element in the Text Encoding Initiative (TEI) standard.

+

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. @@ -6236,7 +6327,7 @@ encodings to be considered as parallel. Note also that choice elements may be recursively nested.

-

This element is modelled on an element in the Text Encoding Initiative (TEI) standard.

+

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. @@ -6258,7 +6349,7 @@ 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.

-

This element is modelled on an element in the Text Encoding Initiative (TEI) standard.

+

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. @@ -6270,7 +6361,7 @@ - + Must have one of the @@ -6328,7 +6419,7 @@ 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.

-

This element is modelled on an element in the Text Encoding Initiative (TEI) standard.

+

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. @@ -6353,8 +6444,7 @@ example, when used as a descendent of verse, del should only contain those elements allowed within verse.

-

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

+

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

expansionContains the expansion of an abbreviation. @@ -6366,6 +6456,7 @@ + abbreviation Captures the abbreviated form of the text. @@ -6375,8 +6466,8 @@ 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.

-

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

+

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. @@ -6403,7 +6494,7 @@ deletion by an identifiable hand. The cert attribute signifies the degree of certainty ascribed to the identification of the extent of the missing material.

-

This element is modelled on an element in the Text Encoding Initiative (TEI) standard.

+

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. @@ -6424,7 +6515,7 @@ - + @new attribute should @@ -6440,7 +6531,7 @@ - + @old attribute should @@ -6461,10 +6552,10 @@ attribute signifies the degree of certainty ascribed to the identification of the new hand.

-

This element is modelled on an element in the Text Encoding Initiative (TEI) standard.

+

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 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.
@@ -6545,7 +6636,7 @@ 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.

-

This element is modelled on an element in the Text Encoding Initiative (TEI) standard.

+

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. @@ -6569,7 +6660,7 @@ example, when used as a descendent of verse, reg should only contain those elements allowed within verse.

-

This element is modelled on an element in the Text Encoding Initiative (TEI) standard.

+

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. @@ -6582,6 +6673,7 @@ + description Provides a description of the means of restoration, stet or strike-down, for example. @@ -6592,7 +6684,7 @@ 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.

-

This element is modelled on an element in the Text Encoding Initiative (TEI) standard.

+

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

Contains apparently incorrect or inaccurate material. @@ -6610,7 +6702,7 @@ example, when used as a descendent of verse, sic should only contain those elements allowed within verse.

-

This element is modelled on an element in the Text Encoding Initiative (TEI) standard.

+

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. @@ -6621,7 +6713,7 @@ -

This element is modelled on an element in the Text Encoding Initiative (TEI) standard.

+

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. @@ -6649,7 +6741,7 @@ 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.

-

This element is modelled on an element in the Text Encoding Initiative (TEI) standard.

+

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. @@ -6679,14 +6771,13 @@ 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.

-

This element is modelled on an element in the Text Encoding Initiative (TEI) standard.

-
- Attributes used to associate MEI features with corresponding glyphs in an - externally-defined standard such as SMuFL. +

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

+ + 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. @@ -6696,12 +6787,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 @@ -6716,7 +6818,7 @@ - + SMuFL version 1.18 uses the range U+E000 - U+ECBF. @@ -6724,24 +6826,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. - Permits the current element to reference a facsimile surface or image zone which - corresponds to it. - + facsimile + Points to one or more images, portions of an image, or surfaces which correspond to the current element. + - + @facs attribute should @@ -6770,7 +6872,7 @@

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

-

This element is modelled on an element in the Text Encoding Initiative (TEI) standard.

+

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 one or more graphic representations of that space, and rectangular zones of interest within it. @@ -6789,8 +6891,8 @@

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

-

This element is modelled on an element in the Text Encoding Initiative (TEI) standard.

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

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. @@ -6800,7 +6902,7 @@

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

-

This element is modelled on an element in the Text Encoding Initiative (TEI) standard.

+

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

Attributes shared by table cells. @@ -6846,8 +6948,7 @@
-

This element is modelled on the figure element in the Text Encoding Initiative (TEI) - standard.

+

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. @@ -6860,9 +6961,10 @@ 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.

-

This element is modelled on an element in the Text Encoding Initiative (TEI) standard.

+

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

Indicates the location of an inline graphic. + @@ -6873,7 +6975,7 @@ - + Graphic child of zone should not have @@ -6890,18 +6992,8 @@ attributes. - - Indicates the upper-left corner x coordinate. - - - - - Indicates the upper-left corner y coordinate. - - - - -

This element is modelled on an element in the Text Encoding Initiative (TEI) standard.

+
+

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

Contains text displayed in tabular form. @@ -6913,8 +7005,8 @@ -

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

+

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. @@ -6928,7 +7020,7 @@

The colspan and rowspan attributes record tabular display rendering information.

-

This element is modelled on an element in the HTML standard.

+

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. @@ -6942,7 +7034,7 @@

The colspan and rowspan attributes record tabular display rendering information.

-

This element is modelled on an element in the HTML standard.

+

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. @@ -6954,14 +7046,14 @@

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

-

This element is modelled on an element in the HTML standard.

+

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

Logical domain attributes. - + Logical domain attributes. @@ -6969,7 +7061,7 @@ - + @@ -6992,7 +7084,7 @@ - finger – An individual finger in a fingering indication. + fingerAn individual finger in a fingering indication. @@ -7002,14 +7094,14 @@ - + Must have one of the attributes: startid, tstamp, tstamp.ges or tstamp.real. - + @@ -7017,7 +7109,7 @@ descendant of fing. - (finger group)– A group of individual fingers in a fingering indication. + finger groupA group of individual fingers in a fingering indication. @@ -7027,14 +7119,14 @@ - + At least 2 fing or fingGrp elements are required. - + @@ -7280,10 +7372,19 @@ 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. @@ -7317,7 +7418,7 @@ - (genetic description) - Bundles information about the textual development of a + genetic descriptionBundles information about the textual development of a work. @@ -7360,9 +7461,9 @@ Gestural domain attributes. - + - + Attributes for capturing momentary pitch inflection in the gestural domain. @@ -7370,7 +7471,7 @@ - + The value of @accid.ges should @@ -7380,23 +7481,27 @@ + + Gestural domain attributes. Gestural domain attributes. + + Gestural domain attributes. Gestural domain attributes. - - - + + + Gestural domain attributes. Gestural domain attributes. - + - + Attributes describing the method of performance. @@ -7409,8 +7514,19 @@ Gestural domain attributes. - + + + Attributes whether an element is performed "attacca". + + + Indicates that the performance of the next musical division should begin immediately + following this one. + + + + + Gestural domain attributes. @@ -7418,15 +7534,15 @@ Gestural domain attributes. - - + + Gestural domain attributes. Gestural domain attributes. - + @@ -7440,13 +7556,13 @@ Gestural domain attributes. - - + + Gestural domain attributes. - + Gestural domain attributes. @@ -7456,14 +7572,14 @@ Gestural domain attributes. - - + + Gestural domain attributes. - - + + @@ -7472,7 +7588,7 @@ Gestural domain attributes. - + Gestural domain attributes. @@ -7481,8 +7597,8 @@ Gestural domain attributes. - - + + Gestural domain attributes. @@ -7490,31 +7606,25 @@ Gestural domain attributes. Gestural domain attributes. - - - Indicates that the performance of the next musical division should begin immediately - following this one. - - - - - + + + Gestural domain attributes. - - + + Gestural domain attributes. - + Attributes that record performed duration that differs from a feature’s written duration. Records performed duration information that differs from the written duration. - + @@ -7559,40 +7669,40 @@ Gestural domain attributes. - + - + Gestural domain attributes. Gestural domain attributes. - + Gestural domain attributes. - - + + Gestural domain attributes. - + Gestural domain attributes. - - + + Gestural domain attributes. - - + + Gestural domain attributes. @@ -7602,34 +7712,36 @@ Gestural domain attributes. - - + + + + Gestural domain attributes. Gestural domain attributes. Gestural domain attributes. - + - + Gestural domain attributes. - + Gestural domain attributes. - - + + Gestural domain attributes. - + Gestural domain attributes. @@ -7657,15 +7769,15 @@ Attributes for describing the performed components of a line. - - + + Gestural domain attributes. Gestural domain attributes. - + Gestural domain attributes. @@ -7674,22 +7786,30 @@ 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. @@ -7698,12 +7818,12 @@ Gestural domain attributes. - + Gestural domain attributes. - + Gestural domain attributes. @@ -7711,54 +7831,36 @@ Gestural domain attributes. - - - + + + + - - - Records performed octave information that differs from the written value. - - - - - - Contains a performed pitch name that differs from the written value. - - - - - - Holds a pitch-to-number mapping, a base-40 or MIDI note number, for example. - - - - - Gestural domain attributes. - + Gestural domain attributes. - + Gestural domain attributes. - - - + + + + - + When the @extremis attribute is used, @@ -7785,38 +7887,20 @@ necessary to record the written pitch and octave of the symbol for this note.

- - Records performed octave information that differs from the written value. - - - - - - Contains a performed pitch name that differs from the written value. - - - - - - Holds a pitch-to-number mapping, a base-40 or MIDI note number, for example. - - - -
Gestural domain attributes. - - + + Gestural domain attributes. Gestural domain attributes. - - + + Gestural accidentals associated with ornaments. @@ -7847,29 +7931,60 @@ 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 attributes about pitch. + + + Records performed octave information that differs from the written value. + + + + + + Contains a performed pitch name that differs from the written value. + + + + + + pitch number + Holds a pitch-to-number mapping, a base-40 or MIDI note number, for example. + + + + + + + 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. @@ -7892,22 +8007,16 @@
Gestural domain attributes. - - - Indicates that the performance of the next section should begin immediately following - this one. - - - - - + + + Gestural domain attributes. Gestural domain attributes. - - + + Attributes that locate a sound source within 3-D space. @@ -7936,12 +8045,12 @@ Gestural domain attributes. - + Gestural domain attributes. - + Gestural domain attributes. @@ -7961,8 +8070,10 @@ Gestural domain attributes. - + + + Gestural domain attributes that describe the properties of a stem in the mensural repertoire. Gestural domain attributes. @@ -7979,9 +8090,9 @@ Gestural domain attributes. - + - + Attributes that record a performed (as opposed to notated) time stamp. @@ -7998,7 +8109,7 @@ - + Attributes that record a performed (as opposed to notated) time stamp for the end of an event. @@ -8019,18 +8130,18 @@ Gestural domain attributes. - - + + Gestural domain attributes. - + Gestural domain attributes. - + @@ -8057,7 +8168,7 @@ - +
Logical domain attributes. @@ -8065,16 +8176,17 @@ - + + chord reference Contains a reference to a chordDef element elsewhere in the document. - + @chordref attribute @@ -8168,7 +8280,7 @@ - + Must have one of the @@ -8187,6 +8299,7 @@ + @@ -8242,6 +8355,60 @@ + + 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. + + + + + + + Attributes that define the characteristics and components of the performance resource or a performance resource list. + + + + + + Indicates the number of performers. + + + + + + + Attributes that describe a performance resource as ad libitum (optional). + + + Marks a performance resource as ad libitum (optional). + + + + + + +

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

+

+ + Meanings of ad libitum + + indicates an optional performance resource (instrumental or vocal part or group), + + marks a passage to be played freely or free in time, + + requests or invites to improvise a passage of music, + + indicates that the number repetitions can be set individually or spontaneously. + +

+

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

+
Attributes that define the characteristics and components of the bibliographic description. @@ -8415,8 +8582,7 @@ information about limitations on the use of material, such as those afforded by copyright.

-

This element is modelled on an element in the Encoded Archival Description (EAD) - standard.

+

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. @@ -8424,9 +8590,9 @@ - + -

This element is modelled on an element in the Text Encoding Initiative (TEI) standard.

+

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 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. @@ -8435,7 +8601,7 @@ -

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

+

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. @@ -8444,7 +8610,7 @@ -

This element is modelled on an element in the Text Encoding Initiative (TEI) standard.

+

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. @@ -8459,13 +8625,13 @@ -

This element is modelled on an element in the Text Encoding Initiative (TEI) standard.

+

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. - + @context attribute should @@ -8478,7 +8644,7 @@ - Circumstances in which the element appears, an XPath expression. + Circumstances in which the attribute appears, an XPath expression. @@ -8497,14 +8663,13 @@ - +

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

-

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

+

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

Describes a folded sheet of paper. @@ -8555,7 +8720,7 @@ - + To be addressable, the category element must @@ -8600,7 +8765,7 @@ - + The date of the change must be recorded in an @@ -8619,8 +8784,7 @@ to designate an MEI encoding that has been so substantively changed that it constitutes a new version that supersedes earlier versions.

-

This element is modelled on an element in the Encoded Archival Description (EAD) - standard.

+

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. @@ -8657,14 +8821,14 @@ - + Only child elements of the same name as the parent of the componentList are allowed. - + When any child @@ -8692,8 +8856,7 @@ -

This element is modelled on an element in the Encoded Archival Description (EAD) - standard.

+

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. @@ -8708,7 +8871,7 @@ - + When labels @@ -8718,7 +8881,7 @@ -

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

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

@@ -8780,7 +8943,7 @@ -

This element is modelled on an element in the Text Encoding Initiative (TEI) standard.

+

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. @@ -8876,8 +9039,8 @@ -

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

+

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. @@ -8889,7 +9052,7 @@ -

This element is modelled on an element in the Text Encoding Initiative (TEI) standard.

+

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 source or sources from which it was derived as well as applications used in the encoding/editing process. @@ -8906,7 +9069,7 @@ -

This element is modelled on an element in the Text Encoding Initiative (TEI) standard.

+

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. @@ -8916,8 +9079,7 @@ -

This element is modelled on an element in the Encoded Archival Description (EAD) - standard.

+

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

extended metadataProvides a container element for non-MEI metadata formats. @@ -8947,8 +9109,8 @@

Extent in this context represents file size.

-

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

+

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. @@ -8993,7 +9155,7 @@ thick, etc. may be described within the content of the hand element.

-

This element is modelled on an element in the Text Encoding Initiative (TEI) standard.

+

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

Container for one or more hand elements. @@ -9001,7 +9163,7 @@ - + When labels are used, @@ -9009,7 +9171,7 @@ -

This element is modelled on an element in the Text Encoding Initiative (TEI) standard.

+

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. @@ -9018,7 +9180,7 @@ - + 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. @@ -9036,7 +9198,7 @@ - + incipCode must have a form or mimetype @@ -9053,7 +9215,7 @@ Plaine & Easie Code. - Humdrum Kern format. + **kern representation of the Humdrum format. Parsons code. @@ -9084,24 +9246,20 @@ - + -

This element is modelled on an element in the Text Encoding Initiative (TEI) standard.

+

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. + - - 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.

@@ -9119,8 +9277,8 @@ of the authorizing list may be encoded in the auth attribute and the auth.uri attribute, respectively.

-

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

+

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. @@ -9130,7 +9288,7 @@ -

This element is modelled on an element in the Text Encoding Initiative (TEI) standard.

+

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. @@ -9226,7 +9384,7 @@ -

This element is modelled on an element in the Text Encoding Initiative (TEI) standard.

+

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. @@ -9239,8 +9397,8 @@ -

This element is modelled on an element in the Text Encoding Initiative (TEI) standard.

-
(notes statement)– Collects any notes providing information about a text additional to +

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

+
notes statementCollects any notes providing information about a text additional to that recorded in other parts of the bibliographic description. @@ -9248,7 +9406,7 @@ -

This element is modelled on an element in the Text Encoding Initiative (TEI) standard.

+

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. @@ -9360,34 +9518,24 @@ + - - Indicates the number of performers. - - - - - Marks this instrument or vocal part as a soloist. Do not use this attribute for a solo - instrument which is not accompanied. - - - - Several instrumental or vocal resources treated as a group. + +

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.

+
performance resources listSeveral instrumental or vocal resources treated as a group. + - - Indicates the number of performers. - - - - +

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 @@ -9404,8 +9552,7 @@ transcribed as part of the front or back matter; i.e., when they are considered to be meta-data rather than a transcription.

-

This element is modelled on an element in the Encoded Archival Description (EAD) - standard.

+

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. @@ -9419,9 +9566,8 @@

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

-

This element is modelled on elements in the Encoded Archival Description (EAD) standard. It - has the same function as the material element in the Text Encoding Initiative (TEI) - standard.

+

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. @@ -9480,7 +9626,7 @@ -

This element is modelled on an element in the Text Encoding Initiative (TEI) standard.

+

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. @@ -9489,8 +9635,8 @@ -

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

+

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 distribution of a bibliographic item, including the publisher’s name and address, the date of publication, and other relevant details. @@ -9502,7 +9648,7 @@

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

-

This element is modelled on an element in the Text Encoding Initiative (TEI) standard.

+

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. @@ -9514,7 +9660,7 @@

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

-

This element is modelled on an element in the Text Encoding Initiative (TEI) standard.

+

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. @@ -9526,7 +9672,7 @@ -

This element is modelled on an element in the Text Encoding Initiative (TEI) standard.

+

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.). @@ -9547,7 +9693,7 @@ -

This element is modelled on an element in the Text Encoding Initiative (TEI) standard.

+

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. @@ -9562,7 +9708,7 @@ series, but not describe each component. The seriesStmt element is provided within seriesStmt for the description of a sub-series.

-

This element is modelled on an element in the Text Encoding Initiative (TEI) standard.

+

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.). @@ -9613,8 +9759,8 @@

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

-

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

+

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. @@ -9644,7 +9790,7 @@ -

This element is modelled on an element in the Text Encoding Initiative (TEI) standard.

+

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. @@ -9661,14 +9807,14 @@ -

This element is modelled on an element in the Text Encoding Initiative (TEI) standard.

+

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. - + @context attribute should @@ -9697,7 +9843,7 @@ -

This element is modelled on an element in the Text Encoding Initiative (TEI) standard.

+

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. @@ -9714,7 +9860,7 @@ - + When labels are used, @@ -9732,7 +9878,7 @@ -

This element is modelled on an element in the Text Encoding Initiative (TEI) standard.

+

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). @@ -9766,8 +9912,7 @@

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.

-

This element is modelled on an element in the Encoded Archival Description (EAD) - standard.

+

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. @@ -9777,13 +9922,13 @@ -

This element is modelled on an element in the Encoded Archival Description (EAD) - standard.

+

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. + @@ -9806,8 +9951,7 @@ the accessRestrict element, which holds information about conditions affecting the availability of the material.

-

This element is modelled on an element in the Encoded Archival Description (EAD) - standard.

+

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. @@ -9821,7 +9965,7 @@

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

-

This element is modelled on an element in the Text Encoding Initiative (TEI) standard.

+

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 — specifically its history, language use, and high-level musical attributes (e.g., key, tempo, meter, medium of performance, and intended duration). @@ -10087,7 +10231,7 @@
Attribute that expresses duration for a given mensural note symbol. - + @@ -10096,7 +10240,7 @@ - + @@ -10145,7 +10289,7 @@ Shared attributes in the mensural repertoire. - + @@ -10205,28 +10349,8 @@ - - Analytical 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. Logical domain attributes that describe the properties of a plica in the mensural repertoire. - - Visual domain attributes that describe the properties of a plica stem in the mensural repertoire. - - - Describes the direction of a stem. - - - - - - Encodes the stem length. - - - - - Logical domain attributes. These attributes describe augmentation or diminution of the normal value of the notes in mensural notation as a ratio. @@ -10270,58 +10394,8 @@ - - Analytical 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. Logical 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. - - - - - - - - - Records the position of the stem in relation to the note head(s). - - - - - - Encodes the stem length. - - - - - - Encodes the form of the stem using the values provided by the data.STEMFORM.mensural datatype. - - - - - - Describes the direction of a stem. - - - - - - Records the position of the flag using the values provided by the data.FLAGPOS.mensural datatype. - - - - - - Encodes the form of the flag using the values provided by the data.FLAGFORM.mensural datatype. - - - - - Attributes that describe the properties of stemmed features specific to mensural repertoires. @@ -10343,11 +10417,6 @@ - - Groups elements that may appear as part of a section in the mensural repertoire. - - - Groups elements that may appear in the declaration of staff features. @@ -10398,7 +10467,7 @@ - + Only one plica is allowed. @@ -10429,7 +10498,7 @@ - + A note with nested stem elements must not have @stem.* attributes. @@ -10480,7 +10549,7 @@ - + @instr attribute @@ -10498,8 +10567,8 @@ - - + + Logical domain attributes. @@ -10510,7 +10579,7 @@ Attributes that record MIDI instrument information. - + Only one of @midi.instrname and @midi.instrnum @@ -10518,7 +10587,7 @@ - + Only one of @midi.patchname and @midi.patchnum @@ -10571,6 +10640,7 @@ Attributes that record MIDI numbers. + number MIDI number in the range set by data.MIDIVALUE. @@ -10689,7 +10759,13 @@

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

instrument definitionMIDI instrument declaration. - + + + + + + + @@ -10790,7 +10866,7 @@ Attributes that express the relationship between a component and its host. - + @@ -10814,6 +10890,18 @@ +
+ Attributes that describe foliation schemes. + + + 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. + + + + + Groups elements that may appear inline when the msdesc module is active. @@ -10828,7 +10916,7 @@ -

This element is modelled on an element in the Text Encoding Initiative (TEI) standard.

+

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. @@ -10838,22 +10926,19 @@ -

This element is modelled on an element in the Text Encoding Initiative (TEI) standard.

+

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. + - - - - - -

This element is modelled on an element in the Text Encoding Initiative (TEI) standard.

+ +

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. @@ -10863,7 +10948,7 @@ -

This element is modelled on an element in the Text Encoding Initiative (TEI) standard.

+

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. @@ -10873,8 +10958,15 @@ - -

This element is modelled on an element in the Text Encoding Initiative (TEI) standard.

+ + + + The catchwords element may only appear as a + descendant of the physDesc element. + + + +

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. @@ -10883,7 +10975,7 @@ -

This element is modelled on an element in the Text Encoding Initiative (TEI) standard.

+

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. @@ -10894,7 +10986,7 @@ -

This element is modelled on an element in the Text Encoding Initiative (TEI) standard.

+

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. @@ -10903,7 +10995,7 @@ -

This element is modelled on an element in the Text Encoding Initiative (TEI) standard.

+

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. @@ -10912,7 +11004,7 @@ -

This element is modelled on an element in the Text Encoding Initiative (TEI) standard.

+

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. @@ -10923,7 +11015,7 @@ -

This element is modelled on an element in the Text Encoding Initiative (TEI) standard.

+

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. @@ -10932,7 +11024,7 @@ -

This element is modelled on an element in the Text Encoding Initiative (TEI) standard.

+

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. @@ -10944,7 +11036,7 @@ -

This element is modelled on an element in the Text Encoding Initiative (TEI) standard.

+

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. @@ -11002,7 +11094,7 @@ supplied.

-

This element is modelled on an element in the Text Encoding Initiative (TEI) standard.

+

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

layout descriptionCollects layout descriptions. @@ -11011,23 +11103,17 @@ -

This element is modelled on an element in the Text Encoding Initiative (TEI) standard.

+

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. - - - - + Specifies the starting point of the location in a normalized form. @@ -11038,24 +11124,26 @@ -

This element is modelled on an element in the Text Encoding Initiative (TEI) standard.

+

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. - - - - -

This element is modelled on an element in the Text Encoding Initiative (TEI) standard.

+ + + + The locusGrp element may only appear as a descendant of a physDesc element, a + contentItem element, or a source element that is a component of another source or + work. + + + +

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, @@ -11073,11 +11161,11 @@ Signals beginning of a text division. - Makrs the end of a text division. + Marks the end of a text division. -

This element is modelled on an element in the Text Encoding Initiative (TEI) standard.

+

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. @@ -11087,7 +11175,7 @@ -

This element is modelled on an element in the Text Encoding Initiative (TEI) standard.

+

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. @@ -11096,20 +11184,17 @@ -

This element is modelled on an element in the Text Encoding Initiative (TEI) standard.

+

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

A single seal or similar attachment. + - - - - - -

This element is modelled on an element in the Text Encoding Initiative (TEI) standard.

+ +

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. @@ -11119,7 +11204,7 @@ -

This element is modelled on an element in the Text Encoding Initiative (TEI) standard.

+

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. @@ -11130,8 +11215,15 @@ - -

This element is modelled on an element in the Text Encoding Initiative (TEI) standard.

+ + + + The secFolio element may only appear as a + descendant of the physDesc element. + + + +

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. @@ -11140,8 +11232,15 @@ - -

This element is modelled on an element in the Text Encoding Initiative (TEI) standard.

+ + + + The signatures element may only appear as a + descendant of the physDesc element. + + + +

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. @@ -11154,7 +11253,7 @@ -

This element is modelled on an element in the Text Encoding Initiative (TEI) standard.

+

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. @@ -11163,7 +11262,7 @@ -

This element is modelled on an element in the Text Encoding Initiative (TEI) standard.

+

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. @@ -11190,7 +11289,7 @@ -

This element is modelled on an element in the Text Encoding Initiative (TEI) standard.

+

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. @@ -11200,7 +11299,7 @@ -

This element is modelled on an element in the Text Encoding Initiative (TEI) standard.

+

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. @@ -11209,7 +11308,7 @@ -

This element is modelled on an element in the Text Encoding Initiative (TEI) standard.

+

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. @@ -11256,7 +11355,7 @@ -

This element is modelled on an element in the Text Encoding Initiative (TEI) standard.

+

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. @@ -11269,7 +11368,7 @@ -

This element is modelled on an element in the Text Encoding Initiative (TEI) standard.

+

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. @@ -11289,8 +11388,7 @@ sub-elements. The name of the list from which a controlled value is taken may be recorded using the auth attribute.

-

This element is modelled on an element in the Encoded Archival Description (EAD) - standard.

+

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. @@ -11304,7 +11402,7 @@ -

This element is modelled on an element in the Text Encoding Initiative (TEI) standard.

+

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. @@ -11317,7 +11415,7 @@ -

This element is modelled on an element in the Text Encoding Initiative (TEI) standard.

+

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. @@ -11340,7 +11438,7 @@ -

This element is modelled on an element in the Text Encoding Initiative (TEI) standard.

+

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. @@ -11353,7 +11451,7 @@ -

This element is modelled on an element in the Text Encoding Initiative (TEI) standard.

+

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. @@ -11366,7 +11464,7 @@ -

This element is modelled on an element in the Text Encoding Initiative (TEI) standard.

+

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. @@ -11387,8 +11485,7 @@ Thesaurus of Geographic Names (TGN), may be recorded using the auth attribute.

-

This element is modelled on an element in the Encoded Archival Description (EAD) - standard.

+

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. @@ -11401,7 +11498,7 @@ -

This element is modelled on an element in the Text Encoding Initiative (TEI) standard.

+

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'. @@ -11433,9 +11530,8 @@ 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.

-

This element is modelled on an element in the Encoded Archival Description (EAD) - standard.

-
(postal box or post office box) contains a number or other identifier for some postal +

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

+
postal box or post office boxContains a number or other identifier for some postal delivery point other than a street address. @@ -11444,8 +11540,8 @@ -

This element is modelled on an element in the Text Encoding Initiative (TEI) standard.

-
(postal code) contains a numerical or alphanumeric code used as part of a postal address +

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

+
postal codeContains a numerical or alphanumeric code used as part of a postal address to simplify sorting or delivery of mail. @@ -11454,7 +11550,7 @@ -

This element is modelled on an element in the Text Encoding Initiative (TEI) standard.

+

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. @@ -11467,7 +11563,7 @@ -

This element is modelled on an element in the Text Encoding Initiative (TEI) standard.

+

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. @@ -11480,7 +11576,7 @@ -

This element is modelled on an element in the Text Encoding Initiative (TEI) standard.

+

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. @@ -11493,7 +11589,7 @@ -

This element is modelled on an element in the Text Encoding Initiative (TEI) standard.

+

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. @@ -11503,7 +11599,7 @@ -

This element is modelled on an element in the Text Encoding Initiative (TEI) standard.

+

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'. @@ -11521,7 +11617,25 @@ attribute.

Items in the Neume repertoire that may be printed near a staff. - + + Logical domain attributes. + + + Identifies the different kinds of division. + + + + + + + + + + + + + + Logical domain attributes. @@ -11566,6 +11680,7 @@ + pitch name Contains a written pitch name. @@ -11576,6 +11691,9 @@ Attributes that record visual details of neume notation. + + + @@ -11598,17 +11716,6 @@ - - Records direction of curvature. - - - Anti-clockwise curvature. - - - Clockwise curvature. - - - Pen stroke has an extension; specific to Hispanic notation. @@ -11666,6 +11773,39 @@ + + Attributes that specify the type of neumes. + + + Designation which characterizes the element in some sense, using any convenient + classification scheme or typology that employs single-token labels. + + + + + + + + + + + + + + + + + + + + + + + + + + + Logical domain attributes. @@ -11705,16 +11845,6 @@ Groups elements that modify neume-like features. Groups elements that may occur within a neume. - - Groups elements that may appear as part of a section in the neume repertoire. - - - - - Groups elements that are components of a staff in the neume repertoire. - - - Groups elements that accommodate neumed text. @@ -11764,37 +11894,7 @@ - - Designation which characterizes the element in some sense, using any convenient - classification scheme or typology that employs single-token labels. - - - - - - - - - - - - - - - - - - - - - - - - - - - - Collection of one or more neume components. + neume component groupCollection of one or more neume components. @@ -11819,37 +11919,7 @@ - - Designation which characterizes the element in some sense, using any convenient - classification scheme or typology that employs single-token labels. - - - - - - - - - - - - - - - - - - - - - - - - - - - - Oriscus. + Oriscus. @@ -11899,6 +11969,7 @@ + @@ -11910,22 +11981,9 @@ - - Identifies the different kinds of division. - - - - - - - - - - - - + Temporal alignment attributes. - + @when attribute should @@ -11954,7 +12012,7 @@ - + An avFile child of clip cannot have @@ -11974,7 +12032,7 @@ - + When @begin or @end @@ -12004,7 +12062,7 @@ - + When @begin or @end is used, @betype should be @@ -12019,8 +12077,8 @@ - - + + @since must be present when @interval is used. @@ -12036,7 +12094,7 @@ be 'time'. - + When @absolute is @@ -12080,7 +12138,7 @@ - + @since attribute @@ -12094,7 +12152,7 @@

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

-

This element is modelled on an element in the Text Encoding Initiative (TEI) standard.

+

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. @@ -12114,8 +12172,8 @@

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

-

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

+

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. @@ -12131,8 +12189,8 @@

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

-

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

+

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. @@ -12247,35 +12305,16 @@ -
- Analytical domain attributes. - - - - - Gestural domain attributes. Logical domain attributes. - - Visual domain attributes. Logical domain attributes. - + - - Analytical domain attributes. - - Gestural domain attributes. - - Visual domain attributes. - - - - 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, @@ -12288,8 +12327,8 @@ - - + + Logical domain attributes. @@ -12315,7 +12354,7 @@ - + @@ -12323,7 +12362,7 @@ - + @target attribute @@ -12358,7 +12397,7 @@ - + An element with a dots attribute must also have a dur @@ -12414,7 +12453,7 @@ Attributes that capture the placement of bar lines. - States the length of barlines in virtual units. The value must be greater than 0 and + 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. @@ -12431,7 +12470,7 @@ - + "mensur" not allowed in this @@ -12495,7 +12534,7 @@ - + Attributes that indicate the calendar system of a date or other datable element. @@ -12533,7 +12572,7 @@ - + @@ -12546,7 +12585,7 @@ - + The value in @class must either correspond to the @xml:id attribute of a category @@ -12576,7 +12615,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 @@ -12620,7 +12659,7 @@ Logical domain attributes. Attributes that record the shape of a clef. - + When @shape is present, @line must also be @@ -12671,6 +12710,15 @@ + + Attributes specifying whether a feature is contemporary or historical. + + + + + + + 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 @@ -12682,25 +12730,16 @@ - - + + This attribute class records the position of a feature within a two-dimensional coordinate system. + + + - - Indicates the upper-left corner x coordinate. - - - - - - Indicates the upper-left corner y coordinate. - - - - Indicates the lower-right corner x coordinate. @@ -12728,6 +12767,23 @@ + + This attribute class records the upper left position of a feature within a two-dimensional coordinate + system. + + + Indicates the upper-left corner x coordinate. + + + + + + Indicates the upper-left corner y coordinate. + + + + + Attributes that describe "cue-ness". @@ -12774,22 +12830,6 @@ - - Attributes that record the visual rendition of curves. - - - Describes the line style of a curve. - - - - - - Width of a curved line. - - - - - Logical domain attributes. @@ -12803,7 +12843,7 @@ - + @target attribute @@ -12857,7 +12897,7 @@ - + @data attribute should @@ -12885,7 +12925,7 @@ - + @decls attribute @@ -12911,11 +12951,17 @@ - + Attributes that describe distance from the staff. + + Records the default distance from the staff for directives. + + + + Records the default distance from the staff for dynamic marks. @@ -12929,8 +12975,14 @@ - - Determines how far from the staff to render text elements. + + Records the default distance from the staff for rehearsal marks. + + + + + + Records the default distance from the staff for tempo marks. @@ -12958,6 +13010,7 @@ 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 space-separated values that add up to the total duration may be used. @@ -12990,10 +13043,11 @@ - + Attributes that express duration in musical terms. + duration Records the duration of a feature using the relative durational values provided by the data.DURATION datatype. @@ -13005,6 +13059,7 @@ Attributes that describe duration as a ratio. + number Along with numbase, describes duration as a ratio. num is the first value in the ratio, while numbase is the second. @@ -13025,7 +13080,7 @@ - + Attributes that capture characters used to enclose symbols having a cautionary or @@ -13069,8 +13124,8 @@ - - + + Attributes describing the support for and the certainty of an assertion. @@ -13128,7 +13183,7 @@ - + The @unit attribute is @@ -13165,6 +13220,16 @@ + + Attributes that record the function (i.e., placement) of forme work elements. + + + Records the function (i.e., placement) of a page header or footer. + + + + + Logical domain attributes. @@ -13187,7 +13252,7 @@ - + @hand attribute should @@ -13256,7 +13321,7 @@ - + @join attribute should @@ -13275,6 +13340,16 @@ + + Attributes for describing key mode. + + + Indicates major, minor, or other tonality. + + + + + Logical domain attributes. @@ -13294,7 +13369,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. @@ -13365,7 +13440,7 @@ - + @def attribute should @@ -13415,6 +13490,7 @@ + line end symbol Symbol rendered at end of line. @@ -13427,6 +13503,7 @@ + line start symbol Symbol rendered at start of line. @@ -13440,16 +13517,22 @@ - Attributes that record the basic visual rendition of lines. - - - Describes the line style of a line. - - - - + Attributes that record the basic visual rendition of lines. + - + + Describes the style of a line. + + + + + + Width of a line. + + + + + Describes the number of segments into which a dashed or dotted line may be divided, or the number of "peaks" of a wavy line; a pair of space-separated values (minimum and maximum, respectively) provides a range between which a rendering system-supplied value @@ -13460,7 +13543,7 @@ 2 - + @lform attribute @@ -13469,12 +13552,6 @@ - - Width of a line. - - - - @@ -13779,30 +13856,28 @@ - - Attributes that record the version of MEI in use. - - - Specifies a generic MEI version label. - 5.0.0-dev - - - Development version of MEI 5.0.0 - - - - - + Attributes that record the version of MEI in use.Specifies a generic MEI version label.5.0 + MEI 5.0 + Logical domain attributes. + + + Level of duration at which the proportion given by the @num and @numbase ratio applies. + + + + + 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 meter. @@ -13823,6 +13898,7 @@ meter. + meter conformance Indicates the relationship between the content of a measure and the prevailing meter. @@ -13833,7 +13909,7 @@ Indicates whether or not a bar line is "controlling"; that is, if it indicates a 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 + measure, this attribute indicates the nature of the right bar line but not the left. @@ -13854,6 +13930,7 @@ + symbol Indicates the use of a meter symbol instead of a numeric meter signature, that is, 'C' for common time or 'C' with a slash for cut time. @@ -13949,7 +14026,7 @@ - + @nymref attribute @@ -14017,7 +14094,7 @@ - + @@ -14033,7 +14110,7 @@ - + @head.altsym attribute @@ -14050,7 +14127,7 @@ - + When @@ -14102,7 +14179,7 @@ - + SMuFL version 1.18 uses the range U+E000 - U+ECBF. @@ -14122,6 +14199,7 @@ Attributes that record written octave. + octave Captures written octave information. @@ -14216,7 +14294,7 @@ - + Attributes that identify a musical range in terms of musical time. @@ -14233,7 +14311,7 @@ - + When @origin.tstamp2 is used @origin.tstamp must @@ -14250,7 +14328,7 @@ - + Logical domain attributes. @@ -14276,24 +14354,28 @@ + page top margin Indicates the amount of whitespace at the top of a page. + page bottom margin Indicates the amount of whitespace at the bottom of a page. + page left margin Indicates the amount of whitespace at the left side of a page. + page right margin Indicates the amount of whitespace at the right side of a page. @@ -14365,12 +14447,13 @@ - + Attributes that record written pitch name. + pitch name Contains a written pitch name. @@ -14426,7 +14509,7 @@ - + @plist attribute @@ -14560,7 +14643,7 @@ - + The attributes @min and @max are required when @@ -14570,6 +14653,36 @@ + + 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 creation, transcription, editing, or encoding. @@ -14581,7 +14694,7 @@ - + @resp attribute should @@ -14598,11 +14711,11 @@ - + - + Attributes that express duration of rests in musical terms. @@ -14707,8 +14820,9 @@ Logical domain attributes. - + + Attributes that capture notation spacing information. @@ -14754,7 +14868,7 @@ - + @def attribute should @@ -14888,7 +15002,7 @@ - + @endid attribute @@ -14910,7 +15024,7 @@ - + @startid attribute @@ -14963,7 +15077,7 @@ - + @@ -15130,7 +15244,7 @@ - + @@ -15167,6 +15281,7 @@ + rendition Captures the appearance of the element’s contents using MEI-defined descriptors. @@ -15224,11 +15339,12 @@ - + 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], as expressed in the written time signature. @@ -15236,7 +15352,7 @@ - + Attributes that record a time stamp for the end of an event in terms of musical time. @@ -15252,6 +15368,7 @@ Attributes that describe transposition. + transposition (diatonic) Records the amount of diatonic pitch shift, e.g., C to C♯ = 0, C to D♭ = 1, necessary to calculate the sounded pitch from the written one. @@ -15259,6 +15376,7 @@ + transposition (semitones) Records the amount of pitch shift in semitones, e.g., C to C♯ = 1, C to D♭ = 1, necessary to calculate the sounded pitch from the written one. @@ -15546,7 +15664,7 @@ 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 - be turned off locally by setting the xml:space attribute to the value "default". + be turned off locally by setting the xml:space attribute to the value default. Allows the application to handle white space as necessary. Not including an @@ -15571,7 +15689,7 @@

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 + printing systems that utilize this information for printing. On barLine the width attribute captures the width of the preceding measure.

@@ -15765,8 +15883,7 @@ Groups elements that modify note-like features. - - + Groups elements that denote a number or a quantity. @@ -15831,12 +15948,6 @@ 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 in the mensural and neumes - repertoires. - - - Groups elements that represent a segment of music notation. @@ -15916,6 +16027,7 @@ + @@ -15933,7 +16045,7 @@ -

This element is modelled on an element in the Text Encoding Initiative (TEI) standard.

+

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. @@ -15943,8 +16055,8 @@ -

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

+

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. @@ -15955,8 +16067,8 @@

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

-

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

+

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. @@ -16008,7 +16120,7 @@ - + The @data attribute may only occur on an @@ -16066,8 +16178,8 @@ -

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

+

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. @@ -16085,7 +16197,7 @@

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 + 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. @@ -16103,8 +16215,8 @@ 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.

-

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

+

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. @@ -16114,7 +16226,7 @@ - + When labels are used, @@ -16122,7 +16234,7 @@ -

This element is modelled on an element in the Text Encoding Initiative (TEI) standard.

+

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. @@ -16144,7 +16256,7 @@

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

-

This element is modelled on an element in the Text Encoding Initiative (TEI) standard.

+

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. @@ -16182,7 +16294,7 @@ - + Must have one of the @@ -16217,7 +16329,7 @@ -

This element is modelled on an element in the Text Encoding Initiative (TEI) standard.

+

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. @@ -16227,7 +16339,7 @@ -

This element is modelled on an element in the Text Encoding Initiative (TEI) standard.

+

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. @@ -16238,7 +16350,7 @@ -

This element is modelled on an element in the Text Encoding Initiative (TEI) standard.

+

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. @@ -16257,7 +16369,7 @@ - + @@ -16270,7 +16382,7 @@ -

This element is modelled on an element in the Text Encoding Initiative (TEI) standard.

+

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*. @@ -16296,7 +16408,7 @@ - + @@ -16304,7 +16416,7 @@ staff.
-
+ @@ -16363,7 +16475,7 @@ - + The value of @role must not contain the name of another element available in this @@ -16392,7 +16504,7 @@ -

This element is modelled on an element in the Text Encoding Initiative (TEI).

+

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". @@ -16421,8 +16533,8 @@ -

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

+

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. @@ -16431,7 +16543,7 @@ - + The dedicatee element may not be @@ -16457,7 +16569,7 @@ -

This element is modelled on an element in the Text Encoding Initiative (TEI) standard.

+

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

dimensionAny single dimensional specification. @@ -16525,7 +16637,7 @@ - + The depth element may only appear @@ -16541,12 +16653,11 @@ 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.

-

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 — 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. +

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, 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. @@ -16557,7 +16668,7 @@ - + Must have one of the @@ -16583,7 +16694,7 @@ -

This element is modelled on an element in the Text Encoding Initiative (TEI) standard.

+

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. @@ -16654,8 +16765,8 @@ -

Often, the head sub-element identifies the div’s purpose. This element is modelled on an element in the Text Encoding Initiative - (TEI) standard.

+

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. @@ -16682,14 +16793,14 @@ - + Must have one of the attributes: startid, tstamp, tstamp.ges or tstamp.real. - + When @val2 is present, either @@ -16718,8 +16829,8 @@ -

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

+

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. @@ -16731,7 +16842,7 @@ -

This element is modelled on an element in the Text Encoding Initiative (TEI) standard.

+

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. @@ -16812,8 +16923,19 @@

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

-

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

+

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

+
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. @@ -16826,7 +16948,7 @@ -

This element is modelled on an element in the Text Encoding Initiative (TEI) standard.

+

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. @@ -16850,7 +16972,7 @@

Because its model contains the music element, each of the subordinate MEI documents can have its own front and back matter.

-

This element is modelled on an element in the Text Encoding Initiative (TEI) standard.

+

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. @@ -16861,14 +16983,14 @@ - + In scoreDef, grpSym must have startid, endid, and level attributes. - + In staffGrp, grpSym must not have @@ -16892,8 +17014,8 @@

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

-

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

+

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. @@ -16924,8 +17046,7 @@ -

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

+

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. @@ -16956,7 +17077,7 @@ - + One of the following is required: @x and @@ -16988,7 +17109,7 @@ - + If the @oct attribute @@ -16996,7 +17117,7 @@ elements. - + Only keyAccid elements are allowed @@ -17013,7 +17134,7 @@ -

This element is modelled on an element in the Text Encoding Initiative (TEI) standard.

+

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 @@ -17041,7 +17162,7 @@ - +

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 @@ -17082,13 +17203,14 @@ attribute. Do not confuse this element with the sb element, which performs a similar function for musical notation.

-

This element is modelled on an element in the Text Encoding Initiative (TEI) standard.

+

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. + @@ -17100,7 +17222,7 @@ -

This element is modelled on an element in the Text Encoding Initiative (TEI) standard.

+

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. @@ -17149,7 +17271,7 @@ - + The values in @staff must correspond to @n attribute of a staffDef @@ -17195,7 +17317,7 @@ - + Recommended practice is to use name elements to capture sub-parts of a generic @@ -17246,8 +17368,7 @@ its electronically-available location may be recorded using the auth and auth.uri attributes.

-

This element is modelled on an element in the Encoded Archival Description (EAD) - standard.

+

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

A single pitched event. @@ -17298,7 +17419,7 @@ - + Must have one of the @@ -17324,8 +17445,8 @@

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.

-

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

+

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. @@ -17384,7 +17505,7 @@ calculated by counting previous pb ancestor elements. When used in a score context, a page beginning implies an accompanying system beginning.

-

This element is modelled on an element in the Text Encoding Initiative (TEI) standard.

+

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. @@ -17396,77 +17517,34 @@

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 on the first page. Also, used to temporarily override a - running footer on individual pages. + page footerA running footer. + + - - Records horizontal alignment of the page footer. - - - - -

This element is used to capture the textual data that often appears on the first page of + +

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, pgHead2, pgFoot, and pgFoot2 elements should *not* be used to encode textual notes/annotations.

-
page footer 2A running footer on the pages following the first. - - - - - - - Records horizontal alignment of the page footer. Use multiple values to capture an - alternating pattern. - - - - -

This element is used to capture the textual data that often appears on the second and - succeeding pages of printed music. It may also be used for similarly formatted material in - manuscripts. Auto-generated page numbers may be indicated with a processing instruction. The - pgHead, pgHead2, pgFoot, and pgFoot2 elements should *not* be used to - encode textual notes/annotations.

-
page headerA running header on the first page. Also, used to temporarily override a - running header on individual pages. + instruction. The pgHead and pgFoot elements should *not* be used to encode textual notes/annotations.

+
page headerA running header. + + - - Records horizontal alignment of the page header. - - - - -

This element is used to capture the textual data that often appears on the first page of + +

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, pgHead2, pgFoot, and pgFoot2 elements should *not* be used to encode textual notes/annotations.

-
page header 2A running header on the pages following the first. - - - - - - - Records horizontal alignment of the page header. Use multiple values to capture an - alternating pattern. - - - - -

This element is used to capture the textual data that often appears at the top of the - second and succeeding pages of printed music. It may also be used for similarly formatted - material in manuscripts. Auto-generated page numbers may be indicated with a processing - instruction. The pgHead, pgHead2, pgFoot, and pgFoot2 elements should not be used to encode textual notes/annotations.

+ 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. @@ -17477,7 +17555,7 @@ - + Must have one of the @@ -17486,7 +17564,7 @@ dur, dur.ges, endid, or tstamp2. - + The visual attributes of the phrase (@bezier, @bulge, @curvedir, @lform, @@ -17522,8 +17600,7 @@ -

This element is modelled on an element in the Encoded Archival Description (EAD) - standard.

+

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. @@ -17534,7 +17611,7 @@ -

This element is modelled on an element in the Text Encoding Initiative (TEI) standard.

+

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. @@ -17545,7 +17622,7 @@ -

This element is modelled on an element in the Text Encoding Initiative (TEI) standard.

+

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. @@ -17583,7 +17660,7 @@ - + @@ -17625,6 +17702,7 @@ italicized, of a text word or phrase. + @@ -17642,7 +17720,9 @@

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

+ 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. @@ -17657,8 +17737,7 @@ sub-elements. The name of the list from which a controlled value is taken may be recorded using the auth attribute.

-

This element is modelled on an element in the Encoded Archival Description (EAD) - standard.

+

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. @@ -17672,7 +17751,7 @@

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

-

This element is modelled on an element in the Text Encoding Initiative (TEI) standard.

+

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, groups, or in rare cases, mechanical processes, responsible for creation, realization, production, funding, or distribution of the intellectual or artistic content. @@ -17684,7 +17763,7 @@ - + At least one element pair (a resp element and a name-like element) is @@ -17693,7 +17772,7 @@ -

This element is modelled on an element in the Text Encoding Initiative (TEI) standard.

+

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. @@ -17704,7 +17783,7 @@ - + @@ -17722,7 +17801,7 @@ -

This element is modelled on an element in the Text Encoding Initiative (TEI) standard.

+

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. @@ -17730,7 +17809,7 @@ -

This element is modelled on an element in the Text Encoding Initiative (TEI) standard.

+

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. @@ -17773,10 +17852,8 @@ - - - - + + @@ -17795,7 +17872,7 @@ - + A @@ -17818,7 +17895,7 @@ -

This element is modelled on an element in the Text Encoding Initiative (TEI) standard.

+

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. @@ -17839,7 +17916,7 @@ -

This element is modelled on an element in the Text Encoding Initiative (TEI) standard.

+

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. @@ -17852,8 +17929,8 @@ -

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

+

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. @@ -17902,7 +17979,7 @@ - + @@ -17933,7 +18010,7 @@ - + @@ -17945,7 +18022,7 @@ permitted.
-
+ @@ -17953,7 +18030,7 @@ current staff.
-
+ @@ -17962,14 +18039,14 @@ exist.
-
+ The clef position must be less than or equal to the number of lines on the staff. - + @@ -17978,7 +18055,7 @@ less than or equal to the number of lines on the staff.
-
+ @@ -17986,7 +18063,7 @@ number of values as there are staff lines.
-
+ @@ -17996,7 +18073,7 @@ lines. - + @@ -18013,7 +18090,7 @@ - + @@ -18024,7 +18101,7 @@ - + @@ -18050,7 +18127,7 @@ - + @@ -18087,7 +18164,7 @@ - + In the symbolDef context, symbol must have @@ -18119,7 +18196,7 @@ - + Only analog, class, label, mm, mm.dots, mm.unit, n, translit, type, xml:base, xml:id, @@ -18127,7 +18204,7 @@ part. - + Must have one of the @@ -18142,7 +18219,7 @@ - + The @data attribute may only occur on a @@ -18158,7 +18235,7 @@ taxonomy, class must contain an absolute URI, which may include the fragment identifier of the element containing the category label.

-

This element is modelled on an element in the Text Encoding Initiative (TEI) standard.

+

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. @@ -18270,7 +18347,7 @@ 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.

-

This element is modelled on an element in the Text Encoding Initiative (TEI) standard.

+

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. @@ -18285,7 +18362,7 @@

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

-

This element is modelled on an element in Encoded Archival Description (EAD) standard.

+

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. @@ -18356,7 +18433,7 @@ -

This element is modelled on an element in the Text Encoding Initiative (TEI) standard.

+

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. @@ -18479,7 +18556,7 @@ -

This element is modelled on elements in the Text Encoding Initiative (TEI) standard.

+

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. @@ -18490,8 +18567,7 @@ -

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

+

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. @@ -18501,7 +18577,7 @@ -

This element is modelled on elements in the Text Encoding Initiative (TEI) standard.

+

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. @@ -18516,8 +18592,7 @@ 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.

-

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

+

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. @@ -18528,7 +18603,7 @@ -

This element is modelled on elements in the Text Encoding Initiative (TEI) standard.

+

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. @@ -18546,7 +18621,7 @@

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

-

This element is modelled on elements in the Text Encoding Initiative (TEI) standard.

+

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

list itemSingle item in a list. @@ -18554,8 +18629,8 @@ -

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

+

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. @@ -18571,7 +18646,7 @@ - + In a list of type "gloss" all items @@ -18627,8 +18702,8 @@ label.

-

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

+

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. @@ -18681,7 +18756,7 @@ 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.

-

This element is modelled on elements found in HTML, TEI, and EAD standards.

+

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. @@ -18696,9 +18771,8 @@

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.

-

This element is modelled on elements found in HTML, TEI, and EAD standards.

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

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 segmentrepresents any segmentation of text below the "text component" level. @@ -18706,7 +18780,7 @@ -

This element is modelled on an element in the Text Encoding Initiative (TEI) standard.

+

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

Attributes supplying pointers to user-defined symbols. @@ -18716,7 +18790,7 @@ - + @altsym attribute @@ -18773,7 +18847,7 @@ - + @@ -18832,7 +18906,7 @@ - + In the symbolDef context, curve must have @@ -18866,7 +18940,7 @@ - + When used in the symbolDef context, must have @@ -18968,6 +19042,8 @@ + + Visual domain attributes. Visual domain attributes. @@ -18978,6 +19054,12 @@ + + Visual domain attributes. + + + + Visual domain attributes. @@ -18995,6 +19077,7 @@ + @@ -19030,18 +19113,6 @@ - - Visual form of the line. - - - - - - Width of the line. - - - - Visual domain attributes. @@ -19050,7 +19121,7 @@ - + @@ -19080,7 +19151,8 @@ - States the length of barlines in virtual units. The value must be greater than 0 and + length + 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. @@ -19188,12 +19260,12 @@ attributes. + + - - Visual domain attributes. @@ -19313,12 +19385,27 @@ + + Attributes describing the direction of curvature. + + + Records direction of curvature. + + + Anti-clockwise curvature. + + + Clockwise curvature. + + + + Visual domain attributes. - + @@ -19487,6 +19574,7 @@ + orientation Combination expressed horizontally, as for brass instruments. @@ -19514,7 +19602,7 @@ - + The number of floating beams must be less @@ -19543,6 +19631,21 @@ + + Visual domain attributes. + + + + + Visual domain attributes + + + Determines whether to display guitar chord grids. + + + + + Visual domain attributes. @@ -19694,10 +19797,10 @@ - - Determines whether cautionary accidentals should be displayed at a key change. + + Determines where cautionary accidentals should be displayed at a key change. - + @@ -19705,14 +19808,14 @@ 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 where 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. @@ -19800,6 +19903,7 @@ + @@ -19809,17 +19913,6 @@ - - Records direction of curvature. - - - Anti-clockwise curvature. - - - Clockwise curvature. - - - Indicates whether curve is closed. @@ -19836,12 +19929,12 @@ beats. + + - - Visual domain attributes. @@ -19957,6 +20050,11 @@ + + Visual domain attributes. + + + Visual domain attributes. @@ -19965,6 +20063,7 @@ + @@ -19991,9 +20090,24 @@ + + Determines whether the meter signature is to be displayed. + + + + Visual domain attributes. + + Visual domain attributes. + + + + + + + Visual domain attributes. @@ -20016,7 +20130,6 @@ - @@ -20055,6 +20168,7 @@ + @@ -20221,6 +20335,24 @@ + + Visual domain attributes that describe the properties of a plica stem in the mensural repertoire. + + + direction + Describes the direction of a stem. + + + + + + length + Encodes the stem length. + + + + + Visual domain attributes. @@ -20276,6 +20408,18 @@ + + Visual domain attributes. + + + + + + + + + + Visual domain attributes. @@ -20384,12 +20528,12 @@ normal position) of the entire rendered slur/phrase mark. + + - - Visual domain attributes. @@ -20425,6 +20569,7 @@ + @@ -20439,12 +20584,6 @@ - - Determines whether to display guitar chord grids. - - - - Indicates the number of layers and their stem directions. @@ -20457,7 +20596,7 @@ -

The value is structured; that is, it should contain a single color value or have +

The value is structured; that is, it should contain a single color value or have the same number of space-separated values as the number of lines indicated by the lines attribute. The first value then applies to the lowest line of the staff.

All values from data.COLOR are allowed.

@@ -20487,6 +20626,7 @@ + bar lines through Indicates whether bar lines go across the space between staves (true) or are only drawn across the lines of each staff (false). @@ -20507,6 +20647,55 @@ +
+ 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). + + + + + + length + Encodes the stem length. + + + + + + Encodes the form of the stem using the values provided by the data.STEMFORM.mensural datatype. + + + + + + direction + Describes the direction of a stem. + + + + + + Records the position of the flag using the values provided by the data.FLAGPOS.mensural datatype. + + + + + + Encodes the form of the flag using the values provided by the data.FLAGFORM.mensural datatype. + + + + + Visual domain attributes. @@ -20547,6 +20736,7 @@ Visual domain attributes. + @@ -20563,12 +20753,12 @@ beats. + + - - Visual domain attributes. @@ -20660,7 +20850,7 @@ - +
diff --git a/libmei/mei/develop/mei-basic_compiled.odd b/libmei/mei/mei-basic_compiled.odd similarity index 63% rename from libmei/mei/develop/mei-basic_compiled.odd rename to libmei/mei/mei-basic_compiled.odd index 177f498fcb9..b1b8931f0d0 100644 --- a/libmei/mei/develop/mei-basic_compiled.odd +++ b/libmei/mei/mei-basic_compiled.odd @@ -1,4 +1,4 @@ - + @@ -7,13 +7,24 @@ Authored by Johannes Kepper + + Revisions + Laurent Pugin + + + Revisions + Klaus Rettinghaus + In collaboration with The MEI Community -

+ Music Encoding Initiative (MEI) Board + + Licensed under the Educational Community License version 2.0 +

@@ -26,11 +37,17 @@ Revisions following the discussions on GitHub, and at the Nashville Hackathon. + + Revisions at the MEI Developers Conference, Charlottesville. + + + Fixing color attribute and cleanup attribute class references. + - + Written accidental values. @@ -105,6 +122,18 @@ Natural note lowered by quarter tone (natural modified by arrow). + + Double sharp note raised by quarter tone (double sharp modified by arrow). + + + Double sharp note lowered by quarter tone (double sharp modified by arrow). + + + Double flat note raised by quarter tone (double flat modified by arrow). + + + Double flat note lowered by quarter tone (double flat modified by arrow). + 1/4-tone flat accidental. @@ -215,6 +244,12 @@ Three quarter-tones flat. + + Five quarter-tones sharp. + + + Five quarter-tones flat. + @@ -250,6 +285,12 @@ Spiccato. + + Stress (Unicode 00B4). + + + Unstress (Unicode 02D8). + Main note followed by short slide to higher, indeterminate pitch (Unicode 1D185). @@ -338,7 +379,7 @@ - + "" contains a deprecated value. @@ -450,6 +491,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. @@ -465,7 +524,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 +540,29 @@ + +

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. + + + + White keys. + + + Black keys. + + + Mixed black and white keys. + + + Confidence is expressed as a real number between 0 and 1; 0 representing certainly false and 1 representing certainly true. @@ -1298,64 +1380,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. @@ -1570,97 +1594,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. @@ -1728,9 +1661,6 @@ Meter signature rendered using both the symbol and the traditional numeric values. - - Meter signature not rendered. - @@ -1748,4101 +1678,3726 @@ - - Generic MIDI value. 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-9][0-9]|1([0-1][0-9]|2[0-7]))o?|128o + 0|([1-9]|1[0-5])o?|16o - - Modes. + + 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 + - - Common modes. + + 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*. - - - Major mode. - - - Minor mode. - - + - - Gregorian modes. + + General MIDI instrument names. - - Dorian mode (the first mode). + + Acoustic Grand Piano, Program #0. - - Hypodorian mode (the second mode). + + Bright Acoustic Piano, Program #1. - - Phrygian mode (the third mode). + + Electric Grand Piano, Program #2. - - Hypophrygian mode (the fourth mode). + + Honky-tonk Piano, Program #3. - - Hypolydian mode (the fifth mode). + + Electric Piano 1, Program #4. - - Lydian mode (the sixth mode). + + Electric Piano 2, Program #5. - - Mixolydian mode (the seventh mode). + + Harpsichord, Program #6. - - Hypomixolydian mode (the eighth mode). + + Clavi, Program #7. - - Tonus peregrinus (the ninth mode). + + Celesta, Program #8. - - - - Modern modes. - - - - Ionian mode. + + Glockenspiel, Program #9. - - Hypoionian mode. + + Music Box, Program #10. - - Aeolian mode. + + Vibraphone, Program #11. - - Hypoaeolian mode. + + Marimba, Program #12. - - Locrian mode. + + Xylophone, Program #13. - - Hypolocrian mode. + + Tubular Bells, Program #14. - - - - Bibliographic relationship values based on MODS version 3.4. - - - - Temporal predecessor of the resource. + + Dulcimer, Program #15. - - Temporal successor to the resource. + + Drawbar Organ, Program #16. - - Original form of the resource. + + Percussive Organ, Program #17. - - Parent containing the resource. + + Rock Organ, Program #18. - - Intellectual or physical component of the resource. + + Church Organ, Program #19. - - Version of the resource’s intellectual content not changed enough to be a different - work. + + Reed Organ, Program #20. - - Version of the resource in a different physical format. + + Accordion, Program #21. - - Published bibliographic description, review, abstract, or index of the resource's - content. + + Harmonica, Program #22. - - Cited or referred to in the resource. + + Tango Accordion, Program #23. - - - - "Convenience" datatype that permits combining enumerated values with a user-supplied - name. - - - - - "Convenience" datatype that permits combining enumerated values with user-supplied - values. - - - - - Non-staff location. - - - - At the foot of the page. + + Acoustic Guitar (nylon), Program #24. - - At the top of the page. + + Acoustic Guitar (steel), Program #25. - - At the left of the page. + + Electric Guitar (jazz), Program #26. - - At the right of the page. + + Electric Guitar (clean), Program #27. - - On the opposite, i.e., facing, page. + + Electric Guitar (muted), Program #28. - - On the other side of the leaf. + + Overdriven Guitar, Program #29. - - At the end of this division; e.g., chapter, volume, etc. + + Distortion Guitar, Program #30. - - Within a line text; i.e., an insertion. + + Guitar harmonics, Program #31. - - Between the lines of text, less exact than "sub" or "super". + + Acoustic Bass, Program #32. - - Above a line of text, more exact than "intra(linear)". Do not confuse with - superscript rendition. + + Electric Bass (finger), Program #33. - - Below a line of text, more exact than "intra(linear)". Do not confuse with subscript - rendition. + + Electric Bass (pick), Program #34. - - In a predefined space; i.e., that left by an earlier scribe. + + Fretless Bass, Program #35. - - Obscures original text; e.g., via overstrike, addition of new writing surface - material, etc. + + Slap Bass 1, Program #36. - - - - Enumerated note head modifier values. - - - - Slash (upper right to lower left). + + Slap Bass 2, Program #37. - - Backslash (upper left to lower right). + + Synth Bass 1, Program #38. - - Vertical line. + + Synth Bass 2, Program #39. - - Horizontal line. + + Violin, Program #40. - - Center dot. + + Viola, Program #41. - - Enclosing parentheses. + + Cello, Program #42. - - Enclosing square brackets. + + Contrabass, Program #43. - - Enclosing box. + + Tremolo Strings, Program #44. - - Enclosing circle. + + Pizzicato Strings, Program #45. - - Enclosing "fences". + + Orchestral Harp, Program #46. - - - - Captures text rendered in the center of the notehead. - - - centertext\((A|B|C|D|E|F|G)(f|♭|n|♮|s|♯)?\) - - centertext\(H(s|♯)?\) - - - - 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 - octaves), or rarely '22' (for 3 octaves). - - - 8|15|22 - - - - 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 - relative to the current one; i.e., the layer above or the layer below. - - - - The layer immediately above. + + Timpani, Program #47. - - The layer immediately below. + + String Ensemble 1, Program #48. - - - - Styling of piano pedal marks. - - - - Continuous line with start and end positions rendered by vertical bars and bounces - shown by upward-pointing "blips". + + String Ensemble 2, Program #49. - - Pedal down and half pedal rendered with "Ped." followed by a line with - end position rendered by vertical bars and bounces shown by upward-pointing "blips". + + SynthStrings 1, Program #50. - - Pedal down and half pedal rendered with "Ped.", pedal up rendered by "*", pedal - "bounce" rendered with "* Ped.". + + SynthStrings 2, Program #51. - - Pedal up and down indications same as with "pedstar", but bounce is rendered with - "Ped." only. + + Choir Aahs, Program #52. - - - - Positive decimal number plus '%', i.e., [0-9]+(\.?[0-9]*)?\%. - - - [0-9]+(\.?[0-9]*)?% - - - - Positive decimal number between 0 and 100, followed by a percent sign "%". - - - (([0-9]|[1-9][0-9])(\.[0-9]+)?|100(\.0+)?)% - - - - Positive decimal number between -100 and 100, followed by a percent sign "%". - - - (\+|-)?(([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. - - - - 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. + + Voice Oohs, Program #53. - - Header or footer for the first page only. + + Synth Voice, Program #54. - - Header or footer for the last page only. + + Orchestra Hit, Program #55. - - The first of an alternating pattern of headers or footers. + + Trumpet, Program #56. - - The second of an alternating pattern of headers or footers. + + Trombone, Program #57. - - - -

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. - - - [a-g] - - - - 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. - - - - - Location information. - - - - - - - Other values not permitted when 'above', 'below', 'between' or 'within' is - present. - - - - - Rotation term. - - - - No rotation. + + Tuba, Program #58. - - Rotated 180 degrees. + + Muted Trumpet, Program #59. - - Rotated 270 degrees clockwise. + + French Horn, Program #60. - - Rotated 45 degrees clockwise. + + Brass Section, Program #61. - - Rotated 315 degrees clockwise. + + SynthBrass 1, Program #62. - - Rotated 135 degrees clockwise. + + SynthBrass 2, Program #63. - - Rotated 225 degrees clockwise. + + Soprano Sax, Program #64. - - - - Scale degree values. - - - (\^|v)?[1-7](\+|\-)? - - - - 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 - are nested or overlap. - - - [i|m|t][1-6] - - - - - - - - - - - Items in all repertoires that may be printed near a staff. - - - - Accidentals. + + Alto Sax, Program #65. - - Annotations. + + Tenor Sax, Program #66. - - Articulations. + + Baritone Sax, Program #67. - - Directives. + + Oboe, Program #68. - - Dynamics. + + English Horn, Program #69. - - Harmony indications. + + Bassoon, Program #70. - - Ornaments. + + Clarinet, Program #71. - - - - Spoken text. + + Piccolo, Program #72. - - Stage directions. + + Flute, Program #73. - - Tempo markings. + + Recorder, Program #74. - - - - 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. - - - - - - - The @staff - attribute must contain 2 numerically-adjacent integer values. - - - - Staves and - are not adjacent. - - - - - Location of symbol relative to a staff. - - - - Above the staff. + + Pan Flute, Program #75. - - Below the staff. + + Blown Bottle, Program #76. - - - - Location of symbol relative to a staff. - - - - Between staves. + + Shakuhachi, Program #77. - - Within/on the staff. + + Whistle, Program #78. - - - - Stem direction. - - - - - Common stem directions. - - - - Stem points upwards. + + Ocarina, Program #79. - - Stem points downwards. + + Lead 1 (square), Program #80. - - - - Additional stem directions. - - - - Stem points left. + + Lead 2 (sawtooth), Program #81. - - Stem points right. + + Lead 3 (calliope), Program #82. - - Stem points up and right. + + Lead 4 (chiff), Program #83. - - Stem points down and right. + + Lead 5 (charang), Program #84. - - Stem points up and left. + + Lead 6 (voice), Program #85. - - Stem points down and left. + + Lead 7 (fifths), Program #86. - - - - Stem modification. - - - - No modifications to stem. + + Lead 8 (bass + lead), Program #87. - - 1 slash through stem. + + Pad 1 (new age), Program #88. - - 2 slashes through stem. + + Pad 2 (warm), Program #89. - - 3 slashes through stem. + + Pad 3 (polysynth), Program #90. - - 4 slashes through stem. + + Pad 4 (choir), Program #91. - - 5 slashes through stem. + + Pad 5 (bowed), Program #92. - - 6 slashes through stem. + + Pad 6 (metallic), Program #93. - - X placed on stem. + + Pad 7 (halo), Program #94. - - Z placed on stem. + + Pad 8 (sweep), Program #95. - - - - Position of a note’s stem relative to the head of the note. - - - - Stem attached to left side of note head. + + FX 1 (rain), Program #96. - - Stem attached to right side of note head. + + FX 2 (soundtrack), Program #97. - - Stem is originates from center of note head. + + FX 3 (crystal), Program #98. - - - - In string tablature, the number of the string to be played, i.e., [1-9]+. - - - - - Temperament or tuning system. - - - - Equal or 12-tone temperament. + + FX 4 (atmosphere), Program #99. - - Just intonation. + + FX 5 (brightness), Program #100. - - Meantone intonation. + + FX 6 (goblins), Program #101. - - Pythagorean tuning. + + FX 7 (echoes), Program #102. - - - - Beats (meter signature denominator) per minute, e.g., 120. - - - - - Closed list of text rendition values. - - - - Surrounded by single quotes. + + FX 8 (sci-fi), Program #103. - - Surrounded by double quotes. + + Sitar, Program #104. - - Italicized (slanted to right). + + Banjo, Program #105. - - Oblique (slanted to left). + + Shamisen, Program #106. - - Small capitals. + + Koto, Program #107. - - Relative font weight. + + Kalimba, Program #108. - - Relative font weight. + + Bag pipe, Program #109. - - Relative font weight. + + Fiddle, Program #110. - - Enclosed in box. + + Shanai, Program #111. - - Enclosed in ellipse/circle. + + Tinkle Bell, Program #112. - - Enclosed in diamond. + + Agogo, Program #113. - - Enclosed in triangle. + + Steel Drums, Program #114. - - Struck through by '\' (back slash). + + Woodblock, Program #115. - - Struck through by '/' (forward slash). + + Taiko Drum, Program #116. - - Struck through by '-'; may be qualified to indicate multiple parallel lines, e.g., - line-through(2). + + Melodic Tom, Program #117. - - Not rendered, invisible. + + Synth Drum, Program #118. - - Line above the text; may be qualified to indicate multiple parallel lines, e.g., - overline(3). + + Reverse Cymbal, Program #119. - - Use for deleted text fully or partially obscured by other text (such as 'XXXXX') or - musical symbols (such as notes, rests, etc.). + + Guitar Fret Noise, Program #120. - - Struck through by '-'; equivalent to line-through; may be qualified to indicate - multiple parallel lines, e.g., strike(3). + + Breath Noise, Program #121. - - Subscript. + + Seashore, Program #122. - - Superscript. + + Bird Tweet, Program #123. - - Use for added text or musical symbols that fully or partially obscure text from an - earlier writing stage. + + Telephone Ring, Program #124. - - Underlined; may be qualified to indicate multiple parallel lines, e.g., - underline(2). + + Helicopter, Program #125. - - Crossed-out; equivalent to 'bslash' (\) plus 'fslash' (/); that is, a hand-written - 'X'; may be qualified to indicate multiple parallel lines, e.g., x-through(2). + + Applause, Program #126. - - Left-to-right (BIDI embed). + + Gunshot, Program #127. - - Right-to-left (BIDI embed). + + Acoustic Bass Drum, Key #35. - - Left-to-right (BIDI override). + + Bass Drum 1, Key #36. - - Right-to-left (BIDI override). + + Side Stick, Key #37. - - - - Parameterized text rendition values. - - - (underline|overline|line-through|strike|x-through)\(\d+\) - - - - Text rendition values. - - - - - A Uniform Resource Identifier, see [RFC2396]. - - - - - Data values for attributes that capture vertical alignment. - - - - Top aligned. + + Acoustic Snare, Key #38. - - Middle aligned. + + Hand Clap, Key #39. - - Bottom aligned. + + Electric Snare, Key #40. - - Baseline aligned. + + Low Floor Tom, Key #41. - - - - A single "word" that contains only letters, digits, punctuation characters, or symbols. It - cannot contain whitespace. - - - (\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. - - - - Quadruple whole note. + + Closed Hi Hat, Key #42. - - Double whole note. + + High Floor Tom, Key #43. - - Whole note. + + Pedal Hi-Hat, Key #44. - - Half note. + + Low Tom, Key #45. - - Quarter note. + + Open Hi-Hat, Key #46. - - 8th note. + + Low-Mid Tom, Key #47. - - 16th note. + + Hi-Mid Tom, Key #48. - - 32nd note. + + Crash Cymbal 1, Key #49. - - 64th note. + + High Tom, Key #50. - - 128th note. + + Ride Cymbal 1, Key #51. - - 256th note. + + Chinese Cymbal, Key #52. - - 512th note. + + Ride Bell, Key #53. - - 1024th note. + + Tambourine, Key #54. - - 2048th note. + + Splash Cymbal, Key #55. - - - - Items in the CMN repertoire that may be printed near a staff. - - - - Beams. + + Cowbell, Key #56. - - - - Bend indications. + + Crash Cymbal 2, Key #57. - - Brackets, e.g., for transcribed ligatures. + + Vibraslap, Key #58. - - Breath marks. + + Ride Cymbal 2, Key #59. - - Copy marks. + + Hi Bongo, Key #60. - - Fermatas. + + Low Bongo, Key #61. - - Fingerings. + + Mute Hi Conga, Key #62. - - - - Hairpin dynamics. + + Open Hi Conga, Key #63. - - Harp pedals. + + Low Conga, Key #64. - - Laissez vibrer indications, sometimes called "open ties". + + High Timbale, Key #65. - - Mordents. + + Low Timbale, Key #66. - - Octaviation marks. + + High Agogo, Key #67. - - Piano pedal marks. + + Low Agogo, Key #68. - - Rehearsal marks. + + Cabasa, Key #69. - - - - Ties. + + Maracas, Key #70. - - Trills. + + Short Whistle, Key #71. - - Tuplets. + + Long Whistle, Key #72. - - - - Turns. + + 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. - - Logical domain attributes. - - - - - - - Describes the direction in which an arpeggio is to be performed. - - - Lowest to highest pitch. - - - Highest to lowest pitch. - - - Non-arpeggiated style (usually rendered with a preceding bracket instead of a wavy - line). - - - - - - Logical domain attributes. - - - - - - Logical domain attributes. - - - - - - Indicates the performed duration represented by the beatRpt symbol; expressed in time - signature denominator units. - - - \d+(\.\d+)? - - - - - - Logical domain attributes. - - - - - - - - - - Logical domain attributes. - - - - - - - - - Indicates whether the tremolo is measured or unmeasured. - - - Measured tremolo. - - - Unmeasured tremolo. - - - - - - Gestural domain attributes for CMN features. - - Logical domain attributes in the CMN repertoire. - - - - - Attributes that indicate how to render the staff lines of the measure containing an - element belonging to this attribute class. - - - "Cut-out" style. - - - The staff lines should not be drawn. - - - - - - Logical domain attributes. - - 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 - symbol. - - - - - - - Logical domain attributes. - - - - - - Logical domain attributes. - - - - - - - - Describes the style of the tremolo. - - - Measured tremolo. - - - Unmeasured tremolo. - - - - - - Logical domain attributes. - - - - - - - - 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. - - - - - - Records the amount of time to be "stolen" from a non-grace note/chord. - - - - - - - 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". - - - Attached to the preceding event. - - - Attached to the following event. - - - Attachment is ambiguous. - - - - - - Logical domain attributes. - - - - - - - - - Captures the visual rendition and function of the hairpin; that is, whether it - indicates an increase or a decrease in volume. - - - Crescendo; i.e., louder. - - - Diminuendo; i.e., softer. - - - - - Indicates that the hairpin starts from or ends in silence. Often rendered as a small - circle attached to the closed end of the hairpin. See Gould, p. 108. - - - - - - - Logical domain attributes. - - - - - - 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 - - - Flat. - - - Natural. - - - Sharp. - - - - - Indicates the pedal setting for the harp’s D strings. - n - - - Flat. - - - Natural. - - - Sharp. - - - - - Indicates the pedal setting for the harp’s E strings. - n - - - Flat. - - - Natural. - - - Sharp. - - - - - Indicates the pedal setting for the harp’s F strings. - n - - - Flat. - - - Natural. - - - Sharp. - - - - - Indicates the pedal setting for the harp’s G strings. - n - - - Flat. - - - Natural. - - - Sharp. - - - - - Indicates the pedal setting for the harp’s A strings. - n - - - Flat. - - - Natural. - - - Sharp. - - - - - Indicates the pedal setting for the harp’s B strings. - n - - - Flat. - - - Natural. - - - Sharp. - - - - - - Logical domain attributes. - - - - - Logical domain attributes. - - - - - - - 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 - or analytical uses of MEI, that are entirely non-numeric strings. Measure numbers may be - 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 - ignored. - - - - - - Indicates the function of the right bar line and is structurally important. - - - - - - - Logical domain attributes. - - - - - - - Logical domain attributes. - - - - - - Logical domain attributes. - - - - - - Logical domain attributes. - - - - - - Logical domain attributes. - - - - - Visual domain attributes. - - - - - Attributes that record numbers to be displayed with a feature. - - - number - Records a number or count accompanying a notational feature. - - - - - - - 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. - - - - - - Determines if the tuplet number is visible. - - - - - - - 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 - broken lines, coll' ottava typically uses an unbroken line or a series of longer broken - lines, ending with a short vertical stroke. See Read, p. 47-48. - - - Coll' ottava (with the octave). - - - - - - Logical domain attributes. - - - - - - - - direction - Records the position of the piano damper pedal. - - - Depress the pedal. - - - Release the pedal. - - - Half pedal. - - - Release then immediately depress the pedal. - - - - - function - Indicates the function of the depressed pedal, but not necessarily the text associated - with its use. Use the dir element for such text. - - - - - - The sustain pedal, also referred to as the "damper" pedal, allows the piano - strings to vibrate sympathetically with the struck strings. It is the right-most and - the most frequently used pedal on modern pianos. - - - The soft pedal, sometimes called the "una corda", "piano", or "half-blow" pedal, - reduces the volume and modifies the timbre of the piano. On the modern piano, it is - the left-most pedal. - - - The sostenuto or tone-sustaining pedal allows notes already undamped to continue - to ring while other notes are damped normally; that is, on their release by the - fingers. This is usually the center pedal of the modern piano. - - - The silent or practice pedal mutes the volume of the piano so that one may - practice quietly. It is sometimes a replacement for the sostenuto pedal, especially on - an upright or vertical instrument. - - - - - - Visual domain attributes. - - - - - - Logical domain attributes. - - - - - - - - - - Logical domain attributes in the CMN repertoire. - - Visual domain attributes. - - - - - Logical domain attributes. - - - - - - - - Logical domain attributes in the CMN repertoire. - - Logical domain attributes for staffDef in the CMN repertoire. - - - - - Logical domain attributes. - - - - - - - Attributes that describe measured tremolandi. - - - The performed duration of an individual note in a measured tremolo. - - - - - - - Logical domain attributes. - - - - - - - - - Groups control events that appear in CMN. - - - - - - - Groups events that appear in CMN. - - - - - Groups events that completely fill a CMN measure. - - - - - Groups notated events that may appear at the layer level in CMN. - - - - - Groups CMN measure-like elements. - - - - - Groups elements that may appear within a CMN measure. - - Groups elements that function like ossia. - - - - - - 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". - - - - - - - - - - -

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 - upper end of the line for the sake of consistency or when the direction of successive - arpeggios alternates. In music for keyboard instruments, sometimes a distinction is made - between a single arpeggio in which both hands play successively and simultaneous arpeggios - in two hands. In the case of the former, multiple values may be required in the - staff and layer attributes. Arpeggios that do not cross staves, but - still involve more than one layer require multiple values for the layer - attribute.

-
A container for a series of explicitly beamed events that begins and ends entirely within - a measure. - - - - - - - - - - - - - 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.

-
beat repeatAn indication that material on a preceding beat should be repeated. - - - - - - - - - - - - -

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.

-
breath markAn indication of a point at which the performer on an instrument requiring - breath (including the voice) may breathe. - - - - - - - - - - - - - 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, - tstamp.ges, or tstamp.real attribute. It is a semantic error not to - specify a starting point attribute.

-

Since the breath mark does not disrupt the normal tempo of a performance, it has no - directly encode-able duration.

-

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. - - - - - - - - - - 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'. - - - Must have one of - the attributes: startid, tstamp, tstamp.ges or tstamp.real. - - - - - - 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 bracket below the dot. Other visual forms of a fermata may - be indicated via the 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. - - - - - - - - - - glissandoA continuous or sliding movement from one pitch to another, usually - indicated by a straight or wavy line. - - - - - - - - - - - - - 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. - - - -

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 - 'portamento'. The visual appearance of the indicating line may be recorded in the - lform and lwidth attributes. The starting point of the glissando 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.

-
A container for a sequence of grace notes. - - - - - - - - - - - - - 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 >. - - - - - - - - - - - - - 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 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 - 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. 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. - - - - - - - - - - harp pedalHarp pedal diagram. - - - - - - - - - - - - - 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. - - - - - - - - - - - - - Must have one of the - attributes: startid, tstamp, tstamp.ges or tstamp.real. - - - - - - The visual attributes of the lv element (@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. - - - -

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. -

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.

-
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. - - - - - - - - - - -

mNum uses a subset of model.textPhraseLike.limited.

-
measure restComplete measure rest in any meter. - - - - - - - - - - -

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. - - - - - - - - - - -

The automated numbering of consecutive measures of rest 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 repeatMultiple repeated measures. - - - - - - - - - - -

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. - - - - - - - - - - - - - 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 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 - starting point of the octave displacement 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. Also, note that the dur attribute is - not required because the octave displacement can be visually instantaneous.

-
Piano pedal mark. - - - - - - - - - - - - - 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. - - - - - - - - - - - -

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. - - - - - - - - - - + +

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". + + + 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. + + + + + Common modes. + + + + Major mode. + + + Minor mode. + + + + + Gregorian modes. + + + + Dorian mode (the first mode). + + + Hypodorian mode (the second mode). + + + Phrygian mode (the third mode). + + + Hypophrygian mode (the fourth mode). + + + Hypolydian mode (the fifth mode). + + + Lydian mode (the sixth mode). + + + Mixolydian mode (the seventh mode). + + + Hypomixolydian mode (the eighth mode). + + + Tonus peregrinus (the ninth mode). + + + + + Modern modes. + + + + Ionian mode. + + + Hypoionian mode. + + + Aeolian mode. + + + Hypoaeolian mode. + + + Locrian mode. + + + Hypolocrian mode. + + + + + Bibliographic relationship values based on MODS version 3.4. + + + + Temporal predecessor of the resource. + + + Temporal successor to the resource. + + + Original form of the resource. + + + Parent containing the resource. + + + Intellectual or physical component of the resource. + + + Version of the resource’s intellectual content not changed enough to be a different + work. + + + Version of the resource in a different physical format. + + + Published bibliographic description, review, abstract, or index of the resource's + content. + + + Cited or referred to in the resource. + + + + + "Convenience" datatype that permits combining enumerated values with a user-supplied + name. + + + + + "Convenience" datatype that permits combining enumerated values with user-supplied + values. + + + + + Non-staff location. + + + + At the foot of the page. + + + At the top of the page. + + + At the left of the page. + + + At the right of the page. + + + On the opposite, i.e., facing, page. + + + On the other side of the leaf. + + + At the end of this division; e.g., chapter, volume, etc. + + + Within a line text; i.e., an insertion. + + + Between the lines of text, less exact than "sub" or "super". + + + Above a line of text, more exact than "intra(linear)". Do not confuse with + superscript rendition. + + + Below a line of text, more exact than "intra(linear)". Do not confuse with subscript + rendition. + + + In a predefined space; i.e., that left by an earlier scribe. + + + Obscures original text; e.g., via overstrike, addition of new writing surface + material, etc. + + + + + Enumerated note head modifier values. + + + + Slash (upper right to lower left). + + + Backslash (upper left to lower right). + + + Vertical line. + + + Horizontal line. + + + Center dot. + + + Enclosing parentheses. + + + Enclosing square brackets. + + + Enclosing box. + + + Enclosing circle. + + + Enclosing "fences". + + + + + Captures text rendered in the center of the notehead. + + + centertext\((A|B|C|D|E|F|G)(f|♭|n|♮|s|♯)?\) + + centertext\(H(s|♯)?\) + + + + Octave number. The default values conform to the Scientific Pitch Notation (SPN). + + + 9 + + + + 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. + + + reversed|90CW|90CCW + + + + 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. + + + The layer immediately below. + + + + + Styling of piano pedal marks. + + + + Continuous line with start and end positions rendered by vertical bars and bounces + shown by upward-pointing "blips". + + + Pedal down and half pedal rendered with "Ped." followed by a line with + end position rendered by vertical bars and bounces shown by upward-pointing "blips". + + + Pedal down and half pedal rendered with "Ped.", pedal up rendered by "*", pedal + "bounce" rendered with "* Ped.". + + + Pedal up and down indications same as with "pedstar", but bounce is rendered with + "Ped." only. + + + + + Positive decimal number plus '%', i.e., [0-9]+(\.[0-9]*)?%. + + + [0-9]+(\.[0-9]*)?% + + + + Decimal number between 0 and 100, followed by a percent sign "%". + + + (([0-9]|[1-9][0-9])(\.[0-9]*)?|100(\.0*)?)% + + + + Decimal number between -100 and 100, followed by a percent sign "%". + + + (\+|-)?(([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. + + + + 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. + + + Header or footer for the first page only. + + + Header or footer for the last page only. + + + The first of an alternating pattern of headers or footers. + + + The second of an alternating pattern of headers or footers. + + + + +

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.

+
+
+ 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 + sounded. + + + [a-g]|none + + + + Pnum (pitch number, e.g., MIDI) attribute values. + + + + + Location information. + + + + - - 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. + + Other values not permitted when 'above', 'below', 'between' or 'within' is + present. - + + + Rotation term. + + + + No rotation. + + + Rotated 180 degrees. + + + Rotated 270 degrees clockwise. + + + Rotated 45 degrees clockwise. + + + Rotated 315 degrees clockwise. + + + Rotated 135 degrees clockwise. + + + Rotated 225 degrees clockwise. + + + + + 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 + are nested or overlap. + + + [i|m|t][1-6] + + + + + + + + + + + Items in all repertoires that may be printed near a staff. + + + + Accidentals. + + + Annotations. + + + Articulations. + + + Directives. + + + Dynamics. + + + Harmony indications. + + + Ornaments. + + + + + Spoken text. + + + Stage directions. + + + Tempo markings. + + + + + 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. + + + + - - The visual attributes of the slur (@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. + + The @staff + attribute must contain 2 numerically-adjacent integer values. + + + + Staves and + are not adjacent. - -

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.

-
An indication that two notes of the same pitch form a single note with their combined - rhythmic values. - - - - - +
+ + Location of symbol relative to a staff. + + + + Above the staff. + + + Below the staff. + + + + + Location of symbol relative to a staff. + + + + Between staves. + + + Within/on the staff. + + + + + Stem direction. + + + + + Common stem directions. + + + + Stem points upwards. + + + Stem points downwards. + + + + + Additional stem directions. + + + + Stem points left. + + + Stem points right. + + + Stem points up and right. + + + Stem points down and right. + + + Stem points up and left. + + + Stem points down and left. + + + + + Stem modification. + + + + No modifications to stem. + + + 1 slash through stem. + + + 2 slashes through stem. + + + 3 slashes through stem. + + + 4 slashes through stem. + + + 5 slashes through stem. + + + 6 slashes through stem. + + + X placed on stem. + + + Z placed on stem. + + + + + Position of a note’s stem relative to the head of the note. + + + + Stem attached to left side of note head. + + + Stem attached to right side of note head. + + + Stem is originates from center of note head. + + + + + In string tablature, the number of the string to be played, i.e., [1-9]+. + + + + + Temperament or tuning system. + + + + Equal or 12-tone temperament. + + + Just intonation. + + + Meantone intonation. + + + Pythagorean tuning. + + + + + Beats (meter signature denominator) per minute, e.g., 120. + + + + + Closed list of text rendition values. + + + + Surrounded by single quotes. + + + Surrounded by double quotes. + + + Italicized (slanted to right). + + + Oblique (slanted to left). + + + Small capitals. + + + Relative font weight. + + + Relative font weight. + + + Relative font weight. + + + Enclosed in box. + + + Enclosed in ellipse/circle. + + + Enclosed in diamond. + + + Enclosed in triangle. + + + Struck through by '\' (back slash). + + + Struck through by '/' (forward slash). + + + Struck through by '-'; may be qualified to indicate multiple parallel lines, e.g., + line-through(2). + + + Not rendered, invisible. + + + Line above the text; may be qualified to indicate multiple parallel lines, e.g., + overline(3). + + + Use for deleted text fully or partially obscured by other text (such as 'XXXXX') or + musical symbols (such as notes, rests, etc.). + + + Struck through by '-'; equivalent to line-through; may be qualified to indicate + multiple parallel lines, e.g., strike(3). + + + Subscript. + + + Superscript. + + + Use for added text or musical symbols that fully or partially obscure text from an + earlier writing stage. + + + Underlined; may be qualified to indicate multiple parallel lines, e.g., + underline(2). + + + Crossed-out; equivalent to 'bslash' (\) plus 'fslash' (/); that is, a hand-written + 'X'; may be qualified to indicate multiple parallel lines, e.g., x-through(2). + + + Left-to-right (BIDI embed). + + + Right-to-left (BIDI embed). + + + Left-to-right (BIDI override). + + + Right-to-left (BIDI override). + + + + + Parameterized text rendition values. + + + (underline|overline|line-through|strike|x-through)\(\d+\) + + + + Text rendition values. + + + + + A Uniform Resource Identifier, see [RFC2396]. + + + + + Data values for attributes that capture vertical alignment. + + + + Top aligned. + + + Middle aligned. + + + Bottom aligned. + + + Baseline aligned. + + + + + A single "word" that contains only letters, digits, punctuation characters, or symbols. It + cannot contain whitespace. + + + (\p{L}|\p{N}|\p{P}|\p{S})* + + + + Analytical domain attributes. + + Logical, that is, written, duration attribute values for the CMN repertoire. + + + + Quadruple whole note. + + + Double whole note. + + + Whole note. + + + Half note. + + + Quarter note. + + + 8th note. + + + 16th note. + + + 32nd note. + + + 64th note. + + + 128th note. + + + 256th note. + + + 512th note. + + + 1024th note. + + + 2048th note. + + + + + Items in the CMN repertoire that may be printed near a staff. + + + + Beams. + + + + + Bend indications. + + + Brackets, e.g., for transcribed ligatures. + + + Breath marks. + + + Copy marks. + + + Fermatas. + + + Fingerings. + + + + + Hairpin dynamics. + + + Harp pedals. + + + Laissez vibrer indications, sometimes called "open ties". + + + Mordents. + + + Octaviation marks. + + + Piano pedal marks. + + + Rehearsal marks. + + + + + Ties. + + + Trills. + + + Tuplets. + + + + + Turns. + + + + + Logical domain attributes. + + + + + + + Describes the direction in which an arpeggio is to be performed. + + + Lowest to highest pitch. + + + Highest to lowest pitch. + + + Non-arpeggiated style (usually rendered with a preceding bracket instead of a wavy + line). + + + + + + Logical domain attributes. + + - - - - - - - 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 tie (@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. - - - -

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. - + +
+ 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 + should remain unbroken. + + + + + + + Logical domain attributes. + + + + + + Indicates the performed duration represented by the beatRpt symbol; expressed in time + signature denominator units. + + + \d+(\.\d+)? + + + + + + Logical domain attributes. + - - - + - - - - -

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 - bowed tremolo (Read, p. 394) and double, triple, or flutter tonguing (Read, p. 348-349); - that is, for repetition of the same pitch. In the case of irrational durations, such as such - as two quarter notes in the time of five 8th notes in a measure of 5/8 time, decimal values - may be used in the dur.ges attribute. For example, the dur.ges - attribute would take the value 2.5 if the midi.div attribute’s value was 1. - The num and numbase attributes may be used for explicit labelling of a - 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.

-
- 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 in the CMN repertoire. + + + + + 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 + element belonging to this attribute class. + + + "Cut-out" style. + + + The staff lines should not be drawn. + + + + + + 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 + symbol. + + + + + + Logical domain attributes. - + + Logical domain attributes. + + + + + + + + Logical domain attributes. + + + + + + + + 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. - - Records semantic meaning, i.e., intended performance, of the mordent. The - altsym, glyph.name, or glyph.num attributes may be used - to specify the appropriate symbol. + + Marks a note or chord as a "grace" (without a definite performed duration) and records + from which other note/chord it should "steal" time. + + + + + + Records the amount of time to be "stolen" from a non-grace note/chord. + + + + + + + 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". - - Starts with the written note, followed by its lower neighbor, with a return to the - written note. In modern practice, this is called an "inverted mordent" and indicated - by a short wavy line with a vertical line through it. + + Attached to the preceding event. + + + Attached to the following event. - - Starts with the written note, followed by its upper neighbor, with a return to the - principal note. In modern practice, the symbol lacks the vertical line used for the - inverted form. + + Attachment is ambiguous. - - When set to 'true', a double or long mordent, sometimes called a "pincé double", - consisting of 5 notes, is indicated. - - - - - - Accidentals associated with ornaments. + + Logical domain attributes. - + + + + - - Records the written accidental associated with an upper neighboring note. - - - + + Captures the visual rendition and function of the hairpin; that is, whether it + indicates an increase or a decrease in volume. + + + Crescendo; i.e., louder. + + + Diminuendo; i.e., softer. + + - - Records the written accidental associated with a lower neighboring note. + + Indicates that the hairpin starts from or ends in silence. Often rendered as a small + circle attached to the closed end of the hairpin. See Gould, p. 108. - + - + Logical domain attributes. - - - - - + + - - Logical domain attributes. + + 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. - - + - - When set to 'true', the turn begins on the second half of the beat. - - - + + Indicates the pedal setting for the harp’s C strings. + n + + + Flat. + + + Natural. + + + Sharp. + + - - Records meaning; i.e., intended performance, of the turn. The altsym, - glyph.name, or glyph.num attributes may be used to specify the - appropriate symbol. + + Indicates the pedal setting for the harp’s D strings. + n - - Begins on the note below the written note. + + Flat. - - Begins on the note above the written note. + + Natural. + + + Sharp. + + + + + Indicates the pedal setting for the harp’s E strings. + n + + + Flat. + + + Natural. + + + Sharp. + + + + + Indicates the pedal setting for the harp’s F strings. + n + + + Flat. + + + Natural. + + + Sharp. + + + + + Indicates the pedal setting for the harp’s G strings. + n + + + Flat. + + + Natural. + + + Sharp. + + + + + Indicates the pedal setting for the harp’s A strings. + n + + + Flat. + + + Natural. + + + Sharp. + + + + + Indicates the pedal setting for the harp’s B strings. + n + + + Flat. + + + Natural. + + + Sharp. - - Groups CMN ornament elements. + + Logical domain attributes. - + + + + + + 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 + or analytical uses of MEI, that are entirely non-numeric strings. Measure numbers may be + 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. + + + - An ornament indicating rapid alternation of the main note with a secondary note, usually a - step below, but sometimes a step above. - - - - - - - - - - - - - - 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). - - - - - - - - - - - - - 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 - starting point of the trill 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 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. - - - - - - - - - - - - - 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.

-
- Attributes shared by table cells. - - The number of columns spanned by this cell. + + 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 + ignored. - + - - The number of rows spanned by this cell. + + Indicates the function of the right bar line and is structurally important. - + - - Groups elements representing or containing graphic information such as an illustration or - figure. + + Logical domain attributes. - + + + - - Groups elements that indicate the location of an inline graphic, illustration, or - figure. - - Groups table-like elements. + + Logical domain attributes. - - + + - 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. - - - - + + - + Logical domain attributes. - - - - + + - - - - - alternation of fingers. - - - combination of fingers. - - - substitution of fingers. - - - - - - Groups elements that capture performance instructions regarding the use of the fingers of - the hand (or a subset of them). + + Logical domain attributes. - + - finger – An individual finger in a fingering indication. - - - - - - - - - - - - - Must have one of the - attributes: startid, tstamp, tstamp.ges or tstamp.real. - - - - - - - The stack element is not allowed as a - descendant of fing. - - - (finger group)– A group of individual fingers in a fingering indication. - - - - - - - - - - - - - At least 2 fing or fingGrp - elements are required. - - - - - - - When @tstamp or @startid is - present on fingGrp, its child elements cannot have a @tstamp or @startid - attribute. - - - When @tstamp or @startid is not present on fingGrp, each of its child elements must - have a @tstamp or @startid attribute. - - - - - 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. +
+ Visual domain attributes. + + + + + Attributes that record numbers to be displayed with a feature. + + + number + Records a number or count accompanying a notational feature. + + + + + + + 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. + + + + + + Determines if the tuplet number is visible. -

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. + + + + Logical domain attributes. - + + + + + - - Attributes for capturing momentary pitch inflection in the gestural domain. - - Records the performed pitch inflection. + + 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 + broken lines, coll' ottava typically uses an unbroken line or a series of longer broken + lines, ending with a short vertical stroke. See Read, p. 47-48. + + + Coll' ottava (with the octave). + + + + + + Logical domain attributes. + + + + + + + + direction + Records the position of the piano damper pedal. + + + Depress the pedal. + + + Release the pedal. + + + Half pedal. + + + Release then immediately depress the pedal. + + + + + function + Indicates the function of the depressed pedal, but not necessarily the text associated + with its use. Use the dir element for such text. - + - - - - The value of @accid.ges should - not duplicate the value of @accid. - - - + + + The sustain pedal, also referred to as the "damper" pedal, allows the piano + strings to vibrate sympathetically with the struck strings. It is the right-most and + the most frequently used pedal on modern pianos. + + + The soft pedal, sometimes called the "una corda", "piano", or "half-blow" pedal, + reduces the volume and modifies the timbre of the piano. On the modern piano, it is + the left-most pedal. + + + The sostenuto or tone-sustaining pedal allows notes already undamped to continue + to ring while other notes are damped normally; that is, on their release by the + fingers. This is usually the center pedal of the modern piano. + + + The silent or practice pedal mutes the volume of the piano so that one may + practice quietly. It is sometimes a replacement for the sostenuto pedal, especially on + an upright or vertical instrument. + + - - Gestural domain attributes. - - Gestural domain attributes. - - Gestural domain attributes. - - Gestural domain attributes. + + Logical domain attributes. - - - Gestural domain attributes. - - Gestural domain attributes. - - Gestural domain attributes. - + + + + - - Gestural domain attributes. + + Visual domain attributes. - + - - Gestural domain attributes. + + Logical domain attributes. - - + + + + - - Gestural domain attributes. + + Logical domain attributes for staffDef in the CMN repertoire. - - - - - Gestural domain attributes. - - Gestural domain attributes. + + Logical domain attributes. - + + + - - Gestural domain attributes. - - Gestural domain attributes. - - Gestural domain attributes. + + Attributes describing the form of a tremolo. - - Indicates that the performance of the next musical division should begin immediately - following this one. + + Describes the style of the tremolo. + + + Measured tremolo. + + + Unmeasured tremolo. + + + + + + Attributes that describe measured tremolandi. + + + The performed duration of an individual note in a measured tremolo. - + - - Gestural domain attributes. + + Logical domain attributes. - + + + + - - Gestural domain attributes. + + Groups control events that appear in CMN. + + - - Gestural domain attributes. + + Groups events that appear in CMN. - - + - - Gestural domain attributes. + + Groups events that completely fill a CMN measure. - - + - - Gestural domain attributes. + + Groups notated events that may appear at the layer level in CMN. - + - - Gestural domain attributes. + + Groups CMN measure-like elements. + + + + + Groups elements that may appear within a CMN measure. + + Groups elements that function like ossia. + + + + + + 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". + + + + + + + + + + +

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 + upper end of the line for the sake of consistency or when the direction of successive + arpeggios alternates. In music for keyboard instruments, sometimes a distinction is made + between a single arpeggio in which both hands play successively and simultaneous arpeggios + in two hands. In the case of the former, multiple values may be required in the + staff and layer attributes. Arpeggios that do not cross staves, but + still involve more than one layer require multiple values for the layer + attribute.

+
A container for a series of explicitly beamed events that begins and ends entirely within + a measure. + + + - -
- Gestural domain attributes. - - Gestural domain attributes. - - Gestural domain attributes. - + + + + + + + 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.

+
beat repeatAn indication that material on a preceding beat should be repeated. + + + - -
- Gestural domain attributes. - + - - - Gestural domain attributes. - - Gestural domain attributes. - - Gestural domain attributes. - + + + + +

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.

+
breath markAn indication of a point at which the performer on an instrument requiring + breath (including the voice) may breathe. + - - -
- 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 - in the measure. - + + + + + + + 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, + tstamp.ges, or tstamp.real attribute. It is a semantic error not to + specify a starting point attribute.

+

Since the breath mark does not disrupt the normal tempo of a performance, it has no + directly encode-able duration.

+

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. + - -
- Gestural domain attributes. - - Gestural domain attributes. - - Gestural domain attributes. - + + + - - - Gestural domain attributes. - - Gestural domain attributes. - + + + + 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'. + + + Must have one of + the attributes: startid, tstamp, tstamp.ges or tstamp.real. + + + + + + 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 bracket below the dot. Other visual forms of a fermata may + be indicated via the 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. + - -
- Gestural domain attributes. - - Gestural domain attributes. - - - - - - - - - - - - - Records performed octave information that differs from the written value. - - - - - - Contains a performed pitch name that differs from the written value. - - - - - - - Gestural domain attributes. - + + - - - Gestural domain attributes. - + + + + glissandoA continuous or sliding movement from one pitch to another, usually + indicated by a straight or wavy line. + + + + - - - Gestural accidentals associated with ornaments. - - - Records the sounding accidental associated with an upper neighboring note. - - - - - - Records the sounding accidental associated with a lower neighboring note. - - - - - - - Gestural domain attributes. - - Gestural domain attributes. - + + + + + + + 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. + + + +

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 + 'portamento'. The visual appearance of the indicating line may be recorded in the + lform and lwidth attributes. The starting point of the glissando 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.

+
grace groupA container for a sequence of grace notes. + - -
- 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 section should begin immediately following - this one. - - - - - - - Gestural domain attributes. - + + + + + + + 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 >. + + + + - - - Gestural domain attributes. - + + + + + + + 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 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 + 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. 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. + - -
- Gestural domain attributes. - - Gestural domain attributes for staffDef in the CMN repertoire. - + + - - - - - Gestural domain attributes. - + + + + harp pedalHarp pedal diagram. + - - - Gestural domain attributes. - - Gestural domain attributes. - - Gestural domain attributes. - + + + - - - Gestural domain attributes. - + + + + + + + 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. + - -
- Gestural domain attributes. - + + + + + + + + + + Must have one of the + attributes: startid, tstamp, tstamp.ges or tstamp.real. + + + + + + The visual attributes of the lv element (@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. + + + +

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. +

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.

+
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. + + + + + - -
- Gestural domain attributes. - - - - Gestural domain attributes. - - Gestural domain attributes. - - Gestural 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 - document. - - - - - - - @chordref attribute - should have content. - The value in @chordref should correspond to the @xml:id attribute of a chordDef - element. - - - - - - - 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 represent single figured bass elements. - - Groups elements that record indications of harmony. - - - - 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. +

mNum uses a subset of model.textPhraseLike.limited.

+
measure restComplete measure rest in any meter. - - - + + + + + -

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. +

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. + + + + + - + -

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. +

The automated numbering of consecutive measures of rest 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. + + + - - - - + - - figured bassSymbols added to a bass line that indicate harmony. Used to improvise a - chordal accompaniment. Sometimes called Generalbass, thoroughbass, or basso continuo. + + multiple repeatMultiple repeated measures. - - - - harmonyAn indication of harmony, e.g., chord names, tablature grids, harmonic - analysis, figured bass. - + + - + + + + +

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. + + + + - + - - + + - + 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. - - 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 - 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, - including an MEI-encoded document. + +

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 + starting point of the octave displacement 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. Also, note that the dur attribute is + not required because the octave displacement can be visually instantaneous.

+
Piano pedal mark. - + + + - + - - -

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).

-
file description(file description) – Contains a full bibliographic description of the MEI file. - Used to point to other elements that correspond to this one in a generic fashion. - - - - - - - @corresp attribute should have content. - - - - -

The @corresp attribute on fileDesc may point to a more complete version of this content in a less restricted version of MEI.

-
-

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. + + - - The meiHead type attribute can have the value 'music' - only when the document element is "mei". - - - The meiHead type attribute can have the value - 'corpus' only when the document element is "meiCorpus". - - - The meiHead type attribute can have the value - 'independent' only when the document element is "meiHead". + + Must have one of the + attributes: startid, tstamp, tstamp.ges or tstamp.real. - - Specifies the kind of document to which the header is attached, for example whether it - is a corpus or individual text. - - - Header is attached to a music document. - - - Header is attached to a corpus. - - - Header is independent; i.e., not attached to either a music or a corpus - document. - - - -

For MEI Basic, an MEI header may contain a fileDesc element only.

-
publication statement(publication statement) – Container 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. -

This element is modelled on an element in the Text Encoding Initiative (TEI) standard. - In MEI Basic, it may contain only publisher, publishing place, date and availability information, in that order.

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

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. - - - - - -

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. - - + + + - - Recurring lyrics, especially at the end of each verse or stanza of a poem or song lyrics; - a chorus. + + + + +

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. + - + + + + + - - - - -

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. + + + + + 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 slur (@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.

+
An indication that two notes of the same pitch form a single note with their combined + rhythmic values. - - - - + + + - + - - - - - - -

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. + + + + + 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 tie (@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. + + + +

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. - - - - - - + + + + - - - + -

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. +

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 + bowed tremolo (Read, p. 394) and double, triple, or flutter tonguing (Read, p. 348-349); + that is, for repetition of the same pitch. In the case of irrational durations, such as such + as two quarter notes in the time of five 8th notes in a measure of 5/8 time, decimal values + may be used in the dur.ges attribute. For example, the dur.ges + attribute would take the value 2.5 if the midi.div attribute’s value was 1. + The num and numbase attributes may be used for explicit labelling of a + 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.

+ + 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. + + + + + - - - - - - The comptype attribute may occur on - only when it is a descendant of a - componentList. - - - + + Records semantic meaning, i.e., intended performance, of the mordent. The + altsym, glyph.name, or glyph.num attributes may be used + to specify the appropriate symbol. - - A physical and logical part of entity. - - - A physical, but not logical component of the entity, usually included as part of - the binding process. + + Starts with the written note, followed by its lower neighbor, with a return to the + written note. In modern practice, this is called an "inverted mordent" and indicated + by a short wavy line with a vertical line through it. - - A logical component of the entity physically held elsewhere. + + Starts with the written note, followed by its upper neighbor, with a return to the + principal note. In modern practice, the symbol lacks the vertical line used for the + inverted form. + + When set to 'true', a double or long mordent, sometimes called a "pincé double", + consisting of 5 notes, is indicated. + + + + - - Groups elements that may appear inline when the msdesc module is active. + + Accidentals associated with ornaments. - + - 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. - - - - - - - - + + + Records the written accidental associated with an upper neighboring note. + + + + + + Records the written accidental associated with a lower neighboring note. + + + + + +
+ Logical domain attributes. + + + + + + + + + Logical domain attributes. + + + + + + + + When set to 'true', the turn begins on the second half of the beat. - -

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. + + + Records meaning; i.e., intended performance, of the turn. The altsym, + glyph.name, or glyph.num attributes may be used to specify the + appropriate symbol. + + + Begins on the note below the written note. + + + Begins on the note above the written note. + + + + +
+ Groups CMN ornament elements. + + + + An ornament indicating rapid alternation of the main note with a secondary note, usually a + step below, but sometimes a step above. + + + - - - - - - -

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. - - - - -

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. - - - - -

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. - - - - -

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. - - - - -

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. - - - - -

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. + + + + + 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). - + + + + - - -

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. + + + + + 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 + starting point of the trill 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 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. - - + + + + + - - - 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. + + + + + 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.

+
+ 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, or the textual content of the element. - + - - Specifies the starting point of the location in a normalized form. + + + Standard Music Font Layout. + + + + + 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. - + - - Specifies the end-point of the location in a normalized form. + + + + Attributes that specify names or values taken from an external symbol authority. + + + Glyph name. - + - -

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. + + + + @glyph.name attribute + should have content. + + + + + + Numeric glyph reference in hexadecimal notation, e.g., "#xE000" or "U+E000". N.B. SMuFL + version 1.18 uses the range U+E000 - U+ECBF. - + - -

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. - - - - - - - - + + + + SMuFL version 1.18 uses the range U+E000 - U+ECBF. + + + + + +
+ Attributes used to associate MEI features with corresponding glyphs in an + externally-defined standard such as SMuFL. + + + + + + Logical domain attributes. + + + + + + + + Logical domain attributes. + + + + + + + + - - Signals beginning of a text division. + + alternation of fingers. + + + combination of fingers. - - Makrs the end of a text division. + + substitution of fingers. - -

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. + + +
+ Groups elements that capture performance instructions regarding the use of the fingers of + the hand (or a subset of them). + + + + fingerAn individual finger in a fingering indication. - + + + + - - -

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. - + + + + + Must have one of the + attributes: startid, tstamp, tstamp.ges or tstamp.real. + + + - - - - -

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

-
A single seal or similar attachment. + + + The stack element is not allowed as a + descendant of fing. + + + finger groupA group of individual fingers in a fingering indication. - - + + + + + - - + + + + + At least 2 fing or fingGrp + elements are required. + + + + + + + When @tstamp or @startid is + present on fingGrp, its child elements cannot have a @tstamp or @startid + attribute. + + + When @tstamp or @startid is not present on fingGrp, each of its child elements must + have a @tstamp or @startid attribute. + + + + + Gestural domain attributes. + + + + + Attributes for capturing momentary pitch inflection in the gestural domain. + + + Records the performed pitch inflection. + + + + + + + The value of @accid.ges should + not duplicate the value of @accid. + + + + + + + Gestural domain attributes. + + + + + Attributes whether an element is performed "attacca". + + + Indicates that the performance of the next musical division should begin immediately + following this one. - -

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. - + + +
+ 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. + - - - - -

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. - + +
+ Gestural domain attributes. + + + - - + + + Gestural domain attributes. + - - - -

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. - + +
+ 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 + in the measure. + - - - -

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. - + +
+ Gestural domain attributes. + - + + + Gestural domain attributes. + - - + + + Gestural domain attributes. + + + + + + + + + + + + + Records performed octave information that differs from the written value. + + + + + + Contains a performed pitch name that differs from the written value. + + + + + + + Gestural domain attributes. + - - - -

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. - + +
+ Gestural domain attributes. + - - - - - Short, project-defined name for the material composing the majority of the - support. + + + Gestural accidentals associated with ornaments. + + + Records the sounding accidental associated with an upper neighboring note. - + - - - 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. - + + + Records the sounding accidental associated with a lower neighboring note. + + + + + +
+ Gestural domain attributes. + - + + + Gestural domain attributes. + - - - -

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. + + Gestural domain attributes. + Gestural domain attributes. + + Gestural domain attributes. - + - - Groups elements which form part of a geographic name. + + Gestural domain attributes. - + + - - Groups elements which contain names of individuals or corporate bodies. + + 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. - - + - - Groups geographic name elements. + + Gestural domain attributes for staffDef in the CMN repertoire. - - + + + + - - Groups elements that serve as stylistic labels. + + Gestural domain attributes. - + - - Groups place name elements. + + Gestural domain attributes. - + - - 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. - +
+ Gestural domain attributes. + + + + Gestural domain attributes. + - - - - - - -

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. + +
+ Gestural 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 + document. + + + + + + + @chordref attribute + should have content. + The value in @chordref should correspond to the @xml:id attribute of a chordDef + element. + + + + + + + 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 represent single figured bass elements. + + Groups elements that record indications of harmony. + + + + chord definitionChord tablature definition. + - - - - + + -

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. +

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. + + - - - - - + -

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 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. - - - - - - + -

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. +

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. + + + + + + + figured bassSymbols added to a bass line that indicate harmony. Used to improvise a + chordal accompaniment. Sometimes called Generalbass, thoroughbass, or basso continuo. + - - - + - - -

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. + + harmonyAn indication of harmony, e.g., chord names, tablature grids, harmonic + analysis, figured bass. + + - - - + - - Contains a forename, given or baptismal name. + + + + + Must have one of the + attributes: startid, tstamp, tstamp.ges or tstamp.real. + + + + Groups elements that may appear as part of a description of 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. + - - - - + -

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. +

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).

+
file description(file description) – Contains a full bibliographic description of the MEI file. + Used to point to other elements that correspond to this one in a generic fashion. + + + + + + + @corresp attribute should have content. + + + + +

The @corresp attribute on fileDesc may point to a more complete version of this content in a less restricted version of MEI.

+
+

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. + + + The meiHead type attribute can have the value 'music' + only when the document element is "mei". + + + The meiHead type attribute can have the value + 'corpus' only when the document element is "meiCorpus". + + + The meiHead type attribute can have the value + '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. + + + Header is attached to a music document. + + + Header is attached to a corpus. + + + Header is independent; i.e., not attached to either a music or a corpus + document. + + + +

For MEI Basic, an MEI header may contain a fileDesc element only.

+
publication statement(publication statement) – Container 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. +

This element is modelled on an element in the Text Encoding Initiative (TEI) standard. + In MEI Basic, it may contain only publisher, publishing place, date and availability information, in that order.

+
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).

+
+ 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. + - - + + + + + - + + + -

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 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. +

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. + + + + + - - - - - - -

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. - + + + + + +

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

+
+ 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. + + + + + + + @instr attribute + should have content. + The value in @instr should correspond to the @xml:id attribute of an instrDef + element. + + + + + + + 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. + + + + + + Provides a General MIDI label for the MIDI instrument. + + + + + + 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. + + + + + + Records a non-General MIDI patch/instrument name. + + + + + + Records a non-General MIDI patch/instrument number. + + + + + + Sets the instrument’s volume. + + + + + + + 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*. + + + + + + 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. + + + + + + + Attributes that record MIDI values. + + + MIDI number. + + + + + + + Attributes that record terminal MIDI values. + + + MIDI number. + + + + + + + MIDI attributes pertaining to key velocity. + + + MIDI Note-on/off velocity. + + + + + + + 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. + + + + + + + Groups elements which group MIDI-like elements. + + + + + 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 +5415,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 +5429,6 @@ - - Provides a choice between structured and unstructured/mixed content. - - - Groups elements that may appear as part of a bibliographic title. @@ -6042,16 +5508,6 @@ -
- Logical domain attributes. - - Logical domain attributes. - - - - - - Logical domain attributes. @@ -6079,7 +5535,7 @@ - + An element with a dots attribute must also have a dur @@ -6145,7 +5601,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 +5641,9 @@ - - Logical domain attributes. Attributes that record the shape of a clef. - + When @shape is present, @line must also be @@ -6205,7 +5659,18 @@ - Attributes common to many elements. + + Visual color attributes. + + + Used to indicate visual appearance. Do not confuse this with the musical term 'color' + as used in pre-CMN notation. + + + + + + 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 +5753,7 @@ - + @data attribute should @@ -6300,12 +5765,6 @@ - - Attributes that capture the dimensions of an entity. - - - - Logical domain attributes. @@ -6314,24 +5773,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. @@ -6388,54 +5829,27 @@ - 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. + Attributes that apply to all written events, e.g., note, chord, rest, etc. + Attributes that describe extension symbols, typically lines. Members of this class are + also typically members of the att.lineRend class. - - + - - Indicates the nesting level of staff grouping symbols. + + Indicates the presence of an extension symbol, typically a line. - + - - Attributes that describe vertical size. + + Attributes that record the function (i.e., placement) of forme work elements. - - Measurement of the vertical dimension of an entity. + + Records the function (i.e., placement) of a page header or footer. - + @@ -6461,29 +5875,11 @@ - - 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. - + Written key signature. @@ -6495,6 +5891,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 +5930,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. @@ -6580,120 +5987,48 @@ - Attributes that record the basic visual rendition of lines. - - - line form - Describes the line style of a line. - - - - - - - Describes the number of segments into which a dashed or dotted line may be divided, or - the number of "peaks" of a wavy line; a pair of space-separated values (minimum and - maximum, respectively) provides a range between which a rendering system-supplied value - may fall, while a single value indicates a fixed amount of space; that is, the minimum and - maximum values are equal. - - - 2 - - - - - - @lform attribute - matching "dashed", "dotted", or "wavy" required. - - - - - - Width of a line. - - - - - - - - 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 basic visual rendition of lines. + + + + Describes the style of a line. + + + + + + Width of a line. + + + + + + Describes the number of segments into which a dashed or dotted line may be divided, or + the number of "peaks" of a wavy line; a pair of space-separated values (minimum and + maximum, respectively) provides a range between which a rendering system-supplied value + may fall, while a single value indicates a fixed amount of space; that is, the minimum and + maximum values are equal. + + + 2 + + + + + + @lform attribute + matching "dashed", "dotted", or "wavy" required. + + + + - - Attributes that record the version of MEI in use. - - - Specifies a generic MEI version label. - - - This version of MEI. - - - - - + Attributes that record the version of MEI in use.Specifies a generic MEI version label.5.0 + MEI 5.0 + + MEI 5.0+basic + Attributes that provide information about a measure's conformance to the prevailing meter. @@ -6776,7 +6111,7 @@ - + @nymref attribute @@ -6876,14 +6211,6 @@ - - Logical domain attributes. - - - - - - Attributes that record written pitch name. @@ -6901,16 +6228,6 @@ - - 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. - - - - - Attributes capturing placement information with respect to an event. @@ -6944,7 +6261,7 @@ - + @plist attribute @@ -6957,90 +6274,37 @@ - - 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. - - - - - - + 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. - - - + + 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. Logical domain attributes. @@ -7055,8 +6319,6 @@ - - Logical domain attributes. Logical domain attributes. @@ -7068,7 +6330,7 @@ - + Logical domain attributes for staffDef. @@ -7116,8 +6378,6 @@ - - Logical domain attributes. Attributes for identifying the staff associated with the current feature. @@ -7142,7 +6402,7 @@ - + @endid attribute @@ -7164,7 +6424,7 @@ - + @startid attribute @@ -7258,11 +6518,6 @@ - - Logical domain attributes. - - - Logical domain attributes. @@ -7386,6 +6641,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. @@ -7445,6 +6717,88 @@ + + 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. + + + 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 + staff lines. + + + + + + + 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 + staff lines. + + + + + + + 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. + + + Records the horizontal adjustment of a feature’s programmatically-determined start + point. + + + + + + Records the horizontal adjustment of a feature’s programmatically-determined end + point. + + + + + + + Vertical offset attributes requiring a pair of attributes. + + + Records a vertical adjustment of a feature’s programmatically-determined start + point. + + + + + + Records a vertical adjustment of a feature’s programmatically-determined end + point. + + + + + Attributes that describe the symbol used to group volta elements. @@ -7477,7 +6831,7 @@ 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 - be turned off locally by setting the xml:space attribute to the value "default". + be turned off locally by setting the xml:space attribute to the value default. Allows the application to handle white space as necessary. Not including an @@ -7510,7 +6864,7 @@ - + Groups annotation-like elements. @@ -7522,11 +6876,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 +6893,8 @@ - - + + Groups elements which describe a measurement forming part of the physical dimensions of an @@ -7553,12 +6902,6 @@ - - Groups elements containing bibliographic edition information. - - - - Groups editorial intervention elements. @@ -7584,15 +6927,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 +6953,7 @@ Groups elements that function like line beginnings. - + @@ -7636,8 +6971,6 @@ Groups milestone-style elements found in music notation. - - Groups milestone-style elements found in text. Groups elements that contain names. @@ -7653,14 +6986,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 +7019,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 +7078,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,15 +7092,13 @@ 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,182 +7113,35 @@ 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 + 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. - - - - - - - - - - - -

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 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. + unchanged. - + + + + + + articulationAn indication of how to play a note or chord. + - + + + - + + - - Contains the whole of a single musical text, excluding any front or back matter. + + +

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.

+
Contains the whole of a single musical text, excluding any front or back matter. @@ -7985,7 +7166,7 @@ - + Must have one of the @@ -8006,50 +7187,24 @@ 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. + A simultaneous sounding of two or more notes in the same layer *with the same + duration*. + + + - - + - - - -

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 + + Indication of the exact location of a particular note on the staff and, therefore, the other notes as well. - + @@ -8057,7 +7212,7 @@ - + @@ -8065,7 +7220,7 @@ staff. - + @@ -8083,9 +7238,9 @@ - - - + + + @@ -8100,173 +7255,11 @@ - 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. + 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 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. + 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 +7270,7 @@ - + Must have one of the @@ -8292,33 +7285,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 +7296,14 @@ - + Must have one of the attributes: startid, tstamp, tstamp.ges or tstamp.real. - + When @val2 is present, either @@ -8351,265 +7317,29 @@ starting point of the dynamic marking 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 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. + 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. - - - - - -

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.

+

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. @@ -8636,15 +7366,15 @@ An independent stream of events on a staff. - + - + - + @@ -8658,24 +7388,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. - - - - - - - - - - - - - - - - - line beginningAn empty formatting element that forces text to begin on a new + line beginningAn empty formatting element that forces text to begin on a new line. @@ -8690,35 +7403,7 @@ 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. + Person or organization who is a writer of the text of a song. @@ -8732,20 +7417,6 @@ - - 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 +7429,7 @@ - + The values in @staff must correspond to @n attribute of a staffDef @@ -8770,17 +7441,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 +7450,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 +7472,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 +7482,7 @@ - + Must have one of the @@ -8920,21 +7495,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 +7502,7 @@ - + @@ -8955,34 +7515,15 @@ 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. + + - - 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 @@ -8991,132 +7532,33 @@ 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. - - - - - - - - - - - - - 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 +7576,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 +7590,7 @@ - + At least one element pair (a resp element and a name-like element) is @@ -9195,7 +7610,7 @@ - + @@ -9206,29 +7621,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 +7639,8 @@ Full score view of the musical content. - - + + @@ -9252,7 +7651,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 +7665,7 @@ - + A @@ -9277,19 +7676,7 @@

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).

+ objects or annotations.

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 +7689,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 +7724,12 @@ encoding order of the staff definitions.

staff definitionContainer for staff meta-information. - + - + @@ -9404,7 +7739,7 @@ - + @@ -9416,7 +7751,7 @@ permitted. - + @@ -9424,7 +7759,7 @@ current staff. - + @@ -9433,14 +7768,14 @@ exist. - + The clef position must be less than or equal to the number of lines on the staff. - + @@ -9449,7 +7784,7 @@ less than or equal to the number of lines on the staff. - + @@ -9457,7 +7792,7 @@ number of values as there are staff lines. - + @@ -9467,7 +7802,7 @@ lines. - + @@ -9484,7 +7819,7 @@ - + @@ -9495,7 +7830,7 @@ - + @@ -9506,7 +7841,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 +7850,7 @@ for the n attribute. - + @@ -9534,7 +7869,7 @@ - + @@ -9546,13 +7881,13 @@ - - + + - + In the symbolDef context, symbol must have @@ -9581,10 +7916,10 @@ - + - + Only analog, class, label, mm, mm.dots, mm.unit, n, translit, type, xml:base, xml:id, @@ -9592,67 +7927,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. + Title of a bibliographic entity. - + @@ -9736,101 +8025,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. @@ -9882,279 +8077,31 @@ - - - Records the location at which the strings should be stopped against a fret in a - fretboard diagram. This may or may not be the same as the actual location on the fretboard - of the instrument in performance. - - - 1 - 5 - - - -

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. - + + + Records the location at which the strings should be stopped against a fret in a + fretboard diagram. This may or may not be the same as the actual location on the fretboard + of the instrument in performance. + + + 1 + 5 + + + +

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.

+
Visual domain attributes. Visual domain attributes. + - - + + - + @@ -10188,53 +8135,16 @@
- - Visual form of the line. - - - - - - Width of the line. - - - -
-
- Visual domain attributes. - - - - - - - - - - - - - - + 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 is a single thick, slanting slash; therefore, the value 1 should be used. When the beat @@ -10244,88 +8154,51 @@ - - - - Visual domain attributes. - - - - - - - - - - - - + Visual domain attributes. Visual domain attributes. - - Visual domain attributes. - - - - - - - - - - - - - Visual domain attributes. - - Visual domain attributes. - + Visual domain attributes.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. + 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 + boundaries of the cluster note head. + + + + Visual domain attributes. + - - + - + - - Visual domain attributes. Visual domain attributes. - + - - - - - - - Visual domain attributes. - - - - - - - - + + Visual domain attributes. - + - - + + @@ -10338,22 +8211,47 @@ 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. + Describes the visual appearance of the fermata; that is, whether it occurs as upright + or inverted. + + + Inverted, i.e., curve or bracket below the dot. + + + Upright; i.e., curve or bracket above the dot. + + + + Describes the visual appearance of the fermata; that is, whether it has a curved, + square, or angular shape. + + + A curve above or below the dot. + + + A bracket above or below the dot. + + + A triangle above or below the dot. + + + Visual domain attributes. - + - + @@ -10364,11 +8262,11 @@ Visual domain attributes. - - + + - - + + @@ -10376,17 +8274,7 @@ Visual domain attributes. - - - - Visual domain attributes. - - - - - - - + Visual domain attributes. The startho and startvo attributes record the horizontal and @@ -10398,12 +8286,12 @@ 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. - + - - + + @@ -10438,45 +8326,40 @@ Visual domain attributes. - + - + - + - + Visual domain attributes. + Describes how the harmonic indication should be rendered. + + + Chord tablature grid. + + + Chord tablature grid and the element’s textual content. + + + Textual content of the element. + + + Visual domain attributes. - - + + - - - - - Visual domain attributes. - - - - - - - + Visual domain attributes. - - - Visual domain attributes. - - - - Visual domain attributes. The vo attribute is the vertical offset (from its normal @@ -10486,61 +8369,54 @@ lines. Startto and endto describe the start and end points in terms of time; that is, beats. - - - - - + + + + + - - - Visual domain attributes. - - - Visual domain attributes. - + - + Visual domain attributes. + - - + - + Visual domain attributes. - + - + - - + Visual domain attributes. - + - + @@ -10548,12 +8424,13 @@ Visual domain attributes. - - + + + @@ -10569,24 +8446,24 @@ Visual domain attributes. - + - + Visual domain attributes. + - - + - + @@ -10595,10 +8472,10 @@ Visual domain attributes. - - - - + + + + @@ -10606,11 +8483,11 @@ Visual domain attributes. - + - - + + @@ -10636,13 +8513,13 @@ allows the full range of values. - - + + - + @@ -10653,41 +8530,43 @@ - - Visual domain attributes. - - - - - - - - Visual domain attributes. - + - + Visual domain attributes. - + - + - Visual domain attributes. + Visual domain attributes. + + + + + + + + + Visual domain attributes. + Visual domain attributes. + + @@ -10701,8 +8580,6 @@ - - Visual domain attributes. Visual domain attributes. @@ -10717,12 +8594,12 @@ Visual domain attributes for slur. The vo attribute is the vertical offset (from its normal position) of the entire rendered slur/phrase mark. - - - - - + + + + + @@ -10770,31 +8647,20 @@ - + - + Visual domain attributes. Visual domain attributes. - - - - - - - - - - Visual domain attributes. - - + - - + + @@ -10806,33 +8672,33 @@ lines. Startto and endto describe the start and end points in terms of time; that is, beats. - - - - - + + + + + Visual domain attributes. + - - + - + - - + + Visual domain attributes. - + @@ -10871,40 +8737,40 @@ Visual domain attributes. + - - + - + Visual domain attributes. - + - + Visual domain attributes. - + - + - +
- +
\ No newline at end of file diff --git a/libmei/mei/develop/mei-verovio.xml b/libmei/mei/mei-verovio.xml similarity index 97% rename from libmei/mei/develop/mei-verovio.xml rename to libmei/mei/mei-verovio.xml index 4c9a796df64..3d2a80d1fee 100644 --- a/libmei/mei/develop/mei-verovio.xml +++ b/libmei/mei/mei-verovio.xml @@ -91,7 +91,7 @@ Specifies a generic MEI version label. - 5.0.0-dev + 5.0 MEI 2013 @@ -105,11 +105,20 @@ MEI 4.0.1 - - MEI basic + + MEI 5.0 - - Development version of MEI 5.0.0 + + MEI 5.0+basic + + + MEI 5.0+CMN + + + MEI 5.0+Mensural + + + MEI 5.0+Neumes @@ -243,7 +252,7 @@ - + @@ -259,7 +268,7 @@ - + @@ -296,7 +305,7 @@ - +

This element is necessary to allow round-tripping between page-based and score-based (regular) MEI.

diff --git a/libmei/mei/mei-verovio_compiled.odd b/libmei/mei/mei-verovio_compiled.odd new file mode 100644 index 00000000000..a3ca3632df4 --- /dev/null +++ b/libmei/mei/mei-verovio_compiled.odd @@ -0,0 +1,20504 @@ + + + + + Music Encoding Initiative Guidelines – Verovio customization + + Authored by + Laurent Pugin + Andrew Hankinson + Perry Roland + Klaus Rettinghaus + + + +

+ + +

+ + + + + Added att.margins. + + + Moved to PureODD. + + + Add all supported versions of MEI. + + + Include tablature preliminary proposal. + + + Changing to /measure/staff organisation; adding /pages container in /mdiv; adding /page@position; changing scb to secb. + + + Adding /staff/measure organisation and other fixes. + + + Fixing naming according to MEI convention and other small fixes. + + + Initial setup of the customization. + + + + + + + + + + Written accidental values. + + + + +

+ +

+
+ + Written standard accidental values. + + + + Sharp. + + + Flat. + + + Double sharp (written as 2 sharps). + + + Double sharp (written using croix). + + + Double flat. + + + Triple sharp (written as a croix followed by a sharp). + + + Triple sharp (written as a sharp followed by a croix). + + + Triple sharp (written as 3 sharps). + + + Triple flat. + + + Natural. + + + Natural + flat; used to cancel preceding double flat. + + + Natural + sharp; used to cancel preceding double sharp. + + + + + Written quarter-tone accidental values. + + + + + Sharp note raised by quarter tone (sharp modified by arrow). + + + Sharp note lowered by quarter tone (sharp modified by arrow). + + + Flat note raised by quarter tone (flat modified by arrow). + + + Flat note lowered by quarter tone (flat modified by arrow). + + + Natural note raised by quarter tone (natural modified by arrow). + + + Natural note lowered by quarter tone (natural modified by arrow). + + + Double sharp note raised by quarter tone (double sharp modified by arrow). + + + Double sharp note lowered by quarter tone (double sharp modified by arrow). + + + Double flat note raised by quarter tone (double flat modified by arrow). + + + Double flat note lowered by quarter tone (double flat modified by arrow). + + + + 1/4-tone flat accidental. + + + 3/4-tone flat accidental. + + + 1/4-tone sharp accidental. + + + 3/4-tone sharp accidental. + + + + + Arel-Ezgi-Uzdilek (AEU) accidental values (written and gestural/performed). + + + + Büyük mücenneb (sharp). + + + Küçük mücenneb (sharp). + + + Bakiye (sharp). + + + Koma (sharp). + + + Koma (flat). + + + Bakiye (flat). + + + Küçük mücenneb (flat). + + + Büyük mücenneb (flat). + + + + +

+ +

+
+
+ Persian accidental values (written and gestural/performed). + + + + Koron (quarter tone flat). + + + Sori (quarter tone sharp). + + + + + Gestural/performed standard accidental values. + + + + + Gestural/performed accidental values. + + + + Sharp. + + + Flat. + + + Double sharp. + + + Double flat. + + + Triple sharp. + + + Triple flat. + + + Natural. + + + + + Gestural/performed quarter-tone accidental values. + + + + Three quarter-tones sharp. + + + Quarter-tone sharp. + + + Quarter-tone flat. + + + Three quarter-tones flat. + + + Five quarter-tones sharp. + + + Five quarter-tones flat. + + + + + 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). + + + Inverted accent. + + + Long accent, used to indicate an elongated accent mark. It is the responsibility of the encoder to distinguish between accents and hairpins. + + + Soft accent, see SMuFL Articulation supplement (U+ED40–U+ED4F). + + + Staccato (Unicode 1D17C). + + + Tenuto (Unicode 1D17D). + + + Staccatissimo (Unicode 1D17E). + + + Marcato (Unicode 1D17F). + + + Spiccato. + + + Stress (Unicode 00B4). + + + Unstress (Unicode 02D8). + + + Main note followed by short slide to higher, indeterminate pitch (Unicode + 1D185). + + + Main note preceded by short slide from lower, indeterminate pitch (Unicode + 1D186). + + + Main note preceded by long slide from lower, often indeterminate pitch; also known + as "squeeze". + + + Main note preceded by "slide" from higher, indeterminate pitch. + + + Main note followed by short "slide" to lower, indeterminate pitch. + + + Main note followed by long "slide" to lower, indeterminate pitch. + + + "lip slur" to lower pitch, then return to written pitch. + + + Main note followed by quick upward rise, then descent in pitch (Unicode + 1D187). + + + (Unicode 1D188). + + + Alternation between written pitch and next highest overtone (brass instruments) or + note minor third higher (woodwinds). + + + Down bow (Unicode 1D1AA). + + + Up bow (Unicode 1D1AB). + + + Harmonic (Unicode 1D1AC). + + + Snap pizzicato (Unicode 1D1AD). + + + Fingernail (Unicode 1D1B3). + + + Stop harp string from sounding (Unicode 1D1B4). + + + Stop all harp strings from sounding (Unicode 1D1B5). + + + Full (as opposed to stopped) tone. + + + "muffled" tone. + + + Double tongue (Unicode 1D18A). + + + Triple tongue (Unicode 1D18B). + + + Use heel (organ pedal). + + + Use toe (organ pedal). + + + Percussive effect on guitar string(s). + + + Left-hand pizzicato. + + + Uninterpreted dot. + + + Uninterpreted stroke. + + + + + + + "" contains a deprecated value. + + + "" contains a deprecated value. + + + + + 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 + of bar lines. + + + + Between staves only. + + + Between and across staves as necessary. + + + Short bar line through a subset of staff lines. + + + + + Renderings of bar lines. Some values correspond to the Western Musical Symbols portion of + the Unicode Standard. + + + + Dashed line (SMuFL E036 and Unicode 1D104). + + + Dotted line (SMuFL E037). + + + Double bar line (SMuFL E031 and Unicode 1D101). + + + Double dashed line. + + + Double dotted line. + + + Heavy double bar line (SMuFL E035). + + + Segno serpent with vertical lines (SMuFL E04B). + + + End bar line (SMuFL E032 and Unicode 1D102). + + + Heavy bar line (SMuFL E034). + + + Bar line not rendered. + + + Repeat start (SMuFL E040 and Unicode 1D106). + + + Repeat start and end (SMuFL E042). + + + Repeat end (SMuFL E041 and Unicode 1D107). + + + Segno serpent. + + + Single bar line (SMuFL E030 and Unicode 1D100). + + + + + 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. + + + + The beam is above the events it affects. + + + The beam is below the events it affects. + + + The beam is above and below the events it affects. + + + + + 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. + + + 1|2|3|4|5 + + mixed + + + + 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 + + [0-9](\.25|\.5|\.75)? + + full + + + + Boolean attribute values. + + + + True. + + + False. + + + + + 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 + does not wish to assert an opinion about the matter. + + + + High certainty. + + + Medium certainty. + + + Low certainty. + + + An unknown level of certainty. + + + + + 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 + Standard. + + + + G clef (Unicode 1D11E). + + + Double G clef. Sounds one octave lower than G clef. (See remarks on usage below.) + + + F clef (Unicode 1D122). + + + C clef (Unicode 1D121). + + + Drum clef (Unicode 1D125 or Unicode 1D126). + + + Tablature "clef"; i.e., usually "TAB" rendered vertically. + + + + +

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. + + + + White keys. + + + Black keys. + + + Mixed black and white keys. + + + + + 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. + + + + Hex: #f0f8ff / RGB: 240,248,255 + + + Hex: #faebd7 / RGB: 250,235,215 + + + Hex: #00ffff / RGB: 0,255,255 + + + Hex: #7fffd4 / RGB: 127,255,212 + + + Hex: #f0ffff / RGB: 240,255,255 + + + Hex: #f5f5dc / RGB: 245,245,220 + + + Hex: #ffe4c4 / RGB: 255,228,196 + + + Hex: #000000 / RGB: 0,0,0 + + + Hex: #ffebcd / RGB: 255,235,205 + + + Hex: #0000ff / RGB: 0,0,255 + + + Hex: #8a2be2 / RGB: 138,43,226 + + + Hex: #a52a2a / RGB: 165,42,42 + + + Hex: #deb887 / RGB: 222,184,135 + + + Hex: #5f9ea0 / RGB: 95,158,160 + + + Hex: #7fff00 / RGB: 127,255,0 + + + Hex: #d2691e / RGB: 210,105,30 + + + Hex: #ff7f50 / RGB: 255,127,80 + + + Hex: #6495ed / RGB: 100,149,237 + + + Hex: #fff8dc / RGB: 255,248,220 + + + Hex: #dc143c / RGB: 220,20,60 + + + Hex: #00ffff / RGB: 0,255,255 + + + Hex: #00008b / RGB: 0,0,139 + + + Hex: #008b8b / RGB: 0,139,139 + + + Hex: #b8860b / RGB: 184,134,11 + + + Hex: #a9a9a9 / RGB: 169,169,169 + + + Hex: #006400 / RGB: 0,100,0 + + + Hex: #a9a9a9 / RGB: 169,169,169 + + + Hex: #bdb76b / RGB: 189,183,107 + + + Hex: #8b008b / RGB: 139,0,139 + + + Hex: #556b2f / RGB: 85,107,47 + + + Hex: #ff8c00 / RGB: 255,140,0 + + + Hex: #9932cc / RGB: 153,50,204 + + + Hex: #8b0000 / RGB: 139,0,0 + + + Hex: #e9967a / RGB: 233,150,122 + + + Hex: #8fbc8f / RGB: 143,188,143 + + + Hex: #483d8b / RGB: 72,61,139 + + + Hex: #2f4f4f / RGB: 47,79,79 + + + Hex: #2f4f4f / RGB: 47,79,79 + + + Hex: #00ced1 / RGB: 0,206,209 + + + Hex: #9400d3 / RGB: 148,0,211 + + + Hex: #ff1493 / RGB: 255,20,147 + + + Hex: #00bfff / RGB: 0,191,255 + + + Hex: #696969 / RGB: 105,105,105 + + + Hex: #696969 / RGB: 105,105,105 + + + Hex: #1e90ff / RGB: 30,144,255 + + + Hex: #b22222 / RGB: 178,34,34 + + + Hex: #fffaf0 / RGB: 255,250,240 + + + Hex: #228b22 / RGB: 34,139,34 + + + Hex: #ff00ff / RGB: 255,0,255 + + + Hex: #dcdcdc / RGB: 220,220,220 + + + Hex: #f8f8ff / RGB: 248,248,255 + + + Hex: #ffd700 / RGB: 255,215,0 + + + Hex: #daa520 / RGB: 218,165,32 + + + Hex: #808080 / RGB: 128,128,128 + + + Hex: #008000 / RGB: 0,128,0 + + + Hex: #adff2f / RGB: 173,255,47 + + + Hex: #808080 / RGB: 128,128,128 + + + Hex: #f0fff0 / RGB: 240,255,240 + + + Hex: #ff69b4 / RGB: 255,105,180 + + + Hex: #cd5c5c / RGB: 205,92,92 + + + Hex: #4b0082 / RGB: 75,0,130 + + + Hex: #fffff0 / RGB: 255,255,240 + + + Hex: #f0e68c / RGB: 240,230,140 + + + Hex: #e6e6fa / RGB: 230,230,250 + + + Hex: #fff0f5 / RGB: 255,240,245 + + + Hex: #7cfc00 / RGB: 124,252,0 + + + Hex: #fffacd / RGB: 255,250,205 + + + Hex: #add8e6 / RGB: 173,216,230 + + + Hex: #f08080 / RGB: 240,128,128 + + + Hex: #e0ffff / RGB: 224,255,255 + + + Hex: #fafad2 / RGB: 250,250,210 + + + Hex: #d3d3d3 / RGB: 211,211,211 + + + Hex: #90ee90 / RGB: 144,238,144 + + + Hex: #d3d3d3 / RGB: 211,211,211 + + + Hex: #ffb6c1 / RGB: 255,182,193 + + + Hex: #ffa07a / RGB: 255,160,122 + + + Hex: #20b2aa / RGB: 32,178,170 + + + Hex: #87cefa / RGB: 135,206,250 + + + Hex: #778899 / RGB: 119,136,153 + + + Hex: #778899 / RGB: 119,136,153 + + + Hex: #b0c4de / RGB: 176,196,222 + + + Hex: #ffffe0 / RGB: 255,255,224 + + + Hex: #00ff00 / RGB: 0,255,0 + + + Hex: #32cd32 / RGB: 50,205,50 + + + Hex: #faf0e6 / RGB: 250,240,230 + + + Hex: #ff00ff / RGB: 255,0,255 + + + Hex: #800000 / RGB: 128,0,0 + + + Hex: #66cdaa / RGB: 102,205,170 + + + Hex: #0000cd / RGB: 0,0,205 + + + Hex: #ba55d3 / RGB: 186,85,211 + + + Hex: #9370db / RGB: 147,112,219 + + + Hex: #3cb371 / RGB: 60,179,113 + + + Hex: #7b68ee / RGB: 123,104,238 + + + Hex: #00fa9a / RGB: 0,250,154 + + + Hex: #48d1cc / RGB: 72,209,204 + + + Hex: #c71585 / RGB: 199,21,133 + + + Hex: #191970 / RGB: 25,25,112 + + + Hex: #f5fffa / RGB: 245,255,250 + + + Hex: #ffe4e1 / RGB: 255,228,225 + + + Hex: #ffe4b5 / RGB: 255,228,181 + + + Hex: #ffdead / RGB: 255,222,173 + + + Hex: #000080 / RGB: 0,0,128 + + + Hex: #fdf5e6 / RGB: 253,245,230 + + + Hex: #808000 / RGB: 128,128,0 + + + Hex: #6b8e23 / RGB: 107,142,35 + + + Hex: #ffa500 / RGB: 255,165,0 + + + Hex: #ff4500 / RGB: 255,69,0 + + + Hex: #da70d6 / RGB: 218,112,214 + + + Hex: #eee8aa / RGB: 238,232,170 + + + Hex: #98fb98 / RGB: 152,251,152 + + + Hex: #afeeee / RGB: 175,238,238 + + + Hex: #db7093 / RGB: 219,112,147 + + + Hex: #ffefd5 / RGB: 255,239,213 + + + Hex: #ffdab9 / RGB: 255,218,185 + + + Hex: #cd853f / RGB: 205,133,63 + + + Hex: #ffc0cb / RGB: 255,192,203 + + + Hex: #dda0dd / RGB: 221,160,221 + + + Hex: #b0e0e6 / RGB: 176,224,230 + + + Hex: #800080 / RGB: 128,0,128 + + + Hex: #663399 / RGB: 102,51,153 + + + Hex: #ff0000 / RGB: 255,0,0 + + + Hex: #bc8f8f / RGB: 188,143,143 + + + Hex: #4169e1 / RGB: 65,105,225 + + + Hex: #8b4513 / RGB: 139,69,19 + + + Hex: #fa8072 / RGB: 250,128,114 + + + Hex: #f4a460 / RGB: 244,164,96 + + + Hex: #2e8b57 / RGB: 46,139,87 + + + Hex: #fff5ee / RGB: 255,245,238 + + + Hex: #a0522d / RGB: 160,82,45 + + + Hex: #c0c0c0 / RGB: 192,192,192 + + + Hex: #87ceeb / RGB: 135,206,235 + + + Hex: #6a5acd / RGB: 106,90,205 + + + Hex: #708090 / RGB: 112,128,144 + + + Hex: #708090 / RGB: 112,128,144 + + + Hex: #fffafa / RGB: 255,250,250 + + + Hex: #00ff7f / RGB: 0,255,127 + + + Hex: #4682b4 / RGB: 70,130,180 + + + Hex: #d2b48c / RGB: 210,180,140 + + + Hex: #008080 / RGB: 0,128,128 + + + Hex: #d8bfd8 / RGB: 216,191,216 + + + Hex: #ff6347 / RGB: 255,99,71 + + + Hex: #40e0d0 / RGB: 64,224,208 + + + Hex: #ee82ee / RGB: 238,130,238 + + + Hex: #f5deb3 / RGB: 245,222,179 + + + Hex: #ffffff / RGB: 255,255,255 + + + Hex: #f5f5f5 / RGB: 245,245,245 + + + Hex: #ffff00 / RGB: 255,255,0 + + + Hex: #9acd32 / RGB: 154,205,50 + + + + +

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 + + + #[0-9A-Fa-f]{6,6} + + #[0-9A-Fa-f]{8,8} + + rgb\((\s*(([01]?[0-9]?[0-9])|2[0-4][0-9]|25[0-5])\s*,\s*){2}([01]?[0-9]?[0-9]|2[0-4][0-9]|25[0-5])\s*\) + + rgba\(\s*(([01]?[0-9]?[0-9]|2[0-4][0-9]|25[0-5])\s*,\s*){3}(0(\.\d+)?|1(\.0+)?)\s*\)|rgba\(\s*(((\d{1,2})?%|100%)\s*,\s*){2}(\d{1,2}%|100%)\s*,\s*(0(\.\d+)?|1(\.0+)?)\s*\) + + hsl\(\s*((\d{1,2})|[12]\d{2}|3[0-5]\d|360)\s*,\s*(\d{1,2}%|100%)\s*,\s*(\d{1,2}%|100%)\s*\) + + hsla\(\s*(\d{1,2}|[12]\d{2}|3[0-5]\d|360)\s*,\s*(\d{1,2}%|100%)\s*,\s*(\d{1,2}%|100%)\s*,\s*(0(\.\d+)?|1(\.0+)?)\s*\) + + + + 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. + + + + + Basic compass directions. + + + + In a northern direction. + + + In an eastern direction. + + + In a southern direction. + + + In a western direction. + + + + + Additional compass directions. + + + + In a north-eastern direction. + + + In a north-western direction. + + + In a south-eastern direction. + + + In a south-western direction. + + + + + 360th-unit measure of a circle’s circumference; optionally signed decimal number between + -360 and 360. + + + 360.0 + -360.0 + + + + Divisio values. + + + + Divisio ternaria. Three semibreves in a breve. + + + Divisio quaternaria. Foursemibreves in a breve. + + + Divisio senaria imperfecta. Six semibreves in a breve (breve is divided into two, then into three). Aka senaria gallica. + + + Divisio senaria perfecta. Six semibreves in a breve (breve is divided into three, then into two). Aka senaria italica. + + + Divisio octonaria. Eight semibreves in a breve. + + + Divisio novenaria. Nine semibreves in a breve. + + + Divisio duodenaria. Twelve semibreves in a breve. + + + + + Logical, that is, written, duration attribute values. + + + + + Logical, that is, written, duration attribute values for rests. + + + + + Performed duration attribute values. + + + + + Enclosures for editorial notes, accidentals, articulations, etc. + + + + Parentheses: ( and ). + + + Square brackets: [ and ]. + + + Box. + + + None. + + + + + 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. + + + + Above. + + + Below. + + + Left. + + + Right. + + + + + Location of musical material relative to a symbol other than a staff. + + + + Above and left; north-west. + + + Above and right; north-east. + + + Below and left; south-west. + + + Below and right; south-east. + + + + + 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 + + + Filled + + + Top half filled + + + Bottom half filled + + + Left half filled + + + Right half filled + + + + + Font family (for text) attribute values. + + + + + Font name (for text) attribute values. + + + + + Font size expressions. + + + + + Font size expressed as numbers; i.e., points or virtual units. + + + \d*(\.\d+)?(pt|vu) + + + + (pt|vu) + + 0+(pt|vu) + + 0+(\.0+)?(pt|vu) + + \.0+(pt|vu) + + + + + + Relative size of symbol that may begin/end a line. + + + 1 + 9 + + + + Font size expressed as relative term. + + + + Smaller than x-small. + + + Smaller than small, larger than xx-small. + + + Smaller than normal, larger than x-small. + + + Smaller than large, larger than small. + + + Smaller than x-large, larger than normal. + + + Smaller than xx-large, larger than large. + + + Larger than x-large. + + + One size smaller than the current size. + + + One size larger than the current size. + + + + + Font style (for text) attribute values. + + + + Text slants to right. + + + Unadorned. + + + Text slants to the left. + + + + + Font weight (for text) attribute values. + + + + Bold or heavy. + + + Not bold. + + + + + In string tablature, the fret number. The value 0 (zero) indicates the open + string. + + + + + Analytical glissando attribute values. + + + + First note/chord in glissando. + + + Note/chord that’s neither first nor last in glissando. + + + Last note in glissando. + + + + + Do grace notes get time from the current (acc) or previous (unacc) one? + + + + Time "stolen" from following note. + + + Time "stolen" from previous note. + + + No interpretation regarding performed value of grace note. + + + + + Note head shapes. + + + + + Enumerated note head shapes. + + + + Filled, rotated oval (Unicode 1D158). + + + Unfilled, rotated oval (Unicode 1D157). + + + Unfilled, rotated oval (Unicode 1D15D). + + + Unfilled backslash (~ reflection of Unicode 1D10D). + + + Unfilled circle (Unicode 25CB). + + + Plus sign (Unicode 1D144). + + + Unfilled diamond (Unicode 1D1B9). + + + Unfilled isosceles triangle (Unicode 1D148). + + + Unfilled, unrotated oval (Unicode 2B2D). + + + Unfilled downward-pointing wedge (Unicode 1D154). + + + Unfilled rectangle (Unicode 25AD). + + + Unfilled right triangle (Unicode 1D14A). + + + Unfilled semi-circle (Unicode 1D152). + + + Unfilled slash (~ Unicode 1D10D). + + + Unfilled square (Unicode 1D146). + + + X (Unicode 1D143). + + + + + Hexadecimal number. + + + (#x|U\+)[A-F0-9]+ + + + + Data values for attributes that capture horizontal alignment. + + + + Left aligned. + + + Right aligned. + + + Centered. + + + Left and right aligned. + + + + + 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. + + + [0-9.,DHMPRSTWYZ/:+\-]+ + + + + 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. + + + mixed|0|([1-9]|1[0-2])[f|s] + + + + 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. + + + Two layers with opposing stems. + + + Two layers with 'floating' stems. + + + Three layers with opposing stems. + + + Three layers with 'floating' stems. + + + + + Ligature forms. + + + + Notes are "squeezed" together. + + + Individual notes are replaced by an oblique figure. + + + + + Visual form of a line. + + + + Dashed line. + + + Dotted line. + + + Straight, uninterrupted line. + + + Undulating line. + + + + + Symbol that may begin/end a line. + + + + 90 degree turn down (similar to Unicode 231D at end of line, 231C at start). + + + 90 degree turn up (similar to Unicode 231F at end of line, 231E at start). + + + 90 degree turn right (syntactic sugar for "angledown" for vertical or angled + lines). + + + 90 degree turn left (syntactic sugar for "angleup" for vertical or angled + lines). + + + Filled, triangular arrowhead (similar to Unicode U+25C0 or SMuFL U+EB78). + + + Open triangular arrowhead (similar to Unicode U+02C3 or SMuFL U+EB8A). + + + Unfilled, triangular arrowhead (similar to Unicode U+25C1 or SMuFL U+EB82). + + + Harpoon-shaped arrowhead left of line (similar to arrowhead of Unicode + U+21BD). + + + Harpoon-shaped arrowhead right of line (similar to arrowhead of Unicode + U+21BC). + + + Hauptstimme (Unicode U+1D1A6 or SMuFL U+E860). + + + Nebenstimme (Unicode U+1D1A7 or SMuFL U+E861). + + + Theme (SMuFL U+E864). + + + Theme, retrograde (SMuFL U+E865). + + + Theme, retrograde inversion (SMuFL U+E866). + + + Theme, inverted (SMuFL U+E867). + + + Theme (SMuFL U+E868). + + + Theme, inverted (SMuFL U+E869). + + + Choralemelodie (SMuFL U+E86A). + + + Hauptrhythmus (SMuFL U+E86B). + + + No start/end symbol. + + + + + Datatype of line width measurements. + + + + + Relative width of a line. + + + + Default line width. + + + Twice as wide as narrow. + + + Twice as wide as medium. + + + + + 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 + in the range of 0 to the number of remaining measures, while the beat number must be in the + range from 0 to the numerator of the time signature plus 1. For example, 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\s*\+\s*)?[0-9]+(\.?[0-9]*)? + + + + 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 + measure number, such as "1m+3", indicates a point in the following measure, while a value with + a negative measure number, such as "-1m+3", marks a point in the preceding measure. The beat + number must be in the range from 0 to the numerator of the time signature plus 1. For example, + 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, + 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, + 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 + 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 + 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 + positive values are allowed. + + + + + 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, + 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. + + + + Sign for tempus imperfectum. + + + Sign for tempus perfectum. + + + Sign for divisio ternaria. + + + Sign for divisio quaternaria. + + + Sign for divisio senaria imperfecta. + + + Sign for divisio senaria imperfecta. + + + Sign for divisio senaria gallica. + + + Sign for divisio senaria gallica. + + + Sign for divisio senaria perfecta. + + + Sign for divisio senaria perfecta. + + + Sign for divisio senaria ytalica. + + + Sign for divisio senaria ytalica. + + + Sign for divisio novenaria. + + + Sign for divisio octonaria. + + + Sign for divisio duodenaria. + + + + + Contains an indication of how a meter signature should be rendered. + + + + Show only the number of beats. + + + The lower number in the meter signature is replaced by a note symbol. + + + Meter signature rendered using traditional numeric values. + + + Meter signature rendered using both the symbol and the traditional numeric values. + + + + + Meter.sym attribute values for CMN. + + + + Common time; i.e., 4/4. + + + Cut time; i.e., 2/2. + + + Open time signature, i.e., Senza misura. See Gould pp. 611–615. + + + + + 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". + + + 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. + + + + + Common modes. + + + + Major mode. + + + Minor mode. + + + + + Gregorian modes. + + + + Dorian mode (the first mode). + + + Hypodorian mode (the second mode). + + + Phrygian mode (the third mode). + + + Hypophrygian mode (the fourth mode). + + + Hypolydian mode (the fifth mode). + + + Lydian mode (the sixth mode). + + + Mixolydian mode (the seventh mode). + + + Hypomixolydian mode (the eighth mode). + + + Tonus peregrinus (the ninth mode). + + + + + Modern modes. + + + + Ionian mode. + + + Hypoionian mode. + + + Aeolian mode. + + + Hypoaeolian mode. + + + Locrian mode. + + + Hypolocrian mode. + + + + + Bibliographic relationship values based on MODS version 3.4. + + + + Temporal predecessor of the resource. + + + Temporal successor to the resource. + + + Original form of the resource. + + + Parent containing the resource. + + + Intellectual or physical component of the resource. + + + Version of the resource’s intellectual content not changed enough to be a different + work. + + + Version of the resource in a different physical format. + + + Published bibliographic description, review, abstract, or index of the resource's + content. + + + Cited or referred to in the resource. + + + + + Maxima-long relationship values. + + + 2 + 3 + + + + Long-breve relationship values. + + + 2 + 3 + + + + Music font family. + + + + + "Convenience" datatype that permits combining enumerated values with a user-supplied + name. + + + + + "Convenience" datatype that permits combining enumerated values with user-supplied + values. + + + + + Non-staff location. + + + + At the foot of the page. + + + At the top of the page. + + + At the left of the page. + + + At the right of the page. + + + On the opposite, i.e., facing, page. + + + On the other side of the leaf. + + + At the end of this division; e.g., chapter, volume, etc. + + + Within a line text; i.e., an insertion. + + + Between the lines of text, less exact than "sub" or "super". + + + Above a line of text, more exact than "intra(linear)". Do not confuse with + superscript rendition. + + + Below a line of text, more exact than "intra(linear)". Do not confuse with subscript + rendition. + + + In a predefined space; i.e., that left by an earlier scribe. + + + Obscures original text; e.g., via overstrike, addition of new writing surface + material, etc. + + + + + Notation type and subtype + + + + Common Music Notation. + + + Mensural notation. + + + Black mensural notation. + + + White mensural notation. + + + + Letters for fret and courses closest to the ground when playing are at the top of the stave. + + + Numbers for fret and courses closest to the ground when playing are at the bottom of the stave. + + + No staff lines, although vertical position may imply voicing and symbols (based on letters) for fret and course. + + + Numbers for frets and courses closest to the ground when playing are at the top of the stave. + + + Neumatic notation. + + + + Tablature notation. + + + + + Captures any notehead "modifiers"; that is, symbols added to the notehead, such as + slashes, lines, text, and enclosures, etc. + + + + + Enumerated note head modifier values. + + + + Slash (upper right to lower left). + + + Backslash (upper left to lower right). + + + Vertical line. + + + Horizontal line. + + + Center dot. + + + Enclosing parentheses. + + + Enclosing square brackets. + + + Enclosing box. + + + Enclosing circle. + + + Enclosing "fences". + + + + + Captures text rendered in the center of the notehead. + + + centertext\((A|B|C|D|E|F|G)(f|♭|n|♮|s|♯)?\) + + centertext\(H(s|♯)?\) + + + + Octave number. The default values conform to the Scientific Pitch Notation (SPN). + + + 9 + + + + 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. + + + reversed|90CW|90CCW + + + + 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. + + + The layer immediately below. + + + + + The number of panels per page. + + + 1 + 2 + + + + Styling of piano pedal marks. + + + + Continuous line with start and end positions rendered by vertical bars and bounces + shown by upward-pointing "blips". + + + Pedal down and half pedal rendered with "Ped." followed by a line with + end position rendered by vertical bars and bounces shown by upward-pointing "blips". + + + Pedal down and half pedal rendered with "Ped.", pedal up rendered by "*", pedal + "bounce" rendered with "* Ped.". + + + Pedal up and down indications same as with "pedstar", but bounce is rendered with + "Ped." only. + + + + + Positive decimal number plus '%', i.e., [0-9]+(\.[0-9]*)?%. + + + [0-9]+(\.[0-9]*)?% + + + + Decimal number between 0 and 100, followed by a percent sign "%". + + + (([0-9]|[1-9][0-9])(\.[0-9]*)?|100(\.0*)?)% + + + + Decimal number between -100 and 100, followed by a percent sign "%". + + + (\+|-)?(([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. + + + + 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. + + + Header or footer for the first page only. + + + Header or footer for the last page only. + + + The first of an alternating pattern of headers or footers. + + + The second of an alternating pattern of headers or footers. + + + + +

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. + + + + + 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. + + + [a-g] + + + + 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. + + + + + Location information. + + + + + + + Other values not permitted when 'above', 'below', 'between' or 'within' is + present. + + + + + Semibreve-minim relationship values. + + + 2 + 3 + + + + General-purpose relationships + + + + + Rotation. + + + + + Rotation term. + + + + No rotation. + + + Rotated 180 degrees. + + + Rotated 270 degrees clockwise. + + + Rotated 45 degrees clockwise. + + + Rotated 315 degrees clockwise. + + + Rotated 135 degrees clockwise. + + + Rotated 225 degrees clockwise. + + + + + Scale degree values. + + + (\^|v)?[1-7](\+|\-)? + + + + 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 + are nested or overlap. + + + [i|m|t][1-6] + + + + + + + + + + + Items that may be printed above, below, or between staves. + + + + + Items in all repertoires that may be printed near a staff. + + + + Accidentals. + + + Annotations. + + + Articulations. + + + Directives. + + + Dynamics. + + + Harmony indications. + + + Ornaments. + + + + + Spoken text. + + + Stage directions. + + + Tempo markings. + + + + + 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. + + + + + + + The @staff + attribute must contain 2 numerically-adjacent integer values. + + + + Staves and + are not adjacent. + + + + + Location of symbol relative to a staff. + + + + Above the staff. + + + Below the staff. + + + + + Location of symbol relative to a staff. + + + + Between staves. + + + Within/on the staff. + + + + + Stem direction. + + + + + Common stem directions. + + + + Stem points upwards. + + + Stem points downwards. + + + + + Additional stem directions. + + + + Stem points left. + + + Stem points right. + + + Stem points up and right. + + + Stem points down and right. + + + Stem points up and left. + + + Stem points down and left. + + + + + Stem modification. + + + + No modifications to stem. + + + 1 slash through stem. + + + 2 slashes through stem. + + + 3 slashes through stem. + + + 4 slashes through stem. + + + 5 slashes through stem. + + + 6 slashes through stem. + + + X placed on stem. + + + Z placed on stem. + + + + + Position of a note’s stem relative to the head of the note. + + + + Stem attached to left side of note head. + + + Stem attached to right side of note head. + + + Stem is originates from center of note head. + + + + + Temperament or tuning system. + + + + Equal or 12-tone temperament. + + + Just intonation. + + + Meantone intonation. + + + Pythagorean tuning. + + + + + Beats (meter signature denominator) per minute, e.g., 120. + + + + + Breve-semibreve relationship values. + + + 2 + 3 + + + + Closed list of text rendition values. + + + + Surrounded by single quotes. + + + Surrounded by double quotes. + + + Italicized (slanted to right). + + + Oblique (slanted to left). + + + Small capitals. + + + Relative font weight. + + + Relative font weight. + + + Relative font weight. + + + Enclosed in box. + + + Enclosed in ellipse/circle. + + + Enclosed in diamond. + + + Enclosed in triangle. + + + Struck through by '\' (back slash). + + + Struck through by '/' (forward slash). + + + Struck through by '-'; may be qualified to indicate multiple parallel lines, e.g., + line-through(2). + + + Not rendered, invisible. + + + Line above the text; may be qualified to indicate multiple parallel lines, e.g., + overline(3). + + + Use for deleted text fully or partially obscured by other text (such as 'XXXXX') or + musical symbols (such as notes, rests, etc.). + + + Struck through by '-'; equivalent to line-through; may be qualified to indicate + multiple parallel lines, e.g., strike(3). + + + Subscript. + + + Superscript. + + + Use for added text or musical symbols that fully or partially obscure text from an + earlier writing stage. + + + Underlined; may be qualified to indicate multiple parallel lines, e.g., + underline(2). + + + Crossed-out; equivalent to 'bslash' (\) plus 'fslash' (/); that is, a hand-written + 'X'; may be qualified to indicate multiple parallel lines, e.g., x-through(2). + + + Left-to-right (BIDI embed). + + + Right-to-left (BIDI embed). + + + Left-to-right (BIDI override). + + + Right-to-left (BIDI override). + + + + + Parameterized text rendition values. + + + (underline|overline|line-through|strike|x-through)\(\d+\) + + + + Text rendition values. + + + + + 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 + musical time, i.e., beats[.fractional beat part]. + + + + + Tuplet attribute values: initial, medial, terminal. + + + [i|m|t][1-6] + + + + A Uniform Resource Identifier, see [RFC2396]. + + + + + Data values for attributes that capture vertical alignment. + + + + Top aligned. + + + Middle aligned. + + + Bottom aligned. + + + Baseline aligned. + + + + + 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. + + + Contains classification of the notation contained or described by the element bearing + this attribute. + + + + + + Provides any sub-classification of the notation contained or described by the element, + additional to that given by its notationtype attribute. + + + + + + + An element with a notationsubtype attribute must have + a notationtype attribute. + + + + + + + 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. + + + The notation contains all the notes necessary for the harmonic label, e.g., the + notes "D F♯ A" for the harmonic label "D". + + + The harmonic label relies on notes implied, but not actually present, in the + notation, e.g., the notes "D F♯ C" for the harmonic label "D7". The note "A" is + missing from the notation, but can be implied. + + + + + + Analytical domain attributes. + + Attributes describing the harmonic function of a single pitch. + + + degree + Captures scale degree information using Humdrum **deg syntax -- an optional indicator + of melodic approach (^ = ascending approach, v = descending approach), a scale degree + value (1 = tonic ... 7 = leading tone), and an optional indication of chromatic + alteration, 1, v7, ^1, or v5+, for example. + The amount of chromatic alternation is not indicated. + + + + + + + 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. + + + + + + + Attributes that provide for description of intervallic content. + + + interval melodic + Encodes the melodic interval from the previous pitch. The value may be a general + directional indication (u, d, s, etc.), an indication of diatonic interval direction, + quality, and size, or a precise numeric value in half steps. + + + + + + + Analytical domain attributes. + + Analytical domain attributes. + + + + + + + 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. + + + + + + Indicates major, minor, or other tonality. + + + + + + Holds the pitch name of the tonic key, e.g., c for the key of C. + + + + + + + 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. + + + Describes melodic function using Humdrum **embel syntax. + + + + + + + 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. + + Analytical domain attributes. + + 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. + + + + + + + + + + + + + + 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. + + + pitch class + Holds pitch class information. + + + + + + + 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. + + 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 + system. + + + + + + + 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. + + 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. + + + + Quadruple whole note. + + + Double whole note. + + + Whole note. + + + Half note. + + + Quarter note. + + + 8th note. + + + 16th note. + + + 32nd note. + + + 64th note. + + + 128th note. + + + 256th note. + + + 512th note. + + + 1024th note. + + + 2048th note. + + + + + Items in the CMN repertoire that may be printed near a staff. + + + + Beams. + + + + + Bend indications. + + + Brackets, e.g., for transcribed ligatures. + + + Breath marks. + + + Copy marks. + + + Fermatas. + + + Fingerings. + + + + + Hairpin dynamics. + + + Harp pedals. + + + Laissez vibrer indications, sometimes called "open ties". + + + Mordents. + + + Octaviation marks. + + + Piano pedal marks. + + + Rehearsal marks. + + + + + Ties. + + + Trills. + + + Tuplets. + + + + + Turns. + + + + + Logical domain attributes. + + + + + + + Describes the direction in which an arpeggio is to be performed. + + + Lowest to highest pitch. + + + Highest to lowest pitch. + + + Non-arpeggiated style (usually rendered with a preceding bracket instead of a wavy + line). + + + + + + Logical domain attributes. + + + + + + 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. + + + + + + + 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. + + + + + + Indicates whether automatically-drawn beams should include rests shorter than a + quarter note duration. + + + + + + +

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' + indicates each quarter note worth of shorter notes would be beamed together. Parentheses can + be used to indicate sub-groupings of secondary beams. For example, '(4.,4.,4.)' in 9/8 meter + indicates one outer beam per measure with secondary beams broken at each dotted quarter + duration, while a measure of 16th notes in 4/4 with beam.group equal to + '(4,4),(4,4)' will result in a primary beam covering all the notes and secondary beams for + each group of 4 notes. This beaming "directive" can be overridden by using beam elements. If neither beam elements or the + beam.group attribute is used, then no beaming is rendered. Beaming can be + explicitly 'turned off' by setting beam.group to an empty string.

+
+
+ Attributes that indicate whether an event lies under a beam. + + + Indicates that this event is "under a beam". + + + + + + + Attributes that record the visual rendition of beams. + + + Captures whether a beam is "feathered" and in which direction. + + + accelerando + means that the secondary beams become progressively more distant + toward the end of the beam. + + + mixed acc and rit + for beams that are "feathered" in both directions. + + + ritardando + indicates that the secondary beams get progressively closer together + toward the end of the beam. + + + normal + indicates that the secondary beams are equidistant along the course of + the beam. + + + + + Records the placement of the beam relative to the events it affects. + + + + + + + Stem direction must be specified for all notes and chords under the + beam. + Opposing stem directions are required for a beam with @place="mixed". + + + Opposing stem directions are required for a beam with @place="mixed". + + + + + + Indicates presence of slash through the beam. + + + + + + Records the slope of the beam. + + + + + + + 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 + should remain unbroken. + + + + + + + Logical domain attributes. + + + + + + + + + Logical domain attributes. + + + + + + Indicates the performed duration represented by the beatRpt symbol; expressed in time + signature denominator units. + + + \d+(\.\d+)? + + + + + + Logical domain attributes. + + + + + + + + Logical domain attributes. + + + + + + + + + function + Describes the function of the bracketed event sequence. + + + + + + Represents coloration in the mensural notation source material. + + + Marks a sequence which does not match the current meter. + + + Represents a ligature in the mensural notation source material. + + + + + + Logical domain attributes. + + + + + + + + + + Logical domain attributes. + + + + + + + + + Analytical domain attributes in the CMN repertoire. + + + + + + + + + + + Gestural domain attributes for CMN features. + + Logical domain attributes in the CMN repertoire. + + + + + 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 + element belonging to this attribute class. + + + "Cut-out" style. + + + The staff lines should not be drawn. + + + + + + Logical domain attributes. + + 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 + symbol. + + + + + + + Logical domain attributes. + + + + + + Logical domain attributes. + + + + + + + + Attributes that indicate whether an event participates in a glissando. + + + glissando + Indicates that this element participates in a glissando. If visual information about + the glissando needs to be recorded, then a gliss element should be + employed instead. + + + + + + + Logical domain attributes. + + + + + + + + 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. + + + + + + Records the amount of time to be "stolen" from a non-grace note/chord. + + + + + + + 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". + + + Attached to the preceding event. + + + Attached to the following event. + + + Attachment is ambiguous. + + + + + + Logical domain attributes. + + + + + + + + + Captures the visual rendition and function of the hairpin; that is, whether it + indicates an increase or a decrease in volume. + + + Crescendo; i.e., louder. + + + Diminuendo; i.e., softer. + + + + + Indicates that the hairpin starts from or ends in silence. Often rendered as a small + circle attached to the closed end of the hairpin. See Gould, p. 108. + + + + + + + Logical domain attributes. + + + + + + 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 + + + Flat. + + + Natural. + + + Sharp. + + + + + Indicates the pedal setting for the harp’s D strings. + n + + + Flat. + + + Natural. + + + Sharp. + + + + + Indicates the pedal setting for the harp’s E strings. + n + + + Flat. + + + Natural. + + + Sharp. + + + + + Indicates the pedal setting for the harp’s F strings. + n + + + Flat. + + + Natural. + + + Sharp. + + + + + Indicates the pedal setting for the harp’s G strings. + n + + + Flat. + + + Natural. + + + Sharp. + + + + + Indicates the pedal setting for the harp’s A strings. + n + + + Flat. + + + Natural. + + + Sharp. + + + + + Indicates the pedal setting for the harp’s B strings. + n + + + Flat. + + + Natural. + + + Sharp. + + + + + + Logical domain attributes. + + + + + Logical domain attributes. + + + + + + + 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. + + + + + + + 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 + or analytical uses of MEI, that are entirely non-numeric strings. Measure numbers may be + 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 + ignored. + + + + + + Indicates the function of the right bar line and is structurally important. + + + + + + + Logical domain attributes. + + + function + Function of the meter signature group. + + + Meter signatures apply to alternating measures. + + + Meter signatures are interchangeable, e.g., 3/4 and 6/8. + + + Meter signatures with different unit values are used to express a complex metrical + pattern that is not expressible using traditional means, such as 2/4+1/8. + + + Meter signatures in a relationship not covered by the values alternating, interchanging or mixed. + + + + + + Logical domain attributes. + + + + + + + Logical domain attributes. + + + + + + Logical domain attributes. + + + + + Logical domain attributes in the CMN repertoire. + + + + + + Logical domain attributes. + + + + + + Logical domain attributes. + + + + + + Analytical domain attributes in the CMN repertoire. + + + + + + + + + + + + Logical domain attributes. + + + + + Visual domain attributes. + + + + + Attributes that record numbers to be displayed with a feature. + + + number + Records a number or count accompanying a notational feature. + + + + + + + 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. + + + + + + Determines if the tuplet number is visible. + + + + + + + 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 + broken lines, coll' ottava typically uses an unbroken line or a series of longer broken + lines, ending with a short vertical stroke. See Read, p. 47-48. + + + Coll' ottava (with the octave). + + + + + + Logical domain attributes. + + Logical domain attributes. + + + + + + + + direction + Records the position of the piano damper pedal. + + + Depress the pedal. + + + Release the pedal. + + + Half pedal. + + + Release then immediately depress the pedal. + + + + + function + Indicates the function of the depressed pedal, but not necessarily the text associated + with its use. Use the dir element for such text. + + + + + + The sustain pedal, also referred to as the "damper" pedal, allows the piano + strings to vibrate sympathetically with the struck strings. It is the right-most and + the most frequently used pedal on modern pianos. + + + The soft pedal, sometimes called the "una corda", "piano", or "half-blow" pedal, + reduces the volume and modifies the timbre of the piano. On the modern piano, it is + the left-most pedal. + + + The sostenuto or tone-sustaining pedal allows notes already undamped to continue + to ring while other notes are damped normally; that is, on their release by the + fingers. This is usually the center pedal of the modern piano. + + + The silent or practice pedal mutes the volume of the piano so that one may + practice quietly. It is sometimes a replacement for the sostenuto pedal, especially on + an upright or vertical instrument. + + + + + + Visual domain attributes. + + + + + + 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. + + + + + + + Logical domain attributes. + + + + + + + + + + Attributes used by scoreDef and staffDef to provide default information about rehearsal + numbers/letters. + + + Describes the enclosing shape for rehearsal marks. + + + Enclosed by box. + + + Enclosed by circle. + + + No enclosing shape. + + + + + + Analytical domain attributes in the CMN repertoire. + + + + + + + Logical domain attributes in the CMN repertoire. + + Visual domain attributes. + + + + + Logical domain attributes. + + + + + Visual domain attributes. + + + + + + + + + + Logical domain attributes. + + + + + + + + Attributes that describe the rendition of slurs. + + + + + + + + + + + + + + Analytical domain attributes in the CMN repertoire. + + + + + + + Logical domain attributes in the CMN repertoire. + + Logical domain attributes for staffDef in the CMN repertoire. + + + + + Visual domain attributes for staffDef in the CMN repertoire. + + + + + + + + + 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 + below. + + + + + + + Logical domain attributes. + + + + + + + Attributes that describe the rendition of ties. + + + + + + + + + + + + + + Attributes describing the form of a tremolo. + + + Describes the style of the tremolo. + + + Measured tremolo. + + + Unmeasured tremolo. + + + + + + Attributes that describe measured tremolandi. + + + The performed duration of an individual note in a measured tremolo. + + + + + + + Logical domain attributes. + + + + + + + + + Logical domain attributes. + + + + + + + + + + Groups control events that appear in CMN. + + + + + + + Groups events that appear in CMN. + + + + + Groups events that completely fill a CMN measure. + + + + + Groups notated events that may appear at the layer level in CMN. + + + + + Groups CMN measure-like elements. + + + + + Groups elements that may appear within a CMN measure. + + Groups elements that function like ossia. + + + + + + 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". + + + + + + + + + + +

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 + upper end of the line for the sake of consistency or when the direction of successive + arpeggios alternates. In music for keyboard instruments, sometimes a distinction is made + between a single arpeggio in which both hands play successively and simultaneous arpeggios + in two hands. In the case of the former, multiple values may be required in the + 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. + + + + + + + + + + + + + + + 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, + 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 a starting point + attribute.

+
A container for a series of explicitly beamed events that begins and ends entirely within + a measure. + + + + + + + + + + + + + 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. + + + + + + + + + + + + + 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 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. + + + + + + + + + + + + +

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. + + + + + + + + + + + + + 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. + + + Marks a sequence of notational events grouped by a bracket. + + + + + + + + + + + + + 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. + + + +

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. + + + + + + + + + + + + + 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, + tstamp.ges, or tstamp.real attribute. It is a semantic error not to + specify a starting point attribute.

+

Since the breath mark does not disrupt the normal tempo of a performance, it has no + directly encode-able duration.

+

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. + + + + + + + + + + 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'. + + + + + + + + + + + + + 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 + bracket below the dot. Other visual forms of a fermata may be indicated via the + 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. + + + + + + + + + + glissandoA continuous or sliding movement from one pitch to another, usually + indicated by a straight or wavy line. + + + + + + + + + + + + + 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. + + + +

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 + 'portamento'. The visual appearance of the indicating line may be recorded in the + lform and lwidth attributes. The starting point of the glissando 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.

+
grace groupA container for a sequence of grace notes. + + + + + + + + + + + + + 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 >. + + + + + + + + + + + + + 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 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 + 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. 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. + + + + + + + + + + harp pedalHarp pedal diagram. + + + + + + + + + + + + + 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. + + + + + + + + + + + + + Must have one of the + attributes: startid, tstamp, tstamp.ges or tstamp.real. + + + + + + The visual attributes of the lv element (@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. + + + +

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. +

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 signature groupUsed to capture alternating, interchanging, mixed or other non-standard meter signatures. + + + + + + + + + + + + + meterSigGrp must have at least 2 child + meterSig elements. + + + 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. + + + + + + + + + + +

mNum uses a subset of model.textPhraseLike.limited.

+
measure restComplete measure rest in any meter. + + + + + + + + + + +

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. + + + + + + + + + + +

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. + + + + + + + + + + measure spaceA measure containing only empty space in any meter. + + + + + + + + + + +

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 repeatMultiple repeated measures. + + + + + + + + + + +

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. + + + + + + + + + + + + + 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 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 + starting point of the octave displacement 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. 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. + + + + + + + + + + + + + + + Captures original notation and a differently notated version *present in + the source being transcribed*. + + + + + + + + + + + + + + In a measure, ossia + may only contain staff and oStaff elements. + + + In a staff, ossia + may only contain layer and oLayer elements. + + + + +

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. + + + + + + + + + + + + + + + Piano pedal mark. + + + + + + + + + + + + + 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. + + + + + + + + + + + +

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. + + + + + + + + + + + + + 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 slur (@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.

+
An indication that two notes of the same pitch form a single note with their combined + rhythmic values. + + + + + + + + + + + + + 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 tie (@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. + + + +

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. + + + + + + + + + + +

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 + bowed tremolo (Read, p. 394) and double, triple, or flutter tonguing (Read, p. 348-349); + that is, for repetition of the same pitch. In the case of irrational durations, such as such + as two quarter notes in the time of five 8th notes in a measure of 5/8 time, decimal values + may be used in the dur.ges attribute. For example, the dur.ges + attribute would take the value 2.5 if the midi.div attribute’s value was 1. + The num and numbase attributes may be used for explicit labelling of a + 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. + + + + + + + + + + + + + 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 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 + 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. + + + + + + + + Records semantic meaning, i.e., intended performance, of the mordent. The + altsym, glyph.name, or glyph.num attributes may be used + to specify the appropriate symbol. + + + Starts with the written note, followed by its lower neighbor, with a return to the + written note. In modern practice, this is called an "inverted mordent" and indicated + by a short wavy line with a vertical line through it. + + + Starts with the written note, followed by its upper neighbor, with a return to the + principal note. In modern practice, the symbol lacks the vertical line used for the + inverted form. + + + + + When set to 'true', a double or long mordent, sometimes called a "pincé double", + consisting of 5 notes, is indicated. + + + + + + + Accidentals associated with ornaments. + + + + + + Records the written accidental associated with an upper neighboring note. + + + + + + Records the written accidental associated with a lower neighboring note. + + + + + + + Attributes for marking the presence of an ornament. + + + ornament + Indicates that this element has an attached ornament. If visual information about the + ornament is needed, then one of the elements that represents an ornament (mordent, trill, + or turn) should be employed. + + + + + + + Logical domain attributes. + + + + + + + + + Logical domain attributes. + + + + + + + + When set to 'true', the turn begins on the second half of the beat. + + + + + + Records meaning; i.e., intended performance, of the turn. The altsym, + glyph.name, or glyph.num attributes may be used to specify the + appropriate symbol. + + + Begins on the note below the written note. + + + Begins on the note above the written note. + + + + + + Groups CMN ornament elements. + + + + An ornament indicating rapid alternation of the main note with a secondary note, usually a + step below, but sometimes a step above. + + + + + + + + + + + + + + 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). + + + + + + + + + + + + + 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 + starting point of the trill 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 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. + + + + + + + + + + + + + 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. + + + + + + + +

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. + + + + + + + + Classifies the cause for the variant reading, according to any appropriate typology of + possible origins. + + + + + + + Logical domain attributes. + + 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 musical variant. + + + + + Groups elements that may appear as part of a textual variant. + + + + apparatusContains 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).

+
lemmaContains the lemma, or base text, of a textual variation. + + + + + + + + + + + +

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 + ambiguity, precisely which portion of the main text the variation applies to. Those who + prefer to work without the notion of a base text may prefer not to use it at all. An integer + indicating the position of this reading in a sequence, when there is reason to presume a + sequence of the variant readings, may be captured in the seq attribute.

+

In no case should lem 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, 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).

+
readingContains a single reading within a textual variation. + + + + + + + + + + + +

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. + + + + + + + Groups elements containing stage directions in performance texts. + + + + + speechContains an individual speech in a performance text. + + + + + + + + + + + + + + + + + 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, + tstamp.real, startho, endho, to, startto, endto, staff, layer, place, or + 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. + + + + + + + + + + + + + + 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, + tstamp.real, startho, endho, to, startto, endto, staff, layer, place, or + 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. + + + Signifies the causative agent of damage, illegibility, or other loss of original + text. + + + + + + + Logical domain attributes. + + + + + + + + + + + + Attributes describing the nature of an encoded scholarly intervention or + interpretation. + + + + + + Logical domain attributes. + + + + + + + + + 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). + + + + + + + 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 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 in music + notation. + + + + + 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. + + + + 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. + + + + + + + + + + + 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 + transcriber responsible for identifying the hand of the addition. The cert + attribute signifies the degree of certainty ascribed to the identification of the hand of + the addition. The editor(s) responsible for asserting this particular reading may be + recorded in the resp attribute. The value of resp must point to one or more + identifiers declared in the document header.

+

In no case should add 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, 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. + + + + + +

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. + + + + + + + + + + +

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 + corr element. If the correction was made in the source, resp should be + used to identify the hand of the corrector. The value of resp must point to one or more + identifiers declared in the document header.

+

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. + + + + + + + + + + + + + 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 + + + + + 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 + attributes tstamp and staff. The area to be filled should contain space or mSpace elements. The material to be used to + fill the gap can be identified by the attributes origin.tstamp, + origin.tstamp2, origin.staff, and origin.layer. If + origin.tstamp2 is not provided, a duration similar to that of the local omission + (as encoded in the combination of tstamp and tstamp2) is assumed. Any + missing @origin.* attributes are assumed to take the same values as information associated + with the cpMark. For example, when only the origin.staff attribute is provided, + it is assumed that the referenced part comes from a different staff in the same measure. If + a different measure is provided by origin.tstamp, but no origin.staff + is given, then it is assumed that the material is to be taken from the same staff.

+

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. + + + + + + + + + + + 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. + + + + + + + + + + + +

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 + of the hand of the deletion. The hand of the agent which made the deletion should be pointed + to using the hand attribute. The rend attribute may be used to record + the method used to make the deletion (overstrike, strike[through], etc.).

+

In no case should del 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, 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. + + + + + + + + + + + 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. + + + + + + + + + +

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 + text by an author, scribe, annotator, or corrector. An indication of how much material has + been omitted from the transcription may be recorded in the extent attribute. The + unit attribute names the unit used for describing the extent of the gap. The + reason attribute gives the reason for omission. Sample values include sampling, + irrelevant, cancelled. The resp attribute contains an ID reference to an + element containing the name of the editor, transcriber or encoder responsible for the + decision not to provide any transcription of the material and hence the application of the + gap tag. The hand attribute signifies the hand which made + 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. + + + + + + + + + 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 + have content. + The value in @new should correspond to the @xml:id attribute of a hand + element. + + + + + Identifies the old hand. The value must contain the ID of a hand element given + elsewhere in the document. + + + + + + + @old attribute should + have content. + The value in @old should correspond to the @xml:id attribute of a hand + element. + + + + +

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 + in the medium attribute. The new hand may be identified using the new + attribute, while the previous hand may be recorded in the old attribute. The + resp attribute contains an ID reference to an element containing the name of the + 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 + musical text. The textual consequences of this intervention are encoded independently via + other means; that is, with elements such as add, del, etc. + + + + + + + + + + + + + + + Must have one of the + attributes: startid, tstamp, tstamp.ges or tstamp.real + + + + Describes the purpose of the metaMark. + + + + + + confirmation of a previous textual decision; i.e., cancellation of a deleted + passage in a different writing medium. + + + denoted material is to be inserted in the musical text. + + + denoted material is no longer part of the musical text. + + + denoted material is replaced, either by the musical text pointed at with the + @target attribute or the musical content of the metaMark element itself. + + + attempt to clarify a potentially illegible or otherwise unclear part of the + musical text. + + + marks a section of the musical text which is to be considered further. + + + marks a section of the musical text as an investigation of the consequences of + certain compositional decisions or potential alternatives. + + + declares a formerly cancelled part of the musical text as valid again. + + + 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. + + + + + + + + + + +

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 + in the document header. The cert attribute signifies the degree of certainty + ascribed to the transcription of the original text.

+

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. + + + + + + + + + + +

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 + material may be recorded in the resp attribute. The value of resp must + point to one or more identifiers declared in the document header. The cert + attribute signifies the degree of certainty ascribed to the regularized reading.

+

In no case should reg 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, 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. + + + + + + + + + + + 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. + + + + + + + + + + +

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. + + + + + + + + +

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. + + + + + + + + + + + +

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 + responsible for the action. The reason attribute indicates why the text has to be + supplied, e.g., overbinding, faded ink, lost folio, + omitted in original, etc. + The source attribute contains the source of the supplied text. The editor(s) + responsible for supplied material may be recorded in the resp attribute. The + value of resp must point to one or more identifiers declared in the document header. The + cert attribute signifies the degree of certainty ascribed to the supplied + material.

+

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. + + + + + + + + + + + + + +

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 + the unclear element. Where the difficulty in transcription arises from + action (partial deletion, etc.) assignable to an identifiable hand, the hand + attribute signifies the hand responsible for the action. The reason attribute + indicates why the material is difficult to transcribe. The resp attribute + indicates the individual responsible for the transcription of the word, phrase, or passage + contained with the unclear element. The value of resp must + point to one or more identifiers declared in the document header.

+

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 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, or the textual content of the element. + + + + + + Standard Music Font Layout. + + + + + 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 + should have content. + + + + + + Numeric glyph reference in hexadecimal notation, e.g., "#xE000" or "U+E000". N.B. SMuFL + version 1.18 uses the range U+E000 - U+ECBF. + + + + + + + SMuFL version 1.18 uses the range U+E000 - U+ECBF. + + + + + + + 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. + + + facsimile + Points to one or more images, portions of an image, or surfaces which correspond to the current element. + + + + + + + @facs attribute should + have content. + Each value in @facs should correspond to the @xml:id attribute of a surface or zone + element. + + + + + + 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. + When each page is represented by a different graphic, use a surface + 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 + one or more graphic representations of that space, and rectangular zones of interest within + 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. + + + + + + + +

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. + + + The number of columns spanned by this cell. + + + + + + The number of rows spanned by this cell. + + + + + + + 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 + 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. + + + +

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. + + + + + + + + Logical domain attributes. + + + + + + + + + + + alternation of fingers. + + + combination of fingers. + + + substitution of fingers. + + + + + + Groups elements that capture performance instructions regarding the use of the fingers of + the hand (or a subset of them). + + + + fingerAn individual finger in a fingering indication. + + + + + + + + + + + + + Must have one of the + attributes: startid, tstamp, tstamp.ges or tstamp.real. + + + + + + + The stack element is not allowed as a + descendant of fing. + + + finger groupA group of individual fingers in a fingering indication. + + + + + + + + + + + + + At least 2 fing or fingGrp + elements are required. + + + + + + + When @tstamp or @startid is + present on fingGrp, its child elements cannot have a @tstamp or @startid + attribute. + + + When @tstamp or @startid is not present on fingGrp, each of its child elements must + have a @tstamp or @startid attribute. + + + + + 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. + + + + + Attributes for capturing momentary pitch inflection in the gestural domain. + + + Records the performed pitch inflection. + + + + + + + The value of @accid.ges should + not duplicate the value of @accid. + + + + + + + Gestural domain attributes. + + Gestural domain attributes. + + Gestural domain attributes. + + Gestural domain attributes. + + + + + + + Gestural domain attributes. + + Gestural domain attributes. + + + + + Attributes describing the method of performance. + + + Records performed articulation that differs from the written value. + + + + + + + Gestural domain attributes. + + + + + Attributes whether an element is performed "attacca". + + + Indicates that the performance of the next musical division should begin immediately + following this one. + + + + + + + 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. + + + + + + + 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 that record performed duration that differs from a feature’s written + duration. + + + Records performed duration information that differs from the written duration. + + + + + + Number of dots required for a gestural duration when different from that of the + written duration. + + + + + + Duration as a count of units provided in the time signature denominator. + + + \d+(\.\d+)? + + + + + Duration recorded as pulses-per-quarter note, e.g., MIDI clicks or MusicXML + divisions. + + + + + + Duration in seconds, e.g., 1.732. + + + \d+(\.\d+)? + + + + + Duration as an optionally dotted Humdrum **recip value. + + + [0-9]+(%[0-9]+)?\.*q? + + + + + + 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. + + + + + + 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 + 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. + + + + + + + + + + + + + + When the @extremis attribute is used, + the @pname.ges and @oct.ges attributes are not allowed. + + + + + + Indicates an extreme, indefinite performed pitch. + + + Highest note the performer can play. + + + Lowest note the performer can play. + + + +

On a wind instrument, the "highest note possible" depends on the player’s abilities. On + a string instrument, the "lowest note possible" depends on how much a string is + de-tuned; that is, loosened using the tuning peg. Use of the pname and + oct or ploc and oloc or loc attributes is + necessary to record the written pitch and octave of the symbol for this note.

+
+
+
+
+ Gestural domain attributes. + + + + + + Gestural domain attributes. + + Gestural domain attributes. + + + + + + Gestural accidentals associated with ornaments. + + + Records the sounding accidental associated with an upper neighboring note. + + + + + + Records the sounding accidental associated with a lower neighboring note. + + + + + + + Gestural domain attributes. + + Gestural domain attributes. + + Gestural domain attributes. + + Gestural domain attributes. + + Gestural domain attributes. + + Gestural domain attributes. + + + + + Gestural domain attributes. + + + + + + Gestural attributes about pitch. + + + Records performed octave information that differs from the written value. + + + + + + Contains a performed pitch name that differs from the written value. + + + + + + pitch number + Holds a pitch-to-number mapping, a base-40 or MIDI note number, for example. + + + + + + + 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 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. + + + + + + + + + Gestural domain attributes. + + + + + Gestural domain attributes. + + Gestural domain attributes. + + + + + + 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. + + Gestural domain attributes for staffDef in the CMN repertoire. + + + + + + + + Gestural domain attributes. + + + + + Gestural domain attributes. + + + + + 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. + + + + + 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. + + + + + + Records the onset time in terms of ISO time. + + + + + + + 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. + + + + + + Records the ending point of an event in terms of ISO time. + + + + + + + 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. + + + + + + + + + chord reference + Contains a reference to a chordDef element elsewhere in the + document. + + + + + + + @chordref attribute + should have content. + The value in @chordref should correspond to the @xml:id attribute of a chordDef + element. + + + + + + + Groups elements that group playable chord definitions. + + 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 represent single figured bass elements. + + Groups elements that record indications of harmony. + + + + 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. + + + + + + + + +

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. + + + + + +

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. + + + + + + + + + + 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. + + + + + + + + + + + + + Must have one of the + attributes: startid, tstamp, tstamp.ges or tstamp.real. + + + + 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 + bibliographic description. + + + + + + + + + + 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. + + + + + + A reference to a surface element positioned on the inner verso + side of a (folded) sheet. + + + + + + A reference to a surface element positioned on the inner recto + side of a (folded) sheet. + + + + + + A reference to a surface element positioned on the outer verso + side of a (folded) sheet. + + + + + + + Attributes that link a folium element with a surface element. + + + A reference to a surface element positioned on the recto side of + the sheet. + + + + + + A reference to a surface element positioned on the verso side of + the sheet. + + + + + + + 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. + + + + + + + Attributes that define the characteristics and components of the performance resource or a performance resource list. + + + + + + Indicates the number of performers. + + + + + + + Attributes that describe a performance resource as ad libitum (optional). + + + Marks a performance resource as ad libitum (optional). + + + + + + +

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

+

+ + Meanings of ad libitum + + indicates an optional performance resource (instrumental or vocal part or group), + + marks a passage to be played freely or free in time, + + requests or invites to improvise a passage of music, + + indicates that the number repetitions can be set individually or spontaneously. + +

+

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

+
+
+ 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. + +

+
+
+ Attributes that describe correction and normalization methods. + + + Indicates the method employed to mark corrections and normalizations. + + + Corrections and normalizations made silently. + + + Corrections and normalizations indicated using elements. + + + + + + Collects bifoliumlike elements. + + 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. + + Collects foliumlike elements. + + 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 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 + item. + + Groups elements that assist in the identification of a work. + + 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. + + + + + + + +

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 + 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. + + + + + +

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. + + + + + + + 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. + + + + + + + + @context attribute should + contain an XPath expression. + + + + Name of the attribute. + + + + + Circumstances in which the attribute appears, an XPath expression. + + + + 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. + + + + + + + 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. + + + + + + + + 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.). + + + + + + + + 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.). + + + + + + + + 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. + + + + + + + + + + + + Provides a description of the relationship between the current and the target + categories. + + + Category to which the current category is hierarchically subordinate. + + + Category which is hierarchically subordinate to the current category. + + + Category that is associatively but not hierarchically linked to the current + category. + + + Non-preferred category; often a synonym or near-synonym for the preferred category + label. + + + Individual change within the revision description. + + + + + + + + + + + The date of the change must be recorded in an + isodate attribute or date element. + It is recommended that the agent responsible for the change be recorded + in a resp attribute or in a name, corpName, or persName element in the respStmt + 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 + resp attribute contains a pointer to an element containing info about the + 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. + + + + + + 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. + + + + + + + +

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. + + + + + + + + Only child elements of the same name as the parent of the componentList are + allowed. + + + + + + When any child + element has a comptype attribute, it is recommended that comptype appear on all child + 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 + prevent confusion with musical terminology. Work, expression, and item components must be + the same type as the parent of componentList: work children are + allowed within work, etc. Manifestations; i.e., sources, may have + 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 + of the item and that of other copies of the same item (e.g., missing pages or plates, + 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. + + + + + + List of the material contained within a resource. + + + + + + + + + + + When labels + are used, usually each content item has one. + + + + + +

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

+
+
+
+ + + Contents + Sonata in D major, op. V, no. 1 / + Corelli + Sonata in G minor / Purcell (with Robert Donington, + gamba) + Forlane from Concert royal no. 3 / + 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 + 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. + + + + + + + States how and under what circumstances corrections have been made in the text. + + + + + + + + + + + Indicates the degree of correction applied to the text. + + + The text has been thoroughly checked and proofread. + + + The text has been checked at least once. + + + The text has not been checked. + + + 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. + + + + + + + + + + + Describes the position of the cutout on the parent folium / bifolium. + + + removed from outer recto side of bifolium. + + + removed from inner verso side of bifolium. + + + removed from inner recto side of bifolium. + + + removed from outer verso side of bifolium. + + + removed from recto side of folium. + + + removed from verso side of folium. + + + + Describes the method of removing the cutout. + + + + + + section is cleanly cut by a knife, scissor or other sharp blade. + + + 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 + to indicate the upper left point on the original page. If, however, the removed section is + 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. + + + + + + + + +

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

+
domains declarationIndicates which domains are included in the encoding. + + + + + + + + + + + + + + + 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. + + + + + + + + + +

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 + source or sources from which it was derived as well as applications used in the + encoding/editing process. + + + + + + + + + + + + + +

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. + + + + + + + +

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

+
extended metadataProvides a container element for non-MEI metadata formats. + + + + + + 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. + + + + + + + file descriptionContains a full bibliographic description of the MEI file. + + + + + + + + + + + +

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. + + + + + +

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. + + + + + + + + +

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. + + + + + + + + + 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. + The resp attribute contains an ID reference to an element containing the name of + the editor or transcriber responsible for identifying the hand. The characteristics of the + 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. + + + + + + + + + + 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. + + + + + + + + + + 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. + + + + + + + + + + + incipCode must have a form or mimetype + attribute. + + + + Form of the encoded incipit. + + + + + + Plaine & Easie Code. + + + **kern representation of the Humdrum format. + + + Parsons code. + + + 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. + + + + + + + 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. + + + + + + + + + +

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. + + + + + + + +

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. + + + + + + + +

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. + + + + + + + + + + + + + + + + + + + The meiHead type attribute can have the value 'music' + only when the document element is "mei". + + + The meiHead type attribute can have the value + 'corpus' only when the document element is "meiCorpus". + + + The meiHead type attribute can have the value + '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. + + + Header is attached to a music document. + + + Header is attached to a corpus. + + + Header is independent; i.e., not attached to either a music or a corpus + 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 + encoded in the following order: altId(optional), fileDesc(required), encodingDesc(optional), workList(optional), and revisionDesc(optional). These elements + and their sub-elements provide: a unique identifier for the MEI file, bibliographic + information about the MEI file and its sources, information about the encoding process, + 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 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. + + + + + + + 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. + + + + + + + + + + +

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

+
notes statementCollects 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. + + + + + + Describes a physical writing surface attached to the original document. + + + + + + + + + + + + The allowed positions of a patch depend on its parent element. + A patch element must contain either a folium + or a bifolium element. + + + + Describes the position of the patch on the parent folium / bifolium. + + + patch attached to outer recto side of bifolium. + + + patch attached to inner verso side of bifolium. + + + patch attached to inner recto side of bifolium. + + + patch attached to outer verso side of bifolium. + + + patch attached to recto side of folium. + + + patch attached to verso side of folium. + + + + Describes the method of attachment of the patch. + + + + + + patch is glued on surface beneath. + + + patch is sewn on surface beneath. + + + patch is pinned to the surface beneath. + + + patch is taped on surface beneath using an adhesive strip. + + + 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. + + + + + + + + + + + Holds a W3C duration value, e.g., "PT2H34M45.67S". + + + + +

+ 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. + + + + + + + + + +

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.

+
performance resources listSeveral 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 + handling of physical materials, such as their dimension, quantity, color, style, and technique + 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. + + + + + + + + +

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. + + + + + + + + + +

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.). + + + + + + + The cost of access to a bibliographic item. + + + + + + + + + Numeric value capturing a cost. Can only be interpreted in combination with the + currency attribute. + + + [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 + the electronic file was encoded, funding agencies, etc. together with any other relevant + 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 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 + distribution of a bibliographic item, including the publisher’s name and address, the date of + 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. + + + + + + +

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. + + + + + + + + + +

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 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. + + + + + + + + +

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.). + + + + + + + + + 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. + + + + + + + + + + + + + + + + @target attribute should + have content. + Each value in @target should correspond to the @xml:id attribute of a source or + 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. + + + + + +

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.). + + + + + + + + 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. + + + + + + + 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. + + + + + + + + + @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. + + + + + + + + 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. + + + + + + + +

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). + + + + + + + + + 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 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. + + + + + + + +

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. + + + + + + + +

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. + + + + + + + + +

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. + + + + + + + + + +

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 — + specifically its history, language use, and high-level musical attributes (e.g., key, tempo, + meter, medium of performance, and intended duration). + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

The perfDuration element captures the intended duration + of the work.

+
work listGrouping mechanism for information describing non-bibliographic aspects of a + text. + + + + + + + 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. + + + + + + Recurring lyrics, especially at the end of each verse or stanza of a poem or song lyrics; + a chorus. + + + + + + + + + + + + + +

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. + + + + + + + + + + + + + + + +

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. + + + + + + + + + + + + + + +

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. + + + + Two or three times as long as a longa. + + + Two or three times as long as a brevis. + + + Two or three times as long as a semibreve. + + + Half or one-third as long as a breve/brevis. + + + Half or one-third as long as a semibreve/semibrevis. + + + Half as long as a minima. + + + Half as long as a semiminima. + + + Half as long as a fusa. + + + + + Logical, that is, written, duration attribute values for multi-breve rests in the mensural repertoire. + + + + A two-breve rest. + + + A three-breve rest. + + + + + Logical, that is, written, duration attribute values for mensural rests. + + + + + Duration attribute values of a given note symbol for the mensural repertoire. + + + + Three times the duration of the note in the next smaller degree. + + + Two times the duration of the note in the next smaller degree. + + + Twice the original duration of the note (only usable in perfect mensurations). + + + Category of a regular semibrevis in Ars antiqua, equivalent to a third of a brevis. + + + Category of an altered semibrevis in Ars antiqua, equivalent to two minor semibrevis. + + + One of the three categories of a longa in Ars antiqua ('duplex', 'perfecta', and 'imperfecta'). A duplex longa is twice as long as a regular longa. + + + + + Form of the flag. + + + + Flag is a straight horizontal line. + + + Flag is a straight line at an angle. + + + Flag is curled. + + + Flag is flared. + + + Flag looks extended. + + + Flag is hooked-form. + + + + +

+ + +

+
+
+ Position of the flag relative to the stem. + + + + Flag lies at the left side of the stem. + + + Flag lies at the right side of the stem. + + + Flag is centered in the stem. + + + + + Items in the Mensural repertoire that may be printed near a staff. + + + + Ligatures. + + + + + Form of the stem attached to the note. + + + + Stem has a circular form. + + + Stem has an oblique form. + + + Stem has a swallowtail form. + + + Stem has a virgula-like form. + + + + + Attribute that expresses duration for a given mensural note symbol. + + + + + Duplex quality can only be used with longas (in Ars antiqua). + + + + + + + + + Maior / minor quality can only be used with semibreves (in Ars antiqua). + + + + + + + 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). + + + + + + + Logical domain attributes. + + 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. + Modusminor describes the long-breve relationship, while tempus describes the breve-semibreve, + 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. + + + + + + Together, proport.num and proport.numbase specify a proportional change as a ratio, + e.g., 1:3. Proport.numbase is for the second value in the ratio. + + + + + + + Shared attributes in the mensural repertoire. + + + + + When the @divisio attribute is used, the @tempus and @prolatio attributes are not allowed. + + + + + + + Describes the maxima-long relationship. + + + + + + Describes the long-breve relationship. + + + + + + Describes the semibreve-minim relationship. + + + + + + Describes the breve-semibreve relationship. + + + + + + Describes the divisions of the breve in use in 14th-century Italy. + + + + + + + Analytical domain attributes in the Mensural repertoire. + + Gestural domain attributes in the Mensural repertoire. + + + + + Logical domain attributes in the Mensural repertoire. + + Visual domain attributes in the Mensural repertoire. + + + Indicates this element’s participation in a ligature. + + + + + + + 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 + normal value of the notes in mensural notation as a ratio. + + + + + Gestural domain attributes. + + + + + Visual domain attributes. + + + States how many spaces are covered by the rest. + + + + + + + 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. + + + + + Logical domain attributes for staffDef in the mensural repertoire. + + + + + Visual domain attributes for 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. + + + Records the form of the stem. + + + + + + + Groups event elements that occur in the mensural repertoire. + + + + + 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 are components of a staff in the mensural repertoire. + + + + A mensural notation symbol that combines two or more notes into a single sign. + + + + + + + + + + +

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. + + + + + + + + + + + +

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 + + + + + + + + + + Only one plica is allowed. + + + proportionDescription of note duration as arithmetic ratio. + + + + + + + + + + + +

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 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. + + + 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. + + + + + + + @instr attribute + should have content. + The value in @instr should correspond to the @xml:id attribute of an instrDef + element. + + + + + + + Attributes common to MIDI events. + + + + + + + + + Logical domain attributes. + + + + + + + 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. + + + + + + Provides a General MIDI label for the MIDI instrument. + + + + + + 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. + + + + + + Records a non-General MIDI patch/instrument name. + + + + + + Records a non-General MIDI patch/instrument number. + + + + + + Sets the instrument’s volume. + + + + + + + Attributes that record MIDI numbers. + + + number + MIDI number in the range set by data.MIDIVALUE. + + + + + + + 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*. + + + + + + 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. + + + + + + + Attributes that record MIDI values. + + + MIDI number. + + + + + + + Attributes that record terminal MIDI values. + + + MIDI number. + + + + + + + MIDI attributes pertaining to key velocity. + + + MIDI Note-on/off velocity. + + + + + + + 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. + + + + + + + Groups elements which group MIDI-like elements. + + + + + + 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. + + + + + + MIDI number in the range set by data.MIDICHANNEL. + + + + channel pressureMIDI channel pressure/after touch. + + + + + + +

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

+
MIDI cue point. + + + + + + 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. + + + + + + + + + + + + + + + +

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. + + + + MIDI marker meta-event. + + + + + + MIDI text meta-event. + + + + + + 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-on event. + + + + + + MIDI port. + + + + + + programMIDI program change. + + + + + + sequence numberMIDI sequence number. + + + + + + Number in the range 0-65535. + + + 65535 + + + track nameMIDI track/sequence name. + + + + + + velocityMIDI Note-on/off velocity. + + + + + + + Indicates whether this is note-on or note-off velocity data. + + + Note-on velocity. + + + Note-off velocity. + + + + 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 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. + + + + + + + + + + +

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'. + + + + + + + + + + +

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. + + + + + + + + + + +

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 boxContains 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 codeContains 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.

+
+ Items in the Neume repertoire that may be printed near a staff. + + Logical domain attributes. + + + Identifies the different kinds of division. + + + + + + + + + + + + + + + Logical domain attributes. + + + + + + + + + + + Logical domain attributes. + + + + + + + + + + + Logical domain attributes. + + Logical domain attributes. + + + + + + + + + + Captures written octave information. + + + 9 + + unknown + + + + + pitch name + Contains a written pitch name. + + + [a-g]|unknown + + + + + + Attributes that record visual details of neume notation. + + + + + + + + + + + + Connection to the previous component within the same neume; this attribute should not + be used for the first component of a neume. + + + Gapped; not connected. + + + Looped. + + + Extended. + + + + + Pen stroke has an extension; specific to Hispanic notation. + + + + + + Indicates participation in a ligature. + + + + + + Length of the pen stroke relative to the previous component within the same neume; + this attribute should not be used for the first component of a neume. + + + Longer. + + + Shorter. + + + + + Direction of the initial direction for an s-shaped pen stroke; i.e., "w" for the + standard letter S, "e" for its mirror image, "s" for the letter S turned 90-degrees + anti-clockwise, and "n" for its mirror image. + + + + + + Direction of the pen stroke. + + + + + + + Logical domain attributes. + + + + + + + + + Logical domain attributes. + + + + + + + + + Attributes that specify the type of neumes. + + + Designation which characterizes the element in some sense, using any convenient + classification scheme or typology that employs single-token labels. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Logical domain attributes. + + Logical domain attributes. + + Logical domain attributes. + + + + + + + + + + + Logical domain attributes. + + Logical domain attributes. + + + + + Groups event elements that occur 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-like features. + + Groups elements that may occur within a neume. + + Groups elements that accommodate neumed text. + + + + + Groups elements that may appear as part of the content of a syllable. + Episema. + + + + + + + + Hispanic tick. + + + + + + + + + + Liquescent. + + + + + + + + Sign representing a single pitched event, although the exact pitch may not be + known. + + + + + + + + + + + + + + + neume component groupCollection of one or more neume components. + + + + + + + + + + Sign representing one or more musical pitches. + + + + + + + + + + + + + + + Oriscus. + + + + + + + + Quilisma. + + + + + + + + Significantive letter(s). + + + + + + + + + + Strophicus. + + + + + + + + Neume notation can be thought of as "neumed text". Therefore, the syllable element + provides high-level organization in this repertoire. + + + + + + + + + + Represents a division (divisio) in neume notation. Divisions indicate short, medium, or long pauses + similar to breath marks in modern notation. + + + + + + + + + + + + + + + + + Temporal alignment attributes. + + + + @when attribute should + have content. + A + value in @when should correspond to the @xml:id attribute of a when + element. + + + + + + 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. + + + + + + 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. + + + + + + + + + + + + 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. + + + + + + +

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. + + + + + + + + + + + + + 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). + + + + + + + + @since must be present when @interval is used. + The value in @since should correspond to the @xml:id attribute of a when + element. + + + When @interval contains an integer value, + @inttype cannot be 'time'. + + + When @interval contains a time value, @inttype must + be 'time'. + + + + + + When @absolute is + present, @abstype should be present or @betype should be present on an + 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. + + + + 1 + + + + + + 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 + attribute is omitted and the absolute attribute is not specified, then the reference point + is understood to be the immediately preceding when element. + + + + + + + @since attribute + should have content. + The value in @since should correspond to the @xml:id attribute of a when + element. + + + + +

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. + + + + 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. + + + + + + + + + + +

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. + + + + + + + + + + + + + + + + Groups elements that contain meta-data about a single page. + + + + + + + Groups elements that may appear as part of the music element. + + + + + + + Provides a choice between structured and unstructured/mixed content. + + + + + Groups elements that may appear as part of a bibliographic title. + + + + + Datatypes for values in begin, end, abstype and inttype attributes. + + + + Bytes. + + + Synchronized Multimedia Integration Language. + + + MIDI clicks. + + + MIDI machine code. + + + MIDI time code. + + + SMPTE 25 EBU. + + + SMPTE 24 Film Sync. + + + SMPTE 30 Drop. + + + SMPTE 30 Non-Drop. + + + SMPTE 29.97 Drop. + + + SMPTE 29.97 Non-Drop. + + + AES Time-code character format. + + + ISO 24-hour time format: HH:MM:SS.ss. + + + + + Logical domain attributes. + + + + + + + Records the function of an accidental. + + + Cautionary accidental. + + + Editorial accidental. + + + + + + Attributes for capturing momentary pitch inflection. + + + Captures a written accidental. + + + + + + + Logical domain attributes. + + Logical domain attributes. + + + + + + + + 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. + + + + + + + + + + + + + Logical domain attributes. + + + + + + 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. + Only articulations should be encoded in the artic attribute; for example, fingerings + should be encoded using the fing element. + + + + + + + Logical domain attributes. + + + + + + + + Indicates the next section or movement to be performed. + + + + + + + @target attribute + should have content. + The value in @target should correspond to the @xml:id attribute of a section or + mdiv element. + + + + + + + Attributes that describe the intended audience. + + + The intended audience. + + + Internal use only. + + + Available to all audiences. + + + + + + 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 + attribute. + + + + + + +

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. + + + + + + A name or label associated with a controlled vocabulary or other authoritative source + for this element or its content. + + + + + + A web-accessible location of the controlled vocabulary or other authoritative source + of identification or definition for this element or its content. This attribute may + contain a complete URI or a partial URI which is completed by the value of the codedval + attribute. + + + + + + + Logical domain attributes. + + + + + + Records the appearance and usually the function of the bar line. + + + + + + + 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 + 5-line staff. + + + 0 + + + +

This attribute is ignored if the value of the bar.style attribute is mensur.

+
+
+ + Records the method of barring. + + + + + + + "mensur" not allowed in this + context. + + + + + + Denotes the staff location of bar lines, if the length is non-standard; that is, not + equal to 2 times (the number of staff lines - 1). + + + + +

The location may include staff lines, the spaces between the lines, and the spaces + directly above and below the staff. The value ranges between 0 (just below the staff) to + 2 * number of staff lines (directly above the staff). For example, on a 5-line staff the + lines would be numbered 1, 3, 5, 7, and 9 while the spaces would be numbered 0, 2, 4, 6, + 8, and 10. So, a value of 9 puts the bar line through the top line of the staff.

+

This attribute is ignored if the value of the bar.style attribute is mensur.

+
+
+
+
+ Attributes that form the basis of the att.common class. + + + + + + + Provides a base URI reference with which applications can resolve relative URI + references into absolute URI references. + + + + + + + Bibliographic attributes. + + + Contains a reference to a field or element in another descriptive encoding system to + which this MEI element is comparable. + + + + + + +

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. + + + + + + + + + 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. + + + + + + + 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 + auth.uri attributes. + + + + + + + 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. + + + + + + + + + + + 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 + element or be an external URL. + + + + + + + Logical domain attributes. + + + + + + + + + Records the function of the clef. A "cautionary" clef does not change the following + pitches. + + + + + + + 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 + specified. + + + A TAB or percussion clef requires that the number of lines be + specified. + + + + + + Encodes a value for the clef symbol. + + + + + + Contains a default value for the position of the clef. 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. + + + + + + Records the amount of octave displacement to be applied to the clef. + + + + + + Records the direction of octave displacement to be applied to the clef. + + + + + + + Logical domain attributes. + + Attributes that record the shape of a clef. + + + + When @shape is present, @line must also be + specified. + + + + + + Describes a clef’s shape. + + + + + + + Visual color attributes. + + + Used to indicate visual appearance. Do not confuse this with the musical term 'color' + as used in pre-CMN notation. + + + + + + + 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, + black, etc.) where void notes would otherwise occur. In CMN, coloration is indicated by an + inverse color; that is, the note head is void when it would otherwise be filled and vice + versa. + + + + + + + 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. + + + + + + + + + + + + This attribute class records the position of a feature within a two-dimensional coordinate + system. + + + + + + Indicates the lower-right corner x coordinate. + + + + + + Indicates the lower-left corner x coordinate. + + + + + + + Indicates the amount by which the contents of this element have been rotated clockwise or, if applicable, how the orientation of + the element self should be interpreted, with respect to the normal orientation of the parent surface. + The orientation is expressed in arc degrees. + + + + + 0 + +

This attribute is based on the TEI attribute of the same name.

+
+
+
+
+ This attribute class records the upper left position of a feature within a two-dimensional coordinate + system. + + + Indicates the upper-left corner x coordinate. + + + + + + Indicates the upper-left corner y coordinate. + + + + + + + Attributes that describe "cue-ness". + + + + + + + + + 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. + + + + + + Describes a curve as one or more pairs of values with respect to an imaginary line + connecting the starting and ending points of the curve. The first value captures a + distance to the left (positive value) or right (negative value) of the line, expressed in + virtual units. The second value of each pair represents a point along the line, expressed + as a percentage of the line’s length. N.B. An MEI virtual unit (vu) is half the distance + between adjacent staff lines where the interline space is measured from the middle of a + staff line. + + + + + + Describes a curve with a generic term indicating the direction of curvature. + + + Upward curve. + + + Downward curve. + + + A "meandering" curve, both above and below the items it pertains to. + + + + + + Logical domain attributes. + + + + + + + Encodes the target note when its pitch differs from the pitch at which the custos + appears. + + + + + + + @target attribute + should have content. + The value in @target should correspond to the @xml:id attribute of a note + element. + + + + + + + Attributes common to dates. + + + Contains the end point of a date range in standard ISO form. + + + + + + Provides the value of a textual date in standard ISO form. + + + + + + Contains an upper boundary for an uncertain date in standard ISO form. + + + + + + Contains a lower boundary, in standard ISO form, for an uncertain date. + + + + + + Contains the starting point of a date range in standard ISO form. + + + + + + + Attributes for linking metadata to data. + + + Used to link metadata elements to one or more data-containing elements. + + + + + + + @data attribute should + have content. + The value in @data should correspond to the @xml:id attribute of a descendant of + the music element. + + + + + + + Logical domain attributes. + + + + + 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 + content. + + + + + + + @decls attribute + should have content. + Each value in @decls should correspond to the @xml:id attribute of an element + within the metadata header. + No value in @decls should correspond to the @xml:id attribute of a classification + term. Use @class for this purpose. + + + + + + + Attributes that capture the dimensions of an entity. + + + + + + Logical domain attributes. + + + + + + + + Attributes that describe distance from the staff. + + + Records the default distance from the staff for directives. + + + + + + Records the default distance from the staff for dynamic marks. + + + + + + Records the default distance from the staff of harmonic indications, such as guitar + chord grids or functional labels. + + + + + + Records the default distance from the staff for rehearsal marks. + + + + + + Records the default distance from the staff for tempo marks. + + + + + + + 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. + + + duration + When a duration cannot be represented as a single power-of-two value, multiple + space-separated values that add up to the total duration may be used. + + + + + + + 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. + + + + + + Along with numbase.default, describes the default duration as a ratio. num.default is + the first value in the ratio. + + + + + + Along with num.default, describes the default duration as a ratio. numbase.default is + the second value in the ratio. + + + + + + + Attributes that express duration in musical terms. + + + duration + Records the duration of a feature using the relative durational values provided by the + data.DURATION datatype. + + + + + + + Attributes that describe duration as a ratio. + + + number + Along with numbase, describes duration as a ratio. num is the first value in the + ratio, while numbase is the second. + + + + + + Along with num, describes duration as a ratio. num is the first value in the ratio, + while numbase is the second. + + + + + + + Logical domain attributes. + + + + + + + + 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 + accidentals enclosed in parentheses, see Read, p. 131, ex. 9-14. + + + + + + + Logical domain attributes. + + + + + Attributes that record ending style information + + + Describes where ending marks should be displayed. + + + Ending rendered only above top staff. + + + Ending rendered above staves that have bar lines drawn across them. + + + Endings rendered above staff groups. + + + + + + Attributes that apply to all written events, e.g., note, chord, rest, etc. + + + + + + + + + Attributes describing the support for and the certainty of an assertion. + + + Signifies the degree of certainty or precision associated with a feature. + + + + + + Indicates the nature of the evidence supporting the reliability or accuracy of the + intervention or interpretation. + + + + + + There is evidence within the document to support the intervention. + + + There is evidence outside the document to support the intervention. + + + The assertion has been made by the editor, cataloguer, or scholar on the basis of + their expertise. + + + + + + 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. + + + + + + + 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. + + + + + + + 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 + employed instead. + + + + + + + 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. + + + + + + + Attributes that record the function (i.e., placement) of forme work elements. + + + Records the function (i.e., placement) of a page header or footer. + + + + + + + Logical domain attributes. + + + + + + + Indicates the nesting level of staff grouping symbols. + + + + + + + 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 + have content. + Each value in @hand should correspond to the @xml:id attribute of a hand + element. + + + + + + + Attributes that describe vertical size. + + + Measurement of the vertical dimension of an entity. + + + + + + + Attributes that record horizontal alignment. + + + Records horizontal alignment. + + + + + + + Attributes that uniquely identify an element. + + + + Regularizes the naming of an element and thus facilitates building links between it + and other resources. Each id attribute within a document must have a unique value. + + + + + + + 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. + + + + + + + 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. + Also used to indicate a measure which metrically completes the current one. Record the + identifiers of the separately encoded components, excluding the one carrying the + attribute. + + + + + + + @join attribute should + have content. + Each + value in @join should correspond to the @xml:id attribute of an + element. + + + + + + + Logical domain attributes. + + + + + + Attributes for describing key mode. + + + Indicates major, minor, or other tonality. + + + + + + + Logical domain attributes. + + + Written key signature. + + + + + + +

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 + domain that are related to key signatures. + + + Written key signature. + + + + + + +

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 + 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. + + + + Identifies the language of the element’s content. The values for this attribute are + language 'tags' as defined in BCP 47. All language tags that make use of private use + sub-tags must be documented in a corresponding language element in the MEI header whose id + attribute is the same as the language tag’s value. + + + + + + Specifies the transliteration technique used. + + + + +

There is no standard list of transliteration schemes.

+
+
+
+ +

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. + + + + + + + Provides a mechanism for linking the layer to a layerDef element. + + + + + + + @def attribute should + have content. + The value in @def should correspond to the @xml:id attribute of a layerDef + element. + + + + + + + Logical domain attributes. + + + + + + + + Attributes that identify the layer to which a feature applies. + + + Identifies the layer to which a feature applies. + + + + + + + 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 + of the staff. + + + + + + + Attributes that record the visual rendition of lines. + + + + + + + line end symbol + Symbol rendered at end of line. + + + + + + Holds the relative size of the line-end symbol. + + + + + + line start symbol + Symbol rendered at start of line. + + + + + + Holds the relative size of the line-start symbol. + + + + + + + Attributes that record the basic visual rendition of lines. + + + + Describes the style of a line. + + + + + + Width of a line. + + + + + + Describes the number of segments into which a dashed or dotted line may be divided, or + the number of "peaks" of a wavy line; a pair of space-separated values (minimum and + maximum, respectively) provides a range between which a rendering system-supplied value + may fall, while a single value indicates a fixed amount of space; that is, the minimum and + maximum values are equal. + + + 2 + + + + + + @lform attribute + matching "dashed", "dotted", or "wavy" required. + + + + + + + + Attributes that specify element-to-element relationships. + + + Points to an element of which the current element is a copy. + + + + + + + An + element with a copyof attribute can only have comment or processing instruction + descendents. + + + + + + + @copyof attribute + should have content. + The + value in @copyof should correspond to the @xml:id attribute of an + element. + + + + + + Used to point to other elements that correspond to this one in a generic + fashion. + + + + + + + @corresp attribute + should have content. + Each + value in @corresp should correspond to the @xml:id attribute of an + element. + + + + + + points to one or more events in a user-defined collection that are known to be + predecessors of the current element. + + + + + + + @follows attribute + should have content. + Each + value in @follows must correspond to the @xml:id attribute of an + element. + + + + + + Used to point to the next event(s) in a user-defined collection. + + + + + + + @next attribute should + have content. + Each + value in @next should correspond to the @xml:id attribute of an + element. + + + + + + Points to one or more events in a user-defined collection that are known to be + successors of the current element. + + + + + + + @precedes attribute + should have content. + Each + value in @precedes must correspond to the @xml:id attribute of an + element. + + + + + + Points to the previous event(s) in a user-defined collection. + + + + + + + @prev attribute should + have content. + Each + value in @prev should correspond to the @xml:id attribute of an + element. + + + + + + Points to an element that is the same as the current element but is not a literal copy + of the current element. + + + + + + + @sameas attribute + should have content. + Each + value in @sameas should correspond to the @xml:id attribute of an + element. + + + + + + Points to elements that are synchronous with the current element. + + + + + + + @synch attribute + should have content. + Each + value in @synch should correspond to the @xml:id attribute of an + element. + + + + + + + Attributes that describe default typography of lyrics. + + + Describes the alignment of lyric syllables associated with a note or chord. + + + + + + Sets the font family default value for lyrics. + + + + + + Sets the font name default value for lyrics. + + + + + + Sets the default font size value for lyrics. + + + + + + Sets the default font style value for lyrics. + + + + + + Sets the default font weight value for lyrics. + + + + + + + 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 pertaining to measure numbers + + + Indicates whether measure numbers should be displayed. + + + + + + + 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. + + + + + + Specifies a point where the relevant content ends. If not specified, the end of the + content is assumed to be the end point. A numerical value must be greater and a time value + must be later than that given by the begin attribute. + + + + + + Type of values used in the begin/end attributes. The begin and end attributes can only + be interpreted meaningfully in conjunction with this attribute. + + + + + + + Attributes describing a writing medium, such as pencil or ink. + + + Describes the writing medium. + + + + + + + Attributes that record the version of MEI supported. + + + Specifies a generic MEI version label. + 5.0 + + + MEI 2013 + + + MEI 3.0.0 + + + MEI 4.0.0 + + + MEI 4.0.1 + + + MEI 5.0 + + + MEI 5.0+basic + + + MEI 5.0+CMN + + + MEI 5.0+Mensural + + + MEI 5.0+Neumes + + + + + + Logical domain attributes. + + + + + + + Level of duration at which the proportion given by the @num and @numbase ratio applies. + + + + + + + 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 + meter. + + + Complete; i.e., conformant with the prevailing meter. + + + Incomplete; i.e., not enough beats. + + + Overfull; i.e., too many beats. + + + + + + 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 + meter. + + + + + + Indicates whether or not a bar line is "controlling"; that is, if it indicates a 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 bar line + but not the left. + + + + + + + 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 + decimal number, such as 2+3 or 3*2. + + + \d+(\.\d+)?(\s*[\+\-\*/]\s*\d+(\.\d+)?)* + + + + + symbol + Indicates the use of a meter symbol instead of a numeric meter signature, that is, 'C' + for common time or 'C' with a slash for cut time. + + + + + + Contains the number indicating the beat unit, that is, the bottom number of the meter + signature. + + + + + + + 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 + decimal number, such as 2+3 or 3*2. + + + \d+(\.\d+)?(\s*[\+\-\*/]\s*\d+(\.\d+)?)* + + + + + Contains the number indicating the beat unit, that is, the bottom number of the meter + signature. + + + 0 + + + + + Indicates the use of a meter symbol instead of a numeric meter signature, that is, 'C' + for common time or 'C' with a slash for cut time. + + + + + + + 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 + midi.mspb. In MIDI, a beat is always defined as a quarter note, *not the numerator of the + time signature or the metronomic indication*. + + + + + + Captures the metronomic unit. + + + + + + Records the number of augmentation dots required by a dotted metronome unit. + + + + + + + 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. + + + + + + + Attributes shared by names. + + + + + + + + Used to record a pointer to the regularized form of the name elsewhere in the + document. + + + + + + + @nymref attribute + should have content. + The + value in @nymref should correspond to the @xml:id attribute of an + element. + + + + + + Used to specify further information about the entity referenced by this name, for + example, the occupation of a person or the status of a place. + + + + +

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.

+
+
+
+
+ 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. + + + + + + + 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. + + + + + + + Attributes that capture music font name and size. + + + Sets the default music font name. + + + + + + Sets the default music font size. + + + + + + + Logical domain attributes. + + + + + + + + + + + + + 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 + should have content. + The value in @head.altsym should correspond to the @xml:id attribute of a symbolDef + element. + + + + + + A name or label associated with the controlled vocabulary from which a numerical value + of head.shape is taken. + + + + + + + When + @head.auth matches 'smufl', @head.shape must contain a numeric glyph reference in + hexadecimal notation, like "#xE000" or "U+E000". + + + + + + Standard Music Font Layout. + + + + + Captures the overall color of a notehead. + + + + + + Describes how/if the notehead is filled. + + + + + + Captures the fill color of a notehead if different from the overall note color. + + + + + + Records any additional symbols applied to the notehead. + + + + + + Describes rotation applied to the basic notehead shape. A positive value rotates the + notehead in a counter-clockwise fashion, while negative values produce clockwise + rotation. + + + + + + Used to override the head shape normally used for the given duration. + + + + + + + SMuFL version 1.18 uses the range U+E000 - U+ECBF. + + + + + + Indicates if a feature should be rendered when the notation is presented graphically + or sounded when it is presented in an aural form. + + + + + + + Attributes that record written octave. + + + octave + Captures written octave information. + + + + + + + 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. + + + + + + + Attributes describing the amount and direction of octave displacement. + + + Records the amount of octave displacement. + + + + + + Records the direction of octave displacement. + + + + + + + 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 + stems-down notes below the line. + + + + + + + Attributes pertaining to layout optimization. + + + Indicates whether staves without notes, rests, etc. should be displayed. When the + value is 'true', empty staves are displayed. + + + + + + + Attributes that identify the layer associated with a distant feature. + + + identifies the layer on which referenced notation occurs. + + + + + + + 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. + + + + + + + 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. + + + + + + indicates the final element in a sequence of events. + + + + + + + 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. + + + + + + encodes the ending point of musical material in terms of musical time, i.e., a count + of measures plus a beat location. The values are relative to the measure identified by + origin.tstamp. + + + + + + + When @origin.tstamp2 is used @origin.tstamp must + also be present. + + + + + + + Logical domain attributes. + + + + + + + + + Logical domain attributes. + + + + + + Attributes that record page-level layout information. + + + Specifies the height of the page; may be expressed in real-world units or staff + steps. + + + + + + Describes the width of the page; may be expressed in real-world units or staff + steps. + + + + + + page top margin + Indicates the amount of whitespace at the top of a page. + + + + + + page bottom margin + Indicates the amount of whitespace at the bottom of a page. + + + + + + page left margin + Indicates the amount of whitespace at the left side of a page. + + + + + + page right margin + Indicates the amount of whitespace at the right side of a page. + + + + + + Indicates the number of logical pages to be rendered on a single physical page. + + + + + + Indicates how the page should be scaled when rendered. + + + + + + + Logical domain attributes. + + 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. + + + (%all|#[\i][\c]+) + + + + + + '%all' cannot be mixed with other + values. + + + + + + Signifies the part staff on which a notated feature occurs. Use '%all' when the + feature should occur on every staff. + + + (%all|\d+(-\d+)?) + + + + + + '%all' cannot be mixed with other + values. + + + + + + + Logical domain attributes. + + Logical domain attributes. + + + + + Logical domain attributes. + + + + + + + + Attributes that record written pitch name. + + + pitch name + Contains a written pitch name. + + + + + + + Attributes that record written pitch name and octave number. + + + + + + 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. + + + + + + + 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. + + + + + + + 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. + + + + + + + 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 + the target attribute is not present, it identifies participants in a mutual + relationship. + + + + + + + @plist attribute + should have content. + Each + value in @plist should correspond to the @xml:id attribute of an + element. + + + + + + + Attributes common to all pointing/linking elements. + + + + Defines whether a link occurs automatically or must be requested by the user. + + + Load the target resource(s) immediately. + + + Load the target resource(s) upon user request. + + + Do not permit loading of the target resource(s). + + + Behavior other than allowed by the other values of this attribute. + + + + + + Characterization of the relationship between resources. The value of the role + attribute must be a URI. + + + + + + + Defines how a remote resource is rendered. + + + Open in a new window. + + + Load the referenced resource in the same window. + + + Embed the referenced resource at the point of the link. + + + Do not permit traversal to the referenced resource. + + + Behavior other than permitted by the other values of this attribute. + + + + + Identifies passive participants in a relationship; that is, the entities pointed + "to". + + + + + + Characterization of target resource(s) using any convenient classification scheme or + typology. + + + + + + + + + + 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. + + + + + + + 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 + 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 + document header. + + + + + + + @resp attribute should + have content. + The value in @resp should correspond to the @xml:id attribute of an element within + the metadata header. + + + + + + + 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. + + + + + 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 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. + + + + + + + + + + + + Logical domain attributes. + + + + + 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. + + + + + + + Attributes for recording the number of slashes that accompany a feature. + + + Indicates the number of slashes present. + + + + + + + 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 + employed. + + + + + + + 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. + + + + + + + @source attribute + should have content. + Each value in @source should correspond to the @xml:id attribute of a source or + manifestation element. + + + + + + + Logical domain attributes. + + + + + + + + Attributes that capture notation spacing information. + + + Describes a note’s spacing relative to its time value. + + + + + + Describes the note spacing of output. + + + + + + Specifies the minimum amount of space between adjacent staves in the same system; + measured from the bottom line of the staff above to the top line of the staff + below. + + + + + + Describes the space between adjacent systems; a pair of space-separated values + (minimum and maximum, respectively) provides a range between which a rendering + system-supplied value may fall, while a single value indicates a fixed amount of space; + that is, the minimum and maximum values are equal. + + + + + + + Logical domain attributes. + + + + + + Provides a mechanism for linking the staff to a staffDef element. + + + + + + + @def attribute should + have content. + The value in @def should correspond to the @xml:id attribute of a staffDef + element. + + + + + + + Logical domain attributes for staffDef. + + + + + + + + + + + + + + Indicates the number of staff lines. + + + + + + + Attributes that describe the symbol used to group a set of staves. + + + Specifies the symbol used to group a set of staves. + + + Curved symbol, i.e., {. + + + Square symbol, i.e., [, but with curved/angled top and bottom segments. + + + Square symbol, i.e., [, with horizontal top and bottom segments. + + + Line symbol, i.e., |, (wide) line without top and bottom curved/horizontal + segments. + + + Grouping symbol missing. + + + + + + Logical domain attributes. + + 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. + + + + + + + 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. + + + + + + Describes vertical order of items printed below a staff, from closest to farthest away + from the staff. + + + + + + Describes vertical order of items printed between staves, from top to bottom. + + + + + + + Attributes that identify location on a staff in terms of lines and spaces. + + + Holds the staff location of the feature. + + + + + + + Attributes that identify location on a staff in terms of pitch and octave. + + + Captures staff location in terms of written pitch name. + + + + + + Records staff location in terms of written octave. + + + + + + + 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 + should have content. + The + value in @endid should correspond to the @xml:id attribute of an + element. + + + + + + + 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 + should have content. + The + value in @startid should correspond to the @xml:id attribute of an + element. + + + + + + + Attributes that describe the properties of stemmed features; that is, chords and + notes. + + + + + + + Describes the direction of a stem. + + + + + + Encodes the stem length. + + + + + + Encodes any stem "modifiers"; that is, symbols rendered on the stem, such as tremolo + or Sprechstimme indicators. + + + + + + Records the position of the stem in relation to the note head(s). + + + + + + Points to a note element in a different layer whose stem is shared. + The linked notes should be rendered like a chord though they are part of different layers. + + + + + + + + + + @stem.sameas attribute + should have content. + + The value in @stem.sameas should correspond to the @xml:id attribute of the linked note + element of a different layer. + + The linked notes by @stem.sameas should have the same @dur values. + + + + + + + Determines whether a stem should be displayed. + + + + + + Records the output x coordinate of the stem’s attachment point. + + + + + + Records the output y coordinate of the stem’s attachment point. + + + + + + + Logical domain attributes. + + + Describes the symbols typically used to indicate breaks between syllables and their + functions. + + + Space (word separator). + + + Dash (syllable separator). + + + Underscore (syllable extension). + + + Tilde (syllable elision). + + + Circumflex [angled line above] (syllable elision). + + + Caron [angled line below] (syllable elision). + + + Inverted breve [curved line above] (syllable elision). + + + Breve [curved line below] (syllable elision). + + + + + Records the position of a syllable within a word. + + + (initial) first syllable. + + + (medial) neither first nor last syllable. + + + (single) single syllable. + + + (terminal) last syllable. + + + + + + Attributes that hold associated sung text syllables. + + + Holds an associated sung text syllable. + + + + + + + Logical domain attributes. + + + + + 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 + symbol. + + + + + + Describes the amount of whitespace at the left system margin relative to + page.leftmar. + + + + + + Describes the amount of whitespace at the right system margin relative to + page.rightmar. + + + + + + Describes the distance from page’s top edge to the first system; used for first page + only. + + + + + + + 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. + + + If an element pointed to is itself a pointer, then the target of that pointer will + be taken, and so on, until an element is found which is not a pointer. + + + If an element pointed to is itself a pointer, then its target (whether a pointer + or not) is taken as the target of this pointer. + + + No further evaluation of targets is carried out beyond that needed to find the + element(s) specified in plist or target attribute. + + + +

If no value is given, the application program is responsible for deciding (possibly on + the basis of user input) how far to trace a chain of pointers.

+
+
+
+
+ Logical domain attributes. + + + + + + + + + Records the function of a tempo indication. + + + Marks a gradual change of tempo, such as "accel." or "rit." + + + Represents a static tempo instruction, such as a textual term like "Adagio", a + metronome marking like "♩=70", or a combination of text and metronome + indication. + + + Captures a change in pulse rate (tempo) and/or pulse grouping (subdivision) in an + "equation" of the form [tempo before change] = [tempo after change]. + + + Indicates a change in pulse rate (tempo) and/or pulse grouping (subdivision) in an + "equation" of the form [tempo after change] = [tempo before change]. The term + "precedente" often appears following the "equation" to distinguish this kind of + historical usage from the modern metric modulation form. + + + + + + Attributes that record renditional characteristics. + + + Used to extend the values of the rend attribute. + + + + + + rendition + Captures the appearance of the element’s contents using MEI-defined + descriptors. + + + + + + + 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. + + + + + + Provides a default value for the font name of text (other than lyrics) when this + information is not provided on the individual elements. + + + + + + Provides a default value for the font size of text (other than lyrics) when this + information is not provided on the individual elements. + + + + + + Provides a default value for the font style of text (other than lyrics) when this + information is not provided on the individual elements. + + + + + + Provides a default value for the font weight for text (other than lyrics) when this + information is not provided on the individual elements. + + + + + + + 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. + + + + + + + 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], + as expressed in the written time signature. + + + + + + + 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. + + + + + + + Attributes that describe transposition. + + + transposition (diatonic) + Records the amount of diatonic pitch shift, e.g., C to C♯ = 0, C to D♭ = 1, necessary + to calculate the sounded pitch from the written one. + + + + + + transposition (semitones) + Records the amount of pitch shift in semitones, e.g., C to C♯ = 1, C to D♭ = 1, + necessary to calculate the sounded pitch from the written one. + + + + + + +

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. + + + Holds a value for cycles per second, i.e., Hertz, for a tuning reference pitch. + + + + + + Holds the pitch name of a tuning reference pitch, i.e., the central tone of a tuning system. + + + + + + Provides an indication of the tuning system, just, for example. + + + + + + + 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 + employed. + + + + + + + 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. + + + Contains the name of a font-family. + + + + + + Holds the name of a font. + + + + + + Indicates the size of a font expressed in printers' points, i.e., 1/72nd of an inch, + relative terms, e.g., small, larger, etc., or percentage values relative to normal + size, e.g., 125%. + + + + + + Records the style of a font, i.e., italic, oblique, or normal. + + + + + + Used to indicate bold type. + + + + + + Indicates letter spacing (aka tracking) in analogy to the CSS letter-spacing + property. + + + + + + Indicates line height in analogy to the CSS line-height property. + + + + + + + Attributes that record vertical alignment. + + + Records vertical alignment. + + + + + + + Attributes that record grouping of vertically aligned elements. + + + Provides a label for members of a vertically aligned group. + + + + + + + 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. + + + + + + + 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. + + + 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 + staff lines. + + + + + + + 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. + + + + + + + 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 + staff lines. + + + + + + + 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. + + + Records the horizontal adjustment of a feature’s programmatically-determined start + point. + + + + + + Records the horizontal adjustment of a feature’s programmatically-determined end + point. + + + + + + + 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. + + + + + + Records a timestamp adjustment of a feature’s programmatically-determined end + point. + + + + + + + Vertical offset attributes requiring a pair of attributes. + + + Records a vertical adjustment of a feature’s programmatically-determined start + point. + + + + + + Records a vertical adjustment of a feature’s programmatically-determined end + point. + + + + + + + Attributes that describe the symbol used to group volta elements. + + + Specifies the symbol used to group lyrics. + + + Curved symbol, i.e., {. + + + Square symbol, i.e., [, but with curved/angled top and bottom segments. + + + Square symbol, i.e., [, with horizontal top and bottom segments. + + + Line symbol, i.e., |, (wide) line without top and bottom curved/horizontal + segments. + + + Grouping symbol missing. + + + + + + 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 + be turned off locally by setting the xml:space attribute to the value default. + + + Allows the application to handle white space as necessary. Not including an + xml:space attribute produces the same result as using the default value. + + + Instructs the application to maintain white space "as-is", suggesting that it + might have meaning. + + + + + + Attributes that describe horizontal size. + + + Measurement of the horizontal dimension of an entity. + + + + + + +

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* + 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. + 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. + + + + + 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. + + + + + + Encodes the optional 2nd y coordinate. + + + + + + + Groups elements used to represent a postal address. + + + + + + + Groups annotation-like elements. + + + + + Groups elements containing 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 + figure. + + 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 + upon other events, such as notes or rests, for their existence. + + + + + + + + + Groups elements containing date expressions. + + + + + + + + Groups elements which describe a measurement forming part of the physical dimensions of an + object. + + + + + Groups elements containing bibliographic edition information. + + + + + + Groups editorial intervention elements. + + + + + + Groups elements that represent alternative endings. + + + + + + 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 + component. + + Groups identifier-like elements. + + + + + + + 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. + + Groups elements that represent accidentals in 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 that permit declaration of layer properties. + + 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 at the layer level that are shared by the mensural and neume + repertoires. + + + + + Groups elements that function like line beginnings. + + + + + + Groups elements used to represent generic structural divisions of music notation. + + Groups elements that represent a measurement. + + + + + Groups elements that represent a meter signature. + + + + + + Groups milestone-style elements found in music notation. + + Groups milestone-style elements found in text. + + Groups elements that contain names. + + + + + Groups elements that modify note-like features. + + + + + Groups elements that denote a number or a quantity. + + + + + 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 collect separate performer parts. + + Groups page beginning-like elements. + + + + + + + Groups paragraph-like elements. + + + + + Collects elements that express a relationship. + + + + + Groups elements that mark typographical features. + + + + + 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 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. + + + + + Groups elements that represent a score. + + Groups elements that may appear as part of a score. + + 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 in the mensural and neume + repertoires. + + + + + Groups elements that permit declaration of staff properties. + + + + + Groups elements that may appear in the declaration of staff features. + + Groups elements that permit declaration of staff group properties. + + Groups elements that function like staves. + + + + + + Groups elements that are components of a staff. + + Groups elements that are components of a staff in the mensural and neume + repertoires. + + + + + Groups elements that contain a lyric syllable. + + + + + + + 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. 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 may appear as part of a title page transcription. + accidentalRecords a temporary alteration to the pitch of a note. + + + + + + + + + + + +

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 + element. The element may be used when specific display info, such as size or color, needs to + 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. + + + + + + + + + + + + annotationProvides a statement explaining the text or indicating the basis for an + assertion. + + + + + + + + + + + + + + + + + + + + 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 + label for and comment regarding the group. Participating entities may be identified in the + plist attribute. An editorial or analytical comment or observation may be + included directly within the annot element. The starting point of the + annotation may be indicated by either a tstamp, tstamp.ges, + tstamp.real or startid attribute, while the ending point may be + 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 + 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. + + + + + + + + + + + +

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 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. + + + + + + + + + + + + +

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. + + + + + + + + + +

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. +

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.

+

The content model of body also allows blocks of text and music + 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. + + + + + + + + + + + + + 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. + When combined with a fermata a longer silence is usually implied. The + starting point of the caesura 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.

+

Unlike the breath mark, a caesura may have a performed duration. + Also, while the default value for place on the breath mark is above, the + default value for place for a caesura is within. Unless indicated by other + 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).

+
column beginningAn empty formatting element that forces text to begin in a new + column. + + + + + + + + + + + + + Records the column number. + + + + + + + + Column beginning must be preceded by a + colLayout element. + The value of @n should be less than or equal + to the value of @cols () of the preceding + colLayout element. + + + + +

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*. + + + + + + + + + + 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. + + + + + + + + + + + + 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. + + + + + + + + + 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).

+
Symbol placed at the end of a line of music to indicate the first note of the next line. + Sometimes called a "direct". + + + + + + + + + + + +

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. + + + + + + + + + + + +

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. + + + + + + + + + + + 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 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, 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. + + + + + + + + + + + + + + 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 + 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 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).

+
divisionMajor structural division of text, such as a preface, chapter or + section. + + + + + + + + + + + + + + + Characterizes the textual division in some sense, using any convenient classification + scheme or typology that employs single-token labels. + + + + + + A summary of the content of a text as continuous prose. + + + A formal declaration of acknowledgment by the author in which persons and + institutions are thanked for their part in the creation of a text. + + + An ancillary self-contained section of a work, often providing additional but in + some sense extra-canonical text. + + + A list of bibliographic citations. + + + A statement appearing at the end of a book describing the conditions of its + physical production. + + + A table of contents, specifying the structure of a work and listing its + constituents. The list element should be used to mark its structure. + + + A formal offering or dedication of a text to one or more persons or institutions + by the author. + + + A pictorial frontispiece, possibly including some text. + + + A list of terms associated with definition texts (‘glosses’). + + + A page containing only the title of a book — as opposed to the title page, which + also lists subtitle, author, imprint and similar data. + + + Any form of index to the work. + + + A section in which annotations on the text are gathered together. + + + A foreword or preface addressed to the reader in which the author or publisher + 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. + + + + + + + + + + + +

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. + + + + + + + + + + + + + + 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 + starting point of the dynamic marking 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 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).

+
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. + + + + + + + + + +

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. + + + + + + + + + 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. + + + + + + + +

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. + + + + + + + + + + + + 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.

+
key signatureWritten key signature. + + + + + + + + + + + + + If the @oct attribute + appears on any keyAccid element, it must be provided on all keyAccid + 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. + + + + + + + + +

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. + + + + + + + + An independent stream of events on a staff. + + + + + + + + + + + + + + + + +

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 + 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. + + + + + + + + + musical divisionContains a subdivision of the body of a musical text. + + + + + + + + + + + +

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 + it is not always possible or desirable to generate one from the other. The score and parts elements are placed here and not directly within + the body element because score and part characteristics may change + from mdiv to mdiv. For example, the 2nd movement + of a symphony may require different performing forces (and therefore different score and + 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. + + + + + + + + + + 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. + + + + + + + + + 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. + + + + + + + + + + + + + + + + + + + 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. + + + + + + + + + + + +

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 + attributes. Similarly, the syl sub-element may be used instead of the + syl attribute. The verse sub-element may be used to group text syllables by + verse. The colored attribute may be used to indicate coloration. In the mensural + repertoire, coloration is a temporary change in the underlying mensuration from perfect to + 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. + + + + + + + + + + + + + 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. + + + + + + + + + +

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. + + + + + + + + + An alternative visual rendition of the score from the point of view of a particular + performer (or group of performers). + + + + + + + + + + +

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 + different layout, such as page turns, are needed for the score and parts, or for + accommodating software that requires part-by-part encoding. When assembly of the parts into + 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. + + + + + + + + + + page beginningAn empty formatting element that forces text to begin on a new + page. + + + + + + + + + + + + +

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. + + + + + + +

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. + + + + + + + + +

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. + + + + + + + + +

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. + + + + + + + + + + + + + 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. + + + + Describes a relationship or linkage amongst entities. + + + + + + + + + + + + + + + + Within work, expression, source, or item, the value of the rel attribute must match one + of the following: hasAbridgement, isAbridgementOf, hasAdaptation, isAdaptationOf, + hasAlternate, isAlternateOf, hasArrangement, isArrangementOf, hasComplement, + isComplementOf, hasEmbodiment, isEmbodimentOf, hasExemplar, isExemplarOf, hasImitation, + isImitationOf, hasPart, isPartOf, hasRealization, isRealizationOf, hasReconfiguration, + isReconfigurationOf, hasReproduction, isReproductionOf, hasRevision, isRevisionOf, + hasSuccessor, isSuccessorOf, hasSummarization, isSummarizationOf, hasSupplement, + isSupplementOf, hasTransformation, isTransformationOf, hasTranslation, + isTranslationOf + Within work, expression, source or item, the target attribute + 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 + target attribute is not necessary. In a non-mutual relationship, plist + identifies the entities pointed "from", while target specifies the entities + 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. + + + + + + renderA formatting element indicating special visual rendering, e.g., bold or + italicized, of a text word or phrase. + + + + + + + + + + + + + + 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. 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. + + + + + + + + + +

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, + groups, or in rare cases, mechanical processes, responsible for creation, realization, + production, funding, or distribution of the intellectual or artistic content. + + + + + + + + + + + + At least one element pair (a resp element and a name-like element) is + recommended. Alternatively, each name-like element may have a @role + 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. + + + + + + + + + + + + + + The value of @line must be less than or equal to the number of lines on the + 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. + + + + + + +

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. + + + + + + + + + + + +

Do not confuse this element with the lb element, which performs a + similar function in prose.

+
Full score view of the musical content. + + + + + + + + + + +

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. + + + + + + + + + + + + + + + + + + Segment of music data. + + + + + + + + + + + + + + + + + A + section containing an expansion element must have descendant section, ending, or rdg + 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. + + + + + + + + + +

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. + + + + + + + + + + + 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 + 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. + + + + There must be a preceding staffDef with a matching value of @n, a preceding staff with + 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. + + + + + + + + + + + + + + + + + + + + + StaffDef must have an n attribute. + Either + @lines must be present or a preceding staffDef with the same value for @n and @lines + must exist. + Only one clef or clefGrp is + permitted. + + + + + + + @n must have the same value as the + current staff. + + + + + + + Either + @lines must be present or a preceding staffDef with matching @n value and @lines must + exist. + + + + + + The clef position must be less + than or equal to the number of lines on the staff. + + + + + + + + The clef position must be + less than or equal to the number of lines on the staff. + + + + + + + The tab.strings attribute must have the same + number of values as there are staff lines. + + + + + + + + The + tab.strings attribute must have the same number of values as there are staff + lines. + + + + + + + + The lines.color attribute + must have either 1) a single value or 2) the same number of values as there are staff + lines. + + + + + The lines.color attribute must have either 1) a single value or 2) the same number of + values as there are staff lines. + + + + + + + + + + The value of ppq must be a factor of + the value of ppq on an ancestor scoreDef. + + + + + + + + + + The value of ppq must be a factor of + the value of ppq on a preceding scoreDef. + + + + staff groupA group of bracketed or braced staves. + + + + + + + + + + + + + + + + + + + + Each staffDef must have a unique value + 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. + + + + + + + + + + + +

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"). + + + + + + + + + + + + + + + + Only analog, class, label, mm, mm.dots, mm.unit, n, translit, type, xml:base, xml:id, + and xml:lang attributes are allowed when tempo is not a descendant of a score or + 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. + + + + + + + + + + + + + + + + Indicates the bibliographic level of the title. + + + Analyzed component, such as an article or chapter, within a larger bibliographic + entity. + + + Collection. A group of items that were not originally published, distributed, or + produced together. + + + Subunit of a collection, e.g., item, folder, box, archival series, subgroup, or + subcollection. + + + Integrating resource, such as a continuously updated loose-leaf service or Web + site. + + + Monograph. + + + Journal. + + + Series. + + + Unpublished (including theses and dissertations unless published by a commercial + press). + + + + Characterizes the title in some sense, using any convenient classification scheme or + typology that employs single-token labels. + + + + + + Main title. + + + Subtitle or title of part. + + + Abbreviated form of title. + + + Alternate title by which the item is also known. + + + Translated form of title. + + + Collective title. + + + 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 + work is also known), translated (translated form of title), uniform (collective title), and + desc (descriptive title). The type attribute is provided for convenience in + analysing titles and processing them according to their type; where such specialized + processing is not necessary, there is no need for such analysis, and the entire title, + including subtitles and any parallel titles, may be enclosed within a single title element. Title parts may be encoded in titlePart sub-elements. The name of the list from which a controlled value is taken + 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. + + + + + + + + + + +

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. + + + + + + + + + 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).

+
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. + + + + + + + + +

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. + + + + + + + + +

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. + + + + + + + + +

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 segmentrepresents 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. + + + 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 + should have content. + The value in @altsym should correspond to the @xml:id attribute of a symbolDef + element. + The value + in @altsym must not correspond to the @xml:id attribute of a symbolDef + ancestor. + + + + + + + Logical domain attributes. + + + + + + Indicates the function of the text. + + + + + + The function of the text is unknown. + + + + + + Logical domain attributes. + + + + + + Indicates the function of the curve. + + + + + + The function of the curve is unknown. + + + + + + Attributes for describing the logical behavior of a line. + + + + + + + + + Indicates the function of the line. + + + + + + Indicates coloration in material transcribed from a source originally in mensural + notation. + + + Marks a ligature in material transcribed from a source originally in mensural + notation. + + + The function of the line is unknown. + + + + + + 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. + + + + + + + + + + + +

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 + sub-elements. The starting point of the text 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 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. + + + + + + + + + + + + + In the symbolDef context, curve must have + either a startid attribute or x and y attributes. + In the symbolDef context, curve must have + either an endid attribute or both x2 and y2 attributes. + In the symbolDef context, curve must have either a + 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 + used to record horizontal, vertical, or time offsets from the absolute coordinates or from + the location of the referenced element. Similarly, the terminal point of the curve may be + recorded using either the x2 and y2 coordinates or in relation to the + location of another element using the endid attribute. Attributes in the + att.visualOffset2 class maybe used to record the offsets of the ending point. The + 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. + + + + + + + + + + + + + When used in the symbolDef context, must have + either a startid attribute or x and y attributes. + When used in the symbolDef context, must have + either an endid attribute or both x2 and y2 attributes. + + + When + used in the score context, must have a startid, tstamp, tstamp.ges or tstamp.real + attribute or both x and y attributes. + When used in + the score context, must have an endid, dur, dur.ges, or tstamp2 attribute or both x2 and + 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 + or from the location of the element reference in the startid attribute. + Similarly, the terminal point of the line may be recorded using the x2 and + y2 attributes. Attributes in the att.visualOffset2 class maybe used to record the + 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. + + + + property nameName of a property of the symbol. + + + + + + + + + Characterizes the property name. + + + A registered Unicode normative or informative property name. + + + A locally defined name. + + + property valueA single property value. + + + + 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 propertyProvides a name and value for some property of the parent + symbol. + + + + + 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. + + Visual domain attributes. + + + + + + + + + + Visual domain attributes. + + + + + + Visual domain attributes. + + + Location of the annotation. + + + + + + + Visual domain attributes. + + + + + + + + + + + + + Indicates if an arrowhead is to be drawn as part of the arpeggiation symbol. + + + + + + Symbol rendered at end of the line. + + + + + + Holds the relative size of the arrow symbol. + + + + + + Captures the overall color of the arrow. + + + + + + Captures the fill color of the arrow if different from the line color. + + + + + + + Visual domain attributes. + + + + + + + + + + + + + + + Visual domain attributes. + + + + + + + + + + + Visual domain attributes. + + + + + + + + + + length + 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. + + + 0 + + + +

This attribute is ignored if the value of the style attribute is mensur.

+
+
+ + Records the method of barring. + + + + + + Denotes the staff location of the bar line if its length is non-standard. + + + + +

The location may include staff lines, the spaces between the lines, and the spaces + directly above and below the staff. The value ranges between 0 (just below the staff) to + 2 * number of staff lines (directly above the staff). For example, on a 5-line staff the + lines would be numbered 1, 3, 5, 7, and 9 while the spaces would be numbered 0, 2, 4, 6, + 8, and 10. So, a value of 9 puts the bar line through the top line of the staff.

+

This attribute is ignored if the value of the style attribute is mensur.

+
+
+
+
+ Visual domain attributes. + + + + + + + + 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. + + + + + + Encodes whether a beam is "feathered" and in which direction. + + + Beam lines grow farther apart from left to right. + + + Beam lines grow closer together from left to right. + + + Beam lines are equally-spaced over the entire length of the beam. + + + + + Captures beam slope. + + + + + + + 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 + is a single thick, slanting slash; therefore, the value 1 should be used. When the beat + is divided into even notes, the following values should be used: 4ths or 8ths=1, 16ths=2, + 32nds=3, 64ths=4, 128ths=5. When the beat is comprised of mixed duration values, the + default rendition is 2 slashes and 2 dots. + + + + + + + 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. + + + + + + + + + + + Visual domain attributes. + + + + + + + + + + + + + Visual domain attributes. + + + + + + + + + + + + + Visual domain attributes. + + + + + Visual domain attributes. + + + + + + + + + + + + + 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. + + + + + + + + + + + + + + + + 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 + boundaries of the cluster note head. + + + + + + + Visual domain attributes. + + Visual domain attributes. + + Visual domain attributes. + + + + + + + + + + + Used by staffDef and scoreDef to provide default values for attributes in the visual + domain related to clefs. + + + Describes the color of the clef. + + + + + + Determines whether the clef is to be displayed. + + + + + + + Visual domain attributes. + + Visual domain attributes. + + + + + + + + + + + + Attributes describing the direction of curvature. + + + Records direction of curvature. + + + Anti-clockwise curvature. + + + Clockwise curvature. + + + + + + Visual domain attributes. + + + + + + + + + + + Visual domain attributes. + + + + + + + + + + Visual domain attributes. + + Visual domain attributes. + + + + + + + + + + + Visual domain attributes. + + + + + + + + + + + + + Visual domain attributes. + + + + + + + + + + + Visual domain attributes. + + + + + Visual domain attributes. + + + + + + + + + + + + + + + + + Horizontal stroke. + + + Vertical stroke. + + + + + Captures the placement of the episema with respect to the neume or neume component + with which it is associated. + + + + + + + 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. + + + + + + + + + + + + + Describes the visual appearance of the fermata; that is, whether it occurs as upright + or inverted. + + + Inverted, i.e., curve or bracket below the dot. + + + Upright; i.e., curve or bracket above the dot. + + + + + Describes the visual appearance of the fermata; that is, whether it has a curved, + square, or angular shape. + + + A curve above or below the dot. + + + A bracket above or below the dot. + + + A triangle above or below the dot. + + + + + + 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. + + + + + + + + + + orientation + + + Combination expressed horizontally, as for brass instruments. + + + Combination expressed vertically, as for woodwind instruments or piano. + + + + + + Visual domain attributes. + + + Indicates the number of beams present. + + + 1 + 6 + + + + + Captures the number of "floating" beams, i.e., those not attached to stems. + + + + + + + The number of floating beams must be less + than or equal to the total number of beams. + + + + + + Records the amount of separation between floating beams and stems. + + + + + + + Visual domain attributes. + + + + + + + + + + + + + Visual domain attributes. + + + + + Visual domain attributes + + + Determines whether to display guitar chord grids. + + + + + + + Visual domain attributes. + + + + + + + + + + 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, + and x2 and y2 the right end point, of an imaginary line that defines the length of the hairpin + 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. + + + + + + + + + + + + + Specifies the distance between the lines at the open end of a hairpin dynamic + mark. + + + + + + Applies to a "Rossini" hairpin, i.e., one where the normally open side is closed by a connecting line. + + + + + + Indicates that the opening points are aligned with an imaginary line that is always 90° perpendicular to the horizontal plane, regardless of any angle or start/end adjustments, including when the hairpin is angled with @angle.optimize or through @endvo/@startvo adjustments. + + + + + + Indicates that the slope of the hairpin can be adjusted to follow the content in order to optimize spacing. + + + + + + + Visual domain attributes. + + + + + + + + + + Visual domain attributes. + + + + + + + + + + + Describes how the harmonic indication should be rendered. + + + Chord tablature grid. + + + Chord tablature grid and the element’s textual content. + + + Textual content of the element. + + + + + + Visual domain attributes. + + + + + + + + + + + Visual domain attributes. + + + + + + + + + + + + + + Captures the placement of the tick mark with respect to the neume or neume component + with which it is associated. + + + + + + Direction toward which the mark points. + + + + + + + Visual domain attributes. + + Visual domain attributes. + + + + + + + + + + + Visual domain attributes. + + + + + + + Determines where cautionary accidentals should be displayed at a key change. + + + + + + + Used by staffDef and scoreDef to provide default values for attributes in the visual + domain related to key signatures. + + + Determines where 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. + + + + + + Provides an indication of the function of the ligature. + + + + + + + Attributes for describing the visual appearance of a line. + + + + + + + + + + + Visual form of the line. + + + + + + + Width of the line. + + + + + + + Symbol rendered at end of line. + + + + + + Holds the relative size of the line-end symbol. + + + + + + + Symbol rendered at start of line. + + + + + + Holds the relative size of the line-start symbol. + + + + + + + + Visual domain attributes. + + + + + + + + + + + + + + + Indicates whether curve is closed. + + + + + + + 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. + + + + + + + + + + + Visual domain attributes. + + + + + + Visual domain attributes. + + + + + + Visual domain attributes. These attributes describe the physical appearance of the + mensuration sign/time signature of mensural notation. + + + + + + + + + + + Specifies whether a dot is to be added to the base symbol. + + + + + + Indicates whether the base symbol is written vertically or horizontally. + + + Horizontally oriented. + + + Vertically oriented. + + + + + Describes the rotation or reflection of the base symbol. + + + + + + The base symbol in the mensuration sign/time signature of mensural notation. + + + + + + + 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. + + + + + + Determines if a dot is to be added to the base symbol. + + + + + + Indicates whether the base symbol is written vertically or horizontally. + + + Horizontally oriented. + + + Vertically oriented. + + + + + Holds the staff location of the mensuration sign. + + + + + + Describes the rotation or reflection of the base symbol. + + + + + + The base symbol in the mensuration sign/time signature of mensural notation. + + + + + + Describes the relative size of the mensuration sign. + + + + + + Indicates the number lines added to the mensuration sign. For example, one slash is + added for what we now call 'alla breve'. + + + + + + + Visual domain attributes. + + + + + Visual domain attributes. + + + + + + + + + + + Contains an indication of how the meter signature should be rendered. + + + + + + + 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. + + + + + + Determines whether the old meter signature should be displayed when the meter + signature changes. + + + + + + Determines whether the meter signature is to be displayed. + + + + + + + Visual domain attributes. + + Visual domain attributes. + + + + + + + + + Visual domain attributes. + + + + + + + + + + + Visual domain attributes. + + + + + + + + + + + + + Visual domain attributes. + + + + + + + + + + Visual domain attributes. + + + + + + + + + Visual domain attributes. + + + + + + + Visual domain attributes. + + + + + + + + + + + + + + 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. + + + + + + + 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. + + 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. + + + The back of a manuscript page. + + + The front of a manuscript page. + + + + + + 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. + + + + + + + + + + + + + + Determines whether piano pedal marks should be rendered as lines or as terms. + + + + + + + Visual domain attributes. + + + + + + + + + + Visual domain attributes that describe the properties of a plica stem in the mensural repertoire. + + + direction + Describes the direction of a stem. + + + + + + length + Encodes the stem length. + + + + + + + Visual domain attributes. + + + + + + + + + Visual domain attributes. + + + + + + + + + + + + + + Number of "crests" of a wavy line. + + + 2 + 4 + + + + + + Visual domain attributes. + + Visual domain attributes. + + + + + + + + + + + Visual domain attributes. + + + + + + + + + Visual domain attributes. + + + + + + + + + + + + Visual domain attributes. + + + + + + + + + + + + + + + Visual domain attributes. + + + + + + + + Indicates whether hash marks should be rendered between systems. See Read, p. 436, ex. + 26-3. + + + Display hash marks between systems. + + + + + + Visual domain attributes. + + Visual domain attributes for scoreDef in the CMN repertoire. + + + + + + + + + + + + + + + + + + + + + + + + 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 + from the middle of a staff line. + + + + \d+(\.\d+)?(cm|mm|in|pt|pc) + + + + + + Visual domain attributes. + + + Indicates that staves begin again with this section. + + + + + + + Visual domain attributes. + + + + + + + + + + + + + + Captures the placement of the sequence of characters with respect to the neume or + neume component with which it is associated. + + + + + + + Visual domain attributes for slur. The vo attribute is the vertical offset (from its + normal position) of the entire rendered slur/phrase mark. + + + + + + + + + + + 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. + + + + + + + Visual domain attributes. + + + + + Visual domain attributes for staffDef. + + + + + + + + + + + + + + + + + + + + + Indicates the number of layers and their stem directions. + + + + + + Captures the colors of the staff lines. + + + + +

The value is structured; that is, it should contain a single color value or have + the same number of space-separated values as the number of lines indicated by the + lines attribute. The first value then applies to the lowest line of the staff.

+

All values from data.COLOR are allowed.

+
+
+ + Records whether all staff lines are visible. + + + + + + Records the absolute distance (as opposed to the relative distances recorded in scoreDef elements) between this staff and the preceding one in the same + system. This value is meaningless for the first staff in a system since the spacing.system + attribute indicates the spacing between systems. + + + + +
+
+ Visual domain attributes. + + + + + + + + bar lines through + Indicates whether bar lines go across the space between staves (true) or are only + drawn across the lines of each staff (false). + + + + +

This attribute is ignored when the bar.method attribute’s value is mensur + or takt.

+
+
+
+
+ Visual domain attributes. + + + + + + + + + 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). + + + + + + length + Encodes the stem length. + + + + + + Encodes the form of the stem using the values provided by the data.STEMFORM.mensural datatype. + + + + + + direction + Describes the direction of a stem. + + + + + + Records the position of the flag using the values provided by the data.FLAGPOS.mensural datatype. + + + + + + Encodes the form of the flag using the values provided by the data.FLAGFORM.mensural datatype. + + + + + + + Visual domain attributes. + + + + + + + + + + + + + Visual domain attributes. + + + + + + + + + + + Visual domain attributes. + + Visual domain attributes. + + + + + + + + + + + Visual domain attributes. + + + + + + + + + + + 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. + + + + + + + + + + + Visual domain attributes. + + + + + + + + + + + + + + + Visual domain attributes. + + + + + + + Used to state where a tuplet bracket will be placed in relation to the note + heads. + + + + + + States whether a bracket should be rendered with a tuplet. + + + + + + Determines if the tuplet duration is visible. + + + + + + Controls how the num:numbase ratio is to be displayed. + + + Only the num attribute is displayed, e.g., '7'. + + + Both the num and numbase attributes are displayed, e.g., '7:4'. + + + + + + Visual domain attributes. + + + + + Visual domain attributes. + + + + + + + + + + + + Visual domain attributes. + + + + + + + + + + + Visual domain attributes. + + + + + + + + + + + Collects pagesLike elements. + A set of pages in a page-based encoding + + + + + + Collects pageLike elements. + A page in a page-base encoding + + + + + + + + + + Collects systemLike elements. + A system in a page-based encoding + + + + + + + + + Collects secbLike (section beginning) elements. + section beginningA milestone element indicating the start of a new section in page-based MEI. + + + + + + Collects mdivbLike (mdiv beginning) elements. + mdiv beginningA milestone element indicating the start of a new mdiv in page-based MEI. + + + + + score beginningA milestone element indicating the start of a new score in page-based MEI. + + + + + +

This element is necessary to allow round-tripping between page-based and score-based (regular) MEI.

+
parts beginningA milestone element indicating the start of new parts in page-based MEI. + + + + + +

This element is necessary to allow round-tripping between page-based and score-based (regular) MEI.

+
part beginningA milestone element indicating the start of a new part in page-based MEI. + + + + + +

This element is necessary to allow round-tripping between page-based and score-based (regular) MEI.

+
+ Collects milestone like elements. + milestoneA generic milestone element that can be used as anchor in an MEI file. + + + + + + + + milestone endA milestone element that can be used to indicate the end of an arbitrary feature in MEI. + + + + + + + + + + + + milestoneEnd needs a @startid attribute. + + + +

The @startid attribute should be used to point to the element starting the feature that is ended by an milestoneEnd.

+
+ Attributes that record the x coordinate of the left side of a feature. + + + gives coordinates for the left side of a feature. + + + 0 + + + + + + Attributes that record the x coordinate of the right side of a feature. + + + gives coordinates for the right side of a feature. + + + 0 + + + + + + Attributes that record the y coordinate of the top left of a feature. + + + gives y coordinates for the top left of a feature. + + + 0 + + + + + + Attributes for left/right coordinates. + + + + + + Attribute that define margins of a page. + + + top margin + Indicates the amount of whitespace at the top of a page. + + + + + + bottom margin + Indicates the amount of whitespace at the bottom of a page. + + + + + + left margin + Indicates the amount of whitespace at the left side of a page. + + + + + + right margin + Indicates the amount of whitespace at the right side of a page. + + + + + + + + + In string tablature, the number of the course to be played, i.e., [1-9]+. + + + + + Standard course tunings. + + + + Standard tuning for current guitars. The courses are tuned to E2 A2 D3 G3 B3 E4. + + + Drop D tuning for guitars. The lowest course is tuned down to D, while all other courses are kept to their regular pitches. D2 A2 D3 G3 B3 E4. + + + Open D tuning for guitars. D2 A2 D3 F3s A3 D4. + + + Open G tuning for guitars. D2 G2 D2 G2 B3 D4. + + + Open A tuning for guitars. E2 A2 E3 A3 C4s E4. + + + Renaissance tuning for lutes with 10 strings on 6 courses. G2G3 C3C4 F3F4 A4A4 D4 G4. + + + Baroque tuning for lutes with 6 stable courses, and additional bass courses tuned to the key of D Major. + + + Baroque tuning for lutes with 6 stable courses, and additional bass courses tuned to the key of D minor. + + + + + + + Records which course is to be played. + + + + + + Records which course is to be played. + + + + + + + + + Indicates a tuning standard for the course. + + + + + + course tuning informationDescribes the tuning of a course on a lute. + + foo informationDummy element for enforcing that the att classes are used. + + + + +
\ No newline at end of file diff --git a/libmei/tools/cpp.py b/libmei/tools/cpp.py index da0fe8a95c0..aa4ff7b1fca 100644 --- a/libmei/tools/cpp.py +++ b/libmei/tools/cpp.py @@ -225,7 +225,7 @@ class {elementNameUpper} : public Element{attClasses} {{ public: bool Read(pugi::xml_node element, bool removeAttr = false); - bool Write(pugi::xml_node element); + bool Write(pugi::xml_node element, const std::string &xmlId = ""); void Reset(); }}; """ @@ -238,12 +238,15 @@ class {elementNameUpper} : public Element{attClasses} {{ bool {elementNameUpper}::Read({readParam}) {{ + if (element.attribute("xml:id")) m_xmlId = element.attribute("xml:id").value(); bool hasAttribute = false;{elementRead} return hasAttribute; }} bool {elementNameUpper}::Write({writeParam}) {{ + element.set_name("{elementNameLower}"); + if (xmlId.size() > 0) element.append_attribute("xml:id") = xmlId.c_str(); bool hasAttribute = false;{elementWrite} return hasAttribute; }} @@ -288,6 +291,8 @@ class {elementNameUpper} : public Element{attClasses} {{ #ifndef __LIBMEI_ATT_TYPES_H__ #define __LIBMEI_ATT_TYPES_H__ +#include + //---------------------------------------------------------------------------- namespace {ns} {{ @@ -921,7 +926,7 @@ def create_att_datatypes(cpp_ns: str, schema, outdir: Path): val_prefix = vrv_getformattedvallist(list_type.rsplit('@')[0], list_type.rsplit('@')[1]) type_start_fmt = { - "meitype": list_type, + "meitype": list_type.replace("@", "\@"), "vrvtype": val_prefix, "enumtype": " : int8_t" if len(values) < 64 else "", "val_prefix": val_prefix @@ -1001,7 +1006,7 @@ def create_element_classes(cpp_ns: str, schema, outdir: Path): lg.debug("Skipping attributes within class") continue - element_att_classes.append(f", public Att{schema.cc(schema.strpatt(attribute))} ") + element_att_classes.append(f", public Att{schema.cc(schema.strpatt(attribute))}") # figure out includes if attribute in schema.inverse_attribute_group_structure: @@ -1064,11 +1069,10 @@ def create_element_classes(cpp_ns: str, schema, outdir: Path): element_write.append(f"\n hasAttribute = (Write{att_str}(element) || hasAttribute);") element_reset.append(f"\n Reset{att_str}();") - read_param = "pugi::xml_node, bool" - write_param = "pugi::xml_node" + read_param = "pugi::xml_node element, bool" if element_read: read_param = "pugi::xml_node element, bool removeAttr" - write_param = "pugi::xml_node element" + write_param = "pugi::xml_node element, const std::string &xmlId" consvars = { 'elementNameUpper': schema.cc(element), diff --git a/setup.py b/setup.py index 8366bbc0ef5..fc1f38b2709 100644 --- a/setup.py +++ b/setup.py @@ -33,7 +33,7 @@ def get_commit(): """Call tools/get_git_commit.sh on any platform.""" if os.path.exists('./tools'): print('running tools/get_git_commit.sh') - os.system('bash -c "cd tools; ./get_git_commit.sh"') + os.system('sh -c "cd tools; ./get_git_commit.sh"') else: print('tools directory is missing') diff --git a/src/accid.cpp b/src/accid.cpp index 99755deafd5..4f3ba9b2dea 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" @@ -37,7 +36,8 @@ Accid::Accid() , AttAccidLog() , AttColor() , AttEnclosingChars() - , AttExtSym() + , AttExtSymAuth() + , AttExtSymNames() , AttPlacementOnStaff() , AttPlacementRelEvent() { @@ -48,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); @@ -66,7 +67,8 @@ void Accid::Reset() this->ResetAccidLog(); this->ResetColor(); this->ResetEnclosingChars(); - this->ResetExtSym(); + this->ResetExtSymAuth(); + this->ResetExtSymNames(); this->ResetPlacementOnStaff(); this->ResetPlacementRelEvent(); @@ -89,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); } } @@ -281,7 +290,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); } @@ -291,7 +300,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/adjustaccidxfunctor.cpp b/src/adjustaccidxfunctor.cpp index 5b06f322976..7bc8b01512d 100644 --- a/src/adjustaccidxfunctor.cpp +++ b/src/adjustaccidxfunctor.cpp @@ -10,6 +10,7 @@ //---------------------------------------------------------------------------- #include "doc.h" +#include "score.h" //---------------------------------------------------------------------------- @@ -35,26 +36,30 @@ FunctorCode AdjustAccidXFunctor::VisitAlignment(Alignment *alignment) FunctorCode AdjustAccidXFunctor::VisitAlignmentReference(AlignmentReference *alignmentReference) { - std::vector &accidSpace = alignmentReference->m_accidSpace; - if (accidSpace.empty()) return FUNCTOR_SIBLINGS; + m_adjustedAccids.clear(); + + std::vector accids = this->GetAccidentalsForAdjustment(alignmentReference); + if (accids.empty()) return FUNCTOR_SIBLINGS; assert(m_doc); - StaffDef *staffDef = m_doc->GetCurrentScoreDef()->GetStaffDef(alignmentReference->GetN()); + ScoreDef *scoreDef = m_doc->GetCorrespondingScore(alignmentReference)->GetScoreDef(); + StaffDef *staffDef = scoreDef->GetStaffDef(alignmentReference->GetN()); int staffSize = (staffDef && staffDef->HasScale()) ? staffDef->GetScale() : 100; - std::sort(accidSpace.begin(), accidSpace.end(), AccidSpaceSort()); + std::sort(accids.begin(), accids.end(), AccidSpaceSort()); // process accid layer alignment - alignmentReference->SetAccidLayerAlignment(); + for (Accid *accid : accids) { + this->SetAccidLayerAlignment(accid, alignmentReference); + } // Detect accids which are an octave apart => they will be grouped together in the multiset std::multiset octaveEquivalence; - std::copy(accidSpace.begin(), accidSpace.end(), std::inserter(octaveEquivalence, octaveEquivalence.begin())); + std::copy(accids.begin(), accids.end(), std::inserter(octaveEquivalence, octaveEquivalence.begin())); - std::set adjustedAccids; // Align the octaves - for (Accid *accid : accidSpace) { + for (Accid *accid : accids) { // Skip any accid that was already adjusted - if (adjustedAccids.count(accid) > 0) continue; + if (m_adjustedAccids.count(accid) > 0) continue; auto range = octaveEquivalence.equal_range(accid); // Handle at least two octave accids without unisons int octaveAccidCount = 0; @@ -68,7 +73,7 @@ FunctorCode AdjustAccidXFunctor::VisitAlignmentReference(AlignmentReference *ali // Now adjust the octave accids and store the left most position int minDrawingX = -VRV_UNSET; for (auto octaveIter = range.first; octaveIter != range.second; ++octaveIter) { - alignmentReference->AdjustAccidWithAccidSpace(*octaveIter, m_doc, staffSize, adjustedAccids); + this->AdjustAccidWithSpace(*octaveIter, alignmentReference, staffSize); minDrawingX = std::min(minDrawingX, (*octaveIter)->GetDrawingX()); } // Finally, align the accidentals whenever the adjustment is not too large @@ -84,26 +89,26 @@ FunctorCode AdjustAccidXFunctor::VisitAlignmentReference(AlignmentReference *ali } // Align accidentals for unison notes if any of them are present - for (Accid *accid : accidSpace) { + for (Accid *accid : accids) { if (accid->GetDrawingUnisonAccid() == NULL) continue; accid->SetDrawingXRel(accid->GetDrawingUnisonAccid()->GetDrawingXRel()); } - const int count = (int)accidSpace.size(); + const int count = (int)accids.size(); const int middle = (count / 2) + (count % 2); // Zig-zag processing for (int i = 0, j = count - 1; i < middle; ++i, --j) { // top one - but skip if already adjusted (i.e. octaves) - if (adjustedAccids.count(accidSpace.at(i)) == 0) { - alignmentReference->AdjustAccidWithAccidSpace(accidSpace.at(i), m_doc, staffSize, adjustedAccids); + if (m_adjustedAccids.count(accids.at(i)) == 0) { + this->AdjustAccidWithSpace(accids.at(i), alignmentReference, staffSize); } // Break with odd number of elements once the middle is reached if (i == j) break; // bottom one - but skip if already adjusted - if (adjustedAccids.count(accidSpace.at(j)) == 0) { - alignmentReference->AdjustAccidWithAccidSpace(accidSpace.at(j), m_doc, staffSize, adjustedAccids); + if (m_adjustedAccids.count(accids.at(j)) == 0) { + this->AdjustAccidWithSpace(accids.at(j), alignmentReference, staffSize); } } @@ -119,4 +124,62 @@ FunctorCode AdjustAccidXFunctor::VisitMeasure(Measure *measure) return FUNCTOR_CONTINUE; } +std::vector AdjustAccidXFunctor::GetAccidentalsForAdjustment(AlignmentReference *alignmentReference) const +{ + std::vector accidentals; + for (Object *child : alignmentReference->GetChildren()) { + if (child->Is(ACCID)) { + Accid *accid = vrv_cast(child); + if (accid->HasAccid()) accidentals.push_back(accid); + } + } + return accidentals; +} + +void AdjustAccidXFunctor::SetAccidLayerAlignment(Accid *accid, const AlignmentReference *alignmentReference) const +{ + if (accid->IsAlignedWithSameLayer()) return; + + const ArrayOfConstObjects &children = alignmentReference->GetChildren(); + Note *parentNote = vrv_cast(accid->GetFirstAncestor(NOTE)); + const bool hasUnisonOverlap = std::any_of(children.begin(), children.end(), [parentNote](const Object *object) { + if (!object->Is(NOTE)) return false; + const Note *otherNote = vrv_cast(object); + // in case notes are in unison but have different accidentals + return parentNote && parentNote->IsUnisonWith(otherNote, true) && !parentNote->IsUnisonWith(otherNote, false); + }); + + if (!hasUnisonOverlap) return; + + Chord *chord = parentNote->IsChordTone(); + // no chord, so align only parent note + if (!chord) { + accid->IsAlignedWithSameLayer(true); + return; + } + // we have chord ancestor, so need to align all of its accidentals + ListOfObjects accidentals = chord->FindAllDescendantsByType(ACCID); + std::for_each(accidentals.begin(), accidentals.end(), [](Object *object) { + Accid *accid = vrv_cast(object); + accid->IsAlignedWithSameLayer(true); + }); +} + +void AdjustAccidXFunctor::AdjustAccidWithSpace(Accid *accid, AlignmentReference *alignmentReference, int staffSize) +{ + std::vector leftAccids; + const ArrayOfObjects &children = alignmentReference->GetChildren(); + + // bottom one + for (Object *child : children) { + // if accidental has unison overlap, ignore elements on other layers for overlap + if (accid->IsAlignedWithSameLayer() && (accid->GetFirstAncestor(LAYER) != child->GetFirstAncestor(LAYER))) + continue; + accid->AdjustX(dynamic_cast(child), m_doc, staffSize, leftAccids, m_adjustedAccids); + } + + // Mark as adjusted (even if position was not altered) + m_adjustedAccids.insert(accid); +} + } // namespace vrv diff --git a/src/adjustarpegfunctor.cpp b/src/adjustarpegfunctor.cpp index ea6e0592788..6051efd924b 100644 --- a/src/adjustarpegfunctor.cpp +++ b/src/adjustarpegfunctor.cpp @@ -173,10 +173,9 @@ 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); + const bool previousDirection = this->SetDirection(BACKWARD); m_measureAligner->Process(*this); - this->SetDirection(direction); + this->SetDirection(previousDirection); m_alignmentArpegTuples.clear(); } diff --git a/src/adjustbeamsfunctor.cpp b/src/adjustbeamsfunctor.cpp index f0f130b9552..c887831d837 100644 --- a/src/adjustbeamsfunctor.cpp +++ b/src/adjustbeamsfunctor.cpp @@ -298,21 +298,12 @@ FunctorCode AdjustBeamsFunctor::VisitRest(Rest *rest) if (!m_outerBeam) return FUNCTOR_SIBLINGS; // Calculate possible overlap for the rest with beams - int leftMargin = 0, rightMargin = 0; const int beams = m_outerBeam->GetBeamPartDuration(rest, false) - DUR_4; const int beamWidth = m_outerBeam->m_beamWidth; - if (m_directionBias > 0) { - leftMargin = m_y1 - beams * beamWidth - rest->GetSelfTop(); - rightMargin = m_y2 - beams * beamWidth - rest->GetSelfTop(); - } - else { - leftMargin = rest->GetSelfBottom() - m_y1 - beams * beamWidth; - rightMargin = rest->GetSelfBottom() - m_y2 - beams * beamWidth; - } + const int overlapMargin = rest->Intersects(m_outerBeam, SELF, beams * beamWidth, true) * m_directionBias; // Adjust drawing location for the rest based on the overlap with beams. // Adjustment should be an even number, so that the rest is positioned properly - const int overlapMargin = std::min(leftMargin, rightMargin); if (overlapMargin >= 0) return FUNCTOR_CONTINUE; Staff *staff = rest->GetAncestorStaff(); @@ -344,11 +335,9 @@ FunctorCode AdjustBeamsFunctor::VisitRest(Rest *rest) } const int unit = m_doc->GetDrawingUnit(staff->m_drawingStaffSize); - const int unitChangeNumber = ((std::abs(overlapMargin) + unit / 6) / unit); - if (unitChangeNumber > 0) { - const int adjust = unitChangeNumber * unit * m_directionBias; - if (std::abs(adjust) > std::abs(m_overlapMargin)) m_overlapMargin = adjust; - } + const int unitChangeNumber = std::abs(overlapMargin) / unit + 1; + const int adjust = unitChangeNumber * unit * m_directionBias; + if (std::abs(adjust) > std::abs(m_overlapMargin)) m_overlapMargin = adjust; return FUNCTOR_CONTINUE; } diff --git a/src/adjustdotsfunctor.cpp b/src/adjustdotsfunctor.cpp index 79c27af0a2c..1f930da9a88 100644 --- a/src/adjustdotsfunctor.cpp +++ b/src/adjustdotsfunctor.cpp @@ -11,6 +11,7 @@ #include "doc.h" #include "elementpart.h" +#include "score.h" #include "staff.h" //---------------------------------------------------------------------------- @@ -100,9 +101,8 @@ FunctorCode AdjustDotsFunctor::VisitMeasure(Measure *measure) { if (!measure->HasAlignmentRefWithMultipleLayers()) return FUNCTOR_SIBLINGS; - Filters *previousFilters = this->GetFilters(); Filters filters; - this->SetFilters(&filters); + Filters *previousFilters = this->SetFilters(&filters); std::vector::iterator iter; for (iter = m_staffNs.begin(); iter != m_staffNs.end(); ++iter) { @@ -126,7 +126,7 @@ FunctorCode AdjustDotsFunctor::VisitMeasure(Measure *measure) FunctorCode AdjustDotsFunctor::VisitScore(Score *score) { - m_staffNs = m_doc->GetCurrentScoreDef()->GetStaffNs(); + m_staffNs = score->GetScoreDef()->GetStaffNs(); return FUNCTOR_CONTINUE; } diff --git a/src/adjustfloatingpositionerfunctor.cpp b/src/adjustfloatingpositionerfunctor.cpp index daf85178968..205b7eb4466 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/adjustgracexposfunctor.cpp b/src/adjustgracexposfunctor.cpp index 7c9201d51f1..85e4876cbb5 100644 --- a/src/adjustgracexposfunctor.cpp +++ b/src/adjustgracexposfunctor.cpp @@ -10,6 +10,7 @@ //---------------------------------------------------------------------------- #include "doc.h" +#include "score.h" //---------------------------------------------------------------------------- @@ -48,11 +49,9 @@ FunctorCode AdjustGraceXPosFunctor::VisitAlignment(Alignment *alignment) MeasureAligner *measureAligner = vrv_cast(alignment->GetFirstAncestor(MEASURE_ALIGNER)); assert(measureAligner); - bool previousDirection = this->GetDirection(); - Filters *previousFilters = this->GetFilters(); - this->SetDirection(BACKWARD); + const bool previousDirection = this->SetDirection(BACKWARD); Filters filters; - this->SetFilters(&filters); + Filters *previousFilters = this->SetFilters(&filters); std::vector::iterator iter; for (iter = m_staffNs.begin(); iter != m_staffNs.end(); ++iter) { @@ -143,10 +142,8 @@ 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(); - Filters *previousFilters = this->GetFilters(); - this->SetDirection(FORWARD); - this->SetFilters(NULL); + const bool previousDirection = this->SetDirection(FORWARD); + Filters *previousFilters = this->SetFilters(NULL); for (auto child : alignmentReference->GetChildren()) { child->Process(*this); @@ -209,8 +206,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); + const bool previousDirection = this->SetDirection(BACKWARD); measure->m_measureAligner.Process(*this); // We need to process the staves in the reverse order @@ -235,7 +231,7 @@ FunctorCode AdjustGraceXPosFunctor::VisitMeasure(Measure *measure) FunctorCode AdjustGraceXPosFunctor::VisitScore(Score *score) { - m_staffNs = m_doc->GetCurrentScoreDef()->GetStaffNs(); + m_staffNs = score->GetScoreDef()->GetStaffNs(); return FUNCTOR_CONTINUE; } diff --git a/src/adjustharmgrpsspacingfunctor.cpp b/src/adjustharmgrpsspacingfunctor.cpp index 2ba6ed7f270..df74ceaaf0b 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)); diff --git a/src/adjustlayersfunctor.cpp b/src/adjustlayersfunctor.cpp index 80752d70494..058120c970c 100644 --- a/src/adjustlayersfunctor.cpp +++ b/src/adjustlayersfunctor.cpp @@ -10,6 +10,7 @@ //---------------------------------------------------------------------------- #include "doc.h" +#include "score.h" #include "staff.h" //---------------------------------------------------------------------------- @@ -123,9 +124,8 @@ FunctorCode AdjustLayersFunctor::VisitMeasure(Measure *measure) { if (!measure->HasAlignmentRefWithMultipleLayers()) return FUNCTOR_SIBLINGS; - Filters *previousFilters = this->GetFilters(); Filters filters; - this->SetFilters(&filters); + Filters *previousFilters = this->SetFilters(&filters); std::vector::iterator iter; for (iter = m_staffNs.begin(); iter != m_staffNs.end(); ++iter) { @@ -149,7 +149,7 @@ FunctorCode AdjustLayersFunctor::VisitMeasure(Measure *measure) FunctorCode AdjustLayersFunctor::VisitScore(Score *score) { - m_staffNs = m_doc->GetCurrentScoreDef()->GetStaffNs(); + m_staffNs = score->GetScoreDef()->GetStaffNs(); return FUNCTOR_CONTINUE; } diff --git a/src/adjustslursfunctor.cpp b/src/adjustslursfunctor.cpp index 2eac8fdb01e..34d5bb61c6b 100644 --- a/src/adjustslursfunctor.cpp +++ b/src/adjustslursfunctor.cpp @@ -27,6 +27,13 @@ namespace vrv { AdjustSlursFunctor::AdjustSlursFunctor(Doc *doc) : DocFunctor(doc) { m_crossStaffSlurs = false; + this->ResetCurrent(); +} + +void AdjustSlursFunctor::ResetCurrent() +{ + m_currentCurve = NULL; + m_currentSlur = NULL; } FunctorCode AdjustSlursFunctor::VisitStaffAlignment(StaffAlignment *staffAlignment) @@ -42,22 +49,26 @@ FunctorCode AdjustSlursFunctor::VisitStaffAlignment(StaffAlignment *staffAlignme if (!positioner->GetObject()->Is({ PHRASE, SLUR })) continue; Slur *slur = vrv_cast(positioner->GetObject()); assert(slur); + m_currentSlur = slur; assert(positioner->Is(FLOATING_CURVE_POSITIONER)); FloatingCurvePositioner *curve = vrv_cast(positioner); assert(curve); + m_currentCurve = curve; // Skip if no content bounding box is available if (!curve->HasContentBB()) continue; positioners.push_back(curve); - slur->AdjustSlur(m_doc, curve, unit); + this->AdjustSlur(unit); if (curve->IsCrossStaff()) { m_crossStaffSlurs = true; } } + this->ResetCurrent(); + // Detection of inner slurs std::map innerCurveMap; for (int i = 0; i < (int)positioners.size(); ++i) { @@ -104,9 +115,14 @@ FunctorCode AdjustSlursFunctor::VisitStaffAlignment(StaffAlignment *staffAlignme for (const auto &mapEntry : innerCurveMap) { Slur *slur = vrv_cast(mapEntry.first->GetObject()); assert(slur); - slur->AdjustOuterSlur(m_doc, mapEntry.first, mapEntry.second, unit); + m_currentCurve = mapEntry.first; + m_currentSlur = slur; + + this->AdjustOuterSlur(mapEntry.second, unit); } + this->ResetCurrent(); + return FUNCTOR_SIBLINGS; } @@ -117,4 +133,834 @@ FunctorCode AdjustSlursFunctor::VisitSystem(System *system) return FUNCTOR_SIBLINGS; } +void AdjustSlursFunctor::AdjustSlur(int unit) const +{ + assert(m_currentCurve); + assert(m_currentSlur); + + Point points[4]; + m_currentCurve->GetPoints(points); + BezierCurve bezier(points[0], points[1], points[2], points[3]); + m_currentSlur->InitBezierControlSides(bezier, m_currentCurve->GetDir()); + bezier.UpdateControlPointParams(); + + const int margin = m_doc->GetOptions()->m_slurMargin.GetValue() * unit; + const double flexibility = m_doc->GetOptions()->m_slurEndpointFlexibility.GetValue(); + const double symmetry = m_doc->GetOptions()->m_slurSymmetry.GetValue(); + + // STEP 1: Filter spanned elements and discard certain bounding boxes even though they collide + this->FilterSpannedElements(bezier, margin); + + // STEP 2: Detect collisions near the endpoints and switch to secondary endpoints if necessary + NearEndCollision nearEndCollision = this->DetectCollisionsNearEnd(bezier, margin); + m_currentSlur->CalcInitialCurve(m_doc, m_currentCurve, &nearEndCollision); + if (nearEndCollision.endPointsAdjusted) { + m_currentCurve->GetPoints(points); + bezier.p1 = points[0]; + bezier.c1 = points[1]; + bezier.c2 = points[2]; + bezier.p2 = points[3]; + bezier.UpdateControlPointParams(); + m_currentSlur->CalcSpannedElements(m_currentCurve); + this->FilterSpannedElements(bezier, margin); + } + else { + m_currentCurve->UpdatePoints(bezier); + } + + // STEP 3: Calculate the vertical adjustment of endpoints. This shifts the slur vertically. + // Only collisions near the endpoints are taken into account. + int endPointShiftLeft = 0; + int endPointShiftRight = 0; + std::tie(endPointShiftLeft, endPointShiftRight) = this->CalcEndPointShift(bezier, flexibility, margin); + this->ApplyEndPointShift(bezier, endPointShiftLeft, endPointShiftRight); + + // Special handling if bulge is prescribed from here on + if (m_currentSlur->HasBulge()) { + this->AdjustSlurFromBulge(bezier, unit); + return; + } + + // STEP 4: Calculate the horizontal offset of the control points. + // The idea is to shift control points to the outside if there is an obstacle in the vicinity of the corresponding + // endpoint. For C1 we consider the largest angle <)BP1P2 where B is a colliding left bounding box corner and choose + // C1 in this direction. Similar for C2. + if (this->AllowControlOffsetAdjustment(bezier, symmetry, unit)) { + bool ok = false; + int controlPointOffsetLeft = 0; + int controlPointOffsetRight = 0; + std::tie(ok, controlPointOffsetLeft, controlPointOffsetRight) = this->CalcControlPointOffset(bezier, margin); + if (ok) { + bezier.SetLeftControlOffset(controlPointOffsetLeft); + bezier.SetRightControlOffset(controlPointOffsetRight); + bezier.UpdateControlPoints(); + m_currentCurve->UpdatePoints(bezier); + } + } + + // STEP 5: Calculate the vertical shift of the control points. + // For each colliding bounding box we formulate a constraint ax + by >= c + // where x, y denote the vertical adjustments of the control points and c is the size of the collision. + // The coefficients a, b are calculated from the Bezier curve equation. + // After collecting all constraints we calculate a solution. + const ControlPointAdjustment adjustment = this->CalcControlPointVerticalShift(bezier, symmetry, margin); + const int leftSign = (bezier.IsLeftControlAbove() == adjustment.moveUpwards) ? 1 : -1; + bezier.SetLeftControlHeight(bezier.GetLeftControlHeight() + leftSign * adjustment.leftShift); + const int rightSign = (bezier.IsRightControlAbove() == adjustment.moveUpwards) ? 1 : -1; + bezier.SetRightControlHeight(bezier.GetRightControlHeight() + rightSign * adjustment.rightShift); + bezier.UpdateControlPoints(); + m_currentCurve->UpdatePoints(bezier); + m_currentCurve->SetRequestedStaffSpace(adjustment.requestedStaffSpace); + + // STEP 6: Adjust the slur shape + // Through the control point adjustments in step 4 and 5 it can happen that the slur looses its desired shape. + // We correct the shape if the slur is too flat or not convex. + if (m_currentCurve->GetDir() != curvature_CURVEDIR_mixed) { + this->AdjustSlurShape(bezier, m_currentCurve->GetDir(), unit); + m_currentCurve->UpdatePoints(bezier); + } + + // Since we are going to redraw it, reset its bounding box + m_currentCurve->ResetBoundingBox(); +} + +void AdjustSlursFunctor::AdjustOuterSlur(const ArrayOfFloatingCurvePositioners &innerCurves, int unit) const +{ + assert(m_currentCurve); + assert(m_currentSlur); + + Point points[4]; + m_currentCurve->GetPoints(points); + BezierCurve bezier(points[0], points[1], points[2], points[3]); + m_currentSlur->InitBezierControlSides(bezier, m_currentCurve->GetDir()); + bezier.UpdateControlPointParams(); + + const int margin = m_doc->GetOptions()->m_slurMargin.GetValue() * unit; + const double flexibility = m_doc->GetOptions()->m_slurEndpointFlexibility.GetValue(); + const double symmetry = m_doc->GetOptions()->m_slurSymmetry.GetValue(); + + // STEP 1: Calculate the vertical adjustment of endpoints. This shifts the slur vertically. + // Only collisions near the endpoints are taken into account. + int endPointShiftLeft = 0; + int endPointShiftRight = 0; + std::tie(endPointShiftLeft, endPointShiftRight) = this->CalcEndPointShift(bezier, innerCurves, flexibility, margin); + this->ApplyEndPointShift(bezier, endPointShiftLeft, endPointShiftRight); + + // STEP 2: Calculate the vertical shift of the control points. + // For each inner slur we formulate some constraints ax + by >= c + // where x, y denote the vertical adjustments of the control points and c is the size of the collision. + // The coefficients a, b are calculated from the Bezier curve equation. + // After collecting all constraints we calculate a solution. + const ControlPointAdjustment adjustment = this->CalcControlPointShift(bezier, innerCurves, symmetry, margin); + bezier.SetLeftControlHeight(bezier.GetLeftControlHeight() + adjustment.leftShift); + bezier.SetRightControlHeight(bezier.GetRightControlHeight() + adjustment.rightShift); + bezier.UpdateControlPoints(); + m_currentCurve->UpdatePoints(bezier); + + // STEP 3: Adjust the slur shape + // We correct the shape if the slur is too flat or not convex. + if (m_currentCurve->GetDir() != curvature_CURVEDIR_mixed) { + this->AdjustSlurShape(bezier, m_currentCurve->GetDir(), unit); + m_currentCurve->UpdatePoints(bezier); + } + + // Since we are going to redraw it, reset its bounding box + m_currentCurve->ResetBoundingBox(); +} + +void AdjustSlursFunctor::FilterSpannedElements(const BezierCurve &bezierCurve, int margin) const +{ + if (bezierCurve.p1.x >= bezierCurve.p2.x) return; + + const int dist = bezierCurve.p2.x - bezierCurve.p1.x; + + const ArrayOfCurveSpannedElements *spannedElements = m_currentCurve->GetSpannedElements(); + + for (CurveSpannedElement *spannedElement : *spannedElements) { + + if (spannedElement->m_discarded) { + continue; + } + + bool discard = false; + const int intersection = m_currentCurve->CalcDirectionalAdjustment( + spannedElement->m_boundingBox, spannedElement->m_isBelow, discard, margin); + const int xMiddle + = (spannedElement->m_boundingBox->GetSelfLeft() + spannedElement->m_boundingBox->GetSelfRight()) / 2.0; + const float distanceRatio = float(xMiddle - bezierCurve.p1.x) / float(dist); + + // Check if obstacles completely lie on the other side of the slur + const int elementHeight + = std::abs(spannedElement->m_boundingBox->GetSelfTop() - spannedElement->m_boundingBox->GetSelfBottom()); + if (intersection > elementHeight + 4 * margin) { + // Ignore elements in a different layer near the endpoints + const LayerElement *layerElement = dynamic_cast(spannedElement->m_boundingBox); + if (distanceRatio < 0.05) { + spannedElement->m_discarded = layerElement + ? (layerElement->GetOriginalLayerN() != m_currentSlur->GetStart()->GetOriginalLayerN()) + : true; + } + else if (distanceRatio > 0.95) { + spannedElement->m_discarded = layerElement + ? (layerElement->GetOriginalLayerN() != m_currentSlur->GetEnd()->GetOriginalLayerN()) + : true; + } + // Ignore tuplet numbers + if (layerElement && layerElement->Is(TUPLET_NUM)) { + spannedElement->m_discarded = true; + } + } + } +} + +NearEndCollision AdjustSlursFunctor::DetectCollisionsNearEnd(const BezierCurve &bezierCurve, int margin) const +{ + NearEndCollision nearEndCollision({ 0.0, 0.0, false }); + if (bezierCurve.p1.x >= bezierCurve.p2.x) return nearEndCollision; + + const ArrayOfCurveSpannedElements *spannedElements = m_currentCurve->GetSpannedElements(); + for (CurveSpannedElement *spannedElement : *spannedElements) { + if (spannedElement->m_discarded) { + continue; + } + + bool discard = false; + int intersectionLeft, intersectionRight; + std::tie(intersectionLeft, intersectionRight) = m_currentCurve->CalcDirectionalLeftRightAdjustment( + spannedElement->m_boundingBox, spannedElement->m_isBelow, discard, margin); + + if ((intersectionLeft > 0) || (intersectionRight > 0)) { + Point points[4]; + points[0] = bezierCurve.p1; + points[1] = bezierCurve.c1; + points[2] = bezierCurve.c2; + points[3] = bezierCurve.p2; + + // Adjust the collision metrics + const int xLeft = std::max(bezierCurve.p1.x, spannedElement->m_boundingBox->GetSelfLeft()); + Point pLeft(xLeft, BoundingBox::CalcBezierAtPosition(points, xLeft)); + double distStart = std::max(BoundingBox::CalcDistance(bezierCurve.p1, pLeft), 1.0); + double distEnd = std::max(BoundingBox::CalcDistance(bezierCurve.p2, pLeft), 1.0); + nearEndCollision.metricAtStart = std::max(intersectionLeft / distStart, nearEndCollision.metricAtStart); + nearEndCollision.metricAtEnd = std::max(intersectionLeft / distEnd, nearEndCollision.metricAtEnd); + + const int xRight = std::min(bezierCurve.p2.x, spannedElement->m_boundingBox->GetSelfRight()); + Point pRight(xRight, BoundingBox::CalcBezierAtPosition(points, xRight)); + distStart = std::max(BoundingBox::CalcDistance(bezierCurve.p1, pRight), 1.0); + distEnd = std::max(BoundingBox::CalcDistance(bezierCurve.p2, pRight), 1.0); + nearEndCollision.metricAtStart = std::max(intersectionRight / distStart, nearEndCollision.metricAtStart); + nearEndCollision.metricAtEnd = std::max(intersectionRight / distEnd, nearEndCollision.metricAtEnd); + } + } + + return nearEndCollision; +} + +std::pair AdjustSlursFunctor::CalcEndPointShift( + const BezierCurve &bezierCurve, double flexibility, int margin) const +{ + if (bezierCurve.p1.x >= bezierCurve.p2.x) return { 0, 0 }; + + int shiftLeft = 0; + int shiftRight = 0; + + const int dist = bezierCurve.p2.x - bezierCurve.p1.x; + + const ArrayOfCurveSpannedElements *spannedElements = m_currentCurve->GetSpannedElements(); + for (CurveSpannedElement *spannedElement : *spannedElements) { + + if (spannedElement->m_discarded) { + continue; + } + + bool discard = false; + int intersectionLeft, intersectionRight; + std::tie(intersectionLeft, intersectionRight) = m_currentCurve->CalcDirectionalLeftRightAdjustment( + spannedElement->m_boundingBox, spannedElement->m_isBelow, discard, margin); + + if (discard) { + spannedElement->m_discarded = true; + continue; + } + + if ((intersectionLeft > 0) || (intersectionRight > 0)) { + // Now apply the intersections on the left and right hand side of the bounding box + const int xLeft = std::max(bezierCurve.p1.x, spannedElement->m_boundingBox->GetSelfLeft()); + const float distanceRatioLeft = float(xLeft - bezierCurve.p1.x) / float(dist); + this->ShiftEndPoints(shiftLeft, shiftRight, distanceRatioLeft, intersectionLeft, flexibility, + spannedElement->m_isBelow, m_currentCurve->m_spanningType); + + const int xRight = std::min(bezierCurve.p2.x, spannedElement->m_boundingBox->GetSelfRight()); + const float distanceRatioRight = float(xRight - bezierCurve.p1.x) / float(dist); + this->ShiftEndPoints(shiftLeft, shiftRight, distanceRatioRight, intersectionRight, flexibility, + spannedElement->m_isBelow, m_currentCurve->m_spanningType); + } + } + + return { shiftLeft, shiftRight }; +} + +void AdjustSlursFunctor::ApplyEndPointShift( + BezierCurve &bezierCurve, int endPointShiftLeft, int endPointShiftRight) const +{ + if ((endPointShiftLeft != 0) || (endPointShiftRight != 0)) { + const int signLeft = bezierCurve.IsLeftControlAbove() ? 1 : -1; + const int signRight = bezierCurve.IsRightControlAbove() ? 1 : -1; + bezierCurve.p1.y += signLeft * endPointShiftLeft; + bezierCurve.p2.y += signRight * endPointShiftRight; + if (bezierCurve.p1.x != bezierCurve.p2.x) { + double lambda1, lambda2; + std::tie(lambda1, lambda2) = bezierCurve.EstimateCurveParamForControlPoints(); + bezierCurve.c1.y + += signLeft * (1.0 - lambda1) * endPointShiftLeft + signRight * lambda1 * endPointShiftRight; + bezierCurve.c2.y + += signLeft * (1.0 - lambda2) * endPointShiftLeft + signRight * lambda2 * endPointShiftRight; + } + bezierCurve.UpdateControlPointParams(); + m_currentCurve->UpdatePoints(bezierCurve); + } +} + +void AdjustSlursFunctor::AdjustSlurFromBulge(BezierCurve &bezierCurve, int unit) const +{ + if (bezierCurve.p1.x >= bezierCurve.p2.x) return; + + data_BULGE bulge = m_currentSlur->GetBulge(); + + // Filter admissible values + bulge.erase(std::remove_if(bulge.begin(), bulge.end(), + [](const data_BULGE::value_type &entry) { + return ((entry.first <= 0.0) || (entry.second <= 0.0) || (entry.second >= 100.0)); + }), + bulge.end()); + + // Get the minimal and maximal lambda + double lambdaMin = 0.66; + double lambdaMax = 0.33; + for (const data_BULGE::value_type &bulgeEntry : bulge) { + const double lambda = bulgeEntry.second / 100.0; + lambdaMin = std::min(lambda, lambdaMin); + lambdaMax = std::max(lambda, lambdaMax); + } + + // Horizontal control point adjustment + lambdaMin /= 2.0; + lambdaMax = 1.0 - (1.0 - lambdaMax) / 2.0; + const double xMin = (1.0 - lambdaMin) * bezierCurve.p1.x + lambdaMin * bezierCurve.p2.x; + const double xMax = (1.0 - lambdaMax) * bezierCurve.p1.x + lambdaMax * bezierCurve.p2.x; + bezierCurve.SetLeftControlOffset(xMin - bezierCurve.p1.x); + bezierCurve.SetRightControlOffset(bezierCurve.p2.x - xMax); + bezierCurve.UpdateControlPoints(); + m_currentCurve->UpdatePoints(bezierCurve); + + // Generate a control point constraint for each bulge entry + std::list constraints; + Point points[4]; + points[0] = bezierCurve.p1; + points[1] = bezierCurve.c1; + points[2] = bezierCurve.c2; + points[3] = bezierCurve.p2; + + for (const data_BULGE::value_type &bulgeEntry : bulge) { + const double lambda = bulgeEntry.second / 100.0; + const double x = (1.0 - lambda) * bezierCurve.p1.x + lambda * bezierCurve.p2.x; + const double t = BoundingBox::CalcBezierParamAtPosition(points, x); + constraints.push_back({ 3.0 * pow(1.0 - t, 2.0) * t, 3.0 * (1.0 - t) * pow(t, 2.0), bulgeEntry.first * unit }); + } + + // Solve these constraints and calculate the vertical control point adjustment + int leftShift = 0; + int rightShift = 0; + std::tie(leftShift, rightShift) = this->SolveControlPointConstraints(constraints); + bezierCurve.SetLeftControlHeight(bezierCurve.GetLeftControlHeight() + leftShift); + bezierCurve.SetRightControlHeight(bezierCurve.GetRightControlHeight() + rightShift); + bezierCurve.UpdateControlPoints(); + m_currentCurve->UpdatePoints(bezierCurve); + + // Prevent awkward slur shapes + this->AdjustSlurShape(bezierCurve, m_currentCurve->GetDir(), unit); + m_currentCurve->UpdatePoints(bezierCurve); + + // Since we are going to redraw it, reset its bounding box + m_currentCurve->ResetBoundingBox(); +} + +bool AdjustSlursFunctor::AllowControlOffsetAdjustment(const BezierCurve &bezierCurve, double symmetry, int unit) const +{ + const double distance = BoundingBox::CalcDistance(bezierCurve.p1, bezierCurve.p2); + + return (distance > symmetry * 40 * unit); +} + +std::tuple AdjustSlursFunctor::CalcControlPointOffset(const BezierCurve &bezierCurve, int margin) const +{ + if (bezierCurve.p1.x >= bezierCurve.p2.x) return { false, 0, 0 }; + + // Initially we start with the slopes of the lines P1-C1 and P2-C2 + double leftSlopeMax = std::abs(BoundingBox::CalcSlope(bezierCurve.p1, bezierCurve.c1)); + double rightSlopeMax = std::abs(BoundingBox::CalcSlope(bezierCurve.p2, bezierCurve.c2)); + const ArrayOfCurveSpannedElements *spannedElements = m_currentCurve->GetSpannedElements(); + for (CurveSpannedElement *spannedElement : *spannedElements) { + + if (spannedElement->m_discarded) { + continue; + } + + const int bbY = spannedElement->m_isBelow ? spannedElement->m_boundingBox->GetSelfTop() + : spannedElement->m_boundingBox->GetSelfBottom(); + const Point pLeft = { spannedElement->m_boundingBox->GetSelfLeft(), bbY }; + const Point pRight = { spannedElement->m_boundingBox->GetSelfRight(), bbY }; + + // Prefer the (increased) slope of P1-B1, if larger + // B1 is the upper left bounding box corner of a colliding obstacle + if ((pLeft.x > bezierCurve.p1.x + margin) && (bezierCurve.IsLeftControlAbove() == spannedElement->m_isBelow)) { + const double slope = BoundingBox::CalcSlope(bezierCurve.p1, pLeft); + if ((slope > 0.0) && bezierCurve.IsLeftControlAbove()) { + const double adjustedSlope = this->RotateSlope(slope, 10.0, 2.5, true); + leftSlopeMax = std::max(leftSlopeMax, adjustedSlope); + } + if ((slope < 0.0) && !bezierCurve.IsLeftControlAbove()) { + const double adjustedSlope = this->RotateSlope(-slope, 10.0, 2.5, true); + leftSlopeMax = std::max(leftSlopeMax, adjustedSlope); + } + } + + // Prefer the (increased) slope of P2-B2, if larger + // B2 is the upper right bounding box corner of a colliding obstacle + if ((pRight.x < bezierCurve.p2.x - margin) + && (bezierCurve.IsRightControlAbove() == spannedElement->m_isBelow)) { + const double slope = BoundingBox::CalcSlope(bezierCurve.p2, pRight); + if ((slope < 0.0) && bezierCurve.IsRightControlAbove()) { + const double adjustedSlope = this->RotateSlope(-slope, 10.0, 2.5, true); + rightSlopeMax = std::max(rightSlopeMax, adjustedSlope); + } + if ((slope > 0.0) && !bezierCurve.IsRightControlAbove()) { + const double adjustedSlope = this->RotateSlope(slope, 10.0, 2.5, true); + rightSlopeMax = std::max(rightSlopeMax, adjustedSlope); + } + } + } + + if ((leftSlopeMax == 0.0) || (rightSlopeMax == 0.0)) return { false, 0, 0 }; + + // Calculate offset from extremal slope, but use 1/20 of horizontal distance as minimum + const int minOffset = (bezierCurve.p2.x - bezierCurve.p1.x) / 20; + int leftOffset = minOffset; + if (bezierCurve.GetLeftControlOffset() > 0) { + leftOffset = std::max(leftOffset, std::abs(bezierCurve.GetLeftControlHeight()) / leftSlopeMax); + } + int rightOffset = minOffset; + if (bezierCurve.GetRightControlOffset() > 0) { + rightOffset = std::max(rightOffset, std::abs(bezierCurve.GetRightControlHeight()) / rightSlopeMax); + } + + return { true, leftOffset, rightOffset }; +} + +ControlPointAdjustment AdjustSlursFunctor::CalcControlPointVerticalShift( + const BezierCurve &bezierCurve, double symmetry, int margin) const +{ + ControlPointAdjustment adjustment{ 0, 0, false, 0 }; + if (bezierCurve.p1.x >= bezierCurve.p2.x) return adjustment; + + std::list aboveConstraints; + std::list belowConstraints; + int maxIntersectionAbove = 0; + int maxIntersectionBelow = 0; + + const int dist = bezierCurve.p2.x - bezierCurve.p1.x; + + const ArrayOfCurveSpannedElements *spannedElements = m_currentCurve->GetSpannedElements(); + + for (CurveSpannedElement *spannedElement : *spannedElements) { + + if (spannedElement->m_discarded) { + continue; + } + + bool discard = false; + int intersectionLeft, intersectionRight; + std::tie(intersectionLeft, intersectionRight) = m_currentCurve->CalcDirectionalLeftRightAdjustment( + spannedElement->m_boundingBox, spannedElement->m_isBelow, discard, margin); + + if (discard) { + spannedElement->m_discarded = true; + continue; + } + + std::list &constraints + = spannedElement->m_isBelow ? belowConstraints : aboveConstraints; + int &maxIntersection = spannedElement->m_isBelow ? maxIntersectionBelow : maxIntersectionAbove; + + if ((intersectionLeft > 0) || (intersectionRight > 0)) { + Point points[4]; + points[0] = bezierCurve.p1; + points[1] = bezierCurve.c1; + points[2] = bezierCurve.c2; + points[3] = bezierCurve.p2; + + // Add constraint for the left boundary of the colliding bounding box + const int xLeft = std::max(bezierCurve.p1.x, spannedElement->m_boundingBox->GetSelfLeft()); + float distanceRatio = float(xLeft - bezierCurve.p1.x) / float(dist); + // Ignore obstacles close to the endpoints, because this would result in very large shifts + if ((std::abs(0.5 - distanceRatio) < 0.45) && (intersectionLeft > 0)) { + const double t = BoundingBox::CalcBezierParamAtPosition(points, xLeft); + constraints.push_back( + { 3.0 * pow(1.0 - t, 2.0) * t, 3.0 * (1.0 - t) * pow(t, 2.0), double(intersectionLeft) }); + maxIntersection = std::max(maxIntersection, intersectionLeft); + } + + // Add constraint for the right boundary of the colliding bounding box + const int xRight = std::min(bezierCurve.p2.x, spannedElement->m_boundingBox->GetSelfRight()); + distanceRatio = float(xRight - bezierCurve.p1.x) / float(dist); + // Ignore obstacles close to the endpoints, because this would result in very large shifts + if ((std::abs(0.5 - distanceRatio) < 0.45) && (intersectionRight > 0)) { + const double t = BoundingBox::CalcBezierParamAtPosition(points, xRight); + constraints.push_back( + { 3.0 * pow(1.0 - t, 2.0) * t, 3.0 * (1.0 - t) * pow(t, 2.0), double(intersectionRight) }); + maxIntersection = std::max(maxIntersection, intersectionRight); + } + } + } + + // Solve the constraints and calculate the adjustment + if (maxIntersectionAbove > maxIntersectionBelow) { + std::tie(adjustment.leftShift, adjustment.rightShift) + = this->SolveControlPointConstraints(aboveConstraints, symmetry); + adjustment.moveUpwards = false; + } + else { + std::tie(adjustment.leftShift, adjustment.rightShift) + = this->SolveControlPointConstraints(belowConstraints, symmetry); + adjustment.moveUpwards = true; + } + + // Determine the requested staff space + if (bezierCurve.IsLeftControlAbove() && !bezierCurve.IsRightControlAbove()) { + adjustment.requestedStaffSpace = std::max(bezierCurve.p1.y - bezierCurve.p2.y + 6 * margin, 0); + } + else if (!bezierCurve.IsLeftControlAbove() && bezierCurve.IsRightControlAbove()) { + adjustment.requestedStaffSpace = std::max(bezierCurve.p2.y - bezierCurve.p1.y + 6 * margin, 0); + } + if ((maxIntersectionAbove > 0) && (maxIntersectionBelow > 0)) { + adjustment.requestedStaffSpace + = std::max(adjustment.requestedStaffSpace, maxIntersectionAbove + maxIntersectionBelow); + } + + return adjustment; +} + +std::pair AdjustSlursFunctor::SolveControlPointConstraints( + const std::list &constraints, double symmetry) const +{ + if (constraints.empty()) return { 0, 0 }; + + // Each constraint corresponds to a halfplane in the upper right quadrant. + // We consider the line through the origin orthogonal to the halfplane's boundary + // and average the slopes of these orthogonal lines. + double weightSum = 0.0; + double weightedAngleSum = 0.0; + for (const ControlPointConstraint &constraint : constraints) { + // Use the distance of the halfplane's boundary to the origin as weight + const double weight = constraint.c / std::hypot(constraint.a, constraint.b); + weightedAngleSum += weight * atan(constraint.b / constraint.a); + weightSum += weight; + } + // Depending on symmetry we want the angle to be near PI/4 + double angle = weightedAngleSum / weightSum; + angle = std::max(symmetry * M_PI / 4.0, angle); + angle = std::min((2.0 - symmetry) * M_PI / 4.0, angle); + const double slope = tan(angle); + + // Now follow the line with the averaged slope until we have hit all halfplanes. + // For each constraint we must solve: slope * x = c/b - a/b * x + double xMax = 0.0; + for (const ControlPointConstraint &constraint : constraints) { + const double x = constraint.c / (constraint.a + slope * constraint.b); + xMax = std::max(xMax, x); + } + + // The point which hits the last halfplane is the desired solution. + return { xMax, slope * xMax }; +} + +void AdjustSlursFunctor::AdjustSlurShape(BezierCurve &bezierCurve, curvature_CURVEDIR dir, int unit) const +{ + if (bezierCurve.p1.x >= bezierCurve.p2.x) return; + + // Normalize the slur via rotation (such that p1-p2 is horizontal) + const float angle = atan2(bezierCurve.p2.y - bezierCurve.p1.y, bezierCurve.p2.x - bezierCurve.p1.x); + bezierCurve.Rotate(-angle, bezierCurve.p1); + bezierCurve.UpdateControlPointParams(); + + // *** STEP 1: Ensure MINIMAL HEIGHT *** + // <)C1P1P2 should be at least 30 degrees, but allow smaller angles if the midpoint would be lifted more than 6 MEI + // units + // Similar for <)P1P2C2 + const int sign = (dir == curvature_CURVEDIR_above) ? 1 : -1; + const Point shiftedMidpoint( + (bezierCurve.p1.x + bezierCurve.p2.x) / 2, (bezierCurve.p1.y + bezierCurve.p2.y) / 2 + sign * 6 * unit); + const float minAngle = this->GetMinControlPointAngle(bezierCurve, angle / M_PI * 180.0, unit); + const bool ignoreLeft = (bezierCurve.c1.x <= bezierCurve.p1.x); + const bool ignoreRight = (bezierCurve.c2.x >= bezierCurve.p2.x); + double slopeLeft = BoundingBox::CalcSlope(bezierCurve.p1, bezierCurve.c1); + double slopeRight = BoundingBox::CalcSlope(bezierCurve.p2, bezierCurve.c2); + const double slopeBase = BoundingBox::CalcSlope(bezierCurve.p1, bezierCurve.p2); + + if (dir == curvature_CURVEDIR_above) { + double minSlopeLeft = this->RotateSlope(slopeBase, minAngle, 1.0, true); + minSlopeLeft = std::min(minSlopeLeft, BoundingBox::CalcSlope(bezierCurve.p1, shiftedMidpoint)); + slopeLeft = std::max(slopeLeft, minSlopeLeft); + double minSlopeRight = this->RotateSlope(slopeBase, minAngle, 1.0, false); + minSlopeRight = std::max(minSlopeRight, BoundingBox::CalcSlope(bezierCurve.p2, shiftedMidpoint)); + slopeRight = std::min(slopeRight, minSlopeRight); + } + else if (dir == curvature_CURVEDIR_below) { + double minSlopeLeft = this->RotateSlope(slopeBase, minAngle, 1.0, false); + minSlopeLeft = std::max(minSlopeLeft, BoundingBox::CalcSlope(bezierCurve.p1, shiftedMidpoint)); + slopeLeft = std::min(slopeLeft, minSlopeLeft); + double minSlopeRight = this->RotateSlope(slopeBase, minAngle, 1.0, true); + minSlopeRight = std::min(minSlopeRight, BoundingBox::CalcSlope(bezierCurve.p2, shiftedMidpoint)); + slopeRight = std::max(slopeRight, minSlopeRight); + } + + // Update control points + if (!ignoreLeft) bezierCurve.SetLeftControlHeight(slopeLeft * sign * bezierCurve.GetLeftControlOffset()); + if (!ignoreRight) bezierCurve.SetRightControlHeight(slopeRight * -sign * bezierCurve.GetRightControlOffset()); + bezierCurve.UpdateControlPoints(); + + // *** STEP 2: Ensure CONVEXITY *** + // <)C1P1C2 and <)C1P2C2 should be at least 3 degrees + if (dir == curvature_CURVEDIR_above) { + const double minSlopeLeft + = this->RotateSlope(BoundingBox::CalcSlope(bezierCurve.p1, bezierCurve.c2), 3.0, 10.0, true); + slopeLeft = std::max(slopeLeft, minSlopeLeft); + const double minSlopeRight + = this->RotateSlope(BoundingBox::CalcSlope(bezierCurve.p2, bezierCurve.c1), 3.0, 10.0, false); + slopeRight = std::min(slopeRight, minSlopeRight); + } + else if (dir == curvature_CURVEDIR_below) { + const double minSlopeLeft + = this->RotateSlope(BoundingBox::CalcSlope(bezierCurve.p1, bezierCurve.c2), 3.0, 10.0, false); + slopeLeft = std::min(slopeLeft, minSlopeLeft); + const double minSlopeRight + = this->RotateSlope(BoundingBox::CalcSlope(bezierCurve.p2, bezierCurve.c1), 3.0, 10.0, true); + slopeRight = std::max(slopeRight, minSlopeRight); + } + + // Update control points + if (!ignoreLeft) bezierCurve.SetLeftControlHeight(slopeLeft * sign * bezierCurve.GetLeftControlOffset()); + if (!ignoreRight) bezierCurve.SetRightControlHeight(slopeRight * -sign * bezierCurve.GetRightControlOffset()); + bezierCurve.UpdateControlPoints(); + + // Rotate back + bezierCurve.Rotate(angle, bezierCurve.p1); + + // Enforce p1.x <= c1.x <= c2.x <= p2.x + bezierCurve.c1.x = std::max(bezierCurve.p1.x, bezierCurve.c1.x); + bezierCurve.c2.x = std::max(bezierCurve.c1.x, bezierCurve.c2.x); + bezierCurve.c2.x = std::min(bezierCurve.p2.x, bezierCurve.c2.x); + bezierCurve.c1.x = std::min(bezierCurve.c2.x, bezierCurve.c1.x); + + bezierCurve.UpdateControlPointParams(); +} + +ControlPointAdjustment AdjustSlursFunctor::CalcControlPointShift(const BezierCurve &bezierCurve, + const ArrayOfFloatingCurvePositioners &innerCurves, double symmetry, int margin) const +{ + ControlPointAdjustment adjustment{ 0, 0, false, 0 }; + if (bezierCurve.p1.x >= bezierCurve.p2.x) return adjustment; + + const int dist = bezierCurve.p2.x - bezierCurve.p1.x; + const bool isBelow = (m_currentCurve->GetDir() == curvature_CURVEDIR_above); + const int sign = isBelow ? 1 : -1; + Point points[4]; + points[0] = bezierCurve.p1; + points[1] = bezierCurve.c1; + points[2] = bezierCurve.c2; + points[3] = bezierCurve.p2; + + std::list constraints; + for (FloatingCurvePositioner *innerCurve : innerCurves) { + Point innerPoints[4]; + innerCurve->GetPoints(innerPoints); + + // Create five constraints for each inner slur + for (int step = 0; step <= 4; ++step) { + const Point innerPoint = BoundingBox::CalcPointAtBezier(innerPoints, 0.25 * step); + if ((bezierCurve.p1.x <= innerPoint.x) && (innerPoint.x <= bezierCurve.p2.x)) { + const int y = BoundingBox::CalcBezierAtPosition(points, innerPoint.x); + const int intersection = (innerPoint.y - y) * sign + margin; + const float distanceRatio = float(innerPoint.x - bezierCurve.p1.x) / float(dist); + + // Ignore obstacles close to the endpoints, because this would result in very large shifts + if ((std::abs(0.5 - distanceRatio) < 0.45) && (intersection > 0)) { + const double t = BoundingBox::CalcBezierParamAtPosition(points, innerPoint.x); + constraints.push_back( + { 3.0 * pow(1.0 - t, 2.0) * t, 3.0 * (1.0 - t) * pow(t, 2.0), double(intersection) }); + } + } + } + } + + // Solve the constraints and calculate the adjustment + std::tie(adjustment.leftShift, adjustment.rightShift) = this->SolveControlPointConstraints(constraints, symmetry); + + return adjustment; +} + +std::pair AdjustSlursFunctor::CalcEndPointShift(const BezierCurve &bezierCurve, + const ArrayOfFloatingCurvePositioners &innerCurves, double flexibility, int margin) const +{ + if (bezierCurve.p1.x >= bezierCurve.p2.x) return { 0, 0 }; + + int shiftLeft = 0; + int shiftRight = 0; + + const int dist = bezierCurve.p2.x - bezierCurve.p1.x; + const bool isBelow = (m_currentCurve->GetDir() == curvature_CURVEDIR_above); + const int sign = isBelow ? 1 : -1; + Point points[4]; + points[0] = bezierCurve.p1; + points[1] = bezierCurve.c1; + points[2] = bezierCurve.c2; + points[3] = bezierCurve.p2; + + for (FloatingCurvePositioner *innerCurve : innerCurves) { + Point innerPoints[4]; + innerCurve->GetPoints(innerPoints); + + // Adjustment for start point of inner slur + const int xInnerStart = innerPoints[0].x; + if ((bezierCurve.p1.x <= xInnerStart) && (xInnerStart <= bezierCurve.p2.x)) { + const int yStart = BoundingBox::CalcBezierAtPosition(points, xInnerStart); + const int intersectionStart = (innerPoints[0].y - yStart) * sign + 1.5 * margin; + if (intersectionStart > 0) { + const float distanceRatioStart = float(xInnerStart - bezierCurve.p1.x) / float(dist); + this->ShiftEndPoints(shiftLeft, shiftRight, distanceRatioStart, intersectionStart, flexibility, isBelow, + m_currentCurve->m_spanningType); + } + } + + // Adjustment for midpoint of inner slur + const Point innerMidPoint = BoundingBox::CalcPointAtBezier(innerPoints, 0.5); + if ((bezierCurve.p1.x <= innerMidPoint.x) && (innerMidPoint.x <= bezierCurve.p2.x)) { + const int yMid = BoundingBox::CalcBezierAtPosition(points, innerMidPoint.x); + const int intersectionMid = (innerMidPoint.y - yMid) * sign + 1.5 * margin; + if (intersectionMid > 0) { + const float distanceRatioMid = float(innerMidPoint.x - bezierCurve.p1.x) / float(dist); + this->ShiftEndPoints(shiftLeft, shiftRight, distanceRatioMid, intersectionMid, flexibility, isBelow, + m_currentCurve->m_spanningType); + } + } + + // Adjustment for end point of inner slur + const int xInnerEnd = innerPoints[3].x; + if ((bezierCurve.p1.x <= xInnerEnd) && (xInnerEnd <= bezierCurve.p2.x)) { + const int yEnd = BoundingBox::CalcBezierAtPosition(points, xInnerEnd); + const int intersectionEnd = (innerPoints[3].y - yEnd) * sign + 1.5 * margin; + if (intersectionEnd > 0) { + const float distanceRatioEnd = float(xInnerEnd - bezierCurve.p1.x) / float(dist); + this->ShiftEndPoints(shiftLeft, shiftRight, distanceRatioEnd, intersectionEnd, flexibility, isBelow, + m_currentCurve->m_spanningType); + } + } + } + + return { shiftLeft, shiftRight }; +} + +void AdjustSlursFunctor::ShiftEndPoints(int &shiftLeft, int &shiftRight, double ratio, int intersection, + double flexibility, bool isBelow, char spanningType) const +{ + // Filter collisions near the endpoints + // Collisions with ratio beyond the partialShiftRadius do not contribute to shifts + // They are compensated later by shifting the control points + double fullShiftRadius = 0.0; + double partialShiftRadius = 0.0; + std::tie(fullShiftRadius, partialShiftRadius) = this->CalcShiftRadii(true, flexibility, spanningType); + + if ((ratio < partialShiftRadius) && (m_currentSlur->HasEndpointAboveStart() == isBelow)) { + if (ratio > fullShiftRadius) { + // Collisions here only partially contribute to shifts + // We multiply with a function that interpolates between 1 and 0 + intersection *= this->CalcQuadraticInterpolation(partialShiftRadius, fullShiftRadius, ratio); + } + shiftLeft = std::max(shiftLeft, intersection); + } + + std::tie(fullShiftRadius, partialShiftRadius) = this->CalcShiftRadii(false, flexibility, spanningType); + + if ((ratio > 1.0 - partialShiftRadius) && (m_currentSlur->HasEndpointAboveEnd() == isBelow)) { + if (ratio < 1.0 - fullShiftRadius) { + // Collisions here only partially contribute to shifts + // We multiply with a function that interpolates between 0 and 1 + intersection *= this->CalcQuadraticInterpolation(1.0 - partialShiftRadius, 1.0 - fullShiftRadius, ratio); + } + shiftRight = std::max(shiftRight, intersection); + } +} + +std::pair AdjustSlursFunctor::CalcShiftRadii( + bool forShiftLeft, double flexibility, char spanningType) const +{ + // Use full flexibility for broken slur endpoints + if (forShiftLeft) { + if ((spanningType == SPANNING_MIDDLE) || (spanningType == SPANNING_END)) { + flexibility = 1.0; + } + } + else { + if ((spanningType == SPANNING_START) || (spanningType == SPANNING_MIDDLE)) { + flexibility = 1.0; + } + } + + const double fullShiftRadius = 0.05 + flexibility * 0.15; + const double partialShiftRadius = fullShiftRadius * 3.0; + + return { fullShiftRadius, partialShiftRadius }; +} + +double AdjustSlursFunctor::CalcQuadraticInterpolation(double zeroAt, double oneAt, double arg) const +{ + assert(zeroAt != oneAt); + const double a = 1.0 / (oneAt - zeroAt); + const double b = zeroAt / (zeroAt - oneAt); + return pow(a * arg + b, 2.0); +} + +double AdjustSlursFunctor::RotateSlope(double slope, double degrees, double doublingBound, bool upwards) const +{ + assert(degrees >= 0.0); + assert(doublingBound >= 0.0); + + if (upwards && (slope >= doublingBound)) return slope * 2.0; + if (!upwards && (slope <= -doublingBound)) return slope * 2.0; + const int sign = upwards ? 1 : -1; + return tan(atan(slope) + sign * M_PI * degrees / 180.0); +} + +float AdjustSlursFunctor::GetMinControlPointAngle(const BezierCurve &bezierCurve, float angle, int unit) const +{ + angle = abs(angle); + const double distance = double(bezierCurve.p2.x - bezierCurve.p1.x) / unit; + + // Increase min angle for short and angled slurs + double angleIncrement = std::min(angle / 4.0, 15.0); // values in [0.0, 15.0] + double factor = 1.0 - (distance - 8.0) / 8.0; + factor = std::min(factor, 1.0); + factor = std::max(factor, 0.0); // values in [0.0, 1.0] + + // not if control points are horizontally in a degenerated position + if ((bezierCurve.c1.x < bezierCurve.p1.x) || (2.0 * bezierCurve.c1.x > bezierCurve.p1.x + bezierCurve.p2.x)) { + angleIncrement = 0.0; + } + if ((bezierCurve.c2.x > bezierCurve.p2.x) || (2.0 * bezierCurve.c2.x < bezierCurve.p1.x + bezierCurve.p2.x)) { + angleIncrement = 0.0; + } + + return 30.0 + angleIncrement * factor; +} + } // namespace vrv diff --git a/src/adjusttupletsyfunctor.cpp b/src/adjusttupletsyfunctor.cpp index 5f15d4764fe..c387f0351c5 100644 --- a/src/adjusttupletsyfunctor.cpp +++ b/src/adjusttupletsyfunctor.cpp @@ -69,31 +69,59 @@ 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 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); - 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 }); } + // Calculate the horizontal bracket first + const int unit = m_doc->GetDrawingUnit(staffSize); 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); + int optimalTilt = 0; + int optimalShift = horizontalBracketShift; + + 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; + } + } + } + + 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 @@ -280,6 +308,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 //---------------------------------------------------------------------------- diff --git a/src/adjustxoverflowfunctor.cpp b/src/adjustxoverflowfunctor.cpp index 15c29f03624..f095f61a52e 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; @@ -32,7 +32,7 @@ AdjustXOverflowFunctor::AdjustXOverflowFunctor(int margin) 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/adjustxposfunctor.cpp b/src/adjustxposfunctor.cpp index e11ef44f28b..5436c605497 100644 --- a/src/adjustxposfunctor.cpp +++ b/src/adjustxposfunctor.cpp @@ -12,6 +12,7 @@ #include "doc.h" #include "multirest.h" #include "rest.h" +#include "score.h" #include "staff.h" #include "system.h" @@ -214,9 +215,8 @@ FunctorCode AdjustXPosFunctor::VisitMeasure(Measure *measure) const bool hasSystemStartLine = measure->IsFirstInSystem() && system->GetDrawingScoreDef()->HasSystemStartLine(); - Filters *previousFilters = this->GetFilters(); Filters filters; - this->SetFilters(&filters); + Filters *previousFilters = this->SetFilters(&filters); for (auto staffN : m_staffNs) { m_minPos = 0; @@ -299,7 +299,7 @@ FunctorCode AdjustXPosFunctor::VisitMeasure(Measure *measure) FunctorCode AdjustXPosFunctor::VisitScore(Score *score) { - m_staffNs = m_doc->GetCurrentScoreDef()->GetStaffNs(); + m_staffNs = score->GetScoreDef()->GetStaffNs(); return FUNCTOR_CONTINUE; } diff --git a/src/adjustxrelfortranscriptionfunctor.cpp b/src/adjustxrelfortranscriptionfunctor.cpp index eebd0189458..c4e4c1f20d4 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/adjustyposfunctor.cpp b/src/adjustyposfunctor.cpp index 75124f2fe18..27199ce6356 100644 --- a/src/adjustyposfunctor.cpp +++ b/src/adjustyposfunctor.cpp @@ -12,6 +12,7 @@ #include "beamspan.h" #include "calcalignmentpitchposfunctor.h" #include "calcstemfunctor.h" +#include "div.h" #include "system.h" //---------------------------------------------------------------------------- @@ -27,6 +28,13 @@ AdjustYPosFunctor::AdjustYPosFunctor(Doc *doc) : DocFunctor(doc) m_cumulatedShift = 0; } +FunctorCode AdjustYPosFunctor::VisitDiv(Div *div) +{ + div->AdjustRunningElementYPos(); + + return FUNCTOR_SIBLINGS; +} + FunctorCode AdjustYPosFunctor::VisitStaffAlignment(StaffAlignment *staffAlignment) { const int defaultSpacing = staffAlignment->GetMinimumSpacing(m_doc); @@ -52,7 +60,7 @@ FunctorCode AdjustYPosFunctor::VisitSystem(System *system) system->m_systemAligner.Process(*this); - return FUNCTOR_SIBLINGS; + return FUNCTOR_CONTINUE; } //---------------------------------------------------------------------------- diff --git a/src/alignfunctor.cpp b/src/alignfunctor.cpp index ff082938f4a..93c9d2ad944 100644 --- a/src/alignfunctor.cpp +++ b/src/alignfunctor.cpp @@ -9,6 +9,7 @@ //---------------------------------------------------------------------------- +#include "div.h" #include "doc.h" #include "dot.h" #include "fig.h" @@ -75,7 +76,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()); } } @@ -159,7 +160,7 @@ FunctorCode AlignHorizontallyFunctor::VisitLayerElement(LayerElement *layerEleme // Ligature notes are all aligned with the first note Note *note = vrv_cast(layerElement); assert(note); - Note *firstNote = dynamic_cast(ligatureParent->GetListFront(ligatureParent)); + Note *firstNote = dynamic_cast(ligatureParent->GetListFront()); if (firstNote && (firstNote != note)) { Alignment *alignment = firstNote->GetAlignment(); layerElement->SetAlignment(alignment); @@ -296,6 +297,10 @@ FunctorCode AlignHorizontallyFunctor::VisitLayerElement(LayerElement *layerEleme // The time will be reset to 0.0 when starting a new layer anyway if (layerElement->Is(TIMESTAMP_ATTR)) { m_time = duration; + // When a tstamp is pointing to the end of a measure, then use the right barline alignment + if (m_time == this->m_measureAligner->GetRightAlignment()->GetTime()) { + type = ALIGNMENT_MEASURE_RIGHT_BARLINE; + } } else { m_measureAligner->SetMaxTime(m_time + duration); @@ -411,6 +416,15 @@ AlignMeasuresFunctor::AlignMeasuresFunctor(Doc *doc) : DocFunctor(doc) m_storeCastOffSystemWidths = false; } +FunctorCode AlignMeasuresFunctor::VisitDiv(Div *div) +{ + if (div->GetDrawingInline()) div->SetDrawingXRel(m_shift); + + m_shift += div->GetContentWidth(); + + return FUNCTOR_SIBLINGS; +} + FunctorCode AlignMeasuresFunctor::VisitMeasure(Measure *measure) { if (m_applySectionRestartShift) { @@ -486,6 +500,15 @@ AlignVerticallyFunctor::AlignVerticallyFunctor(Doc *doc) : DocFunctor(doc) m_pageWidth = 0; } +FunctorCode AlignVerticallyFunctor::VisitDiv(Div *div) +{ + m_systemAligner->GetBottomAlignment()->SetYRel(-div->GetTotalHeight(m_doc)); + + m_pageWidth = div->GetTotalWidth(m_doc); + + return FUNCTOR_CONTINUE; +} + FunctorCode AlignVerticallyFunctor::VisitFig(Fig *fig) { Svg *svg = vrv_cast(fig->FindDescendantByType(SVG)); @@ -532,6 +555,8 @@ FunctorCode AlignVerticallyFunctor::VisitPageEnd(Page *page) FunctorCode AlignVerticallyFunctor::VisitRend(Rend *rend) { + if (!rend->GetFirstAncestorInRange(TEXT_LAYOUT_ELEMENT, TEXT_LAYOUT_ELEMENT_max)) return FUNCTOR_SIBLINGS; + if (rend->GetHalign()) { switch (rend->GetHalign()) { case HORIZONTALALIGNMENT_right: rend->SetDrawingXRel(m_pageWidth); break; @@ -545,7 +570,9 @@ FunctorCode AlignVerticallyFunctor::VisitRend(Rend *rend) FunctorCode AlignVerticallyFunctor::VisitRunningElement(RunningElement *runningElement) { - m_pageWidth = runningElement->GetWidth(); + this->VisitTextLayoutElement(runningElement); + + m_pageWidth = runningElement->GetTotalWidth(m_doc); return FUNCTOR_CONTINUE; } @@ -694,16 +721,11 @@ FunctorCode AlignSystemsFunctor::VisitSystem(System *system) assert(systemAligner.GetBottomAlignment()); // No spacing for the first system - int systemSpacing = system->IsFirstInPage() ? 0 : m_systemSpacing; - if (systemSpacing) { - const int contentOverflow = m_prevBottomOverflow + systemAligner.GetOverflowAbove(m_doc); - const int clefOverflow = m_prevBottomClefOverflow + systemAligner.GetOverflowAbove(m_doc, true); - // Alignment is already pre-determined with staff alignment overflow - // We need to subtract them from the desired spacing - const int actualSpacing = systemSpacing - std::max(contentOverflow, clefOverflow); - // Ensure minimal white space between consecutive systems by adding one staff space + if (!system->IsFirstInPage()) { + // const int contentOverflow = m_prevBottomOverflow + systemAligner.GetOverflowAbove(m_doc); + // const int clefOverflow = m_prevBottomClefOverflow + systemAligner.GetOverflowAbove(m_doc, true); const int unit = m_doc->GetDrawingUnit(100); - m_shift -= std::max(actualSpacing, 2 * unit); + m_shift -= std::max(m_systemSpacing, 2 * unit); } system->SetDrawingYRel(m_shift); @@ -716,6 +738,7 @@ FunctorCode AlignSystemsFunctor::VisitSystem(System *system) m_justificationSum -= m_doc->GetOptions()->m_justificationSystem.GetValue(); } + // These are currently not used m_prevBottomOverflow = systemAligner.GetOverflowBelow(m_doc); m_prevBottomClefOverflow = systemAligner.GetOverflowBelow(m_doc, true); diff --git a/src/anchoredtext.cpp b/src/anchoredtext.cpp index 174ba7ab1fc..2451eb7f807 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 dd217e22c4d..09863c30f09 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" @@ -131,7 +130,7 @@ std::set Arpeg::GetNotes() const } else if (object->Is(CHORD)) { const Chord *chord = vrv_cast(object); - const ListOfConstObjects &childList = chord->GetList(chord); + const ListOfConstObjects &childList = chord->GetList(); for (const Object *child : childList) { const Note *note = vrv_cast(child); assert(note); @@ -194,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); } @@ -204,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); } @@ -214,31 +213,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/artic.cpp b/src/artic.cpp index 454e8386d20..6e07f9b95a3 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" @@ -48,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(); @@ -70,7 +71,8 @@ void Artic::Reset() this->ResetArticulationGes(); this->ResetColor(); this->ResetEnclosingChars(); - this->ResetExtSym(); + this->ResetExtSymAuth(); + this->ResetExtSymNames(); this->ResetPlacementRelEvent(); m_drawingPlace = STAFFREL_NONE; @@ -101,37 +103,6 @@ data_ARTICULATION Artic::GetArticFirst() const return articList.front(); } -void Artic::SplitMultival(Object *parent) -{ - assert(parent); - - std::vector articList = this->GetArtic(); - if (articList.empty()) return; - - int idx = this->GetIdx() + 1; - std::vector::iterator iter; - for (iter = articList.begin() + 1; iter != articList.end(); ++iter) { - Artic *artic = new Artic(); - artic->SetArtic({ *iter }); - artic->AttColor::operator=(*this); - artic->AttEnclosingChars::operator=(*this); - artic->AttExtSym::operator=(*this); - artic->AttPlacementRelEvent::operator=(*this); - parent->InsertChild(artic, idx); - idx++; - } - - // The original element only keep the first value - this->SetArtic({ articList.at(0) }); - - // Multiple valued attributes cannot be preserved as such - if (this->IsAttribute()) { - this->IsAttribute(false); - LogInfo("Multiple valued attribute @artic on '%s' permanently converted to elements", - parent->GetID().c_str()); - } -} - void Artic::GetAllArtics(bool direction, std::vector &artics) { Object *parentNoteOrChord = this->GetFirstAncestor(CHORD); @@ -308,7 +279,7 @@ bool Artic::IsCentered(data_ARTICULATION artic) // Functor methods //---------------------------------------------------------------------------- -FunctorCode Artic::Accept(MutableFunctor &functor) +FunctorCode Artic::Accept(Functor &functor) { return functor.VisitArtic(this); } @@ -318,7 +289,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); } @@ -328,15 +299,4 @@ FunctorCode Artic::AcceptEnd(ConstFunctor &functor) const return functor.VisitArticEnd(this); } -int Artic::ConvertMarkupArtic(FunctorParams *functorParams) -{ - ConvertMarkupArticParams *params = vrv_params_cast(functorParams); - assert(params); - - if (this->GetArtic().size() > 1) - params->m_articPairsToConvert.emplace_back(std::make_pair(this->GetParent(), this)); - - return FUNCTOR_CONTINUE; -} - } // namespace vrv diff --git a/src/barline.cpp b/src/barline.cpp index 3f62520827d..30952b11ed7 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" @@ -171,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); } @@ -181,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); } @@ -191,88 +190,4 @@ FunctorCode BarLine::AcceptEnd(ConstFunctor &functor) const return functor.VisitBarLineEnd(this); } -int BarLine::ConvertToCastOffMensural(FunctorParams *functorParams) -{ - ConvertToCastOffMensuralParams *params = vrv_params_cast(functorParams); - assert(params); - - assert(m_alignment); - assert(params->m_targetSubSystem); - assert(params->m_targetLayer); - - // If this is the last barline of the layer, we will just move it and do not create a new segment - bool isLast = (params->m_contentLayer->GetLast() == this) ? true : false; - Object *next = params->m_contentLayer->GetNext(this); - bool nextIsBarline = (next && next->Is(BARLINE)) ? true : false; - - // See what if we create proper measures and what to do with the barLine - bool convertToMeasured = params->m_doc->GetOptions()->m_mensuralToMeasure.GetValue(); - - if (convertToMeasured) { - // barLine object will be deleted - params->m_targetMeasure->SetRight(this->GetForm()); - } - else { - this->MoveItselfTo(params->m_targetLayer); - } - - // Now we can return if this the end barLine - if (isLast || nextIsBarline) return FUNCTOR_SIBLINGS; - - for (auto const &staffN : params->m_staffNs) { - // The barline is missing in at least one of the staves - do not break here - if (!m_alignment->HasAlignmentReference(staffN)) { - // LogDebug("BarLine not on all staves %d %s", params->m_targetStaff->GetN(), this->GetClassName().c_str()); - return FUNCTOR_SIBLINGS; - } - } - - // Make a segment break - // First case: new need to add a new measure segment (e.g., first pass) - if (params->m_targetSubSystem->GetChildCount() <= params->m_segmentIdx) { - params->m_targetMeasure = new Measure(convertToMeasured); - if (convertToMeasured) { - params->m_targetMeasure->SetN(StringFormat("%d", params->m_segmentTotal + 1 + params->m_segmentIdx)); - } - params->m_targetSubSystem->AddChild(params->m_targetMeasure); - // Add a staff with same attribute as in the previous segment - params->m_targetStaff = new Staff(*params->m_targetStaff); - params->m_targetStaff->ClearChildren(); - params->m_targetStaff->CloneReset(); - params->m_targetMeasure->AddChild(params->m_targetStaff); - // Add a layer also with the same attribute as in the previous segment - params->m_targetLayer = new Layer(*params->m_targetLayer); - params->m_targetLayer->ClearChildren(); - params->m_targetLayer->CloneReset(); - params->m_targetStaff->AddChild(params->m_targetLayer); - } - // Second case: retrieve the appropriate segment - else { - params->m_targetMeasure = dynamic_cast(params->m_targetSubSystem->GetChild(params->m_segmentIdx)); - // It must be there - assert(params->m_targetMeasure); - - // Look if we already have the staff (e.g., with more than one layer) - AttNIntegerComparison comparisonStaffN(STAFF, params->m_targetStaff->GetN()); - Staff *staff = vrv_cast(params->m_targetMeasure->FindDescendantByComparison(&comparisonStaffN)); - if (!staff) { - staff = new Staff(*params->m_targetStaff); - staff->ClearChildren(); - staff->CloneReset(); - params->m_targetMeasure->AddChild(staff); - } - params->m_targetStaff = staff; - - // Add a new layer as the new target - params->m_targetLayer = new Layer(*params->m_targetLayer); - params->m_targetLayer->ClearChildren(); - params->m_targetLayer->CloneReset(); - params->m_targetStaff->AddChild(params->m_targetLayer); - } - params->m_segmentIdx++; - // LogDebug("BarLine staff %d - Idx %d", params->m_targetStaff->GetN(), params->m_segmentIdx); - - return FUNCTOR_SIBLINGS; -} - } // namespace vrv diff --git a/src/bboxdevicecontext.cpp b/src/bboxdevicecontext.cpp index 74da9e9bfc1..3ce136e037b 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/beam.cpp b/src/beam.cpp index 347e827ac95..335d7c536fb 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" @@ -72,7 +71,7 @@ void BeamSegment::Reset() const ArrayOfBeamElementCoords *BeamSegment::GetElementCoordRefs() { - // this->GetList(this); + // this->GetList(); return &m_beamElementCoordRefs; } @@ -1109,7 +1108,7 @@ void BeamSegment::CalcAdjustPosition(const Staff *staff, const Doc *doc, const B } } - m_beamElementCoordRefs.at(0)->m_yBeam += adjust; + m_firstNoteOrChord->m_yBeam += adjust; this->CalcSetValues(); } @@ -1458,8 +1457,8 @@ void BeamSegment::CalcPartialFlagPlace() void BeamSegment::CalcSetValues() { - int startingX = m_beamElementCoordRefs.at(0)->m_x; - int startingY = m_beamElementCoordRefs.at(0)->m_yBeam; + const int startingX = m_firstNoteOrChord->m_x; + const int startingY = m_firstNoteOrChord->m_yBeam; for (BeamElementCoord *coord : m_beamElementCoordRefs) { coord->m_yBeam = startingY + m_beamSlope * (coord->m_x - startingX); @@ -1716,11 +1715,6 @@ void Beam::FilterList(ListOfConstObjects &childList) const continue; } } - // and spaces - else if (element->Is(SPACE)) { - iter = childList.erase(iter); - continue; - } ++iter; } } @@ -1728,7 +1722,7 @@ void Beam::FilterList(ListOfConstObjects &childList) const const ArrayOfBeamElementCoords *Beam::GetElementCoords() { - this->GetList(this); + this->GetList(); return &m_beamElementCoords; } @@ -1737,7 +1731,7 @@ bool Beam::IsTabBeam() const return (this->FindDescendantByType(TABGRP)); } -FunctorCode Beam::Accept(MutableFunctor &functor) +FunctorCode Beam::Accept(Functor &functor) { return functor.VisitBeam(this); } @@ -1747,7 +1741,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 845e6854ced..605016a01e8 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" @@ -153,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); } @@ -163,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 08d8e6e4b22..3b72624333c 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" @@ -76,7 +75,7 @@ double BeatRpt::GetScoreTimeOnset() const // BeatRpt functor methods //---------------------------------------------------------------------------- -FunctorCode BeatRpt::Accept(MutableFunctor &functor) +FunctorCode BeatRpt::Accept(Functor &functor) { return functor.VisitBeatRpt(this); } @@ -86,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); } @@ -96,37 +95,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/boundingbox.cpp b/src/boundingbox.cpp index 69b2bb69171..30f42615d8d 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; @@ -715,7 +778,8 @@ int BoundingBox::Intersects(const FloatingCurvePositioner *curve, Accessor type, return 0; } -int BoundingBox::Intersects(const BeamDrawingInterface *beamInterface, Accessor type, const int margin) const +int BoundingBox::Intersects( + const BeamDrawingInterface *beamInterface, Accessor type, int margin, bool fromBeamContentSide) const { assert(beamInterface); assert(beamInterface->HasCoords()); @@ -771,12 +835,15 @@ int BoundingBox::Intersects(const BeamDrawingInterface *beamInterface, Accessor } // calculate vertical overlap of the BB with beam section - if (beamInterface->m_drawingPlace == BEAMPLACE_above) { + const bool beamAbove = (beamInterface->m_drawingPlace == BEAMPLACE_above); + const bool beamBelow = (beamInterface->m_drawingPlace == BEAMPLACE_below); + + if ((beamAbove && !fromBeamContentSide) || (beamBelow && fromBeamContentSide)) { const int topY = std::max(leftIntersection.y, rightIntersection.y); const int shift = topY - this->GetBottomBy(type) + margin; return std::max(shift, 0); } - else if (beamInterface->m_drawingPlace == BEAMPLACE_below) { + else if ((beamBelow && !fromBeamContentSide) || (beamAbove && fromBeamContentSide)) { const int bottomY = std::min(leftIntersection.y, rightIntersection.y); const int shift = bottomY - this->GetTopBy(type) - margin; return std::min(shift, 0); diff --git a/src/bracketspan.cpp b/src/bracketspan.cpp index 0887731e0ab..a793311d60f 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" @@ -85,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); } @@ -95,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 18d18faf49d..e0af690624d 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 e8bde4787c9..f26464cc33c 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" @@ -32,11 +31,11 @@ namespace vrv { static const ClassRegistrar s_factory("btrem", BTREM); -BTrem::BTrem() : LayerElement(BTREM, "btrem-"), AttBTremLog(), AttNumbered(), AttNumberPlacement(), AttTremMeasured() +BTrem::BTrem() : LayerElement(BTREM, "btrem-"), AttNumbered(), AttNumberPlacement(), AttTremForm(), AttTremMeasured() { - this->RegisterAttClass(ATT_BTREMLOG); this->RegisterAttClass(ATT_NUMBERED); this->RegisterAttClass(ATT_NUMBERPLACEMENT); + this->RegisterAttClass(ATT_TREMFORM); this->RegisterAttClass(ATT_TREMMEASURED); this->Reset(); @@ -47,9 +46,9 @@ BTrem::~BTrem() {} void BTrem::Reset() { LayerElement::Reset(); - this->ResetBTremLog(); this->ResetNumbered(); this->ResetNumberPlacement(); + this->ResetTremForm(); this->ResetTremMeasured(); } @@ -73,7 +72,7 @@ bool BTrem::IsSupportedChild(Object *child) return true; } -FunctorCode BTrem::Accept(MutableFunctor &functor) +FunctorCode BTrem::Accept(Functor &functor) { return functor.VisitBTrem(this); } @@ -83,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); } @@ -93,64 +92,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/caesura.cpp b/src/caesura.cpp index d69a13bd97c..494baca0288 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(); @@ -67,7 +73,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 +83,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/calcalignmentpitchposfunctor.cpp b/src/calcalignmentpitchposfunctor.cpp index 23d1ede4e12..ceff61a3280 100644 --- a/src/calcalignmentpitchposfunctor.cpp +++ b/src/calcalignmentpitchposfunctor.cpp @@ -13,6 +13,7 @@ #include "doc.h" #include "layer.h" #include "mrest.h" +#include "nc.h" #include "rest.h" #include "staff.h" #include "tuning.h" @@ -46,22 +47,7 @@ FunctorCode CalcAlignmentPitchPosFunctor::VisitLayerElement(LayerElement *layerE if (layerElement->Is(ACCID)) { Accid *accid = vrv_cast(layerElement); assert(accid); - Note *note = vrv_cast(accid->GetFirstAncestor(NOTE)); - // We should probably also avoid to add editorial accidentals to the accid space - // However, since they are placed above by View::DrawNote it works without avoiding it - if (note) { - if (note->HasGraceAlignment()) { - note->GetGraceAlignment()->AddToAccidSpace(accid); - } - else { - accid->GetAlignment()->AddToAccidSpace(accid); - } - } - else if (accid->GetFirstAncestor(CUSTOS)) { - accid->GetAlignment()->AddToAccidSpace( - accid); // If this is not added, the accidental is drawn an octave below the custos - } - else { + if (!accid->GetFirstAncestor(NOTE) && !accid->GetFirstAncestor(CUSTOS)) { // do something for accid that are not children of a note - e.g., mensural? accid->SetDrawingYRel(staffY->CalcPitchPosYRel(m_doc, accid->CalcDrawingLoc(layerY, layerElementY))); } @@ -147,33 +133,38 @@ FunctorCode CalcAlignmentPitchPosFunctor::VisitLayerElement(LayerElement *layerE mRest->SetDrawingLoc(loc); mRest->SetDrawingYRel(staffY->CalcPitchPosYRel(m_doc, loc)); } - else if (layerElement->Is(REST)) { - Rest *rest = vrv_cast(layerElement); - assert(rest); - int loc = 0; - if (rest->HasPloc() && rest->HasOloc()) { - loc = PitchInterface::CalcLoc(rest->GetPloc(), rest->GetOloc(), layerY->GetClefLocOffset(layerElementY)); - } - else if (rest->HasLoc()) { - loc = rest->GetLoc(); + else if (layerElement->Is({ REST, SPACE })) { + DurationInterface *durInterface = layerElement->GetDurationInterface(); + assert(durInterface); + Rest *rest = NULL; + int loc = VRV_UNSET; + if (layerElement->Is(REST)) { + rest = vrv_cast(layerElement); + assert(rest); + if (rest->HasPloc() && rest->HasOloc()) { + loc = PitchInterface::CalcLoc( + rest->GetPloc(), rest->GetOloc(), layerY->GetClefLocOffset(layerElementY)); + } + else if (rest->HasLoc()) { + loc = rest->GetLoc(); + } } // Automatically calculate rest position - else { + if (loc == VRV_UNSET) { + loc = 0; // set default location to the middle of the staff - Staff *staff = rest->GetAncestorStaff(); + Staff *staff = layerElement->GetAncestorStaff(); loc = staff->m_drawingLines - 1; - if ((rest->GetDur() < DUR_4) && (loc % 2 != 0)) --loc; + if ((durInterface->GetDur() < DUR_4) && (loc % 2 != 0)) --loc; // Adjust special cases - if ((rest->GetDur() == DUR_1) && (staff->m_drawingLines > 1)) loc += 2; - if ((rest->GetDur() == DUR_BR) && (staff->m_drawingLines < 2)) loc -= 2; + if ((durInterface->GetDur() == DUR_1) && (staff->m_drawingLines > 1)) loc += 2; + if ((durInterface->GetDur() == DUR_BR) && (staff->m_drawingLines < 2)) loc -= 2; // If within a beam, calculate the rest's height based on it's relationship to the notes that surround it - Beam *beam = vrv_cast(rest->GetFirstAncestor(BEAM, 1)); + Beam *beam = vrv_cast(layerElement->GetFirstAncestor(BEAM, 1)); if (beam) { - beam->ResetList(beam); - - const ListOfObjects &beamList = beam->GetList(beam); - const int restIndex = beam->GetListIndex(rest); + const ListOfObjects &beamList = beam->GetList(); + const int restIndex = beam->GetListIndex(layerElement); assert(restIndex >= 0); int leftLoc = loc; @@ -219,6 +210,16 @@ FunctorCode CalcAlignmentPitchPosFunctor::VisitLayerElement(LayerElement *layerE } } + // With a rest or space at the first / last position, use the right / left loc + if (restIndex == 0) { + leftLoc = rightLoc; + loc = rightLoc; + } + else if (restIndex == (int)beamList.size() - 1) { + rightLoc = leftLoc; + loc = leftLoc; + } + // average the left note and right note's locations together to get our rest location const int locAvg = (rightLoc + leftLoc) / 2; if (abs(locAvg - loc) > 3) { @@ -240,13 +241,13 @@ FunctorCode CalcAlignmentPitchPosFunctor::VisitLayerElement(LayerElement *layerE int bottomAlignedLoc = loc; // 8th note rests are aligned with the top of a 16th note rest, so to bottom align we have to push it // down 2 - if (rest->GetActualDur() == DURATION_8) bottomAlignedLoc -= 2; + if (durInterface->GetActualDur() == DURATION_8) bottomAlignedLoc -= 2; // for durations smaller than 32nd, bottomAlignedLoc will need to decrease by 2 every iteration greater // than from 32 so 32 will be -0, 64 is -2, 128 is -4 (currently not implemented) // topAlignedLoc is the location where all of the top of the rests align to form a straight line int topAlignedLoc = loc; - if (rest->GetActualDur() == DURATION_32) topAlignedLoc += 2; + if (durInterface->GetActualDur() == DURATION_32) topAlignedLoc += 2; // for smaller durations, topAlignedLoc offset will increase by 2 every iteration greater than from 32 // so 32 will need to be +2, 64 is +4, 128 is +6, etc. // (currently only implemented for 32nds) @@ -280,10 +281,14 @@ FunctorCode CalcAlignmentPitchPosFunctor::VisitLayerElement(LayerElement *layerE } Layer *layer = vrv_cast(layerElement->GetFirstAncestor(LAYER)); - loc = rest->GetOptimalLayerLocation(staff, layer, loc); + if (rest) { + loc = rest->GetOptimalLayerLocation(staff, layer, loc); + } + } + if (rest) { + rest->SetDrawingLoc(loc); } - rest->SetDrawingLoc(loc); - rest->SetDrawingYRel(staffY->CalcPitchPosYRel(m_doc, loc)); + layerElement->SetDrawingYRel(staffY->CalcPitchPosYRel(m_doc, loc)); } else if (layerElement->Is(TABDURSYM)) { int yRel = 0; @@ -293,6 +298,17 @@ FunctorCode CalcAlignmentPitchPosFunctor::VisitLayerElement(LayerElement *layerE } layerElement->SetDrawingYRel(yRel); } + else if (layerElement->Is(NC) && m_doc->GetOptions()->m_neumeAsNote.GetValue()) { + Nc *nc = vrv_cast(layerElement); + assert(nc); + int loc = 0; + if (nc->HasPname() && nc->HasOct()) { + loc = PitchInterface::CalcLoc(nc->GetPname(), nc->GetOct(), layerY->GetClefLocOffset(nc)); + } + int yRel = staffY->CalcPitchPosYRel(m_doc, loc); + nc->SetDrawingLoc(loc); + nc->SetDrawingYRel(yRel); + } return FUNCTOR_CONTINUE; } diff --git a/src/calcchordnoteheadsfunctor.cpp b/src/calcchordnoteheadsfunctor.cpp index 2e1cf8de38b..524ed536d3f 100644 --- a/src/calcchordnoteheadsfunctor.cpp +++ b/src/calcchordnoteheadsfunctor.cpp @@ -61,30 +61,30 @@ FunctorCode CalcChordNoteHeadsFunctor::VisitNote(Note *note) noteheadShift = m_diameter - diameter; } - // Nothing to do for notes that are not in a cluster and without base diameter for the chord - const ChordCluster *cluster = note->GetCluster(); - if ((!m_diameter || (m_alignmentType != note->GetAlignment()->GetType())) && !cluster) return FUNCTOR_SIBLINGS; + // Nothing to do for notes that are not in a note group and without base diameter for the chord + const ChordNoteGroup *noteGroup = note->GetNoteGroup(); + if ((!m_diameter || (m_alignmentType != note->GetAlignment()->GetType())) && !noteGroup) return FUNCTOR_SIBLINGS; /************** notehead direction **************/ bool flippedNotehead = false; - // if the note is clustered, calculations are different - if (cluster) { - const int clusterPosition = note->GetClusterPosition(); + // if the note is in a note group, calculations are different + if (noteGroup) { + const int noteGroupPosition = note->GetNoteGroupPosition(); if (note->GetDrawingStemDir() == STEMDIRECTION_down) { - // stem down/even cluster = noteheads start on left (incorrect side) - if (cluster->size() % 2 == 0) { - flippedNotehead = (clusterPosition % 2 != 0); + // stem down/even note group = noteheads start on left (incorrect side) + if (noteGroup->size() % 2 == 0) { + flippedNotehead = (noteGroupPosition % 2 != 0); } // else they start on normal side else { - flippedNotehead = (clusterPosition % 2 == 0); + flippedNotehead = (noteGroupPosition % 2 == 0); } } else { // flipped noteheads start on normal side no matter what - flippedNotehead = (clusterPosition % 2 == 0); + flippedNotehead = (noteGroupPosition % 2 == 0); } } diff --git a/src/calcligaturenoteposfunctor.cpp b/src/calcligaturenoteposfunctor.cpp index 30d38baa925..52cd1b7d497 100644 --- a/src/calcligaturenoteposfunctor.cpp +++ b/src/calcligaturenoteposfunctor.cpp @@ -29,7 +29,7 @@ FunctorCode CalcLigatureNotePosFunctor::VisitLigature(Ligature *ligature) ligature->m_drawingShapes.clear(); - const ListOfObjects ¬es = ligature->GetList(ligature); + const ListOfObjects ¬es = ligature->GetList(); Note *lastNote = dynamic_cast(notes.back()); Staff *staff = ligature->GetAncestorStaff(); diff --git a/src/calcstemfunctor.cpp b/src/calcstemfunctor.cpp index 1ed1d161bc1..115a5d26bc9 100644 --- a/src/calcstemfunctor.cpp +++ b/src/calcstemfunctor.cpp @@ -43,7 +43,7 @@ CalcStemFunctor::CalcStemFunctor(Doc *doc) : DocFunctor(doc) FunctorCode CalcStemFunctor::VisitBeam(Beam *beam) { - const ListOfObjects &beamChildren = beam->GetList(beam); + const ListOfObjects &beamChildren = beam->GetList(); // Should we assert this at the beginning? if (beamChildren.empty()) { @@ -173,7 +173,7 @@ FunctorCode CalcStemFunctor::VisitChord(Chord *chord) FunctorCode CalcStemFunctor::VisitFTrem(FTrem *fTrem) { - const ListOfObjects &fTremChildren = fTrem->GetList(fTrem); + const ListOfObjects &fTremChildren = fTrem->GetList(); // Should we assert this at the beginning? if (fTremChildren.empty()) { @@ -583,7 +583,7 @@ FunctorCode CalcStemFunctor::VisitTabGrp(TabGrp *tabGrp) data_STEMDIRECTION CalcStemFunctor::CalcStemDirection(const Chord *chord, int verticalCenter) const { - const ListOfConstObjects &childList = chord->GetList(chord); + const ListOfConstObjects &childList = chord->GetList(); ListOfConstObjects topNotes, bottomNotes; // split notes into two vectors - notes above vertical center and below diff --git a/src/castofffunctor.cpp b/src/castofffunctor.cpp index 934213323f9..7a9f887dc75 100644 --- a/src/castofffunctor.cpp +++ b/src/castofffunctor.cpp @@ -9,6 +9,7 @@ //---------------------------------------------------------------------------- +#include "div.h" #include "doc.h" #include "editorial.h" #include "ending.h" @@ -30,6 +31,23 @@ namespace vrv { // CastOffSystemsFunctor //---------------------------------------------------------------------------- +FunctorCode CastOffSystemsFunctor::VisitDiv(Div *div) +{ + // If we have a previous a Measure or a Div in the System, add a new one + if ((m_currentSystem->GetChildCount(MEASURE) > 0) || (m_currentSystem->GetChildCount(DIV)) > 0) { + m_currentSystem = new System(); + m_page->AddChild(m_currentSystem); + } + + div->MoveItselfTo(m_currentSystem); + + // Always add a System after an Div + m_currentSystem = new System(); + m_page->AddChild(m_currentSystem); + + return FUNCTOR_SIBLINGS; +} + CastOffSystemsFunctor::CastOffSystemsFunctor(Page *page, Doc *doc, bool smart) : DocFunctor(doc) { m_page = page; @@ -333,9 +351,9 @@ FunctorCode CastOffPagesFunctor::VisitSystem(System *system) } const int systemMaxPerPage = m_doc->GetOptions()->m_systemMaxPerPage.GetValue(); - const int childCount = m_currentPage->GetChildCount(); - if ((systemMaxPerPage && (systemMaxPerPage == childCount)) - || ((childCount > 0) && (system->GetDrawingYRel() - system->GetHeight() - currentShift < 0))) { + const int systemChildCount = m_currentPage->GetChildCount(SYSTEM); + if ((systemMaxPerPage && (systemMaxPerPage == systemChildCount)) + || ((systemChildCount > 0) && (system->GetDrawingYRel() - system->GetHeight() - currentShift < 0))) { // If this is the last system in the list, it doesn't fit the page and it's a leftover system (has just one // measure) => add the system content to the previous system Object *nextSystem = m_contentPage->GetNext(system, SYSTEM); @@ -385,6 +403,13 @@ CastOffEncodingFunctor::CastOffEncodingFunctor(Doc *doc, Page *currentPage, bool m_usePages = usePages; } +FunctorCode CastOffEncodingFunctor::VisitDiv(Div *div) +{ + div->MoveItselfTo(m_currentSystem); + + return FUNCTOR_SIBLINGS; +} + FunctorCode CastOffEncodingFunctor::VisitEditorialElement(EditorialElement *editorialElement) { // Only move editorial elements that are a child of the system @@ -458,7 +483,7 @@ FunctorCode CastOffEncodingFunctor::VisitSb(Sb *sb) // We look if the current system has at least one measure - if yes, we assume that the // is not the one at the beginning of the content (). This is not very robust but at least make it // work when rendering a that does not start with a or a (which we cannot enforce) - if (m_currentSystem->GetChildCount(MEASURE) > 0) { + if (m_currentSystem->GetChildCount(MEASURE) > 0 || m_currentSystem->GetChildCount(DIV) > 0) { m_currentPage->AddChild(m_currentSystem); m_currentSystem = new System(); } @@ -505,7 +530,7 @@ FunctorCode CastOffEncodingFunctor::VisitSystemElement(SystemElement *systemElem // UnCastOffFunctor //---------------------------------------------------------------------------- -UnCastOffFunctor::UnCastOffFunctor(Page *page) +UnCastOffFunctor::UnCastOffFunctor(Page *page) : Functor() { m_page = page; m_currentSystem = NULL; @@ -589,6 +614,13 @@ CastOffToSelectionFunctor::CastOffToSelectionFunctor( m_isSelection = false; } +FunctorCode CastOffToSelectionFunctor::VisitDiv(Div *div) +{ + div->MoveItselfTo(m_currentSystem); + + return FUNCTOR_SIBLINGS; +} + FunctorCode CastOffToSelectionFunctor::VisitEditorialElement(EditorialElement *editorialElement) { editorialElement->MoveItselfTo(m_currentSystem); diff --git a/src/chord.cpp b/src/chord.cpp index 7a8aab0305a..5fbd0c3aac5 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" @@ -72,6 +71,7 @@ Chord::Chord() , DrawingListInterface() , StemmedDrawingInterface() , DurationInterface() + , AttChordVis() , AttColor() , AttCue() , AttGraced() @@ -81,6 +81,7 @@ Chord::Chord() , AttVisibility() { this->RegisterInterface(DurationInterface::GetAttClasses(), DurationInterface::IsInterface()); + this->RegisterAttClass(ATT_CHORDVIS); this->RegisterAttClass(ATT_COLOR); this->RegisterAttClass(ATT_CUE); this->RegisterAttClass(ATT_GRACED); @@ -94,7 +95,7 @@ Chord::Chord() Chord::~Chord() { - ClearClusters(); + ClearNoteGroups(); } void Chord::Reset() @@ -103,6 +104,7 @@ void Chord::Reset() DrawingListInterface::Reset(); StemmedDrawingInterface::Reset(); DurationInterface::Reset(); + this->ResetChordVis(); this->ResetColor(); this->ResetCue(); this->ResetGraced(); @@ -111,32 +113,32 @@ void Chord::Reset() this->ResetTiePresent(); this->ResetVisibility(); - ClearClusters(); + ClearNoteGroups(); } -void Chord::ClearClusters() const +void Chord::ClearNoteGroups() const { - std::list::iterator iter; - for (iter = m_clusters.begin(); iter != m_clusters.end(); ++iter) { + std::list::iterator iter; + for (iter = m_noteGroups.begin(); iter != m_noteGroups.end(); ++iter) { for (std::vector::iterator clIter = (*iter)->begin(); clIter != (*iter)->end(); ++clIter) { - (*clIter)->SetCluster(NULL, 0); + (*clIter)->SetNoteGroup(NULL, 0); } delete *iter; } - m_clusters.clear(); + m_noteGroups.clear(); } -void Chord::CalculateClusters() +void Chord::CalculateNoteGroups() { - this->ClearClusters(); + this->ClearNoteGroups(); - const ListOfObjects &childList = this->GetList(this); + const ListOfObjects &childList = this->GetList(); ListOfObjects::const_iterator iter = childList.begin(); Note *curNote, *lastNote = vrv_cast(*iter); assert(lastNote); int lastPitch = lastNote->GetDiatonicPitch(); - ChordCluster *curCluster = NULL; + ChordNoteGroup *curGroup = NULL; ++iter; @@ -149,15 +151,15 @@ void Chord::CalculateClusters() const int curPitch = curNote->GetDiatonicPitch(); if ((curPitch - lastPitch < 2) && (curNote->GetCrossStaff(layer1) == lastNote->GetCrossStaff(layer2))) { - if (!lastNote->GetCluster()) { - curCluster = new ChordCluster(); - m_clusters.push_back(curCluster); - curCluster->push_back(lastNote); - lastNote->SetCluster(curCluster, (int)curCluster->size()); + if (!lastNote->GetNoteGroup()) { + curGroup = new ChordNoteGroup(); + m_noteGroups.push_back(curGroup); + curGroup->push_back(lastNote); + lastNote->SetNoteGroup(curGroup, (int)curGroup->size()); } - assert(curCluster); - curCluster->push_back(curNote); - curNote->SetCluster(curCluster, (int)curCluster->size()); + assert(curGroup); + curGroup->push_back(curNote); + curNote->SetNoteGroup(curGroup, (int)curGroup->size()); } lastNote = curNote; @@ -233,7 +235,7 @@ void Chord::FilterList(ListOfConstObjects &childList) const int Chord::PositionInChord(const Note *note) const { - const int size = this->GetListSize(this); + const int size = this->GetListSize(); int position = this->GetListIndex(note); assert(position != -1); // this is the middle (only if odd) @@ -245,21 +247,21 @@ int Chord::PositionInChord(const Note *note) const void Chord::GetYExtremes(int &yMax, int &yMin) const { // The first note is the bottom - yMin = this->GetListFront(this)->GetDrawingY(); + yMin = this->GetListFront()->GetDrawingY(); // The last note is the top - yMax = this->GetListBack(this)->GetDrawingY(); + yMax = this->GetListBack()->GetDrawingY(); } int Chord::GetYTop() const { // The last note is the top - return this->GetListBack(this)->GetDrawingY(); + return this->GetListBack()->GetDrawingY(); } int Chord::GetYBottom() const { // The first note is the bottom - return this->GetListFront(this)->GetDrawingY(); + return this->GetListFront()->GetDrawingY(); } Note *Chord::GetTopNote() @@ -269,7 +271,7 @@ Note *Chord::GetTopNote() const Note *Chord::GetTopNote() const { - const Note *topNote = vrv_cast(this->GetListBack(this)); + const Note *topNote = vrv_cast(this->GetListBack()); assert(topNote); return topNote; } @@ -282,35 +284,31 @@ Note *Chord::GetBottomNote() const Note *Chord::GetBottomNote() const { // The first note is the bottom - const Note *bottomNote = vrv_cast(this->GetListFront(this)); + const Note *bottomNote = vrv_cast(this->GetListFront()); assert(bottomNote); return bottomNote; } int Chord::GetXMin() const { - const ListOfConstObjects &childList = this->GetList(this); // make sure it's initialized + const ListOfConstObjects &childList = this->GetList(); // make sure it's initialized assert(childList.size() > 0); int x = -VRV_UNSET; - ListOfConstObjects::const_iterator iter = childList.begin(); - while (iter != childList.end()) { - if ((*iter)->GetDrawingX() < x) x = (*iter)->GetDrawingX(); - ++iter; + for (const Object *child : childList) { + x = std::min(child->GetDrawingX(), x); } return x; } int Chord::GetXMax() const { - const ListOfConstObjects &childList = this->GetList(this); // make sure it's initialized + const ListOfConstObjects &childList = this->GetList(); // make sure it's initialized assert(childList.size() > 0); int x = VRV_UNSET; - ListOfConstObjects::const_iterator iter = childList.begin(); - while (iter != childList.end()) { - if ((*iter)->GetDrawingX() > x) x = (*iter)->GetDrawingX(); - ++iter; + for (const Object *child : childList) { + x = std::max(child->GetDrawingX(), x); } return x; } @@ -406,7 +404,7 @@ bool Chord::IsVisible() const } // if the chord doesn't have it, see if all the children are invisible - const ListOfConstObjects ¬es = this->GetList(this); + const ListOfConstObjects ¬es = this->GetList(); for (const Object *object : notes) { const Note *note = vrv_cast(object); @@ -438,7 +436,7 @@ bool Chord::HasAdjacentNotesInStaff(const Staff *staff) const bool Chord::HasNoteWithDots() const { - const ListOfConstObjects ¬es = this->GetList(this); + const ListOfConstObjects ¬es = this->GetList(); return std::any_of(notes.cbegin(), notes.cend(), [](const Object *object) { const Note *note = vrv_cast(object); @@ -460,11 +458,11 @@ int Chord::AdjustOverlappingLayers(const Doc *doc, const std::vectorGetDrawingLoc()); } } - const ListOfObjects ¬es = this->GetList(this); + const ListOfObjects ¬es = this->GetList(); // get current chord positions std::set chordElementLocations; - for (const auto iter : notes) { - Note *note = vrv_cast(iter); + for (Object *child : notes) { + Note *note = vrv_cast(child); assert(note); chordElementLocations.insert(note->GetDrawingLoc()); } @@ -486,6 +484,9 @@ int Chord::AdjustOverlappingLayers(const Doc *doc, const std::vector= 0) && (overlap > margin)) || ((margin <= 0) && (overlap < margin))) { margin = overlap; } + else if ((margin < 0) && (m_noteGroups.size() > 0)) { + margin = overlap; + } if (isInUnison) ++actualElementsInUnison; } @@ -518,7 +519,7 @@ int Chord::AdjustOverlappingLayers(const Doc *doc, const std::vector Chord::GetAdjacentNotesList(const Staff *staff, int loc) const { - const ListOfConstObjects ¬es = this->GetList(this); + const ListOfConstObjects ¬es = this->GetList(); std::list adjacentNotes; for (const Object *obj : notes) { @@ -540,7 +541,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); } @@ -550,7 +551,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); } @@ -560,42 +561,9 @@ FunctorCode Chord::AcceptEnd(ConstFunctor &functor) const return functor.VisitChordEnd(this); } -int Chord::ConvertMarkupAnalytical(FunctorParams *functorParams) -{ - ConvertMarkupAnalyticalParams *params = vrv_params_cast(functorParams); - assert(params); - - assert(!params->m_currentChord); - params->m_currentChord = this; - - /****** fermata ******/ - - if (this->HasFermata()) { - Fermata *fermata = new Fermata(); - fermata->ConvertFromAnalyticalMarkup(this, this->GetID(), params); - } - - return FUNCTOR_CONTINUE; -} - -int Chord::ConvertMarkupAnalyticalEnd(FunctorParams *functorParams) -{ - ConvertMarkupAnalyticalParams *params = vrv_params_cast(functorParams); - assert(params); - - if (params->m_permanent) { - this->ResetTiePresent(); - } - - assert(params->m_currentChord); - params->m_currentChord = NULL; - - return FUNCTOR_CONTINUE; -} - MapOfNoteLocs Chord::CalcNoteLocations(NotePredicate predicate) const { - const ListOfConstObjects ¬es = this->GetList(this); + const ListOfConstObjects ¬es = this->GetList(); MapOfNoteLocs noteLocations; for (const Object *obj : notes) { @@ -628,56 +596,4 @@ 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); - 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/clef.cpp b/src/clef.cpp index b4d5abcdaf2..d14a60822dc 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" @@ -36,6 +35,8 @@ Clef::Clef() , AttClefLog() , AttClefShape() , AttColor() + , AttExtSymAuth() + , AttExtSymNames() , AttLineLoc() , AttOctave() , AttOctaveDisplacement() @@ -46,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); @@ -65,7 +67,8 @@ void Clef::Reset() this->ResetClefShape(); this->ResetColor(); this->ResetEnclosingChars(); - this->ResetExtSym(); + this->ResetExtSymAuth(); + this->ResetExtSymNames(); this->ResetLineLoc(); this->ResetOctave(); this->ResetOctaveDisplacement(); @@ -215,7 +218,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); } @@ -225,7 +228,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 695a33c642b..9891f5aaeb8 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" @@ -83,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); @@ -105,6 +104,17 @@ data_STAFFREL ControlElement::GetLayerPlace(data_STAFFREL defaultValue) const default: break; } + // For ornaments pointing to notes in a chord, make the top and bottom one placed above and below respectively + if ((stemDir == STEMDIRECTION_NONE) && start->Is(NOTE)) { + const Note *note = vrv_cast(start); + assert(note); + const Chord *chord = note->IsChordTone(); + if (chord) { + if (start == chord->GetTopNote()) value = STAFFREL_above; + if (start == chord->GetBottomNote()) value = STAFFREL_below; + } + } + return value; } @@ -112,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); } @@ -122,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/convertfunctor.cpp b/src/convertfunctor.cpp new file mode 100644 index 00000000000..fd83e367bd3 --- /dev/null +++ b/src/convertfunctor.cpp @@ -0,0 +1,747 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: convertfunctor.cpp +// Author: David Bauer +// Created: 2023 +// Copyright (c) Authors and others. All rights reserved. +///////////////////////////////////////////////////////////////////////////// + +#include "convertfunctor.h" + +//---------------------------------------------------------------------------- + +#include "div.h" +#include "doc.h" +#include "ending.h" +#include "fermata.h" +#include "layer.h" +#include "mdiv.h" +#include "mrest.h" +#include "page.h" +#include "rest.h" +#include "score.h" +#include "section.h" +#include "staff.h" +#include "syllable.h" +#include "system.h" +#include "tie.h" +#include "vrv.h" + +//---------------------------------------------------------------------------- + +namespace vrv { + +//---------------------------------------------------------------------------- +// ConvertToPageBasedFunctor +//---------------------------------------------------------------------------- + +ConvertToPageBasedFunctor::ConvertToPageBasedFunctor(Page *page) : Functor() +{ + m_currentSystem = NULL; + m_page = page; +} + +FunctorCode ConvertToPageBasedFunctor::VisitDiv(Div *div) +{ + assert(m_currentSystem); + div->MoveItselfTo(m_currentSystem); + + return FUNCTOR_CONTINUE; +} + +FunctorCode ConvertToPageBasedFunctor::VisitEditorialElement(EditorialElement *editorialElement) +{ + assert(m_currentSystem); + editorialElement->MoveItselfTo(m_currentSystem); + + return FUNCTOR_CONTINUE; +} + +FunctorCode ConvertToPageBasedFunctor::VisitEditorialElementEnd(EditorialElement *editorialElement) +{ + if (editorialElement->m_visibility == Visible) { + editorialElement->ConvertToPageBasedMilestone(editorialElement, m_currentSystem); + } + + return FUNCTOR_CONTINUE; +} + +FunctorCode ConvertToPageBasedFunctor::VisitEnding(Ending *ending) +{ + assert(m_currentSystem); + ending->MoveItselfTo(m_currentSystem); + + return FUNCTOR_CONTINUE; +} + +FunctorCode ConvertToPageBasedFunctor::VisitEndingEnd(Ending *ending) +{ + ending->ConvertToPageBasedMilestone(ending, m_currentSystem); + + return FUNCTOR_CONTINUE; +} + +FunctorCode ConvertToPageBasedFunctor::VisitMeasure(Measure *measure) +{ + // Move itself to the pageBasedSystem - do not process children + assert(m_currentSystem); + measure->MoveItselfTo(m_currentSystem); + + return FUNCTOR_SIBLINGS; +} + +FunctorCode ConvertToPageBasedFunctor::VisitMdiv(Mdiv *mdiv) +{ + mdiv->MoveItselfTo(m_page); + + return FUNCTOR_CONTINUE; +} + +FunctorCode ConvertToPageBasedFunctor::VisitMdivEnd(Mdiv *mdiv) +{ + if (mdiv->m_visibility == Visible) { + mdiv->ConvertToPageBasedMilestone(mdiv, m_page); + } + + return FUNCTOR_CONTINUE; +} + +FunctorCode ConvertToPageBasedFunctor::VisitScore(Score *score) +{ + assert(!m_currentSystem); + score->MoveItselfTo(m_page); + System *system = new System(); + m_currentSystem = system; + m_page->AddChild(system); + + return FUNCTOR_CONTINUE; +} + +FunctorCode ConvertToPageBasedFunctor::VisitScoreEnd(Score *score) +{ + score->ConvertToPageBasedMilestone(score, m_page); + m_currentSystem = NULL; + + return FUNCTOR_CONTINUE; +} + +FunctorCode ConvertToPageBasedFunctor::VisitScoreDef(ScoreDef *scoreDef) +{ + // Move itself to the pageBasedSystem - do not process children + assert(m_currentSystem); + scoreDef->MoveItselfTo(m_currentSystem); + + return FUNCTOR_SIBLINGS; +} + +FunctorCode ConvertToPageBasedFunctor::VisitSection(Section *section) +{ + assert(m_currentSystem); + section->MoveItselfTo(m_currentSystem); + + return FUNCTOR_CONTINUE; +} + +FunctorCode ConvertToPageBasedFunctor::VisitSectionEnd(Section *section) +{ + section->ConvertToPageBasedMilestone(section, m_currentSystem); + + return FUNCTOR_CONTINUE; +} + +FunctorCode ConvertToPageBasedFunctor::VisitSystemElement(SystemElement *systemElement) +{ + assert(m_currentSystem); + systemElement->MoveItselfTo(m_currentSystem); + + return FUNCTOR_CONTINUE; +} + +//---------------------------------------------------------------------------- +// ConvertToCastOffMensuralFunctor +//---------------------------------------------------------------------------- + +ConvertToCastOffMensuralFunctor::ConvertToCastOffMensuralFunctor( + Doc *doc, System *targetSystem, const IntTree *layerTree) + : DocFunctor(doc) +{ + m_contentLayer = NULL; + m_targetSystem = targetSystem; + m_targetSubSystem = NULL; + m_targetMeasure = NULL; + m_targetStaff = NULL; + m_targetLayer = NULL; + m_segmentIdx = 0; + m_segmentTotal = 0; + m_layerTree = layerTree; +} + +FunctorCode ConvertToCastOffMensuralFunctor::VisitBarLine(BarLine *barLine) +{ + assert(barLine->GetAlignment()); + assert(m_targetSubSystem); + assert(m_targetLayer); + + // If this is the last barline of the layer, we will just move it and do not create a new segment + bool isLast = (m_contentLayer->GetLast() == barLine); + Object *next = m_contentLayer->GetNext(barLine); + bool nextIsBarline = (next && next->Is(BARLINE)); + + // See if we create proper measures and what to do with the barLine + bool convertToMeasured = m_doc->GetOptions()->m_mensuralToMeasure.GetValue(); + + if (convertToMeasured) { + // barLine object will be deleted + m_targetMeasure->SetRight(barLine->GetForm()); + } + else { + barLine->MoveItselfTo(m_targetLayer); + } + + // Now we can return if this is the end barLine + if (isLast || nextIsBarline) return FUNCTOR_SIBLINGS; + + for (int staffN : m_staffNs) { + // The barline is missing in at least one of the staves - do not break here + if (!barLine->GetAlignment()->HasAlignmentReference(staffN)) { + // LogDebug("BarLine not on all staves %d %s", m_targetStaff->GetN(), barLine->GetClassName().c_str()); + return FUNCTOR_SIBLINGS; + } + } + + // Make a segment break + // First case: add a new measure segment (e.g., first pass) + if (m_targetSubSystem->GetChildCount() <= m_segmentIdx) { + m_targetMeasure = new Measure(convertToMeasured); + if (convertToMeasured) { + m_targetMeasure->SetN(StringFormat("%d", m_segmentTotal + 1 + m_segmentIdx)); + } + m_targetSubSystem->AddChild(m_targetMeasure); + // Add a staff with same attributes as in the previous segment + m_targetStaff = new Staff(*m_targetStaff); + m_targetStaff->ClearChildren(); + m_targetStaff->CloneReset(); + m_targetMeasure->AddChild(m_targetStaff); + // Add a layer also with the same attributes as in the previous segment + m_targetLayer = new Layer(*m_targetLayer); + m_targetLayer->ClearChildren(); + m_targetLayer->CloneReset(); + m_targetStaff->AddChild(m_targetLayer); + } + // Second case: retrieve the appropriate segment + else { + m_targetMeasure = dynamic_cast(m_targetSubSystem->GetChild(m_segmentIdx)); + // It must be there + assert(m_targetMeasure); + + // Look if we already have the staff (e.g., with more than one layer) + AttNIntegerComparison comparisonStaffN(STAFF, m_targetStaff->GetN()); + Staff *staff = vrv_cast(m_targetMeasure->FindDescendantByComparison(&comparisonStaffN)); + if (!staff) { + staff = new Staff(*m_targetStaff); + staff->ClearChildren(); + staff->CloneReset(); + m_targetMeasure->AddChild(staff); + } + m_targetStaff = staff; + + // Add a new layer as the new target + m_targetLayer = new Layer(*m_targetLayer); + m_targetLayer->ClearChildren(); + m_targetLayer->CloneReset(); + m_targetStaff->AddChild(m_targetLayer); + } + ++m_segmentIdx; + + return FUNCTOR_SIBLINGS; +} + +FunctorCode ConvertToCastOffMensuralFunctor::VisitLayer(Layer *layer) +{ + m_contentLayer = layer; + + m_targetLayer = new Layer(*layer); + m_targetLayer->ClearChildren(); + m_targetLayer->CloneReset(); + // Keep the xml:id of the layer in the first segment + m_targetLayer->SwapID(layer); + assert(m_targetStaff); + m_targetStaff->AddChild(m_targetLayer); + + return FUNCTOR_CONTINUE; +} + +FunctorCode ConvertToCastOffMensuralFunctor::VisitMeasure(Measure *measure) +{ + // We are processing by staff/layer from the call below - we obviously do not want to loop... + if (m_targetMeasure) { + return FUNCTOR_CONTINUE; + } + + bool convertToMeasured = m_doc->GetOptions()->m_mensuralToMeasure.GetValue(); + + assert(m_targetSystem); + assert(m_layerTree); + + // Create a temporary subsystem for receiving the measure segments + System targetSubSystem; + m_targetSubSystem = &targetSubSystem; + + // Create the first measure segment - problem: we are dropping the section element - we should create a score-based + // MEI file instead + Measure *targetMeasure = new Measure(convertToMeasured); + if (convertToMeasured) { + targetMeasure->SetN(StringFormat("%d", m_segmentTotal + 1)); + } + m_targetSubSystem->AddChild(targetMeasure); + + Filters filters; + Filters *previousFilters = this->SetFilters(&filters); + + // Now we can process by layer and move their content to (measure) segments + for (const auto &staves : m_layerTree->child) { + for (const auto &layers : staves.second.child) { + // Create ad comparison object for each type / @n + AttNIntegerComparison matchStaff(STAFF, staves.first); + AttNIntegerComparison matchLayer(LAYER, layers.first); + filters = { &matchStaff, &matchLayer }; + + m_segmentIdx = 1; + m_targetMeasure = targetMeasure; + + measure->Process(*this); + } + } + + this->SetFilters(previousFilters); + + m_targetMeasure = NULL; + m_targetSubSystem = NULL; + m_segmentTotal = targetSubSystem.GetChildCount(); + // Copy the measure segments to the final target segment + m_targetSystem->MoveChildrenFrom(&targetSubSystem); + + return FUNCTOR_SIBLINGS; +} + +FunctorCode ConvertToCastOffMensuralFunctor::VisitObject(Object *object) +{ + assert(object->GetParent()); + // We want to move only the children of the layer of any type (notes, editorial elements, etc) + if (object->GetParent()->Is(LAYER)) { + assert(m_targetLayer); + object->MoveItselfTo(m_targetLayer); + // Do not process children because we move the full sub-tree + return FUNCTOR_SIBLINGS; + } + + return FUNCTOR_CONTINUE; +} + +FunctorCode ConvertToCastOffMensuralFunctor::VisitScoreDef(ScoreDef *scoreDef) +{ + assert(m_targetSystem); + scoreDef->MoveItselfTo(m_targetSystem); + + return FUNCTOR_CONTINUE; +} + +FunctorCode ConvertToCastOffMensuralFunctor::VisitStaff(Staff *staff) +{ + m_targetStaff = new Staff(*staff); + m_targetStaff->ClearChildren(); + m_targetStaff->CloneReset(); + // Keep the xml:id of the staff in the first staff segment + m_targetStaff->SwapID(staff); + assert(m_targetMeasure); + m_targetMeasure->AddChild(m_targetStaff); + + return FUNCTOR_CONTINUE; +} + +FunctorCode ConvertToCastOffMensuralFunctor::VisitSyllable(Syllable *syllable) +{ + assert(m_targetSubSystem); + assert(m_targetLayer); + assert(syllable->GetParent()); + + // If this is the first syllable of the layer, we do not create a new segment + if (m_contentLayer->GetFirst() == syllable) { + syllable->MoveItselfTo(m_targetLayer); + return FUNCTOR_SIBLINGS; + } + // If the syllable is in editorial markup, do not create a new segment + if (!syllable->GetParent()->Is(LAYER)) return FUNCTOR_SIBLINGS; + + // Make a segment break + // First case: add a new measure segment (e.g., first pass) + if (m_targetSubSystem->GetChildCount() <= m_segmentIdx) { + m_targetMeasure = new Measure(false); + m_targetSubSystem->AddChild(m_targetMeasure); + // Add a staff with same attributes as in the previous segment + m_targetStaff = new Staff(*m_targetStaff); + m_targetStaff->ClearChildren(); + m_targetStaff->CloneReset(); + m_targetMeasure->AddChild(m_targetStaff); + // Add a layer also with the same attributes as in the previous segment + m_targetLayer = new Layer(*m_targetLayer); + m_targetLayer->ClearChildren(); + m_targetLayer->CloneReset(); + m_targetStaff->AddChild(m_targetLayer); + } + // Second case: retrieve the appropriate segment + else { + m_targetMeasure = dynamic_cast(m_targetSubSystem->GetChild(m_segmentIdx)); + // It must be there + assert(m_targetMeasure); + + // Look if we already have the staff (e.g., with more than one layer) + AttNIntegerComparison comparisonStaffN(STAFF, m_targetStaff->GetN()); + Staff *staff = vrv_cast(m_targetMeasure->FindDescendantByComparison(&comparisonStaffN)); + if (!staff) { + staff = new Staff(*m_targetStaff); + staff->ClearChildren(); + staff->CloneReset(); + m_targetMeasure->AddChild(staff); + } + m_targetStaff = staff; + + // Add a new layer as the new target + m_targetLayer = new Layer(*m_targetLayer); + m_targetLayer->ClearChildren(); + m_targetLayer->CloneReset(); + m_targetStaff->AddChild(m_targetLayer); + } + syllable->MoveItselfTo(m_targetLayer); + ++m_segmentIdx; + + return FUNCTOR_SIBLINGS; +} + +FunctorCode ConvertToCastOffMensuralFunctor::VisitSystemElement(SystemElement *systemElement) +{ + assert(m_targetSystem); + systemElement->MoveItselfTo(m_targetSystem); + + return FUNCTOR_CONTINUE; +} + +//---------------------------------------------------------------------------- +// ConvertToUnCastOffMensuralFunctor +//---------------------------------------------------------------------------- + +ConvertToUnCastOffMensuralFunctor::ConvertToUnCastOffMensuralFunctor() : Functor() +{ + this->ResetContent(); + m_trackSegmentsToDelete = true; +} + +void ConvertToUnCastOffMensuralFunctor::ResetContent() +{ + m_contentMeasure = NULL; + m_contentLayer = NULL; +} + +FunctorCode ConvertToUnCastOffMensuralFunctor::VisitLayer(Layer *layer) +{ + if (!m_contentLayer) { + m_contentLayer = layer; + } + else { + m_contentLayer->MoveChildrenFrom(layer); + } + + return FUNCTOR_SIBLINGS; +} + +FunctorCode ConvertToUnCastOffMensuralFunctor::VisitMeasure(Measure *measure) +{ + if (!m_contentMeasure) { + m_contentMeasure = measure; + } + else if (m_trackSegmentsToDelete) { + m_segmentsToDelete.push_back(measure); + } + + return FUNCTOR_CONTINUE; +} + +FunctorCode ConvertToUnCastOffMensuralFunctor::VisitSection(Section *section) +{ + this->ResetContent(); + + return FUNCTOR_CONTINUE; +} + +//---------------------------------------------------------------------------- +// ConvertMarkupAnalyticalFunctor +//---------------------------------------------------------------------------- + +ConvertMarkupAnalyticalFunctor::ConvertMarkupAnalyticalFunctor(bool permanent) : Functor() +{ + m_currentChord = NULL; + m_permanent = permanent; +} + +FunctorCode ConvertMarkupAnalyticalFunctor::VisitChord(Chord *chord) +{ + assert(!m_currentChord); + m_currentChord = chord; + + /****** fermata ******/ + + if (chord->HasFermata()) { + Fermata *fermata = new Fermata(); + this->ConvertToFermata(fermata, chord, chord->GetID()); + } + + return FUNCTOR_CONTINUE; +} + +FunctorCode ConvertMarkupAnalyticalFunctor::VisitChordEnd(Chord *chord) +{ + if (m_permanent) { + chord->ResetTiePresent(); + } + + assert(m_currentChord); + m_currentChord = NULL; + + return FUNCTOR_CONTINUE; +} + +FunctorCode ConvertMarkupAnalyticalFunctor::VisitMeasureEnd(Measure *measure) +{ + for (Object *object : m_controlEvents) { + measure->AddChild(object); + } + + m_controlEvents.clear(); + + return FUNCTOR_CONTINUE; +} + +FunctorCode ConvertMarkupAnalyticalFunctor::VisitMRest(MRest *mRest) +{ + if (mRest->HasFermata()) { + Fermata *fermata = new Fermata(); + this->ConvertToFermata(fermata, mRest, mRest->GetID()); + } + + return FUNCTOR_CONTINUE; +} + +FunctorCode ConvertMarkupAnalyticalFunctor::VisitNote(Note *note) +{ + /****** ties ******/ + + AttTiePresent *check = note; + // Use the parent chord if there is no @tie on the note + if (!note->HasTie() && m_currentChord) { + check = m_currentChord; + } + assert(check); + + std::vector::iterator iter = m_currentNotes.begin(); + while (iter != m_currentNotes.end()) { + // same octave and same pitch - this is the one! + if ((note->GetOct() == (*iter)->GetOct()) && (note->GetPname() == (*iter)->GetPname())) { + // right flag + if ((check->GetTie() == TIE_m) || (check->GetTie() == TIE_t)) { + Tie *tie = new Tie(); + if (!m_permanent) { + tie->IsAttribute(true); + } + tie->SetStartid("#" + (*iter)->GetID()); + tie->SetEndid("#" + note->GetID()); + m_controlEvents.push_back(tie); + } + else { + LogWarning("Expected @tie median or terminal in note '%s', skipping it", note->GetID().c_str()); + } + iter = m_currentNotes.erase(iter); + // we are done for this note + break; + } + ++iter; + } + + if ((check->GetTie() == TIE_m) || (check->GetTie() == TIE_i)) { + m_currentNotes.push_back(note); + } + + if (m_permanent) { + note->ResetTiePresent(); + } + + /****** fermata ******/ + + if (note->HasFermata()) { + Fermata *fermata = new Fermata(); + this->ConvertToFermata(fermata, note, note->GetID()); + } + + return FUNCTOR_CONTINUE; +} + +FunctorCode ConvertMarkupAnalyticalFunctor::VisitRest(Rest *rest) +{ + if (rest->HasFermata()) { + Fermata *fermata = new Fermata(); + this->ConvertToFermata(fermata, rest, rest->GetID()); + } + + return FUNCTOR_CONTINUE; +} + +void ConvertMarkupAnalyticalFunctor::ConvertToFermata( + Fermata *fermata, AttFermataPresent *fermataPresent, const std::string &id) +{ + fermata->SetPlace(Att::StaffrelBasicToStaffrel(fermataPresent->GetFermata())); + if (m_permanent) { + fermataPresent->ResetFermataPresent(); + } + else { + fermata->IsAttribute(true); + } + fermata->SetStartid("#" + id); + m_controlEvents.push_back(fermata); +} + +//---------------------------------------------------------------------------- +// ConvertMarkupArticFunctor +//---------------------------------------------------------------------------- + +ConvertMarkupArticFunctor::ConvertMarkupArticFunctor() : Functor() {} + +FunctorCode ConvertMarkupArticFunctor::VisitArtic(Artic *artic) +{ + if (artic->GetArtic().size() > 1) m_articsToConvert.emplace_back(artic); + + return FUNCTOR_CONTINUE; +} + +FunctorCode ConvertMarkupArticFunctor::VisitLayerEnd(Layer *layer) +{ + for (Artic *artic : m_articsToConvert) { + this->SplitMultival(artic); + } + m_articsToConvert.clear(); + + return FUNCTOR_CONTINUE; +} + +void ConvertMarkupArticFunctor::SplitMultival(Artic *artic) const +{ + Object *parent = artic->GetParent(); + assert(parent); + + std::vector articList = artic->GetArtic(); + if (articList.empty()) return; + + int idx = artic->GetIdx() + 1; + std::vector::iterator iter; + for (iter = articList.begin() + 1; iter != articList.end(); ++iter) { + Artic *articChild = new Artic(); + articChild->SetArtic({ *iter }); + articChild->AttColor::operator=(*artic); + articChild->AttEnclosingChars::operator=(*artic); + articChild->AttExtSymAuth::operator=(*artic); + articChild->AttExtSymNames::operator=(*artic); + articChild->AttPlacementRelEvent::operator=(*artic); + parent->InsertChild(articChild, idx); + ++idx; + } + + // Only keep the first value in the original element + artic->SetArtic({ articList.at(0) }); + + // Multiple valued attributes cannot be preserved as such + if (artic->IsAttribute()) { + artic->IsAttribute(false); + LogInfo("Multiple valued attribute @artic on '%s' permanently converted to elements", + parent->GetID().c_str()); + } +} + +//---------------------------------------------------------------------------- +// ConvertMarkupScoreDefFunctor +//---------------------------------------------------------------------------- + +ConvertMarkupScoreDefFunctor::ConvertMarkupScoreDefFunctor(Doc *doc) : DocFunctor(doc) +{ + m_currentScoreDef = NULL; +} + +FunctorCode ConvertMarkupScoreDefFunctor::VisitScore(Score *score) +{ + // Evaluate functor on scoreDef + score->GetScoreDef()->Process(*this); + + return FUNCTOR_CONTINUE; +} + +FunctorCode ConvertMarkupScoreDefFunctor::VisitScoreDefElement(ScoreDefElement *scoreDefElement) +{ + if (scoreDefElement->Is(SCOREDEF)) { + m_currentScoreDef = scoreDefElement; + return FUNCTOR_CONTINUE; + } + + // This should never be the case + if (!scoreDefElement->Is(STAFFDEF) || !m_currentScoreDef) return FUNCTOR_CONTINUE; + + // Copy score definition elements to the staffDef but only if they are not given at the staffDef + // This might require more refined merging because we can lose data if some staffDef values are defined + // but do not contain all the ones given in the scoreDef (e.g. @key.mode in scoreDef but not in a staffDef with + // @key.sig) + if (m_currentScoreDef->HasClefInfo() && !scoreDefElement->HasClefInfo()) { + scoreDefElement->AddChild(m_currentScoreDef->GetClefCopy()); + } + if (m_currentScoreDef->HasKeySigInfo() && !scoreDefElement->HasKeySigInfo()) { + scoreDefElement->AddChild(m_currentScoreDef->GetKeySigCopy()); + } + if (m_currentScoreDef->HasMeterSigGrpInfo() && !scoreDefElement->HasMeterSigGrpInfo()) { + scoreDefElement->AddChild(m_currentScoreDef->GetMeterSigGrpCopy()); + } + if (m_currentScoreDef->HasMeterSigInfo() && !scoreDefElement->HasMeterSigInfo()) { + scoreDefElement->AddChild(m_currentScoreDef->GetMeterSigCopy()); + } + if (m_currentScoreDef->HasMensurInfo() && !scoreDefElement->HasMensurInfo()) { + scoreDefElement->AddChild(m_currentScoreDef->GetMensurCopy()); + } + + return FUNCTOR_CONTINUE; +} + +FunctorCode ConvertMarkupScoreDefFunctor::VisitScoreDefElementEnd(ScoreDefElement *scoreDefElement) +{ + if (!scoreDefElement->Is(SCOREDEF)) return FUNCTOR_CONTINUE; + + // At the end of the scoreDef, remove all score definition elements + if (scoreDefElement->HasClefInfo()) { + Object *clef = scoreDefElement->FindDescendantByType(CLEF, 1); + if (clef) scoreDefElement->DeleteChild(clef); + } + if (scoreDefElement->HasKeySigInfo()) { + Object *keySig = scoreDefElement->FindDescendantByType(KEYSIG, 1); + if (keySig) scoreDefElement->DeleteChild(keySig); + } + if (scoreDefElement->HasMeterSigGrpInfo()) { + Object *meterSigGrp = scoreDefElement->FindDescendantByType(METERSIGGRP, 1); + if (meterSigGrp) scoreDefElement->DeleteChild(meterSigGrp); + } + if (scoreDefElement->HasMeterSigInfo()) { + Object *meterSig = scoreDefElement->FindDescendantByType(METERSIG, 1); + if (meterSig) scoreDefElement->DeleteChild(meterSig); + } + if (scoreDefElement->HasMensurInfo()) { + Object *mensur = scoreDefElement->FindDescendantByType(MENSUR, 1); + if (mensur) scoreDefElement->DeleteChild(mensur); + } + + m_currentScoreDef = NULL; + + return FUNCTOR_CONTINUE; +} + +} // namespace vrv diff --git a/src/course.cpp b/src/course.cpp index ed8726a2e4f..9c3255c7329 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 881c12e3e16..390205303e4 100644 --- a/src/custos.cpp +++ b/src/custos.cpp @@ -25,12 +25,19 @@ 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) @@ -87,7 +95,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 +105,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/devicecontext.cpp b/src/devicecontext.cpp index a67fc755d8b..c601d8d6e05 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/dir.cpp b/src/dir.cpp index ad374ca4c3f..7277e3e3918 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" @@ -81,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); } @@ -91,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/div.cpp b/src/div.cpp new file mode 100644 index 00000000000..271f875d1bb --- /dev/null +++ b/src/div.cpp @@ -0,0 +1,116 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: div.cpp +// Author: Laurent Pugin +// Created: 2023 +// Copyright (c) Authors and others. All rights reserved. +///////////////////////////////////////////////////////////////////////////// + +#include "div.h" + +//---------------------------------------------------------------------------- + +#include + +//---------------------------------------------------------------------------- + +#include "doc.h" +#include "functor.h" +#include "vrv.h" + +namespace vrv { + +//---------------------------------------------------------------------------- +// Div +//---------------------------------------------------------------------------- + +static const ClassRegistrar
s_factory("div", DIV); + +Div::Div() : TextLayoutElement(DIV, "div-") +{ + this->Reset(); +} + +Div::~Div() {} + +void Div::Reset() +{ + TextLayoutElement::Reset(); + + m_drawingInline = false; +} + +int Div::GetDrawingX() const +{ + const Object *parent = this->GetParent(); + assert(parent); + if (m_drawingInline && parent) { + return parent->GetDrawingX() + this->GetDrawingXRel(); + } + return parent->GetDrawingX(); +} + +int Div::GetDrawingY() const +{ + const Object *parent = this->GetParent(); + assert(parent); + if (m_drawingInline) { + return parent->GetDrawingY() + this->GetDrawingYRel(); + } + return parent->GetDrawingY(); +} + +void Div::SetDrawingXRel(int drawingXRel) +{ + m_drawingXRel = drawingXRel; +} + +void Div::SetDrawingYRel(int drawingYRel) +{ + m_drawingYRel = drawingYRel; +} + +int Div::GetTotalHeight(const Doc *doc) const +{ + assert(doc); + + int height = this->GetContentHeight(); + + return height; +} + +int Div::GetTotalWidth(const Doc *doc) const +{ + if (!m_drawingInline) { + return (doc->m_drawingPageContentWidth); + } + else { + int width = this->GetContentWidth(); + return width; + } +} + +//---------------------------------------------------------------------------- +// Functor methods +//---------------------------------------------------------------------------- + +FunctorCode Div::Accept(Functor &functor) +{ + return functor.VisitDiv(this); +} + +FunctorCode Div::Accept(ConstFunctor &functor) const +{ + return functor.VisitDiv(this); +} + +FunctorCode Div::AcceptEnd(Functor &functor) +{ + return functor.VisitDivEnd(this); +} + +FunctorCode Div::AcceptEnd(ConstFunctor &functor) const +{ + return functor.VisitDivEnd(this); +} + +} // namespace vrv diff --git a/src/divline.cpp b/src/divline.cpp new file mode 100644 index 00000000000..a47a3fd71f3 --- /dev/null +++ b/src/divline.cpp @@ -0,0 +1,88 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: divline.cpp +// Author: Yinan Zhou +// Created: 2021 +// Copyright (c) Authors and others. All rights reserved. +///////////////////////////////////////////////////////////////////////////// + +#include "divline.h" + +//---------------------------------------------------------------------------- + +#include + +//---------------------------------------------------------------------------- + +#include "doc.h" +#include "horizontalaligner.h" +#include "layer.h" +#include "smufl.h" +#include "staff.h" +#include "vrv.h" + +namespace vrv { + +//---------------------------------------------------------------------------- +// DivLine +//---------------------------------------------------------------------------- + +DivLine::DivLine() + : LayerElement(DIVLINE, "dline-") + , AttColor() + , AttDivLineLog() + , AttExtSymAuth() + , AttExtSymNames() + , AttNNumberLike() + , AttVisibility() +{ + this->RegisterAttClass(ATT_COLOR); + this->RegisterAttClass(ATT_DIVLINELOG); + this->RegisterAttClass(ATT_EXTSYMAUTH); + this->RegisterAttClass(ATT_EXTSYMNAMES); + this->RegisterAttClass(ATT_VISIBILITY); + + this->Reset(); +} + +DivLine::~DivLine() {} + +void DivLine::Reset() +{ + LayerElement::Reset(); + + this->ResetColor(); + this->ResetDivLineLog(); + this->ResetExtSymAuth(); + this->ResetExtSymNames(); + this->ResetVisibility(); +} + +std::wstring DivLine::GetSymbolStr() const +{ + if (!this->HasForm()) return L""; + + wchar_t symc = GetDivLineGlyph(this->GetForm()); + std::wstring symbolStr; + + symbolStr.push_back(symc); + + return symbolStr; +} + +wchar_t DivLine::GetDivLineGlyph(divLineLog_FORM divLine) +{ + int symc = SMUFL_E8F5_chantDivisioMaxima; + switch (divLine) { + case divLineLog_FORM_minima: symc = SMUFL_E8F3_chantDivisioMinima; break; + case divLineLog_FORM_maior: symc = SMUFL_E8F4_chantDivisioMaior; break; + case divLineLog_FORM_maxima: symc = SMUFL_E8F5_chantDivisioMaxima; break; + case divLineLog_FORM_finalis: symc = SMUFL_E8F6_chantDivisioFinalis; break; + case divLineLog_FORM_caesura: symc = SMUFL_E8F8_chantCaesura; break; + case divLineLog_FORM_virgula: symc = SMUFL_E8F7_chantVirgula; break; + default: break; + } + return symc; +} +DivLineAttr::~DivLineAttr() {} + +} // namespace vrv diff --git a/src/doc.cpp b/src/doc.cpp index e851b9b9344..0220bc69469 100644 --- a/src/doc.cpp +++ b/src/doc.cpp @@ -20,11 +20,11 @@ #include "castofffunctor.h" #include "chord.h" #include "comparison.h" +#include "convertfunctor.h" #include "docselection.h" #include "expansion.h" #include "featureextractor.h" #include "functor.h" -#include "functorparams.h" #include "glyph.h" #include "instrdef.h" #include "iomei.h" @@ -35,6 +35,8 @@ #include "measure.h" #include "mensur.h" #include "metersig.h" +#include "midifunctor.h" +#include "miscfunctor.h" #include "mnum.h" #include "mrest.h" #include "mrpt.h" @@ -45,9 +47,7 @@ #include "page.h" #include "pages.h" #include "pgfoot.h" -#include "pgfoot2.h" #include "pghead.h" -#include "pghead2.h" #include "preparedatafunctor.h" #include "resetfunctor.h" #include "runningelement.h" @@ -65,6 +65,7 @@ #include "text.h" #include "timemap.h" #include "timestamp.h" +#include "transposefunctor.h" #include "transposition.h" #include "verse.h" #include "vrv.h" @@ -124,13 +125,13 @@ void Doc::Reset() m_drawingPageMarginTop = 0; m_drawingPage = NULL; - m_currentScore = NULL; m_currentScoreDefDone = false; m_dataPreparationDone = false; m_timemapTempo = 0.0; m_markup = MARKUP_DEFAULT; m_isMensuralMusicOnly = false; m_isCastOff = false; + m_visibleScores.clear(); m_facsimile = NULL; @@ -190,7 +191,8 @@ bool Doc::GenerateDocumentScoreDef() return false; } - this->GetCurrentScoreDef()->Reset(); + ScoreDef *scoreDef = this->GetFirstScoreDef(); + scoreDef->Reset(); StaffGrp *staffGrp = new StaffGrp(); for (Object *object : staves) { Staff *staff = vrv_cast(object); @@ -201,53 +203,57 @@ bool Doc::GenerateDocumentScoreDef() if (!measure->IsMeasuredMusic()) staffDef->SetNotationtype(NOTATIONTYPE_mensural); staffGrp->AddChild(staffDef); } - this->GetCurrentScoreDef()->AddChild(staffGrp); + scoreDef->AddChild(staffGrp); LogInfo("ScoreDef generated"); return true; } -bool Doc::GenerateFooter() +void Doc::GenerateFooter() { - if (this->GetCurrentScoreDef()->FindDescendantByType(PGFOOT)) { - return false; - } - - PgFoot *pgFoot = new PgFoot(); - // We mark it as generated for not having it written in the output - pgFoot->IsGenerated(true); - pgFoot->LoadFooter(this); - pgFoot->SetType("autogenerated"); - this->GetCurrentScoreDef()->AddChild(pgFoot); + for (Score *score : this->GetVisibleScores()) { + ScoreDef *scoreDef = score->GetScoreDef(); + if (scoreDef->FindDescendantByType(PGFOOT)) continue; - PgFoot2 *pgFoot2 = new PgFoot2(); - pgFoot2->IsGenerated(true); - pgFoot2->LoadFooter(this); - pgFoot2->SetType("autogenerated"); - this->GetCurrentScoreDef()->AddChild(pgFoot2); + PgFoot *pgFoot = new PgFoot(); + pgFoot->SetFunc(PGFUNC_first); + // We mark it as generated for not having it written in the output + pgFoot->IsGenerated(true); + pgFoot->LoadFooter(this); + pgFoot->SetType("autogenerated"); + scoreDef->AddChild(pgFoot); - return true; + PgFoot *pgFoot2 = new PgFoot(); + pgFoot2->SetFunc(PGFUNC_all); + pgFoot2->IsGenerated(true); + pgFoot2->LoadFooter(this); + pgFoot2->SetType("autogenerated"); + scoreDef->AddChild(pgFoot2); + } } -bool Doc::GenerateHeader() +void Doc::GenerateHeader() { - if (this->GetCurrentScoreDef()->FindDescendantByType(PGHEAD)) return false; - - PgHead *pgHead = new PgHead(); - // We mark it as generated for not having it written in the output - pgHead->IsGenerated(true); - pgHead->GenerateFromMEIHeader(m_header); - pgHead->SetType("autogenerated"); - this->GetCurrentScoreDef()->AddChild(pgHead); + for (Score *score : this->GetVisibleScores()) { + ScoreDef *scoreDef = score->GetScoreDef(); + if (scoreDef->FindDescendantByType(PGHEAD)) continue; - PgHead2 *pgHead2 = new PgHead2(); - pgHead2->IsGenerated(true); - pgHead2->AddPageNum(HORIZONTALALIGNMENT_center, VERTICALALIGNMENT_top); - pgHead2->SetType("autogenerated"); - this->GetCurrentScoreDef()->AddChild(pgHead2); + PgHead *pgHead = new PgHead(); + pgHead->SetFunc(PGFUNC_first); + // We mark it as generated for not having it written in the output + pgHead->IsGenerated(true); + pgHead->GenerateFromMEIHeader(m_header); + pgHead->SetType("autogenerated"); + scoreDef->AddChild(pgHead); - return true; + PgHead *pgHead2 = new PgHead(); + pgHead2->SetFunc(PGFUNC_all); + pgHead2->IsGenerated(true); + pgHead2->AddPageNum(HORIZONTALALIGNMENT_center, VERTICALALIGNMENT_top); + pgHead2->SetType("autogenerated"); + scoreDef->AddChild(pgHead2); + } } void Doc::PrepareMeasureIndices() @@ -340,37 +346,34 @@ void Doc::CalculateTimemap() double tempo = MIDI_TEMPO; // Set tempo - if (this->GetCurrentScoreDef()->HasMidiBpm()) { - tempo = this->GetCurrentScoreDef()->GetMidiBpm(); + ScoreDef *scoreDef = this->GetFirstVisibleScore()->GetScoreDef(); + if (scoreDef->HasMidiBpm()) { + tempo = scoreDef->GetMidiBpm(); } - else if (this->GetCurrentScoreDef()->HasMm()) { - tempo = Tempo::CalcTempo(this->GetCurrentScoreDef()); + else if (scoreDef->HasMm()) { + tempo = Tempo::CalcTempo(scoreDef); } // 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 - 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); - this->Process(&initTimemapTies, NULL, NULL, NULL, UNLIMITED_DEPTH, BACKWARD); + InitTimemapTiesFunctor initTimemapTies; + initTimemapTies.SetDirection(BACKWARD); + this->Process(initTimemapTies); m_timemapTempo = m_options->m_midiTempoAdjustment.GetValue(); } void Doc::ExportMIDI(smf::MidiFile *midiFile) { - if (!this->HasTimemap()) { // generate MIDI timemap before progressing CalculateTimemap(); @@ -382,48 +385,42 @@ void Doc::ExportMIDI(smf::MidiFile *midiFile) double tempo = MIDI_TEMPO; // set MIDI tempo - if (this->GetCurrentScoreDef()->HasMidiBpm()) { - tempo = this->GetCurrentScoreDef()->GetMidiBpm(); + ScoreDef *scoreDef = this->GetFirstVisibleScore()->GetScoreDef(); + if (scoreDef->HasMidiBpm()) { + tempo = scoreDef->GetMidiBpm(); } - else if (this->GetCurrentScoreDef()->HasMm()) { - tempo = Tempo::CalcTempo(this->GetCurrentScoreDef()); + else if (scoreDef->HasMm()) { + tempo = Tempo::CalcTempo(scoreDef); } 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) - InitProcessingListsParams initProcessingListsParams; - // Alternate solution with StaffN_LayerN_VerseN_t (see also Verse::PrepareData) - // StaffN_LayerN_VerseN_t staffLayerVerseTree; - // params.push_back(&staffLayerVerseTree); + InitProcessingListsFunctor initProcessingLists; - // We first fill a tree of int with [staff/layer] and [staff/layer/verse] numbers (@n) to be process - Functor initProcessingLists(&Object::InitProcessingLists); - this->Process(&initProcessingLists, &initProcessingListsParams); + // We first fill a tree of int with [staff/layer] and [staff/layer/verse] numbers (@n) to be processed + this->Process(initProcessingLists); + const IntTree &layerTree = initProcessingLists.GetLayerTree(); // The tree is used to process each staff/layer/verse separately // For this, we use a array of AttNIntegerComparison that looks for each object if it is of the type // and with @n specified - IntTree_t::iterator staves; - IntTree_t::iterator layers; + IntTree_t::const_iterator staves; + IntTree_t::const_iterator layers; // Process notes and chords, rests, spaces layer by layer // track 0 (included by default) is reserved for meta messages common to all tracks int midiChannel = 0; int midiTrack = 1; Filters filters; - for (staves = initProcessingListsParams.m_layerTree.child.begin(); - staves != initProcessingListsParams.m_layerTree.child.end(); ++staves) { - - ScoreDef *currentScoreDef = this->GetCurrentScoreDef(); + for (staves = layerTree.child.begin(); staves != layerTree.child.end(); ++staves) { int transSemi = 0; - if (StaffDef *staffDef = currentScoreDef->GetStaffDef(staves->first)) { + if (StaffDef *staffDef = scoreDef->GetStaffDef(staves->first)) { // get the transposition (semi-tone) value for the staff if (staffDef->HasTransSemi()) transSemi = staffDef->GetTransSemi(); midiTrack = staffDef->GetN(); @@ -460,21 +457,21 @@ void Doc::ExportMIDI(smf::MidiFile *midiFile) label = vrv_cast