From 7a83b5435f1e5488017250a6e2d2a55bdb17da35 Mon Sep 17 00:00:00 2001 From: khodowany Date: Wed, 16 Sep 2026 18:17:42 -0500 Subject: [PATCH] Engraver --- .gitea/workflows/ci.yml | 5 - README.md | 2 +- TECHNICAL_GUIDE.md | 12 +- cmake/zero.cmake | 1 - conanfile.py | 1 - generator/engraving/__init__.py | 131 +- generator/engraving/attributes.py | 122 + generator/engraving/audit.py | 195 +- generator/engraving/fonts.py | 83 + generator/engraving/layout.py | 231 + generator/engraving/notation.py | 173 + generator/engraving/notes.py | 164 + generator/engraving/petaluma.mss | 34 - generator/engraving/raster.py | 59 + generator/engraving/spans.py | 263 + generator/engraving/types.py | 117 + generator/musicxml_writer.py | 11 +- generator/score.py | 4 +- modulus.py | 9 +- .../assets/fonts/petaluma/SMUFL-LICENSE.md | 20 + .../fonts/petaluma/smufl_glyphnames.json | 11984 ++++++++++++++++ tests/fixtures/engraving-python.png | Bin 0 -> 32324 bytes tests/fixtures/notation-python.png | Bin 0 -> 60749 bytes tests/musicxml_roundtrip.py | 92 + tests/test_build_bootstrap.py | 2 +- tests/test_engraving.py | 177 + tests/test_score_bundle.py | 54 +- tools/install_engraver.py | 52 - tools/requirements.txt | 2 + 29 files changed, 13678 insertions(+), 322 deletions(-) create mode 100644 generator/engraving/attributes.py create mode 100644 generator/engraving/fonts.py create mode 100644 generator/engraving/layout.py create mode 100644 generator/engraving/notation.py create mode 100644 generator/engraving/notes.py delete mode 100644 generator/engraving/petaluma.mss create mode 100644 generator/engraving/raster.py create mode 100644 generator/engraving/spans.py create mode 100644 generator/engraving/types.py create mode 100644 package/assets/fonts/petaluma/SMUFL-LICENSE.md create mode 100644 package/assets/fonts/petaluma/smufl_glyphnames.json create mode 100644 tests/fixtures/engraving-python.png create mode 100644 tests/fixtures/notation-python.png create mode 100644 tests/musicxml_roundtrip.py create mode 100644 tests/test_engraving.py delete mode 100644 tools/install_engraver.py diff --git a/.gitea/workflows/ci.yml b/.gitea/workflows/ci.yml index 55015bc..2236224 100644 --- a/.gitea/workflows/ci.yml +++ b/.gitea/workflows/ci.yml @@ -90,11 +90,6 @@ jobs: python3 -m venv build/build_common/ci_python build/build_common/ci_python/bin/python -m pip install --no-cache-dir conan==2.26.2 -r tools/requirements.txt echo "$PWD/build/build_common/ci_python/bin" >> "$GITHUB_PATH" - - name: Install pinned build-time engraver - run: | - apt-get install -y --no-install-recommends libasound2t64 libdbus-1-3 libfontconfig1 libglib2.0-0t64 libgpg-error0 libnss3 libopengl0 libxkbcommon0 libxkbcommon-x11-0 libxcb-cursor0 libxcomposite1 libxrandr2 libxtst6 - python3 tools/install_engraver.py build/build_common/musescore - echo "VAMP_MUSESCORE=$PWD/build/build_common/musescore/squashfs-root/AppRun" >> "$GITHUB_ENV" - name: Restore Conan cache uses: actions/cache@v4 with: diff --git a/README.md b/README.md index 87839b0..d9f035b 100644 --- a/README.md +++ b/README.md @@ -89,7 +89,7 @@ Code style is managed by Modulus. Run `./modulus.py format` to format C++ and Py See [Score Generation](TECHNICAL_GUIDE.md#score-generation) for supported MusicXML notation, Vamp properties, schema details, and diagnostics. There is no compact-JSON source format or legacy runtime adapter. Unsupported notation fails generation before existing assets are replaced. -Build-time engraving uses pinned MuseScore Studio 4.7.4 and the OTF Petaluma fonts in `package/assets/fonts/petaluma`. The managed Docker image and CI install the checksum-verified engraver automatically. For a direct host build, run `python3 tools/install_engraver.py build/build_common/musescore` and set `VAMP_MUSESCORE` to the printed executable path. Unsupported or unfaithfully exported notation fails the build rather than being approximated. +Build-time engraving is implemented in Python in `generator/engraving`, using the bundled Petaluma OTF fonts and SMuFL metadata. MuseScore is an optional authoring tool, not a build dependency or rendering backend. The managed image and CI install the pinned Python requirements automatically; direct host builds use `pip install -r tools/requirements.txt`. Exact musical timing is retained through layout, and dense measures can continue across systems without shrinking the notation. Missing glyphs, unrepresentable page geometry, and failed notation audits stop generation before replacing existing assets. Petaluma is from Steinberg under the SIL Open Font License. Runtime packages include PNG score pages, `PetalumaScript.otf` for UI text, and `OFL.txt`; the music font and engraver stay build-only. diff --git a/TECHNICAL_GUIDE.md b/TECHNICAL_GUIDE.md index 8bf9338..e1d5ab7 100644 --- a/TECHNICAL_GUIDE.md +++ b/TECHNICAL_GUIDE.md @@ -87,13 +87,17 @@ Automatic performance arrangements require a pitched, non-TAB lead. Percussion a ### Engraving Boundary -`generator/musicxml_writer.py` emits MusicXML from the transformed model. `generator/engraving/` runs pinned MuseScore Studio 4.7.4 with the checked-in Petaluma house style, isolated home/config/font caches, and the repository OTF fonts. The checksum-verified AppImage is installed only on the build host; it is never packaged for the Pi. +`generator/engraving/` is a custom Python engraver, not a wrapper around MuseScore or another notation engine. `layout_score(document, style, fonts)` produces immutable layout pages with exact source intervals, notation anchors and drawing primitives. `rasterize_page(page, fonts)` draws one page at four-times resolution and downsamples it. `engrave_tree(root, fonts)` retains the asset-pipeline entry point. `generator/musicxml_writer.py` remains a round-trip/export utility and is not involved in engraving. -Model support is deliberately broader than engine qualification. More than four source voice identities, maxima, more than four dots, independently sustained tones within one chord, cross-bar tuplets, double stems, custom accidental glyphs, and unqualified microtonal alterations produce explicit engraving errors. Unequal chord durations can be authored as separate voices for this engine. No model limitation or silent approximation is introduced to conceal these failures. +`notation.py` interprets staff state, exact pitch positions and shared accidental state; `notes.py` and `attributes.py` construct symbols; `spans.py` handles beams, ties, tuplets, octave shifts and lyric continuations; `layout.py` handles spacing and pagination. `fonts.py` reads bundled OTF outlines and SMuFL metadata, caching metrics and outlines for one generation run. `raster.py` uses FontTools, aggdraw and Pillow only as low-level font and drawing libraries. All dependencies are pinned in `tools/requirements.txt` and remain build-only. Standard glyph names and their upstream notice are vendored alongside the fonts; no system music fonts are consulted. -Each export is read back as MusicXML and audited for pitch spelling, exact timing, voice/event counts, written values, ties, explicit beams/stems, lyrics, harmony degrees, staff changes, tempos, and spans. Engraver changes fail generation. This is not a claim that MuseScore can engrave every MusicXML construct. Newly supported constructs must pass importer/writer tests, engine auditing, and visual qualification. +The former backend-specific four-voice, duration, unequal-tone and tuplet restrictions are removed. Voices retain separate stems and collision offsets; chord tones retain their own written durations and per-tone ties. Pitched, percussion and explicitly fingered TAB material use their own staff positions. Unknown exact microtonal alterations use a numeric rational semitone annotation relative to the natural pitch, not a rounded accidental. An explicit unavailable SMuFL glyph is an error. The single-part/single-staff importer contract and exclusions for dynamics, accents, expressive ornaments and navigation remain unchanged. -Pages are 976x484 pixels with 12-pixel staff spacing. Pagination is done by the engraver, not by shrinking the page or clipping notation. Blank pages, incorrect dimensions, and ink reaching the page edge are rejected. Runtime letterboxing preserves aspect ratio. Luma's `load_texture_uncached()` lets Product Vamp retain at most two textures without a hidden strong asset-cache reference. The UI reports missing/corrupt assets instead of falling back to the removed renderer. Runtime validates bundle metadata, paths, dimensions, and page checksums; the build validates musical semantics. +`audit.py` checks the final layout against the musical model: timeline and fragment coverage, exact fragment durations, actual glyph bounds, pitch positions, visible note primitives, required accidentals, ties, lyrics, harmonies, tempos and spans. It rejects out-of-page geometry and collisions among unrelated noteheads, accidentals and same-lane text. Staff, ledger, stem, beam and tie contacts are intentional. This is not a proof of publication-quality engraving for every possible MusicXML document; notation changes need targeted semantic, geometry and reviewed image tests. The writer's XML round-trip audit is retained separately in the test suite. + +Bundles keep schema version 3 and an unchanged `music` object. Presentation identifies `Vamp Python` version `1.0.0`; its style fingerprint includes the style settings, both font files, font-specific metadata and the glyph-name mapping. Runtime remains engine-agnostic, so valid existing schema-v3 bundles need no database migration. + +Pages are 976x484 pixels with 12-pixel staff spacing, 28-pixel horizontal margins and 18-pixel vertical margins. Dense measures continue across systems/pages; sustained notes become exact, tied presentation fragments and rests become exact rest fragments. These fragments never change the semantic JSON. Irreducible simultaneous content that cannot fit a fixed page fails contextually rather than being clipped or shrunk. Blank pages, incorrect dimensions, and ink reaching the page edge are rejected. Runtime letterboxing preserves aspect ratio. Luma's `load_texture_uncached()` lets Product Vamp retain at most two textures without a hidden strong asset-cache reference. The UI reports missing/corrupt assets instead of falling back to the removed renderer. Runtime validates bundle metadata, paths, dimensions, and page checksums; the build validates musical semantics. ### Validation And Migration diff --git a/cmake/zero.cmake b/cmake/zero.cmake index 7c11d4e..3c5c2bc 100644 --- a/cmake/zero.cmake +++ b/cmake/zero.cmake @@ -110,7 +110,6 @@ file(GLOB_RECURSE VAMP_GENERATOR_INPUTS CONFIGURE_DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/data/**/*.json ${CMAKE_CURRENT_SOURCE_DIR}/generator/*.py ${CMAKE_CURRENT_SOURCE_DIR}/generator/**/*.py - ${CMAKE_CURRENT_SOURCE_DIR}/generator/engraving/*.mss ${CMAKE_CURRENT_SOURCE_DIR}/tools/requirements.txt ${CMAKE_CURRENT_SOURCE_DIR}/package/assets/fonts/* ${CMAKE_CURRENT_SOURCE_DIR}/package/assets/fonts/**/* diff --git a/conanfile.py b/conanfile.py index 14d3f9e..14957fc 100644 --- a/conanfile.py +++ b/conanfile.py @@ -33,7 +33,6 @@ class product_vamp_conan(conan.ConanFile): "tests/fixtures/**/*", "generator/*.py", "generator/**/*.py", - "generator/engraving/*.mss", "include/*.hpp", "include/vamp_style/*.hpp", "include/vamp_pico/*.h", diff --git a/generator/engraving/__init__.py b/generator/engraving/__init__.py index 036ecf2..222ac57 100644 --- a/generator/engraving/__init__.py +++ b/generator/engraving/__init__.py @@ -2,77 +2,20 @@ from __future__ import annotations import hashlib import json -import os from pathlib import Path -import re import shutil -import subprocess -import tempfile -from xml.etree import ElementTree from PIL import Image, ImageChops -from generator.model import ACCIDENTALS, alteration, fraction, validate_document -from generator.musicxml_writer import write_musicxml -from generator.engraving.audit import audit_roundtrip +from generator.engraving.fonts import Fonts +from generator.engraving.layout import layout_score +from generator.engraving.raster import rasterize_page +from generator.engraving.types import EngravingError, Style -ENGINE_VERSION = '4.7.4' +ENGINE_NAME = 'Vamp Python' +ENGINE_VERSION = '1.0.0' PAGE_WIDTH = 976 PAGE_HEIGHT = 484 -STYLE = Path(__file__).with_name('petaluma.mss') - -class EngravingError(ValueError): - pass - -def qualify(document: dict) -> None: - """Keep model support separate from the pinned engine's qualified surface.""" - validate_document(document) - staff = document['staves'][0] - if len({v['id'] for m in staff['measures'] for v in m['voices']} - {'voice-arranged'}) > 4: - raise EngravingError('MuseScore 4.7.4 supports at most four voices on one staff') - event_measures = {n['id']: m['id'] for m in staff['measures'] for v in m['voices'] for n in v['notes']} - for span in staff.get('tuplets', []): - if event_measures[span['start']] != event_measures[span['end']]: - raise EngravingError(f'{span["id"]}: cross-bar tuplet engraving is not qualified') - if span.get('show_type', 'none') != 'none' or span.get('line_shape', 'straight') != 'straight': - raise EngravingError(f'{span["id"]}: this tuplet appearance is not qualified') - for measure in staff['measures']: - for event in (n for v in measure['voices'] for n in v['notes']): - location = f'{measure["id"]}, voice {event.get("voice")}, {event["id"]}' - if event['written']['type'] == 'maxima' or event['written'].get('dots', 0) > 4: - raise EngravingError(f'{location}: written duration exceeds the qualified engraver range') - if event.get('stem') == 'double': - raise EngravingError(f'{location}: double-stem engraving is not qualified') - for pitch in event['pitches']: - if pitch['written'] != event['written'] or pitch['duration'] != event['duration']: - raise EngravingError(f'{location}: independently sustained chord tones need separate voices for MuseScore engraving') - if 'alter' in pitch and alteration(pitch['alter']) not in ACCIDENTALS.values(): - raise EngravingError(f'{location}: this microtonal alteration is not qualified for engraving') - if pitch.get('accidental_display', {}).get('name') == 'other': - raise EngravingError(f'{location}: custom accidental glyph is not qualified') - -def isolated_environment(root: Path, fonts: Path) -> dict[str, str]: - env = dict(os.environ) - for name, path in (('HOME', root / 'home'), ('XDG_CONFIG_HOME', root / 'config'), ('XDG_DATA_HOME', root / 'data'), ('XDG_CACHE_HOME', root / 'cache'), ('XDG_RUNTIME_DIR', root / 'runtime')): - path.mkdir(mode=0o700, parents=True, exist_ok=True) - env[name] = str(path) - config = ElementTree.Element('fontconfig') - ElementTree.SubElement(config, 'include', {'ignore_missing': 'yes'}).text = '/etc/fonts/fonts.conf' - ElementTree.SubElement(config, 'dir').text = str(fonts.resolve()) - ElementTree.SubElement(config, 'cachedir').text = str(root / 'font-cache') - fontconfig = root / 'fonts.conf' - ElementTree.ElementTree(config).write(fontconfig, encoding='utf-8', xml_declaration=True) - env.update({'QT_QPA_PLATFORM': 'offscreen', 'QT_QPA_PLATFORMTHEME': '', 'FONTCONFIG_FILE': str(fontconfig), 'QT_STYLE_OVERRIDE': 'Fusion'}) - return env - -def run_engine(executable: str, arguments: list[str], env: dict) -> str: - try: - result = subprocess.run([executable, '-platform', 'offscreen', *arguments], env=env, stdin=subprocess.DEVNULL, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, text=True, timeout=180, check=False) - except (OSError, subprocess.TimeoutExpired) as error: - raise EngravingError(f'MuseScore export failed: {error}') from error - if result.returncode: - raise EngravingError(f'MuseScore export exited {result.returncode}: {result.stdout[-4000:]}') - return result.stdout def check_page(path: Path) -> None: with Image.open(path) as image: @@ -92,43 +35,25 @@ def engrave_tree(root: Path, fonts: Path) -> None: paths = sorted(root.rglob('*.json')) if not paths: return - executable = os.environ.get('VAMP_MUSESCORE') or shutil.which('mscore') or shutil.which('musescore') - if not executable: - raise EngravingError(f'MuseScore Studio {ENGINE_VERSION} is required at build time (set VAMP_MUSESCORE)') - with tempfile.TemporaryDirectory(prefix='vamp-engraving-') as temporary: - work = Path(temporary) - env = isolated_environment(work, fonts) - version = run_engine(executable, ['--version'], env) - if not re.search(r'\b4\.7\.4\b', version): - raise EngravingError(f'expected MuseScore Studio {ENGINE_VERSION}, received {version.strip()!r}') - for index, path in enumerate(paths): - document = json.loads(path.read_text(encoding='utf-8')) - try: - qualify(document) - source = work / f'score-{index}.musicxml' - write_musicxml(source, document, engine_voices=True) - output = work / f'score-{index}.png' - audit = work / f'audit-{index}.musicxml' - job = work / 'job.json' - job.write_text(json.dumps([{'in': str(source), 'out': [str(output), str(audit)]}]), encoding='utf-8') - run_engine(executable, ['-S', str(STYLE.resolve()), '-r', '96', '-j', str(job)], env) - audit_roundtrip(source, audit) - pages = sorted(work.glob(f'score-{index}-*.png'), key=lambda p: int(p.stem.rsplit('-', 1)[1])) - if not pages: - raise EngravingError('engraver produced no pages') - destination = path.with_suffix('.pages') - if destination.exists(): - shutil.rmtree(destination) - destination.mkdir() - entries = [] - for number, page in enumerate(pages, 1): - check_page(page) - name = f'{number:04}.png' - target = destination / name - shutil.copyfile(page, target) - entries.append({'path': destination.name + '/' + name, 'sha256': hashlib.sha256(target.read_bytes()).hexdigest()}) - music = {k: v for k, v in document.items() if k != 'schema_version'} - bundle = {'schema_version': 3, 'music': music, 'presentation': {'engine': 'MuseScore Studio', 'engine_version': ENGINE_VERSION, 'style_sha256': hashlib.sha256(STYLE.read_bytes()).hexdigest(), 'width': PAGE_WIDTH, 'height': PAGE_HEIGHT, 'pages': entries}} - path.write_text(json.dumps(bundle, indent=2, ensure_ascii=False) + '\n', encoding='utf-8') - except ValueError as error: - raise EngravingError(f'{path.relative_to(root)}: {error}') from error + family = Fonts(fonts) + style = Style() + for path in paths: + document = json.loads(path.read_text(encoding='utf-8')) + try: + layout = layout_score(document, style, family) + destination = path.with_suffix('.pages') + if destination.exists(): + shutil.rmtree(destination) + destination.mkdir() + entries = [] + for page in layout.pages: + name = f'{page.number:04}.png' + target = destination / name + rasterize_page(page, family).save(target, format='PNG') + check_page(target) + entries.append({'path': destination.name + '/' + name, 'sha256': hashlib.sha256(target.read_bytes()).hexdigest()}) + music = {k: v for k, v in document.items() if k != 'schema_version'} + bundle = {'schema_version': 3, 'music': music, 'presentation': {'engine': ENGINE_NAME, 'engine_version': ENGINE_VERSION, 'style_sha256': layout.fingerprint, 'width': PAGE_WIDTH, 'height': PAGE_HEIGHT, 'pages': entries}} + path.write_text(json.dumps(bundle, indent=2, ensure_ascii=False) + '\n', encoding='utf-8') + except ValueError as error: + raise EngravingError(f'{path.relative_to(root)}: {error}') from error diff --git a/generator/engraving/attributes.py b/generator/engraving/attributes.py new file mode 100644 index 0000000..c365ba1 --- /dev/null +++ b/generator/engraving/attributes.py @@ -0,0 +1,122 @@ +from __future__ import annotations + +from fractions import Fraction + +from generator.model import LETTERS, TYPE_LENGTHS, alteration, fraction +from generator.engraving.fonts import Fonts +from generator.engraving.notation import ScoreIndex, accidental +from generator.engraving.types import Primitive, bounds, line + +def staff_attributes(index: ScoreIndex, state: dict, time: Fraction, fonts: Fonts, space: float, source: str, fields: tuple[str, ...]) -> list[Primitive]: + result = [] + x = 0 + references = (source,) + clef = state['clef'] + lines = state['staff_details']['lines'] + if 'clef' in fields and clef['sign'] != 'none': + sign = clef['sign'] + name = {'G': 'gClef', 'F': 'fClef', 'C': 'cClef', 'percussion': 'unpitchedPercussionClef1', 'TAB': '6stringTabClef' if lines != 4 else '4stringTabClef'}[sign] + y = -space * (clef.get('line', 2) - 1) if sign in ('G', 'F', 'C') else -space * (lines - 1) / 2 + glyph = fonts.glyph(name, x, y, space, 'clef', references) + result.append(glyph) + if octave := clef.get('octave_change', 0): + label = str(abs(octave) * 7 + 1) + result.append(fonts.text(label, (glyph.box.left + glyph.box.right) / 2, glyph.box.top - 2 if octave > 0 else glyph.box.bottom + 14, 14, 'clef-octave', references, True)) + x = bounds(result).right + space + if 'key' in fields and clef['sign'] not in ('percussion', 'TAB'): + key = state['key'] + steps = key.get('steps') + if steps is None: + order = 'fcgdaeb' if key.get('fifths', 0) >= 0 else 'beadgcf' + steps = [{'letter': c, 'alter': key['alterations'][LETTERS.index(c)]} for c in order if alteration(key['alterations'][LETTERS.index(c)])] + cancellation = key.get('cancel', 0) + if cancellation: + order = 'fcgdaeb' if cancellation > 0 else 'beadgcf' + steps = [{'letter': c, 'alter': 0} for c in order[:min(7, abs(cancellation))]] + steps + for step in steps: + pitch = {'letter': step['letter'], 'octave': step.get('octave', 5), 'id': source} + position = index.pitch_position(pitch, time) + if 'octave' not in step: + while position > 9: + position -= 7 + while position < 2: + position += 7 + items = accidental(fonts, alteration(step['alter']), {'name': step.get('accidental', '')}, space, references) + result.extend(p.moved(x, -position * space / 2) for p in items) + x += bounds(items).right - bounds(items).left + 4 + if steps: + x += space / 2 + if 'meter' in fields: + meter = state['meter'] + if meter.get('unmetered'): + result.append(fonts.text('senza misura', x, -space * 2, 16, 'meter', references)) + elif meter.get('symbol') in ('common', 'cut'): + result.append(fonts.glyph('timeSigCommon' if meter['symbol'] == 'common' else 'timeSigCutCommon', x, -space * 2, space, 'meter', references)) + else: + for gi, group in enumerate(meter['groups']): + if gi: + plus = fonts.glyph('timeSigPlus', x, -space * 2, space, 'meter', references) + result.append(plus) + x = plus.box.right + 7 + numerator = '+'.join(map(str, group['beats'])) + denominator = str(group['unit']) + rows = [(numerator, -space * 2)] if meter.get('symbol') == 'single-number' else [(numerator, -space * 3), (denominator, -space)] + groups = [] + for value, y in rows: + items = [] + cursor = 0 + if y == -space and meter.get('symbol') in ('note', 'dotted-note'): + unit = Fraction(4, group['unit']) + kind = next((name for name, length in TYPE_LENGTHS.items() if length == unit), None) + glyph_name = {'whole': 'noteWhole', 'half': 'noteHalfUp', 'quarter': 'noteQuarterUp', 'eighth': 'note8thUp'}.get(kind, 'note' + str(kind) + 'Up') + if kind and glyph_name in fonts.names: + glyph = fonts.glyph(glyph_name, 0, y + space, space * 0.55, 'meter', references) + items.append(glyph) + if meter['symbol'] == 'dotted-note': + items.append(fonts.glyph('augmentationDot', glyph.box.right + 3, y + space / 2, space * 0.55, 'meter', references)) + groups.append(items) + continue + for char in value: + glyph = fonts.glyph('timeSigPlus' if char == '+' else 'timeSig' + char, cursor, y, space, 'meter', references) + items.append(glyph) + cursor = glyph.box.right + 1 + groups.append(items) + width = max(bounds(items).right for items in groups) + for items in groups: + result.extend(p.moved(x + (width - bounds(items).right) / 2, 0) for p in items) + x += width + 6 + if 'staff_details' in fields and state['staff_details'].get('capo'): + result.append(fonts.text(f'Capo {state["staff_details"]["capo"]}', x, -space * (lines + 1), 16, 'staff-details', references)) + return result + +def barline(style: str, x: float, top: float, source: str) -> list[Primitive]: + if style == 'none': + return [] + references = (source,) + if style in ('dashed', 'dotted'): + dash, gap = (5, 4) if style == 'dashed' else (1, 4) + return [line('barline', references, ((x, y), (x, min(y + dash, 0)))) for y in range(round(top), 0, dash + gap)] + if style in ('tick', 'short'): + return [line('barline', references, ((x, top - 4 if style == 'tick' else top * 0.75), (x, top + 5 if style == 'tick' else top * 0.25)))] + weights = {'regular': [1.4], 'heavy': [4], 'light-light': [1.4, 1.4], 'light-heavy': [1.4, 4], 'heavy-light': [4, 1.4], 'heavy-heavy': [4, 4]}[style] + return [line('barline', references, ((x - (len(weights) - 1 - i) * 5, top), (x - (len(weights) - 1 - i) * 5, 0)), width) for i, width in enumerate(weights)] + +def tempo(value: dict, fonts: Fonts, x: float, y: float, space: float, source: str) -> list[Primitive]: + from generator.engraving.notation import flags, head_glyph + written = value['written'] + references = (source,) + glyph = fonts.glyph(head_glyph(written, None), x, y, space * 0.7, 'tempo', references) + items = [glyph] + stem_x = glyph.box.right - 0.5 + if written['type'] not in ('whole', 'breve', 'long', 'maxima'): + items.append(line('tempo', references, ((stem_x, y), (stem_x, y - 23)), 1)) + if flags(written): + name = 'flag' + ('8th' if written['type'] == 'eighth' else written['type']) + 'Up' + items.append(fonts.glyph(name, stem_x, y - 23, space * 0.7, 'tempo', references)) + cursor = max(p.box.right for p in items) + 3 + for _ in range(written.get('dots', 0)): + dot = fonts.glyph('augmentationDot', cursor, y - 3, space * 0.7, 'tempo', references) + items.append(dot) + cursor = dot.box.right + 3 + items.append(fonts.text(' = ' + str(fraction(value['bpm'])), cursor, y + 3, 16, 'tempo', references)) + return items diff --git a/generator/engraving/audit.py b/generator/engraving/audit.py index a2e9ea6..95ec93a 100644 --- a/generator/engraving/audit.py +++ b/generator/engraving/audit.py @@ -1,92 +1,113 @@ from __future__ import annotations -from pathlib import Path +from fractions import Fraction +from generator.model import TYPE_LENGTHS, fraction from generator import harmony -from generator.musicxml import load_musicxml +from generator.engraving.fonts import Fonts +from generator.engraving.notation import ScoreIndex, head_glyph +from generator.engraving.types import EngravingError, LayoutDocument -def same(left, right, location: str) -> None: - if left != right: - raise ValueError(f'{location}: engraver changed musical content ({left!r} -> {right!r})') - -def event_positions(staff: dict) -> dict: - return {event['id']: (mi, vi, ni) for mi, measure in enumerate(staff['measures']) for vi, voice in enumerate(measure['voices']) for ni, event in enumerate(voice['notes'])} - -def tuplet_members(staff: dict, identifier: str) -> list: - positions = event_positions(staff) - return [positions[event['id']] for measure in staff['measures'] for voice in measure['voices'] for event in voice['notes'] if identifier in event.get('tuplet_ids', [])] - -def audit_roundtrip(source: Path, output: Path) -> None: - before = load_musicxml(source)['staves'][0] - after = load_musicxml(output)['staves'][0] - before_positions, after_positions = event_positions(before), event_positions(after) - before_instruments = {i['id']: i for i in before.get('instruments', [])} - after_instruments = {i['id']: i for i in after.get('instruments', [])} - same(len(before['measures']), len(after['measures']), 'measure count') - for original, rendered in zip(before['measures'], after['measures']): - location = original['id'] - for field in ('duration', 'key', 'meter', 'clef', 'transpose', 'attributes'): - same(original[field], rendered[field], f'{location} {field}') - same({'capo': 0, **original['staff_details']}, {'capo': 0, **rendered['staff_details']}, f'{location} staff details') - for side, style in original.get('barlines', {}).items(): - same(style, rendered.get('barlines', {}).get(side, 'regular'), f'{location} {side} barline') - same(original.get('tempos', []), rendered.get('tempos', []), f'{location} tempos') - same(original.get('section_label', ''), rendered.get('section_label', ''), f'{location} section label') - same(len(original['harmonies']), len(rendered['harmonies']), f'{location} harmony count') - for a, b in zip(original['harmonies'], rendered['harmonies']): - for field in ('root', 'bass', 'onset'): - same(a.get(field), b.get(field), f'{location} harmony {field}') - same(harmony.degrees(a), harmony.degrees(b), f'{location} harmony degrees') - same(len(original['voices']), len(rendered['voices']), f'{location} voice count') - for first, second in zip(original['voices'], rendered['voices']): - same(len(first['notes']), len(second['notes']), f'{location} voice {first["id"]} event count') - for a, b in zip(first['notes'], second['notes']): - event_location = f'{location}, voice {first["id"]}, {a["id"]}' - for field in ('kind', 'onset', 'duration', 'written', 'hidden'): - same(a[field], b[field], f'{event_location} {field}') - for field in ('grace', 'cue', 'measure_rest', 'rest_position', 'lyrics'): - same(a.get(field), b.get(field), f'{event_location} {field}') - for field in ('stem', 'beams', 'notehead'): - if field in a: - same(a[field], b.get(field), f'{event_location} explicit {field}') - same(len(a['pitches']), len(b['pitches']), f'{event_location} chord tone count') - for p, q in zip(a['pitches'], b['pitches']): - if p.get('instrument') and 'unpitched' in p: - first_instrument = before_instruments[p['instrument']] - second_instrument = after_instruments.get(q.get('instrument'), {}) - same(first_instrument.get('midi', {}).get('midi-unpitched'), second_instrument.get('midi', {}).get('midi-unpitched'), f'{event_location} percussion instrument') - for field in ('letter', 'alter', 'octave', 'duration', 'written', 'unpitched', 'tablature', 'notehead', 'cue'): - same(p.get(field), q.get(field), f'{event_location} pitch {field}') - for field in ('stem', 'print'): - if field in p: - same(p[field], q.get(field), f'{event_location} pitch {field}') - for field in ('tie_from', 'tie_to'): - same(bool(p.get(field)), bool(q.get(field)), f'{event_location} {field}') - if display := p.get('accidental_display'): - other = q.get('accidental_display', {}) - same(display.get('name'), other.get('name'), f'{event_location} accidental') - for field in ('parentheses', 'bracket'): - same(display.get(field, 'no'), other.get(field, 'no'), f'{event_location} accidental {field}') - for field in ('cautionary', 'editorial'): - if field in display: - same(display[field], other.get(field, 'no'), f'{event_location} accidental {field}') - if tremolo := a.get('tremolo'): - other = b.get('tremolo', {}) - for field in ('type', 'marks'): - same(tremolo[field], other.get(field), f'{event_location} tremolo {field}') - if 'partner' in tremolo: - same(before_positions.get(tremolo['partner']), after_positions.get(other.get('partner')), f'{event_location} tremolo partner') - same(len(before.get('tuplets', [])), len(after.get('tuplets', [])), 'tuplet count') - for a, b in zip(before.get('tuplets', []), after.get('tuplets', [])): - for field in ('note_count', 'space_count', 'depth', 'show_number', 'show_type'): - same(a.get(field), b.get(field), f'{a["id"]} {field}') - if a['bracket'] != 'auto': - same(a['bracket'], b['bracket'], f'{a["id"]} bracket') - same(tuplet_members(before, a['id']), tuplet_members(after, b['id']), f'{a["id"]} members') - for endpoint in ('start', 'end'): - same(before_positions[a[endpoint]], after_positions[b[endpoint]], f'{a["id"]} {endpoint}') - for field in ('tuplet_actual', 'tuplet_normal'): - if a.get(field, {}).get('type'): - same(a[field], b.get(field), f'{a["id"]} {field}') - same([{k: v for k, v in s.items() if k != 'id'} for s in before.get('octave_shifts', [])], - [{k: v for k, v in s.items() if k != 'id'} for s in after.get('octave_shifts', [])], 'octave spans') +def audit_layout(document: dict, layout: LayoutDocument, fonts: Fonts) -> None: + index = ScoreIndex(document) + fragments, primitives = {}, {} + previous_end = Fraction() + for page in layout.pages: + for item in page.primitives: + if not item.box.finite(): + raise EngravingError(f'{item.sources}: non-finite or inverted primitive geometry') + if item.box.left < 4 or item.box.top < 4 or item.box.right > page.width - 4 or item.box.bottom > page.height - 4: + raise EngravingError(f'{item.sources}, {item.role}: primitive outside page bounds') + if item.kind == 'glyph': + actual = fonts.glyph_box(item.value, item.size).moved(*item.points[0]) + if any(abs(a - b) > 0.001 for a, b in zip((actual.left, actual.top, actual.right, actual.bottom), (item.box.left, item.box.top, item.box.right, item.box.bottom))): + raise EngravingError(f'{item.sources}: glyph bounds disagree with its actual outline') + for source in item.sources: + primitives.setdefault(source, []).append(item) + for system in page.systems: + if system.start != previous_end or system.end <= system.start: + raise EngravingError('layout systems do not partition the score timeline') + previous_end = system.end + baseline = max(p.points[0][1] for p in system.primitives if p.role == 'staff') + for anchor in system.anchors: + if anchor.fragment.kind == 'tone': + expected = index.pitch_position(index.tones[anchor.source][1], anchor.time) + if abs(anchor.y - (baseline - expected * layout.style.space / 2)) > 0.01: + raise EngravingError(f'{anchor.source}: displayed staff position changed pitch') + role = 'tab' if anchor.fragment.kind == 'tone' and index.state(anchor.time)['clef']['sign'] == 'TAB' else 'head' if anchor.fragment.kind == 'tone' else anchor.fragment.kind + candidates = [p for p in system.primitives if p.role == role and anchor.source in p.sources and abs(p.points[0][0] - anchor.x) < 0.01] + if not candidates: + raise EngravingError(f'{anchor.source}: visible anchor has no corresponding drawing primitive') + if role == 'head' and candidates[0].kind == 'glyph': + event, tone = index.tones[anchor.source] + expected_glyph = head_glyph({'type': anchor.fragment.written_type}, tone.get('notehead', event.value.get('notehead'))) + if candidates[0].value != expected_glyph: + raise EngravingError(f'{anchor.source}: notehead changed written duration or shape') + for fragment in system.fragments: + fragments.setdefault(fragment.source, []).append(fragment) + # Staff, ledger, stem, beam and tie contacts are intentional. Distinct + # noteheads, accidentals and text in the same lane must remain separate. + checked = [p for p in system.primitives if p.role in ('head', 'tab', 'accidental', 'harmony', 'lyric')] + for i, item in enumerate(checked): + for other in checked[i + 1:]: + if set(item.sources) & set(other.sources): + continue + if item.role != other.role and {item.role, other.role} - {'head', 'tab', 'accidental'}: + continue + if item.box.overlaps(other.box, 0.1): + raise EngravingError(f'{item.sources} and {other.sources}: colliding {item.role}/{other.role}') + if previous_end != index.end: + raise EngravingError('layout omits the end of the score') + for event in index.events: + note = event.value + for source in note['pitches'] or [note]: + identifier = source['id'] + pieces = sorted(fragments.get(identifier, []), key=lambda f: f.start) + if not pieces: + raise EngravingError(f'{identifier}: missing notation fragments') + cursor = event.start + for fragment in pieces: + expected_visible = not note.get('hidden') and note['kind'] != 'spacer' and source.get('print', {}).get('print-object') != 'no' + if isinstance(source.get('notehead'), dict) and source['notehead'].get('name') == 'none': + expected_visible = False + if fragment.visible != expected_visible: + raise EngravingError(f'{identifier}: notation visibility changed') + if fragment.start != cursor: + raise EngravingError(f'{identifier}: fragments overlap or omit metric time') + cursor = fragment.end + expected = TYPE_LENGTHS[fragment.written_type] * (2 - Fraction(1, 2 ** fragment.dots)) * fragment.ratio + if not note.get('grace') and not note.get('measure_rest') and fragment.length() != expected: + raise EngravingError(f'{identifier}: written fragment duration is inexact') + if fragment.visible and not any(p.role in ('head', 'tab', 'rest', 'slash') for p in primitives.get(identifier, [])): + raise EngravingError(f'{identifier}: visible notation has no drawing primitive') + if cursor != event.start + fraction(source['duration']): + raise EngravingError(f'{identifier}: rendered duration changed') + if any(f.visible for f in pieces) and identifier in index.tones and index.accidentals[identifier]: + if not any(p.role == 'accidental' for p in primitives.get(identifier, [])): + raise EngravingError(f'{identifier}: required accidental was omitted') + if identifier in index.tones and source.get('tie_to') and any(f.visible for f in pieces): + if not any(p.role == 'tie' for p in primitives.get(identifier, [])): + raise EngravingError(f'{identifier}: tie was omitted') + if not note.get('hidden'): + for verse in note.get('lyrics', []): + text = ''.join(s['text'] for s in verse['syllables'] if s['kind'] in ('text', 'elision')) + identifier = note['id'] + ':lyric:' + verse['number'] + if text and not any(p.role == 'lyric' and p.value == text for p in primitives.get(identifier, [])): + raise EngravingError(f'{identifier}: lyric text was omitted or changed') + for _, _, measure in index.measures: + for value in measure['harmonies']: + label = harmony.symbol(value) + if value.get('chord_optional'): + label = '(' + label + ')' + if not any(p.role == 'harmony' and p.value == label for p in primitives.get(value['id'], [])): + raise EngravingError(f'{value["id"]}: harmony was omitted') + for i, _ in enumerate(measure.get('tempos', [])): + if not any(p.role == 'tempo' for p in primitives.get(measure['id'] + f':tempo:{i}', [])): + raise EngravingError(f'{measure["id"]}: tempo was omitted') + for span in index.staff.get('tuplets', []): + if span.get('show_number', 'actual') != 'none' or span.get('bracket', 'auto') != 'no': + if not any(p.role.startswith('tuplet-') for p in primitives.get(span['id'], [])): + raise EngravingError(f'{span["id"]}: tuplet was omitted') + for span in index.staff.get('octave_shifts', []): + if not any(p.role == 'octave-shift' for p in primitives.get(span['id'], [])): + raise EngravingError(f'{span["id"]}: octave shift was omitted') diff --git a/generator/engraving/fonts.py b/generator/engraving/fonts.py new file mode 100644 index 0000000..af91a71 --- /dev/null +++ b/generator/engraving/fonts.py @@ -0,0 +1,83 @@ +from __future__ import annotations + +from dataclasses import asdict +import hashlib +import json +from pathlib import Path + +from fontTools.pens.boundsPen import BoundsPen +from fontTools.pens.recordingPen import DecomposingRecordingPen +from fontTools.ttLib import TTFont +from PIL import ImageFont + +from generator.engraving.types import Box, EngravingError, Primitive, Style + +class Fonts: + def __init__(self, root: Path): + self.root = root + try: + self.music = TTFont(root / 'Petaluma.otf') + self.script = TTFont(root / 'PetalumaScript.otf') + self.metadata = json.loads((root / 'petaluma_metadata.json').read_text()) + self.names = json.loads((root / 'smufl_glyphnames.json').read_text()) + except (OSError, ValueError) as error: + raise EngravingError(f'cannot load bundled engraving fonts: {error}') from error + self.names.update(self.metadata.get('optionalGlyphs', {})) + self.cmap = self.music.getBestCmap() + self.text_cmap = self.script.getBestCmap() + self.glyphs = self.music.getGlyphSet() + self.units = self.music['head'].unitsPerEm / 4 + self.metrics = {} + self.outlines = {} + self.text_fonts = {} + def fingerprint(self, style: Style) -> str: + digest = hashlib.sha256(json.dumps(asdict(style), sort_keys=True).encode()) + for name in ('Petaluma.otf', 'PetalumaScript.otf', 'petaluma_metadata.json', 'smufl_glyphnames.json'): + digest.update(name.encode()) + digest.update((self.root / name).read_bytes()) + return digest.hexdigest() + def glyph_name(self, name: str) -> str: + if name not in self.names: + raise EngravingError(f'unknown SMuFL glyph {name!r}') + code = int(self.names[name]['codepoint'].removeprefix('U+'), 16) + if code not in self.cmap: + raise EngravingError(f'Petaluma is missing requested SMuFL glyph {name!r}') + return self.cmap[code] + def glyph_box(self, name: str, size: float) -> Box: + if name not in self.metrics: + pen = BoundsPen(self.glyphs) + self.glyphs[self.glyph_name(name)].draw(pen) + if pen.bounds is None: + raise EngravingError(f'empty SMuFL glyph {name!r}') + self.metrics[name] = pen.bounds + left, bottom, right, top = self.metrics[name] + scale = size / self.units + return Box(left * scale, -top * scale, right * scale, -bottom * scale) + def outline(self, name: str): + if name not in self.outlines: + pen = DecomposingRecordingPen(self.glyphs) + self.glyphs[self.glyph_name(name)].draw(pen) + self.outlines[name] = pen + return self.outlines[name] + def glyph(self, name: str, x: float, y: float, size: float, role: str, sources: tuple[str, ...]) -> Primitive: + return Primitive('glyph', role, sources, self.glyph_box(name, size).moved(x, y), ((x, y),), name, size) + def anchor(self, name: str, anchor: str, size: float) -> tuple[float, float]: + value = self.metadata.get('glyphsWithAnchors', {}).get(name, {}).get(anchor) + if value is None: + box = self.glyph_box(name, size) + return (box.right, 0) if 'Up' in anchor else (box.left, 0) + return value[0] * size, -value[1] * size + def text_font(self, size: float): + pixels = max(1, round(size)) + if pixels not in self.text_fonts: + self.text_fonts[pixels] = ImageFont.truetype(str(self.root / 'PetalumaScript.otf'), pixels) + return self.text_fonts[pixels] + def text(self, value: str, x: float, y: float, size: float, role: str, sources: tuple[str, ...], center: bool = False) -> Primitive: + missing = [c for c in value if ord(c) not in self.text_cmap and not c.isspace()] + if missing: + raise EngravingError(f'Petaluma Script is missing text glyph {missing[0]!r}') + font = self.text_font(size * 4) + left, top, right, bottom = font.getbbox(value, anchor='ls') + offset = (left + right) / 8 if center else 0 + x -= offset + return Primitive('text', role, sources, Box(x + left / 4, y + top / 4, x + right / 4, y + bottom / 4), ((x, y),), value, size) diff --git a/generator/engraving/layout.py b/generator/engraving/layout.py new file mode 100644 index 0000000..3f2c425 --- /dev/null +++ b/generator/engraving/layout.py @@ -0,0 +1,231 @@ +from __future__ import annotations + +from dataclasses import replace +from fractions import Fraction +import math + +from generator import harmony +from generator.model import fraction, validate_document +from generator.engraving.attributes import barline, staff_attributes, tempo +from generator.engraving.fonts import Fonts +from generator.engraving.notation import ScoreIndex +from generator.engraving.notes import draw_event +from generator.engraving.spans import draw_beams, draw_lyric_spans, draw_spans, place_text_lanes +from generator.engraving.types import Anchor, EngravingError, Fragment, LayoutDocument, Page, Primitive, Style, System, bounds, line + +def lyric_text(verse: dict) -> str: + return ''.join(s['text'] for s in verse['syllables'] if s['kind'] in ('text', 'elision')) + +def column(index: ScoreIndex, time: Fraction, start: Fraction, end: Fraction, fonts: Fonts, style: Style) -> tuple[list[Primitive], list[Anchor], list[Fragment]]: + items, anchors, fragments = [], [], [] + events = [e for e in index.events if e.start == time or (time == start and e.start < start < e.end)] + grace_width = 0 + occupied = [] + for event in events: + try: + drawn, placed, pieces = draw_event(index, event, start, end, fonts, style) + except ValueError as error: + raise EngravingError(f'measure {event.measure["number"]}, voice {event.voice}, {event.value["id"]}: {error}') from error + x = grace_width + collidable = [p for p in drawn if p.role in ('head', 'tab', 'rest', 'slash', 'accidental', 'dot')] + while any(p.box.moved(x, 0).overlaps(q.box, 2) for p in collidable for q in occupied): + x += style.space * 1.4 + drawn = [p.moved(x, 0) for p in drawn] + placed = [a.moved(x, 0) for a in placed] + if event.value.get('grace'): + grace_width = max((p.box.right for p in drawn), default=grace_width) + 9 + occupied.extend(p for p in drawn if p.role in ('head', 'tab', 'rest', 'slash', 'accidental', 'dot')) + items.extend(drawn) + anchors.extend(placed) + fragments.extend(pieces) + if event.start == time and not event.value.get('hidden'): + verses = event.value.get('lyrics', []) + for verse in verses: + lane = index.lyric_lanes.index((event.voice, verse['number'])) + text = lyric_text(verse) + if text: + items.append(fonts.text(text, x + style.space / 2, lane * 23, 18, 'lyric', (event.value['id'] + ':lyric:' + verse['number'], event.value['id']), True)) + for measure_start, measure_end, measure in index.measures: + if not measure_start <= time < measure_end: + continue + for item in measure['harmonies']: + if measure_start + fraction(item['onset']) == time: + label = harmony.symbol(item) + if item.get('chord_optional'): + label = '(' + label + ')' + items.append(fonts.text(label, 0, 0, 21, 'harmony', (item['id'],))) + for i, value in enumerate(measure.get('tempos', [])): + if measure_start + fraction(value['onset']) == time: + items.extend(tempo(value, fonts, 0, 0, style.space, measure['id'] + f':tempo:{i}')) + if time == measure_start: + items.append(fonts.text(str(measure['number']), 0, -style.space * (index.state(time)['staff_details']['lines'] + 0.5), 12, 'measure-number', (measure['id'],))) + if label := measure.get('section_label'): + items.append(fonts.text(label, 0, 0, 19, 'section', (measure['id'] + ':section',))) + return items, anchors, fragments + +def make_system(index: ScoreIndex, start: Fraction, end: Fraction, fonts: Fonts, style: Style, justify: bool = False) -> System: + items, anchors, fragments = [], [], [] + state = index.state(start) + measure = next(m for a, b, m in index.measures if a <= start < b) + header = staff_attributes(index, state, start, fonts, style.space, measure['id'] + ':initial', ('clef', 'key', 'meter', 'staff_details')) + items.extend(header) + cursor = max((p.box.right for p in header), default=0) + 22 + content_left = cursor - 9 + times = sorted({start} | {t for t in index.columns if start < t < end}) + placements = [] + groups = [] + for ti, time in enumerate(times): + item_start, anchor_start = len(items), len(anchors) + drawn, placed, pieces = column(index, time, start, end, fonts, style) + leading = [] + for measure_start, measure_end, m in index.measures: + if time == measure_start and time > start: + previous = next(previous for a, b, previous in index.measures if b == time) + leading.extend(barline(previous.get('barlines', {}).get('right', 'regular'), 0, -style.space * (index.state(time)['staff_details']['lines'] - 1), previous['id'])) + old_state = index.state(time, before=True) + fields = tuple(k for k in ('clef', 'key', 'meter', 'staff_details') if old_state[k] != index.state(time)[k]) + leading.extend(p.moved(12, 0) for p in staff_attributes(index, index.state(time), time, fonts, style.space, m['id'] + ':initial', fields)) + for ci, change in enumerate(m.get('attributes', [])): + if measure_start + fraction(change['onset']) == time and time > start: + extra = staff_attributes(index, index.state(time), time, fonts, style.space, m['id'] + f':attributes:{ci}', tuple(change)) + leading.extend(p.moved(max((p.box.right for p in leading), default=0) + 10, 0) for p in extra) + if leading: + width = bounds(leading).right - bounds(leading).left + 14 + items.extend(p.moved(cursor - bounds(leading).left, 0) for p in leading) + cursor += width + box = bounds(drawn) + x = cursor - min(0, box.left) + placements.append((time, x)) + items.extend(p.moved(x, 0) for p in drawn) + anchors.extend(a.moved(x, 0) for a in placed) + fragments.extend(pieces) + next_time = times[ti + 1] if ti + 1 < len(times) else end + spring = style.column_gap + 13 * math.sqrt(min(4, float(next_time - time))) + cursor = x + max(style.space * 1.4, box.right) + spring + groups.append((item_start, len(items), anchor_start, len(anchors))) + width = cursor + 6 + available = style.width - style.margin_x * 2 + if justify and width < available: + stretch = (available - width) / max(1, len(times)) + for i, (first_item, last_item, first_anchor, last_anchor) in enumerate(groups): + items[first_item:last_item] = [p.moved(i * stretch, 0) for p in items[first_item:last_item]] + anchors[first_anchor:last_anchor] = [a.moved(i * stretch, 0) for a in anchors[first_anchor:last_anchor]] + placements = [(time, x + i * stretch) for i, (time, x) in enumerate(placements)] + width = available + right = width - 5 + items = draw_beams(index, anchors, items, start, end, content_left, right, style) + items = draw_spans(index, anchors, items, start, end, content_left, right, fonts, style) + items = place_text_lanes(items, fonts, style) + items = draw_lyric_spans(index, items, anchors, start, end, content_left, right, fonts) + # Staff lines are interrupted behind TAB numerals, not painted through them. + changes = [(0, state['staff_details']['lines'])] + for time, x in placements: + lines = index.state(time)['staff_details']['lines'] + if changes[-1][1] != lines: + changes.append((x - 8, lines)) + staff_lines = [] + for i, (x1, lines) in enumerate(changes): + x2 = changes[i + 1][0] if i + 1 < len(changes) else width - 1 + for number in range(lines): + y = -number * style.space + cuts = sorted((max(x1, p.box.left - 2), min(x2, p.box.right + 2)) for p in items if p.role == 'tab' and p.box.top <= y <= p.box.bottom and p.box.left < x2 and p.box.right > x1) + cursor = x1 + for a, b in cuts + [(x2, x2)]: + if a > cursor: + staff_lines.append(line('staff', (), ((cursor, y), (a, y)), style.space * 0.13)) + cursor = max(cursor, b) + items = staff_lines + items + last_measure = next(m for a, b, m in index.measures if a < end <= b) + if end in index.boundaries: + items.extend(barline(last_measure.get('barlines', {}).get('right', 'regular'), width - 1, -style.space * (index.state(end, before=True)['staff_details']['lines'] - 1), last_measure['id'])) + if start in index.boundaries: + items.extend(barline(measure.get('barlines', {}).get('left', 'none'), 0, -style.space * (state['staff_details']['lines'] - 1), measure['id'])) + else: + items.append(fonts.text(str(measure['number']) + ' (cont.)', 0, min(p.box.top for p in items) - 6, 12, 'continuation', (measure['id'],))) + return System(start, end, tuple(items), tuple(anchors), tuple(fragments), bounds(items)) + +def paginate(systems: list[System], document: dict, fonts: Fonts, style: Style) -> tuple[Page, ...]: + pages = [] + placed = [] + header = [] + cursor = style.margin_y + first = True + + def page_header(number): + title = document['metadata']['title'] + size = 26 if number == 1 else 17 + item = fonts.text(title, style.margin_x, style.margin_y + size, size, 'title', ()) + while item.box.right > style.width - style.margin_x and size > 12: + size -= 1 + item = fonts.text(title, style.margin_x, style.margin_y + size, size, 'title', ()) + if item.box.right > style.width - style.margin_x: + raise EngravingError('score title cannot fit the page without clipping') + result = [item] + if number == 1: + subtitle = ' - '.join(str(value) for value in (document['metadata'].get('composer'), document['staves'][0].get('name'), document['metadata'].get('style')) if value) + if subtitle: + result.append(fonts.text(subtitle, style.margin_x, item.box.bottom + 22, 16, 'subtitle', ())) + return result + + for system in systems: + height = system.box.bottom - system.box.top + if first: + header = page_header(len(pages) + 1) + cursor = bounds(header).bottom + 24 + first = False + if cursor + height > style.height - style.margin_y - 18: + if not placed: + raise EngravingError(f'at musical offset {system.start}: simultaneous notation needs {height:.1f}px vertically; fixed-size page cannot fit it') + number = len(pages) + 1 + footer = fonts.text(str(number), style.width / 2, style.height - style.margin_y, 12, 'page-number', (), True) + pages.append(Page(number, style.width, style.height, style.supersampling, tuple(placed), tuple(header + [p for s in placed for p in s.primitives] + [footer]))) + placed = [] + header = page_header(len(pages) + 1) + cursor = bounds(header).bottom + 24 + if cursor + height > style.height - style.margin_y - 18: + raise EngravingError(f'at musical offset {system.start}: simultaneous notation is too tall for a page') + dx, dy = style.margin_x + 1, cursor - system.box.top + moved = replace(system, primitives=tuple(p.moved(dx, dy) for p in system.primitives), anchors=tuple(a.moved(dx, dy) for a in system.anchors), box=system.box.moved(dx, dy)) + placed.append(moved) + cursor += height + style.system_gap + if placed: + number = len(pages) + 1 + footer = fonts.text(str(number), style.width / 2, style.height - style.margin_y, 12, 'page-number', (), True) + pages.append(Page(number, style.width, style.height, style.supersampling, tuple(placed), tuple(header + [p for s in placed for p in s.primitives] + [footer]))) + return tuple(pages) + +def layout_score(document: dict, style: Style, fonts: Fonts) -> LayoutDocument: + validate_document(document) + index = ScoreIndex(document) + if not index.measures: + raise EngravingError('score has no measures') + systems = [] + start = Fraction() + available = style.width - style.margin_x * 2 + while start < index.end: + candidates = sorted(b for b in index.boundaries if b > start) + selected = None + # Reserve the same title/credit and footer bands when considering a split, + # so a wide pitch range can break vertically as well as horizontally. + height_limit = style.height - style.margin_y * 2 - 110 + for end in candidates: + trial = make_system(index, start, end, fonts, style) + if trial.box.right - trial.box.left > available or trial.box.bottom - trial.box.top > height_limit: + break + selected = trial + if selected is None: + measure_end = candidates[0] + for end in sorted(t for t in index.columns if start < t < measure_end): + trial = make_system(index, start, end, fonts, style) + if trial.box.right - trial.box.left <= available and trial.box.bottom - trial.box.top <= height_limit: + selected = trial + else: + break + if selected is None: + raise EngravingError(f'at musical offset {start}: irreducible simultaneous content exceeds the page width or height') + systems.append(make_system(index, start, selected.end, fonts, style, justify=selected.end < index.end)) + start = selected.end + layout = LayoutDocument(paginate(systems, document, fonts, style), style, fonts.fingerprint(style)) + from generator.engraving.audit import audit_layout + audit_layout(document, layout, fonts) + return layout diff --git a/generator/engraving/notation.py b/generator/engraving/notation.py new file mode 100644 index 0000000..ba36605 --- /dev/null +++ b/generator/engraving/notation.py @@ -0,0 +1,173 @@ +from __future__ import annotations + +from dataclasses import dataclass +from bisect import bisect_left, bisect_right +from fractions import Fraction + +from generator.model import LETTERS, NOTE_TYPES, alteration, fraction, written_for +from generator.engraving.fonts import Fonts +from generator.engraving.types import EngravingError, Primitive, bounds + +ACCIDENTAL_GLYPHS = {Fraction(0): 'accidentalNatural', Fraction(1): 'accidentalSharp', Fraction(-1): 'accidentalFlat', Fraction(2): 'accidentalDoubleSharp', Fraction(-2): 'accidentalDoubleFlat', Fraction(3): 'accidentalTripleSharp', Fraction(-3): 'accidentalTripleFlat', Fraction(1, 2): 'accidentalQuarterToneSharpStein', Fraction(-1, 2): 'accidentalQuarterToneFlatStein', Fraction(3, 2): 'accidentalThreeQuarterTonesSharpStein', Fraction(-3, 2): 'accidentalThreeQuarterTonesFlatZimmermann'} +HEADS = {'x': 'X', 'diamond': 'Diamond', 'triangle': 'TriangleUp', 'inverted triangle': 'TriangleDown', 'circle-x': 'CircleX', 'cross': 'Plus', 'slash': 'Slash', 'normal': '', 'do': 'TriangleUp', 're': 'Moon', 'mi': 'Diamond', 'fa': 'TriangleRight', 'fa up': 'TriangleLeft', 'so': 'Round', 'la': 'Square', 'ti': 'TriangleRoundDown', 'rectangle': 'Square', 'square': 'Square', 'arrow down': 'LargeArrowDown', 'arrow up': 'LargeArrowUp'} + +@dataclass(frozen=True) +class Event: + measure: dict + voice: str + lane: int + lanes: int + start: Fraction + end: Fraction + value: dict + +class ScoreIndex: + def __init__(self, document: dict): + self.staff = document['staves'][0] + self.measures = [] + self.events = [] + self.by_id = {} + self.tones = {} + self.boundaries = {Fraction()} + self.columns = {Fraction()} + self._states = {} + self._beam_groups = None + time = Fraction() + for measure in self.staff['measures']: + end = time + fraction(measure['duration']) + self.measures.append((time, end, measure)) + self.boundaries.add(end) + self.columns.update((time, end)) + for lane, voice in enumerate(measure['voices']): + for note in voice['notes']: + onset = time + fraction(note['onset']) + event = Event(measure, voice['id'], lane, len(measure['voices']), onset, onset + fraction(note['duration']), note) + self.events.append(event) + self.by_id[note['id']] = event + self.columns.add(onset) + for tone in note['pitches']: + self.tones[tone['id']] = (event, tone) + for field in ('attributes', 'harmonies', 'tempos'): + self.columns.update(time + fraction(item['onset']) for item in measure.get(field, [])) + time = end + self.end = time + self.measure_starts = [item[0] for item in self.measures] + self.events.sort(key=lambda e: (e.start, not bool(e.value.get('grace')), e.lane)) + self.lyric_lanes = list(dict.fromkeys((e.voice, verse['number']) for e in self.events for verse in e.value.get('lyrics', []))) + self.accidentals = self.accidental_state() + def state(self, time: Fraction, before: bool = False) -> dict: + if (time, before) in self._states: + return self._states[time, before] + position = bisect_left(self.measure_starts, time) if before else bisect_right(self.measure_starts, time) + start, _, measure = self.measures[max(0, position - 1)] + state = {key: measure[key] for key in ('key', 'meter', 'clef', 'transpose', 'staff_details')} + for change in measure.get('attributes', []): + onset = start + fraction(change['onset']) + if onset < time or (onset == time and not before): + state.update({key: value for key, value in change.items() if key != 'onset'}) + self._states[time, before] = state + return state + def pitch_position(self, tone: dict, time: Fraction) -> float: + state = self.state(time) + clef = state['clef'] + if clef['sign'] == 'TAB': + if 'tablature' not in tone: + raise EngravingError(f'{tone["id"]}: TAB notes require explicit string and fret') + string = tone['tablature']['string'] + if not 1 <= string <= state['staff_details']['lines']: + raise EngravingError(f'{tone["id"]}: TAB string is outside the staff') + return 2 * (state['staff_details']['lines'] - string) + pitch = tone.get('unpitched', tone) + sign = clef['sign'] + reference = {'G': 4 * 7 + 4, 'F': 3 * 7 + 3, 'C': 4 * 7}.get(sign, 4 * 7 + 4) + clef_line = clef.get('line', 2) if sign in ('G', 'F', 'C') else 2 + octave = 0 if 'unpitched' in tone else clef.get('octave_change', 0) + shift = sum(s['octaves'] for s in self.staff.get('octave_shifts', []) if fraction(s['start']) <= time < fraction(s['end'])) if 'unpitched' not in tone else 0 + return pitch['octave'] * 7 + LETTERS.index(pitch['letter']) + 7 * (shift - octave) - reference + 2 * (clef_line - 1) + def accidental_state(self) -> dict[str, bool]: + result = {} + for start, end, measure in self.measures: + memory = {} + key = None + onsets = sorted({e.start for e in self.events if start <= e.start < end}) + for onset in onsets: + state = self.state(onset) + if key != state['key']: + key, memory = state['key'], {} + simultaneous = {} + for event in (e for e in self.events if e.start == onset): + for tone in event.value['pitches']: + hidden_head = isinstance(tone.get('notehead'), dict) and tone['notehead'].get('name') == 'none' + if event.value.get('hidden') or tone.get('print', {}).get('print-object') == 'no' or hidden_head: + result[tone['id']] = False + continue + if 'unpitched' in tone or state['clef']['sign'] == 'TAB': + result[tone['id']] = False + continue + identity = (tone['letter'], tone['octave']) + value = alteration(tone['alter']) + signature = Fraction() if key.get('custom') else alteration(key['alterations'][LETTERS.index(tone['letter'])]) + for step in key.get('steps', []): + if step['letter'] == tone['letter'] and step.get('octave', tone['octave']) == tone['octave']: + signature = alteration(step['alter']) + result[tone['id']] = bool(tone.get('accidental_display')) or (not tone.get('tie_from') and memory.get(identity, signature) != value) + simultaneous.setdefault(identity, set()).add(value) + for identity, values in simultaneous.items(): + memory[identity] = next(iter(values)) if len(values) == 1 else None + if any(len(values) > 1 for values in simultaneous.values()): + for event in (e for e in self.events if e.start == onset): + for tone in event.value['pitches']: + if 'letter' in tone and len(simultaneous.get((tone['letter'], tone['octave']), ())) > 1: + result[tone['id']] = True + return result + +def fragment_written(written: dict, original_start: Fraction, original_end: Fraction, start: Fraction, end: Fraction) -> dict: + return written if (original_start, original_end) == (start, end) else written_for(end - start) + +def flags(written: dict) -> int: + return max(0, NOTE_TYPES.index(written['type']) - NOTE_TYPES.index('quarter')) + +def head_glyph(written: dict, head: dict | str | None) -> str: + head = {'name': head} if isinstance(head, str) else head or {'name': 'normal'} + if head.get('smufl'): + return head['smufl'] + name = head['name'] + if name == 'none': + return '' + kind = written['type'] + suffix = 'DoubleWhole' if kind in ('maxima', 'long', 'breve') else 'Whole' if kind == 'whole' else 'Half' if kind == 'half' else 'Black' + if head.get('filled') in ('yes', 'no'): + suffix = 'Black' if head['filled'] == 'yes' else 'Half' + if name == 'slash': + return {'DoubleWhole': 'noteheadSlashWhiteDoubleWhole', 'Whole': 'noteheadSlashWhiteWhole', 'Half': 'noteheadSlashWhiteHalf', 'Black': 'noteheadSlashVerticalEnds'}[suffix] + if name in ('slashed', 'back slashed'): + return 'noteheadSlashed' + suffix + ('1' if name == 'slashed' else '2') + if name in ('circled', 'circle dot'): + return 'noteheadCircled' + suffix + if name not in HEADS: + raise EngravingError(f'no SMuFL mapping for notehead {name!r}; specify its smufl glyph name') + shape = HEADS[name] + if shape in ('Moon', 'Round', 'Square', 'TriangleRight', 'TriangleLeft', 'TriangleRoundDown'): + suffix = 'Black' if suffix == 'Black' else 'White' + return 'notehead' + shape + suffix + +def accidental(fonts: Fonts, value: Fraction, display: dict, size: float, sources: tuple[str, ...]) -> list[Primitive]: + glyph = display.get('smufl') or ACCIDENTAL_GLYPHS.get(value) + special = {'natural-sharp': ('accidentalNatural', 'accidentalSharp'), 'natural-flat': ('accidentalNatural', 'accidentalFlat')} + if display.get('name') in special and not display.get('smufl'): + items = [] + x = 0 + for name in special[display['name']]: + part = fonts.glyph(name, x, 0, size, 'accidental', sources) + items.append(part) + x = part.box.right + 2 + elif glyph: + items = [fonts.glyph(glyph, 0, 0, size, 'accidental', sources)] + else: + sign = '+' if value > 0 else '' + items = [fonts.text(f'({sign}{value} st)', 0, 0, size * 1.15, 'accidental', sources)] + if display.get('parentheses') == 'yes' or display.get('bracket') == 'yes': + box = bounds(items) + left, right = ('[', ']') if display.get('bracket') == 'yes' else ('(', ')') + items.extend((fonts.text(left, box.left - 7, size / 2, size * 1.8, 'accidental', sources), fonts.text(right, box.right + 2, size / 2, size * 1.8, 'accidental', sources))) + return items diff --git a/generator/engraving/notes.py b/generator/engraving/notes.py new file mode 100644 index 0000000..5a0cdcc --- /dev/null +++ b/generator/engraving/notes.py @@ -0,0 +1,164 @@ +from __future__ import annotations + +from fractions import Fraction + +from generator.model import alteration, fraction +from generator.engraving.fonts import Fonts +from generator.engraving.notation import Event, ScoreIndex, accidental, flags, fragment_written, head_glyph +from generator.engraving.types import Anchor, Fragment, Primitive, Style, bounds, line + +def dots(fonts: Fonts, count: int, x: float, y: float, size: float, sources: tuple[str, ...]) -> list[Primitive]: + result = [] + for i in range(count): + result.append(fonts.glyph('augmentationDot', x + i * size * 0.6, y, size, 'dot', sources)) + return result + +def rest_glyph(kind: str) -> str: + return {'maxima': 'restMaxima', 'long': 'restLonga', 'breve': 'restDoubleWhole', 'whole': 'restWhole', 'half': 'restHalf', 'quarter': 'restQuarter', 'eighth': 'rest8th'}.get(kind, 'rest' + kind) + +def time_modification(written: dict, items: list[Primitive], fonts: Fonts, sources: tuple[str, ...]) -> None: + ratio = fraction(written.get('ratio', {'numerator': 1, 'denominator': 1})) + if ratio != 1 and items: + box = bounds(items) + items.append(fonts.text(f'{ratio.denominator}:{ratio.numerator}', (box.left + box.right) / 2, box.top - 6, 13, 'time-modification', sources, True)) + +def draw_event(index: ScoreIndex, event: Event, start: Fraction, end: Fraction, fonts: Fonts, style: Style) -> tuple[list[Primitive], list[Anchor], list[Fragment]]: + note = event.value + onset = max(start, event.start) + finish = min(end, event.end) + visible = not note.get('hidden') and note['kind'] != 'spacer' + references = (note['id'],) + size = style.space * (0.7 if note.get('cue') or note.get('grace') else 1) + items, anchors, fragments = [], [], [] + state = index.state(onset) + lines = state['staff_details']['lines'] + if not note['pitches']: + written = fragment_written(note['written'], event.start, event.end, onset, finish) + y = -style.space * (lines - 1) / 2 + if position := note.get('rest_position'): + y = -index.pitch_position(position, onset) * style.space / 2 + elif event.lanes > 1: + y += (-1 if event.lane % 2 == 0 else 1) * (event.lane // 2 + 1) * style.space * 3 + kind = 'slash' if note.get('notehead') == 'slash' else 'rest' + fragment = Fragment(note['id'], note['id'], onset, finish, written['type'], written.get('dots', 0), fraction(written.get('ratio', {'numerator': 1, 'denominator': 1})), visible, kind, None) + fragments.append(fragment) + if visible: + glyph = head_glyph(written, 'slash') if kind == 'slash' else rest_glyph('whole' if note.get('measure_rest') and onset == event.start and finish == event.end else written['type']) + if written['type'] == 'whole' and not note.get('rest_position') and event.lanes == 1: + y -= style.space + items.append(fonts.glyph(glyph, 0, y, size, kind, references)) + items.extend(dots(fonts, written.get('dots', 0), items[0].box.right + 4, y - size / 2, size, references)) + if kind == 'slash' and written['type'] not in ('whole', 'breve', 'long', 'maxima'): + stem_x = items[0].box.right + stem_y = y - 3 * size + items.append(line('stem', references, ((stem_x, y), (stem_x, stem_y)))) + if flags(written): + flag = 'flag' + ('8th' if written['type'] == 'eighth' else written['type']) + 'Up' + items.append(fonts.glyph(flag, stem_x, stem_y, size, 'flag', references)) + anchors.append(Anchor(note['id'], note['id'], event.voice, onset, finish, 0, y, 0, y - size * 3, -1, 0, fragment)) + if not note.get('tuplet_ids') or written != note['written']: + time_modification(written, items, fonts, references) + return items, anchors, fragments + groups = {} + for tone in note['pitches']: + tone_end = event.start + fraction(tone['duration']) + if tone_end <= start and not note.get('grace'): + continue + written = fragment_written(tone['written'], event.start, tone_end, onset, min(end, tone_end)) + stem = tone.get('stem', note.get('stem', 'auto')) + identity = (written['type'], written.get('dots', 0), str(written.get('ratio')), stem) + groups.setdefault(identity, []).append((tone, written, tone_end)) + group_x = 0 + for members in groups.values(): + positioned = sorted(((index.pitch_position(tone, onset), tone, written, tone_end) for tone, written, tone_end in members), key=lambda item: item[0]) + stem = members[0][0].get('stem', note.get('stem', 'auto')) + direction = -1 if stem in ('up', 'double') else 1 if stem == 'down' else (-1 if event.lane % 2 == 0 else 1) if event.lanes > 1 else (1 if sum(p[0] for p in positioned) / len(positioned) >= lines - 1 else -1) + if direction == 1: + positioned.reverse() + group_items, group_anchors = [], [] + previous = None + displaced = False + accidental_boxes = [] + for position, tone, written, tone_end in positioned: + sources = (note['id'], tone['id']) + tone_size = size * (0.7 if tone.get('cue') and not note.get('cue') else 1) + glyph = head_glyph(written, tone.get('notehead', note.get('notehead'))) + displayed = visible and tone.get('print', {}).get('print-object') != 'no' and bool(glyph) + y = -position * style.space / 2 + if previous is not None and abs(position - previous) < 2: + displaced = not displaced + else: + displaced = False + x = group_x + (tone_size * 1.2 * -direction if displaced else 0) + previous = position + fragment = Fragment(tone['id'], note['id'], onset, min(end, tone_end), written['type'], written.get('dots', 0), fraction(written.get('ratio', {'numerator': 1, 'denominator': 1})), displayed, 'tone', position) + fragments.append(fragment) + if not displayed: + continue + if state['clef']['sign'] == 'TAB': + head = fonts.text(str(tone['tablature']['fret']), x, y + 5, tone_size * 1.5, 'tab', sources) + elif written['type'] in ('long', 'maxima') and tone.get('notehead', {}).get('name', 'normal') == 'normal': + width = tone_size * (2.8 if written['type'] == 'maxima' else 1.4) + head = line('head', sources, ((x, y - tone_size / 2), (x + width, y - tone_size / 2), (x + width, y + tone_size / 2), (x, y + tone_size / 2), (x, y - tone_size / 2)), 2) + else: + head = fonts.glyph(glyph, x, y, tone_size, 'head', sources) + group_items.append(head) + if tone.get('notehead', {}).get('parentheses') == 'yes': + group_items.extend((fonts.text('(', head.box.left - 6, y + 5, 18, 'head-parentheses', sources), fonts.text(')', head.box.right + 2, y + 5, 18, 'head-parentheses', sources))) + if state['clef']['sign'] != 'TAB': + ledger = -2 + while position <= ledger: + group_items.append(line('ledger', sources, ((head.box.left - 5, -ledger * style.space / 2), (head.box.right + 5, -ledger * style.space / 2)), 1.8)) + ledger -= 2 + ledger = lines * 2 + while position >= ledger: + group_items.append(line('ledger', sources, ((head.box.left - 5, -ledger * style.space / 2), (head.box.right + 5, -ledger * style.space / 2)), 1.8)) + ledger += 2 + if 'alter' in tone and index.accidentals[tone['id']] and onset == event.start: + accidental_items = accidental(fonts, alteration(tone['alter']), tone.get('accidental_display', {}), tone_size, sources) + box = bounds(accidental_items) + dx = min(group_x, head.box.left) - 5 - box.right + candidate = box.moved(dx, y) + while any(candidate.overlaps(other, 2) for other in accidental_boxes): + dx -= box.right - box.left + 4 + candidate = box.moved(dx, y) + accidental_boxes.append(candidate) + group_items.extend(p.moved(dx, y) for p in accidental_items) + if tone.get('print', {}).get('print-dot') != 'no': + dot_y = y - style.space / 2 if position % 2 == 0 else y + group_items.extend(dots(fonts, written.get('dots', 0), head.box.right + 5, dot_y, tone_size, sources)) + if head.kind == 'glyph': + stem_x = x + fonts.anchor(glyph, 'stemUpSE' if direction == -1 else 'stemDownNW', tone_size)[0] + else: + stem_x = head.box.right - 0.6 if direction == -1 else head.box.left + 0.6 + stem_y = y + direction * max(3.5 * size, (flags(written) + 1) * size * 0.75) + group_anchors.append(Anchor(tone['id'], note['id'], event.voice, onset, min(end, tone_end), x, y, stem_x, stem_y, direction, flags(written), fragment)) + if group_anchors: + stem_y = min(a.stem_y for a in group_anchors) if direction == -1 else max(a.stem_y for a in group_anchors) + anchor = min(group_anchors, key=lambda a: a.y) if direction == 1 else max(group_anchors, key=lambda a: a.y) + written = members[0][1] + if stem != 'none' and written['type'] not in ('whole', 'breve'): + group_items.append(line('stem', references, ((anchor.stem_x, anchor.y), (anchor.stem_x, stem_y)), size * 0.12)) + if stem == 'double': + other_x = anchor.x if direction == -1 else anchor.x + size * 1.3 + other_y = anchor.y - direction * size * 3.5 + group_items.append(line('stem', references, ((other_x, anchor.y), (other_x, other_y)), size * 0.12)) + if flags(written): + flag = 'flag' + ('8th' if written['type'] == 'eighth' else written['type']) + ('Down' if direction == -1 else 'Up') + group_items.append(fonts.glyph(flag, other_x, other_y, size, 'flag', references)) + if flags(written): + flag = 'flag' + ('8th' if written['type'] == 'eighth' else written['type']) + ('Up' if direction == -1 else 'Down') + group_items.append(fonts.glyph(flag, anchor.stem_x, stem_y, size, 'flag', references)) + if note.get('grace', {}).get('slash'): + group_items.append(line('grace-slash', references, ((anchor.stem_x - 5, stem_y + 14), (anchor.stem_x + 9, stem_y + 4)), 1.5)) + if note.get('tremolo', {}).get('type') == 'single': + for mark in range(note['tremolo']['marks']): + ty = stem_y - direction * (10 + mark * 5) + group_items.append(line('tremolo', references, ((anchor.stem_x - 6, ty + 2), (anchor.stem_x + 6, ty - 2)), 3)) + from dataclasses import replace + anchors.extend(replace(a, stem_x=anchor.stem_x, stem_y=stem_y) for a in group_anchors) + if not note.get('tuplet_ids') or members[0][1] != members[0][0]['written']: + time_modification(members[0][1], group_items, fonts, references) + items.extend(group_items) + group_x = max((p.box.right for p in items), default=group_x) + size + return items, anchors, fragments diff --git a/generator/engraving/petaluma.mss b/generator/engraving/petaluma.mss deleted file mode 100644 index 66b2bec..0000000 --- a/generator/engraving/petaluma.mss +++ /dev/null @@ -1,34 +0,0 @@ - - - - diff --git a/generator/engraving/raster.py b/generator/engraving/raster.py new file mode 100644 index 0000000..fe513a9 --- /dev/null +++ b/generator/engraving/raster.py @@ -0,0 +1,59 @@ +from __future__ import annotations + +import aggdraw +from fontTools.pens.basePen import BasePen +from PIL import Image, ImageDraw + +from generator.engraving.fonts import Fonts +from generator.engraving.types import Page + +class OutlinePen(BasePen): + def __init__(self, glyphs, scale: float, x: float, y: float): + super().__init__(glyphs) + self.path = aggdraw.Path() + self.scale, self.x, self.y = scale, x, y + def point(self, point): + return self.x + point[0] * self.scale, self.y - point[1] * self.scale + def _moveTo(self, point): + self.path.moveto(*self.point(point)) + def _lineTo(self, point): + self.path.lineto(*self.point(point)) + def _curveToOne(self, first, second, last): + self.path.curveto(*self.point(first), *self.point(second), *self.point(last)) + def _closePath(self): + self.path.close() + def _endPath(self): + pass + +def rasterize_page(page: Page, fonts: Fonts) -> Image.Image: + scale = page.supersampling + image = Image.new('RGB', (page.width * scale, page.height * scale), 'white') + context = aggdraw.Draw(image) + for item in page.primitives: + points = [(x * scale, y * scale) for x, y in item.points] + if item.kind == 'text': + continue + if item.kind == 'glyph': + pen = OutlinePen(fonts.glyphs, item.size * scale / fonts.units, *points[0]) + fonts.outline(item.value).replay(pen) + path = pen.path + else: + path = aggdraw.Path() + path.moveto(*points[0]) + if item.kind == 'curve': + path.curveto(*points[1], *points[2], *points[3]) + else: + for point in points[1:]: + path.lineto(*point) + if item.kind == 'polygon': + path.close() + if item.kind in ('glyph', 'polygon'): + context.path(path, None, aggdraw.Brush('black')) + else: + context.path(path, aggdraw.Pen('black', item.thickness * scale)) + context.flush() + drawing = ImageDraw.Draw(image) + for item in page.primitives: + if item.kind == 'text': + drawing.text(tuple(v * scale for v in item.points[0]), item.value, font=fonts.text_font(item.size * scale), anchor='ls', fill='black') + return image.resize((page.width, page.height), Image.Resampling.LANCZOS) diff --git a/generator/engraving/spans.py b/generator/engraving/spans.py new file mode 100644 index 0000000..0e6b09c --- /dev/null +++ b/generator/engraving/spans.py @@ -0,0 +1,263 @@ +from __future__ import annotations + +from fractions import Fraction + +from generator.model import beat_lengths, fraction +from generator.engraving.fonts import Fonts +from generator.engraving.notation import ScoreIndex, flags +from generator.engraving.types import Anchor, Primitive, Style, bounds, curve, line, polygon + +def beam_groups(index: ScoreIndex) -> tuple[tuple[str, ...], ...]: + if index._beam_groups is not None: + return index._beam_groups + groups = [] + for voice in dict.fromkeys(e.voice for e in index.events): + current = [] + previous_key = None + for event in (e for e in index.events if e.voice == voice): + note = event.value + primary = next((b['type'] for b in note.get('beams', []) if b['level'] == 1), None) + measure_start = next(start for start, _, measure in index.measures if measure['id'] == event.measure['id']) + beats = beat_lengths(index.state(event.start)['meter']) + offset = event.start - measure_start + beat = 0 + edge = Fraction() + for duration in beats: + edge += duration + if offset < edge: + break + beat += 1 + key = (event.measure['id'], beat, tuple(note.get('tuplet_ids', [])), bool(note.get('grace'))) + eligible = note['kind'] == 'note' and flags(note['written']) and note.get('stem') != 'none' and not note.get('hidden') + if not eligible or primary == 'begin' or (primary is None and key != previous_key): + if current: + groups.append(current) + current = [] + if eligible: + current.append(note['id']) + if primary == 'end': + groups.append(current) + current = [] + previous_key = key + if current: + groups.append(current) + index._beam_groups = tuple(tuple(g) for g in groups if len(g) > 1 or index.by_id[g[0]].value.get('beams')) + return index._beam_groups + +def draw_beams(index: ScoreIndex, anchors: list[Anchor], items: list[Primitive], start: Fraction, end: Fraction, left: float, right: float, style: Style) -> list[Primitive]: + additions = [] + removed = set() + for group in beam_groups(index): + selected = [] + for identifier in group: + candidates = [a for a in anchors if a.event == identifier and a.flags] + if candidates: + selected.append(candidates[0]) + if not selected: + continue + direction = selected[0].direction + if any(a.direction != direction for a in selected): + continue + sources = tuple(a.event for a in selected) + removed.update(sources) + beam_y = min(a.stem_y for a in selected) if direction == -1 else max(a.stem_y for a in selected) + first, last = selected[0], selected[-1] + x1 = left if index.by_id[group[0]].start < start else first.stem_x + x2 = right if index.by_id[group[-1]].start >= end else last.stem_x + for anchor in selected: + additions.append(line('beam-stem', (anchor.event,), ((anchor.stem_x, anchor.stem_y), (anchor.stem_x, beam_y)), 1.4)) + for level in range(1, max(a.flags for a in selected) + 1): + y = beam_y - direction * (level - 1) * style.space * 0.75 + for i, anchor in enumerate(selected): + if anchor.flags < level: + continue + event = index.by_id[anchor.event].value + explicit = next((b['type'] for b in event.get('beams', []) if b['level'] == level), None) + next_anchor = selected[i + 1] if i + 1 < len(selected) else None + previous = selected[i - 1] if i else None + a = anchor.stem_x + if explicit in ('forward hook', 'backward hook'): + b = a + (8 if explicit == 'forward hook' else -8) + elif next_anchor and next_anchor.flags >= level and explicit != 'end': + b = next_anchor.stem_x + elif i == len(selected) - 1 and x2 > a and explicit != 'end': + b = x2 + elif i == 0 and x1 < a and explicit != 'begin': + b = x1 + elif not previous or previous.flags < level or explicit == 'begin': + b = a + (8 if next_anchor else -8) + else: + continue + additions.append(polygon('beam', sources, ((a, y), (b, y), (b, y - direction * style.space * 0.5), (a, y - direction * style.space * 0.5)))) + if selected and x1 < selected[0].stem_x and selected[0].flags >= level: + additions.append(line('beam', sources, ((x1, y), (selected[0].stem_x, y)), style.space * 0.5)) + return [p for p in items if not (p.role == 'flag' and any(s in removed for s in p.sources))] + additions + +def draw_spans(index: ScoreIndex, anchors: list[Anchor], items: list[Primitive], start: Fraction, end: Fraction, left: float, right: float, fonts: Fonts, style: Style) -> list[Primitive]: + result = [] + by_tone = {a.source: a for a in anchors} + by_event = {a.event: a for a in anchors} + for identifier, (event, tone) in index.tones.items(): + target = tone.get('tie_to') + tone_end = event.start + fraction(tone['duration']) + anchor = by_tone.get(identifier) + if anchor and anchor.fragment.end < tone_end: + target = identifier + if target: + target_event = index.tones[target][0] + target_time = tone_end if target == identifier else target_event.start + if event.start >= end or target_time < start: + continue + destination = by_tone.get(target) if target != identifier else None + if anchor is None and destination is None: + continue + reference = anchor or destination + sign = -reference.direction + x1 = anchor.x + style.space * 1.4 if anchor else left + x2 = destination.x - 2 if destination else right + y1 = anchor.y + sign * 8 if anchor else reference.y + sign * 8 + y2 = destination.y + sign * 8 if destination else y1 + if x2 > x1: + result.append(curve('tie', (identifier, target), ((x1, y1), (x1 + (x2 - x1) / 3, y1 + sign * 9), (x2 - (x2 - x1) / 3, y2 + sign * 9), (x2, y2)), 1.6)) + if anchor and anchor.fragment.start > event.start: + y = anchor.y - anchor.direction * 8 + if anchor.x - 2 > left: + result.append(curve('tie', (identifier,), ((left, y), (left + 5, y - anchor.direction * 9), (anchor.x - 7, y - anchor.direction * 9), (anchor.x - 2, y)), 1.6)) + top = min(-style.space * 5, min((p.box.top for p in items if p.role not in ('harmony', 'lyric', 'section', 'tempo')), default=0)) + tuplet_lanes = [] + for span in index.staff.get('tuplets', []): + a, b = index.by_id[span['start']], index.by_id[span['end']] + if b.end <= start or a.start >= end: + continue + members = [anchor for anchor in anchors if span['id'] in index.by_id[anchor.event].value.get('tuplet_ids', [])] + if not members: + continue + x1 = left if a.start < start else min(m.stem_x for m in members) - 3 + x2 = right if b.end > end else max(m.stem_x for m in members) + style.space + y = top - 16 - span.get('depth', 0) * 23 + while any(x1 < b and a < x2 and abs(y - lane) < 22 for a, b, lane in tuplet_lanes): + y -= 23 + tuplet_lanes.append((x1, x2, y)) + number = span.get('show_number', 'actual') + label = '' if number == 'none' else str(span['note_count']) + if number == 'both': + label += ':' + str(span['space_count']) + if span.get('show_type', 'none') != 'none': + actual = span.get('tuplet_actual', {}).get('type', a.value['written']['type']) + normal = span.get('tuplet_normal', {}).get('type', actual) + label += ' ' + actual + '.' * span.get('tuplet_actual', {}).get('dots', 0) + if span['show_type'] == 'both': + label += ' : ' + normal + '.' * span.get('tuplet_normal', {}).get('dots', 0) + references = (span['id'],) + text = fonts.text(label, (x1 + x2) / 2, y + 4, 15, 'tuplet-number', references, True) if label else None + if text: + result.append(text) + if span.get('bracket', 'auto') != 'no': + intervals = [(x1, text.box.left - 4), (text.box.right + 4, x2)] if text else [(x1, x2)] + for p, q in intervals: + if q <= p: + continue + if span.get('line_shape') == 'curved': + result.append(curve('tuplet-bracket', references, ((p, y + 3), (p + (q - p) / 3, y - 4), (q - (q - p) / 3, y - 4), (q, y + 3)), 1.3)) + else: + result.append(line('tuplet-bracket', references, ((p, y), (q, y)), 1.3)) + if a.start >= start: + result.append(line('tuplet-bracket', references, ((x1, y), (x1, y + 5)), 1.3)) + if b.end <= end: + result.append(line('tuplet-bracket', references, ((x2, y), (x2, y + 5)), 1.3)) + outer_top = min(top, bounds(result).top if result else top) + for span in index.staff.get('octave_shifts', []): + a, b = fraction(span['start']), fraction(span['end']) + if b <= start or a >= end: + continue + members = [n for n in anchors if a <= n.time < b] + x1 = min((n.x for n in members), default=left) if a >= start else left + x2 = max((n.x + style.space * 2 for n in members), default=right) if b <= end else right + above = span['octaves'] < 0 + y = outer_top - 18 if above else max(bounds(items + result).bottom, 0) + 24 + label = str(abs(span['octaves']) * 7 + 1) + ('va' if above else 'vb') + text = fonts.text(label, x1, y, 16, 'octave-shift', (span['id'],)) + result.append(text) + outer_top = min(outer_top, text.box.top - 4) + cursor = text.box.right + 4 + while cursor < x2: + result.append(line('octave-shift', (span['id'],), ((cursor, y - 5), (min(cursor + 6, x2), y - 5)), 1)) + cursor += 10 + if b <= end: + result.append(line('octave-shift', (span['id'],), ((x2, y - 5), (x2, y + (2 if above else -12))), 1)) + for event in index.events: + tremolo = event.value.get('tremolo', {}) + if tremolo.get('type') != 'start': + continue + partner = index.by_id[tremolo['partner']] + if event.start >= end or partner.end <= start: + continue + a, b = by_event.get(event.value['id']), by_event.get(partner.value['id']) + if not a and not b: + continue + anchor = a or b + x1, x2 = a.stem_x + 4 if a else left, b.stem_x - 4 if b else right + y = anchor.stem_y - anchor.direction * 10 + for mark in range(tremolo['marks']): + result.append(line('tremolo', (event.value['id'], partner.value['id']), ((x1, y + mark * 6), (x2, y + mark * 6)), 3.5)) + return items + result + +def place_text_lanes(items: list[Primitive], fonts: Fonts, style: Style) -> list[Primitive]: + music = [p for p in items if p.role not in ('harmony', 'lyric', 'section', 'tempo')] + box = bounds(music) + result = list(music) + top = box.top - 12 + for role in ('harmony', 'tempo', 'section'): + lane = [p for p in items if p.role == role] + if lane: + extent = bounds(lane) + result.extend(p.moved(0, top - extent.bottom) for p in lane) + top -= extent.bottom - extent.top + 10 + lyrics = [p for p in items if p.role == 'lyric'] + if lyrics: + result.extend(p.moved(0, max(box.bottom, 0) + 20) for p in lyrics) + return result + +def draw_lyric_spans(index: ScoreIndex, items: list[Primitive], anchors: list[Anchor], start: Fraction, end: Fraction, left: float, right: float, fonts: Fonts) -> list[Primitive]: + result = list(items) + labels = {p.sources[0]: p for p in items if p.role == 'lyric'} + positions = {a.event: a for a in anchors} + lyric_baseline = None + for event in index.events: + for verse in event.value.get('lyrics', []): + label = labels.get(event.value['id'] + ':lyric:' + verse['number']) + if label: + lyric_baseline = label.points[0][1] - index.lyric_lanes.index((event.voice, verse['number'])) * 23 + break + if lyric_baseline is not None: + break + if lyric_baseline is None: + lyric_baseline = max(0, bounds(items).bottom) + 20 + for voice, number in index.lyric_lanes: + verses = [(e, v) for e in index.events if e.voice == voice and not e.value.get('hidden') for v in e.value.get('lyrics', []) if v['number'] == number] + for i, (event, verse) in enumerate(verses): + following = verses[i + 1] if i + 1 < len(verses) else None + syllabic = next((s['text'] for s in verse['syllables'] if s['kind'] == 'syllabic'), 'single') + extend = next((s['attributes'].get('type', 'start') for s in verse['syllables'] if s['kind'] == 'extend'), None) + if syllabic not in ('begin', 'middle') and extend not in ('start', 'continue'): + continue + target = following[0].start if following else max(e.end for e in index.events if e.voice == voice) + if target < start or event.start >= end: + continue + identifier = event.value['id'] + ':lyric:' + number + next_id = following[0].value['id'] + ':lyric:' + number if following else '' + a, b = labels.get(identifier), labels.get(next_id) + x1 = a.box.right + 5 if a else left + x2 = b.box.left - 5 if b else right + if b is None and following and following[0].value['id'] in positions: + x2 = positions[following[0].value['id']].x + y = lyric_baseline + index.lyric_lanes.index((voice, number)) * 23 + if x2 <= x1: + continue + if extend in ('start', 'continue'): + result.append(line('lyric-extension', (identifier,), ((x1, y + 3), (x2, y + 3)), 1)) + elif following: + count = max(1, int((x2 - x1) / 90)) + for dash in range(count): + result.append(fonts.text('-', x1 + (x2 - x1) * (dash + 1) / (count + 1), y, 18, 'lyric-hyphen', (identifier,), True)) + return result diff --git a/generator/engraving/types.py b/generator/engraving/types.py new file mode 100644 index 0000000..2630baa --- /dev/null +++ b/generator/engraving/types.py @@ -0,0 +1,117 @@ +from __future__ import annotations + +from dataclasses import dataclass, replace +from fractions import Fraction +import math + +class EngravingError(ValueError): + pass + +@dataclass(frozen=True) +class Style: + width: int = 976 + height: int = 484 + space: float = 12 + margin_x: float = 28 + margin_y: float = 18 + supersampling: int = 4 + column_gap: float = 10 + system_gap: float = 26 + +@dataclass(frozen=True) +class Box: + left: float + top: float + right: float + bottom: float + def moved(self, x: float, y: float) -> Box: + return Box(self.left + x, self.top + y, self.right + x, self.bottom + y) + def overlaps(self, other: Box, clearance: float = 0) -> bool: + return self.left < other.right + clearance and other.left < self.right + clearance and self.top < other.bottom + clearance and other.top < self.bottom + clearance + def finite(self) -> bool: + return all(math.isfinite(v) for v in (self.left, self.top, self.right, self.bottom)) and self.left <= self.right and self.top <= self.bottom + +@dataclass(frozen=True) +class Primitive: + kind: str + role: str + sources: tuple[str, ...] + box: Box + points: tuple[tuple[float, float], ...] + value: str = '' + size: float = 0 + thickness: float = 0 + def moved(self, x: float, y: float) -> Primitive: + return replace(self, box=self.box.moved(x, y), points=tuple((a + x, b + y) for a, b in self.points)) + +@dataclass(frozen=True) +class Fragment: + source: str + event: str + start: Fraction + end: Fraction + written_type: str + dots: int + ratio: Fraction + visible: bool + kind: str + position: float | None + def length(self) -> Fraction: + return self.end - self.start + +@dataclass(frozen=True) +class Anchor: + source: str + event: str + voice: str + time: Fraction + end: Fraction + x: float + y: float + stem_x: float + stem_y: float + direction: int + flags: int + fragment: Fragment + def moved(self, x: float, y: float) -> Anchor: + return replace(self, x=self.x + x, y=self.y + y, stem_x=self.stem_x + x, stem_y=self.stem_y + y) + +@dataclass(frozen=True) +class System: + start: Fraction + end: Fraction + primitives: tuple[Primitive, ...] + anchors: tuple[Anchor, ...] + fragments: tuple[Fragment, ...] + box: Box + +@dataclass(frozen=True) +class Page: + number: int + width: int + height: int + supersampling: int + systems: tuple[System, ...] + primitives: tuple[Primitive, ...] + +@dataclass(frozen=True) +class LayoutDocument: + pages: tuple[Page, ...] + style: Style + fingerprint: str + +def bounds(items: list[Primitive] | tuple[Primitive, ...]) -> Box: + if not items: + return Box(0, 0, 0, 0) + return Box(min(p.box.left for p in items), min(p.box.top for p in items), max(p.box.right for p in items), max(p.box.bottom for p in items)) + +def line(role: str, sources: tuple[str, ...], points: tuple[tuple[float, float], ...], thickness: float = 1.4) -> Primitive: + pad = thickness / 2 + box = Box(min(x for x, _ in points) - pad, min(y for _, y in points) - pad, max(x for x, _ in points) + pad, max(y for _, y in points) + pad) + return Primitive('line', role, sources, box, points, thickness=thickness) + +def curve(role: str, sources: tuple[str, ...], points: tuple[tuple[float, float], ...], thickness: float = 1.6) -> Primitive: + return replace(line(role, sources, points, thickness), kind='curve') + +def polygon(role: str, sources: tuple[str, ...], points: tuple[tuple[float, float], ...]) -> Primitive: + return replace(line(role, sources, points, 0), kind='polygon') diff --git a/generator/musicxml_writer.py b/generator/musicxml_writer.py index 17d68e4..267bc37 100644 --- a/generator/musicxml_writer.py +++ b/generator/musicxml_writer.py @@ -201,13 +201,10 @@ def write_note(parent, event: dict, voice: str, divisions: int, tuplets: list[di for syllable in verse['syllables']: element(lyric, syllable['kind'], syllable['text'], **syllable['attributes']) -def musicxml_tree(document: dict, *, engine_voices: bool = False) -> ElementTree.ElementTree: +def musicxml_tree(document: dict) -> ElementTree.ElementTree: validate_document(document) root = ElementTree.Element('score-partwise', {'version': '4.0'}) metadata, staff = document['metadata'], document['staves'][0] - voice_ids = list(dict.fromkeys(v['id'] for m in staff['measures'] for v in m['voices'] if v['id'] != 'voice-arranged')) - voice_slots = {identifier: str(index + 1) for index, identifier in enumerate(voice_ids)} - voice_slots['voice-arranged'] = '1' element(element(root, 'work'), 'work-title', metadata['title']) identification = element(root, 'identification') element(identification, 'creator', metadata.get('composer', ''), type='composer') @@ -300,7 +297,7 @@ def musicxml_tree(document: dict, *, engine_voices: bool = False) -> ElementTree onset = fraction(event['onset']) if onset > cursor: element(element(bar, 'forward'), 'duration', int((onset - cursor) * divisions)) - write_note(bar, event, voice_slots[voice['id']] if engine_voices else voice['id'], divisions, staff.get('tuplets', [])) + write_note(bar, event, voice['id'], divisions, staff.get('tuplets', [])) cursor = onset + fraction(event['duration']) if cursor < fraction(measure['duration']): element(element(bar, 'forward'), 'duration', int((fraction(measure['duration']) - cursor) * divisions)) @@ -310,7 +307,7 @@ def musicxml_tree(document: dict, *, engine_voices: bool = False) -> ElementTree absolute += fraction(measure['duration']) return ElementTree.ElementTree(root) -def write_musicxml(path: Path, document: dict, *, engine_voices: bool = False) -> None: - tree = musicxml_tree(document, engine_voices=engine_voices) +def write_musicxml(path: Path, document: dict) -> None: + tree = musicxml_tree(document) ElementTree.indent(tree, space=' ') tree.write(path, encoding='utf-8', xml_declaration=True) diff --git a/generator/score.py b/generator/score.py index 89bae02..f27b2ee 100644 --- a/generator/score.py +++ b/generator/score.py @@ -11,11 +11,11 @@ from generator.model import SCHEMA_VERSION, validate_document def load_json(path: Path) -> dict: document = json.loads(path.read_text(encoding='utf-8')) if 'music' in document: - from generator.engraving import ENGINE_VERSION, PAGE_HEIGHT, PAGE_WIDTH, check_page + from generator.engraving import ENGINE_NAME, ENGINE_VERSION, PAGE_HEIGHT, PAGE_WIDTH, check_page presentation = document.get('presentation', {}) if document.get('schema_version') != SCHEMA_VERSION or not isinstance(presentation, dict) or not isinstance(presentation.get('pages'), list) or not presentation['pages']: raise ValueError('invalid score bundle; regenerate score assets') - if (presentation.get('engine'), presentation.get('engine_version'), presentation.get('width'), presentation.get('height')) != ('MuseScore Studio', ENGINE_VERSION, PAGE_WIDTH, PAGE_HEIGHT): + if (presentation.get('engine'), presentation.get('engine_version'), presentation.get('width'), presentation.get('height')) != (ENGINE_NAME, ENGINE_VERSION, PAGE_WIDTH, PAGE_HEIGHT): raise ValueError('unsupported score presentation; regenerate score assets') for page in presentation['pages']: if not isinstance(page, dict) or not isinstance(page.get('path'), str) or not isinstance(page.get('sha256'), str): diff --git a/modulus.py b/modulus.py index f0ee00f..0d5b0f4 100755 --- a/modulus.py +++ b/modulus.py @@ -138,7 +138,7 @@ WORKDIR /workspace """ def build_requirements_digest(): - return hashlib.sha256((repo_root() / "tools/requirements.txt").read_bytes() + (repo_root() / "tools/install_engraver.py").read_bytes()).hexdigest() + return hashlib.sha256((repo_root() / "tools/requirements.txt").read_bytes()).hexdigest() def product_build_dockerfile(): return f"""FROM {DEFAULT_BUILD_BASE_IMAGE} @@ -202,13 +202,6 @@ RUN python3 -m venv /opt/modulus-python ENV PATH=/opt/modulus-python/bin:$PATH COPY tools/requirements.txt /tmp/vamp-build-requirements.txt -COPY tools/install_engraver.py /tmp/install-vamp-engraver.py -RUN apt-get update && apt-get install -y --no-install-recommends \\ - libasound2t64 libdbus-1-3 libfontconfig1 libglib2.0-0t64 libgpg-error0 libnss3 libopengl0 libxkbcommon0 \\ - libxkbcommon-x11-0 libxcb-cursor0 libxcomposite1 libxrandr2 libxtst6 \\ - && rm -rf /var/lib/apt/lists/* -RUN python3 /tmp/install-vamp-engraver.py /opt/vamp-musescore -ENV VAMP_MUSESCORE=/opt/vamp-musescore/squashfs-root/AppRun ARG MODULUS_TOOLS=build/build_tools COPY ${{MODULUS_TOOLS}}/docker/format-requirements.txt /tmp/modulus-format-requirements.txt diff --git a/package/assets/fonts/petaluma/SMUFL-LICENSE.md b/package/assets/fonts/petaluma/SMUFL-LICENSE.md new file mode 100644 index 0000000..0453135 --- /dev/null +++ b/package/assets/fonts/petaluma/SMUFL-LICENSE.md @@ -0,0 +1,20 @@ +# SMuFL Metadata + +`smufl_glyphnames.json` is the unmodified glyph-name mapping from +https://github.com/w3c-cg/smufl at revision +`f9d12b22ea89978720ba9defb2f4df67fabd8564` (2026-09-05). + +The upstream `mdbook/src/preamble/license.md` notice follows: + +SMuFL is free to use, and is licensed under the terms of the +W3C Community Final Specification Agreement (FSA). + +Copyright © 2022 the Contributors to the Standard Music Font Layout +Specification, published by the W3C Music Notation Community Group under the +[W3C Community Contributor License Agreement (CLA)](https://www.w3.org/community/about/agreements/cla/). +A [human-readable summary](https://www.w3.org/community/about/agreements/cla-deed/) +is available. The [FSA](https://www.w3.org/community/about/agreements/final/) +and [SMuFL licensing commitments](https://www.w3.org/community/music-notation/spec/193/commitments) +are published by W3C. + +The Petaluma fonts and their font-specific metadata remain covered by OFL.txt. diff --git a/package/assets/fonts/petaluma/smufl_glyphnames.json b/package/assets/fonts/petaluma/smufl_glyphnames.json new file mode 100644 index 0000000..78a94bd --- /dev/null +++ b/package/assets/fonts/petaluma/smufl_glyphnames.json @@ -0,0 +1,11984 @@ +{ + "4stringTabClef": { + "codepoint": "U+E06E", + "description": "4-string tab clef" + }, + "6stringTabClef": { + "codepoint": "U+E06D", + "description": "6-string tab clef" + }, + "accSagittal11LargeDiesisDown": { + "codepoint": "U+E30D", + "description": "11 large diesis down, 3\u00b0 down [46 EDO]" + }, + "accSagittal11LargeDiesisUp": { + "codepoint": "U+E30C", + "description": "11 large diesis up, (11L), (sharp less 11M), 3\u00b0 up [46 EDO]" + }, + "accSagittal11MediumDiesisDown": { + "codepoint": "U+E30B", + "description": "11 medium diesis down, 1\u00b0[17 31] 2\u00b046 down, 1/4-tone down" + }, + "accSagittal11MediumDiesisUp": { + "codepoint": "U+E30A", + "description": "11 medium diesis up, (11M), 1\u00b0[17 31] 2\u00b046 up, 1/4-tone up" + }, + "accSagittal11v19LargeDiesisDown": { + "codepoint": "U+E3AB", + "description": "11:19 large diesis down" + }, + "accSagittal11v19LargeDiesisUp": { + "codepoint": "U+E3AA", + "description": "11:19 large diesis up, (11:19L, apotome less 11:19M)" + }, + "accSagittal11v19MediumDiesisDown": { + "codepoint": "U+E3A3", + "description": "11:19 medium diesis down" + }, + "accSagittal11v19MediumDiesisUp": { + "codepoint": "U+E3A2", + "description": "11:19 medium diesis up, (11:19M, 11M plus 19s)" + }, + "accSagittal11v49CommaDown": { + "codepoint": "U+E397", + "description": "11:49 comma down" + }, + "accSagittal11v49CommaUp": { + "codepoint": "U+E396", + "description": "11:49 comma up, (11:49C, 11M less 49C)" + }, + "accSagittal143CommaDown": { + "codepoint": "U+E395", + "description": "143 comma down" + }, + "accSagittal143CommaUp": { + "codepoint": "U+E394", + "description": "143 comma up, (143C, 13L less 11M)" + }, + "accSagittal17CommaDown": { + "codepoint": "U+E343", + "description": "17 comma down" + }, + "accSagittal17CommaUp": { + "codepoint": "U+E342", + "description": "17 comma up, (17C)" + }, + "accSagittal17KleismaDown": { + "codepoint": "U+E393", + "description": "17 kleisma down" + }, + "accSagittal17KleismaUp": { + "codepoint": "U+E392", + "description": "17 kleisma up, (17k)" + }, + "accSagittal19CommaDown": { + "codepoint": "U+E399", + "description": "19 comma down" + }, + "accSagittal19CommaUp": { + "codepoint": "U+E398", + "description": "19 comma up, (19C)" + }, + "accSagittal19SchismaDown": { + "codepoint": "U+E391", + "description": "19 schisma down" + }, + "accSagittal19SchismaUp": { + "codepoint": "U+E390", + "description": "19 schisma up, (19s)" + }, + "accSagittal1MinaDown": { + "codepoint": "U+E3F5", + "description": "1 mina down, 1/(5\u22c57\u22c513)-schismina down, 0.42 cents down" + }, + "accSagittal1MinaUp": { + "codepoint": "U+E3F4", + "description": "1 mina up, 1/(5\u22c57\u22c513)-schismina up, 0.42 cents up" + }, + "accSagittal1TinaDown": { + "codepoint": "U+E3F9", + "description": "1 tina down, 7\u00b2\u22c511\u22c519/5-schismina down, 0.17 cents down" + }, + "accSagittal1TinaUp": { + "codepoint": "U+E3F8", + "description": "1 tina up, 7\u00b2\u22c511\u22c519/5-schismina up, 0.17 cents up" + }, + "accSagittal23CommaDown": { + "codepoint": "U+E371", + "description": "23 comma down, 2\u00b0 down [96 EDO], 1/8-tone down" + }, + "accSagittal23CommaUp": { + "codepoint": "U+E370", + "description": "23 comma up, (23C), 2\u00b0 up [96 EDO], 1/8-tone up" + }, + "accSagittal23SmallDiesisDown": { + "codepoint": "U+E39F", + "description": "23 small diesis down" + }, + "accSagittal23SmallDiesisUp": { + "codepoint": "U+E39E", + "description": "23 small diesis up, (23S)" + }, + "accSagittal25SmallDiesisDown": { + "codepoint": "U+E307", + "description": "25 small diesis down, 2\u00b0 down [53 EDO]" + }, + "accSagittal25SmallDiesisUp": { + "codepoint": "U+E306", + "description": "25 small diesis up, (25S, ~5:13S, ~37S, 5C\u00a0plus\u00a05C), 2\u00b0 up [53 EDO]" + }, + "accSagittal2MinasDown": { + "codepoint": "U+E3F7", + "description": "2 minas down, 65/77-schismina down, 0.83 cents down" + }, + "accSagittal2MinasUp": { + "codepoint": "U+E3F6", + "description": "2 minas up, 65/77-schismina up, 0.83 cents up" + }, + "accSagittal2TinasDown": { + "codepoint": "U+E3FB", + "description": "2 tinas down, 1/(7\u00b3\u22c517)-schismina down, 0.30 cents down" + }, + "accSagittal2TinasUp": { + "codepoint": "U+E3FA", + "description": "2 tinas up, 1/(7\u00b3\u22c517)-schismina up, 0.30 cents up" + }, + "accSagittal35LargeDiesisDown": { + "codepoint": "U+E30F", + "description": "35 large diesis down, 2\u00b0 down [50 EDO], 5/18-tone down" + }, + "accSagittal35LargeDiesisUp": { + "codepoint": "U+E30E", + "description": "35 large diesis up, (35L, ~13L, ~125L, sharp less 35M), 2\u00b050 up" + }, + "accSagittal35MediumDiesisDown": { + "codepoint": "U+E309", + "description": "35 medium diesis down, 1\u00b0[50] 2\u00b0[27] down, 2/9-tone down" + }, + "accSagittal35MediumDiesisUp": { + "codepoint": "U+E308", + "description": "35 medium diesis up, (35M, ~13M, ~125M, 5C\u00a0plus\u00a07C), 2/9-tone up" + }, + "accSagittal3TinasDown": { + "codepoint": "U+E3FD", + "description": "3 tinas down, 1 mina down, 1/(5\u22c57\u22c513)-schismina down, 0.42 cents down" + }, + "accSagittal3TinasUp": { + "codepoint": "U+E3FC", + "description": "3 tinas up, 1 mina up, 1/(5\u22c57\u22c513)-schismina up, 0.42 cents up" + }, + "accSagittal49LargeDiesisDown": { + "codepoint": "U+E3A9", + "description": "49 large diesis down" + }, + "accSagittal49LargeDiesisUp": { + "codepoint": "U+E3A8", + "description": "49 large diesis up, (49L, ~31L, apotome less 49M)" + }, + "accSagittal49MediumDiesisDown": { + "codepoint": "U+E3A5", + "description": "49 medium diesis down" + }, + "accSagittal49MediumDiesisUp": { + "codepoint": "U+E3A4", + "description": "49 medium diesis up, (49M, ~31M, 7C plus 7C)" + }, + "accSagittal49SmallDiesisDown": { + "codepoint": "U+E39D", + "description": "49 small diesis down" + }, + "accSagittal49SmallDiesisUp": { + "codepoint": "U+E39C", + "description": "49 small diesis up, (49S, ~31S)" + }, + "accSagittal4TinasDown": { + "codepoint": "U+E3FF", + "description": "4 tinas down, 5\u00b2\u22c511\u00b2/7-schismina down, 0.57 cents down" + }, + "accSagittal4TinasUp": { + "codepoint": "U+E3FE", + "description": "4 tinas up, 5\u00b2\u22c511\u00b2/7-schismina up, 0.57 cents up" + }, + "accSagittal55CommaDown": { + "codepoint": "U+E345", + "description": "55 comma down, 3\u00b0 down [96 EDO], 3/16-tone down" + }, + "accSagittal55CommaUp": { + "codepoint": "U+E344", + "description": "55 comma up, (55C, 11M less 5C), 3\u00b0up [96 EDO], 3/16-tone up" + }, + "accSagittal5CommaDown": { + "codepoint": "U+E303", + "description": "5 comma down, 1\u00b0 down [22 27 29 34 41 46 53 96 EDOs], 1/12-tone down" + }, + "accSagittal5CommaUp": { + "codepoint": "U+E302", + "description": "5 comma up, (5C), 1\u00b0 up [22 27 29 34 41 46 53 96 EDOs], 1/12-tone up" + }, + "accSagittal5TinasDown": { + "codepoint": "U+E401", + "description": "5 tinas down, 7\u2074/25-schismina down, 0.72 cents down" + }, + "accSagittal5TinasUp": { + "codepoint": "U+E400", + "description": "5 tinas up, 7\u2074/25-schismina up, 0.72 cents up" + }, + "accSagittal5v11SmallDiesisDown": { + "codepoint": "U+E349", + "description": "5:11 small diesis down" + }, + "accSagittal5v11SmallDiesisUp": { + "codepoint": "U+E348", + "description": "5:11 small diesis up, (5:11S, ~7:13S, ~11:17S, 5:7k plus 7:11C)" + }, + "accSagittal5v13LargeDiesisDown": { + "codepoint": "U+E3AD", + "description": "5:13 large diesis down" + }, + "accSagittal5v13LargeDiesisUp": { + "codepoint": "U+E3AC", + "description": "5:13 large diesis up, (5:13L, ~37L, apotome less 5:13M)" + }, + "accSagittal5v13MediumDiesisDown": { + "codepoint": "U+E3A1", + "description": "5:13 medium diesis down" + }, + "accSagittal5v13MediumDiesisUp": { + "codepoint": "U+E3A0", + "description": "5:13 medium diesis up, (5:13M, ~37M, 5C plus 13C)" + }, + "accSagittal5v19CommaDown": { + "codepoint": "U+E373", + "description": "5:19 comma down, 1/20-tone down" + }, + "accSagittal5v19CommaUp": { + "codepoint": "U+E372", + "description": "5:19 comma up, (5:19C, 5C plus 19s), 1/20-tone up" + }, + "accSagittal5v23SmallDiesisDown": { + "codepoint": "U+E375", + "description": "5:23 small diesis down, 2\u00b0 down [60 EDO], 1/5-tone down" + }, + "accSagittal5v23SmallDiesisUp": { + "codepoint": "U+E374", + "description": "5:23 small diesis up, (5:23S, 5C plus 23C), 2\u00b0 up [60 EDO], 1/5-tone up" + }, + "accSagittal5v49MediumDiesisDown": { + "codepoint": "U+E3A7", + "description": "5:49 medium diesis down" + }, + "accSagittal5v49MediumDiesisUp": { + "codepoint": "U+E3A6", + "description": "5:49 medium diesis up, (5:49M, half apotome)" + }, + "accSagittal5v7KleismaDown": { + "codepoint": "U+E301", + "description": "5:7 kleisma down" + }, + "accSagittal5v7KleismaUp": { + "codepoint": "U+E300", + "description": "5:7 kleisma up, (5:7k, ~11:13k, 7C\u00a0less\u00a05C)" + }, + "accSagittal6TinasDown": { + "codepoint": "U+E403", + "description": "6 tinas down, 2 minas down, 65/77-schismina down, 0.83 cents down" + }, + "accSagittal6TinasUp": { + "codepoint": "U+E402", + "description": "6 tinas up, 2 minas up, 65/77-schismina up, 0.83 cents up" + }, + "accSagittal7CommaDown": { + "codepoint": "U+E305", + "description": "7 comma down, 1\u00b0 down [43 EDO], 2\u00b0 down [72 EDO], 1/6-tone down" + }, + "accSagittal7CommaUp": { + "codepoint": "U+E304", + "description": "7 comma up, (7C), 1\u00b0 up [43 EDO], 2\u00b0 up [72 EDO], 1/6-tone up" + }, + "accSagittal7TinasDown": { + "codepoint": "U+E405", + "description": "7 tinas down, 7/(5\u00b2\u22c517)-schismina down, 1.02 cents down" + }, + "accSagittal7TinasUp": { + "codepoint": "U+E404", + "description": "7 tinas up, 7/(5\u00b2\u22c517)-schismina up, 1.02 cents up" + }, + "accSagittal7v11CommaDown": { + "codepoint": "U+E347", + "description": "7:11 comma down, 1\u00b0 down [60 EDO], 1/10-tone down" + }, + "accSagittal7v11CommaUp": { + "codepoint": "U+E346", + "description": "7:11 comma up, (7:11C, ~13:17S, ~29S, 11L less 7C), 1\u00b0 up [60 EDO]" + }, + "accSagittal7v11KleismaDown": { + "codepoint": "U+E341", + "description": "7:11 kleisma down" + }, + "accSagittal7v11KleismaUp": { + "codepoint": "U+E340", + "description": "7:11 kleisma up, (7:11k, ~29k)" + }, + "accSagittal7v19CommaDown": { + "codepoint": "U+E39B", + "description": "7:19 comma down" + }, + "accSagittal7v19CommaUp": { + "codepoint": "U+E39A", + "description": "7:19 comma up, (7:19C, 7C less 19s)" + }, + "accSagittal8TinasDown": { + "codepoint": "U+E407", + "description": "8 tinas down, 11\u22c517/(5\u00b2\u22c57)-schismina down, 1.14 cents down" + }, + "accSagittal8TinasUp": { + "codepoint": "U+E406", + "description": "8 tinas up, 11\u22c517/(5\u00b2\u22c57)-schismina up, 1.14 cents up" + }, + "accSagittal9TinasDown": { + "codepoint": "U+E409", + "description": "9 tinas down, 1/(7\u00b2\u22c511)-schismina down, 1.26 cents down" + }, + "accSagittal9TinasUp": { + "codepoint": "U+E408", + "description": "9 tinas up, 1/(7\u00b2\u22c511)-schismina up, 1.26 cents up" + }, + "accSagittalAcute": { + "codepoint": "U+E3F2", + "description": "Acute, 5 schisma up (5s), 2 cents up" + }, + "accSagittalDoubleFlat": { + "codepoint": "U+E335", + "description": "Double flat, (2 apotomes down)[almost all EDOs], whole-tone down" + }, + "accSagittalDoubleFlat11v49CUp": { + "codepoint": "U+E3E9", + "description": "Double flat 11:49C-up" + }, + "accSagittalDoubleFlat143CUp": { + "codepoint": "U+E3EB", + "description": "Double flat 143C-up" + }, + "accSagittalDoubleFlat17CUp": { + "codepoint": "U+E365", + "description": "Double flat 17C-up" + }, + "accSagittalDoubleFlat17kUp": { + "codepoint": "U+E3ED", + "description": "Double flat 17k-up" + }, + "accSagittalDoubleFlat19CUp": { + "codepoint": "U+E3E7", + "description": "Double flat 19C-up" + }, + "accSagittalDoubleFlat19sUp": { + "codepoint": "U+E3EF", + "description": "Double flat 19s-up" + }, + "accSagittalDoubleFlat23CUp": { + "codepoint": "U+E387", + "description": "Double flat 23C-up, 14\u00b0 down [96 EDO], 7/8-tone down" + }, + "accSagittalDoubleFlat23SUp": { + "codepoint": "U+E3E1", + "description": "Double flat 23S-up" + }, + "accSagittalDoubleFlat25SUp": { + "codepoint": "U+E32D", + "description": "Double flat 25S-up, 8\u00b0down [53 EDO]" + }, + "accSagittalDoubleFlat49SUp": { + "codepoint": "U+E3E3", + "description": "Double flat 49S-up" + }, + "accSagittalDoubleFlat55CUp": { + "codepoint": "U+E363", + "description": "Double flat 55C-up, 13\u00b0 down [96 EDO], 13/16-tone down" + }, + "accSagittalDoubleFlat5CUp": { + "codepoint": "U+E331", + "description": "Double flat 5C-up, 5\u00b0[22 29] 7\u00b0[34 41] 9\u00b053 down, 11/12 tone down" + }, + "accSagittalDoubleFlat5v11SUp": { + "codepoint": "U+E35F", + "description": "Double flat 5:11S-up" + }, + "accSagittalDoubleFlat5v19CUp": { + "codepoint": "U+E385", + "description": "Double flat 5:19C-up, 19/20-tone down" + }, + "accSagittalDoubleFlat5v23SUp": { + "codepoint": "U+E383", + "description": "Double flat 5:23S-up, 8\u00b0 down [60 EDO], 4/5-tone down" + }, + "accSagittalDoubleFlat5v7kUp": { + "codepoint": "U+E333", + "description": "Double flat 5:7k-up" + }, + "accSagittalDoubleFlat7CUp": { + "codepoint": "U+E32F", + "description": "Double flat 7C-up, 5\u00b0 down [43 EDO], 10\u00b0 down [72 EDO], 5/6-tone down" + }, + "accSagittalDoubleFlat7v11CUp": { + "codepoint": "U+E361", + "description": "Double flat 7:11C-up, 9\u00b0 down [60 EDO], 9/10-tone down" + }, + "accSagittalDoubleFlat7v11kUp": { + "codepoint": "U+E367", + "description": "Double flat 7:11k-up" + }, + "accSagittalDoubleFlat7v19CUp": { + "codepoint": "U+E3E5", + "description": "Double flat 7:19C-up" + }, + "accSagittalDoubleSharp": { + "codepoint": "U+E334", + "description": "Double sharp, (2 apotomes up)[almost all EDOs], whole-tone up" + }, + "accSagittalDoubleSharp11v49CDown": { + "codepoint": "U+E3E8", + "description": "Double sharp 11:49C-down" + }, + "accSagittalDoubleSharp143CDown": { + "codepoint": "U+E3EA", + "description": "Double sharp 143C-down" + }, + "accSagittalDoubleSharp17CDown": { + "codepoint": "U+E364", + "description": "Double sharp 17C-down" + }, + "accSagittalDoubleSharp17kDown": { + "codepoint": "U+E3EC", + "description": "Double sharp 17k-down" + }, + "accSagittalDoubleSharp19CDown": { + "codepoint": "U+E3E6", + "description": "Double sharp 19C-down" + }, + "accSagittalDoubleSharp19sDown": { + "codepoint": "U+E3EE", + "description": "Double sharp 19s-down" + }, + "accSagittalDoubleSharp23CDown": { + "codepoint": "U+E386", + "description": "Double sharp 23C-down, 14\u00b0up [96 EDO], 7/8-tone up" + }, + "accSagittalDoubleSharp23SDown": { + "codepoint": "U+E3E0", + "description": "Double sharp 23S-down" + }, + "accSagittalDoubleSharp25SDown": { + "codepoint": "U+E32C", + "description": "Double sharp 25S-down, 8\u00b0up [53 EDO]" + }, + "accSagittalDoubleSharp49SDown": { + "codepoint": "U+E3E2", + "description": "Double sharp 49S-down" + }, + "accSagittalDoubleSharp55CDown": { + "codepoint": "U+E362", + "description": "Double sharp 55C-down, 13\u00b0 up [96 EDO], 13/16-tone up" + }, + "accSagittalDoubleSharp5CDown": { + "codepoint": "U+E330", + "description": "Double sharp 5C-down, 5\u00b0[22 29] 7\u00b0[34 41] 9\u00b053 up, 11/12 tone up" + }, + "accSagittalDoubleSharp5v11SDown": { + "codepoint": "U+E35E", + "description": "Double sharp 5:11S-down" + }, + "accSagittalDoubleSharp5v19CDown": { + "codepoint": "U+E384", + "description": "Double sharp 5:19C-down, 19/20-tone up" + }, + "accSagittalDoubleSharp5v23SDown": { + "codepoint": "U+E382", + "description": "Double sharp 5:23S-down, 8\u00b0 up [60 EDO], 4/5-tone up" + }, + "accSagittalDoubleSharp5v7kDown": { + "codepoint": "U+E332", + "description": "Double sharp 5:7k-down" + }, + "accSagittalDoubleSharp7CDown": { + "codepoint": "U+E32E", + "description": "Double sharp 7C-down, 5\u00b0[43] 10\u00b0[72] up, 5/6-tone up" + }, + "accSagittalDoubleSharp7v11CDown": { + "codepoint": "U+E360", + "description": "Double sharp 7:11C-down, 9\u00b0 up [60 EDO], 9/10-tone up" + }, + "accSagittalDoubleSharp7v11kDown": { + "codepoint": "U+E366", + "description": "Double sharp 7:11k-down" + }, + "accSagittalDoubleSharp7v19CDown": { + "codepoint": "U+E3E4", + "description": "Double sharp 7:19C-down" + }, + "accSagittalFlat": { + "codepoint": "U+E319", + "description": "Flat, (apotome down)[almost all EDOs], 1/2-tone down" + }, + "accSagittalFlat11LDown": { + "codepoint": "U+E329", + "description": "Flat 11L-down, 8\u00b0 up [46 EDO]" + }, + "accSagittalFlat11MDown": { + "codepoint": "U+E327", + "description": "Flat 11M-down, 3\u00b0 down [17 31 EDOs], 7\u00b0 down [46 EDO], 3/4-tone down" + }, + "accSagittalFlat11v19LDown": { + "codepoint": "U+E3DB", + "description": "Flat 11:19L-down" + }, + "accSagittalFlat11v19MDown": { + "codepoint": "U+E3D3", + "description": "Flat 11:19M-down" + }, + "accSagittalFlat11v49CDown": { + "codepoint": "U+E3C7", + "description": "Flat 11:49C-down" + }, + "accSagittalFlat11v49CUp": { + "codepoint": "U+E3B9", + "description": "Flat 11:49C-up" + }, + "accSagittalFlat143CDown": { + "codepoint": "U+E3C5", + "description": "Flat 143C-down" + }, + "accSagittalFlat143CUp": { + "codepoint": "U+E3BB", + "description": "Flat 143C-up" + }, + "accSagittalFlat17CDown": { + "codepoint": "U+E357", + "description": "Flat 17C-down" + }, + "accSagittalFlat17CUp": { + "codepoint": "U+E351", + "description": "Flat 17C-up" + }, + "accSagittalFlat17kDown": { + "codepoint": "U+E3C3", + "description": "Flat 17k-down" + }, + "accSagittalFlat17kUp": { + "codepoint": "U+E3BD", + "description": "Flat 17k-up" + }, + "accSagittalFlat19CDown": { + "codepoint": "U+E3C9", + "description": "Flat 19C-down" + }, + "accSagittalFlat19CUp": { + "codepoint": "U+E3B7", + "description": "Flat 19C-up" + }, + "accSagittalFlat19sDown": { + "codepoint": "U+E3C1", + "description": "Flat 19s-down" + }, + "accSagittalFlat19sUp": { + "codepoint": "U+E3BF", + "description": "Flat 19s-up" + }, + "accSagittalFlat23CDown": { + "codepoint": "U+E37D", + "description": "Flat 23C-down, 10\u00b0 down [96 EDO], 5/8-tone down" + }, + "accSagittalFlat23CUp": { + "codepoint": "U+E37B", + "description": "Flat 23C-up, 6\u00b0 down [96 EDO], 3/8-tone down" + }, + "accSagittalFlat23SDown": { + "codepoint": "U+E3CF", + "description": "Flat 23S-down" + }, + "accSagittalFlat23SUp": { + "codepoint": "U+E3B1", + "description": "Flat 23S-up" + }, + "accSagittalFlat25SDown": { + "codepoint": "U+E323", + "description": "Flat 25S-down, 7\u00b0 down [53 EDO]" + }, + "accSagittalFlat25SUp": { + "codepoint": "U+E311", + "description": "Flat 25S-up, 3\u00b0 down [53 EDO]" + }, + "accSagittalFlat35LDown": { + "codepoint": "U+E32B", + "description": "Flat 35L-down, 5\u00b0 down [50 EDO]" + }, + "accSagittalFlat35MDown": { + "codepoint": "U+E325", + "description": "Flat 35M-down, 4\u00b0 down [50 EDO], 6\u00b0 down [27 EDO], 13/18-tone down" + }, + "accSagittalFlat49LDown": { + "codepoint": "U+E3D9", + "description": "Flat 49L-down" + }, + "accSagittalFlat49MDown": { + "codepoint": "U+E3D5", + "description": "Flat 49M-down" + }, + "accSagittalFlat49SDown": { + "codepoint": "U+E3CD", + "description": "Flat 49S-down" + }, + "accSagittalFlat49SUp": { + "codepoint": "U+E3B3", + "description": "Flat 49S-up" + }, + "accSagittalFlat55CDown": { + "codepoint": "U+E359", + "description": "Flat 55C-down, 11\u00b0 down [96 EDO], 11/16-tone down" + }, + "accSagittalFlat55CUp": { + "codepoint": "U+E34F", + "description": "Flat 55C-up, 5\u00b0 down [96 EDO], 5/16-tone down" + }, + "accSagittalFlat5CDown": { + "codepoint": "U+E31F", + "description": "Flat 5C-down, 4\u00b0[22 29] 5\u00b0[27 34 41] 6\u00b0[39 46 53] down, 7/12-tone down" + }, + "accSagittalFlat5CUp": { + "codepoint": "U+E315", + "description": "Flat 5C-up, 2\u00b0[22 29] 3\u00b0[27 34 41] 4\u00b0[39 46 53] 5\u00b072 7\u00b0[96] down, 5/12-tone down" + }, + "accSagittalFlat5v11SDown": { + "codepoint": "U+E35D", + "description": "Flat 5:11S-down" + }, + "accSagittalFlat5v11SUp": { + "codepoint": "U+E34B", + "description": "Flat 5:11S-up" + }, + "accSagittalFlat5v13LDown": { + "codepoint": "U+E3DD", + "description": "Flat 5:13L-down" + }, + "accSagittalFlat5v13MDown": { + "codepoint": "U+E3D1", + "description": "Flat 5:13M-down" + }, + "accSagittalFlat5v19CDown": { + "codepoint": "U+E37F", + "description": "Flat 5:19C-down, 11/20-tone down" + }, + "accSagittalFlat5v19CUp": { + "codepoint": "U+E379", + "description": "Flat 5:19C-up, 9/20-tone down" + }, + "accSagittalFlat5v23SDown": { + "codepoint": "U+E381", + "description": "Flat 5:23S-down, 7\u00b0 down [60 EDO], 7/10-tone down" + }, + "accSagittalFlat5v23SUp": { + "codepoint": "U+E377", + "description": "Flat 5:23S-up, 3\u00b0 down [60 EDO], 3/10-tone down" + }, + "accSagittalFlat5v49MDown": { + "codepoint": "U+E3D7", + "description": "Flat 5:49M-down" + }, + "accSagittalFlat5v7kDown": { + "codepoint": "U+E31D", + "description": "Flat 5:7k-down" + }, + "accSagittalFlat5v7kUp": { + "codepoint": "U+E317", + "description": "Flat 5:7k-up" + }, + "accSagittalFlat7CDown": { + "codepoint": "U+E321", + "description": "Flat 7C-down, 4\u00b0 down [43 EDO], 8\u00b0 down [72 EDO], 2/3-tone down" + }, + "accSagittalFlat7CUp": { + "codepoint": "U+E313", + "description": "Flat 7C-up, 2\u00b0 down [43 EDO], 4\u00b0 down [72 EDO], 1/3-tone down" + }, + "accSagittalFlat7v11CDown": { + "codepoint": "U+E35B", + "description": "Flat 7:11C-down, 6\u00b0 down [60 EDO], 3/5- tone down" + }, + "accSagittalFlat7v11CUp": { + "codepoint": "U+E34D", + "description": "Flat 7:11C-up, 4\u00b0 down [60 EDO], 2/5-tone down" + }, + "accSagittalFlat7v11kDown": { + "codepoint": "U+E355", + "description": "Flat 7:11k-down" + }, + "accSagittalFlat7v11kUp": { + "codepoint": "U+E353", + "description": "Flat 7:11k-up" + }, + "accSagittalFlat7v19CDown": { + "codepoint": "U+E3CB", + "description": "Flat 7:19C-down" + }, + "accSagittalFlat7v19CUp": { + "codepoint": "U+E3B5", + "description": "Flat 7:19C-up" + }, + "accSagittalFractionalTinaDown": { + "codepoint": "U+E40B", + "description": "Fractional tina down, 77/(5\u22c537)-schismina down, 0.08 cents down" + }, + "accSagittalFractionalTinaUp": { + "codepoint": "U+E40A", + "description": "Fractional tina up, 77/(5\u22c537)-schismina up, 0.08 cents up" + }, + "accSagittalGrave": { + "codepoint": "U+E3F3", + "description": "Grave, 5 schisma down, 2 cents down" + }, + "accSagittalShaftDown": { + "codepoint": "U+E3F1", + "description": "Shaft down, (natural for use with only diacritics down)" + }, + "accSagittalShaftUp": { + "codepoint": "U+E3F0", + "description": "Shaft up, (natural for use with only diacritics up)" + }, + "accSagittalSharp": { + "codepoint": "U+E318", + "description": "Sharp, (apotome up)[almost all EDOs], 1/2-tone up" + }, + "accSagittalSharp11LUp": { + "codepoint": "U+E328", + "description": "Sharp 11L-up, 8\u00b0 up [46 EDO]" + }, + "accSagittalSharp11MUp": { + "codepoint": "U+E326", + "description": "Sharp 11M-up, 3\u00b0 up [17 31 EDOs], 7\u00b0 up [46 EDO], 3/4-tone up" + }, + "accSagittalSharp11v19LUp": { + "codepoint": "U+E3DA", + "description": "Sharp 11:19L-up" + }, + "accSagittalSharp11v19MUp": { + "codepoint": "U+E3D2", + "description": "Sharp 11:19M-up" + }, + "accSagittalSharp11v49CDown": { + "codepoint": "U+E3B8", + "description": "Sharp 11:49C-down" + }, + "accSagittalSharp11v49CUp": { + "codepoint": "U+E3C6", + "description": "Sharp 11:49C-up" + }, + "accSagittalSharp143CDown": { + "codepoint": "U+E3BA", + "description": "Sharp 143C-down" + }, + "accSagittalSharp143CUp": { + "codepoint": "U+E3C4", + "description": "Sharp 143C-up" + }, + "accSagittalSharp17CDown": { + "codepoint": "U+E350", + "description": "Sharp 17C-down" + }, + "accSagittalSharp17CUp": { + "codepoint": "U+E356", + "description": "Sharp 17C-up" + }, + "accSagittalSharp17kDown": { + "codepoint": "U+E3BC", + "description": "Sharp 17k-down" + }, + "accSagittalSharp17kUp": { + "codepoint": "U+E3C2", + "description": "Sharp 17k-up" + }, + "accSagittalSharp19CDown": { + "codepoint": "U+E3B6", + "description": "Sharp 19C-down" + }, + "accSagittalSharp19CUp": { + "codepoint": "U+E3C8", + "description": "Sharp 19C-up" + }, + "accSagittalSharp19sDown": { + "codepoint": "U+E3BE", + "description": "Sharp 19s-down" + }, + "accSagittalSharp19sUp": { + "codepoint": "U+E3C0", + "description": "Sharp 19s-up" + }, + "accSagittalSharp23CDown": { + "codepoint": "U+E37A", + "description": "Sharp 23C-down, 6\u00b0 up [96 EDO], 3/8-tone up" + }, + "accSagittalSharp23CUp": { + "codepoint": "U+E37C", + "description": "Sharp 23C-up, 10\u00b0 up [96 EDO], 5/8-tone up" + }, + "accSagittalSharp23SDown": { + "codepoint": "U+E3B0", + "description": "Sharp 23S-down" + }, + "accSagittalSharp23SUp": { + "codepoint": "U+E3CE", + "description": "Sharp 23S-up" + }, + "accSagittalSharp25SDown": { + "codepoint": "U+E310", + "description": "Sharp 25S-down, 3\u00b0 up [53 EDO]" + }, + "accSagittalSharp25SUp": { + "codepoint": "U+E322", + "description": "Sharp 25S-up, 7\u00b0 up [53 EDO]" + }, + "accSagittalSharp35LUp": { + "codepoint": "U+E32A", + "description": "Sharp 35L-up, 5\u00b0 up [50 EDO]" + }, + "accSagittalSharp35MUp": { + "codepoint": "U+E324", + "description": "Sharp 35M-up, 4\u00b0 up [50 EDO], 6\u00b0 up [27 EDO], 13/18-tone up" + }, + "accSagittalSharp49LUp": { + "codepoint": "U+E3D8", + "description": "Sharp 49L-up" + }, + "accSagittalSharp49MUp": { + "codepoint": "U+E3D4", + "description": "Sharp 49M-up" + }, + "accSagittalSharp49SDown": { + "codepoint": "U+E3B2", + "description": "Sharp 49S-down" + }, + "accSagittalSharp49SUp": { + "codepoint": "U+E3CC", + "description": "Sharp 49S-up" + }, + "accSagittalSharp55CDown": { + "codepoint": "U+E34E", + "description": "Sharp 55C-down, 5\u00b0 up [96 EDO], 5/16-tone up" + }, + "accSagittalSharp55CUp": { + "codepoint": "U+E358", + "description": "Sharp 55C-up, 11\u00b0 up [96 EDO], 11/16-tone up" + }, + "accSagittalSharp5CDown": { + "codepoint": "U+E314", + "description": "Sharp 5C-down, 2\u00b0[22 29] 3\u00b0[27 34 41] 4\u00b0[39 46 53] 5\u00b0[72] 7\u00b0[96] up, 5/12-tone up" + }, + "accSagittalSharp5CUp": { + "codepoint": "U+E31E", + "description": "Sharp 5C-up, 4\u00b0[22 29] 5\u00b0[27 34 41] 6\u00b0[39 46 53] up, 7/12-tone up" + }, + "accSagittalSharp5v11SDown": { + "codepoint": "U+E34A", + "description": "Sharp 5:11S-down" + }, + "accSagittalSharp5v11SUp": { + "codepoint": "U+E35C", + "description": "Sharp 5:11S-up" + }, + "accSagittalSharp5v13LUp": { + "codepoint": "U+E3DC", + "description": "Sharp 5:13L-up" + }, + "accSagittalSharp5v13MUp": { + "codepoint": "U+E3D0", + "description": "Sharp 5:13M-up" + }, + "accSagittalSharp5v19CDown": { + "codepoint": "U+E378", + "description": "Sharp 5:19C-down, 9/20-tone up" + }, + "accSagittalSharp5v19CUp": { + "codepoint": "U+E37E", + "description": "Sharp 5:19C-up, 11/20-tone up" + }, + "accSagittalSharp5v23SDown": { + "codepoint": "U+E376", + "description": "Sharp 5:23S-down, 3\u00b0 up [60 EDO], 3/10-tone up" + }, + "accSagittalSharp5v23SUp": { + "codepoint": "U+E380", + "description": "Sharp 5:23S-up, 7\u00b0 up [60 EDO], 7/10-tone up" + }, + "accSagittalSharp5v49MUp": { + "codepoint": "U+E3D6", + "description": "Sharp 5:49M-up, (one and a half apotomes)" + }, + "accSagittalSharp5v7kDown": { + "codepoint": "U+E316", + "description": "Sharp 5:7k-down" + }, + "accSagittalSharp5v7kUp": { + "codepoint": "U+E31C", + "description": "Sharp 5:7k-up" + }, + "accSagittalSharp7CDown": { + "codepoint": "U+E312", + "description": "Sharp 7C-down, 2\u00b0 up [43 EDO], 4\u00b0 up [72 EDO], 1/3-tone up" + }, + "accSagittalSharp7CUp": { + "codepoint": "U+E320", + "description": "Sharp 7C-up, 4\u00b0 up [43 EDO], 8\u00b0 up [72 EDO], 2/3-tone up" + }, + "accSagittalSharp7v11CDown": { + "codepoint": "U+E34C", + "description": "Sharp 7:11C-down, 4\u00b0 up [60 EDO], 2/5-tone up" + }, + "accSagittalSharp7v11CUp": { + "codepoint": "U+E35A", + "description": "Sharp 7:11C-up, 6\u00b0 up [60 EDO], 3/5- tone up" + }, + "accSagittalSharp7v11kDown": { + "codepoint": "U+E352", + "description": "Sharp 7:11k-down" + }, + "accSagittalSharp7v11kUp": { + "codepoint": "U+E354", + "description": "Sharp 7:11k-up" + }, + "accSagittalSharp7v19CDown": { + "codepoint": "U+E3B4", + "description": "Sharp 7:19C-down" + }, + "accSagittalSharp7v19CUp": { + "codepoint": "U+E3CA", + "description": "Sharp 7:19C-up" + }, + "accSagittalUnused1": { + "codepoint": "U+E31A", + "description": "Unused" + }, + "accSagittalUnused2": { + "codepoint": "U+E31B", + "description": "Unused" + }, + "accSagittalUnused3": { + "codepoint": "U+E3DE", + "description": "Unused" + }, + "accSagittalUnused4": { + "codepoint": "U+E3DF", + "description": "Unused" + }, + "accdnCombDot": { + "codepoint": "U+E8CA", + "description": "Combining accordion coupler dot" + }, + "accdnCombLH2RanksEmpty": { + "codepoint": "U+E8C8", + "description": "Combining left hand, 2 ranks, empty" + }, + "accdnCombLH3RanksEmptySquare": { + "codepoint": "U+E8C9", + "description": "Combining left hand, 3 ranks, empty (square)" + }, + "accdnCombRH3RanksEmpty": { + "codepoint": "U+E8C6", + "description": "Combining right hand, 3 ranks, empty" + }, + "accdnCombRH4RanksEmpty": { + "codepoint": "U+E8C7", + "description": "Combining right hand, 4 ranks, empty" + }, + "accdnDiatonicClef": { + "codepoint": "U+E079", + "description": "Diatonic accordion clef" + }, + "accdnLH2Ranks16Round": { + "codepoint": "U+E8BC", + "description": "Left hand, 2 ranks, 16' stop (round)" + }, + "accdnLH2Ranks8Plus16Round": { + "codepoint": "U+E8BD", + "description": "Left hand, 2 ranks, 8' stop + 16' stop (round)" + }, + "accdnLH2Ranks8Round": { + "codepoint": "U+E8BB", + "description": "Left hand, 2 ranks, 8' stop (round)" + }, + "accdnLH2RanksFullMasterRound": { + "codepoint": "U+E8C0", + "description": "Left hand, 2 ranks, full master (round)" + }, + "accdnLH2RanksMasterPlus16Round": { + "codepoint": "U+E8BF", + "description": "Left hand, 2 ranks, master + 16' stop (round)" + }, + "accdnLH2RanksMasterRound": { + "codepoint": "U+E8BE", + "description": "Left hand, 2 ranks, master (round)" + }, + "accdnLH3Ranks2Plus8Square": { + "codepoint": "U+E8C4", + "description": "Left hand, 3 ranks, 2' stop + 8' stop (square)" + }, + "accdnLH3Ranks2Square": { + "codepoint": "U+E8C2", + "description": "Left hand, 3 ranks, 2' stop (square)" + }, + "accdnLH3Ranks8Square": { + "codepoint": "U+E8C1", + "description": "Left hand, 3 ranks, 8' stop (square)" + }, + "accdnLH3RanksDouble8Square": { + "codepoint": "U+E8C3", + "description": "Left hand, 3 ranks, double 8' stop (square)" + }, + "accdnLH3RanksTuttiSquare": { + "codepoint": "U+E8C5", + "description": "Left hand, 3 ranks, 2' stop + double 8' stop (tutti) (square)" + }, + "accdnPull": { + "codepoint": "U+E8CC", + "description": "Pull" + }, + "accdnPush": { + "codepoint": "U+E8CB", + "description": "Push" + }, + "accdnRH3RanksAccordion": { + "codepoint": "U+E8AC", + "description": "Right hand, 3 ranks, 8' stop + upper tremolo 8' stop + 16' stop (accordion)" + }, + "accdnRH3RanksAuthenticMusette": { + "codepoint": "U+E8A8", + "description": "Right hand, 3 ranks, lower tremolo 8' stop + 8' stop + upper tremolo 8' stop (authentic musette)" + }, + "accdnRH3RanksBandoneon": { + "codepoint": "U+E8AB", + "description": "Right hand, 3 ranks, 8' stop + 16' stop (bandone\u00f3n)" + }, + "accdnRH3RanksBassoon": { + "codepoint": "U+E8A4", + "description": "Right hand, 3 ranks, 16' stop (bassoon)" + }, + "accdnRH3RanksClarinet": { + "codepoint": "U+E8A1", + "description": "Right hand, 3 ranks, 8' stop (clarinet)" + }, + "accdnRH3RanksDoubleTremoloLower8ve": { + "codepoint": "U+E8B1", + "description": "Right hand, 3 ranks, lower tremolo 8' stop + 8' stop + upper tremolo 8' stop + 16' stop" + }, + "accdnRH3RanksDoubleTremoloUpper8ve": { + "codepoint": "U+E8B2", + "description": "Right hand, 3 ranks, 4' stop + lower tremolo 8' stop + 8' stop + upper tremolo 8' stop" + }, + "accdnRH3RanksFullFactory": { + "codepoint": "U+E8B3", + "description": "Right hand, 3 ranks, 4' stop + lower tremolo 8' stop + 8' stop + upper tremolo 8' stop + 16' stop" + }, + "accdnRH3RanksHarmonium": { + "codepoint": "U+E8AA", + "description": "Right hand, 3 ranks, 4' stop + 8' stop + 16' stop (harmonium)" + }, + "accdnRH3RanksImitationMusette": { + "codepoint": "U+E8A7", + "description": "Right hand, 3 ranks, 4' stop + 8' stop + upper tremolo 8' stop (imitation musette)" + }, + "accdnRH3RanksLowerTremolo8": { + "codepoint": "U+E8A3", + "description": "Right hand, 3 ranks, lower tremolo 8' stop" + }, + "accdnRH3RanksMaster": { + "codepoint": "U+E8AD", + "description": "Right hand, 3 ranks, 4' stop + lower tremolo 8' stop + upper tremolo 8' stop + 16' stop (master)" + }, + "accdnRH3RanksOboe": { + "codepoint": "U+E8A5", + "description": "Right hand, 3 ranks, 4' stop + 8' stop (oboe)" + }, + "accdnRH3RanksOrgan": { + "codepoint": "U+E8A9", + "description": "Right hand, 3 ranks, 4' stop + 16' stop (organ)" + }, + "accdnRH3RanksPiccolo": { + "codepoint": "U+E8A0", + "description": "Right hand, 3 ranks, 4' stop (piccolo)" + }, + "accdnRH3RanksTremoloLower8ve": { + "codepoint": "U+E8AF", + "description": "Right hand, 3 ranks, lower tremolo 8' stop + upper tremolo 8' stop + 16' stop" + }, + "accdnRH3RanksTremoloUpper8ve": { + "codepoint": "U+E8B0", + "description": "Right hand, 3 ranks, 4' stop + lower tremolo 8' stop + upper tremolo 8' stop" + }, + "accdnRH3RanksTwoChoirs": { + "codepoint": "U+E8AE", + "description": "Right hand, 3 ranks, lower tremolo 8' stop + upper tremolo 8' stop" + }, + "accdnRH3RanksUpperTremolo8": { + "codepoint": "U+E8A2", + "description": "Right hand, 3 ranks, upper tremolo 8' stop" + }, + "accdnRH3RanksViolin": { + "codepoint": "U+E8A6", + "description": "Right hand, 3 ranks, 8' stop + upper tremolo 8' stop (violin)" + }, + "accdnRH4RanksAlto": { + "codepoint": "U+E8B5", + "description": "Right hand, 4 ranks, alto" + }, + "accdnRH4RanksBassAlto": { + "codepoint": "U+E8BA", + "description": "Right hand, 4 ranks, bass/alto" + }, + "accdnRH4RanksMaster": { + "codepoint": "U+E8B7", + "description": "Right hand, 4 ranks, master" + }, + "accdnRH4RanksSoftBass": { + "codepoint": "U+E8B8", + "description": "Right hand, 4 ranks, soft bass" + }, + "accdnRH4RanksSoftTenor": { + "codepoint": "U+E8B9", + "description": "Right hand, 4 ranks, soft tenor" + }, + "accdnRH4RanksSoprano": { + "codepoint": "U+E8B4", + "description": "Right hand, 4 ranks, soprano" + }, + "accdnRH4RanksTenor": { + "codepoint": "U+E8B6", + "description": "Right hand, 4 ranks, tenor" + }, + "accdnRicochet2": { + "codepoint": "U+E8CD", + "description": "Ricochet (2 tones)" + }, + "accdnRicochet3": { + "codepoint": "U+E8CE", + "description": "Ricochet (3 tones)" + }, + "accdnRicochet4": { + "codepoint": "U+E8CF", + "description": "Ricochet (4 tones)" + }, + "accdnRicochet5": { + "codepoint": "U+E8D0", + "description": "Ricochet (5 tones)" + }, + "accdnRicochet6": { + "codepoint": "U+E8D1", + "description": "Ricochet (6 tones)" + }, + "accdnRicochetStem2": { + "codepoint": "U+E8D2", + "description": "Combining ricochet for stem (2 tones)" + }, + "accdnRicochetStem3": { + "codepoint": "U+E8D3", + "description": "Combining ricochet for stem (3 tones)" + }, + "accdnRicochetStem4": { + "codepoint": "U+E8D4", + "description": "Combining ricochet for stem (4 tones)" + }, + "accdnRicochetStem5": { + "codepoint": "U+E8D5", + "description": "Combining ricochet for stem (5 tones)" + }, + "accdnRicochetStem6": { + "codepoint": "U+E8D6", + "description": "Combining ricochet for stem (6 tones)" + }, + "accidental1CommaFlat": { + "codepoint": "U+E454", + "description": "1-comma flat" + }, + "accidental1CommaSharp": { + "codepoint": "U+E450", + "description": "1-comma sharp" + }, + "accidental2CommaFlat": { + "codepoint": "U+E455", + "description": "2-comma flat" + }, + "accidental2CommaSharp": { + "codepoint": "U+E451", + "description": "2-comma sharp" + }, + "accidental3CommaFlat": { + "codepoint": "U+E456", + "description": "3-comma flat" + }, + "accidental3CommaSharp": { + "codepoint": "U+E452", + "description": "3-comma sharp" + }, + "accidental4CommaFlat": { + "codepoint": "U+E457", + "description": "4-comma flat" + }, + "accidental5CommaSharp": { + "codepoint": "U+E453", + "description": "5-comma sharp" + }, + "accidentalArrowDown": { + "codepoint": "U+E27B", + "description": "Arrow down (lower by one quarter-tone)" + }, + "accidentalArrowUp": { + "codepoint": "U+E27A", + "description": "Arrow up (raise by one quarter-tone)" + }, + "accidentalBakiyeFlat": { + "codepoint": "U+E442", + "description": "Bakiye (flat)" + }, + "accidentalBakiyeSharp": { + "codepoint": "U+E445", + "description": "Bakiye (sharp)" + }, + "accidentalBracketLeft": { + "codepoint": "U+E26C", + "description": "Accidental bracket, left" + }, + "accidentalBracketRight": { + "codepoint": "U+E26D", + "description": "Accidental bracket, right" + }, + "accidentalBuyukMucennebFlat": { + "codepoint": "U+E440", + "description": "B\u00fcy\u00fck m\u00fccenneb (flat)" + }, + "accidentalBuyukMucennebSharp": { + "codepoint": "U+E447", + "description": "B\u00fcy\u00fck m\u00fccenneb (sharp)" + }, + "accidentalCombiningCloseCurlyBrace": { + "codepoint": "U+E2EF", + "description": "Combining close curly brace" + }, + "accidentalCombiningLower17Schisma": { + "codepoint": "U+E2E6", + "description": "Combining lower by one 17-limit schisma" + }, + "accidentalCombiningLower19Schisma": { + "codepoint": "U+E2E8", + "description": "Combining lower by one 19-limit schisma" + }, + "accidentalCombiningLower23Limit29LimitComma": { + "codepoint": "U+E2EA", + "description": "Combining lower by one 23-limit comma" + }, + "accidentalCombiningLower29LimitComma": { + "codepoint": "U+EE50", + "description": "Combining lower by one 29-limit comma" + }, + "accidentalCombiningLower31Schisma": { + "codepoint": "U+E2EC", + "description": "Combining lower by one 31-limit schisma" + }, + "accidentalCombiningLower37Quartertone": { + "codepoint": "U+EE52", + "description": "Combining lower by one 37-limit quartertone" + }, + "accidentalCombiningLower41Comma": { + "codepoint": "U+EE54", + "description": "Combining lower by one 41-limit comma" + }, + "accidentalCombiningLower43Comma": { + "codepoint": "U+EE56", + "description": "Combining lower by one 43-limit comma" + }, + "accidentalCombiningLower47Quartertone": { + "codepoint": "U+EE58", + "description": "Combining lower by one 47-limit quartertone" + }, + "accidentalCombiningLower53LimitComma": { + "codepoint": "U+E2F7", + "description": "Combining lower by one 53-limit comma" + }, + "accidentalCombiningOpenCurlyBrace": { + "codepoint": "U+E2EE", + "description": "Combining open curly brace" + }, + "accidentalCombiningRaise17Schisma": { + "codepoint": "U+E2E7", + "description": "Combining raise by one 17-limit schisma" + }, + "accidentalCombiningRaise19Schisma": { + "codepoint": "U+E2E9", + "description": "Combining raise by one 19-limit schisma" + }, + "accidentalCombiningRaise23Limit29LimitComma": { + "codepoint": "U+E2EB", + "description": "Combining raise by one 23-limit comma" + }, + "accidentalCombiningRaise29LimitComma": { + "codepoint": "U+EE51", + "description": "Combining raise by one 29-limit comma" + }, + "accidentalCombiningRaise31Schisma": { + "codepoint": "U+E2ED", + "description": "Combining raise by one 31-limit schisma" + }, + "accidentalCombiningRaise37Quartertone": { + "codepoint": "U+EE53", + "description": "Combining raise by one 37-limit quartertone" + }, + "accidentalCombiningRaise41Comma": { + "codepoint": "U+EE55", + "description": "Combining raise by one 41-limit comma" + }, + "accidentalCombiningRaise43Comma": { + "codepoint": "U+EE57", + "description": "Combining raise by one 43-limit comma" + }, + "accidentalCombiningRaise47Quartertone": { + "codepoint": "U+EE59", + "description": "Combining raise by one 47-limit quartertone" + }, + "accidentalCombiningRaise53LimitComma": { + "codepoint": "U+E2F8", + "description": "Combining raise by one 53-limit comma" + }, + "accidentalCommaSlashDown": { + "codepoint": "U+E47A", + "description": "Syntonic/Didymus comma (80:81) down (Bosanquet)" + }, + "accidentalCommaSlashUp": { + "codepoint": "U+E479", + "description": "Syntonic/Didymus comma (80:81) up (Bosanquet)" + }, + "accidentalDoubleFlat": { + "alternateCodepoint": "U+1D12B", + "codepoint": "U+E264", + "description": "Double flat" + }, + "accidentalDoubleFlatArabic": { + "codepoint": "U+ED30", + "description": "Arabic double flat" + }, + "accidentalDoubleFlatEqualTempered": { + "codepoint": "U+E2F0", + "description": "Double flat equal tempered semitone" + }, + "accidentalDoubleFlatOneArrowDown": { + "codepoint": "U+E2C0", + "description": "Double flat lowered by one syntonic comma" + }, + "accidentalDoubleFlatOneArrowUp": { + "codepoint": "U+E2C5", + "description": "Double flat raised by one syntonic comma" + }, + "accidentalDoubleFlatReversed": { + "codepoint": "U+E483", + "description": "Reversed double flat" + }, + "accidentalDoubleFlatThreeArrowsDown": { + "codepoint": "U+E2D4", + "description": "Double flat lowered by three syntonic commas" + }, + "accidentalDoubleFlatThreeArrowsUp": { + "codepoint": "U+E2D9", + "description": "Double flat raised by three syntonic commas" + }, + "accidentalDoubleFlatTurned": { + "codepoint": "U+E485", + "description": "Turned double flat" + }, + "accidentalDoubleFlatTwoArrowsDown": { + "codepoint": "U+E2CA", + "description": "Double flat lowered by two syntonic commas" + }, + "accidentalDoubleFlatTwoArrowsUp": { + "codepoint": "U+E2CF", + "description": "Double flat raised by two syntonic commas" + }, + "accidentalDoubleSharp": { + "alternateCodepoint": "U+1D12A", + "codepoint": "U+E263", + "description": "Double sharp" + }, + "accidentalDoubleSharpArabic": { + "codepoint": "U+ED38", + "description": "Arabic double sharp" + }, + "accidentalDoubleSharpEqualTempered": { + "codepoint": "U+E2F4", + "description": "Double sharp equal tempered semitone" + }, + "accidentalDoubleSharpOneArrowDown": { + "codepoint": "U+E2C4", + "description": "Double sharp lowered by one syntonic comma" + }, + "accidentalDoubleSharpOneArrowUp": { + "codepoint": "U+E2C9", + "description": "Double sharp raised by one syntonic comma" + }, + "accidentalDoubleSharpThreeArrowsDown": { + "codepoint": "U+E2D8", + "description": "Double sharp lowered by three syntonic commas" + }, + "accidentalDoubleSharpThreeArrowsUp": { + "codepoint": "U+E2DD", + "description": "Double sharp raised by three syntonic commas" + }, + "accidentalDoubleSharpTwoArrowsDown": { + "codepoint": "U+E2CE", + "description": "Double sharp lowered by two syntonic commas" + }, + "accidentalDoubleSharpTwoArrowsUp": { + "codepoint": "U+E2D3", + "description": "Double sharp raised by two syntonic commas" + }, + "accidentalEnharmonicAlmostEqualTo": { + "codepoint": "U+E2FA", + "description": "Enharmonically reinterpret accidental almost equal to" + }, + "accidentalEnharmonicEquals": { + "codepoint": "U+E2FB", + "description": "Enharmonically reinterpret accidental equals" + }, + "accidentalEnharmonicTilde": { + "codepoint": "U+E2F9", + "description": "Enharmonically reinterpret accidental tilde" + }, + "accidentalFilledReversedFlatAndFlat": { + "codepoint": "U+E296", + "description": "Filled reversed flat and flat" + }, + "accidentalFilledReversedFlatAndFlatArrowDown": { + "codepoint": "U+E298", + "description": "Filled reversed flat and flat with arrow down" + }, + "accidentalFilledReversedFlatAndFlatArrowUp": { + "codepoint": "U+E297", + "description": "Filled reversed flat and flat with arrow up" + }, + "accidentalFilledReversedFlatArrowDown": { + "codepoint": "U+E293", + "description": "Filled reversed flat with arrow down" + }, + "accidentalFilledReversedFlatArrowUp": { + "codepoint": "U+E292", + "description": "Filled reversed flat with arrow up" + }, + "accidentalFiveQuarterTonesFlatArrowDown": { + "codepoint": "U+E279", + "description": "Five-quarter-tones flat" + }, + "accidentalFiveQuarterTonesSharpArrowUp": { + "codepoint": "U+E276", + "description": "Five-quarter-tones sharp" + }, + "accidentalFlat": { + "alternateCodepoint": "U+266D", + "codepoint": "U+E260", + "description": "Flat" + }, + "accidentalFlatArabic": { + "codepoint": "U+ED32", + "description": "Arabic half-tone flat" + }, + "accidentalFlatEqualTempered": { + "codepoint": "U+E2F1", + "description": "Flat equal tempered semitone" + }, + "accidentalFlatLoweredStockhausen": { + "codepoint": "U+ED53", + "description": "Lowered flat (Stockhausen)" + }, + "accidentalFlatOneArrowDown": { + "codepoint": "U+E2C1", + "description": "Flat lowered by one syntonic comma" + }, + "accidentalFlatOneArrowUp": { + "codepoint": "U+E2C6", + "description": "Flat raised by one syntonic comma" + }, + "accidentalFlatRaisedStockhausen": { + "codepoint": "U+ED52", + "description": "Raised flat (Stockhausen)" + }, + "accidentalFlatRepeatedLineStockhausen": { + "codepoint": "U+ED5C", + "description": "Repeated flat, note on line (Stockhausen)" + }, + "accidentalFlatRepeatedSpaceStockhausen": { + "codepoint": "U+ED5B", + "description": "Repeated flat, note in space (Stockhausen)" + }, + "accidentalFlatThreeArrowsDown": { + "codepoint": "U+E2D5", + "description": "Flat lowered by three syntonic commas" + }, + "accidentalFlatThreeArrowsUp": { + "codepoint": "U+E2DA", + "description": "Flat raised by three syntonic commas" + }, + "accidentalFlatTurned": { + "codepoint": "U+E484", + "description": "Turned flat" + }, + "accidentalFlatTwoArrowsDown": { + "codepoint": "U+E2CB", + "description": "Flat lowered by two syntonic commas" + }, + "accidentalFlatTwoArrowsUp": { + "codepoint": "U+E2D0", + "description": "Flat raised by two syntonic commas" + }, + "accidentalHabaFlatQuarterToneHigher": { + "codepoint": "U+EE65", + "description": "Quarter-tone higher (Alois H\u00e1ba)" + }, + "accidentalHabaFlatThreeQuarterTonesLower": { + "codepoint": "U+EE69", + "description": "Three quarter-tones lower (Alois H\u00e1ba)" + }, + "accidentalHabaQuarterToneHigher": { + "codepoint": "U+EE64", + "description": "Quarter-tone higher (Alois H\u00e1ba)" + }, + "accidentalHabaQuarterToneLower": { + "codepoint": "U+EE67", + "description": "Quarter-tone lower (Alois H\u00e1ba)" + }, + "accidentalHabaSharpQuarterToneLower": { + "codepoint": "U+EE68", + "description": "Quarter-tone lower (Alois H\u00e1ba)" + }, + "accidentalHabaSharpThreeQuarterTonesHigher": { + "codepoint": "U+EE66", + "description": "Three quarter-tones higher (Alois H\u00e1ba)" + }, + "accidentalHalfSharpArrowDown": { + "codepoint": "U+E29A", + "description": "Half sharp with arrow down" + }, + "accidentalHalfSharpArrowUp": { + "codepoint": "U+E299", + "description": "Half sharp with arrow up" + }, + "accidentalJohnston13": { + "codepoint": "U+E2B6", + "description": "Thirteen (raise by 65:64)" + }, + "accidentalJohnston31": { + "codepoint": "U+E2B7", + "description": "Inverted 13 (lower by 65:64)" + }, + "accidentalJohnstonDown": { + "codepoint": "U+E2B5", + "description": "Down arrow (lower by 33:32)" + }, + "accidentalJohnstonEl": { + "codepoint": "U+E2B2", + "description": "Inverted seven (raise by 36:35)" + }, + "accidentalJohnstonMinus": { + "codepoint": "U+E2B1", + "description": "Minus (lower by 81:80)" + }, + "accidentalJohnstonPlus": { + "codepoint": "U+E2B0", + "description": "Plus (raise by 81:80)" + }, + "accidentalJohnstonSeven": { + "codepoint": "U+E2B3", + "description": "Seven (lower by 36:35)" + }, + "accidentalJohnstonUp": { + "codepoint": "U+E2B4", + "description": "Up arrow (raise by 33:32)" + }, + "accidentalKomaFlat": { + "codepoint": "U+E443", + "description": "Koma (flat)" + }, + "accidentalKomaSharp": { + "codepoint": "U+E444", + "description": "Koma (sharp)" + }, + "accidentalKoron": { + "codepoint": "U+E460", + "description": "Koron (quarter tone flat)" + }, + "accidentalKucukMucennebFlat": { + "codepoint": "U+E441", + "description": "K\u00fc\u00e7\u00fck m\u00fccenneb (flat)" + }, + "accidentalKucukMucennebSharp": { + "codepoint": "U+E446", + "description": "K\u00fc\u00e7\u00fck m\u00fccenneb (sharp)" + }, + "accidentalLargeDoubleSharp": { + "codepoint": "U+E47D", + "description": "Large double sharp" + }, + "accidentalLowerOneSeptimalComma": { + "codepoint": "U+E2DE", + "description": "Lower by one septimal comma" + }, + "accidentalLowerOneTridecimalQuartertone": { + "codepoint": "U+E2E4", + "description": "Lower by one tridecimal quartertone" + }, + "accidentalLowerOneUndecimalQuartertone": { + "codepoint": "U+E2E2", + "description": "Lower by one undecimal quartertone" + }, + "accidentalLowerTwoSeptimalCommas": { + "codepoint": "U+E2E0", + "description": "Lower by two septimal commas" + }, + "accidentalLoweredStockhausen": { + "codepoint": "U+ED51", + "description": "Lowered (Stockhausen)" + }, + "accidentalNarrowReversedFlat": { + "codepoint": "U+E284", + "description": "Narrow reversed flat(quarter-tone flat)" + }, + "accidentalNarrowReversedFlatAndFlat": { + "codepoint": "U+E285", + "description": "Narrow reversed flat and flat(three-quarter-tones flat)" + }, + "accidentalNatural": { + "alternateCodepoint": "U+266E", + "codepoint": "U+E261", + "description": "Natural" + }, + "accidentalNaturalArabic": { + "codepoint": "U+ED34", + "description": "Arabic natural" + }, + "accidentalNaturalEqualTempered": { + "codepoint": "U+E2F2", + "description": "Natural equal tempered semitone" + }, + "accidentalNaturalFlat": { + "codepoint": "U+E267", + "description": "Natural flat" + }, + "accidentalNaturalLoweredStockhausen": { + "codepoint": "U+ED55", + "description": "Lowered natural (Stockhausen)" + }, + "accidentalNaturalOneArrowDown": { + "codepoint": "U+E2C2", + "description": "Natural lowered by one syntonic comma" + }, + "accidentalNaturalOneArrowUp": { + "codepoint": "U+E2C7", + "description": "Natural raised by one syntonic comma" + }, + "accidentalNaturalRaisedStockhausen": { + "codepoint": "U+ED54", + "description": "Raised natural (Stockhausen)" + }, + "accidentalNaturalReversed": { + "codepoint": "U+E482", + "description": "Reversed natural" + }, + "accidentalNaturalSharp": { + "codepoint": "U+E268", + "description": "Natural sharp" + }, + "accidentalNaturalThreeArrowsDown": { + "codepoint": "U+E2D6", + "description": "Natural lowered by three syntonic commas" + }, + "accidentalNaturalThreeArrowsUp": { + "codepoint": "U+E2DB", + "description": "Natural raised by three syntonic commas" + }, + "accidentalNaturalTwoArrowsDown": { + "codepoint": "U+E2CC", + "description": "Natural lowered by two syntonic commas" + }, + "accidentalNaturalTwoArrowsUp": { + "codepoint": "U+E2D1", + "description": "Natural raised by two syntonic commas" + }, + "accidentalOneAndAHalfSharpsArrowDown": { + "codepoint": "U+E29C", + "description": "One and a half sharps with arrow down" + }, + "accidentalOneAndAHalfSharpsArrowUp": { + "codepoint": "U+E29B", + "description": "One and a half sharps with arrow up" + }, + "accidentalOneQuarterToneFlatFerneyhough": { + "codepoint": "U+E48F", + "description": "One-quarter-tone flat (Ferneyhough)" + }, + "accidentalOneQuarterToneFlatStockhausen": { + "codepoint": "U+ED59", + "description": "One-quarter-tone flat (Stockhausen)" + }, + "accidentalOneQuarterToneSharpFerneyhough": { + "codepoint": "U+E48E", + "description": "One-quarter-tone sharp (Ferneyhough)" + }, + "accidentalOneQuarterToneSharpStockhausen": { + "codepoint": "U+ED58", + "description": "One-quarter-tone sharp (Stockhausen)" + }, + "accidentalOneThirdToneFlatFerneyhough": { + "codepoint": "U+E48B", + "description": "One-third-tone flat (Ferneyhough)" + }, + "accidentalOneThirdToneSharpFerneyhough": { + "codepoint": "U+E48A", + "description": "One-third-tone sharp (Ferneyhough)" + }, + "accidentalParensLeft": { + "codepoint": "U+E26A", + "description": "Accidental parenthesis, left" + }, + "accidentalParensRight": { + "codepoint": "U+E26B", + "description": "Accidental parenthesis, right" + }, + "accidentalQuarterFlatEqualTempered": { + "codepoint": "U+E2F5", + "description": "Lower by one equal tempered quarter-tone" + }, + "accidentalQuarterSharpEqualTempered": { + "codepoint": "U+E2F6", + "description": "Raise by one equal tempered quarter tone" + }, + "accidentalQuarterToneFlat4": { + "alternateCodepoint": "U+1D133", + "codepoint": "U+E47F", + "description": "Quarter-tone flat" + }, + "accidentalQuarterToneFlatArabic": { + "codepoint": "U+ED33", + "description": "Arabic quarter-tone flat" + }, + "accidentalQuarterToneFlatArrowUp": { + "alternateCodepoint": "U+1D12C", + "codepoint": "U+E270", + "description": "Quarter-tone flat" + }, + "accidentalQuarterToneFlatFilledReversed": { + "codepoint": "U+E480", + "description": "Filled reversed flat (quarter-tone flat)" + }, + "accidentalQuarterToneFlatNaturalArrowDown": { + "alternateCodepoint": "U+1D12F", + "codepoint": "U+E273", + "description": "Quarter-tone flat" + }, + "accidentalQuarterToneFlatPenderecki": { + "codepoint": "U+E478", + "description": "Quarter tone flat (Penderecki)" + }, + "accidentalQuarterToneFlatStein": { + "codepoint": "U+E280", + "description": "Reversed flat (quarter-tone flat) (Stein)" + }, + "accidentalQuarterToneFlatVanBlankenburg": { + "codepoint": "U+E488", + "description": "Quarter-tone flat (van Blankenburg)" + }, + "accidentalQuarterToneSharp4": { + "alternateCodepoint": "U+1D132", + "codepoint": "U+E47E", + "description": "Quarter-tone sharp" + }, + "accidentalQuarterToneSharpArabic": { + "codepoint": "U+ED35", + "description": "Arabic quarter-tone sharp" + }, + "accidentalQuarterToneSharpArrowDown": { + "alternateCodepoint": "U+1D131", + "codepoint": "U+E275", + "description": "Quarter-tone sharp" + }, + "accidentalQuarterToneSharpBusotti": { + "codepoint": "U+E472", + "description": "Quarter tone sharp (Bussotti)" + }, + "accidentalQuarterToneSharpNaturalArrowUp": { + "alternateCodepoint": "U+1D12E", + "codepoint": "U+E272", + "description": "Quarter-tone sharp" + }, + "accidentalQuarterToneSharpStein": { + "codepoint": "U+E282", + "description": "Half sharp (quarter-tone sharp) (Stein)" + }, + "accidentalQuarterToneSharpWiggle": { + "codepoint": "U+E475", + "description": "Quarter tone sharp with wiggly tail" + }, + "accidentalRaiseOneSeptimalComma": { + "codepoint": "U+E2DF", + "description": "Raise by one septimal comma" + }, + "accidentalRaiseOneTridecimalQuartertone": { + "codepoint": "U+E2E5", + "description": "Raise by one tridecimal quartertone" + }, + "accidentalRaiseOneUndecimalQuartertone": { + "codepoint": "U+E2E3", + "description": "Raise by one undecimal quartertone" + }, + "accidentalRaiseTwoSeptimalCommas": { + "codepoint": "U+E2E1", + "description": "Raise by two septimal commas" + }, + "accidentalRaisedStockhausen": { + "codepoint": "U+ED50", + "description": "Raised (Stockhausen)" + }, + "accidentalReversedFlatAndFlatArrowDown": { + "codepoint": "U+E295", + "description": "Reversed flat and flat with arrow down" + }, + "accidentalReversedFlatAndFlatArrowUp": { + "codepoint": "U+E294", + "description": "Reversed flat and flat with arrow up" + }, + "accidentalReversedFlatArrowDown": { + "codepoint": "U+E291", + "description": "Reversed flat with arrow down" + }, + "accidentalReversedFlatArrowUp": { + "codepoint": "U+E290", + "description": "Reversed flat with arrow up" + }, + "accidentalSharp": { + "alternateCodepoint": "U+266F", + "codepoint": "U+E262", + "description": "Sharp" + }, + "accidentalSharpArabic": { + "codepoint": "U+ED36", + "description": "Arabic half-tone sharp" + }, + "accidentalSharpEqualTempered": { + "codepoint": "U+E2F3", + "description": "Sharp equal tempered semitone" + }, + "accidentalSharpLoweredStockhausen": { + "codepoint": "U+ED57", + "description": "Lowered sharp (Stockhausen)" + }, + "accidentalSharpOneArrowDown": { + "codepoint": "U+E2C3", + "description": "Sharp lowered by one syntonic comma" + }, + "accidentalSharpOneArrowUp": { + "codepoint": "U+E2C8", + "description": "Sharp raised by one syntonic comma" + }, + "accidentalSharpOneHorizontalStroke": { + "codepoint": "U+E473", + "description": "One or three quarter tones sharp" + }, + "accidentalSharpRaisedStockhausen": { + "codepoint": "U+ED56", + "description": "Raised sharp (Stockhausen)" + }, + "accidentalSharpRepeatedLineStockhausen": { + "codepoint": "U+ED5E", + "description": "Repeated sharp, note on line (Stockhausen)" + }, + "accidentalSharpRepeatedSpaceStockhausen": { + "codepoint": "U+ED5D", + "description": "Repeated sharp, note in space (Stockhausen)" + }, + "accidentalSharpReversed": { + "codepoint": "U+E481", + "description": "Reversed sharp" + }, + "accidentalSharpSharp": { + "codepoint": "U+E269", + "description": "Sharp sharp" + }, + "accidentalSharpThreeArrowsDown": { + "codepoint": "U+E2D7", + "description": "Sharp lowered by three syntonic commas" + }, + "accidentalSharpThreeArrowsUp": { + "codepoint": "U+E2DC", + "description": "Sharp raised by three syntonic commas" + }, + "accidentalSharpTwoArrowsDown": { + "codepoint": "U+E2CD", + "description": "Sharp lowered by two syntonic commas" + }, + "accidentalSharpTwoArrowsUp": { + "codepoint": "U+E2D2", + "description": "Sharp raised by two syntonic commas" + }, + "accidentalSims12Down": { + "codepoint": "U+E2A0", + "description": "1/12 tone low" + }, + "accidentalSims12Up": { + "codepoint": "U+E2A3", + "description": "1/12 tone high" + }, + "accidentalSims4Down": { + "codepoint": "U+E2A2", + "description": "1/4 tone low" + }, + "accidentalSims4Up": { + "codepoint": "U+E2A5", + "description": "1/4 tone high" + }, + "accidentalSims6Down": { + "codepoint": "U+E2A1", + "description": "1/6 tone low" + }, + "accidentalSims6Up": { + "codepoint": "U+E2A4", + "description": "1/6 tone high" + }, + "accidentalSori": { + "codepoint": "U+E461", + "description": "Sori (quarter tone sharp)" + }, + "accidentalTavenerFlat": { + "codepoint": "U+E477", + "description": "Byzantine-style Bakiye flat (Tavener)" + }, + "accidentalTavenerSharp": { + "codepoint": "U+E476", + "description": "Byzantine-style Bu\u0308yu\u0308k mu\u0308cenneb sharp (Tavener)" + }, + "accidentalThreeQuarterTonesFlatArabic": { + "codepoint": "U+ED31", + "description": "Arabic three-quarter-tones flat" + }, + "accidentalThreeQuarterTonesFlatArrowDown": { + "alternateCodepoint": "U+1D12D", + "codepoint": "U+E271", + "description": "Three-quarter-tones flat" + }, + "accidentalThreeQuarterTonesFlatArrowUp": { + "codepoint": "U+E278", + "description": "Three-quarter-tones flat" + }, + "accidentalThreeQuarterTonesFlatCouper": { + "codepoint": "U+E489", + "description": "Three-quarter-tones flat (Couper)" + }, + "accidentalThreeQuarterTonesFlatGrisey": { + "codepoint": "U+E486", + "description": "Three-quarter-tones flat (Grisey)" + }, + "accidentalThreeQuarterTonesFlatTartini": { + "codepoint": "U+E487", + "description": "Three-quarter-tones flat (Tartini)" + }, + "accidentalThreeQuarterTonesFlatZimmermann": { + "codepoint": "U+E281", + "description": "Reversed flat and flat (three-quarter-tones flat) (Zimmermann)" + }, + "accidentalThreeQuarterTonesSharpArabic": { + "codepoint": "U+ED37", + "description": "Arabic three-quarter-tones sharp" + }, + "accidentalThreeQuarterTonesSharpArrowDown": { + "codepoint": "U+E277", + "description": "Three-quarter-tones sharp" + }, + "accidentalThreeQuarterTonesSharpArrowUp": { + "alternateCodepoint": "U+1D130", + "codepoint": "U+E274", + "description": "Three-quarter-tones sharp" + }, + "accidentalThreeQuarterTonesSharpBusotti": { + "codepoint": "U+E474", + "description": "Three quarter tones sharp (Bussotti)" + }, + "accidentalThreeQuarterTonesSharpStein": { + "codepoint": "U+E283", + "description": "One and a half sharps (three-quarter-tones sharp) (Stein)" + }, + "accidentalThreeQuarterTonesSharpStockhausen": { + "codepoint": "U+ED5A", + "description": "Three-quarter-tones sharp (Stockhausen)" + }, + "accidentalTripleFlat": { + "codepoint": "U+E266", + "description": "Triple flat" + }, + "accidentalTripleSharp": { + "codepoint": "U+E265", + "description": "Triple sharp" + }, + "accidentalTwoThirdTonesFlatFerneyhough": { + "codepoint": "U+E48D", + "description": "Two-third-tones flat (Ferneyhough)" + }, + "accidentalTwoThirdTonesSharpFerneyhough": { + "codepoint": "U+E48C", + "description": "Two-third-tones sharp (Ferneyhough)" + }, + "accidentalUpsAndDownsDown": { + "codepoint": "U+EE61", + "description": "Accidental down" + }, + "accidentalUpsAndDownsLess": { + "codepoint": "U+EE63", + "description": "Accidental less" + }, + "accidentalUpsAndDownsMore": { + "codepoint": "U+EE62", + "description": "Accidental more" + }, + "accidentalUpsAndDownsUp": { + "codepoint": "U+EE60", + "description": "Accidental up" + }, + "accidentalWilsonMinus": { + "codepoint": "U+E47C", + "description": "Wilson minus (5 comma down)" + }, + "accidentalWilsonPlus": { + "codepoint": "U+E47B", + "description": "Wilson plus (5 comma up)" + }, + "accidentalWyschnegradsky10TwelfthsFlat": { + "codepoint": "U+E434", + "description": "5/6 tone flat" + }, + "accidentalWyschnegradsky10TwelfthsSharp": { + "codepoint": "U+E429", + "description": "5/6 tone sharp" + }, + "accidentalWyschnegradsky11TwelfthsFlat": { + "codepoint": "U+E435", + "description": "11/12 tone flat" + }, + "accidentalWyschnegradsky11TwelfthsSharp": { + "codepoint": "U+E42A", + "description": "11/12 tone sharp" + }, + "accidentalWyschnegradsky1TwelfthsFlat": { + "codepoint": "U+E42B", + "description": "1/12 tone flat" + }, + "accidentalWyschnegradsky1TwelfthsSharp": { + "codepoint": "U+E420", + "description": "1/12 tone sharp" + }, + "accidentalWyschnegradsky2TwelfthsFlat": { + "codepoint": "U+E42C", + "description": "1/6 tone flat" + }, + "accidentalWyschnegradsky2TwelfthsSharp": { + "codepoint": "U+E421", + "description": "1/6 tone sharp" + }, + "accidentalWyschnegradsky3TwelfthsFlat": { + "codepoint": "U+E42D", + "description": "1/4 tone flat" + }, + "accidentalWyschnegradsky3TwelfthsSharp": { + "codepoint": "U+E422", + "description": "1/4 tone sharp" + }, + "accidentalWyschnegradsky4TwelfthsFlat": { + "codepoint": "U+E42E", + "description": "1/3 tone flat" + }, + "accidentalWyschnegradsky4TwelfthsSharp": { + "codepoint": "U+E423", + "description": "1/3 tone sharp" + }, + "accidentalWyschnegradsky5TwelfthsFlat": { + "codepoint": "U+E42F", + "description": "5/12 tone flat" + }, + "accidentalWyschnegradsky5TwelfthsSharp": { + "codepoint": "U+E424", + "description": "5/12 tone sharp" + }, + "accidentalWyschnegradsky6TwelfthsFlat": { + "codepoint": "U+E430", + "description": "1/2 tone flat" + }, + "accidentalWyschnegradsky6TwelfthsSharp": { + "codepoint": "U+E425", + "description": "1/2 tone sharp" + }, + "accidentalWyschnegradsky7TwelfthsFlat": { + "codepoint": "U+E431", + "description": "7/12 tone flat" + }, + "accidentalWyschnegradsky7TwelfthsSharp": { + "codepoint": "U+E426", + "description": "7/12 tone sharp" + }, + "accidentalWyschnegradsky8TwelfthsFlat": { + "codepoint": "U+E432", + "description": "2/3 tone flat" + }, + "accidentalWyschnegradsky8TwelfthsSharp": { + "codepoint": "U+E427", + "description": "2/3 tone sharp" + }, + "accidentalWyschnegradsky9TwelfthsFlat": { + "codepoint": "U+E433", + "description": "3/4 tone flat" + }, + "accidentalWyschnegradsky9TwelfthsSharp": { + "codepoint": "U+E428", + "description": "3/4 tone sharp" + }, + "accidentalXenakisOneThirdToneSharp": { + "codepoint": "U+E470", + "description": "One-third-tone sharp (Xenakis)" + }, + "accidentalXenakisTwoThirdTonesSharp": { + "codepoint": "U+E471", + "description": "Two-third-tones sharp (Xenakis)" + }, + "analyticsChoralmelodie": { + "codepoint": "U+E86A", + "description": "Choralmelodie (Berg)" + }, + "analyticsEndStimme": { + "alternateCodepoint": "U+1D1A8", + "codepoint": "U+E863", + "description": "End of stimme" + }, + "analyticsHauptrhythmus": { + "codepoint": "U+E86B", + "description": "Hauptrhythmus (Berg)" + }, + "analyticsHauptstimme": { + "alternateCodepoint": "U+1D1A6", + "codepoint": "U+E860", + "description": "Hauptstimme" + }, + "analyticsInversion1": { + "codepoint": "U+E869", + "description": "Inversion 1" + }, + "analyticsNebenstimme": { + "alternateCodepoint": "U+1D1A7", + "codepoint": "U+E861", + "description": "Nebenstimme" + }, + "analyticsStartStimme": { + "codepoint": "U+E862", + "description": "Start of stimme" + }, + "analyticsTheme": { + "codepoint": "U+E864", + "description": "Theme" + }, + "analyticsTheme1": { + "codepoint": "U+E868", + "description": "Theme 1" + }, + "analyticsThemeInversion": { + "codepoint": "U+E867", + "description": "Inversion of theme" + }, + "analyticsThemeRetrograde": { + "codepoint": "U+E865", + "description": "Retrograde of theme" + }, + "analyticsThemeRetrogradeInversion": { + "codepoint": "U+E866", + "description": "Retrograde inversion of theme" + }, + "arpeggiato": { + "codepoint": "U+E63C", + "description": "Arpeggiato" + }, + "arpeggiatoDown": { + "alternateCodepoint": "U+1D184", + "codepoint": "U+E635", + "description": "Arpeggiato down" + }, + "arpeggiatoUp": { + "alternateCodepoint": "U+1D183", + "codepoint": "U+E634", + "description": "Arpeggiato up" + }, + "arrowBlackDown": { + "codepoint": "U+EB64", + "description": "Black arrow down (S)" + }, + "arrowBlackDownLeft": { + "codepoint": "U+EB65", + "description": "Black arrow down-left (SW)" + }, + "arrowBlackDownRight": { + "codepoint": "U+EB63", + "description": "Black arrow down-right (SE)" + }, + "arrowBlackLeft": { + "codepoint": "U+EB66", + "description": "Black arrow left (W)" + }, + "arrowBlackRight": { + "codepoint": "U+EB62", + "description": "Black arrow right (E)" + }, + "arrowBlackUp": { + "codepoint": "U+EB60", + "description": "Black arrow up (N)" + }, + "arrowBlackUpLeft": { + "codepoint": "U+EB67", + "description": "Black arrow up-left (NW)" + }, + "arrowBlackUpRight": { + "codepoint": "U+EB61", + "description": "Black arrow up-right (NE)" + }, + "arrowOpenDown": { + "codepoint": "U+EB74", + "description": "Open arrow down (S)" + }, + "arrowOpenDownLeft": { + "codepoint": "U+EB75", + "description": "Open arrow down-left (SW)" + }, + "arrowOpenDownRight": { + "codepoint": "U+EB73", + "description": "Open arrow down-right (SE)" + }, + "arrowOpenLeft": { + "codepoint": "U+EB76", + "description": "Open arrow left (W)" + }, + "arrowOpenRight": { + "codepoint": "U+EB72", + "description": "Open arrow right (E)" + }, + "arrowOpenUp": { + "codepoint": "U+EB70", + "description": "Open arrow up (N)" + }, + "arrowOpenUpLeft": { + "codepoint": "U+EB77", + "description": "Open arrow up-left (NW)" + }, + "arrowOpenUpRight": { + "codepoint": "U+EB71", + "description": "Open arrow up-right (NE)" + }, + "arrowWhiteDown": { + "codepoint": "U+EB6C", + "description": "White arrow down (S)" + }, + "arrowWhiteDownLeft": { + "codepoint": "U+EB6D", + "description": "White arrow down-left (SW)" + }, + "arrowWhiteDownRight": { + "codepoint": "U+EB6B", + "description": "White arrow down-right (SE)" + }, + "arrowWhiteLeft": { + "codepoint": "U+EB6E", + "description": "White arrow left (W)" + }, + "arrowWhiteRight": { + "codepoint": "U+EB6A", + "description": "White arrow right (E)" + }, + "arrowWhiteUp": { + "codepoint": "U+EB68", + "description": "White arrow up (N)" + }, + "arrowWhiteUpLeft": { + "codepoint": "U+EB6F", + "description": "White arrow up-left (NW)" + }, + "arrowWhiteUpRight": { + "codepoint": "U+EB69", + "description": "White arrow up-right (NE)" + }, + "arrowheadBlackDown": { + "codepoint": "U+EB7C", + "description": "Black arrowhead down (S)" + }, + "arrowheadBlackDownLeft": { + "codepoint": "U+EB7D", + "description": "Black arrowhead down-left (SW)" + }, + "arrowheadBlackDownRight": { + "codepoint": "U+EB7B", + "description": "Black arrowhead down-right (SE)" + }, + "arrowheadBlackLeft": { + "codepoint": "U+EB7E", + "description": "Black arrowhead left (W)" + }, + "arrowheadBlackRight": { + "codepoint": "U+EB7A", + "description": "Black arrowhead right (E)" + }, + "arrowheadBlackUp": { + "codepoint": "U+EB78", + "description": "Black arrowhead up (N)" + }, + "arrowheadBlackUpLeft": { + "codepoint": "U+EB7F", + "description": "Black arrowhead up-left (NW)" + }, + "arrowheadBlackUpRight": { + "codepoint": "U+EB79", + "description": "Black arrowhead up-right (NE)" + }, + "arrowheadOpenDown": { + "codepoint": "U+EB8C", + "description": "Open arrowhead down (S)" + }, + "arrowheadOpenDownLeft": { + "codepoint": "U+EB8D", + "description": "Open arrowhead down-left (SW)" + }, + "arrowheadOpenDownRight": { + "codepoint": "U+EB8B", + "description": "Open arrowhead down-right (SE)" + }, + "arrowheadOpenLeft": { + "codepoint": "U+EB8E", + "description": "Open arrowhead left (W)" + }, + "arrowheadOpenRight": { + "codepoint": "U+EB8A", + "description": "Open arrowhead right (E)" + }, + "arrowheadOpenUp": { + "codepoint": "U+EB88", + "description": "Open arrowhead up (N)" + }, + "arrowheadOpenUpLeft": { + "codepoint": "U+EB8F", + "description": "Open arrowhead up-left (NW)" + }, + "arrowheadOpenUpRight": { + "codepoint": "U+EB89", + "description": "Open arrowhead up-right (NE)" + }, + "arrowheadWhiteDown": { + "codepoint": "U+EB84", + "description": "White arrowhead down (S)" + }, + "arrowheadWhiteDownLeft": { + "codepoint": "U+EB85", + "description": "White arrowhead down-left (SW)" + }, + "arrowheadWhiteDownRight": { + "codepoint": "U+EB83", + "description": "White arrowhead down-right (SE)" + }, + "arrowheadWhiteLeft": { + "codepoint": "U+EB86", + "description": "White arrowhead left (W)" + }, + "arrowheadWhiteRight": { + "codepoint": "U+EB82", + "description": "White arrowhead right (E)" + }, + "arrowheadWhiteUp": { + "codepoint": "U+EB80", + "description": "White arrowhead up (N)" + }, + "arrowheadWhiteUpLeft": { + "codepoint": "U+EB87", + "description": "White arrowhead up-left (NW)" + }, + "arrowheadWhiteUpRight": { + "codepoint": "U+EB81", + "description": "White arrowhead up-right (NE)" + }, + "articAccentAbove": { + "alternateCodepoint": "U+1D17B", + "codepoint": "U+E4A0", + "description": "Accent above" + }, + "articAccentBelow": { + "codepoint": "U+E4A1", + "description": "Accent below" + }, + "articAccentStaccatoAbove": { + "alternateCodepoint": "U+1D181", + "codepoint": "U+E4B0", + "description": "Accent-staccato above" + }, + "articAccentStaccatoBelow": { + "codepoint": "U+E4B1", + "description": "Accent-staccato below" + }, + "articLaissezVibrerAbove": { + "codepoint": "U+E4BA", + "description": "Laissez vibrer (l.v.) above" + }, + "articLaissezVibrerBelow": { + "codepoint": "U+E4BB", + "description": "Laissez vibrer (l.v.) below" + }, + "articMarcatoAbove": { + "alternateCodepoint": "U+1D17F", + "codepoint": "U+E4AC", + "description": "Marcato above" + }, + "articMarcatoBelow": { + "codepoint": "U+E4AD", + "description": "Marcato below" + }, + "articMarcatoStaccatoAbove": { + "alternateCodepoint": "U+1D180", + "codepoint": "U+E4AE", + "description": "Marcato-staccato above" + }, + "articMarcatoStaccatoBelow": { + "codepoint": "U+E4AF", + "description": "Marcato-staccato below" + }, + "articMarcatoTenutoAbove": { + "codepoint": "U+E4BC", + "description": "Marcato-tenuto above" + }, + "articMarcatoTenutoBelow": { + "codepoint": "U+E4BD", + "description": "Marcato-tenuto below" + }, + "articSoftAccentAbove": { + "codepoint": "U+ED40", + "description": "Soft accent above" + }, + "articSoftAccentBelow": { + "codepoint": "U+ED41", + "description": "Soft accent below" + }, + "articSoftAccentStaccatoAbove": { + "codepoint": "U+ED42", + "description": "Soft accent-staccato above" + }, + "articSoftAccentStaccatoBelow": { + "codepoint": "U+ED43", + "description": "Soft accent-staccato below" + }, + "articSoftAccentTenutoAbove": { + "codepoint": "U+ED44", + "description": "Soft accent-tenuto above" + }, + "articSoftAccentTenutoBelow": { + "codepoint": "U+ED45", + "description": "Soft accent-tenuto below" + }, + "articSoftAccentTenutoStaccatoAbove": { + "codepoint": "U+ED46", + "description": "Soft accent-tenuto-staccato above" + }, + "articSoftAccentTenutoStaccatoBelow": { + "codepoint": "U+ED47", + "description": "Soft accent-tenuto-staccato below" + }, + "articStaccatissimoAbove": { + "alternateCodepoint": "U+1D17E", + "codepoint": "U+E4A6", + "description": "Staccatissimo above" + }, + "articStaccatissimoBelow": { + "codepoint": "U+E4A7", + "description": "Staccatissimo below" + }, + "articStaccatissimoStrokeAbove": { + "codepoint": "U+E4AA", + "description": "Staccatissimo stroke above" + }, + "articStaccatissimoStrokeBelow": { + "codepoint": "U+E4AB", + "description": "Staccatissimo stroke below" + }, + "articStaccatissimoWedgeAbove": { + "codepoint": "U+E4A8", + "description": "Staccatissimo wedge above" + }, + "articStaccatissimoWedgeBelow": { + "codepoint": "U+E4A9", + "description": "Staccatissimo wedge below" + }, + "articStaccatoAbove": { + "alternateCodepoint": "U+1D17C", + "codepoint": "U+E4A2", + "description": "Staccato above" + }, + "articStaccatoBelow": { + "codepoint": "U+E4A3", + "description": "Staccato below" + }, + "articStressAbove": { + "codepoint": "U+E4B6", + "description": "Stress above" + }, + "articStressBelow": { + "codepoint": "U+E4B7", + "description": "Stress below" + }, + "articTenutoAbove": { + "alternateCodepoint": "U+1D17D", + "codepoint": "U+E4A4", + "description": "Tenuto above" + }, + "articTenutoAccentAbove": { + "codepoint": "U+E4B4", + "description": "Tenuto-accent above" + }, + "articTenutoAccentBelow": { + "codepoint": "U+E4B5", + "description": "Tenuto-accent below" + }, + "articTenutoBelow": { + "codepoint": "U+E4A5", + "description": "Tenuto below" + }, + "articTenutoStaccatoAbove": { + "alternateCodepoint": "U+1D182", + "codepoint": "U+E4B2", + "description": "Lour\u00e9 (tenuto-staccato) above" + }, + "articTenutoStaccatoBelow": { + "codepoint": "U+E4B3", + "description": "Lour\u00e9 (tenuto-staccato) below" + }, + "articUnstressAbove": { + "codepoint": "U+E4B8", + "description": "Unstress above" + }, + "articUnstressBelow": { + "codepoint": "U+E4B9", + "description": "Unstress below" + }, + "augmentationDot": { + "alternateCodepoint": "U+1D16D", + "codepoint": "U+E1E7", + "description": "Augmentation dot" + }, + "barlineDashed": { + "alternateCodepoint": "U+1D104", + "codepoint": "U+E036", + "description": "Dashed barline" + }, + "barlineDotted": { + "codepoint": "U+E037", + "description": "Dotted barline" + }, + "barlineDouble": { + "alternateCodepoint": "U+1D101", + "codepoint": "U+E031", + "description": "Double barline" + }, + "barlineFinal": { + "alternateCodepoint": "U+1D102", + "codepoint": "U+E032", + "description": "Final barline" + }, + "barlineHeavy": { + "codepoint": "U+E034", + "description": "Heavy barline" + }, + "barlineHeavyHeavy": { + "codepoint": "U+E035", + "description": "Heavy double barline" + }, + "barlineReverseFinal": { + "alternateCodepoint": "U+1D103", + "codepoint": "U+E033", + "description": "Reverse final barline" + }, + "barlineShort": { + "alternateCodepoint": "U+1D105", + "codepoint": "U+E038", + "description": "Short barline" + }, + "barlineSingle": { + "alternateCodepoint": "U+1D100", + "codepoint": "U+E030", + "description": "Single barline" + }, + "barlineTick": { + "codepoint": "U+E039", + "description": "Tick barline" + }, + "beamAccelRit1": { + "codepoint": "U+EAF4", + "description": "Accel./rit. beam 1 (widest)" + }, + "beamAccelRit10": { + "codepoint": "U+EAFD", + "description": "Accel./rit. beam 10" + }, + "beamAccelRit11": { + "codepoint": "U+EAFE", + "description": "Accel./rit. beam 11" + }, + "beamAccelRit12": { + "codepoint": "U+EAFF", + "description": "Accel./rit. beam 12" + }, + "beamAccelRit13": { + "codepoint": "U+EB00", + "description": "Accel./rit. beam 13" + }, + "beamAccelRit14": { + "codepoint": "U+EB01", + "description": "Accel./rit. beam 14" + }, + "beamAccelRit15": { + "codepoint": "U+EB02", + "description": "Accel./rit. beam 15 (narrowest)" + }, + "beamAccelRit2": { + "codepoint": "U+EAF5", + "description": "Accel./rit. beam 2" + }, + "beamAccelRit3": { + "codepoint": "U+EAF6", + "description": "Accel./rit. beam 3" + }, + "beamAccelRit4": { + "codepoint": "U+EAF7", + "description": "Accel./rit. beam 4" + }, + "beamAccelRit5": { + "codepoint": "U+EAF8", + "description": "Accel./rit. beam 5" + }, + "beamAccelRit6": { + "codepoint": "U+EAF9", + "description": "Accel./rit. beam 6" + }, + "beamAccelRit7": { + "codepoint": "U+EAFA", + "description": "Accel./rit. beam 7" + }, + "beamAccelRit8": { + "codepoint": "U+EAFB", + "description": "Accel./rit. beam 8" + }, + "beamAccelRit9": { + "codepoint": "U+EAFC", + "description": "Accel./rit. beam 9" + }, + "beamAccelRitFinal": { + "codepoint": "U+EB03", + "description": "Accel./rit. beam terminating line" + }, + "brace": { + "alternateCodepoint": "U+1D114", + "codepoint": "U+E000", + "description": "Brace" + }, + "bracket": { + "alternateCodepoint": "U+1D115", + "codepoint": "U+E002", + "description": "Bracket" + }, + "bracketBottom": { + "codepoint": "U+E004", + "description": "Bracket bottom" + }, + "bracketTop": { + "codepoint": "U+E003", + "description": "Bracket top" + }, + "brassBend": { + "alternateCodepoint": "U+1D189", + "codepoint": "U+E5E3", + "description": "Bend" + }, + "brassDoitLong": { + "codepoint": "U+E5D6", + "description": "Doit, long" + }, + "brassDoitMedium": { + "codepoint": "U+E5D5", + "description": "Doit, medium" + }, + "brassDoitShort": { + "alternateCodepoint": "U+1D185", + "codepoint": "U+E5D4", + "description": "Doit, short" + }, + "brassFallLipLong": { + "codepoint": "U+E5D9", + "description": "Lip fall, long" + }, + "brassFallLipMedium": { + "codepoint": "U+E5D8", + "description": "Lip fall, medium" + }, + "brassFallLipShort": { + "alternateCodepoint": "U+1D186", + "codepoint": "U+E5D7", + "description": "Lip fall, short" + }, + "brassFallRoughLong": { + "codepoint": "U+E5DF", + "description": "Rough fall, long" + }, + "brassFallRoughMedium": { + "codepoint": "U+E5DE", + "description": "Rough fall, medium" + }, + "brassFallRoughShort": { + "codepoint": "U+E5DD", + "description": "Rough fall, short" + }, + "brassFallSmoothLong": { + "codepoint": "U+E5DC", + "description": "Smooth fall, long" + }, + "brassFallSmoothMedium": { + "codepoint": "U+E5DB", + "description": "Smooth fall, medium" + }, + "brassFallSmoothShort": { + "codepoint": "U+E5DA", + "description": "Smooth fall, short" + }, + "brassFlip": { + "alternateCodepoint": "U+1D187", + "codepoint": "U+E5E1", + "description": "Flip" + }, + "brassHarmonMuteClosed": { + "codepoint": "U+E5E8", + "description": "Harmon mute, stem in" + }, + "brassHarmonMuteStemHalfLeft": { + "codepoint": "U+E5E9", + "description": "Harmon mute, stem extended, left" + }, + "brassHarmonMuteStemHalfRight": { + "codepoint": "U+E5EA", + "description": "Harmon mute, stem extended, right" + }, + "brassHarmonMuteStemOpen": { + "codepoint": "U+E5EB", + "description": "Harmon mute, stem out" + }, + "brassJazzTurn": { + "codepoint": "U+E5E4", + "description": "Jazz turn" + }, + "brassLiftLong": { + "codepoint": "U+E5D3", + "description": "Lift, long" + }, + "brassLiftMedium": { + "codepoint": "U+E5D2", + "description": "Lift, medium" + }, + "brassLiftShort": { + "codepoint": "U+E5D1", + "description": "Lift, short" + }, + "brassLiftSmoothLong": { + "codepoint": "U+E5EE", + "description": "Smooth lift, long" + }, + "brassLiftSmoothMedium": { + "codepoint": "U+E5ED", + "description": "Smooth lift, medium" + }, + "brassLiftSmoothShort": { + "codepoint": "U+E5EC", + "description": "Smooth lift, short" + }, + "brassMuteClosed": { + "codepoint": "U+E5E5", + "description": "Muted (closed)" + }, + "brassMuteHalfClosed": { + "codepoint": "U+E5E6", + "description": "Half-muted (half-closed)" + }, + "brassMuteOpen": { + "codepoint": "U+E5E7", + "description": "Open" + }, + "brassPlop": { + "codepoint": "U+E5E0", + "description": "Plop" + }, + "brassScoop": { + "codepoint": "U+E5D0", + "description": "Scoop" + }, + "brassSmear": { + "alternateCodepoint": "U+1D188", + "codepoint": "U+E5E2", + "description": "Smear" + }, + "brassValveTrill": { + "codepoint": "U+E5EF", + "description": "Valve trill" + }, + "breathMarkComma": { + "alternateCodepoint": "U+1D112", + "codepoint": "U+E4CE", + "description": "Breath mark (comma)" + }, + "breathMarkSalzedo": { + "codepoint": "U+E4D5", + "description": "Breath mark (Salzedo)" + }, + "breathMarkTick": { + "codepoint": "U+E4CF", + "description": "Breath mark (tick-like)" + }, + "breathMarkUpbow": { + "codepoint": "U+E4D0", + "description": "Breath mark (upbow-like)" + }, + "bridgeClef": { + "codepoint": "U+E078", + "description": "Bridge clef" + }, + "buzzRoll": { + "codepoint": "U+E22A", + "description": "Buzz roll" + }, + "cClef": { + "alternateCodepoint": "U+1D121", + "codepoint": "U+E05C", + "description": "C clef" + }, + "cClef8vb": { + "codepoint": "U+E05D", + "description": "C clef ottava bassa" + }, + "cClefArrowDown": { + "codepoint": "U+E05F", + "description": "C clef, arrow down" + }, + "cClefArrowUp": { + "codepoint": "U+E05E", + "description": "C clef, arrow up" + }, + "cClefChange": { + "codepoint": "U+E07B", + "description": "C clef change" + }, + "cClefCombining": { + "codepoint": "U+E061", + "description": "Combining C clef" + }, + "cClefReversed": { + "codepoint": "U+E075", + "description": "Reversed C clef" + }, + "cClefSquare": { + "codepoint": "U+E060", + "description": "C clef (19th century)" + }, + "caesura": { + "alternateCodepoint": "U+1D113", + "codepoint": "U+E4D1", + "description": "Caesura" + }, + "caesuraCurved": { + "codepoint": "U+E4D4", + "description": "Curved caesura" + }, + "caesuraShort": { + "codepoint": "U+E4D3", + "description": "Short caesura" + }, + "caesuraSingleStroke": { + "codepoint": "U+E4D7", + "description": "Single stroke caesura" + }, + "caesuraThick": { + "codepoint": "U+E4D2", + "description": "Thick caesura" + }, + "chantAccentusAbove": { + "codepoint": "U+E9D6", + "description": "Accentus above" + }, + "chantAccentusBelow": { + "codepoint": "U+E9D7", + "description": "Accentus below" + }, + "chantAuctumAsc": { + "codepoint": "U+E994", + "description": "Punctum auctum, ascending" + }, + "chantAuctumDesc": { + "codepoint": "U+E995", + "description": "Punctum auctum, descending" + }, + "chantAugmentum": { + "codepoint": "U+E9D9", + "description": "Augmentum (mora)" + }, + "chantCaesura": { + "codepoint": "U+E8F8", + "description": "Caesura" + }, + "chantCclef": { + "alternateCodepoint": "U+1D1D0", + "codepoint": "U+E906", + "description": "Plainchant C clef" + }, + "chantCirculusAbove": { + "codepoint": "U+E9D2", + "description": "Circulus above" + }, + "chantCirculusBelow": { + "codepoint": "U+E9D3", + "description": "Circulus below" + }, + "chantConnectingLineAsc2nd": { + "codepoint": "U+E9BD", + "description": "Connecting line, ascending 2nd" + }, + "chantConnectingLineAsc3rd": { + "codepoint": "U+E9BE", + "description": "Connecting line, ascending 3rd" + }, + "chantConnectingLineAsc4th": { + "codepoint": "U+E9BF", + "description": "Connecting line, ascending 4th" + }, + "chantConnectingLineAsc5th": { + "codepoint": "U+E9C0", + "description": "Connecting line, ascending 5th" + }, + "chantConnectingLineAsc6th": { + "codepoint": "U+E9C1", + "description": "Connecting line, ascending 6th" + }, + "chantCustosStemDownPosHigh": { + "codepoint": "U+EA08", + "description": "Plainchant custos, stem down, high position" + }, + "chantCustosStemDownPosHighest": { + "codepoint": "U+EA09", + "description": "Plainchant custos, stem down, highest position" + }, + "chantCustosStemDownPosMiddle": { + "codepoint": "U+EA07", + "description": "Plainchant custos, stem down, middle position" + }, + "chantCustosStemUpPosLow": { + "codepoint": "U+EA05", + "description": "Plainchant custos, stem up, low position" + }, + "chantCustosStemUpPosLowest": { + "codepoint": "U+EA04", + "description": "Plainchant custos, stem up, lowest position" + }, + "chantCustosStemUpPosMiddle": { + "codepoint": "U+EA06", + "description": "Plainchant custos, stem up, middle position" + }, + "chantDeminutumLower": { + "codepoint": "U+E9B3", + "description": "Punctum deminutum, lower" + }, + "chantDeminutumUpper": { + "codepoint": "U+E9B2", + "description": "Punctum deminutum, upper" + }, + "chantDivisioFinalis": { + "codepoint": "U+E8F6", + "description": "Divisio finalis" + }, + "chantDivisioMaior": { + "codepoint": "U+E8F4", + "description": "Divisio maior" + }, + "chantDivisioMaxima": { + "codepoint": "U+E8F5", + "description": "Divisio maxima" + }, + "chantDivisioMinima": { + "codepoint": "U+E8F3", + "description": "Divisio minima" + }, + "chantEntryLineAsc2nd": { + "codepoint": "U+E9B4", + "description": "Entry line, ascending 2nd" + }, + "chantEntryLineAsc3rd": { + "codepoint": "U+E9B5", + "description": "Entry line, ascending 3rd" + }, + "chantEntryLineAsc4th": { + "codepoint": "U+E9B6", + "description": "Entry line, ascending 4th" + }, + "chantEntryLineAsc5th": { + "codepoint": "U+E9B7", + "description": "Entry line, ascending 5th" + }, + "chantEntryLineAsc6th": { + "codepoint": "U+E9B8", + "description": "Entry line, ascending 6th" + }, + "chantEpisema": { + "codepoint": "U+E9D8", + "description": "Episema" + }, + "chantFclef": { + "alternateCodepoint": "U+1D1D1", + "codepoint": "U+E902", + "description": "Plainchant F clef" + }, + "chantIctusAbove": { + "codepoint": "U+E9D0", + "description": "Ictus above" + }, + "chantIctusBelow": { + "codepoint": "U+E9D1", + "description": "Ictus below" + }, + "chantLigaturaDesc2nd": { + "codepoint": "U+E9B9", + "description": "Ligated stroke, descending 2nd" + }, + "chantLigaturaDesc3rd": { + "codepoint": "U+E9BA", + "description": "Ligated stroke, descending 3rd" + }, + "chantLigaturaDesc4th": { + "codepoint": "U+E9BB", + "description": "Ligated stroke, descending 4th" + }, + "chantLigaturaDesc5th": { + "codepoint": "U+E9BC", + "description": "Ligated stroke, descending 5th" + }, + "chantOriscusAscending": { + "codepoint": "U+E99C", + "description": "Oriscus ascending" + }, + "chantOriscusDescending": { + "codepoint": "U+E99D", + "description": "Oriscus descending" + }, + "chantOriscusLiquescens": { + "codepoint": "U+E99E", + "description": "Oriscus liquescens" + }, + "chantPodatusLower": { + "codepoint": "U+E9B0", + "description": "Podatus, lower" + }, + "chantPodatusUpper": { + "alternateCodepoint": "U+1D1D4", + "codepoint": "U+E9B1", + "description": "Podatus, upper" + }, + "chantPunctum": { + "codepoint": "U+E990", + "description": "Punctum" + }, + "chantPunctumCavum": { + "codepoint": "U+E998", + "description": "Punctum cavum" + }, + "chantPunctumDeminutum": { + "codepoint": "U+E9A1", + "description": "Punctum deminutum" + }, + "chantPunctumInclinatum": { + "codepoint": "U+E991", + "description": "Punctum inclinatum" + }, + "chantPunctumInclinatumAuctum": { + "codepoint": "U+E992", + "description": "Punctum inclinatum auctum" + }, + "chantPunctumInclinatumDeminutum": { + "codepoint": "U+E993", + "description": "Punctum inclinatum deminutum" + }, + "chantPunctumLinea": { + "codepoint": "U+E999", + "description": "Punctum linea" + }, + "chantPunctumLineaCavum": { + "codepoint": "U+E99A", + "description": "Punctum linea cavum" + }, + "chantPunctumVirga": { + "alternateCodepoint": "U+1D1D3", + "codepoint": "U+E996", + "description": "Punctum virga" + }, + "chantPunctumVirgaReversed": { + "codepoint": "U+E997", + "description": "Punctum virga, reversed" + }, + "chantQuilisma": { + "codepoint": "U+E99B", + "description": "Quilisma" + }, + "chantSemicirculusAbove": { + "codepoint": "U+E9D4", + "description": "Semicirculus above" + }, + "chantSemicirculusBelow": { + "codepoint": "U+E9D5", + "description": "Semicirculus below" + }, + "chantStaff": { + "codepoint": "U+E8F0", + "description": "Plainchant staff" + }, + "chantStaffNarrow": { + "codepoint": "U+E8F2", + "description": "Plainchant staff (narrow)" + }, + "chantStaffWide": { + "codepoint": "U+E8F1", + "description": "Plainchant staff (wide)" + }, + "chantStrophicus": { + "codepoint": "U+E99F", + "description": "Strophicus" + }, + "chantStrophicusAuctus": { + "codepoint": "U+E9A0", + "description": "Strophicus auctus" + }, + "chantStrophicusLiquescens2nd": { + "codepoint": "U+E9C2", + "description": "Strophicus liquescens, 2nd" + }, + "chantStrophicusLiquescens3rd": { + "codepoint": "U+E9C3", + "description": "Strophicus liquescens, 3rd" + }, + "chantStrophicusLiquescens4th": { + "codepoint": "U+E9C4", + "description": "Strophicus liquescens, 4th" + }, + "chantStrophicusLiquescens5th": { + "codepoint": "U+E9C5", + "description": "Strophicus liquescens, 5th" + }, + "chantVirgula": { + "codepoint": "U+E8F7", + "description": "Virgula" + }, + "clef15": { + "codepoint": "U+E07E", + "description": "15 for clefs" + }, + "clef8": { + "codepoint": "U+E07D", + "description": "8 for clefs" + }, + "clefChangeCombining": { + "codepoint": "U+E07F", + "description": "Combining clef change" + }, + "coda": { + "alternateCodepoint": "U+1D10C", + "codepoint": "U+E048", + "description": "Coda" + }, + "codaSquare": { + "codepoint": "U+E049", + "description": "Square coda" + }, + "conductorBeat2Compound": { + "codepoint": "U+E897", + "description": "Beat 2, compound time" + }, + "conductorBeat2Simple": { + "codepoint": "U+E894", + "description": "Beat 2, simple time" + }, + "conductorBeat3Compound": { + "codepoint": "U+E898", + "description": "Beat 3, compound time" + }, + "conductorBeat3Simple": { + "codepoint": "U+E895", + "description": "Beat 3, simple time" + }, + "conductorBeat4Compound": { + "codepoint": "U+E899", + "description": "Beat 4, compound time" + }, + "conductorBeat4Simple": { + "codepoint": "U+E896", + "description": "Beat 4, simple time" + }, + "conductorLeftBeat": { + "codepoint": "U+E891", + "description": "Left-hand beat or cue" + }, + "conductorRightBeat": { + "codepoint": "U+E892", + "description": "Right-hand beat or cue" + }, + "conductorStrongBeat": { + "codepoint": "U+E890", + "description": "Strong beat or cue" + }, + "conductorUnconducted": { + "codepoint": "U+E89A", + "description": "Unconducted/free passages" + }, + "conductorWeakBeat": { + "codepoint": "U+E893", + "description": "Weak beat or cue" + }, + "controlBeginBeam": { + "alternateCodepoint": "U+1D173", + "codepoint": "U+E8E0", + "description": "Begin beam" + }, + "controlBeginPhrase": { + "alternateCodepoint": "U+1D179", + "codepoint": "U+E8E6", + "description": "Begin phrase" + }, + "controlBeginSlur": { + "alternateCodepoint": "U+1D177", + "codepoint": "U+E8E4", + "description": "Begin slur" + }, + "controlBeginTie": { + "alternateCodepoint": "U+1D175", + "codepoint": "U+E8E2", + "description": "Begin tie" + }, + "controlEndBeam": { + "alternateCodepoint": "U+1D174", + "codepoint": "U+E8E1", + "description": "End beam" + }, + "controlEndPhrase": { + "alternateCodepoint": "U+1D17A", + "codepoint": "U+E8E7", + "description": "End phrase" + }, + "controlEndSlur": { + "alternateCodepoint": "U+1D178", + "codepoint": "U+E8E5", + "description": "End slur" + }, + "controlEndTie": { + "alternateCodepoint": "U+1D176", + "codepoint": "U+E8E3", + "description": "End tie" + }, + "csymAccidentalDoubleFlat": { + "codepoint": "U+ED64", + "description": "Double flat" + }, + "csymAccidentalDoubleSharp": { + "codepoint": "U+ED63", + "description": "Double sharp" + }, + "csymAccidentalFlat": { + "codepoint": "U+ED60", + "description": "Flat" + }, + "csymAccidentalNatural": { + "codepoint": "U+ED61", + "description": "Natural" + }, + "csymAccidentalSharp": { + "codepoint": "U+ED62", + "description": "Sharp" + }, + "csymAccidentalTripleFlat": { + "codepoint": "U+ED66", + "description": "Triple flat" + }, + "csymAccidentalTripleSharp": { + "codepoint": "U+ED65", + "description": "Triple sharp" + }, + "csymAlteredBassSlash": { + "codepoint": "U+E87B", + "description": "Slash for altered bass note" + }, + "csymAugmented": { + "codepoint": "U+E872", + "description": "Augmented" + }, + "csymBracketLeftTall": { + "codepoint": "U+E877", + "description": "Double-height left bracket" + }, + "csymBracketRightTall": { + "codepoint": "U+E878", + "description": "Double-height right bracket" + }, + "csymDiagonalArrangementSlash": { + "codepoint": "U+E87C", + "description": "Slash for chord symbols arranged diagonally" + }, + "csymDiminished": { + "alternateCodepoint": "U+1D1A9", + "codepoint": "U+E870", + "description": "Diminished" + }, + "csymHalfDiminished": { + "codepoint": "U+E871", + "description": "Half-diminished" + }, + "csymMajorSeventh": { + "codepoint": "U+E873", + "description": "Major seventh" + }, + "csymMinor": { + "codepoint": "U+E874", + "description": "Minor" + }, + "csymParensLeftTall": { + "codepoint": "U+E875", + "description": "Double-height left parenthesis" + }, + "csymParensLeftVeryTall": { + "codepoint": "U+E879", + "description": "Triple-height left parenthesis" + }, + "csymParensRightTall": { + "codepoint": "U+E876", + "description": "Double-height right parenthesis" + }, + "csymParensRightVeryTall": { + "codepoint": "U+E87A", + "description": "Triple-height right parenthesis" + }, + "curlewSign": { + "codepoint": "U+E4D6", + "description": "Curlew (Britten)" + }, + "daCapo": { + "alternateCodepoint": "U+1D10A", + "codepoint": "U+E046", + "description": "Da capo" + }, + "dalSegno": { + "alternateCodepoint": "U+1D109", + "codepoint": "U+E045", + "description": "Dal segno" + }, + "daseianExcellentes1": { + "codepoint": "U+EA3C", + "description": "Daseian excellentes 1" + }, + "daseianExcellentes2": { + "codepoint": "U+EA3D", + "description": "Daseian excellentes 2" + }, + "daseianExcellentes3": { + "codepoint": "U+EA3E", + "description": "Daseian excellentes 3" + }, + "daseianExcellentes4": { + "codepoint": "U+EA3F", + "description": "Daseian excellentes 4" + }, + "daseianFinales1": { + "codepoint": "U+EA34", + "description": "Daseian finales 1" + }, + "daseianFinales2": { + "codepoint": "U+EA35", + "description": "Daseian finales 2" + }, + "daseianFinales3": { + "codepoint": "U+EA36", + "description": "Daseian finales 3" + }, + "daseianFinales4": { + "codepoint": "U+EA37", + "description": "Daseian finales 4" + }, + "daseianGraves1": { + "codepoint": "U+EA30", + "description": "Daseian graves 1" + }, + "daseianGraves2": { + "codepoint": "U+EA31", + "description": "Daseian graves 2" + }, + "daseianGraves3": { + "codepoint": "U+EA32", + "description": "Daseian graves 3" + }, + "daseianGraves4": { + "codepoint": "U+EA33", + "description": "Daseian graves 4" + }, + "daseianResidua1": { + "codepoint": "U+EA40", + "description": "Daseian residua 1" + }, + "daseianResidua2": { + "codepoint": "U+EA41", + "description": "Daseian residua 2" + }, + "daseianSuperiores1": { + "codepoint": "U+EA38", + "description": "Daseian superiores 1" + }, + "daseianSuperiores2": { + "codepoint": "U+EA39", + "description": "Daseian superiores 2" + }, + "daseianSuperiores3": { + "codepoint": "U+EA3A", + "description": "Daseian superiores 3" + }, + "daseianSuperiores4": { + "codepoint": "U+EA3B", + "description": "Daseian superiores 4" + }, + "doubleLateralRollStevens": { + "codepoint": "U+E234", + "description": "Double lateral roll (Stevens)" + }, + "doubleTongueAbove": { + "alternateCodepoint": "U+1D18A", + "codepoint": "U+E5F0", + "description": "Double-tongue above" + }, + "doubleTongueBelow": { + "codepoint": "U+E5F1", + "description": "Double-tongue below" + }, + "dynamicCombinedSeparatorColon": { + "codepoint": "U+E546", + "description": "Colon separator for combined dynamics" + }, + "dynamicCombinedSeparatorHyphen": { + "codepoint": "U+E547", + "description": "Hyphen separator for combined dynamics" + }, + "dynamicCombinedSeparatorSlash": { + "codepoint": "U+E549", + "description": "Slash separator for combined dynamics" + }, + "dynamicCombinedSeparatorSpace": { + "codepoint": "U+E548", + "description": "Space separator for combined dynamics" + }, + "dynamicCrescendoHairpin": { + "alternateCodepoint": "U+1D192", + "codepoint": "U+E53E", + "description": "Crescendo" + }, + "dynamicDiminuendoHairpin": { + "alternateCodepoint": "U+1D193", + "codepoint": "U+E53F", + "description": "Diminuendo" + }, + "dynamicFF": { + "codepoint": "U+E52F", + "description": "ff" + }, + "dynamicFFF": { + "codepoint": "U+E530", + "description": "fff" + }, + "dynamicFFFF": { + "codepoint": "U+E531", + "description": "ffff" + }, + "dynamicFFFFF": { + "codepoint": "U+E532", + "description": "fffff" + }, + "dynamicFFFFFF": { + "codepoint": "U+E533", + "description": "ffffff" + }, + "dynamicForte": { + "alternateCodepoint": "U+1D191", + "codepoint": "U+E522", + "description": "Forte" + }, + "dynamicFortePiano": { + "codepoint": "U+E534", + "description": "Forte-piano" + }, + "dynamicForzando": { + "codepoint": "U+E535", + "description": "Forzando" + }, + "dynamicHairpinBracketLeft": { + "codepoint": "U+E544", + "description": "Left bracket (for hairpins)" + }, + "dynamicHairpinBracketRight": { + "codepoint": "U+E545", + "description": "Right bracket (for hairpins)" + }, + "dynamicHairpinParenthesisLeft": { + "codepoint": "U+E542", + "description": "Left parenthesis (for hairpins)" + }, + "dynamicHairpinParenthesisRight": { + "codepoint": "U+E543", + "description": "Right parenthesis (for hairpins)" + }, + "dynamicMF": { + "codepoint": "U+E52D", + "description": "mf" + }, + "dynamicMP": { + "codepoint": "U+E52C", + "description": "mp" + }, + "dynamicMessaDiVoce": { + "codepoint": "U+E540", + "description": "Messa di voce" + }, + "dynamicMezzo": { + "alternateCodepoint": "U+1D190", + "codepoint": "U+E521", + "description": "Mezzo" + }, + "dynamicNiente": { + "codepoint": "U+E526", + "description": "Niente" + }, + "dynamicNienteForHairpin": { + "codepoint": "U+E541", + "description": "Niente (for hairpins)" + }, + "dynamicPF": { + "codepoint": "U+E52E", + "description": "pf" + }, + "dynamicPP": { + "codepoint": "U+E52B", + "description": "pp" + }, + "dynamicPPP": { + "codepoint": "U+E52A", + "description": "ppp" + }, + "dynamicPPPP": { + "codepoint": "U+E529", + "description": "pppp" + }, + "dynamicPPPPP": { + "codepoint": "U+E528", + "description": "ppppp" + }, + "dynamicPPPPPP": { + "codepoint": "U+E527", + "description": "pppppp" + }, + "dynamicPiano": { + "alternateCodepoint": "U+1D18F", + "codepoint": "U+E520", + "description": "Piano" + }, + "dynamicRinforzando": { + "alternateCodepoint": "U+1D18C", + "codepoint": "U+E523", + "description": "Rinforzando" + }, + "dynamicRinforzando1": { + "codepoint": "U+E53C", + "description": "Rinforzando 1" + }, + "dynamicRinforzando2": { + "codepoint": "U+E53D", + "description": "Rinforzando 2" + }, + "dynamicSforzando": { + "alternateCodepoint": "U+1D18D", + "codepoint": "U+E524", + "description": "Sforzando" + }, + "dynamicSforzando1": { + "codepoint": "U+E536", + "description": "Sforzando 1" + }, + "dynamicSforzandoPianissimo": { + "codepoint": "U+E538", + "description": "Sforzando-pianissimo" + }, + "dynamicSforzandoPiano": { + "codepoint": "U+E537", + "description": "Sforzando-piano" + }, + "dynamicSforzato": { + "codepoint": "U+E539", + "description": "Sforzato" + }, + "dynamicSforzatoFF": { + "codepoint": "U+E53B", + "description": "Sforzatissimo" + }, + "dynamicSforzatoPiano": { + "codepoint": "U+E53A", + "description": "Sforzato-piano" + }, + "dynamicZ": { + "alternateCodepoint": "U+1D18E", + "codepoint": "U+E525", + "description": "Z" + }, + "elecAudioChannelsEight": { + "codepoint": "U+EB46", + "description": "Eight channels (7.1 surround)" + }, + "elecAudioChannelsFive": { + "codepoint": "U+EB43", + "description": "Five channels" + }, + "elecAudioChannelsFour": { + "codepoint": "U+EB42", + "description": "Four channels" + }, + "elecAudioChannelsOne": { + "codepoint": "U+EB3E", + "description": "One channel (mono)" + }, + "elecAudioChannelsSeven": { + "codepoint": "U+EB45", + "description": "Seven channels" + }, + "elecAudioChannelsSix": { + "codepoint": "U+EB44", + "description": "Six channels (5.1 surround)" + }, + "elecAudioChannelsThreeFrontal": { + "codepoint": "U+EB40", + "description": "Three channels (frontal)" + }, + "elecAudioChannelsThreeSurround": { + "codepoint": "U+EB41", + "description": "Three channels (surround)" + }, + "elecAudioChannelsTwo": { + "codepoint": "U+EB3F", + "description": "Two channels (stereo)" + }, + "elecAudioIn": { + "codepoint": "U+EB49", + "description": "Audio in" + }, + "elecAudioMono": { + "codepoint": "U+EB3C", + "description": "Mono audio setup" + }, + "elecAudioOut": { + "codepoint": "U+EB4A", + "description": "Audio out" + }, + "elecAudioStereo": { + "codepoint": "U+EB3D", + "description": "Stereo audio setup" + }, + "elecCamera": { + "codepoint": "U+EB1B", + "description": "Camera" + }, + "elecDataIn": { + "codepoint": "U+EB4D", + "description": "Data in" + }, + "elecDataOut": { + "codepoint": "U+EB4E", + "description": "Data out" + }, + "elecDisc": { + "codepoint": "U+EB13", + "description": "Disc" + }, + "elecDownload": { + "codepoint": "U+EB4F", + "description": "Download" + }, + "elecEject": { + "codepoint": "U+EB2B", + "description": "Eject" + }, + "elecFastForward": { + "codepoint": "U+EB1F", + "description": "Fast-forward" + }, + "elecHeadphones": { + "codepoint": "U+EB11", + "description": "Headphones" + }, + "elecHeadset": { + "codepoint": "U+EB12", + "description": "Headset" + }, + "elecLineIn": { + "codepoint": "U+EB47", + "description": "Line in" + }, + "elecLineOut": { + "codepoint": "U+EB48", + "description": "Line out" + }, + "elecLoop": { + "codepoint": "U+EB23", + "description": "Loop" + }, + "elecLoudspeaker": { + "codepoint": "U+EB1A", + "description": "Loudspeaker" + }, + "elecMIDIController0": { + "codepoint": "U+EB36", + "description": "MIDI controller 0%" + }, + "elecMIDIController100": { + "codepoint": "U+EB3B", + "description": "MIDI controller 100%" + }, + "elecMIDIController20": { + "codepoint": "U+EB37", + "description": "MIDI controller 20%" + }, + "elecMIDIController40": { + "codepoint": "U+EB38", + "description": "MIDI controller 40%" + }, + "elecMIDIController60": { + "codepoint": "U+EB39", + "description": "MIDI controller 60%" + }, + "elecMIDIController80": { + "codepoint": "U+EB3A", + "description": "MIDI controller 80%" + }, + "elecMIDIIn": { + "codepoint": "U+EB34", + "description": "MIDI in" + }, + "elecMIDIOut": { + "codepoint": "U+EB35", + "description": "MIDI out" + }, + "elecMicrophone": { + "codepoint": "U+EB10", + "description": "Microphone" + }, + "elecMicrophoneMute": { + "codepoint": "U+EB28", + "description": "Mute microphone" + }, + "elecMicrophoneUnmute": { + "codepoint": "U+EB29", + "description": "Unmute microphone" + }, + "elecMixingConsole": { + "codepoint": "U+EB15", + "description": "Mixing console" + }, + "elecMonitor": { + "codepoint": "U+EB18", + "description": "Monitor" + }, + "elecMute": { + "codepoint": "U+EB26", + "description": "Mute" + }, + "elecPause": { + "codepoint": "U+EB1E", + "description": "Pause" + }, + "elecPlay": { + "codepoint": "U+EB1C", + "description": "Play" + }, + "elecPowerOnOff": { + "codepoint": "U+EB2A", + "description": "Power on/off" + }, + "elecProjector": { + "codepoint": "U+EB19", + "description": "Projector" + }, + "elecReplay": { + "codepoint": "U+EB24", + "description": "Replay" + }, + "elecRewind": { + "codepoint": "U+EB20", + "description": "Rewind" + }, + "elecShuffle": { + "codepoint": "U+EB25", + "description": "Shuffle" + }, + "elecSkipBackwards": { + "codepoint": "U+EB22", + "description": "Skip backwards" + }, + "elecSkipForwards": { + "codepoint": "U+EB21", + "description": "Skip forwards" + }, + "elecStop": { + "codepoint": "U+EB1D", + "description": "Stop" + }, + "elecTape": { + "codepoint": "U+EB14", + "description": "Tape" + }, + "elecUSB": { + "codepoint": "U+EB16", + "description": "USB connection" + }, + "elecUnmute": { + "codepoint": "U+EB27", + "description": "Unmute" + }, + "elecUpload": { + "codepoint": "U+EB50", + "description": "Upload" + }, + "elecVideoCamera": { + "codepoint": "U+EB17", + "description": "Video camera" + }, + "elecVideoIn": { + "codepoint": "U+EB4B", + "description": "Video in" + }, + "elecVideoOut": { + "codepoint": "U+EB4C", + "description": "Video out" + }, + "elecVolumeFader": { + "codepoint": "U+EB2C", + "description": "Combining volume fader" + }, + "elecVolumeFaderThumb": { + "codepoint": "U+EB2D", + "description": "Combining volume fader thumb" + }, + "elecVolumeLevel0": { + "codepoint": "U+EB2E", + "description": "Volume level 0%" + }, + "elecVolumeLevel100": { + "codepoint": "U+EB33", + "description": "Volume level 100%" + }, + "elecVolumeLevel20": { + "codepoint": "U+EB2F", + "description": "Volume level 20%" + }, + "elecVolumeLevel40": { + "codepoint": "U+EB30", + "description": "Volume level 40%" + }, + "elecVolumeLevel60": { + "codepoint": "U+EB31", + "description": "Volume level 60%" + }, + "elecVolumeLevel80": { + "codepoint": "U+EB32", + "description": "Volume level 80%" + }, + "fClef": { + "alternateCodepoint": "U+1D122", + "codepoint": "U+E062", + "description": "F clef" + }, + "fClef15ma": { + "codepoint": "U+E066", + "description": "F clef quindicesima alta" + }, + "fClef15mb": { + "codepoint": "U+E063", + "description": "F clef quindicesima bassa" + }, + "fClef8va": { + "alternateCodepoint": "U+1D123", + "codepoint": "U+E065", + "description": "F clef ottava alta" + }, + "fClef8vb": { + "alternateCodepoint": "U+1D124", + "codepoint": "U+E064", + "description": "F clef ottava bassa" + }, + "fClefArrowDown": { + "codepoint": "U+E068", + "description": "F clef, arrow down" + }, + "fClefArrowUp": { + "codepoint": "U+E067", + "description": "F clef, arrow up" + }, + "fClefChange": { + "codepoint": "U+E07C", + "description": "F clef change" + }, + "fClefReversed": { + "codepoint": "U+E076", + "description": "Reversed F clef" + }, + "fClefTurned": { + "codepoint": "U+E077", + "description": "Turned F clef" + }, + "fermataAbove": { + "alternateCodepoint": "U+1D110", + "codepoint": "U+E4C0", + "description": "Fermata above" + }, + "fermataBelow": { + "alternateCodepoint": "U+1D111", + "codepoint": "U+E4C1", + "description": "Fermata below" + }, + "fermataLongAbove": { + "codepoint": "U+E4C6", + "description": "Long fermata above" + }, + "fermataLongBelow": { + "codepoint": "U+E4C7", + "description": "Long fermata below" + }, + "fermataLongHenzeAbove": { + "codepoint": "U+E4CA", + "description": "Long fermata (Henze) above" + }, + "fermataLongHenzeBelow": { + "codepoint": "U+E4CB", + "description": "Long fermata (Henze) below" + }, + "fermataShortAbove": { + "codepoint": "U+E4C4", + "description": "Short fermata above" + }, + "fermataShortBelow": { + "codepoint": "U+E4C5", + "description": "Short fermata below" + }, + "fermataShortHenzeAbove": { + "codepoint": "U+E4CC", + "description": "Short fermata (Henze) above" + }, + "fermataShortHenzeBelow": { + "codepoint": "U+E4CD", + "description": "Short fermata (Henze) below" + }, + "fermataVeryLongAbove": { + "codepoint": "U+E4C8", + "description": "Very long fermata above" + }, + "fermataVeryLongBelow": { + "codepoint": "U+E4C9", + "description": "Very long fermata below" + }, + "fermataVeryShortAbove": { + "codepoint": "U+E4C2", + "description": "Very short fermata above" + }, + "fermataVeryShortBelow": { + "codepoint": "U+E4C3", + "description": "Very short fermata below" + }, + "figbass0": { + "codepoint": "U+EA50", + "description": "Figured bass 0" + }, + "figbass1": { + "codepoint": "U+EA51", + "description": "Figured bass 1" + }, + "figbass2": { + "codepoint": "U+EA52", + "description": "Figured bass 2" + }, + "figbass2Raised": { + "codepoint": "U+EA53", + "description": "Figured bass 2 raised by half-step" + }, + "figbass3": { + "codepoint": "U+EA54", + "description": "Figured bass 3" + }, + "figbass4": { + "codepoint": "U+EA55", + "description": "Figured bass 4" + }, + "figbass4Raised": { + "codepoint": "U+EA56", + "description": "Figured bass 4 raised by half-step" + }, + "figbass5": { + "codepoint": "U+EA57", + "description": "Figured bass 5" + }, + "figbass5Raised1": { + "codepoint": "U+EA58", + "description": "Figured bass 5 raised by half-step" + }, + "figbass5Raised2": { + "codepoint": "U+EA59", + "description": "Figured bass 5 raised by half-step 2" + }, + "figbass5Raised3": { + "codepoint": "U+EA5A", + "description": "Figured bass diminished 5" + }, + "figbass6": { + "codepoint": "U+EA5B", + "description": "Figured bass 6" + }, + "figbass6Raised": { + "codepoint": "U+EA5C", + "description": "Figured bass 6 raised by half-step" + }, + "figbass6Raised2": { + "codepoint": "U+EA6F", + "description": "Figured bass 6 raised by half-step 2" + }, + "figbass7": { + "codepoint": "U+EA5D", + "description": "Figured bass 7" + }, + "figbass7Diminished": { + "codepoint": "U+ECC0", + "description": "Figured bass 7 diminished" + }, + "figbass7Raised1": { + "codepoint": "U+EA5E", + "description": "Figured bass 7 raised by half-step" + }, + "figbass7Raised2": { + "codepoint": "U+EA5F", + "description": "Figured bass 7 lowered by a half-step" + }, + "figbass8": { + "codepoint": "U+EA60", + "description": "Figured bass 8" + }, + "figbass9": { + "codepoint": "U+EA61", + "description": "Figured bass 9" + }, + "figbass9Raised": { + "codepoint": "U+EA62", + "description": "Figured bass 9 raised by half-step" + }, + "figbassBracketLeft": { + "codepoint": "U+EA68", + "description": "Figured bass [" + }, + "figbassBracketRight": { + "codepoint": "U+EA69", + "description": "Figured bass ]" + }, + "figbassCombiningLowering": { + "codepoint": "U+EA6E", + "description": "Combining lower" + }, + "figbassCombiningRaising": { + "codepoint": "U+EA6D", + "description": "Combining raise" + }, + "figbassDoubleFlat": { + "codepoint": "U+EA63", + "description": "Figured bass double flat" + }, + "figbassDoubleSharp": { + "codepoint": "U+EA67", + "description": "Figured bass double sharp" + }, + "figbassFlat": { + "codepoint": "U+EA64", + "description": "Figured bass flat" + }, + "figbassNatural": { + "codepoint": "U+EA65", + "description": "Figured bass natural" + }, + "figbassParensLeft": { + "codepoint": "U+EA6A", + "description": "Figured bass (" + }, + "figbassParensRight": { + "codepoint": "U+EA6B", + "description": "Figured bass )" + }, + "figbassPlus": { + "codepoint": "U+EA6C", + "description": "Figured bass +" + }, + "figbassSharp": { + "codepoint": "U+EA66", + "description": "Figured bass sharp" + }, + "figbassTripleFlat": { + "codepoint": "U+ECC1", + "description": "Figured bass triple flat" + }, + "figbassTripleSharp": { + "codepoint": "U+ECC2", + "description": "Figured bass triple sharp" + }, + "fingering0": { + "codepoint": "U+ED10", + "description": "Fingering 0 (open string)" + }, + "fingering0Italic": { + "codepoint": "U+ED80", + "description": "Fingering 0 italic (open string)" + }, + "fingering1": { + "codepoint": "U+ED11", + "description": "Fingering 1 (thumb)" + }, + "fingering1Italic": { + "codepoint": "U+ED81", + "description": "Fingering 1 italic (thumb)" + }, + "fingering2": { + "codepoint": "U+ED12", + "description": "Fingering 2 (index finger)" + }, + "fingering2Italic": { + "codepoint": "U+ED82", + "description": "Fingering 2 italic (index finger)" + }, + "fingering3": { + "codepoint": "U+ED13", + "description": "Fingering 3 (middle finger)" + }, + "fingering3Italic": { + "codepoint": "U+ED83", + "description": "Fingering 3 italic (middle finger)" + }, + "fingering4": { + "codepoint": "U+ED14", + "description": "Fingering 4 (ring finger)" + }, + "fingering4Italic": { + "codepoint": "U+ED84", + "description": "Fingering 4 italic (ring finger)" + }, + "fingering5": { + "codepoint": "U+ED15", + "description": "Fingering 5 (little finger)" + }, + "fingering5Italic": { + "codepoint": "U+ED85", + "description": "Fingering 5 italic (little finger)" + }, + "fingering6": { + "codepoint": "U+ED24", + "description": "Fingering 6" + }, + "fingering6Italic": { + "codepoint": "U+ED86", + "description": "Fingering 6 italic" + }, + "fingering7": { + "codepoint": "U+ED25", + "description": "Fingering 7" + }, + "fingering7Italic": { + "codepoint": "U+ED87", + "description": "Fingering 7 italic" + }, + "fingering8": { + "codepoint": "U+ED26", + "description": "Fingering 8" + }, + "fingering8Italic": { + "codepoint": "U+ED88", + "description": "Fingering 8 italic" + }, + "fingering9": { + "codepoint": "U+ED27", + "description": "Fingering 9" + }, + "fingering9Italic": { + "codepoint": "U+ED89", + "description": "Fingering 9 italic" + }, + "fingeringALower": { + "codepoint": "U+ED1B", + "description": "Fingering a (anular; right-hand ring finger for guitar)" + }, + "fingeringCLower": { + "codepoint": "U+ED1C", + "description": "Fingering c (right-hand little finger for guitar)" + }, + "fingeringELower": { + "codepoint": "U+ED1E", + "description": "Fingering e (right-hand little finger for guitar)" + }, + "fingeringILower": { + "codepoint": "U+ED19", + "description": "Fingering i (indicio; right-hand index finger for guitar)" + }, + "fingeringLeftBracket": { + "codepoint": "U+ED2A", + "description": "Fingering left bracket" + }, + "fingeringLeftBracketItalic": { + "codepoint": "U+ED8C", + "description": "Fingering left bracket italic" + }, + "fingeringLeftParenthesis": { + "codepoint": "U+ED28", + "description": "Fingering left parenthesis" + }, + "fingeringLeftParenthesisItalic": { + "codepoint": "U+ED8A", + "description": "Fingering left parenthesis italic" + }, + "fingeringMLower": { + "codepoint": "U+ED1A", + "description": "Fingering m (medio; right-hand middle finger for guitar)" + }, + "fingeringMultipleNotes": { + "codepoint": "U+ED23", + "description": "Multiple notes played by thumb or single finger" + }, + "fingeringOLower": { + "codepoint": "U+ED1F", + "description": "Fingering o (right-hand little finger for guitar)" + }, + "fingeringPLower": { + "codepoint": "U+ED17", + "description": "Fingering p (pulgar; right-hand thumb for guitar)" + }, + "fingeringQLower": { + "codepoint": "U+ED8E", + "description": "Fingering q (right-hand little finger for guitar)" + }, + "fingeringRightBracket": { + "codepoint": "U+ED2B", + "description": "Fingering right bracket" + }, + "fingeringRightBracketItalic": { + "codepoint": "U+ED8D", + "description": "Fingering right bracket italic" + }, + "fingeringRightParenthesis": { + "codepoint": "U+ED29", + "description": "Fingering right parenthesis" + }, + "fingeringRightParenthesisItalic": { + "codepoint": "U+ED8B", + "description": "Fingering right parenthesis italic" + }, + "fingeringSLower": { + "codepoint": "U+ED8F", + "description": "Fingering s (right-hand little finger for guitar)" + }, + "fingeringSeparatorMiddleDot": { + "codepoint": "U+ED2C", + "description": "Fingering middle dot separator" + }, + "fingeringSeparatorMiddleDotWhite": { + "codepoint": "U+ED2D", + "description": "Fingering white middle dot separator" + }, + "fingeringSeparatorSlash": { + "codepoint": "U+ED2E", + "description": "Fingering forward slash separator" + }, + "fingeringSubstitutionAbove": { + "codepoint": "U+ED20", + "description": "Finger substitution above" + }, + "fingeringSubstitutionBelow": { + "codepoint": "U+ED21", + "description": "Finger substitution below" + }, + "fingeringSubstitutionDash": { + "codepoint": "U+ED22", + "description": "Finger substitution dash" + }, + "fingeringTLower": { + "codepoint": "U+ED18", + "description": "Fingering t (right-hand thumb for guitar)" + }, + "fingeringTUpper": { + "codepoint": "U+ED16", + "description": "Fingering T (left-hand thumb for guitar)" + }, + "fingeringXLower": { + "codepoint": "U+ED1D", + "description": "Fingering x (right-hand little finger for guitar)" + }, + "flag1024thDown": { + "codepoint": "U+E24F", + "description": "Combining flag 8 (1024th) below" + }, + "flag1024thUp": { + "codepoint": "U+E24E", + "description": "Combining flag 8 (1024th) above" + }, + "flag128thDown": { + "codepoint": "U+E249", + "description": "Combining flag 5 (128th) below" + }, + "flag128thUp": { + "alternateCodepoint": "U+1D172", + "codepoint": "U+E248", + "description": "Combining flag 5 (128th) above" + }, + "flag16thDown": { + "codepoint": "U+E243", + "description": "Combining flag 2 (16th) below" + }, + "flag16thUp": { + "alternateCodepoint": "U+1D16F", + "codepoint": "U+E242", + "description": "Combining flag 2 (16th) above" + }, + "flag256thDown": { + "codepoint": "U+E24B", + "description": "Combining flag 6 (256th) below" + }, + "flag256thUp": { + "codepoint": "U+E24A", + "description": "Combining flag 6 (256th) above" + }, + "flag32ndDown": { + "codepoint": "U+E245", + "description": "Combining flag 3 (32nd) below" + }, + "flag32ndUp": { + "alternateCodepoint": "U+1D170", + "codepoint": "U+E244", + "description": "Combining flag 3 (32nd) above" + }, + "flag512thDown": { + "codepoint": "U+E24D", + "description": "Combining flag 7 (512th) below" + }, + "flag512thUp": { + "codepoint": "U+E24C", + "description": "Combining flag 7 (512th) above" + }, + "flag64thDown": { + "codepoint": "U+E247", + "description": "Combining flag 4 (64th) below" + }, + "flag64thUp": { + "alternateCodepoint": "U+1D171", + "codepoint": "U+E246", + "description": "Combining flag 4 (64th) above" + }, + "flag8thDown": { + "codepoint": "U+E241", + "description": "Combining flag 1 (8th) below" + }, + "flag8thUp": { + "alternateCodepoint": "U+1D16E", + "codepoint": "U+E240", + "description": "Combining flag 1 (8th) above" + }, + "flagInternalDown": { + "codepoint": "U+E251", + "description": "Internal combining flag below" + }, + "flagInternalUp": { + "codepoint": "U+E250", + "description": "Internal combining flag above" + }, + "fretboard3String": { + "codepoint": "U+E850", + "description": "3-string fretboard" + }, + "fretboard3StringNut": { + "codepoint": "U+E851", + "description": "3-string fretboard at nut" + }, + "fretboard4String": { + "alternateCodepoint": "U+1D11D", + "codepoint": "U+E852", + "description": "4-string fretboard" + }, + "fretboard4StringNut": { + "codepoint": "U+E853", + "description": "4-string fretboard at nut" + }, + "fretboard5String": { + "codepoint": "U+E854", + "description": "5-string fretboard" + }, + "fretboard5StringNut": { + "codepoint": "U+E855", + "description": "5-string fretboard at nut" + }, + "fretboard6String": { + "alternateCodepoint": "U+1D11C", + "codepoint": "U+E856", + "description": "6-string fretboard" + }, + "fretboard6StringNut": { + "codepoint": "U+E857", + "description": "6-string fretboard at nut" + }, + "fretboardFilledCircle": { + "codepoint": "U+E858", + "description": "Fingered fret (filled circle)" + }, + "fretboardO": { + "codepoint": "U+E85A", + "description": "Open string (O)" + }, + "fretboardX": { + "codepoint": "U+E859", + "description": "String not played (X)" + }, + "functionAngleLeft": { + "codepoint": "U+EA93", + "description": "Function theory angle bracket left" + }, + "functionAngleRight": { + "codepoint": "U+EA94", + "description": "Function theory angle bracket right" + }, + "functionBracketLeft": { + "codepoint": "U+EA8F", + "description": "Function theory bracket left" + }, + "functionBracketRight": { + "codepoint": "U+EA90", + "description": "Function theory bracket right" + }, + "functionDD": { + "codepoint": "U+EA81", + "description": "Function theory dominant of dominant" + }, + "functionDLower": { + "codepoint": "U+EA80", + "description": "Function theory minor dominant" + }, + "functionDUpper": { + "codepoint": "U+EA7F", + "description": "Function theory major dominant" + }, + "functionEight": { + "codepoint": "U+EA78", + "description": "Function theory 8" + }, + "functionFUpper": { + "codepoint": "U+EA99", + "description": "Function theory F" + }, + "functionFive": { + "codepoint": "U+EA75", + "description": "Function theory 5" + }, + "functionFour": { + "codepoint": "U+EA74", + "description": "Function theory 4" + }, + "functionGLower": { + "codepoint": "U+EA84", + "description": "Function theory g" + }, + "functionGUpper": { + "codepoint": "U+EA83", + "description": "Function theory G" + }, + "functionGreaterThan": { + "codepoint": "U+EA7C", + "description": "Function theory greater than" + }, + "functionILower": { + "codepoint": "U+EA9B", + "description": "Function theory i" + }, + "functionIUpper": { + "codepoint": "U+EA9A", + "description": "Function theory I" + }, + "functionKLower": { + "codepoint": "U+EA9D", + "description": "Function theory k" + }, + "functionKUpper": { + "codepoint": "U+EA9C", + "description": "Function theory K" + }, + "functionLLower": { + "codepoint": "U+EA9F", + "description": "Function theory l" + }, + "functionLUpper": { + "codepoint": "U+EA9E", + "description": "Function theory L" + }, + "functionLessThan": { + "codepoint": "U+EA7A", + "description": "Function theory less than" + }, + "functionMLower": { + "codepoint": "U+ED01", + "description": "Function theory m" + }, + "functionMUpper": { + "codepoint": "U+ED00", + "description": "Function theory M" + }, + "functionMinus": { + "codepoint": "U+EA7B", + "description": "Function theory minus" + }, + "functionNLower": { + "codepoint": "U+EA86", + "description": "Function theory n" + }, + "functionNUpper": { + "codepoint": "U+EA85", + "description": "Function theory N" + }, + "functionNUpperSuperscript": { + "codepoint": "U+ED02", + "description": "Function theory superscript N" + }, + "functionNine": { + "codepoint": "U+EA79", + "description": "Function theory 9" + }, + "functionOne": { + "codepoint": "U+EA71", + "description": "Function theory 1" + }, + "functionPLower": { + "codepoint": "U+EA88", + "description": "Function theory p" + }, + "functionPUpper": { + "codepoint": "U+EA87", + "description": "Function theory P" + }, + "functionParensLeft": { + "codepoint": "U+EA91", + "description": "Function theory parenthesis left" + }, + "functionParensRight": { + "codepoint": "U+EA92", + "description": "Function theory parenthesis right" + }, + "functionPlus": { + "codepoint": "U+EA98", + "description": "Function theory prefix plus" + }, + "functionRLower": { + "codepoint": "U+ED03", + "description": "Function theory r" + }, + "functionRepetition1": { + "codepoint": "U+EA95", + "description": "Function theory repetition 1" + }, + "functionRepetition2": { + "codepoint": "U+EA96", + "description": "Function theory repetition 2" + }, + "functionRing": { + "codepoint": "U+EA97", + "description": "Function theory prefix ring" + }, + "functionSLower": { + "codepoint": "U+EA8A", + "description": "Function theory minor subdominant" + }, + "functionSSLower": { + "codepoint": "U+EA7E", + "description": "Function theory minor subdominant of subdominant" + }, + "functionSSUpper": { + "codepoint": "U+EA7D", + "description": "Function theory major subdominant of subdominant" + }, + "functionSUpper": { + "codepoint": "U+EA89", + "description": "Function theory major subdominant" + }, + "functionSeven": { + "codepoint": "U+EA77", + "description": "Function theory 7" + }, + "functionSix": { + "codepoint": "U+EA76", + "description": "Function theory 6" + }, + "functionSlashedDD": { + "codepoint": "U+EA82", + "description": "Function theory double dominant seventh" + }, + "functionTLower": { + "codepoint": "U+EA8C", + "description": "Function theory minor tonic" + }, + "functionTUpper": { + "codepoint": "U+EA8B", + "description": "Function theory tonic" + }, + "functionThree": { + "codepoint": "U+EA73", + "description": "Function theory 3" + }, + "functionTwo": { + "codepoint": "U+EA72", + "description": "Function theory 2" + }, + "functionVLower": { + "codepoint": "U+EA8E", + "description": "Function theory v" + }, + "functionVUpper": { + "codepoint": "U+EA8D", + "description": "Function theory V" + }, + "functionZero": { + "codepoint": "U+EA70", + "description": "Function theory 0" + }, + "gClef": { + "alternateCodepoint": "U+1D11E", + "codepoint": "U+E050", + "description": "G clef" + }, + "gClef15ma": { + "codepoint": "U+E054", + "description": "G clef quindicesima alta" + }, + "gClef15mb": { + "codepoint": "U+E051", + "description": "G clef quindicesima bassa" + }, + "gClef8va": { + "alternateCodepoint": "U+1D11F", + "codepoint": "U+E053", + "description": "G clef ottava alta" + }, + "gClef8vb": { + "alternateCodepoint": "U+1D120", + "codepoint": "U+E052", + "description": "G clef ottava bassa" + }, + "gClef8vbCClef": { + "codepoint": "U+E056", + "description": "G clef ottava bassa with C clef" + }, + "gClef8vbOld": { + "codepoint": "U+E055", + "description": "G clef ottava bassa (old style)" + }, + "gClef8vbParens": { + "codepoint": "U+E057", + "description": "G clef, optionally ottava bassa" + }, + "gClefArrowDown": { + "codepoint": "U+E05B", + "description": "G clef, arrow down" + }, + "gClefArrowUp": { + "codepoint": "U+E05A", + "description": "G clef, arrow up" + }, + "gClefChange": { + "codepoint": "U+E07A", + "description": "G clef change" + }, + "gClefLigatedNumberAbove": { + "codepoint": "U+E059", + "description": "Combining G clef, number above" + }, + "gClefLigatedNumberBelow": { + "codepoint": "U+E058", + "description": "Combining G clef, number below" + }, + "gClefReversed": { + "codepoint": "U+E073", + "description": "Reversed G clef" + }, + "gClefTurned": { + "codepoint": "U+E074", + "description": "Turned G clef" + }, + "glissandoDown": { + "alternateCodepoint": "U+1D1B2", + "codepoint": "U+E586", + "description": "Glissando down" + }, + "glissandoUp": { + "alternateCodepoint": "U+1D1B1", + "codepoint": "U+E585", + "description": "Glissando up" + }, + "graceNoteAcciaccaturaStemDown": { + "codepoint": "U+E561", + "description": "Slashed grace note stem down" + }, + "graceNoteAcciaccaturaStemUp": { + "alternateCodepoint": "U+1D194", + "codepoint": "U+E560", + "description": "Slashed grace note stem up" + }, + "graceNoteAppoggiaturaStemDown": { + "codepoint": "U+E563", + "description": "Grace note stem down" + }, + "graceNoteAppoggiaturaStemUp": { + "alternateCodepoint": "U+1D195", + "codepoint": "U+E562", + "description": "Grace note stem up" + }, + "graceNoteSlashStemDown": { + "codepoint": "U+E565", + "description": "Slash for stem down grace note" + }, + "graceNoteSlashStemUp": { + "codepoint": "U+E564", + "description": "Slash for stem up grace note" + }, + "guitarBarreFull": { + "codepoint": "U+E848", + "description": "Full barr\u00e9" + }, + "guitarBarreHalf": { + "codepoint": "U+E849", + "description": "Half barr\u00e9" + }, + "guitarClosePedal": { + "codepoint": "U+E83F", + "description": "Closed wah/volume pedal" + }, + "guitarFadeIn": { + "codepoint": "U+E843", + "description": "Fade in" + }, + "guitarFadeOut": { + "codepoint": "U+E844", + "description": "Fade out" + }, + "guitarGolpe": { + "codepoint": "U+E842", + "description": "Golpe (tapping the pick guard)" + }, + "guitarHalfOpenPedal": { + "codepoint": "U+E83E", + "description": "Half-open wah/volume pedal" + }, + "guitarLeftHandTapping": { + "codepoint": "U+E840", + "description": "Left-hand tapping" + }, + "guitarOpenPedal": { + "codepoint": "U+E83D", + "description": "Open wah/volume pedal" + }, + "guitarRightHandTapping": { + "codepoint": "U+E841", + "description": "Right-hand tapping" + }, + "guitarShake": { + "codepoint": "U+E832", + "description": "Guitar shake" + }, + "guitarString0": { + "codepoint": "U+E833", + "description": "String number 0" + }, + "guitarString1": { + "codepoint": "U+E834", + "description": "String number 1" + }, + "guitarString10": { + "codepoint": "U+E84A", + "description": "String number 10" + }, + "guitarString11": { + "codepoint": "U+E84B", + "description": "String number 11" + }, + "guitarString12": { + "codepoint": "U+E84C", + "description": "String number 12" + }, + "guitarString13": { + "codepoint": "U+E84D", + "description": "String number 13" + }, + "guitarString2": { + "codepoint": "U+E835", + "description": "String number 2" + }, + "guitarString3": { + "codepoint": "U+E836", + "description": "String number 3" + }, + "guitarString4": { + "codepoint": "U+E837", + "description": "String number 4" + }, + "guitarString5": { + "codepoint": "U+E838", + "description": "String number 5" + }, + "guitarString6": { + "codepoint": "U+E839", + "description": "String number 6" + }, + "guitarString7": { + "codepoint": "U+E83A", + "description": "String number 7" + }, + "guitarString8": { + "codepoint": "U+E83B", + "description": "String number 8" + }, + "guitarString9": { + "codepoint": "U+E83C", + "description": "String number 9" + }, + "guitarStrumDown": { + "codepoint": "U+E847", + "description": "Strum direction down" + }, + "guitarStrumUp": { + "codepoint": "U+E846", + "description": "Strum direction up" + }, + "guitarVibratoBarDip": { + "codepoint": "U+E831", + "description": "Guitar vibrato bar dip" + }, + "guitarVibratoBarScoop": { + "codepoint": "U+E830", + "description": "Guitar vibrato bar scoop" + }, + "guitarVibratoStroke": { + "codepoint": "U+EAB2", + "description": "Vibrato wiggle segment" + }, + "guitarVolumeSwell": { + "codepoint": "U+E845", + "description": "Volume swell" + }, + "guitarWideVibratoStroke": { + "codepoint": "U+EAB3", + "description": "Wide vibrato wiggle segment" + }, + "handbellsBelltree": { + "codepoint": "U+E81F", + "description": "Belltree" + }, + "handbellsDamp3": { + "codepoint": "U+E81E", + "description": "Damp 3" + }, + "handbellsEcho1": { + "codepoint": "U+E81B", + "description": "Echo" + }, + "handbellsEcho2": { + "codepoint": "U+E81C", + "description": "Echo 2" + }, + "handbellsGyro": { + "codepoint": "U+E81D", + "description": "Gyro" + }, + "handbellsHandMartellato": { + "codepoint": "U+E812", + "description": "Hand martellato" + }, + "handbellsMalletBellOnTable": { + "codepoint": "U+E815", + "description": "Mallet, bell on table" + }, + "handbellsMalletBellSuspended": { + "codepoint": "U+E814", + "description": "Mallet, bell suspended" + }, + "handbellsMalletLft": { + "codepoint": "U+E816", + "description": "Mallet lift" + }, + "handbellsMartellato": { + "codepoint": "U+E810", + "description": "Martellato" + }, + "handbellsMartellatoLift": { + "codepoint": "U+E811", + "description": "Martellato lift" + }, + "handbellsMutedMartellato": { + "codepoint": "U+E813", + "description": "Muted martellato" + }, + "handbellsPluckLift": { + "codepoint": "U+E817", + "description": "Pluck lift" + }, + "handbellsSwing": { + "codepoint": "U+E81A", + "description": "Swing" + }, + "handbellsSwingDown": { + "codepoint": "U+E819", + "description": "Swing down" + }, + "handbellsSwingUp": { + "codepoint": "U+E818", + "description": "Swing up" + }, + "handbellsTablePairBells": { + "codepoint": "U+E821", + "description": "Table pair of handbells" + }, + "handbellsTableSingleBell": { + "codepoint": "U+E820", + "description": "Table single handbell" + }, + "harpMetalRod": { + "codepoint": "U+E68F", + "description": "Metal rod pictogram" + }, + "harpPedalCentered": { + "codepoint": "U+E681", + "description": "Harp pedal centered (natural)" + }, + "harpPedalDivider": { + "codepoint": "U+E683", + "description": "Harp pedal divider" + }, + "harpPedalLowered": { + "codepoint": "U+E682", + "description": "Harp pedal lowered (sharp)" + }, + "harpPedalRaised": { + "codepoint": "U+E680", + "description": "Harp pedal raised (flat)" + }, + "harpSalzedoAeolianAscending": { + "codepoint": "U+E695", + "description": "Ascending aeolian chords (Salzedo)" + }, + "harpSalzedoAeolianDescending": { + "codepoint": "U+E696", + "description": "Descending aeolian chords (Salzedo)" + }, + "harpSalzedoDampAbove": { + "codepoint": "U+E69A", + "description": "Damp above (Salzedo)" + }, + "harpSalzedoDampBelow": { + "codepoint": "U+E699", + "description": "Damp below (Salzedo)" + }, + "harpSalzedoDampBothHands": { + "codepoint": "U+E698", + "description": "Damp with both hands (Salzedo)" + }, + "harpSalzedoDampLowStrings": { + "codepoint": "U+E697", + "description": "Damp only low strings (Salzedo)" + }, + "harpSalzedoFluidicSoundsLeft": { + "codepoint": "U+E68D", + "description": "Fluidic sounds, left hand (Salzedo)" + }, + "harpSalzedoFluidicSoundsRight": { + "codepoint": "U+E68E", + "description": "Fluidic sounds, right hand (Salzedo)" + }, + "harpSalzedoIsolatedSounds": { + "codepoint": "U+E69C", + "description": "Isolated sounds (Salzedo)" + }, + "harpSalzedoMetallicSounds": { + "codepoint": "U+E688", + "description": "Metallic sounds (Salzedo)" + }, + "harpSalzedoMetallicSoundsOneString": { + "codepoint": "U+E69B", + "description": "Metallic sounds, one string (Salzedo)" + }, + "harpSalzedoMuffleTotally": { + "codepoint": "U+E68C", + "description": "Muffle totally (Salzedo)" + }, + "harpSalzedoOboicFlux": { + "codepoint": "U+E685", + "description": "Oboic flux (Salzedo)" + }, + "harpSalzedoPlayUpperEnd": { + "codepoint": "U+E68A", + "description": "Play at upper end of strings (Salzedo)" + }, + "harpSalzedoSlideWithSuppleness": { + "codepoint": "U+E684", + "description": "Slide with suppleness (Salzedo)" + }, + "harpSalzedoSnareDrum": { + "codepoint": "U+E69D", + "description": "Snare drum effect (Salzedo)" + }, + "harpSalzedoTamTamSounds": { + "codepoint": "U+E689", + "description": "Tam-tam sounds (Salzedo)" + }, + "harpSalzedoThunderEffect": { + "codepoint": "U+E686", + "description": "Thunder effect (Salzedo)" + }, + "harpSalzedoTimpanicSounds": { + "codepoint": "U+E68B", + "description": "Timpanic sounds (Salzedo)" + }, + "harpSalzedoWhistlingSounds": { + "codepoint": "U+E687", + "description": "Whistling sounds (Salzedo)" + }, + "harpStringNoiseStem": { + "codepoint": "U+E694", + "description": "Combining string noise for stem" + }, + "harpTuningKey": { + "codepoint": "U+E690", + "description": "Tuning key pictogram" + }, + "harpTuningKeyGlissando": { + "codepoint": "U+E693", + "description": "Retune strings for glissando" + }, + "harpTuningKeyHandle": { + "codepoint": "U+E691", + "description": "Use handle of tuning key pictogram" + }, + "harpTuningKeyShank": { + "codepoint": "U+E692", + "description": "Use shank of tuning key pictogram" + }, + "indianDrumClef": { + "codepoint": "U+ED70", + "description": "Indian drum clef" + }, + "kahnBackChug": { + "codepoint": "U+EDE2", + "description": "Back-chug" + }, + "kahnBackFlap": { + "codepoint": "U+EDD8", + "description": "Back-flap" + }, + "kahnBackRiff": { + "codepoint": "U+EDE1", + "description": "Back-riff" + }, + "kahnBackRip": { + "codepoint": "U+EDDA", + "description": "Back-rip" + }, + "kahnBallChange": { + "codepoint": "U+EDC6", + "description": "Ball-change" + }, + "kahnBallDig": { + "codepoint": "U+EDCD", + "description": "Ball-dig" + }, + "kahnBrushBackward": { + "codepoint": "U+EDA7", + "description": "Brush-backward" + }, + "kahnBrushForward": { + "codepoint": "U+EDA6", + "description": "Brush-forward" + }, + "kahnChug": { + "codepoint": "U+EDDD", + "description": "Chug" + }, + "kahnClap": { + "codepoint": "U+EDB8", + "description": "Clap" + }, + "kahnDoubleSnap": { + "codepoint": "U+EDBA", + "description": "Double-snap" + }, + "kahnDoubleWing": { + "codepoint": "U+EDEB", + "description": "Double-wing" + }, + "kahnDrawStep": { + "codepoint": "U+EDB2", + "description": "Draw-step" + }, + "kahnDrawTap": { + "codepoint": "U+EDB3", + "description": "Draw-tap" + }, + "kahnFlam": { + "codepoint": "U+EDCF", + "description": "Flam" + }, + "kahnFlap": { + "codepoint": "U+EDD5", + "description": "Flap" + }, + "kahnFlapStep": { + "codepoint": "U+EDD7", + "description": "Flap-step" + }, + "kahnFlat": { + "codepoint": "U+EDA9", + "description": "Flat" + }, + "kahnFleaHop": { + "codepoint": "U+EDB0", + "description": "Flea-hop" + }, + "kahnFleaTap": { + "codepoint": "U+EDB1", + "description": "Flea-tap" + }, + "kahnGraceTap": { + "codepoint": "U+EDA8", + "description": "Grace-tap" + }, + "kahnGraceTapChange": { + "codepoint": "U+EDD1", + "description": "Grace-tap-change" + }, + "kahnGraceTapHop": { + "codepoint": "U+EDD0", + "description": "Grace-tap-hop" + }, + "kahnGraceTapStamp": { + "codepoint": "U+EDD3", + "description": "Grace-tap-stamp" + }, + "kahnHeel": { + "codepoint": "U+EDAA", + "description": "Heel" + }, + "kahnHeelChange": { + "codepoint": "U+EDC9", + "description": "Heel-change" + }, + "kahnHeelClick": { + "codepoint": "U+EDBB", + "description": "Heel-click" + }, + "kahnHeelDrop": { + "codepoint": "U+EDB6", + "description": "Heel-drop" + }, + "kahnHeelStep": { + "codepoint": "U+EDC4", + "description": "Heel-step" + }, + "kahnHeelTap": { + "codepoint": "U+EDCB", + "description": "Heel-tap" + }, + "kahnHop": { + "codepoint": "U+EDA2", + "description": "Hop" + }, + "kahnJumpApart": { + "codepoint": "U+EDA5", + "description": "Jump-apart" + }, + "kahnJumpTogether": { + "codepoint": "U+EDA4", + "description": "Jump-together" + }, + "kahnKneeInward": { + "codepoint": "U+EDAD", + "description": "Knee-inward" + }, + "kahnKneeOutward": { + "codepoint": "U+EDAC", + "description": "Knee-outward" + }, + "kahnLeap": { + "codepoint": "U+EDA3", + "description": "Leap" + }, + "kahnLeapFlatFoot": { + "codepoint": "U+EDD2", + "description": "Leap-flat-foot" + }, + "kahnLeapHeelClick": { + "codepoint": "U+EDD4", + "description": "Leap-heel-click" + }, + "kahnLeftCatch": { + "codepoint": "U+EDBF", + "description": "Left-catch" + }, + "kahnLeftCross": { + "codepoint": "U+EDBD", + "description": "Left-cross" + }, + "kahnLeftFoot": { + "codepoint": "U+EDEE", + "description": "Left-foot" + }, + "kahnLeftToeStrike": { + "codepoint": "U+EDC1", + "description": "Left-toe-strike" + }, + "kahnLeftTurn": { + "codepoint": "U+EDF0", + "description": "Left-turn" + }, + "kahnOverTheTop": { + "codepoint": "U+EDEC", + "description": "Over-the-top" + }, + "kahnOverTheTopTap": { + "codepoint": "U+EDED", + "description": "Over-the-top-tap" + }, + "kahnPull": { + "codepoint": "U+EDE3", + "description": "Pull" + }, + "kahnPush": { + "codepoint": "U+EDDE", + "description": "Push" + }, + "kahnRiff": { + "codepoint": "U+EDE0", + "description": "Riff" + }, + "kahnRiffle": { + "codepoint": "U+EDE7", + "description": "Riffle" + }, + "kahnRightCatch": { + "codepoint": "U+EDC0", + "description": "Right-catch" + }, + "kahnRightCross": { + "codepoint": "U+EDBE", + "description": "Right-cross" + }, + "kahnRightFoot": { + "codepoint": "U+EDEF", + "description": "Right-foot" + }, + "kahnRightToeStrike": { + "codepoint": "U+EDC2", + "description": "Right-toe-strike" + }, + "kahnRightTurn": { + "codepoint": "U+EDF1", + "description": "Right-turn" + }, + "kahnRip": { + "codepoint": "U+EDD6", + "description": "Rip" + }, + "kahnRipple": { + "codepoint": "U+EDE8", + "description": "Ripple" + }, + "kahnScrape": { + "codepoint": "U+EDAE", + "description": "Scrape" + }, + "kahnScuff": { + "codepoint": "U+EDDC", + "description": "Scuff" + }, + "kahnScuffle": { + "codepoint": "U+EDE6", + "description": "Scuffle" + }, + "kahnShuffle": { + "codepoint": "U+EDE5", + "description": "Shuffle" + }, + "kahnSlam": { + "codepoint": "U+EDCE", + "description": "Slam" + }, + "kahnSlap": { + "codepoint": "U+EDD9", + "description": "Slap" + }, + "kahnSlideStep": { + "codepoint": "U+EDB4", + "description": "Slide-step" + }, + "kahnSlideTap": { + "codepoint": "U+EDB5", + "description": "Slide-tap" + }, + "kahnSnap": { + "codepoint": "U+EDB9", + "description": "Snap" + }, + "kahnStamp": { + "codepoint": "U+EDC3", + "description": "Stamp" + }, + "kahnStampStamp": { + "codepoint": "U+EDC8", + "description": "Stamp-stamp" + }, + "kahnStep": { + "codepoint": "U+EDA0", + "description": "Step" + }, + "kahnStepStamp": { + "codepoint": "U+EDC7", + "description": "Step-stamp" + }, + "kahnStomp": { + "codepoint": "U+EDCA", + "description": "Stomp" + }, + "kahnStompBrush": { + "codepoint": "U+EDDB", + "description": "Stomp-brush" + }, + "kahnTap": { + "codepoint": "U+EDA1", + "description": "Tap" + }, + "kahnToe": { + "codepoint": "U+EDAB", + "description": "Toe" + }, + "kahnToeClick": { + "codepoint": "U+EDBC", + "description": "Toe-click" + }, + "kahnToeDrop": { + "codepoint": "U+EDB7", + "description": "Toe-drop" + }, + "kahnToeStep": { + "codepoint": "U+EDC5", + "description": "Toe-step" + }, + "kahnToeTap": { + "codepoint": "U+EDCC", + "description": "Toe-tap" + }, + "kahnTrench": { + "codepoint": "U+EDAF", + "description": "Trench" + }, + "kahnWing": { + "codepoint": "U+EDE9", + "description": "Wing" + }, + "kahnWingChange": { + "codepoint": "U+EDEA", + "description": "Wing-change" + }, + "kahnZank": { + "codepoint": "U+EDE4", + "description": "Zank" + }, + "kahnZink": { + "codepoint": "U+EDDF", + "description": "Zink" + }, + "keyboardBebung2DotsAbove": { + "codepoint": "U+E668", + "description": "Clavichord bebung, 2 finger movements (above)" + }, + "keyboardBebung2DotsBelow": { + "codepoint": "U+E669", + "description": "Clavichord bebung, 2 finger movements (below)" + }, + "keyboardBebung3DotsAbove": { + "codepoint": "U+E66A", + "description": "Clavichord bebung, 3 finger movements (above)" + }, + "keyboardBebung3DotsBelow": { + "codepoint": "U+E66B", + "description": "Clavichord bebung, 3 finger movements (below)" + }, + "keyboardBebung4DotsAbove": { + "codepoint": "U+E66C", + "description": "Clavichord bebung, 4 finger movements (above)" + }, + "keyboardBebung4DotsBelow": { + "codepoint": "U+E66D", + "description": "Clavichord bebung, 4 finger movements (below)" + }, + "keyboardLeftPedalPictogram": { + "codepoint": "U+E65E", + "description": "Left pedal pictogram" + }, + "keyboardMiddlePedalPictogram": { + "codepoint": "U+E65F", + "description": "Middle pedal pictogram" + }, + "keyboardPedalD": { + "codepoint": "U+E653", + "description": "Pedal d" + }, + "keyboardPedalDot": { + "codepoint": "U+E654", + "description": "Pedal dot" + }, + "keyboardPedalE": { + "codepoint": "U+E652", + "description": "Pedal e" + }, + "keyboardPedalHalf": { + "alternateCodepoint": "U+1D1B0", + "codepoint": "U+E656", + "description": "Half-pedal mark" + }, + "keyboardPedalHalf2": { + "codepoint": "U+E65B", + "description": "Half pedal mark 1" + }, + "keyboardPedalHalf3": { + "codepoint": "U+E65C", + "description": "Half pedal mark 2" + }, + "keyboardPedalHeel1": { + "codepoint": "U+E661", + "description": "Pedal heel 1" + }, + "keyboardPedalHeel2": { + "codepoint": "U+E662", + "description": "Pedal heel 2" + }, + "keyboardPedalHeel3": { + "codepoint": "U+E663", + "description": "Pedal heel 3 (Davis)" + }, + "keyboardPedalHeelToToe": { + "codepoint": "U+E674", + "description": "Pedal heel to toe" + }, + "keyboardPedalHeelToe": { + "codepoint": "U+E666", + "description": "Pedal heel or toe" + }, + "keyboardPedalHookEnd": { + "codepoint": "U+E673", + "description": "Pedal hook end" + }, + "keyboardPedalHookStart": { + "codepoint": "U+E672", + "description": "Pedal hook start" + }, + "keyboardPedalHyphen": { + "codepoint": "U+E658", + "description": "Pedal hyphen" + }, + "keyboardPedalP": { + "codepoint": "U+E651", + "description": "Pedal P" + }, + "keyboardPedalParensLeft": { + "codepoint": "U+E676", + "description": "Left parenthesis for pedal marking" + }, + "keyboardPedalParensRight": { + "codepoint": "U+E677", + "description": "Right parenthesis for pedal marking" + }, + "keyboardPedalPed": { + "alternateCodepoint": "U+1D1AE", + "codepoint": "U+E650", + "description": "Pedal mark" + }, + "keyboardPedalS": { + "codepoint": "U+E65A", + "description": "Pedal S" + }, + "keyboardPedalSost": { + "codepoint": "U+E659", + "description": "Sostenuto pedal mark" + }, + "keyboardPedalToe1": { + "codepoint": "U+E664", + "description": "Pedal toe 1" + }, + "keyboardPedalToe2": { + "codepoint": "U+E665", + "description": "Pedal toe 2" + }, + "keyboardPedalToeToHeel": { + "codepoint": "U+E675", + "description": "Pedal toe to heel" + }, + "keyboardPedalUp": { + "alternateCodepoint": "U+1D1AF", + "codepoint": "U+E655", + "description": "Pedal up mark" + }, + "keyboardPedalUpNotch": { + "codepoint": "U+E657", + "description": "Pedal up notch" + }, + "keyboardPedalUpSpecial": { + "codepoint": "U+E65D", + "description": "Pedal up special" + }, + "keyboardPlayWithLH": { + "codepoint": "U+E670", + "description": "Play with left hand" + }, + "keyboardPlayWithLHEnd": { + "codepoint": "U+E671", + "description": "Play with left hand (end)" + }, + "keyboardPlayWithRH": { + "codepoint": "U+E66E", + "description": "Play with right hand" + }, + "keyboardPlayWithRHEnd": { + "codepoint": "U+E66F", + "description": "Play with right hand (end)" + }, + "keyboardPluckInside": { + "codepoint": "U+E667", + "description": "Pluck strings inside piano (Maderna)" + }, + "keyboardRightPedalPictogram": { + "codepoint": "U+E660", + "description": "Right pedal pictogram" + }, + "kievanAccidentalFlat": { + "alternateCodepoint": "U+1D1E8", + "codepoint": "U+EC3E", + "description": "Kievan flat" + }, + "kievanAccidentalSharp": { + "codepoint": "U+EC3D", + "description": "Kievan sharp" + }, + "kievanAugmentationDot": { + "codepoint": "U+EC3C", + "description": "Kievan augmentation dot" + }, + "kievanCClef": { + "alternateCodepoint": "U+1D1DE", + "codepoint": "U+EC30", + "description": "Kievan C clef (tse-fa-ut)" + }, + "kievanEndingSymbol": { + "alternateCodepoint": "U+1D1DF", + "codepoint": "U+EC31", + "description": "Kievan ending symbol" + }, + "kievanNote8thStemDown": { + "alternateCodepoint": "U+1D1E6", + "codepoint": "U+EC3A", + "description": "Kievan eighth note, stem down" + }, + "kievanNote8thStemUp": { + "alternateCodepoint": "U+1D1E7", + "codepoint": "U+EC39", + "description": "Kievan eighth note, stem up" + }, + "kievanNoteBeam": { + "codepoint": "U+EC3B", + "description": "Kievan beam" + }, + "kievanNoteHalfStaffLine": { + "alternateCodepoint": "U+1D1E3", + "codepoint": "U+EC35", + "description": "Kievan half note (on staff line)" + }, + "kievanNoteHalfStaffSpace": { + "codepoint": "U+EC36", + "description": "Kievan half note (in staff space)" + }, + "kievanNoteQuarterStemDown": { + "alternateCodepoint": "U+1D1E4", + "codepoint": "U+EC38", + "description": "Kievan quarter note, stem down" + }, + "kievanNoteQuarterStemUp": { + "alternateCodepoint": "U+1D1E5", + "codepoint": "U+EC37", + "description": "Kievan quarter note, stem up" + }, + "kievanNoteReciting": { + "alternateCodepoint": "U+1D1E1", + "codepoint": "U+EC32", + "description": "Kievan reciting note" + }, + "kievanNoteWhole": { + "alternateCodepoint": "U+1D1E2", + "codepoint": "U+EC33", + "description": "Kievan whole note" + }, + "kievanNoteWholeFinal": { + "alternateCodepoint": "U+1D1E0", + "codepoint": "U+EC34", + "description": "Kievan final whole note" + }, + "kodalyHandDo": { + "codepoint": "U+EC40", + "description": "Do hand sign" + }, + "kodalyHandFa": { + "codepoint": "U+EC43", + "description": "Fa hand sign" + }, + "kodalyHandLa": { + "codepoint": "U+EC45", + "description": "La hand sign" + }, + "kodalyHandMi": { + "codepoint": "U+EC42", + "description": "Mi hand sign" + }, + "kodalyHandRe": { + "codepoint": "U+EC41", + "description": "Re hand sign" + }, + "kodalyHandSo": { + "codepoint": "U+EC44", + "description": "So hand sign" + }, + "kodalyHandTi": { + "codepoint": "U+EC46", + "description": "Ti hand sign" + }, + "leftRepeatSmall": { + "codepoint": "U+E04C", + "description": "Left repeat sign within bar" + }, + "legerLine": { + "codepoint": "U+E022", + "description": "Leger line" + }, + "legerLineNarrow": { + "codepoint": "U+E024", + "description": "Leger line (narrow)" + }, + "legerLineWide": { + "codepoint": "U+E023", + "description": "Leger line (wide)" + }, + "luteBarlineEndRepeat": { + "codepoint": "U+EBA4", + "description": "Lute tablature end repeat barline" + }, + "luteBarlineFinal": { + "codepoint": "U+EBA5", + "description": "Lute tablature final barline" + }, + "luteBarlineStartRepeat": { + "codepoint": "U+EBA3", + "description": "Lute tablature start repeat barline" + }, + "luteDuration16th": { + "codepoint": "U+EBAB", + "description": "16th note (semiquaver) duration sign" + }, + "luteDuration32nd": { + "codepoint": "U+EBAC", + "description": "32nd note (demisemiquaver) duration sign" + }, + "luteDuration8th": { + "codepoint": "U+EBAA", + "description": "Eighth note (quaver) duration sign" + }, + "luteDurationDoubleWhole": { + "codepoint": "U+EBA6", + "description": "Double whole note (breve) duration sign" + }, + "luteDurationHalf": { + "codepoint": "U+EBA8", + "description": "Half note (minim) duration sign" + }, + "luteDurationQuarter": { + "codepoint": "U+EBA9", + "description": "Quarter note (crotchet) duration sign" + }, + "luteDurationWhole": { + "codepoint": "U+EBA7", + "description": "Whole note (semibreve) duration sign" + }, + "luteFingeringRHFirst": { + "codepoint": "U+EBAE", + "description": "Right-hand fingering, first finger" + }, + "luteFingeringRHSecond": { + "codepoint": "U+EBAF", + "description": "Right-hand fingering, second finger" + }, + "luteFingeringRHThird": { + "codepoint": "U+EBB0", + "description": "Right-hand fingering, third finger" + }, + "luteFingeringRHThumb": { + "codepoint": "U+EBAD", + "description": "Right-hand fingering, thumb" + }, + "luteFrench10thCourse": { + "codepoint": "U+EBD0", + "description": "10th course (diapason)" + }, + "luteFrench7thCourse": { + "codepoint": "U+EBCD", + "description": "Seventh course (diapason)" + }, + "luteFrench8thCourse": { + "codepoint": "U+EBCE", + "description": "Eighth course (diapason)" + }, + "luteFrench9thCourse": { + "codepoint": "U+EBCF", + "description": "Ninth course (diapason)" + }, + "luteFrenchAppoggiaturaAbove": { + "codepoint": "U+EBD5", + "description": "Appoggiatura from above" + }, + "luteFrenchAppoggiaturaBelow": { + "codepoint": "U+EBD4", + "description": "Appoggiatura from below" + }, + "luteFrenchFretA": { + "codepoint": "U+EBC0", + "description": "Open string (a)" + }, + "luteFrenchFretB": { + "codepoint": "U+EBC1", + "description": "First fret (b)" + }, + "luteFrenchFretC": { + "codepoint": "U+EBC2", + "description": "Second fret (c)" + }, + "luteFrenchFretD": { + "codepoint": "U+EBC3", + "description": "Third fret (d)" + }, + "luteFrenchFretE": { + "codepoint": "U+EBC4", + "description": "Fourth fret (e)" + }, + "luteFrenchFretF": { + "codepoint": "U+EBC5", + "description": "Fifth fret (f)" + }, + "luteFrenchFretG": { + "codepoint": "U+EBC6", + "description": "Sixth fret (g)" + }, + "luteFrenchFretH": { + "codepoint": "U+EBC7", + "description": "Seventh fret (h)" + }, + "luteFrenchFretI": { + "codepoint": "U+EBC8", + "description": "Eighth fret (i)" + }, + "luteFrenchFretK": { + "codepoint": "U+EBC9", + "description": "Ninth fret (k)" + }, + "luteFrenchFretL": { + "codepoint": "U+EBCA", + "description": "10th fret (l)" + }, + "luteFrenchFretM": { + "codepoint": "U+EBCB", + "description": "11th fret (m)" + }, + "luteFrenchFretN": { + "codepoint": "U+EBCC", + "description": "12th fret (n)" + }, + "luteFrenchMordentInverted": { + "codepoint": "U+EBD3", + "description": "Inverted mordent" + }, + "luteFrenchMordentLower": { + "codepoint": "U+EBD2", + "description": "Mordent with lower auxiliary" + }, + "luteFrenchMordentUpper": { + "codepoint": "U+EBD1", + "description": "Mordent with upper auxiliary" + }, + "luteGermanALower": { + "codepoint": "U+EC00", + "description": "5th course, 1st fret (a)" + }, + "luteGermanAUpper": { + "codepoint": "U+EC17", + "description": "6th course, 1st fret (A)" + }, + "luteGermanBLower": { + "codepoint": "U+EC01", + "description": "4th course, 1st fret (b)" + }, + "luteGermanBUpper": { + "codepoint": "U+EC18", + "description": "6th course, 2nd fret (B)" + }, + "luteGermanCLower": { + "codepoint": "U+EC02", + "description": "3rd course, 1st fret (c)" + }, + "luteGermanCUpper": { + "codepoint": "U+EC19", + "description": "6th course, 3rd fret (C)" + }, + "luteGermanDLower": { + "codepoint": "U+EC03", + "description": "2nd course, 1st fret (d)" + }, + "luteGermanDUpper": { + "codepoint": "U+EC1A", + "description": "6th course, 4th fret (D)" + }, + "luteGermanELower": { + "codepoint": "U+EC04", + "description": "1st course, 1st fret (e)" + }, + "luteGermanEUpper": { + "codepoint": "U+EC1B", + "description": "6th course, 5th fret (E)" + }, + "luteGermanFLower": { + "codepoint": "U+EC05", + "description": "5th course, 2nd fret (f)" + }, + "luteGermanFUpper": { + "codepoint": "U+EC1C", + "description": "6th course, 6th fret (F)" + }, + "luteGermanGLower": { + "codepoint": "U+EC06", + "description": "4th course, 2nd fret (g)" + }, + "luteGermanGUpper": { + "codepoint": "U+EC1D", + "description": "6th course, 7th fret (G)" + }, + "luteGermanHLower": { + "codepoint": "U+EC07", + "description": "3rd course, 2nd fret (h)" + }, + "luteGermanHUpper": { + "codepoint": "U+EC1E", + "description": "6th course, 8th fret (H)" + }, + "luteGermanILower": { + "codepoint": "U+EC08", + "description": "2nd course, 2nd fret (i)" + }, + "luteGermanIUpper": { + "codepoint": "U+EC1F", + "description": "6th course, 9th fret (I)" + }, + "luteGermanKLower": { + "codepoint": "U+EC09", + "description": "1st course, 2nd fret (k)" + }, + "luteGermanKUpper": { + "codepoint": "U+EC20", + "description": "6th course, 10th fret (K)" + }, + "luteGermanLLower": { + "codepoint": "U+EC0A", + "description": "5th course, 3rd fret (l)" + }, + "luteGermanLUpper": { + "codepoint": "U+EC21", + "description": "6th course, 11th fret (L)" + }, + "luteGermanMLower": { + "codepoint": "U+EC0B", + "description": "4th course, 3rd fret (m)" + }, + "luteGermanMUpper": { + "codepoint": "U+EC22", + "description": "6th course, 12th fret (M)" + }, + "luteGermanNLower": { + "codepoint": "U+EC0C", + "description": "3rd course, 3rd fret (n)" + }, + "luteGermanNUpper": { + "codepoint": "U+EC23", + "description": "6th course, 13th fret (N)" + }, + "luteGermanOLower": { + "codepoint": "U+EC0D", + "description": "2nd course, 3rd fret (o)" + }, + "luteGermanPLower": { + "codepoint": "U+EC0E", + "description": "1st course, 3rd fret (p)" + }, + "luteGermanQLower": { + "codepoint": "U+EC0F", + "description": "5th course, 4th fret (q)" + }, + "luteGermanRLower": { + "codepoint": "U+EC10", + "description": "4th course, 4th fret (r)" + }, + "luteGermanSLower": { + "codepoint": "U+EC11", + "description": "3rd course, 4th fret (s)" + }, + "luteGermanTLower": { + "codepoint": "U+EC12", + "description": "2nd course, 4th fret (t)" + }, + "luteGermanVLower": { + "codepoint": "U+EC13", + "description": "1st course, 4th fret (v)" + }, + "luteGermanXLower": { + "codepoint": "U+EC14", + "description": "5th course, 5th fret (x)" + }, + "luteGermanYLower": { + "codepoint": "U+EC15", + "description": "4th course, 5th fret (y)" + }, + "luteGermanZLower": { + "codepoint": "U+EC16", + "description": "3rd course, 5th fret (z)" + }, + "luteItalianClefCSolFaUt": { + "codepoint": "U+EBF1", + "description": "C sol fa ut clef" + }, + "luteItalianClefFFaUt": { + "codepoint": "U+EBF0", + "description": "F fa ut clef" + }, + "luteItalianFret0": { + "codepoint": "U+EBE0", + "description": "Open string (0)" + }, + "luteItalianFret1": { + "codepoint": "U+EBE1", + "description": "First fret (1)" + }, + "luteItalianFret2": { + "codepoint": "U+EBE2", + "description": "Second fret (2)" + }, + "luteItalianFret3": { + "codepoint": "U+EBE3", + "description": "Third fret (3)" + }, + "luteItalianFret4": { + "codepoint": "U+EBE4", + "description": "Fourth fret (4)" + }, + "luteItalianFret5": { + "codepoint": "U+EBE5", + "description": "Fifth fret (5)" + }, + "luteItalianFret6": { + "codepoint": "U+EBE6", + "description": "Sixth fret (6)" + }, + "luteItalianFret7": { + "codepoint": "U+EBE7", + "description": "Seventh fret (7)" + }, + "luteItalianFret8": { + "codepoint": "U+EBE8", + "description": "Eighth fret (8)" + }, + "luteItalianFret9": { + "codepoint": "U+EBE9", + "description": "Ninth fret (9)" + }, + "luteItalianHoldFinger": { + "codepoint": "U+EBF4", + "description": "Hold finger in place" + }, + "luteItalianHoldNote": { + "codepoint": "U+EBF3", + "description": "Hold note" + }, + "luteItalianReleaseFinger": { + "codepoint": "U+EBF5", + "description": "Release finger" + }, + "luteItalianTempoFast": { + "codepoint": "U+EBEA", + "description": "Fast tempo indication (de Mudarra)" + }, + "luteItalianTempoNeitherFastNorSlow": { + "codepoint": "U+EBEC", + "description": "Neither fast nor slow tempo indication (de Mudarra)" + }, + "luteItalianTempoSlow": { + "codepoint": "U+EBED", + "description": "Slow tempo indication (de Mudarra)" + }, + "luteItalianTempoSomewhatFast": { + "codepoint": "U+EBEB", + "description": "Somewhat fast tempo indication (de Narvaez)" + }, + "luteItalianTempoVerySlow": { + "codepoint": "U+EBEE", + "description": "Very slow indication (de Narvaez)" + }, + "luteItalianTimeTriple": { + "codepoint": "U+EBEF", + "description": "Triple time indication" + }, + "luteItalianTremolo": { + "codepoint": "U+EBF2", + "description": "Single-finger tremolo or mordent" + }, + "luteItalianVibrato": { + "codepoint": "U+EBF6", + "description": "Vibrato (verre cass\u00e9)" + }, + "luteStaff6Lines": { + "codepoint": "U+EBA0", + "description": "Lute tablature staff, 6 courses" + }, + "luteStaff6LinesNarrow": { + "codepoint": "U+EBA2", + "description": "Lute tablature staff, 6 courses (narrow)" + }, + "luteStaff6LinesWide": { + "codepoint": "U+EBA1", + "description": "Lute tablature staff, 6 courses (wide)" + }, + "lyricsElision": { + "codepoint": "U+E551", + "description": "Elision" + }, + "lyricsElisionNarrow": { + "codepoint": "U+E550", + "description": "Narrow elision" + }, + "lyricsElisionWide": { + "codepoint": "U+E552", + "description": "Wide elision" + }, + "lyricsHyphenBaseline": { + "codepoint": "U+E553", + "description": "Baseline hyphen" + }, + "lyricsHyphenBaselineNonBreaking": { + "codepoint": "U+E554", + "description": "Non-breaking baseline hyphen" + }, + "lyricsTextRepeat": { + "codepoint": "U+E555", + "description": "Text repeats" + }, + "medRenFlatHardB": { + "codepoint": "U+E9E1", + "description": "Flat, hard b (mi)" + }, + "medRenFlatSoftB": { + "alternateCodepoint": "U+1D1D2", + "codepoint": "U+E9E0", + "description": "Flat, soft b (fa)" + }, + "medRenFlatWithDot": { + "codepoint": "U+E9E4", + "description": "Flat with dot" + }, + "medRenGClefCMN": { + "codepoint": "U+EA24", + "description": "G clef (Corpus Monodicum)" + }, + "medRenLiquescenceCMN": { + "codepoint": "U+EA22", + "description": "Liquescence" + }, + "medRenLiquescentAscCMN": { + "codepoint": "U+EA26", + "description": "Liquescent ascending (Corpus Monodicum)" + }, + "medRenLiquescentDescCMN": { + "codepoint": "U+EA27", + "description": "Liquescent descending (Corpus Monodicum)" + }, + "medRenNatural": { + "codepoint": "U+E9E2", + "description": "Natural" + }, + "medRenNaturalWithCross": { + "codepoint": "U+E9E5", + "description": "Natural with interrupted cross" + }, + "medRenOriscusCMN": { + "codepoint": "U+EA2A", + "description": "Oriscus (Corpus Monodicum)" + }, + "medRenPlicaCMN": { + "codepoint": "U+EA23", + "description": "Plica" + }, + "medRenPunctumCMN": { + "codepoint": "U+EA25", + "description": "Punctum (Corpus Monodicum)" + }, + "medRenQuilismaCMN": { + "codepoint": "U+EA28", + "description": "Quilisma (Corpus Monodicum)" + }, + "medRenSharpCroix": { + "alternateCodepoint": "U+1D1CF", + "codepoint": "U+E9E3", + "description": "Croix" + }, + "medRenStrophicusCMN": { + "codepoint": "U+EA29", + "description": "Strophicus (Corpus Monodicum)" + }, + "mensuralAlterationSign": { + "codepoint": "U+EA10", + "description": "Alteration sign" + }, + "mensuralBlackBrevis": { + "codepoint": "U+E952", + "description": "Black mensural brevis" + }, + "mensuralBlackBrevisVoid": { + "codepoint": "U+E956", + "description": "Black mensural void brevis" + }, + "mensuralBlackDragma": { + "codepoint": "U+E95A", + "description": "Black mensural dragma" + }, + "mensuralBlackLonga": { + "codepoint": "U+E951", + "description": "Black mensural longa" + }, + "mensuralBlackMaxima": { + "codepoint": "U+E950", + "description": "Black mensural maxima" + }, + "mensuralBlackMinima": { + "alternateCodepoint": "U+1D1BC", + "codepoint": "U+E954", + "description": "Black mensural minima" + }, + "mensuralBlackMinimaVoid": { + "alternateCodepoint": "U+1D1BB", + "codepoint": "U+E958", + "description": "Black mensural void minima" + }, + "mensuralBlackSemibrevis": { + "alternateCodepoint": "U+1D1BA", + "codepoint": "U+E953", + "description": "Black mensural semibrevis" + }, + "mensuralBlackSemibrevisCaudata": { + "codepoint": "U+E959", + "description": "Black mensural semibrevis caudata" + }, + "mensuralBlackSemibrevisOblique": { + "codepoint": "U+E95B", + "description": "Black mensural oblique semibrevis" + }, + "mensuralBlackSemibrevisVoid": { + "alternateCodepoint": "U+1D1B9", + "codepoint": "U+E957", + "description": "Black mensural void semibrevis" + }, + "mensuralBlackSemiminima": { + "codepoint": "U+E955", + "description": "Black mensural semiminima" + }, + "mensuralCclef": { + "codepoint": "U+E905", + "description": "Mensural C clef" + }, + "mensuralCclefPetrucciPosHigh": { + "codepoint": "U+E90A", + "description": "Petrucci C clef, high position" + }, + "mensuralCclefPetrucciPosHighest": { + "codepoint": "U+E90B", + "description": "Petrucci C clef, highest position" + }, + "mensuralCclefPetrucciPosLow": { + "codepoint": "U+E908", + "description": "Petrucci C clef, low position" + }, + "mensuralCclefPetrucciPosLowest": { + "codepoint": "U+E907", + "description": "Petrucci C clef, lowest position" + }, + "mensuralCclefPetrucciPosMiddle": { + "codepoint": "U+E909", + "description": "Petrucci C clef, middle position" + }, + "mensuralColorationEndRound": { + "codepoint": "U+EA0F", + "description": "Coloration end, round" + }, + "mensuralColorationEndSquare": { + "codepoint": "U+EA0D", + "description": "Coloration end, square" + }, + "mensuralColorationStartRound": { + "codepoint": "U+EA0E", + "description": "Coloration start, round" + }, + "mensuralColorationStartSquare": { + "codepoint": "U+EA0C", + "description": "Coloration start, square" + }, + "mensuralCombStemDiagonal": { + "codepoint": "U+E940", + "description": "Combining stem diagonal" + }, + "mensuralCombStemDown": { + "codepoint": "U+E93F", + "description": "Combining stem down" + }, + "mensuralCombStemDownFlagExtended": { + "codepoint": "U+E948", + "description": "Combining stem with extended flag down" + }, + "mensuralCombStemDownFlagFlared": { + "codepoint": "U+E946", + "description": "Combining stem with flared flag down" + }, + "mensuralCombStemDownFlagFusa": { + "codepoint": "U+E94C", + "description": "Combining stem with fusa flag down" + }, + "mensuralCombStemDownFlagLeft": { + "codepoint": "U+E944", + "description": "Combining stem with flag left down" + }, + "mensuralCombStemDownFlagRight": { + "codepoint": "U+E942", + "description": "Combining stem with flag right down" + }, + "mensuralCombStemDownFlagSemiminima": { + "codepoint": "U+E94A", + "description": "Combining stem with semiminima flag down" + }, + "mensuralCombStemUp": { + "codepoint": "U+E93E", + "description": "Combining stem up" + }, + "mensuralCombStemUpFlagExtended": { + "codepoint": "U+E947", + "description": "Combining stem with extended flag up" + }, + "mensuralCombStemUpFlagFlared": { + "codepoint": "U+E945", + "description": "Combining stem with flared flag up" + }, + "mensuralCombStemUpFlagFusa": { + "codepoint": "U+E94B", + "description": "Combining stem with fusa flag up" + }, + "mensuralCombStemUpFlagLeft": { + "codepoint": "U+E943", + "description": "Combining stem with flag left up" + }, + "mensuralCombStemUpFlagRight": { + "codepoint": "U+E941", + "description": "Combining stem with flag right up" + }, + "mensuralCombStemUpFlagSemiminima": { + "codepoint": "U+E949", + "description": "Combining stem with semiminima flag up" + }, + "mensuralCustosCheckmark": { + "codepoint": "U+EA0A", + "description": "Checkmark custos" + }, + "mensuralCustosDown": { + "codepoint": "U+EA03", + "description": "Mensural custos down" + }, + "mensuralCustosTurn": { + "codepoint": "U+EA0B", + "description": "Turn-like custos" + }, + "mensuralCustosUp": { + "codepoint": "U+EA02", + "description": "Mensural custos up" + }, + "mensuralFclef": { + "codepoint": "U+E903", + "description": "Mensural F clef" + }, + "mensuralFclefPetrucci": { + "codepoint": "U+E904", + "description": "Petrucci F clef" + }, + "mensuralGclef": { + "codepoint": "U+E900", + "description": "Mensural G clef" + }, + "mensuralGclefPetrucci": { + "codepoint": "U+E901", + "description": "Petrucci G clef" + }, + "mensuralModusImperfectumVert": { + "codepoint": "U+E92D", + "description": "Modus imperfectum, vertical" + }, + "mensuralModusPerfectumVert": { + "codepoint": "U+E92C", + "description": "Modus perfectum, vertical" + }, + "mensuralNoteheadLongaBlack": { + "codepoint": "U+E934", + "description": "Longa/brevis notehead, black" + }, + "mensuralNoteheadLongaBlackVoid": { + "codepoint": "U+E936", + "description": "Longa/brevis notehead, black and void" + }, + "mensuralNoteheadLongaVoid": { + "codepoint": "U+E935", + "description": "Longa/brevis notehead, void" + }, + "mensuralNoteheadLongaWhite": { + "codepoint": "U+E937", + "description": "Longa/brevis notehead, white" + }, + "mensuralNoteheadMaximaBlack": { + "codepoint": "U+E930", + "description": "Maxima notehead, black" + }, + "mensuralNoteheadMaximaBlackVoid": { + "codepoint": "U+E932", + "description": "Maxima notehead, black and void" + }, + "mensuralNoteheadMaximaVoid": { + "codepoint": "U+E931", + "description": "Maxima notehead, void" + }, + "mensuralNoteheadMaximaWhite": { + "codepoint": "U+E933", + "description": "Maxima notehead, white" + }, + "mensuralNoteheadMinimaWhite": { + "codepoint": "U+E93C", + "description": "Minima notehead, white" + }, + "mensuralNoteheadSemibrevisBlack": { + "codepoint": "U+E938", + "description": "Semibrevis notehead, black" + }, + "mensuralNoteheadSemibrevisBlackVoid": { + "codepoint": "U+E93A", + "description": "Semibrevis notehead, black and void" + }, + "mensuralNoteheadSemibrevisBlackVoidTurned": { + "codepoint": "U+E93B", + "description": "Semibrevis notehead, black and void (turned)" + }, + "mensuralNoteheadSemibrevisVoid": { + "codepoint": "U+E939", + "description": "Semibrevis notehead, void" + }, + "mensuralNoteheadSemiminimaWhite": { + "codepoint": "U+E93D", + "description": "Semiminima/fusa notehead, white" + }, + "mensuralObliqueAsc2ndBlack": { + "codepoint": "U+E970", + "description": "Oblique form, ascending 2nd, black" + }, + "mensuralObliqueAsc2ndBlackVoid": { + "codepoint": "U+E972", + "description": "Oblique form, ascending 2nd, black and void" + }, + "mensuralObliqueAsc2ndVoid": { + "codepoint": "U+E971", + "description": "Oblique form, ascending 2nd, void" + }, + "mensuralObliqueAsc2ndWhite": { + "codepoint": "U+E973", + "description": "Oblique form, ascending 2nd, white" + }, + "mensuralObliqueAsc3rdBlack": { + "codepoint": "U+E974", + "description": "Oblique form, ascending 3rd, black" + }, + "mensuralObliqueAsc3rdBlackVoid": { + "codepoint": "U+E976", + "description": "Oblique form, ascending 3rd, black and void" + }, + "mensuralObliqueAsc3rdVoid": { + "codepoint": "U+E975", + "description": "Oblique form, ascending 3rd, void" + }, + "mensuralObliqueAsc3rdWhite": { + "codepoint": "U+E977", + "description": "Oblique form, ascending 3rd, white" + }, + "mensuralObliqueAsc4thBlack": { + "codepoint": "U+E978", + "description": "Oblique form, ascending 4th, black" + }, + "mensuralObliqueAsc4thBlackVoid": { + "codepoint": "U+E97A", + "description": "Oblique form, ascending 4th, black and void" + }, + "mensuralObliqueAsc4thVoid": { + "codepoint": "U+E979", + "description": "Oblique form, ascending 4th, void" + }, + "mensuralObliqueAsc4thWhite": { + "codepoint": "U+E97B", + "description": "Oblique form, ascending 4th, white" + }, + "mensuralObliqueAsc5thBlack": { + "codepoint": "U+E97C", + "description": "Oblique form, ascending 5th, black" + }, + "mensuralObliqueAsc5thBlackVoid": { + "codepoint": "U+E97E", + "description": "Oblique form, ascending 5th, black and void" + }, + "mensuralObliqueAsc5thVoid": { + "codepoint": "U+E97D", + "description": "Oblique form, ascending 5th, void" + }, + "mensuralObliqueAsc5thWhite": { + "codepoint": "U+E97F", + "description": "Oblique form, ascending 5th, white" + }, + "mensuralObliqueDesc2ndBlack": { + "codepoint": "U+E980", + "description": "Oblique form, descending 2nd, black" + }, + "mensuralObliqueDesc2ndBlackVoid": { + "codepoint": "U+E982", + "description": "Oblique form, descending 2nd, black and void" + }, + "mensuralObliqueDesc2ndVoid": { + "codepoint": "U+E981", + "description": "Oblique form, descending 2nd, void" + }, + "mensuralObliqueDesc2ndWhite": { + "codepoint": "U+E983", + "description": "Oblique form, descending 2nd, white" + }, + "mensuralObliqueDesc3rdBlack": { + "codepoint": "U+E984", + "description": "Oblique form, descending 3rd, black" + }, + "mensuralObliqueDesc3rdBlackVoid": { + "codepoint": "U+E986", + "description": "Oblique form, descending 3rd, black and void" + }, + "mensuralObliqueDesc3rdVoid": { + "codepoint": "U+E985", + "description": "Oblique form, descending 3rd, void" + }, + "mensuralObliqueDesc3rdWhite": { + "codepoint": "U+E987", + "description": "Oblique form, descending 3rd, white" + }, + "mensuralObliqueDesc4thBlack": { + "codepoint": "U+E988", + "description": "Oblique form, descending 4th, black" + }, + "mensuralObliqueDesc4thBlackVoid": { + "codepoint": "U+E98A", + "description": "Oblique form, descending 4th, black and void" + }, + "mensuralObliqueDesc4thVoid": { + "codepoint": "U+E989", + "description": "Oblique form, descending 4th, void" + }, + "mensuralObliqueDesc4thWhite": { + "codepoint": "U+E98B", + "description": "Oblique form, descending 4th, white" + }, + "mensuralObliqueDesc5thBlack": { + "codepoint": "U+E98C", + "description": "Oblique form, descending 5th, black" + }, + "mensuralObliqueDesc5thBlackVoid": { + "codepoint": "U+E98E", + "description": "Oblique form, descending 5th, black and void" + }, + "mensuralObliqueDesc5thVoid": { + "codepoint": "U+E98D", + "description": "Oblique form, descending 5th, void" + }, + "mensuralObliqueDesc5thWhite": { + "codepoint": "U+E98F", + "description": "Oblique form, descending 5th, white" + }, + "mensuralProlation1": { + "alternateCodepoint": "U+1D1C7", + "codepoint": "U+E910", + "description": "Tempus perfectum cum prolatione perfecta (9/8)" + }, + "mensuralProlation10": { + "alternateCodepoint": "U+1D1CE", + "codepoint": "U+E919", + "description": "Tempus imperfectum cum prolatione imperfecta diminution 4" + }, + "mensuralProlation11": { + "codepoint": "U+E91A", + "description": "Tempus imperfectum cum prolatione imperfecta diminution 5" + }, + "mensuralProlation2": { + "alternateCodepoint": "U+1D1C8", + "codepoint": "U+E911", + "description": "Tempus perfectum cum prolatione imperfecta (3/4)" + }, + "mensuralProlation3": { + "alternateCodepoint": "U+1D1C9", + "codepoint": "U+E912", + "description": "Tempus perfectum cum prolatione imperfecta diminution 1 (3/8)" + }, + "mensuralProlation4": { + "codepoint": "U+E913", + "description": "Tempus perfectum cum prolatione perfecta diminution 2 (9/16)" + }, + "mensuralProlation5": { + "alternateCodepoint": "U+1D1CA", + "codepoint": "U+E914", + "description": "Tempus imperfectum cum prolatione perfecta (6/8)" + }, + "mensuralProlation6": { + "alternateCodepoint": "U+1D1CB", + "codepoint": "U+E915", + "description": "Tempus imperfectum cum prolatione imperfecta (2/4)" + }, + "mensuralProlation7": { + "alternateCodepoint": "U+1D1CC", + "codepoint": "U+E916", + "description": "Tempus imperfectum cum prolatione imperfecta diminution 1 (2/2)" + }, + "mensuralProlation8": { + "codepoint": "U+E917", + "description": "Tempus imperfectum cum prolatione imperfecta diminution 2 (6/16)" + }, + "mensuralProlation9": { + "alternateCodepoint": "U+1D1CD", + "codepoint": "U+E918", + "description": "Tempus imperfectum cum prolatione imperfecta diminution 3 (2/2)" + }, + "mensuralProlationCombiningDot": { + "codepoint": "U+E920", + "description": "Combining dot" + }, + "mensuralProlationCombiningDotVoid": { + "codepoint": "U+E924", + "description": "Combining void dot" + }, + "mensuralProlationCombiningStroke": { + "codepoint": "U+E925", + "description": "Combining vertical stroke" + }, + "mensuralProlationCombiningThreeDots": { + "codepoint": "U+E922", + "description": "Combining three dots horizontal" + }, + "mensuralProlationCombiningThreeDotsTri": { + "codepoint": "U+E923", + "description": "Combining three dots triangular" + }, + "mensuralProlationCombiningTwoDots": { + "codepoint": "U+E921", + "description": "Combining two dots" + }, + "mensuralProportion1": { + "codepoint": "U+E926", + "description": "Mensural proportion 1" + }, + "mensuralProportion2": { + "codepoint": "U+E927", + "description": "Mensural proportion 2" + }, + "mensuralProportion3": { + "codepoint": "U+E928", + "description": "Mensural proportion 3" + }, + "mensuralProportion4": { + "codepoint": "U+E929", + "description": "Mensural proportion 4" + }, + "mensuralProportion5": { + "codepoint": "U+EE90", + "description": "Mensural proportion 5" + }, + "mensuralProportion6": { + "codepoint": "U+EE91", + "description": "Mensural proportion 6" + }, + "mensuralProportion7": { + "codepoint": "U+EE92", + "description": "Mensural proportion 7" + }, + "mensuralProportion8": { + "codepoint": "U+EE93", + "description": "Mensural proportion 8" + }, + "mensuralProportion9": { + "codepoint": "U+EE94", + "description": "Mensural proportion 9" + }, + "mensuralProportionMajor": { + "codepoint": "U+E92B", + "description": "Mensural proportion major" + }, + "mensuralProportionMinor": { + "codepoint": "U+E92A", + "description": "Mensural proportion minor" + }, + "mensuralProportionProportioDupla1": { + "codepoint": "U+E91C", + "description": "Proportio dupla 1" + }, + "mensuralProportionProportioDupla2": { + "codepoint": "U+E91D", + "description": "Proportio dupla 2" + }, + "mensuralProportionProportioQuadrupla": { + "codepoint": "U+E91F", + "description": "Proportio quadrupla" + }, + "mensuralProportionProportioTripla": { + "codepoint": "U+E91E", + "description": "Proportio tripla" + }, + "mensuralProportionTempusPerfectum": { + "codepoint": "U+E91B", + "description": "Tempus perfectum" + }, + "mensuralRestBrevis": { + "alternateCodepoint": "U+1D1C3", + "codepoint": "U+E9F3", + "description": "Brevis rest" + }, + "mensuralRestFusa": { + "codepoint": "U+E9F7", + "description": "Fusa rest" + }, + "mensuralRestLongaImperfecta": { + "alternateCodepoint": "U+1D1C2", + "codepoint": "U+E9F2", + "description": "Longa imperfecta rest" + }, + "mensuralRestLongaPerfecta": { + "alternateCodepoint": "U+1D1C1", + "codepoint": "U+E9F1", + "description": "Longa perfecta rest" + }, + "mensuralRestMaxima": { + "codepoint": "U+E9F0", + "description": "Maxima rest" + }, + "mensuralRestMinima": { + "alternateCodepoint": "U+1D1C5", + "codepoint": "U+E9F5", + "description": "Minima rest" + }, + "mensuralRestSemibrevis": { + "alternateCodepoint": "U+1D1C4", + "codepoint": "U+E9F4", + "description": "Semibrevis rest" + }, + "mensuralRestSemifusa": { + "codepoint": "U+E9F8", + "description": "Semifusa rest" + }, + "mensuralRestSemiminima": { + "alternateCodepoint": "U+1D1C6", + "codepoint": "U+E9F6", + "description": "Semiminima rest" + }, + "mensuralSignumDown": { + "codepoint": "U+EA01", + "description": "Signum congruentiae down" + }, + "mensuralSignumUp": { + "codepoint": "U+EA00", + "description": "Signum congruentiae up" + }, + "mensuralTempusImperfectumHoriz": { + "codepoint": "U+E92F", + "description": "Tempus imperfectum, horizontal" + }, + "mensuralTempusPerfectumHoriz": { + "codepoint": "U+E92E", + "description": "Tempus perfectum, horizontal" + }, + "mensuralWhiteBrevis": { + "alternateCodepoint": "U+1D1B8", + "codepoint": "U+E95E", + "description": "White mensural brevis" + }, + "mensuralWhiteFusa": { + "alternateCodepoint": "U+1D1BE", + "codepoint": "U+E961", + "description": "White mensural fusa" + }, + "mensuralWhiteLonga": { + "alternateCodepoint": "U+1D1B7", + "codepoint": "U+E95D", + "description": "White mensural longa" + }, + "mensuralWhiteMaxima": { + "alternateCodepoint": "U+1D1B6", + "codepoint": "U+E95C", + "description": "White mensural maxima" + }, + "mensuralWhiteMinima": { + "codepoint": "U+E95F", + "description": "White mensural minima" + }, + "mensuralWhiteSemibrevis": { + "alternateCodepoint": "U+1D1B9", + "codepoint": "U+E962", + "description": "White mensural semibrevis" + }, + "mensuralWhiteSemiminima": { + "codepoint": "U+E960", + "description": "White mensural semiminima" + }, + "metAugmentationDot": { + "codepoint": "U+ECB7", + "description": "Augmentation dot" + }, + "metNote1024thDown": { + "codepoint": "U+ECB6", + "description": "1024th note (semihemidemisemihemidemisemiquaver) stem down" + }, + "metNote1024thUp": { + "codepoint": "U+ECB5", + "description": "1024th note (semihemidemisemihemidemisemiquaver) stem up" + }, + "metNote128thDown": { + "codepoint": "U+ECB0", + "description": "128th note (semihemidemisemiquaver) stem down" + }, + "metNote128thUp": { + "codepoint": "U+ECAF", + "description": "128th note (semihemidemisemiquaver) stem up" + }, + "metNote16thDown": { + "codepoint": "U+ECAA", + "description": "16th note (semiquaver) stem down" + }, + "metNote16thUp": { + "codepoint": "U+ECA9", + "description": "16th note (semiquaver) stem up" + }, + "metNote256thDown": { + "codepoint": "U+ECB2", + "description": "256th note (demisemihemidemisemiquaver) stem down" + }, + "metNote256thUp": { + "codepoint": "U+ECB1", + "description": "256th note (demisemihemidemisemiquaver) stem up" + }, + "metNote32ndDown": { + "codepoint": "U+ECAC", + "description": "32nd note (demisemiquaver) stem down" + }, + "metNote32ndUp": { + "codepoint": "U+ECAB", + "description": "32nd note (demisemiquaver) stem up" + }, + "metNote512thDown": { + "codepoint": "U+ECB4", + "description": "512th note (hemidemisemihemidemisemiquaver) stem down" + }, + "metNote512thUp": { + "codepoint": "U+ECB3", + "description": "512th note (hemidemisemihemidemisemiquaver) stem up" + }, + "metNote64thDown": { + "codepoint": "U+ECAE", + "description": "64th note (hemidemisemiquaver) stem down" + }, + "metNote64thUp": { + "codepoint": "U+ECAD", + "description": "64th note (hemidemisemiquaver) stem up" + }, + "metNote8thDown": { + "codepoint": "U+ECA8", + "description": "Eighth note (quaver) stem down" + }, + "metNote8thUp": { + "codepoint": "U+ECA7", + "description": "Eighth note (quaver) stem up" + }, + "metNoteDoubleWhole": { + "codepoint": "U+ECA0", + "description": "Double whole note (breve)" + }, + "metNoteDoubleWholeSquare": { + "codepoint": "U+ECA1", + "description": "Double whole note (square)" + }, + "metNoteHalfDown": { + "codepoint": "U+ECA4", + "description": "Half note (minim) stem down" + }, + "metNoteHalfUp": { + "codepoint": "U+ECA3", + "description": "Half note (minim) stem up" + }, + "metNoteQuarterDown": { + "codepoint": "U+ECA6", + "description": "Quarter note (crotchet) stem down" + }, + "metNoteQuarterUp": { + "codepoint": "U+ECA5", + "description": "Quarter note (crotchet) stem up" + }, + "metNoteWhole": { + "codepoint": "U+ECA2", + "description": "Whole note (semibreve)" + }, + "metricModulationArrowLeft": { + "codepoint": "U+EC63", + "description": "Left-pointing arrow for metric modulation" + }, + "metricModulationArrowRight": { + "codepoint": "U+EC64", + "description": "Right-pointing arrow for metric modulation" + }, + "miscDoNotCopy": { + "codepoint": "U+EC61", + "description": "Do not copy" + }, + "miscDoNotPhotocopy": { + "codepoint": "U+EC60", + "description": "Do not photocopy" + }, + "miscEyeglasses": { + "codepoint": "U+EC62", + "description": "Eyeglasses" + }, + "note1024thDown": { + "codepoint": "U+E1E6", + "description": "1024th note (semihemidemisemihemidemisemiquaver) stem down" + }, + "note1024thUp": { + "codepoint": "U+E1E5", + "description": "1024th note (semihemidemisemihemidemisemiquaver) stem up" + }, + "note128thDown": { + "codepoint": "U+E1E0", + "description": "128th note (semihemidemisemiquaver) stem down" + }, + "note128thUp": { + "alternateCodepoint": "U+1D164", + "codepoint": "U+E1DF", + "description": "128th note (semihemidemisemiquaver) stem up" + }, + "note16thDown": { + "codepoint": "U+E1DA", + "description": "16th note (semiquaver) stem down" + }, + "note16thUp": { + "alternateCodepoint": "U+1D161", + "codepoint": "U+E1D9", + "description": "16th note (semiquaver) stem up" + }, + "note256thDown": { + "codepoint": "U+E1E2", + "description": "256th note (demisemihemidemisemiquaver) stem down" + }, + "note256thUp": { + "codepoint": "U+E1E1", + "description": "256th note (demisemihemidemisemiquaver) stem up" + }, + "note32ndDown": { + "codepoint": "U+E1DC", + "description": "32nd note (demisemiquaver) stem down" + }, + "note32ndUp": { + "alternateCodepoint": "U+1D162", + "codepoint": "U+E1DB", + "description": "32nd note (demisemiquaver) stem up" + }, + "note512thDown": { + "codepoint": "U+E1E4", + "description": "512th note (hemidemisemihemidemisemiquaver) stem down" + }, + "note512thUp": { + "codepoint": "U+E1E3", + "description": "512th note (hemidemisemihemidemisemiquaver) stem up" + }, + "note64thDown": { + "codepoint": "U+E1DE", + "description": "64th note (hemidemisemiquaver) stem down" + }, + "note64thUp": { + "alternateCodepoint": "U+1D163", + "codepoint": "U+E1DD", + "description": "64th note (hemidemisemiquaver) stem up" + }, + "note8thDown": { + "codepoint": "U+E1D8", + "description": "Eighth note (quaver) stem down" + }, + "note8thUp": { + "alternateCodepoint": "U+1D160", + "codepoint": "U+E1D7", + "description": "Eighth note (quaver) stem up" + }, + "noteABlack": { + "codepoint": "U+E197", + "description": "A (black note)" + }, + "noteAFlatBlack": { + "codepoint": "U+E196", + "description": "A flat (black note)" + }, + "noteAFlatHalf": { + "codepoint": "U+E17F", + "description": "A flat (half note)" + }, + "noteAFlatWhole": { + "codepoint": "U+E168", + "description": "A flat (whole note)" + }, + "noteAHalf": { + "codepoint": "U+E180", + "description": "A (half note)" + }, + "noteASharpBlack": { + "codepoint": "U+E198", + "description": "A sharp (black note)" + }, + "noteASharpHalf": { + "codepoint": "U+E181", + "description": "A sharp (half note)" + }, + "noteASharpWhole": { + "codepoint": "U+E16A", + "description": "A sharp (whole note)" + }, + "noteAWhole": { + "codepoint": "U+E169", + "description": "A (whole note)" + }, + "noteBBlack": { + "codepoint": "U+E19A", + "description": "B (black note)" + }, + "noteBFlatBlack": { + "codepoint": "U+E199", + "description": "B flat (black note)" + }, + "noteBFlatHalf": { + "codepoint": "U+E182", + "description": "B flat (half note)" + }, + "noteBFlatWhole": { + "codepoint": "U+E16B", + "description": "B flat (whole note)" + }, + "noteBHalf": { + "codepoint": "U+E183", + "description": "B (half note)" + }, + "noteBSharpBlack": { + "codepoint": "U+E19B", + "description": "B sharp (black note)" + }, + "noteBSharpHalf": { + "codepoint": "U+E184", + "description": "B sharp (half note)" + }, + "noteBSharpWhole": { + "codepoint": "U+E16D", + "description": "B sharp (whole note)" + }, + "noteBWhole": { + "codepoint": "U+E16C", + "description": "B (whole note)" + }, + "noteCBlack": { + "codepoint": "U+E19D", + "description": "C (black note)" + }, + "noteCFlatBlack": { + "codepoint": "U+E19C", + "description": "C flat (black note)" + }, + "noteCFlatHalf": { + "codepoint": "U+E185", + "description": "C flat (half note)" + }, + "noteCFlatWhole": { + "codepoint": "U+E16E", + "description": "C flat (whole note)" + }, + "noteCHalf": { + "codepoint": "U+E186", + "description": "C (half note)" + }, + "noteCSharpBlack": { + "codepoint": "U+E19E", + "description": "C sharp (black note)" + }, + "noteCSharpHalf": { + "codepoint": "U+E187", + "description": "C sharp (half note)" + }, + "noteCSharpWhole": { + "codepoint": "U+E170", + "description": "C sharp (whole note)" + }, + "noteCWhole": { + "codepoint": "U+E16F", + "description": "C (whole note)" + }, + "noteDBlack": { + "codepoint": "U+E1A0", + "description": "D (black note)" + }, + "noteDFlatBlack": { + "codepoint": "U+E19F", + "description": "D flat (black note)" + }, + "noteDFlatHalf": { + "codepoint": "U+E188", + "description": "D flat (half note)" + }, + "noteDFlatWhole": { + "codepoint": "U+E171", + "description": "D flat (whole note)" + }, + "noteDHalf": { + "codepoint": "U+E189", + "description": "D (half note)" + }, + "noteDSharpBlack": { + "codepoint": "U+E1A1", + "description": "D sharp (black note)" + }, + "noteDSharpHalf": { + "codepoint": "U+E18A", + "description": "D sharp (half note)" + }, + "noteDSharpWhole": { + "codepoint": "U+E173", + "description": "D sharp (whole note)" + }, + "noteDWhole": { + "codepoint": "U+E172", + "description": "D (whole note)" + }, + "noteDiBlack": { + "codepoint": "U+EEF2", + "description": "Di (black note)" + }, + "noteDiHalf": { + "codepoint": "U+EEE9", + "description": "Di (half note)" + }, + "noteDiWhole": { + "codepoint": "U+EEE0", + "description": "Di (whole note)" + }, + "noteDoBlack": { + "codepoint": "U+E160", + "description": "Do (black note)" + }, + "noteDoHalf": { + "codepoint": "U+E158", + "description": "Do (half note)" + }, + "noteDoWhole": { + "codepoint": "U+E150", + "description": "Do (whole note)" + }, + "noteDoubleWhole": { + "alternateCodepoint": "U+1D15C", + "codepoint": "U+E1D0", + "description": "Double whole note (breve)" + }, + "noteDoubleWholeSquare": { + "codepoint": "U+E1D1", + "description": "Double whole note (square)" + }, + "noteEBlack": { + "codepoint": "U+E1A3", + "description": "E (black note)" + }, + "noteEFlatBlack": { + "codepoint": "U+E1A2", + "description": "E flat (black note)" + }, + "noteEFlatHalf": { + "codepoint": "U+E18B", + "description": "E flat (half note)" + }, + "noteEFlatWhole": { + "codepoint": "U+E174", + "description": "E flat (whole note)" + }, + "noteEHalf": { + "codepoint": "U+E18C", + "description": "E (half note)" + }, + "noteESharpBlack": { + "codepoint": "U+E1A4", + "description": "E sharp (black note)" + }, + "noteESharpHalf": { + "codepoint": "U+E18D", + "description": "E sharp (half note)" + }, + "noteESharpWhole": { + "codepoint": "U+E176", + "description": "E sharp (whole note)" + }, + "noteEWhole": { + "codepoint": "U+E175", + "description": "E (whole note)" + }, + "noteEmptyBlack": { + "codepoint": "U+E1AF", + "description": "Empty black note" + }, + "noteEmptyHalf": { + "codepoint": "U+E1AE", + "description": "Empty half note" + }, + "noteEmptyWhole": { + "codepoint": "U+E1AD", + "description": "Empty whole note" + }, + "noteFBlack": { + "codepoint": "U+E1A6", + "description": "F (black note)" + }, + "noteFFlatBlack": { + "codepoint": "U+E1A5", + "description": "F flat (black note)" + }, + "noteFFlatHalf": { + "codepoint": "U+E18E", + "description": "F flat (half note)" + }, + "noteFFlatWhole": { + "codepoint": "U+E177", + "description": "F flat (whole note)" + }, + "noteFHalf": { + "codepoint": "U+E18F", + "description": "F (half note)" + }, + "noteFSharpBlack": { + "codepoint": "U+E1A7", + "description": "F sharp (black note)" + }, + "noteFSharpHalf": { + "codepoint": "U+E190", + "description": "F sharp (half note)" + }, + "noteFSharpWhole": { + "codepoint": "U+E179", + "description": "F sharp (whole note)" + }, + "noteFWhole": { + "codepoint": "U+E178", + "description": "F (whole note)" + }, + "noteFaBlack": { + "codepoint": "U+E163", + "description": "Fa (black note)" + }, + "noteFaHalf": { + "codepoint": "U+E15B", + "description": "Fa (half note)" + }, + "noteFaWhole": { + "codepoint": "U+E153", + "description": "Fa (whole note)" + }, + "noteFiBlack": { + "codepoint": "U+EEF6", + "description": "Fi (black note)" + }, + "noteFiHalf": { + "codepoint": "U+EEED", + "description": "Fi (half note)" + }, + "noteFiWhole": { + "codepoint": "U+EEE4", + "description": "Fi (whole note)" + }, + "noteGBlack": { + "codepoint": "U+E1A9", + "description": "G (black note)" + }, + "noteGFlatBlack": { + "codepoint": "U+E1A8", + "description": "G flat (black note)" + }, + "noteGFlatHalf": { + "codepoint": "U+E191", + "description": "G flat (half note)" + }, + "noteGFlatWhole": { + "codepoint": "U+E17A", + "description": "G flat (whole note)" + }, + "noteGHalf": { + "codepoint": "U+E192", + "description": "G (half note)" + }, + "noteGSharpBlack": { + "codepoint": "U+E1AA", + "description": "G sharp (black note)" + }, + "noteGSharpHalf": { + "codepoint": "U+E193", + "description": "G sharp (half note)" + }, + "noteGSharpWhole": { + "codepoint": "U+E17C", + "description": "G sharp (whole note)" + }, + "noteGWhole": { + "codepoint": "U+E17B", + "description": "G (whole note)" + }, + "noteHBlack": { + "codepoint": "U+E1AB", + "description": "H (black note)" + }, + "noteHHalf": { + "codepoint": "U+E194", + "description": "H (half note)" + }, + "noteHSharpBlack": { + "codepoint": "U+E1AC", + "description": "H sharp (black note)" + }, + "noteHSharpHalf": { + "codepoint": "U+E195", + "description": "H sharp (half note)" + }, + "noteHSharpWhole": { + "codepoint": "U+E17E", + "description": "H sharp (whole note)" + }, + "noteHWhole": { + "codepoint": "U+E17D", + "description": "H (whole note)" + }, + "noteHalfDown": { + "codepoint": "U+E1D4", + "description": "Half note (minim) stem down" + }, + "noteHalfUp": { + "alternateCodepoint": "U+1D15E", + "codepoint": "U+E1D3", + "description": "Half note (minim) stem up" + }, + "noteLaBlack": { + "codepoint": "U+E165", + "description": "La (black note)" + }, + "noteLaHalf": { + "codepoint": "U+E15D", + "description": "La (half note)" + }, + "noteLaWhole": { + "codepoint": "U+E155", + "description": "La (whole note)" + }, + "noteLeBlack": { + "codepoint": "U+EEF9", + "description": "Le (black note)" + }, + "noteLeHalf": { + "codepoint": "U+EEF0", + "description": "Le (half note)" + }, + "noteLeWhole": { + "codepoint": "U+EEE7", + "description": "Le (whole note)" + }, + "noteLiBlack": { + "codepoint": "U+EEF8", + "description": "Li (black note)" + }, + "noteLiHalf": { + "codepoint": "U+EEEF", + "description": "Li (half note)" + }, + "noteLiWhole": { + "codepoint": "U+EEE6", + "description": "Li (whole note)" + }, + "noteMeBlack": { + "codepoint": "U+EEF5", + "description": "Me (black note)" + }, + "noteMeHalf": { + "codepoint": "U+EEEC", + "description": "Me (half note)" + }, + "noteMeWhole": { + "codepoint": "U+EEE3", + "description": "Me (whole note)" + }, + "noteMiBlack": { + "codepoint": "U+E162", + "description": "Mi (black note)" + }, + "noteMiHalf": { + "codepoint": "U+E15A", + "description": "Mi (half note)" + }, + "noteMiWhole": { + "codepoint": "U+E152", + "description": "Mi (whole note)" + }, + "noteQuarterDown": { + "codepoint": "U+E1D6", + "description": "Quarter note (crotchet) stem down" + }, + "noteQuarterUp": { + "alternateCodepoint": "U+1D15F", + "codepoint": "U+E1D5", + "description": "Quarter note (crotchet) stem up" + }, + "noteRaBlack": { + "codepoint": "U+EEF4", + "description": "Ra (black note)" + }, + "noteRaHalf": { + "codepoint": "U+EEEB", + "description": "Ra (half note)" + }, + "noteRaWhole": { + "codepoint": "U+EEE2", + "description": "Ra (whole note)" + }, + "noteReBlack": { + "codepoint": "U+E161", + "description": "Re (black note)" + }, + "noteReHalf": { + "codepoint": "U+E159", + "description": "Re (half note)" + }, + "noteReWhole": { + "codepoint": "U+E151", + "description": "Re (whole note)" + }, + "noteRiBlack": { + "codepoint": "U+EEF3", + "description": "Ri (black note)" + }, + "noteRiHalf": { + "codepoint": "U+EEEA", + "description": "Ri (half note)" + }, + "noteRiWhole": { + "codepoint": "U+EEE1", + "description": "Ri (whole note)" + }, + "noteSeBlack": { + "codepoint": "U+EEF7", + "description": "Se (black note)" + }, + "noteSeHalf": { + "codepoint": "U+EEEE", + "description": "Se (half note)" + }, + "noteSeWhole": { + "codepoint": "U+EEE5", + "description": "Se (whole note)" + }, + "noteShapeArrowheadLeftBlack": { + "codepoint": "U+E1C9", + "description": "Arrowhead left black (Funk 7-shape re)" + }, + "noteShapeArrowheadLeftDoubleWhole": { + "codepoint": "U+ECDC", + "description": "Arrowhead left double whole (Funk 7-shape re)" + }, + "noteShapeArrowheadLeftWhite": { + "codepoint": "U+E1C8", + "description": "Arrowhead left white (Funk 7-shape re)" + }, + "noteShapeDiamondBlack": { + "codepoint": "U+E1B9", + "description": "Diamond black (4-shape mi; 7-shape mi)" + }, + "noteShapeDiamondDoubleWhole": { + "codepoint": "U+ECD4", + "description": "Diamond double whole (4-shape mi; 7-shape mi)" + }, + "noteShapeDiamondWhite": { + "codepoint": "U+E1B8", + "description": "Diamond white (4-shape mi; 7-shape mi)" + }, + "noteShapeIsoscelesTriangleBlack": { + "codepoint": "U+E1C5", + "description": "Isosceles triangle black (Walker 7-shape ti)" + }, + "noteShapeIsoscelesTriangleDoubleWhole": { + "codepoint": "U+ECDA", + "description": "Isosceles triangle double whole (Walker 7-shape ti)" + }, + "noteShapeIsoscelesTriangleWhite": { + "codepoint": "U+E1C4", + "description": "Isosceles triangle white (Walker 7-shape ti)" + }, + "noteShapeKeystoneBlack": { + "codepoint": "U+E1C1", + "description": "Inverted keystone black (Walker 7-shape do)" + }, + "noteShapeKeystoneDoubleWhole": { + "codepoint": "U+ECD8", + "description": "Inverted keystone double whole (Walker 7-shape do)" + }, + "noteShapeKeystoneWhite": { + "codepoint": "U+E1C0", + "description": "Inverted keystone white (Walker 7-shape do)" + }, + "noteShapeMoonBlack": { + "codepoint": "U+E1BD", + "description": "Moon black (Aikin 7-shape re)" + }, + "noteShapeMoonDoubleWhole": { + "codepoint": "U+ECD6", + "description": "Moon double whole (Aikin 7-shape re)" + }, + "noteShapeMoonLeftBlack": { + "codepoint": "U+E1C7", + "description": "Moon left black (Funk 7-shape do)" + }, + "noteShapeMoonLeftDoubleWhole": { + "codepoint": "U+ECDB", + "description": "Moon left double whole (Funk 7-shape do)" + }, + "noteShapeMoonLeftWhite": { + "codepoint": "U+E1C6", + "description": "Moon left white (Funk 7-shape do)" + }, + "noteShapeMoonWhite": { + "codepoint": "U+E1BC", + "description": "Moon white (Aikin 7-shape re)" + }, + "noteShapeQuarterMoonBlack": { + "codepoint": "U+E1C3", + "description": "Quarter moon black (Walker 7-shape re)" + }, + "noteShapeQuarterMoonDoubleWhole": { + "codepoint": "U+ECD9", + "description": "Quarter moon double whole (Walker 7-shape re)" + }, + "noteShapeQuarterMoonWhite": { + "codepoint": "U+E1C2", + "description": "Quarter moon white (Walker 7-shape re)" + }, + "noteShapeRoundBlack": { + "codepoint": "U+E1B1", + "description": "Round black (4-shape sol; 7-shape so)" + }, + "noteShapeRoundDoubleWhole": { + "codepoint": "U+ECD0", + "description": "Round double whole (4-shape sol; 7-shape so)" + }, + "noteShapeRoundWhite": { + "codepoint": "U+E1B0", + "description": "Round white (4-shape sol; 7-shape so)" + }, + "noteShapeSquareBlack": { + "codepoint": "U+E1B3", + "description": "Square black (4-shape la; Aikin 7-shape la)" + }, + "noteShapeSquareDoubleWhole": { + "codepoint": "U+ECD1", + "description": "Square double whole (4-shape la; Aikin 7-shape la)" + }, + "noteShapeSquareWhite": { + "codepoint": "U+E1B2", + "description": "Square white (4-shape la; Aikin 7-shape la)" + }, + "noteShapeTriangleLeftBlack": { + "codepoint": "U+E1B7", + "description": "Triangle left black (stem up; 4-shape fa; 7-shape fa)" + }, + "noteShapeTriangleLeftDoubleWhole": { + "codepoint": "U+ECD3", + "description": "Triangle left double whole (stem up; 4-shape fa; 7-shape fa)" + }, + "noteShapeTriangleLeftWhite": { + "codepoint": "U+E1B6", + "description": "Triangle left white (stem up; 4-shape fa; 7-shape fa)" + }, + "noteShapeTriangleRightBlack": { + "codepoint": "U+E1B5", + "description": "Triangle right black (stem down; 4-shape fa; 7-shape fa)" + }, + "noteShapeTriangleRightDoubleWhole": { + "codepoint": "U+ECD2", + "description": "Triangle right double whole (stem down; 4-shape fa; 7-shape fa)" + }, + "noteShapeTriangleRightWhite": { + "codepoint": "U+E1B4", + "description": "Triangle right white (stem down; 4-shape fa; 7-shape fa)" + }, + "noteShapeTriangleRoundBlack": { + "codepoint": "U+E1BF", + "description": "Triangle-round black (Aikin 7-shape ti)" + }, + "noteShapeTriangleRoundDoubleWhole": { + "codepoint": "U+ECD7", + "description": "Triangle-round white (Aikin 7-shape ti)" + }, + "noteShapeTriangleRoundLeftBlack": { + "codepoint": "U+E1CB", + "description": "Triangle-round left black (Funk 7-shape ti)" + }, + "noteShapeTriangleRoundLeftDoubleWhole": { + "codepoint": "U+ECDD", + "description": "Triangle-round left double whole (Funk 7-shape ti)" + }, + "noteShapeTriangleRoundLeftWhite": { + "codepoint": "U+E1CA", + "description": "Triangle-round left white (Funk 7-shape ti)" + }, + "noteShapeTriangleRoundWhite": { + "codepoint": "U+E1BE", + "description": "Triangle-round white (Aikin 7-shape ti)" + }, + "noteShapeTriangleUpBlack": { + "codepoint": "U+E1BB", + "description": "Triangle up black (Aikin 7-shape do)" + }, + "noteShapeTriangleUpDoubleWhole": { + "codepoint": "U+ECD5", + "description": "Triangle up double whole (Aikin 7-shape do)" + }, + "noteShapeTriangleUpWhite": { + "codepoint": "U+E1BA", + "description": "Triangle up white (Aikin 7-shape do)" + }, + "noteSiBlack": { + "codepoint": "U+E167", + "description": "Si (black note)" + }, + "noteSiHalf": { + "codepoint": "U+E15F", + "description": "Si (half note)" + }, + "noteSiWhole": { + "codepoint": "U+E157", + "description": "Si (whole note)" + }, + "noteSoBlack": { + "codepoint": "U+E164", + "description": "So (black note)" + }, + "noteSoHalf": { + "codepoint": "U+E15C", + "description": "So (half note)" + }, + "noteSoWhole": { + "codepoint": "U+E154", + "description": "So (whole note)" + }, + "noteTeBlack": { + "codepoint": "U+EEFA", + "description": "Te (black note)" + }, + "noteTeHalf": { + "codepoint": "U+EEF1", + "description": "Te (half note)" + }, + "noteTeWhole": { + "codepoint": "U+EEE8", + "description": "Te (whole note)" + }, + "noteTiBlack": { + "codepoint": "U+E166", + "description": "Ti (black note)" + }, + "noteTiHalf": { + "codepoint": "U+E15E", + "description": "Ti (half note)" + }, + "noteTiWhole": { + "codepoint": "U+E156", + "description": "Ti (whole note)" + }, + "noteWhole": { + "alternateCodepoint": "U+1D15D", + "codepoint": "U+E1D2", + "description": "Whole note (semibreve)" + }, + "noteheadBlack": { + "alternateCodepoint": "U+1D158", + "codepoint": "U+E0A4", + "description": "Black notehead" + }, + "noteheadCircleSlash": { + "codepoint": "U+E0F7", + "description": "Circle slash notehead" + }, + "noteheadCircleX": { + "alternateCodepoint": "U+1D145", + "codepoint": "U+E0B3", + "description": "Circle X notehead" + }, + "noteheadCircleXDoubleWhole": { + "codepoint": "U+E0B0", + "description": "Circle X double whole" + }, + "noteheadCircleXHalf": { + "codepoint": "U+E0B2", + "description": "Circle X half" + }, + "noteheadCircleXWhole": { + "codepoint": "U+E0B1", + "description": "Circle X whole" + }, + "noteheadCircledBlack": { + "codepoint": "U+E0E4", + "description": "Circled black notehead" + }, + "noteheadCircledBlackLarge": { + "codepoint": "U+E0E8", + "description": "Black notehead in large circle" + }, + "noteheadCircledDoubleWhole": { + "codepoint": "U+E0E7", + "description": "Circled double whole notehead" + }, + "noteheadCircledDoubleWholeLarge": { + "codepoint": "U+E0EB", + "description": "Double whole notehead in large circle" + }, + "noteheadCircledHalf": { + "codepoint": "U+E0E5", + "description": "Circled half notehead" + }, + "noteheadCircledHalfLarge": { + "codepoint": "U+E0E9", + "description": "Half notehead in large circle" + }, + "noteheadCircledWhole": { + "codepoint": "U+E0E6", + "description": "Circled whole notehead" + }, + "noteheadCircledWholeLarge": { + "codepoint": "U+E0EA", + "description": "Whole notehead in large circle" + }, + "noteheadCircledXLarge": { + "codepoint": "U+E0EC", + "description": "Cross notehead in large circle" + }, + "noteheadClusterDoubleWhole2nd": { + "codepoint": "U+E124", + "description": "Double whole note cluster, 2nd" + }, + "noteheadClusterDoubleWhole3rd": { + "codepoint": "U+E128", + "description": "Double whole note cluster, 3rd" + }, + "noteheadClusterDoubleWholeBottom": { + "codepoint": "U+E12E", + "description": "Combining double whole note cluster, bottom" + }, + "noteheadClusterDoubleWholeMiddle": { + "codepoint": "U+E12D", + "description": "Combining double whole note cluster, middle" + }, + "noteheadClusterDoubleWholeTop": { + "codepoint": "U+E12C", + "description": "Combining double whole note cluster, top" + }, + "noteheadClusterHalf2nd": { + "codepoint": "U+E126", + "description": "Half note cluster, 2nd" + }, + "noteheadClusterHalf3rd": { + "codepoint": "U+E12A", + "description": "Half note cluster, 3rd" + }, + "noteheadClusterHalfBottom": { + "codepoint": "U+E134", + "description": "Combining half note cluster, bottom" + }, + "noteheadClusterHalfMiddle": { + "codepoint": "U+E133", + "description": "Combining half note cluster, middle" + }, + "noteheadClusterHalfTop": { + "codepoint": "U+E132", + "description": "Combining half note cluster, top" + }, + "noteheadClusterQuarter2nd": { + "codepoint": "U+E127", + "description": "Quarter note cluster, 2nd" + }, + "noteheadClusterQuarter3rd": { + "codepoint": "U+E12B", + "description": "Quarter note cluster, 3rd" + }, + "noteheadClusterQuarterBottom": { + "codepoint": "U+E137", + "description": "Combining quarter note cluster, bottom" + }, + "noteheadClusterQuarterMiddle": { + "codepoint": "U+E136", + "description": "Combining quarter note cluster, middle" + }, + "noteheadClusterQuarterTop": { + "codepoint": "U+E135", + "description": "Combining quarter note cluster, top" + }, + "noteheadClusterRoundBlack": { + "codepoint": "U+E123", + "description": "Cluster notehead black (round)" + }, + "noteheadClusterRoundWhite": { + "codepoint": "U+E122", + "description": "Cluster notehead white (round)" + }, + "noteheadClusterSquareBlack": { + "alternateCodepoint": "U+1D15B", + "codepoint": "U+E121", + "description": "Cluster notehead black (square)" + }, + "noteheadClusterSquareWhite": { + "alternateCodepoint": "U+1D15A", + "codepoint": "U+E120", + "description": "Cluster notehead white (square)" + }, + "noteheadClusterWhole2nd": { + "codepoint": "U+E125", + "description": "Whole note cluster, 2nd" + }, + "noteheadClusterWhole3rd": { + "codepoint": "U+E129", + "description": "Whole note cluster, 3rd" + }, + "noteheadClusterWholeBottom": { + "codepoint": "U+E131", + "description": "Combining whole note cluster, bottom" + }, + "noteheadClusterWholeMiddle": { + "codepoint": "U+E130", + "description": "Combining whole note cluster, middle" + }, + "noteheadClusterWholeTop": { + "codepoint": "U+E12F", + "description": "Combining whole note cluster, top" + }, + "noteheadCowellEleventhNoteSeriesHalf": { + "codepoint": "U+EEAE", + "description": "4/11 note (eleventh note series, Cowell)" + }, + "noteheadCowellEleventhNoteSeriesWhole": { + "codepoint": "U+EEAD", + "description": "8/11 note (eleventh note series, Cowell)" + }, + "noteheadCowellEleventhSeriesBlack": { + "codepoint": "U+EEAF", + "description": "2/11 note (eleventh note series, Cowell)" + }, + "noteheadCowellFifteenthNoteSeriesBlack": { + "codepoint": "U+EEB5", + "description": "2/15 note (fifteenth note series, Cowell)" + }, + "noteheadCowellFifteenthNoteSeriesHalf": { + "codepoint": "U+EEB4", + "description": "4/15 note (fifteenth note series, Cowell)" + }, + "noteheadCowellFifteenthNoteSeriesWhole": { + "codepoint": "U+EEB3", + "description": "8/15 note (fifteenth note series, Cowell)" + }, + "noteheadCowellFifthNoteSeriesBlack": { + "codepoint": "U+EEA6", + "description": "1/5 note (fifth note series, Cowell)" + }, + "noteheadCowellFifthNoteSeriesHalf": { + "codepoint": "U+EEA5", + "description": "2/5 note (fifth note series, Cowell)" + }, + "noteheadCowellFifthNoteSeriesWhole": { + "codepoint": "U+EEA4", + "description": "4/5 note (fifth note series, Cowell)" + }, + "noteheadCowellNinthNoteSeriesBlack": { + "codepoint": "U+EEAC", + "description": "2/9 note (ninth note series, Cowell)" + }, + "noteheadCowellNinthNoteSeriesHalf": { + "codepoint": "U+EEAB", + "description": "4/9 note (ninth note series, Cowell)" + }, + "noteheadCowellNinthNoteSeriesWhole": { + "codepoint": "U+EEAA", + "description": "8/9 note (ninth note series, Cowell)" + }, + "noteheadCowellSeventhNoteSeriesBlack": { + "codepoint": "U+EEA9", + "description": "1/7 note (seventh note series, Cowell)" + }, + "noteheadCowellSeventhNoteSeriesHalf": { + "codepoint": "U+EEA8", + "description": "2/7 note (seventh note series, Cowell)" + }, + "noteheadCowellSeventhNoteSeriesWhole": { + "codepoint": "U+EEA7", + "description": "4/7 note (seventh note series, Cowell)" + }, + "noteheadCowellThirdNoteSeriesBlack": { + "codepoint": "U+EEA3", + "description": "1/6 note (third note series, Cowell)" + }, + "noteheadCowellThirdNoteSeriesHalf": { + "codepoint": "U+EEA2", + "description": "1/3 note (third note series, Cowell)" + }, + "noteheadCowellThirdNoteSeriesWhole": { + "codepoint": "U+EEA1", + "description": "2/3 note (third note series, Cowell)" + }, + "noteheadCowellThirteenthNoteSeriesBlack": { + "codepoint": "U+EEB2", + "description": "2/13 note (thirteenth note series, Cowell)" + }, + "noteheadCowellThirteenthNoteSeriesHalf": { + "codepoint": "U+EEB1", + "description": "4/13 note (thirteenth note series, Cowell)" + }, + "noteheadCowellThirteenthNoteSeriesWhole": { + "codepoint": "U+EEB0", + "description": "8/13 note (thirteenth note series, Cowell)" + }, + "noteheadDiamondBlack": { + "codepoint": "U+E0DB", + "description": "Diamond black notehead" + }, + "noteheadDiamondBlackOld": { + "codepoint": "U+E0E2", + "description": "Diamond black notehead (old)" + }, + "noteheadDiamondBlackWide": { + "codepoint": "U+E0DC", + "description": "Diamond black notehead (wide)" + }, + "noteheadDiamondClusterBlack2nd": { + "codepoint": "U+E139", + "description": "Black diamond cluster, 2nd" + }, + "noteheadDiamondClusterBlack3rd": { + "codepoint": "U+E13B", + "description": "Black diamond cluster, 3rd" + }, + "noteheadDiamondClusterBlackBottom": { + "codepoint": "U+E141", + "description": "Combining black diamond cluster, bottom" + }, + "noteheadDiamondClusterBlackMiddle": { + "codepoint": "U+E140", + "description": "Combining black diamond cluster, middle" + }, + "noteheadDiamondClusterBlackTop": { + "codepoint": "U+E13F", + "description": "Combining black diamond cluster, top" + }, + "noteheadDiamondClusterWhite2nd": { + "codepoint": "U+E138", + "description": "White diamond cluster, 2nd" + }, + "noteheadDiamondClusterWhite3rd": { + "codepoint": "U+E13A", + "description": "White diamond cluster, 3rd" + }, + "noteheadDiamondClusterWhiteBottom": { + "codepoint": "U+E13E", + "description": "Combining white diamond cluster, bottom" + }, + "noteheadDiamondClusterWhiteMiddle": { + "codepoint": "U+E13D", + "description": "Combining white diamond cluster, middle" + }, + "noteheadDiamondClusterWhiteTop": { + "codepoint": "U+E13C", + "description": "Combining white diamond cluster, top" + }, + "noteheadDiamondDoubleWhole": { + "codepoint": "U+E0D7", + "description": "Diamond double whole notehead" + }, + "noteheadDiamondDoubleWholeOld": { + "codepoint": "U+E0DF", + "description": "Diamond double whole notehead (old)" + }, + "noteheadDiamondHalf": { + "codepoint": "U+E0D9", + "description": "Diamond half notehead" + }, + "noteheadDiamondHalfFilled": { + "codepoint": "U+E0E3", + "description": "Half-filled diamond notehead" + }, + "noteheadDiamondHalfOld": { + "codepoint": "U+E0E1", + "description": "Diamond half notehead (old)" + }, + "noteheadDiamondHalfWide": { + "codepoint": "U+E0DA", + "description": "Diamond half notehead (wide)" + }, + "noteheadDiamondOpen": { + "codepoint": "U+E0FC", + "description": "Open diamond notehead" + }, + "noteheadDiamondWhite": { + "codepoint": "U+E0DD", + "description": "Diamond white notehead" + }, + "noteheadDiamondWhiteWide": { + "codepoint": "U+E0DE", + "description": "Diamond white notehead (wide)" + }, + "noteheadDiamondWhole": { + "codepoint": "U+E0D8", + "description": "Diamond whole notehead" + }, + "noteheadDiamondWholeOld": { + "codepoint": "U+E0E0", + "description": "Diamond whole notehead (old)" + }, + "noteheadDoubleWhole": { + "codepoint": "U+E0A0", + "description": "Double whole (breve) notehead" + }, + "noteheadDoubleWholeSquare": { + "codepoint": "U+E0A1", + "description": "Double whole (breve) notehead (square)" + }, + "noteheadDoubleWholeWithX": { + "codepoint": "U+E0B4", + "description": "Double whole notehead with X" + }, + "noteheadHalf": { + "alternateCodepoint": "U+1D157", + "codepoint": "U+E0A3", + "description": "Half (minim) notehead" + }, + "noteheadHalfFilled": { + "codepoint": "U+E0FB", + "description": "Filled half (minim) notehead" + }, + "noteheadHalfWithX": { + "codepoint": "U+E0B6", + "description": "Half notehead with X" + }, + "noteheadHeavyX": { + "codepoint": "U+E0F8", + "description": "Heavy X notehead" + }, + "noteheadHeavyXHat": { + "codepoint": "U+E0F9", + "description": "Heavy X with hat notehead" + }, + "noteheadLargeArrowDownBlack": { + "codepoint": "U+E0F4", + "description": "Large arrow down (lowest pitch) black notehead" + }, + "noteheadLargeArrowDownDoubleWhole": { + "codepoint": "U+E0F1", + "description": "Large arrow down (lowest pitch) double whole notehead" + }, + "noteheadLargeArrowDownHalf": { + "codepoint": "U+E0F3", + "description": "Large arrow down (lowest pitch) half notehead" + }, + "noteheadLargeArrowDownWhole": { + "codepoint": "U+E0F2", + "description": "Large arrow down (lowest pitch) whole notehead" + }, + "noteheadLargeArrowUpBlack": { + "codepoint": "U+E0F0", + "description": "Large arrow up (highest pitch) black notehead" + }, + "noteheadLargeArrowUpDoubleWhole": { + "codepoint": "U+E0ED", + "description": "Large arrow up (highest pitch) double whole notehead" + }, + "noteheadLargeArrowUpHalf": { + "codepoint": "U+E0EF", + "description": "Large arrow up (highest pitch) half notehead" + }, + "noteheadLargeArrowUpWhole": { + "codepoint": "U+E0EE", + "description": "Large arrow up (highest pitch) whole notehead" + }, + "noteheadMoonBlack": { + "alternateCodepoint": "U+1D153", + "codepoint": "U+E0CB", + "description": "Moon notehead black" + }, + "noteheadMoonWhite": { + "alternateCodepoint": "U+1D152", + "codepoint": "U+E0CA", + "description": "Moon notehead white" + }, + "noteheadNancarrowSine": { + "codepoint": "U+EEA0", + "description": "Sine notehead (Nancarrow)" + }, + "noteheadNull": { + "alternateCodepoint": "U+1D159", + "codepoint": "U+E0A5", + "description": "Null notehead" + }, + "noteheadParenthesis": { + "alternateCodepoint": "U+1D156", + "codepoint": "U+E0CE", + "description": "Parenthesis notehead" + }, + "noteheadParenthesisLeft": { + "codepoint": "U+E0F5", + "description": "Opening parenthesis" + }, + "noteheadParenthesisRight": { + "codepoint": "U+E0F6", + "description": "Closing parenthesis" + }, + "noteheadPlusBlack": { + "alternateCodepoint": "U+1D144", + "codepoint": "U+E0AF", + "description": "Plus notehead black" + }, + "noteheadPlusDoubleWhole": { + "codepoint": "U+E0AC", + "description": "Plus notehead double whole" + }, + "noteheadPlusHalf": { + "codepoint": "U+E0AE", + "description": "Plus notehead half" + }, + "noteheadPlusWhole": { + "codepoint": "U+E0AD", + "description": "Plus notehead whole" + }, + "noteheadRectangularClusterBlackBottom": { + "codepoint": "U+E144", + "description": "Combining black rectangular cluster, bottom" + }, + "noteheadRectangularClusterBlackMiddle": { + "codepoint": "U+E143", + "description": "Combining black rectangular cluster, middle" + }, + "noteheadRectangularClusterBlackTop": { + "codepoint": "U+E142", + "description": "Combining black rectangular cluster, top" + }, + "noteheadRectangularClusterWhiteBottom": { + "codepoint": "U+E147", + "description": "Combining white rectangular cluster, bottom" + }, + "noteheadRectangularClusterWhiteMiddle": { + "codepoint": "U+E146", + "description": "Combining white rectangular cluster, middle" + }, + "noteheadRectangularClusterWhiteTop": { + "codepoint": "U+E145", + "description": "Combining white rectangular cluster, top" + }, + "noteheadRoundBlack": { + "codepoint": "U+E113", + "description": "Round black notehead" + }, + "noteheadRoundBlackDoubleSlashed": { + "codepoint": "U+E11C", + "description": "Round black notehead, double slashed" + }, + "noteheadRoundBlackLarge": { + "codepoint": "U+E110", + "description": "Large round black notehead" + }, + "noteheadRoundBlackSlashed": { + "codepoint": "U+E118", + "description": "Round black notehead, slashed" + }, + "noteheadRoundBlackSlashedLarge": { + "codepoint": "U+E116", + "description": "Large round black notehead, slashed" + }, + "noteheadRoundWhite": { + "codepoint": "U+E114", + "description": "Round white notehead" + }, + "noteheadRoundWhiteDoubleSlashed": { + "codepoint": "U+E11D", + "description": "Round white notehead, double slashed" + }, + "noteheadRoundWhiteLarge": { + "codepoint": "U+E111", + "description": "Large round white notehead" + }, + "noteheadRoundWhiteSlashed": { + "codepoint": "U+E119", + "description": "Round white notehead, slashed" + }, + "noteheadRoundWhiteSlashedLarge": { + "codepoint": "U+E117", + "description": "Large round white notehead, slashed" + }, + "noteheadRoundWhiteWithDot": { + "codepoint": "U+E115", + "description": "Round white notehead with dot" + }, + "noteheadRoundWhiteWithDotLarge": { + "codepoint": "U+E112", + "description": "Large round white notehead with dot" + }, + "noteheadSlashDiamondWhite": { + "codepoint": "U+E104", + "description": "Large white diamond" + }, + "noteheadSlashHorizontalEnds": { + "alternateCodepoint": "U+1D10D", + "codepoint": "U+E101", + "description": "Slash with horizontal ends" + }, + "noteheadSlashHorizontalEndsMuted": { + "codepoint": "U+E108", + "description": "Muted slash with horizontal ends" + }, + "noteheadSlashVerticalEnds": { + "codepoint": "U+E100", + "description": "Slash with vertical ends" + }, + "noteheadSlashVerticalEndsMuted": { + "codepoint": "U+E107", + "description": "Muted slash with vertical ends" + }, + "noteheadSlashVerticalEndsSmall": { + "codepoint": "U+E105", + "description": "Small slash with vertical ends" + }, + "noteheadSlashWhiteDoubleWhole": { + "codepoint": "U+E10A", + "description": "White slash double whole" + }, + "noteheadSlashWhiteHalf": { + "codepoint": "U+E103", + "description": "White slash half" + }, + "noteheadSlashWhiteMuted": { + "codepoint": "U+E109", + "description": "Muted white slash" + }, + "noteheadSlashWhiteWhole": { + "codepoint": "U+E102", + "description": "White slash whole" + }, + "noteheadSlashX": { + "codepoint": "U+E106", + "description": "Large X notehead" + }, + "noteheadSlashedBlack1": { + "codepoint": "U+E0CF", + "description": "Slashed black notehead (bottom left to top right)" + }, + "noteheadSlashedBlack2": { + "codepoint": "U+E0D0", + "description": "Slashed black notehead (top left to bottom right)" + }, + "noteheadSlashedDoubleWhole1": { + "codepoint": "U+E0D5", + "description": "Slashed double whole notehead (bottom left to top right)" + }, + "noteheadSlashedDoubleWhole2": { + "codepoint": "U+E0D6", + "description": "Slashed double whole notehead (top left to bottom right)" + }, + "noteheadSlashedHalf1": { + "codepoint": "U+E0D1", + "description": "Slashed half notehead (bottom left to top right)" + }, + "noteheadSlashedHalf2": { + "codepoint": "U+E0D2", + "description": "Slashed half notehead (top left to bottom right)" + }, + "noteheadSlashedWhole1": { + "codepoint": "U+E0D3", + "description": "Slashed whole notehead (bottom left to top right)" + }, + "noteheadSlashedWhole2": { + "codepoint": "U+E0D4", + "description": "Slashed whole notehead (top left to bottom right)" + }, + "noteheadSquareBlack": { + "alternateCodepoint": "U+1D147", + "codepoint": "U+E0B9", + "description": "Square notehead black" + }, + "noteheadSquareBlackLarge": { + "codepoint": "U+E11A", + "description": "Large square black notehead" + }, + "noteheadSquareBlackWhite": { + "codepoint": "U+E11B", + "description": "Large square white notehead" + }, + "noteheadSquareWhite": { + "alternateCodepoint": "U+1D146", + "codepoint": "U+E0B8", + "description": "Square notehead white" + }, + "noteheadTriangleDownBlack": { + "alternateCodepoint": "U+1D14F", + "codepoint": "U+E0C7", + "description": "Triangle notehead down black" + }, + "noteheadTriangleDownDoubleWhole": { + "codepoint": "U+E0C3", + "description": "Triangle notehead down double whole" + }, + "noteheadTriangleDownHalf": { + "codepoint": "U+E0C5", + "description": "Triangle notehead down half" + }, + "noteheadTriangleDownWhite": { + "alternateCodepoint": "U+1D14E", + "codepoint": "U+E0C6", + "description": "Triangle notehead down white" + }, + "noteheadTriangleDownWhole": { + "codepoint": "U+E0C4", + "description": "Triangle notehead down whole" + }, + "noteheadTriangleLeftBlack": { + "alternateCodepoint": "U+1D14B", + "codepoint": "U+E0C0", + "description": "Triangle notehead left black" + }, + "noteheadTriangleLeftWhite": { + "alternateCodepoint": "U+1D14A", + "codepoint": "U+E0BF", + "description": "Triangle notehead left white" + }, + "noteheadTriangleRightBlack": { + "alternateCodepoint": "U+1D14D", + "codepoint": "U+E0C2", + "description": "Triangle notehead right black" + }, + "noteheadTriangleRightWhite": { + "alternateCodepoint": "U+1D14C", + "codepoint": "U+E0C1", + "description": "Triangle notehead right white" + }, + "noteheadTriangleRoundDownBlack": { + "alternateCodepoint": "U+1D155", + "codepoint": "U+E0CD", + "description": "Triangle-round notehead down black" + }, + "noteheadTriangleRoundDownWhite": { + "alternateCodepoint": "U+1D154", + "codepoint": "U+E0CC", + "description": "Triangle-round notehead down white" + }, + "noteheadTriangleUpBlack": { + "alternateCodepoint": "U+1D149", + "codepoint": "U+E0BE", + "description": "Triangle notehead up black" + }, + "noteheadTriangleUpDoubleWhole": { + "codepoint": "U+E0BA", + "description": "Triangle notehead up double whole" + }, + "noteheadTriangleUpHalf": { + "codepoint": "U+E0BC", + "description": "Triangle notehead up half" + }, + "noteheadTriangleUpRightBlack": { + "alternateCodepoint": "U+1D151", + "codepoint": "U+E0C9", + "description": "Triangle notehead up right black" + }, + "noteheadTriangleUpRightWhite": { + "alternateCodepoint": "U+1D150", + "codepoint": "U+E0C8", + "description": "Triangle notehead up right white" + }, + "noteheadTriangleUpWhite": { + "alternateCodepoint": "U+1D148", + "codepoint": "U+E0BD", + "description": "Triangle notehead up white" + }, + "noteheadTriangleUpWhole": { + "codepoint": "U+E0BB", + "description": "Triangle notehead up whole" + }, + "noteheadVoidWithX": { + "codepoint": "U+E0B7", + "description": "Void notehead with X" + }, + "noteheadWhole": { + "codepoint": "U+E0A2", + "description": "Whole (semibreve) notehead" + }, + "noteheadWholeFilled": { + "codepoint": "U+E0FA", + "description": "Filled whole (semibreve) notehead" + }, + "noteheadWholeWithX": { + "codepoint": "U+E0B5", + "description": "Whole notehead with X" + }, + "noteheadXBlack": { + "alternateCodepoint": "U+1D143", + "codepoint": "U+E0A9", + "description": "X notehead black" + }, + "noteheadXDoubleWhole": { + "codepoint": "U+E0A6", + "description": "X notehead double whole" + }, + "noteheadXHalf": { + "codepoint": "U+E0A8", + "description": "X notehead half" + }, + "noteheadXOrnate": { + "codepoint": "U+E0AA", + "description": "Ornate X notehead" + }, + "noteheadXOrnateEllipse": { + "codepoint": "U+E0AB", + "description": "Ornate X notehead in ellipse" + }, + "noteheadXWhole": { + "codepoint": "U+E0A7", + "description": "X notehead whole" + }, + "octaveBaselineA": { + "codepoint": "U+EC91", + "description": "a (baseline)" + }, + "octaveBaselineB": { + "codepoint": "U+EC93", + "description": "b (baseline)" + }, + "octaveBaselineM": { + "codepoint": "U+EC95", + "description": "m (baseline)" + }, + "octaveBaselineV": { + "codepoint": "U+EC97", + "description": "v (baseline)" + }, + "octaveBassa": { + "codepoint": "U+E51F", + "description": "Bassa" + }, + "octaveLoco": { + "codepoint": "U+EC90", + "description": "Loco" + }, + "octaveParensLeft": { + "codepoint": "U+E51A", + "description": "Left parenthesis for octave signs" + }, + "octaveParensRight": { + "codepoint": "U+E51B", + "description": "Right parenthesis for octave signs" + }, + "octaveSuperscriptA": { + "codepoint": "U+EC92", + "description": "a (superscript)" + }, + "octaveSuperscriptB": { + "codepoint": "U+EC94", + "description": "b (superscript)" + }, + "octaveSuperscriptM": { + "codepoint": "U+EC96", + "description": "m (superscript)" + }, + "octaveSuperscriptV": { + "codepoint": "U+EC98", + "description": "v (superscript)" + }, + "oneHandedRollStevens": { + "codepoint": "U+E233", + "description": "One-handed roll (Stevens)" + }, + "organGerman2Fusae": { + "codepoint": "U+EE2E", + "description": "Two Fusae" + }, + "organGerman2Minimae": { + "codepoint": "U+EE2C", + "description": "Two Minimae" + }, + "organGerman2OctaveUp": { + "codepoint": "U+EE19", + "description": "Combining double octave line above" + }, + "organGerman2Semifusae": { + "codepoint": "U+EE2F", + "description": "Two Semifusae" + }, + "organGerman2Semiminimae": { + "codepoint": "U+EE2D", + "description": "Two Semiminimae" + }, + "organGerman3Fusae": { + "codepoint": "U+EE32", + "description": "Three Fusae" + }, + "organGerman3Minimae": { + "codepoint": "U+EE30", + "description": "Three Minimae" + }, + "organGerman3Semifusae": { + "codepoint": "U+EE33", + "description": "Three Semifusae" + }, + "organGerman3Semiminimae": { + "codepoint": "U+EE31", + "description": "Three Semiminimae" + }, + "organGerman4Fusae": { + "codepoint": "U+EE36", + "description": "Four Fusae" + }, + "organGerman4Minimae": { + "codepoint": "U+EE34", + "description": "Four Minimae" + }, + "organGerman4Semifusae": { + "codepoint": "U+EE37", + "description": "Four Semifusae" + }, + "organGerman4Semiminimae": { + "codepoint": "U+EE35", + "description": "Four Semiminimae" + }, + "organGerman5Fusae": { + "codepoint": "U+EE3A", + "description": "Five Fusae" + }, + "organGerman5Minimae": { + "codepoint": "U+EE38", + "description": "Five Minimae" + }, + "organGerman5Semifusae": { + "codepoint": "U+EE3B", + "description": "Five Semifusae" + }, + "organGerman5Semiminimae": { + "codepoint": "U+EE39", + "description": "Five Semiminimae" + }, + "organGerman6Fusae": { + "codepoint": "U+EE3E", + "description": "Six Fusae" + }, + "organGerman6Minimae": { + "codepoint": "U+EE3C", + "description": "Six Minimae" + }, + "organGerman6Semifusae": { + "codepoint": "U+EE3F", + "description": "Six Semifusae" + }, + "organGerman6Semiminimae": { + "codepoint": "U+EE3D", + "description": "Six Semiminimae" + }, + "organGermanALower": { + "codepoint": "U+EE15", + "description": "German organ tablature small A" + }, + "organGermanAUpper": { + "codepoint": "U+EE09", + "description": "German organ tablature great A" + }, + "organGermanAugmentationDot": { + "codepoint": "U+EE1C", + "description": "Rhythm Dot" + }, + "organGermanBLower": { + "codepoint": "U+EE16", + "description": "German organ tablature small B" + }, + "organGermanBUpper": { + "codepoint": "U+EE0A", + "description": "German organ tablature great B" + }, + "organGermanBuxheimerBrevis2": { + "codepoint": "U+EE25", + "description": "Brevis (Binary) Buxheimer Orgelbuch" + }, + "organGermanBuxheimerBrevis3": { + "codepoint": "U+EE24", + "description": "Brevis (Ternary) Buxheimer Orgelbuch" + }, + "organGermanBuxheimerMinimaRest": { + "codepoint": "U+EE1E", + "description": "Minima Rest Buxheimer Orgelbuch" + }, + "organGermanBuxheimerSemibrevis": { + "codepoint": "U+EE26", + "description": "Semibrevis Buxheimer Orgelbuch" + }, + "organGermanBuxheimerSemibrevisRest": { + "codepoint": "U+EE1D", + "description": "Semibrevis Rest Buxheimer Orgelbuch" + }, + "organGermanCLower": { + "codepoint": "U+EE0C", + "description": "German organ tablature small C" + }, + "organGermanCUpper": { + "codepoint": "U+EE00", + "description": "German organ tablature great C" + }, + "organGermanCisLower": { + "codepoint": "U+EE0D", + "description": "German organ tablature small Cis" + }, + "organGermanCisUpper": { + "codepoint": "U+EE01", + "description": "German organ tablature great Cis" + }, + "organGermanDLower": { + "codepoint": "U+EE0E", + "description": "German organ tablature small D" + }, + "organGermanDUpper": { + "codepoint": "U+EE02", + "description": "German organ tablature great D" + }, + "organGermanDisLower": { + "codepoint": "U+EE0F", + "description": "German organ tablature small Dis" + }, + "organGermanDisUpper": { + "codepoint": "U+EE03", + "description": "German organ tablature great Dis" + }, + "organGermanELower": { + "codepoint": "U+EE10", + "description": "German organ tablature small E" + }, + "organGermanEUpper": { + "codepoint": "U+EE04", + "description": "German organ tablature great E" + }, + "organGermanFLower": { + "codepoint": "U+EE11", + "description": "German organ tablature small F" + }, + "organGermanFUpper": { + "codepoint": "U+EE05", + "description": "German organ tablature great F" + }, + "organGermanFisLower": { + "codepoint": "U+EE12", + "description": "German organ tablature small Fis" + }, + "organGermanFisUpper": { + "codepoint": "U+EE06", + "description": "German organ tablature great Fis" + }, + "organGermanFusa": { + "codepoint": "U+EE2A", + "description": "Fusa" + }, + "organGermanFusaRest": { + "codepoint": "U+EE22", + "description": "Fusa Rest" + }, + "organGermanGLower": { + "codepoint": "U+EE13", + "description": "German organ tablature small G" + }, + "organGermanGUpper": { + "codepoint": "U+EE07", + "description": "German organ tablature great G" + }, + "organGermanGisLower": { + "codepoint": "U+EE14", + "description": "German organ tablature small Gis" + }, + "organGermanGisUpper": { + "codepoint": "U+EE08", + "description": "German organ tablature great Gis" + }, + "organGermanHLower": { + "codepoint": "U+EE17", + "description": "German organ tablature small H" + }, + "organGermanHUpper": { + "codepoint": "U+EE0B", + "description": "German organ tablature great H" + }, + "organGermanMinima": { + "codepoint": "U+EE28", + "description": "Minima" + }, + "organGermanMinimaRest": { + "codepoint": "U+EE20", + "description": "Minima Rest" + }, + "organGermanOctaveDown": { + "codepoint": "U+EE1A", + "description": "Combining single octave line below" + }, + "organGermanOctaveUp": { + "codepoint": "U+EE18", + "description": "Combining single octave line above" + }, + "organGermanSemibrevis": { + "codepoint": "U+EE27", + "description": "Semibrevis" + }, + "organGermanSemibrevisRest": { + "codepoint": "U+EE1F", + "description": "Semibrevis Rest" + }, + "organGermanSemifusa": { + "codepoint": "U+EE2B", + "description": "Semifusa" + }, + "organGermanSemifusaRest": { + "codepoint": "U+EE23", + "description": "Semifusa Rest" + }, + "organGermanSemiminima": { + "codepoint": "U+EE29", + "description": "Semiminima" + }, + "organGermanSemiminimaRest": { + "codepoint": "U+EE21", + "description": "Semiminima Rest" + }, + "organGermanTie": { + "codepoint": "U+EE1B", + "description": "Tie" + }, + "ornamentBottomLeftConcaveStroke": { + "codepoint": "U+E59A", + "description": "Ornament bottom left concave stroke" + }, + "ornamentBottomLeftConcaveStrokeLarge": { + "alternateCodepoint": "U+1D1A1", + "codepoint": "U+E59B", + "description": "Ornament bottom left concave stroke, large" + }, + "ornamentBottomLeftConvexStroke": { + "codepoint": "U+E59C", + "description": "Ornament bottom left convex stroke" + }, + "ornamentBottomRightConcaveStroke": { + "alternateCodepoint": "U+1D19F", + "codepoint": "U+E5A7", + "description": "Ornament bottom right concave stroke" + }, + "ornamentBottomRightConvexStroke": { + "codepoint": "U+E5A8", + "description": "Ornament bottom right convex stroke" + }, + "ornamentComma": { + "codepoint": "U+E581", + "description": "Comma" + }, + "ornamentDoubleObliqueLinesAfterNote": { + "codepoint": "U+E57E", + "description": "Double oblique straight lines NW-SE" + }, + "ornamentDoubleObliqueLinesBeforeNote": { + "codepoint": "U+E57D", + "description": "Double oblique straight lines SW-NE" + }, + "ornamentDownCurve": { + "codepoint": "U+E578", + "description": "Curve below" + }, + "ornamentHaydn": { + "codepoint": "U+E56F", + "description": "Haydn ornament" + }, + "ornamentHighLeftConcaveStroke": { + "codepoint": "U+E592", + "description": "Ornament high left concave stroke" + }, + "ornamentHighLeftConvexStroke": { + "alternateCodepoint": "U+1D1A2", + "codepoint": "U+E593", + "description": "Ornament high left convex stroke" + }, + "ornamentHighRightConcaveStroke": { + "codepoint": "U+E5A2", + "description": "Ornament high right concave stroke" + }, + "ornamentHighRightConvexStroke": { + "codepoint": "U+E5A3", + "description": "Ornament high right convex stroke" + }, + "ornamentHookAfterNote": { + "codepoint": "U+E576", + "description": "Hook after note" + }, + "ornamentHookBeforeNote": { + "codepoint": "U+E575", + "description": "Hook before note" + }, + "ornamentLeftFacingHalfCircle": { + "codepoint": "U+E572", + "description": "Left-facing half circle" + }, + "ornamentLeftFacingHook": { + "codepoint": "U+E574", + "description": "Left-facing hook" + }, + "ornamentLeftPlus": { + "codepoint": "U+E597", + "description": "Ornament left +" + }, + "ornamentLeftShakeT": { + "codepoint": "U+E596", + "description": "Ornament left shake t" + }, + "ornamentLeftVerticalStroke": { + "alternateCodepoint": "U+1D19B", + "codepoint": "U+E594", + "description": "Ornament left vertical stroke" + }, + "ornamentLeftVerticalStrokeWithCross": { + "codepoint": "U+E595", + "description": "Ornament left vertical stroke with cross (+)" + }, + "ornamentLowLeftConcaveStroke": { + "codepoint": "U+E598", + "description": "Ornament low left concave stroke" + }, + "ornamentLowLeftConvexStroke": { + "alternateCodepoint": "U+1D1A4", + "codepoint": "U+E599", + "description": "Ornament low left convex stroke" + }, + "ornamentLowRightConcaveStroke": { + "alternateCodepoint": "U+1D1A3", + "codepoint": "U+E5A5", + "description": "Ornament low right concave stroke" + }, + "ornamentLowRightConvexStroke": { + "codepoint": "U+E5A6", + "description": "Ornament low right convex stroke" + }, + "ornamentMiddleVerticalStroke": { + "alternateCodepoint": "U+1D1A0", + "codepoint": "U+E59F", + "description": "Ornament middle vertical stroke" + }, + "ornamentMordent": { + "codepoint": "U+E56D", + "description": "Mordent" + }, + "ornamentObliqueLineAfterNote": { + "codepoint": "U+E57C", + "description": "Oblique straight line NW-SE" + }, + "ornamentObliqueLineBeforeNote": { + "codepoint": "U+E57B", + "description": "Oblique straight line SW-NE" + }, + "ornamentObliqueLineHorizAfterNote": { + "codepoint": "U+E580", + "description": "Oblique straight line tilted NW-SE" + }, + "ornamentObliqueLineHorizBeforeNote": { + "codepoint": "U+E57F", + "description": "Oblique straight line tilted SW-NE" + }, + "ornamentOriscus": { + "codepoint": "U+EA21", + "description": "Oriscus" + }, + "ornamentPinceCouperin": { + "codepoint": "U+E588", + "description": "Pinc\u00e9 (Couperin)" + }, + "ornamentPortDeVoixV": { + "codepoint": "U+E570", + "description": "Port de voix" + }, + "ornamentPrecompAppoggTrill": { + "codepoint": "U+E5B2", + "description": "Supported appoggiatura trill" + }, + "ornamentPrecompAppoggTrillSuffix": { + "codepoint": "U+E5B3", + "description": "Supported appoggiatura trill with two-note suffix" + }, + "ornamentPrecompCadence": { + "codepoint": "U+E5BE", + "description": "Cadence" + }, + "ornamentPrecompCadenceUpperPrefix": { + "codepoint": "U+E5C1", + "description": "Cadence with upper prefix" + }, + "ornamentPrecompCadenceUpperPrefixTurn": { + "codepoint": "U+E5C2", + "description": "Cadence with upper prefix and turn" + }, + "ornamentPrecompCadenceWithTurn": { + "codepoint": "U+E5BF", + "description": "Cadence with turn" + }, + "ornamentPrecompDescendingSlide": { + "codepoint": "U+E5B1", + "description": "Descending slide" + }, + "ornamentPrecompDoubleCadenceLowerPrefix": { + "codepoint": "U+E5C0", + "description": "Double cadence with lower prefix" + }, + "ornamentPrecompDoubleCadenceUpperPrefix": { + "codepoint": "U+E5C3", + "description": "Double cadence with upper prefix" + }, + "ornamentPrecompDoubleCadenceUpperPrefixTurn": { + "codepoint": "U+E5C4", + "description": "Double cadence with upper prefix and turn" + }, + "ornamentPrecompInvertedMordentUpperPrefix": { + "codepoint": "U+E5C7", + "description": "Inverted mordent with upper prefix" + }, + "ornamentPrecompMordentRelease": { + "codepoint": "U+E5C5", + "description": "Mordent with release" + }, + "ornamentPrecompMordentUpperPrefix": { + "codepoint": "U+E5C6", + "description": "Mordent with upper prefix" + }, + "ornamentPrecompPortDeVoixMordent": { + "codepoint": "U+E5BC", + "description": "Pre-beat port de voix followed by multiple mordent (Dandrieu)" + }, + "ornamentPrecompSlide": { + "codepoint": "U+E5B0", + "description": "Slide" + }, + "ornamentPrecompSlideTrillBach": { + "codepoint": "U+E5B8", + "description": "Slide-trill with two-note suffix (J.S. Bach)" + }, + "ornamentPrecompSlideTrillDAnglebert": { + "codepoint": "U+E5B5", + "description": "Slide-trill (D'Anglebert)" + }, + "ornamentPrecompSlideTrillMarpurg": { + "codepoint": "U+E5B6", + "description": "Slide-trill with one-note suffix (Marpurg)" + }, + "ornamentPrecompSlideTrillMuffat": { + "codepoint": "U+E5B9", + "description": "Slide-trill (Muffat)" + }, + "ornamentPrecompSlideTrillSuffixMuffat": { + "codepoint": "U+E5BA", + "description": "Slide-trill with two-note suffix (Muffat)" + }, + "ornamentPrecompTrillLowerSuffix": { + "codepoint": "U+E5C8", + "description": "Trill with lower suffix" + }, + "ornamentPrecompTrillSuffixDandrieu": { + "codepoint": "U+E5BB", + "description": "Trill with two-note suffix (Dandrieu)" + }, + "ornamentPrecompTrillWithMordent": { + "codepoint": "U+E5BD", + "description": "Trill with mordent" + }, + "ornamentPrecompTurnTrillBach": { + "codepoint": "U+E5B7", + "description": "Turn-trill with two-note suffix (J.S. Bach)" + }, + "ornamentPrecompTurnTrillDAnglebert": { + "codepoint": "U+E5B4", + "description": "Turn-trill (D'Anglebert)" + }, + "ornamentQuilisma": { + "codepoint": "U+EA20", + "description": "Quilisma" + }, + "ornamentRightFacingHalfCircle": { + "codepoint": "U+E571", + "description": "Right-facing half circle" + }, + "ornamentRightFacingHook": { + "codepoint": "U+E573", + "description": "Right-facing hook" + }, + "ornamentRightVerticalStroke": { + "codepoint": "U+E5A4", + "description": "Ornament right vertical stroke" + }, + "ornamentSchleifer": { + "codepoint": "U+E587", + "description": "Schleifer (long mordent)" + }, + "ornamentShake3": { + "codepoint": "U+E582", + "description": "Shake" + }, + "ornamentShakeMuffat1": { + "codepoint": "U+E584", + "description": "Shake (Muffat)" + }, + "ornamentShortObliqueLineAfterNote": { + "codepoint": "U+E57A", + "description": "Short oblique straight line NW-SE" + }, + "ornamentShortObliqueLineBeforeNote": { + "codepoint": "U+E579", + "description": "Short oblique straight line SW-NE" + }, + "ornamentShortTrill": { + "codepoint": "U+E56C", + "description": "Short trill" + }, + "ornamentTopLeftConcaveStroke": { + "codepoint": "U+E590", + "description": "Ornament top left concave stroke" + }, + "ornamentTopLeftConvexStroke": { + "alternateCodepoint": "U+1D1A5", + "codepoint": "U+E591", + "description": "Ornament top left convex stroke" + }, + "ornamentTopRightConcaveStroke": { + "codepoint": "U+E5A0", + "description": "Ornament top right concave stroke" + }, + "ornamentTopRightConvexStroke": { + "alternateCodepoint": "U+1D19E", + "codepoint": "U+E5A1", + "description": "Ornament top right convex stroke" + }, + "ornamentTremblement": { + "codepoint": "U+E56E", + "description": "Tremblement" + }, + "ornamentTremblementCouperin": { + "codepoint": "U+E589", + "description": "Tremblement appuy\u00e9 (Couperin)" + }, + "ornamentTrill": { + "alternateCodepoint": "U+1D196", + "codepoint": "U+E566", + "description": "Trill" + }, + "ornamentTurn": { + "alternateCodepoint": "U+1D197", + "codepoint": "U+E567", + "description": "Turn" + }, + "ornamentTurnInverted": { + "alternateCodepoint": "U+1D198", + "codepoint": "U+E568", + "description": "Inverted turn" + }, + "ornamentTurnSlash": { + "alternateCodepoint": "U+1D199", + "codepoint": "U+E569", + "description": "Turn with slash" + }, + "ornamentTurnUp": { + "alternateCodepoint": "U+1D19A", + "codepoint": "U+E56A", + "description": "Turn up" + }, + "ornamentTurnUpS": { + "codepoint": "U+E56B", + "description": "Inverted turn up" + }, + "ornamentUpCurve": { + "codepoint": "U+E577", + "description": "Curve above" + }, + "ornamentVerticalLine": { + "codepoint": "U+E583", + "description": "Vertical line" + }, + "ornamentZigZagLineNoRightEnd": { + "alternateCodepoint": "U+1D19C", + "codepoint": "U+E59D", + "description": "Ornament zig-zag line without right-hand end" + }, + "ornamentZigZagLineWithRightEnd": { + "alternateCodepoint": "U+1D19D", + "codepoint": "U+E59E", + "description": "Ornament zig-zag line with right-hand end" + }, + "ottava": { + "codepoint": "U+E510", + "description": "Ottava" + }, + "ottavaAlta": { + "alternateCodepoint": "U+1D136", + "codepoint": "U+E511", + "description": "Ottava alta" + }, + "ottavaBassa": { + "alternateCodepoint": "U+1D137", + "codepoint": "U+E512", + "description": "Ottava bassa" + }, + "ottavaBassaBa": { + "codepoint": "U+E513", + "description": "Ottava bassa (ba)" + }, + "ottavaBassaVb": { + "codepoint": "U+E51C", + "description": "Ottava bassa (8vb)" + }, + "pendereckiTremolo": { + "codepoint": "U+E22B", + "description": "Penderecki unmeasured tremolo" + }, + "pictAgogo": { + "codepoint": "U+E717", + "description": "Agogo" + }, + "pictAlmglocken": { + "codepoint": "U+E712", + "description": "Almglocken" + }, + "pictAnvil": { + "codepoint": "U+E701", + "description": "Anvil" + }, + "pictBambooChimes": { + "codepoint": "U+E6C3", + "description": "Bamboo tube chimes" + }, + "pictBambooScraper": { + "codepoint": "U+E6FB", + "description": "Bamboo scraper" + }, + "pictBassDrum": { + "codepoint": "U+E6D4", + "description": "Bass drum" + }, + "pictBassDrumOnSide": { + "codepoint": "U+E6D5", + "description": "Bass drum on side" + }, + "pictBeaterBow": { + "codepoint": "U+E7DE", + "description": "Bow" + }, + "pictBeaterBox": { + "codepoint": "U+E7EB", + "description": "Box for percussion beater" + }, + "pictBeaterBrassMalletsDown": { + "codepoint": "U+E7DA", + "description": "Brass mallets down" + }, + "pictBeaterBrassMalletsLeft": { + "codepoint": "U+E7EE", + "description": "Brass mallets left" + }, + "pictBeaterBrassMalletsRight": { + "codepoint": "U+E7ED", + "description": "Brass mallets right" + }, + "pictBeaterBrassMalletsUp": { + "codepoint": "U+E7D9", + "description": "Brass mallets up" + }, + "pictBeaterCombiningDashedCircle": { + "codepoint": "U+E7EA", + "description": "Combining dashed circle for round beaters (plated)" + }, + "pictBeaterCombiningParentheses": { + "codepoint": "U+E7E9", + "description": "Combining parentheses for round beaters (padded)" + }, + "pictBeaterDoubleBassDrumDown": { + "codepoint": "U+E7A1", + "description": "Double bass drum stick down" + }, + "pictBeaterDoubleBassDrumUp": { + "codepoint": "U+E7A0", + "description": "Double bass drum stick up" + }, + "pictBeaterFinger": { + "codepoint": "U+E7E4", + "description": "Finger" + }, + "pictBeaterFingernails": { + "codepoint": "U+E7E6", + "description": "Fingernails" + }, + "pictBeaterFist": { + "codepoint": "U+E7E5", + "description": "Fist" + }, + "pictBeaterGuiroScraper": { + "codepoint": "U+E7DD", + "description": "Guiro scraper" + }, + "pictBeaterHammer": { + "codepoint": "U+E7E1", + "description": "Hammer" + }, + "pictBeaterHammerMetalDown": { + "codepoint": "U+E7D0", + "description": "Metal hammer, down" + }, + "pictBeaterHammerMetalUp": { + "codepoint": "U+E7CF", + "description": "Metal hammer, up" + }, + "pictBeaterHammerPlasticDown": { + "codepoint": "U+E7CE", + "description": "Plastic hammer, down" + }, + "pictBeaterHammerPlasticUp": { + "codepoint": "U+E7CD", + "description": "Plastic hammer, up" + }, + "pictBeaterHammerWoodDown": { + "codepoint": "U+E7CC", + "description": "Wooden hammer, down" + }, + "pictBeaterHammerWoodUp": { + "codepoint": "U+E7CB", + "description": "Wooden hammer, up" + }, + "pictBeaterHand": { + "codepoint": "U+E7E3", + "description": "Hand" + }, + "pictBeaterHardBassDrumDown": { + "codepoint": "U+E79D", + "description": "Hard bass drum stick down" + }, + "pictBeaterHardBassDrumUp": { + "codepoint": "U+E79C", + "description": "Hard bass drum stick up" + }, + "pictBeaterHardGlockenspielDown": { + "codepoint": "U+E785", + "description": "Hard glockenspiel stick down" + }, + "pictBeaterHardGlockenspielLeft": { + "codepoint": "U+E787", + "description": "Hard glockenspiel stick left" + }, + "pictBeaterHardGlockenspielRight": { + "codepoint": "U+E786", + "description": "Hard glockenspiel stick right" + }, + "pictBeaterHardGlockenspielUp": { + "codepoint": "U+E784", + "description": "Hard glockenspiel stick up" + }, + "pictBeaterHardTimpaniDown": { + "codepoint": "U+E791", + "description": "Hard timpani stick down" + }, + "pictBeaterHardTimpaniLeft": { + "codepoint": "U+E793", + "description": "Hard timpani stick left" + }, + "pictBeaterHardTimpaniRight": { + "codepoint": "U+E792", + "description": "Hard timpani stick right" + }, + "pictBeaterHardTimpaniUp": { + "codepoint": "U+E790", + "description": "Hard timpani stick up" + }, + "pictBeaterHardXylophoneDown": { + "codepoint": "U+E779", + "description": "Hard xylophone stick down" + }, + "pictBeaterHardXylophoneLeft": { + "codepoint": "U+E77B", + "description": "Hard xylophone stick left" + }, + "pictBeaterHardXylophoneRight": { + "codepoint": "U+E77A", + "description": "Hard xylophone stick right" + }, + "pictBeaterHardXylophoneUp": { + "codepoint": "U+E778", + "description": "Hard xylophone stick up" + }, + "pictBeaterHardYarnDown": { + "codepoint": "U+E7AB", + "description": "Hard yarn beater down" + }, + "pictBeaterHardYarnLeft": { + "codepoint": "U+E7AD", + "description": "Hard yarn beater left" + }, + "pictBeaterHardYarnRight": { + "codepoint": "U+E7AC", + "description": "Hard yarn beater right" + }, + "pictBeaterHardYarnUp": { + "codepoint": "U+E7AA", + "description": "Hard yarn beater up" + }, + "pictBeaterJazzSticksDown": { + "codepoint": "U+E7D4", + "description": "Jazz sticks down" + }, + "pictBeaterJazzSticksUp": { + "codepoint": "U+E7D3", + "description": "Jazz sticks up" + }, + "pictBeaterKnittingNeedle": { + "codepoint": "U+E7E2", + "description": "Knitting needle" + }, + "pictBeaterMallet": { + "codepoint": "U+E7DF", + "description": "Chime hammer up" + }, + "pictBeaterMalletDown": { + "codepoint": "U+E7EC", + "description": "Chime hammer down" + }, + "pictBeaterMediumBassDrumDown": { + "codepoint": "U+E79B", + "description": "Medium bass drum stick down" + }, + "pictBeaterMediumBassDrumUp": { + "codepoint": "U+E79A", + "description": "Medium bass drum stick up" + }, + "pictBeaterMediumTimpaniDown": { + "codepoint": "U+E78D", + "description": "Medium timpani stick down" + }, + "pictBeaterMediumTimpaniLeft": { + "codepoint": "U+E78F", + "description": "Medium timpani stick left" + }, + "pictBeaterMediumTimpaniRight": { + "codepoint": "U+E78E", + "description": "Medium timpani stick right" + }, + "pictBeaterMediumTimpaniUp": { + "codepoint": "U+E78C", + "description": "Medium timpani stick up" + }, + "pictBeaterMediumXylophoneDown": { + "codepoint": "U+E775", + "description": "Medium xylophone stick down" + }, + "pictBeaterMediumXylophoneLeft": { + "codepoint": "U+E777", + "description": "Medium xylophone stick left" + }, + "pictBeaterMediumXylophoneRight": { + "codepoint": "U+E776", + "description": "Medium xylophone stick right" + }, + "pictBeaterMediumXylophoneUp": { + "codepoint": "U+E774", + "description": "Medium xylophone stick up" + }, + "pictBeaterMediumYarnDown": { + "codepoint": "U+E7A7", + "description": "Medium yarn beater down" + }, + "pictBeaterMediumYarnLeft": { + "codepoint": "U+E7A9", + "description": "Medium yarn beater left" + }, + "pictBeaterMediumYarnRight": { + "codepoint": "U+E7A8", + "description": "Medium yarn beater right" + }, + "pictBeaterMediumYarnUp": { + "codepoint": "U+E7A6", + "description": "Medium yarn beater up" + }, + "pictBeaterMetalBassDrumDown": { + "codepoint": "U+E79F", + "description": "Metal bass drum stick down" + }, + "pictBeaterMetalBassDrumUp": { + "codepoint": "U+E79E", + "description": "Metal bass drum stick up" + }, + "pictBeaterMetalDown": { + "codepoint": "U+E7C8", + "description": "Metal beater down" + }, + "pictBeaterMetalHammer": { + "codepoint": "U+E7E0", + "description": "Metal hammer" + }, + "pictBeaterMetalLeft": { + "codepoint": "U+E7CA", + "description": "Metal beater, left" + }, + "pictBeaterMetalRight": { + "codepoint": "U+E7C9", + "description": "Metal beater, right" + }, + "pictBeaterMetalUp": { + "codepoint": "U+E7C7", + "description": "Metal beater, up" + }, + "pictBeaterSnareSticksDown": { + "codepoint": "U+E7D2", + "description": "Snare sticks down" + }, + "pictBeaterSnareSticksUp": { + "codepoint": "U+E7D1", + "description": "Snare sticks up" + }, + "pictBeaterSoftBassDrumDown": { + "codepoint": "U+E799", + "description": "Soft bass drum stick down" + }, + "pictBeaterSoftBassDrumUp": { + "codepoint": "U+E798", + "description": "Soft bass drum stick up" + }, + "pictBeaterSoftGlockenspielDown": { + "codepoint": "U+E781", + "description": "Soft glockenspiel stick down" + }, + "pictBeaterSoftGlockenspielLeft": { + "codepoint": "U+E783", + "description": "Soft glockenspiel stick left" + }, + "pictBeaterSoftGlockenspielRight": { + "codepoint": "U+E782", + "description": "Soft glockenspiel stick right" + }, + "pictBeaterSoftGlockenspielUp": { + "codepoint": "U+E780", + "description": "Soft glockenspiel stick up" + }, + "pictBeaterSoftTimpaniDown": { + "codepoint": "U+E789", + "description": "Soft timpani stick down" + }, + "pictBeaterSoftTimpaniLeft": { + "codepoint": "U+E78B", + "description": "Soft timpani stick left" + }, + "pictBeaterSoftTimpaniRight": { + "codepoint": "U+E78A", + "description": "Soft timpani stick right" + }, + "pictBeaterSoftTimpaniUp": { + "codepoint": "U+E788", + "description": "Soft timpani stick up" + }, + "pictBeaterSoftXylophone": { + "codepoint": "U+E7DB", + "description": "Soft xylophone beaters" + }, + "pictBeaterSoftXylophoneDown": { + "codepoint": "U+E771", + "description": "Soft xylophone stick down" + }, + "pictBeaterSoftXylophoneLeft": { + "codepoint": "U+E773", + "description": "Soft xylophone stick left" + }, + "pictBeaterSoftXylophoneRight": { + "codepoint": "U+E772", + "description": "Soft xylophone stick right" + }, + "pictBeaterSoftXylophoneUp": { + "codepoint": "U+E770", + "description": "Soft xylophone stick up" + }, + "pictBeaterSoftYarnDown": { + "codepoint": "U+E7A3", + "description": "Soft yarn beater down" + }, + "pictBeaterSoftYarnLeft": { + "codepoint": "U+E7A5", + "description": "Soft yarn beater left" + }, + "pictBeaterSoftYarnRight": { + "codepoint": "U+E7A4", + "description": "Soft yarn beater right" + }, + "pictBeaterSoftYarnUp": { + "codepoint": "U+E7A2", + "description": "Soft yarn beater up" + }, + "pictBeaterSpoonWoodenMallet": { + "codepoint": "U+E7DC", + "description": "Spoon-shaped wooden mallet" + }, + "pictBeaterSuperballDown": { + "codepoint": "U+E7AF", + "description": "Superball beater down" + }, + "pictBeaterSuperballLeft": { + "codepoint": "U+E7B1", + "description": "Superball beater left" + }, + "pictBeaterSuperballRight": { + "codepoint": "U+E7B0", + "description": "Superball beater right" + }, + "pictBeaterSuperballUp": { + "codepoint": "U+E7AE", + "description": "Superball beater up" + }, + "pictBeaterTriangleDown": { + "codepoint": "U+E7D6", + "description": "Triangle beater down" + }, + "pictBeaterTrianglePlain": { + "codepoint": "U+E7EF", + "description": "Triangle beater plain" + }, + "pictBeaterTriangleUp": { + "codepoint": "U+E7D5", + "description": "Triangle beater up" + }, + "pictBeaterWireBrushesDown": { + "codepoint": "U+E7D8", + "description": "Wire brushes down" + }, + "pictBeaterWireBrushesUp": { + "codepoint": "U+E7D7", + "description": "Wire brushes up" + }, + "pictBeaterWoodTimpaniDown": { + "codepoint": "U+E795", + "description": "Wood timpani stick down" + }, + "pictBeaterWoodTimpaniLeft": { + "codepoint": "U+E797", + "description": "Wood timpani stick left" + }, + "pictBeaterWoodTimpaniRight": { + "codepoint": "U+E796", + "description": "Wood timpani stick right" + }, + "pictBeaterWoodTimpaniUp": { + "codepoint": "U+E794", + "description": "Wood timpani stick up" + }, + "pictBeaterWoodXylophoneDown": { + "codepoint": "U+E77D", + "description": "Wood xylophone stick down" + }, + "pictBeaterWoodXylophoneLeft": { + "codepoint": "U+E77F", + "description": "Wood xylophone stick left" + }, + "pictBeaterWoodXylophoneRight": { + "codepoint": "U+E77E", + "description": "Wood xylophone stick right" + }, + "pictBeaterWoodXylophoneUp": { + "codepoint": "U+E77C", + "description": "Wood xylophone stick up" + }, + "pictBell": { + "codepoint": "U+E714", + "description": "Bell" + }, + "pictBellOfCymbal": { + "codepoint": "U+E72A", + "description": "Bell of cymbal" + }, + "pictBellPlate": { + "codepoint": "U+E713", + "description": "Bell plate" + }, + "pictBellTree": { + "codepoint": "U+E71A", + "description": "Bell tree" + }, + "pictBirdWhistle": { + "codepoint": "U+E751", + "description": "Bird whistle" + }, + "pictBoardClapper": { + "codepoint": "U+E6F7", + "description": "Board clapper" + }, + "pictBongos": { + "codepoint": "U+E6DD", + "description": "Bongos" + }, + "pictBrakeDrum": { + "codepoint": "U+E6E1", + "description": "Brake drum" + }, + "pictCabasa": { + "codepoint": "U+E743", + "description": "Cabasa" + }, + "pictCannon": { + "codepoint": "U+E761", + "description": "Cannon" + }, + "pictCarHorn": { + "codepoint": "U+E755", + "description": "Car horn" + }, + "pictCastanets": { + "codepoint": "U+E6F8", + "description": "Castanets" + }, + "pictCastanetsWithHandle": { + "codepoint": "U+E6F9", + "description": "Castanets with handle" + }, + "pictCelesta": { + "codepoint": "U+E6B0", + "description": "Celesta" + }, + "pictCencerro": { + "codepoint": "U+E716", + "description": "Cencerro" + }, + "pictCenter1": { + "codepoint": "U+E7FE", + "description": "Center (Weinberg)" + }, + "pictCenter2": { + "codepoint": "U+E7FF", + "description": "Center (Ghent)" + }, + "pictCenter3": { + "codepoint": "U+E800", + "description": "Center (Caltabiano)" + }, + "pictChainRattle": { + "codepoint": "U+E748", + "description": "Chain rattle" + }, + "pictChimes": { + "codepoint": "U+E6C2", + "description": "Chimes" + }, + "pictChineseCymbal": { + "codepoint": "U+E726", + "description": "Chinese cymbal" + }, + "pictChokeCymbal": { + "codepoint": "U+E805", + "description": "Choke (Weinberg)" + }, + "pictClaves": { + "codepoint": "U+E6F2", + "description": "Claves" + }, + "pictCoins": { + "codepoint": "U+E7E7", + "description": "Coins" + }, + "pictConga": { + "codepoint": "U+E6DE", + "description": "Conga" + }, + "pictCowBell": { + "codepoint": "U+E711", + "description": "Cow bell" + }, + "pictCrashCymbals": { + "codepoint": "U+E720", + "description": "Crash cymbals" + }, + "pictCrotales": { + "codepoint": "U+E6AE", + "description": "Crotales" + }, + "pictCrushStem": { + "codepoint": "U+E80C", + "description": "Combining crush for stem" + }, + "pictCuica": { + "codepoint": "U+E6E4", + "description": "Cuica" + }, + "pictCymbalTongs": { + "codepoint": "U+E728", + "description": "Cymbal tongs" + }, + "pictDamp1": { + "codepoint": "U+E7F9", + "description": "Damp" + }, + "pictDamp2": { + "codepoint": "U+E7FA", + "description": "Damp 2" + }, + "pictDamp3": { + "codepoint": "U+E7FB", + "description": "Damp 3" + }, + "pictDamp4": { + "codepoint": "U+E7FC", + "description": "Damp 4" + }, + "pictDeadNoteStem": { + "codepoint": "U+E80D", + "description": "Combining X for stem (dead note)" + }, + "pictDrumStick": { + "codepoint": "U+E7E8", + "description": "Drum stick" + }, + "pictDuckCall": { + "codepoint": "U+E757", + "description": "Duck call" + }, + "pictEdgeOfCymbal": { + "codepoint": "U+E729", + "description": "Edge of cymbal" + }, + "pictEmptyTrap": { + "codepoint": "U+E6A9", + "description": "Empty trapezoid" + }, + "pictFingerCymbals": { + "codepoint": "U+E727", + "description": "Finger cymbals" + }, + "pictFlexatone": { + "codepoint": "U+E740", + "description": "Flexatone" + }, + "pictFootballRatchet": { + "codepoint": "U+E6F5", + "description": "Football rattle" + }, + "pictGlassHarmonica": { + "codepoint": "U+E765", + "description": "Glass harmonica" + }, + "pictGlassHarp": { + "codepoint": "U+E764", + "description": "Glass harp" + }, + "pictGlassPlateChimes": { + "codepoint": "U+E6C6", + "description": "Glass plate chimes" + }, + "pictGlassTubeChimes": { + "codepoint": "U+E6C5", + "description": "Glass tube chimes" + }, + "pictGlsp": { + "codepoint": "U+E6A0", + "description": "Glockenspiel" + }, + "pictGlspSmithBrindle": { + "codepoint": "U+E6AA", + "description": "Glockenspiel (Smith Brindle)" + }, + "pictGobletDrum": { + "codepoint": "U+E6E2", + "description": "Goblet drum (djembe, dumbek)" + }, + "pictGong": { + "codepoint": "U+E732", + "description": "Gong" + }, + "pictGongWithButton": { + "codepoint": "U+E733", + "description": "Gong with button (nipple)" + }, + "pictGuiro": { + "codepoint": "U+E6F3", + "description": "Guiro" + }, + "pictGumHardDown": { + "codepoint": "U+E7C4", + "description": "Hard gum beater, down" + }, + "pictGumHardLeft": { + "codepoint": "U+E7C6", + "description": "Hard gum beater, left" + }, + "pictGumHardRight": { + "codepoint": "U+E7C5", + "description": "Hard gum beater, right" + }, + "pictGumHardUp": { + "codepoint": "U+E7C3", + "description": "Hard gum beater, up" + }, + "pictGumMediumDown": { + "codepoint": "U+E7C0", + "description": "Medium gum beater, down" + }, + "pictGumMediumLeft": { + "codepoint": "U+E7C2", + "description": "Medium gum beater, left" + }, + "pictGumMediumRight": { + "codepoint": "U+E7C1", + "description": "Medium gum beater, right" + }, + "pictGumMediumUp": { + "codepoint": "U+E7BF", + "description": "Medium gum beater, up" + }, + "pictGumSoftDown": { + "codepoint": "U+E7BC", + "description": "Soft gum beater, down" + }, + "pictGumSoftLeft": { + "codepoint": "U+E7BE", + "description": "Soft gum beater, left" + }, + "pictGumSoftRight": { + "codepoint": "U+E7BD", + "description": "Soft gum beater, right" + }, + "pictGumSoftUp": { + "codepoint": "U+E7BB", + "description": "Soft gum beater, up" + }, + "pictHalfOpen1": { + "codepoint": "U+E7F6", + "description": "Half-open" + }, + "pictHalfOpen2": { + "codepoint": "U+E7F7", + "description": "Half-open 2 (Weinberg)" + }, + "pictHandbell": { + "codepoint": "U+E715", + "description": "Handbell" + }, + "pictHiHat": { + "codepoint": "U+E722", + "description": "Hi-hat" + }, + "pictHiHatOnStand": { + "codepoint": "U+E723", + "description": "Hi-hat cymbals on stand" + }, + "pictJawHarp": { + "codepoint": "U+E767", + "description": "Jaw harp" + }, + "pictJingleBells": { + "codepoint": "U+E719", + "description": "Jingle bells" + }, + "pictKlaxonHorn": { + "codepoint": "U+E756", + "description": "Klaxon horn" + }, + "pictLeftHandCircle": { + "codepoint": "U+E807", + "description": "Right hand (Agostini)" + }, + "pictLionsRoar": { + "codepoint": "U+E763", + "description": "Lion's roar" + }, + "pictLithophone": { + "codepoint": "U+E6B1", + "description": "Lithophone" + }, + "pictLogDrum": { + "codepoint": "U+E6DF", + "description": "Log drum" + }, + "pictLotusFlute": { + "codepoint": "U+E75A", + "description": "Lotus flute" + }, + "pictMar": { + "codepoint": "U+E6A6", + "description": "Marimba" + }, + "pictMarSmithBrindle": { + "codepoint": "U+E6AC", + "description": "Marimba (Smith Brindle)" + }, + "pictMaraca": { + "codepoint": "U+E741", + "description": "Maraca" + }, + "pictMaracas": { + "codepoint": "U+E742", + "description": "Maracas" + }, + "pictMegaphone": { + "codepoint": "U+E759", + "description": "Megaphone" + }, + "pictMetalPlateChimes": { + "codepoint": "U+E6C8", + "description": "Metal plate chimes" + }, + "pictMetalTubeChimes": { + "codepoint": "U+E6C7", + "description": "Metal tube chimes" + }, + "pictMusicalSaw": { + "codepoint": "U+E766", + "description": "Musical saw" + }, + "pictNormalPosition": { + "codepoint": "U+E804", + "description": "Normal position (Caltabiano)" + }, + "pictOnRim": { + "codepoint": "U+E7F4", + "description": "On rim" + }, + "pictOpen": { + "codepoint": "U+E7F8", + "description": "Open" + }, + "pictOpenRimShot": { + "codepoint": "U+E7F5", + "description": "Closed / rim shot" + }, + "pictPistolShot": { + "codepoint": "U+E760", + "description": "Pistol shot" + }, + "pictPoliceWhistle": { + "codepoint": "U+E752", + "description": "Police whistle" + }, + "pictQuijada": { + "codepoint": "U+E6FA", + "description": "Quijada (jawbone)" + }, + "pictRainstick": { + "codepoint": "U+E747", + "description": "Rainstick" + }, + "pictRatchet": { + "codepoint": "U+E6F4", + "description": "Ratchet" + }, + "pictRecoReco": { + "codepoint": "U+E6FC", + "description": "Reco-reco" + }, + "pictRightHandSquare": { + "codepoint": "U+E806", + "description": "Left hand (Agostini)" + }, + "pictRim1": { + "codepoint": "U+E801", + "description": "Rim or edge (Weinberg)" + }, + "pictRim2": { + "codepoint": "U+E802", + "description": "Rim (Ghent)" + }, + "pictRim3": { + "codepoint": "U+E803", + "description": "Rim (Caltabiano)" + }, + "pictRimShotOnStem": { + "codepoint": "U+E7FD", + "description": "Rim shot for stem" + }, + "pictSandpaperBlocks": { + "codepoint": "U+E762", + "description": "Sandpaper blocks" + }, + "pictScrapeAroundRim": { + "codepoint": "U+E7F3", + "description": "Scrape around rim (counter-clockwise)" + }, + "pictScrapeAroundRimClockwise": { + "codepoint": "U+E80E", + "description": "Scrape around rim (clockwise)" + }, + "pictScrapeCenterToEdge": { + "codepoint": "U+E7F1", + "description": "Scrape from center to edge" + }, + "pictScrapeEdgeToCenter": { + "codepoint": "U+E7F2", + "description": "Scrape from edge to center" + }, + "pictShellBells": { + "codepoint": "U+E718", + "description": "Shell bells" + }, + "pictShellChimes": { + "codepoint": "U+E6C4", + "description": "Shell chimes" + }, + "pictSiren": { + "codepoint": "U+E753", + "description": "Siren" + }, + "pictSistrum": { + "codepoint": "U+E746", + "description": "Sistrum" + }, + "pictSizzleCymbal": { + "codepoint": "U+E724", + "description": "Sizzle cymbal" + }, + "pictSleighBell": { + "codepoint": "U+E710", + "description": "Sleigh bell" + }, + "pictSlideBrushOnGong": { + "codepoint": "U+E734", + "description": "Slide brush on gong" + }, + "pictSlideWhistle": { + "codepoint": "U+E750", + "description": "Slide whistle" + }, + "pictSlitDrum": { + "codepoint": "U+E6E0", + "description": "Slit drum" + }, + "pictSnareDrum": { + "codepoint": "U+E6D1", + "description": "Snare drum" + }, + "pictSnareDrumMilitary": { + "codepoint": "U+E6D3", + "description": "Military snare drum" + }, + "pictSnareDrumSnaresOff": { + "codepoint": "U+E6D2", + "description": "Snare drum, snares off" + }, + "pictSteelDrums": { + "codepoint": "U+E6AF", + "description": "Steel drums" + }, + "pictStickShot": { + "codepoint": "U+E7F0", + "description": "Stick shot" + }, + "pictSuperball": { + "codepoint": "U+E7B2", + "description": "Superball" + }, + "pictSuspendedCymbal": { + "codepoint": "U+E721", + "description": "Suspended cymbal" + }, + "pictSwishStem": { + "codepoint": "U+E808", + "description": "Combining swish for stem" + }, + "pictTabla": { + "codepoint": "U+E6E3", + "description": "Indian tabla" + }, + "pictTamTam": { + "codepoint": "U+E730", + "description": "Tam-tam" + }, + "pictTamTamWithBeater": { + "codepoint": "U+E731", + "description": "Tam-tam with beater (Smith Brindle)" + }, + "pictTambourine": { + "codepoint": "U+E6DB", + "description": "Tambourine" + }, + "pictTempleBlocks": { + "codepoint": "U+E6F1", + "description": "Temple blocks" + }, + "pictTenorDrum": { + "codepoint": "U+E6D6", + "description": "Tenor drum" + }, + "pictThundersheet": { + "codepoint": "U+E744", + "description": "Thundersheet" + }, + "pictTimbales": { + "codepoint": "U+E6DC", + "description": "Timbales" + }, + "pictTimpani": { + "codepoint": "U+E6D0", + "description": "Timpani" + }, + "pictTomTom": { + "codepoint": "U+E6D7", + "description": "Tom-tom" + }, + "pictTomTomChinese": { + "codepoint": "U+E6D8", + "description": "Chinese tom-tom" + }, + "pictTomTomIndoAmerican": { + "codepoint": "U+E6DA", + "description": "Indo-American tom tom" + }, + "pictTomTomJapanese": { + "codepoint": "U+E6D9", + "description": "Japanese tom-tom" + }, + "pictTriangle": { + "codepoint": "U+E700", + "description": "Triangle" + }, + "pictTubaphone": { + "codepoint": "U+E6B2", + "description": "Tubaphone" + }, + "pictTubularBells": { + "codepoint": "U+E6C0", + "description": "Tubular bells" + }, + "pictTurnLeftStem": { + "codepoint": "U+E80A", + "description": "Combining turn left for stem" + }, + "pictTurnRightLeftStem": { + "codepoint": "U+E80B", + "description": "Combining turn left or right for stem" + }, + "pictTurnRightStem": { + "codepoint": "U+E809", + "description": "Combining turn right for stem" + }, + "pictVib": { + "codepoint": "U+E6A7", + "description": "Vibraphone" + }, + "pictVibMotorOff": { + "codepoint": "U+E6A8", + "description": "Metallophone (vibraphone motor off)" + }, + "pictVibSmithBrindle": { + "codepoint": "U+E6AD", + "description": "Vibraphone (Smith Brindle)" + }, + "pictVibraslap": { + "codepoint": "U+E745", + "description": "Vibraslap" + }, + "pictVietnameseHat": { + "codepoint": "U+E725", + "description": "Vietnamese hat cymbal" + }, + "pictWhip": { + "codepoint": "U+E6F6", + "description": "Whip" + }, + "pictWindChimesGlass": { + "codepoint": "U+E6C1", + "description": "Wind chimes (glass)" + }, + "pictWindMachine": { + "codepoint": "U+E754", + "description": "Wind machine" + }, + "pictWindWhistle": { + "codepoint": "U+E758", + "description": "Wind whistle (or mouth siren)" + }, + "pictWoodBlock": { + "codepoint": "U+E6F0", + "description": "Wood block" + }, + "pictWoundHardDown": { + "codepoint": "U+E7B4", + "description": "Wound beater, hard core down" + }, + "pictWoundHardLeft": { + "codepoint": "U+E7B6", + "description": "Wound beater, hard core left" + }, + "pictWoundHardRight": { + "codepoint": "U+E7B5", + "description": "Wound beater, hard core right" + }, + "pictWoundHardUp": { + "codepoint": "U+E7B3", + "description": "Wound beater, hard core up" + }, + "pictWoundSoftDown": { + "codepoint": "U+E7B8", + "description": "Wound beater, soft core down" + }, + "pictWoundSoftLeft": { + "codepoint": "U+E7BA", + "description": "Wound beater, soft core left" + }, + "pictWoundSoftRight": { + "codepoint": "U+E7B9", + "description": "Wound beater, soft core right" + }, + "pictWoundSoftUp": { + "codepoint": "U+E7B7", + "description": "Wound beater, soft core up" + }, + "pictXyl": { + "codepoint": "U+E6A1", + "description": "Xylophone" + }, + "pictXylBass": { + "codepoint": "U+E6A3", + "description": "Bass xylophone" + }, + "pictXylSmithBrindle": { + "codepoint": "U+E6AB", + "description": "Xylophone (Smith Brindle)" + }, + "pictXylTenor": { + "codepoint": "U+E6A2", + "description": "Tenor xylophone" + }, + "pictXylTenorTrough": { + "codepoint": "U+E6A5", + "description": "Trough tenor xylophone" + }, + "pictXylTrough": { + "codepoint": "U+E6A4", + "description": "Trough xylophone" + }, + "pluckedBuzzPizzicato": { + "codepoint": "U+E632", + "description": "Buzz pizzicato" + }, + "pluckedDamp": { + "alternateCodepoint": "U+1D1B4", + "codepoint": "U+E638", + "description": "Damp" + }, + "pluckedDampAll": { + "alternateCodepoint": "U+1D1B5", + "codepoint": "U+E639", + "description": "Damp all" + }, + "pluckedDampOnStem": { + "codepoint": "U+E63B", + "description": "Damp for stem" + }, + "pluckedFingernailFlick": { + "codepoint": "U+E637", + "description": "Fingernail flick" + }, + "pluckedLeftHandPizzicato": { + "codepoint": "U+E633", + "description": "Left-hand pizzicato" + }, + "pluckedPlectrum": { + "codepoint": "U+E63A", + "description": "Plectrum" + }, + "pluckedSnapPizzicatoAbove": { + "codepoint": "U+E631", + "description": "Snap pizzicato above" + }, + "pluckedSnapPizzicatoBelow": { + "alternateCodepoint": "U+1D1AD", + "codepoint": "U+E630", + "description": "Snap pizzicato below" + }, + "pluckedWithFingernails": { + "alternateCodepoint": "U+1D1B3", + "codepoint": "U+E636", + "description": "With fingernails" + }, + "quindicesima": { + "codepoint": "U+E514", + "description": "Quindicesima" + }, + "quindicesimaAlta": { + "codepoint": "U+E515", + "description": "Quindicesima alta" + }, + "quindicesimaBassa": { + "alternateCodepoint": "U+1D139", + "codepoint": "U+E516", + "description": "Quindicesima bassa" + }, + "quindicesimaBassaMb": { + "codepoint": "U+E51D", + "description": "Quindicesima bassa (mb)" + }, + "repeat1Bar": { + "alternateCodepoint": "U+1D10E", + "codepoint": "U+E500", + "description": "Repeat last bar" + }, + "repeat2Bars": { + "alternateCodepoint": "U+1D10F", + "codepoint": "U+E501", + "description": "Repeat last two bars" + }, + "repeat4Bars": { + "codepoint": "U+E502", + "description": "Repeat last four bars" + }, + "repeatBarLowerDot": { + "codepoint": "U+E505", + "description": "Repeat bar lower dot" + }, + "repeatBarSlash": { + "codepoint": "U+E504", + "description": "Repeat bar slash" + }, + "repeatBarUpperDot": { + "codepoint": "U+E503", + "description": "Repeat bar upper dot" + }, + "repeatDot": { + "codepoint": "U+E044", + "description": "Single repeat dot" + }, + "repeatDots": { + "alternateCodepoint": "U+1D108", + "codepoint": "U+E043", + "description": "Repeat dots" + }, + "repeatLeft": { + "alternateCodepoint": "U+1D106", + "codepoint": "U+E040", + "description": "Left (start) repeat sign" + }, + "repeatRight": { + "alternateCodepoint": "U+1D107", + "codepoint": "U+E041", + "description": "Right (end) repeat sign" + }, + "repeatRightLeft": { + "codepoint": "U+E042", + "description": "Right and left repeat sign" + }, + "rest1024th": { + "codepoint": "U+E4ED", + "description": "1024th rest" + }, + "rest128th": { + "alternateCodepoint": "U+1D142", + "codepoint": "U+E4EA", + "description": "128th (semihemidemisemiquaver) rest" + }, + "rest16th": { + "alternateCodepoint": "U+1D13F", + "codepoint": "U+E4E7", + "description": "16th (semiquaver) rest" + }, + "rest256th": { + "codepoint": "U+E4EB", + "description": "256th rest" + }, + "rest32nd": { + "alternateCodepoint": "U+1D140", + "codepoint": "U+E4E8", + "description": "32nd (demisemiquaver) rest" + }, + "rest512th": { + "codepoint": "U+E4EC", + "description": "512th rest" + }, + "rest64th": { + "alternateCodepoint": "U+1D141", + "codepoint": "U+E4E9", + "description": "64th (hemidemisemiquaver) rest" + }, + "rest8th": { + "alternateCodepoint": "U+1D13E", + "codepoint": "U+E4E6", + "description": "Eighth (quaver) rest" + }, + "restDoubleWhole": { + "alternateCodepoint": "U+1D13A", + "codepoint": "U+E4E2", + "description": "Double whole (breve) rest" + }, + "restDoubleWholeLegerLine": { + "codepoint": "U+E4F3", + "description": "Double whole rest on leger lines" + }, + "restHBar": { + "alternateCodepoint": "U+1D129", + "codepoint": "U+E4EE", + "description": "Multiple measure rest" + }, + "restHBarLeft": { + "codepoint": "U+E4EF", + "description": "H-bar, left half" + }, + "restHBarMiddle": { + "codepoint": "U+E4F0", + "description": "H-bar, middle" + }, + "restHBarRight": { + "codepoint": "U+E4F1", + "description": "H-bar, right half" + }, + "restHalf": { + "alternateCodepoint": "U+1D13C", + "codepoint": "U+E4E4", + "description": "Half (minim) rest" + }, + "restHalfLegerLine": { + "codepoint": "U+E4F5", + "description": "Half rest on leger line" + }, + "restLonga": { + "codepoint": "U+E4E1", + "description": "Longa rest" + }, + "restMaxima": { + "codepoint": "U+E4E0", + "description": "Maxima rest" + }, + "restQuarter": { + "alternateCodepoint": "U+1D13D", + "codepoint": "U+E4E5", + "description": "Quarter (crotchet) rest" + }, + "restQuarterOld": { + "codepoint": "U+E4F2", + "description": "Old-style quarter (crotchet) rest" + }, + "restQuarterZ": { + "codepoint": "U+E4F6", + "description": "Z-style quarter (crotchet) rest" + }, + "restWhole": { + "alternateCodepoint": "U+1D13B", + "codepoint": "U+E4E3", + "description": "Whole (semibreve) rest" + }, + "restWholeLegerLine": { + "codepoint": "U+E4F4", + "description": "Whole rest on leger line" + }, + "reversedBrace": { + "codepoint": "U+E001", + "description": "Reversed brace" + }, + "reversedBracketBottom": { + "codepoint": "U+E006", + "description": "Reversed bracket bottom" + }, + "reversedBracketTop": { + "codepoint": "U+E005", + "description": "Reversed bracket top" + }, + "rightRepeatSmall": { + "codepoint": "U+E04D", + "description": "Right repeat sign within bar" + }, + "scaleDegree1": { + "codepoint": "U+EF00", + "description": "Scale degree 1" + }, + "scaleDegree2": { + "codepoint": "U+EF01", + "description": "Scale degree 2" + }, + "scaleDegree3": { + "codepoint": "U+EF02", + "description": "Scale degree 3" + }, + "scaleDegree4": { + "codepoint": "U+EF03", + "description": "Scale degree 4" + }, + "scaleDegree5": { + "codepoint": "U+EF04", + "description": "Scale degree 5" + }, + "scaleDegree6": { + "codepoint": "U+EF05", + "description": "Scale degree 6" + }, + "scaleDegree7": { + "codepoint": "U+EF06", + "description": "Scale degree 7" + }, + "scaleDegree8": { + "codepoint": "U+EF07", + "description": "Scale degree 8" + }, + "scaleDegree9": { + "codepoint": "U+EF08", + "description": "Scale degree 9" + }, + "schaefferClef": { + "codepoint": "U+E06F", + "description": "Sch\u00e4ffer clef" + }, + "schaefferFClefToGClef": { + "codepoint": "U+E072", + "description": "Sch\u00e4ffer F clef to G clef change" + }, + "schaefferGClefToFClef": { + "codepoint": "U+E071", + "description": "Sch\u00e4ffer G clef to F clef change" + }, + "schaefferPreviousClef": { + "codepoint": "U+E070", + "description": "Sch\u00e4ffer previous clef" + }, + "segno": { + "alternateCodepoint": "U+1D10B", + "codepoint": "U+E047", + "description": "Segno" + }, + "segnoSerpent1": { + "codepoint": "U+E04A", + "description": "Segno (serpent)" + }, + "segnoSerpent2": { + "codepoint": "U+E04B", + "description": "Segno (serpent with vertical lines)" + }, + "semipitchedPercussionClef1": { + "codepoint": "U+E06B", + "description": "Semi-pitched percussion clef 1" + }, + "semipitchedPercussionClef2": { + "codepoint": "U+E06C", + "description": "Semi-pitched percussion clef 2" + }, + "smnFlat": { + "codepoint": "U+EC52", + "description": "Flat" + }, + "smnFlatWhite": { + "codepoint": "U+EC53", + "description": "Flat (white)" + }, + "smnHistoryDoubleFlat": { + "codepoint": "U+EC57", + "description": "Double flat history sign" + }, + "smnHistoryDoubleSharp": { + "codepoint": "U+EC55", + "description": "Double sharp history sign" + }, + "smnHistoryFlat": { + "codepoint": "U+EC56", + "description": "Flat history sign" + }, + "smnHistorySharp": { + "codepoint": "U+EC54", + "description": "Sharp history sign" + }, + "smnNatural": { + "codepoint": "U+EC58", + "description": "Natural (N)" + }, + "smnSharp": { + "codepoint": "U+EC50", + "description": "Sharp stem up" + }, + "smnSharpDown": { + "codepoint": "U+EC59", + "description": "Sharp stem down" + }, + "smnSharpWhite": { + "codepoint": "U+EC51", + "description": "Sharp (white) stem up" + }, + "smnSharpWhiteDown": { + "codepoint": "U+EC5A", + "description": "Sharp (white) stem down" + }, + "splitBarDivider": { + "codepoint": "U+E00A", + "description": "Split bar divider (bar spans a system break)" + }, + "staff1Line": { + "alternateCodepoint": "U+1D116", + "codepoint": "U+E010", + "description": "1-line staff" + }, + "staff1LineNarrow": { + "codepoint": "U+E01C", + "description": "1-line staff (narrow)" + }, + "staff1LineWide": { + "codepoint": "U+E016", + "description": "1-line staff (wide)" + }, + "staff2Lines": { + "alternateCodepoint": "U+1D117", + "codepoint": "U+E011", + "description": "2-line staff" + }, + "staff2LinesNarrow": { + "codepoint": "U+E01D", + "description": "2-line staff (narrow)" + }, + "staff2LinesWide": { + "codepoint": "U+E017", + "description": "2-line staff (wide)" + }, + "staff3Lines": { + "alternateCodepoint": "U+1D118", + "codepoint": "U+E012", + "description": "3-line staff" + }, + "staff3LinesNarrow": { + "codepoint": "U+E01E", + "description": "3-line staff (narrow)" + }, + "staff3LinesWide": { + "codepoint": "U+E018", + "description": "3-line staff (wide)" + }, + "staff4Lines": { + "alternateCodepoint": "U+1D119", + "codepoint": "U+E013", + "description": "4-line staff" + }, + "staff4LinesNarrow": { + "codepoint": "U+E01F", + "description": "4-line staff (narrow)" + }, + "staff4LinesWide": { + "codepoint": "U+E019", + "description": "4-line staff (wide)" + }, + "staff5Lines": { + "alternateCodepoint": "U+1D11A", + "codepoint": "U+E014", + "description": "5-line staff" + }, + "staff5LinesNarrow": { + "codepoint": "U+E020", + "description": "5-line staff (narrow)" + }, + "staff5LinesWide": { + "codepoint": "U+E01A", + "description": "5-line staff (wide)" + }, + "staff6Lines": { + "alternateCodepoint": "U+1D11B", + "codepoint": "U+E015", + "description": "6-line staff" + }, + "staff6LinesNarrow": { + "codepoint": "U+E021", + "description": "6-line staff (narrow)" + }, + "staff6LinesWide": { + "codepoint": "U+E01B", + "description": "6-line staff (wide)" + }, + "staffDivideArrowDown": { + "codepoint": "U+E00B", + "description": "Staff divide arrow down" + }, + "staffDivideArrowUp": { + "codepoint": "U+E00C", + "description": "Staff divide arrow up" + }, + "staffDivideArrowUpDown": { + "codepoint": "U+E00D", + "description": "Staff divide arrows" + }, + "staffPosLower1": { + "codepoint": "U+EB98", + "description": "Lower 1 staff position" + }, + "staffPosLower2": { + "codepoint": "U+EB99", + "description": "Lower 2 staff positions" + }, + "staffPosLower3": { + "codepoint": "U+EB9A", + "description": "Lower 3 staff positions" + }, + "staffPosLower4": { + "codepoint": "U+EB9B", + "description": "Lower 4 staff positions" + }, + "staffPosLower5": { + "codepoint": "U+EB9C", + "description": "Lower 5 staff positions" + }, + "staffPosLower6": { + "codepoint": "U+EB9D", + "description": "Lower 6 staff positions" + }, + "staffPosLower7": { + "codepoint": "U+EB9E", + "description": "Lower 7 staff positions" + }, + "staffPosLower8": { + "codepoint": "U+EB9F", + "description": "Lower 8 staff positions" + }, + "staffPosRaise1": { + "codepoint": "U+EB90", + "description": "Raise 1 staff position" + }, + "staffPosRaise2": { + "codepoint": "U+EB91", + "description": "Raise 2 staff positions" + }, + "staffPosRaise3": { + "codepoint": "U+EB92", + "description": "Raise 3 staff positions" + }, + "staffPosRaise4": { + "codepoint": "U+EB93", + "description": "Raise 4 staff positions" + }, + "staffPosRaise5": { + "codepoint": "U+EB94", + "description": "Raise 5 staff positions" + }, + "staffPosRaise6": { + "codepoint": "U+EB95", + "description": "Raise 6 staff positions" + }, + "staffPosRaise7": { + "codepoint": "U+EB96", + "description": "Raise 7 staff positions" + }, + "staffPosRaise8": { + "codepoint": "U+EB97", + "description": "Raise 8 staff positions" + }, + "stem": { + "alternateCodepoint": "U+1D165", + "codepoint": "U+E210", + "description": "Combining stem" + }, + "stemBowOnBridge": { + "codepoint": "U+E215", + "description": "Combining bow on bridge stem" + }, + "stemBowOnTailpiece": { + "codepoint": "U+E216", + "description": "Combining bow on tailpiece stem" + }, + "stemBuzzRoll": { + "codepoint": "U+E217", + "description": "Combining buzz roll stem" + }, + "stemDamp": { + "codepoint": "U+E218", + "description": "Combining damp stem" + }, + "stemHarpStringNoise": { + "codepoint": "U+E21F", + "description": "Combining harp string noise stem" + }, + "stemMultiphonicsBlack": { + "codepoint": "U+E21A", + "description": "Combining multiphonics (black) stem" + }, + "stemMultiphonicsBlackWhite": { + "codepoint": "U+E21C", + "description": "Combining multiphonics (black and white) stem" + }, + "stemMultiphonicsWhite": { + "codepoint": "U+E21B", + "description": "Combining multiphonics (white) stem" + }, + "stemPendereckiTremolo": { + "codepoint": "U+E213", + "description": "Combining Penderecki unmeasured tremolo stem" + }, + "stemRimShot": { + "codepoint": "U+E21E", + "description": "Combining rim shot stem" + }, + "stemSprechgesang": { + "alternateCodepoint": "U+1D166", + "codepoint": "U+E211", + "description": "Combining sprechgesang stem" + }, + "stemSulPonticello": { + "codepoint": "U+E214", + "description": "Combining sul ponticello (bow behind bridge) stem" + }, + "stemSussurando": { + "codepoint": "U+E21D", + "description": "Combining sussurando stem" + }, + "stemSwished": { + "codepoint": "U+E212", + "description": "Combining swished stem" + }, + "stemVibratoPulse": { + "codepoint": "U+E219", + "description": "Combining vibrato pulse accent (Saunders) stem" + }, + "stockhausenTremolo": { + "codepoint": "U+E232", + "description": "Stockhausen irregular tremolo (\"Morsen\", like Morse code)" + }, + "stringsBowBehindBridge": { + "codepoint": "U+E618", + "description": "Bow behind bridge (sul ponticello)" + }, + "stringsBowBehindBridgeFourStrings": { + "codepoint": "U+E62A", + "description": "Bow behind bridge on four strings" + }, + "stringsBowBehindBridgeOneString": { + "codepoint": "U+E627", + "description": "Bow behind bridge on one string" + }, + "stringsBowBehindBridgeThreeStrings": { + "codepoint": "U+E629", + "description": "Bow behind bridge on three strings" + }, + "stringsBowBehindBridgeTwoStrings": { + "codepoint": "U+E628", + "description": "Bow behind bridge on two strings" + }, + "stringsBowOnBridge": { + "codepoint": "U+E619", + "description": "Bow on top of bridge" + }, + "stringsBowOnTailpiece": { + "codepoint": "U+E61A", + "description": "Bow on tailpiece" + }, + "stringsChangeBowDirection": { + "codepoint": "U+E626", + "description": "Change bow direction, indeterminate" + }, + "stringsDownBow": { + "alternateCodepoint": "U+1D1AA", + "codepoint": "U+E610", + "description": "Down bow" + }, + "stringsDownBowAwayFromBody": { + "codepoint": "U+EE82", + "description": "Down bow, away from body" + }, + "stringsDownBowBeyondBridge": { + "codepoint": "U+EE84", + "description": "Down bow, beyond bridge" + }, + "stringsDownBowTowardsBody": { + "codepoint": "U+EE80", + "description": "Down bow, towards body" + }, + "stringsDownBowTurned": { + "codepoint": "U+E611", + "description": "Turned down bow" + }, + "stringsFouette": { + "codepoint": "U+E622", + "description": "Fouett\u00e9" + }, + "stringsHalfHarmonic": { + "codepoint": "U+E615", + "description": "Half-harmonic" + }, + "stringsHarmonic": { + "alternateCodepoint": "U+1D1AC", + "codepoint": "U+E614", + "description": "Harmonic" + }, + "stringsJeteAbove": { + "codepoint": "U+E620", + "description": "Jet\u00e9 (gettato) above" + }, + "stringsJeteBelow": { + "codepoint": "U+E621", + "description": "Jet\u00e9 (gettato) below" + }, + "stringsMuteOff": { + "codepoint": "U+E617", + "description": "Mute off" + }, + "stringsMuteOn": { + "codepoint": "U+E616", + "description": "Mute on" + }, + "stringsOverpressureDownBow": { + "codepoint": "U+E61B", + "description": "Overpressure, down bow" + }, + "stringsOverpressureNoDirection": { + "codepoint": "U+E61F", + "description": "Overpressure, no bow direction" + }, + "stringsOverpressurePossibileDownBow": { + "codepoint": "U+E61D", + "description": "Overpressure possibile, down bow" + }, + "stringsOverpressurePossibileUpBow": { + "codepoint": "U+E61E", + "description": "Overpressure possibile, up bow" + }, + "stringsOverpressureUpBow": { + "codepoint": "U+E61C", + "description": "Overpressure, up bow" + }, + "stringsScrapeCircularClockwise": { + "codepoint": "U+EE88", + "description": "Scrape, circular clockwise" + }, + "stringsScrapeCircularCounterclockwise": { + "codepoint": "U+EE89", + "description": "Scrape, circular counter-clockwise" + }, + "stringsScrapeParallelInward": { + "codepoint": "U+EE86", + "description": "Scrape, parallel inward" + }, + "stringsScrapeParallelOutward": { + "codepoint": "U+EE87", + "description": "Scrape, parallel outward" + }, + "stringsThumbPosition": { + "codepoint": "U+E624", + "description": "Thumb position" + }, + "stringsThumbPositionTurned": { + "codepoint": "U+E625", + "description": "Turned thumb position" + }, + "stringsTripleChopInward": { + "codepoint": "U+EE8A", + "description": "Triple chop, inward" + }, + "stringsTripleChopOutward": { + "codepoint": "U+EE8B", + "description": "Triple chop, outward" + }, + "stringsUpBow": { + "alternateCodepoint": "U+1D1AB", + "codepoint": "U+E612", + "description": "Up bow" + }, + "stringsUpBowAwayFromBody": { + "codepoint": "U+EE83", + "description": "Up bow, away from body" + }, + "stringsUpBowBeyondBridge": { + "codepoint": "U+EE85", + "description": "Up bow, beyond bridge" + }, + "stringsUpBowTowardsBody": { + "codepoint": "U+EE81", + "description": "Up bow, towards body" + }, + "stringsUpBowTurned": { + "codepoint": "U+E613", + "description": "Turned up bow" + }, + "stringsVibratoPulse": { + "codepoint": "U+E623", + "description": "Vibrato pulse accent (Saunders) for stem" + }, + "swissRudimentsNoteheadBlackDouble": { + "codepoint": "U+EE72", + "description": "Swiss rudiments doubl\u00e9 black notehead" + }, + "swissRudimentsNoteheadBlackFlam": { + "codepoint": "U+EE70", + "description": "Swiss rudiments flam black notehead" + }, + "swissRudimentsNoteheadHalfDouble": { + "codepoint": "U+EE73", + "description": "Swiss rudiments doubl\u00e9 half (minim) notehead" + }, + "swissRudimentsNoteheadHalfFlam": { + "codepoint": "U+EE71", + "description": "Swiss rudiments flam half (minim) notehead" + }, + "systemDivider": { + "codepoint": "U+E007", + "description": "System divider" + }, + "systemDividerExtraLong": { + "codepoint": "U+E009", + "description": "Extra long system divider" + }, + "systemDividerLong": { + "codepoint": "U+E008", + "description": "Long system divider" + }, + "textAugmentationDot": { + "codepoint": "U+E1FC", + "description": "Augmentation dot" + }, + "textBlackNoteFrac16thLongStem": { + "codepoint": "U+E1F5", + "description": "Black note, fractional 16th beam, long stem" + }, + "textBlackNoteFrac16thShortStem": { + "codepoint": "U+E1F4", + "description": "Black note, fractional 16th beam, short stem" + }, + "textBlackNoteFrac32ndLongStem": { + "codepoint": "U+E1F6", + "description": "Black note, fractional 32nd beam, long stem" + }, + "textBlackNoteFrac8thLongStem": { + "codepoint": "U+E1F3", + "description": "Black note, fractional 8th beam, long stem" + }, + "textBlackNoteFrac8thShortStem": { + "codepoint": "U+E1F2", + "description": "Black note, fractional 8th beam, short stem" + }, + "textBlackNoteLongStem": { + "codepoint": "U+E1F1", + "description": "Black note, long stem" + }, + "textBlackNoteShortStem": { + "codepoint": "U+E1F0", + "description": "Black note, short stem" + }, + "textCont16thBeamLongStem": { + "codepoint": "U+E1FA", + "description": "Continuing 16th beam for long stem" + }, + "textCont16thBeamShortStem": { + "codepoint": "U+E1F9", + "description": "Continuing 16th beam for short stem" + }, + "textCont32ndBeamLongStem": { + "codepoint": "U+E1FB", + "description": "Continuing 32nd beam for long stem" + }, + "textCont8thBeamLongStem": { + "codepoint": "U+E1F8", + "description": "Continuing 8th beam for long stem" + }, + "textCont8thBeamShortStem": { + "codepoint": "U+E1F7", + "description": "Continuing 8th beam for short stem" + }, + "textHeadlessBlackNoteFrac16thLongStem": { + "codepoint": "U+E209", + "description": "Headless black note, fractional 16th beam, long stem" + }, + "textHeadlessBlackNoteFrac16thShortStem": { + "codepoint": "U+E208", + "description": "Headless black note, fractional 16th beam, short stem" + }, + "textHeadlessBlackNoteFrac32ndLongStem": { + "codepoint": "U+E20A", + "description": "Headless black note, fractional 32nd beam, long stem" + }, + "textHeadlessBlackNoteFrac8thLongStem": { + "codepoint": "U+E207", + "description": "Headless black note, fractional 8th beam, long stem" + }, + "textHeadlessBlackNoteFrac8thShortStem": { + "codepoint": "U+E206", + "description": "Headless black note, fractional 8th beam, short stem" + }, + "textHeadlessBlackNoteLongStem": { + "codepoint": "U+E205", + "description": "Headless black note, long stem" + }, + "textHeadlessBlackNoteShortStem": { + "codepoint": "U+E204", + "description": "Headless black note, short stem" + }, + "textTie": { + "codepoint": "U+E1FD", + "description": "Tie" + }, + "textTuplet3LongStem": { + "codepoint": "U+E202", + "description": "Tuplet number 3 for long stem" + }, + "textTuplet3ShortStem": { + "codepoint": "U+E1FF", + "description": "Tuplet number 3 for short stem" + }, + "textTupletBracketEndLongStem": { + "codepoint": "U+E203", + "description": "Tuplet bracket end for long stem" + }, + "textTupletBracketEndShortStem": { + "codepoint": "U+E200", + "description": "Tuplet bracket end for short stem" + }, + "textTupletBracketStartLongStem": { + "codepoint": "U+E201", + "description": "Tuplet bracket start for long stem" + }, + "textTupletBracketStartShortStem": { + "codepoint": "U+E1FE", + "description": "Tuplet bracket start for short stem" + }, + "timeSig0": { + "codepoint": "U+E080", + "description": "Time signature 0" + }, + "timeSig0Reversed": { + "codepoint": "U+ECF0", + "description": "Reversed time signature 0" + }, + "timeSig0Turned": { + "codepoint": "U+ECE0", + "description": "Turned time signature 0" + }, + "timeSig1": { + "codepoint": "U+E081", + "description": "Time signature 1" + }, + "timeSig1Reversed": { + "codepoint": "U+ECF1", + "description": "Reversed time signature 1" + }, + "timeSig1Turned": { + "codepoint": "U+ECE1", + "description": "Turned time signature 1" + }, + "timeSig2": { + "codepoint": "U+E082", + "description": "Time signature 2" + }, + "timeSig2Reversed": { + "codepoint": "U+ECF2", + "description": "Reversed time signature 2" + }, + "timeSig2Turned": { + "codepoint": "U+ECE2", + "description": "Turned time signature 2" + }, + "timeSig3": { + "codepoint": "U+E083", + "description": "Time signature 3" + }, + "timeSig3Reversed": { + "codepoint": "U+ECF3", + "description": "Reversed time signature 3" + }, + "timeSig3Turned": { + "codepoint": "U+ECE3", + "description": "Turned time signature 3" + }, + "timeSig4": { + "codepoint": "U+E084", + "description": "Time signature 4" + }, + "timeSig4Reversed": { + "codepoint": "U+ECF4", + "description": "Reversed time signature 4" + }, + "timeSig4Turned": { + "codepoint": "U+ECE4", + "description": "Turned time signature 4" + }, + "timeSig5": { + "codepoint": "U+E085", + "description": "Time signature 5" + }, + "timeSig5Reversed": { + "codepoint": "U+ECF5", + "description": "Reversed time signature 5" + }, + "timeSig5Turned": { + "codepoint": "U+ECE5", + "description": "Turned time signature 5" + }, + "timeSig6": { + "codepoint": "U+E086", + "description": "Time signature 6" + }, + "timeSig6Reversed": { + "codepoint": "U+ECF6", + "description": "Reversed time signature 6" + }, + "timeSig6Turned": { + "codepoint": "U+ECE6", + "description": "Turned time signature 6" + }, + "timeSig7": { + "codepoint": "U+E087", + "description": "Time signature 7" + }, + "timeSig7Reversed": { + "codepoint": "U+ECF7", + "description": "Reversed time signature 7" + }, + "timeSig7Turned": { + "codepoint": "U+ECE7", + "description": "Turned time signature 7" + }, + "timeSig8": { + "codepoint": "U+E088", + "description": "Time signature 8" + }, + "timeSig8Reversed": { + "codepoint": "U+ECF8", + "description": "Reversed time signature 8" + }, + "timeSig8Turned": { + "codepoint": "U+ECE8", + "description": "Turned time signature 8" + }, + "timeSig9": { + "codepoint": "U+E089", + "description": "Time signature 9" + }, + "timeSig9Reversed": { + "codepoint": "U+ECF9", + "description": "Reversed time signature 9" + }, + "timeSig9Turned": { + "codepoint": "U+ECE9", + "description": "Turned time signature 9" + }, + "timeSigBracketLeft": { + "codepoint": "U+EC80", + "description": "Left bracket for whole time signature" + }, + "timeSigBracketLeftSmall": { + "codepoint": "U+EC82", + "description": "Left bracket for numerator only" + }, + "timeSigBracketRight": { + "codepoint": "U+EC81", + "description": "Right bracket for whole time signature" + }, + "timeSigBracketRightSmall": { + "codepoint": "U+EC83", + "description": "Right bracket for numerator only" + }, + "timeSigCombDenominator": { + "codepoint": "U+E09F", + "description": "Control character for denominator digit" + }, + "timeSigCombNumerator": { + "codepoint": "U+E09E", + "description": "Control character for numerator digit" + }, + "timeSigComma": { + "codepoint": "U+E096", + "description": "Time signature comma" + }, + "timeSigCommon": { + "alternateCodepoint": "U+1D134", + "codepoint": "U+E08A", + "description": "Common time" + }, + "timeSigCommonReversed": { + "codepoint": "U+ECFA", + "description": "Reversed common time" + }, + "timeSigCommonTurned": { + "codepoint": "U+ECEA", + "description": "Turned common time" + }, + "timeSigCut2": { + "codepoint": "U+EC85", + "description": "Cut time (Bach)" + }, + "timeSigCut3": { + "codepoint": "U+EC86", + "description": "Cut triple time (9/8)" + }, + "timeSigCutCommon": { + "alternateCodepoint": "U+1D135", + "codepoint": "U+E08B", + "description": "Cut time" + }, + "timeSigCutCommonReversed": { + "codepoint": "U+ECFB", + "description": "Reversed cut time" + }, + "timeSigCutCommonTurned": { + "codepoint": "U+ECEB", + "description": "Turned cut time" + }, + "timeSigEquals": { + "codepoint": "U+E08F", + "description": "Time signature equals" + }, + "timeSigFractionHalf": { + "codepoint": "U+E098", + "description": "Time signature fraction \u00bd" + }, + "timeSigFractionOneThird": { + "codepoint": "U+E09A", + "description": "Time signature fraction \u2153" + }, + "timeSigFractionQuarter": { + "codepoint": "U+E097", + "description": "Time signature fraction \u00bc" + }, + "timeSigFractionThreeQuarters": { + "codepoint": "U+E099", + "description": "Time signature fraction \u00be" + }, + "timeSigFractionTwoThirds": { + "codepoint": "U+E09B", + "description": "Time signature fraction \u2154" + }, + "timeSigFractionalSlash": { + "codepoint": "U+E08E", + "description": "Time signature fraction slash" + }, + "timeSigMinus": { + "codepoint": "U+E090", + "description": "Time signature minus" + }, + "timeSigMultiply": { + "codepoint": "U+E091", + "description": "Time signature multiply" + }, + "timeSigOpenPenderecki": { + "codepoint": "U+E09D", + "description": "Open time signature (Penderecki)" + }, + "timeSigParensLeft": { + "codepoint": "U+E094", + "description": "Left parenthesis for whole time signature" + }, + "timeSigParensLeftSmall": { + "codepoint": "U+E092", + "description": "Left parenthesis for numerator only" + }, + "timeSigParensRight": { + "codepoint": "U+E095", + "description": "Right parenthesis for whole time signature" + }, + "timeSigParensRightSmall": { + "codepoint": "U+E093", + "description": "Right parenthesis for numerator only" + }, + "timeSigPlus": { + "codepoint": "U+E08C", + "description": "Time signature +" + }, + "timeSigPlusSmall": { + "codepoint": "U+E08D", + "description": "Time signature + (for numerators)" + }, + "timeSigSlash": { + "codepoint": "U+EC84", + "description": "Time signature slash separator" + }, + "timeSigX": { + "codepoint": "U+E09C", + "description": "Open time signature" + }, + "tremolo1": { + "alternateCodepoint": "U+1D167", + "codepoint": "U+E220", + "description": "Combining tremolo 1" + }, + "tremolo2": { + "alternateCodepoint": "U+1D168", + "codepoint": "U+E221", + "description": "Combining tremolo 2" + }, + "tremolo3": { + "alternateCodepoint": "U+1D169", + "codepoint": "U+E222", + "description": "Combining tremolo 3" + }, + "tremolo4": { + "codepoint": "U+E223", + "description": "Combining tremolo 4" + }, + "tremolo5": { + "codepoint": "U+E224", + "description": "Combining tremolo 5" + }, + "tremoloDivisiDots2": { + "codepoint": "U+E22E", + "description": "Divide measured tremolo by 2" + }, + "tremoloDivisiDots3": { + "codepoint": "U+E22F", + "description": "Divide measured tremolo by 3" + }, + "tremoloDivisiDots4": { + "codepoint": "U+E230", + "description": "Divide measured tremolo by 4" + }, + "tremoloDivisiDots6": { + "codepoint": "U+E231", + "description": "Divide measured tremolo by 6" + }, + "tremoloFingered1": { + "alternateCodepoint": "U+1D16A", + "codepoint": "U+E225", + "description": "Fingered tremolo 1" + }, + "tremoloFingered2": { + "alternateCodepoint": "U+1D16B", + "codepoint": "U+E226", + "description": "Fingered tremolo 2" + }, + "tremoloFingered3": { + "alternateCodepoint": "U+1D16C", + "codepoint": "U+E227", + "description": "Fingered tremolo 3" + }, + "tremoloFingered4": { + "codepoint": "U+E228", + "description": "Fingered tremolo 4" + }, + "tremoloFingered5": { + "codepoint": "U+E229", + "description": "Fingered tremolo 5" + }, + "tripleTongueAbove": { + "alternateCodepoint": "U+1D18B", + "codepoint": "U+E5F2", + "description": "Triple-tongue above" + }, + "tripleTongueBelow": { + "codepoint": "U+E5F3", + "description": "Triple-tongue below" + }, + "tuplet0": { + "codepoint": "U+E880", + "description": "Tuplet 0" + }, + "tuplet1": { + "codepoint": "U+E881", + "description": "Tuplet 1" + }, + "tuplet2": { + "codepoint": "U+E882", + "description": "Tuplet 2" + }, + "tuplet3": { + "codepoint": "U+E883", + "description": "Tuplet 3" + }, + "tuplet4": { + "codepoint": "U+E884", + "description": "Tuplet 4" + }, + "tuplet5": { + "codepoint": "U+E885", + "description": "Tuplet 5" + }, + "tuplet6": { + "codepoint": "U+E886", + "description": "Tuplet 6" + }, + "tuplet7": { + "codepoint": "U+E887", + "description": "Tuplet 7" + }, + "tuplet8": { + "codepoint": "U+E888", + "description": "Tuplet 8" + }, + "tuplet9": { + "codepoint": "U+E889", + "description": "Tuplet 9" + }, + "tupletBracketLeftItalic": { + "codepoint": "U+EF14", + "description": "Opening bracket italic" + }, + "tupletBracketLeftRoman": { + "codepoint": "U+EF16", + "description": "Opening bracket roman" + }, + "tupletBracketRightItalic": { + "codepoint": "U+EF15", + "description": "Closing bracket italic" + }, + "tupletBracketRightRoman": { + "codepoint": "U+EF17", + "description": "Closing bracket roman" + }, + "tupletColon": { + "codepoint": "U+E88A", + "description": "Tuplet colon" + }, + "tupletParenthesisLeftItalic": { + "codepoint": "U+EF10", + "description": "Opening parenthesis italic" + }, + "tupletParenthesisLeftRoman": { + "codepoint": "U+EF12", + "description": "Opening parenthesis roman" + }, + "tupletParenthesisRightItalic": { + "codepoint": "U+EF11", + "description": "Closing parenthesis italic" + }, + "tupletParenthesisRightRoman": { + "codepoint": "U+EF13", + "description": "Closing parenthesis roman" + }, + "unmeasuredTremolo": { + "codepoint": "U+E22C", + "description": "Wieniawski unmeasured tremolo" + }, + "unmeasuredTremoloSimple": { + "codepoint": "U+E22D", + "description": "Wieniawski unmeasured tremolo (simpler)" + }, + "unpitchedPercussionClef1": { + "alternateCodepoint": "U+1D125", + "codepoint": "U+E069", + "description": "Unpitched percussion clef 1" + }, + "unpitchedPercussionClef2": { + "alternateCodepoint": "U+1D126", + "codepoint": "U+E06A", + "description": "Unpitched percussion clef 2" + }, + "ventiduesima": { + "codepoint": "U+E517", + "description": "Ventiduesima" + }, + "ventiduesimaAlta": { + "codepoint": "U+E518", + "description": "Ventiduesima alta" + }, + "ventiduesimaBassa": { + "codepoint": "U+E519", + "description": "Ventiduesima bassa" + }, + "ventiduesimaBassaMb": { + "codepoint": "U+E51E", + "description": "Ventiduesima bassa (mb)" + }, + "vocalFingerClickStockhausen": { + "codepoint": "U+E649", + "description": "Finger click (Stockhausen)" + }, + "vocalHalbGesungen": { + "codepoint": "U+E64B", + "description": "Halb gesungen (semi-sprechgesang)" + }, + "vocalMouthClosed": { + "codepoint": "U+E640", + "description": "Mouth closed" + }, + "vocalMouthOpen": { + "codepoint": "U+E642", + "description": "Mouth open" + }, + "vocalMouthPursed": { + "codepoint": "U+E644", + "description": "Mouth pursed" + }, + "vocalMouthSlightlyOpen": { + "codepoint": "U+E641", + "description": "Mouth slightly open" + }, + "vocalMouthWideOpen": { + "codepoint": "U+E643", + "description": "Mouth wide open" + }, + "vocalNasalVoice": { + "codepoint": "U+E647", + "description": "Nasal voice" + }, + "vocalSprechgesang": { + "codepoint": "U+E645", + "description": "Sprechgesang" + }, + "vocalTongueClickStockhausen": { + "codepoint": "U+E648", + "description": "Tongue click (Stockhausen)" + }, + "vocalTongueFingerClickStockhausen": { + "codepoint": "U+E64A", + "description": "Tongue and finger click (Stockhausen)" + }, + "vocalsSussurando": { + "codepoint": "U+E646", + "description": "Combining sussurando for stem" + }, + "wiggleArpeggiatoDown": { + "codepoint": "U+EAAA", + "description": "Arpeggiato wiggle segment, downwards" + }, + "wiggleArpeggiatoDownArrow": { + "codepoint": "U+EAAE", + "description": "Arpeggiato arrowhead down" + }, + "wiggleArpeggiatoDownSwash": { + "codepoint": "U+EAAC", + "description": "Arpeggiato downward swash" + }, + "wiggleArpeggiatoUp": { + "codepoint": "U+EAA9", + "description": "Arpeggiato wiggle segment, upwards" + }, + "wiggleArpeggiatoUpArrow": { + "codepoint": "U+EAAD", + "description": "Arpeggiato arrowhead up" + }, + "wiggleArpeggiatoUpSwash": { + "codepoint": "U+EAAB", + "description": "Arpeggiato upward swash" + }, + "wiggleCircular": { + "codepoint": "U+EAC9", + "description": "Circular motion segment" + }, + "wiggleCircularConstant": { + "codepoint": "U+EAC0", + "description": "Constant circular motion segment" + }, + "wiggleCircularConstantFlipped": { + "codepoint": "U+EAC1", + "description": "Constant circular motion segment (flipped)" + }, + "wiggleCircularConstantFlippedLarge": { + "codepoint": "U+EAC3", + "description": "Constant circular motion segment (flipped, large)" + }, + "wiggleCircularConstantLarge": { + "codepoint": "U+EAC2", + "description": "Constant circular motion segment (large)" + }, + "wiggleCircularEnd": { + "codepoint": "U+EACB", + "description": "Circular motion end" + }, + "wiggleCircularLarge": { + "codepoint": "U+EAC8", + "description": "Circular motion segment, large" + }, + "wiggleCircularLarger": { + "codepoint": "U+EAC7", + "description": "Circular motion segment, larger" + }, + "wiggleCircularLargerStill": { + "codepoint": "U+EAC6", + "description": "Circular motion segment, larger still" + }, + "wiggleCircularLargest": { + "codepoint": "U+EAC5", + "description": "Circular motion segment, largest" + }, + "wiggleCircularSmall": { + "codepoint": "U+EACA", + "description": "Circular motion segment, small" + }, + "wiggleCircularStart": { + "codepoint": "U+EAC4", + "description": "Circular motion start" + }, + "wiggleGlissando": { + "codepoint": "U+EAAF", + "description": "Glissando wiggle segment" + }, + "wiggleGlissandoGroup1": { + "codepoint": "U+EABD", + "description": "Group glissando 1" + }, + "wiggleGlissandoGroup2": { + "codepoint": "U+EABE", + "description": "Group glissando 2" + }, + "wiggleGlissandoGroup3": { + "codepoint": "U+EABF", + "description": "Group glissando 3" + }, + "wiggleRandom1": { + "codepoint": "U+EAF0", + "description": "Quasi-random squiggle 1" + }, + "wiggleRandom2": { + "codepoint": "U+EAF1", + "description": "Quasi-random squiggle 2" + }, + "wiggleRandom3": { + "codepoint": "U+EAF2", + "description": "Quasi-random squiggle 3" + }, + "wiggleRandom4": { + "codepoint": "U+EAF3", + "description": "Quasi-random squiggle 4" + }, + "wiggleSawtooth": { + "codepoint": "U+EABB", + "description": "Sawtooth line segment" + }, + "wiggleSawtoothNarrow": { + "codepoint": "U+EABA", + "description": "Narrow sawtooth line segment" + }, + "wiggleSawtoothWide": { + "codepoint": "U+EABC", + "description": "Wide sawtooth line segment" + }, + "wiggleSquareWave": { + "codepoint": "U+EAB8", + "description": "Square wave line segment" + }, + "wiggleSquareWaveNarrow": { + "codepoint": "U+EAB7", + "description": "Narrow square wave line segment" + }, + "wiggleSquareWaveWide": { + "codepoint": "U+EAB9", + "description": "Wide square wave line segment" + }, + "wiggleTrill": { + "codepoint": "U+EAA4", + "description": "Trill wiggle segment" + }, + "wiggleTrillFast": { + "codepoint": "U+EAA3", + "description": "Trill wiggle segment, fast" + }, + "wiggleTrillFaster": { + "codepoint": "U+EAA2", + "description": "Trill wiggle segment, faster" + }, + "wiggleTrillFasterStill": { + "codepoint": "U+EAA1", + "description": "Trill wiggle segment, faster still" + }, + "wiggleTrillFastest": { + "codepoint": "U+EAA0", + "description": "Trill wiggle segment, fastest" + }, + "wiggleTrillSlow": { + "codepoint": "U+EAA5", + "description": "Trill wiggle segment, slow" + }, + "wiggleTrillSlower": { + "codepoint": "U+EAA6", + "description": "Trill wiggle segment, slower" + }, + "wiggleTrillSlowerStill": { + "codepoint": "U+EAA7", + "description": "Trill wiggle segment, slower still" + }, + "wiggleTrillSlowest": { + "codepoint": "U+EAA8", + "description": "Trill wiggle segment, slowest" + }, + "wiggleVIbratoLargestSlower": { + "codepoint": "U+EAEE", + "description": "Vibrato largest, slower" + }, + "wiggleVIbratoMediumSlower": { + "codepoint": "U+EAE0", + "description": "Vibrato medium, slower" + }, + "wiggleVibrato": { + "codepoint": "U+EAB0", + "description": "Vibrato / shake wiggle segment" + }, + "wiggleVibratoLargeFast": { + "codepoint": "U+EAE5", + "description": "Vibrato large, fast" + }, + "wiggleVibratoLargeFaster": { + "codepoint": "U+EAE4", + "description": "Vibrato large, faster" + }, + "wiggleVibratoLargeFasterStill": { + "codepoint": "U+EAE3", + "description": "Vibrato large, faster still" + }, + "wiggleVibratoLargeFastest": { + "codepoint": "U+EAE2", + "description": "Vibrato large, fastest" + }, + "wiggleVibratoLargeSlow": { + "codepoint": "U+EAE6", + "description": "Vibrato large, slow" + }, + "wiggleVibratoLargeSlower": { + "codepoint": "U+EAE7", + "description": "Vibrato large, slower" + }, + "wiggleVibratoLargeSlowest": { + "codepoint": "U+EAE8", + "description": "Vibrato large, slowest" + }, + "wiggleVibratoLargestFast": { + "codepoint": "U+EAEC", + "description": "Vibrato largest, fast" + }, + "wiggleVibratoLargestFaster": { + "codepoint": "U+EAEB", + "description": "Vibrato largest, faster" + }, + "wiggleVibratoLargestFasterStill": { + "codepoint": "U+EAEA", + "description": "Vibrato largest, faster still" + }, + "wiggleVibratoLargestFastest": { + "codepoint": "U+EAE9", + "description": "Vibrato largest, fastest" + }, + "wiggleVibratoLargestSlow": { + "codepoint": "U+EAED", + "description": "Vibrato largest, slow" + }, + "wiggleVibratoLargestSlowest": { + "codepoint": "U+EAEF", + "description": "Vibrato largest, slowest" + }, + "wiggleVibratoMediumFast": { + "codepoint": "U+EADE", + "description": "Vibrato medium, fast" + }, + "wiggleVibratoMediumFaster": { + "codepoint": "U+EADD", + "description": "Vibrato medium, faster" + }, + "wiggleVibratoMediumFasterStill": { + "codepoint": "U+EADC", + "description": "Vibrato medium, faster still" + }, + "wiggleVibratoMediumFastest": { + "codepoint": "U+EADB", + "description": "Vibrato medium, fastest" + }, + "wiggleVibratoMediumSlow": { + "codepoint": "U+EADF", + "description": "Vibrato medium, slow" + }, + "wiggleVibratoMediumSlowest": { + "codepoint": "U+EAE1", + "description": "Vibrato medium, slowest" + }, + "wiggleVibratoSmallFast": { + "codepoint": "U+EAD7", + "description": "Vibrato small, fast" + }, + "wiggleVibratoSmallFaster": { + "codepoint": "U+EAD6", + "description": "Vibrato small, faster" + }, + "wiggleVibratoSmallFasterStill": { + "codepoint": "U+EAD5", + "description": "Vibrato small, faster still" + }, + "wiggleVibratoSmallFastest": { + "codepoint": "U+EAD4", + "description": "Vibrato small, fastest" + }, + "wiggleVibratoSmallSlow": { + "codepoint": "U+EAD8", + "description": "Vibrato small, slow" + }, + "wiggleVibratoSmallSlower": { + "codepoint": "U+EAD9", + "description": "Vibrato small, slower" + }, + "wiggleVibratoSmallSlowest": { + "codepoint": "U+EADA", + "description": "Vibrato small, slowest" + }, + "wiggleVibratoSmallestFast": { + "codepoint": "U+EAD0", + "description": "Vibrato smallest, fast" + }, + "wiggleVibratoSmallestFaster": { + "codepoint": "U+EACF", + "description": "Vibrato smallest, faster" + }, + "wiggleVibratoSmallestFasterStill": { + "codepoint": "U+EACE", + "description": "Vibrato smallest, faster still" + }, + "wiggleVibratoSmallestFastest": { + "codepoint": "U+EACD", + "description": "Vibrato smallest, fastest" + }, + "wiggleVibratoSmallestSlow": { + "codepoint": "U+EAD1", + "description": "Vibrato smallest, slow" + }, + "wiggleVibratoSmallestSlower": { + "codepoint": "U+EAD2", + "description": "Vibrato smallest, slower" + }, + "wiggleVibratoSmallestSlowest": { + "codepoint": "U+EAD3", + "description": "Vibrato smallest, slowest" + }, + "wiggleVibratoStart": { + "codepoint": "U+EACC", + "description": "Vibrato start" + }, + "wiggleVibratoWide": { + "codepoint": "U+EAB1", + "description": "Wide vibrato / shake wiggle segment" + }, + "wiggleWavy": { + "codepoint": "U+EAB5", + "description": "Wavy line segment" + }, + "wiggleWavyNarrow": { + "codepoint": "U+EAB4", + "description": "Narrow wavy line segment" + }, + "wiggleWavyWide": { + "codepoint": "U+EAB6", + "description": "Wide wavy line segment" + }, + "windClosedHole": { + "codepoint": "U+E5F4", + "description": "Closed hole" + }, + "windFlatEmbouchure": { + "codepoint": "U+E5FB", + "description": "Flatter embouchure" + }, + "windHalfClosedHole1": { + "codepoint": "U+E5F6", + "description": "Half-closed hole" + }, + "windHalfClosedHole2": { + "codepoint": "U+E5F7", + "description": "Half-closed hole 2" + }, + "windHalfClosedHole3": { + "codepoint": "U+E5F8", + "description": "Half-open hole" + }, + "windLessRelaxedEmbouchure": { + "codepoint": "U+E5FE", + "description": "Somewhat relaxed embouchure" + }, + "windLessTightEmbouchure": { + "codepoint": "U+E600", + "description": "Somewhat tight embouchure" + }, + "windMouthpiecePop": { + "codepoint": "U+E60A", + "description": "Mouthpiece or hand pop" + }, + "windMultiphonicsBlackStem": { + "codepoint": "U+E607", + "description": "Combining multiphonics (black) for stem" + }, + "windMultiphonicsBlackWhiteStem": { + "codepoint": "U+E609", + "description": "Combining multiphonics (black and white) for stem" + }, + "windMultiphonicsWhiteStem": { + "codepoint": "U+E608", + "description": "Combining multiphonics (white) for stem" + }, + "windOpenHole": { + "codepoint": "U+E5F9", + "description": "Open hole" + }, + "windReedPositionIn": { + "codepoint": "U+E606", + "description": "Much more reed (push inwards)" + }, + "windReedPositionNormal": { + "codepoint": "U+E604", + "description": "Normal reed position" + }, + "windReedPositionOut": { + "codepoint": "U+E605", + "description": "Very little reed (pull outwards)" + }, + "windRelaxedEmbouchure": { + "codepoint": "U+E5FD", + "description": "Relaxed embouchure" + }, + "windRimOnly": { + "codepoint": "U+E60B", + "description": "Rim only" + }, + "windSharpEmbouchure": { + "codepoint": "U+E5FC", + "description": "Sharper embouchure" + }, + "windStrongAirPressure": { + "codepoint": "U+E603", + "description": "Very tight embouchure / strong air pressure" + }, + "windThreeQuartersClosedHole": { + "codepoint": "U+E5F5", + "description": "Three-quarters closed hole" + }, + "windTightEmbouchure": { + "codepoint": "U+E5FF", + "description": "Tight embouchure" + }, + "windTrillKey": { + "codepoint": "U+E5FA", + "description": "Trill key" + }, + "windVeryTightEmbouchure": { + "codepoint": "U+E601", + "description": "Very tight embouchure" + }, + "windWeakAirPressure": { + "codepoint": "U+E602", + "description": "Very relaxed embouchure / weak air-pressure" + } +} diff --git a/tests/fixtures/engraving-python.png b/tests/fixtures/engraving-python.png new file mode 100644 index 0000000000000000000000000000000000000000..299ade42059f2caa8ae0244a2800cfe626ce6fdb GIT binary patch literal 32324 zcmd43cRZE>f9;7dn5tDx&1HP++i%}837oD>)DYCb^Z-?sVKW6iyup*!Ps|D$Ku z`r{wVB}it7kG(m0c@yVug+$udjH9LJCU{Pb9N9K1*U|HWFu^%5GLufErG3HZ)>4_bFxCZtC9~q)&g}LjAjO_eLq|-!~uqe{qQ~vA=ssq`|0tS+}@}MLWMw zRXB@QoYi979G9rPnR*)@+wN@r5vZh~$tZd|ovyx+LhX%M8awV&*rHM_ZdhO0^Js@w{ID&E(9Hj(v30@g8+-Nu*Hxxm2U2|908G z%QZ~9W7F}*K)kc;OJyu4IVObr>E+Hx_wQS^QQ9)ztr=z*mnuDE)%yAH{(X;`Iw}41 zO9JFWbqmZ)(u3s>_64&Mw7tBP{+?cJan;prooP79$;!&g!D0N)cQvDIiTtYKM$uJ? zpoa&f=6-(_k(3M{EbDV-^B|U9ppJUthLP9wvtHlUJALGcIJta}$*ko*ZIr z3;i}WxBIZtv5M;U**q><0|SGLc{bbr{Sm15WEo4iT^}tYM0OhMJnp&j{lo3uyLUG= zHBl()k&uZYcL;)p@Xz3e2KHqOk)&Htua8^s!ZM=JNW_WpiB110Aye9nKJ=)@) zm=`aqSRRncMc#{9+{70zUQj=Vp8iOukkVhllPi;-u4j~1utbVq+qpb!=Dn@#-<_{> zidefAM?0@A{mu}th>D83YHCW?XRO7jsKxQ)ly!RGe)G72s`Xgmn%VNFLi*Nilya7f zxz#F|k z9ox3;R?H-Z@^;4XsYRHHz4+CZs=P^u^tbw{PcIM^gC8=I5PFUqA~ z;9!`SIdx4d!&pvXS4l~UU0+!meejys-(PLZ97XSY@zlN|qL-C%PqOTq@j@4?eHrpH$LzOzpZ4@3!(50T^Njy!$yGv!B8on?_x@!+FJ zk$zFF44NU54nbwj~}jLs%^D zR;FwI{{H&Ryu(sLtisH|t}D+r+oEnKhpc6Ghh2ApR;lL=&l~IvaqLolUZGw_du=Dx z)zu9Hm9-ef#l?qfUzlch#P}{*RXp#p%fBE@$1MEi%NJT&+R3@OojZ11$}-zF<~&&a z)Fb`E+KiyLO79d+{D+o6?#^J#%e%CB33>8FVYp_(ag)$+lwBB`jO&{wOExJxw)JZ@iuE2f;YUV)x3;#*20C;z89n~? z?LuT-_%MapUCmNIOSr{3_e|>>1LxZ3q7!AyM~9<&7o!NyN?u(kEm&;K<<_~<#-g@- zVL_w(`$UX`$mD91x{Ok}Mq@79fZ1ZRV=TBw7Sr+Z@v^eA5bma@$p@L7Mr4bVIGaeT z`5C-e8Si} zS0Ay%cAFTQ=bwxH&=Tc{O0{q@_3%itiO*lA(%5(FYcg^% zF)?dXm7Mn71y6?ceE7*BPoMs+IAHJY>8YfsXqBw_{dh-~`2)Qe>L#nW(DF)+U88$S znxEVpcV=tF1x-y&L&FHH(XO$ai=GBE@0MoEQA#^YJe*OqE56Z*lzd+}Jf>}fi!{b6 z)I~~7G{${uP0>j?Cvf=i!1Q2^@*}ns&A5&1Zok{pWL*DzEAv@SH!2nr6FV_XAP^QA z(#Bj-D>iN2xr2dWq9c141!Hu|Z`qpKO1kyYO2`I>l^>Y}6&4h*$$8GAL|{(#9ldk{ z13KE09Lz4G#PcOtJvu&U;a6&gc5Sov;lgWEylQFtFu>lwJ3QLMLV zXkUz+m*obJooS`?UV~5d+4B9S%J&h5@uTa%+Ne;%eU~TA_&yWwC!()NZa+nBJ0_2w- zW|bK}F(?!N-&^7lD#}aL?kn?o=`~*X{rlyJ2=k!Dg@r$zxeuJn?0TfBYp${4;emZe z3|kY4dvAaEJ~5F&`4wqjMl|1)Q98#uEGr`u>Ad!CeKlBA(tE){x;W|lv*w-lJw@e& z{0^JAxVU)!b_xksyYguZF$8VHbADVci54x!ZK8K@XOk;#3}sJ7#&5pI4IOg7lwH)b zXZxZ*J{L935wCNWTVGqYmwu3#$Q^UQEO+4xA(?|+DPanWI%=jVL0P=Q+s9{MV4(1f z%1&C^$J{B#rJgw#mnN3}{+=-j6(ms-laiX&ez&H4V!7U1LKqV~emvJ_c`hh3zt{7@ z(bKxRjDyQ$CL!Oo#o>w4`QCfG58vIfKc0WPkNkUyH8q9p z9V2DWQAfN!%u|!qW0%Z26)eAGiOOnP5#;FPB*wC1W~iH3Y&{mI&97a%R`CsEUua&#Oul~q{{3qWF-gzU2hUfBiCffO4r)ug z_>5P$>Y{yVIm_P7{TQR1p+iiadKt#iN?9(W&2D`@Qqs~9k48pEM~8-7r+z4UdcKtR zVKK$iMa|G3kkpi?+qNyUYm6KZjD#T+uXx>i+qpMYU!>xBe!diq9f|bm)2IEWSFT*a zrk|Xi-n04E(DPK?l+#`b1PjWWZ`s#^tIV97oTMGT-*nxM+MKBKT+U0fVPC;$ms_t# zpy*tyj>eQ<`z_1to={%3t3jkxy@w&!QH>O}Y*5$pGAWcm2F_Re2T{IC_m~%cnIjlU=!&rJ|VJOmGnECu#Fnf?v0)^5bzbtGdTG_gcPY|t; zwD0}n{>o5vTXZKD5{s#Q$TUe%*@PlTp7H)h2SUOKa92|1sI+> zAtN)E$IuAdoVQR{^S0Qc^NAGjWYAx38?PtxmjK zFN=)qLO(AlEgg+Hsjw?&a=5=g?r+2~mK_iFiG*_#wZic6+7;TQziIisDn#OoZO$Y6?hsrSV~h9XK9~gS7{uMYi(AyV*_$(A(dFTJH+>&t!XxI8G)L%YyuNn6%2 zZXO=<$?qSYJb3~HfklgXtgo+sbno5*F!aode_>IPG)L#QuHeDE^JGN1CpxY z=Ge{=$FEbdraF;$CCDJH9rfhAR+y-1g{HDBF+`QO1)!OMUHUVNv$ONe-@oQTFI0K! zJ&Ik&4D;>O6x6gBBaC|AUitJ&Ei%Ua$NjG+en#Quw?9n&&UmMNZHGa4c2*YFMWm!{ zHH!}8ogw*L&pk&>w);Qkv(Y+RjIE5WeaXm(5B-DvH2zrL{`~o@bO+$P(L3K#)5=F8 zrL!Tf+X2*~WZaI91qjy9%qH&Le2|xS2um?YR76B1JaR5v#Kbt?t_KbHg&{Ks!70F5 z-hJ|N#kaApe6+h9c5UTHXlGWMF5MuN$**3eW364yY`jX&8D8NTm2kJ#-?w|W zR+`~)@=ZqT{iaq{RzaEI64*<0{-@GrbCQEuk5^mgHv5hUJh~N`W$NN0F~&_Gyl}RY zU|nAr2*!ptE^&8UTUo?PDMI;&D)18P1NBF|V!XHXe9LfeZ?ABEevkdTRaY?7BF5RF zvsz&vGq$lCJ$T#semW-st?Z?KhOt`yEvj~aE(?fry)#DuSl#YHVl>+chwpznvMChp zsV#B&N@yYM$F0NaEV|HbKHT1liN+6{VqF2p2QIXnoK-FsS$Kw@W+Y>RTJ9rw~4fE6t5{=?fi+ z9aRcHFzvh0zg1yZXP)iv;bG;5J&KMW1Gb?u=E$iHT00NB78{)pnEj3-KR3}QLe$3k z9N|A8Wmn>}ENN?zYbX#0*!qNn;IlM~O%oj*-GhA$8f-;3Z#kva^-faxD6RjT@B1l6 z{@wL2Pxe{oZrQv!=la)27REfprNL(=d3HT2sl)Cb9)k?sog5>l*-tp!jOi-6@%!!D zV?}&7mS#u$eCFAQR|bMl=3NjD%6$Hu#q&_l1ERgDMO{R>)39exPtShSz@6-ZD-n${ zw^qcvJGGC`nxyp_Ek|t671%$VGS-`Ey46R4^QvZ5AU6@HE5+np*@w$-F9`Sft(S7q zqNTfH%_oRlD$pzrndJ!jaa_&ny3AL-;e)eRt-d<<6y5OWLQiQ~-t})Uj{4q2NtXMb zdjIMkjP64IY;?aQ>qChfD$en&D*cSX{Ef3?U0>ZnPHDx(UN$y=GEFN_4Cmw& z)LDqL>;UL6etY>=m0A3KqKdt+lo8>stjakTKVz`k>#eU9f*WGwB1M&Eez+FP@$q3J zgS$Wv5U)r#dAEi!6RWtpll|9)q*Gp@c%XC2!C)k>wGRJkeZm*fa!}H)o1gY{spsEI zmoEKrEpD?F0F<}=#t z>6mNaAn;62?WcRWdejMphU0+I()Pz#@I@1pkN-Apsg0475fHdP&QDKAHxPAT$6a)W z7+H^IG&CMH4UMnq4ACMrM#q7N@5jGR8%<~{Z9Ks6tMA9JU%$r2)a<)6;m_h0S#4EZzy;ay|ij-)6N@c*;XpPjh6PcPV!ElRS-|JYuCgp zaPfW2%u0&8eSLl3tu3YM9Z4&dgI3|sO+@wZ`JI*@<1^O*xX=>(x_7C&(3!zWEoc6K z;Ye$BvA`J_^`+*T{smeiQ7uLRigoq`sNn9+A8aK1O1<*YiP&XasZT{1{+e!-AZ;Zj zCFMCLzdEZ^zlh~9>b%4A`p*JqPbO}nwA=V4{0x;tesYk_p-^(VW@l$>YgIi5=5YZp zPfzWnGQD#;3#s@2iNfo8;G^4*w(=g5moGzO$hB_U4i%4{J`G44tC3aGh6P})Ntv_B zY0#gmHQgvu?}nplCL`xVB~x#2*|8a@WLs_@t|sh8X%nTt z{(8$2NG^t4<=nYg$u^Kj1_p-YOHaeX&R*2sFGW(D{nb{}*7kJ!j*(=Pu8X=+>Y>cX zq+Y1D2B@bN#~$G!f^0zv3k!idaD*J+Wa&MY`*rS5hq(LX_xWBg^vdf&q7|Z&tgO8L&O$QsVc9uV)out22}%!Ryr-+6z-ijG?^JWU z)*J_Hf-kvirXeXGy;J}cb2m1YOPbv?SZg8m#kxMV6URDu=F+IDsU^h@o!}h37k(sB zI{*w<`@pUUYx5v;bMq96^)VJf-PfmRHefd_P7n6?_hWb9kv|tW4jB9VCE0rHGu*Bf z!d*>jm2b#Ab0;H1ggsR`m}CF`{m^4^$F?0=JjY+U?&tyPGJ} ztU^*+#{R-&NT3R&eK(fL!MyU5QEecAfJb2I^uIC47SvDoo*ijIkJEniHBV%vEpa+> zMPx6g>Af72yYj$cZBnkuJ73@guU{$2(oia}#DGlOF(Cl(fOHHycFayqVaZ87ozZ)9 zVQOV@rZb|Kai{{%{dup(%G&Zo)J#CY<}|Bqad!ln6g{S^_-GVj)vKaru-rg`9qu`<#X)2lQ#$|R_Jp~PKu>M3BLOz?m}}Dt>9IQNPI{h){DYiNm;j! zfU(WmT3ZW}^joauAJs^uUn&&i;`*N5AfIqx*|I`c+_I6&FwSCSVJb-UGEtne4S6@%wR~&yvQyhyt?GN^*FA z^FP=g{X3)oV`osiz0$Y7rmR5V<~9Qcc_h*fX~5;ArPhiNnC8vt)6d@5(HW9q_dvA; z?7Z-} z;*`wSqZ>{Cq$J10=hNr#MDsSNWk$__vKj;5_8ISutaBZz-CudF{PX8aMJ`p2?y#X| zM_XuiUM#+9NGSvB0&>i~bA-JiLh_u7N(8}q2zULuu)sAJ=;>7G?4xH(KdVA9oHXOr zQ;oCVQO|bbW8WEeU$H$uR>JY~pLVvOKYesSJ0R!c{PQ!xX7mkX8Xui%!e%BEgxFsl z(b3UKDOFNee^g~=n0d7vqY1hJz@7ZGzqxn&$*8<*m2pFy?@N^i7Y^Iz-+AdjXRD&J zebAJ$T5#jH9vTgVZ|u~LcYf=#2Zlco^hs@wn|`@EVfJb0m?f^a+bm4>cRqHvE8N*I zmh;^2-1@JG$?meD`OdQUw$l@Jj`@oXuis}|EP96STezC(UzC{bZ!8?%wYY5jj+>t(e~EV%5t1UhOJ+QX6jh?l%yt!Bqt{~N@pD>=eM@<=FJ-vk=gN{ z<+7&G@vVb9jWQo99Ud-0w}3c0a3`rYdY#9Ct@*Y|=t{rLx$;!xpLL*;Xxlg3}w zuIq#j%bi;53;&qldP}6e^wIM7|LOg=TO99RJc;gyVjV4NsswEes@C|=pJ9F~#ky7E z&uT$#&B4jf1n&GhH`iP2W)I-A{e`9o+f!@Hy7~u}Ur?hqXiCgR^dH@0c;ho_wta6& z6+z?t`C{+IX*3j=9z|eEW>tIk?R&Q3n5P@pZ`)h42>RJNH;#G^F{#XZ(Fq>aGZB+D zek-8d=n1lG?Z4~ls!Z&VYC8fDbnUPy`QXI2yy5~}IwD1^tLl+aXJ$#>#J0gNeXw{>#5 zN<$()la%-y^W;fWiVoj{a==SgM#ffDK@?eSx02;>JE{kK>V=-?wE{Z*%g^p-4T_$i zq26FYMl(l2?jvSdw~jAa?ryQ|2cP^hV=;x3nx;ej|C@n2otyr--S}+^UF<*0yjuGI z(JF_)n8vQGrNubdH$K@^Ik{`=zmIX4{pKoA_|?5aHVbs+NqQ)fBFBX2VCkC5tIJUbeb-WEA@42x!3CtarwL z$0{JrH({Tna$XN^WR;eTwEgn76S zBz!gYvW1*HFLylRd8HG9Iz;B@cW zVkQ~6-;}X{-7SfKd%221_>2Zai}$3+yOq;{yA-DYrm?+3xvOBW7*~=Q?^w%5MMu*p zINZ2FV&viHw`@)%28l-24Lx7T?YvIWjr*fc*QB%a)%hpu+b@-R=7J$o(E{957(iX% z)O;_!Lqsi(vEULVsfl@(W$EO6k-pSQ*D0wcNuWl5=ExlVejyld^Tt*wE6#G|n znsgcC_^V+V1aqEL|9~MThBUXd%>U`w%fwXfG;_$j17x0x7x>hp&_6bokFTF}(F)_f ze>LgDDs4Gj&2FgA_fXw-qo`Nvg;z1$*OYh$?iA|^Df2dH(kLM)p%uy;?f+i>9t ze=hI8ZTgatV@c190f5lSFzX!BF0Z+0br;n4{X*x_OC{|Jpmr;N;|ts0LX*dVDk?*`eOl z)D*4st>@ogh0eq3F|vz5UoMQrJ@th3pP?F?6WIG-pX8;Jz;pbKKj9j>LDBK-?L|Wx<=%hg#|A+H?999 z{NIwvk96mOXbPQ@>MYJvrC9-TGae6;-yh669>t%lpsvW|+(+ ztoJY#@_j*SfyGm!d-x6PQU(Hnx(>A2urNQhLNDP?MFKDm1);K1OBv zkV`{CL$Nog=>k{|ur<4Z=W0aWd83U}gB7pT4k+wGkITty@}5De##S=&-NKIt5I69H zU6vBPMK`VkwoCl?G9+XgOcy@Wfrk}9Vigq?z(LgD2PX1iP>@*=R3#xUuFEJAxa$M* z-UU5&FJ;`)d+eTZBd1XYEf1T%3>yqx^P$oJdh4wFQ)*fIt}ybAxzSQ0t2>Oy(+bzP zz-dqgmKQQGZNQH}>`94ICAU~s_EQi9skaB^MMQJjx&_}%*IMDj~tYspAtTKtwq`6`|V z2Q!R?PrHf{0!XlpwzEL@8=fieQpPsI8GN8@B?KSI8$t=$ZNfH1rl z7)Z>#x_F|jh6M|IzB9+_jE5)uVi!$8p5%2UWo0`5UAuO@r+T~(n2%_a+OXh@Tn_Bm zB50{aI)3cf0*L3J_AG9#i+v6y1* z6?^^_lyijq6qI??sOVTl_)#NPCMF)*jenUORUaDq?fFHTUe_Qp?l%P+go(!+nu0tD z*xL(OZq#8SG<^AjUJDzo0wrMUPBwQ40oezfQ%k8dZ=7QjsthOXaU3yD+N72cI6{zaScnP^bLq0B;3P!{gC1GC&YZkvf1YI zu-%c(Il-j(0;?DG<;7a}|2jdU#wc%oWb)y(t9V{#kznkLWCbuh zybOE>oMXtH$jo63CQ4@NG59Ing;0Rv`F$rpY(*7#%q<`!^cx)0CI70SVJGqk#_s(z z2~Dr-9IofAakr*^c0@c8rX7i*dtbD@z|mA;7u=Vn`3ViHZF-d1mpMLFoCfuCrujzPtNeV)J5?0SksE8w|(+cYaeHSRaajfj0>=j6=b zuZEL0Iy^i)F<}ySng*W%-UG|9vb>yzhGrG^4w@DM3PltOiXIzWmkt|agv*XdwV;eE zYN0_aLQE+^fk$&mud_(iN~pNa7O~OI+uK`PTif0Jgy|cUw;UKDdt91!{7I_RL#y+yZTO-HARq*oi5+aLTtB(S@rm{t# z)#Uiym>-HYh7=YsMz6HARN%WHnd&ma6{#nfn_D+ivra(Ak)m_dFs7`#LsbY5u!Opr z+Hsa0x`sNLR}~etA~1#-CMU^Xu}H}Ajb^SkHa57!*Uog&jBPpJZ1NzWW5{6+Nu!vs$j0=4xVD9_SNfmu^b7OAKv%jY{lDg&k zD8dYCkk;U~Vej$o!pdOI;V6-dd2c}BsK%PM_8z%;IP~yDfBLP>aHh6-qVHha#>o3b zIG5q>5l<*DFNblB_z^YFhVkr=YIu2a9j@VH^F?eYwFn6?Te@M{qesWEZ8mOQUusVWn?qvD1 zmX4fZVbrG%ySK-9Rz`!P?xgue|FyQuYhzzh%I^I5yGgzYk9%!ozbVQV2Db?C1%(NF zI!*64W}9ku$)-?!oegB2ZCma5_vk*!0uItQ@o6&?BjNe5&Y;Y@Iys&0q!veh1KRFj z1`;XdWd6Y6b6wP5&Eu8TXS$83;rb0l|0kNh-J1%iHvIoB z)qaM^uz@3nLWy#&FPyu_P4wqt{G>olmsFZI<%e*Odd@ZnJEt2RnrqMx@cq2K$mPui zV;MXL|89TNOSiKQX%AGX;yw(mqtN61HBGAUGBy& z-54qpfidah;{&Jk_wV1SwkE!fkx{5&qp2BXScoCW$hxD_m7#b8!jt0{s)aIYU!FYK zu$QKPeT^Q0)C?f;!I@GliT4Baw~B+}j>!QcBQ+_5qU_;8O*6E#=n&1KQ^gt))K5Rvf=iBLx?&b==KxCN#Vd}J7L|(zE=x1 z-@!8qDozZ+fJ^zVxMz3RNU*Z!$8Fp~QPpI;<9w8S$ft&otgFl*E&m`dahrb8tzZjV zcz2Qj(WnW~^SvmPqQb&9h+Yk^t-q$rUHuFj=pysjPtO;pzB;1Uho~c`w)ns~@heuH> z?EU*wf^lH0VIcyUO~L{+3YGhHJOeg5#t1l&NE65NmoOb{C~DN~pXm5aQQn%Y4jZs# zbk-HrJENU^mZMqJGzjh+^Z|(_%xFBnHnECo2GX;BcB<)P7eQ)BDZvpenVLcZ6DNu& zd!&BCa_8qemY~NA9(1e%Bw)X(#3x&^7yN&aVaKqR{B6HDI|l#snXrM=@Af0)yO`04 z6OLCgH82+|oqlIq@h-o=wFxFfJCzxsrnk(+^BbnM}m4xl`u&@u#BUPoFYjsj;*BfHI;B=7Md2?jXZchd>;>uSKwH>fj^q z8PR(SrxnFdb>)HHE^j za^b=S@Z{W7<(GWaA%*b$(r3T`Z_SGWfQ`26L~<6$Uk=Zu$nx8%)GpC z@FoQnE=Uv_3yB1LPR%M-Jm)4-^#-KBv$JP7{ZuH+N$S@Tt_1;J81CAf*1&G6s>OKwg9Df&3=*Ka_O`ZM*@mW9Nl8F4#E`Sc zxua$<>xG4dO*B>2)gk5tIFyn@QFQ)~Lqo+czrTrXh=+S4Yl8lE(`ntBiqfuI# zrk9$R3ViNV5AAOBVoaB^)A#qc5Gx-6Sy~k4y;3+zkdy1N$WEcC?0fhxj~rQtxH9A= z@Mt_Vez$^Uui_Ij5mhRgzZ%oq^a7P3R+c}Qkn*Q_kFlO!IN~tCO1YFhB>ZXf7a6p| z@ruRg&M{$Ox+&T`M|wNPTpyHYfx-Yp0y2gjS`Ohk|N6z;kYf^o9sY+h4=Om4xIRAG9~j+c;QS z)&*g5d{};$Dyl_w+%(72>UcyONTegobWGYhJemCDM@@B^8v_Q_&&$lkBwUum;#JrM z%k~w;8g?4yT;ZaHnVDrn(tEYtQHKWbQI#moz@3OMPkXPH)G!o7c>!JLa z?@?W2u8LZ4BwtYkZ){1_|CjIk4(HBgqL;m#8w+vpEa9PwIb%{k?nPl2@;ivqK0e=7 zk@v(fgjXwZCRV%EAx45^&JTQayhjLYzCKE~Mcue)$nLxV3aM7VE|T$<5H35HRQgS;ApI z_|G`O@(PSHER8TsRics1hozypfR?S9{yoFj;Iu#*&Yq#V`r_yS-J6$lGc&(?iluti z&h?e8&UGOH@^^AFR=L+>I2yPC;VjtI!6(`#Pk;TBUG+TTY zaA@&^h=vnlvrw=o6vO)AylrhW5MQWbA!L+;2MqsODj#1fsKmb)@hD&LP z1wsW1ChyWIf@x<2$nhU8pE9crPM=vf`H&l%8a8|f7elF(Qj@n^vrVkYE`_QIr2^_Q zgwpJ54IC90&>r>)UqB3LYd4RF$(I)V#$!(Fg18MhN!W+Bgbn#rkaXzKA-Ix_7pOMj z_kJ#iPbW{L6H`7!+{4!!80c>u*nTR1zUgZ`|5ZB-_J;3q|L2UX_%rH{{J%RJTl}X# zDwSf`oIt(8&8`0Ljpk_mxybQ7b|Ry*Gd6cT9GvH;2z&*S;;*qbbD z(X3@u{E$qIm<-ZybnDp5&R&WNizO&paboz6jQ}mWaQX401t-ybcCU}%=c@OujES7z zte{EC1>%A>CFC6+=I;)C27wUf&9~Kf0%I^7ma|GqVkKuXzHJev6-Y{?Cw&AFV?)&izTxsLfYj3E29Kz7;&&9HX=j4uh!tkYCn*)5Q z-{(KgV-SAo!9#RiDqcZ*@kBf(sdvx*9k0GopXC$-4y3cJy z;WEjy>44IN_E*pHN%o)d%=k29Ten2M4;nHY1Y(F;t|60RA-s98t_Sb>*>jf{fM$7! zXn*A%mefyh|MOJ!`>U?KCzt*?9RQFLxyEyj8essT%#PmLqhO_sW(8;E3}LR}4Fhb4FPs5)c$k5STTo&hY&9+W;VTAa@@Dt0vw z>VHI}UV&c_AId}2Cf$IP8YEiWGydz>5^Re+>o&4zcvMsgbrWO7dotV>EA6r4#L*?{ zLcr-?ganHMwI>q(Ir{{y?pqg0B!yk^@$p#8%2i&#l_0tRREhM^w{&F>$BmA`W{8&e zF=SLsXrgvA@f?2YMBY4W&z{o>f+^*0_2y!W9WtCdE;hju?EL@X9?* zp{QhkFK-vSb5vhzkU>!kA~1qDrosmgf;fk=axquc_xIEK$MUNHS6f?C+N^zSdVAzH z|BJfd1g;oXY}nS*O}^=Be)3q^pkEPBo@fPl9W^|9^e7a|Akj3DD;)n$qg^vI`|j+w zL9PU`I}_i`#Pi?bzpVXuAOZk1y~3XKQjk0iQ51;%e@VAy90{O= z);tqQ78?hGL%DCU%l|EUIF&*P4Q&BDh)+lubwKx^%C+!iM{P+YoX&cfW*2*d28r-v_?sN9}m(wCsj0D_-u z2t2feNWgD zzoGOv=qF(qdB?}*2I1yLHMXPopw;JG5Jo3B60$cr+VXgJZ*T9t<4OPdJkr|nPB)2p z)qOq#CfW{$?@ z@#a%hX@}hZjMD0~QiqPj&!@t53m=7LQ}G<@i^`bH%*~?-&UXj5*fB5!A3Dje_zl7t z3TxBD5G*-3e0~#5wkg*S^jt8IJuwVR1~>BU5iO>6LwW3lO;TyGN6GQ9m}_ir@zI_( zGc$8>$zk@!0lkmor7rcK;ud@Mi(BC6Y@>=4)s@_E^Ufr3ey3a2(UL7Kc`DBeVA-N~dF!=^MzSioTj!jDSD#*Xr32^vUl6 zR|O+czAZ2*Ao0maHk#flyvIgTXRs)q|Ir}l!X#B;ja3zTA=nJOEmnb4$Y>XisAYFY zvhonO)6tm*FwU(+{2lA_8_8e=ybckV^n{Awvb+;b8nQhqSlFFjD~A* z58_3a?g*u|CeZK5Pk4I5(;!#lhUO`B3{AUHrh*Bk1bgBiR5I*xLes!*m12E}_+b^_%RfyCfmHQp=;Y>yk2kvM=`p*VIuc+N zsa)Ib;{Pbs8&Pzpde|7u2M$n6IXn#nJgN2?w3|!)^D@ofxQR~PcVAVF{$bPT*Q(gT zaIaTt$m8qJh4FORcWi@;-Kf6Z&8WUY!P*5dIe1NlB_;J3%b|$XIllOf=GP*rSbq5! z3=w;EcSi!{c6va(0V}edywD(C59>jyuw31B-dmn#^h16kAJh#FK95-)9K(H zR?Uf35Trml>Ye-^o40IX)_$T*8^L=L))Rbg@2MZ<@VGG6)-^TBNlEt$E$!q9 zgu?gRZqyUhn(=)+q8m(?)*F$cd6z%&qi2_HwaXv=`4iy~>9Q(e{gL$zL?UYEF6@UN2{p~*Xn!~gtY& zi|cqf)1YwL;>5c2=S>^ln`%5GNIoc^u9ulW#b7!ia=xGX_5&OcNsORRYjsCj4(@8) z{Vrv;O+5AAzI{UryTfYVGO#XqQxFioqsmGDb$`@6LOs~YSo8-gh~`JI1%e+vvMAJ9 ze)PdGb>FohdQN$2n#g14S?8a4a=iXv?~%qcT9JcgR&gPKYGUHzGzxIq&feM1#8EoV zHm<0}h`NPUd_+tvWHmbzxEL;=4F8gmbz|%Y@dnu$hj+5U|1FJ`0_{L?SMe04R<5(p zh=W^qb8z@h|0Gu5(LJyVFYBzLBGZ_bQZUCVh;y?|=G^z&Kh?*wes(;6^%JS1$$O=A z)HCZS{w=+1l@%;AQ&Ut&9$GE+unKzUkg?YYBtP`uoEKh|9y+!WQ6E>4PeIOTmOtUn zawpC$;O#ERJB=POkNFzbJKZE#46%6$;Oo3~RMKZS&#V%b4gft+ps(Bos^{?XBt2oy zy7_>bTX-S8X%EGpMaETlxa6Gm#Ze8a`UCM`S@ufUYRwQ|jwlnUCJT$C_{MK$Mn(wQ z<0Km669(b*TW&vi@Ibi6#=)Zl!x@5cd%hh!a~GB2u7$Qh z7fMw=q*PQgaO#dc+XK%0O+;1I*}s1k-!yINv2g%p#(vfm@$e+zL^Preh$~V~pCiWTLv?FX>vVf{OJ2%%pq&$-!jztbZ*#Kw#dp6-*l1_3xR8=GuaL&mx z`y?b5yt_g#^{Ki+2)Cgw?XBW3O*}r!WBG*PSu$cCNPNL&$b+_&Q+Ms9k0g$bqgXVa z+^% zOG~`GyxN0GYboO^pK8RTRijU_nBuhsNO(boVA#IBS^cM0MLRSEB&2`(MM?WzpP-+P zy{-OI-e}imy9l&1Z}M_ zM22uMvN_FH(TPhi{_oV3$Iy#wxUaMGbkwsNcsATQNDT7>#qdEKo&tEl0z)ABh2bk* zimm_;4lqnz-YCAixfMwcOb0W>V^CcqY+(crFTwq}_4!9W3H2f2H5Zl4e&wwv1N3mc{Cj2jTOM5-Vx&%o}_ z!bn0el0OgfC{JIdVhiPAKyf^E9*!V>k>*tt#7}LWDxr)LF}!;LuZJ)QuMFCsjiv_Y z0A~QT4!p|?t4(me^gHq>4UHXTk7LPB554PXC8}V9Rc6$qpm>hUxrR9GdxI%)UL5!i zjvC~*2f@MDg6g6O*+2<{c~>v!&(=8LltR4+1O@r!KjNMOqqcj>?T8^jpcO&;XHcNF z`|rY0Gx#1%{a)uWfBdUtfdDOLS>KffB-36CMu;kz-~bvGEhus*@S7-|Jv;mRtH#B4 zb)lkI0b+KCEGQ7t4UI)3C_%U`MLTJGO`Y~^#Z9}rEr;JW%Ssus;pkk&bAUTjVL`!P z*tbBSa-hnH*5Sz$9hoj$h(ou=C&K&*E1z0Jx+Qj{@pp!AOht20W>8QN zCID~eNi*71Znsq1<0#4+^Pr5$Nv``G|A-~$RLgDM^4;w0a^}^HDs9x)G32&e1l^B6 zcPGyx+rY~!R(bs_>mIdxSS-gXdf{<`V^GzhGxw?(FX=Ov08eTTtwaBdLh3<`RzEGV$dkm-^q{8PNqBG%>ntxq^d z8;)?Hh_aH>-N3->8UoYPdbW2jp2-ddqfk>)gnU7w7{ zM9F#Oy?f_JWGD$}vKRB^1FpQ(#G~R=kC(LNSlMVXB1lv0(0@A3C6cvm6(PXY@!|2GlVPjLBchsgqnG4R& z2F8;#ss;Z59`Ahax!%O%5awgOPy0p0%kP)Cp>2@u_T)ga!>(5QLV#8;c)7!O{!x-;b8~m zaB6L*hBiSIZ6v#Zih)9v<3f3#=GNtyTfS~Hg5$UP8haOAE75Q=kR=jtuTod1zH|)m z&7caqSf`l5*7KrP7s@$DblD)pCCtB1ZyW=$>|Nm<5O2ess`@Bje zOG=V9REG{BYuUGwjwoa=DI!}aMA}3uhmw7*>{}_jq@o2O*;BSqvJ}Z$3iG-3JTvoV zUd(mPH8U@sbN#RSXF1F7cQ4=XXS)l$za%zQD0lXA*nYo6p`oEg#sPCqIyX(1Go&&P zlMtdRu16uIrKNag>|=`K4M~A(r{@FL{-bX5{px@f6Td3NPo2YxFCs1;bkXxuIh)XB zm=C>u6nv7F^3ymNXVFSm?y+$Y%v zxgd-nY@_Bt0J>{Ie;h)4_7ov0FXZIqTM%OeMI~0t$`T?}>OhUeuJp4D5Geh|jpjaw zDu29t5#y|*@3W2(>2qLU>QbP`<$=8Bc&+(fn?eIm*8e{H6Wo4@GZ{XKV4)=8WRx$L zO%1fd>dj;6*|B`DOByP4(ssZawj%^?Rp`olhK6nj1$7S&!gOTX+LFW5JhWS=Edh)PSA#YTL$^~|dCH+5h)!&DbOzh~*D=NiR~8i( zx&z@yzxDwY2E^u|elLI(Ac*eXy-dIRs$_n_jtSCsKMcx9AVSmI*qDn-P-<_*)&@#p z0u^f=_S3|rW`_^2!!*U+ftVii`61?TYxKw!uGG&(6GG!V27bguyZt$VSR?bd3T4yy zHGn|GZVS~dvCK`WN)V|nWOtCke;pX0-Hp=1LIDiX-_MT*m0y$=DvKjWj^v4FXl|(A zu51V49#)%e&W#%{a;l~o#>~oNC&p+;1BIG^gz$j?Hl?{=madSxm+8Bg`4!4O*fJ$% z`k!Ch?QUNKxg0)Plk~&CSW2QVgY9~utu>XE^;~iBoQLu*$4u@3=?sfY@Vnw;0T8!K zmfHmFll!4IXiTLU!9IfJ@h1D1vzs^C;HB{DMR+FE?N~W}B5jNpOefalJZB$#bE@4on_jIAP(R>>;feUsl^-n?7fS@c>q@Wzd&z^7u$`7GFUWqpm}= zP8bCn3OW+&_D837#MD@16Cn!9nI;3DKCbF$EdeY>M1Kju5@|GbLSgCWcKZ4I1A0O) zs60aN&9l2K z)$d?hzI?dlp*gBtB6a29=z%Qur|Wcc^Zsy024{uw#KK0v+g=qu2#ZwLjg_#X1N==u zuHSd4(g(uRfmFDC?^KkQHuyS3ZZrH>q{76*M(XriOlS)W3&81!Xvl-42O8`wjlE7% zEixDb;8&wNXKSI`L>u{8a7}zEq-Xmj+g*86_Xh>Zw->zTPF&nJ@UDERLeHYN;s?Kd zD!QSQc4o5-c|1bt6CiF9j=wGdZot*K4KF^RON>L}Dk->zHF2G^9Sqs{f+T)}k1r0> z5%a>-?c$~lF%L%0xtbTXm~cM3aK~g)O;p{~)D$8kSJ!c1UE9qbbFL;2w~0Z6Oy}$3 zUp{>TB+`l%JS!^;#)}qwM$oaf7xUaTOmEgoW=M$l5(1=5E26iGpN1&WQ8WwtoB5TJruXBz0E3Y;TD8mtwA!9nQv7iVZG|`n>k4jSJ<=#(?tvZ*I{r1hytUl-jI(=6 zqB~Q>55r{z85Zz-$3g@x-CV!(=GEv+=Q88tCw+NFo6_%P3_?biuhI0$xwTR*e0$@@ zd#dw~1Bw%zCvRb2hDQhs&7M7bjzIG=TYPTHv0@_@X~^P>pyk7kz=o^|APA7{Kstvt z95oM^c401-j;M^rwYK*S5m;de|2!&Qh#Y{3qY436Na!SxGU^%{jhP9plls5wv8)ka zI>clYN)n2EV9dYlm8r+bzZeJId`YE&z2rn??ObxR_rEuTy-UkPQslz{Y z6i}(5J$hX18pQKaURE{(Z7})?ch={oR8GcYP$3aPKNcuyp<_i;I!do^Q4NWz9VLj= zg}+#&b>^ufJWUC0KUgZvvNzuzdw0f4YMq&xnYO?|-JzlpAGtf;ma{3&13f*!obVWZ zBUx+H2DN(!DQ#h6z@@>KiuD;8kSkZOCOWG>ip=V|+`QF(cJe_K8jWRUJnJIxx=iPcOG zBJi%RE);?Yf+Lx`;8R!-ZaOv9qS?1m_FejxW1y*2bOonNwbxo<)gI5x$Z&LYL~Wj; zIgAWOK*rY-Z1PP3Bj;dCMb}J($w0e+Mhw)&`+U-(^r}^KOt?7VDEIw+|S2zzc>MGd~#xHIK~-Pkb1xHpf54jwahoN-)fmNoaa4R;7va$v@< zAWb{_R6tj2<>_nEu2}F9xCtSgjFPTFGl960k`R812XHMsumZt1g+EbLA{`Q6!4iZY zOOO-vbRk(T-Q6fZ*ghV{?gazd_}Ext8x7LO^aJJ>Lo@RW53~-*3w*P0AVq z%OmfpJ*CVL zej-5EzaLHDRsn&k9N;(*lxgJpff+c4Fcpwgs3|f40dvcvrNKnOKR5IR4xK5c(AMv8 zh*Z9$VdTJ(iUB%(*N4XeLaFWA1?>yVld>BrFEb6dU5JT_T8nIH zbqRa`QVD>k$Bakt*9vZKkB9WoYh#ebgCdk@xf>}j)nPdoyZW8=&HQ54c^9jjyZf41 zTANa>;|JwxGip#{?Bh>`zXGc_eED{2i)Ff6hirBGcX)nF6IakDbIqz!5E6nC>SXaiU8}7lw)iUSzp+7M zI)uz?GVRgSr(H2MFu+I#L`}qivpf)2pl(OGZ{M+mMRlh+EPJy6w{Gqm_MDE~YPVCZ&< z>u1%|BJRe|cb~hJ<1JiGO3XnQ1`j3(&IoeXd2AtrimdLqWP4ty7Cs&HVCuasnD5`} z;ul#WA!9)2-zP9ACRwcV|o)b<;o(_aiVt8Q6oiMqCj&P#|UdNu27oewS< z>L{K9$;fSq84HN{4HVgOz(q)aN&3MP02Xhur3!9X%E%~Ijxmh~(oCiBIk4O4ZHS=w zdHw>C3Ftbc()DBHzDrFQw5!$QH?J5PRy-5<;j2R7jBG(QM9-c!kBW;+Mys}kY(0QF zE{$P<2a_pFbTAM2H00$I)yuu}>&`|KB&cY7s0ywt+*-JEh5J*DmjkMFo zJn_Zt=sPgucJlMXxI~MPI|1n`5^Ab!q?C>>a$tT3iPhx9gtnGe(z4M%2Ro+9V4RN< z=K_VYa-}$g>j>Ss>S>RG$>4ERy*>F#9pe~K{F?lmnEl7eG5U)N_VEb)IGpKJbTn1i}{E+BTl$s=WcNSz<&$uTZWOBkG(O% zQ0;c#s^cdO)@il@NCj8lfc_SCth9nFgD-d;S@jq1Kl}LBfd~1_PM%J;!ote90fT$H9nT>BPxcbP=q`%FbGd2ZcVJees0q|n)gp|h$b8@3BdU* zpd6Ia(6XOJy8|ZkW0A{N5Kh5KsB=O1w?B6Ccj<%;+1&gi3hU{R`xPU@@*b)yY%bH( zbI~Uxg`r# z&guYa!m`u?K_tRt|fY6w{Pz0RA%Xz?RORiz9?RTXHnQcUKPY1sY7rNDBjot#0?C9c7U#s z_Ia+OXPF9XMcx{2s=d`5-6dJZYVl>4| zgODe^874Ea5nzYPlhL1a>Qh`{K&0}M^?-=IH1sVb+vmkS*ldK&pB)aS zfEW4ptsTKx;Z7T?dQzpOz*SlGn=A=jtl0+S0sWGz(}sosUA#u`wONYZTq4KkFFHA4kS#KvW+;WElYW~ zG?!7g6?Or@q+{4DAY{WD%j&_i`>LaTLNb5`}FU&-CGDj6AE-JSHTJw2*R_H19>wBCmuO02_-n_|ka4Zg_DQglJfNu=@xr@*XQL zE@tsYAH&P!t&=x)e~$U7G60>YNG}RX;)Oa&K>^V8zKpLuixRp?OaL;n)AlQfiPgP) znYefVAL0m?m0diH;}WLBz!*&;+7<&~pZI;Snm zX}h*!%ivzMYL`a*yH+B$hNzc9^G!YJSpgH(df?vqM{vXmfE*A2$$#9Tk&Kht_AE>w ze*iFxJ(l_yAsU7Vq6$zfVqe$1)a8Fd%(uF#3Z5$x(YEglx9f$Azj`Aut=BXwApryh zPI!Y$I?L{tFvE}#3xB)2@QZJNjV$s0u_XStAki=_IGalW9spCwO_=8M-9G}H>o@!? zV}JIp7@iA!T6z-si^+g+EPrh!-KF9AOR56`BH-L%Gv6O6cKKZgY?(l&M)9spGiGCf z%wPk`dX+lf-wz;V(Gpfbpn)WQvC7u~t!o{*akq9`$8Zh0nSv z5Hpdy8)6lKZVZJt@KEvF%5l!;Wr>P%0KW!PxK)vp;P;8$>%#8d<;`bla=J1uzw26D zJ(r%Ink|^56PON7Om`m$VJdTmaYQ~!c*mO~yp8Ui$HuODPfQ7cADECtr4LL(8YBt! zCWsq}C#L&(Arr7}S}>uy(3`%fuCWy;M*EG?Q8s6PVC?I!YrAccJ1~g(Lk#GGB{5tW z{{cc#2j~OapMJ{WV_?6|%!8PlPPoni>Rv!$49phdl7MU^cA+Ae9BAx=Ua#rgsngLG zB?u~o3YG}<8#1GO9S+uj0Lh}fWIj5cF-qbBz$EwtZ z20wQC6~hLd*2m8{mofW7PWTOD9IorIT{3UCxx7tJGY#*>nqSAE{CIh#MfToc*N=%h zm!3l40sG@>m%QXCQV2L9GXmDdHUyYMM1e^LpG8x)rN+r0f=MUwN;7=U5oZ=pMph#= zFJo05PmxiFn#q7nP%2OK{t+Y;gcb-IeEeGE%?AOJ?n}1EOma^bb>mbTJr9<%(Q_9e zZvdBUsJE&TJ5WG2Oe0YCR#b>*qxH~XUGZpN@lq{1XCfdgm#JYh7@&X)$~<_W$JKk* z5<>ZAJNQiMz7(*W743V1+lR2KTJ=XQEEJ}NnaKq510wXrw$LcH{}CXo;f|!y^_kbm z2|E4Emy5>}^g|IZg~7ehXPx##iSln}$VnZ@UOWZAI&{-M&sT7AN@2x80|`_}L_eLN zb*jEx$wggPuEHLg2@FW?6wm>B4KGgZ@`9B$B_~0=&IDG z^^O~rug7g>GYKC$^BboikVKSCMk{${J_b{kEhALvPpJKm=-U6F_Uhe<`C~jRH{`1jq32|6Z5<(Mwt*M6j&2av-w)0H zaH`DF3h8%cPv+`Rf7D)9W(9Z;%ukAL*q5CoyDN?tqDlWz6KCfUV3?!h9$#Yj5q&w5 zs!kTR*(!ytYu5der~!o)CMk|3NY^(C@5Q^z*1P-1#sf1U4`k`Y%_qoZ!e&pQ2|a1N zyTcbfiFsz^6$wvgXR*faSIEmmX`Z4LHHySH$iD0XQMv%txiDU@0WF2Ak%eH%mw$gV z0`b5tKyg+t-01-bOptbPm(|dz$F;$9aYV5a$(h0d;od3jh7r(7_Y`vwVvh)rAJ3w~ zm{UGpnwx=&Z}lV9pxUqdfGZAQMvMv05aasoYNq?drrtp@%q1VaPrCQNF&_r)g34n+^_A_4Y1>r{&;YuN14=8f((dgSYw_DSbJm z?80%Aw~efyv(L_(RRWVG%pG)=ua=45XC`snDN+Kj3yl29!& zP!HWQs^YNo=mVjb`-D?b(7nMT1fb6xaxk!3?si`rKJG!9ABM}tTJgTG;Pk?QUwoSH zo9^#2Xodi$26zqR2k58tI2YT_TU$a^gtzTWD=sK3oPtvluK6sCYhbYG7;)usrbJm~ zrC)EsebIp+q9iVzQ|%Hx2kg2JehFyYCtc6SItJ}Fk;L~@(*NNrV)BL#-k>Hu>ky~9 zmIE0T^A~V+hp5Rvy)r7l=HKW4^uc~3GOHL>gDI*jAX3N6_O4mDv-A@HECOwu``d~C zL4bpYLjC=MYu7YT#lqZ|uYn(pi(ISeiN9FrEd=ucf!x1R_tkm_jA#xoc9Gq9 zdT+j?7UXs@Ut8-)UG(qcA#uf{c-AbE1#@%)ijgIUNruh5~_zF$Fdi^XJ2h3<4r|eW#P7D;u8g? zHyw_sf*uU`kl~ z6b(qkoY8ilj8VWT3zUH)^4RQ80Pn=fP;a@5jYP@HY(muJzO z=(Sou0WrndIy~_wZIa!i=l;>yq9yvEyl7|NVKO@BTU^LckA-QH_h4})MquAYdNrh0 zD0Y@~!k&2Z0>rYNw%k> z#RZtWLqb+n-}pp2`X$9gB6ueELpwZ*sxUA(-ycfJyM61{2#!ZUvyH=3E_nzI z?vv@kdmy+FXjkN-5ln&Qg+qa?#a^eGq}!7@)%$Q;6vy63vaOR!(@$>zg;&G<3GQ@~ z`4<2MGAuS2z(8D3_i)zP4n{YSCKWgy^m@7ILD5#x6Z$`Yz7kAMQ1G(2x^`HPo)^ta`aIQ^h`eiEo;KWB9pgzJUd68!}n zG^y+P(>EQ3I}%GUcAoB`ArU4uP=PoINnwoD?ORIe?Xa+X)IQi20DbQb&I3ygV@y^% z-C0Oeu+oLhN$LTymu8yvtnQFRCQzH|1Bd-^cEdF84w`uiJ%Nu2*nc$dW$LSf_r#KC2$r@4ZW7L4&pp{a@58EvLDVE(POgf>P4 zcrsaTe&iX?F)?Qd`o`m^bSR4etYkpwigbG@42YT>#ye(j5)E@y z22KPt4%j6>4-fC>Zv|ap9ROQly^R#i-NTp-py!oVCxm{UKgl*!k_p2B<~)gEh0*rW zy#r51%oJav-THf>8vNfqtbdjqvr%0)sjSmvSS0vL6@h$hB|WcP9DGDpcLq*&Tu|nk z-{k*!*wdt_$+rr~KFGuVe|qrk|BvH$|Me~y{+}I){I5ImuRDUpZOea|LH^%bwY+k! zxICb0&RdCR7hiS(QA5^2@E637gP!qM5C~V2H3bbq>lUo)RV4c$bOA{v*t4e`;1D#4 ztT8p^7`EVRrVb;bc%q~8 ol^PB_M|DrG!T;_-=lydF4EDM&r@Y@!CofJ@-@p5T+EMR+12p^_T>t<8 literal 0 HcmV?d00001 diff --git a/tests/fixtures/notation-python.png b/tests/fixtures/notation-python.png new file mode 100644 index 0000000000000000000000000000000000000000..0b317c690f79dfbf4c82f3b9e1767d4868f75173 GIT binary patch literal 60749 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≫+!{kTp;dqEiAh* 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 K_ubR75Bp!s3(#Ev literal 0 HcmV?d00001 diff --git a/tests/musicxml_roundtrip.py b/tests/musicxml_roundtrip.py new file mode 100644 index 0000000..a2e9ea6 --- /dev/null +++ b/tests/musicxml_roundtrip.py @@ -0,0 +1,92 @@ +from __future__ import annotations + +from pathlib import Path + +from generator import harmony +from generator.musicxml import load_musicxml + +def same(left, right, location: str) -> None: + if left != right: + raise ValueError(f'{location}: engraver changed musical content ({left!r} -> {right!r})') + +def event_positions(staff: dict) -> dict: + return {event['id']: (mi, vi, ni) for mi, measure in enumerate(staff['measures']) for vi, voice in enumerate(measure['voices']) for ni, event in enumerate(voice['notes'])} + +def tuplet_members(staff: dict, identifier: str) -> list: + positions = event_positions(staff) + return [positions[event['id']] for measure in staff['measures'] for voice in measure['voices'] for event in voice['notes'] if identifier in event.get('tuplet_ids', [])] + +def audit_roundtrip(source: Path, output: Path) -> None: + before = load_musicxml(source)['staves'][0] + after = load_musicxml(output)['staves'][0] + before_positions, after_positions = event_positions(before), event_positions(after) + before_instruments = {i['id']: i for i in before.get('instruments', [])} + after_instruments = {i['id']: i for i in after.get('instruments', [])} + same(len(before['measures']), len(after['measures']), 'measure count') + for original, rendered in zip(before['measures'], after['measures']): + location = original['id'] + for field in ('duration', 'key', 'meter', 'clef', 'transpose', 'attributes'): + same(original[field], rendered[field], f'{location} {field}') + same({'capo': 0, **original['staff_details']}, {'capo': 0, **rendered['staff_details']}, f'{location} staff details') + for side, style in original.get('barlines', {}).items(): + same(style, rendered.get('barlines', {}).get(side, 'regular'), f'{location} {side} barline') + same(original.get('tempos', []), rendered.get('tempos', []), f'{location} tempos') + same(original.get('section_label', ''), rendered.get('section_label', ''), f'{location} section label') + same(len(original['harmonies']), len(rendered['harmonies']), f'{location} harmony count') + for a, b in zip(original['harmonies'], rendered['harmonies']): + for field in ('root', 'bass', 'onset'): + same(a.get(field), b.get(field), f'{location} harmony {field}') + same(harmony.degrees(a), harmony.degrees(b), f'{location} harmony degrees') + same(len(original['voices']), len(rendered['voices']), f'{location} voice count') + for first, second in zip(original['voices'], rendered['voices']): + same(len(first['notes']), len(second['notes']), f'{location} voice {first["id"]} event count') + for a, b in zip(first['notes'], second['notes']): + event_location = f'{location}, voice {first["id"]}, {a["id"]}' + for field in ('kind', 'onset', 'duration', 'written', 'hidden'): + same(a[field], b[field], f'{event_location} {field}') + for field in ('grace', 'cue', 'measure_rest', 'rest_position', 'lyrics'): + same(a.get(field), b.get(field), f'{event_location} {field}') + for field in ('stem', 'beams', 'notehead'): + if field in a: + same(a[field], b.get(field), f'{event_location} explicit {field}') + same(len(a['pitches']), len(b['pitches']), f'{event_location} chord tone count') + for p, q in zip(a['pitches'], b['pitches']): + if p.get('instrument') and 'unpitched' in p: + first_instrument = before_instruments[p['instrument']] + second_instrument = after_instruments.get(q.get('instrument'), {}) + same(first_instrument.get('midi', {}).get('midi-unpitched'), second_instrument.get('midi', {}).get('midi-unpitched'), f'{event_location} percussion instrument') + for field in ('letter', 'alter', 'octave', 'duration', 'written', 'unpitched', 'tablature', 'notehead', 'cue'): + same(p.get(field), q.get(field), f'{event_location} pitch {field}') + for field in ('stem', 'print'): + if field in p: + same(p[field], q.get(field), f'{event_location} pitch {field}') + for field in ('tie_from', 'tie_to'): + same(bool(p.get(field)), bool(q.get(field)), f'{event_location} {field}') + if display := p.get('accidental_display'): + other = q.get('accidental_display', {}) + same(display.get('name'), other.get('name'), f'{event_location} accidental') + for field in ('parentheses', 'bracket'): + same(display.get(field, 'no'), other.get(field, 'no'), f'{event_location} accidental {field}') + for field in ('cautionary', 'editorial'): + if field in display: + same(display[field], other.get(field, 'no'), f'{event_location} accidental {field}') + if tremolo := a.get('tremolo'): + other = b.get('tremolo', {}) + for field in ('type', 'marks'): + same(tremolo[field], other.get(field), f'{event_location} tremolo {field}') + if 'partner' in tremolo: + same(before_positions.get(tremolo['partner']), after_positions.get(other.get('partner')), f'{event_location} tremolo partner') + same(len(before.get('tuplets', [])), len(after.get('tuplets', [])), 'tuplet count') + for a, b in zip(before.get('tuplets', []), after.get('tuplets', [])): + for field in ('note_count', 'space_count', 'depth', 'show_number', 'show_type'): + same(a.get(field), b.get(field), f'{a["id"]} {field}') + if a['bracket'] != 'auto': + same(a['bracket'], b['bracket'], f'{a["id"]} bracket') + same(tuplet_members(before, a['id']), tuplet_members(after, b['id']), f'{a["id"]} members') + for endpoint in ('start', 'end'): + same(before_positions[a[endpoint]], after_positions[b[endpoint]], f'{a["id"]} {endpoint}') + for field in ('tuplet_actual', 'tuplet_normal'): + if a.get(field, {}).get('type'): + same(a[field], b.get(field), f'{a["id"]} {field}') + same([{k: v for k, v in s.items() if k != 'id'} for s in before.get('octave_shifts', [])], + [{k: v for k, v in s.items() if k != 'id'} for s in after.get('octave_shifts', [])], 'octave spans') diff --git a/tests/test_build_bootstrap.py b/tests/test_build_bootstrap.py index fceca5d..7b4b7f9 100644 --- a/tests/test_build_bootstrap.py +++ b/tests/test_build_bootstrap.py @@ -12,7 +12,7 @@ class BuildBootstrapTests(unittest.TestCase): spec = importlib.util.spec_from_file_location('vamp_bootstrap', root / 'modulus.py') bootstrap = importlib.util.module_from_spec(spec) spec.loader.exec_module(bootstrap) - digest = hashlib.sha256((root / 'tools/requirements.txt').read_bytes() + (root / 'tools/install_engraver.py').read_bytes()).hexdigest() + digest = hashlib.sha256((root / 'tools/requirements.txt').read_bytes()).hexdigest() self.assertEqual(bootstrap.build_requirements_digest(), digest) self.assertIn(f'build-requirements="{digest}"', bootstrap.product_build_dockerfile()) package = types.ModuleType('modulus') diff --git a/tests/test_engraving.py b/tests/test_engraving.py new file mode 100644 index 0000000..04dcb5f --- /dev/null +++ b/tests/test_engraving.py @@ -0,0 +1,177 @@ +import copy +from dataclasses import replace +from fractions import Fraction +from pathlib import Path +import unittest + +from generator.engraving import EngravingError, Fonts, Style, layout_score, rasterize_page +from generator.engraving.audit import audit_layout +from generator.engraving.notation import ScoreIndex +from generator.model import NOTE_TYPES, TYPE_LENGTHS, fraction, rational +from generator.musicxml import load_musicxml +from tests.test_musicxml import notes, parse, xml_note, xml_score + +class EngravingTests(unittest.TestCase): + @classmethod + def setUpClass(cls): + cls.fonts = Fonts(Path('package/assets/fonts/petaluma')) + def layout(self, source, style=None): + before = copy.deepcopy(source) + layout = layout_score(source, style or Style(), self.fonts) + self.assertEqual(source, before) + return layout + def primitives(self, layout, role): + return [p for page in layout.pages for p in page.primitives if p.role == role] + def test_notation_fixture_visual_golden(self): + from PIL import Image, ImageChops + layout = self.layout(load_musicxml(Path('tests/fixtures/notation.xml'))) + self.assertEqual(len(layout.pages), 1) + actual = rasterize_page(layout.pages[0], self.fonts) + with Image.open('tests/fixtures/notation-python.png') as expected: + self.assertIsNone(ImageChops.difference(actual, expected.convert('RGB')).getbbox()) + def test_every_written_note_and_rest_value(self): + for kind in NOTE_TYPES: + for dots in (0, 1, 3): + duration = TYPE_LENGTHS[kind] * (2 - Fraction(1, 2 ** dots)) + for rest in (False, True): + with self.subTest(kind=kind, dots=dots, rest=rest): + content = xml_note(duration=duration.numerator, kind=kind, extra='' * dots) + if rest: + content = f'{duration.numerator}{kind}' + '' * dots + '' + source = parse(xml_score(content, divisions=duration.denominator, implicit=True)) + layout = self.layout(source) + self.assertEqual(len(self.primitives(layout, 'dot')), dots) + self.assertEqual(len(self.primitives(layout, 'rest' if rest else 'head')), 1) + def test_sixteen_dots_are_not_truncated(self): + duration = TYPE_LENGTHS['quarter'] * (2 - Fraction(1, 2 ** 16)) + source = parse(xml_score(xml_note(duration=duration.numerator, kind='quarter', extra='' * 16), divisions=duration.denominator, implicit=True)) + self.assertEqual(len(self.primitives(self.layout(source), 'dot')), 16) + def test_arbitrary_voice_ids_and_more_than_four_voices(self): + content = '' + for i in range(6): + if i: + content += '4' + content += xml_note(extra=f'part-{i}') + source = parse(xml_score(content)) + self.assertEqual(len(self.primitives(self.layout(source), 'head')), 6) + def test_microtonal_numeric_fallback_and_explicit_missing_glyph(self): + source = parse(xml_score(xml_note(alter='0.1'))) + self.assertEqual(self.primitives(self.layout(source), 'accidental')[0].value, '(+1/10 st)') + notes(source)[0]['pitches'][0]['accidental_display'] = {'name': 'other', 'smufl': 'missingVampGlyph'} + with self.assertRaisesRegex(EngravingError, 'measure 1, voice 1.*missingVampGlyph'): + self.layout(source) + def test_accidentals_are_shared_by_simultaneous_voices_without_losing_conflicts(self): + content = xml_note(duration=1, kind='quarter', alter=1, extra='a') + content += xml_note(duration=1, kind='quarter', alter=1, extra='a') + content += xml_note(duration=2, kind='half', extra='a') + source = parse(xml_score(content)) + self.assertEqual([p.value for p in self.primitives(self.layout(source), 'accidental')], ['accidentalSharp', 'accidentalNatural']) + conflict = parse(xml_score(xml_note(alter=1, extra='a') + '4' + xml_note(extra='b'))) + self.assertEqual(len(self.primitives(self.layout(conflict), 'accidental')), 2) + def test_dense_measure_splits_exactly_without_modifying_music(self): + content = ''.join(xml_note('G', 1, '64th', extra='fast') for _ in range(64)) + content += '64' + xml_note('C', 64, 'whole', extra='held') + source = parse(xml_score(content, divisions=16)) + layout = self.layout(source) + systems = [s for p in layout.pages for s in p.systems] + self.assertGreater(len(systems), 1) + held = source['staves'][0]['measures'][0]['voices'][1]['notes'][0]['pitches'][0]['id'] + pieces = [f for s in systems for f in s.fragments if f.source == held] + self.assertEqual(sum(f.length() for f in pieces), 4) + self.assertGreater(len(pieces), 1) + self.assertTrue(self.primitives(layout, 'tie')) + for page in layout.pages: + self.assertEqual(rasterize_page(page, self.fonts).size, (976, 484)) + def test_hidden_pitch_does_not_suppress_a_visible_accidental(self): + source = parse(xml_score(xml_note(duration=2, kind='half', alter=1) + xml_note(duration=2, kind='half', alter=1))) + notes(source)[0]['hidden'] = True + self.assertEqual([p.value for p in self.primitives(self.layout(source), 'accidental')], ['accidentalSharp']) + def test_octave_shift_changes_display_not_pitch(self): + source = parse(xml_score(xml_note(octave=5))) + original = ScoreIndex(source).pitch_position(notes(source)[0]['pitches'][0], Fraction()) + source['staves'][0]['octave_shifts'] = [{'id': 'octave', 'start': rational(0), 'end': rational(4), 'octaves': -1}] + index = ScoreIndex(source) + self.assertEqual(index.pitch_position(notes(source)[0]['pitches'][0], Fraction()), original - 7) + self.assertTrue(any(p.value == '8va' for p in self.primitives(self.layout(source), 'octave-shift'))) + def test_wide_pitch_range_can_break_inside_a_measure_vertically(self): + source = parse(xml_score(xml_note(duration=2, kind='half', octave=10) + xml_note(duration=2, kind='half', octave=-1))) + layout = self.layout(source) + self.assertEqual(len(layout.pages), 2) + self.assertEqual(len(self.primitives(layout, 'head')), 2) + def test_cue_grace_and_tremolo_are_drawn(self): + grace = 'D416th' + source = parse(xml_score(grace + xml_note(duration=4, kind='whole', prefix=''))) + layout = self.layout(source) + self.assertEqual(len(self.primitives(layout, 'head')), 2) + self.assertEqual(len(self.primitives(layout, 'grace-slash')), 1) + source = parse(xml_score(xml_note(duration=2, kind='half', extra='8'), implicit=True)) + self.assertEqual(len(self.primitives(self.layout(source), 'tremolo')), 8) + def test_percussion_and_tab_use_explicit_display_positions(self): + percussion = 'C54wholex' + source = parse(xml_score(percussion, attributes='percussion')) + self.assertEqual(self.primitives(self.layout(source), 'head')[0].value, 'noteheadXWhole') + tab = parse(xml_score(xml_note(extra='21'), attributes='TAB56')) + self.assertEqual(self.primitives(self.layout(tab), 'tab')[0].value, '1') + def test_lyrics_hyphens_and_extenders(self): + begin = 'beginhel' + end = 'endlo' + source = parse(xml_score(xml_note(duration=1, kind='quarter', extra=begin) + xml_note(duration=1, kind='quarter', extra=end) + xml_note(duration=2, kind='half'))) + layout = self.layout(source) + self.assertTrue(self.primitives(layout, 'lyric-hyphen')) + self.assertTrue(self.primitives(layout, 'lyric-extension')) + def test_nested_and_cross_bar_tuplets_keep_span_ownership(self): + from xml.etree import ElementTree + modulation = '32' + content = ''.join(xml_note(duration=2, kind='quarter', extra=modulation) for _ in range(6)) + tree = ElementTree.fromstring(xml_score(content, divisions=3)) + second = ElementTree.SubElement(tree.find('part'), 'measure', number='2') + for element in ElementTree.fromstring(xml_score(content, divisions=3)).findall('part/measure/note'): + second.append(element) + source = parse(ElementTree.tostring(tree, encoding='unicode')) + events = notes(source) + notes(source, 1) + spans = [{'id': 'outer', 'voice': '1', 'start': events[0]['id'], 'end': events[-1]['id'], 'note_count': 3, 'space_count': 2, 'depth': 0, 'bracket': 'yes', 'show_number': 'both', 'show_type': 'both', 'line_shape': 'curved'}, {'id': 'inner', 'voice': '1', 'start': events[1]['id'], 'end': events[3]['id'], 'note_count': 3, 'space_count': 2, 'depth': 1, 'bracket': 'yes', 'show_number': 'actual'}] + source['staves'][0]['tuplets'] = spans + for i, event in enumerate(events): + event['tuplet_ids'] = ['outer'] + (['inner'] if 1 <= i <= 3 else []) + layout = self.layout(source, Style(width=600)) + self.assertGreater(len([s for p in layout.pages for s in p.systems]), 1) + self.assertEqual({p.sources[0] for p in self.primitives(layout, 'tuplet-bracket')}, {'outer', 'inner'}) + def test_paired_tremolo_and_double_stems(self): + modulation = '21' + content = ''.join(xml_note(step, 2, 'whole', extra=modulation + f'3') for step, action in [('C', 'start'), ('G', 'stop')]) + self.assertEqual(len(self.primitives(self.layout(parse(xml_score(content))), 'tremolo')), 3) + source = parse(xml_score(xml_note(duration=1, kind='eighth', extra='double'), divisions=2, implicit=True)) + layout = self.layout(source) + self.assertEqual(len(self.primitives(layout, 'stem')), 2) + self.assertEqual(len(self.primitives(layout, 'flag')), 2) + def test_meter_symbols_and_timed_attributes(self): + for symbol in ('common', 'cut', 'single-number', 'note', 'dotted-note', 'normal'): + source = parse(xml_score(xml_note()).replace('