diff --git a/.github/workflows/ci_build.yml b/.github/workflows/ci_build.yml index ca515fa61ad..4d7384dd54d 100644 --- a/.github/workflows/ci_build.yml +++ b/.github/workflows/ci_build.yml @@ -78,7 +78,7 @@ jobs: compiler: g++ version: "10" - - os: ubuntu-20.04 + - os: ubuntu-22.04 compiler: g++ version: "11" @@ -106,7 +106,7 @@ jobs: compiler: xcode version: "15.3" - - os: macos-11 + - os: macos-latest compiler: g++ version: "12" diff --git a/.github/workflows/python-ci-wheel.yml b/.github/workflows/python-ci-wheel.yml index 1c0520f7069..2c337e47b39 100644 --- a/.github/workflows/python-ci-wheel.yml +++ b/.github/workflows/python-ci-wheel.yml @@ -61,17 +61,17 @@ jobs: steps: #===============================================# # Set up - - uses: actions/checkout@v4 + - uses: actions/checkout@0ad4b8fadaa221de15dcec353f45205ec38ea70b # v4.1.4 with: fetch-depth: 0 - - uses: nuget/setup-nuget@v1 + - uses: nuget/setup-nuget@a21f25cd3998bf370fde17e3f1b4c12c175172f9 # v2.0.0 if: always() && runner.os == 'Windows' with: nuget-version: "latest" - name: Set up Python ${{ matrix.python-version }} - uses: actions/setup-python@v5 + uses: actions/setup-python@82c7e631bb3cdc910f68e0081d67478d79c6982d # v5.1.0 with: python-version: ${{ matrix.python-version }} architecture: ${{ matrix.architecture }} @@ -96,7 +96,7 @@ jobs: #===============================================# # wheels - name: Build wheels - uses: pypa/cibuildwheel@v2.17.0 + uses: pypa/cibuildwheel@8d945475ac4b1aac4ae08b2fd27db9917158b6ce # v2.17.0 with: output-dir: wheelhouse env: @@ -146,7 +146,7 @@ jobs: #===============================================# # Upload artifacts - - uses: actions/upload-artifact@v3 + - uses: actions/upload-artifact@65462800fd760344b1a7b4382951275a0abb4808 # v4.3.3 with: name: cibuildwheel-${{ runner.os }}-python-${{ matrix.python-version }}-${{ matrix.architecture }} path: ./wheelhouse/*.whl @@ -161,12 +161,12 @@ jobs: steps: #===============================================# # Set up - - uses: actions/checkout@v4 + - uses: actions/checkout@0ad4b8fadaa221de15dcec353f45205ec38ea70b # v4.1.4 with: fetch-depth: 0 - name: Set up Python ${{ matrix.python-version }} - uses: actions/setup-python@v5 + uses: actions/setup-python@82c7e631bb3cdc910f68e0081d67478d79c6982d # v5.1.0 with: python-version: "3.9" @@ -222,7 +222,7 @@ jobs: #===============================================# # Upload artifact - - uses: actions/upload-artifact@v3 + - uses: actions/upload-artifact@65462800fd760344b1a7b4382951275a0abb4808 # v4.3.3 with: name: sdist-${{ runner.os }}-python-3.9 path: dist/*.tar.gz @@ -238,10 +238,10 @@ jobs: steps: #===============================================# # Set up - - uses: actions/checkout@v4 + - uses: actions/checkout@0ad4b8fadaa221de15dcec353f45205ec38ea70b # v4.1.4 - name: Set up Python 3.9 - uses: actions/setup-python@v5 + uses: actions/setup-python@82c7e631bb3cdc910f68e0081d67478d79c6982d # v5.1.0 with: python-version: "3.9" architecture: "x64" @@ -256,7 +256,7 @@ jobs: #===============================================# # Prepare artifacts - name: Download artifacts - uses: actions/download-artifact@v3 + uses: actions/download-artifact@65a9edc5881444af0b9093a5e628f2fe47ea3b2e # v4.1.7 with: path: bindings/python/artifacts/ diff --git a/.github/workflows/tests_build.yml b/.github/workflows/tests_build.yml index 042d65eaf72..a76db42cad0 100644 --- a/.github/workflows/tests_build.yml +++ b/.github/workflows/tests_build.yml @@ -35,7 +35,7 @@ jobs: runs-on: ubuntu-22.04 steps: - - uses: FranzDiebold/github-env-vars-action@v2.7.0 + - uses: FranzDiebold/github-env-vars-action@v2.8.0 - name: Get Short SHA run: | echo "SHORT_SHA=`echo ${{ github.event.pull_request.head.sha }} | cut -c1-7`" >> $GITHUB_ENV @@ -109,14 +109,14 @@ jobs: ls -al - name: Upload results as artefacts - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: name: test-suite-diff path: ${{ github.workspace }}/${{ env.OUTPUT_DIR }}/ - name: Check existence of the log.md file id: check_files - uses: andstor/file-existence-action@v2 + uses: andstor/file-existence-action@v3 with: files: "${{ github.workspace }}/${{ env.OUTPUT_DIR }}/log.md" diff --git a/CHANGELOG.md b/CHANGELOG.md index ef043a05f18..a40484c6bb9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,12 +1,22 @@ # Changelog +## [unreleased] +* Support (initial) for Volpiano input +* Support for neumatic notation oriscus and quilisma +* Support for neume layout without facsimile +* Support for numeral harmonics in MusicXML importer (@eNote-GmBH) + +## [4.2.1] - 2024-05-07 +* Fix GitHub actions (Python release only) + ## [4.2.0] - 2024-05-05 * Support for `fTrem@unitdur` (@eNote-GmbH) * Upgrade to C++20 * Update of the Midifile library +* Improved logging * Fix lyric position in MIDI output * Fix string formatting output with some locale configurations (@ammatwain) - + ## [4.1.0] - 2023-12-15 * Support for staves ordered by `scoreDef` * Support for `rend@letterspacing` and `syl@letterspacing` in MEI vu diff --git a/Verovio.xcodeproj/project.pbxproj b/Verovio.xcodeproj/project.pbxproj index 9d46f1aadd8..0f0b7a4035c 100644 --- a/Verovio.xcodeproj/project.pbxproj +++ b/Verovio.xcodeproj/project.pbxproj @@ -284,6 +284,12 @@ 4D4C26EE1EF7E75400681770 /* label.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4D4C26EC1EF7E75400681770 /* label.cpp */; }; 4D4C26EF1EF7E75400681770 /* label.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4D4C26EC1EF7E75400681770 /* label.cpp */; }; 4D4C26F01EF7E75E00681770 /* score.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4D95D4FB1D74551100B2B856 /* score.cpp */; }; + 4D4CDEA52C078FF9005621E9 /* adjustneumexfunctor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4D4CDEA42C078FF9005621E9 /* adjustneumexfunctor.cpp */; }; + 4D4CDEA72C079026005621E9 /* adjustneumexfunctor.h in Headers */ = {isa = PBXBuildFile; fileRef = 4D4CDEA62C079008005621E9 /* adjustneumexfunctor.h */; }; + 4D4CDEA82C079026005621E9 /* adjustneumexfunctor.h in Headers */ = {isa = PBXBuildFile; fileRef = 4D4CDEA62C079008005621E9 /* adjustneumexfunctor.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 4D4CDEA92C07902C005621E9 /* adjustneumexfunctor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4D4CDEA42C078FF9005621E9 /* adjustneumexfunctor.cpp */; }; + 4D4CDEAA2C07902E005621E9 /* adjustneumexfunctor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4D4CDEA42C078FF9005621E9 /* adjustneumexfunctor.cpp */; }; + 4D4CDEAB2C07902F005621E9 /* adjustneumexfunctor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4D4CDEA42C078FF9005621E9 /* adjustneumexfunctor.cpp */; }; 4D4FCD0A1F5455F10009C455 /* staffgrp.h in Headers */ = {isa = PBXBuildFile; fileRef = 4D4FCD091F5455F10009C455 /* staffgrp.h */; }; 4D4FCD0C1F5455FF0009C455 /* staffgrp.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4D4FCD0B1F5455FF0009C455 /* staffgrp.cpp */; }; 4D4FCD0D1F5455FF0009C455 /* staffgrp.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4D4FCD0B1F5455FF0009C455 /* staffgrp.cpp */; }; @@ -785,6 +791,12 @@ 4DCB7AA426D3C9600047F01D /* crc.h in Headers */ = {isa = PBXBuildFile; fileRef = 4DCB7AA226D3C9600047F01D /* crc.h */; settings = {ATTRIBUTES = (Public, ); }; }; 4DD11DC42240E78B00A405D8 /* c_wrapper.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4DD11DC22240E78B00A405D8 /* c_wrapper.cpp */; }; 4DD11DC52240E78B00A405D8 /* c_wrapper.h in Headers */ = {isa = PBXBuildFile; fileRef = 4DD11DC32240E78B00A405D8 /* c_wrapper.h */; }; + 4DD49C662BECC073006D1C2E /* adjustyrelfortranscriptionfunctor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4DD49C652BECC073006D1C2E /* adjustyrelfortranscriptionfunctor.cpp */; }; + 4DD49C682BECC096006D1C2E /* adjustyrelfortranscriptionfunctor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4DD49C652BECC073006D1C2E /* adjustyrelfortranscriptionfunctor.cpp */; }; + 4DD49C692BECC097006D1C2E /* adjustyrelfortranscriptionfunctor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4DD49C652BECC073006D1C2E /* adjustyrelfortranscriptionfunctor.cpp */; }; + 4DD49C6A2BECC098006D1C2E /* adjustyrelfortranscriptionfunctor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4DD49C652BECC073006D1C2E /* adjustyrelfortranscriptionfunctor.cpp */; }; + 4DD49C6B2BECC0A0006D1C2E /* adjustyrelfortranscriptionfunctor.h in Headers */ = {isa = PBXBuildFile; fileRef = 4DD49C672BECC083006D1C2E /* adjustyrelfortranscriptionfunctor.h */; }; + 4DD49C6C2BECC0A1006D1C2E /* adjustyrelfortranscriptionfunctor.h in Headers */ = {isa = PBXBuildFile; fileRef = 4DD49C672BECC083006D1C2E /* adjustyrelfortranscriptionfunctor.h */; settings = {ATTRIBUTES = (Public, ); }; }; 4DD7C0FC27A55CEA00B9C017 /* timemap.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4DD7C0FB27A55CEA00B9C017 /* timemap.cpp */; }; 4DD7C0FD27A55CEA00B9C017 /* timemap.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4DD7C0FB27A55CEA00B9C017 /* timemap.cpp */; }; 4DD7C0FF27A55CFD00B9C017 /* timemap.h in Headers */ = {isa = PBXBuildFile; fileRef = 4DD7C0FE27A55CFD00B9C017 /* timemap.h */; }; @@ -799,6 +811,12 @@ 4DDBBB5E1C7AE45900054AFF /* hairpin.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4DDBBB5A1C7AE45900054AFF /* hairpin.cpp */; }; 4DDBBCC51C2EBAE7001AB50A /* view_text.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4DDBBCC41C2EBAE7001AB50A /* view_text.cpp */; }; 4DDBBCC61C2EBAE7001AB50A /* view_text.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4DDBBCC41C2EBAE7001AB50A /* view_text.cpp */; }; + 4DE0198C2C495DB800B5B6BF /* iovolpiano.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4DE0198B2C495DB800B5B6BF /* iovolpiano.cpp */; }; + 4DE0198D2C495E6300B5B6BF /* iovolpiano.h in Headers */ = {isa = PBXBuildFile; fileRef = 4DE0198A2C495D1F00B5B6BF /* iovolpiano.h */; }; + 4DE0198E2C495E6500B5B6BF /* iovolpiano.h in Headers */ = {isa = PBXBuildFile; fileRef = 4DE0198A2C495D1F00B5B6BF /* iovolpiano.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 4DE0198F2C495E7400B5B6BF /* iovolpiano.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4DE0198B2C495DB800B5B6BF /* iovolpiano.cpp */; }; + 4DE019902C495E7600B5B6BF /* iovolpiano.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4DE0198B2C495DB800B5B6BF /* iovolpiano.cpp */; }; + 4DE019912C495E7700B5B6BF /* iovolpiano.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4DE0198B2C495DB800B5B6BF /* iovolpiano.cpp */; }; 4DE0B9A12988070C00D4C939 /* interface.h in Headers */ = {isa = PBXBuildFile; fileRef = 4DE0B9A02988070C00D4C939 /* interface.h */; }; 4DE0B9A22988070C00D4C939 /* interface.h in Headers */ = {isa = PBXBuildFile; fileRef = 4DE0B9A02988070C00D4C939 /* interface.h */; settings = {ATTRIBUTES = (Public, ); }; }; 4DE644F51EDBEA01002FBE6C /* breath.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4DE644F41EDBEA01002FBE6C /* breath.cpp */; }; @@ -1370,6 +1388,18 @@ BD87768627CE8A1A005B97EA /* layerdef.cpp in Sources */ = {isa = PBXBuildFile; fileRef = BD87768227CE8A11005B97EA /* layerdef.cpp */; }; BD87768727CE8A21005B97EA /* layerdef.h in Headers */ = {isa = PBXBuildFile; fileRef = BD87768127CE89FA005B97EA /* layerdef.h */; }; BD87768827CE8A21005B97EA /* layerdef.h in Headers */ = {isa = PBXBuildFile; fileRef = BD87768127CE89FA005B97EA /* layerdef.h */; }; + BD96F7CD2C04A708001CFF6F /* quilisma.cpp in Sources */ = {isa = PBXBuildFile; fileRef = BD96F7CB2C04A708001CFF6F /* quilisma.cpp */; }; + BD96F7D12C04B297001CFF6F /* oriscus.cpp in Sources */ = {isa = PBXBuildFile; fileRef = BD96F7D02C04B297001CFF6F /* oriscus.cpp */; }; + BD96F7D22C04B2B2001CFF6F /* quilisma.h in Headers */ = {isa = PBXBuildFile; fileRef = BD96F7CE2C04A76F001CFF6F /* quilisma.h */; }; + BD96F7D32C04B2B3001CFF6F /* quilisma.h in Headers */ = {isa = PBXBuildFile; fileRef = BD96F7CE2C04A76F001CFF6F /* quilisma.h */; }; + BD96F7D42C04B2B6001CFF6F /* quilisma.cpp in Sources */ = {isa = PBXBuildFile; fileRef = BD96F7CB2C04A708001CFF6F /* quilisma.cpp */; }; + BD96F7D52C04B2B6001CFF6F /* quilisma.cpp in Sources */ = {isa = PBXBuildFile; fileRef = BD96F7CB2C04A708001CFF6F /* quilisma.cpp */; }; + BD96F7D62C04B2B7001CFF6F /* quilisma.cpp in Sources */ = {isa = PBXBuildFile; fileRef = BD96F7CB2C04A708001CFF6F /* quilisma.cpp */; }; + BD96F7D72C04B2EE001CFF6F /* oriscus.cpp in Sources */ = {isa = PBXBuildFile; fileRef = BD96F7D02C04B297001CFF6F /* oriscus.cpp */; }; + BD96F7D82C04B2EE001CFF6F /* oriscus.cpp in Sources */ = {isa = PBXBuildFile; fileRef = BD96F7D02C04B297001CFF6F /* oriscus.cpp */; }; + BD96F7D92C04B2EF001CFF6F /* oriscus.cpp in Sources */ = {isa = PBXBuildFile; fileRef = BD96F7D02C04B297001CFF6F /* oriscus.cpp */; }; + BD96F7DA2C04B2F2001CFF6F /* oriscus.h in Headers */ = {isa = PBXBuildFile; fileRef = BD96F7CF2C04B26D001CFF6F /* oriscus.h */; }; + BD96F7DB2C04B2F2001CFF6F /* oriscus.h in Headers */ = {isa = PBXBuildFile; fileRef = BD96F7CF2C04B26D001CFF6F /* oriscus.h */; }; BDA81C21268B38760065B802 /* metersiggrp.h in Headers */ = {isa = PBXBuildFile; fileRef = BDA81C20268B386C0065B802 /* metersiggrp.h */; }; BDA81C22268B38770065B802 /* metersiggrp.h in Headers */ = {isa = PBXBuildFile; fileRef = BDA81C20268B386C0065B802 /* metersiggrp.h */; }; BDA81C24268B38A10065B802 /* metersiggrp.cpp in Sources */ = {isa = PBXBuildFile; fileRef = BDA81C23268B38A10065B802 /* metersiggrp.cpp */; }; @@ -1424,12 +1454,12 @@ E7265E7229DC700800D11F41 /* castofffunctor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E7265E7029DC700800D11F41 /* castofffunctor.cpp */; }; E7265E7329DC701000D11F41 /* castofffunctor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E7265E7029DC700800D11F41 /* castofffunctor.cpp */; }; E7265E7429DC701100D11F41 /* castofffunctor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E7265E7029DC700800D11F41 /* castofffunctor.cpp */; }; - E738715C29CAFA7700982DE5 /* calcligaturenoteposfunctor.h in Headers */ = {isa = PBXBuildFile; fileRef = E738715B29CAFA6700982DE5 /* calcligaturenoteposfunctor.h */; settings = {ATTRIBUTES = (Public, ); }; }; - E738715D29CAFA7800982DE5 /* calcligaturenoteposfunctor.h in Headers */ = {isa = PBXBuildFile; fileRef = E738715B29CAFA6700982DE5 /* calcligaturenoteposfunctor.h */; }; - E738715F29CAFA9500982DE5 /* calcligaturenoteposfunctor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E738715E29CAFA9500982DE5 /* calcligaturenoteposfunctor.cpp */; }; - 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 */; }; + E738715C29CAFA7700982DE5 /* calcligatureorneumeposfunctor.h in Headers */ = {isa = PBXBuildFile; fileRef = E738715B29CAFA6700982DE5 /* calcligatureorneumeposfunctor.h */; settings = {ATTRIBUTES = (Public, ); }; }; + E738715D29CAFA7800982DE5 /* calcligatureorneumeposfunctor.h in Headers */ = {isa = PBXBuildFile; fileRef = E738715B29CAFA6700982DE5 /* calcligatureorneumeposfunctor.h */; }; + E738715F29CAFA9500982DE5 /* calcligatureorneumeposfunctor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E738715E29CAFA9500982DE5 /* calcligatureorneumeposfunctor.cpp */; }; + E738716029CAFA9D00982DE5 /* calcligatureorneumeposfunctor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E738715E29CAFA9500982DE5 /* calcligatureorneumeposfunctor.cpp */; }; + E738716129CAFA9D00982DE5 /* calcligatureorneumeposfunctor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E738715E29CAFA9500982DE5 /* calcligatureorneumeposfunctor.cpp */; }; + E738716229CAFA9E00982DE5 /* calcligatureorneumeposfunctor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E738715E29CAFA9500982DE5 /* calcligatureorneumeposfunctor.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 */; }; @@ -1817,6 +1847,8 @@ 4D49924E2926B4DD007E3431 /* toolkitdef.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = toolkitdef.h; path = include/vrv/toolkitdef.h; sourceTree = ""; }; 4D4C26EB1EF7E73000681770 /* label.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = label.h; path = include/vrv/label.h; sourceTree = ""; }; 4D4C26EC1EF7E75400681770 /* label.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = label.cpp; path = src/label.cpp; sourceTree = ""; }; + 4D4CDEA42C078FF9005621E9 /* adjustneumexfunctor.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = adjustneumexfunctor.cpp; path = src/adjustneumexfunctor.cpp; sourceTree = ""; }; + 4D4CDEA62C079008005621E9 /* adjustneumexfunctor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = adjustneumexfunctor.h; path = include/vrv/adjustneumexfunctor.h; sourceTree = ""; }; 4D4FCD091F5455F10009C455 /* staffgrp.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = staffgrp.h; path = include/vrv/staffgrp.h; sourceTree = ""; }; 4D4FCD0B1F5455FF0009C455 /* staffgrp.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = staffgrp.cpp; path = src/staffgrp.cpp; sourceTree = ""; }; 4D4FCD0F1F5457020009C455 /* staffdef.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = staffdef.h; path = include/vrv/staffdef.h; sourceTree = ""; }; @@ -2016,6 +2048,8 @@ 4DCB7AA226D3C9600047F01D /* crc.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = crc.h; path = include/crc/crc.h; sourceTree = SOURCE_ROOT; }; 4DD11DC22240E78B00A405D8 /* c_wrapper.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = c_wrapper.cpp; path = tools/c_wrapper.cpp; sourceTree = ""; }; 4DD11DC32240E78B00A405D8 /* c_wrapper.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = c_wrapper.h; path = tools/c_wrapper.h; sourceTree = ""; }; + 4DD49C652BECC073006D1C2E /* adjustyrelfortranscriptionfunctor.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = adjustyrelfortranscriptionfunctor.cpp; path = src/adjustyrelfortranscriptionfunctor.cpp; sourceTree = ""; }; + 4DD49C672BECC083006D1C2E /* adjustyrelfortranscriptionfunctor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = adjustyrelfortranscriptionfunctor.h; path = include/vrv/adjustyrelfortranscriptionfunctor.h; sourceTree = ""; }; 4DD7C0FB27A55CEA00B9C017 /* timemap.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = timemap.cpp; path = src/timemap.cpp; sourceTree = ""; }; 4DD7C0FE27A55CFD00B9C017 /* timemap.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = timemap.h; path = include/vrv/timemap.h; sourceTree = ""; }; 4DDBBB551C7AE43E00054AFF /* hairpin.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = hairpin.h; path = include/vrv/hairpin.h; sourceTree = ""; }; @@ -2023,6 +2057,8 @@ 4DDBBB591C7AE45900054AFF /* dynam.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = dynam.cpp; path = src/dynam.cpp; sourceTree = ""; }; 4DDBBB5A1C7AE45900054AFF /* hairpin.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = hairpin.cpp; path = src/hairpin.cpp; sourceTree = ""; }; 4DDBBCC41C2EBAE7001AB50A /* view_text.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = view_text.cpp; path = src/view_text.cpp; sourceTree = ""; }; + 4DE0198A2C495D1F00B5B6BF /* iovolpiano.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = iovolpiano.h; path = include/vrv/iovolpiano.h; sourceTree = ""; }; + 4DE0198B2C495DB800B5B6BF /* iovolpiano.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = iovolpiano.cpp; path = src/iovolpiano.cpp; sourceTree = ""; }; 4DE0B9A02988070C00D4C939 /* interface.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = interface.h; path = include/vrv/interface.h; sourceTree = ""; }; 4DE644F31EDBE9F8002FBE6C /* breath.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = breath.h; path = include/vrv/breath.h; sourceTree = ""; }; 4DE644F41EDBEA01002FBE6C /* breath.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = breath.cpp; path = src/breath.cpp; sourceTree = ""; }; @@ -2173,6 +2209,10 @@ BD2E4D992875881B00B04350 /* stem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = stem.h; path = include/vrv/stem.h; sourceTree = ""; }; BD87768127CE89FA005B97EA /* layerdef.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = layerdef.h; path = include/vrv/layerdef.h; sourceTree = ""; }; BD87768227CE8A11005B97EA /* layerdef.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = layerdef.cpp; path = src/layerdef.cpp; sourceTree = ""; }; + BD96F7CB2C04A708001CFF6F /* quilisma.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = quilisma.cpp; path = src/quilisma.cpp; sourceTree = ""; }; + BD96F7CE2C04A76F001CFF6F /* quilisma.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = quilisma.h; path = include/vrv/quilisma.h; sourceTree = ""; }; + BD96F7CF2C04B26D001CFF6F /* oriscus.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = oriscus.h; path = include/vrv/oriscus.h; sourceTree = ""; }; + BD96F7D02C04B297001CFF6F /* oriscus.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = oriscus.cpp; path = src/oriscus.cpp; sourceTree = ""; }; BDA81C20268B386C0065B802 /* metersiggrp.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = metersiggrp.h; path = include/vrv/metersiggrp.h; sourceTree = ""; }; BDA81C23268B38A10065B802 /* metersiggrp.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = metersiggrp.cpp; path = src/metersiggrp.cpp; sourceTree = ""; }; BDC366C52576AF9300E4D826 /* grpsym.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = grpsym.cpp; path = src/grpsym.cpp; sourceTree = ""; }; @@ -2191,8 +2231,8 @@ E7231E0429B64B2D000A2BF3 /* adjustxoverflowfunctor.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = adjustxoverflowfunctor.cpp; path = src/adjustxoverflowfunctor.cpp; sourceTree = ""; }; E7265E6D29DC6FD200D11F41 /* castofffunctor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = castofffunctor.h; path = include/vrv/castofffunctor.h; sourceTree = ""; }; 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 = ""; }; + E738715B29CAFA6700982DE5 /* calcligatureorneumeposfunctor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = calcligatureorneumeposfunctor.h; path = include/vrv/calcligatureorneumeposfunctor.h; sourceTree = ""; }; + E738715E29CAFA9500982DE5 /* calcligatureorneumeposfunctor.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = calcligatureorneumeposfunctor.cpp; path = src/calcligatureorneumeposfunctor.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 = ""; }; @@ -2847,6 +2887,8 @@ 8F59291A18854BF800FE51AD /* iomusxml.h */, 8F086EC4188539540037FD8E /* iopae.cpp */, 8F59291B18854BF800FE51AD /* iopae.h */, + 4DE0198B2C495DB800B5B6BF /* iovolpiano.cpp */, + 4DE0198A2C495D1F00B5B6BF /* iovolpiano.h */, ); name = io; sourceTree = ""; @@ -2979,10 +3021,14 @@ 4D766EF420ACAD41006875D8 /* neume.h */, 8F086ECC188539540037FD8E /* note.cpp */, 8F59292318854BF800FE51AD /* note.h */, + BD96F7D02C04B297001CFF6F /* oriscus.cpp */, + BD96F7CF2C04B26D001CFF6F /* oriscus.h */, 4D674B45255F40B7008AEF4C /* plica.cpp */, 4D674B3E255F40AC008AEF4C /* plica.h */, 1579B3421B15033100B16F5C /* proport.cpp */, 1579B3411B15031D00B16F5C /* proport.h */, + BD96F7CB2C04A708001CFF6F /* quilisma.cpp */, + BD96F7CE2C04A76F001CFF6F /* quilisma.h */, 8F086ED1188539540037FD8E /* rest.cpp */, 8F59292818854BF800FE51AD /* rest.h */, 4DB3072E1AC9ED2500EE0982 /* space.cpp */, @@ -3076,6 +3122,8 @@ E7A1640829AF343F0099BD6A /* adjustharmgrpsspacingfunctor.h */, E7E1698529A898C700FFF482 /* adjustlayersfunctor.cpp */, E7E1698229A8987200FFF482 /* adjustlayersfunctor.h */, + 4D4CDEA42C078FF9005621E9 /* adjustneumexfunctor.cpp */, + 4D4CDEA62C079008005621E9 /* adjustneumexfunctor.h */, E7876F1729C07F16002147DC /* adjustsylspacingfunctor.cpp */, E7876F1429C07EE1002147DC /* adjustsylspacingfunctor.h */, E7E9C11C29B0EFB400CFCE2F /* adjusttempofunctor.cpp */, @@ -3088,6 +3136,8 @@ E7A3790929BB41CD00E3BA98 /* adjustxposfunctor.h */, E78F204929D98D2300CD5910 /* adjustxrelfortranscriptionfunctor.cpp */, E78F204629D98CD400CD5910 /* adjustxrelfortranscriptionfunctor.h */, + 4DD49C652BECC073006D1C2E /* adjustyrelfortranscriptionfunctor.cpp */, + 4DD49C672BECC083006D1C2E /* adjustyrelfortranscriptionfunctor.h */, E7ED8A6729C111C300735875 /* cachehorizontallayoutfunctor.cpp */, E7ED8A6429C1119000735875 /* cachehorizontallayoutfunctor.h */, E790165E298BCB27008FDB4E /* calcalignmentxposfunctor.cpp */, @@ -3100,8 +3150,8 @@ E788335C2994EC5100D44B01 /* calcchordnoteheadsfunctor.h */, E77C197F28CD318B00F5BADA /* calcdotsfunctor.cpp */, E77C197C28CD317B00F5BADA /* calcdotsfunctor.h */, - E738715E29CAFA9500982DE5 /* calcligaturenoteposfunctor.cpp */, - E738715B29CAFA6700982DE5 /* calcligaturenoteposfunctor.h */, + E738715E29CAFA9500982DE5 /* calcligatureorneumeposfunctor.cpp */, + E738715B29CAFA6700982DE5 /* calcligatureorneumeposfunctor.h */, E741AD01299A3D5B00854426 /* calcslurdirectionfunctor.cpp */, E741ACFE299A3D1D00854426 /* calcslurdirectionfunctor.h */, E7883367299500D600D44B01 /* calcspanningbeamspansfunctor.cpp */, @@ -3175,6 +3225,7 @@ 8F59293918854BF800FE51AD /* clef.h in Headers */, 4DA0EADB22BB77AF00A7EBEB /* editortoolkit_neume.h in Headers */, BD6E5C41290007CE0039B0F1 /* graphic.h in Headers */, + BD96F7DA2C04B2F2001CFF6F /* oriscus.h in Headers */, 4DB3D89A1F7C326800B5FC2B /* fb.h in Headers */, 4D1D733E1A1D08CD001E08F6 /* glyph.h in Headers */, E7908E9F298582090004C1F9 /* alignfunctor.h in Headers */, @@ -3240,6 +3291,7 @@ 4DACCA172990F2E600B55913 /* attdef.h in Headers */, 4DB3D8EC1F83D18300B5FC2B /* proport.h in Headers */, 4DEC4DDE21C8295700D1D273 /* lem.h in Headers */, + 4DD49C6B2BECC0A0006D1C2E /* adjustyrelfortranscriptionfunctor.h in Headers */, E778BDAE29D5BD3D00672D51 /* adjuststaffoverlapfunctor.h in Headers */, E7E9C11A29B0EF9600CFCE2F /* adjusttempofunctor.h in Headers */, 8F59294518854BF800FE51AD /* layerelement.h in Headers */, @@ -3256,7 +3308,7 @@ 8F59294818854BF800FE51AD /* mensur.h in Headers */, 4D79641D26C152400026288B /* pageelement.h in Headers */, 4DB3D8B81F83D0B100B5FC2B /* score.h in Headers */, - E738715D29CAFA7800982DE5 /* calcligaturenoteposfunctor.h in Headers */, + E738715D29CAFA7800982DE5 /* calcligatureorneumeposfunctor.h in Headers */, 4DA0EAD922BB77AF00A7EBEB /* facsimile.h in Headers */, 4DEC4DD721C8295700D1D273 /* reg.h in Headers */, 4DA1448D1C2AB29400CB7CEE /* textelement.h in Headers */, @@ -3296,11 +3348,13 @@ E7A1640A29AF344B0099BD6A /* adjustharmgrpsspacingfunctor.h in Headers */, E7770F8329D0D9F600A9BECF /* adjustslursfunctor.h in Headers */, 4DB3D8F11F83D1AA00B5FC2B /* fig.h in Headers */, + BD96F7D22C04B2B2001CFF6F /* quilisma.h in Headers */, 4DBDD67B2939E1D7009EC466 /* symboltable.h in Headers */, 4DACC9402990ED2600B55913 /* libmei.h in Headers */, 4D89F90C201771A700A4D336 /* num.h in Headers */, 4DA0EAE322BB77AF00A7EBEB /* surface.h in Headers */, 4DACC9E62990F29A00B55913 /* atttypes.h in Headers */, + 4D4CDEA72C079026005621E9 /* adjustneumexfunctor.h in Headers */, 4DB3D8FE1F83D20100B5FC2B /* horizontalaligner.h in Headers */, 4DB3D8F21F83D1B100B5FC2B /* svg.h in Headers */, 4DACC9DC2990F29A00B55913 /* atts_header.h in Headers */, @@ -3334,6 +3388,7 @@ 4DEC4DD821C8295700D1D273 /* unclear.h in Headers */, 4DDBBB581C7AE43E00054AFF /* dynam.h in Headers */, 8F59295118854BF800FE51AD /* slur.h in Headers */, + 4DE0198D2C495E6300B5B6BF /* iovolpiano.h in Headers */, E78833652995007700D44B01 /* calcspanningbeamspansfunctor.h in Headers */, E75EA9FA29CC3A6B003A97A7 /* calcarticfunctor.h in Headers */, 8F59295218854BF800FE51AD /* staff.h in Headers */, @@ -3479,6 +3534,7 @@ E790165A298BCA97008FDB4E /* calcalignmentxposfunctor.h in Headers */, BB4C4B9622A932E5001F6AF0 /* drawinginterface.h in Headers */, BB4C4B4022A932D7001F6AF0 /* barline.h in Headers */, + 4DD49C6C2BECC0A1006D1C2E /* adjustyrelfortranscriptionfunctor.h in Headers */, BB4C4B9E22A932E5001F6AF0 /* plistinterface.h in Headers */, 4DA0EADE22BB77AF00A7EBEB /* zone.h in Headers */, BB4C4A9122A9328F001F6AF0 /* boundingbox.h in Headers */, @@ -3487,6 +3543,7 @@ BB4C4B1422A932C8001F6AF0 /* section.h in Headers */, BB4C4B8022A932DF001F6AF0 /* fb.h in Headers */, BB4C4AF622A932BC001F6AF0 /* ref.h in Headers */, + BD96F7DB2C04B2F2001CFF6F /* oriscus.h in Headers */, BB4C4B6022A932D7001F6AF0 /* mrest.h in Headers */, 4D723AF525E8DB0B0062E0A2 /* zip_file.hpp in Headers */, E765675A28BBFBA400BC6490 /* functorinterface.h in Headers */, @@ -3501,6 +3558,7 @@ BB4C4B3822A932CF001F6AF0 /* trill.h in Headers */, BB4C4B6422A932D7001F6AF0 /* mrpt2.h in Headers */, E797C462298EC2E700CAD67E /* calcalignmentpitchposfunctor.h in Headers */, + 4D4CDEA82C079026005621E9 /* adjustneumexfunctor.h in Headers */, BB4C4B5222A932D7001F6AF0 /* ftrem.h in Headers */, E7E9C11329B0A1E200CFCE2F /* adjustaccidxfunctor.h in Headers */, 4D88AD0B289673F50006D7DA /* symbol.h in Headers */, @@ -3565,6 +3623,7 @@ BB4C4ABE22A932B6001F6AF0 /* label.h in Headers */, E71EF3C42975E4DC00D36264 /* resetfunctor.h in Headers */, 403B0515244F3E4D00EE4F71 /* gliss.h in Headers */, + 4DE0198E2C495E6500B5B6BF /* iovolpiano.h in Headers */, BB4C4B0A22A932C3001F6AF0 /* pghead.h in Headers */, 4DFB3E8B23ABDFDA00D688C7 /* pitchinflection.h in Headers */, E7C3AED729550190002DE5AB /* preparedatafunctor.h in Headers */, @@ -3598,6 +3657,7 @@ 4DFD83012A38399C00A3E20B /* repeatmark.h in Headers */, BB4C4B7622A932D7001F6AF0 /* syl.h in Headers */, E73E86262A069C640089DF74 /* transposefunctor.h in Headers */, + BD96F7D32C04B2B3001CFF6F /* quilisma.h in Headers */, BB4C4AEA22A932BC001F6AF0 /* del.h in Headers */, BB4C4B3422A932CF001F6AF0 /* tempo.h in Headers */, 4DACC9E12990F29A00B55913 /* attconverter.h in Headers */, @@ -3627,7 +3687,7 @@ BB4C4B4622A932D7001F6AF0 /* btrem.h in Headers */, BB4C4A8922A93225001F6AF0 /* c_wrapper.h in Headers */, 4DACC9BD2990F29A00B55913 /* atts_harmony.h in Headers */, - E738715C29CAFA7700982DE5 /* calcligaturenoteposfunctor.h in Headers */, + E738715C29CAFA7700982DE5 /* calcligatureorneumeposfunctor.h in Headers */, 4DACC9F32990F29A00B55913 /* atts_frettab.h in Headers */, E74A806728BC97D5005274E7 /* findfunctor.h in Headers */, 402492BE232E6FCB0017BB75 /* gracegrp.h in Headers */, @@ -3885,6 +3945,7 @@ 4D1693F61E3A44F300569BF4 /* barline.cpp in Sources */, E7901661298BCB2C008FDB4E /* calcalignmentxposfunctor.cpp in Sources */, 400FEDD6206FA74D000D3233 /* gracegrp.cpp in Sources */, + 4DE0198F2C495E7400B5B6BF /* iovolpiano.cpp in Sources */, 4D1AC9782B6A9BB200434023 /* filereader.cpp in Sources */, 4D89F90F201771AE00A4D336 /* num.cpp in Sources */, 4D1693F71E3A44F300569BF4 /* bboxdevicecontext.cpp in Sources */, @@ -3916,6 +3977,7 @@ 4D1694001E3A44F300569BF4 /* toolkit.cpp in Sources */, 4DACC99B2990F29A00B55913 /* atts_header.cpp in Sources */, 4DACC9A32990F29A00B55913 /* atts_cmnornaments.cpp in Sources */, + BD96F7D72C04B2EE001CFF6F /* oriscus.cpp in Sources */, 4DEC4D9F21C81E9400D1D273 /* orig.cpp in Sources */, E722106828F85981002CD6E9 /* findlayerelementsfunctor.cpp in Sources */, 4D1694011E3A44F300569BF4 /* MidiEvent.cpp in Sources */, @@ -3946,6 +4008,7 @@ 4DD7C10127A5650600B9C017 /* timemap.cpp in Sources */, 4D1694081E3A44F300569BF4 /* iopae.cpp in Sources */, E78833612994EC7C00D44B01 /* calcchordnoteheadsfunctor.cpp in Sources */, + 4D4CDEA92C07902C005621E9 /* adjustneumexfunctor.cpp in Sources */, 4D16940A1E3A44F300569BF4 /* fermata.cpp in Sources */, 4DB3D8981F7C325C00B5FC2B /* lb.cpp in Sources */, E7F39C6229A62B430055DBE0 /* adjustclefchangesfunctor.cpp in Sources */, @@ -4031,7 +4094,7 @@ E7A3790E29BB420300E3BA98 /* adjustxposfunctor.cpp in Sources */, E78F205329D9B04700CD5910 /* calcbboxoverflowsfunctor.cpp in Sources */, BDEF9EC826725234008A3A47 /* caesura.cpp in Sources */, - E738716029CAFA9D00982DE5 /* calcligaturenoteposfunctor.cpp in Sources */, + E738716029CAFA9D00982DE5 /* calcligatureorneumeposfunctor.cpp in Sources */, 4DACC9D92990F29A00B55913 /* atts_gestural.cpp in Sources */, 4D16942A1E3A44F300569BF4 /* octave.cpp in Sources */, 4D16942B1E3A44F300569BF4 /* slur.cpp in Sources */, @@ -4079,6 +4142,7 @@ 4D1694391E3A44F300569BF4 /* tuplet.cpp in Sources */, 4D72A5E0208A37F0009DEC1E /* mnum.cpp in Sources */, 4D4FCD0D1F5455FF0009C455 /* staffgrp.cpp in Sources */, + 4DD49C682BECC096006D1C2E /* adjustyrelfortranscriptionfunctor.cpp in Sources */, 4D16943A1E3A44F300569BF4 /* pugixml.cpp in Sources */, 403BEFF5206C00E900D022D5 /* multirest.cpp in Sources */, 4DA0EAEB22BB77C300A7EBEB /* editortoolkit_neume.cpp in Sources */, @@ -4086,6 +4150,7 @@ 4D3C3F0D294B89AF009993E6 /* ornam.cpp in Sources */, 4DACC9972990F29A00B55913 /* atts_facsimile.cpp in Sources */, E7231E0629B64B33000A2BF3 /* adjustxoverflowfunctor.cpp in Sources */, + BD96F7D42C04B2B6001CFF6F /* quilisma.cpp in Sources */, 4D16943C1E3A44F300569BF4 /* view_beam.cpp in Sources */, E7BCFFBA281298620012513D /* resources.cpp in Sources */, 40D45EC3204EEAFE009C1EC9 /* instrdef.cpp in Sources */, @@ -4210,7 +4275,7 @@ 40D0D5E21E3BD7FE00E6BF5C /* turn.cpp in Sources */, 40C2E41E2052A6E00003625F /* sb.cpp in Sources */, E79320672991453C00D80975 /* calcstemfunctor.cpp in Sources */, - E738715F29CAFA9500982DE5 /* calcligaturenoteposfunctor.cpp in Sources */, + E738715F29CAFA9500982DE5 /* calcligatureorneumeposfunctor.cpp in Sources */, 4D1BE76D1C688F5A0086DC0E /* MidiEvent.cpp in Sources */, E75EA9FD29CC3A88003A97A7 /* calcarticfunctor.cpp in Sources */, 35FDEBD124B6DC5B00AC1696 /* fing.cpp in Sources */, @@ -4255,6 +4320,7 @@ 4DACC9902990F29A00B55913 /* atts_critapp.cpp in Sources */, 406916DC23833770009E6B04 /* mspace.cpp in Sources */, E7A1640C29AF34750099BD6A /* adjustharmgrpsspacingfunctor.cpp in Sources */, + 4DE0198C2C495DB800B5B6BF /* iovolpiano.cpp in Sources */, 4D95D4F91D718D4A00B2B856 /* systemelement.cpp in Sources */, 4D1EB6A92A2A7C5100AF2F98 /* div.cpp in Sources */, 4DDBBB5B1C7AE45900054AFF /* dynam.cpp in Sources */, @@ -4290,6 +4356,7 @@ 4D5FA9111E16A93F00F3B919 /* boundingbox.cpp in Sources */, 8F086EF9188539540037FD8E /* object.cpp in Sources */, 4DD7C10227A5650600B9C017 /* timemap.cpp in Sources */, + 4D4CDEA52C078FF9005621E9 /* adjustneumexfunctor.cpp in Sources */, E797C460298EC2C600CAD67E /* calcalignmentpitchposfunctor.cpp in Sources */, 8F086EFA188539540037FD8E /* page.cpp in Sources */, 8F086EFB188539540037FD8E /* pitchinterface.cpp in Sources */, @@ -4341,6 +4408,7 @@ E778BDB129D5BD6000672D51 /* adjuststaffoverlapfunctor.cpp in Sources */, E7A03CD429D6176000C02941 /* adjusttupletsyfunctor.cpp in Sources */, 403BEFEE206C00B500D022D5 /* mrpt.cpp in Sources */, + 4DD49C662BECC073006D1C2E /* adjustyrelfortranscriptionfunctor.cpp in Sources */, 8F086F04188539540037FD8E /* tie.cpp in Sources */, 4D1BE7711C688F5A0086DC0E /* MidiFile.cpp in Sources */, 4D89F9122018A93300A4D336 /* svg.cpp in Sources */, @@ -4385,6 +4453,7 @@ 4DEC4D8221C804E000D1D273 /* app.cpp in Sources */, 4DB787632022F0B700394520 /* jsonxx.cc in Sources */, 4DACCA132990F2E600B55913 /* att.cpp in Sources */, + BD96F7CD2C04A708001CFF6F /* quilisma.cpp in Sources */, 4DEEDE641E617C930087E8BC /* elementpart.cpp in Sources */, 4D95D4F61D71866200B2B856 /* controlelement.cpp in Sources */, BDC366C72576AF9300E4D826 /* grpsym.cpp in Sources */, @@ -4405,6 +4474,7 @@ 4D1EB6A12A2A40B400AF2F98 /* textlayoutelement.cpp in Sources */, 4D09D3ED1EA8AD8500A420E6 /* horizontalaligner.cpp in Sources */, 4DEC4DA221C81EB300D1D273 /* rdg.cpp in Sources */, + BD96F7D12C04B297001CFF6F /* oriscus.cpp in Sources */, 4D9A9C19199F561200028D93 /* verse.cpp in Sources */, E76046C328D496B400C36204 /* calcledgerlinesfunctor.cpp in Sources */, E76A9D4A29A74E4B0044682D /* adjustdotsfunctor.cpp in Sources */, @@ -4452,6 +4522,7 @@ 4DB3D8F01F83D1A700B5FC2B /* fig.cpp in Sources */, E790165F298BCB27008FDB4E /* calcalignmentxposfunctor.cpp in Sources */, 8F3DD36718854B410051330C /* verticalaligner.cpp in Sources */, + 4DE019902C495E7600B5B6BF /* iovolpiano.cpp in Sources */, 4D1AC9792B6A9BB200434023 /* filereader.cpp in Sources */, 4D766F0220ACAD6E006875D8 /* nc.cpp in Sources */, 4DEC4D9821C81E3B00D1D273 /* expan.cpp in Sources */, @@ -4483,6 +4554,7 @@ 8F3DD36018854B390051330C /* view_beam.cpp in Sources */, 4DACC99C2990F29A00B55913 /* atts_header.cpp in Sources */, 4DACC9A42990F29A00B55913 /* atts_cmnornaments.cpp in Sources */, + BD96F7D82C04B2EE001CFF6F /* oriscus.cpp in Sources */, 8F3DD36218854B390051330C /* view_element.cpp in Sources */, 4DB3D8E11F83D15900B5FC2B /* chord.cpp in Sources */, 40C2E4252052A6FA0003625F /* sb.cpp in Sources */, @@ -4513,6 +4585,7 @@ 403BEFF9206C00FF00D022D5 /* beatrpt.cpp in Sources */, E74A806928BC9843005274E7 /* functorinterface.cpp in Sources */, 4DD7C0FC27A55CEA00B9C017 /* timemap.cpp in Sources */, + 4D4CDEAA2C07902E005621E9 /* adjustneumexfunctor.cpp in Sources */, E78833622994EC7D00D44B01 /* calcchordnoteheadsfunctor.cpp in Sources */, 8F3DD33C18854B2E0051330C /* barline.cpp in Sources */, 4DB3D8D51F83D12B00B5FC2B /* tempo.cpp in Sources */, @@ -4599,7 +4672,7 @@ E7A3790F29BB420400E3BA98 /* adjustxposfunctor.cpp in Sources */, E78F205429D9B04800CD5910 /* calcbboxoverflowsfunctor.cpp in Sources */, 8F3DD35A18854B2E0051330C /* tuplet.cpp in Sources */, - E738716129CAFA9D00982DE5 /* calcligaturenoteposfunctor.cpp in Sources */, + E738716129CAFA9D00982DE5 /* calcligatureorneumeposfunctor.cpp in Sources */, 4DACC9DA2990F29A00B55913 /* atts_gestural.cpp in Sources */, 4DBDD6742939E1BD009EC466 /* symboldef.cpp in Sources */, BDEF9EC926725234008A3A47 /* caesura.cpp in Sources */, @@ -4646,6 +4719,7 @@ 4DACC9BA2990F29A00B55913 /* atts_frettab.cpp in Sources */, 8F3DD32618854B090051330C /* iodarms.cpp in Sources */, 8F3DD32818854B090051330C /* iomei.cpp in Sources */, + 4DD49C6A2BECC098006D1C2E /* adjustyrelfortranscriptionfunctor.cpp in Sources */, 8F3DD32A18854B090051330C /* iomusxml.cpp in Sources */, 40E1CEDF205060FD0007C8AF /* labelabbr.cpp in Sources */, 4DEC4DA821C81ED400D1D273 /* reg.cpp in Sources */, @@ -4653,6 +4727,7 @@ 4DA0EAEC22BB77C300A7EBEB /* editortoolkit_neume.cpp in Sources */, 8F3DD31E18854AFB0051330C /* bboxdevicecontext.cpp in Sources */, 4DACC9982990F29A00B55913 /* atts_facsimile.cpp in Sources */, + BD96F7D52C04B2B6001CFF6F /* quilisma.cpp in Sources */, E7231E0729B64B33000A2BF3 /* adjustxoverflowfunctor.cpp in Sources */, 4DB3D8F31F83D1C600B5FC2B /* scoredefinterface.cpp in Sources */, 4D2461DD246BE2E8002BBCCD /* expansionmap.cpp in Sources */, @@ -4736,6 +4811,7 @@ BB4C4B9322A932E5001F6AF0 /* areaposinterface.cpp in Sources */, E7901660298BCB27008FDB4E /* calcalignmentxposfunctor.cpp in Sources */, BB4C4AA122A9328F001F6AF0 /* verticalaligner.cpp in Sources */, + 4DE019912C495E7700B5B6BF /* iovolpiano.cpp in Sources */, 4D1AC97A2B6A9BB200434023 /* filereader.cpp in Sources */, BB4C4B2F22A932CF001F6AF0 /* pedal.cpp in Sources */, 4D2E759222BC2B80004C51F0 /* tuning.cpp in Sources */, @@ -4767,6 +4843,7 @@ BB4C4BBC22A932FC001F6AF0 /* MidiEventList.cpp in Sources */, 4DACC99D2990F29A00B55913 /* atts_header.cpp in Sources */, 4DACC9A52990F29A00B55913 /* atts_cmnornaments.cpp in Sources */, + BD96F7D92C04B2EF001CFF6F /* oriscus.cpp in Sources */, BB4C4B9122A932DF001F6AF0 /* textelement.cpp in Sources */, BB4C4B0922A932C3001F6AF0 /* pghead.cpp in Sources */, E722106728F856C4002CD6E9 /* findlayerelementsfunctor.cpp in Sources */, @@ -4797,6 +4874,7 @@ E78833632994EC7E00D44B01 /* calcchordnoteheadsfunctor.cpp in Sources */, BB4C4B2322A932CF001F6AF0 /* dynam.cpp in Sources */, BB4C4B6522A932D7001F6AF0 /* multirest.cpp in Sources */, + 4D4CDEAB2C07902F005621E9 /* adjustneumexfunctor.cpp in Sources */, BB4C4AB322A932A6001F6AF0 /* iohumdrum.cpp in Sources */, E7F39C6429A62B440055DBE0 /* adjustclefchangesfunctor.cpp in Sources */, E793206A2991454100D80975 /* calcstemfunctor.cpp in Sources */, @@ -4883,7 +4961,7 @@ E7A3791029BB420400E3BA98 /* adjustxposfunctor.cpp in Sources */, E78F205529D9B04A00CD5910 /* calcbboxoverflowsfunctor.cpp in Sources */, 4DACC9DB2990F29A00B55913 /* atts_gestural.cpp in Sources */, - E738716229CAFA9E00982DE5 /* calcligaturenoteposfunctor.cpp in Sources */, + E738716229CAFA9E00982DE5 /* calcligatureorneumeposfunctor.cpp in Sources */, BB4C4AC722A932B6001F6AF0 /* page.cpp in Sources */, BB4C4AE322A932BC001F6AF0 /* choice.cpp in Sources */, BB4C4B7722A932D7001F6AF0 /* syllable.cpp in Sources */, @@ -4930,6 +5008,7 @@ 4DA0EAED22BB77C300A7EBEB /* editortoolkit_neume.cpp in Sources */, BB4C4B3722A932CF001F6AF0 /* trill.cpp in Sources */, BB4C4B1F22A932CF001F6AF0 /* breath.cpp in Sources */, + 4DD49C692BECC097006D1C2E /* adjustyrelfortranscriptionfunctor.cpp in Sources */, BB4C4AC522A932B6001F6AF0 /* measure.cpp in Sources */, 4D2461DE246BE2E9002BBCCD /* expansionmap.cpp in Sources */, E7BCFFB6281297980012513D /* resources.cpp in Sources */, @@ -4937,6 +5016,7 @@ 4DACC9992990F29A00B55913 /* atts_facsimile.cpp in Sources */, BB4C4AB922A932A6001F6AF0 /* iopae.cpp in Sources */, E7231E0829B64B34000A2BF3 /* adjustxoverflowfunctor.cpp in Sources */, + BD96F7D62C04B2B7001CFF6F /* quilisma.cpp in Sources */, BB4C4ABB22A932B6001F6AF0 /* instrdef.cpp in Sources */, BB4C4AB722A932A6001F6AF0 /* iomusxml.cpp in Sources */, 4DACC9EF2990F29A00B55913 /* atts_shared.cpp in Sources */, @@ -5156,7 +5236,7 @@ "$(inherited)", NO_HUMDRUM_SUPPORT, ); - MACOSX_DEPLOYMENT_TARGET = ""; + MACOSX_DEPLOYMENT_TARGET = 10.15; PRODUCT_NAME = "$(TARGET_NAME)"; USER_HEADER_SEARCH_PATHS = ""; }; @@ -5168,7 +5248,7 @@ CODE_SIGN_IDENTITY = "-"; DEAD_CODE_STRIPPING = YES; GCC_PREPROCESSOR_DEFINITIONS = NO_HUMDRUM_SUPPORT; - MACOSX_DEPLOYMENT_TARGET = ""; + MACOSX_DEPLOYMENT_TARGET = 10.15; PRODUCT_NAME = "$(TARGET_NAME)"; USER_HEADER_SEARCH_PATHS = ""; }; diff --git a/bindings/iOS/all.h b/bindings/iOS/all.h index 98dc337773b..d12641f6d4f 100644 --- a/bindings/iOS/all.h +++ b/bindings/iOS/all.h @@ -54,7 +54,7 @@ #import #import #import -#import +#import #import #import #import diff --git a/bindings/python/.pypi-version b/bindings/python/.pypi-version index 84066c019f4..76d263aca3f 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 -4.2.0 +4.3.0 diff --git a/cmake/CMakeLists.txt b/cmake/CMakeLists.txt index 5d2b688547a..5c6927714f9 100644 --- a/cmake/CMakeLists.txt +++ b/cmake/CMakeLists.txt @@ -57,6 +57,10 @@ else() add_definitions(-DDEBUG) endif() + if(WIN32) + include_directories(../include/win32) + endif() + # jsonxx raises -Wdollar-in-identifier-extension # gcc 8.3.1 does not like -Wdollar-in-identifier-extension option. add_definitions(-Wall -W -pedantic -Wno-unused-parameter -Wno-dollar-in-identifier-extension) diff --git a/data/Bravura.css b/data/Bravura.css index 135c1441c3e..0afc9c3dd89 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 bc11153a139..33d466382f7 100644 --- a/data/Bravura.xml +++ b/data/Bravura.xml @@ -555,6 +555,12 @@ + + + + + + @@ -679,6 +685,10 @@ + + + + @@ -712,6 +722,7 @@ + @@ -745,6 +756,7 @@ + @@ -1005,6 +1017,7 @@ + diff --git a/data/Bravura/E594.xml b/data/Bravura/E594.xml new file mode 100644 index 00000000000..781a4ce3b8c --- /dev/null +++ b/data/Bravura/E594.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/data/Bravura/E595.xml b/data/Bravura/E595.xml new file mode 100644 index 00000000000..67a20bd50fb --- /dev/null +++ b/data/Bravura/E595.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/data/Bravura/E926.xml b/data/Bravura/E926.xml new file mode 100644 index 00000000000..4532bcd1f28 --- /dev/null +++ b/data/Bravura/E926.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/data/Bravura/E927.xml b/data/Bravura/E927.xml new file mode 100644 index 00000000000..b521b202e77 --- /dev/null +++ b/data/Bravura/E927.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/data/Bravura/E928.xml b/data/Bravura/E928.xml new file mode 100644 index 00000000000..5c744354c35 --- /dev/null +++ b/data/Bravura/E928.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/data/Bravura/E929.xml b/data/Bravura/E929.xml new file mode 100644 index 00000000000..89acc08fe34 --- /dev/null +++ b/data/Bravura/E929.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/data/Bravura/E9A1.xml b/data/Bravura/E9A1.xml new file mode 100644 index 00000000000..4c6e9ae0776 --- /dev/null +++ b/data/Bravura/E9A1.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/data/Bravura/EA2A.xml b/data/Bravura/EA2A.xml new file mode 100644 index 00000000000..a91a6b22a15 --- /dev/null +++ b/data/Bravura/EA2A.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/data/Bravura/F43D.xml b/data/Bravura/F43D.xml new file mode 100644 index 00000000000..cf48fabb3da --- /dev/null +++ b/data/Bravura/F43D.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/data/Gootville.css b/data/Gootville.css index c40a0ed2167..75589fdcf41 100644 --- a/data/Gootville.css +++ b/data/Gootville.css @@ -1,6 +1,6 @@ @font-face { font-family: 'Gootville'; - src: url(data:application/font-woff2;charset=utf-8;base64,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) format('woff2'); + src: url(data:application/font-woff2;charset=utf-8;base64,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) format('woff2'); font-weight: normal; font-style: normal; } \ No newline at end of file diff --git a/data/Gootville.xml b/data/Gootville.xml index c248f04a4be..c6c16d27491 100644 --- a/data/Gootville.xml +++ b/data/Gootville.xml @@ -395,6 +395,9 @@ + + + diff --git a/data/Gootville/E594.xml b/data/Gootville/E594.xml new file mode 100644 index 00000000000..40ff514785c --- /dev/null +++ b/data/Gootville/E594.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/data/Leipzig.css b/data/Leipzig.css index ddea8607924..ae82764419c 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 31e33ecb8ae..4e89800f449 100644 --- a/data/Leipzig.xml +++ b/data/Leipzig.xml @@ -156,8 +156,14 @@ - - + + + + + + + + @@ -452,6 +458,7 @@ + @@ -703,6 +710,7 @@ + @@ -799,4 +807,15 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/data/Leipzig/E594.xml b/data/Leipzig/E594.xml new file mode 100644 index 00000000000..772e3064954 --- /dev/null +++ b/data/Leipzig/E594.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/data/Leipzig/E595.xml b/data/Leipzig/E595.xml new file mode 100644 index 00000000000..b83c699b59f --- /dev/null +++ b/data/Leipzig/E595.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/data/Leipzig/E926.xml b/data/Leipzig/E926.xml new file mode 100644 index 00000000000..8733b17664e --- /dev/null +++ b/data/Leipzig/E926.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/data/Leipzig/E927.xml b/data/Leipzig/E927.xml new file mode 100644 index 00000000000..2e265353c80 --- /dev/null +++ b/data/Leipzig/E927.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/data/Leipzig/E928.xml b/data/Leipzig/E928.xml new file mode 100644 index 00000000000..35043f0b21d --- /dev/null +++ b/data/Leipzig/E928.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/data/Leipzig/E929.xml b/data/Leipzig/E929.xml new file mode 100644 index 00000000000..f029f8c868b --- /dev/null +++ b/data/Leipzig/E929.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/data/Leipzig/E9A1.xml b/data/Leipzig/E9A1.xml new file mode 100644 index 00000000000..4c6e9ae0776 --- /dev/null +++ b/data/Leipzig/E9A1.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/data/Leipzig/EA2A.xml b/data/Leipzig/EA2A.xml new file mode 100644 index 00000000000..6bae39ea1d9 --- /dev/null +++ b/data/Leipzig/EA2A.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/data/Leipzig/EE90.xml b/data/Leipzig/EE90.xml new file mode 100644 index 00000000000..70d704fe65c --- /dev/null +++ b/data/Leipzig/EE90.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/data/Leipzig/EE91.xml b/data/Leipzig/EE91.xml new file mode 100644 index 00000000000..1731eeee82d --- /dev/null +++ b/data/Leipzig/EE91.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/data/Leipzig/EE92.xml b/data/Leipzig/EE92.xml new file mode 100644 index 00000000000..3d788dae24e --- /dev/null +++ b/data/Leipzig/EE92.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/data/Leipzig/EE93.xml b/data/Leipzig/EE93.xml new file mode 100644 index 00000000000..172c21c7097 --- /dev/null +++ b/data/Leipzig/EE93.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/data/Leipzig/EE94.xml b/data/Leipzig/EE94.xml new file mode 100644 index 00000000000..f116c069aa7 --- /dev/null +++ b/data/Leipzig/EE94.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/data/Leland.css b/data/Leland.css index c94c3c4eb2b..4ced21535d9 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 fcf2a0f807f..ff8bb0e9234 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,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) format('woff2'); font-weight: normal; font-style: normal; } \ No newline at end of file diff --git a/emscripten/buildToolkit b/emscripten/buildToolkit index afde9dd2b76..7c9262bc169 100755 --- a/emscripten/buildToolkit +++ b/emscripten/buildToolkit @@ -230,7 +230,7 @@ $exports .= "'_malloc',"; $exports .= "'_free'"; $exports .= "]\""; -my $extra_exports = "-s EXPORTED_RUNTIME_METHODS='[\"cwrap\"]'"; +my $extra_exports = "-s EXPORTED_RUNTIME_METHODS='[\"cwrap\", \"HEAPU8\"]'"; my $modularize = $modularizeQ ? "-s MODULARIZE=1 -s EXPORT_ES6=1 -s EXPORT_NAME=\"'createVerovioModule'\"" : ""; diff --git a/fonts/Leipzig/Leipzig.svg b/fonts/Leipzig/Leipzig.svg index 533fab01983..3610a7bf8ab 100644 --- a/fonts/Leipzig/Leipzig.svg +++ b/fonts/Leipzig/Leipzig.svg @@ -2,11 +2,11 @@ -Created by FontForge 20230101 at Sat Feb 24 19:01:45 2024 - By Klaus Rettinghaus +Created by FontForge 20220308 at Thu Jul 18 09:04:00 2024 + 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.88 +Version 5.2.92 @@ -2166,8 +2166,8 @@ d="M6 -401c-4 0 -6 5 -6 8v448c0 43 44 47 63 47h9c27 0 72 -3 72 -45v-140c0 -4 -4 - + @@ -2437,5 +2437,38 @@ d="M120.146 498.265c0.224774 0 17.1897 -1.82497 17.1897 -14.4827c0 -13.3186 -15. /> + + + + + + + + + + + diff --git a/fonts/Leipzig/Leipzig.ttf b/fonts/Leipzig/Leipzig.ttf index 8eafdf58bb8..135e2672dd8 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 174d3b07445..85ef4546089 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 ee909e258c6..7c16701d43f 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.88", + "fontVersion": "5.2.92", "glyphBBoxes": { "4stringTabClef": { "bBoxNE": [ @@ -1414,12 +1414,12 @@ }, "chantPunctumDeminutum": { "bBoxNE": [ - 0.5, - 0.352 + 0.364, + 0.232 ], "bBoxSW": [ - 0.012, - -0.348 + 0.0, + -0.228 ] }, "chantPunctumInclinatum": { @@ -3632,6 +3632,16 @@ -1.016 ] }, + "medRenOriscusCMN": { + "bBoxNE": [ + 1.276, + 0.52 + ], + "bBoxSW": [ + 0.0, + -0.524 + ] + }, "medRenSharpCroix": { "bBoxNE": [ 1.168, @@ -4462,6 +4472,96 @@ -0.188 ] }, + "mensuralProportion1": { + "bBoxNE": [ + 0.8, + 0.76 + ], + "bBoxSW": [ + 0.0794, + -0.8 + ] + }, + "mensuralProportion2": { + "bBoxNE": [ + 1.0961, + 0.7601 + ], + "bBoxSW": [ + 0.08, + -0.8 + ] + }, + "mensuralProportion3": { + "bBoxNE": [ + 0.952, + 0.76 + ], + "bBoxSW": [ + 0.092, + -0.804 + ] + }, + "mensuralProportion4": { + "bBoxNE": [ + 1.096, + 0.72 + ], + "bBoxSW": [ + 0.08, + -0.808 + ] + }, + "mensuralProportion5": { + "bBoxNE": [ + 1.04, + 0.768 + ], + "bBoxSW": [ + 0.052, + -0.8001 + ] + }, + "mensuralProportion6": { + "bBoxNE": [ + 0.988, + 0.76 + ], + "bBoxSW": [ + 0.0587, + -0.8 + ] + }, + "mensuralProportion7": { + "bBoxNE": [ + 1.012, + 0.76 + ], + "bBoxSW": [ + 0.08, + -0.804 + ] + }, + "mensuralProportion8": { + "bBoxNE": [ + 1.012, + 0.76 + ], + "bBoxSW": [ + 0.08, + -0.8 + ] + }, + "mensuralProportion9": { + "bBoxNE": [ + 0.992, + 0.76 + ], + "bBoxSW": [ + 0.0627, + -0.8 + ] + }, "mensuralProportionProportioDupla1": { "bBoxNE": [ 2.2, @@ -5242,6 +5342,16 @@ 0.0 ] }, + "ornamentLeftVerticalStrokeWithCross": { + "bBoxNE": [ + 0.84, + 1.6 + ], + "bBoxSW": [ + 0.0, + 0.0 + ] + }, "ornamentMordent": { "bBoxNE": [ 2.344, @@ -7680,6 +7790,26 @@ -0.5 ] }, + "mensuralNoteheadMinimaWhite": { + "stemDownNW": [ + 0.584, + -0.7 + ], + "stemUpSE": [ + 0.664, + 0.7 + ] + }, + "mensuralNoteheadSemiminimaWhite": { + "stemDownNW": [ + 0.584, + -0.7 + ], + "stemUpSE": [ + 0.664, + 0.7 + ] + }, "noteheadBlack": { "cutOutNW": [ 0.144, diff --git a/fonts/supported.xml b/fonts/supported.xml index 695b187c50b..d264f961307 100644 --- a/fonts/supported.xml +++ b/fonts/supported.xml @@ -1365,8 +1365,8 @@ - - + + @@ -2236,10 +2236,10 @@ - - - - + + + + @@ -2363,7 +2363,7 @@ - + U+E9AF U+E990 @@ -2468,7 +2468,7 @@ - + U+EA2F U+EA20 @@ -3190,11 +3190,11 @@ Medieval and Renaissance prolations supplement - - - - - + + + + + U+EE9F U+EE90 diff --git a/include/hum/humlib.h b/include/hum/humlib.h index 5223b1a9250..d9b39732d30 100644 --- a/include/hum/humlib.h +++ b/include/hum/humlib.h @@ -1,7 +1,7 @@ // // Programmer: Craig Stuart Sapp // Creation Date: Sat Aug 8 12:24:49 PDT 2015 -// Last Modified: Tue Dec 12 11:01:04 PST 2023 +// Last Modified: Sun Sep 8 23:07:16 PDT 2024 // Filename: min/humlib.h // URL: https://github.com/craigsapp/humlib/blob/master/min/humlib.h // Syntax: C++11 @@ -54,6 +54,8 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include #include #include +#include +#include #include #include #include @@ -829,6 +831,7 @@ class HumAddress { int getLineNumber (void) const; int getFieldIndex (void) const; const HumdrumToken& getDataType (void) const; + HTp getExclusiveInterpretation(void); const std::string& getSpineInfo (void) const; int getTrack (void) const; int getSubtrack (void) const; @@ -961,9 +964,9 @@ class HumInstrument { int setGM (const std::string& Hname, int aValue); private: - int index; - static std::vector<_HumInstrument> data; - static int classcount; + int m_index; + static std::vector<_HumInstrument> m_data; + static int m_classcount; protected: void initialize (void); @@ -1257,6 +1260,14 @@ class HumdrumLine : public std::string, public HumHash { bool isManipulator (void) const; bool hasSpines (void) const; bool isGlobal (void) const; + + int isKeySignature (int startTrack = 0, int stopTrack = 0); + int isKeyDesignation (int startTrack = 0, int stopTrack = 0); + int isTempo (int startTrack = 0, int stopTrack = 0); + int isTimeSignature (int startTrack = 0, int stopTrack = 0); + int isExpansionLabel (int startTrack = 0, int stopTrack = 0); + int isExpansionList (int startTrack = 0, int stopTrack = 0); + bool equalFieldsQ (const std::string& exinterp, const std::string& value); HTp token (int index) const; void getTokens (std::vector& list); @@ -1283,6 +1294,7 @@ class HumdrumLine : public std::string, public HumHash { std::string getXmlIdPrefix (void) const; void clearTokenLinkInfo (void); void createLineFromTokens (void); + void generateLineFromTokens (void) { createLineFromTokens(); } void removeExtraTabs (void); void addExtraTabs (std::vector& trackWidths); int getLineIndex (void) const; @@ -1508,6 +1520,7 @@ class HumdrumToken : public std::string, public HumHash { bool isNullData (void) const; bool isChord (const std::string& separator = " "); bool isLabel (void) const; + bool isExpansionLabel (void) const { return isLabel(); }; bool isExpansionList (void) const; bool hasRhythm (void) const; bool hasBeam (void) const; @@ -1551,6 +1564,7 @@ class HumdrumToken : public std::string, public HumHash { bool isInstrumentCode (void) { return isInstrumentDesignation(); } bool isInstrumentClass (void); bool isInstrumentGroup (void); + bool isInstrumentNumber (void); bool isModernInstrumentName (void); bool isModernInstrumentAbbreviation(void); bool isOriginalInstrumentName (void); @@ -1638,6 +1652,9 @@ class HumdrumToken : public std::string, public HumHash { HumNum getBarlineDuration (void); HumNum getBarlineDuration (HumNum scale); + // metric-related functions: + HumNum getBeat (HumNum scale = 1); + HLp getOwner (void) const; HLp getLine (void) const { return getOwner(); } bool equalChar (int index, char ch) const; @@ -1661,6 +1678,7 @@ class HumdrumToken : public std::string, public HumHash { bool isStaffLike (void) const { return isKernLike() || isMensLike(); } std::string getSpineInfo (void) const; int getTrack (void) const; + int getSpineIndex (void) const; int getSubtrack (void) const; bool noteInLowerSubtrack (void); std::string getTrackString (void) const; @@ -1699,6 +1717,7 @@ class HumdrumToken : public std::string, public HumHash { std::string getXmlIdPrefix (void) const; void setText (const std::string& text); std::string getText (void) const; + HTp getExclusiveInterpretation(void); int addLinkedParameterSet (HTp token); int getLinkedParameterSetCount(void); HumParamSet* getLinkedParameterSet (int index); @@ -2024,6 +2043,7 @@ class HumdrumFileBase : public HumHash { bool isRhythmAnalyzed (void); bool areStrandsAnalyzed (void); bool areStrophesAnalyzed (void); + void setFilenameFromSegment (void); template void initializeArray (std::vector>& array, TYPE value); @@ -2138,8 +2158,6 @@ class HumdrumFileBase : public HumHash { HLp back (void); void makeBooleanTrackList (std::vector& spinelist, const std::string& spinestring); - bool analyzeBaseFromLines (void); - bool analyzeBaseFromTokens (void); std::vector getReferenceRecords(void); @@ -2180,6 +2198,15 @@ class HumdrumFileBase : public HumHash { static void readStringFromHttpUri (std::stringstream& inputdata, const std::string& webaddress); + bool analyzeBaseFromLines (void); + bool analyzeBaseFromTokens (void); + + bool analyzeTokens (void); + bool analyzeSpines (void); + bool analyzeLinks (void); + bool analyzeTracks (void); + bool analyzeLines (void); + protected: static int getChunk (int socket_id, std::stringstream& inputdata, @@ -2195,10 +2222,6 @@ class HumdrumFileBase : public HumHash { unsigned short int port); protected: - bool analyzeTokens (void); - bool analyzeSpines (void); - bool analyzeLinks (void); - bool analyzeTracks (void); bool adjustSpines (HumdrumLine& line, std::vector& datatype, std::vector& sinfo); @@ -2216,7 +2239,6 @@ class HumdrumFileBase : public HumHash { bool setParseError (std::stringstream& err); bool setParseError (const std::string& err); bool setParseError (const char* format, ...); - bool analyzeLines (void); // void fixMerges (int linei); protected: @@ -2499,9 +2521,22 @@ class HumdrumFileContent : public HumdrumFileStructure { bool analyzePhrasings (void); bool analyzeTextRepetition (void); bool analyzeKernTies (void); - bool analyzeKernAccidentals (void); + bool analyzeAccidentals (void); + bool analyzeKernAccidentals (const std::string& dataType = "**kern"); + bool analyzeMensAccidentals (void); bool analyzeRScale (void); + // in HumdrumFileContent-hand.cpp + bool doHandAnalysis (bool attacksOnlyQ = false); + bool doHandAnalysis (HTp startSpine, bool attacksOnlyQ = false); + + // in HumdrumFileContent-kern.cpp + std::vector getTrackToKernIndex (void); + + // in HumdrumFileContent-midi.cpp + void fillMidiInfo(std::vector>>>& trackMidi); + void processStrandNotesForMidi(HTp sstart, HTp send, std::vector>>& trackInfo); + // in HumdrumFileContent-rest.cpp void analyzeRestPositions (void); void assignImplicitVerticalRestPositions (HTp kernstart); @@ -2996,7 +3031,11 @@ class HumdrumFile : public HUMDRUMFILE_PARENT { -// Reference: Beyond Midi, page 410. +////////////////////////////// +// +// MuseData line types, reference: Beyond Midi, page 410. +// + #define E_muserec_note_regular 'N' // 'A' --> use type E_muserec_note_regular // 'B' --> use type E_muserec_note_regular @@ -3026,33 +3065,46 @@ class HumdrumFile : public HUMDRUMFILE_PARENT { #define E_muserec_comment_toggle '&' #define E_muserec_comment_line '@' #define E_muserec_musical_directions '*' + #define E_muserec_copyright '1' // reserved for copyright notice #define E_muserec_header_1 '1' // reserved for copyright notice + #define E_muserec_header_2 '2' // reserved for identification #define E_muserec_id '2' // reserved for identification + #define E_muserec_header_3 '3' // reserved + #define E_muserec_header_4 '4' // #define E_muserec_encoder '4' // + #define E_muserec_header_5 '5' // WK#: MV#: #define E_muserec_work_info '5' // WK#: MV#: + #define E_muserec_header_6 '6' // #define E_muserec_source '6' // + #define E_muserec_header_7 '7' // #define E_muserec_work_title '7' // + #define E_muserec_header_8 '8' // #define E_muserec_movement_title '8' // + #define E_muserec_header_9 '9' // #define E_muserec_header_part_name '9' // + #define E_muserec_header_10 '0' // misc designations + #define E_muserec_header_11 'A' // group memberships #define E_muserec_group_memberships 'A' // group memberships -// multiple musered_head_12 lines can occur: + +// multiple muserec_head_12 lines can occur: #define E_muserec_header_12 'B' // : part of #define E_muserec_group 'B' // : part of + #define E_muserec_unknown 'U' // unknown record type -#define E_muserec_empty 'E' // nothing on line and not header - // or multi-line comment +#define E_muserec_empty 'E' // nothing on line and not header or multi-line comment #define E_muserec_deleted 'D' // deleted line + // non-standard record types for MuseDataSet #define E_muserec_filemarker '+' #define E_muserec_filename 'F' @@ -3108,10 +3160,12 @@ class MuseRecordBasic { void append (const char* format, ...); // mark-up accessor functions: - void setAbsBeat (HumNum value); + void setQStamp (HumNum value); void setAbsBeat (int topval, int botval = 1); + void setQStamp (int topval, int botval = 1); HumNum getAbsBeat (void); + HumNum getQStamp (void); void setLineDuration (HumNum value); void setLineDuration (int topval, int botval = 1); @@ -3134,27 +3188,34 @@ class MuseRecordBasic { int getNextTiedNoteLineIndex(void); void setLastTiedNoteLineIndex(int index); void setNextTiedNoteLineIndex(int index); + int hasTieGroupStart (void); + int isNoteAttack (void); + /* HumNum getTiedNoteDuration (void); */ std::string getLayoutVis (void); // boolean type fuctions: bool isAnyNote (void); + bool isRest (void); bool isAnyNoteOrRest (void); - bool isAttributes (void); + bool isAttributes (void); // starts with $ + bool isAttribute (void) { return isAttributes(); } bool isBackup (void); bool isBarline (void); + bool isMeasure (void) { return isBarline(); } bool isBodyRecord (void); bool isChordGraceNote (void); bool isChordNote (void); - bool isDirection (void); - bool isAnyComment (void); - bool isLineComment (void); - bool isBlockComment (void); - bool isCopyright (void); - bool isCueNote (void); - bool isEncoder (void); - bool isFiguredHarmony (void); - bool isGraceNote (void); + bool isDirection (void); // starts with "*" + bool isMusicalDirection (void); // starts with "*" + bool isAnyComment (void); // starts with "@" or between lines starting with &. + bool isLineComment (void); // starts with "@" + bool isBlockComment (void); // lines between lines starting with &. + bool isCopyright (void); // 1st non-comment line in file + bool isCueNote (void); // starts with "c" + bool isEncoder (void); // 4th non-comment line in file + bool isFiguredHarmony (void); // starts with "f" + bool isGraceNote (void); // starts with "g" bool isGroup (void); bool isGroupMembership (void); bool isHeaderRecord (void); @@ -3165,7 +3226,7 @@ class MuseRecordBasic { bool isAnyRest (void); bool isRegularRest (void); bool isInvisibleRest (void); - bool isPrintSuggestion (void); + bool isPrintSuggestion (void); // starts with "P" bool isSource (void); bool isWorkInfo (void); bool isWorkTitle (void); @@ -3174,27 +3235,42 @@ class MuseRecordBasic { void setTpq (int value); static std::string musedataToUtf8 (std::string& input); + protected: - std::string m_recordString; // actual characters on line + std::string m_recordString; // actual characters on line + + std::vector m_printSuggestions; // print suggestions for this line (if applicable) + // print suggestions start with the letter "P" and + // follow a note/rest line, as well as musical + // direction lines that start with "*". The value + // int the difference in indexes between the current + // line and the print suggestion (typically +1). + + std::vector m_musicalDirections; // Musical directions associated with this line + // (if applicable) stored as delta indexes. Musical + // direction lines start with "*" and are used for + // dynamics, hairpins, etc. Typically -1 from a note + // or -2 if there is a print suggestion for the musical + // direction. // mark-up data for the line: - int m_lineindex; // index into original file - int m_type; // category of MuseRecordBasic record - HumNum m_absbeat; // dur in quarter notes from start - HumNum m_lineduration; // duration of line - HumNum m_noteduration; // duration of note - - int m_b40pitch; // base 40 pitch - int m_nexttiednote; // line number of next note tied to - // this one (-1 if no tied note) - int m_lasttiednote; // line number of previous note tied - // to this one (-1 if no tied note) + int m_lineindex; // index into original file + int m_type; // category of MuseRecordBasic record + HumNum m_qstamp; // dur in quarter notes from start + HumNum m_lineduration; // duration of line + HumNum m_noteduration; // duration of note + + int m_b40pitch; // base 40 pitch + int m_nexttiednote; // line number of next note tied to + // this one (-1 if no tied note) + int m_lasttiednote; // line number of previous note tied + // to this one (-1 if no tied note) int m_roundBreve; - int m_header = -1; // -1 = undefined, 0 = no, 1 = yes - int m_layer = 0; // voice/layer (track info but may be analyzed) - int m_tpq = 0; // ticks-per-quarter for durations - std::string m_graphicrecip; // graphical duration of note/rest - GridVoice* m_voice = NULL; // conversion structure that token is stored in. + int m_header = -1; // -1 = undefined, 0 = no, 1 = yes + int m_layer = 0; // voice/layer (track info but may be analyzed) + int m_tpq = 0; // ticks-per-quarter for durations + std::string m_graphicrecip; // graphical duration of note/rest + GridVoice* m_voice = NULL; // conversion structure that token is stored in. MuseData* m_owner = NULL; void setOwner (MuseData* owner); @@ -3202,6 +3278,7 @@ class MuseRecordBasic { public: static std::string trimSpaces (std::string input); + friend class MuseRecord; friend class MuseData; }; @@ -3215,18 +3292,24 @@ std::ostream& operator<<(std::ostream& out, MuseRecordBasic* aRecord); class MuseRecord : public MuseRecordBasic { public: - MuseRecord (void); - MuseRecord (const std::string& aLine); - MuseRecord (MuseRecord& aRecord); - ~MuseRecord (); + MuseRecord (void); + MuseRecord (const std::string& aLine); + MuseRecord (MuseRecord& aRecord); + ~MuseRecord (); - MuseRecord& operator=(MuseRecord& aRecord); + MuseRecord& operator= (MuseRecord& aRecord); - ////////////////////////////// - // functions which work with regular note, cue note, and grace note records - // (A..G, c, g) - // columns 1 -- 5: pitch field information + // MuseData part header information: + std::string getPartName(); + + + ////////////////////////////// + // + // functions which process regular notes (A-G), cue notes (c), grace notes (g), + // and chords (" "). Definitions stored in MuseRecord-note.cpp. + // + // columns 1-5: pitch field information std::string getNoteField (void); int getOctave (void); std::string getOctaveString (void); @@ -3249,7 +3332,7 @@ class MuseRecord : public MuseRecordBasic { void setStemDown (void); void setStemUp (void); - // columns 6 -- 9: duration field information + // columns 6-9: duration field information std::string getTickDurationField (void); std::string getTickDurationString (void); int getTickDuration (void); @@ -3293,9 +3376,9 @@ class MuseRecord : public MuseRecordBasic { void setNotehead128thMensural (void); void setNotehead256thMensural (void); - // columns 10 -- 12 ---> blank + // columns 10-12 ---> blank - // columns 13 -- 80: graphical and interpretive information + // columns 13-80: graphical and interpretive information // column 13: footnote flag std::string getFootnoteFlagField (void); @@ -3332,40 +3415,41 @@ class MuseRecord : public MuseRecordBasic { std::string getStringProlongation (void); int prolongationQ (void); - // column 19: actual notated accidentals + // column 19: notated accidentals std::string getNotatedAccidentalField (void); std::string getNotatedAccidentalString (void); int getNotatedAccidental (void); int notatedAccidentalQ (void); - // columns 20 -- 22: time modification + // columns 20-22: time modification std::string getTimeModificationField (void); - std::string getTimeModification (void); + std::string getTimeModificationString (void); + HumNum getTimeModification (void); std::string getTimeModificationLeftField (void); std::string getTimeModificationLeftString(void); int getTimeModificationLeft (void); std::string getTimeModificationRightField(void); std::string getTimeModificationRightString(void); int getTimeModificationRight (void); - int timeModificationQ (void); - int timeModificationLeftQ (void); - int timeModificationRightQ (void); + bool timeModificationQ (void); + bool timeModificationLeftQ (void); + bool timeModificationRightQ (void); - // column 23 + // column 23: stem direction std::string getStemDirectionField (void); std::string getStemDirectionString (void); int getStemDirection (void); int stemDirectionQ (void); - // column 24 + // column 24: staff number for multi-staff parts std::string getStaffField (void); std::string getStaffString (void); int getStaff (void); int staffQ (void); - // column 25 ---> blank + // column 25: blank - // columns 26 - 31: beam codes + // columns 26-31: beaming std::string getBeamField (void); int beamQ (void); char getBeam8 (void); @@ -3380,11 +3464,12 @@ class MuseRecord : public MuseRecordBasic { int beam64Q (void); int beam128Q (void); int beam256Q (void); - std::string getKernBeamStyle (void); void setBeamInfo (std::string& strang); - // columns 32 -- 43: additional notation - std::string getAdditionalNotationsField (void); + // columns 32-43: additional notation + std::string getAdditionalNotationsField (void); // merge with below + std::string getOtherNotations (void); // merge with above + int hasFermata (void); int additionalNotationsQ (void); int getAddCount (void); std::string getAddItem (int elementIndex); @@ -3400,78 +3485,87 @@ class MuseRecord : public MuseRecordBasic { // int getNotationLevel int getSlurStartColumn (void); std::string getSlurParameterRegion (void); - void getSlurInfo (std::string& slurstarts, - std::string& slurends); + void getSlurInfo (std::string& slurstarts, std::string& slurends); + - // columns 44 -- 80: text underlay + // columns 44-80: text underlay std::string getTextUnderlayField (void); int textUnderlayQ (void); int getVerseCount (void); std::string getVerse (int index); std::string getVerseUtf8 (int index); - // general functions for note records: - std::string getKernNoteStyle (int beams = 0, int stems = 0); - std::string getKernNoteAccents (void); ////////////////////////////// - // functions which work with basso continuo figuration records ('f'): - + // + // functions which work with basso continuo figuration records ('f'), definitions + // stored in MuseRecord-figure.cpp + // // column 2: number of figure fields std::string getFigureCountField (void); std::string getFigureCountString (void); int getFigureCount (void); - // columns 3 -- 5 ---> blank + // columns 3-5: blank - // columns 6 -- 8: figure division pointer advancement (duration) + // columns 6-8: figure division pointer advancement (duration) + // this is the offset to the next figure and is not part + // of the note pointer advancement std::string getFigurePointerField (void); + std::string getFigurePointer (void); int figurePointerQ (void); - // same as note records: getDuration + int getFigureDuration (void); + - // columns 9 -- 12 ---> blank + // columns 9-12: blank - // columns 13 -- 15: footnote and level information - // column 13 --> footnote: uses same functions as note records in col 13. - // column 14 --> level: uses same functions as note records on column 14. - // column 15 ---> blank + // columns 13-15: footnote and level information + // column 13: footnote: uses same functions as note records in col 13. + // column 14: level: uses same functions as note records on column 14. + // column 15: blank - // columns 17 -- 80: figure fields + // columns 17-80: figure fields std::string getFigureFields (void); std::string getFigureString (void); int figureFieldsQ (void); std::string getFigure (int index = 0); + ////////////////////////////// - // functions which work with combined records ('b', 'i'): + // + // functions that work with combined records ('b', 'i'): + // - ////////////////////////////// - // functions which work with measure records ('m'): - // columns 1 -- 7: measure style information - std::string getMeasureTypeField (void); + ////////////////////////////// + // + // functions which work with measure records ('m'), definitions stored + // in MuseRecord-measure.cpp. + // + // columns 1-7: measure style information + std::string getMeasureType (void); - // columns 9 -- 12: measure number (left justified) + // columns 9-12: measure number (left justified) std::string getMeasureNumberField (void); - std::string getMeasureNumberString (void); - int getMeasureNumber (void); - int measureNumberQ (void); + std::string getMeasureNumber (void); + bool measureNumberQ (void); - // columns 17 -- 80: measure flags - std::string getMeasureFlagsString (void); + // columns 17-80: measure flags + std::string getMeasureFlags (void); int measureFermataQ (void); - int measureFlagQ (const std::string& key); + bool measureFlagEqual (const std::string& key); void addMeasureFlag (const std::string& strang); - // general functions for measure records: - std::string getKernMeasureStyle (void); ////////////////////////////// - // functions which work with musical attributes records ('$'): + // + // Notation Attributes: functions which process musical attributes records ('$'), + // definitions stored in MuseRecord-attributes.cpp. + // std::string getAttributes (void); void getAttributeMap (std::map& amap); @@ -3479,37 +3573,74 @@ class MuseRecord : public MuseRecordBasic { int getAttributeInt (char attribute); int getAttributeField (std::string& output, const std::string& attribute); - ////////////////////////////// - // functions which work with musical direction records ('$'): + + ////////////////////////////// + // + // functions which work with musical direction records ('*'), + // definitions stored in MuseRecord-directions.cpp. + // // columns 17-18: type of direction std::string getDirectionTypeField (void); std::string getDirectionTypeString (void); - bool isTextDirection (void); + bool isDashStart (void); + bool isDashStop (void); + bool isDynamic (void); bool isHairpin (void); bool isHairpinStart (void); bool isHairpinStop (void); - bool isDashStart (void); - bool isDashStop (void); - bool isPedalStart (void); - bool isPedalEnd (void); - bool isRehearsal (void); bool isOctaveUpStart (void); bool isOctaveDownStart (void); bool isOctaveStop (void); + bool isPedalStart (void); + bool isPedalEnd (void); + bool isRehearsal (void); + bool isTextDirection (void); std::string getDirectionText (void); std::string getTextDirection (void) { return getDirectionText(); } - // - ////////////////////////////// + // Musical Directions: Lines starting with * + // Functions stored in src/MuseRecordBasic-directions.cpp + void addMusicDirection (int deltaIndex); + std::string getDirectionAsciiCharacters (void); + bool hasMusicalDirection (void); + MuseRecord* getMusicalDirection (int index = 0); + std::string getDynamicText (void); + MuseRecord* getDirectionRecord (int deltaIndex); + std::string getDirectionType (void); - std::string getKernRestStyle (void); + + ////////////////////////////// + // + // Print Suggestings: Lines starting with "P". Definititions stored + // in MuseRecord-suggestions.cpp. + // + + void addPrintSuggestion (int deltaIndex); bool hasPrintSuggestions (void); void getAllPrintSuggestions (std::vector& suggestions); void getPrintSuggestions (std::vector& suggestions, int column); + + + ////////////////////////////// + // + // Humdrum conversion related functions, store in MuseRecord-humdrum.cpp: + // + + std::string getKernMeasure (void); + std::string getKernBeamStyle (void); + std::string getKernNoteStyle (int beams = 0, int stems = 0); + std::string getKernNoteAccents (void); + std::string getKernNoteOtherNotations (void); + std::string getKernRestStyle (void); + + + // + ////////////////////////////// + protected: void allowNotesOnly (const std::string& functionName); void allowNotesAndRestsOnly (const std::string& functionName); @@ -3560,7 +3691,6 @@ class MuseData { void setFilename (const std::string& filename); std::string getFilename (void); - std::string getPartName (void); int isMember (const std::string& mstring); int getMembershipPartNumber(const std::string& mstring); void selectMembership (const std::string& selectstring); @@ -3581,6 +3711,10 @@ class MuseData { int readFile (const std::string& filename); void analyzeLayers (void); int analyzeLayersInMeasure(int startindex); + std::string getMeasureNumber (int index); + bool measureHasData (int index); + bool hasMeasureData (int index) { return measureHasData(index); } + int getNextMeasureIndex (int index); // aliases for access to MuseRecord objects based on line indexes: std::string getLine (int index); @@ -3605,6 +3739,7 @@ class MuseData { std::string getEncoder (void); std::string getEncoderDate (void); std::string getEncoderName (void); + std::string getPartName (void); std::string getId (void); std::string getMovementTitle (void); std::string getSource (void); @@ -3625,9 +3760,11 @@ class MuseData { // line-based (file-order indexing) accessor functions: MuseRecord& operator[] (int lindex); MuseRecord& getRecord (int lindex); + MuseRecord* getRecordPointer (int lindex); HumNum getTiedDuration (int lindex); HumNum getAbsBeat (int lindex); + HumNum getQStamp (int lindex); HumNum getFileDuration (void); int getLineTickDuration (int lindex); @@ -3648,7 +3785,6 @@ class MuseData { std::string getError (void); bool hasError (void); - private: std::vector m_data; std::vector m_sequence; @@ -3665,8 +3801,9 @@ class MuseData { void constructTimeSequence(void); void insertEventBackwards (HumNum atime, MuseRecord* arecord); int getPartNameIndex (void); - std::string getPartName (int index); void assignHeaderBodyState(void); + void linkPrintSuggestions (void); + void linkMusicDirections (void); public: static std::string trimSpaces (const std::string& input); @@ -3692,12 +3829,15 @@ class MuseDataSet { int readPart (std::istream& input); int readFile (const std::string& filename); int readString (const std::string& data); + int readString (std::istream& input); + int readString (std::stringstream& input); int read (std::istream& input); MuseData& operator[] (int index); int getFileCount (void); void deletePart (int index); void cleanLineEndings (void); std::vector getGroupIndexList (const std::string& group); + int appendPart (MuseData* musedata); std::string getError (void); bool hasError (void); @@ -3712,7 +3852,6 @@ class MuseDataSet { std::string m_error; protected: - int appendPart (MuseData* musedata); void analyzeSetType (std::vector& types, std::vector& lines); void analyzePartSegments (std::vector& startindex, @@ -3957,6 +4096,9 @@ class Convert { { return kernToBase7 ((std::string)*token); } static std::string kernToRecip (const std::string& kerndata); static std::string kernToRecip (HTp token); + static std::string base12ToKern (int aPitch); + static std::string base12ToPitch (int aPitch); + static int base12ToBase40 (int aPitch); static int kernToMidiNoteNumber (const std::string& kerndata); static int kernToMidiNoteNumber(HTp token) { return kernToMidiNoteNumber((std::string)*token); } @@ -3984,8 +4126,12 @@ class Convert { static int transToBase40 (const std::string& input); static int base40IntervalToLineOfFifths(int trans); static std::string keyNumberToKern (int number); + static int kernKeyToNumber (const std::string& aKernString); + static int base7ToBase40 (int base7); + static int base7ToBase12 (int aPitch, int alter = 0); static int base40IntervalToDiatonic(int base40interval); + static HumNum kernToDuration (const std::string& aKernString); // **mens, mensual notation, defiend in Convert-mens.cpp @@ -4013,39 +4159,36 @@ class Convert { static HumNum mensToDuration (HTp menstok); // older functions to enhance or remove: - static HumNum mensToDuration (const std::string& mensdata, - HumNum scale = 4, + static HumNum mensToDuration (const std::string& mensdata, HumNum scale = 4, const std::string& separator = " "); - static std::string mensToRecip (const std::string& mensdata, - HumNum scale = 4, + static std::string mensToRecip (const std::string& mensdata, HumNum scale = 4, const std::string& separator = " "); - static HumNum mensToDurationNoDots(const std::string& mensdata, - HumNum scale = 4, + static HumNum mensToDurationNoDots (const std::string& mensdata, HumNum scale = 4, const std::string& separator = " "); // MuseData conversions in Convert-musedata.cpp - static int museToBase40 (const std::string& pitchString); - static std::string musePitchToKernPitch(const std::string& museInput); - static std::string museClefToKernClef(const std::string& mclef); - static std::string museKeySigToKernKeySig(const std::string& mkeysig); - static std::string museTimeSigToKernTimeSig(const std::string& mtimesig); - static std::string museMeterSigToKernMeterSig(const std::string& mtimesig); + static int museToBase40 (const std::string& pitchString); + static std::string musePitchToKernPitch (const std::string& museInput); + static std::string museClefToKernClef (const std::string& mclef); + static std::string museKeySigToKernKeySig (const std::string& mkeysig); + static std::string museTimeSigToKernTimeSig (const std::string& mtimesig); + static std::string museMeterSigToKernMeterSig (const std::string& mtimesig); static std::string museFiguredBassToKernFiguredBass(const std::string& mfb); // Harmony processing, defined in Convert-harmony.cpp static std::vector minorHScaleBase40(void); static std::vector majorScaleBase40 (void); - static int keyToInversion (const std::string& harm); - static int keyToBase40 (const std::string& key); + static int keyToInversion (const std::string& harm); + static int keyToBase40 (const std::string& key); static std::vector harmToBase40 (HTp harm, const std::string& key) { - return harmToBase40(*harm, key); } + return harmToBase40(*harm, key); } static std::vector harmToBase40 (HTp harm, HTp key) { - return harmToBase40(*harm, *key); } + return harmToBase40(*harm, *key); } static std::vector harmToBase40 (const std::string& harm, const std::string& key); static std::vector harmToBase40 (const std::string& harm, int keyroot, int keymode); - static void makeAdjustedKeyRootAndMode(const std::string& secondary, - int& keyroot, int& keymode); - static int chromaticAlteration(const std::string& content); + static void makeAdjustedKeyRootAndMode(const std::string& secondary, + int& keyroot, int& keymode); + static int chromaticAlteration(const std::string& content); // data-type specific (other than pitch/rhythm), // defined in Convert-kern.cpp @@ -4060,35 +4203,33 @@ class Convert { static bool isKernSecondaryTiedNote (const std::string& kerndata); static std::string getKernPitchAttributes(const std::string& kerndata); - static int getKernSlurStartElisionLevel(const std::string& kerndata, int index); - static int getKernSlurEndElisionLevel (const std::string& kerndata, int index); + static int getKernSlurStartElisionLevel (const std::string& kerndata, int index); + static int getKernSlurEndElisionLevel (const std::string& kerndata, int index); static int getKernPhraseStartElisionLevel(const std::string& kerndata, int index); - static int getKernPhraseEndElisionLevel(const std::string& kerndata, int index); - - static int getKernBeamStartElisionLevel(const std::string& kerndata, int index); - static int getKernBeamEndElisionLevel (const std::string& kerndata, int index); - - + static int getKernPhraseEndElisionLevel (const std::string& kerndata, int index); + static int getKernBeamStartElisionLevel (const std::string& kerndata, int index); + static int getKernBeamEndElisionLevel (const std::string& kerndata, int index); // String processing, defined in Convert-string.cpp static std::vector splitString (const std::string& data, - char separator = ' '); - static void replaceOccurrences (std::string& source, - const std::string& search, - const std::string& replace); + char separator = ' '); + static void replaceOccurrences (std::string& source, + const std::string& search, + const std::string& replace); static std::string repeatString (const std::string& pattern, int count); static std::string encodeXml (const std::string& input); static std::string getHumNumAttributes (const HumNum& num); static std::string trimWhiteSpace (const std::string& input); - static bool startsWith (const std::string& input, - const std::string& searchstring); + static std::string generateRandomId (int length); + static bool startsWith (const std::string& input, + const std::string& searchstring); static bool contains(const std::string& input, const std::string& pattern); static bool contains(const std::string& input, char pattern); static bool contains(std::string* input, const std::string& pattern); static bool contains(std::string* input, char pattern); - static void makeBooleanTrackList(std::vector& spinelist, - const std::string& spinestring, - int maxtrack); + static void makeBooleanTrackList (std::vector& spinelist, + const std::string& spinestring, + int maxtrack); static std::vector extractIntegerList(const std::string& input, int maximum); // private functions for extractIntegerList: static void processSegmentEntry(std::vector& field, const std::string& astring, int maximum); @@ -4477,6 +4618,7 @@ class GridMeasure : public std::list { MeasureStyle getBarStyle (void) { return getStyle(); } void setStyle (MeasureStyle style) { m_style = style; } void setBarStyle (MeasureStyle style) { setStyle(style); } + void setKernBar (const std::string& tok); void setInvisibleBarline(void) { setStyle(MeasureStyle::Invisible); } void setFinalBarlineStyle(void) { setStyle(MeasureStyle::Final); } void setRepeatEndStyle(void) { setStyle(MeasureStyle::RepeatBackward); } @@ -4519,6 +4661,7 @@ class GridMeasure : public std::list { HumNum m_timestamp; HumNum m_timesigdur; MeasureStyle m_style; + std::string m_kernBar; int m_barnum = -1; }; @@ -5051,39 +5194,39 @@ class MxmlMeasure { class Option_register { public: - Option_register (void); - Option_register (const string& aDefinition, char aType, - const string& aDefaultOption); - Option_register (const string& aDefinition, char aType, - const string& aDefaultOption, - const string& aModifiedOption); - Option_register (const Option_register& reg); - ~Option_register (); - - Option_register& operator=(const Option_register& reg); - void clearModified (void); - string getDefinition (void); - string getDefault (void); - string getOption (void); - string getModified (void); - string getDescription (void); - bool isModified (void); - char getType (void); - void reset (void); - void setDefault (const string& aString); - void setDefinition (const string& aString); - void setDescription (const string& aString); - void setModified (const string& aString); - void setType (char aType); - ostream& print (ostream& out); + Option_register (void); + Option_register (const std::string& aDefinition, char aType, + const std::string& aDefaultOption); + Option_register (const std::string& aDefinition, char aType, + const std::string& aDefaultOption, + const std::string& aModifiedOption); + Option_register (const Option_register& reg); + ~Option_register (); + + Option_register& operator= (const Option_register& reg); + void clearModified (void); + std::string getDefinition (void); + std::string getDefault (void); + std::string getOption (void); + std::string getModified (void); + std::string getDescription (void); + bool isModified (void); + char getType (void); + void reset (void); + void setDefault (const std::string& aString); + void setDefinition (const std::string& aString); + void setDescription (const std::string& aString); + void setModified (const std::string& aString); + void setType (char aType); + std::ostream& print (std::ostream& out); protected: - string m_definition; - string m_description; - string m_defaultOption; - string m_modifiedOption; - bool m_modifiedQ; - char m_type; + std::string m_definition; + std::string m_description; + std::string m_defaultOption; + std::string m_modifiedOption; + bool m_modifiedQ; + char m_type; }; @@ -5096,81 +5239,82 @@ class Options { Options& operator= (const Options& options); int argc (void) const; - const vector& argv (void) const; - int define (const string& aDefinition); - int define (const string& aDefinition, - const string& description); - string getArg (int index); - string getArgument (int index); + const std::vector& argv (void) const; + int define (const std::string& aDefinition); + int define (const std::string& aDefinition, + const std::string& description); + std::string getArg (int index); + std::string getArgument (int index); int getArgCount (void); int getArgumentCount (void); - vector& getArgList (vector& output); - vector& getArgumentList (vector& output); - bool getBoolean (const string& optionName); - string getCommand (void); - string getCommandLine (void); - string getDefinition (const string& optionName); - double getDouble (const string& optionName); + std::vector& getArgList (std::vector& output); + std::vector& getArgumentList (std::vector& output); + bool getBoolean (const std::string& optionName); + std::string getCommand (void); + std::string getCommandLine (void); + std::string getDefinition (const std::string& optionName); + double getDouble (const std::string& optionName); char getFlag (void); - char getChar (const string& optionName); - float getFloat (const string& optionName); - int getInt (const string& optionName); - int getInteger (const string& optionName); - string getString (const string& optionName); - char getType (const string& optionName); + char getChar (const std::string& optionName); + float getFloat (const std::string& optionName); + int getInt (const std::string& optionName); + int getInteger (const std::string& optionName); + std::string getString (const std::string& optionName); + char getType (const std::string& optionName); int optionsArg (void); - ostream& print (ostream& out); - ostream& printOptionList (ostream& out); - ostream& printOptionListBooleanState(ostream& out); + std::ostream& print (std::ostream& out); + std::ostream& printEmscripten (std::ostream& out); + std::ostream& printOptionList (std::ostream& out); + std::ostream& printOptionListBooleanState(std::ostream& out); bool process (int error_check = 1, int suppress = 0); bool process (int argc, char** argv, - int error_check = 1, - int suppress = 0); - bool process (const vector& argv, - int error_check = 1, - int suppress = 0); - bool process (const string& argv, int error_check = 1, - int suppress = 0); + int error_check = 1, + int suppress = 0); + bool process (const std::vector& argv, + int error_check = 1, + int suppress = 0); + bool process (const std::string& argv, int error_check = 1, + int suppress = 0); void reset (void); void xverify (int argc, char** argv, - int error_check = 1, - int suppress = 0); + int error_check = 1, + int suppress = 0); void xverify (int error_check = 1, - int suppress = 0); + int suppress = 0); void setFlag (char aFlag); - void setModified (const string& optionName, - const string& optionValue); + void setModified (const std::string& optionName, + const std::string& optionValue); void setOptions (int argc, char** argv); - void setOptions (const vector& argv); - void setOptions (const string& args); + void setOptions (const std::vector& argv); + void setOptions (const std::string& args); void appendOptions (int argc, char** argv); - void appendOptions (string& args); - void appendOptions (vector& argv); - ostream& printRegister (ostream& out); - int isDefined (const string& name); - static vector tokenizeCommandLine(const string& args); + void appendOptions (std::string& args); + void appendOptions (std::vector& argv); + std::ostream& printRegister (std::ostream& out); + int isDefined (const std::string& name); + static std::vector tokenizeCommandLine(const std::string& args); bool hasParseError (void); - string getParseError (void); - ostream& getParseError (ostream& out); + std::string getParseError (void); + std::ostream& getParseError (std::ostream& out); protected: // m_argv: the list of raw command line strings including // a mix of options and non-option argument. - vector m_argv; + std::vector m_argv; // m_arguments: list of parsed command-line arguments which // are not options, or the command (argv[0]); - vector m_arguments; + std::vector m_arguments; // m_optionRegister: store for the states/values of each option. - vector m_optionRegister; + std::vector m_optionRegister; // m_optionFlag: the character which indicates an option. // Generally a dash, but could be made a slash for Windows environments. char m_optionFlag = '-'; // m_optionList: - map m_optionList; + std::map m_optionList; // // boolern options for object: @@ -5192,12 +5336,13 @@ class Options { bool m_optionsArgQ = false; // m_error: used to store errors in parsing command-line options. - stringstream m_error; + std::stringstream m_error; - private: - int getRegIndex (const string& optionName); - bool isOption (const string& aString, int& argp); + protected: + int getRegIndex (const std::string& optionName); + bool isOption (const std::string& aString, int& argp); int storeOption (int gargp, int& position, int& running); + }; #define OPTION_BOOLEAN_TYPE 'b' @@ -5219,29 +5364,29 @@ class HumTool : public Options { bool hasAnyText (void); std::string getAllText (void); - ostream& getAllText (ostream& out); + std::ostream& getAllText (std::ostream& out); bool hasHumdrumText (void); std::string getHumdrumText (void); - ostream& getHumdrumText (ostream& out); + std::ostream& getHumdrumText (std::ostream& out); void suppressHumdrumFileOutput(void); bool hasJsonText (void); std::string getJsonText (void); - ostream& getJsonText (ostream& out); + std::ostream& getJsonText (std::ostream& out); bool hasFreeText (void); std::string getFreeText (void); - ostream& getFreeText (ostream& out); + std::ostream& getFreeText (std::ostream& out); bool hasWarning (void); std::string getWarning (void); - ostream& getWarning (ostream& out); + std::ostream& getWarning (std::ostream& out); bool hasError (void); std::string getError (void); - ostream& getError (ostream& out); - void setError (const string& message); + std::ostream& getError (std::ostream& out); + void setError (const std::string& message); virtual void finally (void) { }; @@ -5287,6 +5432,7 @@ int main(int argc, char** argv) { \ infile.readNoRhythm(std::cin); \ } \ int status = interface.run(infile, std::cout); \ + interface.finally(); \ if (interface.hasWarning()) { \ interface.getWarning(std::cerr); \ return 0; \ @@ -5295,7 +5441,6 @@ int main(int argc, char** argv) { \ interface.getError(std::cerr); \ return -1; \ } \ - interface.finally(); \ return !status; \ } @@ -5319,24 +5464,24 @@ int main(int argc, char** argv) { \ 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); \ + interface.finally(); \ if (interface.hasWarning()) { \ interface.getWarning(std::cerr); \ } \ @@ -5368,7 +5514,6 @@ int main(int argc, char** argv) { \ interface.getError(std::cerr); \ return -1; \ } \ - interface.finally(); \ interface.clearOutput(); \ return !status; \ } @@ -5392,6 +5537,7 @@ int main(int argc, char** argv) { \ hum::HumdrumFileSet infiles; \ instream.read(infiles); \ bool status = interface.run(infiles); \ + interface.finally(); \ if (interface.hasWarning()) { \ interface.getWarning(std::cerr); \ } \ @@ -5407,7 +5553,6 @@ int main(int argc, char** argv) { \ std::cout << infiles[i]; \ } \ } \ - interface.finally(); \ interface.clearOutput(); \ return !status; \ } @@ -5422,9 +5567,9 @@ class HumdrumFileStream { HumdrumFileStream (char** list); HumdrumFileStream (const std::vector& list); HumdrumFileStream (Options& options); - HumdrumFileStream (const string& datastream); + HumdrumFileStream (const std::string& datastream); - void loadString (const string& data); + void loadString (const std::string& data); int setFileList (char** list); int setFileList (const std::vector& list); @@ -5494,7 +5639,7 @@ class HumdrumFileSet { int appendHumdrumPointer(HumdrumFile* infile); protected: - vector m_data; + std::vector m_data; void appendHumdrumFileContent(const std::string& filename, std::stringstream& inbuffer); @@ -5509,14 +5654,14 @@ class Tool_addic : public HumTool { bool run (HumdrumFileSet& infiles); bool run (HumdrumFile& infile); - bool run (const string& indata, ostream& out); - bool run (HumdrumFile& infile, ostream& out); + bool run (const std::string& indata, std::ostream& out); + bool run (HumdrumFile& infile, std::ostream& out); int getInstrumentCodeIndex(HumdrumFile& infile); int getInstrumentClassIndex(HumdrumFile& infile); void updateInstrumentClassLine(HumdrumFile& infile, int codeIndex, int classIndex); std::string makeClassLine(HumdrumFile& infile, int codeIndex); - std::string getInstrumentClass(const string& code); + std::string getInstrumentClass(const std::string& code); protected: @@ -5531,29 +5676,115 @@ class Tool_addic : public HumTool { }; -class Tool_autoaccid : public HumTool { +class Tool_addkey : public HumTool { public: - Tool_autoaccid (void); - ~Tool_autoaccid () {}; + Tool_addkey (void); + ~Tool_addkey () {}; bool run (HumdrumFileSet& infiles); bool run (HumdrumFile& infile); - bool run (const string& indata, ostream& out); - bool run (HumdrumFile& infile, ostream& out); + bool run (const std::string& indata, std::ostream& out); + bool run (HumdrumFile& infile, std::ostream& out); protected: void processFile (HumdrumFile& infile); void initialize (void); - void addAccidentalInfo (HTp token); - void removeAccidentalQualifications(HumdrumFile& infile); - void addAccidentalQualifications(HumdrumFile& infile); - string setVisualState (const string& input, bool state); + void getLineIndexes (HumdrumFile& infile); + void insertReferenceKey (HumdrumFile& infile); + void addInputKey (HumdrumFile& infile); + void insertKeyDesig (HumdrumFile& infile, const std::string& keyDesig); + void printKeyDesig (HumdrumFile& infile, int index, const std::string& desig, int direction); private: - bool m_visualQ; - bool m_hiddenQ; - bool m_removeQ; - bool m_cautionQ; + std::string m_key; + bool m_keyQ = false; + bool m_addKeyRefQ = false; + + int m_exinterpIndex = -1; + int m_refKeyIndex = -1; + int m_keyDesigIndex = -1; + int m_keySigIndex = -1; + int m_dataStartIndex = -1; + +}; + + +class Tool_addlabels : public HumTool { + public: + Tool_addlabels (void); + ~Tool_addlabels () {}; + + bool run (HumdrumFileSet& infiles); + bool run (HumdrumFile& infile); + bool run (const std::string& indata, std::ostream& out); + bool run (HumdrumFile& infile, std::ostream& out); + + protected: + void processFile (HumdrumFile& infile); + void initialize (void); + int getExpansionIndex (HumdrumFile& infile); + void printExpansionLists(HumdrumFile& infile, int index); + void assignLabels (std::vector& llist, HumdrumFile& infile); + void addLabel (std::vector& llist, HumdrumFile& infile, + int barnum, int subbarnum, const std::string& label); + private: + std::string m_default; // set with the -d option + std::string m_norep; // set with the -r option + std::string m_zeroth; // m0 label (right after default and norep expansion lists) + int m_defaultIndex = -1; // line to place default expansions list above (and then norep) + std::vector m_barnums; // set with -l option + std::vector m_subbarnums; // set with -l option + std::vector m_labels; // set with -l option +}; + + +class Tool_addtempo : public HumTool { + public: + Tool_addtempo (void); + ~Tool_addtempo () {}; + + bool run (HumdrumFileSet& infiles); + bool run (HumdrumFile& infile); + bool run (const std::string& indata, std::ostream& out); + bool run (HumdrumFile& infile, std::ostream& out); + + protected: + void processFile (HumdrumFile& infile); + void initialize (void); + void assignTempoChanges (std::vector& tlist, HumdrumFile& infile); + void addTempo (std::vector& tlist, HumdrumFile& infile, int measure, double tempo, int offset); + void addTempoToStart (std::vector& tlist, HumdrumFile& infile, double tempo); + + private: + // tuple + std::vector> m_tempos; + +}; + + +class Tool_autoaccid : public HumTool { + public: + Tool_autoaccid (void); + ~Tool_autoaccid () {}; + + bool run (HumdrumFileSet& infiles); + bool run (HumdrumFile& infile); + bool run (const std::string& indata, std::ostream& out); + bool run (HumdrumFile& infile, std::ostream& out); + + protected: + void processFile (HumdrumFile& infile); + void initialize (void); + void addAccidentalInfo (HTp token); + void removeAccidentalQualifications(HumdrumFile& infile); + void addAccidentalQualifications(HumdrumFile& infile); + std::string setVisualState (const std::string& input, bool state); + + private: + bool m_visualQ; + bool m_hiddenQ; + bool m_removeQ; + bool m_cautionQ; }; @@ -5561,39 +5792,39 @@ class Tool_autoaccid : public HumTool { class Tool_autobeam : public HumTool { public: - Tool_autobeam (void); - ~Tool_autobeam () {}; + Tool_autobeam (void); + ~Tool_autobeam () {}; - bool run (HumdrumFile& infile); - bool run (HumdrumFileSet& infiles); - bool run (const string& indata, ostream& out); - bool run (HumdrumFile& infile, ostream& out); + bool run (HumdrumFile& infile); + bool run (HumdrumFileSet& infiles); + bool run (const std::string& indata, std::ostream& out); + bool run (HumdrumFile& infile, std::ostream& out); protected: - void initialize (HumdrumFile& infile); - void processStrand (HTp strandstart, HTp strandend); - void processMeasure (vector& measure); - void addBeam (HTp startnote, HTp endnote); - void addBeams (HumdrumFile& infile); - void beamGraceNotes (HumdrumFile& infile); - string getBeamFromDur (HTp token, const string& text); - void removeQqMarks (HTp stok, HTp etok); - void removeQqMarks (HTp tok); - void removeBeams (HumdrumFile& infile); - void removeEdgeRests (HTp& startnote, HTp& endnote); - void breakBeamsByLyrics(HumdrumFile& infile); - void processStrandForLyrics(HTp stok, HTp etok); - bool hasSyllable (HTp token); - void splitBeam (HTp tok, HTp stok, HTp etok); - void splitBeam2 (vector& group, HTp tok); - void getBeamedNotes(vector& toks, HTp tok, HTp stok, HTp etok); - bool isLazy (vector& group); - void splitBeamLazy (vector& group, HTp tok); - void splitBeamNotLazy(vector& group, HTp tok); - void removeBeamCharacters(HTp token); + void initialize (HumdrumFile& infile); + void processStrand (HTp strandstart, HTp strandend); + void processMeasure (std::vector& measure); + void addBeam (HTp startnote, HTp endnote); + void addBeams (HumdrumFile& infile); + void beamGraceNotes (HumdrumFile& infile); + std::string getBeamFromDur (HTp token, const std::string& text); + void removeQqMarks (HTp stok, HTp etok); + void removeQqMarks (HTp tok); + void removeBeams (HumdrumFile& infile); + void removeEdgeRests (HTp& startnote, HTp& endnote); + void breakBeamsByLyrics (HumdrumFile& infile); + void processStrandForLyrics(HTp stok, HTp etok); + bool hasSyllable (HTp token); + void splitBeam (HTp tok, HTp stok, HTp etok); + void splitBeam2 (std::vector& group, HTp tok); + void getBeamedNotes (std::vector& toks, HTp tok, HTp stok, HTp etok); + bool isLazy (std::vector& group); + void splitBeamLazy (std::vector& group, HTp tok); + void splitBeamNotLazy (std::vector& group, HTp tok); + void removeBeamCharacters(HTp token); private: - std::vector > > m_timesigs; + std::vector > > m_timesigs; std::vector m_kernspines; bool m_overwriteQ = false; std::vector m_tracks; @@ -5620,61 +5851,61 @@ class Tool_autostem : public HumTool { bool run (HumdrumFileSet& infiles); bool run (HumdrumFile& infile); - bool run (const string& indata, ostream& out); - bool run (HumdrumFile& infile, ostream& out); + bool run (const std::string& indata, std::ostream& out); + bool run (HumdrumFile& infile, std::ostream& out); protected: void initialize (HumdrumFile& infile); void example (void); void usage (void); bool autostem (HumdrumFile& infile); - void getClefInfo (vector >& baseline, + void getClefInfo (std::vector>& baseline, HumdrumFile& infile); - void addStem (string& input, const string& piece); + void addStem (std::string& input, const std::string& piece); void processKernTokenStemsSimpleModel(HumdrumFile& infile, - vector >& baseline, + std::vector>& baseline, int row, int col); void removeStems (HumdrumFile& infile); void removeStem2 (HumdrumFile& infile, int row, int col); int getVoice (HumdrumFile& infile, int row, int col); - void getNotePositions (vector > >& notepos, - vector >& baseline, + void getNotePositions (std::vector>>& notepos, + std::vector>& baseline, HumdrumFile& infile); void printNotePositions (HumdrumFile& infile, - vector > >& notepos); - void getVoiceInfo (vector >& voice, HumdrumFile& infile); - void printVoiceInfo (HumdrumFile& infile, vector >& voice); + std::vector>>& notepos); + void getVoiceInfo (std::vector>& voice, HumdrumFile& infile); + void printVoiceInfo (HumdrumFile& infile, std::vector>& voice); void processKernTokenStems(HumdrumFile& infile, - vector >& baseline, int row, int col); - void getMaxLayers (vector& maxlayer, vector >& voice, + std::vector>& baseline, int row, int col); + void getMaxLayers (std::vector& maxlayer, std::vector>& voice, HumdrumFile& infile); - bool assignStemDirections (vector >& stemdir, - vector > & voice, - vector > >& notepos, + bool assignStemDirections (std::vector>& stemdir, + std::vector> & voice, + std::vector>>& notepos, HumdrumFile& infile); - void assignBasicStemDirections(vector >& stemdir, - vector >& voice, - vector > >& notepos, + void assignBasicStemDirections(std::vector>& stemdir, + std::vector>& voice, + std::vector>>& notepos, HumdrumFile& infile); - int determineChordStem (vector >& voice, - vector > >& notepos, + int determineChordStem (std::vector>& voice, + std::vector>>& notepos, HumdrumFile& infile, int row, int col); void insertStems (HumdrumFile& infile, - vector >& stemdir); + std::vector>& stemdir); void setStemDirection (HumdrumFile& infile, int row, int col, int direction); - bool getBeamState (vector >& beams, + bool getBeamState (std::vector>& beams, HumdrumFile& infile); - void countBeamStuff (const string& token, int& start, int& stop, + void countBeamStuff (const std::string& token, int& start, int& stop, int& flagr, int& flagl); - void getBeamSegments (vector >& beamednotes, - vector >& beamstates, - HumdrumFile& infile, vector maxlayer); - int getBeamDirection (vector& coords, - vector >& voice, - vector > >& notepos); - void setBeamDirection (vector >& stemdir, - vector& bnote, int direction); + void getBeamSegments (std::vector>& beamednotes, + std::vector>& beamstates, + HumdrumFile& infile, std::vector maxlayer); + int getBeamDirection (std::vector& coords, + std::vector>& voice, + std::vector>>& notepos); + void setBeamDirection (std::vector>& stemdir, + std::vector& bnote, int direction); private: int debugQ = 0; // used with --debug option @@ -5699,15 +5930,15 @@ class Tool_binroll : public HumTool { bool run (HumdrumFileSet& infiles); bool run (HumdrumFile& infile); - bool run (const string& indata, ostream& out); - bool run (HumdrumFile& infile, ostream& out); + bool run (const std::string& indata, std::ostream& out); + bool run (HumdrumFile& infile, std::ostream& out); protected: void processFile (HumdrumFile& infile); - void processStrand (vector>& roll, HTp starting, + void processStrand (std::vector>& roll, HTp starting, HTp ending); void printAnalysis (HumdrumFile& infile, - vector>& roll); + std::vector>& roll); private: HumNum m_duration; @@ -5717,35 +5948,94 @@ class Tool_binroll : public HumTool { class Tool_chantize : public HumTool { public: - Tool_chantize (void); - ~Tool_chantize () {}; + Tool_chantize (void); + ~Tool_chantize () {}; - bool run (HumdrumFileSet& infiles); - bool run (HumdrumFile& infile); - bool run (const string& indata, ostream& out); - bool run (HumdrumFile& infile, ostream& out); + bool run (HumdrumFileSet& infiles); + bool run (HumdrumFile& infile); + bool run (const std::string& indata, std::ostream& out); + bool run (HumdrumFile& infile, std::ostream& out); protected: - void initialize (HumdrumFile& infile); - void processFile (HumdrumFile& infile); - void outputFile (HumdrumFile& infile); - void updateKeySignatures(HumdrumFile& infile, int lineindex); - void checkDataLine (HumdrumFile& infile, int lineindex); - void clearStates (void); - void addBibliographicRecords(HumdrumFile& infile); - void deleteBreaks (HumdrumFile& infile); - void fixEditorialAccidentals(HumdrumFile& infile); - void fixInstrumentAbbreviations(HumdrumFile& infile); - void deleteDummyTranspositions(HumdrumFile& infile); - string getDate (void); - vector getTerminalRestStates(HumdrumFile& infile); - bool hasDiamondNotes (HumdrumFile& infile); + void initialize (HumdrumFile& infile); + void processFile (HumdrumFile& infile); + void outputFile (HumdrumFile& infile); + void updateKeySignatures (HumdrumFile& infile, int lineindex); + void checkDataLine (HumdrumFile& infile, int lineindex); + void clearStates (void); + void addBibliographicRecords (HumdrumFile& infile); + void deleteBreaks (HumdrumFile& infile); + void fixEditorialAccidentals (HumdrumFile& infile); + void fixInstrumentAbbreviations(HumdrumFile& infile); + void deleteDummyTranspositions (HumdrumFile& infile); + std::string getDate (void); + std::vector getTerminalRestStates (HumdrumFile& infile); + bool hasDiamondNotes (HumdrumFile& infile); private: - vector> m_pstates; - vector> m_kstates; - vector> m_estates; + std::vector> m_pstates; + std::vector> m_kstates; + std::vector> m_estates; bool m_diamondQ = false; +}; + + +class Tool_chint : public HumTool { + public: + Tool_chint (void); + ~Tool_chint () {}; + + bool run (HumdrumFileSet& infiles); + bool run (HumdrumFile& infile); + bool run (const std::string& indata, std::ostream& out); + bool run (HumdrumFile& infile, std::ostream& out); + + protected: + void processFile (HumdrumFile& infile); + void initialize (void); + void fillIntervalNames (void); + void fillIntervalNamesDiatonic(void); + void chromaticColoring (void); + void dissonanceColoring (void); + void getPartIntervals (std::vector& topInterval, + std::vector& botInterval, + HTp botSpine, HTp topSpine, HumdrumFile& infile); + void insertPartColors (HumdrumFile& infile, std::vector& botInterval, + std::vector& topInterval, int botTrack, int topTrack); + std::string getColorToken (int interval, HumdrumFile& infile, int line, HTp token); + std::string getIntervalToken (int interval, HumdrumFile& infile, int line); + + private: + // m_color: Color mapping for notes, indexed by base-40: + std::vector m_color; + + // m_intervals: Names of intervals indexed by base-40: + std::vector m_intervals; + + // Used in particular to avoid adding interval when both + // staves have tied notes: + std::vector m_botPitch; + std::vector m_topPitch; + + // m_intervalQ: Show interval numbers + bool m_intervalQ = false; + + // m_octaveQ: Do not collapse octaves to unisons. + bool m_octaveQ = false; + + // m_noColorBotQ: Do not colorize bottom analysis staff + bool m_noColorBotQ = false; + + // m_noColortopQ: Do not colorize top analysis staff + bool m_noColorTopQ = false; + + // m_negativeQ: Add minus sign to intervals + // when staff notes are crossed. + bool m_negativeQ = false; + + // m_middle: Add intervals between analysis staves, or actually + // below top staff. (Only effective in JavaScript compiled code.) + bool m_middleQ = true; }; @@ -5756,18 +6046,18 @@ class Tool_chooser : public HumTool { ~Tool_chooser () {}; bool run (HumdrumFileSet& infiles); - bool run (const string& indata); + bool run (const std::string& indata); bool run (HumdrumFileStream& instream); protected: void processFiles (HumdrumFileSet& infiles); void initialize (void); - void expandSegmentList (vector& field, string& fieldstring, + void expandSegmentList (std::vector& field, std::string& fieldstring, int maximum); - void processSegmentEntry(vector& field, - const string& astring, int maximum); - void removeDollarsFromString(string& buffer, int maximum); + void processSegmentEntry(std::vector& field, + const std::string& astring, int maximum); + void removeDollarsFromString(std::string& buffer, int maximum); private: @@ -5781,15 +6071,15 @@ class Tool_chord : public HumTool { bool run (HumdrumFileSet& infiles); bool run (HumdrumFile& infile); - bool run (const string& indata, ostream& out); - bool run (HumdrumFile& infile, ostream& out); + bool run (const std::string& indata, std::ostream& out); + bool run (HumdrumFile& infile, std::ostream& out); protected: void processFile (HumdrumFile& infile, int direction); void processChord (HTp tok, int direction); void initialize (void); - void minimizeChordPitches(vector& notes, vector>& pitches); - void maximizeChordPitches(vector& notes, vector>& pitches); + void minimizeChordPitches(std::vector& notes, std::vector>& pitches); + void maximizeChordPitches(std::vector& notes, std::vector>& pitches); private: int m_direction = 0; @@ -6003,7 +6293,7 @@ class cmr_note_info { HumNum getStartTime (void); HumNum getEndTime (void); int getMidiPitch (void); - string getPitch (void); + std::string getPitch (void); HTp getToken (void); int getLineIndex (void); double getNoteStrength (void); @@ -6068,7 +6358,7 @@ class cmr_group_info { int getSyncopationCount(void); void makeInvalid (void); bool isValid (void); - string getPitch (void); + std::string getPitch (void); HumNum getEndTime (void); HumNum getGroupDuration (void); HumNum getStartTime (void); @@ -6137,7 +6427,7 @@ class Tool_cmr : public HumTool { int getGroupNoteCount (void); int getStrengthScore (void); void printStatistics (HumdrumFile& infile); - string getComposer (HumdrumFile& infile); + std::string getComposer (HumdrumFile& infile); void printSummaryStatistics (HumdrumFile& infile); void storeVegaData (HumdrumFile& infile); void printVegaPlot (void); @@ -6250,8 +6540,8 @@ class Tool_colorgroups : public HumTool { bool run (HumdrumFileSet& infiles); bool run (HumdrumFile& infile); - bool run (const string& indata, ostream& out); - bool run (HumdrumFile& infile, ostream& out); + bool run (const std::string& indata, std::ostream& out); + bool run (HumdrumFile& infile, std::ostream& out); protected: void processFile (HumdrumFile& infile); @@ -6267,8 +6557,8 @@ class Tool_colortriads : public HumTool { bool run (HumdrumFileSet& infiles); bool run (HumdrumFile& infile); - bool run (const string& indata, ostream& out); - bool run (HumdrumFile& infile, ostream& out); + bool run (const std::string& indata, std::ostream& out); + bool run (HumdrumFile& infile, std::ostream& out); protected: void processFile (HumdrumFile& infile); @@ -6276,7 +6566,7 @@ class Tool_colortriads : public HumTool { int getDiatonicTransposition(HumdrumFile& infile); private: - std::vector m_colorState; + std::vector m_colorState; std::vector m_color; std::vector m_searches; std::vector m_marks; @@ -6310,12 +6600,12 @@ class Tool_composite : public HumTool { void assignGroups (HumdrumFile& infile); void analyzeLineGroups (HumdrumFile& infile); void analyzeLineGroup (HumdrumFile& infile, int line, - const string& target); + const std::string& target); void extractGroup (HumdrumFile& infile, const std::string &target); void getNumericGroupStates (std::vector& states, HumdrumFile& infile, const std::string& tgroup); int getGroupNoteType (HumdrumFile& infile, int line, const std::string& group); HumNum getLineDuration (HumdrumFile& infile, int index, - std::vector& isNull); + std::vector& isNull); void backfillGroup (std::vector>& curgroup, HumdrumFile& infile, int line, int track, int subtrack, const std::string& group); @@ -6341,8 +6631,8 @@ class Tool_composite : public HumTool { void getGroupRhythms (std::vector& rhythms, std::vector& durs, std::vector& states, HumdrumFile& infile); - int typeStringToInt (const string& value); - void addNumericAnalyses (ostream& output, HumdrumFile& infile, int line, + int typeStringToInt (const std::string& value); + void addNumericAnalyses (std::ostream& output, HumdrumFile& infile, int line, std::vector>& rhythmIndex); void analyzeOutputVariables(HumdrumFile& infile); std::string getTimeSignature (HumdrumFile& infile, int line, const std::string& group); @@ -6354,13 +6644,13 @@ class Tool_composite : public HumTool { void addTimeSignatureChanges (HumdrumFile& output, HumdrumFile& infile); void addMeterSignatureChanges (HumdrumFile& output, HumdrumFile& infile); void adjustBadCoincidenceRests (HumdrumFile& output, HumdrumFile& infile); - HTp fixBadRestRhythm (HTp token, string& rhythm, HumNum tstop, HumNum tsbot); + HTp fixBadRestRhythm (HTp token, std::string& rhythm, HumNum tstop, HumNum tsbot); std::string generateSizeLine (HumdrumFile& output, HumdrumFile& input, int line); void convertNotesToRhythms (HumdrumFile& infile); - int getEventCount (std::vector& data); - void fixTiedNotes (std::vector& data, HumdrumFile& infile); - void doOnsetAnalysisCoincidence(vector& output, - vector& inputA, vector& inputB); + int getEventCount (std::vector& data); + void fixTiedNotes (std::vector& data, HumdrumFile& infile); + void doOnsetAnalysisCoincidence(std::vector& output, + std::vector& inputA, std::vector& inputB); void checkForAutomaticGrouping (HumdrumFile& infile); // Numeric analysis functions: @@ -6368,7 +6658,7 @@ class Tool_composite : public HumTool { void doOnsetAnalyses (HumdrumFile& infile); void doOnsetAnalysis (std::vector& analysis, HumdrumFile& infile, - const string& targetGroup); + const std::string& targetGroup); void doAccentAnalyses (HumdrumFile& infile); @@ -6417,7 +6707,7 @@ class Tool_composite : public HumTool { bool m_analysisOrnamentsQ = false; // used with -O option bool m_analysisSlursQ = false; // used with -S option bool m_analysisTotalQ = false; // used with -T option - std::vector m_analysisIndex; // -PAOST booleans in array + std::vector m_analysisIndex; // -PAOST booleans in array bool m_analysesQ = false; // union of -PAOST options int m_numericAnalysisSpineCount = 0; // sum of -PAOST options @@ -6504,8 +6794,8 @@ class Tool_compositeold : public HumTool { bool run (HumdrumFileSet& infiles); bool run (HumdrumFile& infile); - bool run (const std::string& indata, ostream& out); - bool run (HumdrumFile& infile, ostream& out); + bool run (const std::string& indata, std::ostream& out); + bool run (HumdrumFile& infile, std::ostream& out); protected: void processFile (HumdrumFile& infile); @@ -6539,13 +6829,13 @@ class Tool_compositeold : public HumTool { void getBeamedNotes (std::vector& notes, HTp starting); void getPitches (std::vector& pitches, HTp token); void addLabelsAndStria (HumdrumFile& infile); - void addLabels (HTp sstart, int labelIndex, const string& label, - int abbrIndex, const string& abbr); + void addLabels (HTp sstart, int labelIndex, const std::string& label, + int abbrIndex, const std::string& abbr); void addStria (HumdrumFile& infile, HTp spinestart); void addVerseLabels (HumdrumFile& infile, HTp spinestart); void addVerseLabels2 (HumdrumFile& infile, HTp spinestart); - bool pitchesEqual (vector& pitches1, vector& pitches2); - void mergeTremoloGroup (vector& notes, vector groups, int group); + bool pitchesEqual (std::vector& pitches1, std::vector& pitches2); + void mergeTremoloGroup (std::vector& notes, std::vector groups, int group); bool onlyAuxTremoloNotes (HumdrumFile& infile, int line); void removeAuxTremolosFromCompositeRhythm(HumdrumFile& infile); void markTogether (HumdrumFile& infile, int direction); @@ -6556,41 +6846,41 @@ class Tool_compositeold : public HumTool { void analyzeNestingDataGroups(HumdrumFile& infile, int direction); void analyzeNestingDataAll(HumdrumFile& infile, int direction); void getNestData (HTp spine, int& total, int& coincide); - void getCoincidenceRhythms(vector& rhythms, vector& coincidences, + void getCoincidenceRhythms(std::vector& rhythms, std::vector& coincidences, HumdrumFile& infile); - void fillInCoincidenceRhythm(vector& coincidences, + void fillInCoincidenceRhythm(std::vector& coincidences, HumdrumFile& infile, int direction); void processCoincidenceInterpretation(HumdrumFile& infile, HTp token); bool hasPipeRdf (HumdrumFile& infile); - void extractGroup (HumdrumFile& infile, const string &target); - void backfillGroup (vector>& curgroup, HumdrumFile& infile, - int line, int track, int subtrack, const string& group); + void extractGroup (HumdrumFile& infile, const std::string &target); + void backfillGroup (std::vector>& curgroup, HumdrumFile& infile, + int line, int track, int subtrack, const std::string& group); void analyzeComposite (HumdrumFile& infile); - void analyzeCompositeOnsets(HumdrumFile& infile, vector& groups, vector& tracks); - void analyzeCompositeAccents(HumdrumFile& infile, vector& groups, vector& tracks); - void analyzeCompositeOrnaments(HumdrumFile& infile, vector& groups, vector& tracks); - void analyzeCompositeSlurs(HumdrumFile& infile, vector& groups, vector& tracks); - void analyzeCompositeTotal(HumdrumFile& infile, vector& groups, vector& tracks); + void analyzeCompositeOnsets(HumdrumFile& infile, std::vector& groups, std::vector& tracks); + void analyzeCompositeAccents(HumdrumFile& infile, std::vector& groups, std::vector& tracks); + void analyzeCompositeOrnaments(HumdrumFile& infile, std::vector& groups, std::vector& tracks); + void analyzeCompositeSlurs(HumdrumFile& infile, std::vector& groups, std::vector& tracks); + void analyzeCompositeTotal(HumdrumFile& infile, std::vector& groups, std::vector& tracks); void getCompositeSpineStarts(std::vector& groups, HumdrumFile& infile); - std::vector getExpansionList(vector& tracks, int maxtrack, int count); - std::string makeExpansionString(vector& tracks); + std::vector getExpansionList(std::vector& tracks, int maxtrack, int count); + std::string makeExpansionString(std::vector& tracks); void doCoincidenceAnalysis(HumdrumFile& outfile, HumdrumFile& infile, int ctrack, HTp compositeoldStart); void doTotalAnalysis(HumdrumFile& outfile, HumdrumFile& infile, int ctrack); void doGroupAnalyses(HumdrumFile& outfile, HumdrumFile& infile); int countNoteOnsets(HTp token); - void doTotalOnsetAnalysis(vector& analysis, HumdrumFile& infile, - int track, vector& tracks); - void doGroupOnsetAnalyses(vector& analysisA, - vector& analysisB, + void doTotalOnsetAnalysis(std::vector& analysis, HumdrumFile& infile, + int track, std::vector& tracks); + void doGroupOnsetAnalyses(std::vector& analysisA, + std::vector& analysisB, HumdrumFile& infile); - void doCoincidenceOnsetAnalysis(vector>& analysis); - void insertAnalysesIntoFile(HumdrumFile& outfile, vector& spines, - vector& trackMap, vector& tracks); - void assignAnalysesToVdataTracks(vector*>& data, - vector& spines, HumdrumFile& outfile); + void doCoincidenceOnsetAnalysis(std::vector>& analysis); + void insertAnalysesIntoFile(HumdrumFile& outfile, std::vector& spines, + std::vector& trackMap, std::vector& tracks); + void assignAnalysesToVdataTracks(std::vector*>& data, + std::vector& spines, HumdrumFile& outfile); private: std::string m_pitch = "eR"; // pitch to display for compositeold rhythm @@ -6622,11 +6912,11 @@ class Tool_compositeold : public HumTool { bool m_analysisTotalQ = false; // used with -T option bool m_analysisQ = false; // union of -paost options bool m_nozerosQ = false; // used with -Z option - vector> m_analysisOnsets; // used with -P - vector> m_analysisAccents; // used with -A - vector> m_analysisOrnaments; // used with -O - vector> m_analysisSlurs; // used with -S - vector> m_analysisTotal; // used with -T + std::vector> m_analysisOnsets; // used with -P + std::vector> m_analysisAccents; // used with -A + std::vector> m_analysisOrnaments; // used with -O + std::vector> m_analysisSlurs; // used with -S + std::vector> m_analysisTotal; // used with -T }; @@ -6676,7 +6966,7 @@ class Tool_deg : public HumTool { static void setShowTies (bool state) { m_showTiesQ = state; } static void setShowZeros (bool state) { m_showZerosQ = state; } static void setShowOctaves (bool state) { m_octaveQ = state; } - static void setForcedKey (const string& key) { m_forcedKey = key; } + static void setForcedKey (const std::string& key) { m_forcedKey = key; } protected: // ScaleDegree class std::string generateDegDataToken (void) const; @@ -6780,16 +7070,16 @@ class Tool_deg : public HumTool { void initialize (void); bool setupSpineInfo (HumdrumFile& infile); - void prepareDegSpine (vector>& degspine, HTp kernstart, HumdrumFile& infil); + void prepareDegSpine (std::vector>& degspine, HTp kernstart, HumdrumFile& infil); void printDegScore (HumdrumFile& infile); void printDegScoreInterleavedWithInputScore(HumdrumFile& infile); std::string createOutputHumdrumLine (HumdrumFile& infile, int lineIndex); std::string prepareMergerLine (std::vector>& merge); void calculateManipulatorOutputForSpine(std::vector& lineout, std::vector& linein); std::string createRecipInterpretation(const std::string& starttok, int refLine); - std::string createDegInterpretation (const string& degtok, int refLine, bool addPreSpine); - std::string printDegInterpretation (const string& interp, HumdrumFile& infile, int lineIndex); - void getModeAndTonic (string& mode, int& b40tonic, const string& token); + std::string createDegInterpretation (const std::string& degtok, int refLine, bool addPreSpine); + std::string printDegInterpretation (const std::string& interp, HumdrumFile& infile, int lineIndex); + void getModeAndTonic (std::string& mode, int& b40tonic, const std::string& token); bool isDegAboveLine (HumdrumFile& infile, int lineIndex); bool isDegArrowLine (HumdrumFile& infile, int lineIndex); @@ -6800,15 +7090,15 @@ class Tool_deg : public HumTool { bool isDegSolfegeLine (HumdrumFile& infile, int lineIndex); bool isKeyDesignationLine (HumdrumFile& infile, int lineIndex); - void checkAboveStatus (string& value, bool arrowStatus); - void checkArrowStatus (string& value, bool arrowStatus); - void checkBoxStatus (string& value, bool arrowStatus); - void checkCircleStatus (string& value, bool arrowStatus); - void checkColorStatus (string& value, bool arrowStatus); - void checkHatStatus (string& value, bool arrowStatus); - void checkSolfegeStatus (string& value, bool arrowStatus); + void checkAboveStatus (std::string& value, bool arrowStatus); + void checkArrowStatus (std::string& value, bool arrowStatus); + void checkBoxStatus (std::string& value, bool arrowStatus); + void checkCircleStatus (std::string& value, bool arrowStatus); + void checkColorStatus (std::string& value, bool arrowStatus); + void checkHatStatus (std::string& value, bool arrowStatus); + void checkSolfegeStatus (std::string& value, bool arrowStatus); - void checkKeyDesignationStatus(string& value, int keyDesignationStatus); + void checkKeyDesignationStatus(std::string& value, int keyDesignationStatus); private: // Tool_deg class @@ -7052,15 +7342,15 @@ class Tool_double : public HumTool { bool run (HumdrumFileSet& infiles); bool run (HumdrumFile& infile); - bool run (const string& indata, ostream& out); - bool run (HumdrumFile& infile, ostream& out); + bool run (const std::string& indata, std::ostream& out); + bool run (HumdrumFile& infile, std::ostream& out); protected: void initialize (HumdrumFile& infile); void processFile (HumdrumFile& infile); void doubleRhythms (HumdrumFile& infile); void terminalBreveToTerminalLong(HumdrumFile& infile); - void processBeamsForMeasure(vector& notes); + void processBeamsForMeasure(std::vector& notes); void adjustBeams (HumdrumFile& infile); void adjustBeams (HTp sstart, HTp send); @@ -7069,6 +7359,201 @@ class Tool_double : public HumTool { }; +class Tool_esac2hum : public HumTool { + public: + + class Note { + public: + std::vector m_errors; + std::string esac; + int m_dots = 0; + int m_underscores = 0; + int m_octave = 0; + int m_degree = 0; // scale degree (wrt major key) + int m_b40degree = 0; // scale degree as b40 interval + int m_alter = 0; // chromatic alteration of degree (flats/sharp from major scale degrees) + double m_ticks = 0.0; + bool m_tieBegin = false; + bool m_tieEnd = false; + bool m_phraseBegin = false; + bool m_phraseEnd = false; + std::string m_humdrum; // **kern conversion of EsAC note + int m_b40 = 0; // absolute b40 pitch (-1000 = rest); + int m_b12 = 0; // MIDI note number (-1000 = rest); + HumNum m_factor = 1; // for triplet which is 2/3 duration + + void calculateRhythms(int minrhy); + void calculatePitches(int tonic); + bool parseNote(const std::string& note, HumNum factor); + void generateHumdrum(int minrhy, int b40tonic); + bool isPitch(void); + bool isRest(void); + std::string getScaleDegree(void); + }; + + class Measure : public std::vector { + public: + std::vector m_errors; + std::string esac; + int m_barnum = -1000; // -1000 == unassigned bar number for this measure + // m_barnum = -1 == invisible barline (between two partial measures) + // m_barnum = 0 == pickup measure (partial measure at start of music) + double m_ticks = 0.0; + double m_tsticks = 0.0; + // m_measureTimeSignature is a **kern time signature + // (change) to display in the converted score. + std::string m_measureTimeSignature = ""; + bool m_partialBegin = false; // start of an incomplete measure + bool m_partialEnd = false; // end of an incomplete measure (pickup) + bool m_complete = false; // a complste measure + void calculateRhythms(int minrhy); + void calculatePitches(int tonic); + bool parseMeasure(const std::string& measure); + bool isUnassigned(void); + void setComplete(void); + bool isComplete(void); + void setPartialBegin(void); + bool isPartialBegin(void); + void setPartialEnd(void); + bool isPartialEnd(void); + }; + + class Phrase : public std::vector { + public: + std::vector m_errors; + double m_ticks = 0.0; + std::string esac; + void calculateRhythms(int minrhy); + void calculatePitches(int tonic); + bool parsePhrase(const std::string& phrase); + std::string getLastScaleDegree(); + void getNoteList(std::vector& notelist); + std::string getNO_REP(void); + int getFullMeasureCount(void); + }; + + class Score : public std::vector { + public: + int m_b40tonic = 0; + int m_minrhy = 0; + std::string m_clef; + std::string m_keysignature; + std::string m_keydesignation; + std::string m_timesig; + std::map m_params; + std::vector m_errors; + bool m_finalBarline = false; + bool hasFinalBarline(void) { return m_finalBarline; } + void calculateRhythms(int minrhy); + void calculatePitches(int tonic); + bool parseMel(const std::string& mel); + void analyzeTies(void); + void analyzePhrases(void); + void getNoteList(std::vector& notelist); + void getMeasureList(std::vector& measurelist); + void getPhraseNoteList(std::vector& notelist, int index); + void generateHumdrumNotes(void); + void calculateClef(void); + void calculateKeyInformation(void); + void calculateTimeSignatures(void); + void setAllTimesigTicks(double ticks); + void assignFreeMeasureNumbers(void); + void assignSingleMeasureNumbers(void); + void prepareMultipleTimeSignatures(const std::string& ts); + + void doAnalyses(void); + void analyzeMEL_SEM(void); + void analyzeMEL_RAW(void); + void analyzeNO_REP(void); + void analyzeRTM(void); + void analyzeSCL_DEG(void); + void analyzeSCL_SEM(void); + void analyzePHR_NO(void); + void analyzePHR_BARS(void); + void analyzePHR_CAD(void); + void analyzeACC(void); + }; + + Tool_esac2hum (void); + ~Tool_esac2hum () {}; + + bool convertFile (std::ostream& out, const std::string& filename); + bool convert (std::ostream& out, const std::string& input); + bool convert (std::ostream& out, std::istream& input); + + + protected: + void initialize (void); + + void convertEsacToHumdrum(std::ostream& output, std::istream& infile); + bool getSong (std::vector& song, std::istream& infile); + void convertSong (std::ostream& output, std::vector& infile); + static std::string trimSpaces (const std::string& input); + void printHeader (std::ostream& output); + void printFooter (std::ostream& output, std::vector& infile); + void printConversionDate (std::ostream& output); + void printPdfLinks (std::ostream& output); + void printParameters (void); + void printPageNumbers (std::ostream& output); + void getParameters (std::vector& infile); + void cleanText (std::string& buffer); + std::string createFilename (void); + void printBemComment (std::ostream& output); + void processSong (void); + void printScoreContents (std::ostream& output); + void embedAnalyses (std::ostream& output); + void printPdfUrl (std::ostream& output); + std::string getKolbergUrl (int volume); + void printKolbergPdfUrl (std::ostream& output); + + private: + bool m_debugQ = false; // used with --debug option + bool m_verboseQ = false; // used with --verbose option + std::string m_verbose; // p = print EsAC phrases, m = print measures, n = print notes. + // t after p, m, or n means print tick info + bool m_embedEsacQ = true; // used with -E option + bool m_dwokQ = false; // true if source is Oskar Kolberg: Dzieła Wszystkie + // (Oskar Kolberg: Complete Works) + // determined automatically if header line or TRD source contains "DWOK" string. + bool m_analysisQ = false; // used with -a option + + int m_inputline = 0; // used to keep track if the EsAC input line. + + std::string m_filePrefix; + std::string m_filePostfix = ".krn"; + bool m_fileTitleQ = false; + + std::string m_prevline; + std::string m_cutline; + std::vector m_globalComments; + + bool m_initialized = false; + int m_minrhy = 0; + + Tool_esac2hum::Score m_score; + + class KolbergInfo { + public: + std::string titlePL; + std::string titleEN; + int firstPrintPage; + int firstScanPage; + std::vector plates; + + KolbergInfo(void) { firstPrintPage = 0; firstScanPage = 0; } + KolbergInfo( + const std::string& pl, const std::string& en, int fpp, int fsp, const std::vector& plts) + : titlePL(pl), titleEN(en), firstPrintPage(fpp), firstScanPage(fsp), plates(plts) {} + }; + std::map m_kinfo; + KolbergInfo getKolbergInfo(int volume); + std::string getKolbergUrl(int volume, int printPage); + int calculateScanPage(int inputPrintPage, int printPage, int scanPage, const std::vector& platePages); + + +}; + + #define ND_NOTE 0 /* notes or rests + text and phrase markings */ #define ND_BAR 1 /* explicit barlines */ @@ -7093,72 +7578,74 @@ class NoteData { int phstart; int phend; int phnum; int slstart; int slend; int lyricnum; int tiestart; int tiecont; int tieend; - string text; + std::string text; }; -class Tool_esac2hum : public HumTool { +class Tool_esac2humold : public HumTool { public: - Tool_esac2hum (void); - ~Tool_esac2hum () {}; + Tool_esac2humold (void); + ~Tool_esac2humold () {}; - bool convertFile (ostream& out, const string& filename); - bool convert (ostream& out, const string& input); - bool convert (ostream& out, istream& input); + bool convertFile (std::ostream& out, const std::string& filename); + bool convert (std::ostream& out, const std::string& input); + bool convert (std::ostream& out, std::istream& input); protected: bool initialize (void); void checkOptions (Options& opts, int argc, char** argv); void example (void); - void usage (const string& command); - void convertEsacToHumdrum (ostream& out, istream& input); - bool getSong (vector& song, istream& infile, + void usage (const std::string& command); + void convertEsacToHumdrum (std::ostream& out, std::istream& input); + bool getSong (std::vector& song, std::istream& infile, int init); - void convertSong (vector& song, ostream& out); - bool getKeyInfo (vector& song, string& key, - double& mindur, int& tonic, string& meter, - ostream& out); - void printNoteData (NoteData& data, int textQ, ostream& out); - bool getNoteList (vector& song, - vector& songdata, double mindur, + void convertSong (std::vector& song, std::ostream& out); + bool getKeyInfo (std::vector& song, std::string& key, + double& mindur, int& tonic, std::string& meter, + std::ostream& out); + void printNoteData (NoteData& data, int textQ, std::ostream& out); + bool getNoteList (std::vector& song, + std::vector& songdata, double mindur, int tonic); - void getMeterInfo (string& meter, vector& numerator, - vector& denominator); - void postProcessSongData (vector& songdata, - vector& numerator,vector& denominator); - void printKeyInfo (vector& songdata, int tonic, - int textQ, ostream& out); + void getMeterInfo (std::string& meter, std::vector& numerator, + std::vector& denominator); + void postProcessSongData (std::vector& songdata, + std::vector& numerator,std::vector& denominator); + void printKeyInfo (std::vector& songdata, int tonic, + int textQ, std::ostream& out); int getAccidentalMax (int a, int b, int c); - bool printTitleInfo (vector& song, ostream& out); - void getLineRange (vector& song, const string& field, + bool printTitleInfo (std::vector& song, std::ostream& out); + void getLineRange (std::vector& song, const std::string& field, int& start, int& stop); - void printChar (unsigned char c, ostream& out); - void printBibInfo (vector& song, ostream& out); - void printString (const string& string, ostream& out); - void printSpecialChars (ostream& out); - bool placeLyrics (vector& song, - vector& songdata); - bool placeLyricPhrase (vector& songdata, - vector& lyrics, int line); - void getLyrics (vector& lyrics, const string& buffer); - void cleanupLyrics (vector& lyrics); - bool getFileContents (vector& array, const string& filename); - void chopExtraInfo (string& buffer); - void printHumdrumHeaderInfo(ostream& out, vector& song); - void printHumdrumFooterInfo(ostream& out, vector& song); + void printChar (unsigned char c, std::ostream& out); + void printBibInfo (std::vector& song, std::ostream& out); + void printString (const std::string& string, std::ostream& out); + void printSpecialChars (std::ostream& out); + bool placeLyrics (std::vector& song, + std::vector& songdata); + bool placeLyricPhrase (std::vector& songdata, + std::vector& lyrics, int line); + void getLyrics (std::vector& lyrics, const std::string& buffer); + void cleanupLyrics (std::vector& lyrics); + bool getFileContents (std::vector& array, const std::string& filename); + void chopExtraInfo (std::string& buffer); + void printHumdrumHeaderInfo(std::ostream& out, std::vector& song); + void printHumdrumFooterInfo(std::ostream& out, std::vector& song); private: - int debugQ = 0; // used with --debug option - int verboseQ = 0; // used with -v option - int splitQ = 0; // used with -s option - int firstfilenum = 1; // used with -f option - vector header; // used with -h option - vector trailer; // used with -t option - string fileextension; // used with -x option - string namebase; // used with -s option - - vector chartable; // used printChars() & printSpecialChars() + int debugQ = 0; // used with --debug option + int verboseQ = 0; // used with -v option + int splitQ = 0; // used with -s option + int firstfilenum = 1; // used with -f option + std::vector header; // used with -h option + std::vector trailer; // used with -t option + std::string fileextension; // used with -x option + std::string namebase; // used with -s option + + // Modern ESaC files use UTF-8 characters, older ESaC files use + // ASCII encodings of non-UTF7 characters: + std::vector chartable; // used in printChars() & printSpecialChars() int inputline = 0; }; @@ -7247,27 +7734,28 @@ class Tool_extract : public HumTool { void fillFieldDataByNoRest (std::vector& field, std::vector& subfield, std::vector& model, const std::string& searchstring, HumdrumFile& infile, int state); + void printInterpretationForKernSpine(HumdrumFile& infile, int index); private: // global variables - int excludeQ = 0; // used with -x option - int expandQ = 0; // used with -e option - std::string expandInterp = ""; // used with -E option - int interpQ = 0; // used with -i option - std::string interps = ""; // used with -i option - int debugQ = 0; // used with --debug option - int kernQ = 0; // used with -k option - int rkernQ = 0; // used with -K option - int fieldQ = 0; // used with -f or -p option - std::string fieldstring = ""; // used with -f or -p option + bool excludeQ = false; // used with -x option + bool expandQ = false; // used with -e option + std::string expandInterp = ""; // used with -E option + bool interpQ = false; // used with -i option + std::string interps = ""; // used with -i option + bool debugQ = false; // used with --debug option + bool kernQ = false; // used with -k option + bool rkernQ = false; // used with -K option + bool fieldQ = false; // used with -f or -p option + std::string fieldstring = ""; // used with -f or -p option std::vector field; // used with -f or -p option std::vector subfield; // used with -f or -p option std::vector model; // used with -p, or -e options and similar - int countQ = 0; // used with -C option - int traceQ = 0; // used with -t option - std::string tracefile = ""; // used with -t option - int reverseQ = 0; // used with -r option + bool countQ = false; // used with -C option + bool traceQ = false; // used with -t option + std::string tracefile = ""; // used with -t option + bool reverseQ = false; // used with -r option std::string reverseInterp = "**kern"; // used with -r and -R options. // sub-spine "b" expansion model: how to generate data for a secondary // spine if the primary spine is not divided. Models are: @@ -7277,17 +7765,18 @@ class Tool_extract : public HumTool { // data. 'n' will be used for non-kern spines when 'r' is used. int submodel = 'd'; // used with -m option std::string editorialInterpretation = "yy"; - std::string cointerp = "**kern"; // used with -c option - int comodel = 0; // used with -M option + std::string cointerp = "**kern"; // used with -c option + int comodel = 0; // used with -M option std::string subtokenseparator = " "; // used with a future option - int interpstate = 0; // used -I or with -i - int grepQ = 0; // used with -g option - std::string grepString = ""; // used with -g option + int interpstate = 0; // used -I or with -i + bool grepQ = false; // used with -g option + std::string grepString = ""; // used with -g option std::string blankName = "**blank"; // used with -n option - int noEmptyQ = 0; // used with --no-empty option - int emptyQ = 0; // used with --empty option - int spineListQ = 0; // used with --spine option - int removerestQ = 0; // used with --no-rest option + bool addRestsQ = false; // used with -n option + bool noEmptyQ = false; // used with --no-empty option + bool emptyQ = false; // used with --empty option + bool spineListQ = false; // used with --spine option + bool removerestQ = false; // used with --no-rest option }; @@ -7390,22 +7879,22 @@ class Tool_filter : public HumTool { bool run (HumdrumFileSet& infiles); bool run (HumdrumFile& infile); - bool run (const string& indata); + bool run (const std::string& indata); bool runUniversal (HumdrumFileSet& infiles); protected: - void getCommandList (vector >& commands, + void getCommandList (std::vector >& commands, HumdrumFile& infile); void getUniversalCommandList(std::vector >& commands, HumdrumFileSet& infiles); void initialize (HumdrumFile& infile); void removeGlobalFilterLines (HumdrumFile& infile); void removeUniversalFilterLines (HumdrumFileSet& infiles); - void splitPipeline (vector& clist, const string& command); + void splitPipeline (std::vector& clist, const std::string& command); private: - string m_variant; // used with -v option. + std::string m_variant; // used with -v option. bool m_debugQ = false; // used with --debug option }; @@ -7418,17 +7907,17 @@ class Tool_fixps : public HumTool { bool run (HumdrumFileSet& infiles); bool run (HumdrumFile& infile); - bool run (const string& indata, ostream& out); - bool run (HumdrumFile& infile, ostream& out); + bool run (const std::string& indata, std::ostream& out); + bool run (HumdrumFile& infile, std::ostream& out); protected: void initialize (HumdrumFile& infile); void processFile (HumdrumFile& infile); void markEmptyVoices (HumdrumFile& infile); - void removeEmpties (vector>& newlist, HumdrumFile& infile); + void removeEmpties (std::vector>& newlist, HumdrumFile& infile); void removeDuplicateDynamics(HumdrumFile& infile); - void outputNewSpining (vector>& newlist, HumdrumFile& infile); - void printNewManipulator(HumdrumFile& infile, vector>& newlist, int line); + void outputNewSpining (std::vector>& newlist, HumdrumFile& infile); + void printNewManipulator(HumdrumFile& infile, std::vector>& newlist, int line); private: @@ -7442,8 +7931,8 @@ class Tool_flipper : public HumTool { bool run (HumdrumFileSet& infiles); bool run (HumdrumFile& infile); - bool run (const string& indata, ostream& out); - bool run (HumdrumFile& infile, ostream& out); + bool run (const std::string& indata, std::ostream& out); + bool run (HumdrumFile& infile, std::ostream& out); protected: void processFile (HumdrumFile& infile); @@ -7451,9 +7940,9 @@ class Tool_flipper : public HumTool { void processLine (HumdrumFile& infile, int index); void checkForFlipChanges(HumdrumFile& infile, int index); - bool flipSubspines (vector>& flipees); - void flipSpineTokens (vector& subtokens); - void extractFlipees (vector>& flipees, + bool flipSubspines (std::vector>& flipees); + void flipSpineTokens (std::vector& subtokens); + void extractFlipees (std::vector>& flipees, HumdrumFile& infile, int index); private: @@ -7476,8 +7965,8 @@ class Tool_gasparize : public HumTool { bool run (HumdrumFileSet& infiles); bool run (HumdrumFile& infile); - bool run (const string& indata, ostream& out); - bool run (HumdrumFile& infile, ostream& out); + bool run (const std::string& indata, std::ostream& out); + bool run (HumdrumFile& infile, std::ostream& out); protected: void initialize (HumdrumFile& infile); @@ -7488,7 +7977,7 @@ class Tool_gasparize : public HumTool { void fixInstrumentAbbreviations(HumdrumFile& infile); void addTerminalLongs (HumdrumFile& infile); void deleteDummyTranspositions(HumdrumFile& infile); - string getDate (void); + std::string getDate (void); void adjustSystemDecoration(HumdrumFile& infile); void deleteBreaks (HumdrumFile& infile); void updateKeySignatures(HumdrumFile& infile, int lineindex); @@ -7503,8 +7992,8 @@ class Tool_gasparize : public HumTool { void addMensuration (int top, HumdrumFile& infile, int i); void createEditText (HumdrumFile& infile); bool addEditStylingForText(HumdrumFile& infile, HTp sstart, HTp send); - string getEditLine (const string& text, int fieldindex, HLp line); - bool insertEditText (const string& text, HumdrumFile& infile, int line, int field); + std::string getEditLine (const std::string& text, int fieldindex, HLp line); + bool insertEditText (const std::string& text, HumdrumFile& infile, int line, int field); void adjustIntrumentNames(HumdrumFile& infile); void removeKeyDesignations(HumdrumFile& infile); void fixBarlines (HumdrumFile& infile); @@ -7517,9 +8006,9 @@ class Tool_gasparize : public HumTool { void fixTiesStartEnd(HTp starts, HTp ends); private: - vector> m_pstates; - vector> m_kstates; - vector> m_estates; + std::vector> m_pstates; + std::vector> m_kstates; + std::vector> m_estates; }; @@ -7531,8 +8020,8 @@ class Tool_grep : public HumTool { bool run (HumdrumFileSet& infiles); bool run (HumdrumFile& infile); - bool run (const string& indata, ostream& out); - bool run (HumdrumFile& infile, ostream& out); + bool run (const std::string& indata, std::ostream& out); + bool run (HumdrumFile& infile, std::ostream& out); protected: void processFile (HumdrumFile& infile); @@ -7552,8 +8041,8 @@ class Tool_half : public HumTool { bool run (HumdrumFileSet& infiles); bool run (HumdrumFile& infile); - bool run (const string& indata, ostream& out); - bool run (HumdrumFile& infile, ostream& out); + bool run (const std::string& indata, std::ostream& out); + bool run (HumdrumFile& infile, std::ostream& out); protected: void initialize (HumdrumFile& infile); @@ -7568,6 +8057,43 @@ class Tool_half : public HumTool { }; +class Tool_hands : public HumTool { + public: + Tool_hands (void); + ~Tool_hands () {}; + + bool run (HumdrumFileSet& infiles); + bool run (HumdrumFile& infile); + bool run (const std::string& indata, std::ostream& out); + bool run (HumdrumFile& infile, std::ostream& out); + + protected: + void processFile (HumdrumFile& infile); + void initialize (void); + void colorHands (HumdrumFile& infile); + void doHandAnalysis (HumdrumFile& infile); + void doHandAnalysis (HTp startSpine); + void markNotes (HumdrumFile& infile); + void markNotes (HTp sstart, HTp send); + void removeNotes (HumdrumFile& infile, const std::string& htype); + void removeNotes (HTp sstart, HTp send, const std::string& htype); + + private: + bool m_colorQ = false; // used with -c option + std::string m_leftColor = "dodgerblue"; // used with --left-color option + std::string m_rightColor = "crimson"; // used with --right-color option + bool m_markQ = false; // used with -m option + std::string m_leftMarker = "🟦"; // + std::string m_rightMarker = "🟥"; // + bool m_leftOnlyQ = false; // used with -l option + bool m_rightOnlyQ = false; // used with -r option + bool m_attacksOnlyQ = false; // used with -a option + + std::vector m_trackHasHandMarkup; // given track number uses hand labels + +}; + + class HPNote { public: int track = -1; @@ -7588,8 +8114,8 @@ class Tool_homorhythm : public HumTool { bool run (HumdrumFileSet& infiles); bool run (HumdrumFile& infile); - bool run (const string& indata, ostream& out); - bool run (HumdrumFile& infile, ostream& out); + bool run (const std::string& indata, std::ostream& out); + bool run (HumdrumFile& infile, std::ostream& out); protected: void processFile (HumdrumFile& infile); @@ -7598,9 +8124,9 @@ class Tool_homorhythm : public HumTool { void markHomophonicNotes(void); int getExtantVoiceCount(HumdrumFile& infile); int getOriginalVoiceCount(HumdrumFile& infile); - void addRawAnalysis (HumdrumFile& infile, vector& raw); - void addAccumulatedScores(HumdrumFile& infile, vector& score); - void addAttacks (HumdrumFile& infile, vector& attacks); + void addRawAnalysis (HumdrumFile& infile, std::vector& raw); + void addAccumulatedScores(HumdrumFile& infile, std::vector& score); + void addAttacks (HumdrumFile& infile, std::vector& attacks); void addFractionAnalysis(HumdrumFile& infile, std::vector& score); private: @@ -7623,8 +8149,8 @@ class Tool_homorhythm2 : public HumTool { bool run (HumdrumFileSet& infiles); bool run (HumdrumFile& infile); - bool run (const string& indata, ostream& out); - bool run (HumdrumFile& infile, ostream& out); + bool run (const std::string& indata, std::ostream& out); + bool run (HumdrumFile& infile, std::ostream& out); protected: void processFile (HumdrumFile& infile); @@ -7633,7 +8159,7 @@ class Tool_homorhythm2 : public HumTool { private: double m_threshold = 0.6; double m_threshold2 = 0.4; - vector m_score; + std::vector m_score; }; @@ -7644,23 +8170,55 @@ class Tool_hproof : public HumTool { bool run (HumdrumFileSet& infiles); bool run (HumdrumFile& infile); - bool run (const string& indata, ostream& out); - bool run (HumdrumFile& infile, ostream& out); + bool run (const std::string& indata, std::ostream& out); + bool run (HumdrumFile& infile, std::ostream& out); protected: void markNonChordTones(HumdrumFile& infile); void processHarmSpine (HumdrumFile& infile, HTp hstart); - void markNotesInRange (HumdrumFile& infile, HTp ctoken, HTp ntoken, const string& key); - void markHarmonicTones(HTp tok, vector& cts); - void getNewKey (HTp token, HTp ntoken, string& key); + void markNotesInRange (HumdrumFile& infile, HTp ctoken, HTp ntoken, const std::string& key); + void markHarmonicTones(HTp tok, std::vector& cts); + void getNewKey (HTp token, HTp ntoken, std::string& key); private: - vector m_kernspines; + std::vector m_kernspines; }; +class Tool_humbreak : public HumTool { + public: + Tool_humbreak (void); + ~Tool_humbreak () {}; + + bool run (HumdrumFileSet& infiles); + bool run (HumdrumFile& infile); + bool run (const std::string& indata, std::ostream& out); + bool run (HumdrumFile& infile, std::ostream& out); + + protected: + void processFile (HumdrumFile& infile); + void initialize (void); + void addBreaks (HumdrumFile& infile); + void removeBreaks (HumdrumFile& infile); + void convertPageToLine (HumdrumFile& infile); + void markLineBreakMeasures(HumdrumFile& infile); + + private: + std::map m_lineMeasures; // list of measures to add line breaks to + std::map m_pageMeasures; // list of measures to add page breaks to + + std::map m_lineOffset; // measure offsets for measure breaks + std::map m_pageOffset; // measure offsets for page breaks + + std::string m_group = "original"; + bool m_removeQ = false; + bool m_page2lineQ = false; + +}; + + // A TimePoint records the event times in a file. These are positions of note attacks // in the file. The "index" variable keeps track of the line in the original file // (for the first position in index), and other positions in index keep track of the @@ -7668,11 +8226,11 @@ class Tool_hproof : public HumTool { class TimePoint { public: // file: pointers to the file in which the index refers to - vector file; + std::vector file; // index :: A list of indexes for the lines at which the given timestamp // occurs in each file. The first index is for the reference work. - vector index; + std::vector index; // timestamp :: The duration from the start of the score to given time in score. HumNum timestamp = -1; @@ -7694,7 +8252,7 @@ class TimePoint { class NotePoint { public: HTp token = NULL; // Humdrum token that contains note - string subtoken; // string that represents not (token may be chord) + std::string subtoken; // string that represents not (token may be chord) int subindex = -1; // subtoken index of note (in chord) int measure = -1; // measure number that note is found HumNum measurequarter = -1; // distance from start of measure to note @@ -7705,7 +8263,7 @@ class NotePoint { int processed = 0; // has note been processed/matched int sourceindex = -1; // source file index for note int tpindex = -1; // timepoint index of note in source - vector matched; // indexes to the location of the note in TimePoint list. + std::vector matched; // indexes to the location of the note in TimePoint list. // the index indicate which score the match is related to, // and a value of -1 means there is no equivalent timepoint. void clear(void) { @@ -7737,13 +8295,13 @@ class Tool_humdiff : public HumTool { protected: void compareFiles (HumdrumFile& reference, HumdrumFile& alternate); - void compareTimePoints (vector>& timepoints, HumdrumFile& reference, HumdrumFile& alternate); - void extractTimePoints (vector& points, HumdrumFile& infile); - void printTimePoints (vector& timepoints); - void compareLines (HumNum minval, vector& indexes, vector>& timepoints, vector infiles); - void getNoteList (vector& notelist, HumdrumFile& infile, int line, int measure, int sourceindex, int tpindex); - int findNoteInList (NotePoint& np, vector& nps); - void printNotePoints (vector& notelist); + void compareTimePoints (std::vector>& timepoints, HumdrumFile& reference, HumdrumFile& alternate); + void extractTimePoints (std::vector& points, HumdrumFile& infile); + void printTimePoints (std::vector& timepoints); + void compareLines (HumNum minval, std::vector& indexes, std::vector>& timepoints, std::vector infiles); + void getNoteList (std::vector& notelist, HumdrumFile& infile, int line, int measure, int sourceindex, int tpindex); + int findNoteInList (NotePoint& np, std::vector& nps); + void printNotePoints (std::vector& notelist); void markNote (NotePoint& np); private: @@ -7752,8 +8310,8 @@ class Tool_humdiff : public HumTool { }; -ostream& operator<<(ostream& out, TimePoint& tp); -ostream& operator<<(ostream& out, NotePoint& np); +std::ostream& operator<<(std::ostream& out, TimePoint& tp); +std::ostream& operator<<(std::ostream& out, NotePoint& np); @@ -7764,8 +8322,8 @@ class Tool_humsheet : public HumTool { bool run (HumdrumFileSet& infiles); bool run (HumdrumFile& infile); - bool run (const string& indata, ostream& out); - bool run (HumdrumFile& infile, ostream& out); + bool run (const std::string& indata, std::ostream& out); + bool run (HumdrumFile& infile, std::ostream& out); void printRowClasses (HumdrumFile& infile, int row); void printRowContents (HumdrumFile& infile, int row); @@ -7811,8 +8369,8 @@ class Tool_humsort : public HumTool { bool run (HumdrumFileSet& infiles); bool run (HumdrumFile& infile); - bool run (const string& indata, ostream& out); - bool run (HumdrumFile& infile, ostream& out); + bool run (const std::string& indata, std::ostream& out); + bool run (HumdrumFile& infile, std::ostream& out); protected: void processFile (HumdrumFile& infile); @@ -7827,8 +8385,8 @@ class Tool_humtr : public HumTool { bool run (HumdrumFileSet& infiles); bool run (HumdrumFile& infile); - bool run (const std::string& indata, ostream& out); - bool run (HumdrumFile& infile, ostream& out); + bool run (const std::string& indata, std::ostream& out); + bool run (HumdrumFile& infile, std::ostream& out); protected: void processFile (HumdrumFile& infile); @@ -7935,6 +8493,40 @@ class Tool_imitation : public HumTool { }; +class Tool_instinfo : public HumTool { + public: + Tool_instinfo (void); + ~Tool_instinfo () {}; + + bool run (HumdrumFileSet& infiles); + bool run (HumdrumFile& infile); + bool run (const std::string& indata, std::ostream& out); + bool run (HumdrumFile& infile, std::ostream& out); + + protected: + void processFile (HumdrumFile& infile); + void initialize (HumdrumFile& infile); + void updateInstrumentLine(HumdrumFile& infile, int inumIndex, + std::map& value, + std::map& track2kindex, + const std::string& prefix); + void insertInstrumentInfo(HumdrumFile& infile, int index, + std::map& info, const std::string& prefix, + const std::string& key, std::map& track2kindex); + void printLine (HumdrumFile& infile, int index); + void printLine (HumdrumFile& infile, int index, + const std::string& key); + + private: + std::map m_icode; // instrument code, e.g., *Iflt + std::map m_iclass; // instrument class, e.g., *Iww + std::map m_iname; // instrument name, e.g., *I"flute + std::map m_iabbr; // instrument name, e.g., *I'flt. + std::map m_inum; // instrument number, e.g., *I#2 + +}; + + class Tool_kern2mens : public HumTool { public: Tool_kern2mens (void); @@ -7983,8 +8575,8 @@ class Tool_kernify : public HumTool { bool run (HumdrumFileSet& infiles); bool run (HumdrumFile& infile); - bool run (const string& indata, ostream& out); - bool run (HumdrumFile& infile, ostream& out); + bool run (const std::string& indata, std::ostream& out); + bool run (HumdrumFile& infile, std::ostream& out); protected: void initialize (void); @@ -7992,9 +8584,12 @@ class Tool_kernify : public HumTool { void generateDummyKernSpine (HumdrumFile& infile); std::string makeNullLine (HumdrumLine& line); std::string makeReverseLine (HumdrumLine& line); + bool prepareDataSpines (HumdrumFile& infile); + bool prepareDataSpine (HTp spinestart); private: bool m_forceQ = false; // used with -f option + bool m_hasDataInterpretations = false; }; @@ -8006,8 +8601,8 @@ class Tool_kernview : public HumTool { bool run (HumdrumFileSet& infiles); bool run (HumdrumFile& infile); - bool run (const string& indata, ostream& out); - bool run (HumdrumFile& infile, ostream& out); + bool run (const std::string& indata, std::ostream& out); + bool run (HumdrumFile& infile, std::ostream& out); protected: void processFile (HumdrumFile& infile); @@ -8298,19 +8893,19 @@ class Tool_mei2hum : public HumTool { class WordInfo { public: - string word; // text of word + std::string word; // text of word int notes = 0; // number of notes in word HumNum starttime; // start time of word HumNum endtime; // end time of word int bar = 0; // starting barline number for word - vector bars; // starting barline number for each syllable - vector syllables; // list of syllables in word with melisma - vector notecounts; // list of note counts for each syllable in word - vector starttimes; // list of start times for each syllable - vector endtimes; // list of end times for each syllable + std::vector bars; // starting barline number for each syllable + std::vector syllables; // list of syllables in word with melisma + std::vector notecounts; // list of note counts for each syllable in word + std::vector starttimes; // list of start times for each syllable + std::vector endtimes; // list of end times for each syllable HumNum duration(void) { return endtime - starttime; } - string name; - string abbreviation; + std::string name; + std::string abbreviation; int partnum = 0; void clear(void) { starttime = 0; @@ -8337,36 +8932,36 @@ class Tool_melisma : public HumTool { bool run (HumdrumFileSet& infiles); bool run (HumdrumFile& infile); - bool run (const string& indata, ostream& out); - bool run (HumdrumFile& infile, ostream& out); + bool run (const std::string& indata, std::ostream& out); + bool run (HumdrumFile& infile, std::ostream& out); protected: void initialize (HumdrumFile& infile); void processFile (HumdrumFile& infile); - void getNoteCounts (HumdrumFile& infile, vector>& counts); - void getNoteCountsForLyric (vector>& counts, HTp lyricStart); + void getNoteCounts (HumdrumFile& infile, std::vector>& counts); + void getNoteCountsForLyric (std::vector>& counts, HTp lyricStart); int getCountForSyllable (HTp token); - void replaceLyrics (HumdrumFile& infile, vector>& counts); - void markMelismas (HumdrumFile& infile, vector>& counts); + void replaceLyrics (HumdrumFile& infile, std::vector>& counts); + void markMelismas (HumdrumFile& infile, std::vector>& counts); void markMelismaNotes (HTp text, int count); - void extractWordlist (vector& wordinfo, map& wordlist, - HumdrumFile& infile, vector>& notecount); - string extractWord (WordInfo& winfo, HTp token, vector>& counts); + void extractWordlist (std::vector& wordinfo, std::map& wordlist, + HumdrumFile& infile, std::vector>& notecount); + std::string extractWord (WordInfo& winfo, HTp token, std::vector>& counts); HumNum getEndtime (HTp text); - void printWordlist (HumdrumFile& infile, vector& wordinfo, - map); + void printWordlist (HumdrumFile& infile, std::vector& wordinfo, + std::map); void initializePartInfo (HumdrumFile& infile); - void getMelismaNoteCounts (vector& ncounts, vector& mcounts, + void getMelismaNoteCounts (std::vector& ncounts, std::vector& mcounts, HumdrumFile& infile); double getScoreDuration (HumdrumFile& infile); void initBarlines (HumdrumFile& infile); private: - vector> m_endtimes; // end time of syllables indexed by line/field - vector m_names; // name of parts indexed by track - vector m_abbreviations; // abbreviation of parts indexed by track - vector m_partnums; // part number index by track - vector m_measures; // current measure number + std::vector> m_endtimes; // end time of syllables indexed by line/field + std::vector m_names; // name of parts indexed by track + std::vector m_abbreviations; // abbreviation of parts indexed by track + std::vector m_partnums; // part number index by track + std::vector m_measures; // current measure number }; @@ -8379,13 +8974,13 @@ class Tool_mens2kern : public HumTool { bool run (HumdrumFileSet& infiles); bool run (HumdrumFile& infile); - bool run (const string& indata, ostream& out); - bool run (HumdrumFile& infile, ostream& out); + bool run (const std::string& indata, std::ostream& out); + bool run (HumdrumFile& infile, std::ostream& out); protected: void processFile (HumdrumFile& infile); void initialize (void); - void processMelody (vector& melody); + void processMelody (std::vector& melody); std::string mens2kernRhythm (const std::string& rhythm, bool altera, bool perfecta, bool imperfecta, int maxima_def, int longa_def, @@ -8409,7 +9004,7 @@ class Tool_meter : public HumTool { bool run (HumdrumFileSet& infiles); bool run (HumdrumFile& infile); - bool run (const string& indata, std::ostream& out); + bool run (const std::string& indata, std::ostream& out); bool run (HumdrumFile& infile, std::ostream& out); @@ -8464,16 +9059,16 @@ class Tool_metlev : public HumTool { bool run (HumdrumFileSet& infiles); bool run (HumdrumFile& infile); - bool run (const string& indata, ostream& out); - bool run (HumdrumFile& infile, ostream& out); + bool run (const std::string& indata, std::ostream& out); + bool run (HumdrumFile& infile, std::ostream& out); protected: - void fillVoiceResults (vector >& results, + void fillVoiceResults (std::vector >& results, HumdrumFile& infile, - vector& beatlev); + std::vector& beatlev); private: - vector m_kernspines; + std::vector m_kernspines; }; @@ -8486,8 +9081,8 @@ class Tool_modori : public HumTool { bool run (HumdrumFileSet& infiles); bool run (HumdrumFile& infile); - bool run (const string& indata, ostream& out); - bool run (HumdrumFile& infile, ostream& out); + bool run (const std::string& indata, std::ostream& out); + bool run (HumdrumFile& infile, std::ostream& out); protected: void processFile (HumdrumFile& infile); @@ -8520,11 +9115,11 @@ class Tool_modori : public HumTool { void convertInstrumentAbbreviationToOriginal (HTp token); void convertInstrumentAbbreviationToRegular (HTp token); - int getPairedReference (int index, vector& keys); + int getPairedReference (int index, std::vector& keys); void storeModOriReferenceRecords (HumdrumFile& infile); void processExclusiveInterpretationLine(HumdrumFile& infile, int line); bool processStaffCompanionSpines (std::vector tokens); - bool processStaffSpines (vector& tokens); + bool processStaffSpines (std::vector& tokens); void updateLoMo (HumdrumFile& infile); void processLoMo (HTp lomo); void printModoriOutput (HumdrumFile& infile); @@ -8954,6 +9549,10 @@ class Tool_musedata2hum : public HumTool { std::string cleanString (const std::string& input); void addTextDirection (GridMeasure* gm, int part, int staff, MuseRecord& mr, HumNum timestamp); + void addAboveBelowKernRdf (void); + bool needsAboveBelowKernRdf(void); + void addDirectionDynamics(GridSlice* slice, int part, MuseRecord& mr); + void printLine (std::ostream& out, HumdrumLine& line); private: // options: @@ -8962,6 +9561,7 @@ class Tool_musedata2hum : public HumTool { bool m_recipQ = false; // used with -r option std::string m_group = "score"; // used with -g option std::string m_omd = ""; // initial tempo designation (store for later output) + bool m_noOmvQ = false; // used with --omd option // state variables: int m_part = 0; // staff index currently being processed @@ -8971,6 +9571,17 @@ class Tool_musedata2hum : public HumTool { int m_lastbarnum = -1; // barnumber carried over from previous bar HTp m_lastnote = NULL; // for dealing with chords. double m_tempo = 0.0; // for initial tempo from MIDI settings + bool m_aboveBelowKernRdf = false; // output RDF**kern above/below markers + + // m_measureLineIndex -- keep track of index for processed + // measure for debugging. + int m_measureLineIndex = -1; + + // m_figuredOffset -- increment for the next figure bass offset. + int m_figureOffset = 0; + + // m_quarterDivisions -- currently processed $Q value. + int m_quarterDivisions = 0; std::map m_usedReferences; std::vector m_postReferences; @@ -9274,8 +9885,8 @@ class MeasureInfo { tracks = tcount; } int num; // measure number - string stopStyle; // styling for end of last measure - string startStyle; // styling for start of first measure + std::string stopStyle; // styling for end of last measure + std::string startStyle; // styling for start of first measure int seg; // measure segment int start; // starting line of segment int stop; // ending line of segment @@ -9283,20 +9894,20 @@ class MeasureInfo { HumdrumFile* file; // musical settings at start of measure - vector sclef; // starting clef of segment - vector skeysig; // starting keysig of segment - vector skey; // starting key of segment - vector stimesig; // starting timesig of segment - vector smet; // starting met of segment - vector stempo; // starting tempo of segment + std::vector sclef; // starting clef of segment + std::vector skeysig; // starting keysig of segment + std::vector skey; // starting key of segment + std::vector stimesig; // starting timesig of segment + std::vector smet; // starting met of segment + std::vector stempo; // starting tempo of segment // musical settings at start of measure - vector eclef; // ending clef of segment - vector ekeysig; // ending keysig of segment - vector ekey; // ending key of segment - vector etimesig; // ending timesig of segment - vector emet; // ending met of segment - vector etempo; // ending tempo of segment + std::vector eclef; // ending clef of segment + std::vector ekeysig; // ending keysig of segment + std::vector ekey; // ending key of segment + std::vector etimesig; // ending timesig of segment + std::vector emet; // ending met of segment + std::vector etempo; // ending tempo of segment }; @@ -9308,62 +9919,62 @@ class Tool_myank : public HumTool { bool run (HumdrumFileSet& infiles); bool run (HumdrumFile& infile); - bool run (const string& indata, ostream& out); - bool run (HumdrumFile& infile, ostream& out); + bool run (const std::string& indata, std::ostream& out); + bool run (HumdrumFile& infile, std::ostream& out); protected: void initialize (HumdrumFile& infile); void example (void); - void usage (const string& command); + void usage (const std::string& command); void myank (HumdrumFile& infile, - vector& outmeasure); - void removeDollarsFromString(string& buffer, int maxx); - void processFieldEntry (vector& field, - const string& str, + std::vector& outmeasure); + void removeDollarsFromString(std::string& buffer, int maxx); + void processFieldEntry (std::vector& field, + const std::string& str, HumdrumFile& infile, int maxmeasure, - vector& inmeasures, - vector& inmap); - void expandMeasureOutList (vector& measureout, - vector& measurein, - HumdrumFile& infile, const string& optionstring); - void getMeasureStartStop (vector& measurelist, + std::vector& inmeasures, + std::vector& inmap); + void expandMeasureOutList (std::vector& measureout, + std::vector& measurein, + HumdrumFile& infile, const std::string& optionstring); + void getMeasureStartStop (std::vector& measurelist, HumdrumFile& infile); void printEnding (HumdrumFile& infile, int lastline, int adjlin); void printStarting (HumdrumFile& infile); void reconcileSpineBoundary(HumdrumFile& infile, int index1, int index2); void reconcileStartingPosition(HumdrumFile& infile, int index2); - void printJoinLine (vector& splits, int index, int count); + void printJoinLine (std::vector& splits, int index, int count); void printInvisibleMeasure(HumdrumFile& infile, int line); void fillGlobalDefaults (HumdrumFile& infile, - vector& measurein, - vector& inmap); + std::vector& measurein, + std::vector& inmap); void adjustGlobalInterpretations(HumdrumFile& infile, int ii, - vector& outmeasures, + std::vector& outmeasures, int index); void adjustGlobalInterpretationsStart(HumdrumFile& infile, int ii, - vector& outmeasures, + std::vector& outmeasures, int index); - void getMarkString (ostream& out, HumdrumFile& infile); + void getMarkString (std::ostream& out, HumdrumFile& infile); void printDoubleBarline (HumdrumFile& infile, int line); - void insertZerothMeasure (vector& measurelist, + void insertZerothMeasure (std::vector& measurelist, HumdrumFile& infile); - void getMetStates (vector >& metstates, + void getMetStates (std::vector >& metstates, HumdrumFile& infile); MyCoord getLocalMetInfo (HumdrumFile& infile, int row, int track); int atEndOfFile (HumdrumFile& infile, int line); void processFile (HumdrumFile& infile); int getSectionCount (HumdrumFile& infile); - void getSectionString (string& sstring, HumdrumFile& infile, + void getSectionString (std::string& sstring, HumdrumFile& infile, int sec); void collapseSpines (HumdrumFile& infile, int line); - void printMeasureStart (HumdrumFile& infile, int line, const string& style); - std::string expandMultipliers (const string& inputstring); + void printMeasureStart (HumdrumFile& infile, int line, const std::string& style); + std::string expandMultipliers (const std::string& inputstring); - vector analyzeBarNumbers (HumdrumFile& infile); + std::vector analyzeBarNumbers (HumdrumFile& infile); int getBarNumberForLineNumber(int lineNumber); int getStartLineNumber (void); int getEndLineNumber (void); - void printDataLine (HLp line, bool& startLineHandled, const vector& lastLineResolvedTokenLineIndex, const vector& lastLineDurationsFromNoteStart); + void printDataLine (HLp line, bool& startLineHandled, const std::vector& lastLineResolvedTokenLineIndex, const std::vector& lastLineDurationsFromNoteStart); private: int m_debugQ = 0; // used with --debug option @@ -9381,12 +9992,12 @@ class Tool_myank : public HumTool { int m_barnumtextQ = 0; // used with -T option int m_section = 0; // used with --section option int m_sectionCountQ = 0; // used with --section-count option - vector m_measureOutList; // used with -m option - vector m_measureInList; // used with -m option - vector > m_metstates; + std::vector m_measureOutList; // used with -m option + std::vector m_measureInList; // used with -m option + std::vector > m_metstates; - string m_lineRange; // used with -l option - vector m_barNumbersPerLine; // used with -l option + std::string m_lineRange; // used with -l option + std::vector m_barNumbersPerLine; // used with -l option bool m_hideStarting; // used with --hide-starting option bool m_hideEnding; // used with --hide-ending option @@ -9401,14 +10012,14 @@ class Tool_nproof : public HumTool { bool run (HumdrumFileSet& infiles); bool run (HumdrumFile& infile); - bool run (const string& indata, std::ostream& out); + bool run (const std::string& indata, std::ostream& out); bool run (HumdrumFile& infile, std::ostream& out); void checkForBlankLines(HumdrumFile& infile); void checkInstrumentInformation(HumdrumFile& infile); void checkKeyInformation(HumdrumFile& infile); void checkSpineTerminations(HumdrumFile& infile); - void checkForValidInstrumentCode(HTp token, vector>& instrumentList); + void checkForValidInstrumentCode(HTp token, std::vector>& instrumentList); void checkReferenceRecords(HumdrumFile& infile); protected: @@ -9439,8 +10050,8 @@ class Tool_ordergps : public HumTool { bool run (HumdrumFileSet& infiles); bool run (HumdrumFile& infile); - bool run (const string& indata, ostream& out); - bool run (HumdrumFile& infile, ostream& out); + bool run (const std::string& indata, std::ostream& out); + bool run (HumdrumFile& infile, std::ostream& out); protected: void initialize (void); @@ -9461,6 +10072,32 @@ class Tool_ordergps : public HumTool { }; +class Tool_pbar : public HumTool { + public: + Tool_pbar (void); + ~Tool_pbar () {}; + + bool run (HumdrumFileSet& infiles); + bool run (HumdrumFile& infile); + bool run (const std::string& indata, std::ostream& out); + bool run (HumdrumFile& infile, std::ostream& out); + + protected: + void processFile (HumdrumFile& infile); + void initialize (void); + void processSpine (HTp spineStart); + void printDataLine (HumdrumFile& infile, int index); + void printLocalCommentLine (HumdrumFile& infile, int index); + void addBarLineToFollowingNoteOrRest (HTp token); + void printInvisibleBarlines (HumdrumFile& infile, int index); + void printBarLine (HumdrumFile& infile, int index); + + private: + bool m_invisibleQ = false; // used with -i option + +}; + + class Tool_pccount : public HumTool { public: @@ -9469,8 +10106,8 @@ class Tool_pccount : public HumTool { bool run (HumdrumFileSet& infiles); bool run (HumdrumFile& infile); - bool run (const string& indata, ostream& out); - bool run (HumdrumFile& infile, ostream& out); + bool run (const std::string& indata, std::ostream& out); + bool run (HumdrumFile& infile, std::ostream& out); protected: void initialize (HumdrumFile& infile); @@ -9486,21 +10123,21 @@ class Tool_pccount : public HumTool { void printReverseVoiceList (void); void printColorList (void); std::string getPitchClassString (int b40); - void printVegaLiteScript (const string& jsonvar, - const string& target, - const string& datavar, + void printVegaLiteScript (const std::string& jsonvar, + const std::string& target, + const std::string& datavar, HumdrumFile& infile); - void printVegaLiteHtml (const string& jsonvar, - const string& target, - const string& datavar, + void printVegaLiteHtml (const std::string& jsonvar, + const std::string& target, + const std::string& datavar, HumdrumFile& infile); - void printVegaLitePage (const string& jsonvar, - const string& target, - const string& datavar, + void printVegaLitePage (const std::string& jsonvar, + const std::string& target, + const std::string& datavar, HumdrumFile& infile); std::string getFinal (HumdrumFile& infile); - double getPercent (const string& pitchclass); - int getCount (const string& pitchclass); + double getPercent (const std::string& pitchclass); + int getCount (const std::string& pitchclass); void setFactorMaximum (void); void setFactorNormalize (void); @@ -9542,18 +10179,18 @@ class Tool_periodicity : public HumTool { bool run (HumdrumFileSet& infiles); bool run (HumdrumFile& infile); - bool run (const string& indata, ostream& out); - bool run (HumdrumFile& infile, ostream& out); + bool run (const std::string& indata, std::ostream& out); + bool run (HumdrumFile& infile, std::ostream& out); protected: void initialize (HumdrumFile& infile); void processFile (HumdrumFile& infile); - void fillAttackGrids (HumdrumFile& infile, vector>& grids, HumNum minrhy); - void printAttackGrid (ostream& out, HumdrumFile& infile, vector>& grids, HumNum minrhy); - void doAnalysis (vector>& analysis, int level, vector& grid); - void doPeriodicityAnalysis(vector> & analysis, vector& grid, HumNum minrhy); - void printPeriodicityAnalysis(ostream& out, vector>& analysis); - void printSvgAnalysis(ostream& out, vector>& analysis, HumNum minrhy); + void fillAttackGrids (HumdrumFile& infile, std::vector>& grids, HumNum minrhy); + void printAttackGrid (std::ostream& out, HumdrumFile& infile, std::vector>& grids, HumNum minrhy); + void doAnalysis (std::vector>& analysis, int level, std::vector& grid); + void doPeriodicityAnalysis(std::vector> & analysis, std::vector& grid, HumNum minrhy); + void printPeriodicityAnalysis(std::ostream& out, std::vector>& analysis); + void printSvgAnalysis(std::ostream& out, std::vector>& analysis, HumNum minrhy); void getColorMapping(double input, double& hue, double& saturation, double& lightness); private: @@ -9568,8 +10205,8 @@ class Tool_phrase : public HumTool { bool run (HumdrumFileSet& infiles); bool run (HumdrumFile& infile); - bool run (const string& indata, ostream& out); - bool run (HumdrumFile& infile, ostream& out); + bool run (const std::string& indata, std::ostream& out); + bool run (HumdrumFile& infile, std::ostream& out); protected: void analyzeSpineByRests (int index); @@ -9581,16 +10218,16 @@ class Tool_phrase : public HumTool { void removePhraseMarks (HTp start); private: - vector> m_results; - vector m_starts; + std::vector> m_results; + std::vector m_starts; HumdrumFile m_infile; - vector m_pcount; - vector m_psum; + std::vector m_pcount; + std::vector m_psum; bool m_markQ; bool m_removeQ; bool m_remove2Q; bool m_averageQ; - string m_color; + std::string m_color; }; @@ -9603,15 +10240,15 @@ class Tool_pline : public HumTool { bool run (HumdrumFileSet& infiles); bool run (HumdrumFile& infile); - bool run (const string& indata, ostream& out); - bool run (HumdrumFile& infile, ostream& out); + bool run (const std::string& indata, std::ostream& out); + bool run (HumdrumFile& infile, std::ostream& out); protected: void initialize (void); void processFile (HumdrumFile& infile); - void getPlineInterpretations(HumdrumFile& infile, vector& tokens); - void plineToColor (HumdrumFile& infile, vector& tokens); + void getPlineInterpretations(HumdrumFile& infile, std::vector& tokens); + void plineToColor (HumdrumFile& infile, std::vector& tokens); void markRests (HumdrumFile& infile); void markSpineRests (HTp spineStop); void fillLineInfo (HumdrumFile& infile, std::vector>& lineInfo); @@ -9635,8 +10272,8 @@ class Tool_pnum : public HumTool { bool run (HumdrumFileSet& infiles); bool run (HumdrumFile& infile); - bool run (const string& indata, ostream& out); - bool run (HumdrumFile& infile, ostream& out); + bool run (const std::string& indata, std::ostream& out); + bool run (HumdrumFile& infile, std::ostream& out); protected: void initialize (HumdrumFile& infile); @@ -9658,6 +10295,145 @@ class Tool_pnum : public HumTool { + +class _VoiceInfo { + public: + std::vector> diatonic; + std::vector midibins; + std::string name; // name for instrument name of spine + std::string abbr; // abbreviation for instrument name of spine + int track; // track number for spine + bool kernQ; // is spine a **kern spine? + double hpos; // horiz. position on system for pitch range data for spine + std::vector diafinal; // finalis note diatonic pitch (4=middle-C octave) + std::vector accfinal; // finalis note accidental (0 = natural) + std::vector namfinal; // name of voice for finalis note (for "all" display) + int index = -1; + + public: + _VoiceInfo (void); + void clear (void); + std::ostream& print (std::ostream& out); + +}; + + + +class Tool_prange : public HumTool { + public: + Tool_prange (void); + ~Tool_prange () {}; + + bool run (HumdrumFileSet& infiles); + bool run (HumdrumFile& infile); + bool run (const std::string& indata, std::ostream& out); + bool run (HumdrumFile& infile, std::ostream& out); + + protected: + void processFile (HumdrumFile& infile); + void initialize (void); + + void mergeAllVoiceInfo (std::vector<_VoiceInfo>& voiceInfo); + void getVoiceInfo (std::vector<_VoiceInfo>& voiceInfo, HumdrumFile& infile); + std::string getHand (HTp sstart); + void fillHistograms (std::vector<_VoiceInfo>& voiceInfo, HumdrumFile& infile); + void printFilenameBase (std::ostream& out, const std::string& filename); + void printReferenceRecords (std::ostream& out, HumdrumFile& infile); + void printScoreEncodedText (std::ostream& out, const std::string& strang); + void printXmlEncodedText (std::ostream& out, const std::string& strang); + void printScoreFile (std::ostream& out, std::vector<_VoiceInfo>& voiceInfo, HumdrumFile& infile); + void printKeySigCompression (std::ostream& out, int keysig, int extra); + void assignHorizontalPosition (std::vector<_VoiceInfo>& voiceInfo, int minval, int maxval); + int getKeySignature (HumdrumFile& infile); + void printScoreVoice (std::ostream& out, _VoiceInfo& voiceInfo, double maxvalue); + void printDiatonicPitchName (std::ostream& out, int base7, int acc); + std::string getDiatonicPitchName (int base7, int acc); + void printHtmlStringEncodeSimple (std::ostream& out, const std::string& strang); + std::string getNoteTitle (double value, int diatonic, int acc); + int getDiatonicInterval (int note1, int note2); + int getTopQuartile (std::vector& midibins); + int getBottomQuartile (std::vector& midibins); + double getMaxValue (std::vector>& bins); + double getVpos (double base7); + int getStaffBase7 (int base7); + int getMaxDiatonicIndex (std::vector>& diatonic); + int getMinDiatonicIndex (std::vector>& diatonic); + int getMinDiatonicAcc (std::vector>& diatonic, int index); + int getMaxDiatonicAcc (std::vector>& diatonic, int index); + std::string getTitle (void); + void clearHistograms (std::vector >& bins, int start); + void printAnalysis (std::ostream& out, std::vector& midibins); + int getMedian12 (std::vector& midibins); + double getMean12 (std::vector& midibins); + int getTessitura (std::vector& midibins); + double countNotesInRange (std::vector& midibins, int low, int high); + void printPercentile (std::ostream& out, std::vector& midibins, double percentile); + void getRange (int& rangeL, int& rangeH, const std::string& rangestring); + void mergeFinals (std::vector<_VoiceInfo>& voiceInfo, + std::vector>& diafinal, + std::vector>& accfinal); + void getInstrumentNames (std::vector& nameByTrack, + std::vector& kernSpines, HumdrumFile& infile); + void printEmbeddedScore (std::ostream& out, std::stringstream& scoredata, HumdrumFile& infile); + void prepareRefmap (HumdrumFile& infile); + int getMaxStaffPosition (std::vector<_VoiceInfo>& voiceinfo); + int getPrangeId (HumdrumFile& infile); + void processStrandNotes (HTp sstart, HTp send, + std::vector>>& trackInfo); + void fillMidiInfo (HumdrumFile& infile); + void doExtremaMarkup (HumdrumFile& infile); + void applyMarkup (std::vector>& notelist, + const std::string& mark); + + private: + + bool m_accQ = false; // for --acc option + bool m_addFractionQ = false; // for --fraction option + bool m_allQ = false; // for --all option + bool m_debugQ = false; // for --debug option + bool m_defineQ = false; // for --score option (use text macro) + bool m_diatonicQ = false; // for --diatonic option + bool m_durationQ = false; // for --duration option + bool m_embedQ = false; // for --embed option + bool m_fillOnlyQ = false; // for --fill option + bool m_finalisQ = false; // for --finalis option + bool m_hoverQ = false; // for --hover option + bool m_instrumentQ = false; // for --instrument option + bool m_keyQ = true; // for --no-key option + bool m_listQ = false; + bool m_localQ = false; // for --local-maximum option + bool m_normQ = false; // for --norm option + bool m_notitleQ = false; // for --no-title option + bool m_percentileQ = false; // for --percentile option + bool m_pitchQ = false; // for --pitch option + bool m_printQ = false; // for --print option + bool m_quartileQ = false; // for --quartile option + bool m_rangeQ = false; // for --range option + bool m_reverseQ = false; // for --reverse option + bool m_scoreQ = false; // for --score option + bool m_titleQ = false; // for --title option + bool m_extremaQ = false; // for --extrema option + + std::string m_highMark = "🌸"; + std::string m_lowMark = "🟢"; + + double m_percentile = 50.0; // for --percentile option + std::string m_title; // for --title option + + int m_rangeL; // for --range option + int m_rangeH; // for --range option + + std::map m_refmap; + + // track >midi >tokens + std::vector>>> m_trackMidi; + + // m_trackToKernIndex: mapping from track to **kern index + std::vector m_trackToKernIndex; + +}; + + class Tool_recip : public HumTool { public: Tool_recip (void); @@ -9665,8 +10441,8 @@ class Tool_recip : public HumTool { bool run (HumdrumFileSet& infiles); bool run (HumdrumFile& infile); - bool run (const string& indata, ostream& out); - bool run (HumdrumFile& infile, ostream& out); + bool run (const std::string& indata, std::ostream& out); + bool run (HumdrumFile& infile, std::ostream& out); protected: void initialize (HumdrumFile& infile); @@ -9675,10 +10451,10 @@ class Tool_recip : public HumTool { void insertAnalysisSpines (HumdrumFile& infile, HumdrumFile& cfile); private: - vector m_kernspines; + std::vector m_kernspines; bool m_graceQ = true; - string m_exinterp = "**recip"; - string m_kernpitch = "e"; + std::string m_exinterp = "**recip"; + std::string m_kernpitch = "e"; }; @@ -9691,8 +10467,8 @@ class Tool_restfill : public HumTool { bool run (HumdrumFileSet& infiles); bool run (HumdrumFile& infile); - bool run (const string& indata, ostream& out); - bool run (HumdrumFile& infile, ostream& out); + bool run (const std::string& indata, std::ostream& out); + bool run (HumdrumFile& infile, std::ostream& out); protected: void processFile (HumdrumFile& infile); @@ -9716,8 +10492,8 @@ class Tool_rid : public HumTool { bool run (HumdrumFileSet& infiles); bool run (HumdrumFile& infile); - bool run (const string& indata, ostream& out); - bool run (HumdrumFile& infile, ostream& out); + bool run (const std::string& indata, std::ostream& out); + bool run (HumdrumFile& infile, std::ostream& out); protected: void processFile (HumdrumFile& infile); @@ -9746,6 +10522,83 @@ class Tool_rid : public HumTool { }; +class Tool_rphrase : public HumTool { + public: + + class VoiceInfo { + public: + std::string name; + std::vector restsBefore; + std::vector phraseDurs; + std::vector barStarts; + std::vector phraseStartToks; + }; + + Tool_rphrase (void); + ~Tool_rphrase () {}; + + bool run (HumdrumFileSet& infiles); + bool run (HumdrumFile& infile); + bool run (const std::string& indata, std::ostream& out); + bool run (HumdrumFile& infile, std::ostream& out); + void finally (void); + + protected: + void initialize (void); + void processFile (HumdrumFile& infile); + void fillVoiceInfo (std::vector& voiceInfo, std::vector& kstarts, HumdrumFile& infile); + void fillVoiceInfo (Tool_rphrase::VoiceInfo& voiceInfo, HTp& kstart, HumdrumFile& infile); + void fillCompositeInfo (Tool_rphrase::VoiceInfo& collapseInfo, HumdrumFile& infile); + void printVoiceInfo (std::vector& voiceInfo); + void printVoiceInfo (Tool_rphrase::VoiceInfo& voiceInfo); + + void printEmbeddedVoiceInfo(std::vector& voiceInfo, Tool_rphrase::VoiceInfo& collapseInfo, HumdrumFile& infile); + void printEmbeddedIndividualVoiceInfo(Tool_rphrase::VoiceInfo& voiceInfo, HumdrumFile& infile); + void printEmbeddedCompositeInfo(Tool_rphrase::VoiceInfo& compositeInfo, HumdrumFile& infile); + + void getCompositeStates(std::vector& noteStates, HumdrumFile& infile); + std::string getCompositeLabel(HumdrumFile& infile); + void markPhraseStartsInScore(HumdrumFile& infile, Tool_rphrase::VoiceInfo& voiceInfo); + void markCompositePhraseStartsInScore(HumdrumFile& infile, Tool_rphrase::VoiceInfo& collapseInfo); + void outputMarkedFile (HumdrumFile& infile, std::vector& voiceInfo, + Tool_rphrase::VoiceInfo& compositeInfo); + void printDataLine (HumdrumFile& infile, int index); + void markLongaDurations(HumdrumFile& infile); + std::string getVoiceInfo(HumdrumFile& infile); + void printEmbeddedVoiceInfoSummary(std::vector& voiceInfo, HumdrumFile& infile); + double twoDigitRound(double input); + void printHyperlink(const std::string& urlType); + + private: + bool m_averageQ = false; // for -a option + bool m_allAverageQ = false; // for -A option + bool m_breathQ = true; // for -B option + bool m_barlineQ = false; // for -m option + bool m_compositeQ = false; // for -c option + bool m_longaQ = false; // for -l option + bool m_filenameQ = false; // for -f option + bool m_fullFilenameQ = false; // for -F option + std::string m_filename; // for -f or -F option + bool m_sortQ = false; // for -s option + bool m_reverseSortQ = false; // for -S option + int m_pcount = 0; // for -a option + double m_sum = 0.0; // for -a option + int m_pcountComposite = 0; // for -c option + double m_sumComposite = 0.0; // for -c option + bool m_markQ = false; // for --mark option + double m_durUnit = 2.0; // for -d option + bool m_infoQ = false; // for -i option (when --mark is active) + bool m_squeezeQ = false; // for -z option + bool m_closeQ = false; // for --close option + std::string m_urlType; // for -u option + + int m_line = 1; + std::string m_voiceLengthColor = "crimson"; + std::string m_compositeLengthColor = "limegreen"; + +}; + + class Tool_ruthfix : public HumTool { public: Tool_ruthfix (void); @@ -9764,6 +10617,39 @@ class Tool_ruthfix : public HumTool { }; +class Tool_sab2gs : public HumTool { + public: + Tool_sab2gs (void); + ~Tool_sab2gs () {}; + + bool run (HumdrumFileSet& infiles); + bool run (HumdrumFile& infile); + bool run (const std::string& indata, std::ostream& out); + bool run (HumdrumFile& infile, std::ostream& out); + + protected: + void processFile (HumdrumFile& infile); + void initialize (void); + + void adjustMiddleVoice (HTp spineStart); + void printGrandStaff (HumdrumFile& infile, std::vector& starts); + std::string hasBelowMarker(HumdrumFile& infile); + + void printReducedLine (HumdrumFile& infile, int index, std::vector& ktracks); + void printSpineMerge (HumdrumFile& infile, int index, std::vector& ktracks); + void printSpineSplit (HumdrumFile& infile, int index, std::vector& ktracks); + void printSwappedLine (HumdrumFile& infile, int index, std::vector& ktracks); + + private: + bool m_hasCrossStaff = false; // Middle voice has notes/rests on bottom staff + bool m_hasBelowMarker = false; // Input data has RDF**kern down marker + std::string m_belowMarker = "<"; // RDF**kern marker for staff down + bool m_downQ = false; // Used only *down/*Xdown for staff changes + + +}; + + class Tool_satb2gs : public HumTool { public: Tool_satb2gs (void); @@ -9771,8 +10657,8 @@ class Tool_satb2gs : public HumTool { bool run (HumdrumFileSet& infiles); bool run (HumdrumFile& infile); - bool run (const string& indata, ostream& out); - bool run (HumdrumFile& infile, ostream& out); + bool run (const std::string& indata, std::ostream& out); + bool run (HumdrumFile& infile, std::ostream& out); protected: void processFile (HumdrumFile& infile); @@ -9789,7 +10675,7 @@ class Tool_satb2gs : public HumTool { void printHeaderLine (HumdrumFile& infile, int line, std::vector>& tracks); bool validateHeader (HumdrumFile& infile); - vector getClefs (HumdrumFile& infile, int line); + std::vector getClefs (HumdrumFile& infile, int line); }; @@ -9801,21 +10687,21 @@ class Tool_scordatura : public HumTool { bool run (HumdrumFileSet& infiles); bool run (HumdrumFile& infile); - bool run (const string& indata, ostream& out); - bool run (HumdrumFile& infile, ostream& out); + bool run (const std::string& indata, std::ostream& out); + bool run (HumdrumFile& infile, std::ostream& out); protected: void processFile (HumdrumFile& infile); void initialize (void); - void getScordaturaRdfs (vector& rdfs, HumdrumFile& infile); + void getScordaturaRdfs (std::vector& rdfs, HumdrumFile& infile); void processScordatura (HumdrumFile& infile, HTp reference); - void processScordaturas(HumdrumFile& infile, vector& rdfs); + void processScordaturas(HumdrumFile& infile, std::vector& rdfs); void flipScordaturaInfo(HTp reference, int diatonic, int chromatic); - void transposeStrand (HTp sstart, HTp sstop, const string& marker); - void transposeChord (HTp token, const string& marker); - std::string transposeNote (const string& note); - void transposeMarker (HumdrumFile& infile, const string& marker, int diatonic, int chromatic); - std::set parsePitches(const string& input); + void transposeStrand (HTp sstart, HTp sstop, const std::string& marker); + void transposeChord (HTp token, const std::string& marker); + std::string transposeNote (const std::string& note); + void transposeMarker (HumdrumFile& infile, const std::string& marker, int diatonic, int chromatic); + std::set parsePitches(const std::string& input); void markPitches (HumdrumFile& infile); void markPitches (HTp sstart, HTp sstop); void markPitches (HTp token); @@ -9866,7 +10752,7 @@ class Tool_semitones : public HumTool { int filterData(HTp token); std::vector getTieGroup(HTp token); HTp getNextNote(HTp token); - bool hasTieContinue(const string& value); + bool hasTieContinue(const std::string& value); private: @@ -9906,8 +10792,8 @@ class Tool_shed : public HumTool { bool run (HumdrumFileSet& infiles); bool run (HumdrumFile& infile); - bool run (const string& indata, ostream& out); - bool run (HumdrumFile& infile, ostream& out); + bool run (const std::string& indata, std::ostream& out); + bool run (HumdrumFile& infile, std::ostream& out); protected: void processFile (HumdrumFile& infile); @@ -9927,9 +10813,9 @@ class Tool_shed : public HumTool { bool isValidDataType (HTp token); bool isValidSpine (HTp token); std::vector addToExInterpList(void); - void parseExpression (const string& value); + void parseExpression (const std::string& value); void prepareSearch (int index); - std::string getExInterp (const string& value); + std::string getExInterp (const std::string& value); private: std::vector m_searches; // search strings @@ -9972,8 +10858,8 @@ class Tool_sic : public HumTool { bool run (HumdrumFileSet& infiles); bool run (HumdrumFile& infile); - bool run (const string& indata, ostream& out); - bool run (HumdrumFile& infile, ostream& out); + bool run (const std::string& indata, std::ostream& out); + bool run (HumdrumFile& infile, std::ostream& out); protected: void processFile (HumdrumFile& infile); @@ -10094,9 +10980,9 @@ class MeasureComparisonGrid { std::string getQoff2 (int index); double getScoreDuration2 (void); - ostream& printCorrelationGrid (ostream& out = std::cout); - ostream& printCorrelationDiagonal (ostream& out = std::cout); - ostream& printSvgGrid (ostream& out = std::cout); + std::ostream& printCorrelationGrid (std::ostream& out = std::cout); + std::ostream& printCorrelationDiagonal (std::ostream& out = std::cout); + std::ostream& printSvgGrid (std::ostream& out = std::cout); void getColorMapping (double input, double& hue, double& saturation, double& lightness); @@ -10115,8 +11001,8 @@ class Tool_simat : public HumTool { bool run (HumdrumFileSet& infiles); bool run (HumdrumFile& infile1, HumdrumFile& infile2); - bool run (const string& indata1, const string& indata2, ostream& out); - bool run (HumdrumFile& infile1, HumdrumFile& infile2, ostream& out); + bool run (const std::string& indata1, const std::string& indata2, std::ostream& out); + bool run (HumdrumFile& infile1, HumdrumFile& infile2, std::ostream& out); protected: void initialize (HumdrumFile& infile1, HumdrumFile& infile2); @@ -10137,8 +11023,8 @@ class Tool_slurcheck : public HumTool { bool run (HumdrumFileSet& infiles); bool run (HumdrumFile& infile); - bool run (const string& indata, ostream& out); - bool run (HumdrumFile& infile, ostream& out); + bool run (const std::string& indata, std::ostream& out); + bool run (HumdrumFile& infile, std::ostream& out); protected: void processFile (HumdrumFile& infile); @@ -10156,8 +11042,8 @@ class Tool_spinetrace : public HumTool { bool run (HumdrumFileSet& infiles); bool run (HumdrumFile& infile); - bool run (const string& indata, ostream& out); - bool run (HumdrumFile& infile, ostream& out); + bool run (const std::string& indata, std::ostream& out); + bool run (HumdrumFile& infile, std::ostream& out); protected: void initialize (HumdrumFile& infile); @@ -10176,8 +11062,8 @@ class Tool_strophe : public HumTool { bool run (HumdrumFileSet& infiles); bool run (HumdrumFile& infile); - bool run (const string& indata, ostream& out); - bool run (HumdrumFile& infile, ostream& out); + bool run (const std::string& indata, std::ostream& out); + bool run (HumdrumFile& infile, std::ostream& out); protected: void processFile (HumdrumFile& infile); @@ -10203,8 +11089,8 @@ class Tool_synco : public HumTool { bool run (HumdrumFileSet& infiles); bool run (HumdrumFile& infile); - bool run (const string& indata, ostream& out); - bool run (HumdrumFile& infile, ostream& out); + bool run (const std::string& indata, std::ostream& out); + bool run (HumdrumFile& infile, std::ostream& out); protected: void processFile (HumdrumFile& infile); @@ -10238,8 +11124,8 @@ class Tool_tabber : public HumTool { bool run (HumdrumFileSet& infiles); bool run (HumdrumFile& infile); - bool run (const string& indata, ostream& out); - bool run (HumdrumFile& infile, ostream& out); + bool run (const std::string& indata, std::ostream& out); + bool run (HumdrumFile& infile, std::ostream& out); protected: void initialize (HumdrumFile& infile); @@ -10251,6 +11137,94 @@ class Tool_tabber : public HumTool { +class Tool_tandeminfo : public HumTool { + public: + class Entry { + public: + HTp token = NULL; + std::string description; + int count = 0; + }; + + Tool_tandeminfo (void); + ~Tool_tandeminfo () {}; + + bool run (HumdrumFileSet& infiles); + bool run (HumdrumFile& infile); + bool run (const std::string& indata, std::ostream& out); + bool run (HumdrumFile& infile, std::ostream& out); + + + protected: + void initialize (void); + void processFile (HumdrumFile& infile); + void printEntries (HumdrumFile& infile); + void printEntriesHtml (HumdrumFile& infile); + void printEntriesText (HumdrumFile& infile); + void doCountAnalysis (void); + + std::string getDescription (HTp token); + std::string checkForKeySignature (const std::string& tok); + std::string checkForKeyDesignation (const std::string& tok); + std::string checkForInstrumentInfo (const std::string& tok); + std::string checkForLabelInfo (const std::string& tok); + std::string checkForTimeSignature (const std::string& tok); + std::string checkForMeter (const std::string& tok); + std::string checkForTempoMarking (const std::string& tok); + std::string checkForClef (const std::string& tok); + std::string checkForStaffPartGroup (const std::string& tok); + std::string checkForTuplet (const std::string& tok); + std::string checkForHands (const std::string& tok); + std::string checkForPosition (const std::string& tok); + std::string checkForCue (const std::string& tok); + std::string checkForFlip (const std::string& tok); + std::string checkForTremolo (const std::string& tok); + std::string checkForOttava (const std::string& tok); + std::string checkForPedal (const std::string& tok); + std::string checkForBracket (const std::string& tok); + std::string checkForRscale (const std::string& tok); + std::string checkForTimebase (const std::string& tok); + std::string checkForTransposition (const std::string& tok); + std::string checkForGrp (const std::string& tok); + std::string checkForStria (const std::string& tok); + std::string checkForFont (const std::string& tok); + std::string checkForVerseLabels (const std::string& tok); + std::string checkForLanguage (const std::string& tok); + std::string checkForStemInfo (const std::string& tok); + std::string checkForXywh (const std::string& tok); + std::string checkForCustos (const std::string& tok); + std::string checkForTextInterps (const std::string& tok); + std::string checkForRep (const std::string& tok); + std::string checkForPline (const std::string& tok); + std::string checkForTacet (const std::string& tok); + std::string checkForFb (const std::string& tok); + std::string checkForColor (const std::string& tok); + std::string checkForThru (const std::string& tok); + + private: + bool m_exclusiveQ = true; // used with -X option (don't print exclusive interpretation) + bool m_unknownQ = false; // used with -u option (print only unknown tandem interpretations) + bool m_filenameQ = false; // used with -f option (print only unknown tandem interpretations) + bool m_descriptionQ = false; // used with -m option (print description of interpretation) + bool m_locationQ = false; // used with -l option (print location of interpretation in file) + bool m_zeroQ = false; // used with -z option (location address by 0-index) + bool m_tableQ = false; // used with -t option (display results as HTML table) + bool m_closeQ = false; // used with --close option (HTML details closed by default) + bool m_sortQ = false; // used with -s (sort entries alphabetically by tandem interpretation) + bool m_headerOnlyQ = false; // used with -h option (process only header interpretations) + bool m_bodyOnlyQ = false; // used with -H option (process only body interpretations) + bool m_countQ = false; // used with -c option (only show unique list with counts); + bool m_sortByCountQ = false; // used with -c and -n options (sort from low to high count) + bool m_sortByReverseCountQ = false; // used with -c and -N options (sort from high to low count) + bool m_humdrumQ = false; // used with --humdrum option (output data formatted with Humdrum syntax) + + std::string m_unknown = "unknown"; + + std::vector m_entries; + std::map m_count; +}; + + class Tool_tassoize : public HumTool { public: Tool_tassoize (void); @@ -10258,8 +11232,8 @@ class Tool_tassoize : public HumTool { bool run (HumdrumFileSet& infiles); bool run (HumdrumFile& infile); - bool run (const string& indata, ostream& out); - bool run (HumdrumFile& infile, ostream& out); + bool run (const std::string& indata, std::ostream& out); + bool run (HumdrumFile& infile, std::ostream& out); protected: void initialize (HumdrumFile& infile); @@ -10273,13 +11247,13 @@ class Tool_tassoize : public HumTool { void fixInstrumentAbbreviations(HumdrumFile& infile); void addTerminalLongs (HumdrumFile& infile); void deleteDummyTranspositions(HumdrumFile& infile); - string getDate (void); + std::string getDate (void); void adjustSystemDecoration(HumdrumFile& infile); private: - vector> m_pstates; - vector> m_kstates; - vector> m_estates; + std::vector> m_pstates; + std::vector> m_kstates; + std::vector> m_estates; }; @@ -10291,8 +11265,8 @@ class Tool_textdur : public HumTool { bool run (HumdrumFileSet& infiles); bool run (HumdrumFile& infile); - bool run (const string& indata, ostream& out); - bool run (HumdrumFile& infile, ostream& out); + bool run (const std::string& indata, std::ostream& out); + bool run (HumdrumFile& infile, std::ostream& out); protected: @@ -10300,13 +11274,13 @@ class Tool_textdur : public HumTool { void processFile (HumdrumFile& infile); void printMelismas (HumdrumFile& infile); void printDurations (HumdrumFile& infile); - void getTextSpineStarts(HumdrumFile& infile, vector& starts); - void processTextSpine (vector& starts, int index); + void getTextSpineStarts(HumdrumFile& infile, std::vector& starts); + void processTextSpine (std::vector& starts, int index); int getMelisma (HTp tok1, HTp tok2); HumNum getDuration (HTp tok1, HTp tok2); HTp getTandemKernToken(HTp token); void printInterleaved (HumdrumFile& infile); - void printInterleavedLine(HumdrumLine& line, vector& textTrack); + void printInterleavedLine(HumdrumLine& line, std::vector& textTrack); void printTokenAnalysis(HTp token); void printAnalysis (void); void printDurationAverage(void); @@ -10321,7 +11295,7 @@ class Tool_textdur : public HumTool { private: std::vector m_textStarts; std::vector m_track2column; - std::vector m_columnName; + std::vector m_columnName; std::vector> m_syllables; // List of syllables in **text/**sylba std::vector> m_durations; // List of durations excluding trailing rests @@ -10343,8 +11317,8 @@ class Tool_thru : public HumTool { bool run (HumdrumFileSet& infiles); bool run (HumdrumFile& infile); - bool run (const string& indata, ostream& out); - bool run (HumdrumFile& infile, ostream& out); + bool run (const std::string& indata, std::ostream& out); + bool run (HumdrumFile& infile, std::ostream& out); protected: void processFile (HumdrumFile& infile); @@ -10354,9 +11328,9 @@ class Tool_thru : public HumTool { void example (void); void processData (HumdrumFile& infile); void usage (const char* command); - void getLabelSequence (vector& labelsequence, - const string& astring); - int getLabelIndex (vector& labels, string& key); + void getLabelSequence (std::vector& labelsequence, + const std::string& astring); + int getLabelIndex (std::vector& labels, std::string& key); void printLabelList (HumdrumFile& infile); void printLabelInfo (HumdrumFile& infile); int getBarline (HumdrumFile& infile, int line); @@ -10367,8 +11341,8 @@ class Tool_thru : public HumTool { bool m_infoQ = false; // used with -i option bool m_keepQ = false; // used with -k option bool m_quietQ = false; // used with -q option - string m_variation = ""; // used with -v option - string m_realization = ""; // used with -r option + std::string m_variation = ""; // used with -v option + std::string m_realization = ""; // used with -r option }; @@ -10380,7 +11354,7 @@ class Tool_tie : public HumTool { bool run (HumdrumFileSet& infiles); bool run (HumdrumFile& infile); - bool run (const string& indata, std::ostream& out); + bool run (const std::string& indata, std::ostream& out); bool run (HumdrumFile& infile, std::ostream& out); protected: @@ -10417,8 +11391,8 @@ class Tool_timebase : public HumTool { bool run (HumdrumFileSet& infiles); bool run (HumdrumFile& infile); - bool run (const string& indata, ostream& out); - bool run (HumdrumFile& infile, ostream& out); + bool run (const std::string& indata, std::ostream& out); + bool run (HumdrumFile& infile, std::ostream& out); protected: void processFile (HumdrumFile& infile); @@ -10441,8 +11415,8 @@ class Tool_transpose : public HumTool { bool run (HumdrumFileSet& infiles); bool run (HumdrumFile& infile); - bool run (const std::string& indata, ostream& out); - bool run (HumdrumFile& infile, ostream& out); + bool run (const std::string& indata, std::ostream& out); + bool run (HumdrumFile& infile, std::ostream& out); protected: @@ -10450,14 +11424,14 @@ class Tool_transpose : public HumTool { void initialize (HumdrumFile& infile); void convertScore (HumdrumFile& infile, int style); void processFile (HumdrumFile& infile, - vector& spineprocess); + std::vector& spineprocess); void convertToConcertPitches(HumdrumFile& infile, int line, - vector& tvals); + std::vector& tvals); void convertToWrittenPitches(HumdrumFile& infile, int line, - vector& tvals); + std::vector& tvals); void printNewKeySignature (const std::string& keysig, int trans); void processInterpretationLine(HumdrumFile& infile, int line, - vector& tvals, int style); + std::vector& tvals, int style); int isKeyMarker (const std::string& str); void printNewKeyInterpretation(HumdrumLine& aRecord, int index, int transval); @@ -10471,54 +11445,54 @@ class Tool_transpose : public HumTool { void example (void); void usage (const std::string& command); void printHumdrumDataRecord (HumdrumLine& record, - vector& spineprocess); + std::vector& spineprocess); double pearsonCorrelation (int size, double* x, double* y); void doAutoTransposeAnalysis(HumdrumFile& infile); - void addToHistogramDouble (vector >& histogram, + void addToHistogramDouble (std::vector >& histogram, int pc, double start, double dur, double tdur, int segments); - double storeHistogramForTrack (vector >& histogram, + double storeHistogramForTrack (std::vector >& histogram, HumdrumFile& infile, int track, int segments); - void printHistograms (int segments, vector ktracks, - vector > >& + void printHistograms (int segments, std::vector ktracks, + std::vector > >& trackhist); - void doAutoKeyAnalysis (vector > >& + void doAutoKeyAnalysis (std::vector > >& analysis, int level, int hop, int count, - int segments, vector& ktracks, - vector > >& + int segments, std::vector& ktracks, + std::vector > >& trackhist); - void doTrackKeyAnalysis (vector >& analysis, + void doTrackKeyAnalysis (std::vector >& analysis, int level, int hop, int count, - vector >& trackhist, - vector& majorweights, - vector& minorweights); - void identifyKeyDouble (vector& correls, - vector& histogram, - vector& majorweights, - vector& minorweights); - void fillWeightsWithKostkaPayne(vector& maj, - vector& min); - void printRawTrackAnalysis (vector > >& - analysis, vector& ktracks); - void doSingleAnalysis (vector& analysis, + std::vector >& trackhist, + std::vector& majorweights, + std::vector& minorweights); + void identifyKeyDouble (std::vector& correls, + std::vector& histogram, + std::vector& majorweights, + std::vector& minorweights); + void fillWeightsWithKostkaPayne(std::vector& maj, + std::vector& min); + void printRawTrackAnalysis (std::vector > >& + analysis, std::vector& ktracks); + void doSingleAnalysis (std::vector& analysis, int startindex, int length, - vector >& trackhist, - vector& majorweights, - vector& minorweights); - void identifyKey (vector& correls, - vector& histogram, - vector& majorweights, - vector& minorweights); - void doTranspositionAnalysis(vector > >& + std::vector >& trackhist, + std::vector& majorweights, + std::vector& minorweights); + void identifyKey (std::vector& correls, + std::vector& histogram, + std::vector& majorweights, + std::vector& minorweights); + void doTranspositionAnalysis(std::vector > >& analysis); int calculateTranspositionFromKey(int targetkey, HumdrumFile& infile); void printTransposedToken (HumdrumFile& infile, int row, int col, int transval); void printTransposeInformation(HumdrumFile& infile, - vector& spineprocess, + std::vector& spineprocess, int line, int transval); int getTransposeInfo (HumdrumFile& infile, int row, int col); void printNewKernString (const std::string& string, int transval); @@ -10530,7 +11504,7 @@ class Tool_transpose : public HumTool { int currentkey = 0; int autoQ = 0; // used with --auto option int debugQ = 0; // used with --debug option - string spinestring = ""; // used with -s option + std::string spinestring = ""; // used with -s option int octave = 0; // used with -o option int concertQ = 0; // used with -C option int writtenQ = 0; // used with -W option @@ -10547,8 +11521,8 @@ class Tool_tremolo : public HumTool { bool run (HumdrumFileSet& infiles); bool run (HumdrumFile& infile); - bool run (const string& indata, ostream& out); - bool run (HumdrumFile& infile, ostream& out); + bool run (const std::string& indata, std::ostream& out); + bool run (HumdrumFile& infile, std::ostream& out); protected: void processFile (HumdrumFile& infile); @@ -10578,15 +11552,15 @@ class Tool_trillspell : public HumTool { bool run (HumdrumFileSet& infiles); bool run (HumdrumFile& infile); - bool run (const string& indata, ostream& out); - bool run (HumdrumFile& infile, ostream& out); + bool run (const std::string& indata, std::ostream& out); + bool run (HumdrumFile& infile, std::ostream& out); protected: void processFile (HumdrumFile& infile); bool analyzeOrnamentAccidentals(HumdrumFile& infile); - void resetDiatonicStatesWithKeySignature(vector& states, - vector& signature); - void fillKeySignature (vector& states, const string& keysig); + void resetDiatonicStatesWithKeySignature(std::vector& states, + std::vector& signature); + void fillKeySignature (std::vector& states, const std::string& keysig); int getBase40 (int diatonic, int accidental); private: @@ -10603,8 +11577,8 @@ class Tool_tspos : public HumTool { bool run (HumdrumFileSet& infiles); bool run (HumdrumFile& infile); - bool run (const string& indata, ostream& out); - bool run (HumdrumFile& infile, ostream& out); + bool run (const std::string& indata, std::ostream& out); + bool run (HumdrumFile& infile, std::ostream& out); protected: void initialize (HumdrumFile& infile); @@ -10628,9 +11602,10 @@ class Tool_tspos : public HumTool { bool hasFullTriadAttack(HumdrumLine& line); void avoidRdfCollisions(HumdrumFile& infile); void printUsedMarkers(void); - std::string makeOpacityColor(std::string& color, double value, double total); + std::string makeOpacityColor(std::string& color, double value, double total, bool enhance = false); int getToolCounter(HumdrumFile& infile); std::string makePercentString(double value, double total, int digits); + int logisticColorMap(double input, double max); private: std::string m_root_marker = "@"; @@ -10661,7 +11636,7 @@ class Tool_tspos : public HumTool { bool m_triadAttack = false; // used with -x option // Statistical data variables: - vector m_triadState; + std::vector m_triadState; // m_partTriadPositions -- count the number of chordal positions by // voice. The first dimention is the track number of the part, and @@ -10673,10 +11648,10 @@ class Tool_tspos : public HumTool { // 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; + std::vector> m_partTriadPositions; int m_positionCount = 7; // entries in 2nd dim. of m_partTriadPositions - string m_toolName = "tspos"; + std::string m_toolName = "tspos"; std::vector m_voiceCount; // m_voice: used with -v option to limit analysis to sonorities that @@ -10691,7 +11666,33 @@ class Tool_tspos : public HumTool { bool m_questionQ = true; int m_toolCount = 0; - std::vector m_fullNames; + std::vector m_fullNames; +}; + + +class Tool_vcross : public HumTool { + public: + Tool_vcross (void); + ~Tool_vcross () {}; + + bool run (HumdrumFileSet& infiles); + bool run (HumdrumFile& infile); + bool run (const std::string& indata, std::ostream& out); + bool run (HumdrumFile& infile, std::ostream& out); + + protected: + void processFile (HumdrumFile& infile); + void initialize (void); + void getMidiInfo (std::vector& midis, HTp token); + void compareVoices (std::vector& higher, std::vector& lower); + void processLine (HumdrumFile& infile, int index); + + private: + bool m_redQ = false; + bool m_greenQ = false; + bool m_blueQ = false; + + }; diff --git a/include/vrv/adjustneumexfunctor.h b/include/vrv/adjustneumexfunctor.h new file mode 100644 index 00000000000..7a2c22722c9 --- /dev/null +++ b/include/vrv/adjustneumexfunctor.h @@ -0,0 +1,65 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: adjustneumexfunctor.h +// Author: Laurent Pugin +// Created: 2024 +// Copyright (c) Authors and others. All rights reserved. +///////////////////////////////////////////////////////////////////////////// + +#ifndef __VRV_ADJUSTNEUMEXFUNCTOR_H__ +#define __VRV_ADJUSTNEUMEXFUNCTOR_H__ + +#include "functor.h" + +namespace vrv { + +//---------------------------------------------------------------------------- +// AdjustNeumeXFunctor +//---------------------------------------------------------------------------- + +/** + * This class adjusts the X position of accidentals. + */ +class AdjustNeumeXFunctor : public DocFunctor { +public: + /** + * @name Constructors, destructors + */ + ///@{ + AdjustNeumeXFunctor(Doc *doc); + virtual ~AdjustNeumeXFunctor() = default; + ///@} + + /* + * Abstract base implementation + */ + bool ImplementsEndInterface() const override { return true; } + + /* + * Functor interface + */ + ///@{ + /// + FunctorCode VisitLayer(Layer *layer) override; + FunctorCode VisitLayerEnd(Layer *layer) override; + FunctorCode VisitStaff(Staff *staff) override; + FunctorCode VisitNeume(Neume *neume) override; + FunctorCode VisitSyl(Syl *syl) override; + + ///@} + +protected: + // +private: + // +public: + // +private: + /** The minimum position of the next syl */ + int m_minPos; + /** The minimum position of the next neume */ + int m_neumeMinPos; +}; + +} // namespace vrv + +#endif // __VRV_ADJUSTNEUMEXFUNCTOR_H__ diff --git a/include/vrv/adjustxposfunctor.h b/include/vrv/adjustxposfunctor.h index 0b7d07b7ad8..ffdb5380762 100644 --- a/include/vrv/adjustxposfunctor.h +++ b/include/vrv/adjustxposfunctor.h @@ -107,6 +107,8 @@ class AdjustXPosFunctor : public DocFunctor { int m_staffN; // The current staff size int m_staffSize; + // The current staff is neume + bool m_isNeumeStaff; // The list of staffN in the top-level scoreDef std::vector m_staffNs; // The bounding boxes in the previous aligner @@ -125,6 +127,8 @@ class AdjustXPosFunctor : public DocFunctor { AdjustXPosAlignmentOffset m_currentAlignment; // The preceeding alignment AdjustXPosAlignmentOffset m_previousAlignment; + // The current measure + Measure *m_measure; }; } // namespace vrv diff --git a/include/vrv/adjustyrelfortranscriptionfunctor.h b/include/vrv/adjustyrelfortranscriptionfunctor.h new file mode 100644 index 00000000000..af26cbda9e2 --- /dev/null +++ b/include/vrv/adjustyrelfortranscriptionfunctor.h @@ -0,0 +1,56 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: adjustyrelfortranscriptionfunctor.h +// Author: Yinan Zhou +// Created: 2024 +// Copyright (c) Authors and others. All rights reserved. +///////////////////////////////////////////////////////////////////////////// + +#ifndef __VRV_ADJUSTYRELFORTRANSCRIPTIONFUNCTOR_H__ +#define __VRV_ADJUSTYRELFORTRANSCRIPTIONFUNCTOR_H__ + +#include "functor.h" + +namespace vrv { + +//---------------------------------------------------------------------------- +// AdjustYRelForTranscriptionFunctor +//---------------------------------------------------------------------------- + +/** + * This class adjusts the YRel positions taking into account the bounding boxes. + */ +class AdjustYRelForTranscriptionFunctor : public Functor { +public: + /** + * @name Constructors, destructors + */ + ///@{ + AdjustYRelForTranscriptionFunctor(); + virtual ~AdjustYRelForTranscriptionFunctor() = default; + ///@} + + /* + * Abstract base implementation + */ + bool ImplementsEndInterface() const override { return false; } + + /* + * Functor interface + */ + ///@{ + FunctorCode VisitLayerElement(LayerElement *layerElement) override; + ///@} + +protected: + // +private: + // +public: + // +private: + // +}; + +} // namespace vrv + +#endif // __VRV_ADJUSTYRELFORTRANSCRIPTIONFUNCTOR_H__ diff --git a/include/vrv/barline.h b/include/vrv/barline.h index 164c2214130..407c4ca4ac7 100644 --- a/include/vrv/barline.h +++ b/include/vrv/barline.h @@ -9,6 +9,7 @@ #define __VRV_BARLINE_H__ #include "atts_shared.h" +#include "atts_visual.h" #include "layerelement.h" namespace vrv { @@ -27,6 +28,7 @@ enum class BarLinePosition { None, Left, Right }; */ class BarLine : public LayerElement, public AttBarLineLog, + public AttBarLineVis, public AttColor, public AttNNumberLike, public AttVisibility { @@ -76,9 +78,9 @@ class BarLine : public LayerElement, * @return First entry is true if the attribute was found, second entry contains the value */ ///@{ - std::pair GetLength(const StaffDef *staffDef) const; - std::pair GetMethod(const StaffDef *staffDef) const; - std::pair GetPlace(const StaffDef *staffDef) const; + std::pair GetLengthFromContext(const StaffDef *staffDef) const; + std::pair GetMethodFromContext(const StaffDef *staffDef) const; + std::pair GetPlaceFromContext(const StaffDef *staffDef) const; ///@} //----------// diff --git a/include/vrv/beam.h b/include/vrv/beam.h index 54683186f3d..6f6b56482c0 100644 --- a/include/vrv/beam.h +++ b/include/vrv/beam.h @@ -295,6 +295,11 @@ class Beam : public LayerElement, std::string GetClassName() const override { return "Beam"; } ///@} + /** + * Overriding CloneReset() method to be called after copy / assignment calls. + */ + void CloneReset() override; + /** * @name Getter to interfaces */ diff --git a/include/vrv/calcligaturenoteposfunctor.h b/include/vrv/calcligatureorneumeposfunctor.h similarity index 68% rename from include/vrv/calcligaturenoteposfunctor.h rename to include/vrv/calcligatureorneumeposfunctor.h index bcf41a2f1ea..1dba3e5296b 100644 --- a/include/vrv/calcligaturenoteposfunctor.h +++ b/include/vrv/calcligatureorneumeposfunctor.h @@ -1,32 +1,32 @@ ///////////////////////////////////////////////////////////////////////////// -// Name: calcligaturenoteposfunctor.h +// Name: calcligatureorneumeposfunctor.h // Author: David Bauer // Created: 2023 // Copyright (c) Authors and others. All rights reserved. ///////////////////////////////////////////////////////////////////////////// -#ifndef __VRV_CALCLIGATURENOTEPOSFUNCTOR_H__ -#define __VRV_CALCLIGATURENOTEPOSFUNCTOR_H__ +#ifndef __VRV_CALCLIGATUREORNEUMEPOSFUNCTOR_H__ +#define __VRV_CALCLIGATUREORNEUMEPOSFUNCTOR_H__ #include "functor.h" namespace vrv { //---------------------------------------------------------------------------- -// CalcLigatureNotePosFunctor +// CalcLigatureOrNeumePosFunctor //---------------------------------------------------------------------------- /** * This class sets the note position for each note in ligature. */ -class CalcLigatureNotePosFunctor : public DocFunctor { +class CalcLigatureOrNeumePosFunctor : public DocFunctor { public: /** * @name Constructors, destructors */ ///@{ - CalcLigatureNotePosFunctor(Doc *doc); - virtual ~CalcLigatureNotePosFunctor() = default; + CalcLigatureOrNeumePosFunctor(Doc *doc); + virtual ~CalcLigatureOrNeumePosFunctor() = default; ///@} /* @@ -39,6 +39,7 @@ class CalcLigatureNotePosFunctor : public DocFunctor { */ ///@{ FunctorCode VisitLigature(Ligature *ligature) override; + FunctorCode VisitNeume(Neume *neume) override; ///@} protected: @@ -53,4 +54,4 @@ class CalcLigatureNotePosFunctor : public DocFunctor { } // namespace vrv -#endif // __VRV_CALCLIGATURENOTEPOSFUNCTOR_H__ +#endif // __VRV_CALCLIGATUREORNEUMEPOSFUNCTOR_H__ diff --git a/include/vrv/clef.h b/include/vrv/clef.h index bc16c6fdc42..15704c7b23d 100644 --- a/include/vrv/clef.h +++ b/include/vrv/clef.h @@ -59,7 +59,7 @@ class Clef : public LayerElement, /** * Return the offset of the clef */ - int GetClefLocOffset() const; + int GetClefLocOffset(data_NOTATIONTYPE notationType) const; //----------------// // Static methods // diff --git a/include/vrv/devicecontext.h b/include/vrv/devicecontext.h index b319c835a1a..95c62a81208 100644 --- a/include/vrv/devicecontext.h +++ b/include/vrv/devicecontext.h @@ -74,6 +74,7 @@ class DeviceContext { m_baseWidth = 0; m_baseHeight = 0; m_pushBack = false; + m_viewBoxFactor = (double)DEFINITION_FACTOR; } DeviceContext(ClassId classId) { @@ -89,6 +90,7 @@ class DeviceContext { m_baseWidth = 0; m_baseHeight = 0; m_pushBack = false; + m_viewBoxFactor = (double)DEFINITION_FACTOR; } virtual ~DeviceContext(){}; ClassId GetClassId() const { return m_classId; } @@ -124,12 +126,14 @@ class DeviceContext { m_baseWidth = width; m_baseHeight = height; } + void SetViewBoxFactor(double ppuFactor); int GetWidth() const { return m_width; } int GetHeight() const { return m_height; } int GetContentHeight() const { return m_contentHeight; } double GetUserScaleX() { return m_userScaleX; } double GetUserScaleY() { return m_userScaleY; } std::pair GetBaseSize() const { return std::make_pair(m_baseWidth, m_baseHeight); } + double GetViewBoxFactor() const { return m_viewBoxFactor; } ///@} /** @@ -365,6 +369,9 @@ class DeviceContext { /** stores the scale as requested by the used */ double m_userScaleX; double m_userScaleY; + + /** stores the viewbox factor taking into account the DEFINTION_FACTOR and the PPU */ + double m_viewBoxFactor; }; } // namespace vrv diff --git a/include/vrv/divline.h b/include/vrv/divline.h index 98622e62d5f..9ad45fee68c 100644 --- a/include/vrv/divline.h +++ b/include/vrv/divline.h @@ -37,13 +37,13 @@ class DivLine : public LayerElement, ///@{ DivLine(); virtual ~DivLine(); - virtual Object *Clone() const { return new DivLine(*this); } - virtual void Reset(); - virtual std::string GetClassName() const { return "DivLine"; } + Object *Clone() const override { return new DivLine(*this); } + void Reset() override; + std::string GetClassName() const override { return "DivLine"; } ///@} /** Override the method since alignment is required */ - virtual bool HasToBeAligned() const { return true; } + bool HasToBeAligned() const override { return true; } /** * Use to set the alignment for the Measure BarLine members. @@ -84,8 +84,8 @@ class DivLineAttr : public DivLine { ///@{ DivLineAttr(); virtual ~DivLineAttr(); - virtual Object *Clone() const { return new DivLineAttr(*this); } - virtual std::string GetClassName() const { return "DivLineAttr"; } + Object *Clone() const override { return new DivLineAttr(*this); } + std::string GetClassName() const override { return "DivLineAttr"; } ///@} // void SetLeft() { m_isLeft = true; } diff --git a/include/vrv/doc.h b/include/vrv/doc.h index 687f6f068e2..48876eec45e 100644 --- a/include/vrv/doc.h +++ b/include/vrv/doc.h @@ -451,6 +451,14 @@ class Doc : public Object { bool IsMensuralMusicOnly() const { return m_isMensuralMusicOnly; } ///@} + /** + * @name Setter for and getter for neume-line flag + */ + ///@{ + void SetNeumeLines(bool isNeumeLines) { m_isNeumeLines = isNeumeLines; } + bool IsNeumeLines() const { return m_isNeumeLines; } + ///@} + /** * @name Setter and getter for facsimile */ @@ -660,6 +668,12 @@ class Doc : public Object { */ bool m_isMensuralMusicOnly; + /** + * A flag to indicate that the document contains neume lines. + * This is a special document type where neume lines are encoded with
+ */ + bool m_isNeumeLines; + /** Page width (MEI scoredef@page.width) - currently not saved */ int m_pageWidth; /** Page height (MEI scoredef@page.height) - currently not saved */ diff --git a/include/vrv/editortoolkit_neume.h b/include/vrv/editortoolkit_neume.h index 11828f083cb..1a925b0c8f9 100644 --- a/include/vrv/editortoolkit_neume.h +++ b/include/vrv/editortoolkit_neume.h @@ -16,6 +16,7 @@ #include "doc.h" #include "editortoolkit.h" +#include "measure.h" #include "view.h" #include "vrv.h" #include "zone.h" @@ -50,6 +51,8 @@ class EditorToolkitNeume : public EditorToolkit { 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 SetLiquescent(std::string elementId, std::string shape); + bool SortStaves(); bool Split(std::string elementId, int x); bool SplitNeume(std::string elementId, std::string ncId); bool Remove(std::string elementId); @@ -80,6 +83,7 @@ class EditorToolkitNeume : public EditorToolkit { 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 ParseSetLiquescentAction(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); @@ -139,6 +143,7 @@ struct ClosestBB { }; // To be used with std::stable_sort to find the position to insert a new accid / divLine +// TODO: use closesBB instead struct ClosestNeume { int x; int y; @@ -177,11 +182,26 @@ struct ClosestNeume { struct StaffSort { // Sort staves left-to-right and top-to-bottom // Sort by y if there is no intersection, by x if there is x intersection is smaller than half length of staff line + + // Update 2024-04: + // Used only in neume lines, + // System->(Measure->Staff) + // Need to sort Measure to sort staff bool operator()(Object *a, Object *b) { - if (!a->GetFacsimileInterface() || !b->GetFacsimileInterface()) return true; - Zone *zoneA = a->GetFacsimileInterface()->GetZone(); - Zone *zoneB = b->GetFacsimileInterface()->GetZone(); + if (!a->Is(SYSTEM) || !b->Is(SYSTEM)) return false; + if (!a->FindDescendantByType(MEASURE) || !b->FindDescendantByType(MEASURE)) return false; + Measure *measureA = dynamic_cast(a->FindDescendantByType(MEASURE)); + Measure *measureB = dynamic_cast(b->FindDescendantByType(MEASURE)); + if (!measureA->IsNeumeLine() || !measureB->IsNeumeLine()) return true; + Object *staffA = a->FindDescendantByType(STAFF); + Object *staffB = b->FindDescendantByType(STAFF); + assert(staffA); + assert(staffB); + Zone *zoneA = staffA->GetFacsimileInterface()->GetZone(); + Zone *zoneB = staffB->GetFacsimileInterface()->GetZone(); + assert(zoneA); + assert(zoneB); int aLowest, bLowest, aHighest, bHighest; diff --git a/include/vrv/elementpart.h b/include/vrv/elementpart.h index 4387902979c..3f5c98d4d2c 100644 --- a/include/vrv/elementpart.h +++ b/include/vrv/elementpart.h @@ -22,7 +22,7 @@ class TupletNum; //---------------------------------------------------------------------------- /** - * This class models a group of dots as a layer element part and has not direct MEI equivlatent. + * This class models a group of dots as a layer element part and has no direct MEI equivalent. */ class Dots : public LayerElement, public AttAugmentDots { public: @@ -92,7 +92,7 @@ class Dots : public LayerElement, public AttAugmentDots { //---------------------------------------------------------------------------- /** - * This class models a stem as a layer element part and has not direct MEI equivlatent. + * This class models a stem as a layer element part and has no direct MEI equivalent. */ class Flag : public LayerElement { public: @@ -144,7 +144,7 @@ class Flag : public LayerElement { //---------------------------------------------------------------------------- /** - * This class models a bracket as a layer element part and has not direct MEI equivlatent. + * This class models a bracket as a layer element part and has no direct MEI equivalent. * It is used to represent tuplet brackets. */ class TupletBracket : public LayerElement, public AttTupletVis { @@ -243,7 +243,7 @@ class TupletBracket : public LayerElement, public AttTupletVis { //---------------------------------------------------------------------------- /** - * This class models a tuplet num as a layer element part and has not direct MEI equivlatent. + * This class models a tuplet num as a layer element part and has no direct MEI equivalent. * It is used to represent tuplet number */ class TupletNum : public LayerElement, public AttNumberPlacement, public AttTupletVis { diff --git a/include/vrv/facsimilefunctor.h b/include/vrv/facsimilefunctor.h index 1273343626c..7ccf8f3e772 100644 --- a/include/vrv/facsimilefunctor.h +++ b/include/vrv/facsimilefunctor.h @@ -42,7 +42,7 @@ class SyncFromFacsimileFunctor : public Functor { /* * Abstract base implementation */ - bool ImplementsEndInterface() const override { return false; } + bool ImplementsEndInterface() const override { return true; } /* * Functor interface @@ -51,6 +51,7 @@ class SyncFromFacsimileFunctor : public Functor { FunctorCode VisitLayerElement(LayerElement *layerElement) override; FunctorCode VisitMeasure(Measure *measure) override; FunctorCode VisitPage(Page *page) override; + FunctorCode VisitPageEnd(Page *page) override; FunctorCode VisitPb(Pb *pb) override; FunctorCode VisitSb(Sb *sb) override; FunctorCode VisitStaff(Staff *staff) override; @@ -71,6 +72,9 @@ class SyncFromFacsimileFunctor : public Functor { // Page *m_currentPage; System *m_currentSystem; + Measure *m_currentNeumeLine; + /** map to store the zone corresponding to a staff */ + std::map m_staffZones; }; //---------------------------------------------------------------------------- diff --git a/include/vrv/facsimileinterface.h b/include/vrv/facsimileinterface.h index 7afafef144b..84f46ddb9b8 100644 --- a/include/vrv/facsimileinterface.h +++ b/include/vrv/facsimileinterface.h @@ -58,6 +58,13 @@ class FacsimileInterface : public Interface, public AttFacsimile { Zone *GetZone() { return m_zone; } const Zone *GetZone() const { return m_zone; } ///@} + /// + + /** Get the surface */ + ///@{ + Surface *GetSurface() { return m_surface; } + const Surface *GetSurface() const { return m_surface; } + ///@} //-----------------// // Pseudo functors // diff --git a/include/vrv/filereader.h b/include/vrv/filereader.h index ea17d92de86..80e631aa6bc 100644 --- a/include/vrv/filereader.h +++ b/include/vrv/filereader.h @@ -53,7 +53,7 @@ class ZipFileReader { /** * Load a vector into memory */ - bool Load(const std::vector &bytes); + bool LoadBytes(const std::vector &bytes); /** * Check if the archive contains the file diff --git a/include/vrv/findfunctor.h b/include/vrv/findfunctor.h index 90d0a4da6ff..6a953e878c2 100644 --- a/include/vrv/findfunctor.h +++ b/include/vrv/findfunctor.h @@ -475,6 +475,7 @@ class FindElementInLayerStaffDefFunctor : public ConstFunctor { */ ///@{ FunctorCode VisitLayer(const Layer *layer) override; + FunctorCode VisitScore(const Score *score) override; ///@} protected: diff --git a/include/vrv/horizontalaligner.h b/include/vrv/horizontalaligner.h index 9c8a8da8160..73f8e09c03d 100644 --- a/include/vrv/horizontalaligner.h +++ b/include/vrv/horizontalaligner.h @@ -10,6 +10,7 @@ #include "atts_shared.h" #include "object.h" +#include "vrv.h" namespace vrv { @@ -184,6 +185,11 @@ class Alignment : public Object { */ bool HasTimestampOnly() const; + /** + * Debug message + */ + std::string LogDebugTreeMsg() override { return StringFormat("%d %f", this->GetXRel(), this->GetTime()); } + //----------------// // Static methods // //----------------// diff --git a/include/vrv/iohumdrum.h b/include/vrv/iohumdrum.h index 8a1cccb114d..b36fee2b2e7 100644 --- a/include/vrv/iohumdrum.h +++ b/include/vrv/iohumdrum.h @@ -278,6 +278,7 @@ namespace humaux { // an ottava line which will be turned off later. ottavameasure == the // starting measure of the ottava mark. Note *ottavanotestart; + std::string ottavanotestartid; Note *ottavanoteend; hum::HumNum ottavaendtimestamp; Measure *ottavameasure; @@ -286,6 +287,7 @@ namespace humaux { // an ottava down line which will be turned off later. ottavadownmeasure == the // starting measure of the ottava down mark. Note *ottavadownnotestart; + std::string ottavadownnotestartid; Note *ottavadownnoteend; hum::HumNum ottavadownendtimestamp; Measure *ottavadownmeasure; @@ -294,6 +296,7 @@ namespace humaux { // an ottava2 line which will be turned off later. ottava2measure == the // starting measure of the ottava2 mark. Note *ottava2notestart; + std::string ottava2notestartid; Note *ottava2noteend; hum::HumNum ottava2endtimestamp; Measure *ottava2measure; @@ -302,6 +305,7 @@ namespace humaux { // an ottava2 down line which will be turned off later. ottava2downmeasure == the // starting measure of the ottava2 down mark. Note *ottava2downnotestart; + std::string ottava2downnotestartid; Note *ottava2downnoteend; hum::HumNum ottava2downendtimestamp; Measure *ottava2downmeasure; @@ -710,6 +714,7 @@ class HumdrumInput : public vrv::Input { std::string getInstrumentClass(hum::HTp start); void removeInstrumentName(StaffDef *sd); void removeInstrumentAbbreviation(StaffDef *sd); + std::string getStartIdForOttava(hum::HTp token); std::string getEndIdForOttava(hum::HTp token); void prepareInitialOttavas(hum::HTp measure); void linkFingeringToNote(Fing *fing, hum::HTp token, int xstaffindex); @@ -893,6 +898,10 @@ class HumdrumInput : public vrv::Input { int getKeySignatureNumber(const std::string &humkeysig); int getStaffNumForSpine(hum::HTp token); bool checkIfReversedSpineOrder(std::vector &staffstarts); + bool hasOmdText(int startline, int endline); + void processMeiOptions(hum::HumdrumFile &infile); + std::string getInstrumentNumber(hum::HTp icode); + void insertTextWithNewlines(Label *label, const std::string &text); // header related functions: /////////////////////////////////////////// void createHeader(); @@ -926,6 +935,7 @@ class HumdrumInput : public vrv::Input { int getBestItem(const std::vector &items, const std::string &requiredLanguage); bool isStandardHumdrumKey(const std::string &key); void appendText(pugi::xml_node element, std::string text); + void addDefaultTempoDist(double distance); /// Templates /////////////////////////////////////////////////////////// template void verticalRest(ELEMENT rest, const std::string &token); diff --git a/include/vrv/iomei.h b/include/vrv/iomei.h index 12f530bdacf..79caf6480f4 100644 --- a/include/vrv/iomei.h +++ b/include/vrv/iomei.h @@ -105,6 +105,7 @@ class Note; class Num; class Octave; class Orig; +class Oriscus; class Ornam; class Page; class PageElement; @@ -121,6 +122,7 @@ class Plica; class PlistInterface; class PositionInterface; class Proport; +class Quilisma; class Rdg; class Ref; class Reg; @@ -410,8 +412,10 @@ class MEIOutput : public Output { void WriteNc(pugi::xml_node currentNode, Nc *nc); void WriteNeume(pugi::xml_node currentNode, Neume *neume); void WriteNote(pugi::xml_node currentNode, Note *note); + void WriteOriscus(pugi::xml_node currentNode, Oriscus *oriscus); void WritePlica(pugi::xml_node currentNode, Plica *plica); void WriteProport(pugi::xml_node currentNode, Proport *proport); + void WriteQuilisma(pugi::xml_node currentNode, Quilisma *quilisma); void WriteRest(pugi::xml_node currentNode, Rest *rest); void WriteSpace(pugi::xml_node currentNode, Space *space); void WriteStem(pugi::xml_node currentNode, Stem *stem); @@ -721,8 +725,10 @@ class MEIInput : public Input { bool ReadNc(Object *parent, pugi::xml_node nc); bool ReadNeume(Object *parent, pugi::xml_node note); bool ReadNote(Object *parent, pugi::xml_node note); + bool ReadOriscus(Object *parent, pugi::xml_node oriscus); bool ReadPlica(Object *parent, pugi::xml_node plica); bool ReadProport(Object *parent, pugi::xml_node proport); + bool ReadQuilisma(Object *parent, pugi::xml_node quilisma); bool ReadRest(Object *parent, pugi::xml_node rest); bool ReadSpace(Object *parent, pugi::xml_node space); bool ReadStem(Object *parent, pugi::xml_node stem); diff --git a/include/vrv/iopae.h b/include/vrv/iopae.h index b02f0620adc..9af974e0468 100644 --- a/include/vrv/iopae.h +++ b/include/vrv/iopae.h @@ -102,6 +102,7 @@ class PAEOutput : public Output { */ ///@{ void WriteMdiv(Mdiv *mDiv); + void WriteMdivEnd(Mdiv *mDiv); void WriteScoreDef(ScoreDef *scoreDef); void WriteStaffDef(StaffDef *staffDef); void WriteMeasure(Measure *measure); @@ -496,6 +497,8 @@ namespace pae { bool IsSpace(); /** Return true is the token has to be ignore during parsing */ bool IsVoid(); + /** Set the object as being inserted in the MEI tree */ + void SetInTree(); /* Helper to the a lowercase version of the Object classname (if any) */ std::string GetName(); @@ -504,6 +507,8 @@ namespace pae { char m_char; /** The Object to be added to the tree */ Object *m_object; + /** The object added to the tree */ + Object *m_treeObject; /** the input char preserved for debugging purposes */ char m_inputChar; /** the position in the original input string for debuggin purposes */ @@ -654,7 +659,6 @@ class PAEInput : public Input { /** * Some additional checked to be performed one the MEI tree has been build. - * Unimplemented */ bool CheckContentPostBuild(); @@ -663,6 +667,12 @@ class PAEInput : public Input { */ void RemoveContainerToken(Object *object); + /** + * Return the token corresponding to an object in the tree. + * Return NULL if not found. + */ + pae::Token *GetTokenForTreeObject(Object *object); + /** * @name Some logging methods specific to the PAE parser */ diff --git a/include/vrv/iovolpiano.h b/include/vrv/iovolpiano.h new file mode 100644 index 00000000000..3b990c23985 --- /dev/null +++ b/include/vrv/iovolpiano.h @@ -0,0 +1,44 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: iovolpiano.h +// Author: Laurent Pugin +// Created: 2024 +// Copyright (c) Authors and others. All rights reserved. +///////////////////////////////////////////////////////////////////////////// + +#ifndef __VRV_IOVOLPIANO_H__ +#define __VRV_IOVOLPIANO_H__ + +#include +#include + +//---------------------------------------------------------------------------- + +#include "iobase.h" +#include "pugixml.hpp" +#include "vrvdef.h" + +namespace vrv { + +//---------------------------------------------------------------------------- +// VolpianoInput +//---------------------------------------------------------------------------- + +class VolpianoInput : public Input { +public: + // constructors and destructors + VolpianoInput(Doc *doc); + virtual ~VolpianoInput(); + + bool Import(const std::string &volpiano) override; + +private: + // +public: + // +private: + // +}; + +} // namespace vrv + +#endif diff --git a/include/vrv/layerelement.h b/include/vrv/layerelement.h index cf8a7af9e32..4740e64373b 100644 --- a/include/vrv/layerelement.h +++ b/include/vrv/layerelement.h @@ -80,7 +80,7 @@ class LayerElement : public Object, /** * Return true if the element has to be aligned horizontally - * It typically set to false for mRest, mRpt, etc. + * It is typically set to false for mRest, mRpt, etc. */ virtual bool HasToBeAligned() const { return false; } @@ -387,6 +387,7 @@ class LayerElement : public Object, public: /** Absolute position X. This is used for facsimile (transcription) encoding */ int m_drawingFacsX; + int m_drawingFacsY; // This is used only for accid, syl /** * This stores a pointer to the cross-staff (if any) and the appropriate layer * See PrepareCrossStaffFunctor diff --git a/include/vrv/liquescent.h b/include/vrv/liquescent.h index e64d63c15aa..6a753ddb0d4 100644 --- a/include/vrv/liquescent.h +++ b/include/vrv/liquescent.h @@ -29,20 +29,20 @@ class Liquescent : public LayerElement, public PitchInterface, public PositionIn ///@{ Liquescent(); virtual ~Liquescent(); - virtual Object *Clone() const { return new Liquescent(*this); } - virtual void Reset(); - virtual std::string GetClassName() const { return "Liquescent"; } + Object *Clone() const override { return new Liquescent(*this); } + void Reset() override; + std::string GetClassName() const override { return "Liquescent"; } ///@} /** * @name Getter to interfaces */ ///@{ - virtual PitchInterface *GetPitchInterface() { return dynamic_cast(this); } + PitchInterface *GetPitchInterface() override { return dynamic_cast(this); } ///@} /** Override the method since alignment is required */ - virtual bool HasToBeAligned() const { return true; } + bool HasToBeAligned() const override { return true; } private: // diff --git a/include/vrv/measure.h b/include/vrv/measure.h index 49ab432a0d7..dcf96d15243 100644 --- a/include/vrv/measure.h +++ b/include/vrv/measure.h @@ -53,7 +53,7 @@ class Measure : public Object, * Reset method resets all attribute classes */ ///@{ - Measure(bool measuredMusic = true, int logMeasureNb = -1); + Measure(MeasureType measuredMusic = MEASURED, int logMeasureNb = -1); virtual ~Measure(); Object *Clone() const override { return new Measure(*this); }; void Reset() override; @@ -79,7 +79,12 @@ class Measure : public Object, /** * Return true if measured music (otherwise we have fake measures) */ - bool IsMeasuredMusic() const { return m_measuredMusic; } + bool IsMeasuredMusic() const { return (m_measureType == MEASURED); } + + /** + * Return true if the measure represents a neume (section) line + */ + bool IsNeumeLine() const { return (m_measureType == NEUMELINE); } /** * Get and set the measure index @@ -404,9 +409,10 @@ class Measure : public Object, private: /** - * Indicates measured music (otherwise we have fake measures) + * Indicate measured music (CMN), unmeasured (fake measures for mensural or neumes) or neume lines + * Neume line measure are created from
*/ - bool m_measuredMusic; + MeasureType m_measureType; /** * The unique measure index diff --git a/include/vrv/nc.h b/include/vrv/nc.h index 4f02ea5430b..42b60762da9 100644 --- a/include/vrv/nc.h +++ b/include/vrv/nc.h @@ -64,6 +64,16 @@ class Nc : public LayerElement, const PitchInterface *GetPitchInterface() const override { return vrv_cast(this); } ///@} + /** + * Calclulate the pitch or loc difference between to nc. + * The Pitch difference takes precedence over the loc difference. + */ + int PitchOrLocDifferenceTo(const Nc *nc) const; + + //----------// + // Functors // + //----------// + /** * Interface for class functor visitation */ @@ -74,7 +84,25 @@ class Nc : public LayerElement, FunctorCode AcceptEnd(ConstFunctor &functor) const override; ///@} + /** + * A Structure holding a glyph paramter for the nc. + * One single nc might need more than one glyph (e.g., liquescent). + * Set in CalcLigatureOrNeumePosFunctor::VisitNeume + */ + struct DrawingGlyph { + wchar_t m_fontNo = 0; + float m_xOffset = 0.0; + float m_yOffset = 0.0; + }; + +private: + // +public: + /** Drawing glyphs */ + std::vector m_drawingGlyphs; + private: + // }; } // namespace vrv diff --git a/include/vrv/object.h b/include/vrv/object.h index 31bbf863f95..7da3e2c1309 100644 --- a/include/vrv/object.h +++ b/include/vrv/object.h @@ -165,7 +165,7 @@ class Object : public BoundingBox { const Resources *GetDocResources() const; /** - * Reset the object, that is 1) removing all childs and 2) resetting all attributes. + * Reset the object, that is 1) removing all children and 2) resetting all attributes. * The method is virtual, so _always_ call the parent in the method overriding it. */ virtual void Reset(); @@ -659,6 +659,14 @@ class Object : public BoundingBox { virtual FunctorCode AcceptEnd(ConstFunctor &functor) const; ///@} + /** + * Output the class name of the object (or a custom msg) and of its children recursively + */ + ///@{ + void LogDebugTree(int maxDepth = UNLIMITED_DEPTH, int level = 0); + virtual std::string LogDebugTreeMsg() { return this->GetClassName(); } + ///@} + //----------------// // Static methods // //----------------// @@ -812,8 +820,8 @@ class Object : public BoundingBox { class ObjectListInterface { public: // constructors and destructors - ObjectListInterface(){}; - virtual ~ObjectListInterface(){}; + ObjectListInterface() = default; + virtual ~ObjectListInterface() = default; ObjectListInterface(const ObjectListInterface &listInterface); // copy constructor; ObjectListInterface &operator=(const ObjectListInterface &listInterface); // copy assignment; @@ -911,8 +919,8 @@ class ObjectListInterface { class TextListInterface : public ObjectListInterface { public: // constructors and destructors - TextListInterface(){}; - virtual ~TextListInterface(){}; + TextListInterface() = default; + virtual ~TextListInterface() = default; /** * Returns a contatenated version of all the text children diff --git a/include/vrv/oriscus.h b/include/vrv/oriscus.h new file mode 100644 index 00000000000..775c8bb6c78 --- /dev/null +++ b/include/vrv/oriscus.h @@ -0,0 +1,56 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: oriscus.h +// Author: Klaus Rettinghaus +// Created: 2024 +// Copyright (c) Authors and others. All rights reserved. +///////////////////////////////////////////////////////////////////////////// + +#ifndef __VRV_oriscus_H__ +#define __VRV_oriscus_H__ + +#include "atts_analytical.h" +#include "atts_shared.h" +#include "layerelement.h" +#include "pitchinterface.h" +#include "positioninterface.h" + +namespace vrv { + +//---------------------------------------------------------------------------- +// oriscus +//---------------------------------------------------------------------------- + +class Oriscus : public LayerElement, public PitchInterface, public PositionInterface, public AttColor { +public: + /** + * @name Constructors, destructors, and other standard methods + * Reset method resets all attribute classes + */ + ///@{ + Oriscus(); + virtual ~Oriscus(); + Object *Clone() const override { return new Oriscus(*this); } + void Reset() override; + std::string GetClassName() const override { return "Oriscus"; } + ///@} + + /** + * @name Getter to interfaces + */ + ///@{ + PitchInterface *GetPitchInterface() override { return dynamic_cast(this); } + ///@} + + /** Override the method since alignment is required */ + bool HasToBeAligned() const override { return true; } + +private: + // +public: + // +private: +}; + +} // namespace vrv + +#endif diff --git a/include/vrv/quilisma.h b/include/vrv/quilisma.h new file mode 100644 index 00000000000..9933f505772 --- /dev/null +++ b/include/vrv/quilisma.h @@ -0,0 +1,56 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: quilisma.h +// Author: Klaus Rettinghaus +// Created: 2024 +// Copyright (c) Authors and others. All rights reserved. +///////////////////////////////////////////////////////////////////////////// + +#ifndef __VRV_quilisma_H__ +#define __VRV_quilisma_H__ + +#include "atts_analytical.h" +#include "atts_shared.h" +#include "layerelement.h" +#include "pitchinterface.h" +#include "positioninterface.h" + +namespace vrv { + +//---------------------------------------------------------------------------- +// quilisma +//---------------------------------------------------------------------------- + +class Quilisma : public LayerElement, public PitchInterface, public PositionInterface, public AttColor { +public: + /** + * @name Constructors, destructors, and other standard methods + * Reset method resets all attribute classes + */ + ///@{ + Quilisma(); + virtual ~Quilisma(); + Object *Clone() const override { return new Quilisma(*this); } + void Reset() override; + std::string GetClassName() const override { return "Quilisma"; } + ///@} + + /** + * @name Getter to interfaces + */ + ///@{ + PitchInterface *GetPitchInterface() override { return dynamic_cast(this); } + ///@} + + /** Override the method since alignment is required */ + bool HasToBeAligned() const override { return true; } + +private: + // +public: + // +private: +}; + +} // namespace vrv + +#endif diff --git a/include/vrv/resetfunctor.h b/include/vrv/resetfunctor.h index f8f4d5c1032..e67034ccfc7 100644 --- a/include/vrv/resetfunctor.h +++ b/include/vrv/resetfunctor.h @@ -62,6 +62,7 @@ class ResetDataFunctor : public Functor { FunctorCode VisitMeasure(Measure *measure) override; FunctorCode VisitMRest(MRest *mRest) override; FunctorCode VisitNote(Note *note) override; + FunctorCode VisitNc(Nc *nc) override; FunctorCode VisitObject(Object *object) override; FunctorCode VisitRepeatMark(RepeatMark *repeatMark) override; FunctorCode VisitRest(Rest *rest) override; diff --git a/include/vrv/smufl.h b/include/vrv/smufl.h index 300b9559819..2c116e8bd14 100644 --- a/include/vrv/smufl.h +++ b/include/vrv/smufl.h @@ -312,6 +312,8 @@ enum { SMUFL_E56F_ornamentHaydn = 0xE56F, SMUFL_E583_ornamentVerticalLine = 0xE583, SMUFL_E587_ornamentSchleifer = 0xE587, + SMUFL_E594_ornamentLeftVerticalStroke = 0xE594, + SMUFL_E595_ornamentLeftVerticalStrokeWithCross = 0xE595, SMUFL_E59D_ornamentZigZagLineNoRightEnd = 0xE59D, SMUFL_E59E_ornamentZigZagLineWithRightEnd = 0xE59E, SMUFL_E5B0_ornamentPrecompSlide = 0xE5B0, @@ -432,6 +434,10 @@ enum { SMUFL_E923_mensuralProlationCombiningThreeDotsTri = 0xE923, SMUFL_E924_mensuralProlationCombiningDotVoid = 0xE924, SMUFL_E925_mensuralProlationCombiningStroke = 0xE925, + SMUFL_E926_mensuralProportion1 = 0xE926, + SMUFL_E927_mensuralProportion2 = 0xE927, + SMUFL_E928_mensuralProportion3 = 0xE928, + SMUFL_E929_mensuralProportion4 = 0xE929, SMUFL_E938_mensuralNoteheadSemibrevisBlack = 0xE938, SMUFL_E939_mensuralNoteheadSemibrevisVoid = 0xE939, SMUFL_E93C_mensuralNoteheadMinimaWhite = 0xE93C, @@ -462,6 +468,7 @@ enum { SMUFL_E99B_chantQuilisma = 0xE99B, SMUFL_E99E_chantOriscusLiquescens = 0xE99E, SMUFL_E99F_chantStrophicus = 0xE99F, + SMUFL_E9A1_chantPunctumDeminutum = 0xE9A1, SMUFL_E9B0_chantPodatusLower = 0xE9B0, SMUFL_E9B1_chantPodatusUpper = 0xE9B1, SMUFL_E9B2_chantDeminutumUpper = 0xE9B2, @@ -495,6 +502,7 @@ enum { SMUFL_E9F8_mensuralRestSemifusa = 0xE9F8, SMUFL_EA02_mensuralCustosUp = 0xEA02, SMUFL_EA06_chantCustosStemUpPosMiddle = 0xEA06, + SMUFL_EA2A_medRenOriscusCMN = 0xEA2A, SMUFL_EA50_figbass0 = 0xEA50, SMUFL_EA51_figbass1 = 0xEA51, SMUFL_EA52_figbass2 = 0xEA52, @@ -642,10 +650,15 @@ enum { SMUFL_ECB7_metAugmentationDot = 0xECB7, SMUFL_ED40_articSoftAccentAbove = 0xED40, SMUFL_ED41_articSoftAccentBelow = 0xED41, + SMUFL_EE90_mensuralProportion5 = 0xEE90, + SMUFL_EE91_mensuralProportion6 = 0xEE91, + SMUFL_EE92_mensuralProportion7 = 0xEE92, + SMUFL_EE93_mensuralProportion8 = 0xEE93, + SMUFL_EE94_mensuralProportion9 = 0xEE94, }; /** The number of glyphs for verification **/ -#define SMUFL_COUNT 620 +#define SMUFL_COUNT 633 } // namespace vrv diff --git a/include/vrv/staff.h b/include/vrv/staff.h index cd68fe3eaa4..d49d48f0c8c 100644 --- a/include/vrv/staff.h +++ b/include/vrv/staff.h @@ -36,13 +36,8 @@ class LedgerLine { public: /** * @name Constructors, destructors, reset methods - * Reset method reset all attribute classes */ - ///@{ - LedgerLine(); - virtual ~LedgerLine(); - virtual void Reset(); - ///@} + LedgerLine() = default; /** * Add a dash to the ledger line object. @@ -112,6 +107,17 @@ class Staff : public Object, } ///@} + /** + * @name Getters and setters for the rotation. + * Used only with facsimile rendering. + */ + ///@{ + void SetDrawingRotation(double drawingRotation) { m_drawingRotation = drawingRotation; } + double GetDrawingRotation() const { return m_drawingRotation; } + bool HasDrawingRotation() const { return (m_drawingRotation != 0.0); } + int GetDrawingRotationOffsetFor(int x); + ///@} + /** * Delete all the legder line arrays. */ @@ -290,6 +296,12 @@ class Staff : public Object, ArrayOfLedgerLines m_ledgerLinesAboveCue; ArrayOfLedgerLines m_ledgerLinesBelowCue; ///@} + + /** + * The drawing rotation. + * Used only with facsimile rendering + */ + double m_drawingRotation; }; } // namespace vrv diff --git a/include/vrv/toolkit.h b/include/vrv/toolkit.h index 8ec0376e71d..61bea74b805 100644 --- a/include/vrv/toolkit.h +++ b/include/vrv/toolkit.h @@ -770,6 +770,22 @@ class Toolkit { */ void ResetLogBuffer(); + /** + * Start capturing std::cerr from an external codebase for redirection to vrv::logBuffer. + * Only one capture should be active at a given time. Finish by calling LogRedirectStop. + */ + void LogRedirectStart(); + + /** + * End capturing std::cerr from an external codebase for redirection to vrv::logBuffer. + */ + void LogRedirectStop(); + + /** + * Load a string data with or without resetting the log buffer + */ + bool LoadData(const std::string &data, bool resetLogBuffer); + private: bool SetFont(const std::string &fontName); bool IsUTF16(const std::string &filename); @@ -805,6 +821,18 @@ class Toolkit { */ char *m_cString; + /** + * Temporary capture buffer for redirecting std::cerr to vrv::LogWarning. + * Used to coordinate between LogRedirectStart()/LogRedirectStop(). + */ + std::stringstream m_cerrCaptured; + + /** + * Temporary storage of the std::cerr read buffer during LogCapture. NULL when not in use. + * Used to coordinate between LogRedirectStart()/LogRedirectStop(). + */ + std::streambuf *m_cerrOriginalBuf; + EditorToolkit *m_editorToolkit; #ifndef NO_RUNTIME diff --git a/include/vrv/toolkitdef.h b/include/vrv/toolkitdef.h index d8183106e0f..246a4c1bc74 100644 --- a/include/vrv/toolkitdef.h +++ b/include/vrv/toolkitdef.h @@ -20,6 +20,7 @@ enum FileFormat { PAE, ABC, DARMS, + VOLPIANO, MUSICXML, MUSICXMLHUM, MEIHUM, diff --git a/include/vrv/view.h b/include/vrv/view.h index 2f59e4c6657..e7faedd7ad1 100644 --- a/include/vrv/view.h +++ b/include/vrv/view.h @@ -416,16 +416,20 @@ class View { ///@{ 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 DrawLiquescent(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); + void DrawOriscus(DeviceContext *dc, LayerElement *element, Layer *layer, Staff *staff, Measure *measure); + void DrawQuilisma(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 + * Defined in view_neume.cpp */ ///@{ void DrawNcAsNotehead(DeviceContext *dc, Nc *nc, Layer *layer, Staff *staff, Measure *measure); + void DrawNcGlyphs(DeviceContext *dc, Nc *nc, Staff *staff); ///@} /** @@ -561,6 +565,8 @@ class View { void DrawVerticalLine(DeviceContext *dc, int y1, int y2, int x1, int width, int dashLength = 0, int gapLength = 0); void DrawHorizontalLine( DeviceContext *dc, int x1, int x2, int y1, int width, int dashLength = 0, int gapLength = 0); + void DrawObliqueLine( + DeviceContext *dc, int x1, int x2, int y1, int y2, int width, int dashLength = 0, int gapLength = 0); void DrawVerticalSegmentedLine( DeviceContext *dc, int x1, SegmentedLine &line, int width, int dashLength = 0, int gapLength = 0); void DrawHorizontalSegmentedLine( diff --git a/include/vrv/vrv.h b/include/vrv/vrv.h index 866458b9e70..daec31198e2 100644 --- a/include/vrv/vrv.h +++ b/include/vrv/vrv.h @@ -145,7 +145,7 @@ extern bool loggingToBuffer; */ extern struct timeval start; void LogElapsedTimeStart(); -void LogElapsedTimeEnd(const char *msg = "unspecified operation"); +void LogElapsedTimeStop(const char *msg = "unspecified operation"); //---------------------------------------------------------------------------- // Notation type checks diff --git a/include/vrv/vrvdef.h b/include/vrv/vrvdef.h index 8b79c2167e4..a5c6019e334 100644 --- a/include/vrv/vrvdef.h +++ b/include/vrv/vrvdef.h @@ -39,10 +39,10 @@ namespace vrv { //---------------------------------------------------------------------------- #define VERSION_MAJOR 4 -#define VERSION_MINOR 2 -#define VERSION_REVISION 1 +#define VERSION_MINOR 3 +#define VERSION_REVISION 0 // Adds "-dev" in the version number - should be set to false for releases -#define VERSION_DEV false +#define VERSION_DEV true //---------------------------------------------------------------------------- // Resource directory @@ -238,8 +238,10 @@ enum ClassId : uint16_t { NC, NOTE, NEUME, + ORISCUS, PLICA, PROPORT, + QUILISMA, REST, SPACE, STEM, @@ -661,6 +663,14 @@ enum SmuflTextFont { SMUFL_NONE = 0, SMUFL_FONT_SELECTED, SMUFL_FONT_FALLBACK }; enum GraphicID { PRIMARY = 0, SPANNING, SYMBOLREF }; +//---------------------------------------------------------------------------- +// Measure type +//---------------------------------------------------------------------------- + +enum MeasureType { MEASURED = 0, UNMEASURED, NEUMELINE }; + +#define NEUME_LINE_TYPE "neon-neume-line" + //---------------------------------------------------------------------------- // Legacy Wolfgang defines //---------------------------------------------------------------------------- diff --git a/libmei/README.md b/libmei/README.md index 75f39ad2a8b..e3b8c4d7fdf 100644 --- a/libmei/README.md +++ b/libmei/README.md @@ -11,9 +11,9 @@ This is a modified version that is used for generating C++ code for Verovio. 2. each attribute has a C++ type deduced from the MEI schema or given in a separated datatypes configuration file, 3. it uses the MEI page-based customization by default. - License ------- + LibMEI is released under the MIT license. Compilation & Usage @@ -32,14 +32,15 @@ This allows you to run Python with all the necessary dependencies for running th To generate the code, activate the poetry environment and, from the `libmei` directory, run: - $> python3 tools/parseschema2.py ./mei/develop/mei-verovio_compiled.odd + $> python3 tools/parseschema2.py ./mei/mei-verovio_compiled.odd Where the positional argument points to an ODD file for which you wish to generate code. Other options are: + * `-c`: A path to a YML config file. If not specified this will look for a file called "config.yml" - in your current working directory. (provided by default, but you can make your own if you - have custom requirements.) + in your current working directory. (provided by default, but you can make your own if you + have custom requirements.) Config file ----------- @@ -53,7 +54,7 @@ addons_dir: "../addons" # path to an optional addons directory elements: true|false # whether code for element handling should be generated namespace: "vrv" # the namespace to use in generated CPP code datatypes: "./datatypes.yml" # path to a datatypes mapping file -# path to an MEI basic ODD file. If not provided then the meibasic.h file will not +# path to an MEI Basic ODD file. If not provided then the meibasic.h file will not # be written. (This contains a map of the elements and attributes allowed in MEI Basic # which is then used by Verovio to ensure the "full" MEI output is stripped when the user # requests "Basic" output.) @@ -61,8 +62,8 @@ basic_odd: "../mei/develop/mei-basic_compiled.odd" ``` For the `basic_odd` option, if provided the generator will generate a map of notes and allowed -attributes within the MEI basic ODD file and write it to a file called `meibasic.h`. +attributes within the MEI Basic ODD file and write it to a file called `meibasic.h`. If the `addons_dir` is provided, the files in that directory will be copied to the output directory. The files will also have the namespace in the addons replaced with the value provided in the -`namespace` option. \ No newline at end of file +`namespace` option. diff --git a/libmei/poetry.lock b/libmei/poetry.lock index 659fbf9c64a..eb9bea4e236 100644 --- a/libmei/poetry.lock +++ b/libmei/poetry.lock @@ -1,146 +1,170 @@ -# This file is automatically @generated by Poetry and should not be changed by hand. +# This file is automatically @generated by Poetry 1.8.3 and should not be changed by hand. [[package]] name = "lxml" -version = "4.9.2" +version = "4.9.4" description = "Powerful and Pythonic XML processing library combining libxml2/libxslt with the ElementTree API." -category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, != 3.4.*" files = [ - {file = "lxml-4.9.2-cp27-cp27m-macosx_10_15_x86_64.whl", hash = "sha256:76cf573e5a365e790396a5cc2b909812633409306c6531a6877c59061e42c4f2"}, - {file = "lxml-4.9.2-cp27-cp27m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b1f42b6921d0e81b1bcb5e395bc091a70f41c4d4e55ba99c6da2b31626c44892"}, - {file = "lxml-4.9.2-cp27-cp27m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:9f102706d0ca011de571de32c3247c6476b55bb6bc65a20f682f000b07a4852a"}, - {file = "lxml-4.9.2-cp27-cp27m-win32.whl", hash = "sha256:8d0b4612b66ff5d62d03bcaa043bb018f74dfea51184e53f067e6fdcba4bd8de"}, - {file = "lxml-4.9.2-cp27-cp27m-win_amd64.whl", hash = "sha256:4c8f293f14abc8fd3e8e01c5bd86e6ed0b6ef71936ded5bf10fe7a5efefbaca3"}, - {file = "lxml-4.9.2-cp27-cp27mu-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2899456259589aa38bfb018c364d6ae7b53c5c22d8e27d0ec7609c2a1ff78b50"}, - {file = "lxml-4.9.2-cp27-cp27mu-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:6749649eecd6a9871cae297bffa4ee76f90b4504a2a2ab528d9ebe912b101975"}, - {file = "lxml-4.9.2-cp310-cp310-macosx_10_15_x86_64.whl", hash = "sha256:a08cff61517ee26cb56f1e949cca38caabe9ea9fbb4b1e10a805dc39844b7d5c"}, - {file = "lxml-4.9.2-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:85cabf64adec449132e55616e7ca3e1000ab449d1d0f9d7f83146ed5bdcb6d8a"}, - {file = "lxml-4.9.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:8340225bd5e7a701c0fa98284c849c9b9fc9238abf53a0ebd90900f25d39a4e4"}, - {file = "lxml-4.9.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:1ab8f1f932e8f82355e75dda5413a57612c6ea448069d4fb2e217e9a4bed13d4"}, - {file = "lxml-4.9.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:699a9af7dffaf67deeae27b2112aa06b41c370d5e7633e0ee0aea2e0b6c211f7"}, - {file = "lxml-4.9.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b9cc34af337a97d470040f99ba4282f6e6bac88407d021688a5d585e44a23184"}, - {file = "lxml-4.9.2-cp310-cp310-win32.whl", hash = "sha256:d02a5399126a53492415d4906ab0ad0375a5456cc05c3fc0fc4ca11771745cda"}, - {file = "lxml-4.9.2-cp310-cp310-win_amd64.whl", hash = "sha256:a38486985ca49cfa574a507e7a2215c0c780fd1778bb6290c21193b7211702ab"}, - {file = "lxml-4.9.2-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:c83203addf554215463b59f6399835201999b5e48019dc17f182ed5ad87205c9"}, - {file = "lxml-4.9.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:2a87fa548561d2f4643c99cd13131acb607ddabb70682dcf1dff5f71f781a4bf"}, - {file = "lxml-4.9.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:d6b430a9938a5a5d85fc107d852262ddcd48602c120e3dbb02137c83d212b380"}, - {file = "lxml-4.9.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:3efea981d956a6f7173b4659849f55081867cf897e719f57383698af6f618a92"}, - {file = "lxml-4.9.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:df0623dcf9668ad0445e0558a21211d4e9a149ea8f5666917c8eeec515f0a6d1"}, - {file = "lxml-4.9.2-cp311-cp311-win32.whl", hash = "sha256:da248f93f0418a9e9d94b0080d7ebc407a9a5e6d0b57bb30db9b5cc28de1ad33"}, - {file = "lxml-4.9.2-cp311-cp311-win_amd64.whl", hash = "sha256:3818b8e2c4b5148567e1b09ce739006acfaa44ce3156f8cbbc11062994b8e8dd"}, - {file = "lxml-4.9.2-cp35-cp35m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ca989b91cf3a3ba28930a9fc1e9aeafc2a395448641df1f387a2d394638943b0"}, - {file = "lxml-4.9.2-cp35-cp35m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:822068f85e12a6e292803e112ab876bc03ed1f03dddb80154c395f891ca6b31e"}, - {file = "lxml-4.9.2-cp35-cp35m-win32.whl", hash = "sha256:be7292c55101e22f2a3d4d8913944cbea71eea90792bf914add27454a13905df"}, - {file = "lxml-4.9.2-cp35-cp35m-win_amd64.whl", hash = "sha256:998c7c41910666d2976928c38ea96a70d1aa43be6fe502f21a651e17483a43c5"}, - {file = "lxml-4.9.2-cp36-cp36m-macosx_10_15_x86_64.whl", hash = "sha256:b26a29f0b7fc6f0897f043ca366142d2b609dc60756ee6e4e90b5f762c6adc53"}, - {file = "lxml-4.9.2-cp36-cp36m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:ab323679b8b3030000f2be63e22cdeea5b47ee0abd2d6a1dc0c8103ddaa56cd7"}, - {file = "lxml-4.9.2-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:689bb688a1db722485e4610a503e3e9210dcc20c520b45ac8f7533c837be76fe"}, - {file = "lxml-4.9.2-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:f49e52d174375a7def9915c9f06ec4e569d235ad428f70751765f48d5926678c"}, - {file = "lxml-4.9.2-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:36c3c175d34652a35475a73762b545f4527aec044910a651d2bf50de9c3352b1"}, - {file = "lxml-4.9.2-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:a35f8b7fa99f90dd2f5dc5a9fa12332642f087a7641289ca6c40d6e1a2637d8e"}, - {file = "lxml-4.9.2-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:58bfa3aa19ca4c0f28c5dde0ff56c520fbac6f0daf4fac66ed4c8d2fb7f22e74"}, - {file = "lxml-4.9.2-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:bc718cd47b765e790eecb74d044cc8d37d58562f6c314ee9484df26276d36a38"}, - {file = "lxml-4.9.2-cp36-cp36m-win32.whl", hash = "sha256:d5bf6545cd27aaa8a13033ce56354ed9e25ab0e4ac3b5392b763d8d04b08e0c5"}, - {file = "lxml-4.9.2-cp36-cp36m-win_amd64.whl", hash = "sha256:3ab9fa9d6dc2a7f29d7affdf3edebf6ece6fb28a6d80b14c3b2fb9d39b9322c3"}, - {file = "lxml-4.9.2-cp37-cp37m-macosx_10_15_x86_64.whl", hash = "sha256:05ca3f6abf5cf78fe053da9b1166e062ade3fa5d4f92b4ed688127ea7d7b1d03"}, - {file = "lxml-4.9.2-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:a5da296eb617d18e497bcf0a5c528f5d3b18dadb3619fbdadf4ed2356ef8d941"}, - {file = "lxml-4.9.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:04876580c050a8c5341d706dd464ff04fd597095cc8c023252566a8826505726"}, - {file = "lxml-4.9.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:c9ec3eaf616d67db0764b3bb983962b4f385a1f08304fd30c7283954e6a7869b"}, - {file = "lxml-4.9.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2a29ba94d065945944016b6b74e538bdb1751a1db6ffb80c9d3c2e40d6fa9894"}, - {file = "lxml-4.9.2-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:a82d05da00a58b8e4c0008edbc8a4b6ec5a4bc1e2ee0fb6ed157cf634ed7fa45"}, - {file = "lxml-4.9.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:223f4232855ade399bd409331e6ca70fb5578efef22cf4069a6090acc0f53c0e"}, - {file = "lxml-4.9.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:d17bc7c2ccf49c478c5bdd447594e82692c74222698cfc9b5daae7ae7e90743b"}, - {file = "lxml-4.9.2-cp37-cp37m-win32.whl", hash = "sha256:b64d891da92e232c36976c80ed7ebb383e3f148489796d8d31a5b6a677825efe"}, - {file = "lxml-4.9.2-cp37-cp37m-win_amd64.whl", hash = "sha256:a0a336d6d3e8b234a3aae3c674873d8f0e720b76bc1d9416866c41cd9500ffb9"}, - {file = "lxml-4.9.2-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:da4dd7c9c50c059aba52b3524f84d7de956f7fef88f0bafcf4ad7dde94a064e8"}, - {file = "lxml-4.9.2-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:821b7f59b99551c69c85a6039c65b75f5683bdc63270fec660f75da67469ca24"}, - {file = "lxml-4.9.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:e5168986b90a8d1f2f9dc1b841467c74221bd752537b99761a93d2d981e04889"}, - {file = "lxml-4.9.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:8e20cb5a47247e383cf4ff523205060991021233ebd6f924bca927fcf25cf86f"}, - {file = "lxml-4.9.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:13598ecfbd2e86ea7ae45ec28a2a54fb87ee9b9fdb0f6d343297d8e548392c03"}, - {file = "lxml-4.9.2-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:880bbbcbe2fca64e2f4d8e04db47bcdf504936fa2b33933efd945e1b429bea8c"}, - {file = "lxml-4.9.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:7d2278d59425777cfcb19735018d897ca8303abe67cc735f9f97177ceff8027f"}, - {file = "lxml-4.9.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:5344a43228767f53a9df6e5b253f8cdca7dfc7b7aeae52551958192f56d98457"}, - {file = "lxml-4.9.2-cp38-cp38-win32.whl", hash = "sha256:925073b2fe14ab9b87e73f9a5fde6ce6392da430f3004d8b72cc86f746f5163b"}, - {file = "lxml-4.9.2-cp38-cp38-win_amd64.whl", hash = "sha256:9b22c5c66f67ae00c0199f6055705bc3eb3fcb08d03d2ec4059a2b1b25ed48d7"}, - {file = "lxml-4.9.2-cp39-cp39-macosx_10_15_x86_64.whl", hash = "sha256:5f50a1c177e2fa3ee0667a5ab79fdc6b23086bc8b589d90b93b4bd17eb0e64d1"}, - {file = "lxml-4.9.2-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:090c6543d3696cbe15b4ac6e175e576bcc3f1ccfbba970061b7300b0c15a2140"}, - {file = "lxml-4.9.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:63da2ccc0857c311d764e7d3d90f429c252e83b52d1f8f1d1fe55be26827d1f4"}, - {file = "lxml-4.9.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:5b4545b8a40478183ac06c073e81a5ce4cf01bf1734962577cf2bb569a5b3bbf"}, - {file = "lxml-4.9.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2e430cd2824f05f2d4f687701144556646bae8f249fd60aa1e4c768ba7018947"}, - {file = "lxml-4.9.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:6804daeb7ef69e7b36f76caddb85cccd63d0c56dedb47555d2fc969e2af6a1a5"}, - {file = "lxml-4.9.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:a6e441a86553c310258aca15d1c05903aaf4965b23f3bc2d55f200804e005ee5"}, - {file = "lxml-4.9.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ca34efc80a29351897e18888c71c6aca4a359247c87e0b1c7ada14f0ab0c0fb2"}, - {file = "lxml-4.9.2-cp39-cp39-win32.whl", hash = "sha256:6b418afe5df18233fc6b6093deb82a32895b6bb0b1155c2cdb05203f583053f1"}, - {file = "lxml-4.9.2-cp39-cp39-win_amd64.whl", hash = "sha256:f1496ea22ca2c830cbcbd473de8f114a320da308438ae65abad6bab7867fe38f"}, - {file = "lxml-4.9.2-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:b264171e3143d842ded311b7dccd46ff9ef34247129ff5bf5066123c55c2431c"}, - {file = "lxml-4.9.2-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:0dc313ef231edf866912e9d8f5a042ddab56c752619e92dfd3a2c277e6a7299a"}, - {file = "lxml-4.9.2-pp38-pypy38_pp73-macosx_10_15_x86_64.whl", hash = "sha256:16efd54337136e8cd72fb9485c368d91d77a47ee2d42b057564aae201257d419"}, - {file = "lxml-4.9.2-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:0f2b1e0d79180f344ff9f321327b005ca043a50ece8713de61d1cb383fb8ac05"}, - {file = "lxml-4.9.2-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:7b770ed79542ed52c519119473898198761d78beb24b107acf3ad65deae61f1f"}, - {file = "lxml-4.9.2-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:efa29c2fe6b4fdd32e8ef81c1528506895eca86e1d8c4657fda04c9b3786ddf9"}, - {file = "lxml-4.9.2-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:7e91ee82f4199af8c43d8158024cbdff3d931df350252288f0d4ce656df7f3b5"}, - {file = "lxml-4.9.2-pp39-pypy39_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:b23e19989c355ca854276178a0463951a653309fb8e57ce674497f2d9f208746"}, - {file = "lxml-4.9.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:01d36c05f4afb8f7c20fd9ed5badca32a2029b93b1750f571ccc0b142531caf7"}, - {file = "lxml-4.9.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:7b515674acfdcadb0eb5d00d8a709868173acece5cb0be3dd165950cbfdf5409"}, - {file = "lxml-4.9.2.tar.gz", hash = "sha256:2455cfaeb7ac70338b3257f41e21f0724f4b5b0c0e7702da67ee6c3640835b67"}, + {file = "lxml-4.9.4-cp27-cp27m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e214025e23db238805a600f1f37bf9f9a15413c7bf5f9d6ae194f84980c78722"}, + {file = "lxml-4.9.4-cp27-cp27m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:ec53a09aee61d45e7dbe7e91252ff0491b6b5fee3d85b2d45b173d8ab453efc1"}, + {file = "lxml-4.9.4-cp27-cp27m-win32.whl", hash = "sha256:7d1d6c9e74c70ddf524e3c09d9dc0522aba9370708c2cb58680ea40174800013"}, + {file = "lxml-4.9.4-cp27-cp27m-win_amd64.whl", hash = "sha256:cb53669442895763e61df5c995f0e8361b61662f26c1b04ee82899c2789c8f69"}, + {file = "lxml-4.9.4-cp27-cp27mu-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:647bfe88b1997d7ae8d45dabc7c868d8cb0c8412a6e730a7651050b8c7289cf2"}, + {file = "lxml-4.9.4-cp27-cp27mu-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:4d973729ce04784906a19108054e1fd476bc85279a403ea1a72fdb051c76fa48"}, + {file = "lxml-4.9.4-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:056a17eaaf3da87a05523472ae84246f87ac2f29a53306466c22e60282e54ff8"}, + {file = "lxml-4.9.4-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:aaa5c173a26960fe67daa69aa93d6d6a1cd714a6eb13802d4e4bd1d24a530644"}, + {file = "lxml-4.9.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:647459b23594f370c1c01768edaa0ba0959afc39caeeb793b43158bb9bb6a663"}, + {file = "lxml-4.9.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:bdd9abccd0927673cffe601d2c6cdad1c9321bf3437a2f507d6b037ef91ea307"}, + {file = "lxml-4.9.4-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:00e91573183ad273e242db5585b52670eddf92bacad095ce25c1e682da14ed91"}, + {file = "lxml-4.9.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:a602ed9bd2c7d85bd58592c28e101bd9ff9c718fbde06545a70945ffd5d11868"}, + {file = "lxml-4.9.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:de362ac8bc962408ad8fae28f3967ce1a262b5d63ab8cefb42662566737f1dc7"}, + {file = "lxml-4.9.4-cp310-cp310-win32.whl", hash = "sha256:33714fcf5af4ff7e70a49731a7cc8fd9ce910b9ac194f66eaa18c3cc0a4c02be"}, + {file = "lxml-4.9.4-cp310-cp310-win_amd64.whl", hash = "sha256:d3caa09e613ece43ac292fbed513a4bce170681a447d25ffcbc1b647d45a39c5"}, + {file = "lxml-4.9.4-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:359a8b09d712df27849e0bcb62c6a3404e780b274b0b7e4c39a88826d1926c28"}, + {file = "lxml-4.9.4-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:43498ea734ccdfb92e1886dfedaebeb81178a241d39a79d5351ba2b671bff2b2"}, + {file = "lxml-4.9.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:4855161013dfb2b762e02b3f4d4a21cc7c6aec13c69e3bffbf5022b3e708dd97"}, + {file = "lxml-4.9.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:c71b5b860c5215fdbaa56f715bc218e45a98477f816b46cfde4a84d25b13274e"}, + {file = "lxml-4.9.4-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:9a2b5915c333e4364367140443b59f09feae42184459b913f0f41b9fed55794a"}, + {file = "lxml-4.9.4-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:d82411dbf4d3127b6cde7da0f9373e37ad3a43e89ef374965465928f01c2b979"}, + {file = "lxml-4.9.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:273473d34462ae6e97c0f4e517bd1bf9588aa67a1d47d93f760a1282640e24ac"}, + {file = "lxml-4.9.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:389d2b2e543b27962990ab529ac6720c3dded588cc6d0f6557eec153305a3622"}, + {file = "lxml-4.9.4-cp311-cp311-win32.whl", hash = "sha256:8aecb5a7f6f7f8fe9cac0bcadd39efaca8bbf8d1bf242e9f175cbe4c925116c3"}, + {file = "lxml-4.9.4-cp311-cp311-win_amd64.whl", hash = "sha256:c7721a3ef41591341388bb2265395ce522aba52f969d33dacd822da8f018aff8"}, + {file = "lxml-4.9.4-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:dbcb2dc07308453db428a95a4d03259bd8caea97d7f0776842299f2d00c72fc8"}, + {file = "lxml-4.9.4-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:01bf1df1db327e748dcb152d17389cf6d0a8c5d533ef9bab781e9d5037619229"}, + {file = "lxml-4.9.4-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:e8f9f93a23634cfafbad6e46ad7d09e0f4a25a2400e4a64b1b7b7c0fbaa06d9d"}, + {file = "lxml-4.9.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:3f3f00a9061605725df1816f5713d10cd94636347ed651abdbc75828df302b20"}, + {file = "lxml-4.9.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:953dd5481bd6252bd480d6ec431f61d7d87fdcbbb71b0d2bdcfc6ae00bb6fb10"}, + {file = "lxml-4.9.4-cp312-cp312-win32.whl", hash = "sha256:266f655d1baff9c47b52f529b5f6bec33f66042f65f7c56adde3fcf2ed62ae8b"}, + {file = "lxml-4.9.4-cp312-cp312-win_amd64.whl", hash = "sha256:f1faee2a831fe249e1bae9cbc68d3cd8a30f7e37851deee4d7962b17c410dd56"}, + {file = "lxml-4.9.4-cp35-cp35m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:23d891e5bdc12e2e506e7d225d6aa929e0a0368c9916c1fddefab88166e98b20"}, + {file = "lxml-4.9.4-cp35-cp35m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:e96a1788f24d03e8d61679f9881a883ecdf9c445a38f9ae3f3f193ab6c591c66"}, + {file = "lxml-4.9.4-cp36-cp36m-macosx_11_0_x86_64.whl", hash = "sha256:5557461f83bb7cc718bc9ee1f7156d50e31747e5b38d79cf40f79ab1447afd2d"}, + {file = "lxml-4.9.4-cp36-cp36m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:fdb325b7fba1e2c40b9b1db407f85642e32404131c08480dd652110fc908561b"}, + {file = "lxml-4.9.4-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3d74d4a3c4b8f7a1f676cedf8e84bcc57705a6d7925e6daef7a1e54ae543a197"}, + {file = "lxml-4.9.4-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:ac7674d1638df129d9cb4503d20ffc3922bd463c865ef3cb412f2c926108e9a4"}, + {file = "lxml-4.9.4-cp36-cp36m-manylinux_2_28_x86_64.whl", hash = "sha256:ddd92e18b783aeb86ad2132d84a4b795fc5ec612e3545c1b687e7747e66e2b53"}, + {file = "lxml-4.9.4-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2bd9ac6e44f2db368ef8986f3989a4cad3de4cd55dbdda536e253000c801bcc7"}, + {file = "lxml-4.9.4-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:bc354b1393dce46026ab13075f77b30e40b61b1a53e852e99d3cc5dd1af4bc85"}, + {file = "lxml-4.9.4-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:f836f39678cb47c9541f04d8ed4545719dc31ad850bf1832d6b4171e30d65d23"}, + {file = "lxml-4.9.4-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:9c131447768ed7bc05a02553d939e7f0e807e533441901dd504e217b76307745"}, + {file = "lxml-4.9.4-cp36-cp36m-win32.whl", hash = "sha256:bafa65e3acae612a7799ada439bd202403414ebe23f52e5b17f6ffc2eb98c2be"}, + {file = "lxml-4.9.4-cp36-cp36m-win_amd64.whl", hash = "sha256:6197c3f3c0b960ad033b9b7d611db11285bb461fc6b802c1dd50d04ad715c225"}, + {file = "lxml-4.9.4-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:7b378847a09d6bd46047f5f3599cdc64fcb4cc5a5a2dd0a2af610361fbe77b16"}, + {file = "lxml-4.9.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:1343df4e2e6e51182aad12162b23b0a4b3fd77f17527a78c53f0f23573663545"}, + {file = "lxml-4.9.4-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:6dbdacf5752fbd78ccdb434698230c4f0f95df7dd956d5f205b5ed6911a1367c"}, + {file = "lxml-4.9.4-cp37-cp37m-manylinux_2_28_x86_64.whl", hash = "sha256:506becdf2ecaebaf7f7995f776394fcc8bd8a78022772de66677c84fb02dd33d"}, + {file = "lxml-4.9.4-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ca8e44b5ba3edb682ea4e6185b49661fc22b230cf811b9c13963c9f982d1d964"}, + {file = "lxml-4.9.4-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:9d9d5726474cbbef279fd709008f91a49c4f758bec9c062dfbba88eab00e3ff9"}, + {file = "lxml-4.9.4-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:bbdd69e20fe2943b51e2841fc1e6a3c1de460d630f65bde12452d8c97209464d"}, + {file = "lxml-4.9.4-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:8671622256a0859f5089cbe0ce4693c2af407bc053dcc99aadff7f5310b4aa02"}, + {file = "lxml-4.9.4-cp37-cp37m-win32.whl", hash = "sha256:dd4fda67f5faaef4f9ee5383435048ee3e11ad996901225ad7615bc92245bc8e"}, + {file = "lxml-4.9.4-cp37-cp37m-win_amd64.whl", hash = "sha256:6bee9c2e501d835f91460b2c904bc359f8433e96799f5c2ff20feebd9bb1e590"}, + {file = "lxml-4.9.4-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:1f10f250430a4caf84115b1e0f23f3615566ca2369d1962f82bef40dd99cd81a"}, + {file = "lxml-4.9.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:3b505f2bbff50d261176e67be24e8909e54b5d9d08b12d4946344066d66b3e43"}, + {file = "lxml-4.9.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:1449f9451cd53e0fd0a7ec2ff5ede4686add13ac7a7bfa6988ff6d75cff3ebe2"}, + {file = "lxml-4.9.4-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:4ece9cca4cd1c8ba889bfa67eae7f21d0d1a2e715b4d5045395113361e8c533d"}, + {file = "lxml-4.9.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:59bb5979f9941c61e907ee571732219fa4774d5a18f3fa5ff2df963f5dfaa6bc"}, + {file = "lxml-4.9.4-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:b1980dbcaad634fe78e710c8587383e6e3f61dbe146bcbfd13a9c8ab2d7b1192"}, + {file = "lxml-4.9.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:9ae6c3363261021144121427b1552b29e7b59de9d6a75bf51e03bc072efb3c37"}, + {file = "lxml-4.9.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:bcee502c649fa6351b44bb014b98c09cb00982a475a1912a9881ca28ab4f9cd9"}, + {file = "lxml-4.9.4-cp38-cp38-win32.whl", hash = "sha256:a8edae5253efa75c2fc79a90068fe540b197d1c7ab5803b800fccfe240eed33c"}, + {file = "lxml-4.9.4-cp38-cp38-win_amd64.whl", hash = "sha256:701847a7aaefef121c5c0d855b2affa5f9bd45196ef00266724a80e439220e46"}, + {file = "lxml-4.9.4-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:f610d980e3fccf4394ab3806de6065682982f3d27c12d4ce3ee46a8183d64a6a"}, + {file = "lxml-4.9.4-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:aa9b5abd07f71b081a33115d9758ef6077924082055005808f68feccb27616bd"}, + {file = "lxml-4.9.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:365005e8b0718ea6d64b374423e870648ab47c3a905356ab6e5a5ff03962b9a9"}, + {file = "lxml-4.9.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:16b9ec51cc2feab009e800f2c6327338d6ee4e752c76e95a35c4465e80390ccd"}, + {file = "lxml-4.9.4-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:a905affe76f1802edcac554e3ccf68188bea16546071d7583fb1b693f9cf756b"}, + {file = "lxml-4.9.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:fd814847901df6e8de13ce69b84c31fc9b3fb591224d6762d0b256d510cbf382"}, + {file = "lxml-4.9.4-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:91bbf398ac8bb7d65a5a52127407c05f75a18d7015a270fdd94bbcb04e65d573"}, + {file = "lxml-4.9.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:f99768232f036b4776ce419d3244a04fe83784bce871b16d2c2e984c7fcea847"}, + {file = "lxml-4.9.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:bb5bd6212eb0edfd1e8f254585290ea1dadc3687dd8fd5e2fd9a87c31915cdab"}, + {file = "lxml-4.9.4-cp39-cp39-win32.whl", hash = "sha256:88f7c383071981c74ec1998ba9b437659e4fd02a3c4a4d3efc16774eb108d0ec"}, + {file = "lxml-4.9.4-cp39-cp39-win_amd64.whl", hash = "sha256:936e8880cc00f839aa4173f94466a8406a96ddce814651075f95837316369899"}, + {file = "lxml-4.9.4-pp310-pypy310_pp73-macosx_11_0_x86_64.whl", hash = "sha256:f6c35b2f87c004270fa2e703b872fcc984d714d430b305145c39d53074e1ffe0"}, + {file = "lxml-4.9.4-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:606d445feeb0856c2b424405236a01c71af7c97e5fe42fbc778634faef2b47e4"}, + {file = "lxml-4.9.4-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:a1bdcbebd4e13446a14de4dd1825f1e778e099f17f79718b4aeaf2403624b0f7"}, + {file = "lxml-4.9.4-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:0a08c89b23117049ba171bf51d2f9c5f3abf507d65d016d6e0fa2f37e18c0fc5"}, + {file = "lxml-4.9.4-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:232fd30903d3123be4c435fb5159938c6225ee8607b635a4d3fca847003134ba"}, + {file = "lxml-4.9.4-pp37-pypy37_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:231142459d32779b209aa4b4d460b175cadd604fed856f25c1571a9d78114771"}, + {file = "lxml-4.9.4-pp38-pypy38_pp73-macosx_11_0_x86_64.whl", hash = "sha256:520486f27f1d4ce9654154b4494cf9307b495527f3a2908ad4cb48e4f7ed7ef7"}, + {file = "lxml-4.9.4-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:562778586949be7e0d7435fcb24aca4810913771f845d99145a6cee64d5b67ca"}, + {file = "lxml-4.9.4-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:a9e7c6d89c77bb2770c9491d988f26a4b161d05c8ca58f63fb1f1b6b9a74be45"}, + {file = "lxml-4.9.4-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:786d6b57026e7e04d184313c1359ac3d68002c33e4b1042ca58c362f1d09ff58"}, + {file = "lxml-4.9.4-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:95ae6c5a196e2f239150aa4a479967351df7f44800c93e5a975ec726fef005e2"}, + {file = "lxml-4.9.4-pp39-pypy39_pp73-macosx_11_0_x86_64.whl", hash = "sha256:9b556596c49fa1232b0fff4b0e69b9d4083a502e60e404b44341e2f8fb7187f5"}, + {file = "lxml-4.9.4-pp39-pypy39_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:cc02c06e9e320869d7d1bd323df6dd4281e78ac2e7f8526835d3d48c69060683"}, + {file = "lxml-4.9.4-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:857d6565f9aa3464764c2cb6a2e3c2e75e1970e877c188f4aeae45954a314e0c"}, + {file = "lxml-4.9.4-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:c42ae7e010d7d6bc51875d768110c10e8a59494855c3d4c348b068f5fb81fdcd"}, + {file = "lxml-4.9.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:f10250bb190fb0742e3e1958dd5c100524c2cc5096c67c8da51233f7448dc137"}, + {file = "lxml-4.9.4.tar.gz", hash = "sha256:b1541e50b78e15fa06a2670157a1962ef06591d4c998b998047fff5e3236880e"}, ] [package.extras] cssselect = ["cssselect (>=0.7)"] html5 = ["html5lib"] htmlsoup = ["BeautifulSoup4"] -source = ["Cython (>=0.29.7)"] +source = ["Cython (==0.29.37)"] [[package]] name = "pyyaml" -version = "6.0" +version = "6.0.1" description = "YAML parser and emitter for Python" -category = "main" optional = false python-versions = ">=3.6" files = [ - {file = "PyYAML-6.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d4db7c7aef085872ef65a8fd7d6d09a14ae91f691dec3e87ee5ee0539d516f53"}, - {file = "PyYAML-6.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9df7ed3b3d2e0ecfe09e14741b857df43adb5a3ddadc919a2d94fbdf78fea53c"}, - {file = "PyYAML-6.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77f396e6ef4c73fdc33a9157446466f1cff553d979bd00ecb64385760c6babdc"}, - {file = "PyYAML-6.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a80a78046a72361de73f8f395f1f1e49f956c6be882eed58505a15f3e430962b"}, - {file = "PyYAML-6.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f84fbc98b019fef2ee9a1cb3ce93e3187a6df0b2538a651bfb890254ba9f90b5"}, - {file = "PyYAML-6.0-cp310-cp310-win32.whl", hash = "sha256:2cd5df3de48857ed0544b34e2d40e9fac445930039f3cfe4bcc592a1f836d513"}, - {file = "PyYAML-6.0-cp310-cp310-win_amd64.whl", hash = "sha256:daf496c58a8c52083df09b80c860005194014c3698698d1a57cbcfa182142a3a"}, - {file = "PyYAML-6.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d4b0ba9512519522b118090257be113b9468d804b19d63c71dbcf4a48fa32358"}, - {file = "PyYAML-6.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:81957921f441d50af23654aa6c5e5eaf9b06aba7f0a19c18a538dc7ef291c5a1"}, - {file = "PyYAML-6.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:afa17f5bc4d1b10afd4466fd3a44dc0e245382deca5b3c353d8b757f9e3ecb8d"}, - {file = "PyYAML-6.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dbad0e9d368bb989f4515da330b88a057617d16b6a8245084f1b05400f24609f"}, - {file = "PyYAML-6.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:432557aa2c09802be39460360ddffd48156e30721f5e8d917f01d31694216782"}, - {file = "PyYAML-6.0-cp311-cp311-win32.whl", hash = "sha256:bfaef573a63ba8923503d27530362590ff4f576c626d86a9fed95822a8255fd7"}, - {file = "PyYAML-6.0-cp311-cp311-win_amd64.whl", hash = "sha256:01b45c0191e6d66c470b6cf1b9531a771a83c1c4208272ead47a3ae4f2f603bf"}, - {file = "PyYAML-6.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:897b80890765f037df3403d22bab41627ca8811ae55e9a722fd0392850ec4d86"}, - {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50602afada6d6cbfad699b0c7bb50d5ccffa7e46a3d738092afddc1f9758427f"}, - {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:48c346915c114f5fdb3ead70312bd042a953a8ce5c7106d5bfb1a5254e47da92"}, - {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:98c4d36e99714e55cfbaaee6dd5badbc9a1ec339ebfc3b1f52e293aee6bb71a4"}, - {file = "PyYAML-6.0-cp36-cp36m-win32.whl", hash = "sha256:0283c35a6a9fbf047493e3a0ce8d79ef5030852c51e9d911a27badfde0605293"}, - {file = "PyYAML-6.0-cp36-cp36m-win_amd64.whl", hash = "sha256:07751360502caac1c067a8132d150cf3d61339af5691fe9e87803040dbc5db57"}, - {file = "PyYAML-6.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:819b3830a1543db06c4d4b865e70ded25be52a2e0631ccd2f6a47a2822f2fd7c"}, - {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:473f9edb243cb1935ab5a084eb238d842fb8f404ed2193a915d1784b5a6b5fc0"}, - {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0ce82d761c532fe4ec3f87fc45688bdd3a4c1dc5e0b4a19814b9009a29baefd4"}, - {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:231710d57adfd809ef5d34183b8ed1eeae3f76459c18fb4a0b373ad56bedcdd9"}, - {file = "PyYAML-6.0-cp37-cp37m-win32.whl", hash = "sha256:c5687b8d43cf58545ade1fe3e055f70eac7a5a1a0bf42824308d868289a95737"}, - {file = "PyYAML-6.0-cp37-cp37m-win_amd64.whl", hash = "sha256:d15a181d1ecd0d4270dc32edb46f7cb7733c7c508857278d3d378d14d606db2d"}, - {file = "PyYAML-6.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0b4624f379dab24d3725ffde76559cff63d9ec94e1736b556dacdfebe5ab6d4b"}, - {file = "PyYAML-6.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:213c60cd50106436cc818accf5baa1aba61c0189ff610f64f4a3e8c6726218ba"}, - {file = "PyYAML-6.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9fa600030013c4de8165339db93d182b9431076eb98eb40ee068700c9c813e34"}, - {file = "PyYAML-6.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:277a0ef2981ca40581a47093e9e2d13b3f1fbbeffae064c1d21bfceba2030287"}, - {file = "PyYAML-6.0-cp38-cp38-win32.whl", hash = "sha256:d4eccecf9adf6fbcc6861a38015c2a64f38b9d94838ac1810a9023a0609e1b78"}, - {file = "PyYAML-6.0-cp38-cp38-win_amd64.whl", hash = "sha256:1e4747bc279b4f613a09eb64bba2ba602d8a6664c6ce6396a4d0cd413a50ce07"}, - {file = "PyYAML-6.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:055d937d65826939cb044fc8c9b08889e8c743fdc6a32b33e2390f66013e449b"}, - {file = "PyYAML-6.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e61ceaab6f49fb8bdfaa0f92c4b57bcfbea54c09277b1b4f7ac376bfb7a7c174"}, - {file = "PyYAML-6.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d67d839ede4ed1b28a4e8909735fc992a923cdb84e618544973d7dfc71540803"}, - {file = "PyYAML-6.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cba8c411ef271aa037d7357a2bc8f9ee8b58b9965831d9e51baf703280dc73d3"}, - {file = "PyYAML-6.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:40527857252b61eacd1d9af500c3337ba8deb8fc298940291486c465c8b46ec0"}, - {file = "PyYAML-6.0-cp39-cp39-win32.whl", hash = "sha256:b5b9eccad747aabaaffbc6064800670f0c297e52c12754eb1d976c57e4f74dcb"}, - {file = "PyYAML-6.0-cp39-cp39-win_amd64.whl", hash = "sha256:b3d267842bf12586ba6c734f89d1f5b871df0273157918b0ccefa29deb05c21c"}, - {file = "PyYAML-6.0.tar.gz", hash = "sha256:68fb519c14306fec9720a2a5b45bc9f0c8d1b9c72adf45c37baedfcd949c35a2"}, + {file = "PyYAML-6.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d858aa552c999bc8a8d57426ed01e40bef403cd8ccdd0fc5f6f04a00414cac2a"}, + {file = "PyYAML-6.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:fd66fc5d0da6d9815ba2cebeb4205f95818ff4b79c3ebe268e75d961704af52f"}, + {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69b023b2b4daa7548bcfbd4aa3da05b3a74b772db9e23b982788168117739938"}, + {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:81e0b275a9ecc9c0c0c07b4b90ba548307583c125f54d5b6946cfee6360c733d"}, + {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba336e390cd8e4d1739f42dfe9bb83a3cc2e80f567d8805e11b46f4a943f5515"}, + {file = "PyYAML-6.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:326c013efe8048858a6d312ddd31d56e468118ad4cdeda36c719bf5bb6192290"}, + {file = "PyYAML-6.0.1-cp310-cp310-win32.whl", hash = "sha256:bd4af7373a854424dabd882decdc5579653d7868b8fb26dc7d0e99f823aa5924"}, + {file = "PyYAML-6.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:fd1592b3fdf65fff2ad0004b5e363300ef59ced41c2e6b3a99d4089fa8c5435d"}, + {file = "PyYAML-6.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6965a7bc3cf88e5a1c3bd2e0b5c22f8d677dc88a455344035f03399034eb3007"}, + {file = "PyYAML-6.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f003ed9ad21d6a4713f0a9b5a7a0a79e08dd0f221aff4525a2be4c346ee60aab"}, + {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42f8152b8dbc4fe7d96729ec2b99c7097d656dc1213a3229ca5383f973a5ed6d"}, + {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:062582fca9fabdd2c8b54a3ef1c978d786e0f6b3a1510e0ac93ef59e0ddae2bc"}, + {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2b04aac4d386b172d5b9692e2d2da8de7bfb6c387fa4f801fbf6fb2e6ba4673"}, + {file = "PyYAML-6.0.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e7d73685e87afe9f3b36c799222440d6cf362062f78be1013661b00c5c6f678b"}, + {file = "PyYAML-6.0.1-cp311-cp311-win32.whl", hash = "sha256:1635fd110e8d85d55237ab316b5b011de701ea0f29d07611174a1b42f1444741"}, + {file = "PyYAML-6.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34"}, + {file = "PyYAML-6.0.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:855fb52b0dc35af121542a76b9a84f8d1cd886ea97c84703eaa6d88e37a2ad28"}, + {file = "PyYAML-6.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40df9b996c2b73138957fe23a16a4f0ba614f4c0efce1e9406a184b6d07fa3a9"}, + {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c22bec3fbe2524cde73d7ada88f6566758a8f7227bfbf93a408a9d86bcc12a0"}, + {file = "PyYAML-6.0.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8d4e9c88387b0f5c7d5f281e55304de64cf7f9c0021a3525bd3b1c542da3b0e4"}, + {file = "PyYAML-6.0.1-cp312-cp312-win32.whl", hash = "sha256:d483d2cdf104e7c9fa60c544d92981f12ad66a457afae824d146093b8c294c54"}, + {file = "PyYAML-6.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:0d3304d8c0adc42be59c5f8a4d9e3d7379e6955ad754aa9d6ab7a398b59dd1df"}, + {file = "PyYAML-6.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:50550eb667afee136e9a77d6dc71ae76a44df8b3e51e41b77f6de2932bfe0f47"}, + {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1fe35611261b29bd1de0070f0b2f47cb6ff71fa6595c077e42bd0c419fa27b98"}, + {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:704219a11b772aea0d8ecd7058d0082713c3562b4e271b849ad7dc4a5c90c13c"}, + {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:afd7e57eddb1a54f0f1a974bc4391af8bcce0b444685d936840f125cf046d5bd"}, + {file = "PyYAML-6.0.1-cp36-cp36m-win32.whl", hash = "sha256:fca0e3a251908a499833aa292323f32437106001d436eca0e6e7833256674585"}, + {file = "PyYAML-6.0.1-cp36-cp36m-win_amd64.whl", hash = "sha256:f22ac1c3cac4dbc50079e965eba2c1058622631e526bd9afd45fedd49ba781fa"}, + {file = "PyYAML-6.0.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b1275ad35a5d18c62a7220633c913e1b42d44b46ee12554e5fd39c70a243d6a3"}, + {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:18aeb1bf9a78867dc38b259769503436b7c72f7a1f1f4c93ff9a17de54319b27"}, + {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:596106435fa6ad000c2991a98fa58eeb8656ef2325d7e158344fb33864ed87e3"}, + {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:baa90d3f661d43131ca170712d903e6295d1f7a0f595074f151c0aed377c9b9c"}, + {file = "PyYAML-6.0.1-cp37-cp37m-win32.whl", hash = "sha256:9046c58c4395dff28dd494285c82ba00b546adfc7ef001486fbf0324bc174fba"}, + {file = "PyYAML-6.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:4fb147e7a67ef577a588a0e2c17b6db51dda102c71de36f8549b6816a96e1867"}, + {file = "PyYAML-6.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1d4c7e777c441b20e32f52bd377e0c409713e8bb1386e1099c2415f26e479595"}, + {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a0cd17c15d3bb3fa06978b4e8958dcdc6e0174ccea823003a106c7d4d7899ac5"}, + {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:28c119d996beec18c05208a8bd78cbe4007878c6dd15091efb73a30e90539696"}, + {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7e07cbde391ba96ab58e532ff4803f79c4129397514e1413a7dc761ccd755735"}, + {file = "PyYAML-6.0.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:49a183be227561de579b4a36efbb21b3eab9651dd81b1858589f796549873dd6"}, + {file = "PyYAML-6.0.1-cp38-cp38-win32.whl", hash = "sha256:184c5108a2aca3c5b3d3bf9395d50893a7ab82a38004c8f61c258d4428e80206"}, + {file = "PyYAML-6.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:1e2722cc9fbb45d9b87631ac70924c11d3a401b2d7f410cc0e3bbf249f2dca62"}, + {file = "PyYAML-6.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9eb6caa9a297fc2c2fb8862bc5370d0303ddba53ba97e71f08023b6cd73d16a8"}, + {file = "PyYAML-6.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c8098ddcc2a85b61647b2590f825f3db38891662cfc2fc776415143f599bb859"}, + {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5773183b6446b2c99bb77e77595dd486303b4faab2b086e7b17bc6bef28865f6"}, + {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b786eecbdf8499b9ca1d697215862083bd6d2a99965554781d0d8d1ad31e13a0"}, + {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc1bf2925a1ecd43da378f4db9e4f799775d6367bdb94671027b73b393a7c42c"}, + {file = "PyYAML-6.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:04ac92ad1925b2cff1db0cfebffb6ffc43457495c9b3c39d3fcae417d7125dc5"}, + {file = "PyYAML-6.0.1-cp39-cp39-win32.whl", hash = "sha256:faca3bdcf85b2fc05d06ff3fbc1f83e1391b3e724afa3feba7d13eeab355484c"}, + {file = "PyYAML-6.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:510c9deebc5c0225e8c96813043e62b680ba2f9c50a08d3724c7f28a747d1486"}, + {file = "PyYAML-6.0.1.tar.gz", hash = "sha256:bfdf460b1736c775f2ba9f6a92bca30bc2095067b8a9d77876d1fad6cc3b4a43"}, ] [metadata] diff --git a/src/adjustneumexfunctor.cpp b/src/adjustneumexfunctor.cpp new file mode 100644 index 00000000000..cce5eeb439a --- /dev/null +++ b/src/adjustneumexfunctor.cpp @@ -0,0 +1,102 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: adjustneumexfunctor.cpp +// Author: Laurent Pugin +// Created: 2024 +// Copyright (c) Authors and others. All rights reserved. +///////////////////////////////////////////////////////////////////////////// + +#include "adjustneumexfunctor.h" + +//---------------------------------------------------------------------------- + +#include "doc.h" +#include "layer.h" +#include "neume.h" +#include "score.h" +#include "staff.h" +#include "syl.h" +#include "syllable.h" + +//---------------------------------------------------------------------------- + +namespace vrv { + +//---------------------------------------------------------------------------- +// AdjustNeumeXFunctor +//---------------------------------------------------------------------------- + +AdjustNeumeXFunctor::AdjustNeumeXFunctor(Doc *doc) : DocFunctor(doc) {} + +FunctorCode AdjustNeumeXFunctor::VisitLayer(Layer *layer) +{ + m_minPos = VRV_UNSET; + + return FUNCTOR_CONTINUE; +} + +FunctorCode AdjustNeumeXFunctor::VisitLayerEnd(Layer *layer) +{ + // Alignment *alignment = m_rightBarline->GetAlignment(); + Measure *measure = vrv_cast(layer->GetFirstAncestor(MEASURE)); + assert(measure); + Alignment *alignment = measure->m_measureAligner.GetRightAlignment(); + assert(alignment); + + int selfLeft = alignment->GetXRel(); + if (selfLeft < m_minPos) { + const int adjust = m_minPos - selfLeft; + alignment->SetXRel(alignment->GetXRel() + adjust); + } + + m_minPos = VRV_UNSET; + + return FUNCTOR_CONTINUE; +} + +FunctorCode AdjustNeumeXFunctor::VisitNeume(Neume *neume) +{ + // It is 0 when we process the first neume of the syllable + if (m_neumeMinPos != VRV_UNSET) { + Alignment *alignment = neume->GetAlignment(); + + int selfLeft = neume->GetContentLeft(); + if (selfLeft < m_neumeMinPos) { + const int adjust = m_neumeMinPos - selfLeft; + alignment->SetXRel(alignment->GetXRel() + adjust); + } + } + + m_neumeMinPos = neume->GetContentRight() + m_doc->GetDrawingUnit(100); + + // Check if the neume takes more space the the syllable text + if (m_neumeMinPos > m_minPos) m_minPos = m_neumeMinPos; + + return FUNCTOR_CONTINUE; +} + +FunctorCode AdjustNeumeXFunctor::VisitStaff(Staff *staff) +{ + if (!staff->IsNeume()) return FUNCTOR_SIBLINGS; + + return FUNCTOR_CONTINUE; +} + +FunctorCode AdjustNeumeXFunctor::VisitSyl(Syl *syl) +{ + Alignment *alignment = syl->GetAlignment(); + + // Indicates that the neume will be the first of the syllable + m_neumeMinPos = VRV_UNSET; + + int selfLeft = syl->GetContentLeft(); + if (selfLeft < m_minPos) { + const int adjust = m_minPos - selfLeft; + alignment->SetXRel(alignment->GetXRel() + adjust); + } + + m_minPos = syl->GetContentRight() + m_doc->GetDrawingUnit(100); + + return FUNCTOR_CONTINUE; +} + +} // namespace vrv diff --git a/src/adjustxposfunctor.cpp b/src/adjustxposfunctor.cpp index 5436c605497..c901a84a27c 100644 --- a/src/adjustxposfunctor.cpp +++ b/src/adjustxposfunctor.cpp @@ -33,6 +33,7 @@ AdjustXPosFunctor::AdjustXPosFunctor(Doc *doc, const std::vector &staffNs) m_staffNs = staffNs; m_staffSize = 100; m_rightBarLinesOnly = false; + m_measure = NULL; } FunctorCode AdjustXPosFunctor::VisitAlignment(Alignment *alignment) @@ -125,7 +126,7 @@ FunctorCode AdjustXPosFunctor::VisitLayerElement(LayerElement *layerElement) return FUNCTOR_SIBLINGS; } - if (layerElement->GetAlignment()->GetType() == ALIGNMENT_CLEF) { + if ((layerElement->GetAlignment()->GetType() == ALIGNMENT_CLEF) && !m_isNeumeStaff) { return FUNCTOR_CONTINUE; } @@ -145,8 +146,9 @@ FunctorCode AdjustXPosFunctor::VisitLayerElement(LayerElement *layerElement) int selfRight = layerElement->GetAlignment()->GetXRel(); if (!layerElement->HasSelfBB() || layerElement->HasEmptyBB()) { selfRight = layerElement->GetAlignment()->GetXRel(); - // Still add the right margin for the barlines - if (layerElement->Is(BARLINE)) selfRight += m_doc->GetRightMargin(layerElement) * drawingUnit; + // Still add the right margin for the barlines but not with non measure music + if (layerElement->Is(BARLINE) && m_measure->IsMeasuredMusic()) + selfRight += m_doc->GetRightMargin(layerElement) * drawingUnit; } else { selfRight = layerElement->GetSelfRight() + m_doc->GetRightMargin(layerElement) * drawingUnit; @@ -210,6 +212,8 @@ FunctorCode AdjustXPosFunctor::VisitMeasure(Measure *measure) m_upcomingMinPos = VRV_UNSET; m_cumulatedXShift = 0; + m_measure = measure; + System *system = vrv_cast(measure->GetFirstAncestor(SYSTEM)); assert(system); @@ -228,6 +232,7 @@ FunctorCode AdjustXPosFunctor::VisitMeasure(Measure *measure) m_currentAlignment.Reset(); StaffAlignment *staffAlignment = system->m_systemAligner.GetStaffAlignmentForStaffN(staffN); m_staffSize = (staffAlignment) ? staffAlignment->GetStaffSize() : 100; + m_isNeumeStaff = (staffAlignment && staffAlignment->GetStaff()) ? staffAlignment->GetStaff()->IsNeume() : false; // Prevent collisions of scoredef clefs with thick barlines if (hasSystemStartLine) { @@ -250,6 +255,9 @@ FunctorCode AdjustXPosFunctor::VisitMeasure(Measure *measure) this->SetFilters(previousFilters); + // There is no reason to adjust a minimum width with mensural music + if (!measure->IsMeasuredMusic()) return FUNCTOR_SIBLINGS; + int minMeasureWidth = m_doc->GetOptions()->m_unit.GetValue() * m_doc->GetOptions()->m_measureMinWidth.GetValue(); // First try to see if we have a double measure length element MeasureAlignerTypeComparison alignmentComparison(ALIGNMENT_FULLMEASURE2); diff --git a/src/adjustyrelfortranscriptionfunctor.cpp b/src/adjustyrelfortranscriptionfunctor.cpp new file mode 100644 index 00000000000..8bcc92402d1 --- /dev/null +++ b/src/adjustyrelfortranscriptionfunctor.cpp @@ -0,0 +1,35 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: adjustyrelfortranscriptionfunctor.cpp +// Author: Yinan Zhou +// Created: 2024 +// Copyright (c) Authors and others. All rights reserved. +///////////////////////////////////////////////////////////////////////////// + +#include "adjustyrelfortranscriptionfunctor.h" + +//---------------------------------------------------------------------------- + +//---------------------------------------------------------------------------- + +namespace vrv { + +//---------------------------------------------------------------------------- +// AdjustYRelForTranscriptionFunctor +//---------------------------------------------------------------------------- + +AdjustYRelForTranscriptionFunctor::AdjustYRelForTranscriptionFunctor() : Functor() {} + +FunctorCode AdjustYRelForTranscriptionFunctor::VisitLayerElement(LayerElement *layerElement) +{ + if (layerElement->m_drawingFacsY == VRV_UNSET) return FUNCTOR_CONTINUE; + + if (layerElement->IsScoreDefElement()) return FUNCTOR_SIBLINGS; + + if (!layerElement->HasSelfBB()) return FUNCTOR_CONTINUE; + + layerElement->SetDrawingYRel(-layerElement->GetSelfY1()); + + return FUNCTOR_CONTINUE; +} + +} // namespace vrv diff --git a/src/alignfunctor.cpp b/src/alignfunctor.cpp index 8a1e1b35e51..517f3ccf135 100644 --- a/src/alignfunctor.cpp +++ b/src/alignfunctor.cpp @@ -15,6 +15,8 @@ #include "fig.h" #include "layer.h" #include "ligature.h" +#include "nc.h" +#include "neume.h" #include "page.h" #include "rend.h" #include "rest.h" @@ -22,6 +24,7 @@ #include "section.h" #include "staff.h" #include "svg.h" +#include "syllable.h" #include "system.h" #include "tabgrp.h" #include "verse.h" @@ -140,6 +143,7 @@ FunctorCode AlignHorizontallyFunctor::VisitLayerElement(LayerElement *layerEleme Rest *restParent = vrv_cast(layerElement->GetFirstAncestor(REST, MAX_NOTE_DEPTH)); TabGrp *tabGrpParent = vrv_cast(layerElement->GetFirstAncestor(TABGRP, MAX_TABGRP_DEPTH)); const bool ligatureAsBracket = m_doc->GetOptions()->m_ligatureAsBracket.GetValue(); + const bool neumeAsNote = m_doc->GetOptions()->m_neumeAsNote.GetValue(); if (chordParent) { layerElement->SetAlignment(chordParent->GetAlignment()); @@ -263,14 +267,15 @@ FunctorCode AlignHorizontallyFunctor::VisitLayerElement(LayerElement *layerEleme layerElement->SetAlignment(note->GetAlignment()); } else if (layerElement->Is(SYL)) { - Staff *staff = layerElement->GetAncestorStaff(); Note *note = vrv_cast(layerElement->GetFirstAncestor(NOTE)); - if (!note || (staff->m_drawingNotationType == NOTATIONTYPE_neume)) { - type = ALIGNMENT_DEFAULT; + if (note) { + layerElement->SetAlignment(note->GetAlignment()); } else { - layerElement->SetAlignment(note->GetAlignment()); + Syllable *syllable = vrv_cast(layerElement->GetFirstAncestor(SYLLABLE)); + if (syllable) layerElement->SetAlignment(syllable->GetAlignment()); } + // Else add a default } else if (layerElement->Is(VERSE)) { // Idem @@ -278,6 +283,25 @@ FunctorCode AlignHorizontallyFunctor::VisitLayerElement(LayerElement *layerEleme assert(note); layerElement->SetAlignment(note->GetAlignment()); } + else if (layerElement->Is(NC)) { + // Align with the neume + if (!neumeAsNote) { + Neume *neume = vrv_cast(layerElement->GetFirstAncestor(NEUME)); + assert(neume); + layerElement->SetAlignment(neume->GetAlignment()); + } + // Otherwise each nc has its own aligner + } + else if (layerElement->Is(NEUME)) { + // Align with the syllable + if (neumeAsNote) { + Syllable *syllable = vrv_cast(layerElement->GetFirstAncestor(SYLLABLE)); + assert(syllable); + layerElement->SetAlignment(syllable->GetAlignment()); + return FUNCTOR_CONTINUE; + } + // Otherwise each neume has its own aligner + } else if (layerElement->Is(GRACEGRP)) { return FUNCTOR_CONTINUE; } @@ -370,6 +394,8 @@ FunctorCode AlignHorizontallyFunctor::VisitMeasureEnd(Measure *measure) if (m_hasMultipleLayer) measure->HasAlignmentRefWithMultipleLayers(true); + // measure->m_measureAligner.LogDebugTree(3); + return FUNCTOR_CONTINUE; } diff --git a/src/barline.cpp b/src/barline.cpp index 30952b11ed7..8a5a6c81c87 100644 --- a/src/barline.cpp +++ b/src/barline.cpp @@ -33,9 +33,11 @@ namespace vrv { static const ClassRegistrar s_factory("barLine", BARLINE); -BarLine::BarLine() : LayerElement(BARLINE, "bline-"), AttBarLineLog(), AttColor(), AttNNumberLike(), AttVisibility() +BarLine::BarLine() + : LayerElement(BARLINE, "bline-"), AttBarLineLog(), AttBarLineVis(), AttColor(), AttNNumberLike(), AttVisibility() { this->RegisterAttClass(ATT_BARLINELOG); + this->RegisterAttClass(ATT_BARLINEVIS); this->RegisterAttClass(ATT_COLOR); this->RegisterAttClass(ATT_VISIBILITY); @@ -43,9 +45,10 @@ BarLine::BarLine() : LayerElement(BARLINE, "bline-"), AttBarLineLog(), AttColor( } BarLine::BarLine(ClassId classId) - : LayerElement(classId, "bline-"), AttBarLineLog(), AttColor(), AttNNumberLike(), AttVisibility() + : LayerElement(classId, "bline-"), AttBarLineLog(), AttBarLineVis(), AttColor(), AttNNumberLike(), AttVisibility() { this->RegisterAttClass(ATT_BARLINELOG); + this->RegisterAttClass(ATT_BARLINEVIS); this->RegisterAttClass(ATT_COLOR); this->RegisterAttClass(ATT_VISIBILITY); @@ -59,6 +62,7 @@ void BarLine::Reset() LayerElement::Reset(); this->ResetBarLineLog(); + this->ResetBarLineVis(); this->ResetColor(); this->ResetVisibility(); @@ -91,7 +95,7 @@ bool BarLine::IsDrawnThrough(const StaffGrp *staffGrp) const return false; } -std::pair BarLine::GetLength(const StaffDef *staffDef) const +std::pair BarLine::GetLengthFromContext(const StaffDef *staffDef) const { // First check the parent measure const Measure *measure = dynamic_cast(this->GetParent()); @@ -116,7 +120,7 @@ std::pair BarLine::GetLength(const StaffDef *staffDef) const return { false, 0.0 }; } -std::pair BarLine::GetMethod(const StaffDef *staffDef) const +std::pair BarLine::GetMethodFromContext(const StaffDef *staffDef) const { // First check the parent measure const Measure *measure = dynamic_cast(this->GetParent()); @@ -141,7 +145,7 @@ std::pair BarLine::GetMethod(const StaffDef *staffDef) con return { false, BARMETHOD_NONE }; } -std::pair BarLine::GetPlace(const StaffDef *staffDef) const +std::pair BarLine::GetPlaceFromContext(const StaffDef *staffDef) const { // First check the parent measure const Measure *measure = dynamic_cast(this->GetParent()); diff --git a/src/beam.cpp b/src/beam.cpp index 5e30dfde1c5..062426112f6 100644 --- a/src/beam.cpp +++ b/src/beam.cpp @@ -1619,6 +1619,15 @@ void Beam::Reset() m_stemSameas = NULL; } +void Beam::CloneReset() +{ + // Since these are owned by the beam we cloned from, empty the list + // Do it before Object::CloneReset since that one will reset the coord list + m_beamElementCoords.clear(); + + LayerElement::CloneReset(); +} + bool Beam::IsSupportedChild(Object *child) { if (child->Is(BEAM)) { @@ -1882,9 +1891,16 @@ void BeamElementCoord::SetDrawingStemDir(data_STEMDIRECTION stemDir, const Staff m_stem->SetDrawingStemDir(stemDir); m_yBeam = m_element->GetDrawingY(); - m_x += (STEMDIRECTION_up == stemDir) - ? 2 * m_element->GetDrawingRadius(doc) - doc->GetDrawingStemWidth(staff->m_drawingStaffSize) / 2 - : doc->GetDrawingStemWidth(staff->m_drawingStaffSize) / 2; + + // Move and take into account the glyph cut-outs + if (STEMDIRECTION_up == stemDir) { + m_x += stemInterface->GetStemUpSE(doc, staff->m_drawingStaffSize, interface->m_cueSize).x; + m_x -= doc->GetDrawingStemWidth(staff->m_drawingStaffSize) / 2; + } + else { + m_x += stemInterface->GetStemDownNW(doc, staff->m_drawingStaffSize, interface->m_cueSize).x; + m_x += doc->GetDrawingStemWidth(staff->m_drawingStaffSize) / 2; + } if (m_tabDurSym && !m_closestNote) { m_yBeam = m_tabDurSym->GetDrawingY(); diff --git a/src/calcalignmentpitchposfunctor.cpp b/src/calcalignmentpitchposfunctor.cpp index 697ea7bf548..188095fc068 100644 --- a/src/calcalignmentpitchposfunctor.cpp +++ b/src/calcalignmentpitchposfunctor.cpp @@ -60,8 +60,9 @@ FunctorCode CalcAlignmentPitchPosFunctor::VisitLayerElement(LayerElement *layerE if (layerElement->Is(ACCID)) { Accid *accid = vrv_cast(layerElement); assert(accid); - if (!accid->GetFirstAncestor(NOTE) && !accid->GetFirstAncestor(CUSTOS)) { + if (!accid->GetFirstAncestor(NOTE) && !accid->GetFirstAncestor(CUSTOS) && !m_doc->IsNeumeLines()) { // do something for accid that are not children of a note - e.g., mensural? + // skip for neume-lines mode as accid doesn't have a pitch in this case accid->SetDrawingYRel(staffY->CalcPitchPosYRel(m_doc, accid->CalcDrawingLoc(layerY, layerElementY))); } // override if staff position is set explicitly @@ -311,13 +312,16 @@ FunctorCode CalcAlignmentPitchPosFunctor::VisitLayerElement(LayerElement *layerE } layerElement->SetDrawingYRel(yRel); } - else if (layerElement->Is(NC) && m_doc->GetOptions()->m_neumeAsNote.GetValue()) { + else if (layerElement->Is(NC)) { 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)); } + else if (nc->HasLoc()) { + loc = nc->GetLoc(); + } int yRel = staffY->CalcPitchPosYRel(m_doc, loc); nc->SetDrawingLoc(loc); nc->SetDrawingYRel(yRel); diff --git a/src/calcalignmentxposfunctor.cpp b/src/calcalignmentxposfunctor.cpp index e8d44e18a3d..780c076f5b9 100644 --- a/src/calcalignmentxposfunctor.cpp +++ b/src/calcalignmentxposfunctor.cpp @@ -96,6 +96,12 @@ FunctorCode CalcAlignmentXPosFunctor::VisitAlignment(Alignment *alignment) FunctorCode CalcAlignmentXPosFunctor::VisitMeasure(Measure *measure) { + // We start a new Measure + // Reset the previous time position and x_rel to 0; + m_previousTime = 0.0; + // We un-measured music we never have a left barline, so do not add a default space + m_previousXRel = (measure->IsMeasuredMusic()) ? m_doc->GetDrawingUnit(100) : 0; + measure->m_measureAligner.Process(*this); return FUNCTOR_SIBLINGS; @@ -103,10 +109,7 @@ FunctorCode CalcAlignmentXPosFunctor::VisitMeasure(Measure *measure) FunctorCode CalcAlignmentXPosFunctor::VisitMeasureAligner(MeasureAligner *measureAligner) { - // We start a new MeasureAligner - // Reset the previous time position and x_rel to 0; - m_previousTime = 0.0; - m_previousXRel = m_doc->GetDrawingUnit(100); + m_lastNonTimestamp = measureAligner->GetLeftBarLineAlignment(); m_measureAligner = measureAligner; diff --git a/src/calcdotsfunctor.cpp b/src/calcdotsfunctor.cpp index b979a50aa66..2be321aa7a9 100644 --- a/src/calcdotsfunctor.cpp +++ b/src/calcdotsfunctor.cpp @@ -60,10 +60,6 @@ FunctorCode CalcDotsFunctor::VisitChord(Chord *chord) FunctorCode CalcDotsFunctor::VisitNote(Note *note) { - // We currently have no dots object with mensural notes - if (note->IsMensuralDur()) { - return FUNCTOR_SIBLINGS; - } if (!note->IsVisible()) { return FUNCTOR_SIBLINGS; } diff --git a/src/calcligaturenoteposfunctor.cpp b/src/calcligatureorneumeposfunctor.cpp similarity index 53% rename from src/calcligaturenoteposfunctor.cpp rename to src/calcligatureorneumeposfunctor.cpp index 52cd1b7d497..efefc3dc3f5 100644 --- a/src/calcligaturenoteposfunctor.cpp +++ b/src/calcligatureorneumeposfunctor.cpp @@ -1,16 +1,18 @@ ///////////////////////////////////////////////////////////////////////////// -// Name: calcligaturenoteposfunctor.cpp +// Name: calcligaturorneumeposfunctor.cpp // Author: David Bauer // Created: 2023 // Copyright (c) Authors and others. All rights reserved. ///////////////////////////////////////////////////////////////////////////// -#include "calcligaturenoteposfunctor.h" +#include "calcligatureorneumeposfunctor.h" //---------------------------------------------------------------------------- #include "doc.h" #include "ligature.h" +#include "nc.h" +#include "neume.h" #include "staff.h" //---------------------------------------------------------------------------- @@ -18,12 +20,12 @@ namespace vrv { //---------------------------------------------------------------------------- -// CalcLigatureNotePosFunctor +// CalcLigatureOrNeumePosFunctor //---------------------------------------------------------------------------- -CalcLigatureNotePosFunctor::CalcLigatureNotePosFunctor(Doc *doc) : DocFunctor(doc) {} +CalcLigatureOrNeumePosFunctor::CalcLigatureOrNeumePosFunctor(Doc *doc) : DocFunctor(doc) {} -FunctorCode CalcLigatureNotePosFunctor::VisitLigature(Ligature *ligature) +FunctorCode CalcLigatureOrNeumePosFunctor::VisitLigature(Ligature *ligature) { if (m_doc->GetOptions()->m_ligatureAsBracket.GetValue()) return FUNCTOR_CONTINUE; @@ -223,4 +225,147 @@ FunctorCode CalcLigatureNotePosFunctor::VisitLigature(Ligature *ligature) return FUNCTOR_SIBLINGS; } +FunctorCode CalcLigatureOrNeumePosFunctor::VisitNeume(Neume *neume) +{ + if (m_doc->GetOptions()->m_neumeAsNote.GetValue()) return FUNCTOR_SIBLINGS; + + ListOfObjects ncs = neume->FindAllDescendantsByType(NC); + + Staff *staff = neume->GetAncestorStaff(); + assert(staff); + const int staffSize = staff->m_drawingStaffSize; + const int unit = m_doc->GetDrawingUnit(staffSize); + + int xRel = 0; + Nc *previousNc = NULL; + bool previousLig = false; + + for (Object *object : ncs) { + + Nc *nc = vrv_cast(object); + assert(nc); + + const bool hasLiquescent = (nc->FindDescendantByType(LIQUESCENT)); + const bool hasOriscus = (nc->FindDescendantByType(ORISCUS)); + const bool hasQuilisma = (nc->FindDescendantByType(QUILISMA)); + + const int lineWidth = m_doc->GetGlyphWidth(SMUFL_E9BE_chantConnectingLineAsc3rd, staffSize, false); + + // Make sure we have at least one glyph + nc->m_drawingGlyphs.resize(1); + + int pitchDifference = (previousNc) ? nc->PitchOrLocDifferenceTo(previousNc) : 0; + bool overlapWithPrevious = (pitchDifference == 0) ? false : true; + + if (hasLiquescent) { + nc->m_drawingGlyphs.resize(3); + const int ncWidth = m_doc->GetGlyphWidth(SMUFL_E995_chantAuctumDesc, staffSize, false); + const int lineWidth = m_doc->GetGlyphWidth(SMUFL_E9BE_chantConnectingLineAsc3rd, staffSize, false); + + if (nc->GetCurve() == curvatureDirection_CURVE_c) { + nc->m_drawingGlyphs.at(0).m_fontNo = SMUFL_E995_chantAuctumDesc; + nc->m_drawingGlyphs.at(1).m_fontNo = SMUFL_E9BE_chantConnectingLineAsc3rd; + nc->m_drawingGlyphs.at(2).m_fontNo = SMUFL_E9BE_chantConnectingLineAsc3rd; + nc->m_drawingGlyphs.at(2).m_xOffset = ncWidth - lineWidth; + nc->m_drawingGlyphs.at(1).m_yOffset = -1.75 * unit; + nc->m_drawingGlyphs.at(2).m_yOffset = -1.9 * unit; + } + else if (nc->GetCurve() == curvatureDirection_CURVE_a) { + nc->m_drawingGlyphs.at(0).m_fontNo = SMUFL_E994_chantAuctumAsc; + nc->m_drawingGlyphs.at(1).m_fontNo = SMUFL_E9BE_chantConnectingLineAsc3rd; + nc->m_drawingGlyphs.at(2).m_fontNo = SMUFL_E9BE_chantConnectingLineAsc3rd; + nc->m_drawingGlyphs.at(2).m_xOffset = ncWidth - lineWidth; + nc->m_drawingGlyphs.at(1).m_yOffset = 0.5 * unit; + nc->m_drawingGlyphs.at(2).m_yOffset = 0.75 * unit; + } + else { + nc->m_drawingGlyphs.at(0).m_fontNo = SMUFL_E9A1_chantPunctumDeminutum; + } + } + else if (hasOriscus) { + nc->m_drawingGlyphs.at(0).m_fontNo = SMUFL_EA2A_medRenOriscusCMN; + } + else if (hasQuilisma) { + nc->m_drawingGlyphs.at(0).m_fontNo = SMUFL_E99B_chantQuilisma; + } + else { + nc->m_drawingGlyphs.at(0).m_fontNo = SMUFL_E990_chantPunctum; + + if (nc->GetLigated() == BOOLEAN_true) { + // This is the first nc of a ligature + if (!previousLig) { + // Temporarily set a second line glyph + nc->m_drawingGlyphs.at(0).m_fontNo = SMUFL_E9B4_chantEntryLineAsc2nd; + previousLig = true; + } + // This is the second + else { + // No overlap in this case since the second starts at the same position as the first + overlapWithPrevious = false; + assert(previousNc); + previousLig = false; + nc->m_drawingGlyphs.at(0).m_yOffset = -pitchDifference * unit; + previousNc->m_drawingGlyphs.at(0).m_yOffset = pitchDifference * unit; + + // set the glyph for both the current and previous nc + switch (pitchDifference) { + case -1: + nc->m_drawingGlyphs.at(0).m_fontNo = SMUFL_E9B9_chantLigaturaDesc2nd; + previousNc->m_drawingGlyphs.at(0).m_fontNo = SMUFL_E9B4_chantEntryLineAsc2nd; + break; + case -2: + nc->m_drawingGlyphs.at(0).m_fontNo = SMUFL_E9BA_chantLigaturaDesc3rd; + previousNc->m_drawingGlyphs.at(0).m_fontNo = SMUFL_E9B5_chantEntryLineAsc3rd; + break; + case -3: + nc->m_drawingGlyphs.at(0).m_fontNo = SMUFL_E9BB_chantLigaturaDesc4th; + previousNc->m_drawingGlyphs.at(0).m_fontNo = SMUFL_E9B6_chantEntryLineAsc4th; + break; + case -4: + nc->m_drawingGlyphs.at(0).m_fontNo = SMUFL_E9BC_chantLigaturaDesc5th; + previousNc->m_drawingGlyphs.at(0).m_fontNo = SMUFL_E9B7_chantEntryLineAsc5th; + break; + default: break; + } + } + } + // Check if nc is part of a ligature or is an inclinatum + else if (nc->HasTilt() && nc->GetTilt() == COMPASSDIRECTION_se) { + nc->m_drawingGlyphs.at(0).m_fontNo = SMUFL_E991_chantPunctumInclinatum; + // No overlap with this shape + overlapWithPrevious = false; + } + // If the nc is supposed to be a virga and currently is being rendered as a punctum + // change it to a virga + else if (nc->GetTilt() == COMPASSDIRECTION_s + && nc->m_drawingGlyphs.at(0).m_fontNo == SMUFL_E990_chantPunctum) { + nc->m_drawingGlyphs.at(0).m_fontNo = SMUFL_E996_chantPunctumVirga; + } + else if (nc->GetTilt() == COMPASSDIRECTION_n + && nc->m_drawingGlyphs.at(0).m_fontNo == SMUFL_E990_chantPunctum) { + nc->m_drawingGlyphs.at(0).m_fontNo = SMUFL_E997_chantPunctumVirgaReversed; + } + } + + // xRel remains unset with facsimile + if (!m_doc->HasFacsimile()) { + // If the nc overlaps with the previous, move it back from a line width + if (overlapWithPrevious) { + xRel -= lineWidth; + } + + nc->SetDrawingXRel(xRel); + // The first glyph set the spacing - unless we are starting a ligature, in which case no spacing should be + // added between the two nc + if (!previousLig) { + xRel += m_doc->GetGlyphWidth(nc->m_drawingGlyphs.at(0).m_fontNo, staffSize, false); + } + } + + previousNc = nc; + } + + return FUNCTOR_SIBLINGS; +} + } // namespace vrv diff --git a/src/calcstemfunctor.cpp b/src/calcstemfunctor.cpp index ffc1d5dcee7..ed2da41d127 100644 --- a/src/calcstemfunctor.cpp +++ b/src/calcstemfunctor.cpp @@ -607,7 +607,7 @@ data_STEMDIRECTION CalcStemFunctor::CalcStemDirection(const Chord *chord, int ve else if (middlePoint > verticalCenter) { return STEMDIRECTION_down; } - else if (middlePoint < verticalCenter) { + else { return STEMDIRECTION_up; } } diff --git a/src/clef.cpp b/src/clef.cpp index 3e73f0cc14d..74afebb9785 100644 --- a/src/clef.cpp +++ b/src/clef.cpp @@ -79,12 +79,12 @@ void Clef::Reset() this->ResetVisibility(); } -int Clef::GetClefLocOffset() const +int Clef::GetClefLocOffset(data_NOTATIONTYPE notationType) const { // Only resolve simple sameas links to avoid infinite recursion const Clef *sameas = dynamic_cast(this->GetSameasLink()); if (sameas && !sameas->HasSameasLink()) { - return sameas->GetClefLocOffset(); + return sameas->GetClefLocOffset(notationType); } int offset = 0; @@ -101,6 +101,11 @@ int Clef::GetClefLocOffset() const defaultOct = 3; offset = 4; } + else if (this->GetShape() == CLEFSHAPE_C) { + if (notationType == NOTATIONTYPE_neume) { + offset = 7; + } + } if (this->HasOct()) { int oct = this->GetOct(); diff --git a/src/convertfunctor.cpp b/src/convertfunctor.cpp index 61838252781..d80c5db720f 100644 --- a/src/convertfunctor.cpp +++ b/src/convertfunctor.cpp @@ -187,9 +187,12 @@ FunctorCode ConvertToCastOffMensuralFunctor::VisitBarLine(BarLine *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(); + MeasureType convertToMeasured = UNMEASURED; + if (m_doc->GetOptions()->m_mensuralToMeasure.GetValue()) { + convertToMeasured = MEASURED; + } - if (convertToMeasured) { + if (convertToMeasured == MEASURED) { // barLine object will be deleted m_targetMeasure->SetRight(barLine->GetForm()); } @@ -212,7 +215,7 @@ FunctorCode ConvertToCastOffMensuralFunctor::VisitBarLine(BarLine *barLine) // First case: add a new measure segment (e.g., first pass) if (m_targetSubSystem->GetChildCount() <= m_segmentIdx) { m_targetMeasure = new Measure(convertToMeasured); - if (convertToMeasured) { + if (convertToMeasured == MEASURED) { m_targetMeasure->SetN(StringFormat("%d", m_segmentTotal + 1 + m_segmentIdx)); } m_targetSubSystem->AddChild(m_targetMeasure); @@ -277,7 +280,10 @@ FunctorCode ConvertToCastOffMensuralFunctor::VisitMeasure(Measure *measure) return FUNCTOR_CONTINUE; } - bool convertToMeasured = m_doc->GetOptions()->m_mensuralToMeasure.GetValue(); + MeasureType convertToMeasured = UNMEASURED; + if (m_doc->GetOptions()->m_mensuralToMeasure.GetValue()) { + convertToMeasured = MEASURED; + } assert(m_targetSystem); assert(m_layerTree); @@ -289,7 +295,7 @@ FunctorCode ConvertToCastOffMensuralFunctor::VisitMeasure(Measure *measure) // 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) { + if (convertToMeasured == MEASURED) { targetMeasure->SetN(StringFormat("%d", m_segmentTotal + 1)); } m_targetSubSystem->AddChild(targetMeasure); @@ -375,7 +381,7 @@ FunctorCode ConvertToCastOffMensuralFunctor::VisitSyllable(Syllable *syllable) // 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_targetMeasure = new Measure(UNMEASURED); m_targetSubSystem->AddChild(m_targetMeasure); // Add a staff with same attributes as in the previous segment m_targetStaff = new Staff(*m_targetStaff); diff --git a/src/devicecontext.cpp b/src/devicecontext.cpp index 09a868e56ab..e734a35919d 100644 --- a/src/devicecontext.cpp +++ b/src/devicecontext.cpp @@ -129,6 +129,11 @@ const Resources *DeviceContext::GetResources(bool showWarning) const return m_resources; } +void DeviceContext::SetViewBoxFactor(double ppuFactor) +{ + m_viewBoxFactor = double(DEFINITION_FACTOR) / ppuFactor; +} + void DeviceContext::SetPen(int color, int width, int style, int dashLength, int gapLength, int lineCap, int lineJoin) { float opacityValue; diff --git a/src/doc.cpp b/src/doc.cpp index 5b13dd476d7..4300e41b8d8 100644 --- a/src/doc.cpp +++ b/src/doc.cpp @@ -132,6 +132,7 @@ void Doc::Reset() m_timemapTempo = 0.0; m_markup = MARKUP_DEFAULT; m_isMensuralMusicOnly = false; + m_isNeumeLines = false; m_isCastOff = false; m_visibleScores.clear(); @@ -1407,6 +1408,8 @@ void Doc::SyncToFacsimileDoc() if (!m_facsimile->FindDescendantByType(SURFACE)) { m_facsimile->AddChild(new Surface()); } + this->ScoreDefSetCurrentDoc(); + m_facsimile->SetType("transcription"); m_facsimile->ClearChildren(); @@ -2128,8 +2131,10 @@ int Doc::GetAdjustedDrawingPageHeight() const { assert(m_drawingPage); + // Take into account the PPU when getting the page height in facsimile if (this->IsTranscription() || this->IsFacs()) { - return m_drawingPage->m_pageHeight / DEFINITION_FACTOR; + const int factor = DEFINITION_FACTOR / m_drawingPage->GetPPUFactor(); + return m_drawingPage->m_pageHeight / factor; } int contentHeight = m_drawingPage->GetContentHeight(); @@ -2140,8 +2145,10 @@ int Doc::GetAdjustedDrawingPageWidth() const { assert(m_drawingPage); + // Take into account the PPU when getting the page width in facsimile if (this->IsTranscription() || this->IsFacs()) { - return m_drawingPage->m_pageWidth / DEFINITION_FACTOR; + const int factor = DEFINITION_FACTOR / m_drawingPage->GetPPUFactor(); + return m_drawingPage->m_pageWidth / factor; } int contentWidth = m_drawingPage->GetContentWidth(); diff --git a/src/drawinginterface.cpp b/src/drawinginterface.cpp index cc4a339e0b7..c843d0431fb 100644 --- a/src/drawinginterface.cpp +++ b/src/drawinginterface.cpp @@ -102,6 +102,8 @@ void BeamDrawingInterface::Reset() m_beamWidth = 0; m_beamWidthBlack = 0; m_beamWidthWhite = 0; + + ClearCoords(); } int BeamDrawingInterface::GetTotalBeamWidth() const @@ -136,9 +138,6 @@ void BeamDrawingInterface::InitCoords(const ListOfObjects &childList, Staff *sta m_beamStaff = staff; - // duration variables - int lastDur, currentDur; - m_beamElementCoords.reserve(childList.size()); for ([[maybe_unused]] auto child : childList) { m_beamElementCoords.push_back(new BeamElementCoord()); @@ -149,7 +148,7 @@ void BeamDrawingInterface::InitCoords(const ListOfObjects &childList, Staff *sta // Beam list should contain only DurationInterface objects assert(current->GetDurationInterface()); - lastDur = (current->GetDurationInterface())->GetActualDur(); + int lastDur = (current->GetDurationInterface())->GetActualDur(); /******************************************************************/ // Populate BeamElementCoord for each element in the beam @@ -165,7 +164,7 @@ void BeamDrawingInterface::InitCoords(const ListOfObjects &childList, Staff *sta do { // Beam list should contain only DurationInterface objects assert(current->GetDurationInterface()); - currentDur = (current->GetDurationInterface())->GetActualDur(); + const int currentDur = (current->GetDurationInterface())->GetActualDur(); if (current->Is(CHORD)) { m_beamHasChord = true; diff --git a/src/editortoolkit_neume.cpp b/src/editortoolkit_neume.cpp index 2b1d30f6dc8..11b5ea9a0a6 100644 --- a/src/editortoolkit_neume.cpp +++ b/src/editortoolkit_neume.cpp @@ -25,19 +25,21 @@ #include "divline.h" #include "layer.h" #include "liquescent.h" +#include "measure.h" #include "nc.h" #include "neume.h" #include "page.h" #include "rend.h" +#include "sb.h" #include "score.h" #include "staff.h" #include "staffdef.h" #include "surface.h" #include "syl.h" #include "syllable.h" +#include "system.h" #include "text.h" #include "vrv.h" - //-------------------------------------------------------------------------------- namespace vrv { @@ -136,6 +138,13 @@ bool EditorToolkitNeume::ParseEditorAction(const std::string &json_editorAction) } LogWarning("Could not parse the set clef action"); } + else if (action == "setLiquescent") { + std::string elementId, curve; + if (this->ParseSetLiquescentAction(json.get("param"), &elementId, &curve)) { + return this->SetLiquescent(elementId, curve); + } + LogWarning("Could not parse the set liquescent action"); + } else if (action == "remove") { std::string elementId; if (this->ParseRemoveAction(json.get("param"), &elementId)) { @@ -374,9 +383,9 @@ bool EditorToolkitNeume::ClefMovementHandler(Clef *clef, int x, int y) if (clef->HasFacs()) { Zone *zone = clef->GetZone(); assert(zone); - zone->ShiftByXY(x, - (clefLine - initialClefLine) * 2 * staff->m_drawingStaffSize - - x * tan(staff->GetDrawingRotate() * M_PI / 180.0)); + int y = (clefLine - initialClefLine) * 2 * staff->m_drawingStaffSize + - x * tan(staff->GetDrawingRotate() * M_PI / 180.0); + zone->ShiftByXY(x, -y); } layer->ReorderByXPos(); @@ -512,7 +521,6 @@ bool EditorToolkitNeume::Drag(std::string elementId, int x, int y) zone->ShiftByXY(x, -y); AdjustPitchFromPosition(element); - ChangeStaff(elementId); } else if (element->HasInterface(INTERFACE_PITCH) || element->Is(NEUME) || element->Is(SYLLABLE)) { Layer *layer = dynamic_cast(element->GetFirstAncestor(LAYER)); @@ -656,22 +664,24 @@ bool EditorToolkitNeume::Drag(std::string elementId, int x, int y) } // Move staff and all staff children with facsimiles + Zone *staffZone = staff->GetZone(); + assert(staffZone); + staffZone->ShiftByXY(x, -y); ListOfObjects children; InterfaceComparison ic(INTERFACE_FACSIMILE); staff->FindAllDescendantsByComparison(&children, &ic); - std::set zones; - zones.insert(staff->GetZone()); for (auto it = children.begin(); it != children.end(); ++it) { FacsimileInterface *fi = (*it)->GetFacsimileInterface(); assert(fi); - if (fi->GetZone() != NULL) zones.insert(fi->GetZone()); - } - for (auto it = zones.begin(); it != zones.end(); ++it) { - // Transform y to device context - (*it)->ShiftByXY(x, -y); + Zone *zone = fi->GetZone(); + if (zone) zone->ShiftByXY(x, -y); } - staff->GetParent()->StableSort(StaffSort()); + SortStaves(); + + m_doc->GetDrawingPage()->LayOutTranscription(true); + + if (m_doc->IsTranscription() && m_doc->HasFacsimile()) m_doc->SyncFromFacsimileDoc(); return true; // Can't reorder by layer since staves contain layers } @@ -704,7 +714,6 @@ bool EditorToolkitNeume::Drag(std::string elementId, int x, int y) assert(zone); zone->ShiftByXY(x, -y); } - ChangeStaff(elementId); } else if (element->Is(DIVLINE)) { DivLine *divLine = dynamic_cast(element); @@ -731,6 +740,8 @@ bool EditorToolkitNeume::Drag(std::string elementId, int x, int y) } Layer *layer = vrv_cast(element->GetFirstAncestor(LAYER)); layer->ReorderByXPos(); // Reflect position order of elements internally (and in the resulting output file) + m_doc->GetDrawingPage()->LayOutPitchPos(); + if (m_doc->IsTranscription() && m_doc->HasFacsimile()) m_doc->SyncFromFacsimileDoc(); m_editInfo.import("status", status); m_editInfo.import("message", message); return true; @@ -745,7 +756,7 @@ bool EditorToolkitNeume::Insert(std::string elementType, std::string staffId, in m_editInfo.import("message", "Could not get drawing page."); return false; } - if (m_doc->GetType() != Facs) { + if (!m_doc->HasFacsimile()) { LogError("Drawing page without facsimile"); m_editInfo.import("status", "FAILURE"); m_editInfo.import("message", "Drawing page without facsimile is unsupported."); @@ -781,26 +792,27 @@ bool EditorToolkitNeume::Insert(std::string elementType, std::string staffId, in Zone *zone = new Zone(); if (elementType == "staff") { - Object *parent; + Object *page = m_doc->GetDrawingPage(); + System *newSystem = new System(); + Sb *newSb = new Sb(); + Measure *newMeasure = new Measure(NEUMELINE); Staff *newStaff; + Layer *newLayer = new Layer(); std::string columnValue; + // Use closest existing staff (if there is one) if (staff) { - parent = staff->GetParent(); - assert(parent); columnValue = staff->GetType(); - int n = parent->GetChildCount() + 1; + int n = page->GetChildCount(SYSTEM) + 1; newStaff = new Staff(n); newStaff->m_drawingStaffDef = staff->m_drawingStaffDef; newStaff->m_drawingNotationType = staff->m_drawingNotationType; newStaff->m_drawingLines = staff->m_drawingLines; } else { - parent = m_doc->GetDrawingPage()->FindDescendantByType(MEASURE); - assert(parent); newStaff = new Staff(1); newStaff->m_drawingStaffDef = vrv_cast( - m_doc->GetCorrespondingScore(parent)->GetScoreDef()->FindDescendantByType(STAFFDEF)); + m_doc->GetCorrespondingScore(page)->GetScoreDef()->FindDescendantByType(STAFFDEF)); newStaff->m_drawingNotationType = NOTATIONTYPE_neume; newStaff->m_drawingLines = 4; } @@ -814,30 +826,18 @@ bool EditorToolkitNeume::Insert(std::string elementType, std::string staffId, in surface->AddChild(zone); newStaff->AttachZone(zone); if (columnValue.length()) newStaff->SetType(columnValue); - Layer *newLayer = new Layer(); + newStaff->AddChild(newLayer); + newMeasure->AddChild(newStaff); + newSystem->AddChild(newSb); + newSystem->AddChild(newMeasure); + newSystem->SetDrawingScoreDef(vrv_cast(m_doc->GetCorrespondingScore(page)->GetScoreDef())); - if (staff) { - // Find index to insert new staff - ListOfObjects staves = parent->FindAllDescendantsByType(STAFF, false); - std::vector stavesVector(staves.begin(), staves.end()); - stavesVector.push_back(newStaff); - StaffSort staffSort; - std::stable_sort(stavesVector.begin(), stavesVector.end(), staffSort); - for (int i = 0; i < (int)staves.size(); ++i) { - if (stavesVector.at(i) == newStaff) { - parent->InsertChild(newStaff, i); - parent->Modify(); - - m_editInfo.import("uuid", newStaff->GetID()); - m_editInfo.import("status", status); - m_editInfo.import("message", message); - - return true; - } - } - } - parent->AddChild(newStaff); + page->InsertAfter(page->GetFirst(SCORE), newSystem); + + SortStaves(); + + if (m_doc->IsTranscription() && m_doc->HasFacsimile()) m_doc->SyncFromFacsimileDoc(); m_editInfo.import("uuid", newStaff->GetID()); m_editInfo.import("status", status); @@ -881,20 +881,21 @@ bool EditorToolkitNeume::Insert(std::string elementType, std::string staffId, in = (int)(m_doc->GetDrawingDoubleUnit(staff->m_drawingStaffSize) / NOTE_HEIGHT_TO_STAFF_SIZE_RATIO); const int noteWidth = (int)(m_doc->GetDrawingDoubleUnit(staff->m_drawingStaffSize) / NOTE_WIDTH_TO_STAFF_SIZE_RATIO); + const int offsetX = (int)(noteWidth / 2); // Set up facsimile - zone->SetUlx(ulx); + zone->SetUlx(ulx - offsetX); zone->SetUly(uly); - zone->SetLrx(ulx + noteWidth); + zone->SetLrx(ulx + offsetX); zone->SetLry(uly + noteHeight); // add syl bounding box if Facs - if (m_doc->GetType() == Facs) { + if (m_doc->HasFacsimile()) { FacsimileInterface *fi = vrv_cast(syl->GetFacsimileInterface()); assert(fi); sylZone = new Zone(); - int staffLry = staff->GetFacsimileInterface()->GetZone()->GetLry(); + int staffLry = staff->GetZone()->GetLry(); // width height and offset can be adjusted int bboxHeight = 175; @@ -905,8 +906,7 @@ bool EditorToolkitNeume::Insert(std::string elementType, std::string staffId, in int offsetY = 0; if (theta) { double factor = 1.3; - offsetY = (int)((ulx - staff->GetFacsimileInterface()->GetZone()->GetUlx()) * tan(theta * M_PI / 180.0) - / factor); + offsetY = (int)((ulx - staff->GetZone()->GetUlx()) * tan(theta * M_PI / 180.0) / factor); } sylZone->SetUlx(ulx); @@ -947,7 +947,6 @@ bool EditorToolkitNeume::Insert(std::string elementType, std::string staffId, in contour = it->second; } else if (it->first == "curve") { - Liquescent *liquescent = new Liquescent(); curvatureDirection_CURVE curve = curvatureDirection_CURVE_NONE; if (it->second == "a") { curve = curvatureDirection_CURVE_a; @@ -957,6 +956,7 @@ bool EditorToolkitNeume::Insert(std::string elementType, std::string staffId, in curve = curvatureDirection_CURVE_c; nc->SetCurve(curve); } + Liquescent *liquescent = new Liquescent(); nc->AddChild(liquescent); } } @@ -995,9 +995,9 @@ bool EditorToolkitNeume::Insert(std::string elementType, std::string staffId, in // Apply offset due to rotate newUly += (newUlx - ulx) * tan(-staff->GetDrawingRotate() * M_PI / 180.0); - newZone->SetUlx(newUlx); + newZone->SetUlx(newUlx - offsetX); newZone->SetUly(newUly); - newZone->SetLrx(newUlx + noteWidth); + newZone->SetLrx(newUlx + offsetX); newZone->SetLry(newUly + noteHeight); newNc->AttachZone(newZone); @@ -1027,14 +1027,21 @@ bool EditorToolkitNeume::Insert(std::string elementType, std::string staffId, in Clef *clef = new Clef(); data_CLEFSHAPE clefShape = CLEFSHAPE_NONE; + const int staffSize = m_doc->GetDrawingDoubleUnit(staff->m_drawingStaffSize); + int offsetR, offsetL; + for (auto it = attributes.begin(); it != attributes.end(); ++it) { if (it->first == "shape") { if (it->second == "C") { clefShape = CLEFSHAPE_C; + offsetR = (int)(staffSize / NOTE_WIDTH_TO_STAFF_SIZE_RATIO / 2); + offsetL = offsetR; break; } else if (it->second == "F") { clefShape = CLEFSHAPE_F; + offsetR = 0; + offsetL = (int)(staffSize / NOTE_WIDTH_TO_STAFF_SIZE_RATIO / 2); break; } } @@ -1048,17 +1055,16 @@ bool EditorToolkitNeume::Insert(std::string elementType, std::string staffId, in return false; } clef->SetShape(clefShape); - const int staffSize = m_doc->GetDrawingDoubleUnit(staff->m_drawingStaffSize); - int yDiff = -staff->GetDrawingY() + uly; + int yDiff = -staff->GetZone()->GetUly() + uly; yDiff += ((ulx - staff->GetZone()->GetUlx())) * tan(-staff->GetDrawingRotate() * M_PI / 180.0); // Subtract distance due to rotate. int clefLine = staff->m_drawingLines - round((double)yDiff / (double)staffSize); clef->SetLine(clefLine); Zone *zone = new Zone(); - zone->SetUlx(ulx); + zone->SetUlx(ulx - offsetR); zone->SetUly(uly); - zone->SetLrx(ulx + staffSize / NOTE_WIDTH_TO_STAFF_SIZE_RATIO); + zone->SetLrx(ulx + offsetL); zone->SetLry(uly + staffSize / NOTE_HEIGHT_TO_STAFF_SIZE_RATIO); clef->AttachZone(zone); Surface *surface = dynamic_cast(facsimile->FindDescendantByType(SURFACE)); @@ -1104,13 +1110,14 @@ bool EditorToolkitNeume::Insert(std::string elementType, std::string staffId, in = (int)(m_doc->GetDrawingDoubleUnit(staff->m_drawingStaffSize) / NOTE_HEIGHT_TO_STAFF_SIZE_RATIO); const int noteWidth = (int)(m_doc->GetDrawingDoubleUnit(staff->m_drawingStaffSize) / NOTE_WIDTH_TO_STAFF_SIZE_RATIO); + const int offsetX = (int)(noteWidth / 4); ulx -= noteWidth / 2; uly -= noteHeight / 2; - zone->SetUlx(ulx); + zone->SetUlx(ulx + offsetX); zone->SetUly(uly); - zone->SetLrx(ulx + noteWidth); + zone->SetLrx(ulx + noteWidth + offsetX); zone->SetLry(uly + noteHeight); layer->ReorderByXPos(); if (!AdjustPitchFromPosition(custos)) { @@ -1157,13 +1164,14 @@ bool EditorToolkitNeume::Insert(std::string elementType, std::string staffId, in = (int)(m_doc->GetDrawingDoubleUnit(staff->m_drawingStaffSize) / NOTE_HEIGHT_TO_STAFF_SIZE_RATIO); const int noteWidth = (int)(m_doc->GetDrawingDoubleUnit(staff->m_drawingStaffSize) / NOTE_WIDTH_TO_STAFF_SIZE_RATIO); + const int offsetX = (int)(noteWidth / 2); ulx -= noteWidth / 2; uly -= noteHeight / 2; - zone->SetUlx(ulx); + zone->SetUlx(ulx + offsetX); zone->SetUly(uly); - zone->SetLrx(ulx + noteWidth); + zone->SetLrx(ulx + noteWidth + offsetX); zone->SetLry(uly + noteHeight); layer->ReorderByXPos(); @@ -1221,13 +1229,14 @@ bool EditorToolkitNeume::Insert(std::string elementType, std::string staffId, in = (int)(m_doc->GetDrawingDoubleUnit(staff->m_drawingStaffSize) / NOTE_HEIGHT_TO_STAFF_SIZE_RATIO); const int noteWidth = (int)(m_doc->GetDrawingDoubleUnit(staff->m_drawingStaffSize) / NOTE_WIDTH_TO_STAFF_SIZE_RATIO); + const int offsetX = (int)(noteWidth / 2); ulx -= noteWidth / 2; uly -= noteHeight / 2; - zone->SetUlx(ulx); + zone->SetUlx(ulx + offsetX); zone->SetUly(uly); - zone->SetLrx(ulx + noteWidth); + zone->SetLrx(ulx + noteWidth + offsetX); zone->SetLry(uly + noteHeight); layer->ReorderByXPos(); @@ -1241,6 +1250,11 @@ bool EditorToolkitNeume::Insert(std::string elementType, std::string staffId, in return false; } layer->ReorderByXPos(); + + m_doc->GetDrawingPage()->LayOutTranscription(true); + + if (m_doc->IsTranscription() && m_doc->HasFacsimile()) m_doc->SyncFromFacsimileDoc(); + m_editInfo.import("status", status); m_editInfo.import("message", message); return true; @@ -1254,7 +1268,7 @@ bool EditorToolkitNeume::InsertToSyllable(std::string elementId) m_editInfo.import("message", "Could not get drawing page."); return false; } - if (m_doc->GetType() != Facs) { + if (!m_doc->HasFacsimile()) { LogError("Drawing page without facsimile"); m_editInfo.import("status", "FAILURE"); m_editInfo.import("message", "Drawing page without facsimile is unsupported."); @@ -1404,7 +1418,7 @@ bool EditorToolkitNeume::MoveOutsideSyllable(std::string elementId) m_editInfo.import("message", "Could not get drawing page."); return false; } - if (m_doc->GetType() != Facs) { + if (!m_doc->HasFacsimile()) { LogError("Drawing page without facsimile"); m_editInfo.import("status", "FAILURE"); m_editInfo.import("message", "Drawing page without facsimile is unsupported."); @@ -1578,19 +1592,26 @@ bool EditorToolkitNeume::DisplaceClefOctave(std::string elementId, std::string d clef->SetDisPlace(octaveDis > 0 ? STAFFREL_basic_above : STAFFREL_basic_below); } - // Set new octaves for affected neume components + // Set new octaves for affected neume components and custodes ClassIdComparison equalsClef(CLEF); Clef *nextClef = dynamic_cast(page->FindNextChild(&equalsClef, clef)); ClassIdComparison equalsNcs(NC); ListOfObjects ncs; page->FindAllDescendantsBetween(&ncs, &equalsNcs, clef, nextClef); - std::for_each(ncs.begin(), ncs.end(), [&](Object *ncObj) { Nc *nc = dynamic_cast(ncObj); nc->SetOct(nc->GetOct() + move); }); + ClassIdComparison equalsCustodes(CUSTOS); + ListOfObjects custodes; + page->FindAllDescendantsBetween(&custodes, &equalsCustodes, clef, nextClef); + std::for_each(custodes.begin(), custodes.end(), [&](Object *custosObj) { + Custos *custos = dynamic_cast(custosObj); + custos->SetOct(custos->GetOct() + move); + }); + m_editInfo.import("status", "OK"); m_editInfo.import("message", ""); return true; @@ -1604,7 +1625,7 @@ bool EditorToolkitNeume::MatchHeight(std::string elementId) m_editInfo.import("message", "Could not get drawing page."); return false; } - if (m_doc->GetType() != Facs) { + if (!m_doc->HasFacsimile()) { LogError("Drawing page without facsimile"); m_editInfo.import("status", "FAILURE"); m_editInfo.import("message", "Drawing page without facsimile is unsupported."); @@ -1682,6 +1703,8 @@ bool EditorToolkitNeume::MatchHeight(std::string elementId) zone->SetLry(uly + offsetY + height); } + if (m_doc->IsTranscription() && m_doc->HasFacsimile()) m_doc->SyncFromFacsimileDoc(); + m_editInfo.import("status", "OK"); m_editInfo.import("message", ""); return true; @@ -1690,6 +1713,8 @@ bool EditorToolkitNeume::MatchHeight(std::string elementId) bool EditorToolkitNeume::Merge(std::vector elementIds) { if (!m_doc->GetDrawingPage()) return false; + Object *page = m_doc->GetDrawingPage(); + ListOfObjects staves; // Get the staves by element ID and fail if a staff does not exist. @@ -1756,8 +1781,35 @@ bool EditorToolkitNeume::Merge(std::vector elementIds) Layer *sourceLayer = vrv_cast(sourceStaff->GetFirst(LAYER)); fillLayer->MoveChildrenFrom(sourceLayer); assert(sourceLayer->GetChildCount() == 0); - Object *parent = sourceStaff->GetParent(); - parent->DeleteChild(sourceStaff); + + // Delete empty staff with its system parent + // Move SECTION, PB, and SYSTEM_MILESTONE_END if any + Object *system = sourceStaff->GetFirstAncestor(SYSTEM); + if (system->FindDescendantByType(SECTION)) { + Object *section = system->FindDescendantByType(SECTION); + Object *nextSystem = page->GetNext(system, SYSTEM); + if (nextSystem) { + section = system->DetachChild(section->GetIdx()); + nextSystem->InsertChild(section, 0); + } + } + if (system->FindDescendantByType(PB)) { + Object *pb = system->FindDescendantByType(PB); + Object *nextSystem = page->GetNext(system, SYSTEM); + if (nextSystem) { + pb = system->DetachChild(pb->GetIdx()); + nextSystem->InsertChild(pb, 1); + } + } + if (system->FindDescendantByType(SYSTEM_MILESTONE_END)) { + Object *milestoneEnd = system->FindDescendantByType(SYSTEM_MILESTONE_END); + Object *previousSystem = page->GetPrevious(system, SYSTEM); + if (previousSystem) { + milestoneEnd = system->DetachChild(milestoneEnd->GetIdx()); + previousSystem->InsertChild(milestoneEnd, previousSystem->GetChildCount()); + } + } + page->DeleteChild(system); } // Set the bounding box for the staff to the new bounds Zone *staffZone = fillStaff->GetZone(); @@ -1769,12 +1821,12 @@ bool EditorToolkitNeume::Merge(std::vector elementIds) fillLayer->ReorderByXPos(); + if (m_doc->IsTranscription() && m_doc->HasFacsimile()) m_doc->SyncFromFacsimileDoc(); + m_editInfo.import("uuid", fillStaff->GetID()); m_editInfo.import("status", "OK"); m_editInfo.import("message", ""); - // TODO change zones for staff children - return true; } @@ -1809,10 +1861,8 @@ bool EditorToolkitNeume::Set(std::string elementId, std::string attrType, std::s success = true; else if (AttModule::SetVisual(element, attrType, attrValue)) success = true; - if (success && m_doc->GetType() != Facs) { - m_doc->PrepareData(); - m_doc->GetDrawingPage()->LayOut(true); - } + + m_doc->GetDrawingPage()->LayOutTranscription(true); m_editInfo.import("status", success ? "OK" : "FAILURE"); m_editInfo.import("message", success ? "" : "Could not set attribute '" + attrType + "' to '" + attrValue + "'."); return success; @@ -1878,12 +1928,8 @@ bool EditorToolkitNeume::SetText(std::string elementId, const std::string &text) std::u32string str = U""; text->SetText(str); syl->AddChild(text); - syllable->AddChild(syl); - Text *textChild = new Text(); - textChild->SetText(wtext); - syl->AddChild(textChild); - if (m_doc->GetType() == Facs) { + if (m_doc->HasFacsimile()) { // Create a default bounding box Zone *zone = new Zone(); int ulx, uly, lrx, lry; @@ -1920,6 +1966,9 @@ bool EditorToolkitNeume::SetText(std::string elementId, const std::string &text) m_editInfo.import("message", "Element type '" + element->GetClassName() + "' is unsupported for SetText."); return false; } + + if (m_doc->IsTranscription() && m_doc->HasFacsimile()) m_doc->SyncFromFacsimileDoc(); + m_editInfo.import("status", success ? status : "FAILURE"); m_editInfo.import("message", success ? message : "SetText method failed."); return success; @@ -1977,15 +2026,96 @@ bool EditorToolkitNeume::SetClef(std::string elementId, std::string shape) pi->AdjustPitchByOffset(shift); } } - if (success && m_doc->GetType() != Facs) { - m_doc->PrepareData(); - m_doc->GetDrawingPage()->LayOut(true); + m_editInfo.import("status", "OK"); + m_editInfo.import("message", ""); + return true; +} + +bool EditorToolkitNeume::SetLiquescent(std::string elementId, std::string curve) +{ + if (!m_doc->GetDrawingPage()) { + LogError("Could not get the drawing page."); + m_editInfo.import("status", "FAILURE"); + m_editInfo.import("message", "Could not get the drawing page."); + return false; + } + + Nc *nc = vrv_cast(m_doc->GetDrawingPage()->FindDescendantByID(elementId)); + assert(nc); + bool hasLiquscent = nc->GetChildCount(); + + if (curve == "a") { + curvatureDirection_CURVE curve = curvatureDirection_CURVE_a; + nc->SetCurve(curve); + if (!hasLiquscent) { + Liquescent *liquescent = new Liquescent(); + nc->AddChild(liquescent); + } + } + else if (curve == "c") { + curvatureDirection_CURVE curve = curvatureDirection_CURVE_c; + nc->SetCurve(curve); + if (!hasLiquscent) { + Liquescent *liquescent = new Liquescent(); + nc->AddChild(liquescent); + } } + else { + // For unset curve + curvatureDirection_CURVE curve = curvatureDirection_CURVE_NONE; + nc->SetCurve(curve); + if (hasLiquscent) { + Liquescent *liquescent = vrv_cast(nc->FindDescendantByType(LIQUESCENT)); + nc->DeleteChild(liquescent); + } + } + m_editInfo.import("status", "OK"); m_editInfo.import("message", ""); return true; } +bool EditorToolkitNeume::SortStaves() +{ + if (!m_doc->GetDrawingPage()) { + LogError("Could not get drawing page."); + m_editInfo.import("status", "FAILURE"); + m_editInfo.import("message", "Could not get drawing page."); + return false; + } + + Object *page = m_doc->GetDrawingPage(); + if (page->GetChildCount(SYSTEM) <= 1) return true; + + page->StableSort(StaffSort()); + + Object *pb = page->FindDescendantByType(PB); + Object *milestoneEnd = page->FindDescendantByType(SYSTEM_MILESTONE_END); + Object *section = page->FindDescendantByType(SECTION); + assert(pb); + assert(milestoneEnd); + assert(section); + + Object *pbParent = pb->GetParent(); + Object *milestoneEndParent = milestoneEnd->GetParent(); + Object *sectionParent = section->GetParent(); + + pb = pbParent->DetachChild(pb->GetIdx()); + milestoneEnd = milestoneEndParent->DetachChild(milestoneEnd->GetIdx()); + section = sectionParent->DetachChild(section->GetIdx()); + + Object *firstSystem = page->GetFirst(SYSTEM); + Object *lastSystem = page->GetLast(SYSTEM); + assert(firstSystem); + assert(lastSystem); + + firstSystem->InsertChild(section, 0); + firstSystem->InsertChild(pb, 1); + lastSystem->InsertChild(milestoneEnd, lastSystem->GetChildCount()); + + return true; +} + bool EditorToolkitNeume::Split(std::string elementId, int x) { if (!m_doc->GetDrawingPage()) { @@ -2074,6 +2204,9 @@ bool EditorToolkitNeume::Split(std::string elementId, int x) } } layer->ClearRelinquishedChildren(); + + if (m_doc->IsTranscription() && m_doc->HasFacsimile()) m_doc->SyncFromFacsimileDoc(); + m_editInfo.import("status", "OK"); m_editInfo.import("message", ""); m_editInfo.import("uuid", splitStaff->GetID()); @@ -2108,7 +2241,7 @@ void EditorToolkitNeume::UnlinkSyllable(Syllable *syllable) linkedSyllable->AddChild(syl); // Create default bounding box if facs - if (m_doc->GetType() == Facs) { + if (m_doc->HasFacsimile()) { Zone *zone = new Zone(); zone->SetUlx( @@ -2127,6 +2260,8 @@ void EditorToolkitNeume::UnlinkSyllable(Syllable *syllable) FacsimileInterface *fi = syl->GetFacsimileInterface(); assert(fi); fi->AttachZone(zone); + + if (m_doc->IsTranscription() && m_doc->HasFacsimile()) m_doc->SyncFromFacsimileDoc(); } } } @@ -2140,22 +2275,21 @@ bool EditorToolkitNeume::Remove(std::string elementId) m_editInfo.import("message", "Could not get the drawing page."); return false; } - Object *obj = m_doc->GetDrawingPage()->FindDescendantByID(elementId); - assert(obj); - bool result = false; - bool isNeumeOrNc, isNc, isClef, isSyllable; - isNeumeOrNc = (obj->Is(NC) || obj->Is(NEUME)); - isNc = obj->Is(NC); - isClef = obj->Is(CLEF); - isSyllable = obj->Is(SYLLABLE); - Object *parent = obj->GetParent(); + + Object *element = m_doc->GetDrawingPage()->FindDescendantByID(elementId); + assert(element); + Object *parent = element->GetParent(); assert(parent); - m_editInfo.import("uuid", elementId); + + bool result = false; + bool isNc = element->Is(NC); + bool isNeumeOrNc = (element->Is(NEUME) || element->Is(NC)); + // Remove Zone for element (if any) InterfaceComparison ic(INTERFACE_FACSIMILE); ListOfObjects fiChildren; - obj->FindAllDescendantsByComparison(&fiChildren, &ic); - FacsimileInterface *fi = obj->GetFacsimileInterface(); + element->FindAllDescendantsByComparison(&fiChildren, &ic); + FacsimileInterface *fi = element->GetFacsimileInterface(); if (fi != NULL && fi->HasFacs()) { fi->AttachZone(NULL); } @@ -2165,7 +2299,8 @@ bool EditorToolkitNeume::Remove(std::string elementId) fi->AttachZone(NULL); } } - if (isClef) { + + if (element->Is(CLEF)) { // y position of pitched elements (like neumes) is determined by their pitches // so when deleting a clef, the position on a page that a pitch value is associated with could change // so we need to change the pitch value of any elements whose clef is going to change @@ -2187,7 +2322,7 @@ bool EditorToolkitNeume::Remove(std::string elementId) m_doc->GetDrawingPage()->FindAllDescendantsBetween( &elements, &ic, clef, (nextClef != NULL) ? nextClef : m_doc->GetDrawingPage()->GetLast()); - result = parent->DeleteChild(obj); + result = parent->DeleteChild(element); if (!result) { LogError("Failed to delete the desired element (%s)", elementId.c_str()); @@ -2203,9 +2338,65 @@ bool EditorToolkitNeume::Remove(std::string elementId) // removing the current clef, and so the new clef for all of these elements is previousClef pi->AdjustPitchForNewClef(clef, previousClef); } + + m_editInfo.import("uuid", elementId); + m_editInfo.import("status", "OK"); + m_editInfo.import("message", ""); + return true; } - else if (isSyllable) { - Syllable *syllable = dynamic_cast(obj); + else if (element->Is(STAFF)) { + Object *page = m_doc->GetDrawingPage(); + Object *system = element->GetFirstAncestor(SYSTEM); + + if (page->GetChildCount(SYSTEM) > 1) { + if (system == page->GetFirst(SYSTEM)) { + // if the target staff is in the first system, + // move pb and section to the next system + Object *nextSystem = page->GetNext(system, SYSTEM); + Object *section = system->FindDescendantByType(SECTION); + Object *pb = system->FindDescendantByType(PB); + assert(pb); + assert(section); + + section = system->DetachChild(section->GetIdx()); + pb = system->DetachChild(pb->GetIdx()); + + nextSystem->InsertChild(section, 0); + nextSystem->InsertChild(pb, 1); + } + else if (system == page->GetLast(SYSTEM)) { + // if the target staff in is the last system, + // move system-milestone-end to the previous system + Object *previousSystem = page->GetPrevious(system, SYSTEM); + Object *milestoneEnd = system->FindDescendantByType(SYSTEM_MILESTONE_END); + assert(milestoneEnd); + + int milestoneEndIdx = system->GetChildIndex(milestoneEnd); + milestoneEnd = system->DetachChild(milestoneEndIdx); + + previousSystem->InsertChild(milestoneEnd, previousSystem->GetChildCount()); + } + } + + // delete system to delete staff + result = page->DeleteChild(system); + + if (!result) { + LogError("Failed to delete the desired element (%s)", elementId.c_str()); + m_editInfo.reset(); + m_editInfo.import("status", "FAILURE"); + m_editInfo.import("message", "Failed to delete the desired element (" + elementId + ")."); + return false; + } + + m_editInfo.import("uuid", elementId); + m_editInfo.import("status", "OK"); + m_editInfo.import("message", ""); + return true; + } + + if (element->Is(SYLLABLE)) { + Syllable *syllable = dynamic_cast(element); assert(syllable); if (syllable->HasPrecedes() || syllable->HasFollows()) { UnlinkSyllable(syllable); @@ -2213,7 +2404,7 @@ bool EditorToolkitNeume::Remove(std::string elementId) } if (!result) { - result = parent->DeleteChild(obj); + result = parent->DeleteChild(element); } if (!result) { @@ -2223,15 +2414,16 @@ bool EditorToolkitNeume::Remove(std::string elementId) m_editInfo.import("message", "Failed to delete the desired element (" + elementId + ")."); return false; } + // Check if this leaves any containers empty and delete them if (isNc) { assert(parent->Is(NEUME)); - obj = parent; + element = parent; parent = parent->GetParent(); - if (obj->FindDescendantByType(NC) == NULL) { + if (element->FindDescendantByType(NC) == NULL) { // Delete the empty neume - std::string neumeId = obj->GetID(); - result &= parent->DeleteChild(obj); + std::string neumeId = element->GetID(); + result &= parent->DeleteChild(element); if (!result) { LogError("Failed to delete empty neume (%s)", neumeId.c_str()); m_editInfo.reset(); @@ -2243,18 +2435,18 @@ bool EditorToolkitNeume::Remove(std::string elementId) } if (isNeumeOrNc) { assert(parent->Is(SYLLABLE)); - obj = parent; + element = parent; parent = parent->GetParent(); - if (obj->FindDescendantByType(NC) == NULL) { + if (element->FindDescendantByType(NC) == NULL) { // Check if it is part of a linked/split syllable and unlink - Syllable *li = dynamic_cast(obj); + Syllable *li = dynamic_cast(element); assert(li); if (li->HasPrecedes() || li->HasFollows()) { UnlinkSyllable(li); } // Delete the syllable empty of neumes - std::string syllableId = obj->GetID(); - result &= parent->DeleteChild(obj); + std::string syllableId = element->GetID(); + result &= parent->DeleteChild(element); if (!result) { LogError("Failed to delete empty syllable (%s)", syllableId.c_str()); m_editInfo.reset(); @@ -2265,6 +2457,7 @@ bool EditorToolkitNeume::Remove(std::string elementId) } } + m_editInfo.import("uuid", elementId); m_editInfo.import("status", "OK"); m_editInfo.import("message", ""); return true; @@ -2278,7 +2471,7 @@ bool EditorToolkitNeume::Resize(std::string elementId, int ulx, int uly, int lrx m_editInfo.import("message", "Could not get the drawing page."); return false; } - if (m_doc->GetType() != Facs) { + if (!m_doc->HasFacsimile()) { LogWarning("Resizing is only available in facsimile mode."); m_editInfo.import("status", "FAILURE"); m_editInfo.import("message", "Resizing is only available in facsimile mode."); @@ -2307,11 +2500,28 @@ bool EditorToolkitNeume::Resize(std::string elementId, int ulx, int uly, int lrx zone->SetUly(uly); zone->SetLrx(lrx); zone->SetLry(lry); + double orgRotate = staff->GetDrawingRotation(); if (!isnan(rotate)) { zone->SetRotate(rotate); } zone->Modify(); - staff->GetParent()->StableSort(StaffSort()); + SortStaves(); + + if (staff->HasDrawingRotation()) { + ListOfObjects accids = staff->FindAllDescendantsByType(ACCID); + for (auto it = accids.begin(); it != accids.end(); ++it) { + Accid *accid = dynamic_cast(*it); + FacsimileInterface *fi = accid->GetFacsimileInterface(); + Zone *accidZone = fi->GetZone(); + double rotationOffset = (accid->GetDrawingX() - staff->GetDrawingX()) * tan(rotate * M_PI / 180.0); + if (orgRotate) { + double orgOffset = (accid->GetDrawingX() - staff->GetDrawingX()) * tan(orgRotate * M_PI / 180.0); + rotationOffset -= orgOffset; + } + accidZone->SetUly(accidZone->GetUly() + int(rotationOffset)); + accidZone->SetLry(accidZone->GetLry() + int(rotationOffset)); + } + } } else if (obj->Is(SYL)) { Syl *syl = vrv_cast(obj); @@ -2353,6 +2563,9 @@ bool EditorToolkitNeume::Resize(std::string elementId, int ulx, int uly, int lrx m_editInfo.import("message", "Element of type '" + obj->GetClassName() + "' is unsupported."); return false; } + + if (m_doc->IsTranscription() && m_doc->HasFacsimile()) m_doc->SyncFromFacsimileDoc(); + m_editInfo.import("status", "OK"); m_editInfo.import("message", ""); return true; @@ -2587,7 +2800,7 @@ bool EditorToolkitNeume::Group(std::string groupType, std::vector e parent->AddChild(syl); // add a default bounding box if you need to - if (m_doc->GetType() == Facs) { + if (m_doc->HasFacsimile()) { Zone *zone = new Zone(); zone->SetUlx(parent->GetFirst(NEUME)->GetFirst(NC)->GetFacsimileInterface()->GetZone()->GetUlx()); @@ -2645,7 +2858,7 @@ bool EditorToolkitNeume::Group(std::string groupType, std::vector e std::u32string fullString = U""; for (auto it = fullParents.begin(); it != fullParents.end(); ++it) { Syl *syl = dynamic_cast((*it)->FindDescendantByType(SYL)); - if (syl != NULL && m_doc->GetType() == Facs) { + if (syl != NULL && m_doc->HasFacsimile()) { Zone *zone = dynamic_cast(syl->GetFacsimileInterface()->GetZone()); if (fullSyl == NULL) { @@ -2679,7 +2892,7 @@ bool EditorToolkitNeume::Group(std::string groupType, std::vector e fullText->SetText(fullString); parent->AddChild(fullSyl); - if (m_doc->GetType() == Facs) { + if (m_doc->HasFacsimile()) { Zone *zone = dynamic_cast(fullSyl->GetFacsimileInterface()->GetZone()); zone->SetUlx(ulx); zone->SetUly(uly); @@ -2718,6 +2931,10 @@ bool EditorToolkitNeume::Group(std::string groupType, std::vector e + obj->GetChildCount(CLEF))) { Object *leftover; while ((leftover = obj->FindDescendantByType(SYL)) != NULL) { + Zone *zone = dynamic_cast(leftover->GetFacsimileInterface()->GetZone()); + if (zone != NULL) { + m_doc->GetFacsimile()->FindDescendantByType(SURFACE)->DeleteChild(zone); + } obj->DeleteChild(leftover); } while ((leftover = obj->FindDescendantByType(DIVLINE)) != NULL) { @@ -2738,6 +2955,8 @@ bool EditorToolkitNeume::Group(std::string groupType, std::vector e secondParent->ReorderByXPos(); + if (m_doc->IsTranscription() && m_doc->HasFacsimile()) m_doc->SyncFromFacsimileDoc(); + m_editInfo.import("uuid", parent->GetID()); m_editInfo.import("status", status); m_editInfo.import("message", message); @@ -2771,6 +2990,7 @@ bool EditorToolkitNeume::Ungroup(std::string groupType, std::vector ListOfObjects syllables; // List of syllables used. groupType=neume only. jsonxx::Array uuidArray; + bool breakOnEnd = false; // Check if you can get drawing page if (!m_doc->GetDrawingPage()) { @@ -2845,7 +3065,7 @@ bool EditorToolkitNeume::Ungroup(std::string groupType, std::vector } } } - if (el->Is(ACCID) || el->Is(DIVLINE) || el->Is(CLEF)) { + while (el->Is(ACCID) || el->Is(DIVLINE) || el->Is(CLEF)) { fparent = el->GetFirstAncestor(SYLLABLE); sparent = el->GetFirstAncestor(LAYER); if (fparent && sparent) { @@ -2855,10 +3075,15 @@ bool EditorToolkitNeume::Ungroup(std::string groupType, std::vector fparent->ReorderByXPos(); uuidArray << (*it); it = elementIds.erase(it); - if (it == elementIds.end()) break; + if (it == elementIds.end()) { + breakOnEnd = true; + break; + } el = m_doc->GetDrawingPage()->FindDescendantByID(*it); } } + if (breakOnEnd) break; + if (elementIds.begin() == it || firstIsSyl) { // if the element is a syl we want it to stay attached to the first element // we'll still need to initialize all the parents, thus the bool @@ -2960,7 +3185,7 @@ bool EditorToolkitNeume::Ungroup(std::string groupType, std::vector newParent->AddChild(syl); // Create default bounding box if facs - if (m_doc->GetType() == Facs) { + if (m_doc->HasFacsimile()) { Zone *zone = new Zone(); zone->SetUlx(el->GetFirst(NC)->GetFacsimileInterface()->GetZone()->GetUlx()); @@ -3014,6 +3239,8 @@ bool EditorToolkitNeume::Ungroup(std::string groupType, std::vector } } + if (m_doc->IsTranscription() && m_doc->HasFacsimile()) m_doc->SyncFromFacsimileDoc(); + m_editInfo.import("status", "OK"); m_editInfo.import("message", ""); m_editInfo.import("uuid", uuidArray); @@ -3181,7 +3408,6 @@ bool EditorToolkitNeume::ChangeGroup(std::string elementId, std::string contour) } zone->SetUlx(newUlx); zone->SetUly(newUly); - ; zone->SetLrx(newLrx); zone->SetLry(newLry); @@ -3199,6 +3425,9 @@ bool EditorToolkitNeume::ChangeGroup(std::string elementId, std::string contour) initialLry = newLry; prevNc = newNc; } + + if (m_doc->IsTranscription() && m_doc->HasFacsimile()) m_doc->SyncFromFacsimileDoc(); + m_editInfo.import("uuid", el->GetID()); m_editInfo.import("status", "OK"); m_editInfo.import("message", ""); @@ -3210,10 +3439,6 @@ bool EditorToolkitNeume::ToggleLigature(std::vector elementIds) assert(elementIds.size() == 2); bool success1 = false; bool success2 = false; - Facsimile *facsimile = m_doc->GetFacsimile(); - assert(facsimile); - Surface *surface = vrv_cast(facsimile->FindDescendantByType(SURFACE)); - assert(surface); std::string firstNcId = elementIds[0]; std::string secondNcId = elementIds[1]; // Check if you can get drawing page @@ -3239,77 +3464,67 @@ bool EditorToolkitNeume::ToggleLigature(std::vector elementIds) return false; } - bool isLigature; + bool isLigature = false; if (firstNc->HasAttribute("ligated", "true") && secondNc->HasAttribute("ligated", "true")) { isLigature = true; } else { - isLigature = false; - Set(firstNc->GetID(), "tilt", ""); - Set(secondNc->GetID(), "tilt", ""); - Set(firstNc->GetID(), "curve", ""); - Set(secondNc->GetID(), "curve", ""); + Set(firstNcId, "tilt", ""); + Set(secondNcId, "tilt", ""); + Set(firstNcId, "curve", ""); + Set(secondNcId, "curve", ""); } - Zone *zone = new Zone(); - // set ligature to false and update zone of second Nc - if (isLigature) { - if (AttModule::SetNeumes(firstNc, "ligated", "false")) success1 = true; - - int ligUlx = firstNc->GetZone()->GetUlx(); - int ligUly = firstNc->GetZone()->GetUly(); - int ligLrx = firstNc->GetZone()->GetLrx(); - int ligLry = firstNc->GetZone()->GetLry(); + Zone *firstNcZone = firstNc->GetZone(); + Zone *secondNcZone = secondNc->GetZone(); - Staff *staff = dynamic_cast(firstNc->GetFirstAncestor(STAFF)); - assert(staff); + int ligUlx = firstNcZone->GetUlx(); + int ligUly = firstNcZone->GetUly(); + int ligLrx = firstNcZone->GetLrx(); + int ligLry = firstNcZone->GetLry(); - const int noteHeight - = (int)(m_doc->GetDrawingDoubleUnit(staff->m_drawingStaffSize) / NOTE_HEIGHT_TO_STAFF_SIZE_RATIO); - const int noteWidth - = (int)(m_doc->GetDrawingDoubleUnit(staff->m_drawingStaffSize) / NOTE_WIDTH_TO_STAFF_SIZE_RATIO); + Staff *staff = dynamic_cast(firstNc->GetFirstAncestor(STAFF)); + assert(staff); + const int noteHeight + = (int)(m_doc->GetDrawingDoubleUnit(staff->m_drawingStaffSize) / NOTE_HEIGHT_TO_STAFF_SIZE_RATIO); + const int noteWidth + = (int)(m_doc->GetDrawingDoubleUnit(staff->m_drawingStaffSize) / NOTE_WIDTH_TO_STAFF_SIZE_RATIO); - zone->SetUlx(ligUlx + noteWidth); - zone->SetUly(ligUly + noteHeight); - zone->SetLrx(ligLrx + noteWidth); - zone->SetLry(ligLry + noteHeight); + // set ligature to false and update zone of second Nc + if (isLigature) { + if (Set(firstNcId, "ligated", "false")) success1 = true; - secondNc->AttachZone(zone); + secondNcZone->SetUlx(ligUlx + noteWidth); + secondNcZone->SetUly(ligUly + noteHeight); + secondNcZone->SetLrx(ligLrx + noteWidth); + secondNcZone->SetLry(ligLry + noteHeight); - if (AttModule::SetNeumes(secondNc, "ligated", "false")) success2 = true; + if (Set(secondNcId, "ligated", "false")) success2 = true; } // set ligature to true and update zones to be the same - else if (!isLigature) { - if (AttModule::SetNeumes(firstNc, "ligated", "true")) success1 = true; - - zone->SetUlx(firstNc->GetZone()->GetUlx()); - zone->SetUly(firstNc->GetZone()->GetUly()); - zone->SetLrx(firstNc->GetZone()->GetLrx()); - zone->SetLry(firstNc->GetZone()->GetLry()); + else { + if (Set(firstNcId, "ligated", "true")) success1 = true; - secondNc->AttachZone(zone); + secondNcZone->SetUlx(ligUlx); + secondNcZone->SetUly(ligUly + noteHeight); + secondNcZone->SetLrx(ligLrx); + secondNcZone->SetLry(ligLry + noteHeight); - if (AttModule::SetNeumes(secondNc, "ligated", "true")) success2 = true; - } - // else { - // LogError("isLigature is invalid!"); - // m_editInfo.import("status", "FAILURE"); - // m_editInfo.import("message", "isLigature value '" + isLigature + "' is invalid."); - // return false; - // } - if (success1 && success2 && m_doc->GetType() != Facs) { - m_doc->PrepareData(); - m_doc->GetDrawingPage()->LayOut(true); + if (Set(secondNcId, "ligated", "true")) success2 = true; } - m_editInfo.import("status", "OK"); - m_editInfo.import("message", ""); + if (!(success1 && success2)) { LogWarning("Unable to update ligature attribute"); m_editInfo.import("message", "Unable to update ligature attribute."); m_editInfo.import("status", "WARNING"); + return false; } - surface->AddChild(zone); + m_doc->GetDrawingPage()->LayOutTranscription(true); + if (m_doc->IsTranscription() && m_doc->HasFacsimile()) m_doc->SyncFromFacsimileDoc(); + + m_editInfo.import("status", "OK"); + m_editInfo.import("message", ""); return success1 && success2; } @@ -3322,7 +3537,7 @@ bool EditorToolkitNeume::ChangeStaff(std::string elementId) return false; } - if (m_doc->GetType() != Facs) { + if (!m_doc->HasFacsimile()) { LogWarning("Staff re-association is only available in facsimile mode."); m_editInfo.import("status", "FAILURE"); m_editInfo.import("message", "Staff re-association is only available in facsimile mode."); @@ -3527,7 +3742,7 @@ bool EditorToolkitNeume::ChangeStaffTo(std::string elementId, std::string staffI return false; } - if (m_doc->GetType() != Facs) { + if (!m_doc->HasFacsimile()) { LogWarning("Staff re-association is only available in facsimile mode."); m_editInfo.import("status", "FAILURE"); m_editInfo.import("message", "Staff re-association is only available in facsimile mode."); @@ -3845,6 +4060,21 @@ bool EditorToolkitNeume::ParseSetClefAction(jsonxx::Object param, std::string *e return true; } +bool EditorToolkitNeume::ParseSetLiquescentAction(jsonxx::Object param, std::string *elementId, std::string *curve) +{ + if (!param.has("elementId")) { + LogWarning("Could not parse 'elementId'"); + return false; + } + *elementId = param.get("elementId"); + if (!param.has("curve")) { + LogWarning("Could not parse 'curve'"); + return false; + } + *curve = param.get("curve"); + return true; +} + bool EditorToolkitNeume::ParseRemoveAction(jsonxx::Object param, std::string *elementId) { if (!param.has("elementId")) return false; @@ -4022,17 +4252,22 @@ bool EditorToolkitNeume::AdjustPitchFromPosition(Object *obj, Clef *clef) } pi->SetOct(3); + // The default octave = 3, but the actual octave is calculated by + // taking into account the displacement of the clef + int octave = 3; + if (clef->GetDis() && clef->GetDisPlace()) { + octave += (clef->GetDisPlace() == STAFFREL_basic_above ? 1 : -1) * (clef->GetDis() / 7); + } + pi->SetOct(octave); + const int staffSize = m_doc->GetDrawingUnit(staff->m_drawingStaffSize); - // Use the same pitchDifference equation for both syllables and custos const int pitchDifference - = round((double)(staff->GetDrawingY() + (2 * staffSize * (staff->m_drawingLines - clef->GetLine())) - - fi->GetZone()->GetUly() - - ((fi->GetZone()->GetUlx() - staff->GetZone()->GetUlx()) - * tan(-staff->GetDrawingRotate() * M_PI / 180.0))) + = round((double)((staff->GetDrawingY() + - staff->GetDrawingRotationOffsetFor(m_view->ToLogicalX(fi->GetZone()->GetUlx())) + - m_view->ToLogicalY(fi->GetZone()->GetUly()))) / (double)(staffSize)); - - pi->AdjustPitchByOffset(pitchDifference); + pi->AdjustPitchByOffset(-pitchDifference); return true; } @@ -4074,6 +4309,8 @@ bool EditorToolkitNeume::AdjustPitchFromPosition(Object *obj, Clef *clef) const int staffSize = m_doc->GetDrawingUnit(staff->m_drawingStaffSize); for (auto it = pitchedChildren.begin(); it != pitchedChildren.end(); ++it) { + if ((*it)->Is(LIQUESCENT)) continue; + FacsimileInterface *fi = (*it)->GetFacsimileInterface(); if (fi == NULL || !fi->HasFacs()) { LogError("Could not adjust pitch: child %s does not have facsimile data", (*it)->GetID().c_str()); @@ -4092,15 +4329,12 @@ bool EditorToolkitNeume::AdjustPitchFromPosition(Object *obj, Clef *clef) } pi->SetOct(octave); - // Use the same pitchDifference equation for both syllables and custos const int pitchDifference - = round((double)(staff->GetDrawingY() + (2 * staffSize * (staff->m_drawingLines - clef->GetLine())) - - fi->GetZone()->GetUly() - - ((fi->GetZone()->GetUlx() - staff->GetZone()->GetUlx()) - * tan(-staff->GetDrawingRotate() * M_PI / 180.0))) + = round((double)((staff->GetDrawingY() + - staff->GetDrawingRotationOffsetFor(m_view->ToLogicalX(fi->GetZone()->GetUlx())) + - m_view->ToLogicalY(fi->GetZone()->GetUly()))) / (double)(staffSize)); - - pi->AdjustPitchByOffset(pitchDifference); + pi->AdjustPitchByOffset(-pitchDifference); } return true; diff --git a/src/facsimilefunctor.cpp b/src/facsimilefunctor.cpp index 73ec1ef23ca..f70d6804d9c 100644 --- a/src/facsimilefunctor.cpp +++ b/src/facsimilefunctor.cpp @@ -12,6 +12,7 @@ #include "doc.h" #include "layerelement.h" #include "measure.h" +#include "miscfunctor.h" #include "page.h" #include "pb.h" #include "sb.h" @@ -39,42 +40,80 @@ SyncFromFacsimileFunctor::SyncFromFacsimileFunctor(Doc *doc) : Functor() FunctorCode SyncFromFacsimileFunctor::VisitLayerElement(LayerElement *layerElement) { - if (!layerElement->Is({ NOTE, REST })) return FUNCTOR_CONTINUE; + if (!layerElement->Is({ ACCID, CLEF, CUSTOS, DIVLINE, LIQUESCENT, NC, NOTE, REST, SYL })) return FUNCTOR_CONTINUE; Zone *zone = layerElement->GetZone(); assert(zone); layerElement->m_drawingFacsX = m_view.ToLogicalX(zone->GetUlx() * DEFINITION_FACTOR); + if (layerElement->Is({ ACCID, SYL })) { + layerElement->m_drawingFacsY = m_view.ToLogicalY(zone->GetUly() * DEFINITION_FACTOR); + } return FUNCTOR_CONTINUE; } FunctorCode SyncFromFacsimileFunctor::VisitMeasure(Measure *measure) { - Zone *zone = measure->GetZone(); - assert(zone); - measure->m_drawingFacsX1 = m_view.ToLogicalX(zone->GetUlx() * DEFINITION_FACTOR); - measure->m_drawingFacsX2 = m_view.ToLogicalX(zone->GetLrx() * DEFINITION_FACTOR); + // neon specific code - measure have no zone, we will use the staff one in VisitStaff + if (measure->IsNeumeLine()) { + m_currentNeumeLine = measure; + } + else { + Zone *zone = measure->GetZone(); + assert(zone); + measure->m_drawingFacsX1 = m_view.ToLogicalX(zone->GetUlx() * DEFINITION_FACTOR); + measure->m_drawingFacsX2 = m_view.ToLogicalX(zone->GetLrx() * DEFINITION_FACTOR); + } return FUNCTOR_CONTINUE; } FunctorCode SyncFromFacsimileFunctor::VisitPage(Page *page) { + m_staffZones.clear(); m_currentPage = page; m_doc->SetDrawingPage(m_currentPage->GetIdx()); return FUNCTOR_CONTINUE; } +FunctorCode SyncFromFacsimileFunctor::VisitPageEnd(Page *page) +{ + // Used for adjusting staff size in neon - filled in VisitStaff + if (m_staffZones.empty()) return FUNCTOR_CONTINUE; + + // The staff size is calculated based on the zone height and takes into acocunt the rotation + for (auto &[staff, zone] : m_staffZones) { + double rotate = (zone->HasRotate()) ? zone->GetRotate() : 0.0; + int yDiff + = zone->GetLry() - zone->GetUly() - (zone->GetLrx() - zone->GetUlx()) * tan(abs(rotate) * M_PI / 180.0); + staff->m_drawingStaffSize + = 100 * yDiff / (m_doc->GetOptions()->m_unit.GetValue() * 2 * (staff->m_drawingLines - 1)); + staff->SetDrawingRotation(rotate); + } + + // Since we multiply all values by the DEFINITION_FACTOR, set it as PPU + m_currentPage->SetPPUFactor(DEFINITION_FACTOR); + if (m_currentPage->GetPPUFactor() != 1.0) { + ApplyPPUFactorFunctor applyPPUFactor; + m_currentPage->Process(applyPPUFactor); + m_doc->UpdatePageDrawingSizes(); + } + + return FUNCTOR_CONTINUE; +} + FunctorCode SyncFromFacsimileFunctor::VisitPb(Pb *pb) { // This would happen if we run the functor on data not converted to page-based assert(m_currentPage); Zone *zone = pb->GetZone(); - assert(zone && zone->GetParent()); - Surface *surface = (zone->GetParent()->Is(SURFACE)) ? vrv_cast(zone->GetParent()) : NULL; - // Use the parent surface attributes if given + Surface *surface = pb->GetSurface(); + if (!surface && zone && zone->GetParent()) + surface = (zone->GetParent()->Is(SURFACE)) ? vrv_cast(zone->GetParent()) : NULL; + assert(zone || surface); + // Use the (parent) surface attributes if given if (surface && surface->HasLrx() && surface->HasLry()) { m_currentPage->m_pageHeight = surface->GetLry() * DEFINITION_FACTOR; m_currentPage->m_pageWidth = surface->GetLrx() * DEFINITION_FACTOR; @@ -109,12 +148,27 @@ FunctorCode SyncFromFacsimileFunctor::VisitStaff(Staff *staff) assert(zone); staff->m_drawingFacsY = m_view.ToLogicalY(zone->GetUly() * DEFINITION_FACTOR); + // neon specific code - set the position of the pseudo measure (neume line) + if (m_currentNeumeLine) { + m_currentNeumeLine->m_drawingFacsX1 = m_view.ToLogicalX(zone->GetUlx() * DEFINITION_FACTOR); + m_currentNeumeLine->m_drawingFacsX2 = m_view.ToLogicalX(zone->GetLrx() * DEFINITION_FACTOR); + m_staffZones[staff] = zone; + + // The staff slope is going up. The y left position needs to be adjusted accordingly + if (zone->GetRotate() < 0) { + staff->m_drawingFacsY = staff->m_drawingFacsY + + (m_currentNeumeLine->m_drawingFacsX2 - m_currentNeumeLine->m_drawingFacsX1) + * tan(zone->GetRotate() * M_PI / 180.0); + } + } + return FUNCTOR_CONTINUE; } FunctorCode SyncFromFacsimileFunctor::VisitSystem(System *system) { m_currentSystem = system; + m_currentNeumeLine = NULL; return FUNCTOR_CONTINUE; } @@ -136,10 +190,13 @@ SyncToFacsimileFunctor::SyncToFacsimileFunctor(Doc *doc) : Functor() FunctorCode SyncToFacsimileFunctor::VisitLayerElement(LayerElement *layerElement) { - if (!layerElement->Is({ NOTE, REST })) return FUNCTOR_CONTINUE; + if (!layerElement->Is({ ACCID, CLEF, CUSTOS, DIVLINE, LIQUESCENT, NC, NOTE, REST, SYL })) return FUNCTOR_CONTINUE; Zone *zone = this->GetZone(layerElement, layerElement->GetClassName()); zone->SetUlx(m_view.ToDeviceContextX(layerElement->GetDrawingX()) / DEFINITION_FACTOR + m_pageMarginLeft); + if (layerElement->Is({ ACCID, SYL })) { + zone->SetUly(m_view.ToDeviceContextY(layerElement->GetDrawingY()) / DEFINITION_FACTOR + m_pageMarginTop); + } return FUNCTOR_CONTINUE; } diff --git a/src/filereader.cpp b/src/filereader.cpp index 2ae6dfc9659..c6ac259d1fa 100644 --- a/src/filereader.cpp +++ b/src/filereader.cpp @@ -54,7 +54,7 @@ bool ZipFileReader::Load(const std::string &filename) data = data.substr(data.find("base64,") + 7); } std::vector bytes = Base64Decode(data); - return this->Load(bytes); + return this->LoadBytes(bytes); #else std::ifstream fin(filename.c_str(), std::ios::in | std::ios::binary); if (!fin.is_open()) { @@ -74,11 +74,11 @@ bool ZipFileReader::Load(const std::string &filename) while (fin.read((char *)&buffer, sizeof(unsigned char))) { bytes.push_back(buffer); } - return this->Load(bytes); + return this->LoadBytes(bytes); #endif } -bool ZipFileReader::Load(const std::vector &bytes) +bool ZipFileReader::LoadBytes(const std::vector &bytes) { this->Reset(); diff --git a/src/findfunctor.cpp b/src/findfunctor.cpp index 7efa54ad70e..b2e2da43b44 100644 --- a/src/findfunctor.cpp +++ b/src/findfunctor.cpp @@ -13,6 +13,7 @@ #include "layer.h" #include "object.h" #include "plistinterface.h" +#include "score.h" namespace vrv { @@ -334,6 +335,18 @@ FunctorCode FindElementInLayerStaffDefFunctor::VisitLayer(const Layer *layer) return m_element ? FUNCTOR_STOP : FUNCTOR_SIBLINGS; } +FunctorCode FindElementInLayerStaffDefFunctor::VisitScore(const Score *score) +{ + if (score->GetScoreDef()->GetID() == m_id) { + m_element = score->GetScoreDef(); + } + else { + m_element = score->GetScoreDef()->FindDescendantByID(m_id); + } + + return (m_element) ? FUNCTOR_STOP : FUNCTOR_CONTINUE; +} + //---------------------------------------------------------------------------- // AddToFlatListFunctor //---------------------------------------------------------------------------- diff --git a/src/hum/humlib.cpp b/src/hum/humlib.cpp index 74d086f6ac6..ed7780c0419 100644 --- a/src/hum/humlib.cpp +++ b/src/hum/humlib.cpp @@ -1,7 +1,7 @@ // // Programmer: Craig Stuart Sapp // Creation Date: Sat Aug 8 12:24:49 PDT 2015 -// Last Modified: Tue Dec 12 11:01:04 PST 2023 +// Last Modified: Sun Sep 8 23:07:16 PDT 2024 // Filename: min/humlib.cpp // URL: https://github.com/craigsapp/humlib/blob/master/min/humlib.cpp // Syntax: C++11 @@ -1148,6 +1148,162 @@ string Convert::kernToRecip(HTp token) { +////////////////////////////// +// +// Convert::kernKeyToNumber -- convert a kern key signature into an integer. +// For example: *k[f#] == +1, *k[b-e-] == -2, *k[] == 0 +// Input string is expected to be in the form *k[] with the +// accidentals inside the brackets with no spaces. +// + +int Convert::kernKeyToNumber(const string& aKernString) { + int count = 0; + int length = (int)aKernString.size(); + int start = 0; + int sign = 1; + + if ((length == 0) || (aKernString.find("[]") != std::string::npos)) { + return 0; + } + + for (int i=0; i= (int)aKernString.size()) { + // no rhythm data found + return zero; + } + + // should now be at start of kern rhythm + int orhythm = 0; + while ((index < (int)aKernString.size()) && isdigit(aKernString[index])) { + orhythm *= 10; + orhythm += aKernString[index] - '0'; + index++; + } + + HumNum oduration(0,1); + if ((aKernString.find('0') != std::string::npos) && + (aKernString.find('1') == std::string::npos) && + (aKernString.find('2') == std::string::npos) && + (aKernString.find('3') == std::string::npos) && + (aKernString.find('4') == std::string::npos) && + (aKernString.find('5') == std::string::npos) && + (aKernString.find('6') == std::string::npos) && + (aKernString.find('7') == std::string::npos) && + (aKernString.find('8') == std::string::npos) && + (aKernString.find('9') == std::string::npos) ) { + if (aKernString.find("0000000000") != std::string::npos) { // exotic rhythm + oduration = 4096; + } else if (aKernString.find("000000000") != std::string::npos) { // exotic rhythm + oduration = 2048; + } else if (aKernString.find("00000000") != std::string::npos) { // exotic rhythm + oduration = 1024; + } else if (aKernString.find("0000000") != std::string::npos) { // exotic rhythm + oduration = 512; + } else if (aKernString.find("000000") != std::string::npos) { // exotic rhythm + oduration = 256; + } else if (aKernString.find("00000") != std::string::npos) { // exotic rhythm + oduration = 128; + } else if (aKernString.find("0000") != std::string::npos) { // exotic rhythm + oduration = 64; + } else if (aKernString.find("000") != std::string::npos) { // 000 = maxima + oduration = 32; + } else if (aKernString.find("00") != std::string::npos) { // 00 = long + oduration = 16; + } else { // 0 == breve + oduration = 8; + } + + } else { + // now know everything to create a duration + if (orhythm == 0) { + oduration = 8; + } else { + oduration = 4; + oduration /= orhythm; + } + } + + HumNum duration = oduration; + for (int i=0; i 0 + case 1: output = 2; break; // 1 = D -> 2 + case 2: output = 4; break; // 2 = E -> 4 + case 3: output = 5; break; // 3 = F -> 5 + case 4: output = 7; break; // 4 = G -> 7 + case 5: output = 9; break; // 5 = A -> 9 + case 6: output = 11; break; // 6 = B -> 11 + default: output = 0; + } + // need to add 1 to octave since C4 is MIDI note 60 which is 5 * 12: + return output + 12 * (octave+1) + alter; +} + + + ////////////////////////////// // // Convert::kernToStaffLocation -- 0 = bottom line of staff, 1 = next space higher, @@ -3717,6 +3906,143 @@ int Convert::kernToStaffLocation(const string& token, const string& clef) { +////////////////////////////// +// +// Convert::base12ToKern -- Convert MIDI note numbers to Kern pitches. +// It might be nice to also add a reference key to minimize +// diatonic pitch errors (for example 61 in A-flat major is probably +// a D-flat, but in B-major it is probably a C-sharp. +// + +string Convert::base12ToKern(int aPitch) { + int octave = aPitch / 12 - 1; + if (octave > 12 || octave < -1) { + cerr << "Error: unreasonable octave value: " << octave << endl; + cerr << "For base-12 input pitch " << aPitch << endl; + return "c"; + } + int chroma = aPitch % 12; + string output; + + switch (chroma) { + case 0: output = "c"; break; + case 1: output = "c#"; break; + case 2: output = "d"; break; + case 3: output = "e-"; break; + case 4: output = "e"; break; + case 5: output = "f"; break; + case 6: output = "f#"; break; + case 7: output = "g"; break; + case 8: output = "g#"; break; + case 9: output = "a"; break; + case 10: output = "b-"; break; + case 11: output = "b"; break; + } + + if (octave >= 4) { + output[0] = std::tolower(output[0]); + } else { + output[0] = std::toupper(output[0]); + } + int repeat = 0; + switch (octave) { + case 4: repeat = 0; break; + case 5: repeat = 1; break; + case 6: repeat = 2; break; + case 7: repeat = 3; break; + case 8: repeat = 4; break; + case 9: repeat = 5; break; + case 3: repeat = 0; break; + case 2: repeat = 1; break; + case 1: repeat = 2; break; + case 0: repeat = 3; break; + case -1: repeat = 4; break; + default: + cerr << "Error: unknown octave value: " << octave << endl; + cerr << "for base-12 pitch: " << aPitch << endl; + return "c"; + } + if (repeat == 0) { + return output; + } + + string rstring; + for (int i=0; i 12 || octave < -1) { + cerr << "Error: unreasonable octave value: " << octave << endl; + cerr << "For base-12 input pitch: " << aPitch << endl; + return "C4"; + } + int chroma = aPitch % 12; + string output; + switch (chroma) { + case 0: output = "C"; break; + case 1: output = "C#"; break; + case 2: output = "D"; break; + case 3: output = "E-"; break; + case 4: output = "E"; break; + case 5: output = "F"; break; + case 6: output = "F#"; break; + case 7: output = "G"; break; + case 8: output = "G#"; break; + case 9: output = "A"; break; + case 10: output = "B-"; break; + case 11: output = "B"; break; + } + output += to_string(octave); + return output; +} + + + +////////////////////////////// +// +// Convert::base12ToBase40 -- assume fixed accidentals. +// + +int Convert::base12ToBase40(int aPitch) { + int octave = aPitch / 12 - 1; + int chroma = aPitch % 12; + + int output = 0; + switch (chroma) { + case 0: output = 2; break; // 0 = C + case 1: output = 3; break; // 1 = C# + case 2: output = 8; break; // 2 = D + case 3: output = 13; break; // 3 = E- + case 4: output = 14; break; // 4 = E + case 5: output = 19; break; // 5 = F + case 6: output = 20; break; // 6 = F# + case 7: output = 25; break; // 7 = G + case 8: output = 30; break; // 8 = A- + case 9: output = 31; break; // 9 = A + case 10: output = 36; break; // 10 = B- + case 11: output = 37; break; // 11 = B + default: output = 2; break; // give up and set to C + } + output = output + 40 * octave; + return output; +} + @@ -3929,721 +4255,721 @@ string Convert::getLanguageName(const string& abbreviation) { if (abbreviation[i] == '@') { continue; } - code.push_back(tolower(abbreviation[i])); + code.push_back(toupper(abbreviation[i])); } if (code.size() == 2) { // ISO 639-1 language codes - if (code == "aa") { return "Afar"; } - if (code == "ab") { return "Abkhazian"; } - if (code == "ae") { return "Avestan"; } - if (code == "af") { return "Afrikaans"; } - if (code == "ak") { return "Akan"; } - if (code == "am") { return "Amharic"; } - if (code == "an") { return "Aragonese"; } - if (code == "ar") { return "Arabic"; } - if (code == "as") { return "Assamese"; } - if (code == "av") { return "Avaric"; } - if (code == "ay") { return "Aymara"; } - if (code == "az") { return "Azerbaijani"; } - if (code == "ba") { return "Bashkir"; } - if (code == "be") { return "Belarusian"; } - if (code == "bg") { return "Bulgarian"; } - if (code == "bh") { return "Bihari languages"; } - if (code == "bi") { return "Bislama"; } - if (code == "bm") { return "Bambara"; } - if (code == "bn") { return "Bengali"; } - if (code == "bo") { return "Tibetan"; } - if (code == "br") { return "Breton"; } - if (code == "bs") { return "Bosnian"; } - if (code == "ca") { return "Catalan"; } - if (code == "ce") { return "Chechen"; } - if (code == "ch") { return "Chamorro"; } - if (code == "co") { return "Corsican"; } - if (code == "cr") { return "Cree"; } - if (code == "cs") { return "Czech"; } - if (code == "cs") { return "Czech"; } - if (code == "cu") { return "Church Slavic"; } - if (code == "cv") { return "Chuvash"; } - if (code == "cy") { return "Welsh"; } - if (code == "cy") { return "Welsh"; } - if (code == "da") { return "Danish"; } - if (code == "de") { return "German"; } - if (code == "dv") { return "Divehi"; } - if (code == "dz") { return "Dzongkha"; } - if (code == "ee") { return "Ewe"; } - if (code == "el") { return "Greek, Modern (1453-)"; } - if (code == "en") { return "English"; } - if (code == "eo") { return "Esperanto"; } - if (code == "es") { return "Spanish"; } - if (code == "et") { return "Estonian"; } - if (code == "eu") { return "Basque"; } - if (code == "eu") { return "Basque"; } - if (code == "fa") { return "Persian"; } - if (code == "ff") { return "Fulah"; } - if (code == "fi") { return "Finnish"; } - if (code == "fj") { return "Fijian"; } - if (code == "fo") { return "Faroese"; } - if (code == "fr") { return "French"; } - if (code == "fy") { return "Western Frisian"; } - if (code == "ga") { return "Irish"; } - if (code == "gd") { return "Gaelic"; } - if (code == "gl") { return "Galician"; } - if (code == "gn") { return "Guarani"; } - if (code == "gu") { return "Gujarati"; } - if (code == "gv") { return "Manx"; } - if (code == "ha") { return "Hausa"; } - if (code == "he") { return "Hebrew"; } - if (code == "hi") { return "Hindi"; } - if (code == "ho") { return "Hiri Motu"; } - if (code == "hr") { return "Croatian"; } - if (code == "ht") { return "Haitian"; } - if (code == "hu") { return "Hungarian"; } - if (code == "hy") { return "Armenian"; } - if (code == "hz") { return "Herero"; } - if (code == "ia") { return "Interlingua"; } - if (code == "id") { return "Indonesian"; } - if (code == "ie") { return "Interlingue"; } - if (code == "ig") { return "Igbo"; } - if (code == "ii") { return "Sichuan Yi"; } - if (code == "ik") { return "Inupiaq"; } - if (code == "io") { return "Ido"; } - if (code == "is") { return "Icelandic"; } - if (code == "it") { return "Italian"; } - if (code == "iu") { return "Inuktitut"; } - if (code == "ja") { return "Japanese"; } - if (code == "jv") { return "Javanese"; } - if (code == "ka") { return "Georgian"; } - if (code == "kg") { return "Kongo"; } - if (code == "ki") { return "Kikuyu"; } - if (code == "kj") { return "Kuanyama"; } - if (code == "kk") { return "Kazakh"; } - if (code == "kl") { return "Greenlandic"; } - if (code == "km") { return "Central Khmer"; } - if (code == "kn") { return "Kannada"; } - if (code == "ko") { return "Korean"; } - if (code == "kr") { return "Kanuri"; } - if (code == "ks") { return "Kashmiri"; } - if (code == "ku") { return "Kurdish"; } - if (code == "kv") { return "Komi"; } - if (code == "kw") { return "Cornish"; } - if (code == "ky") { return "Kirghiz"; } - if (code == "la") { return "Latin"; } - if (code == "lb") { return "Luxembourgish"; } - if (code == "lg") { return "Ganda"; } - if (code == "li") { return "Limburgan"; } - if (code == "ln") { return "Lingala"; } - if (code == "lo") { return "Lao"; } - if (code == "lt") { return "Lithuanian"; } - if (code == "lu") { return "Luba-Katanga"; } - if (code == "lv") { return "Latvian"; } - if (code == "mg") { return "Malagasy"; } - if (code == "mh") { return "Marshallese"; } - if (code == "mi") { return "Maori"; } - if (code == "mk") { return "Macedonian"; } - if (code == "mk") { return "Macedonian"; } - if (code == "ml") { return "Malayalam"; } - if (code == "mn") { return "Mongolian"; } - if (code == "mr") { return "Marathi"; } - if (code == "ms") { return "Malay"; } - if (code == "mt") { return "Maltese"; } - if (code == "my") { return "Burmese"; } - if (code == "my") { return "Burmese"; } - if (code == "na") { return "Nauru"; } - if (code == "nb") { return "Bokmål, Norwegian"; } - if (code == "nd") { return "Ndebele, North"; } - if (code == "ne") { return "Nepali"; } - if (code == "ng") { return "Ndonga"; } - if (code == "nl") { return "Dutch"; } - if (code == "nl") { return "Dutch"; } - if (code == "nn") { return "Norwegian Nynorsk"; } - if (code == "no") { return "Norwegian"; } - if (code == "nr") { return "Ndebele, South"; } - if (code == "nv") { return "Navajo"; } - if (code == "ny") { return "Chichewa"; } - if (code == "oc") { return "Occitan (post 1500)"; } - if (code == "oj") { return "Ojibwa"; } - if (code == "om") { return "Oromo"; } - if (code == "or") { return "Oriya"; } - if (code == "os") { return "Ossetian"; } - if (code == "pa") { return "Panjabi"; } - if (code == "pi") { return "Pali"; } - if (code == "pl") { return "Polish"; } - if (code == "ps") { return "Pushto"; } - if (code == "pt") { return "Portuguese"; } - if (code == "qu") { return "Quechua"; } - if (code == "rm") { return "Romansh"; } - if (code == "rn") { return "Rundi"; } - if (code == "ro") { return "Romanian"; } - if (code == "ru") { return "Russian"; } - if (code == "rw") { return "Kinyarwanda"; } - if (code == "sa") { return "Sanskrit"; } - if (code == "sc") { return "Sardinian"; } - if (code == "sd") { return "Sindhi"; } - if (code == "se") { return "Northern Sami"; } - if (code == "sg") { return "Sango"; } - if (code == "si") { return "Sinhala"; } - if (code == "sl") { return "Slovenian"; } - if (code == "sm") { return "Samoan"; } - if (code == "sn") { return "Shona"; } - if (code == "so") { return "Somali"; } - if (code == "sq") { return "Albanian"; } - if (code == "sr") { return "Serbian"; } - if (code == "ss") { return "Swati"; } - if (code == "st") { return "Sotho, Southern"; } - if (code == "su") { return "Sundanese"; } - if (code == "sv") { return "Swedish"; } - if (code == "sw") { return "Swahili"; } - if (code == "ta") { return "Tamil"; } - if (code == "te") { return "Telugu"; } - if (code == "tg") { return "Tajik"; } - if (code == "th") { return "Thai"; } - if (code == "ti") { return "Tigrinya"; } - if (code == "tk") { return "Turkmen"; } - if (code == "tl") { return "Tagalog"; } - if (code == "tn") { return "Tswana"; } - if (code == "to") { return "Tonga (Tonga Islands)"; } - if (code == "tr") { return "Turkish"; } - if (code == "ts") { return "Tsonga"; } - if (code == "tt") { return "Tatar"; } - if (code == "tw") { return "Twi"; } - if (code == "ty") { return "Tahitian"; } - if (code == "ug") { return "Uighur"; } - if (code == "uk") { return "Ukrainian"; } - if (code == "ur") { return "Urdu"; } - if (code == "uz") { return "Uzbek"; } - if (code == "ve") { return "Venda"; } - if (code == "vi") { return "Vietnamese"; } - if (code == "vo") { return "Volapük"; } - if (code == "wa") { return "Walloon"; } - if (code == "wo") { return "Wolof"; } - if (code == "xh") { return "Xhosa"; } - if (code == "yi") { return "Yiddish"; } - if (code == "yo") { return "Yoruba"; } - if (code == "za") { return "Zhuang"; } - if (code == "zh") { return "Chinese"; } - if (code == "zu") { return "Zulu"; } + if (code == "AA") { return "Afar"; } + if (code == "AB") { return "Abkhazian"; } + if (code == "AE") { return "Avestan"; } + if (code == "AF") { return "Afrikaans"; } + if (code == "AK") { return "Akan"; } + if (code == "AM") { return "Amharic"; } + if (code == "AN") { return "Aragonese"; } + if (code == "AR") { return "Arabic"; } + if (code == "AS") { return "Assamese"; } + if (code == "AV") { return "Avaric"; } + if (code == "AY") { return "Aymara"; } + if (code == "AZ") { return "Azerbaijani"; } + if (code == "BA") { return "Bashkir"; } + if (code == "BE") { return "Belarusian"; } + if (code == "BG") { return "Bulgarian"; } + if (code == "BH") { return "Bihari languages"; } + if (code == "BI") { return "Bislama"; } + if (code == "BM") { return "Bambara"; } + if (code == "BN") { return "Bengali"; } + if (code == "BO") { return "Tibetan"; } + if (code == "BR") { return "Breton"; } + if (code == "BS") { return "Bosnian"; } + if (code == "CA") { return "Catalan"; } + if (code == "CE") { return "Chechen"; } + if (code == "CH") { return "Chamorro"; } + if (code == "CO") { return "Corsican"; } + if (code == "CR") { return "Cree"; } + if (code == "CS") { return "Czech"; } + if (code == "CS") { return "Czech"; } + if (code == "CU") { return "Church Slavic"; } + if (code == "CV") { return "Chuvash"; } + if (code == "CY") { return "Welsh"; } + if (code == "CY") { return "Welsh"; } + if (code == "DA") { return "Danish"; } + if (code == "DE") { return "German"; } + if (code == "DV") { return "Divehi"; } + if (code == "DZ") { return "Dzongkha"; } + if (code == "EE") { return "Ewe"; } + if (code == "EL") { return "Greek, Modern (1453-)"; } + if (code == "EN") { return "English"; } + if (code == "EO") { return "Esperanto"; } + if (code == "ES") { return "Spanish"; } + if (code == "ET") { return "Estonian"; } + if (code == "EU") { return "Basque"; } + if (code == "EU") { return "Basque"; } + if (code == "FA") { return "Persian"; } + if (code == "FF") { return "Fulah"; } + if (code == "FI") { return "Finnish"; } + if (code == "FJ") { return "Fijian"; } + if (code == "FO") { return "Faroese"; } + if (code == "FR") { return "French"; } + if (code == "FY") { return "Western Frisian"; } + if (code == "GA") { return "Irish"; } + if (code == "GD") { return "Gaelic"; } + if (code == "GL") { return "Galician"; } + if (code == "GN") { return "Guarani"; } + if (code == "GU") { return "Gujarati"; } + if (code == "GV") { return "Manx"; } + if (code == "HA") { return "Hausa"; } + if (code == "HE") { return "Hebrew"; } + if (code == "HI") { return "Hindi"; } + if (code == "HO") { return "Hiri Motu"; } + if (code == "HR") { return "Croatian"; } + if (code == "HT") { return "Haitian"; } + if (code == "HU") { return "Hungarian"; } + if (code == "HY") { return "Armenian"; } + if (code == "HZ") { return "Herero"; } + if (code == "IA") { return "Interlingua"; } + if (code == "ID") { return "Indonesian"; } + if (code == "IE") { return "Interlingue"; } + if (code == "IG") { return "Igbo"; } + if (code == "II") { return "Sichuan Yi"; } + if (code == "IK") { return "Inupiaq"; } + if (code == "IO") { return "Ido"; } + if (code == "IS") { return "Icelandic"; } + if (code == "IT") { return "Italian"; } + if (code == "IU") { return "Inuktitut"; } + if (code == "JA") { return "Japanese"; } + if (code == "JV") { return "Javanese"; } + if (code == "KA") { return "Georgian"; } + if (code == "KG") { return "Kongo"; } + if (code == "KI") { return "Kikuyu"; } + if (code == "KJ") { return "Kuanyama"; } + if (code == "KK") { return "Kazakh"; } + if (code == "KL") { return "Greenlandic"; } + if (code == "KM") { return "Central Khmer"; } + if (code == "KN") { return "Kannada"; } + if (code == "KO") { return "Korean"; } + if (code == "KR") { return "Kanuri"; } + if (code == "KS") { return "Kashmiri"; } + if (code == "KU") { return "Kurdish"; } + if (code == "KV") { return "Komi"; } + if (code == "KW") { return "Cornish"; } + if (code == "KY") { return "Kirghiz"; } + if (code == "LA") { return "Latin"; } + if (code == "LB") { return "Luxembourgish"; } + if (code == "LG") { return "Ganda"; } + if (code == "LI") { return "Limburgan"; } + if (code == "LN") { return "Lingala"; } + if (code == "LO") { return "Lao"; } + if (code == "LT") { return "Lithuanian"; } + if (code == "LU") { return "Luba-Katanga"; } + if (code == "LV") { return "Latvian"; } + if (code == "MG") { return "Malagasy"; } + if (code == "MH") { return "Marshallese"; } + if (code == "MI") { return "Maori"; } + if (code == "MK") { return "Macedonian"; } + if (code == "MK") { return "Macedonian"; } + if (code == "ML") { return "Malayalam"; } + if (code == "MN") { return "Mongolian"; } + if (code == "MR") { return "Marathi"; } + if (code == "MS") { return "Malay"; } + if (code == "MT") { return "Maltese"; } + if (code == "MY") { return "Burmese"; } + if (code == "MY") { return "Burmese"; } + if (code == "NA") { return "Nauru"; } + if (code == "NB") { return "Bokmål, Norwegian"; } + if (code == "ND") { return "Ndebele, North"; } + if (code == "NE") { return "Nepali"; } + if (code == "NG") { return "Ndonga"; } + if (code == "NL") { return "Dutch"; } + if (code == "NL") { return "Dutch"; } + if (code == "NN") { return "Norwegian Nynorsk"; } + if (code == "NO") { return "Norwegian"; } + if (code == "NR") { return "Ndebele, South"; } + if (code == "NV") { return "Navajo"; } + if (code == "NY") { return "Chichewa"; } + if (code == "OC") { return "Occitan (post 1500)"; } + if (code == "OJ") { return "Ojibwa"; } + if (code == "OM") { return "Oromo"; } + if (code == "OR") { return "Oriya"; } + if (code == "OS") { return "Ossetian"; } + if (code == "PA") { return "Panjabi"; } + if (code == "PI") { return "Pali"; } + if (code == "PL") { return "Polish"; } + if (code == "PS") { return "Pushto"; } + if (code == "PT") { return "Portuguese"; } + if (code == "QU") { return "Quechua"; } + if (code == "RM") { return "Romansh"; } + if (code == "RN") { return "Rundi"; } + if (code == "RO") { return "Romanian"; } + if (code == "RU") { return "Russian"; } + if (code == "RW") { return "Kinyarwanda"; } + if (code == "SA") { return "Sanskrit"; } + if (code == "SC") { return "Sardinian"; } + if (code == "SD") { return "Sindhi"; } + if (code == "SE") { return "Northern Sami"; } + if (code == "SG") { return "Sango"; } + if (code == "SI") { return "Sinhala"; } + if (code == "SL") { return "Slovenian"; } + if (code == "SM") { return "Samoan"; } + if (code == "SN") { return "Shona"; } + if (code == "SO") { return "Somali"; } + if (code == "SQ") { return "Albanian"; } + if (code == "SR") { return "Serbian"; } + if (code == "SS") { return "Swati"; } + if (code == "ST") { return "Sotho, Southern"; } + if (code == "SU") { return "Sundanese"; } + if (code == "SV") { return "Swedish"; } + if (code == "SW") { return "Swahili"; } + if (code == "TA") { return "Tamil"; } + if (code == "TE") { return "Telugu"; } + if (code == "TG") { return "Tajik"; } + if (code == "TH") { return "Thai"; } + if (code == "TI") { return "Tigrinya"; } + if (code == "TK") { return "Turkmen"; } + if (code == "TL") { return "Tagalog"; } + if (code == "TN") { return "Tswana"; } + if (code == "TO") { return "Tonga (Tonga Islands)"; } + if (code == "TR") { return "Turkish"; } + if (code == "TS") { return "Tsonga"; } + if (code == "TT") { return "Tatar"; } + if (code == "TW") { return "Twi"; } + if (code == "TY") { return "Tahitian"; } + if (code == "UG") { return "Uighur"; } + if (code == "UK") { return "Ukrainian"; } + if (code == "UR") { return "Urdu"; } + if (code == "UZ") { return "Uzbek"; } + if (code == "VE") { return "Venda"; } + if (code == "VI") { return "Vietnamese"; } + if (code == "VO") { return "Volapük"; } + if (code == "WA") { return "Walloon"; } + if (code == "WO") { return "Wolof"; } + if (code == "XH") { return "Xhosa"; } + if (code == "YI") { return "Yiddish"; } + if (code == "YO") { return "Yoruba"; } + if (code == "ZA") { return "Zhuang"; } + if (code == "ZH") { return "Chinese"; } + if (code == "ZU") { return "Zulu"; } } else if (code.size() == 3) { // ISO 639-2 language codes - if (code == "aar") { return "Afar"; } - if (code == "abk") { return "Abkhazian"; } - if (code == "ace") { return "Achinese"; } - if (code == "ach") { return "Acoli"; } - if (code == "ada") { return "Adangme"; } - if (code == "ady") { return "Adyghe"; } - if (code == "afa") { return "Afro-Asiatic languages"; } - if (code == "afh") { return "Afrihili"; } - if (code == "afr") { return "Afrikaans"; } - if (code == "ain") { return "Ainu"; } - if (code == "aka") { return "Akan"; } - if (code == "akk") { return "Akkadian"; } - if (code == "alb") { return "Albanian"; } - if (code == "ale") { return "Aleut"; } - if (code == "alg") { return "Algonquian languages"; } - if (code == "alt") { return "Southern Altai"; } - if (code == "amh") { return "Amharic"; } - if (code == "ang") { return "English, Old (ca.450-1100)"; } - if (code == "anp") { return "Angika"; } - if (code == "apa") { return "Apache languages"; } - if (code == "ara") { return "Arabic"; } - if (code == "arc") { return "Aramaic (700-300 BCE)"; } - if (code == "arg") { return "Aragonese"; } - if (code == "arm") { return "Armenian"; } - if (code == "arn") { return "Mapudungun"; } - if (code == "arp") { return "Arapaho"; } - if (code == "art") { return "Artificial languages"; } - if (code == "arw") { return "Arawak"; } - if (code == "asm") { return "Assamese"; } - if (code == "ast") { return "Asturian"; } - if (code == "ath") { return "Athapascan languages"; } - if (code == "aus") { return "Australian languages"; } - if (code == "ava") { return "Avaric"; } - if (code == "ave") { return "Avestan"; } - if (code == "awa") { return "Awadhi"; } - if (code == "aym") { return "Aymara"; } - if (code == "aze") { return "Azerbaijani"; } - if (code == "bad") { return "Banda languages"; } - if (code == "bai") { return "Bamileke languages"; } - if (code == "bak") { return "Bashkir"; } - if (code == "bal") { return "Baluchi"; } - if (code == "bam") { return "Bambara"; } - if (code == "ban") { return "Balinese"; } - if (code == "baq") { return "Basque"; } - if (code == "baq") { return "Basque"; } - if (code == "bas") { return "Basa"; } - if (code == "bat") { return "Baltic languages"; } - if (code == "bej") { return "Beja"; } - if (code == "bel") { return "Belarusian"; } - if (code == "bem") { return "Bemba"; } - if (code == "ben") { return "Bengali"; } - if (code == "ber") { return "Berber languages"; } - if (code == "bho") { return "Bhojpuri"; } - if (code == "bih") { return "Bihari languages"; } - if (code == "bik") { return "Bikol"; } - if (code == "bin") { return "Bini"; } - if (code == "bis") { return "Bislama"; } - if (code == "bla") { return "Siksika"; } - if (code == "bnt") { return "Bantu languages"; } - if (code == "bod") { return "Tibetan"; } - if (code == "bos") { return "Bosnian"; } - if (code == "bra") { return "Braj"; } - if (code == "bre") { return "Breton"; } - if (code == "btk") { return "Batak languages"; } - if (code == "bua") { return "Buriat"; } - if (code == "bug") { return "Buginese"; } - if (code == "bul") { return "Bulgarian"; } - if (code == "bur") { return "Burmese"; } - if (code == "bur") { return "Burmese"; } - if (code == "byn") { return "Blin"; } - if (code == "cad") { return "Caddo"; } - if (code == "cai") { return "Central American Indian languages"; } - if (code == "car") { return "Galibi Carib"; } - if (code == "cat") { return "Catalan"; } - if (code == "cau") { return "Caucasian languages"; } - if (code == "ceb") { return "Cebuano"; } - if (code == "cel") { return "Celtic languages"; } - if (code == "ces") { return "Czech"; } - if (code == "ces") { return "Czech"; } - if (code == "cha") { return "Chamorro"; } - if (code == "chb") { return "Chibcha"; } - if (code == "che") { return "Chechen"; } - if (code == "chg") { return "Chagatai"; } - if (code == "chi") { return "Chinese"; } - if (code == "chk") { return "Chuukese"; } - if (code == "chm") { return "Mari"; } - if (code == "chn") { return "Chinook jargon"; } - if (code == "cho") { return "Choctaw"; } - if (code == "chp") { return "Chipewyan"; } - if (code == "chr") { return "Cherokee"; } - if (code == "chu") { return "Church Slavic"; } - if (code == "chv") { return "Chuvash"; } - if (code == "chy") { return "Cheyenne"; } - if (code == "cmc") { return "Chamic languages"; } - if (code == "cnr") { return "Montenegrin"; } - if (code == "cop") { return "Coptic"; } - if (code == "cor") { return "Cornish"; } - if (code == "cos") { return "Corsican"; } - if (code == "cpe") { return "Creoles and pidgins, English based"; } - if (code == "cpf") { return "Creoles and pidgins, French-based"; } - if (code == "cpp") { return "Creoles and pidgins, Portuguese-based"; } - if (code == "cre") { return "Cree"; } - if (code == "crh") { return "Crimean Tatar"; } - if (code == "crp") { return "Creoles and pidgins"; } - if (code == "csb") { return "Kashubian"; } - if (code == "cus") { return "Cushitic languages"; } - if (code == "cym") { return "Welsh"; } - if (code == "cym") { return "Welsh"; } - if (code == "cze") { return "Czech"; } - if (code == "cze") { return "Czech"; } - if (code == "dak") { return "Dakota"; } - if (code == "dan") { return "Danish"; } - if (code == "dar") { return "Dargwa"; } - if (code == "day") { return "Land Dayak languages"; } - if (code == "del") { return "Delaware"; } - if (code == "den") { return "Slave (Athapascan)"; } - if (code == "deu") { return "German"; } - if (code == "dgr") { return "Dogrib"; } - if (code == "din") { return "Dinka"; } - if (code == "div") { return "Divehi"; } - if (code == "doi") { return "Dogri"; } - if (code == "dra") { return "Dravidian languages"; } - if (code == "dsb") { return "Lower Sorbian"; } - if (code == "dua") { return "Duala"; } - if (code == "dum") { return "Dutch, Middle (ca.1050-1350)"; } - if (code == "dut") { return "Dutch"; } - if (code == "dut") { return "Dutch"; } - if (code == "dyu") { return "Dyula"; } - if (code == "dzo") { return "Dzongkha"; } - if (code == "efi") { return "Efik"; } - if (code == "egy") { return "Egyptian (Ancient)"; } - if (code == "eka") { return "Ekajuk"; } - if (code == "ell") { return "Greek, Modern (1453-)"; } - if (code == "elx") { return "Elamite"; } - if (code == "eng") { return "English"; } - if (code == "enm") { return "English, Middle (1100-1500)"; } - if (code == "epo") { return "Esperanto"; } - if (code == "est") { return "Estonian"; } - if (code == "eus") { return "Basque"; } - if (code == "eus") { return "Basque"; } - if (code == "ewe") { return "Ewe"; } - if (code == "ewo") { return "Ewondo"; } - if (code == "fan") { return "Fang"; } - if (code == "fao") { return "Faroese"; } - if (code == "fas") { return "Persian"; } - if (code == "fat") { return "Fanti"; } - if (code == "fij") { return "Fijian"; } - if (code == "fil") { return "Filipino"; } - if (code == "fin") { return "Finnish"; } - if (code == "fiu") { return "Finno-Ugrian languages"; } - if (code == "fon") { return "Fon"; } - if (code == "fra") { return "French"; } - if (code == "fre") { return "French"; } - if (code == "frm") { return "French, Middle (ca.1400-1600)"; } - if (code == "fro") { return "French, Old (842-ca.1400)"; } - if (code == "frr") { return "Northern Frisian"; } - if (code == "frs") { return "Eastern Frisian"; } - if (code == "fry") { return "Western Frisian"; } - if (code == "ful") { return "Fulah"; } - if (code == "fur") { return "Friulian"; } - if (code == "gaa") { return "Ga"; } - if (code == "gay") { return "Gayo"; } - if (code == "gba") { return "Gbaya"; } - if (code == "gem") { return "Germanic languages"; } - if (code == "geo") { return "Georgin"; } - if (code == "ger") { return "German"; } - if (code == "gez") { return "Geez"; } - if (code == "gil") { return "Gilbertese"; } - if (code == "gla") { return "Gaelic"; } - if (code == "gle") { return "Irish"; } - if (code == "glg") { return "Galician"; } - if (code == "glv") { return "Manx"; } - if (code == "gmh") { return "German, Middle High (ca.1050-1500)"; } - if (code == "goh") { return "German, Old High (ca.750-1050)"; } - if (code == "gon") { return "Gondi"; } - if (code == "gor") { return "Gorontalo"; } - if (code == "got") { return "Gothic"; } - if (code == "grb") { return "Grebo"; } - if (code == "grc") { return "Greek, Ancient (to 1453)"; } - if (code == "gre") { return "Greek"; } - if (code == "grn") { return "Guarani"; } - if (code == "gsw") { return "Swiss German"; } - if (code == "guj") { return "Gujarati"; } - if (code == "gwi") { return "Gwich'in"; } - if (code == "hai") { return "Haida"; } - if (code == "hat") { return "Haitian"; } - if (code == "hau") { return "Hausa"; } - if (code == "haw") { return "Hawaiian"; } - if (code == "heb") { return "Hebrew"; } - if (code == "her") { return "Herero"; } - if (code == "hil") { return "Hiligaynon"; } - if (code == "him") { return "Himachali languages"; } - if (code == "hin") { return "Hindi"; } - if (code == "hit") { return "Hittite"; } - if (code == "hmn") { return "Hmong"; } - if (code == "hmo") { return "Hiri Motu"; } - if (code == "hrv") { return "Croatian"; } - if (code == "hsb") { return "Upper Sorbian"; } - if (code == "hun") { return "Hungarian"; } - if (code == "hup") { return "Hupa"; } - if (code == "hye") { return "Armenian"; } - if (code == "iba") { return "Iban"; } - if (code == "ibo") { return "Igbo"; } - if (code == "ice") { return "Icelandic"; } - if (code == "ido") { return "Ido"; } - if (code == "iii") { return "Sichuan Yi"; } - if (code == "ijo") { return "Ijo languages"; } - if (code == "iku") { return "Inuktitut"; } - if (code == "ile") { return "Interlingue"; } - if (code == "ilo") { return "Iloko"; } - if (code == "ina") { return "Interlingua)"; } - if (code == "inc") { return "Indic languages"; } - if (code == "ind") { return "Indonesian"; } - if (code == "ine") { return "Indo-European languages"; } - if (code == "inh") { return "Ingush"; } - if (code == "ipk") { return "Inupiaq"; } - if (code == "ira") { return "Iranian languages"; } - if (code == "iro") { return "Iroquoian languages"; } - if (code == "isl") { return "Icelandic"; } - if (code == "ita") { return "Italian"; } - if (code == "jav") { return "Javanese"; } - if (code == "jbo") { return "Lojban"; } - if (code == "jpn") { return "Japanese"; } - if (code == "jpr") { return "Judeo-Persian"; } - if (code == "jrb") { return "Judeo-Arabic"; } - if (code == "kaa") { return "Kara-Kalpak"; } - if (code == "kab") { return "Kabyle"; } - if (code == "kac") { return "Kachin"; } - if (code == "kal") { return "Greenlandic"; } - if (code == "kam") { return "Kamba"; } - if (code == "kan") { return "Kannada"; } - if (code == "kar") { return "Karen languages"; } - if (code == "kas") { return "Kashmiri"; } - if (code == "kat") { return "Georgian"; } - if (code == "kau") { return "Kanuri"; } - if (code == "kaw") { return "Kawi"; } - if (code == "kaz") { return "Kazakh"; } - if (code == "kbd") { return "Kabardian"; } - if (code == "kha") { return "Khasi"; } - if (code == "khi") { return "Khoisan languages"; } - if (code == "khm") { return "Central Khmer"; } - if (code == "kho") { return "Khotanese"; } - if (code == "kik") { return "Kikuyu"; } - if (code == "kin") { return "Kinyarwanda"; } - if (code == "kir") { return "Kirghiz"; } - if (code == "kmb") { return "Kimbundu"; } - if (code == "kok") { return "Konkani"; } - if (code == "kom") { return "Komi"; } - if (code == "kon") { return "Kongo"; } - if (code == "kor") { return "Korean"; } - if (code == "kos") { return "Kosraean"; } - if (code == "kpe") { return "Kpelle"; } - if (code == "krc") { return "Karachay-Balkar"; } - if (code == "krl") { return "Karelian"; } - if (code == "kro") { return "Kru languages"; } - if (code == "kru") { return "Kurukh"; } - if (code == "kua") { return "Kuanyama"; } - if (code == "kum") { return "Kumyk"; } - if (code == "kur") { return "Kurdish"; } - if (code == "kut") { return "Kutenai"; } - if (code == "lad") { return "Ladino"; } - if (code == "lah") { return "Lahnda"; } - if (code == "lam") { return "Lamba"; } - if (code == "lao") { return "Lao"; } - if (code == "lat") { return "Latin"; } - if (code == "lav") { return "Latvian"; } - if (code == "lez") { return "Lezghian"; } - if (code == "lim") { return "Limburgan"; } - if (code == "lin") { return "Lingala"; } - if (code == "lit") { return "Lithuanian"; } - if (code == "lol") { return "Mongo"; } - if (code == "loz") { return "Lozi"; } - if (code == "ltz") { return "Luxembourgish"; } - if (code == "lua") { return "Luba-Lulua"; } - if (code == "lub") { return "Luba-Katanga"; } - if (code == "lug") { return "Ganda"; } - if (code == "lui") { return "Luiseno"; } - if (code == "lun") { return "Lunda"; } - if (code == "luo") { return "Luo (Kenya and Tanzania)"; } - if (code == "lus") { return "Lushai"; } - if (code == "mac") { return "Macedonian"; } - if (code == "mac") { return "Macedonian"; } - if (code == "mad") { return "Madurese"; } - if (code == "mag") { return "Magahi"; } - if (code == "mah") { return "Marshallese"; } - if (code == "mai") { return "Maithili"; } - if (code == "mak") { return "Makasar"; } - if (code == "mal") { return "Malayalam"; } - if (code == "man") { return "Mandingo"; } - if (code == "mao") { return "Maori"; } - if (code == "map") { return "Austronesian languages"; } - if (code == "mar") { return "Marathi"; } - if (code == "mas") { return "Masai"; } - if (code == "may") { return "Malay"; } - if (code == "mdf") { return "Moksha"; } - if (code == "mdr") { return "Mandar"; } - if (code == "men") { return "Mende"; } - if (code == "mga") { return "Irish, Middle (900-1200)"; } - if (code == "mic") { return "Mi'kmaq"; } - if (code == "min") { return "Minangkabau"; } - if (code == "mis") { return "Uncoded languages"; } - if (code == "mkd") { return "Macedonian"; } - if (code == "mkd") { return "Macedonian"; } - if (code == "mkh") { return "Mon-Khmer languages"; } - if (code == "mlg") { return "Malagasy"; } - if (code == "mlt") { return "Maltese"; } - if (code == "mnc") { return "Manchu"; } - if (code == "mni") { return "Manipuri"; } - if (code == "mno") { return "Manobo languages"; } - if (code == "moh") { return "Mohawk"; } - if (code == "mon") { return "Mongolian"; } - if (code == "mos") { return "Mossi"; } - if (code == "mri") { return "Maori"; } - if (code == "msa") { return "Malay"; } - if (code == "mul") { return "Multiple languages"; } - if (code == "mun") { return "Munda languages"; } - if (code == "mus") { return "Creek"; } - if (code == "mwl") { return "Mirandese"; } - if (code == "mwr") { return "Marwari"; } - if (code == "mya") { return "Burmese"; } - if (code == "mya") { return "Burmese"; } - if (code == "myn") { return "Mayan languages"; } - if (code == "myv") { return "Erzya"; } - if (code == "nah") { return "Nahuatl languages"; } - if (code == "nai") { return "North American Indian languages"; } - if (code == "nap") { return "Neapolitan"; } - if (code == "nau") { return "Nauru"; } - if (code == "nav") { return "Navajo"; } - if (code == "nbl") { return "Ndebele, South"; } - if (code == "nde") { return "Ndebele, North"; } - if (code == "ndo") { return "Ndonga"; } - if (code == "nds") { return "Low German"; } - if (code == "nep") { return "Nepali"; } - if (code == "new") { return "Nepal Bhasa"; } - if (code == "nia") { return "Nias"; } - if (code == "nic") { return "Niger-Kordofanian languages"; } - if (code == "niu") { return "Niuean"; } - if (code == "nld") { return "Dutch"; } - if (code == "nld") { return "Dutch"; } - if (code == "nno") { return "Norwegian Nynorsk"; } - if (code == "nob") { return "Bokmål, Norwegian"; } - if (code == "nog") { return "Nogai"; } - if (code == "non") { return "Norse, Old"; } - if (code == "nor") { return "Norwegian"; } - if (code == "nqo") { return "N'Ko"; } - if (code == "nso") { return "Pedi"; } - if (code == "nub") { return "Nubian languages"; } - if (code == "nwc") { return "Classical Newari"; } - if (code == "nya") { return "Chichewa"; } - if (code == "nym") { return "Nyamwezi"; } - if (code == "nyn") { return "Nyankole"; } - if (code == "nyo") { return "Nyoro"; } - if (code == "nzi") { return "Nzima"; } - if (code == "oci") { return "Occitan (post 1500)"; } - if (code == "oji") { return "Ojibwa"; } - if (code == "ori") { return "Oriya"; } - if (code == "orm") { return "Oromo"; } - if (code == "osa") { return "Osage"; } - if (code == "oss") { return "Ossetian"; } - if (code == "ota") { return "Turkish, Ottoman (1500-1928)"; } - if (code == "oto") { return "Otomian languages"; } - if (code == "paa") { return "Papuan languages"; } - if (code == "pag") { return "Pangasinan"; } - if (code == "pal") { return "Pahlavi"; } - if (code == "pam") { return "Pampanga"; } - if (code == "pan") { return "Panjabi"; } - if (code == "pap") { return "Papiamento"; } - if (code == "pau") { return "Palauan"; } - if (code == "peo") { return "Persian, Old (ca.600-400 B.C.)"; } - if (code == "per") { return "Persian"; } - if (code == "phi") { return "Philippine languages"; } - if (code == "phn") { return "Phoenician"; } - if (code == "pli") { return "Pali"; } - if (code == "pol") { return "Polish"; } - if (code == "pon") { return "Pohnpeian"; } - if (code == "por") { return "Portuguese"; } - if (code == "pra") { return "Prakrit languages"; } - if (code == "pro") { return "Provençal, Old (to 1500)"; } - if (code == "pus") { return "Pushto"; } - if (code == "que") { return "Quechua"; } - if (code == "raj") { return "Rajasthani"; } - if (code == "rap") { return "Rapanui"; } - if (code == "rar") { return "Rarotongan"; } - if (code == "roa") { return "Romance languages"; } - if (code == "roh") { return "Romansh"; } - if (code == "rom") { return "Romany"; } - if (code == "ron") { return "Romanian"; } - if (code == "rum") { return "Romanian"; } - if (code == "run") { return "Rundi"; } - if (code == "rup") { return "Aromanian"; } - if (code == "rus") { return "Russian"; } - if (code == "sad") { return "Sandawe"; } - if (code == "sag") { return "Sango"; } - if (code == "sah") { return "Yakut"; } - if (code == "sai") { return "South American Indian languages"; } - if (code == "sal") { return "Salishan languages"; } - if (code == "sam") { return "Samaritan Aramaic"; } - if (code == "san") { return "Sanskrit"; } - if (code == "sas") { return "Sasak"; } - if (code == "sat") { return "Santali"; } - if (code == "scn") { return "Sicilian"; } - if (code == "sco") { return "Scots"; } - if (code == "sel") { return "Selkup"; } - if (code == "sem") { return "Semitic languages"; } - if (code == "sga") { return "Irish, Old (to 900)"; } - if (code == "sgn") { return "Sign Languages"; } - if (code == "shn") { return "Shan"; } - if (code == "sid") { return "Sidamo"; } - if (code == "sin") { return "Sinhala"; } - if (code == "sio") { return "Siouan languages"; } - if (code == "sit") { return "Sino-Tibetan languages"; } - if (code == "sla") { return "Slavic languages"; } - if (code == "slo") { return "Slovak"; } - if (code == "slv") { return "Slovenian"; } - if (code == "sma") { return "Southern Sami"; } - if (code == "sme") { return "Northern Sami"; } - if (code == "smi") { return "Sami languages"; } - if (code == "smj") { return "Lule Sami"; } - if (code == "smn") { return "Inari Sami"; } - if (code == "smo") { return "Samoan"; } - if (code == "sms") { return "Skolt Sami"; } - if (code == "sna") { return "Shona"; } - if (code == "snd") { return "Sindhi"; } - if (code == "snk") { return "Soninke"; } - if (code == "sog") { return "Sogdian"; } - if (code == "som") { return "Somali"; } - if (code == "son") { return "Songhai languages"; } - if (code == "sot") { return "Sotho, Southern"; } - if (code == "spa") { return "Spanish"; } - if (code == "sqi") { return "Albanian"; } - if (code == "srd") { return "Sardinian"; } - if (code == "srn") { return "Sranan Tongo"; } - if (code == "srp") { return "Serbian"; } - if (code == "srr") { return "Serer"; } - if (code == "ssa") { return "Nilo-Saharan languages"; } - if (code == "ssw") { return "Swati"; } - if (code == "suk") { return "Sukuma"; } - if (code == "sun") { return "Sundanese"; } - if (code == "sus") { return "Susu"; } - if (code == "sux") { return "Sumerian"; } - if (code == "swa") { return "Swahili"; } - if (code == "swe") { return "Swedish"; } - if (code == "syc") { return "Classical Syriac"; } - if (code == "syr") { return "Syriac"; } - if (code == "tah") { return "Tahitian"; } - if (code == "tai") { return "Tai languages"; } - if (code == "tam") { return "Tamil"; } - if (code == "tat") { return "Tatar"; } - if (code == "tel") { return "Telugu"; } - if (code == "tem") { return "Timne"; } - if (code == "ter") { return "Tereno"; } - if (code == "tet") { return "Tetum"; } - if (code == "tgk") { return "Tajik"; } - if (code == "tgl") { return "Tagalog"; } - if (code == "tha") { return "Thai"; } - if (code == "tib") { return "Tibetian"; } - if (code == "tig") { return "Tigre"; } - if (code == "tir") { return "Tigrinya"; } - if (code == "tiv") { return "Tiv"; } - if (code == "tkl") { return "Tokelau"; } - if (code == "tlh") { return "Klingon"; } - if (code == "tli") { return "Tlingit"; } - if (code == "tmh") { return "Tamashek"; } - if (code == "tog") { return "Tonga (Nyasa)"; } - if (code == "ton") { return "Tonga (Tonga Islands)"; } - if (code == "tpi") { return "Tok Pisin"; } - if (code == "tsi") { return "Tsimshian"; } - if (code == "tsn") { return "Tswana"; } - if (code == "tso") { return "Tsonga"; } - if (code == "tuk") { return "Turkmen"; } - if (code == "tum") { return "Tumbuka"; } - if (code == "tup") { return "Tupi languages"; } - if (code == "tur") { return "Turkish"; } - if (code == "tut") { return "Altaic languages"; } - if (code == "tvl") { return "Tuvalu"; } - if (code == "twi") { return "Twi"; } - if (code == "tyv") { return "Tuvinian"; } - if (code == "udm") { return "Udmurt"; } - if (code == "uga") { return "Ugaritic"; } - if (code == "uig") { return "Uighur"; } - if (code == "ukr") { return "Ukrainian"; } - if (code == "umb") { return "Umbundu"; } - if (code == "und") { return "Undetermined"; } - if (code == "urd") { return "Urdu"; } - if (code == "uzb") { return "Uzbek"; } - if (code == "vai") { return "Vai"; } - if (code == "ven") { return "Venda"; } - if (code == "vie") { return "Vietnamese"; } - if (code == "vol") { return "Volapük"; } - if (code == "vot") { return "Votic"; } - if (code == "wak") { return "Wakashan languages"; } - if (code == "wal") { return "Wolaitta"; } - if (code == "war") { return "Waray"; } - if (code == "was") { return "Washo"; } - if (code == "wel") { return "Welsh"; } - if (code == "wel") { return "Welsh"; } - if (code == "wen") { return "Sorbian languages"; } - if (code == "wln") { return "Walloon"; } - if (code == "wol") { return "Wolof"; } - if (code == "xal") { return "Kalmyk"; } - if (code == "xho") { return "Xhosa"; } - if (code == "yao") { return "Yao"; } - if (code == "yap") { return "Yapese"; } - if (code == "yid") { return "Yiddish"; } - if (code == "yor") { return "Yoruba"; } - if (code == "ypk") { return "Yupik languages"; } - if (code == "zap") { return "Zapotec"; } - if (code == "zbl") { return "Blissymbols"; } - if (code == "zen") { return "Zenaga"; } - if (code == "zgh") { return "Moroccan"; } - if (code == "zha") { return "Zhuang"; } - if (code == "zho") { return "Chinese"; } - if (code == "znd") { return "Zande languages"; } - if (code == "zul") { return "Zulu"; } - if (code == "zun") { return "Zuni"; } - if (code == "zza") { return "Zaza"; } + if (code == "AAR") { return "Afar"; } + if (code == "ABK") { return "Abkhazian"; } + if (code == "ACE") { return "Achinese"; } + if (code == "ACH") { return "Acoli"; } + if (code == "ADA") { return "Adangme"; } + if (code == "ADY") { return "Adyghe"; } + if (code == "AFA") { return "Afro-Asiatic languages"; } + if (code == "AFH") { return "Afrihili"; } + if (code == "AFR") { return "Afrikaans"; } + if (code == "AIN") { return "Ainu"; } + if (code == "AKA") { return "Akan"; } + if (code == "AKK") { return "Akkadian"; } + if (code == "ALB") { return "Albanian"; } + if (code == "ALE") { return "Aleut"; } + if (code == "ALG") { return "Algonquian languages"; } + if (code == "ALT") { return "Southern Altai"; } + if (code == "AMH") { return "Amharic"; } + if (code == "ANG") { return "English, Old (ca.450-1100)"; } + if (code == "ANP") { return "Angika"; } + if (code == "APA") { return "Apache languages"; } + if (code == "ARA") { return "Arabic"; } + if (code == "ARC") { return "Aramaic (700-300 BCE)"; } + if (code == "ARG") { return "Aragonese"; } + if (code == "ARM") { return "Armenian"; } + if (code == "ARN") { return "Mapudungun"; } + if (code == "ARP") { return "Arapaho"; } + if (code == "ART") { return "Artificial languages"; } + if (code == "ARW") { return "Arawak"; } + if (code == "ASM") { return "Assamese"; } + if (code == "AST") { return "Asturian"; } + if (code == "ATH") { return "Athapascan languages"; } + if (code == "AUS") { return "Australian languages"; } + if (code == "AVA") { return "Avaric"; } + if (code == "AVE") { return "Avestan"; } + if (code == "AWA") { return "Awadhi"; } + if (code == "AYM") { return "Aymara"; } + if (code == "AZE") { return "Azerbaijani"; } + if (code == "BAD") { return "Banda languages"; } + if (code == "BAI") { return "Bamileke languages"; } + if (code == "BAK") { return "Bashkir"; } + if (code == "BAL") { return "Baluchi"; } + if (code == "BAM") { return "Bambara"; } + if (code == "BAN") { return "Balinese"; } + if (code == "BAQ") { return "Basque"; } + if (code == "BAQ") { return "Basque"; } + if (code == "BAS") { return "Basa"; } + if (code == "BAT") { return "Baltic languages"; } + if (code == "BEJ") { return "Beja"; } + if (code == "BEL") { return "Belarusian"; } + if (code == "BEM") { return "Bemba"; } + if (code == "BEN") { return "Bengali"; } + if (code == "BER") { return "Berber languages"; } + if (code == "BHO") { return "Bhojpuri"; } + if (code == "BIH") { return "Bihari languages"; } + if (code == "BIK") { return "Bikol"; } + if (code == "BIN") { return "Bini"; } + if (code == "BIS") { return "Bislama"; } + if (code == "BLA") { return "Siksika"; } + if (code == "BNT") { return "Bantu languages"; } + if (code == "BOD") { return "Tibetan"; } + if (code == "BOS") { return "Bosnian"; } + if (code == "BRA") { return "Braj"; } + if (code == "BRE") { return "Breton"; } + if (code == "BTK") { return "Batak languages"; } + if (code == "BUA") { return "Buriat"; } + if (code == "BUG") { return "Buginese"; } + if (code == "BUL") { return "Bulgarian"; } + if (code == "BUR") { return "Burmese"; } + if (code == "BUR") { return "Burmese"; } + if (code == "BYN") { return "Blin"; } + if (code == "CAD") { return "Caddo"; } + if (code == "CAI") { return "Central American Indian languages"; } + if (code == "CAR") { return "Galibi Carib"; } + if (code == "CAT") { return "Catalan"; } + if (code == "CAU") { return "Caucasian languages"; } + if (code == "CEB") { return "Cebuano"; } + if (code == "CEL") { return "Celtic languages"; } + if (code == "CES") { return "Czech"; } + if (code == "CES") { return "Czech"; } + if (code == "CHA") { return "Chamorro"; } + if (code == "CHB") { return "Chibcha"; } + if (code == "CHE") { return "Chechen"; } + if (code == "CHG") { return "Chagatai"; } + if (code == "CHI") { return "Chinese"; } + if (code == "CHK") { return "Chuukese"; } + if (code == "CHM") { return "Mari"; } + if (code == "CHN") { return "Chinook jargon"; } + if (code == "CHO") { return "Choctaw"; } + if (code == "CHP") { return "Chipewyan"; } + if (code == "CHR") { return "Cherokee"; } + if (code == "CHU") { return "Church Slavic"; } + if (code == "CHV") { return "Chuvash"; } + if (code == "CHY") { return "Cheyenne"; } + if (code == "CMC") { return "Chamic languages"; } + if (code == "CNR") { return "Montenegrin"; } + if (code == "COP") { return "Coptic"; } + if (code == "COR") { return "Cornish"; } + if (code == "COS") { return "Corsican"; } + if (code == "CPE") { return "Creoles and pidgins, English based"; } + if (code == "CPF") { return "Creoles and pidgins, French-based"; } + if (code == "CPP") { return "Creoles and pidgins, Portuguese-based"; } + if (code == "CRE") { return "Cree"; } + if (code == "CRH") { return "Crimean Tatar"; } + if (code == "CRP") { return "Creoles and pidgins"; } + if (code == "CSB") { return "Kashubian"; } + if (code == "CUS") { return "Cushitic languages"; } + if (code == "CYM") { return "Welsh"; } + if (code == "CYM") { return "Welsh"; } + if (code == "CZE") { return "Czech"; } + if (code == "CZE") { return "Czech"; } + if (code == "DAK") { return "Dakota"; } + if (code == "DAN") { return "Danish"; } + if (code == "DAR") { return "Dargwa"; } + if (code == "DAY") { return "Land Dayak languages"; } + if (code == "DEL") { return "Delaware"; } + if (code == "DEN") { return "Slave (Athapascan)"; } + if (code == "DEU") { return "German"; } + if (code == "DGR") { return "Dogrib"; } + if (code == "DIN") { return "Dinka"; } + if (code == "DIV") { return "Divehi"; } + if (code == "DOI") { return "Dogri"; } + if (code == "DRA") { return "Dravidian languages"; } + if (code == "DSB") { return "Lower Sorbian"; } + if (code == "DUA") { return "Duala"; } + if (code == "DUM") { return "Dutch, Middle (ca.1050-1350)"; } + if (code == "DUT") { return "Dutch"; } + if (code == "DUT") { return "Dutch"; } + if (code == "DYU") { return "Dyula"; } + if (code == "DZO") { return "Dzongkha"; } + if (code == "EFI") { return "Efik"; } + if (code == "EGY") { return "Egyptian (Ancient)"; } + if (code == "EKA") { return "Ekajuk"; } + if (code == "ELL") { return "Greek, Modern (1453-)"; } + if (code == "ELX") { return "Elamite"; } + if (code == "ENG") { return "English"; } + if (code == "ENM") { return "English, Middle (1100-1500)"; } + if (code == "EPO") { return "Esperanto"; } + if (code == "EST") { return "Estonian"; } + if (code == "EUS") { return "Basque"; } + if (code == "EUS") { return "Basque"; } + if (code == "EWE") { return "Ewe"; } + if (code == "EWO") { return "Ewondo"; } + if (code == "FAN") { return "Fang"; } + if (code == "FAO") { return "Faroese"; } + if (code == "FAS") { return "Persian"; } + if (code == "FAT") { return "Fanti"; } + if (code == "FIJ") { return "Fijian"; } + if (code == "FIL") { return "Filipino"; } + if (code == "FIN") { return "Finnish"; } + if (code == "FIU") { return "Finno-Ugrian languages"; } + if (code == "FON") { return "Fon"; } + if (code == "FRA") { return "French"; } + if (code == "FRE") { return "French"; } + if (code == "FRM") { return "French, Middle (ca.1400-1600)"; } + if (code == "FRO") { return "French, Old (842-ca.1400)"; } + if (code == "FRR") { return "Northern Frisian"; } + if (code == "FRS") { return "Eastern Frisian"; } + if (code == "FRY") { return "Western Frisian"; } + if (code == "FUL") { return "Fulah"; } + if (code == "FUR") { return "Friulian"; } + if (code == "GAA") { return "Ga"; } + if (code == "GAY") { return "Gayo"; } + if (code == "GBA") { return "Gbaya"; } + if (code == "GEM") { return "Germanic languages"; } + if (code == "GEO") { return "Georgin"; } + if (code == "GER") { return "German"; } + if (code == "GEZ") { return "Geez"; } + if (code == "GIL") { return "Gilbertese"; } + if (code == "GLA") { return "Gaelic"; } + if (code == "GLE") { return "Irish"; } + if (code == "GLG") { return "Galician"; } + if (code == "GLV") { return "Manx"; } + if (code == "GMH") { return "German, Middle High (ca.1050-1500)"; } + if (code == "GOH") { return "German, Old High (ca.750-1050)"; } + if (code == "GON") { return "Gondi"; } + if (code == "GOR") { return "Gorontalo"; } + if (code == "GOT") { return "Gothic"; } + if (code == "GRB") { return "Grebo"; } + if (code == "GRC") { return "Greek, Ancient (to 1453)"; } + if (code == "GRE") { return "Greek"; } + if (code == "GRN") { return "Guarani"; } + if (code == "GSW") { return "Swiss German"; } + if (code == "GUJ") { return "Gujarati"; } + if (code == "GWI") { return "Gwich'in"; } + if (code == "HAI") { return "Haida"; } + if (code == "HAT") { return "Haitian"; } + if (code == "HAU") { return "Hausa"; } + if (code == "HAW") { return "Hawaiian"; } + if (code == "HEB") { return "Hebrew"; } + if (code == "HER") { return "Herero"; } + if (code == "HIL") { return "Hiligaynon"; } + if (code == "HIM") { return "Himachali languages"; } + if (code == "HIN") { return "Hindi"; } + if (code == "HIT") { return "Hittite"; } + if (code == "HMN") { return "Hmong"; } + if (code == "HMO") { return "Hiri Motu"; } + if (code == "HRV") { return "Croatian"; } + if (code == "HSB") { return "Upper Sorbian"; } + if (code == "HUN") { return "Hungarian"; } + if (code == "HUP") { return "Hupa"; } + if (code == "HYE") { return "Armenian"; } + if (code == "IBA") { return "Iban"; } + if (code == "IBO") { return "Igbo"; } + if (code == "ICE") { return "Icelandic"; } + if (code == "IDO") { return "Ido"; } + if (code == "III") { return "Sichuan Yi"; } + if (code == "IJO") { return "Ijo languages"; } + if (code == "IKU") { return "Inuktitut"; } + if (code == "ILE") { return "Interlingue"; } + if (code == "ILO") { return "Iloko"; } + if (code == "INA") { return "Interlingua)"; } + if (code == "INC") { return "Indic languages"; } + if (code == "IND") { return "Indonesian"; } + if (code == "INE") { return "Indo-European languages"; } + if (code == "INH") { return "Ingush"; } + if (code == "IPK") { return "Inupiaq"; } + if (code == "IRA") { return "Iranian languages"; } + if (code == "IRO") { return "Iroquoian languages"; } + if (code == "ISL") { return "Icelandic"; } + if (code == "ITA") { return "Italian"; } + if (code == "JAV") { return "Javanese"; } + if (code == "JBO") { return "Lojban"; } + if (code == "JPN") { return "Japanese"; } + if (code == "JPR") { return "Judeo-Persian"; } + if (code == "JRB") { return "Judeo-Arabic"; } + if (code == "KAA") { return "Kara-Kalpak"; } + if (code == "KAB") { return "Kabyle"; } + if (code == "KAC") { return "Kachin"; } + if (code == "KAL") { return "Greenlandic"; } + if (code == "KAM") { return "Kamba"; } + if (code == "KAN") { return "Kannada"; } + if (code == "KAR") { return "Karen languages"; } + if (code == "KAS") { return "Kashmiri"; } + if (code == "KAT") { return "Georgian"; } + if (code == "KAU") { return "Kanuri"; } + if (code == "KAW") { return "Kawi"; } + if (code == "KAZ") { return "Kazakh"; } + if (code == "KBD") { return "Kabardian"; } + if (code == "KHA") { return "Khasi"; } + if (code == "KHI") { return "Khoisan languages"; } + if (code == "KHM") { return "Central Khmer"; } + if (code == "KHO") { return "Khotanese"; } + if (code == "KIK") { return "Kikuyu"; } + if (code == "KIN") { return "Kinyarwanda"; } + if (code == "KIR") { return "Kirghiz"; } + if (code == "KMB") { return "Kimbundu"; } + if (code == "KOK") { return "Konkani"; } + if (code == "KOM") { return "Komi"; } + if (code == "KON") { return "Kongo"; } + if (code == "KOR") { return "Korean"; } + if (code == "KOS") { return "Kosraean"; } + if (code == "KPE") { return "Kpelle"; } + if (code == "KRC") { return "Karachay-Balkar"; } + if (code == "KRL") { return "Karelian"; } + if (code == "KRO") { return "Kru languages"; } + if (code == "KRU") { return "Kurukh"; } + if (code == "KUA") { return "Kuanyama"; } + if (code == "KUM") { return "Kumyk"; } + if (code == "KUR") { return "Kurdish"; } + if (code == "KUT") { return "Kutenai"; } + if (code == "LAD") { return "Ladino"; } + if (code == "LAH") { return "Lahnda"; } + if (code == "LAM") { return "Lamba"; } + if (code == "LAO") { return "Lao"; } + if (code == "LAT") { return "Latin"; } + if (code == "LAV") { return "Latvian"; } + if (code == "LEZ") { return "Lezghian"; } + if (code == "LIM") { return "Limburgan"; } + if (code == "LIN") { return "Lingala"; } + if (code == "LIT") { return "Lithuanian"; } + if (code == "LOL") { return "Mongo"; } + if (code == "LOZ") { return "Lozi"; } + if (code == "LTZ") { return "Luxembourgish"; } + if (code == "LUA") { return "Luba-Lulua"; } + if (code == "LUB") { return "Luba-Katanga"; } + if (code == "LUG") { return "Ganda"; } + if (code == "LUI") { return "Luiseno"; } + if (code == "LUN") { return "Lunda"; } + if (code == "LUO") { return "Luo (Kenya and Tanzania)"; } + if (code == "LUS") { return "Lushai"; } + if (code == "MAC") { return "Macedonian"; } + if (code == "MAC") { return "Macedonian"; } + if (code == "MAD") { return "Madurese"; } + if (code == "MAG") { return "Magahi"; } + if (code == "MAH") { return "Marshallese"; } + if (code == "MAI") { return "Maithili"; } + if (code == "MAK") { return "Makasar"; } + if (code == "MAL") { return "Malayalam"; } + if (code == "MAN") { return "Mandingo"; } + if (code == "MAO") { return "Maori"; } + if (code == "MAP") { return "Austronesian languages"; } + if (code == "MAR") { return "Marathi"; } + if (code == "MAS") { return "Masai"; } + if (code == "MAY") { return "Malay"; } + if (code == "MDF") { return "Moksha"; } + if (code == "MDR") { return "Mandar"; } + if (code == "MEN") { return "Mende"; } + if (code == "MGA") { return "Irish, Middle (900-1200)"; } + if (code == "MIC") { return "Mi'kmaq"; } + if (code == "MIN") { return "Minangkabau"; } + if (code == "MIS") { return "Uncoded languages"; } + if (code == "MKD") { return "Macedonian"; } + if (code == "MKD") { return "Macedonian"; } + if (code == "MKH") { return "Mon-Khmer languages"; } + if (code == "MLG") { return "Malagasy"; } + if (code == "MLT") { return "Maltese"; } + if (code == "MNC") { return "Manchu"; } + if (code == "MNI") { return "Manipuri"; } + if (code == "MNO") { return "Manobo languages"; } + if (code == "MOH") { return "Mohawk"; } + if (code == "MON") { return "Mongolian"; } + if (code == "MOS") { return "Mossi"; } + if (code == "MRI") { return "Maori"; } + if (code == "MSA") { return "Malay"; } + if (code == "MUL") { return "Multiple languages"; } + if (code == "MUN") { return "Munda languages"; } + if (code == "MUS") { return "Creek"; } + if (code == "MWL") { return "Mirandese"; } + if (code == "MWR") { return "Marwari"; } + if (code == "MYA") { return "Burmese"; } + if (code == "MYA") { return "Burmese"; } + if (code == "MYN") { return "Mayan languages"; } + if (code == "MYV") { return "Erzya"; } + if (code == "NAH") { return "Nahuatl languages"; } + if (code == "NAI") { return "North American Indian languages"; } + if (code == "NAP") { return "Neapolitan"; } + if (code == "NAU") { return "Nauru"; } + if (code == "NAV") { return "Navajo"; } + if (code == "NBL") { return "Ndebele, South"; } + if (code == "NDE") { return "Ndebele, North"; } + if (code == "NDO") { return "Ndonga"; } + if (code == "NDS") { return "Low German"; } + if (code == "NEP") { return "Nepali"; } + if (code == "NEW") { return "Nepal Bhasa"; } + if (code == "NIA") { return "Nias"; } + if (code == "NIC") { return "Niger-Kordofanian languages"; } + if (code == "NIU") { return "Niuean"; } + if (code == "NLD") { return "Dutch"; } + if (code == "NLD") { return "Dutch"; } + if (code == "NNO") { return "Norwegian Nynorsk"; } + if (code == "NOB") { return "Bokmål, Norwegian"; } + if (code == "NOG") { return "Nogai"; } + if (code == "NON") { return "Norse, Old"; } + if (code == "NOR") { return "Norwegian"; } + if (code == "NQO") { return "N'Ko"; } + if (code == "NSO") { return "Pedi"; } + if (code == "NUB") { return "Nubian languages"; } + if (code == "NWC") { return "Classical Newari"; } + if (code == "NYA") { return "Chichewa"; } + if (code == "NYM") { return "Nyamwezi"; } + if (code == "NYN") { return "Nyankole"; } + if (code == "NYO") { return "Nyoro"; } + if (code == "NZI") { return "Nzima"; } + if (code == "OCI") { return "Occitan (post 1500)"; } + if (code == "OJI") { return "Ojibwa"; } + if (code == "ORI") { return "Oriya"; } + if (code == "ORM") { return "Oromo"; } + if (code == "OSA") { return "Osage"; } + if (code == "OSS") { return "Ossetian"; } + if (code == "OTA") { return "Turkish, Ottoman (1500-1928)"; } + if (code == "OTO") { return "Otomian languages"; } + if (code == "PAA") { return "Papuan languages"; } + if (code == "PAG") { return "Pangasinan"; } + if (code == "PAL") { return "Pahlavi"; } + if (code == "PAM") { return "Pampanga"; } + if (code == "PAN") { return "Panjabi"; } + if (code == "PAP") { return "Papiamento"; } + if (code == "PAU") { return "Palauan"; } + if (code == "PEO") { return "Persian, Old (ca.600-400 B.C.)"; } + if (code == "PER") { return "Persian"; } + if (code == "PHI") { return "Philippine languages"; } + if (code == "PHN") { return "Phoenician"; } + if (code == "PLI") { return "Pali"; } + if (code == "POL") { return "Polish"; } + if (code == "PON") { return "Pohnpeian"; } + if (code == "POR") { return "Portuguese"; } + if (code == "PRA") { return "Prakrit languages"; } + if (code == "PRO") { return "Provençal, Old (to 1500)"; } + if (code == "PUS") { return "Pushto"; } + if (code == "QUE") { return "Quechua"; } + if (code == "RAJ") { return "Rajasthani"; } + if (code == "RAP") { return "Rapanui"; } + if (code == "RAR") { return "Rarotongan"; } + if (code == "ROA") { return "Romance languages"; } + if (code == "ROH") { return "Romansh"; } + if (code == "ROM") { return "Romany"; } + if (code == "RON") { return "Romanian"; } + if (code == "RUM") { return "Romanian"; } + if (code == "RUN") { return "Rundi"; } + if (code == "RUP") { return "Aromanian"; } + if (code == "RUS") { return "Russian"; } + if (code == "SAD") { return "Sandawe"; } + if (code == "SAG") { return "Sango"; } + if (code == "SAH") { return "Yakut"; } + if (code == "SAI") { return "South American Indian languages"; } + if (code == "SAL") { return "Salishan languages"; } + if (code == "SAM") { return "Samaritan Aramaic"; } + if (code == "SAN") { return "Sanskrit"; } + if (code == "SAS") { return "Sasak"; } + if (code == "SAT") { return "Santali"; } + if (code == "SCN") { return "Sicilian"; } + if (code == "SCO") { return "Scots"; } + if (code == "SEL") { return "Selkup"; } + if (code == "SEM") { return "Semitic languages"; } + if (code == "SGA") { return "Irish, Old (to 900)"; } + if (code == "SGN") { return "Sign Languages"; } + if (code == "SHN") { return "Shan"; } + if (code == "SID") { return "Sidamo"; } + if (code == "SIN") { return "Sinhala"; } + if (code == "SIO") { return "Siouan languages"; } + if (code == "SIT") { return "Sino-Tibetan languages"; } + if (code == "SLA") { return "Slavic languages"; } + if (code == "SLO") { return "Slovak"; } + if (code == "SLV") { return "Slovenian"; } + if (code == "SMA") { return "Southern Sami"; } + if (code == "SME") { return "Northern Sami"; } + if (code == "SMI") { return "Sami languages"; } + if (code == "SMJ") { return "Lule Sami"; } + if (code == "SMN") { return "Inari Sami"; } + if (code == "SMO") { return "Samoan"; } + if (code == "SMS") { return "Skolt Sami"; } + if (code == "SNA") { return "Shona"; } + if (code == "SND") { return "Sindhi"; } + if (code == "SNK") { return "Soninke"; } + if (code == "SOG") { return "Sogdian"; } + if (code == "SOM") { return "Somali"; } + if (code == "SON") { return "Songhai languages"; } + if (code == "SOT") { return "Sotho, Southern"; } + if (code == "SPA") { return "Spanish"; } + if (code == "SQI") { return "Albanian"; } + if (code == "SRD") { return "Sardinian"; } + if (code == "SRN") { return "Sranan Tongo"; } + if (code == "SRP") { return "Serbian"; } + if (code == "SRR") { return "Serer"; } + if (code == "SSA") { return "Nilo-Saharan languages"; } + if (code == "SSW") { return "Swati"; } + if (code == "SUK") { return "Sukuma"; } + if (code == "SUN") { return "Sundanese"; } + if (code == "SUS") { return "Susu"; } + if (code == "SUX") { return "Sumerian"; } + if (code == "SWA") { return "Swahili"; } + if (code == "SWE") { return "Swedish"; } + if (code == "SYC") { return "Classical Syriac"; } + if (code == "SYR") { return "Syriac"; } + if (code == "TAH") { return "Tahitian"; } + if (code == "TAI") { return "Tai languages"; } + if (code == "TAM") { return "Tamil"; } + if (code == "TAT") { return "Tatar"; } + if (code == "TEL") { return "Telugu"; } + if (code == "TEM") { return "Timne"; } + if (code == "TER") { return "Tereno"; } + if (code == "TET") { return "Tetum"; } + if (code == "TGK") { return "Tajik"; } + if (code == "TGL") { return "Tagalog"; } + if (code == "THA") { return "Thai"; } + if (code == "TIB") { return "Tibetian"; } + if (code == "TIG") { return "Tigre"; } + if (code == "TIR") { return "Tigrinya"; } + if (code == "TIV") { return "Tiv"; } + if (code == "TKL") { return "Tokelau"; } + if (code == "TLH") { return "Klingon"; } + if (code == "TLI") { return "Tlingit"; } + if (code == "TMH") { return "Tamashek"; } + if (code == "TOG") { return "Tonga (Nyasa)"; } + if (code == "TON") { return "Tonga (Tonga Islands)"; } + if (code == "TPI") { return "Tok Pisin"; } + if (code == "TSI") { return "Tsimshian"; } + if (code == "TSN") { return "Tswana"; } + if (code == "TSO") { return "Tsonga"; } + if (code == "TUK") { return "Turkmen"; } + if (code == "TUM") { return "Tumbuka"; } + if (code == "TUP") { return "Tupi languages"; } + if (code == "TUR") { return "Turkish"; } + if (code == "TUT") { return "Altaic languages"; } + if (code == "TVL") { return "Tuvalu"; } + if (code == "TWI") { return "Twi"; } + if (code == "TYV") { return "Tuvinian"; } + if (code == "UDM") { return "Udmurt"; } + if (code == "UGA") { return "Ugaritic"; } + if (code == "UIG") { return "Uighur"; } + if (code == "UKR") { return "Ukrainian"; } + if (code == "UMB") { return "Umbundu"; } + if (code == "UND") { return "Undetermined"; } + if (code == "URD") { return "Urdu"; } + if (code == "UZB") { return "Uzbek"; } + if (code == "VAI") { return "Vai"; } + if (code == "VEN") { return "Venda"; } + if (code == "VIE") { return "Vietnamese"; } + if (code == "VOL") { return "Volapük"; } + if (code == "VOT") { return "Votic"; } + if (code == "WAK") { return "Wakashan languages"; } + if (code == "WAL") { return "Wolaitta"; } + if (code == "WAR") { return "Waray"; } + if (code == "WAS") { return "Washo"; } + if (code == "WEL") { return "Welsh"; } + if (code == "WEL") { return "Welsh"; } + if (code == "WEN") { return "Sorbian languages"; } + if (code == "WLN") { return "Walloon"; } + if (code == "WOL") { return "Wolof"; } + if (code == "XAL") { return "Kalmyk"; } + if (code == "XHO") { return "Xhosa"; } + if (code == "YAO") { return "Yao"; } + if (code == "YAP") { return "Yapese"; } + if (code == "YID") { return "Yiddish"; } + if (code == "YOR") { return "Yoruba"; } + if (code == "YPK") { return "Yupik languages"; } + if (code == "ZAP") { return "Zapotec"; } + if (code == "ZBL") { return "Blissymbols"; } + if (code == "ZEN") { return "Zenaga"; } + if (code == "ZGH") { return "Moroccan"; } + if (code == "ZHA") { return "Zhuang"; } + if (code == "ZHO") { return "Chinese"; } + if (code == "ZND") { return "Zande languages"; } + if (code == "ZUL") { return "Zulu"; } + if (code == "ZUN") { return "Zuni"; } + if (code == "ZZA") { return "Zaza"; } } return code; } @@ -5487,6 +5813,26 @@ void Convert::removeDollarsFromString(string& buffer, int maximum) { +////////////////////////////// +// +// Convert::generateRandomId -- using characters 0-9, A-Z, a-z with the +// given length. +// + +string Convert::generateRandomId(int length) { + const string characters = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; + std::random_device rd; // Non-deterministic generator + std::mt19937 gen(rd()); // Seed the generator + std::uniform_int_distribution<> distr(0, characters.size() - 1); + string randomId; + std::generate_n(std::back_inserter(randomId), length, [&]() { + return characters[distr(gen)]; + }); + return randomId; +} + + + @@ -6321,6 +6667,17 @@ GridSlice* GridMeasure::addBarlineToken(const string& tok, HumNum timestamp, +////////////////////////////// +// +// GridMeasure::setKernBar -- set the token for the barline. +// + +void GridMeasure::setKernBar(const string& kernBar) { + m_kernBar = kernBar; +} + + + ////////////////////////////// // // GridMeasure::addFiguredBass -- @@ -8783,21 +9140,36 @@ void GridStaff::setNullTokenLayer(int layerindex, SliceType type, cerr << "!!SLICE TYPE: " << (int)type << endl; } + bool errorQ = false; if (layerindex < (int)this->size()) { if ((at(layerindex) != NULL) && (at(layerindex)->getToken() != NULL)) { if ((string)*at(layerindex)->getToken() == nulltoken) { // there is already a null data token here, so don't // replace it. return; + } else { + cerr << "GRID STAFF: " << this << endl; + cerr << "Warning, replacing existing token: " + << this->at(layerindex)->getToken() + << " with a null token around time " + << nextdur + << " in layerindex " << layerindex + << endl; + errorQ = true; } - cerr << "Warning, replacing existing token: " - << *this->at(layerindex)->getToken() - << " with a null token" - << endl; } } - HumdrumToken* token = new HumdrumToken(nulltoken); - setTokenLayer(layerindex, token, nextdur); + if (errorQ) { + string original = *this->at(layerindex)->getToken(); + HumRegex hre; + hre.replaceDestructive(original, "", ".ZZZ", "g"); + string value = nulltoken + "ZZZ" + original; + HumdrumToken* token = new HumdrumToken(value); + setTokenLayer(layerindex, token, nextdur); + } else { + HumdrumToken* token = new HumdrumToken(nulltoken); + setTokenLayer(layerindex, token, nextdur); + } } @@ -9279,6 +9651,26 @@ const HumdrumToken& HumAddress::getDataType(void) const { +////////////////////////////// +// +// HumAddress::getExclusiveInterpretation -- Return the exclusive +// interpretation token of the token associated with the address. +// + +HTp HumAddress::getExclusiveInterpretation(void) { + static HumdrumToken null(""); + if (m_owner == NULL) { + return &null; + } + HumdrumToken* tok = m_owner->getTrackStart(getTrack()); + if (tok == NULL) { + return &null; + } + return tok; +} + + + ////////////////////////////// // // HumAddress::getSpineInfo -- Return the spine information for the token @@ -10870,6 +11262,12 @@ string HumGrid::createBarToken(int m, int barnum, GridMeasure* measure) { // void HumGrid::getMetricBarNumbers(vector& barnums) { +return; + +/* Disabling for now. Causes problems in MuseData conversion, but usually needed for MusicXML conversion + * to get correct measures numbers (related to pickup measures, particularly in older MusicXML files). + * For MuseData, the first barline in a score is not explicitly given, which is the source of the problem. + int mcount = (int)this->size(); barnums.resize(mcount); @@ -10923,6 +11321,7 @@ void HumGrid::getMetricBarNumbers(vector& barnums) { barnums[m] = counter++; } } +*/ } @@ -14108,8 +14507,8 @@ ostream& operator<<(ostream& out, HumHash* hash) { typedef unsigned long long TEMP64BITFIX; // declare static variables -vector<_HumInstrument> HumInstrument::data; -int HumInstrument::classcount = 0; +vector<_HumInstrument> HumInstrument::m_data; +int HumInstrument::m_classcount = 0; ////////////////////////////// @@ -14118,11 +14517,11 @@ int HumInstrument::classcount = 0; // HumInstrument::HumInstrument(void) { - if (classcount == 0) { + if (m_classcount == 0) { initialize(); } - classcount++; - index = -1; + m_classcount++; + m_index = -1; } @@ -14133,11 +14532,11 @@ HumInstrument::HumInstrument(void) { // HumInstrument::HumInstrument(const string& Hname) { - if (classcount == 0) { + if (m_classcount == 0) { initialize(); } - index = find(Hname); + m_index = find(Hname); } @@ -14148,7 +14547,7 @@ HumInstrument::HumInstrument(const string& Hname) { // HumInstrument::~HumInstrument() { - index = -1; + m_index = -1; } @@ -14159,8 +14558,8 @@ HumInstrument::~HumInstrument() { // int HumInstrument::getGM(void) { - if (index > 0) { - return data[index].gm; + if (m_index > 0) { + return m_data[m_index].gm; } else { return -1; } @@ -14182,7 +14581,7 @@ int HumInstrument::getGM(const string& Hname) { } if (tindex > 0) { - return data[tindex].gm; + return m_data[tindex].gm; } else { return -1; } @@ -14196,8 +14595,8 @@ int HumInstrument::getGM(const string& Hname) { // string HumInstrument::getName(void) { - if (index > 0) { - return data[index].name; + if (m_index > 0) { + return m_data[m_index].name; } else { return ""; } @@ -14218,7 +14617,7 @@ string HumInstrument::getName(const string& Hname) { tindex = find(Hname); } if (tindex > 0) { - return data[tindex].name; + return m_data[tindex].name; } else { return ""; } @@ -14232,8 +14631,8 @@ string HumInstrument::getName(const string& Hname) { // string HumInstrument::getHumdrum(void) { - if (index > 0) { - return data[index].humdrum; + if (m_index > 0) { + return m_data[m_index].humdrum; } else { return ""; } @@ -14252,7 +14651,7 @@ int HumInstrument::setGM(const string& Hname, int aValue) { } int rindex = find(Hname); if (rindex > 0) { - data[rindex].gm = aValue; + m_data[rindex].gm = aValue; } else { afi(Hname.c_str(), aValue, Hname.c_str()); sortData(); @@ -14269,11 +14668,11 @@ int HumInstrument::setGM(const string& Hname, int aValue) { void HumInstrument::setHumdrum(const string& Hname) { if (Hname.compare(0, 2, "*I") == 0) { - index = find(Hname.substr(2)); + m_index = find(Hname.substr(2)); } else { - index = find(Hname); + m_index = find(Hname); } -} + } @@ -14287,171 +14686,223 @@ void HumInstrument::setHumdrum(const string& Hname) { // // HumInstrument::initialize -- // - void HumInstrument::initialize(void) { - data.reserve(500); - afi("accor", GM_ACCORDION, "accordion"); - afi("alto", GM_RECORDER, "alto"); - afi("archl", GM_ACOUSTIC_GUITAR_NYLON, "archlute"); - afi("armon", GM_HARMONICA, "harmonica"); - afi("arpa", GM_ORCHESTRAL_HARP, "harp"); - afi("bagpI", GM_BAGPIPE, "bagpipe (Irish)"); - afi("bagpS", GM_BAGPIPE, "bagpipe (Scottish)"); - afi("banjo", GM_BANJO, "banjo"); - afi("barit", GM_CHOIR_AAHS, "baritone"); - afi("baset", GM_CLARINET, "bassett horn"); - afi("bass", GM_CHOIR_AAHS, "bass"); - afi("bdrum", GM_TAIKO_DRUM, "bass drum (kit)"); - afi("bguit", GM_ELECTRIC_BASS_FINGER, "electric bass guitar"); - afi("biwa", GM_FLUTE, "biwa"); - afi("bscan", GM_CHOIR_AAHS, "basso cantante"); - afi("bspro", GM_CHOIR_AAHS, "basso profondo"); - afi("calam", GM_OBOE, "chalumeau"); - afi("calpe", GM_LEAD_CALLIOPE, "calliope"); - afi("calto", GM_CHOIR_AAHS, "contralto"); - afi("campn", GM_TUBULAR_BELLS, "bell"); - afi("cangl", GM_ENGLISH_HORN, "english horn"); - afi("caril", GM_TUBULAR_BELLS, "carillon"); - afi("castr", GM_CHOIR_AAHS, "castrato"); - afi("casts", GM_WOODBLOCKS, "castanets"); - afi("cbass", GM_CONTRABASS, "contrabass"); - afi("cello", GM_CELLO, "violoncello"); - afi("cemba", GM_HARPSICHORD, "harpsichord"); - afi("cetra", GM_VIOLIN, "cittern"); - afi("chime", GM_TUBULAR_BELLS, "chimes"); - afi("chlma", GM_BASSOON, "alto shawm"); - afi("chlms", GM_BASSOON, "soprano shawm"); - afi("chlmt", GM_BASSOON, "tenor shawm"); - afi("clara", GM_CLARINET, "alto clarinet (in E-flat)"); - afi("clarb", GM_CLARINET, "bass clarinet (in B-flat)"); - afi("clarp", GM_CLARINET, "piccolo clarinet"); - afi("clars", GM_CLARINET, "soprano clarinet"); - afi("clavi", GM_CLAVI, "clavichord"); - afi("clest", GM_CELESTA, "celesta"); - afi("colsp", GM_FLUTE, "coloratura soprano"); - afi("cor", GM_FRENCH_HORN, "horn"); - afi("cornm", GM_BAGPIPE, "French bagpipe"); - afi("corno", GM_TRUMPET, "cornett"); - afi("cornt", GM_TRUMPET, "cornet"); - afi("crshc", GM_REVERSE_CYMBAL, "crash cymbal (kit)"); - afi("ctenor", GM_CHOIR_AAHS, "counter-tenor"); - afi("ctina", GM_ACCORDION, "concertina"); - afi("drmsp", GM_FLUTE, "dramatic soprano"); - afi("dulc", GM_DULCIMER, "dulcimer"); - afi("eguit", GM_ELECTRIC_GUITAR_CLEAN, "electric guitar"); - afi("fag_c", GM_BASSOON, "contrabassoon"); - afi("fagot", GM_BASSOON, "bassoon"); - afi("false", GM_RECORDER, "falsetto"); - afi("feme", GM_CHOIR_AAHS, "female voice"); - afi("fife", GM_BLOWN_BOTTLE, "fife"); - afi("fingc", GM_REVERSE_CYMBAL, "finger cymbal"); - afi("flt", GM_FLUTE, "flute"); - afi("flt_a", GM_FLUTE, "alto flute"); - afi("flt_b", GM_FLUTE, "bass flute"); - afi("fltda", GM_RECORDER, "alto recorder"); - afi("fltdb", GM_RECORDER, "bass recorder"); - afi("fltdn", GM_RECORDER, "sopranino recorder"); - afi("fltds", GM_RECORDER, "soprano recorder"); - afi("fltdt", GM_RECORDER, "tenor recorder"); - afi("flugh", GM_FRENCH_HORN, "flugelhorn"); - afi("forte", GM_HONKYTONK_PIANO, "fortepiano"); - afi("glock", GM_GLOCKENSPIEL, "glockenspiel"); - afi("gong", GM_STEEL_DRUMS, "gong"); - afi("guitr", GM_ACOUSTIC_GUITAR_NYLON, "guitar"); - afi("hammd", GM_DRAWBAR_ORGAN, "Hammond electronic organ"); - afi("heltn", GM_CHOIR_AAHS, "Heldentenor"); - afi("hichi", GM_OBOE, "hichiriki"); - afi("hurdy", GM_LEAD_CALLIOPE, "hurdy-gurdy"); - afi("kit", GM_SYNTH_DRUM, "drum kit"); - afi("kokyu", GM_FIDDLE, "kokyu (Japanese spike fiddle)"); - afi("komun", GM_KOTO, "komun'go (Korean long zither)"); - afi("koto", GM_KOTO, "koto (Japanese long zither)"); - afi("kruma", GM_TRUMPET, "alto crumhorn"); - afi("krumb", GM_TRUMPET, "bass crumhorn"); - afi("krums", GM_TRUMPET, "soprano crumhorn"); - afi("krumt", GM_TRUMPET, "tenor crumhorn"); - afi("liuto", GM_ACOUSTIC_GUITAR_NYLON, "lute"); - afi("lyrsp", GM_FLUTE, "lyric soprano"); - afi("lyrtn", GM_FRENCH_HORN, "lyric tenor"); - afi("male", GM_CHOIR_AAHS, "male voice"); - afi("mando", GM_ACOUSTIC_GUITAR_NYLON, "mandolin"); - afi("marac", GM_AGOGO, "maracas"); - afi("marim", GM_MARIMBA, "marimba"); - afi("mezzo", GM_CHOIR_AAHS, "mezzo soprano"); - afi("nfant", GM_CHOIR_AAHS, "child's voice"); - afi("nokan", GM_SHAKUHACHI, "nokan (a Japanese flute)"); - afi("oboeD", GM_ENGLISH_HORN, "oboe d'amore"); - afi("oboe", GM_OBOE, "oboe"); - afi("ocari", GM_OCARINA, "ocarina"); - afi("organ", GM_CHURCH_ORGAN, "pipe organ"); - afi("panpi", GM_PAN_FLUTE, "panpipe"); - afi("piano", GM_ACOUSTIC_GRAND_PIANO, "pianoforte"); - afi("piatt", GM_REVERSE_CYMBAL, "cymbals"); - afi("picco", GM_PICCOLO, "piccolo"); - afi("pipa", GM_ACOUSTIC_GUITAR_NYLON, "Chinese lute"); - afi("porta", GM_TANGO_ACCORDION, "portative organ"); - afi("psalt", GM_CLAVI, "psaltery (box zither)"); - afi("qin", GM_CLAVI, "qin, ch'in (Chinese zither)"); - afi("quitr", GM_ACOUSTIC_GUITAR_NYLON, "gittern"); - afi("rackt", GM_TRUMPET, "racket"); - afi("rebec", GM_ACOUSTIC_GUITAR_NYLON, "rebec"); - afi("recit", GM_CHOIR_AAHS, "recitativo"); - afi("reedo", GM_REED_ORGAN, "reed organ"); - afi("rhode", GM_ELECTRIC_PIANO_1, "Fender-Rhodes electric piano"); - afi("ridec", GM_REVERSE_CYMBAL, "ride cymbal (kit)"); - afi("sarod", GM_SITAR, "sarod"); - afi("sarus", GM_TUBA, "sarrusophone"); - afi("saxA", GM_ALTO_SAX, "E-flat alto saxophone"); - afi("saxB", GM_BARITONE_SAX, "B-flat bass saxophone"); - afi("saxC", GM_BARITONE_SAX, "E-flat contrabass saxophone"); - afi("saxN", GM_SOPRANO_SAX, "E-flat sopranino saxophone"); - afi("saxR", GM_BARITONE_SAX, "E-flat baritone saxophone"); - afi("saxS", GM_SOPRANO_SAX, "B-flat soprano saxophone"); - afi("saxT", GM_TENOR_SAX, "B-flat tenor saxophone"); - afi("sdrum", GM_SYNTH_DRUM, "snare drum (kit)"); - afi("shaku", GM_SHAKUHACHI, "shakuhachi"); - afi("shami", GM_SHAMISEN, "shamisen (Japanese fretless lute)"); - afi("sheng", GM_SHANAI, "mouth organ (Chinese)"); - afi("sho", GM_SHANAI, "mouth organ (Japanese)"); - afi("sitar", GM_SITAR, "sitar"); - afi("soprn", GM_CHOIR_AAHS, "soprano"); - afi("spshc", GM_REVERSE_CYMBAL, "splash cymbal (kit)"); - afi("steel", GM_STEEL_DRUMS, "steel-drum"); - afi("sxhA", GM_ALTO_SAX, "E-flat alto saxhorn"); - afi("sxhB", GM_BARITONE_SAX, "B-flat bass saxhorn"); - afi("sxhC", GM_BARITONE_SAX, "E-flat contrabass saxhorn"); - afi("sxhR", GM_BARITONE_SAX, "E-flat baritone saxhorn"); - afi("sxhS", GM_SOPRANO_SAX, "B-flat soprano saxhorn"); - afi("sxhT", GM_TENOR_SAX, "B-flat tenor saxhorn"); - afi("synth", GM_ELECTRIC_PIANO_2, "keyboard synthesizer"); - afi("tabla", GM_MELODIC_DRUM, "tabla"); - afi("tambn", GM_TINKLE_BELL, "tambourine"); - afi("tambu", GM_MELODIC_DRUM, "tambura"); - afi("tanbr", GM_MELODIC_DRUM, "tanbur"); - afi("tenor", GM_CHOIR_AAHS, "tenor"); - afi("timpa", GM_MELODIC_DRUM, "timpani"); - afi("tiorb", GM_ACOUSTIC_GUITAR_NYLON, "theorbo"); - afi("tom", GM_TAIKO_DRUM, "tom-tom drum"); - afi("trngl", GM_TINKLE_BELL, "triangle"); - afi("tromb", GM_TROMBONE, "bass trombone"); - afi("tromp", GM_TRUMPET, "trumpet"); - afi("tromt", GM_TROMBONE, "tenor trombone"); - afi("tuba", GM_TUBA, "tuba"); - afi("ud", GM_ACOUSTIC_GUITAR_NYLON, "ud"); - afi("ukule", GM_ACOUSTIC_GUITAR_NYLON, "ukulele"); - afi("vibra", GM_VIBRAPHONE, "vibraphone"); - afi("vina", GM_SITAR, "vina"); - afi("viola", GM_VIOLA, "viola"); - afi("violb", GM_CONTRABASS, "bass viola da gamba"); - afi("viold", GM_VIOLA, "viola d'amore"); - afi("violn", GM_VIOLIN, "violin"); - afi("violp", GM_VIOLIN, "piccolo violin"); - afi("viols", GM_VIOLIN, "treble viola da gamba"); - afi("violt", GM_CELLO, "tenor viola da gamba"); - afi("vox", GM_CHOIR_AAHS, "generic voice"); - afi("xylo", GM_XYLOPHONE, "xylophone"); - afi("zithr", GM_CLAVI, "zither"); - afi("zurna", GM_ACOUSTIC_GUITAR_NYLON, "zurna"); + m_data.reserve(500); + + // List has to be sorted by first parameter. Maybe put in map. + afi("accor", GM_ACCORDION, "accordion"); + afi("alto", GM_RECORDER, "alto"); + afi("anvil", GM_TINKLE_BELL, "anvil"); + afi("archl", GM_ACOUSTIC_GUITAR_NYLON, "archlute"); + afi("armon", GM_HARMONICA, "harmonica"); + afi("arpa", GM_ORCHESTRAL_HARP, "harp"); + afi("bagpI", GM_BAGPIPE, "bagpipe (Irish)"); + afi("bagpS", GM_BAGPIPE, "bagpipe (Scottish)"); + afi("banjo", GM_BANJO, "banjo"); + afi("bansu", GM_FLUTE, "bansuri"); + afi("barit", GM_CHOIR_AAHS, "baritone"); + afi("baset", GM_CLARINET, "bassett horn"); + afi("bass", GM_CHOIR_AAHS, "bass"); + afi("bdrum", GM_TAIKO_DRUM, "bass drum"); + afi("bguit", GM_ELECTRIC_BASS_FINGER, "electric bass guitar"); + afi("biwa", GM_FLUTE, "biwa"); + afi("bongo", GM_TAIKO_DRUM, "bongo"); + afi("brush", GM_BREATH_NOISE, "brush"); + afi("bscan", GM_CHOIR_AAHS, "basso cantante"); + afi("bspro", GM_CHOIR_AAHS, "basso profondo"); + afi("bugle", GM_TRUMPET, "bugle"); + afi("calam", GM_OBOE, "chalumeau"); + afi("calpe", GM_LEAD_CALLIOPE, "calliope"); + afi("calto", GM_CHOIR_AAHS, "contralto"); + afi("campn", GM_TUBULAR_BELLS, "bell"); + afi("cangl", GM_ENGLISH_HORN, "english horn"); + afi("canto", GM_CHOIR_AAHS, "canto"); + afi("caril", GM_TUBULAR_BELLS, "carillon"); + afi("castr", GM_CHOIR_AAHS, "castrato"); + afi("casts", GM_WOODBLOCKS, "castanets"); + afi("cbass", GM_CONTRABASS, "contrabass"); + afi("cello", GM_CELLO, "violoncello"); + afi("cemba", GM_HARPSICHORD, "harpsichord"); + afi("cetra", GM_VIOLIN, "cittern"); + afi("chain", GM_TINKLE_BELL, "chains"); + afi("chcym", GM_REVERSE_CYMBAL, "China cymbal"); + afi("chime", GM_TUBULAR_BELLS, "chimes"); + afi("chlma", GM_BASSOON, "alto shawm"); + afi("chlms", GM_BASSOON, "soprano shawm"); + afi("chlmt", GM_BASSOON, "tenor shawm"); + afi("clap", GM_GUNSHOT, "hand clapping"); + afi("clara", GM_CLARINET, "alto clarinet"); + afi("clarb", GM_CLARINET, "bass clarinet"); + afi("clarp", GM_CLARINET, "piccolo clarinet"); + afi("clars", GM_CLARINET, "clarinet"); + afi("clave", GM_AGOGO, "claves"); + afi("clavi", GM_CLAVI, "clavichord"); + afi("clest", GM_CELESTA, "celesta"); + afi("clrno", GM_TRUMPET, "clarino"); + afi("colsp", GM_FLUTE, "coloratura soprano"); + afi("conga", GM_TAIKO_DRUM, "conga"); + afi("cor", GM_FRENCH_HORN, "horn"); + afi("cornm", GM_BAGPIPE, "French bagpipe"); + afi("corno", GM_TRUMPET, "cornett"); + afi("cornt", GM_TRUMPET, "cornet"); + afi("coro", GM_CHOIR_AAHS, "chorus"); + afi("crshc", GM_REVERSE_CYMBAL, "crash cymbal"); + afi("ctenor", GM_CHOIR_AAHS, "counter-tenor"); + afi("ctina", GM_ACCORDION, "concertina"); + afi("drmsp", GM_FLUTE, "dramatic soprano"); + afi("drum", GM_SYNTH_DRUM, "drum"); + afi("drumP", GM_SYNTH_DRUM, "small drum"); + afi("dulc", GM_DULCIMER, "dulcimer"); + afi("eguit", GM_ELECTRIC_GUITAR_CLEAN, "electric guitar"); + afi("fag_c", GM_BASSOON, "contrabassoon"); + afi("fagot", GM_BASSOON, "bassoon"); + afi("false", GM_RECORDER, "falsetto"); + afi("fdrum", GM_TAIKO_DRUM, "frame drum"); + afi("feme", GM_CHOIR_AAHS, "female voice"); + afi("fife", GM_BLOWN_BOTTLE, "fife"); + afi("fingc", GM_REVERSE_CYMBAL, "finger cymbal"); + afi("flt", GM_FLUTE, "flute"); + afi("flt_a", GM_FLUTE, "alto flute"); + afi("flt_b", GM_FLUTE, "bass flute"); + afi("fltda", GM_RECORDER, "alto recorder"); + afi("fltdb", GM_RECORDER, "bass recorder"); + afi("fltdn", GM_RECORDER, "sopranino recorder"); + afi("fltds", GM_RECORDER, "soprano recorder"); + afi("fltdt", GM_RECORDER, "tenor recorder"); + afi("flugh", GM_FRENCH_HORN, "flugelhorn"); + afi("forte", GM_HONKYTONK_PIANO, "fortepiano"); + afi("gen", GM_ACOUSTIC_GRAND_PIANO, "generic instrument"); + afi("genB", GM_ACOUSTIC_GRAND_PIANO, "generic bass instrument"); + afi("genT", GM_ACOUSTIC_GRAND_PIANO, "generic treble instrument"); + afi("glock", GM_GLOCKENSPIEL, "glockenspiel"); + afi("gong", GM_REVERSE_CYMBAL, "gong"); + afi("guitr", GM_ACOUSTIC_GUITAR_NYLON, "guitar"); + afi("hammd", GM_DRAWBAR_ORGAN, "Hammond electronic organ"); + afi("hbell", GM_TINKLE_BELL, "handbell"); + afi("hbell", GM_TINKLE_BELL, "handbell"); + afi("heck", GM_BASSOON, "heckelphone"); + afi("heltn", GM_CHOIR_AAHS, "Heldentenor"); + afi("hichi", GM_OBOE, "hichiriki"); + afi("hurdy", GM_LEAD_CALLIOPE, "hurdy-gurdy"); + afi("kitv", GM_VIOLIN, "kit violin"); + afi("klav", GM_ACOUSTIC_GRAND_PIANO, "keyboard"); + afi("kokyu", GM_FIDDLE, "kokyu"); + afi("komun", GM_KOTO, "komun'go"); + afi("koto", GM_KOTO, "koto"); + afi("kruma", GM_TRUMPET, "alto crumhorn"); + afi("krumb", GM_TRUMPET, "bass crumhorn"); + afi("krums", GM_TRUMPET, "soprano crumhorn"); + afi("krumt", GM_TRUMPET, "tenor crumhorn"); + afi("lion", GM_AGOGO, "lion's roar"); + afi("liuto", GM_ACOUSTIC_GUITAR_NYLON, "lute"); + afi("lyrsp", GM_FLUTE, "lyric soprano"); + afi("lyrtn", GM_FRENCH_HORN, "lyric tenor"); + afi("male", GM_CHOIR_AAHS, "male voice"); + afi("mando", GM_ACOUSTIC_GUITAR_NYLON, "mandolin"); + afi("marac", GM_AGOGO, "maracas"); + afi("marim", GM_MARIMBA, "marimba"); + afi("mbari", GM_CHOIR_AAHS, "high baritone"); + afi("mezzo", GM_CHOIR_AAHS, "mezzo soprano"); + afi("nfant", GM_CHOIR_AAHS, "child's voice"); + afi("nokan", GM_SHAKUHACHI, "nokan"); + afi("oboe", GM_OBOE, "oboe"); + afi("oboeD", GM_ENGLISH_HORN, "oboe d'amore"); + afi("ocari", GM_OCARINA, "ocarina"); + afi("ondes", GM_PAD_SWEEP, "ondes Martenot"); + afi("ophic", GM_TUBA, "ophicleide"); + afi("organ", GM_CHURCH_ORGAN, "pipe organ"); + afi("oud", GM_ACOUSTIC_GUITAR_NYLON, "oud"); + afi("paila", GM_AGOGO, "timbales"); + afi("panpi", GM_PAN_FLUTE, "panpipe"); + afi("pbell", GM_TUBULAR_BELLS, "bell plate"); + afi("pguit", GM_ACOUSTIC_GUITAR_NYLON, "Portuguese guitar"); + afi("physh", GM_REED_ORGAN, "physharmonica"); + afi("piano", GM_ACOUSTIC_GRAND_PIANO, "pianoforte"); + afi("piatt", GM_REVERSE_CYMBAL, "cymbals"); + afi("picco", GM_PICCOLO, "piccolo"); + afi("pipa", GM_ACOUSTIC_GUITAR_NYLON, "Chinese lute"); + afi("porta", GM_TANGO_ACCORDION, "portative organ"); + afi("psalt", GM_CLAVI, "psaltery"); + afi("qin", GM_CLAVI, "qin"); + afi("quinto", GM_CHOIR_AAHS, "quinto"); + afi("quitr", GM_ACOUSTIC_GUITAR_NYLON, "gittern"); + afi("rackt", GM_TRUMPET, "racket"); + afi("ratl", GM_WOODBLOCKS, "rattle"); + afi("rebec", GM_ACOUSTIC_GUITAR_NYLON, "rebec"); + afi("recit", GM_CHOIR_AAHS, "recitativo"); + afi("reedo", GM_REED_ORGAN, "reed organ"); + afi("rhode", GM_ELECTRIC_PIANO_1, "Fender-Rhodes electric piano"); + afi("ridec", GM_REVERSE_CYMBAL, "ride cymbal"); + afi("sarod", GM_SITAR, "sarod"); + afi("sarus", GM_TUBA, "sarrusophone"); + afi("saxA", GM_ALTO_SAX, "alto saxophone"); + afi("saxB", GM_BARITONE_SAX, "bass saxophone"); + afi("saxC", GM_BARITONE_SAX, "contrabass saxophone"); + afi("saxN", GM_SOPRANO_SAX, "sopranino saxophone"); + afi("saxR", GM_BARITONE_SAX, "baritone saxophone"); + afi("saxS", GM_SOPRANO_SAX, "soprano saxophone"); + afi("saxT", GM_TENOR_SAX, "tenor saxophone"); + afi("sbell", GM_TINKLE_BELL, "sleigh bells"); + afi("sdrum", GM_SYNTH_DRUM, "snare drum (kit)"); + afi("shaku", GM_SHAKUHACHI, "shakuhachi"); + afi("shami", GM_SHAMISEN, "shamisen"); + afi("sheng", GM_SHANAI, "sheng"); + afi("sho", GM_SHANAI, "sho"); + afi("siren", GM_FX_SCI_FI, "siren"); + afi("sitar", GM_SITAR, "sitar"); + afi("slap", GM_GUNSHOT, "slapstick"); + afi("soprn", GM_CHOIR_AAHS, "soprano"); + afi("spshc", GM_REVERSE_CYMBAL, "splash cymbal"); + afi("steel", GM_STEEL_DRUMS, "steel-drum"); + afi("stim", GM_SEASHORE, "Sprechstimme"); + afi("stimA", GM_SEASHORE, "Sprechstimme, alto"); + afi("stimB", GM_SEASHORE, "Sprechstimme, bass"); + afi("stimC", GM_SEASHORE, "Sprechstimme, contralto"); + afi("stimR", GM_SEASHORE, "Sprechstimme, baritone"); + afi("stimS", GM_SEASHORE, "Sprechstimme, soprano"); + afi("strdr", GM_AGOGO, "string drum"); + afi("sxhA", GM_ALTO_SAX, "alto saxhorn"); + afi("sxhB", GM_BARITONE_SAX, "bass saxhorn"); + afi("sxhC", GM_BARITONE_SAX, "contrabass saxhorn"); + afi("sxhR", GM_BARITONE_SAX, "baritone saxhorn"); + afi("sxhS", GM_SOPRANO_SAX, "soprano saxhorn"); + afi("sxhT", GM_TENOR_SAX, "tenor saxhorn"); + afi("synth", GM_ELECTRIC_PIANO_2, "keyboard synthesizer"); + afi("tabla", GM_MELODIC_DRUM, "tabla"); + afi("tambn", GM_TINKLE_BELL, "tambourine"); + afi("tambu", GM_MELODIC_DRUM, "tambura"); + afi("tanbr", GM_MELODIC_DRUM, "tanbur"); + afi("tblok", GM_WOODBLOCKS, "temple blocks"); + afi("tdrum", GM_SYNTH_DRUM, "tenor drum"); + afi("tenor", GM_CHOIR_AAHS, "tenor"); + afi("timpa", GM_MELODIC_DRUM, "timpani"); + afi("tiorb", GM_ACOUSTIC_GUITAR_NYLON, "theorbo"); + afi("tom", GM_TAIKO_DRUM, "tom-tom drum"); + afi("trngl", GM_TINKLE_BELL, "triangle"); + afi("tromb", GM_TROMBONE, "bass trombone"); + afi("tromp", GM_TRUMPET, "trumpet"); + afi("tromt", GM_TROMBONE, "tenor trombone"); + afi("tuba", GM_TUBA, "tuba"); + afi("tubaB", GM_TUBA, "bass tuba"); + afi("tubaC", GM_TUBA, "contrabass tuba"); + afi("tubaT", GM_TUBA, "tenor tuba"); + afi("tubaU", GM_TUBA, "subcontra tuba"); + afi("ukule", GM_ACOUSTIC_GUITAR_NYLON, "ukulele"); + afi("vibra", GM_VIBRAPHONE, "vibraphone"); + afi("vina", GM_SITAR, "vina"); + afi("viola", GM_VIOLA, "viola"); + afi("violb", GM_CONTRABASS, "bass viola da gamba"); + afi("viold", GM_VIOLA, "viola d'amore"); + afi("violn", GM_VIOLIN, "violin"); + afi("violp", GM_VIOLIN, "piccolo violin"); + afi("viols", GM_VIOLIN, "treble viola da gamba"); + afi("violt", GM_CELLO, "tenor viola da gamba"); + afi("vox", GM_CHOIR_AAHS, "generic voice"); + afi("wblok", GM_WOODBLOCKS, "woodblock"); + afi("xylo", GM_XYLOPHONE, "xylophone"); + afi("zithr", GM_CLAVI, "zither"); + afi("zurna", GM_ACOUSTIC_GUITAR_NYLON, "zurna"); + } @@ -14468,7 +14919,7 @@ void HumInstrument::afi(const char* humdrum_name, int midinum, x.humdrum = humdrum_name; x.gm = midinum; - data.push_back(x); + m_data.push_back(x); } @@ -14485,14 +14936,14 @@ int HumInstrument::find(const string& Hname) { key.name = ""; key.gm = 0; - searchResult = bsearch(&key, data.data(), - data.size(), sizeof(_HumInstrument), + searchResult = bsearch(&key, m_data.data(), + m_data.size(), sizeof(_HumInstrument), &data_compare_by_humdrum_name); if (searchResult == NULL) { return -1; } else { - return (int)(((TEMP64BITFIX)(searchResult)) - ((TEMP64BITFIX)(data.data())))/ + return (int)(((TEMP64BITFIX)(searchResult)) - ((TEMP64BITFIX)(m_data.data())))/ sizeof(_HumInstrument); } } @@ -14518,7 +14969,7 @@ int HumInstrument::data_compare_by_humdrum_name(const void* a, // void HumInstrument::sortData(void) { - qsort(data.data(), data.size(), sizeof(_HumInstrument), + qsort(m_data.data(), m_data.size(), sizeof(_HumInstrument), &HumInstrument::data_compare_by_humdrum_name); } @@ -20089,24 +20540,16 @@ bool HumdrumFileBase::read(const char* filename) { bool HumdrumFileBase::read(istream& contents) { - clear(); - m_displayError = true; - char buffer[123123] = {0}; - HLp s; - while (contents.getline(buffer, sizeof(buffer), '\n')) { - s = new HumdrumLine(buffer); - s->setOwner(this); - m_lines.push_back(s); - } - return analyzeBaseFromLines(); -/* - if (!analyzeTokens()) { return isValid(); } - if (!analyzeLines() ) { return isValid(); } - if (!analyzeSpines()) { return isValid(); } - if (!analyzeLinks() ) { return isValid(); } - if (!analyzeTracks()) { return isValid(); } - return isValid(); -*/ + clear(); + m_displayError = true; + std::string buffer; + HLp s; + while (std::getline(contents, buffer)) { + s = new HumdrumLine(buffer); + s->setOwner(this); + m_lines.push_back(s); + } + return analyzeBaseFromLines(); } @@ -20170,6 +20613,39 @@ bool HumdrumFileBase::analyzeBaseFromLines(void) { +////////////////////////////// +// +// HumdrumFileBase::setFilenameFromSegment -- Update filename based on any +// !!!!SEGMENT: line at the top of the file. +// + +void HumdrumFileBase::setFilenameFromSegment(void) { + HumdrumFileBase& infile = *this; + for (int i=0; ianalyzeOttavas(); @@ -22620,7 +23121,17 @@ bool HumdrumFileContent::analyzeKernAccidentals(void) { // ktracks == List of **kern spines in data. // rtracks == Reverse mapping from track to ktrack index (part/staff index). - vector ktracks = getKernSpineStartList(); + vector ktracks; + if ((dataType == "**kern") || dataType.empty()) { + ktracks = getKernSpineStartList(); + } else if (dataType == "**mens") { + getSpineStartList(ktracks, "**mens"); + } else { + getSpineStartList(ktracks, dataType); + } + if (ktracks.empty()) { + return true; + } vector rtracks(getMaxTrack()+1, -1); for (i=0; i<(int)ktracks.size(); i++) { track = ktracks[i]->getTrack(); @@ -23009,10 +23520,10 @@ bool HumdrumFileContent::analyzeKernAccidentals(void) { if ((loc != string::npos) && (loc > 0)) { if (subtok[loc-1] == '#') { token->setValue("auto", to_string(k), "cautionaryAccidental", "true"); - token->setValue("auto", to_string(k), "visualAccidental", "true"); + token->setValue("auto", to_string(k), "visualAccidental", "true"); } else if (subtok[loc-1] == '-') { token->setValue("auto", to_string(k), "cautionaryAccidental", "true"); - token->setValue("auto", to_string(k), "visualAccidental", "true"); + token->setValue("auto", to_string(k), "visualAccidental", "true"); } else if (subtok[loc-1] == 'n') { token->setValue("auto", to_string(k), "cautionaryAccidental", "true"); token->setValue("auto", to_string(k), "visualAccidental", "true"); @@ -23025,7 +23536,8 @@ bool HumdrumFileContent::analyzeKernAccidentals(void) { } // Indicate that the accidental analysis has been done: - infile.setValue("auto", "accidentalAnalysis", "true"); + string dataTypeDone = "accidentalAnalysis" + dataType; + infile.setValue("auto", dataTypeDone, "true"); return true; } @@ -23039,23 +23551,26 @@ bool HumdrumFileContent::analyzeKernAccidentals(void) { // only by HumdrumFileContent::analyzeKernAccidentals(). // -void HumdrumFileContent::fillKeySignature(vector& states, - const string& keysig) { +void HumdrumFileContent::fillKeySignature(vector& states, const string& keysig) { + if (states.size() < 7) { + cerr << "In HumdrumFileContent::fillKeySignature, states is too small: " << states.size() << endl; + return; + } std::fill(states.begin(), states.end(), 0); - if (keysig.find("f#") != string::npos) { states[3] = +1; } - if (keysig.find("c#") != string::npos) { states[0] = +1; } - if (keysig.find("g#") != string::npos) { states[4] = +1; } - if (keysig.find("d#") != string::npos) { states[1] = +1; } - if (keysig.find("a#") != string::npos) { states[5] = +1; } - if (keysig.find("e#") != string::npos) { states[2] = +1; } - if (keysig.find("b#") != string::npos) { states[6] = +1; } - if (keysig.find("b-") != string::npos) { states[6] = -1; } - if (keysig.find("e-") != string::npos) { states[2] = -1; } - if (keysig.find("a-") != string::npos) { states[5] = -1; } - if (keysig.find("d-") != string::npos) { states[1] = -1; } - if (keysig.find("g-") != string::npos) { states[4] = -1; } - if (keysig.find("c-") != string::npos) { states[0] = -1; } - if (keysig.find("f-") != string::npos) { states[3] = -1; } + if (keysig.find("f#") != string::npos) { states.at(3) = +1; } + if (keysig.find("c#") != string::npos) { states.at(0) = +1; } + if (keysig.find("g#") != string::npos) { states.at(4) = +1; } + if (keysig.find("d#") != string::npos) { states.at(1) = +1; } + if (keysig.find("a#") != string::npos) { states.at(5) = +1; } + if (keysig.find("e#") != string::npos) { states.at(2) = +1; } + if (keysig.find("b#") != string::npos) { states.at(6) = +1; } + if (keysig.find("b-") != string::npos) { states.at(6) = -1; } + if (keysig.find("e-") != string::npos) { states.at(2) = -1; } + if (keysig.find("a-") != string::npos) { states.at(5) = -1; } + if (keysig.find("d-") != string::npos) { states.at(1) = -1; } + if (keysig.find("g-") != string::npos) { states.at(4) = -1; } + if (keysig.find("c-") != string::npos) { states.at(0) = -1; } + if (keysig.find("f-") != string::npos) { states.at(3) = -1; } } @@ -23714,6 +24229,147 @@ void HumdrumFileContent::markBeamSpanMembers(HTp beamstart, HTp beamend) { + +////////////////////////////// +// +// HumdrumFileContent::doHandAnalysis -- Returns true if any **kern spine has hand markup. +// default value: +// attacksOnlyQ = false; +// + +bool HumdrumFileContent::doHandAnalysis(bool attacksOnlyQ) { + HumdrumFileContent& infile = *this; + vector kstarts = infile.getKernSpineStartList(); + bool status = 0; + for (int i=0; i<(int)kstarts.size(); i++) { + status |= doHandAnalysis(kstarts[i], attacksOnlyQ); + } + return status; +} + + +bool HumdrumFileContent::doHandAnalysis(HTp startSpine, bool attacksOnlyQ) { + if (!startSpine->isKern()) { + return false; + } + bool output = false; + vector states(20); + states[0] = "none"; + HTp current = startSpine->getNextToken(); + while (current) { + int subtrack = current->getSubtrack(); + if (subtrack == 0) { + for (int i=1; i<(int)states.size(); i++) { + states[i] = states[0]; + } + } + + if (current->isInterpretation()) { + if (subtrack == 0) { + if (*current == "*LH") { + states[0] = "LH"; + output = true; + for (int i=1; i<(int)states.size(); i++) { + states[i] = states[0]; + } + } else if (*current == "*RH") { + states[0] = "RH"; + output = true; + for (int i=1; i<(int)states.size(); i++) { + states[i] = states[0]; + } + } + } else { + int ttrack = current->getTrack(); + HTp c2 = current; + while (c2) { + int track = c2->getTrack(); + if (track != ttrack) { + break; + } + int sub = c2->getSubtrack(); + if (*c2 == "*LH") { + states.at(sub) = "LH"; + if (sub == 1) { + states.at(0) = "LH"; + } + } else if (*c2 == "*RH") { + states.at(sub) = "RH"; + if (sub == 1) { + states.at(0) = "RH"; + } + } + c2 = c2->getNextFieldToken(); + } + } + } + + if (!current->isData()) { + current = current->getNextToken(); + continue; + } + + if (subtrack == 0) { + // no subspines + if (attacksOnlyQ && current->isNoteAttack()) { + current->setValue("auto", "hand", states[0]); + } else { + current->setValue("auto", "hand", states[0]); + } + } else { + int ttrack = current->getTrack(); + HTp c2 = current; + while (c2) { + int track = c2->getTrack(); + if (track != ttrack) { + break; + } + if (attacksOnlyQ && !c2->isNoteAttack()) { + c2 = c2->getNextFieldToken(); + continue; + } + int sub = c2->getSubtrack(); + if (states.at(sub).empty()) { + c2->setValue("auto", "hand", states.at(0)); + } else { + c2->setValue("auto", "hand", states.at(sub)); + } + c2 = c2->getNextFieldToken(); + } + } + current = current->getNextToken(); + continue; + } + if (output) { + startSpine->setValue("auto", "hand", 1); + } + return output; +} + + + + + +////////////////////////////// +// +// HumdrumFileContent::getTrackToKernIndex -- return a list indexed by file track +// numbers (first entry not used), with non-zero values in the vector being +// the **kern index with the given track number. +// + +vector HumdrumFileContent::getTrackToKernIndex(void) { + HumdrumFileContent& infile = *this; + vector ktracks = infile.getKernSpineStartList(); + vector trackToKernIndex(infile.getMaxTrack() + 1, -1); + for (int i=0; i<(int)ktracks.size(); i++) { + int track = ktracks[i]->getTrack(); + trackToKernIndex[track] = i; + } + return trackToKernIndex; +} + + + ////////////////////////////// // // HumdrumFileStructure::getMetricLevels -- Each line in the output @@ -23806,6 +24462,87 @@ void HumdrumFileContent::getMetricLevels(vector& output, +///////////////////////////////// +// +// HumdrumFileContent::fillMidiInfo -- Create a data structure that +// organizes tokens by track/midi note number. +// Input object to fill is firsted indexed the **kern track +// number, then by MIDI note number, and then an array of pairs +// where int is the subtoken number in the token +// for the given MIDI note. + + +void HumdrumFileContent::fillMidiInfo(vector>>>& trackMidi) { + HumdrumFileContent& infile = *this; + vector ktracks = infile.getKernSpineStartList(); + trackMidi.clear(); + trackMidi.resize(ktracks.size()); + for (int i=0; i<(int)trackMidi.size(); i++) { + trackMidi[i].resize(128); // 0 used for rests + } + // each entry is trackMidi[track][key] is an array of pairs. + // using trackMidi[track][0] for rests; + + vector trackToKernIndex = infile.getTrackToKernIndex(); + + for (int i=0; iisKern()) { + continue; + } + + int track = sstart->getTrack(); + HTp send = infile.getStrandEnd(i); + processStrandNotesForMidi(sstart, send, trackMidi[trackToKernIndex[track]]); + } +} + + + +///////////////////////////////// +// +// HumdrumFileContent::processStrandNotesForMidi -- store strand tokens/subtokens by MIDI note +// in the midi track entry. +// +// First index if track info is the MIDI note number, second is a list +// of tokens for that note number, with the second value of the pair +// giving the subtoken index of the note in the token. +// + +void HumdrumFileContent::processStrandNotesForMidi(HTp sstart, HTp send, vector>>& trackInfo) { + HTp current = sstart->getNextToken(); + while (current && (current != send)) { + if (!current->isData() || current->isNull()) { + current = current->getNextToken(); + continue; + } + vector subtokens = current->getSubtokens(); + for (int i=0; i<(int)subtokens.size(); i++) { + if (subtokens[i] == ".") { + // something strange happened (no null tokens expected) + continue; + } + if (subtokens[i].find("r") != string::npos) { + // rest, so store in MIDI[0] + trackInfo.at(0).emplace_back(current, 0); + } else if (subtokens[i].find("R") != string::npos) { + // unpitched or quasi-pitched note, so store in MIDI[0] + trackInfo.at(0).emplace_back(current, 0); + } else { + int keyno = Convert::kernToMidiNoteNumber(subtokens[i]); + if ((keyno >= 0) && (keyno < 128)) { + trackInfo.at(keyno).emplace_back(current, i); + } + } + } + current = current->getNextToken(); + } +} + + + + + ////////////////////////////// // // HumdrumFileContent::analyzeCrossStaffStemDirections -- Calculate stem directions @@ -24616,10 +25353,15 @@ void HumdrumFileContent::linkPhraseEndpoints(HTp phrasestart, HTp phraseend) { void HumdrumFileContent::analyzeRestPositions(void) { vector kernstarts = getKernSpineStartList(); - for (int i=0; i<(int)kernstarts.size(); i++) { - assignImplicitVerticalRestPositions(kernstarts[i]); - } + // Now using verovio automatic rest positions, so not calcualting + // by default anymore. This code can be uncommented out if explicit + // rest positions are needed for other purposes. + //for (int i=0; i<(int)kernstarts.size(); i++) { + // assignImplicitVerticalRestPositions(kernstarts[i]); + //} + + // Check for explicit positioning: checkForExplicitVerticalRestPositions(); } @@ -26933,6 +27675,13 @@ int HumdrumFileStream::getFile(HumdrumFile& infile) { restarting: + stringstream buffer; + string templine; + if (!m_newfilebuffer.empty()) { + buffer << m_newfilebuffer << endl; + m_newfilebuffer = ""; + } + newinput = NULL; if (m_urlbuffer.eof()) { @@ -26965,21 +27714,21 @@ int HumdrumFileStream::getFile(HumdrumFile& infile) { // (3) If ifstream is closed but there is a file to be processed, // load it into the ifstream and start processing it immediately. else if (((int)m_filelist.size() > 0) && - (m_curfile < (int)m_filelist.size()-1)) { + (m_curfile < (int)m_filelist.size()-1)) { m_curfile++; if (m_instream.is_open()) { m_instream.close(); } - if (strstr(m_filelist[m_curfile].c_str(), "://") != NULL) { + if (m_filelist[m_curfile].find("://") != string::npos) { // The next file to read is a URL/URI, so buffer the // data from the internet and start reading that instead // of reading from a file on the hard disk. - fillUrlBuffer(m_urlbuffer, m_filelist[m_curfile].c_str()); - infile.setFilename(m_filelist[m_curfile].c_str()); + fillUrlBuffer(m_urlbuffer, m_filelist[m_curfile]); + infile.setFilename(m_filelist[m_curfile]); goto restarting; } - m_instream.open(m_filelist[m_curfile].c_str()); - infile.setFilename(m_filelist[m_curfile].c_str()); + m_instream.open(m_filelist[m_curfile]); + infile.setFilename(m_filelist[m_curfile]); if (!m_instream.is_open()) { // file does not exist or cannot be opened close // the file and try luck with next file in the list @@ -27006,17 +27755,16 @@ int HumdrumFileStream::getFile(HumdrumFile& infile) { if (m_newfilebuffer.size() > 0) { // store the filename for the current HumdrumFile being read: HumRegex hre; - if (hre.search(m_newfilebuffer, - R"(^!!!!SEGMENT\s*([+-]?\d+)?\s*:\s*(.*)\s*$)")) { + if (hre.search(m_newfilebuffer, R"(^!!!!SEGMENT\s*([+-]?\d+)?\s*:\s*(.*)\s*$)")) { if (hre.getMatchLength(1) > 0) { - infile.setSegmentLevel(atoi(hre.getMatch(1).c_str())); + infile.setSegmentLevel(hre.getMatchInt(1)); } else { infile.setSegmentLevel(0); } infile.setFilename(hre.getMatch(2)); } else if ((m_curfile >=0) && (m_curfile < (int)m_filelist.size()) - && (m_filelist.size() > 0)) { - infile.setFilename(m_filelist[m_curfile].c_str()); + && (m_filelist.size() > 0)) { + infile.setFilename(m_filelist[m_curfile]); } else { // reading from standard input, but no name. } @@ -27027,7 +27775,6 @@ int HumdrumFileStream::getFile(HumdrumFile& infile) { return 0; } - stringstream buffer; int foundUniversalQ = 0; // Start reading the input stream. If !!!!SEGMENT: universal comment @@ -27035,15 +27782,13 @@ int HumdrumFileStream::getFile(HumdrumFile& infile) { // newly read HumdrumFile. If other universal comments are found, then // overwrite the old universal comments here. - int addedFilename = 0; - //int searchName = 0; + // int addedFilename = 0; int dataFoundQ = 0; int starstarFoundQ = 0; int starminusFoundQ = 0; if (m_newfilebuffer.size() < 4) { //searchName = 1; } - char templine[123123] = {0}; if (newinput->eof()) { if (m_curfile < (int)m_filelist.size()-1) { @@ -27058,85 +27803,49 @@ int HumdrumFileStream::getFile(HumdrumFile& infile) { // if the previous line from the last read starts with "**" // then treat it as part of the current file. - if ((m_newfilebuffer.size() > 1) && - (strncmp(m_newfilebuffer.c_str(), "**", 2)) == 0) { + if ((m_newfilebuffer.size() > 1) && (m_newfilebuffer.compare(0, 2, "**") == 0)) { buffer << m_newfilebuffer << "\n"; m_newfilebuffer = ""; starstarFoundQ = 1; } while (!input.eof()) { - input.getline(templine, 123123, '\n'); - if ((!dataFoundQ) && - (strncmp(templine, "!!!!SEGMENT", strlen("!!!!SEGMENT")) == 0)) { - string tempstring; - tempstring = templine; - HumRegex hre; - if (hre.search(tempstring, - "^!!!!SEGMENT\\s*([+-]?\\d+)?\\s*:\\s*(.*)\\s*$")) { - if (hre.getMatchLength(1) > 0) { - infile.setSegmentLevel(atoi(hre.getMatch(1).c_str())); - } else { - infile.setSegmentLevel(0); - } - infile.setFilename(hre.getMatch(2)); + getline(input, templine); + if (templine.compare(0, strlen("!!!!SEGMENT"), "!!!!SEGMENT") == 0) { + // Store the current segment line in the buffer before breaking. + if (!buffer.str().empty()) { + m_newfilebuffer = templine; + break; } + m_newfilebuffer = templine; } - if (strncmp(templine, "**", 2) == 0) { + if (templine.compare(0, 2, "**") == 0) { if (starstarFoundQ == 1) { m_newfilebuffer = templine; // already found a **, so this one is defined as a file // segment. Exit from the loop and process the previous - // content, waiting until the next read for to start with + // content, waiting until the next read to start with // this line. break; } starstarFoundQ = 1; } - if (input.eof() && (strcmp(templine, "") == 0)) { + if (input.eof() && templine.empty()) { // No more data coming from current stream, so this is // the end of the HumdrumFile. Break from the while loop // and then store the read contents of the stream in the // HumdrumFile. break; } - // (1) Does the line start with "!!!!SEGMENT"? If so, then - // this is either the name of the current or next file to process. - // (1a) this is the name of the current file to process if no - // data has yet been found, - // (1b) or a name is being actively searched for. - if (strncmp(templine, "!!!!SEGMENT", strlen("!!!!SEGMENT")) == 0) { - m_newfilebuffer = templine; - if (dataFoundQ) { - // this new filename is for the next chunk to process in the - // current file stream, not this one, so stop reading the - // HumdrumFile content and send what has already been read back - // out with new contents. - } else { - // !!!!SEGMENT: came before any real data was read, so - // it is most likely the name of the current file - // (i.e., it comes at the start of the file stream and - // is the name of the first HumdrumFile in the stream). - HumRegex hre; - if (hre.search(m_newfilebuffer, - R"(^!!!!SEGMENT\s*([+-]?\d+)?\s:\s*(.*)\s*$)")) { - if (hre.getMatchLength(1) > 0) { - infile.setSegmentLevel(atoi(hre.getMatch(1).c_str())); - } else { - infile.setSegmentLevel(0); - } - infile.setFilename(hre.getMatch(2)); - } - } - } - int len = (int)strlen(templine); - if ((len > 4) && (strncmp(templine, "!!!!", 4) == 0) && - (templine[4] != '!') && - (dataFoundQ == 0) && - (strncmp(templine, "!!!!filter:", strlen("!!!!filter:")) != 0) && - (strncmp(templine, "!!!!SEGMENT:", strlen("!!!!SEGMENT:")) != 0)) { + + int len = templine.length(); + if ((len > 4) && (templine.compare(0, 4, "!!!!") == 0) && + (templine[4] != '!') && + (dataFoundQ == 0) && + (templine.compare(0, strlen("!!!!filter:"), "!!!!filter:") != 0) && + (templine.compare(0, strlen("!!!!SEGMENT:"), "!!!!SEGMENT:") != 0)) { // This is a universal comment. Should it be appended // to the list or should the current list be erased and // this record placed into the first entry? @@ -27154,39 +27863,33 @@ int HumdrumFileStream::getFile(HumdrumFile& infile) { continue; } - if (strncmp(templine, "*-", 2) == 0) { + if (templine.compare(0, 2, "*-") == 0) { starminusFoundQ = 1; } - // if before first ** in a data file or after *-, and the line - // does not start with '!' or '*', then assume that it is a file - // name which should be added to the file list to read. - if (((starminusFoundQ == 1) || (starstarFoundQ == 0)) - && (templine[0] != '*') && (templine[0] != '!')) { - if ((templine[0] != '\0') && (templine[0] != ' ')) { - // The file can only be added once in this manner - // so that infinite loops are prevented. + if (((starminusFoundQ == 1) || (starstarFoundQ == 0)) && (templine[0] != '*') && (templine[0] != '!')) { + if ((!templine.empty()) && (templine[0] != ' ')) { int found = 0; - for (int mm=0; mm<(int)m_filelist.size(); mm++) { - if (strcmp(m_filelist[mm].c_str(), templine) == 0) { + for (int mm = 0; mm < (int)m_filelist.size(); mm++) { + if (m_filelist[mm] == templine) { found = 1; } } if (!found) { m_filelist.push_back(templine); - addedFilename = 1; + // addedFilename = 1; } continue; } } dataFoundQ = 1; // found something other than universal comments - // should empty lines be treated somewhat as universal comments? // store the data line for later parsing into HumdrumFile record: buffer << templine << "\n"; } +/* if (dataFoundQ == 0) { // never found anything for some strange reason. if (addedFilename) { @@ -27194,6 +27897,7 @@ int HumdrumFileStream::getFile(HumdrumFile& infile) { } return 0; } +*/ // Arriving here means that reading of the data stream is complete. // The string stream variable "buffer" contains the HumdrumFile @@ -27205,29 +27909,33 @@ int HumdrumFileStream::getFile(HumdrumFile& infile) { contents.str(""); // empty any contents in buffer contents.clear(); // reset error flags in buffer - for (int i=0; i<(int)m_universals.size(); i++) { - // Convert universals reference records to globals, but do not demote !!!!filter: + for (int i=0; i < (int)m_universals.size(); i++) { if (m_universals[i].compare(0, 11, "!!!!filter:") == 0) { continue; } contents << &(m_universals[i][1]) << "\n"; } + contents << buffer.str(); - string filename = infile.getFilename(); + string oldfilename = infile.getFilename(); infile.readNoRhythm(contents); - if (!filename.empty()) { - infile.setFilename(filename); + string newfilename = infile.getFilename(); + if (newfilename.empty() && !oldfilename.empty()) { + infile.setFilename(oldfilename); } + infile.setFilenameFromSegment(); + return 1; } + + ////////////////////////////// // // HumdrumFileStream::fillUrlBuffer -- // - void HumdrumFileStream::fillUrlBuffer(stringstream& uribuffer, const string& uriname) { #ifdef USING_URI @@ -27283,7 +27991,7 @@ void HumdrumFileStructure::analyzeStropheMarkers(void) { // Store the new strophe. laststrophe[spineinfo] = token; } - } else if (*token == "*Xstrophe") { + } else if ((*token == "*Xstrophe") || (*token == "*S-")) { string spineinfo = token->getSpineInfo(); HTp lastone = laststrophe[spineinfo]; if (lastone) { @@ -27394,6 +28102,10 @@ bool HumdrumFileStructure::analyzeStrophes(void) { if (*current == "*Xstrophe") { break; } + if (*current == "*S-") { + // Alternate for *Xstrophe + break; + } current->setStrophe(strophestarts[i]); current = current->getNextToken(); } @@ -30658,7 +31370,7 @@ int HumdrumLine::createTokensFromLine(void) { token = new HumdrumToken(); token->setOwner(this); m_tokens.push_back(token); - m_tokens.push_back(0); + m_tabs.push_back(0); } else if (this->compare(0, 2, "!!") == 0) { token = new HumdrumToken(this->c_str()); token->setOwner(this); @@ -31627,6 +32339,191 @@ void HumdrumLine::clearTokenLinkInfo(void) { } +////////////////////////////// +// +// HumdrumLine::isKeySignature -- Returns 0 if no key signature on line, otherwise returns +// the field index + 1 of the first key signature found in the given range. If startTrack == 0, +// then start at first field, if stopTrack == 0, then end at last field. +// Default values: +// startTrack = 0 +// stopTrack = 0 +// + +int HumdrumLine::isKeySignature(int startTrack, int stopTrack) { + HumdrumLine& line = *this; + if (!line.isInterpretation()) { + return 0; + } + for (int i=0; igetTrack(); + if ((startTrack == 0) || (track >= startTrack)) { + if ((stopTrack == 0) || (track <= stopTrack)) { + if (token->isKeySignature()) { + return i+1; + } + } + } + } + return 0; +} + + + +////////////////////////////// +// +// HumdrumLine::isKeyDesignation -- Returns 0 if no key designation on line, otherwise returns +// the field index + 1 of the first key designation found in the given range. If startTrack == 0, +// then start at first field, if stopTrack == 0, then end at last field. +// Default values: +// startTrack = 0 +// stopTrack = 0 +// + +int HumdrumLine::isKeyDesignation(int startTrack, int stopTrack) { + HumdrumLine& line = *this; + if (!line.isInterpretation()) { + return 0; + } + for (int i=0; igetTrack(); + if ((startTrack == 0) || (track >= startTrack)) { + if ((stopTrack == 0) || (track <= stopTrack)) { + if (token->isKeyDesignation()) { + return i+1; + } + } + } + } + return 0; +} + + + +////////////////////////////// +// +// HumdrumLine::isTempo -- Returns 0 if no tempo on line, otherwise returns +// the field index + 1 of the first tempo found in the given range. If startTrack == 0, +// then start at first field, if stopTrack == 0, then end at last field. +// Default values: +// startTrack = 0 +// stopTrack = 0 +// + +int HumdrumLine::isTempo(int startTrack, int stopTrack) { + HumdrumLine& line = *this; + if (!line.isInterpretation()) { + return 0; + } + for (int i=0; igetTrack(); + if ((startTrack == 0) || (track >= startTrack)) { + if ((stopTrack == 0) || (track <= stopTrack)) { + if (token->isTempo()) { + return i+1; + } + } + } + } + return 0; +} + + + +////////////////////////////// +// +// HumdrumLine::isTimeSignature -- Returns 0 if no time signature on line, otherwise returns +// the field index + 1 of the first time signature found in the given range. If startTrack == 0, +// then start at first field, if stopTrack == 0, then end at last field. +// Default values: +// startTrack = 0 +// stopTrack = 0 +// + +int HumdrumLine::isTimeSignature(int startTrack, int stopTrack) { + HumdrumLine& line = *this; + if (!line.isInterpretation()) { + return 0; + } + for (int i=0; igetTrack(); + if ((startTrack == 0) || (track >= startTrack)) { + if ((stopTrack == 0) || (track <= stopTrack)) { + if (token->isTimeSignature()) { + return i+1; + } + } + } + } + return 0; +} + + + +////////////////////////////// +// +// HumdrumLine::isLabel -- Returns 0 if no label on line, otherwise returns +// the field index + 1 of the first label found in the given range. If startTrack == 0, +// then start at first field, if stopTrack == 0, then end at last field. +// Default values: +// startTrack = 0 +// stopTrack = 0 +// + +int HumdrumLine::isExpansionLabel(int startTrack, int stopTrack) { + HumdrumLine& line = *this; + if (!line.isInterpretation()) { + return 0; + } + for (int i=0; igetTrack(); + if ((startTrack == 0) || (track >= startTrack)) { + if ((stopTrack == 0) || (track <= stopTrack)) { + if (token->isExpansionLabel()) { + return i+1; + } + } + } + } + return 0; +} + + + +////////////////////////////// +// +// HumdrumLine::isLabelExpansionList -- Returns 0 if no label expansion list on line, otherwise returns +// the field index + 1 of the first label expansion list found in the given range. If startTrack == 0, +// then start at first field, if stopTrack == 0, then end at last field. +// Default values: +// startTrack = 0 +// stopTrack = 0 +// + +int HumdrumLine::isExpansionList(int startTrack, int stopTrack) { + HumdrumLine& line = *this; + if (!line.isInterpretation()) { + return 0; + } + for (int i=0; igetTrack(); + if ((startTrack == 0) || (track >= startTrack)) { + if ((stopTrack == 0) || (track <= stopTrack)) { + if (token->isExpansionList()) { + return i+1; + } + } + } + } + return 0; +} + + ////////////////////////////// // @@ -32425,6 +33322,16 @@ const string& HumdrumToken::getDataType(void) const { } +///////////////////////////// +// +// HumdrumToken::getExclusiveInterpretation -- Get the exclusive +// interpretation token that owns the given token. +// + +HTp HumdrumToken::getExclusiveInterpretation(void) { + return m_address.getExclusiveInterpretation(); +} + ////////////////////////////// // @@ -32692,6 +33599,19 @@ int HumdrumToken::getTrack(void) const { +////////////////////////////// +// +// HumdrumToken::getSpineIndex -- Similar to getTrack() but indexed from 0 +// rather than 1. Non-spined tokens should return -1 since they +// are not in the spine structure. +// + +int HumdrumToken::getSpineIndex(void) const { + return m_address.getTrack() - 1; +} + + + ////////////////////////////// // // HumdrumToken::setSubtrack -- Sets the subtrack (similar to a layer @@ -33857,7 +34777,8 @@ bool HumdrumToken::isInstrumentGroup(void) { ////////////////////////////// // -// HumdrumToken::isInstrumentName -- True if an instrument name token. +// HumdrumToken::isInstrumentName -- True if an instrument name token, +// such as *I"Flute 1 // bool HumdrumToken::isInstrumentName(void) { @@ -33870,6 +34791,23 @@ bool HumdrumToken::isInstrumentName(void) { +////////////////////////////// +// +// HumdrumToken::isInstrumentNumber -- True if an instrument number token, +// such as *I#2 for a second instrument (Such as Flute 2) +// + +bool HumdrumToken::isInstrumentNumber(void) { + HumRegex hre; + if (hre.search(this, "^\\*I#\\d+$")) { + return true; + } else { + return false; + } +} + + + ////////////////////////////// // // HumdrumToken::isModernInstrumentName -- True if a modern instrument name token. @@ -34048,10 +34986,19 @@ int HumdrumToken::hasVisibleAccidental(int subtokenIndex) const { if (humfile == NULL) { return -1; } - if (!humfile->getValueBool("auto", "accidentalAnalysis")) { - int status = humfile->analyzeKernAccidentals(); - if (!status) { - return -1; + if (isKern()) { + if (!humfile->getValueBool("auto", "accidentalAnalysis**kern")) { + int status = humfile->analyzeKernAccidentals(); + if (!status) { + return -1; + } + } + } else if (isMens()) { + if (!humfile->getValueBool("auto", "accidentalAnalysis**mens")) { + int status = humfile->analyzeMensAccidentals(); + if (!status) { + return -1; + } } } return getValueBool("auto", to_string(subtokenIndex), "visualAccidental"); @@ -34078,10 +35025,19 @@ int HumdrumToken::hasCautionaryAccidental(int subtokenIndex) const { if (humfile == NULL) { return -1; } - if (!humfile->getValueBool("auto", "accidentalAnalysis")) { - int status = humfile->analyzeKernAccidentals(); - if (!status) { - return -1; + if (isKern()) { + if (!humfile->getValueBool("auto", "accidentalAnalysis**kern")) { + int status = humfile->analyzeKernAccidentals(); + if (!status) { + return -1; + } + } + } else if (isMens()) { + if (!humfile->getValueBool("auto", "accidentalAnalysis**mens")) { + int status = humfile->analyzeMensAccidentals(); + if (!status) { + return -1; + } } } return getValueBool("auto", to_string(subtokenIndex), "cautionaryAccidental"); @@ -35750,6 +36706,21 @@ ostream& HumdrumToken::printXmlStructureInfo(ostream& out, int level, +////////////////////////////// +// +// HumdrumToken::getBeat -- Return the beat (1 indexed) +// + +HumNum HumdrumToken::getBeat(HumNum scale) { + if (!m_address.hasOwner()) { + return 0; + } else { + return m_address.getOwner()->getBeat(scale); + } +} + + + ////////////////////////////// // // HumdrumToken::printXmlContentInfo -- Print content analysis information. @@ -36420,7 +37391,7 @@ int MuseData::append(string& charstring) { temprec = new MuseRecord; temprec->setString(charstring); temprec->setType(E_muserec_unknown); - temprec->setAbsBeat(0); + temprec->setQStamp(0); m_data.push_back(temprec); temprec->setLineIndex((int)m_data.size() - 1); temprec->setOwner(this); @@ -36501,6 +37472,17 @@ MuseRecord& MuseData::getRecord(int lindex) { } + +////////////////////////////// +// +// MuseData::getRecordPointer -- +// + +MuseRecord* MuseData::getRecordPointer(int lindex) { + return m_data[lindex]; +} + + ////////////////////////////// // // MuseData::getRecord -- This version with two index inputs is @@ -36611,6 +37593,8 @@ void MuseData::doAnalyses(void) { if (hasError()) { return; } analyzeTies(); if (hasError()) { return; } + linkPrintSuggestions(); + linkMusicDirections(); } @@ -36711,7 +37695,7 @@ void MuseData::processTie(int eindex, int rindex, int lastindex) { // There is another note tied to this one in the future, so // first get the absolute time location of the future tied note - HumNum abstime = m_data[lineindex]->getAbsBeat(); + HumNum abstime = m_data[lineindex]->getQStamp(); HumNum notedur = m_data[lineindex]->getNoteDuration(); HumNum searchtime = abstime + notedur; @@ -36969,8 +37953,8 @@ void MuseData::analyzeType(void) { case 'P': thing[i].setType(E_muserec_print_suggestion); break; case 'S': thing[i].setType(E_muserec_sound_directives); break; case '/': thing[i].setType(E_muserec_end); - foundend = 1; - break; + foundend = 1; + break; case 'a': thing[i].setType(E_muserec_append); break; case 'b': thing[i].setType(E_muserec_backspace); break; case 'f': thing[i].setType(E_muserec_figured_harmony); break; @@ -36979,8 +37963,8 @@ void MuseData::analyzeType(void) { case 'r': thing[i].setType(E_muserec_rest); break; case '*': thing[i].setType(E_muserec_musical_directions); break; case '$': thing[i].setType(E_muserec_musical_attributes); - foundattributes = 1; - break; + foundattributes = 1; + break; } } } @@ -37018,7 +38002,7 @@ void MuseData::analyzeRhythm(void) { if (m_data[i]->isChordNote()) { // insert an automatic back command for chord tones // also deal with cue-size note chords? - m_data[i]->setAbsBeat(cumulative - primarychordnoteduration); + m_data[i]->setQStamp(cumulative - primarychordnoteduration); // Check to see if the secondary chord note has a duration. // If so, then set the note duration to that value; otherwise, @@ -37037,7 +38021,7 @@ void MuseData::analyzeRhythm(void) { // cumulative timestamp; instead they temporarily advance // the time placement of the next figure if it occurs // during the same note as the previous figure. - m_data[i]->setAbsBeat(cumulative + figadj); + m_data[i]->setQStamp(cumulative + figadj); HumNum tick = m_data[i]->getLineTickDuration(); if (tick == 0) { figadj = 0; @@ -37047,7 +38031,7 @@ void MuseData::analyzeRhythm(void) { figadj += dur; } } else { - m_data[i]->setAbsBeat(cumulative); + m_data[i]->setQStamp(cumulative); m_data[i]->setNoteDuration(m_data[i]->getNoteTickDuration(), tpq); m_data[i]->setLineDuration(m_data[i]->getNoteDuration()); linedur.setValue(m_data[i]->getLineTickDuration(), tpq); @@ -37067,7 +38051,7 @@ void MuseData::analyzeRhythm(void) { switch (m_data[i]->getType()) { case E_muserec_print_suggestion: case E_muserec_sound_directives: - m_data[i]->setAbsBeat(m_data[i-1]->getAbsBeat()); + m_data[i]->setQStamp(m_data[i-1]->getQStamp()); } } @@ -37078,7 +38062,9 @@ void MuseData::analyzeRhythm(void) { ////////////////////////////// // // MuseData::getInitialTpq -- return the Q: field in the first $ record -// at the top of the file. +// at the top of the file. If there is an updated Q: field, this +// function will need to be improved since TPQ cannot change in MIDI files, +// for example. // int MuseData::getInitialTpq(void) { @@ -37131,7 +38117,7 @@ void MuseData::constructTimeSequence(void) { MuseData& thing = *this; for (int i=0; i<(int)m_data.size(); i++) { - insertEventBackwards(thing[i].getAbsBeat(), &thing[i]); + insertEventBackwards(thing[i].getQStamp(), &thing[i]); if (hasError()) { return; } @@ -37362,13 +38348,18 @@ int MuseData::getType(int eindex, int erecord) { ////////////////////////////// // -// MuseData::getAbsBeat -- return the absolute beat time (quarter +// MuseData::getQStamp -- return the absolute beat time (quarter // note durations from the start of the music until the current // object. // +HumNum MuseData::getQStamp(int lindex) { + return m_data[lindex]->getQStamp(); +} + + HumNum MuseData::getAbsBeat(int lindex) { - return m_data[lindex]->getAbsBeat(); + return m_data[lindex]->getQStamp(); } @@ -37442,11 +38433,7 @@ string MuseData::getPartName(void) { if (line < 0) { return ""; } - HumRegex hre; - string output = m_data[line]->getLine(); - hre.replaceDestructive(output, "", "^\\s+"); - hre.replaceDestructive(output, "", "\\s+$"); - return output; + return m_data[line]->getPartName(); } @@ -37621,7 +38608,7 @@ void MuseData::setError(const string& error) { // HumNum MuseData::getFileDuration(void) { - return getRecord(getLineCount()-1).getAbsBeat(); + return getRecord(getLineCount()-1).getQStamp(); } @@ -38760,6 +39747,191 @@ void MuseData::assignHeaderBodyState(void) { } +////////////////////////////// +// +// MuseData::linkPrintSuggestions -- Store print suggestions with +// the record that they apply to. A print suggestion starts +// with the letter "P" and follows immediately after the +// record to which they apply (unless another print suggestion +// or a comment. +// + +void MuseData::linkPrintSuggestions(void) { + // don't go all of the way to 0: stop at header: + vector Plines; + for (int i=getLineCount()-1; i>=0; i--) { + if (!m_data[i]->isPrintSuggestion()) { + continue; + } + Plines.clear(); + Plines.push_back(i); + i--; + while (i>=0 && (m_data[i]->isPrintSuggestion() || m_data[i]->isAnyComment())) { + if (m_data[i]->isPrintSuggestion()) { + cerr << "PRINT SUGGESTION: " << m_data[i] << endl; + Plines.push_back(i); + } + i--; + } + if (i<0) { + break; + } + // Store the print suggestions on the current line, which is at least + // a note/rest or musical direction. + for (int j=0; j<(int)Plines.size(); j++) { + m_data[i]->addPrintSuggestion(Plines[j] - i); + } + Plines.clear(); + } +} + + + +////////////////////////////// +// +// MuseData::linkMusicDirections -- Store music directions with +// the record that they apply to. A music direction starts +// with "*" and precedes the record to which they apply (unless +// a print suggestion or a comment intervenes. +// + + +void MuseData::linkMusicDirections(void) { + vector Dlines; + for (int i=0; iisDirection()) { + continue; + } + Dlines.clear(); + Dlines.push_back(i); + i++; + while (iisAnyNoteOrRest()) { + if (m_data[i]->isMusicalDirection()) { + Dlines.push_back(i); + } + i++; + } + if (i>=getLineCount()) { + break; + } + // Store the print suggestions on the current line, which is hopefully + // a note/rest or musical direction. + for (int j=0; j<(int)Dlines.size(); j++) { + m_data[i]->addMusicDirection(Dlines[j] - i); + } + Dlines.clear(); + } +} + + +////////////////////////////// +// +// MuseData::getMeasureNumber -- If index == 0, return the next barnumber +// minus 1. If on a measure record, return the number on that line. +// If neither, then search backwards for the last measure line (or 0 +// index) and return the measure number for that barline (or 0 index). +// + +string MuseData::getMeasureNumber(int index) { + MuseData& md = *this; + if ((index > 0) && !md[index].isMeasure()) { + for (int i=index-1; i>= 0; i--) { + if (md[i].isMeasure()) { + index = i; + break; + } + } + } + if ((index != 0) && !md[index].isMeasure()) { + index = 0; + } + if (index == 0) { + // search for the first measure, and return + // that number. If there are notes before the + // first barline, return the next measure number + // minus 1. + bool dataQ = false; + for (int i=0; i datalines; datalines.reserve(100000); @@ -39249,81 +40436,262 @@ ostream& operator<<(ostream& out, MuseDataSet& musedataset) { ////////////////////////////// // -// MuseRecord::MuseRecord -- +// MuseRecord::getAttributeMap -- // -MuseRecord::MuseRecord(void) : MuseRecordBasic() { } -MuseRecord::MuseRecord(const string& aLine) : MuseRecordBasic(aLine) { } -MuseRecord::MuseRecord(MuseRecord& aRecord) : MuseRecordBasic(aRecord) { } +void MuseRecord::getAttributeMap(map& amap) { + amap.clear(); + // Should be "3" on the next line, but "1" or "2" might catch poorly formatted data. + string contents = getLine().substr(2); + if (contents.empty()) { + return; + } + int i = 0; + string key; + string value; + int state = 0; // 0 outside, 1 = in key, 2 = in value + while (i < (int)contents.size()) { + switch (state) { + case 0: // outside of key or value + if (!isspace(contents[i])) { + if (contents[i] == ':') { + // Strange: should not happen + key.clear(); + state = 2; + } else { + state = 1; + key += contents[i]; + } + } + break; + case 1: // in key + if (!isspace(contents[i])) { + if (contents[i] == ':') { + value.clear(); + state = 2; + } else { + // Add to key, such as "C2" for second staff clef. + key += contents[i]; + } + } + break; + case 2: // in value + if (key == "D") { + value += contents[i]; + } else if (isspace(contents[i])) { + // store parameter and clear variables + amap[key] = value; + state = 0; + key.clear(); + value.clear(); + } else { + value += contents[i]; + } + break; + } + i++; + } + + if ((!key.empty()) && (!value.empty())) { + amap[key] = value; + } +} ////////////////////////////// // -// MuseRecord::~MuseRecord -- +// MuseRecord::getAttributes -- // -MuseRecord::~MuseRecord() { - // do nothing +string MuseRecord::getAttributes(void) { + string output; + switch (getType()) { + case E_muserec_musical_attributes: + break; + default: + cerr << "Error: cannot use getAttributes function on line: " + << getLine() << endl; + return ""; + } + + int ending = 0; + int tempcol; + for (int column=4; column <= getLength(); column++) { + if (getColumn(column) == ':') { + tempcol = column - 1; + while (tempcol > 0 && getColumn(tempcol) != ' ') { + tempcol--; + } + tempcol++; + while (tempcol <= column) { + output += getColumn(tempcol); + if (output.back() == 'D') { + ending = 1; + } + tempcol++; + } + } + if (ending) { + break; + } + } + return output; } ////////////////////////////// // -// MuseRecord::operator= -- +// MuseRecord::attributeQ -- // -MuseRecord& MuseRecord::operator=(MuseRecord& aRecord) { - // don't copy onto self - if (&aRecord == this) { - return *this; +int MuseRecord::attributeQ(const string& attribute) { + switch (getType()) { + case E_muserec_musical_attributes: + break; + default: + cerr << "Error: cannot use getAttributes function on line: " + << getLine() << endl; + return 0; } - setLine(aRecord.getLine()); - setType(aRecord.getType()); - m_lineindex = aRecord.m_lineindex; - m_absbeat = aRecord.m_absbeat; - m_lineduration = aRecord.m_lineduration; - m_noteduration = aRecord.m_noteduration; + string attributelist = getAttributes(); - m_b40pitch = aRecord.m_b40pitch; - m_nexttiednote = aRecord.m_nexttiednote; - m_lasttiednote = aRecord.m_lasttiednote; + int output = 0; + int attstrlength = (int)attributelist.size(); + int attlength = (int)attribute.size(); - return *this; + for (int i=0; i 0 && getColumn(tempcol) != ' ') { + tempcol--; + } + tempcol++; + while (tempcol <= column) { + if (getColumn(tempcol) == attribute) { + ending = 2; + } else if (getColumn(tempcol) == 'D') { + ending = 1; + } + tempcol++; + // index++; + } + } + if (ending) { + break; + } + } + + if (ending == 0 || ending == 1) { + return output; + } else { + string value = &getColumn(column+1); + if (value.empty()) { + output = std::stoi(value); + return output; + } else { + return 0; + } + } +} + + ////////////////////////////// // -// MuseRecord::getNoteField -- returns the string containing the pitch, -// accidental and octave characters. +// MuseRecord::getAttributeField -- returns true if found attribute // -string MuseRecord::getNoteField(void) { +int MuseRecord::getAttributeField(string& value, const string& key) { switch (getType()) { - case E_muserec_note_regular: - return extract(1, 4); - break; - case E_muserec_note_chord: - case E_muserec_note_cue: - case E_muserec_note_grace: - return extract(2, 5); + case E_muserec_musical_attributes: break; default: - cerr << "Error: cannot use getNoteField function on line: " - << getLine() << endl; + cerr << "Error: cannot use getAttributeInt function on line: " + << getLine() << endl; + return 0; + } + + int returnValue = 0; + int ending = 0; + // int index = 0; + int tempcol; + int column; + for (column=4; column <= getLength(); column++) { + if (getColumn(column) == ':') { + tempcol = column - 1; + while (tempcol > 0 && getColumn(tempcol) != ' ') { + tempcol--; + } + tempcol++; + while (tempcol <= column) { + if (getColumn(tempcol) == key[0]) { + ending = 2; + } else if (getColumn(tempcol) == 'D') { + ending = 1; + } + tempcol++; + // index++; + } + } + if (ending) { + break; + } + } + + value.clear(); + if (ending == 0 || ending == 1) { + return returnValue; + } else { + returnValue = 1; + column++; + while (getColumn(column) != ' ') { + value += getColumn(column++); + } + return returnValue; } - return ""; } @@ -39331,327 +40699,254 @@ string MuseRecord::getNoteField(void) { ////////////////////////////// // -// MuseRecord::getOctave -- returns the first numeric character -// in the note field of a MuseData note record +// MuseRecord::addMusicDirection -- add a delta index for associated +// print suggestion. // -int MuseRecord::getOctave(void) { - string recordInfo = getNoteField(); - int index = 0; - while ((index < (int)recordInfo.size()) && !std::isdigit(recordInfo[index])) { - index++; - } - if (index >= (int)recordInfo.size()) { - cerr << "Error: no octave specification in note field: " << recordInfo - << endl; - return 0; - } - return recordInfo[index] - '0'; +void MuseRecord::addMusicDirection(int deltaIndex) { + m_musicalDirections.push_back(deltaIndex); } -string MuseRecord::getOctaveString(void) { - string recordInfo = getNoteField(); - int index = 0; - while ((index < (int)recordInfo.size()) && !std::isdigit(recordInfo[index])) { - index++; + +////////////////////////////// +// +// MuseRecord::getDirectionAsciiCharacters -- returns columns 25 +// and later, but with the return string removing any trailing spaces. +// + +std::string MuseRecord::getDirectionAsciiCharacters(void) { + if (!isDirection()) { + return ""; } - if (index >= (int)recordInfo.size()) { - cerr << "Error: no octave specification in note field: " << recordInfo - << endl; + string& mrs = m_recordString; + if (mrs.size() < 25) { return ""; } - string output; - output += recordInfo[index]; - return output; + string output = mrs.substr(24); + size_t endpos = output.find_last_not_of(" \t\r\n"); + return (endpos != std::string::npos) ? output.substr(0, endpos + 1) : ""; } ////////////////////////////// // -// MuseRecord::getPitch -- int version returns the base40 representation +// MuseRecord::hasMusicalDirection -- // -int MuseRecord::getPitch(void) { - string recordInfo = getNoteField(); - return Convert::museToBase40(recordInfo); -} - - -string MuseRecord::getPitchString(void) { - string output = getNoteField(); - int len = (int)output.size(); - int index = len-1; - while (index >= 0 && output[index] == ' ') { - output.resize(index); - index--; +bool MuseRecord::hasMusicalDirection(void) { + if (isDirection()) { + return true; } - return output; + if (!m_musicalDirections.empty()) { + return true; + } + return false; } ////////////////////////////// // -// MuseRecord::getPitchClass -- returns the pitch without the octave information +// MuseRecord::getMusicalDuration -- return any associated +// Musical Direction record for the current record. If there +// is no linked direction, then return NULL. If the record is +// itself a muscial direction, return the pointer to the record. +// Default value for index is 0. // -int MuseRecord::getPitchClass(void) { - return getPitch() % 40; -} - - -string MuseRecord::getPitchClassString(void) { - string output = getNoteField(); - int index = 0; - while ((index < (int)output.size()) && !std::isdigit(output[index])) { - index++; +MuseRecord* MuseRecord::getMusicalDirection(int index) { + if (m_musicalDirections.empty()) { + return NULL; } - output.resize(index); - return output; + if (index >= (int)m_musicalDirections.size()) { + return NULL; + } + return getDirectionRecord(m_musicalDirections.at(index)); } ////////////////////////////// // -// MuseRecord::getAccidental -- int version return -2 for double flat, -// -1 for flat, 0 for natural, +1 for sharp, +2 for double sharp +// MuseRecord::getDirectionRecord -- return the given direction from the store +// delta index for the musical direction line. Default value index = 0. // -int MuseRecord::getAccidental(void) { - string recordInfo = getNoteField(); - int output = 0; - int index = 0; - while ((index < (int)recordInfo.size()) && (index < 16)) { - if (recordInfo[index] == 'f') { - output--; - } else if (recordInfo[index] == '#') { - output++; - } - index++; +MuseRecord* MuseRecord::getDirectionRecord(int deltaIndex) { + int index = m_lineindex + deltaIndex; + if (index < 0) { + return NULL; } - return output; + if (!m_owner) { + return NULL; + } + int lineCount = m_owner->getLineCount(); + if (index >= lineCount) { + return NULL; + } + return m_owner->getRecordPointer(index); } -string MuseRecord::getAccidentalString(void) { - string output; - int type = getAccidental(); - switch (type) { - case -2: output = "ff"; break; - case -1: output = "f"; break; - case 0: output = ""; break; - case 1: output = "#"; break; - case 2: output = "##"; break; - default: - output = getNoteField(); - cerr << "Error: unknown type of accidental: " << output << endl; - return ""; + +////////////////////////////// +// +// MuseRecord::getDirectionType -- columns 17 and 18 of +// musical directions. This function will remove space +// chaters from the columns. +// +// Direction Types: +// ================= +// A = segno sign +// E = dynamics hairpin start (qualifiers [BCDG]) +// F = dynamics hairpin start +// G = dynamics letters (in columns 25+) +// H = dash line start (qualifiers [BCDG]) +// J = dash line end (qualifiers [BCDG]) +// P = piano pedal start +// Q = piano pedal end +// R = rehearsal number or letter +// U = shift notes up (usually by 8va) +// V = shift notes down (usually by 8va) +// W = stop octave shift +// X = tie terminator +// + +string MuseRecord::getDirectionType(void) { + if (!isDirection()) { + return ""; } - return output; + string value = getColumns(17, 18); + if (value[1] == ' ') { + value.resize(1); + } + if (value[0] == ' ') { + value.resize(0); + } + return value; } ////////////////////////////// // -// MuseRecord::getBase40 -- return the base40 pitch value of the data -// line. Middle C set to 40 * 4 + 2; Returns -100 for non-pitched items. -// (might have to update for note_cur_chord and note_grace_chord which -// do not exist yet. +// MuseRecord::isDynamic -- helper function for getDirectionType() == "G". // -int MuseRecord::getBase40(void) { - switch (getType()) { - case E_muserec_note_regular: - case E_muserec_note_chord: - case E_muserec_note_cue: - case E_muserec_note_grace: - break; - default: - return -100; +bool MuseRecord::isDynamic(void) { + string dirtype = getDirectionType(); + if (dirtype.empty()) { + return false; + } + if (dirtype.at(0) == 'G') { + return true; + } else { + return false; } - return getPitch(); } ////////////////////////////// // -// MuseRecord::setStemDown -- +// MuseRecord::getDynamicText -- // -void MuseRecord::setStemDown(void) { - getColumn(23) = 'd'; +string MuseRecord::getDynamicText(void) { + return getDirectionAsciiCharacters(); } + ////////////////////////////// // -// MuseRecord::setStemUp -- +// MuseRecord::getFigureCountField -- column 2. // -void MuseRecord::setStemUp(void) { - getColumn(23) = 'u'; +string MuseRecord::getFigureCountField(void) { + allowFigurationOnly("getFigureCountField"); + return extract(2, 2); } ////////////////////////////// // -// MuseRecord::setPitch -- input is a base40 value which gets converted -// to a diatonic pitch name. -// Default value: chordnote = 0 -// Default value: gracenote = 0 +// MuseRecord::getFigurationCountString -- // -void MuseRecord::setPitch(int base40, int chordnote, int gracenote) { - string diatonic; - switch (Convert::base40ToDiatonic(base40) % 7) { - case 0: diatonic = 'C'; break; - case 1: diatonic = 'D'; break; - case 2: diatonic = 'E'; break; - case 3: diatonic = 'F'; break; - case 4: diatonic = 'G'; break; - case 5: diatonic = 'A'; break; - case 6: diatonic = 'B'; break; - default: diatonic = 'X'; - } - - string octave; - octave += char('0' + base40 / 40); - - string accidental; - int acc = Convert::base40ToAccidental(base40); - switch (acc) { - case -2: accidental = "ff"; break; - case -1: accidental = "f"; break; - case +1: accidental = "#"; break; - case +2: accidental = "##"; break; - } - string pitchname = diatonic + accidental + octave; - - if (chordnote) { - if (gracenote) { - setGraceChordPitch(pitchname); - } else { - setChordPitch(pitchname); - } - } else { - setPitch(pitchname); +string MuseRecord::getFigureCountString(void) { + allowFigurationOnly("getFigureCount"); + string output = extract(2, 2); + if (output[0] == ' ') { + output = ""; } + return output; } -void MuseRecord::setChordPitch(const string& pitchname) { - getColumn(1) = ' '; - setPitchAtIndex(1, pitchname); -} - -void MuseRecord::setGracePitch(const string& pitchname) { - getColumn(1) = 'g'; - setPitchAtIndex(1, pitchname); -} -void MuseRecord::setGraceChordPitch(const string& pitchname) { - getColumn(1) = 'g'; - getColumn(2) = ' '; - setPitchAtIndex(2, pitchname); -} +////////////////////////////// +// +// MuseRecord::getFigurationCount -- +// -void MuseRecord::setCuePitch(const string& pitchname) { - getColumn(1) = 'c'; - setPitchAtIndex(1, pitchname); +int MuseRecord::getFigureCount(void) { + allowFigurationOnly("getFigureCount"); + string temp = getFigureCountString(); + int output = (int)strtol(temp.c_str(), NULL, 36); + return output; } -void MuseRecord::setPitch(const string& pitchname) { - int start = 0; - // If the record is already set to a grace note or a cue note, - // then place pitch information starting at column 2 (index 1). - if ((getColumn(1) == 'g') || (getColumn(1) == 'c')) { - start = 1; - } - setPitchAtIndex(start, pitchname); -} - -void MuseRecord::setPitchAtIndex(int index, const string& pitchname) { - int len = (int)pitchname.size(); - if ((len > 4) && (pitchname != "irest")) { - cerr << "Error in MuseRecord::setPitchAtIndex: " << pitchname << endl; - return; - } - insertString(index+1, pitchname); +////////////////////////////// +// +// getFigurePointerField -- columns 6-8. +// - // Clear any text fields not used by current pitch data. - for (int i=4-len-1; i>=0; i--) { - (*this)[index + len + i] = ' '; - } +string MuseRecord::getFigurePointerField(void) { + allowFigurationOnly("getFigurePointerField"); + return extract(6, 8); } ////////////////////////////// // -// MuseRecord::getTickDurationField -- returns the string containing the -// duration, and tie information. +// getFigurePointer -- columns 6-8 for figures, removing +// spaces. // -string MuseRecord::getTickDurationField(void) { - switch (getType()) { - case E_muserec_figured_harmony: - case E_muserec_note_regular: - case E_muserec_note_chord: - case E_muserec_rest: - case E_muserec_backward: - case E_muserec_forward: - return extract(6, 9); - break; - // these record types do not have duration, per se: - case E_muserec_note_cue: - case E_muserec_note_grace: - default: - return " "; - // cerr << "Error: cannot use getTickDurationField function on line: " - // << getLine() << endl; - // return ""; - } - return ""; +string MuseRecord::getFigurePointer(void) { + return trimSpaces(getFigurePointerField()); } ////////////////////////////// // -// MuseRecord::getTickDurationString -- returns the string containing the duration, +// MuseRecord::getFigureDuration -- return the duration +// in ticks for figured bass (to give an offset to next +// figure which happens before another note in the score). // -string MuseRecord::getTickDurationString(void) { - string output = getTickDurationField(); - int length = (int)output.size(); - int i = length - 1; - while (i>0 && (output[i] == '-' || output[i] == ' ')) { - output.resize(i); - i--; - length--; - } - - int start = 0; - while (output[start] == ' ') { - start++; - } - - if (start != 0) { - for (i=0; i= 0; i--) { + if (isspace(output[i])) { + output.resize((int)output.size() - 1); + } else { + break; + } } - - return value; + return output; } ////////////////////////////// // -// MuseRecord::getTicks -- similar to getLineTickDuration, but is non-zero -// for secondary chord notes. +// MuseRecord::getFigureFields -- columns 17 -- 80 // -int MuseRecord::getTicks(void) { - string recordInfo = getTickDurationString(); - if (recordInfo.empty()) { - return 0; - } - int value = std::stoi(recordInfo); - if (getType() == E_muserec_backspace) { - return -value; - } - - return value; +string MuseRecord::getFigureFields(void) { + allowFigurationOnly("getFigureFields"); + return extract(17, 80); } ////////////////////////////// // -// MuseRecord::getNoteTickDuration -- Similar to getLineTickDuration, -// but do not suppress the duration of secondary chord-tones. +// MuseRecord::figureFieldsQ -- // -int MuseRecord::getNoteTickDuration(void) { - string recordInfo = getTickDurationString(); - int value = 0; - if (recordInfo.empty()) { - return value; - } - value = std::stoi(recordInfo); - if (getType() == E_muserec_backspace) { - return -value; +int MuseRecord::figureFieldsQ(void) { + allowFigurationOnly("figureFieldsQ"); + int output = 0; + if (getLength() < 17) { + output = 0; + } else { + for (int i=17; i<=80; i++) { + if (getColumn(i) != ' ') { + output = 1; + break; + } + } } - return value; + return output; } ////////////////////////////// // -// MuseRecord::setDots -- +// getFigure -- // -void MuseRecord::setDots(int value) { - switch (value) { - case 0: getColumn(18) = ' '; break; - case 1: getColumn(18) = '.'; break; - case 2: getColumn(18) = ':'; break; - case 3: getColumn(18) = ';'; break; - case 4: getColumn(18) = '!'; break; - default: cerr << "Error in MuseRecord::setDots : " << value << endl; +string MuseRecord::getFigure(int index) { + string output; + allowFigurationOnly("getFigure"); + if (index >= getFigureCount()) { + return output; + } + string temp = getFigureString(); + if (index == 0) { + return temp; } + HumRegex hre; + vector pieces; + hre.split(pieces, temp, " +"); + if (index < (int)pieces.size()) { + output = pieces[index]; + } + return output; } + ////////////////////////////// // -// MuseRecord::getDotCount -- +// MuseRecord::getPartName -- return the name line in the +// MuseData part's header. This is the 9th non-comment +// line in a part file. // -int MuseRecord::getDotCount(void) { - char value = getColumn(18); - switch (value) { - case ' ': return 0; - case '.': return 1; - case ':': return 2; - case ';': return 3; - case '!': return 4; +string MuseRecord::getPartName(void) { + if (isPartName()) { + HumRegex hre; + string raw = this->getLine(); + hre.replaceDestructive(raw, "", "^\\s+"); + hre.replaceDestructive(raw, "", "\\s+$"); + return raw; + } else { + return ""; } - return 0; } + ////////////////////////////// // -// MuseRecord::setNoteheadShape -- Duration with augmentation dot component -// removed. Duration of 1 is quarter note. +// MuseRecord::getKernBeamStyle -- // -void MuseRecord::setNoteheadShape(HumNum duration) { - HumNum note8th(1,2); - HumNum note16th(1,4); - HumNum note32nd(1,8); - HumNum note64th(1,16); - HumNum note128th(1,32); - HumNum note256th(1,64); - - if (duration > 16) { // maxima - setNoteheadMaxima(); - } else if (duration > 8) { // long - setNoteheadLong(); - } else if (duration > 4) { // breve - if (m_roundBreve) { - setNoteheadBreveRound(); - } else { - setNoteheadBreve(); +string MuseRecord::getKernBeamStyle(void) { + string output; + string beams = getBeamField(); + for (int i=0; i<(int)beams.size(); i++) { + switch (beams[i]) { + case '[': // start beam + output += "L"; + break; + case '=': // continue beam + // do nothing + break; + case ']': // end beam + output += "J"; + break; + case '/': // forward hook + output += "K"; + break; + case '\\': // backward hook + output += "k"; + break; + default: + ; // do nothing } - } else if (duration > 2) { // whole note - setNoteheadWhole(); - } else if (duration > 1) { // half note - setNoteheadHalf(); - } else if (duration > note8th) { // quarter note - setNoteheadQuarter(); - } else if (duration > note16th) { // eighth note - setNotehead8th(); - } else if (duration > note32nd) { // 16th note - setNotehead16th(); - } else if (duration > note64th) { // 32nd note - setNotehead32nd(); - } else if (duration > note128th) { // 64th note - setNotehead64th(); - } else if (duration > note256th) { // 128th note - setNotehead128th(); - } else if (duration == note256th) { // 256th note - // not allowing tuplets on the 256th note level. - setNotehead256th(); - } else { - cerr << "Error in duration: " << duration << endl; - return; } + return output; } ////////////////////////////// // -// MuseRecord::setNoteheadShape -- Duration with augmentation dot component -// removed. Duration of 1 is quarter note. +// MuseRecord::getKernNoteStyle -- +// default values: beams = 0, stems = 0 // -void MuseRecord::setNoteheadShapeMensural(HumNum duration) { - HumNum note8th(1, 2); - HumNum note16th(1, 4); - HumNum note32th(1, 8); - HumNum note64th(1, 16); - HumNum note128th(1, 32); - HumNum note256th(1, 64); +string MuseRecord::getKernNoteStyle(int beams, int stems) { + string output; - if (duration > 16) { // maxima - setNoteheadMaxima(); - } else if (duration > 8) { // long - setNoteheadLong(); - } else if (duration > 4) { // breve - setNoteheadBreve(); - } else if (duration > 2) { // whole note - setNoteheadWholeMensural(); - } else if (duration > 1) { // half note - setNoteheadHalfMensural(); - } else if (duration > note8th) { // quarter note - setNoteheadQuarterMensural(); - } else if (duration > note16th) { // eighth note - setNotehead8thMensural(); - } else if (duration > note32th) { // 16th note - setNotehead16thMensural(); - } else if (duration > note64th) { // 32nd note - setNotehead32ndMensural(); - } else if (duration > note128th) { // 64th note - setNotehead64thMensural(); - } else if (duration > note256th) { // 128th note - setNotehead128thMensural(); - } else if (duration >= note256th) { // 256th note - // don't allow tuplets on 256th note level. - setNotehead256thMensural(); - } else { - cerr << "Error in duration: " << duration << endl; - return; + if (!isAnyNote()) { + // not a note, so return nothing + return ""; } -} -void MuseRecord::setNoteheadMaxima(void) { - if ((*this)[0] == 'c' || ((*this)[0] == 'g')) { - cerr << "Error: cue/grace notes cannot be maximas in setNoteheadLong" - << endl; - return; - } else { - getColumn(17) = 'M'; + // place the rhythm + stringstream tempdur; + HumNum notetype = getGraphicNoteType(); + HumNum mod = getTimeModification(); + if (mod != 1) { + notetype *= mod; } -} -void MuseRecord::setNoteheadLong(void) { - if ((*this)[0] == 'c' || ((*this)[0] == 'g')) { - cerr << "Error: cue/grace notes cannot be longs in setNoteheadLong" - << endl; - return; - } else { - getColumn(17) = 'L'; - } -} + // logical duration of the note + HumNum logicalduration = getTicks(); + logicalduration /= getTpq(); + string durrecip = Convert::durationToRecip(logicalduration); -void MuseRecord::setNoteheadBreve(void) { - setNoteheadBreveSquare(); -} + // graphical duration of the note + string graphicrecip = getGraphicRecip(); + HumNum graphicdur = Convert::recipToDuration(graphicrecip); -void MuseRecord::setNoteheadBreveSquare(void) { - if ((*this)[0] == 'g') { // grace note - getColumn(8) = 'A'; - } else if ((*this)[0] == 'c') { // cue-sized note (with duration) - getColumn(17) = 'A'; - } else { // normal note - getColumn(17) = 'B'; + string displayrecip; + + if (graphicdur != logicalduration) { + // switch to the logical duration and store the graphic + // duration. The logical duration will be used on the + // main kern token, and the graphic duration will be stored + // as a layout parameter, such as !LO:N:vis=4. to display + // the note as a dotted quarter regardless of the logical + // duration. + + // Current test file has encoding bug related to triplets, so + // disable graphic notation dealing with tuplets for now. + + // for now just looking to see if one has a dot and the other does not + if ((durrecip.find(".") != string::npos) && + (graphicrecip.find(".") == string::npos)) { + m_graphicrecip = graphicrecip; + displayrecip = durrecip; + } else if ((durrecip.find(".") == string::npos) && + (graphicrecip.find(".") != string::npos)) { + m_graphicrecip = graphicrecip; + displayrecip = durrecip; + } } -} -void MuseRecord::setNoteheadBreveRound(void) { - if ((*this)[0] == 'g') { // grace note - getColumn(8) = 'A'; - } else if ((*this)[0] == 'c') { // cue-sized note (with duration) - getColumn(17) = 'A'; - } else { // normal note - getColumn(17) = 'b'; + if (displayrecip.size() > 0) { + output = displayrecip; + } else { + tempdur << notetype; + output = tempdur.str(); + // add any dots of prolongation to the output string + output += getStringProlongation(); } -} -void MuseRecord::setNoteheadBreveMensural(void) { - setNoteheadBreveSquare(); -} + // add the pitch to the output string + string musepitch = getPitchString(); + string kernpitch = Convert::musePitchToKernPitch(musepitch); + output += kernpitch; -void MuseRecord::setNoteheadWhole(void) { - if ((*this)[0] == 'g') { // grace note - getColumn(8) = '9'; - } else if ((*this)[0] == 'c') { // cue-sized note (with duration) - getColumn(17) = '9'; - } else { // normal note - getColumn(17) = 'w'; - } -} + string logicalAccidental = getAccidentalString(); + string notatedAccidental = getNotatedAccidentalString(); -void MuseRecord::setNoteheadWholeMensural(void) { - if ((*this)[0] == 'g') { // grace note - getColumn(8) = '9'; - } else if ((*this)[0] == 'c') { // cue-sized note (with duration) - getColumn(17) = '9'; - } else { // normal note - getColumn(17) = 'W'; + if (notatedAccidental.empty() && !logicalAccidental.empty()) { + // Indicate that the logical accidental should not be + // displayed (because of key signature or previous + // note in the measure that alters the accidental + // state of the current note). + output += "y"; + } else if ((logicalAccidental == notatedAccidental) && !notatedAccidental.empty()) { + // Indicate that the accidental should be displayed + // and is not suppressed by the key signature or a + // previous note in the measure. + output += "X"; } -} + // There can be cases where the logical accidental + // is natural but the notated accidetnal is sharp (but + // the notated accidental means play a natural accidetnal). + // Deal with this later. -void MuseRecord::setNoteheadHalf(void) { - if ((*this)[0] == 'g') { // grace note - getColumn(8) = '8'; - } else if ((*this)[0] == 'c') { // cue-sized note (with duration) - getColumn(17) = '8'; - } else { // normal note - getColumn(17) = 'h'; + // if there is a notated natural sign, then add it now: + string temp = getNotatedAccidentalField(); + if (temp == "n") { + output += "n"; } -} -void MuseRecord::setNoteheadHalfMensural(void) { - if ((*this)[0] == 'g') { // grace note - getColumn(8) = '8'; - } else if ((*this)[0] == 'c') { // cue-sized note (with duration) - getColumn(17) = '8'; - } else { // normal note - getColumn(17) = 'H'; + // check if a grace note + if (getType() == 'g') { + output += "Q"; } -} -void MuseRecord::setNoteheadQuarter(void) { - if ((*this)[0] == 'g') { // grace note - getColumn(8) = '7'; - } else if ((*this)[0] == 'c') { // cue-sized note (with duration) - getColumn(17) = '7'; - } else { // normal note - getColumn(17) = 'q'; + // if stems is true, then show stem directions + if (stems && stemDirectionQ()) { + switch (getStemDirection()) { + case 1: // 'u' = up + output += "/"; + break; + case -1: // 'd' = down + output += "\\"; + default: + ; // nothing // ' ' = no stem (if stage 2) + } } -} -void MuseRecord::setNoteheadQuarterMensural(void) { - if ((*this)[0] == 'g') { // grace note - getColumn(8) = '7'; - } else if ((*this)[0] == 'c') { // cue-sized note (with duration) - getColumn(17) = '7'; - } else { // normal note - getColumn(17) = 'Q'; + // if beams is true, then show any beams + if (beams && beamQ()) { + temp = getKernBeamStyle(); + output += temp; } -} -void MuseRecord::setNotehead8th(void) { - if ((*this)[0] == 'g') { // grace note - getColumn(8) = '6'; - } else if ((*this)[0] == 'c') { // cue-sized note (with duration) - getColumn(17) = '6'; - } else { // normal note - getColumn(17) = 'e'; + if (isTied()) { + string tiestarts; + string tieends; + int lasttie = getLastTiedNoteLineIndex(); + int nexttie = getNextTiedNoteLineIndex(); + int state = 0; + if (lasttie >= 0) { + state |= 2; + } + if (nexttie >= 0) { + state |= 1; + } + switch (state) { + case 1: + tiestarts += "["; + break; + case 2: + tieends += "]"; + break; + case 3: + tieends += "_"; + break; + } + if (state) { + output = tiestarts + output + tieends; + } } -} -void MuseRecord::setNotehead8thMensural(void) { - if ((*this)[0] == 'g') { // grace note - getColumn(8) = '6'; - } else if ((*this)[0] == 'c') { // cue-sized note (with duration) - getColumn(17) = '6'; - } else { // normal note - getColumn(17) = 'E'; + string slurstarts; + string slurends; + getSlurInfo(slurstarts, slurends); + if ((!slurstarts.empty()) || (!slurends.empty())) { + output = slurstarts + output + slurends; } -} -void MuseRecord::setNotehead16th(void) { - if ((*this)[0] == 'g') { // grace note - getColumn(8) = '5'; - } else if ((*this)[0] == 'c') { // cue-sized note (with duration) - getColumn(17) = '5'; - } else { // normal note - getColumn(17) = 's'; - } + return output; } -void MuseRecord::setNotehead16thMensural(void) { - if ((*this)[0] == 'g') { // grace note - getColumn(8) = '5'; - } else if ((*this)[0] == 'c') { // cue-sized note (with duration) - getColumn(17) = '5'; - } else { // normal note - getColumn(17) = 'S'; - } -} -void MuseRecord::setNotehead32nd(void) { - if ((*this)[0] == 'g') { // grace note - getColumn(8) = '4'; - } else if ((*this)[0] == 'c') { // cue-sized note (with duration) - getColumn(17) = '4'; - } else { // normal note - getColumn(17) = 't'; - } -} +////////////////////////////// +// +// MuseRecord::getKernNoteAccents -- +// -void MuseRecord::setNotehead32ndMensural(void) { - if ((*this)[0] == 'g') { // grace note - getColumn(8) = '4'; - } else if ((*this)[0] == 'c') { // cue-sized note (with duration) - getColumn(17) = '4'; - } else { // normal note - getColumn(17) = 'T'; +string MuseRecord::getKernNoteAccents(void) { + string output; + int addnotecount = getAddCount(); + for (int i=0; i': output += "^"; break; // horizontal accent + case '.': output += "'"; break; // staccato + case '_': output += "~"; break; // tenuto + case '=': output += "~'"; break; // detached legato + case 'i': output += "s"; break; // spiccato + case '\'': output += ","; break; // breath mark + case 'F': output += ";"; break; // fermata up + case 'E': output += ";"; break; // fermata down + case 'S': output += ":"; break; // staccato + case 't': output += "O"; break; // trill (to generic) + case 'r': output += "S"; break; // turn + case 'k': output += "O"; break; // delayed turn (to generic) + case 'w': output += "O"; break; // shake (to generic) + case 'M': output += "O"; break; // mordent (to generic) + case 'j': output += "H"; break; // glissando (slide) + } } -} -void MuseRecord::setNotehead64th(void) { - if ((*this)[0] == 'g') { // grace note - getColumn(8) = '3'; - } else if ((*this)[0] == 'c') { // cue-sized note (with duration) - getColumn(17) = '3'; - } else { // normal note - getColumn(17) = 'x'; - } + return output; } -void MuseRecord::setNotehead64thMensural(void) { - if ((*this)[0] == 'g') { // grace note - getColumn(8) = '3'; - } else if ((*this)[0] == 'c') { // cue-sized note (with duration) - getColumn(17) = '3'; - } else { // normal note - getColumn(17) = 'X'; - } -} -void MuseRecord::setNotehead128th(void) { - if ((*this)[0] == 'g') { // grace note - getColumn(8) = '2'; - } else if ((*this)[0] == 'c') { // cue-sized note (with duration) - getColumn(17) = '2'; - } else { // normal note - getColumn(17) = 'y'; - } -} -void MuseRecord::setNotehead128thMensural(void) { - if ((*this)[0] == 'g') { // grace note - getColumn(8) = '2'; - } else if ((*this)[0] == 'c') { // cue-sized note (with duration) - getColumn(17) = '2'; - } else { // normal note - getColumn(17) = 'Y'; - } -} +////////////////////////////// +// +// MuseRecord::getKernRestStyle -- +// -void MuseRecord::setNotehead256th(void) { - if ((*this)[0] == 'g') { // grace note - getColumn(8) = '1'; - } else if ((*this)[0] == 'c') { // cue-sized note (with duration) - getColumn(17) = '1'; - } else { // normal note - getColumn(17) = 'z'; +string MuseRecord::getKernRestStyle(void) { + + string output; + string rhythmstring; + + // place the rhythm + stringstream tempdur; + + if (!isAnyRest()) { + // not a rest, so return nothing + return ""; } -} -void MuseRecord::setNotehead256thMensural(void) { - if ((*this)[0] == 'g') { // grace note - getColumn(8) = '1'; - } else if ((*this)[0] == 'c') { // cue-sized note (with duration) - getColumn(17) = '1'; - } else { // normal note - getColumn(17) = 'Z'; + // logical duration of the note + HumNum logicalduration = getTicks(); + logicalduration /= getTpq(); + string durrecip = Convert::durationToRecip(logicalduration); + + /* + int notetype; + if (graphicNoteTypeQ()) { + notetype = getGraphicNoteType(); + + if (timeModificationLeftQ()) { + notetype = notetype / 4 * getTimeModificationLeft(); + } + if (timeModificationRightQ()) { + notetype = notetype * getTimeModificationRight() / 2; + } + tempdur << notetype; + output = tempdur.str(); + + // add any dots of prolongation to the output string + output += getStringProlongation(); + } else { // stage 1 data: + HumNum dnotetype(getTickDuration(), quarter); + rhythmstring = Convert::durationToRecip(dnotetype); + output += rhythmstring; } -} + */ + output = durrecip; -///////////////////////////// -// -// MuseRecord::setBack -- -// + // add the pitch to the output string + output += "r"; -void MuseRecord::setBack(int value) { - insertString(1, "back"); - setTicks(value); + if (isInvisibleRest()) { + output += "yy"; + } + + return output; } -///////////////////////////// +////////////////////////////// // -// MuseRecord::setTicks -- return the numeric value in columns 6-9. +// MuseRecord::getKernMeasure -- Return the **kern measure token +// for barline. // -void MuseRecord::setTicks(int value) { - if ((value < 0) || (value >= 1000)) { - cerr << "@ Error: ticks out of range in MuseRecord::setTicks" << endl; +string MuseRecord::getKernMeasure(void) { + if (!isBarline()) { + return ""; } - stringstream ss; - ss << value; - int len = (int)ss.str().size(); - insertString(5+3-len+1, ss.str()); + string measureStyle = getMeasureType(); + string measureFlag = getMeasureFlags(); + + string output = "="; + if ((measureStyle.find("mheavy") != string::npos) && measureFlag.empty()) { + output += "="; + } + + if ((output != "==") && measureNumberQ()) { + output += getMeasureNumber(); + } + + if (measureStyle == "mheavy1") { + output += "!"; + } else if (measureStyle == "mheavy2") { + if (measureFlagEqual(":||:")) { + output += ":|!|:"; + } else if (measureFlagEqual("|: :|")) { + // Vivaldi op. 1, no. 1, mvmt. 1, m. 10: mheavy4 |: :| + output += ":|!|:"; + } + } else if (measureStyle == "mheavy3") { + output += "!|"; + } else if (measureStyle == "mheavy4") { + if (measureFlagEqual(":||:")) { + output += ":!!:"; + } else if (measureFlagEqual(":||:")) { + output += ":|!|:"; + } else if (measureFlagEqual("|: :|")) { + output += ":|!|:"; + } else { + output += "!!"; + } + } + return output; } ////////////////////////////// // -// MuseRecord::getTie -- +// MuseRecord::getKernNoteOtherNotations -- Extract note-level ornaments +// and articulations. See MuseRecord::getOtherNotation() for list +// of "other notations". // -string MuseRecord::getTieString(void) { +string MuseRecord::getKernNoteOtherNotations(void) { string output; - output += getColumn(9); - if (output == " ") { - output = ""; + string notations = getOtherNotations(); + for (int i=0; i<(int)notations.size(); i++) { + switch(notations[i]) { + case 'F': // fermata above + output += ";"; + break; + case 'E': // fermata below + output += ";<"; + break; + case '.': // staccato + output += "'"; + break; + case ',': // breath mark + output += ","; + break; + case '=': // tenuto-staccato + output += "~'"; + break; + case '>': // accent + output += "^"; + break; + case 'A': // heavy accent + output += "^^"; + break; + case 'M': // mordent + output += "M"; + break; + case 'r': // turn + output += "S"; + break; + case 't': // trill + output += "T"; + break; + case 'n': // down bow + output += "u"; + break; + case 'v': // up bow + output += "v"; + break; + case 'Z': // sfz + output += "zz"; + break; + } } return output; } -int MuseRecord::getTie(void) { - return tieQ(); -} ////////////////////////////// // -// MuseRecord::getTie -- Set a tie marker in column 9. Currently -// the function does not check the type of data, so will overr-write any -// data found in column 9 (such as if the record is not for a note). -// -// If the input parameter hidden is true, then the visual tie is not -// displayed, but the sounding tie is displayed. +// MuseRecord::getMeasureNumberField -- Columns 9-12 contain the measure number. // -int MuseRecord::setTie(int hidden) { - getColumn(9) = '-'; - if (!hidden) { - return addAdditionalNotation('-'); - } else { - return -1; +string MuseRecord::getMeasureNumberField(void) { + if (!isBarline()) { + return ""; } + return extract(9, 12); } ////////////////////////////// // -// MuseRecord::addAdditionalNotation -- ties, slurs and tuplets. -// Currently not handling editorial levels. +// MuseRecord::getMeasureNumber -- Remove spaces from field. // -int MuseRecord::addAdditionalNotation(char symbol) { - // search columns 32 to 43 for the specific symbol. - // if it is found, then don't add. If it is not found, - // then do add. - int i; - int blank = -1; - int nonempty = 0; // true if a non-space character was found. +string MuseRecord::getMeasureNumber(void) { + return trimSpaces(getMeasureNumberField()); +} - for (i=43; i>=32; i--) { - if (getColumn(i) == symbol) { - return i; - } else if (!nonempty && (getColumn(i) == ' ')) { - blank = i; - } else { - nonempty = i; - } - } - if (symbol == '-') { - // give preferential treatment to placing only ties in - // column 32 - if (getColumn(32) == ' ') { - getColumn(32) = '-'; - return 32; - } - } - if (blank < 0) { - cerr << "Error in MuseRecord::addAdditionalNotation: " - << "no empty space for notation" << endl; - return 0; - } +////////////////////////////// +// +// MuseRecord::getMeasureType -- Columns 1-7. +// - if ((blank <= 32) && (getColumn(33) == ' ')) { - // avoid putting non-tie items in column 32. - blank = 33; +string MuseRecord::getMeasureType(void) { + if (!isBarline()) { + return ""; } - - getColumn(blank) = symbol; - return blank; + return extract(1, 7); } -// add a multi-character additional notation (such as a dynamic like mf): -int MuseRecord::addAdditionalNotation(const string& symbol) { - int len = (int)symbol.size(); - // search columns 32 to 43 for the specific symbol. - // if it is found, then don't add. If it is not found, - // then do add. - int i, j; - int blank = -1; - int found = 0; - int nonempty = 0; // true if a non-space character was found. +////////////////////////////// +// +// MuseRecord::measureNumberQ -- Returns true if barline +// has a measure number. +// - for (i=43-len; i>=32; i--) { - found = 1; - for (j=0; j= (int)recordInfo.size()) { + cerr << "Error: no octave specification in note field: " << recordInfo + << endl; + return 0; + } + return recordInfo[index] - '0'; } -int MuseRecord::getLevel(void) { - int output = 1; - string recordInfo = getLevelField(); - if (recordInfo[0] == ' ') { - output = 1; - } else { - output = (int)strtol(recordInfo.c_str(), NULL, 36); +string MuseRecord::getOctaveString(void) { + string recordInfo = getNoteField(); + int index = 0; + while ((index < (int)recordInfo.size()) && !std::isdigit(recordInfo[index])) { + index++; + } + if (index >= (int)recordInfo.size()) { + cerr << "Error: no octave specification in note field: " << recordInfo + << endl; + return ""; } + string output; + output += recordInfo[index]; return output; } @@ -40417,16 +41712,22 @@ int MuseRecord::getLevel(void) { ////////////////////////////// // -// MuseRecord::levelQ -- +// MuseRecord::getPitch -- int version returns the base40 representation // -int MuseRecord::levelQ(void) { - int output = 0; - string recordInfo = getLevelField(); - if (recordInfo[0] == ' ') { - output = 0; - } else { - output = 1; +int MuseRecord::getPitch(void) { + string recordInfo = getNoteField(); + return Convert::museToBase40(recordInfo); +} + + +string MuseRecord::getPitchString(void) { + string output = getNoteField(); + int len = (int)output.size(); + int index = len-1; + while (index >= 0 && output[index] == ' ') { + output.resize(index); + index--; } return output; } @@ -40435,47 +41736,61 @@ int MuseRecord::levelQ(void) { ////////////////////////////// // -// MuseRecord::getTrackField -- return column 15 +// MuseRecord::getPitchClass -- returns the pitch without the octave information // -string MuseRecord::getTrackField(void) { - if (!isAnyNoteOrRest()) { - return extract(15, 15); - } else { - return " "; +int MuseRecord::getPitchClass(void) { + return getPitch() % 40; +} + + +string MuseRecord::getPitchClassString(void) { + string output = getNoteField(); + int index = 0; + while ((index < (int)output.size()) && !std::isdigit(output[index])) { + index++; } + output.resize(index); + return output; } ////////////////////////////// // -// MuseRecord::getTrackString -- +// MuseRecord::getAccidental -- int version return -2 for double flat, +// -1 for flat, 0 for natural, +1 for sharp, +2 for double sharp // -string MuseRecord::getTrackString(void) { - string output = getTrackField(); - if (output[0] == ' ') { - output = ""; +int MuseRecord::getAccidental(void) { + string recordInfo = getNoteField(); + int output = 0; + int index = 0; + while ((index < (int)recordInfo.size()) && (index < 16)) { + if (recordInfo[index] == 'f') { + output--; + } else if (recordInfo[index] == '#') { + output++; + } + index++; } return output; } - -////////////////////////////// -// -// MuseRecord::getTrack -- Return 0 if no track information (implicitly track 1, -// or unlabelled higher track). -// - -int MuseRecord::getTrack(void) { - int output = 1; - string recordInfo = getTrackField(); - if (recordInfo[0] == ' ') { - output = 0; - } else { - output = (int)strtol(recordInfo.c_str(), NULL, 36); +string MuseRecord::getAccidentalString(void) { + string output; + int type = getAccidental(); + switch (type) { + case -2: output = "ff"; break; + case -1: output = "f"; break; + case 0: output = ""; break; + case 1: output = "#"; break; + case 2: output = "##"; break; + default: + output = getNoteField(); + cerr << "Error: unknown type of accidental: " << output << endl; + return ""; } return output; } @@ -40484,208 +41799,200 @@ int MuseRecord::getTrack(void) { ////////////////////////////// // -// MuseRecord::trackQ -- +// MuseRecord::getBase40 -- return the base40 pitch value of the data +// line. Middle C set to 40 * 4 + 2; Returns -100 for non-pitched items. +// (might have to update for note_cur_chord and note_grace_chord which +// do not exist yet. // -int MuseRecord::trackQ(void) { - int output = 0; - string recordInfo = getTrackField(); - if (recordInfo[0] == ' ') { - output = 0; - } else { - output = 1; +int MuseRecord::getBase40(void) { + switch (getType()) { + case E_muserec_note_regular: + case E_muserec_note_chord: + case E_muserec_note_cue: + case E_muserec_note_grace: + break; + default: + return -100; } - - return output; + return getPitch(); } ////////////////////////////// // -// MuseRecord::getGraphicNoteTypeField -- return column 17 +// MuseRecord::setStemDown -- // -string MuseRecord::getGraphicNoteTypeField(void) { -// allowNotesOnly("getGraphicNoteTypefield"); - if (getLength() < 17) { - return " "; - } else { - return extract(17, 17); - } +void MuseRecord::setStemDown(void) { + getColumn(23) = 'd'; } ////////////////////////////// // -// MuseRecord::getGraphicNoteType -- +// MuseRecord::setStemUp -- // -string MuseRecord::getGraphicNoteTypeString(void) { - string output = getGraphicNoteTypeField(); - if (output[0] == ' ') { - output = ""; - } - return output; +void MuseRecord::setStemUp(void) { + getColumn(23) = 'u'; } ////////////////////////////// // -// MuseRecord::getGraphicRecip -- +// MuseRecord::setPitch -- input is a base40 value which gets converted +// to a diatonic pitch name. +// Default value: chordnote = 0 +// Default value: gracenote = 0 // -string MuseRecord::getGraphicRecip(void) { - int notetype = getGraphicNoteType(); - string output; - switch (notetype) { - case -3: output = "0000"; break; // double-maxima - case -2: output = "000"; break; // maxima - case -1: output = "00"; break; // long - default: - output = to_string(notetype); // regular **recip number +void MuseRecord::setPitch(int base40, int chordnote, int gracenote) { + string diatonic; + switch (Convert::base40ToDiatonic(base40) % 7) { + case 0: diatonic = 'C'; break; + case 1: diatonic = 'D'; break; + case 2: diatonic = 'E'; break; + case 3: diatonic = 'F'; break; + case 4: diatonic = 'G'; break; + case 5: diatonic = 'A'; break; + case 6: diatonic = 'B'; break; + default: diatonic = 'X'; } - int dotcount = getDotCount(); - for (int i=0; i= 32) { - return -2; - } else if (value >= 16) { - return -1; - } else if (value >= 8) { - return 0; - } else if (value >= 4) { - return 1; - } else if (value >= 2) { - return 2; - } else if (value >= 1) { - return 4; - } else if (value.getFloat() >= 0.5) { - return 8; - } else if (value.getFloat() >= 0.25) { - return 16; - } else if (value.getFloat() >= 0.125) { - return 32; - } else if (value.getFloat() >= 0.0625) { - return 64; - } else if (value.getFloat() >= 1.0/128) { - return 128; - } else if (value.getFloat() >= 1.0/256) { - return 256; - } else if (value.getFloat() >= 1.0/512) { - return 512; - } else { - return 0; - } - } else { - cerr << "Error: no graphic note type specified: " << getLine() << endl; - return 0; - } +void MuseRecord::setGraceChordPitch(const string& pitchname) { + getColumn(1) = 'g'; + getColumn(2) = ' '; + setPitchAtIndex(2, pitchname); +} + +void MuseRecord::setCuePitch(const string& pitchname) { + getColumn(1) = 'c'; + setPitchAtIndex(1, pitchname); +} + + +void MuseRecord::setPitch(const string& pitchname) { + int start = 0; + // If the record is already set to a grace note or a cue note, + // then place pitch information starting at column 2 (index 1). + if ((getColumn(1) == 'g') || (getColumn(1) == 'c')) { + start = 1; } + setPitchAtIndex(start, pitchname); +} - switch (recordInfo[0]) { - case 'M': // Maxima - output = -2; break; - case 'L': case 'B': // Longa - output = -1; break; - case 'b': case 'A': // Breve - output = 0; break; - case 'w': case '9': // Whole - output = 1; break; - case 'h': case '8': // Half - output = 2; break; - case 'q': case '7': // Quarter - output = 4; break; - case 'e': case '6': // Eighth - output = 8; break; - case 's': case '5': // Sixteenth - output = 16; break; - case 't': case '4': // 32nd note - output = 32; break; - case 'x': case '3': // 64th note - output = 64; break; - case 'y': case '2': // 128th note - output = 128; break; - case 'z': case '1': // 256th note - output = 256; break; - default: - cerr << "Error: unknown graphical note type in column 17: " - << getLine() << endl; + +void MuseRecord::setPitchAtIndex(int index, const string& pitchname) { + int len = (int)pitchname.size(); + if ((len > 4) && (pitchname != "irest")) { + cerr << "Error in MuseRecord::setPitchAtIndex: " << pitchname << endl; + return; } + insertString(index+1, pitchname); - return output; + // Clear any text fields not used by current pitch data. + for (int i=4-len-1; i>=0; i--) { + (*this)[index + len + i] = ' '; + } } + ////////////////////////////// // -// MuseRecord::graphicNoteTypeQ -- +// MuseRecord::getTickDurationField -- returns the string containing the +// duration, and tie information. // -int MuseRecord::graphicNoteTypeQ(void) { - int output = 0; - string recordInfo = getGraphicNoteTypeField(); - if (recordInfo[0] == ' ') { - output = 0; - } else { - output = 1; +string MuseRecord::getTickDurationField(void) { + switch (getType()) { + case E_muserec_figured_harmony: + case E_muserec_note_regular: + case E_muserec_note_chord: + case E_muserec_rest: + case E_muserec_backward: + case E_muserec_forward: + return extract(6, 9); + break; + // these record types do not have duration, per se: + case E_muserec_note_cue: + case E_muserec_note_grace: + default: + return " "; + // cerr << "Error: cannot use getTickDurationField function on line: " + // << getLine() << endl; + // return ""; } - return output; + return ""; } ////////////////////////////// // -// MuseRecord::graphicNoteTypeSize -- return 0 if cue note size, -// otherwise, it will return 1 if regular size +// MuseRecord::getTickDurationString -- returns the string containing the duration, // -int MuseRecord::getGraphicNoteTypeSize(void) { - int output = 1; - string recordInfo = getGraphicNoteTypeField(); - if (recordInfo[0] == ' ') { - cerr << "Error: not graphic note specified in column 17: " - << getLine() << endl; - return 0; +string MuseRecord::getTickDurationString(void) { + string output = getTickDurationField(); + int length = (int)output.size(); + int i = length - 1; + while (i>0 && (output[i] == '-' || output[i] == ' ')) { + output.resize(i); + i--; + length--; } - switch (recordInfo[0]) { - case 'L': case 'b': case 'w': case 'h': case 'q': case 'e': - case 's': case 't': case 'x': case 'y': case 'z': - output = 1; - break; - case 'B': case 'A': case '9': case '8': case '7': case '6': - case '5': case '4': case '3': case '2': case '1': - output = 0; - break; - default: - cerr << "Error: unknown graphical note type in column 17: " - << getLine() << endl; - return 0; + int start = 0; + while (output[start] == ' ') { + start++; + } + + if (start != 0) { + for (i=0; i rests also - if (getLength() < 18) { - return " "; - } else { - return extract(18, 18); +int MuseRecord::getTickDuration(void) { + string recordInfo = getTickDurationString(); + if (recordInfo.empty()) { + return 0; } + return std::stoi(recordInfo); } ////////////////////////////// // -// MuseRecord::getProlongationString -- +// MuseRecord::getLineTickDuration -- returns the logical duration of the +// data line. Supresses the duration field of secondary chord notes. // -string MuseRecord::getProlongationString(void) { - string output = getProlongationField(); - if (output[0] == ' ') { - output = ""; +int MuseRecord::getLineTickDuration(void) { + if (getType() == E_muserec_note_chord) { + return 0; } - return output; + + string recordInfo = getTickDurationString(); + if (recordInfo.empty()) { + return 0; + } + int value = std::stoi(recordInfo); + if (getType() == E_muserec_backspace) { + return -value; + } + + return value; } ////////////////////////////// // -// MuseRecord::getProlongation -- +// MuseRecord::getTicks -- similar to getLineTickDuration, but is non-zero +// for secondary chord notes. // -int MuseRecord::getProlongation(void) { - int output = 0; - string recordInfo = getProlongationField(); - switch (recordInfo[0]) { - case ' ': output = 0; break; - case '.': output = 1; break; - case ':': output = 2; break; - default: - cerr << "Error: unknon prologation character (column 18): " - << getLine() << endl; - return 0; +int MuseRecord::getTicks(void) { + string recordInfo = getTickDurationString(); + if (recordInfo.empty()) { + return 0; + } + int value = std::stoi(recordInfo); + if (getType() == E_muserec_backspace) { + return -value; } - return output; -} + return value; +} ////////////////////////////// // -// MuseRecord::getStringProlongation -- +// MuseRecord::getNoteTickDuration -- Similar to getLineTickDuration, +// but do not suppress the duration of secondary chord-tones. // -string MuseRecord::getStringProlongation(void) { - switch (getProlongation()) { - case 0: return ""; break; - case 1: return "."; break; - case 2: return ".."; break; - case 3: return "..."; break; - case 4: return "...."; break; - default: - cerr << "Error: unknown number of prolongation dots (column 18): " - << getLine() << endl; - return ""; +int MuseRecord::getNoteTickDuration(void) { + string recordInfo = getTickDurationString(); + int value = 0; + if (recordInfo.empty()) { + return value; } - return ""; + value = std::stoi(recordInfo); + if (getType() == E_muserec_backspace) { + return -value; + } + return value; } ////////////////////////////// // -// MuseRecord::prolongationQ -- +// MuseRecord::setDots -- // -int MuseRecord::prolongationQ(void) { - return getProlongation(); -} - - -////////////////////////////// -// -// MuseRecord::getNotatedAccidentalField -- actual notated accidental is -// stored in column 19. -// - -string MuseRecord::getNotatedAccidentalField(void) { - allowNotesOnly("getNotatedAccidentalField"); - if (getLength() < 19) { - return " "; - } else { - string temp; - temp += getColumn(19); - return temp; +void MuseRecord::setDots(int value) { + switch (value) { + case 0: getColumn(18) = ' '; break; + case 1: getColumn(18) = '.'; break; + case 2: getColumn(18) = ':'; break; + case 3: getColumn(18) = ';'; break; + case 4: getColumn(18) = '!'; break; + default: cerr << "Error in MuseRecord::setDots : " << value << endl; } } @@ -40798,363 +42102,578 @@ string MuseRecord::getNotatedAccidentalField(void) { ////////////////////////////// // -// MuseRecord::getNotatedAccidentalString -- +// MuseRecord::getDotCount -- // -string MuseRecord::getNotatedAccidentalString(void) { - string output = getNotatedAccidentalField(); - if (output[0] == ' ') { - output = ""; +int MuseRecord::getDotCount(void) { + char value = getColumn(18); + switch (value) { + case ' ': return 0; + case '.': return 1; + case ':': return 2; + case ';': return 3; + case '!': return 4; } - return output; + return 0; } ////////////////////////////// // -// MuseRecord::getNotatedAccidental -- +// MuseRecord::setNoteheadShape -- Duration with augmentation dot component +// removed. Duration of 1 is quarter note. // -int MuseRecord::getNotatedAccidental(void) { - int output = 0; - string recordInfo = getNotatedAccidentalField(); - switch (recordInfo[0]) { - case ' ': output = 0; break; - case '#': output = 1; break; - case 'n': output = 0; break; - case 'f': output = -1; break; - case 'x': output = 2; break; - case 'X': output = 2; break; - case '&': output = -2; break; - case 'S': output = 1; break; - case 'F': output = -1; break; - default: - cerr << "Error: unknown accidental: " << recordInfo[0] << endl; - return 0; +void MuseRecord::setNoteheadShape(HumNum duration) { + HumNum note8th(1,2); + HumNum note16th(1,4); + HumNum note32nd(1,8); + HumNum note64th(1,16); + HumNum note128th(1,32); + HumNum note256th(1,64); + + if (duration > 16) { // maxima + setNoteheadMaxima(); + } else if (duration > 8) { // long + setNoteheadLong(); + } else if (duration > 4) { // breve + if (m_roundBreve) { + setNoteheadBreveRound(); + } else { + setNoteheadBreve(); + } + } else if (duration > 2) { // whole note + setNoteheadWhole(); + } else if (duration > 1) { // half note + setNoteheadHalf(); + } else if (duration > note8th) { // quarter note + setNoteheadQuarter(); + } else if (duration > note16th) { // eighth note + setNotehead8th(); + } else if (duration > note32nd) { // 16th note + setNotehead16th(); + } else if (duration > note64th) { // 32nd note + setNotehead32nd(); + } else if (duration > note128th) { // 64th note + setNotehead64th(); + } else if (duration > note256th) { // 128th note + setNotehead128th(); + } else if (duration == note256th) { // 256th note + // not allowing tuplets on the 256th note level. + setNotehead256th(); + } else { + cerr << "Error in duration: " << duration << endl; + return; } - return output; } ////////////////////////////// // -// MuseRecord::notatedAccidentalQ -- +// MuseRecord::setNoteheadShape -- Duration with augmentation dot component +// removed. Duration of 1 is quarter note. // -int MuseRecord::notatedAccidentalQ(void) { - int output; - string recordInfo = getNotatedAccidentalField(); - if (recordInfo[0] == ' ') { - output = 0; +void MuseRecord::setNoteheadShapeMensural(HumNum duration) { + HumNum note8th(1, 2); + HumNum note16th(1, 4); + HumNum note32th(1, 8); + HumNum note64th(1, 16); + HumNum note128th(1, 32); + HumNum note256th(1, 64); + + if (duration > 16) { // maxima + setNoteheadMaxima(); + } else if (duration > 8) { // long + setNoteheadLong(); + } else if (duration > 4) { // breve + setNoteheadBreve(); + } else if (duration > 2) { // whole note + setNoteheadWholeMensural(); + } else if (duration > 1) { // half note + setNoteheadHalfMensural(); + } else if (duration > note8th) { // quarter note + setNoteheadQuarterMensural(); + } else if (duration > note16th) { // eighth note + setNotehead8thMensural(); + } else if (duration > note32th) { // 16th note + setNotehead16thMensural(); + } else if (duration > note64th) { // 32nd note + setNotehead32ndMensural(); + } else if (duration > note128th) { // 64th note + setNotehead64thMensural(); + } else if (duration > note256th) { // 128th note + setNotehead128thMensural(); + } else if (duration >= note256th) { // 256th note + // don't allow tuplets on 256th note level. + setNotehead256thMensural(); } else { - output = 1; + cerr << "Error in duration: " << duration << endl; + return; } - return output; } +void MuseRecord::setNoteheadMaxima(void) { + if ((*this)[0] == 'c' || ((*this)[0] == 'g')) { + cerr << "Error: cue/grace notes cannot be maximas in setNoteheadLong" + << endl; + return; + } else { + getColumn(17) = 'M'; + } +} +void MuseRecord::setNoteheadLong(void) { + if ((*this)[0] == 'c' || ((*this)[0] == 'g')) { + cerr << "Error: cue/grace notes cannot be longs in setNoteheadLong" + << endl; + return; + } else { + getColumn(17) = 'L'; + } +} -/////////////////////////////// -// -// MuseRecord::getTimeModificationField -- return columns 20 -- 22. -// +void MuseRecord::setNoteheadBreve(void) { + setNoteheadBreveSquare(); +} -string MuseRecord::getTimeModificationField(void) { -// allowNotesOnly("getTimeModificationField"); ---> rests also - if (getLength() < 20) { - return " "; - } else { - return extract(20, 22); +void MuseRecord::setNoteheadBreveSquare(void) { + if ((*this)[0] == 'g') { // grace note + getColumn(8) = 'A'; + } else if ((*this)[0] == 'c') { // cue-sized note (with duration) + getColumn(17) = 'A'; + } else { // normal note + getColumn(17) = 'B'; } } +void MuseRecord::setNoteheadBreveRound(void) { + if ((*this)[0] == 'g') { // grace note + getColumn(8) = 'A'; + } else if ((*this)[0] == 'c') { // cue-sized note (with duration) + getColumn(17) = 'A'; + } else { // normal note + getColumn(17) = 'b'; + } +} +void MuseRecord::setNoteheadBreveMensural(void) { + setNoteheadBreveSquare(); +} -////////////////////////////// -// -// MuseRecord::getTimeModification -- -// +void MuseRecord::setNoteheadWhole(void) { + if ((*this)[0] == 'g') { // grace note + getColumn(8) = '9'; + } else if ((*this)[0] == 'c') { // cue-sized note (with duration) + getColumn(17) = '9'; + } else { // normal note + getColumn(17) = 'w'; + } +} -string MuseRecord::getTimeModification(void) { - string output = getTimeModificationField(); - int index = 2; - while (index >= 0 && output[index] == ' ') { - output.resize(index); - index--; +void MuseRecord::setNoteheadWholeMensural(void) { + if ((*this)[0] == 'g') { // grace note + getColumn(8) = '9'; + } else if ((*this)[0] == 'c') { // cue-sized note (with duration) + getColumn(17) = '9'; + } else { // normal note + getColumn(17) = 'W'; } - if (output.size() > 2) { - if (output[0] == ' ') { - output[0] = output[1]; - output[1] = output[2]; - output.resize(2); - } +} + +void MuseRecord::setNoteheadHalf(void) { + if ((*this)[0] == 'g') { // grace note + getColumn(8) = '8'; + } else if ((*this)[0] == 'c') { // cue-sized note (with duration) + getColumn(17) = '8'; + } else { // normal note + getColumn(17) = 'h'; } - if (output.size() > 1) { - if (output[0] == ' ') { - output[0] = output[1]; - output.resize(1); - } +} + +void MuseRecord::setNoteheadHalfMensural(void) { + if ((*this)[0] == 'g') { // grace note + getColumn(8) = '8'; + } else if ((*this)[0] == 'c') { // cue-sized note (with duration) + getColumn(17) = '8'; + } else { // normal note + getColumn(17) = 'H'; } - if (output[0] == ' ') { - cerr << "Error: funny error occured in time modification " - << "(columns 20-22): " << getLine() << endl; - return ""; +} + +void MuseRecord::setNoteheadQuarter(void) { + if ((*this)[0] == 'g') { // grace note + getColumn(8) = '7'; + } else if ((*this)[0] == 'c') { // cue-sized note (with duration) + getColumn(17) = '7'; + } else { // normal note + getColumn(17) = 'q'; } - return output; } +void MuseRecord::setNoteheadQuarterMensural(void) { + if ((*this)[0] == 'g') { // grace note + getColumn(8) = '7'; + } else if ((*this)[0] == 'c') { // cue-sized note (with duration) + getColumn(17) = '7'; + } else { // normal note + getColumn(17) = 'Q'; + } +} +void MuseRecord::setNotehead8th(void) { + if ((*this)[0] == 'g') { // grace note + getColumn(8) = '6'; + } else if ((*this)[0] == 'c') { // cue-sized note (with duration) + getColumn(17) = '6'; + } else { // normal note + getColumn(17) = 'e'; + } +} -////////////////////////////// -// -// MuseRecord::getTimeModificationLeftField -- return column 20 -// +void MuseRecord::setNotehead8thMensural(void) { + if ((*this)[0] == 'g') { // grace note + getColumn(8) = '6'; + } else if ((*this)[0] == 'c') { // cue-sized note (with duration) + getColumn(17) = '6'; + } else { // normal note + getColumn(17) = 'E'; + } +} -string MuseRecord::getTimeModificationLeftField(void) { - string output = getTimeModificationField(); - output.resize(1); - return output; +void MuseRecord::setNotehead16th(void) { + if ((*this)[0] == 'g') { // grace note + getColumn(8) = '5'; + } else if ((*this)[0] == 'c') { // cue-sized note (with duration) + getColumn(17) = '5'; + } else { // normal note + getColumn(17) = 's'; + } } +void MuseRecord::setNotehead16thMensural(void) { + if ((*this)[0] == 'g') { // grace note + getColumn(8) = '5'; + } else if ((*this)[0] == 'c') { // cue-sized note (with duration) + getColumn(17) = '5'; + } else { // normal note + getColumn(17) = 'S'; + } +} +void MuseRecord::setNotehead32nd(void) { + if ((*this)[0] == 'g') { // grace note + getColumn(8) = '4'; + } else if ((*this)[0] == 'c') { // cue-sized note (with duration) + getColumn(17) = '4'; + } else { // normal note + getColumn(17) = 't'; + } +} -////////////////////////////// -// -// MuseRecord::getTimeModificationLeftString -- -// +void MuseRecord::setNotehead32ndMensural(void) { + if ((*this)[0] == 'g') { // grace note + getColumn(8) = '4'; + } else if ((*this)[0] == 'c') { // cue-sized note (with duration) + getColumn(17) = '4'; + } else { // normal note + getColumn(17) = 'T'; + } +} -string MuseRecord::getTimeModificationLeftString(void) { - string output = getTimeModificationField(); - if (output[0] == ' ') { - output = ""; - } else { - output.resize(1); +void MuseRecord::setNotehead64th(void) { + if ((*this)[0] == 'g') { // grace note + getColumn(8) = '3'; + } else if ((*this)[0] == 'c') { // cue-sized note (with duration) + getColumn(17) = '3'; + } else { // normal note + getColumn(17) = 'x'; } - return output; } +void MuseRecord::setNotehead64thMensural(void) { + if ((*this)[0] == 'g') { // grace note + getColumn(8) = '3'; + } else if ((*this)[0] == 'c') { // cue-sized note (with duration) + getColumn(17) = '3'; + } else { // normal note + getColumn(17) = 'X'; + } +} +void MuseRecord::setNotehead128th(void) { + if ((*this)[0] == 'g') { // grace note + getColumn(8) = '2'; + } else if ((*this)[0] == 'c') { // cue-sized note (with duration) + getColumn(17) = '2'; + } else { // normal note + getColumn(17) = 'y'; + } +} -////////////////////////////// -// -// MuseRecord::getTimeModificationLeft -- -// +void MuseRecord::setNotehead128thMensural(void) { + if ((*this)[0] == 'g') { // grace note + getColumn(8) = '2'; + } else if ((*this)[0] == 'c') { // cue-sized note (with duration) + getColumn(17) = '2'; + } else { // normal note + getColumn(17) = 'Y'; + } +} -int MuseRecord::getTimeModificationLeft(void) { - int output = 0; - string recordInfo = getTimeModificationLeftString(); - if (recordInfo[0] == ' ') { - output = 0; - } else { - output = (int)strtol(recordInfo.c_str(), NULL, 36); +void MuseRecord::setNotehead256th(void) { + if ((*this)[0] == 'g') { // grace note + getColumn(8) = '1'; + } else if ((*this)[0] == 'c') { // cue-sized note (with duration) + getColumn(17) = '1'; + } else { // normal note + getColumn(17) = 'z'; } - return output; } +void MuseRecord::setNotehead256thMensural(void) { + if ((*this)[0] == 'g') { // grace note + getColumn(8) = '1'; + } else if ((*this)[0] == 'c') { // cue-sized note (with duration) + getColumn(17) = '1'; + } else { // normal note + getColumn(17) = 'Z'; + } +} -////////////////////////////// +///////////////////////////// // -// MuseRecord::getTimeModificationRightField -- return column 20 +// MuseRecord::setBack -- // -string MuseRecord::getTimeModificationRightField(void) { - string output = getTimeModificationField(); - output = output[2]; - return output; +void MuseRecord::setBack(int value) { + insertString(1, "back"); + setTicks(value); } -////////////////////////////// +///////////////////////////// // -// MuseRecord::getTimeModificationRight -- +// MuseRecord::setTicks -- return the numeric value in columns 6-9. // -string MuseRecord::getTimeModificationRightString(void) { - string output = getTimeModificationField(); - if (output[2] == ' ') { - output = ""; - } else { - output = output[2]; +void MuseRecord::setTicks(int value) { + if ((value < 0) || (value >= 1000)) { + cerr << "@ Error: ticks out of range in MuseRecord::setTicks" << endl; } - return output; + stringstream ss; + ss << value; + int len = (int)ss.str().size(); + insertString(5+3-len+1, ss.str()); } ////////////////////////////// // -// MuseRecord::getTimeModificationRight -- +// MuseRecord::getTie -- // -int MuseRecord::getTimeModificationRight(void) { - int output = 0; - string recordInfo = getTimeModificationRightString(); - if (recordInfo[2] == ' ') { - output = 0; - } else { - string temp = recordInfo.substr(2); - output = (int)strtol(temp.c_str(), NULL, 36); +string MuseRecord::getTieString(void) { + string output; + output += getColumn(9); + if (output == " ") { + output = ""; } return output; } +int MuseRecord::getTie(void) { + return tieQ(); +} + ////////////////////////////// // -// MuseRecord::timeModificationQ -- +// MuseRecord::getTie -- Set a tie marker in column 9. Currently +// the function does not check the type of data, so will overr-write any +// data found in column 9 (such as if the record is not for a note). +// +// If the input parameter hidden is true, then the visual tie is not +// displayed, but the sounding tie is displayed. // -int MuseRecord::timeModificationQ(void) { - int output = 0; - string recordInfo = getTimeModificationField(); - if (recordInfo[0] != ' ' || recordInfo[1] != ' ' || recordInfo[2] != ' ') { - output = 1; +int MuseRecord::setTie(int hidden) { + getColumn(9) = '-'; + if (!hidden) { + return addAdditionalNotation('-'); } else { - output = 0; + return -1; } - return output; } ////////////////////////////// // -// MuseRecord::timeModificationLeftQ -- +// MuseRecord::addAdditionalNotation -- ties, slurs and tuplets. +// Currently not handling editorial levels. // -int MuseRecord::timeModificationLeftQ(void) { - int output = 0; - string recordInfo = getTimeModificationField(); - if (recordInfo[0] == ' ') { - output = 0; - } else { - output = 1; - } - return output; -} +int MuseRecord::addAdditionalNotation(char symbol) { + // search columns 32 to 43 for the specific symbol. + // if it is found, then don't add. If it is not found, + // then do add. + int i; + int blank = -1; + int nonempty = 0; // true if a non-space character was found. + for (i=43; i>=32; i--) { + if (getColumn(i) == symbol) { + return i; + } else if (!nonempty && (getColumn(i) == ' ')) { + blank = i; + } else { + nonempty = i; + } + } + if (symbol == '-') { + // give preferential treatment to placing only ties in + // column 32 + if (getColumn(32) == ' ') { + getColumn(32) = '-'; + return 32; + } + } -////////////////////////////// -// -// MuseRecord::timeModificationRightQ -- -// + if (blank < 0) { + cerr << "Error in MuseRecord::addAdditionalNotation: " + << "no empty space for notation" << endl; + return 0; + } -int MuseRecord::timeModificationRightQ(void) { - int output = 0; - string recordInfo = getTimeModificationField(); - if (recordInfo[2] == ' ') { - output = 0; - } else { - output = 1; + if ((blank <= 32) && (getColumn(33) == ' ')) { + // avoid putting non-tie items in column 32. + blank = 33; } - return output; + + getColumn(blank) = symbol; + return blank; } +// add a multi-character additional notation (such as a dynamic like mf): -////////////////////////////// -// -// MuseRecord::getStemDirectionField -- -// +int MuseRecord::addAdditionalNotation(const string& symbol) { + int len = (int)symbol.size(); + // search columns 32 to 43 for the specific symbol. + // if it is found, then don't add. If it is not found, + // then do add. + int i, j; + int blank = -1; + int found = 0; + int nonempty = 0; // true if a non-space character was found. -string MuseRecord::getStemDirectionField(void) { - allowNotesOnly("getStemDirectionField"); - if (getLength() < 23) { - return " "; - } else { - string temp; - temp += getColumn(23); - return temp; + for (i=43-len; i>=32; i--) { + found = 1; + for (j=0; j= 32) { + return -2; + } else if (value >= 16) { + return -1; + } else if (value >= 8) { + return 0; + } else if (value >= 4) { + return 1; + } else if (value >= 2) { + return 2; + } else if (value >= 1) { + return 4; + } else if (value.getFloat() >= 0.5) { + return 8; + } else if (value.getFloat() >= 0.25) { + return 16; + } else if (value.getFloat() >= 0.125) { + return 32; + } else if (value.getFloat() >= 0.0625) { + return 64; + } else if (value.getFloat() >= 1.0/128) { + return 128; + } else if (value.getFloat() >= 1.0/256) { + return 256; + } else if (value.getFloat() >= 1.0/512) { + return 512; + } else { + return 0; + } + } else { + cerr << "Error: no graphic note type specified: " << getLine() << endl; + return 0; + } + } + + switch (recordInfo[0]) { + case 'M': // Maxima + output = -2; break; + case 'L': case 'B': // Longa + output = -1; break; + case 'b': case 'A': // Breve + output = 0; break; + case 'w': case '9': // Whole + output = 1; break; + case 'h': case '8': // Half + output = 2; break; + case 'q': case '7': // Quarter + output = 4; break; + case 'e': case '6': // Eighth + output = 8; break; + case 's': case '5': // Sixteenth + output = 16; break; + case 't': case '4': // 32nd note + output = 32; break; + case 'x': case '3': // 64th note + output = 64; break; + case 'y': case '2': // 128th note + output = 128; break; + case 'z': case '1': // 256th note + output = 256; break; + default: + cerr << "Error: unknown graphical note type in column 17: " + << getLine() << endl; } + return output; } - ////////////////////////////// // -// MuseRecord::beam32Q -- +// MuseRecord::graphicNoteTypeQ -- // -int MuseRecord::beam32Q(void) { +int MuseRecord::graphicNoteTypeQ(void) { int output = 0; - if (getBeam32() == ' ') { + string recordInfo = getGraphicNoteTypeField(); + if (recordInfo[0] == ' ') { output = 0; } else { output = 1; @@ -41374,16 +43001,34 @@ int MuseRecord::beam32Q(void) { ////////////////////////////// // -// MuseRecord::beam64Q -- +// MuseRecord::graphicNoteTypeSize -- return 0 if cue note size, +// otherwise, it will return 1 if regular size // -int MuseRecord::beam64Q(void) { - int output = 0; - if (getBeam64() == ' ') { - output = 0; - } else { - output = 1; +int MuseRecord::getGraphicNoteTypeSize(void) { + int output = 1; + string recordInfo = getGraphicNoteTypeField(); + if (recordInfo[0] == ' ') { + cerr << "Error: not graphic note specified in column 17: " + << getLine() << endl; + return 0; + } + + switch (recordInfo[0]) { + case 'L': case 'b': case 'w': case 'h': case 'q': case 'e': + case 's': case 't': case 'x': case 'y': case 'z': + output = 1; + break; + case 'B': case 'A': case '9': case '8': case '7': case '6': + case '5': case '4': case '3': case '2': case '1': + output = 0; + break; + default: + cerr << "Error: unknown graphical note type in column 17: " + << getLine() << endl; + return 0; } + return output; } @@ -41391,32 +43036,29 @@ int MuseRecord::beam64Q(void) { ////////////////////////////// // -// MuseRecord::beam128Q -- +// MuseRecord::getProlongationField -- returns column 18 // -int MuseRecord::beam128Q(void) { - int output = 0; - if (getBeam128() == ' ') { - output = 0; +string MuseRecord::getProlongationField(void) { +// allowNotesOnly("getProlongationField"); ---> rests also + if (getLength() < 18) { + return " "; } else { - output = 1; + return extract(18, 18); } - return output; } ////////////////////////////// // -// MuseRecord::beam256Q -- +// MuseRecord::getProlongationString -- // -int MuseRecord::beam256Q(void) { - int output = 0; - if (getBeam256() == ' ') { - output = 0; - } else { - output = 1; +string MuseRecord::getProlongationString(void) { + string output = getProlongationField(); + if (output[0] == ' ') { + output = ""; } return output; } @@ -41425,32 +43067,20 @@ int MuseRecord::beam256Q(void) { ////////////////////////////// // -// MuseRecord::getKernBeamStyle -- +// MuseRecord::getProlongation -- // -string MuseRecord::getKernBeamStyle(void) { - string output; - string beams = getBeamField(); - for (int i=0; i<(int)beams.size(); i++) { - switch (beams[i]) { - case '[': // start beam - output += "L"; - break; - case '=': // continue beam - // do nothing - break; - case ']': // end beam - output += "J"; - break; - case '/': // forward hook - output += "K"; - break; - case '\\': // backward hook - output += "k"; - break; - default: - ; // do nothing - } +int MuseRecord::getProlongation(void) { + int output = 0; + string recordInfo = getProlongationField(); + switch (recordInfo[0]) { + case ' ': output = 0; break; + case '.': output = 1; break; + case ':': output = 2; break; + default: + cerr << "Error: unknon prologation character (column 18): " + << getLine() << endl; + return 0; } return output; } @@ -41459,77 +43089,65 @@ string MuseRecord::getKernBeamStyle(void) { ////////////////////////////// // -// MuseRecord::getAdditionalNotationsField -- returns the contents -// of columns 32-43. +// MuseRecord::getStringProlongation -- // -string MuseRecord::getAdditionalNotationsField(void) { - allowNotesOnly("getAdditionalNotationsField"); - return extract(32, 43); +string MuseRecord::getStringProlongation(void) { + switch (getProlongation()) { + case 0: return ""; break; + case 1: return "."; break; + case 2: return ".."; break; + case 3: return "..."; break; + case 4: return "...."; break; + default: + cerr << "Error: unknown number of prolongation dots (column 18): " + << getLine() << endl; + return ""; + } + return ""; } ////////////////////////////// // -// MuseRecord::additionalNotationsQ -- +// MuseRecord::prolongationQ -- // -int MuseRecord::additionalNotationsQ(void) { - int output = 0; - if (getLength() < 32) { - output = 0; - } else { - for (int i=32; i<=43; i++) { - if (getColumn(i) != ' ') { - output = 1; - break; - } - } - } - return output; +int MuseRecord::prolongationQ(void) { + return getProlongation(); } - ////////////////////////////// // -// MuseRecord::getAddCount -- returns the number of items -// in the additional notations field +// MuseRecord::getNotatedAccidentalField -- actual notated accidental is +// stored in column 19. // -int MuseRecord::getAddCount(void) { - string addString = getAdditionalNotationsField(); - string addElement; // element from the notation field - - int count = 0; - int index = 0; - while (getAddElementIndex(index, addElement, addString)) { - count++; +string MuseRecord::getNotatedAccidentalField(void) { + allowNotesOnly("getNotatedAccidentalField"); + if (getLength() < 19) { + return " "; + } else { + string temp; + temp += getColumn(19); + return temp; } - - return count; } ////////////////////////////// // -// MuseRecord::getAddItem -- returns the specified item -// in the additional notations field +// MuseRecord::getNotatedAccidentalString -- // -string MuseRecord::getAddItem(int elementIndex) { - string output; - int count = 0; - int index = 0; - string addString = getAdditionalNotationsField(); - - while (count <= elementIndex) { - getAddElementIndex(index, output, addString); - count++; +string MuseRecord::getNotatedAccidentalString(void) { + string output = getNotatedAccidentalField(); + if (output[0] == ' ') { + output = ""; } - return output; } @@ -41537,35 +43155,26 @@ string MuseRecord::getAddItem(int elementIndex) { ////////////////////////////// // -// MuseRecord::getAddItemLevel -- returns the specified item's -// editorial level in the additional notations field +// MuseRecord::getNotatedAccidental -- // -int MuseRecord::getAddItemLevel(int elementIndex) { - int count = 0; - int index = 0; - string number; - string addString = getAdditionalNotationsField(); - string elementString; // element field - - while (count < elementIndex) { - getAddElementIndex(index, elementString, addString); - count++; - } - - int output = -1; -repeating: - while (addString[index] != '&' && index >= 0) { - index--; - } - if (addString[index] == '&' && !isalnum(addString[index+1])) { - index--; - goto repeating; - } else if (addString[index] == '&') { - number = addString[index+1]; - output = (int)strtol(number.c_str(), NULL, 36); +int MuseRecord::getNotatedAccidental(void) { + int output = 0; + string recordInfo = getNotatedAccidentalField(); + switch (recordInfo[0]) { + case ' ': output = 0; break; + case '#': output = 1; break; + case 'n': output = 0; break; + case 'f': output = -1; break; + case 'x': output = 2; break; + case 'X': output = 2; break; + case '&': output = -2; break; + case 'S': output = 1; break; + case 'F': output = -1; break; + default: + cerr << "Error: unknown accidental: " << recordInfo[0] << endl; + return 0; } - return output; } @@ -41573,174 +43182,142 @@ int MuseRecord::getAddItemLevel(int elementIndex) { ////////////////////////////// // -// MuseRecord::getEditorialLevels -- returns a string containing the -// edit levels given in the additional notation fields +// MuseRecord::notatedAccidentalQ -- // -string MuseRecord::getEditorialLevels(void) { - string output; - string addString = getAdditionalNotationsField(); - for (int index = 0; index < 12-1; index++) { - if (addString[index] == '&' && isalnum(addString[index+1])) { - output += addString[index+1]; - } +int MuseRecord::notatedAccidentalQ(void) { + int output; + string recordInfo = getNotatedAccidentalField(); + if (recordInfo[0] == ' ') { + output = 0; + } else { + output = 1; } return output; } -////////////////////////////// +/////////////////////////////// // -// MuseRecord::addEditorialLevelQ -- returns true if there are any editorial -// levels present in the additional notations fields +// MuseRecord::getTimeModificationField -- return columns 20 -- 22. // -int MuseRecord::addEditorialLevelQ(void) { - string addString = getAdditionalNotationsField(); - int output = 0; - for (int i=0; i<12-1; i++) { // minus one for width 2 (&0) - if (addString[i] == '&' && isalnum(addString[i+1])) { - output = 1; - } +string MuseRecord::getTimeModificationField(void) { +// allowNotesOnly("getTimeModificationField"); ---> rests also + if (getLength() < 20) { + return " "; + } else { + return extract(20, 22); } - return output; } ////////////////////////////// // -// MuseRecord::findField -- returns true when it finds the first -// instance of the key in the additional fields record. +// MuseRecord::getTimeModificationString -- // -int MuseRecord::findField(const string& key) { - int len = (int)key.size(); - string notations = getAdditionalNotationsField(); - int output = 0; - for (int i=0; i<12-len; i++) { - if (notations[i] == key[0]) { - output = 1; - for (int j=0; j stop) { - return -1; - } - - if (maxcol < stop) { - stop = maxcol; - } - - int i; - for (i=start; i<=stop; i++) { - if (m_recordString[i-1] == key) { - return i; // return the column which is offset from 1 +HumNum MuseRecord::getTimeModification(void) { + string output = getTimeModificationField(); + HumRegex hre; + if (hre.search(output, "([1-9A-Z]):([1-9A-Z])")) { + string top = hre.getMatch(1); + string bot = hre.getMatch(2); + int topint = (int)strtol(top.c_str(), NULL, 36); + int botint = (int)strtol(top.c_str(), NULL, 36); + HumNum number(topint, botint); + return number; + } else { + if (hre.search(output, "^([1-9A-Z])")) { + string value = hre.getMatch(1); + int top = (int)strtol(value.c_str(), NULL, 36); + // Time modification can be "3 " for triplets. + HumNum out(top, 2); + return out; + } else { + return 1; } } - - return -1; } ////////////////////////////// // -// MuseRecord::getSlurParameterRegion -- +// MuseRecord::getTimeModificationLeftField -- return column 20 // -string MuseRecord::getSlurParameterRegion(void) { - return getColumns(31, 43); +string MuseRecord::getTimeModificationLeftField(void) { + string output = getTimeModificationField(); + HumRegex hre; + if (!hre.search(output, "^[1-9A-Z]:[1-9A-Z]$")) { + return " "; + } + return output.substr(0, 1); } ////////////////////////////// // -// MuseRecord::getSlurStartColumn -- search column 32 to 43 for a slur -// marker. Returns the first one found from left to right. -// returns -1 if a slur character was not found. +// MuseRecord::getTimeModificationLeftString -- // -int MuseRecord::getSlurStartColumn(void) { - int start = 31; - int stop = getLength() - 1; - if (stop >= 43) { - stop = 42; - } - int i; - for (i=start; i<=stop; i++) { - switch (m_recordString[i]) { - case '(': // slur level 1 - case '[': // slur level 2 - case '{': // slur level 3 - case 'z': // slur level 4 - return i+1; // column is offset from 1 - } +string MuseRecord::getTimeModificationLeftString(void) { + string output = getTimeModificationField(); + HumRegex hre; + if (!hre.search(output, "^[1-9A-Z]:[1-9A-Z]$")) { + return ""; } - - return -1; + return output.substr(0, 1); } ////////////////////////////// // -// MuseRecord::getTextUnderlayField -- returns the contents -// of columns 44-80. +// MuseRecord::getTimeModificationLeft -- // -string MuseRecord::getTextUnderlayField(void) { - allowNotesOnly("getTextUnderlayField"); - return extract(44, 80); +int MuseRecord::getTimeModificationLeft(void) { + int output = 0; + string recordInfo = getTimeModificationLeftString(); + if (recordInfo.empty()) { + return 1; + } else { + output = (int)strtol(recordInfo.c_str(), NULL, 36); + } + return output; } ////////////////////////////// // -// MuseRecord::textUnderlayQ -- +// MuseRecord::getTimeModificationRightField -- return column 20 // -int MuseRecord::textUnderlayQ(void) { - int output = 0; - if (getLength() < 44) { - output = 0; - } else { - for (int i=44; i<=80; i++) { - if (getColumn(i) != ' ') { - output = 1; - break; - } - } - } +string MuseRecord::getTimeModificationRightField(void) { + string output = getTimeModificationField(); + output = output[2]; return output; } @@ -41748,249 +43325,161 @@ int MuseRecord::textUnderlayQ(void) { ////////////////////////////// // -// MuseRecord::getVerseCount -- +// MuseRecord::getTimeModificationRight -- // -int MuseRecord::getVerseCount(void) { - if (!textUnderlayQ()) { - return 0; - } - - int count = 1; - for (int i=44; i<=getLength() && i <= 80; i++) { - if (getColumn(i) == '|') { - count++; - } +string MuseRecord::getTimeModificationRightString(void) { + HumRegex hre; + string output = getTimeModificationField(); + if (!hre.search(output, "^[1-9A-Z]:[1-9A-Z]$")) { + return " "; } - - return count; + return output.substr(2, 1); } ////////////////////////////// // -// MuseRecord::getVerse -- +// MuseRecord::getTimeModificationRight -- // -string MuseRecord::getVerse(int index) { - string output; - if (!textUnderlayQ()) { - return output; - } - int verseCount = getVerseCount(); - if (index >= verseCount) { - return output; - } - - int tindex = 44; - int c = 0; - while (c < index && tindex < 80) { - if (getColumn(tindex) == '|') { - c++; - } - tindex++; +int MuseRecord::getTimeModificationRight(void) { + string recordInfo = getTimeModificationRightString(); + HumRegex hre; + if (recordInfo.empty()) { + return 1; + } else if (!hre.search(recordInfo, "^[1-9A-Z]$")) { + return 1; + } else { + return (int)strtol(recordInfo.c_str(), NULL, 36); } +} - while (tindex <= 80 && getColumn(tindex) != '|') { - output += getColumn(tindex++); - } - // remove trailing spaces - int zindex = (int)output.size() - 1; - while (output[zindex] == ' ') { - zindex--; - } - zindex++; - output.resize(zindex); - // remove leading spaces - int spacecount = 0; - while (output[spacecount] == ' ') { - spacecount++; - } +////////////////////////////// +// +// MuseRecord::timeModificationQ -- +// - // problem here? - for (int rr = 0; rr <= zindex-spacecount; rr++) { - output[rr] = output[rr+spacecount]; +bool MuseRecord::timeModificationQ(void) { + string recordInfo = getTimeModificationField(); + HumRegex hre; + if (hre.search(recordInfo, "^[1-9A-Z]:[1-9A-Z]$")) { + return true; + } else { + return false; } - - return output; } ////////////////////////////// // -// MuseRecord::getVerseUtf8 -- +// MuseRecord::timeModificationLeftQ -- // -string MuseRecord::getVerseUtf8(int index) { - string tverse = getVerse(index); - return MuseRecord::musedataToUtf8(tverse); +bool MuseRecord::timeModificationLeftQ(void) { + string recordInfo = getTimeModificationField(); + HumRegex hre; + string value; + value.push_back(recordInfo.at(0)); + if (hre.search(value, "^[1-9A-Z]$")) { + return true; + } else { + return false; + } } ////////////////////////////// // -// MuseRecord::getKernNoteStyle -- -// default values: beams = 0, stems = 0 +// MuseRecord::timeModificationRightQ -- // -string MuseRecord::getKernNoteStyle(int beams, int stems) { - string output; - - if (!isAnyNote()) { - // not a note, so return nothing - return ""; +bool MuseRecord::timeModificationRightQ(void) { + string recordInfo = getTimeModificationField(); + HumRegex hre; + string value; + value.push_back(recordInfo.at(0)); + if (hre.search(value, "^[1-9A-Z]$")) { + return true; + } else { + return false; } +} - // place the rhythm - stringstream tempdur; - int notetype = getGraphicNoteType(); - if (timeModificationLeftQ()) { - notetype = notetype / 4 * getTimeModificationLeft(); - if (timeModificationRightQ()) { - notetype = notetype * getTimeModificationRight(); - } else { - notetype = notetype * 2; - } - } - // logical duration of the note - HumNum logicalduration = getTicks(); - logicalduration /= getTpq(); - string durrecip = Convert::durationToRecip(logicalduration); - // graphical duration of the note - string graphicrecip = getGraphicRecip(); - HumNum graphicdur = Convert::recipToDuration(graphicrecip); +////////////////////////////// +// +// MuseRecord::getStemDirectionField -- +// - string displayrecip; +string MuseRecord::getStemDirectionField(void) { + allowNotesOnly("getStemDirectionField"); + if (getLength() < 23) { + return " "; + } else { + string temp; + temp += getColumn(23); + return temp; + } +} - if (graphicdur != logicalduration) { - // switch to the logical duration and store the graphic - // duration. The logical duration will be used on the - // main kern token, and the graphic duration will be stored - // as a layout parameter, such as !LO:N:vis=4. to display - // the note as a dotted quarter regardless of the logical - // duration. - // Current test file has encoding bug related to triplets, so - // disable graphic notation dealing with tuplets for now. - // for now just looking to see if one has a dot and the other does not - if ((durrecip.find(".") != string::npos) && - (graphicrecip.find(".") == string::npos)) { - m_graphicrecip = graphicrecip; - displayrecip = durrecip; - } else if ((durrecip.find(".") == string::npos) && - (graphicrecip.find(".") != string::npos)) { - m_graphicrecip = graphicrecip; - displayrecip = durrecip; - } - } +////////////////////////////// +// +// MuseRecord::getStemDirectionString -- +// - if (displayrecip.size() > 0) { - output = displayrecip; - } else { - tempdur << notetype; - output = tempdur.str(); - // add any dots of prolongation to the output string - output += getStringProlongation(); +string MuseRecord::getStemDirectionString(void) { + string output = getStemDirectionField(); + if (output[0] == ' ') { + output = ""; } + return output; +} - // add the pitch to the output string - string musepitch = getPitchString(); - string kernpitch = Convert::musePitchToKernPitch(musepitch); - output += kernpitch; - - string logicalAccidental = getAccidentalString(); - string notatedAccidental = getNotatedAccidentalString(); - if (notatedAccidental.empty() && !logicalAccidental.empty()) { - // Indicate that the logical accidental should not be - // displayed (because of key signature or previous - // note in the measure that alters the accidental - // state of the current note). - output += "y"; - } else if ((logicalAccidental == notatedAccidental) && !notatedAccidental.empty()) { - // Indicate that the accidental should be displayed - // and is not suppressed by the key signature or a - // previous note in the measure. - output += "X"; - } - // There can be cases where the logical accidental - // is natural but the notated accidetnal is sharp (but - // the notated accidental means play a natural accidetnal). - // Deal with this later. - // if there is a notated natural sign, then add it now: - string temp = getNotatedAccidentalField(); - if (temp == "n") { - output += "n"; - } +////////////////////////////// +// +// MuseRecord::getStemDirection -- +// - // check if a grace note - if (getType() == 'g') { - output += "Q"; +int MuseRecord::getStemDirection(void) { + int output = 0; + string recordInfo = getStemDirectionField(); + switch (recordInfo[0]) { + case 'u': output = 1; break; + case 'd': output = -1; break; + case ' ': output = 0; break; + default: + cerr << "Error: unknown stem direction: " << recordInfo[0] << endl; + return 0; } + return output; +} - // if stems is true, then show stem directions - if (stems && stemDirectionQ()) { - switch (getStemDirection()) { - case 1: // 'u' = up - output += "/"; - break; - case -1: // 'd' = down - output += "\\"; - default: - ; // nothing // ' ' = no stem (if stage 2) - } - } - // if beams is true, then show any beams - if (beams && beamQ()) { - temp = getKernBeamStyle(); - output += temp; - } - if (isTied()) { - string tiestarts; - string tieends; - int lasttie = getLastTiedNoteLineIndex(); - int nexttie = getNextTiedNoteLineIndex(); - int state = 0; - if (lasttie >= 0) { - state |= 2; - } - if (nexttie >= 0) { - state |= 1; - } - switch (state) { - case 1: - tiestarts += "["; - break; - case 2: - tieends += "]"; - break; - case 3: - tieends += "_"; - break; - } - if (state) { - output = tiestarts + output + tieends; - } - } +////////////////////////////// +// +// MuseRecord::stemDirectionQ -- +// - string slurstarts; - string slurends; - getSlurInfo(slurstarts, slurends); - if ((!slurstarts.empty()) || (!slurends.empty())) { - output = slurstarts + output + slurends; +int MuseRecord::stemDirectionQ(void) { + int output = 0; + string recordInfo = getStemDirectionField(); + if (recordInfo[0] == ' ') { + output = 0; + } else { + output = 1; } - return output; } @@ -41998,33 +43487,17 @@ string MuseRecord::getKernNoteStyle(int beams, int stems) { ////////////////////////////// // -// MuseRecord::getSlurInfo -- -// -// ( ) = regular slur -// [ ] = second levels slur, convert to &( and &) -// { } = third level slur, convert to &&( and &&) -// Z = fourth level slur (how to close?) +// MuseRecord::getStaffField -- returns column 24. // -void MuseRecord::getSlurInfo(string& slurstarts, string& slurends) { - slurstarts.clear(); - slurends.clear(); - - string data = getSlurParameterRegion(); - for (int i=0; i<(int)data.size(); i++) { - if (data[i] == '(') { - slurstarts += '('; - } else if (data[i] == ')') { - slurends += ')'; - } else if (data[i] == '[') { - slurstarts += "&{"; - } else if (data[i] == ']') { - slurends += "&)"; - } else if (data[i] == '{') { - slurstarts += "&&("; - } else if (data[i] == '}') { - slurends += "&&)"; - } +string MuseRecord::getStaffField(void) { + allowNotesOnly("getStaffField"); + if (getLength() < 24) { + return " "; + } else { + string temp; + temp += getColumn(24); + return temp; } } @@ -42032,39 +43505,14 @@ void MuseRecord::getSlurInfo(string& slurstarts, string& slurends) { ////////////////////////////// // -// MuseRecord::getKernNoteAccents -- +// MuseRecord::getStaffString -- // -string MuseRecord::getKernNoteAccents(void) { - string output; - int addnotecount = getAddCount(); - for (int i=0; i': output += "^"; break; // horizontal accent - case '.': output += "'"; break; // staccato - case '_': output += "~"; break; // tenuto - case '=': output += "~'"; break; // detached legato - case 'i': output += "s"; break; // spiccato - case '\'': output += ","; break; // breath mark - case 'F': output += ";"; break; // fermata up - case 'E': output += ";"; break; // fermata down - case 'S': output += ":"; break; // staccato - case 't': output += "O"; break; // trill (to generic) - case 'r': output += "S"; break; // turn - case 'k': output += "O"; break; // delayed turn (to generic) - case 'w': output += "O"; break; // shake (to generic) - case 'M': output += "O"; break; // mordent (to generic) - case 'j': output += "H"; break; // glissando (slide) - } +string MuseRecord::getStaffString(void) { + string output = getStaffField(); + if (output[0] == ' ') { + output = ""; } - return output; } @@ -42072,174 +43520,190 @@ string MuseRecord::getKernNoteAccents(void) { ////////////////////////////// // -// MuseRecord::getKernRestStyle -- +// MuseRecord::getStaff -- // -string MuseRecord::getKernRestStyle(void) { +int MuseRecord::getStaff(void) { + int output = 1; + string recordInfo = getStaffField(); + if (recordInfo[0] == ' ') { + output = 1; + } else { + output = (int)strtol(recordInfo.c_str(), NULL, 36); + } + return output; +} - string output; - string rhythmstring; - // place the rhythm - stringstream tempdur; - if (!isAnyRest()) { - // not a rest, so return nothing - return ""; +////////////////////////////// +// +// MuseRecord::staffQ -- +// + +int MuseRecord::staffQ(void) { + int output = 0; + string recordInfo = getStaffField(); + if (recordInfo[0] == ' ') { + output = 0; + } else { + output = 1; } + return output; +} - // logical duration of the note - HumNum logicalduration = getTicks(); - logicalduration /= getTpq(); - string durrecip = Convert::durationToRecip(logicalduration); - /* - int notetype; - if (graphicNoteTypeQ()) { - notetype = getGraphicNoteType(); - if (timeModificationLeftQ()) { - notetype = notetype / 4 * getTimeModificationLeft(); - } - if (timeModificationRightQ()) { - notetype = notetype * getTimeModificationRight() / 2; - } - tempdur << notetype; - output = tempdur.str(); +////////////////////////////// +// +// MuseRecord::getBeamField -- +// - // add any dots of prolongation to the output string - output += getStringProlongation(); - } else { // stage 1 data: - HumNum dnotetype(getTickDuration(), quarter); - rhythmstring = Convert::durationToRecip(dnotetype); - output += rhythmstring; +string MuseRecord::getBeamField(void) { + allowNotesOnly("getBeamField"); + if (getLength() < 26) { + return " "; + } else { + return extract(26, 31); } - */ +} - output = durrecip; - // add the pitch to the output string - output += "r"; - if (isInvisibleRest()) { - output += "yy"; - } +////////////////////////////// +// +// MuseRecord::setBeamInfo -- +// + +void MuseRecord::setBeamInfo(string& strang) { + setColumns(strang, 26, 31); +} + + +////////////////////////////// +// +// MuseRecord::beamQ -- +// + +int MuseRecord::beamQ(void) { + int output = 0; + allowNotesOnly("beamQ"); + if (getLength() < 26) { + output = 0; + } else { + for (int i=26; i<=31; i++) { + if (getColumn(i) != ' ') { + output = 1; + break; + } + } + } return output; } -////////////////////////////////////////////////////////////////////////// +////////////////////////////// // -// functions that work with measure records +// MuseRecord::getBeam8 -- column 26 // +char MuseRecord::getBeam8(void) { + allowNotesOnly("getBeam8"); + return getColumn(26); +} + + ////////////////////////////// // -// MuseRecord::getMeasureNumberField -- columns 9-12 +// MuseRecord::getBeam16 -- column 27 // -string MuseRecord::getMeasureNumberField(void) { - allowMeasuresOnly("getMeasureNumberField"); - return extract(9, 12); +char MuseRecord::getBeam16(void) { + allowNotesOnly("getBeam16"); + return getColumn(27); } ////////////////////////////// // -// MuseRecord::getMeasureTypeField -- columns 1 -- 7 +// MuseRecord::getBeam32 -- column 28 // -string MuseRecord::getMeasureTypeField(void) { - allowMeasuresOnly("getMeasureTypeField"); - return extract(1, 7); +char MuseRecord::getBeam32(void) { + allowNotesOnly("getBeam32"); + return getColumn(28); } ////////////////////////////// // -// MuseRecord::getMeasureNumberString -- +// MuseRecord::getBeam64 -- column 29 // -string MuseRecord::getMeasureNumberString(void) { - string output = getMeasureNumberField(); - for (int i=3; i>=0; i--) { - if (output[i] == ' ') { - output.resize(i); - } - } - return output; +char MuseRecord::getBeam64(void) { + allowNotesOnly("getBeam64"); + return getColumn(29); } ////////////////////////////// // -// MuseRecord::getMeasureNumber -- +// MuseRecord::getBeam128 -- column 30 // -int MuseRecord::getMeasureNumber(void) { - string measureInfo = getMeasureNumberField(); - if (measureInfo.empty()) { - return 0; - } - return std::stoi(measureInfo); +char MuseRecord::getBeam128(void) { + allowNotesOnly("getBeam128"); + return getColumn(30); } ////////////////////////////// // -// MuseRecord::measureNumberQ -- +// MuseRecord::getBeam256 -- column 31 // -int MuseRecord::measureNumberQ(void) { - string temp = getMeasureNumberString(); - int i = 0; - int output = 0; - while (temp[i] != '\0') { - if (temp[i] != ' ') { - output = 1; - break; - } - } - return output; +char MuseRecord::getBeam256(void) { + allowNotesOnly("getBeam256"); + return getColumn(31); } ////////////////////////////// // -// MuseRecord::getMeasureFlagsString -- Columns 17 to 80. +// MuseRecord::beam8Q -- // -string MuseRecord::getMeasureFlagsString(void) { - if (m_recordString.size() < 17) { - return ""; +int MuseRecord::beam8Q(void) { + int output = 0; + if (getBeam8() == ' ') { + output = 0; } else { - return trimSpaces(m_recordString.substr(16)); + output = 1; } + return output; } ////////////////////////////// // -// MuseRecord::measureFermataQ -- returns true if there is a -// fermata above or below the measure +// MuseRecord::beam16Q -- // -int MuseRecord::measureFermataQ(void) { +int MuseRecord::beam16Q(void) { int output = 0; - for (int i=17; i<=80 && i<= getLength(); i++) { - if (getColumn(i) == 'F' || getColumn(i) == 'E') { - output = 1; - break; - } + if (getBeam16() == ' ') { + output = 0; + } else { + output = 1; } return output; } @@ -42248,28 +43712,15 @@ int MuseRecord::measureFermataQ(void) { ////////////////////////////// // -// MuseRecord::measureFlagQ -- Returns true if there are non-space -// characters in columns 17 through 80. A more smarter way of -// doing this is checking the allocated length of the record, and -// do not search non-allocated columns for non-space characters... +// MuseRecord::beam32Q -- // -int MuseRecord::measureFlagQ(const string& key) { +int MuseRecord::beam32Q(void) { int output = 0; - int len = (int)key.size(); - for (int i=17; i<=80-len && i& amap) { - amap.clear(); - // Should be "3" on the next line, but "1" or "2" might catch poorly formatted data. - string contents = getLine().substr(2); - if (contents.empty()) { - return; - } - int i = 0; - string key; - string value; - int state = 0; // 0 outside, 1 = in key, 2 = in value - while (i < (int)contents.size()) { - switch (state) { - case 0: // outside of key or value - if (!isspace(contents[i])) { - if (contents[i] == ':') { - // Strange: should not happen - key.clear(); - state = 2; - } else { - state = 1; - key += contents[i]; - } - } - break; - case 1: // in key - if (!isspace(contents[i])) { - if (contents[i] == ':') { - value.clear(); - state = 2; - } else { - // Add to key, such as "C2" for second staff clef. - key += contents[i]; - } - } - break; - case 2: // in value - if (key == "D") { - value += contents[i]; - } else if (isspace(contents[i])) { - // store parameter and clear variables - amap[key] = value; - state = 0; - key.clear(); - value.clear(); - } else { - value += contents[i]; - } +int MuseRecord::additionalNotationsQ(void) { + int output = 0; + if (getLength() < 32) { + output = 0; + } else { + for (int i=32; i<=43; i++) { + if (getColumn(i) != ' ') { + output = 1; break; + } } - i++; } + return output; +} - if ((!key.empty()) && (!value.empty())) { - amap[key] = value; + + +////////////////////////////// +// +// MuseRecord::getAddCount -- returns the number of items +// in the additional notations field +// + +int MuseRecord::getAddCount(void) { + string addString = getAdditionalNotationsField(); + string addElement; // element from the notation field + + int count = 0; + int index = 0; + while (getAddElementIndex(index, addElement, addString)) { + count++; } + + return count; } ////////////////////////////// // -// MuseRecord::getAttributes -- +// MuseRecord::getAddItem -- returns the specified item +// in the additional notations field // -string MuseRecord::getAttributes(void) { +string MuseRecord::getAddItem(int elementIndex) { string output; - switch (getType()) { - case E_muserec_musical_attributes: - break; - default: - cerr << "Error: cannot use getAttributes function on line: " - << getLine() << endl; - return ""; - } + int count = 0; + int index = 0; + string addString = getAdditionalNotationsField(); - int ending = 0; - int tempcol; - for (int column=4; column <= getLength(); column++) { - if (getColumn(column) == ':') { - tempcol = column - 1; - while (tempcol > 0 && getColumn(tempcol) != ' ') { - tempcol--; - } - tempcol++; - while (tempcol <= column) { - output += getColumn(tempcol); - if (output.back() == 'D') { - ending = 1; - } - tempcol++; - } - } - if (ending) { - break; - } + while (count <= elementIndex) { + getAddElementIndex(index, output, addString); + count++; } + return output; } @@ -42471,38 +43858,52 @@ string MuseRecord::getAttributes(void) { ////////////////////////////// // -// MuseRecord::attributeQ -- +// MuseRecord::getAddItemLevel -- returns the specified item's +// editorial level in the additional notations field // -int MuseRecord::attributeQ(const string& attribute) { - switch (getType()) { - case E_muserec_musical_attributes: - break; - default: - cerr << "Error: cannot use getAttributes function on line: " - << getLine() << endl; - return 0; +int MuseRecord::getAddItemLevel(int elementIndex) { + int count = 0; + int index = 0; + string number; + string addString = getAdditionalNotationsField(); + string elementString; // element field + + while (count < elementIndex) { + getAddElementIndex(index, elementString, addString); + count++; + } + + int output = -1; +repeating: + while (addString[index] != '&' && index >= 0) { + index--; + } + if (addString[index] == '&' && !isalnum(addString[index+1])) { + index--; + goto repeating; + } else if (addString[index] == '&') { + number = addString[index+1]; + output = (int)strtol(number.c_str(), NULL, 36); } + return output; +} - string attributelist = getAttributes(); - int output = 0; - int attstrlength = (int)attributelist.size(); - int attlength = (int)attribute.size(); - for (int i=0; i 0 && getColumn(tempcol) != ' ') { - tempcol--; - } - tempcol++; - while (tempcol <= column) { - if (getColumn(tempcol) == attribute) { - ending = 2; - } else if (getColumn(tempcol) == 'D') { - ending = 1; + + +////////////////////////////// +// +// MuseRecord::findField -- returns true when it finds the first +// instance of the key in the additional fields record. +// + +int MuseRecord::findField(const string& key) { + int len = (int)key.size(); + string notations = getAdditionalNotationsField(); + int output = 0; + for (int i=0; i<12-len; i++) { + if (notations[i] == key[0]) { + output = 1; + for (int j=0; j stop) { + return -1; } - int returnValue = 0; - int ending = 0; - // int index = 0; - int tempcol; - int column; - for (column=4; column <= getLength(); column++) { - if (getColumn(column) == ':') { - tempcol = column - 1; - while (tempcol > 0 && getColumn(tempcol) != ' ') { - tempcol--; - } - tempcol++; - while (tempcol <= column) { - if (getColumn(tempcol) == key[0]) { - ending = 2; - } else if (getColumn(tempcol) == 'D') { - ending = 1; - } - tempcol++; - // index++; - } - } - if (ending) { - break; - } + if (maxcol < stop) { + stop = maxcol; } - value.clear(); - if (ending == 0 || ending == 1) { - return returnValue; - } else { - returnValue = 1; - column++; - while (getColumn(column) != ' ') { - value += getColumn(column++); + int i; + for (i=start; i<=stop; i++) { + if (m_recordString[i-1] == key) { + return i; // return the column which is offset from 1 } - return returnValue; } + + return -1; } -/////////////////////////////////////////////////////////////////////////// +////////////////////////////// // -// functions that work with basso continuo figuration records (f): +// MuseRecord::getSlurParameterRegion -- // +string MuseRecord::getSlurParameterRegion(void) { + return getColumns(31, 43); +} + + ////////////////////////////// // -// MuseRecord::getFigureCountField -- column 2. +// MuseRecord::getSlurStartColumn -- search column 32 to 43 for a slur +// marker. Returns the first one found from left to right. +// returns -1 if a slur character was not found. // -string MuseRecord::getFigureCountField(void) { - allowFigurationOnly("getFigureCountField"); - return extract(2, 2); +int MuseRecord::getSlurStartColumn(void) { + int start = 31; + int stop = getLength() - 1; + if (stop >= 43) { + stop = 42; + } + int i; + for (i=start; i<=stop; i++) { + switch (m_recordString[i]) { + case '(': // slur level 1 + case '[': // slur level 2 + case '{': // slur level 3 + case 'z': // slur level 4 + return i+1; // column is offset from 1 + } + } + + return -1; } ////////////////////////////// // -// MuseRecord::getFigurationCountString -- +// MuseRecord::getTextUnderlayField -- returns the contents +// of columns 44-80. // -string MuseRecord::getFigureCountString(void) { - allowFigurationOnly("getFigureCount"); - string output = extract(2, 2); - if (output[0] == ' ') { - output = ""; - } - return output; +string MuseRecord::getTextUnderlayField(void) { + allowNotesOnly("getTextUnderlayField"); + return extract(44, 80); } ////////////////////////////// // -// MuseRecord::getFigurationCount -- +// MuseRecord::textUnderlayQ -- // -int MuseRecord::getFigureCount(void) { - allowFigurationOnly("getFigureCount"); - string temp = getFigureCountString(); - int output = (int)strtol(temp.c_str(), NULL, 36); +int MuseRecord::textUnderlayQ(void) { + int output = 0; + if (getLength() < 44) { + output = 0; + } else { + for (int i=44; i<=80; i++) { + if (getColumn(i) != ' ') { + output = 1; + break; + } + } + } return output; } @@ -42674,29 +44069,73 @@ int MuseRecord::getFigureCount(void) { ////////////////////////////// // -// getFigurePointerField -- columns 6 -- 8. +// MuseRecord::getVerseCount -- // -string MuseRecord::getFigurePointerField(void) { - allowFigurationOnly("getFigurePointerField"); - return extract(6, 8); +int MuseRecord::getVerseCount(void) { + if (!textUnderlayQ()) { + return 0; + } + + int count = 1; + for (int i=44; i<=getLength() && i <= 80; i++) { + if (getColumn(i) == '|') { + count++; + } + } + + return count; } + ////////////////////////////// // -// figurePointerQ -- +// MuseRecord::getVerse -- // -int MuseRecord::figurePointerQ(void) { - allowFigurationOnly("figurePointerQ"); - int output = 0; - for (int i=6; i<=8; i++) { - if (getColumn(i) != ' ') { - output = 1; - break; +string MuseRecord::getVerse(int index) { + string output; + if (!textUnderlayQ()) { + return output; + } + int verseCount = getVerseCount(); + if (index >= verseCount) { + return output; + } + + int tindex = 44; + int c = 0; + while (c < index && tindex < 80) { + if (getColumn(tindex) == '|') { + c++; } + tindex++; + } + + while (tindex <= 80 && getColumn(tindex) != '|') { + output += getColumn(tindex++); + } + + // remove trailing spaces + int zindex = (int)output.size() - 1; + while (output[zindex] == ' ') { + zindex--; + } + zindex++; + output.resize(zindex); + + // remove leading spaces + int spacecount = 0; + while (output[spacecount] == ' ') { + spacecount++; + } + + // problem here? + for (int rr = 0; rr <= zindex-spacecount; rr++) { + output[rr] = output[rr+spacecount]; } + return output; } @@ -42704,79 +44143,97 @@ int MuseRecord::figurePointerQ(void) { ////////////////////////////// // -// MuseRecord::getFigureString -- +// MuseRecord::getVerseUtf8 -- // -string MuseRecord::getFigureString(void) { - string output = getFigureFields(); - for (int i=(int)output.size()-1; i>= 0; i--) { - if (isspace(output[i])) { - output.resize((int)output.size() - 1); - } else { - break; +string MuseRecord::getVerseUtf8(int index) { + string tverse = getVerse(index); + return MuseRecord::musedataToUtf8(tverse); +} + + + +////////////////////////////// +// +// MuseRecord::getSlurInfo -- +// +// ( ) = regular slur +// [ ] = second levels slur, convert to &( and &) +// { } = third level slur, convert to &&( and &&) +// Z = fourth level slur (how to close?) +// + +void MuseRecord::getSlurInfo(string& slurstarts, string& slurends) { + slurstarts.clear(); + slurends.clear(); + + string data = getSlurParameterRegion(); + for (int i=0; i<(int)data.size(); i++) { + if (data[i] == '(') { + slurstarts += '('; + } else if (data[i] == ')') { + slurends += ')'; + } else if (data[i] == '[') { + slurstarts += "&{"; + } else if (data[i] == ']') { + slurends += "&)"; + } else if (data[i] == '{') { + slurstarts += "&&("; + } else if (data[i] == '}') { + slurends += "&&)"; } } - return output; } + ////////////////////////////// // -// MuseRecord::getFigureFields -- columns 17 -- 80 +// MuseRecord::MuseRecord -- // -string MuseRecord::getFigureFields(void) { - allowFigurationOnly("getFigureFields"); - return extract(17, 80); -} +MuseRecord::MuseRecord(void) : MuseRecordBasic() { } +MuseRecord::MuseRecord(const string& aLine) : MuseRecordBasic(aLine) { } +MuseRecord::MuseRecord(MuseRecord& aRecord) : MuseRecordBasic(aRecord) { } + ////////////////////////////// // -// MuseRecord::figureFieldsQ -- +// MuseRecord::~MuseRecord -- // -int MuseRecord::figureFieldsQ(void) { - allowFigurationOnly("figureFieldsQ"); - int output = 0; - if (getLength() < 17) { - output = 0; - } else { - for (int i=17; i<=80; i++) { - if (getColumn(i) != ' ') { - output = 1; - break; - } - } - } - return output; +MuseRecord::~MuseRecord() { + // do nothing } ////////////////////////////// // -// getFigure -- +// MuseRecord::operator= -- // -string MuseRecord::getFigure(int index) { - string output; - allowFigurationOnly("getFigure"); - if (index >= getFigureCount()) { - return output; - } - string temp = getFigureString(); - if (index == 0) { - return temp; - } - HumRegex hre; - vector pieces; - hre.split(pieces, temp, " +"); - if (index < (int)pieces.size()) { - output = pieces[index]; +MuseRecord& MuseRecord::operator=(MuseRecord& aRecord) { + // don't copy onto self + if (&aRecord == this) { + return *this; } - return output; + + setLine(aRecord.getLine()); + setType(aRecord.getType()); + m_lineindex = aRecord.m_lineindex; + + m_qstamp = aRecord.m_qstamp; + m_lineduration = aRecord.m_lineduration; + m_noteduration = aRecord.m_noteduration; + + m_b40pitch = aRecord.m_b40pitch; + m_nexttiednote = aRecord.m_nexttiednote; + m_lasttiednote = aRecord.m_lasttiednote; + + return *this; } @@ -43461,6 +44918,437 @@ void MuseRecord::getAllPrintSuggestions(vector& suggestions) { +////////////////////////////// +// +// MuseRecordBasic::isPartName -- +// + +bool MuseRecordBasic::isPartName(void) { + return m_type == E_muserec_header_part_name; +} + + + +////////////////////////////// +// +// MuseRecordBasic::isAttributes -- +// + +bool MuseRecordBasic::isAttributes(void) { + return m_type == E_muserec_musical_attributes; +} + + + +////////////////////////////// +// +// MuseRecordBasic::isSource -- +// + +bool MuseRecordBasic::isSource(void) { + return m_type == E_muserec_source; +} + + + +////////////////////////////// +// +// MuseRecordBasic::isEncoder -- +// + +bool MuseRecordBasic::isEncoder(void) { + return m_type == E_muserec_encoder; +} + + + +////////////////////////////// +// +// MuseRecordBasic::isId -- +// + +bool MuseRecordBasic::isId(void) { + return m_type == E_muserec_id; +} + + + +////////////////////////////// +// +// MuseRecordBasic::isBarline -- +// + +bool MuseRecordBasic::isBarline(void) { + return m_type == E_muserec_measure; +} + + + +////////////////////////////// +// +// MuseRecordBasic::isBackup -- +// + +bool MuseRecordBasic::isBackup(void) { + return m_type == E_muserec_back; +} + + + +////////////////////////////// +// +// MuseRecordBasic::isAnyComment -- +// + +bool MuseRecordBasic::isAnyComment(void) { + return isLineComment() || isBlockComment(); +} + + + +////////////////////////////// +// +// MuseRecordBasic::isLineComment -- +// + +bool MuseRecordBasic::isLineComment(void) { + return m_type == E_muserec_comment_line; +} + + + +////////////////////////////// +// +// MuseRecordBasic::isBlockComment -- +// + +bool MuseRecordBasic::isBlockComment(void) { + return m_type == E_muserec_comment_toggle; +} + + + +////////////////////////////// +// +// MuseRecordBasic::isChordNote -- Is a regular note that is a seoncdary +// note in a chord (not the first note in the chord). +// + +bool MuseRecordBasic::isChordNote(void) { + return m_type == E_muserec_note_chord; +} + + + +////////////////////////////// +// +// MuseRecordBasic::isDirection -- Is a musical direction (text) +// instruction. +// + +bool MuseRecordBasic::isDirection(void) { + return m_type == E_muserec_musical_directions; +} + + + +////////////////////////////// +// +// MuseRecordBasic::isMusicalDirection -- Is a musical direction (text) +// instruction. +// + +bool MuseRecordBasic::isMusicalDirection(void) { + return isDirection(); +} + + + +////////////////////////////// +// +// MuseRecordBasic::isGraceNote -- A grace note, either a single note or +// the first note in a gracenote chord. +// + +bool MuseRecordBasic::isGraceNote(void) { + return m_type == E_muserec_note_grace; +} + + + +////////////////////////////// +// +// MuseRecordBasic::isCueNote -- +// + +bool MuseRecordBasic::isCueNote(void) { + return m_type == E_muserec_note_cue; +} + + + +////////////////////////////// +// +// MuseRecordBasic::isChordNote -- +// + +bool MuseRecordBasic::isChordGraceNote(void) { + return m_type == E_muserec_note_grace_chord; +} + + + +////////////////////////////// +// +// MuseRecordBasic::isFiguredHarmony -- +// + +bool MuseRecordBasic::isFiguredHarmony(void) { + return m_type == E_muserec_figured_harmony; +} + + + +////////////////////////////// +// +// MuseRecordBasic::isPrintSuggestion -- +// + +bool MuseRecordBasic::isPrintSuggestion(void) { + switch (m_type) { + case E_muserec_print_suggestion: + return true; + } + return false; +} + + + +////////////////////////////// +// +// MuseRecordBasic::isRegularNote -- +// + +bool MuseRecordBasic::isRegularNote(void) { + switch (m_type) { + case E_muserec_note_regular: + return true; + } + return false; +} + + +////////////////////////////// +// +// MuseRecordBasic::isAnyNote -- +// + +bool MuseRecordBasic::isAnyNote(void) { + switch (m_type) { + case E_muserec_note_regular: + case E_muserec_note_chord: + case E_muserec_note_cue: + case E_muserec_note_grace: + case E_muserec_note_grace_chord: + return true; + } + return false; +} + + + +////////////////////////////// +// +// MuseRecordBasic::isAnyNoteOrRest -- +// + +bool MuseRecordBasic::isAnyNoteOrRest(void) { + switch (m_type) { + case E_muserec_note_regular: + case E_muserec_note_chord: + case E_muserec_note_cue: + case E_muserec_note_grace: + case E_muserec_note_grace_chord: + case E_muserec_rest_invisible: + case E_muserec_rest: + return true; + } + return false; +} + + + +////////////////////////////// +// +// MuseRecordBasic::isInvisibleRest -- +// + +bool MuseRecordBasic::isInvisibleRest(void) { + switch (m_type) { + case E_muserec_rest_invisible: + return true; + } + return false; +} + + + +////////////////////////////// +// +// MuseRecordBasic::isRegularRest -- +// + +bool MuseRecordBasic::isRegularRest(void) { + switch (m_type) { + case E_muserec_rest: + return true; + } + return false; +} + + + +////////////////////////////// +// +// MuseRecordBasic::isAnyRest -- Also cue-sized rests? +// + +bool MuseRecordBasic::isAnyRest(void) { + switch (m_type) { + case E_muserec_rest_invisible: + case E_muserec_rest: + return true; + } + return false; +} + + + +////////////////////////////// +// +// MuseRecordBasic::isCopyright -- +// + +bool MuseRecordBasic::isCopyright(void) { + switch (m_type) { + case E_muserec_copyright: + return true; + } + return false; +} + + + +////////////////////////////// +// +// MuseRecordBasic::isWorkInfo -- +// + +bool MuseRecordBasic::isWorkInfo(void) { + switch (m_type) { + case E_muserec_work_info: + return true; + } + return false; +} + + + +////////////////////////////// +// +// MuseRecordBasic::isWorkTitle -- +// + +bool MuseRecordBasic::isWorkTitle(void) { + switch (m_type) { + case E_muserec_work_title: + return true; + } + return false; +} + + + +////////////////////////////// +// +// MuseRecordBasic::isMovementTitle -- +// + +bool MuseRecordBasic::isMovementTitle(void) { + switch (m_type) { + case E_muserec_movement_title: + return true; + } + return false; +} + + + +////////////////////////////// +// +// MuseRecordBasic::isGroup -- +// + +bool MuseRecordBasic::isGroup(void) { + switch (m_type) { + case E_muserec_group: + return true; + } + return false; +} + + + +////////////////////////////// +// +// MuseRecordBasic::isGroupMembership -- +// + +bool MuseRecordBasic::isGroupMembership(void) { + switch (m_type) { + case E_muserec_group_memberships: + return true; + } + return false; +} + + + +////////////////////////////// +// +// MuseRecordBasic::isHeaderRecord -- True if a header, or a comment +// occurring before the first non-header record. +// + +bool MuseRecordBasic::isHeaderRecord(void) { + return m_header > 0; +} + + + +////////////////////////////// +// +// MuseRecordBasic::isBodyRecord -- True if not a header record. +// + +bool MuseRecordBasic::isBodyRecord(void) { + return m_header == 0; +} + + + + +////////////////////////////// +// +// MuseRecord::addPrintSuggestion -- add a delta index for associated +// print suggestion. +// + +void MuseRecord::addPrintSuggestion(int deltaIndex) { + m_printSuggestions.push_back(deltaIndex); +} + + @@ -43475,7 +45363,7 @@ MuseRecordBasic::MuseRecordBasic(void) { setType(E_muserec_unknown); m_owner = NULL; m_lineindex = -1; - m_absbeat = 0; + m_qstamp = 0; m_lineduration = 0; m_noteduration = 0; m_b40pitch = -100; @@ -43494,7 +45382,7 @@ MuseRecordBasic::MuseRecordBasic(const string& aLine, int index) { setType(E_muserec_unknown); m_lineindex = index; m_owner = NULL; - m_absbeat = 0; + m_qstamp = 0; m_lineduration = 0; m_noteduration = 0; m_b40pitch = -100; @@ -43521,7 +45409,7 @@ MuseRecordBasic::~MuseRecordBasic() { m_recordString.resize(0); m_owner = NULL; m_lineindex = -1; - m_absbeat = 0; + m_qstamp = 0; m_lineduration = 0; m_noteduration = 0; m_b40pitch = -100; @@ -43541,7 +45429,7 @@ MuseRecordBasic::~MuseRecordBasic() { void MuseRecordBasic::clear(void) { m_recordString.clear(); m_owner = NULL; - m_absbeat = 0; + m_qstamp = 0; m_lineindex = -1; m_lineduration = 0; m_noteduration = 0; @@ -43724,7 +45612,7 @@ MuseRecordBasic& MuseRecordBasic::operator=(MuseRecordBasic& aRecord) { setType(aRecord.getType()); m_lineindex = aRecord.m_lineindex; - m_absbeat = aRecord.m_absbeat; + m_qstamp = aRecord.m_qstamp; m_lineduration = aRecord.m_lineduration; m_noteduration = aRecord.m_noteduration; @@ -43747,7 +45635,7 @@ MuseRecordBasic& MuseRecordBasic::operator=(const string& aLine) { setType(aLine[0]); m_lineindex = -1; - m_absbeat = 0; + m_qstamp = 0; m_lineduration = 0; m_noteduration = 0; m_b40pitch = -100; @@ -43899,7 +45787,7 @@ void MuseRecordBasic::appendString(const string& astring) { ////////////////////////////// // -// MuseRecord::appendInteger -- Insert an integer after the last character +// MuseRecordBasic::appendInteger -- Insert an integer after the last character // in the current line. // @@ -43912,7 +45800,7 @@ void MuseRecordBasic::appendInteger(int value) { ////////////////////////////// // -// MuseRecord::appendRational -- Insert a rational after the last character +// MuseRecordBasic::appendRational -- Insert a rational after the last character // in the current line. // @@ -43927,7 +45815,7 @@ void MuseRecordBasic::appendRational(HumNum& value) { ////////////////////////////// // -// MuseRecord::append -- append multiple objects in sequence +// MuseRecordBasic::append -- append multiple objects in sequence // from left to right onto the record. The format contains // characters with two possibilities at the moment: // "i": integer value @@ -43999,24 +45887,39 @@ void MuseRecordBasic::setString(string& astring) { void MuseRecordBasic::setAbsBeat(HumNum value) { - m_absbeat = value; + m_qstamp = value; +} + + +void MuseRecordBasic::setQStamp(HumNum value) { + m_qstamp = value; } // default value botval = 1 void MuseRecordBasic::setAbsBeat(int topval, int botval) { - m_absbeat.setValue(topval, botval); + m_qstamp.setValue(topval, botval); +} + + +void MuseRecordBasic::setQStamp(int topval, int botval) { + m_qstamp.setValue(topval, botval); } ////////////////////////////// // -// MuseRecordBasic::getAbsBeat -- +// MuseRecordBasic::getAbsBeat -- Quarter notes from the +// start of the music. // HumNum MuseRecordBasic::getAbsBeat(void) { - return m_absbeat; + return m_qstamp; +} + +HumNum MuseRecordBasic::getQStamp(void) { + return m_qstamp; } @@ -44143,6 +46046,48 @@ int MuseRecordBasic::getNextTiedNoteLineIndex(void) { +////////////////////////////// +// +// MuseRecordBasic::hasTieGroupStart -- Return true if note is +// at the start of a tied group. +// + +int MuseRecordBasic::hasTieGroupStart(void) { + if (getLastTiedNoteLineIndex() > 0) { + // Note is in the middle of a tie group. + return 0; + } + if (getNextTiedNoteLineIndex() > 0) { + return 1; + } else { + // no tie on note. + return 0; + } +} + + + +////////////////////////////// +// +// MuseRecordBasic::isNoteAttack -- Return true if note is +// at the start of a tied group or is a regular note. +// + +int MuseRecordBasic::isNoteAttack(void) { + if (getLastTiedNoteLineIndex() > 0) { + // Note is in the middle of a tie group. + return 0; + } + if (getNextTiedNoteLineIndex() > 0) { + return 1; + } else { + // no tie on note. + return 1; + } +} + + + ////////////////////////////// // // MuseRecordBasic::setLastTiedNoteLineIndex -- @@ -44223,472 +46168,65 @@ void MuseRecordBasic::cleanLineEnding(void) { ////////////////////////////// // -// MuseRecordBasic::isPartName -- +// MuseRecordBasic::trimSpaces -- // -bool MuseRecordBasic::isPartName(void) { - return m_type == E_muserec_header_part_name; +string MuseRecordBasic::trimSpaces(std::string input) { + string output; + int status = 0; + for (int i=0; i<(int)input.size(); i++) { + if (!status) { + if (isspace(input[i])) { + continue; + } + status = 1; + } + output += input[i]; + } + for (int i=(int)output.size()-1; i>=0; i--) { + if (isspace(output[i])) { + output.resize((int)output.size() - 1); + } else { + break; + } + } + return output; } ////////////////////////////// // -// MuseRecordBasic::isAttributes -- +// MuseRecordBasic::setHeaderState -- 1 = in header, 0 = in body, -1 = undefined. +// Access with isHeaderRecord() and isBodyRecord(). // -bool MuseRecordBasic::isAttributes(void) { - return m_type == E_muserec_musical_attributes; +void MuseRecordBasic::setHeaderState(int state) { + if (state > 0) { + m_header = 1; + } else if (state < 0) { + m_header = -1; + } else { + m_header = 0; + } } ////////////////////////////// // -// MuseRecordBasic::isSource -- +// MuseRecordBasic::setLayer -- Set the layer for the record. +// This information is taken from the track parameter +// of records, but may be inferred from its position in +// relation to backup commands. Zero means implicit layer 1. // -bool MuseRecordBasic::isSource(void) { - return m_type == E_muserec_source; -} - - - -////////////////////////////// -// -// MuseRecordBasic::isEncoder -- -// - -bool MuseRecordBasic::isEncoder(void) { - return m_type == E_muserec_encoder; -} - - - -////////////////////////////// -// -// MuseRecordBasic::isId -- -// - -bool MuseRecordBasic::isId(void) { - return m_type == E_muserec_id; -} - - - -////////////////////////////// -// -// MuseRecordBasic::isBarline -- -// - -bool MuseRecordBasic::isBarline(void) { - return m_type == E_muserec_measure; -} - - - -////////////////////////////// -// -// MuseRecordBasic::isBackup -- -// - -bool MuseRecordBasic::isBackup(void) { - return m_type == E_muserec_back; -} - - - -////////////////////////////// -// -// MuseRecordBasic::isAnyComment -- -// - -bool MuseRecordBasic::isAnyComment(void) { - return isLineComment() || isBlockComment(); -} - - - -////////////////////////////// -// -// MuseRecordBasic::isLineComment -- -// - -bool MuseRecordBasic::isLineComment(void) { - return m_type == E_muserec_comment_line; -} - - - -////////////////////////////// -// -// MuseRecordBasic::isBlockComment -- -// - -bool MuseRecordBasic::isBlockComment(void) { - return m_type == E_muserec_comment_toggle; -} - - - -////////////////////////////// -// -// MuseRecordBasic::isChordNote -- Is a regular note that is a seoncdary -// note in a chord (not the first note in the chord). -// - -bool MuseRecordBasic::isChordNote(void) { - return m_type == E_muserec_note_chord; -} - - - -////////////////////////////// -// -// MuseRecordBasic::isDirection -- Is a musical direction (text) -// instruction. -// - -bool MuseRecordBasic::isDirection(void) { - return m_type == E_muserec_musical_directions; -} - - - -////////////////////////////// -// -// MuseRecordBasic::isGraceNote -- A grace note, either a single note or -// the first note in a gracenote chord. -// - -bool MuseRecordBasic::isGraceNote(void) { - return m_type == E_muserec_note_grace; -} - - - -////////////////////////////// -// -// MuseRecordBasic::isCueNote -- -// - -bool MuseRecordBasic::isCueNote(void) { - return m_type == E_muserec_note_cue; -} - - - -////////////////////////////// -// -// MuseRecordBasic::isChordNote -- -// - -bool MuseRecordBasic::isChordGraceNote(void) { - return m_type == E_muserec_note_grace_chord; -} - - - -////////////////////////////// -// -// MuseRecordBasic::isFiguredHarmony -- -// - -bool MuseRecordBasic::isFiguredHarmony(void) { - return m_type == E_muserec_figured_harmony; -} - - - -////////////////////////////// -// -// MuseRecordBasic::isPrintSuggestion -- -// - -bool MuseRecordBasic::isPrintSuggestion(void) { - switch (m_type) { - case E_muserec_print_suggestion: - return true; - } - return false; -} - - - -////////////////////////////// -// -// MuseRecordBasic::isRegularNote -- -// - -bool MuseRecordBasic::isRegularNote(void) { - switch (m_type) { - case E_muserec_note_regular: - return true; - } - return false; -} - - -////////////////////////////// -// -// MuseRecordBasic::isAnyNote -- -// - -bool MuseRecordBasic::isAnyNote(void) { - switch (m_type) { - case E_muserec_note_regular: - case E_muserec_note_chord: - case E_muserec_note_cue: - case E_muserec_note_grace: - case E_muserec_note_grace_chord: - return true; - } - return false; -} - - - -////////////////////////////// -// -// MuseRecordBasic::isAnyNoteOrRest -- -// - -bool MuseRecordBasic::isAnyNoteOrRest(void) { - switch (m_type) { - case E_muserec_note_regular: - case E_muserec_note_chord: - case E_muserec_note_cue: - case E_muserec_note_grace: - case E_muserec_note_grace_chord: - case E_muserec_rest_invisible: - case E_muserec_rest: - return true; - } - return false; -} - - - -////////////////////////////// -// -// MuseRecordBasic::isInvisibleRest -- -// - -bool MuseRecordBasic::isInvisibleRest(void) { - switch (m_type) { - case E_muserec_rest_invisible: - return true; - } - return false; -} - - - -////////////////////////////// -// -// MuseRecordBasic::isRegularRest -- -// - -bool MuseRecordBasic::isRegularRest(void) { - switch (m_type) { - case E_muserec_rest: - return true; - } - return false; -} - - - -////////////////////////////// -// -// MuseRecordBasic::isAnyRest -- Also cue-sized rests? -// - -bool MuseRecordBasic::isAnyRest(void) { - switch (m_type) { - case E_muserec_rest_invisible: - case E_muserec_rest: - return true; - } - return false; -} - - - -////////////////////////////// -// -// MuseRecordBasic::isCopyright -- -// - -bool MuseRecordBasic::isCopyright(void) { - switch (m_type) { - case E_muserec_copyright: - return true; - } - return false; -} - - - -////////////////////////////// -// -// MuseRecordBasic::isWorkInfo -- -// - -bool MuseRecordBasic::isWorkInfo(void) { - switch (m_type) { - case E_muserec_work_info: - return true; - } - return false; -} - - - -////////////////////////////// -// -// MuseRecordBasic::isWorkTitle -- -// - -bool MuseRecordBasic::isWorkTitle(void) { - switch (m_type) { - case E_muserec_work_title: - return true; - } - return false; -} - - - -////////////////////////////// -// -// MuseRecordBasic::isMovementTitle -- -// - -bool MuseRecordBasic::isMovementTitle(void) { - switch (m_type) { - case E_muserec_movement_title: - return true; - } - return false; -} - - - -////////////////////////////// -// -// MuseRecordBasic::isGroup -- -// - -bool MuseRecordBasic::isGroup(void) { - switch (m_type) { - case E_muserec_group: - return true; - } - return false; -} - - - -////////////////////////////// -// -// MuseRecordBasic::isGroupMembership -- -// - -bool MuseRecordBasic::isGroupMembership(void) { - switch (m_type) { - case E_muserec_group_memberships: - return true; - } - return false; -} - - - -////////////////////////////// -// -// MuseRecordBasic::isHeaderRecord -- True if a header, or a comment -// occurring before the first non-header record. -// - -bool MuseRecordBasic::isHeaderRecord(void) { - return m_header > 0; -} - - - -////////////////////////////// -// -// MuseRecordBasic::isBodyRecord -- True if not a header record. -// - -bool MuseRecordBasic::isBodyRecord(void) { - return m_header == 0; -} - - - -////////////////////////////// -// -// MuseRecordBasic::trimSpaces -- -// - -string MuseRecordBasic::trimSpaces(std::string input) { - string output; - int status = 0; - for (int i=0; i<(int)input.size(); i++) { - if (!status) { - if (isspace(input[i])) { - continue; - } - status = 1; - } - output += input[i]; - } - for (int i=(int)output.size()-1; i>=0; i--) { - if (isspace(output[i])) { - output.resize((int)output.size() - 1); - } else { - break; - } - } - return output; -} - - - -////////////////////////////// -// -// MuseRecordBasic::setHeaderState -- 1 = in header, 0 = in body, -1 = undefined. -// Access with isHeaderRecord() and isBodyRecord(). -// - -void MuseRecordBasic::setHeaderState(int state) { - if (state > 0) { - m_header = 1; - } else if (state < 0) { - m_header = -1; - } else { - m_header = 0; - } -} - - - -////////////////////////////// -// -// MuseRecordBasic::setLayer -- Set the layer for the record. -// This information is taken from the track parameter -// of records, but may be inferred from its position in -// relation to backup commands. Zero means implicit layer 1. -// - -void MuseRecordBasic::setLayer(int layer) { - if (layer < 0) { - m_layer = 0; - } else { - m_layer = layer; - } +void MuseRecordBasic::setLayer(int layer) { + if (layer < 0) { + m_layer = 0; + } else { + m_layer = layer; + } } @@ -50591,10 +52129,91 @@ int Options::optionsArg(void) { // ostream& Options::print(ostream& out) { - for (unsigned int i=0; igetDefinition() << "\t" - << m_optionRegister[i]->getDescription() << endl; + vector declarations; + vector descriptions; + int maxlen = 0; + for (int i=0; i<(int)m_optionRegister.size(); i++) { + declarations.push_back(m_optionRegister[i]->getDefinition()); + if (maxlen < (int)declarations.back().size()) { + maxlen = (int)declarations.back().size(); + } + descriptions.push_back(m_optionRegister[i]->getDescription()); + } + int separation = 3; + + for (int i=0; i<(int)declarations.size(); i++) { + out << declarations[i]; + for (int j=(int)declarations[i].size(); j < maxlen + separation; j++) { + out << ' '; + } + out << descriptions[i] << endl; + } + return out; +} + + + +////////////////////////////// +// +// Options::printEmscripten -- Print a list of the defined options +// when compiled with Emscripten (for use in https://verovio.humdrum.org +// with JavaScript compiled code for a web browser using Humdrum data. +// + +ostream& Options::printEmscripten(ostream& out) { + vector declarations; + vector descriptions; + out << "!!@@BEGIN: PREHTML" << endl; + out << "!!" << endl; + out << "!! " << endl; + out << "!! " << endl; + out << "!! " << endl; + HumRegex hre; + for (int i=0; i<(int)m_optionRegister.size(); i++) { + out << "!! " << endl; + string definition = m_optionRegister[i]->getDefinition(); + string description = m_optionRegister[i]->getDescription(); + string option = ""; + string optionType = ""; + string defaultValue = ""; + string prefix = ""; + if (hre.search(definition, "^([^|]+).*=([a-z]):?(.*)$")) { + option = hre.getMatch(1); + if (option.length() == 0) { + prefix = ""; + } else if (option.length() == 1) { + prefix = "-"; + } else if (option.length() > 1) { + prefix = "--"; + } + optionType = hre.getMatch(2); + defaultValue = hre.getMatch(3); + + if (optionType == "b") { optionType = "boolean"; } + else if (optionType == "s") { optionType = "string"; } + else if (optionType == "i") { optionType = "integer"; } + else if (optionType == "d") { optionType = "double"; } + + hre.replaceDestructive(option, "<", "<", "g"); + hre.replaceDestructive(option, ">", ">", "g"); + hre.replaceDestructive(optionType, "<", "<", "g"); + hre.replaceDestructive(optionType, ">", ">", "g"); + hre.replaceDestructive(defaultValue, "<", "<", "g"); + hre.replaceDestructive(defaultValue, ">", ">", "g"); + hre.replaceDestructive(description, "<", "<", "g"); + hre.replaceDestructive(description, ">", ">", "g"); + + out << "!! "; + out << ""; + out << ""; + out << ""; + out << ""; + out << endl; + } + out << "!! " << endl; } + out << "!!
OptionTypeDefaultDescription
" << prefix << option << "" << optionType << " " << optionType << " " << defaultValue << " " << description << "
" << endl; + out << "!!@@END: PREHTML" << endl; return out; } @@ -50880,13 +52499,16 @@ void Options::xverify(int error_check, int suppress) { bool optionend = false; int i = 1; int oldi; - int terminate = 1000; // for malformed options (missing arguments) + int terminate = 15000; // for malformed options (missing arguments) int tcount = 0; while ((i < (int)m_argv.size()) && !optionend) { tcount++; if (tcount > terminate) { m_error << "Error: missing option argument" << endl; + m_error << "ARGV count: " << m_argv.size() << endl; + m_error << "terminate: " << terminate << endl; + m_error << "tcount: " << tcount << endl; break; } if (isOption(m_argv[i], i)) { @@ -50935,7 +52557,10 @@ int Options::getRegIndex(const string& optionName) { } if (optionName == "options") { + #ifndef __EMSCRIPTEN__ print(cout); + exit(0); + #endif return -1; } @@ -50943,7 +52568,13 @@ int Options::getRegIndex(const string& optionName) { if (it == m_optionList.end()) { if (m_options_error_checkQ) { m_error << "Error: unknown option \"" << optionName << "\"." << endl; - print(cout); + #ifndef __EMSCRIPTEN__ + cerr << "Error: unknown option \"" << optionName << "\"." << endl; + #endif + print(cerr); + #ifndef __EMSCRIPTEN__ + exit(1); + #endif return -1; } else { return -1; @@ -52580,24 +54211,22 @@ string Tool_addic::getInstrumentClass(const string& code) { ///////////////////////////////// // -// Tool_autoaccid::Tool_autoaccid -- Set the recognized options for the tool. +// Tool_addkey::Tool_addkey -- Set the recognized options for the tool. // -Tool_autoaccid::Tool_autoaccid(void) { - define("x|visual=b", "mark visual accidentals only"); - define("y|suppressed=b", "mark hidden accidentals only"); - define("r|remove=b", "remove accidental qualifications"); - define("c|keep-cautionary|keep-courtesy|cautionary|caution|courtesy=b", "keep cautionary accidentals when removing markers"); +Tool_addkey::Tool_addkey(void) { + define("k|key=s", "Add given key designtation to data"); + define("K|reference-key=b", "Update or add !!!key: designation, used with -k"); } ///////////////////////////////// // -// Tool_autoaccid::run -- Do the main work of the tool. +// Tool_addkey::run -- Do the main work of the tool. // -bool Tool_autoaccid::run(HumdrumFileSet& infiles) { +bool Tool_addkey::run(HumdrumFileSet& infiles) { bool status = true; for (int i=0; isetText(text); + } + HumRegex hre; - for (int i=0; iisKern()) { - continue; - } - HTp send = infile.getStrandEnd(i); - HTp current = sbegin; - while (current && (current != send)) { - if (!current->isData()) { - current = current->getNextToken(); - continue; - } - if (current->isNull()) { - current = current->getNextToken(); - continue; - } - if (current->isRest()) { - current = current->getNextToken(); - continue; - } - addAccidentalInfo(current); - current = current->getNextToken(); + string keyDesig = "*" + m_key; + if (!hre.search(m_key, ":")) { + keyDesig += ":"; + } + insertKeyDesig(infile, keyDesig); + + // Update the reference key record if -K option is used: + if (m_addKeyRefQ) { + if (m_refKeyIndex != -1) { + string text = "!!!key: " + m_key; + infile[m_refKeyIndex].setText(text); } + // Or print just before exinterp line later if not found, + // but needs to be created. } } @@ -52707,173 +54335,196 @@ void Tool_autoaccid::addAccidentalQualifications(HumdrumFile& infile) { ////////////////////////////// // -// Tool_autoaccid::addAccidentalInfo -- -// -// Analysis have several parameters: -// visualAccidental = true :: need to add an X after the accidental -// visualAccidental = false :: need to add an y after the accidental -// also: -// cautionaryAccidental = "true" :: -// obligatoryAccidental = "true" :: +// Tool_addkey::insertKeyDesig -- // -void Tool_autoaccid::addAccidentalInfo(HTp token) { - vector subtokens; - subtokens = token->getSubtokens(); - if (subtokens.size() == 1) { - bool visual = token->getValueBool("auto", "0", "visualAccidental"); - subtokens[0] = setVisualState(subtokens[0], visual); - } else { - for (int i=0; i<(int)subtokens.size(); i++) { - bool visual = token->getValueBool("auto", to_string(i+1), "visualAccidental"); - subtokens[i] = setVisualState(subtokens[i], visual); +void Tool_addkey::insertKeyDesig(HumdrumFile& infile, const string& keyDesig) { + // Replace the key designation if any are found in the header. + // If not found, then store in key signature for printing later. + for (int i=0; i= m_dataStartIndex) { + break; } - } - string text; - for (int i=0; i<(int)subtokens.size(); i++) { - text += subtokens[i]; - if (i < (int)subtokens.size() - 1) { - text += ' '; + if (!infile[i].isInterpretation()) { + continue; + } + for (int j=0; jisKeyDesignation()) { + token->setText(keyDesig); + } else if ((m_keyDesigIndex == -1) && (token->isKeySignature())) { + // Store keyDesig later to print: + token->setValue("auto", "keyDesig", keyDesig); + } } } - token->setText(text); } ////////////////////////////// // -// Tool_autoaccid::setVisualState -- +// Tool_addkey::insertReferenceKey -- Take the !!!key: value and insert +// into key designations in the header. Add key designation line if not +// present already in header. // -string Tool_autoaccid::setVisualState(const string& input, bool state) { +void Tool_addkey::insertReferenceKey(HumdrumFile& infile) { + getLineIndexes(infile); + + if (m_refKeyIndex == -1) { + // Nothing to do, add later before exinterp line. + return; + } + HumRegex hre; - if (hre.search(input, "[-#n][Xy]")) { - // do not remark accidental - return input; + string keyValue = infile[m_refKeyIndex].getReferenceValue(); + if (!hre.search(keyValue, ":")) { + keyValue += ":"; } - bool hasNatural = hre.search(input, "n"); - bool hasFlat = hre.search(input, "-"); - bool hasSharp = hre.search(input, "#"); - bool accidental = hasNatural || hasFlat || hasSharp; - string output; - if (m_visualQ) { - if (state) { - if (!accidental) { - // need to show a natural accidental (and add the natural sign) - output = hre.replaceCopy(input, "$1nX", "([A-Ga-g]+)"); - } else { - // force accidental to display - output = hre.replaceCopy(input, "$1X", "([-#n]+)"); + if (!hre.search(keyValue, "^\\*")) { + hre.replaceDestructive(keyValue, "*", "^"); + } + if (m_keyDesigIndex > 0) { + for (int i=m_exinterpIndex+1; i<=m_keyDesigIndex; i++) { + if (!infile[i].isInterpretation()) { + continue; } - } else { - // do nothing - } - } else if (m_hiddenQ) { - if (!state) { - if (accidental) { - // force accidental to be hidden - output = hre.replaceCopy(input, "$1y", "([-#n]+)"); - } else { - output = input; + for (int j=0; jisKeyDesignation()) { + continue; + } + string text = "*" + keyValue; + token->setText(text); } } - } else { - // force display/hide state for accidental - if (state) { - if (!accidental) { - // need to show a natural accidental (and add the natural sign) - output = hre.replaceCopy(input, "$1nX", "([A-Ga-g]+)"); - } else { - // force accidental to display - output = hre.replaceCopy(input, "$1X", "([-#n]+)"); - } + infile.generateLinesFromTokens(); + m_humdrum_text << infile; + } else if (m_keySigIndex > 0) { + printKeyDesig(infile, m_keySigIndex, keyValue, +1); + } else if (m_dataStartIndex > 0) { + printKeyDesig(infile, m_dataStartIndex, keyValue, -1); + } +} + + + +////////////////////////////// +// +// Tool_addkey::printKeyDesig -- +// + +void Tool_addkey::printKeyDesig(HumdrumFile& infile, int index, const string& desig, int direction) { + int index2 = index + direction; + for (int i=0; i