From d2f493c17b57a5b2f47b563727f5df4f380a2537 Mon Sep 17 00:00:00 2001 From: khodowany Date: Tue, 6 Oct 2026 23:11:25 -0500 Subject: [PATCH] Playback Mode Pages --- README.md | 4 +- TECHNICAL_GUIDE.md | 8 +- generator/engraving/audit.py | 29 ++++++ generator/engraving/cache.py | 4 +- generator/engraving/layout.py | 47 ++++++---- generator/engraving/pipeline.py | 31 ++++-- generator/engraving/spans.py | 6 +- generator/performance.py | 59 +++++++++++- generator/score.py | 4 +- include/vamp_zero/control.hpp | 2 +- include/vamp_zero/performance.hpp | 1 + include/vamp_zero/score.hpp | 8 +- include/vamp_zero/types.hpp | 18 ++++ src/vamp_zero/app.cpp | 12 ++- src/vamp_zero/control.cpp | 6 +- src/vamp_zero/database.cpp | 7 +- src/vamp_zero/menu_view.cpp | 2 +- src/vamp_zero/navigation.cpp | 3 +- src/vamp_zero/notation.cpp | 141 ++++++++++++++++++++++------ src/vamp_zero/page_control.cpp | 12 ++- src/vamp_zero/performance.cpp | 8 +- src/vamp_zero/score.cpp | 48 ++++++++-- src/vamp_zero/ui.cpp | 32 ++++--- tests/catalog_fixture.hpp | 34 ++++++- tests/fixtures/engraving_python.png | Bin 30697 -> 30643 bytes tests/fixtures/notation_python.png | Bin 68836 -> 68804 bytes tests/test.cpp | 4 +- tests/test_catalog_runtime.cpp | 3 +- tests/test_engraving.py | 51 ++++++++++ tests/test_performance.cpp | 91 +++++++++++++++++- tests/test_performance.py | 38 +++++++- tests/test_score_bundle.py | 6 +- tests/test_ui.cpp | 31 +++++- 33 files changed, 620 insertions(+), 130 deletions(-) diff --git a/README.md b/README.md index 6998680..1293fd1 100644 --- a/README.md +++ b/README.md @@ -144,7 +144,7 @@ All generated monophonic guitar material uses frets 1–12 without open strings. There are no genre presets or runtime composition. The complete arranged score is played in reading order. The source-defined form and continuous whole-arrangement measure numbering remain unchanged. -All parts use two music systems per page, with a single system only when the score ends on an odd system. Lines break only between measures and share consistent staff/TAB widths. A measure that cannot fit at readable spacing fails with a diagnostic instead of being split. Tall notation is scaled uniformly to fit the two rows; guitar notation and TAB stay together and aligned. TAB displays frets and ties without duplicate rests; standard notation retains the complete rhythm. The generated `.pages/*.png` files are the same page images displayed by the product. +Normal browsing uses two music systems per page, with a single system only when the score ends on an odd system. Playback uses overlapping pairs (1–2, 2–3, 3–4): each new active line moves to the top, revealing the next below. The final line moves to the top with an empty lower half. Measure numbers sit above their starting barlines in a clear lane; playback outlines the active measure number in the accent color. Lines break only between measures and share consistent staff/TAB widths. A measure that cannot fit at readable spacing fails with a diagnostic instead of being split. Tall notation is scaled uniformly to fit the two rows; guitar notation and TAB stay together and aligned. TAB displays frets and ties without duplicate rests; standard notation retains the complete rhythm. The generated `.pages/*.png` files are the same page images displayed by the product. Write all music in reading order: repeat bars, numbered endings, navigation jumps, and pass-specific ties are rejected. The performance arrangements, including the held Ending, remain fully written out. Chord labels use `M`, `m`, `aug`, `dim`, `sus`, and `mM7`, including explicit major triads such as `CM`. Recognized Soundslice text-only harmonies are normalized into structured chords; parenthesized chords mark optional turnarounds omitted from the final vocal pass. @@ -156,7 +156,7 @@ Audio comes exclusively from supplied WAV files: `package/assets/sounds/beat1.wa Tempo choices are 60, 70, 80, 90, 100, 110, and 120 BPM. With Backing on, choices are the tempos available for every catalog song; currently that is 120 BPM. Enabling Backing selects the closest available tempo, preferring the slower choice on a tie. If no tempo is shared, Backing is unavailable. Add recordings at the other tempos and rebuild to enable them. -Backing recordings include one bar of count-in, the complete arrangement including its three-bar held ending, and decay. The existing WAVs are copied unchanged. The recorded count-in plays alone. Metronome clicks stop at the start of the written Ending section; those three measures and the decay remain unclicked. Metronome-only mode supplies its own count-in, waits silently through the ending, and then stops. Pages follow the rendered audio clock through all 171 measures; the final page stays visible through the recording decay. +Backing recordings include one bar of count-in, the complete arrangement including its three-bar held ending, and decay. The existing WAVs are copied unchanged. The recorded count-in plays alone. Metronome clicks stop at the start of the written Ending section; those three measures and the decay remain unclicked. Metronome-only mode supplies its own count-in, waits silently through the ending, and then stops. Playback line turns and measure highlighting follow the rendered audio clock through all 171 measures, including rests and ties; the final line stays visible through the recording decay. Preparation and count-in have no highlighted measure. Code style is managed by Modulus, using compact two-space formatting. Python imports modules by their full names and qualifies imported symbols; only `from __future__ import annotations` is exempt, and imports have no aliases. Run `./modulus.py format` to format C++ and Python, or `./modulus.py format --check` to check formatting and prohibited aliases. The project-local Neovim integration routes Conform formatting through the same container tools, including format on save and existing LazyVim toggles. Run configure first when the image or exported tooling needs updating. Use `tooling.editor.clang_format` for C++ overrides and `tooling.format.exclude` for project-relative exclusion globs; do not edit generated `.clang-format` files. diff --git a/TECHNICAL_GUIDE.md b/TECHNICAL_GUIDE.md index 33607be..d39951d 100644 --- a/TECHNICAL_GUIDE.md +++ b/TECHNICAL_GUIDE.md @@ -167,9 +167,11 @@ The existing recordings contain one bar of count-in, 168 main-form bars, three h Score timing includes `sustain_start`, an exact measure boundary, as well as the total written duration. Ending measures carry `ending_sustain`; Python and C++ validate a contiguous tail and consistent timing. Older scores without the new timing field retain their previous full-duration click behavior. Both toggles play the recorded count-in alone, then backing plus sample clicks until `sustain_start`. No clicks sound over the ending. Metronome-only supplies its own count-in and completes after the three silent held bars. Backing-only plays the complete file and decay. Both off enables manual navigation; hold exits and natural completion returns to the part menu. The final page remains visible through decay. -Preparation runs on a worker: checksums and samples are loaded before publishing a Sonus recording transport. Sonus streams backing audio through miniaudio’s background resource manager and mixes preloaded stereo clicks on the same rendered-frame clock. Callback work uses preallocated buffers, and resource retirement occurs on control threads. Stream failures stop progress and surface an error. Absolute rational beat positions are rounded to frames at 48 kHz once per position, avoiding accumulated rounding drift. The UI polls that audio clock for page boundaries and Count-in/Playing/Sustain status; wall-clock timers never determine musical progress. +Preparation runs on a worker: checksums and samples are loaded before publishing a Sonus recording transport. Sonus streams backing audio through miniaudio’s background resource manager and mixes preloaded stereo clicks on the same rendered-frame clock. Callback work uses preallocated buffers, and resource retirement occurs on control threads. Stream failures stop progress and surface an error. Absolute rational beat positions are rounded to frames at 48 kHz once per position, avoiding accumulated rounding drift. The UI polls that audio clock for system and measure boundaries and Count-in/Playing/Sustain status; wall-clock timers never determine musical progress. -Page metadata comes from actual system pagination and is preserved and revalidated in engraving caches. The UI prepares the current and next page before playback starts and retains a two-texture cache. Session and catalog identities reject stale preparation, page updates and completion after cancellation. Missing or corrupt pages/audio leave a visible error and permit hold/back. `--once` validates packaged recording checksums and all score pages without opening audio/display hardware. +Page metadata comes from actual system pagination and is preserved and revalidated in engraving caches. `presentation.pages` partitions the music into normal two-system pages. `presentation.playback_pages` holds one view per system: that system and its successor, or a final single top system. Both reuse the same system breaks, horizontal geometry, and part-wide scale, fitted against every adjacent pair. Each descriptor carries system measure ranges, exact beat boundaries, and page-coordinate rectangles for its measure labels. Normal systems partition the score; overlapping playback views must match that canonical partition. Bundles missing playback metadata require regeneration. + +Measure numbers are centered over their starting barlines (the staff’s left edge at system start), in a reserved lane above notation and below harmony/section labels. The display outlines the current label using the page texture’s letterbox transform; count-in, preparation, exit, and playback error clear it. Measure updates publish even when the line stays unchanged. Normal catalog page counts remain unchanged; the loader reads the separate playback count from bundle metadata. During automatic playback, navigation bounds, the header’s Line counter, and Pico’s page/pages fields refer to overlapping views. Manual browsing uses the normal sequence. The UI prepares the current and next page before playback starts and retains a two-texture cache. Session and catalog identities reject stale preparation, page updates and completion after cancellation. Missing or corrupt pages/audio leave a visible error and permit hold/back. `--once` validates packaged recording checksums and both normal and playback score pages without opening audio/display hardware. ### Authored Repertoire and Learned Solos @@ -263,7 +265,7 @@ Voices retain separate stems and collision offsets; chord tones retain their own Generated guitar tones carry `tablature: {string, fret}`; their staff is marked `tablature: true`. `engraving/tablature.py` draws a six-line TAB view below standard notation, sharing onset columns, barlines, and page breaks. Both views belong to one system and never duplicate the semantic timeline or playback events. Standard notation carries rhythm, rests, and tuplets; TAB carries positions, solo slashes, and tied continuations without rest glyphs. Strings and frets are validated against sounding pitch, and the layout audit checks each visible TAB numeral's position and alignment. -Every part uses two music systems per page; only an odd final system occupies a row alone. A compact title/composer/part header reserves the same height on every page, wrapping credits if necessary. Pagination fits the two systems using their individual heights and distributes extra whitespace around them while retaining minimum system and header/footer clearances. One uniform scale applies throughout the entire part, reducing the ordinary notation size only when required by the tallest pair. Notation, TAB, text, and anchors scale together without changing musical content. Guitar layout starts with 10-pixel notation spacing, 10.5-pixel TAB spacing, 12-pixel fret labels, and a 14-pixel minimum gap between systems. The unscaled TAB spacing accommodates Petaluma numerals up to 9.75 pixels tall. Tempo markings consume neither ink nor spacing; their semantic data is preserved. Existing `.pages/*.png` preview files are the exact packaged page textures. +Normal pages use two music systems; only an odd final system occupies a row alone. Playback pages use overlapping adjacent pairs and always finish with the last system alone on top. A compact title/composer/part header reserves the same height on every page, wrapping credits if necessary. Pagination fits the two systems using their individual heights and distributes extra whitespace around them while retaining minimum system and header/footer clearances. One uniform scale applies throughout the entire part, reducing the ordinary notation size only when required by the tallest adjacent pair, including transition pages. Notation, TAB, text, and anchors scale together without changing musical content. Guitar layout starts with 10-pixel notation spacing, 10.5-pixel TAB spacing, 12-pixel fret labels, and a 14-pixel minimum gap between systems. The unscaled TAB spacing accommodates Petaluma numerals up to 9.75 pixels tall. Tempo markings consume neither ink nor spacing; their semantic data is preserved. Existing `.pages/*.png` preview files are the exact packaged page textures. Line breaks occur only at measure boundaries. Each line fits as many complete measures as readable spacing allows; it never fills remaining space with a partial measure. A complete measure exceeding the available width or height fails with source and measure context instead of being split or squeezed to fit. Authored ties, beams, tuplets, and lyric spans can continue across whole-measure line breaks. Column measurement and fit trials reuse a score index and bounded column cache. Page placement then re-spaces columns for the final height-fitting scale, keeping every notation/TAB staff at the same physical left and right margins without stretching glyphs. Non-final lines are justified; a short final line retains natural note spacing while staff lines extend to the same right margin. Layout audits enforce these margins as well as musical coverage. diff --git a/generator/engraving/audit.py b/generator/engraving/audit.py index b842fd4..0c52455 100644 --- a/generator/engraving/audit.py +++ b/generator/engraving/audit.py @@ -79,6 +79,9 @@ def audit_layout(document: dict, layout: generator.engraving.types.LayoutDocumen # 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', 'scale', 'section')] + for label in (p for p in system.primitives if p.role == 'measure_number'): + if any(label.box.overlaps(p.box, 3 * system.scale) for p in system.primitives if p is not label): + raise generator.engraving.types.EngravingError(f'{label.sources}: measure number overlaps notation') for i, item in enumerate(checked): for other in checked[i + 1:]: if set(item.sources) & set(other.sources) and (item.role != 'tab' or other.role != 'tab'): @@ -141,3 +144,29 @@ def audit_layout(document: dict, layout: generator.engraving.types.LayoutDocumen for span in index.staff.get('octave_shifts', []): if not any(p.role == 'octave-shift' for p in primitives.get(span['id'], [])): raise generator.engraving.types.EngravingError(f'{span["id"]}: octave shift was omitted') + +def audit_playback(pages, playback, style, fonts): + canonical = [system for page in pages for system in page.systems] + if len(playback) != len(canonical): + raise generator.engraving.types.EngravingError('playback must have one view per system') + for i, page in enumerate(playback): + audit_primitives(page.primitives, page.width, page.height, fonts) + expected = canonical[i:i + 2] + if len(page.systems) != len(expected): + raise generator.engraving.types.EngravingError('invalid playback system pairing') + header = generator.engraving.types.bounds([p for p in page.primitives if p.role in ('title', 'subtitle')]) + footer = generator.engraving.types.bounds([p for p in page.primitives if p.role == 'page_number']) + if page.systems[0].box.top < header.bottom + style.page_clearance - 0.01 or page.systems[-1].box.bottom > footer.top - style.page_clearance + 0.01: + raise generator.engraving.types.EngravingError('playback overlaps header or footer') + for a, b in zip(page.systems, page.systems[1:]): + if a.box.bottom + style.system_gap > b.box.top + 0.01: + raise generator.engraving.types.EngravingError('playback systems overlap') + for source, actual in zip(expected, page.systems): + if (source.start, source.end, source.scale, source.fragments) != (actual.start, actual.end, actual.scale, actual.fragments): + raise generator.engraving.types.EngravingError('playback changes system content') + dy = actual.box.top - source.box.top + if len(source.primitives) != len(actual.primitives): + raise generator.engraving.types.EngravingError('playback changes primitives') + for a, b in zip(source.primitives, actual.primitives): + if (a.kind, a.role, a.sources, a.value, a.size) != (b.kind, b.role, b.sources, b.value, b.size) or len(a.points) != len(b.points) or any(abs(x - u) > .001 or abs(y + dy - v) > .001 for (x, y), (u, v) in zip(a.points, b.points)): + raise generator.engraving.types.EngravingError('playback changes notation geometry') diff --git a/generator/engraving/cache.py b/generator/engraving/cache.py index 057115f..8d64dd0 100644 --- a/generator/engraving/cache.py +++ b/generator/engraving/cache.py @@ -61,7 +61,7 @@ def restore_pages(entry: pathlib.Path, destination: pathlib.Path, validated_page return None destination.mkdir(parents=True, exist_ok=True) for index, page in enumerate(pages, 1): - if not isinstance(page, dict) or set(page) != {'path', 'sha256', 'first_measure', 'measure_count', 'start_beat', 'end_beat'} or page['path'] != f'{index:04}.png' or not isinstance(page['sha256'], str) or not re.fullmatch('[0-9a-f]{64}', page['sha256']): + if not isinstance(page, dict) or set(page) != {'path', 'sha256', 'first_measure', 'measure_count', 'start_beat', 'end_beat', 'systems', 'playback'} or type(page['playback']) is not bool or not isinstance(page['path'], str) or not re.fullmatch(r'(?:playback-)?[0-9]{4,5}\.png', page['path']) or not isinstance(page['sha256'], str) or not re.fullmatch('[0-9a-f]{64}', page['sha256']): return None path = entry / page['path'] if path.is_symlink() or not path.is_file(): @@ -88,7 +88,7 @@ def store_pages(entry: pathlib.Path, destination: pathlib.Path, pages: list[dict shutil.copyfile(destination / page['path'], staged / page['path']) (staged / 'pages.json').write_text(json.dumps(pages), encoding='utf-8') # Identical keys have identical pages; publish complete files, then the manifest. - for name in [page['path'] for page in pages] + ['pages.json']: + for name in list(dict.fromkeys(page['path'] for page in pages)) + ['pages.json']: target = entry / name if target.is_dir() and not target.is_symlink(): shutil.rmtree(target, ignore_errors=True) diff --git a/generator/engraving/layout.py b/generator/engraving/layout.py index 795d820..c21271c 100644 --- a/generator/engraving/layout.py +++ b/generator/engraving/layout.py @@ -57,7 +57,6 @@ def column(index: generator.engraving.notation.ScoreIndex, time: fractions.Fract items.append(fonts.text(generator.harmony.symbol(item), 0, 0, 18 if index.staff.get('tablature') else 21, 'harmony', (item['id'],))) items.extend(generator.engraving.scales.column(index, time, start, fonts)) 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, 16 if index.staff.get('tablature') else 19, 'section', (measure['id'] + ':section',))) return items, anchors, fragments @@ -103,6 +102,10 @@ def make_system(index: generator.engraving.notation.ScoreIndex, start: fractions for owner, ci, change in index.attributes_by_onset.get(time, []): extra = generator.engraving.attributes.staff_attributes(index, index.state(time), time, fonts, style.space, owner['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 time == measure_start: + # Anchor labels to the barline, not to the first note's time column. + bar_x = cursor - generator.engraving.types.bounds(leading).left if leading else 0 + items.append(fonts.text(str(m['number']), bar_x, 0, 12, 'measure_number', (m['id'],), True)) if leading: width = generator.engraving.types.bounds(leading).right - generator.engraving.types.bounds(leading).left + 14 items.extend(p.moved(cursor - generator.engraving.types.bounds(leading).left, 0) for p in leading) @@ -162,7 +165,7 @@ def fit_part_systems(systems, index, available_height, fonts, style): def fitting_scale(items): scale = 1 - for first in range(0, len(items), 2): + for first in range(len(items)): pair = items[first:first + 2] height = sum(s.box.bottom - s.box.top for s in pair) scale = min(scale, (available_height - style.system_gap * (len(pair) - 1)) / height) @@ -214,30 +217,36 @@ def part_header(document, fonts, style): result.append(fonts.text(line, style.margin_x, baseline, 12, 'subtitle', ())) return result -def paginate(systems: list[generator.engraving.types.System], document: dict, fonts: generator.engraving.fonts.Fonts, style: generator.engraving.types.Style, *, index=None) -> tuple[generator.engraving.types.Page, ...]: - pages = [] +def page_views(systems: list[generator.engraving.types.System], document: dict, fonts: generator.engraving.fonts.Fonts, style: generator.engraving.types.Style, *, index=None) -> tuple[tuple[generator.engraving.types.Page, ...], tuple[generator.engraving.types.Page, ...]]: index = index or generator.engraving.notation.ScoreIndex(document) header = part_header(document, fonts, style) top = generator.engraving.types.bounds(header).bottom + style.page_clearance - footers = [fonts.text(str(number), style.width / 2, style.height - style.margin_y, 12, 'page_number', (), True) for number in range(1, (len(systems) + 1) // 2 + 1)] + footers = [fonts.text(str(number), style.width / 2, style.height - style.margin_y, 12, 'page_number', (), True) for number in range(1, len(systems) + 1)] bottom = min(p.box.top for p in footers) - style.page_clearance if bottom - top <= style.system_gap: raise generator.engraving.types.EngravingError('page header leaves no room for two music systems') fitted = fit_part_systems(systems, index, bottom - top, fonts, style) - for first in range(0, len(systems), 2): - number = len(pages) + 1 - pair = fitted[first:first + 2] - slack = max(0, bottom - top - sum(s.box.bottom - s.box.top for s in pair) - style.system_gap * (len(pair) - 1)) - spacing = slack / 3 if len(pair) == 2 else 0 - cursor = top + spacing - placed = [] - for system in pair: - dx, dy = style.margin_x + 1, cursor - system.box.top - placed.append(dataclasses.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))) - cursor = placed[-1].box.bottom + style.system_gap + spacing - footer = footers[first // 2] - pages.append(generator.engraving.types.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 place(stride): + pages = [] + for first in range(0, len(fitted), stride): + number = len(pages) + 1 + pair = fitted[first:first + 2] + slack = max(0, bottom - top - sum(s.box.bottom - s.box.top for s in pair) - style.system_gap * (len(pair) - 1)) + spacing = slack / 3 if len(pair) == 2 else 0 + cursor = top + spacing + placed = [] + for system in pair: + dx, dy = style.margin_x + 1, cursor - system.box.top + placed.append(dataclasses.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))) + cursor = placed[-1].box.bottom + style.system_gap + spacing + pages.append(generator.engraving.types.Page(number, style.width, style.height, style.supersampling, tuple(placed), tuple(header + [p for s in placed for p in s.primitives] + [footers[number - 1]]))) + return tuple(pages) + + return place(2), place(1) + +def paginate(systems, document, fonts, style, *, index=None): + return page_views(systems, document, fonts, style, index=index)[0] def layout_systems(document: dict, style: generator.engraving.types.Style, fonts: generator.engraving.fonts.Fonts, *, index=None) -> tuple[generator.engraving.types.System, ...]: if index is None: diff --git a/generator/engraving/pipeline.py b/generator/engraving/pipeline.py index 8c2616f..6b01b00 100644 --- a/generator/engraving/pipeline.py +++ b/generator/engraving/pipeline.py @@ -101,14 +101,19 @@ def clear_pages(destination): shutil.rmtree(destination) def write_bundle(path, document, pages, fingerprint): - entries = [{**page, 'path': path.with_suffix('.pages').name + '/' + page['path']} for page in pages] + entries = [{k: v for k, v in {**page, 'path': path.with_suffix('.pages').name + '/' + page['path']}.items() if k != 'playback'} for page in pages] + normal = [entry for entry, page in zip(entries, pages) if not page['playback']] + playback = [entry for entry, page in zip(entries, pages) if page['playback']] music = document bundle = {'music': music, 'presentation': {'engine': generator.engraving.validation.ENGINE_NAME, 'style_sha256': fingerprint, - 'width': generator.engraving.validation.PAGE_WIDTH, 'height': generator.engraving.validation.PAGE_HEIGHT, 'pages': entries}} - generator.performance.validate_pages(document, pages) + 'width': generator.engraving.validation.PAGE_WIDTH, 'height': generator.engraving.validation.PAGE_HEIGHT, 'pages': normal, 'playback_pages': playback}} + validate_cached_views(document, pages) bundle['performance'] = generator.performance.timing(document) path.write_text(json.dumps(bundle, indent=2, ensure_ascii=False) + '\n', encoding='utf-8') +def validate_cached_views(document, pages): + generator.performance.validate_views(document, [p for p in pages if not p['playback']], [p for p in pages if p['playback']]) + def engrave_group(notation, paths, root, font_path, cache_dir, fingerprint, progress=False): family = generator.engraving.fonts.Fonts(font_path) style = generator.engraving.types.Style() @@ -140,19 +145,25 @@ def engrave_group(notation, paths, root, font_path, cache_dir, fingerprint, prog systems = generator.engraving.layout.layout_systems(document, style, family, index=index) result.timings['layout'] += time.monotonic() - started started = time.monotonic() - pages_layout = generator.engraving.layout.paginate(systems, document, family, style, index=index) + pages_layout, playback_layout = generator.engraving.layout.page_views(systems, document, family, style, index=index) placement = tuple((page.width, page.height, tuple((system.start, system.end, system.box) for system in page.systems)) for page in pages_layout) if placement not in audited: layout = generator.engraving.types.LayoutDocument(pages_layout, style, fingerprint) generator.engraving.audit.audit_layout(document, layout, family) + generator.engraving.audit.audit_playback(pages_layout, playback_layout, style, family) audited.add(placement) else: - for page in pages_layout: + for page in pages_layout + playback_layout: decoration = tuple(p for p in page.primitives if p.role in ('title', 'subtitle', 'page_number')) generator.engraving.audit.audit_primitives(decoration, page.width, page.height, family) result.timings['pagination'] += time.monotonic() - started pages = [] - for page in pages_layout: + rendered = {} + for is_playback, page in [(False, p) for p in pages_layout] + [(True, p) for p in playback_layout]: + if page.primitives in rendered: + name, digest = rendered[page.primitives] + pages.append(dict(path=name, sha256=digest, playback=is_playback, **generator.performance.page_timing(document, page))) + continue bands = generator.engraving.raster.page_bands(page) if bands is None: started = time.monotonic() @@ -161,12 +172,14 @@ def engrave_group(notation, paths, root, font_path, cache_dir, fingerprint, prog body = bodies.get(notation, page, bands[1], family) started = time.monotonic() image = generator.engraving.raster.compose_page(page, family, bands, body) - target = destination / f'{page.number:04}.png' + target = destination / (('playback-' if is_playback else '') + f'{page.number:04}.png') with image: image.save(target, format='PNG') result.timings['raster'] += time.monotonic() - started result.renderedpages += 1 - pages.append({'path': target.name, 'sha256': hashlib.sha256(target.read_bytes()).hexdigest(), **generator.performance.page_timing(document, page)}) + digest = hashlib.sha256(target.read_bytes()).hexdigest() + rendered[page.primitives] = target.name, digest + pages.append(dict(path=target.name, sha256=digest, playback=is_playback, **generator.performance.page_timing(document, page))) scores[score_key] = (destination, pages) write_bundle(path, document, pages, fingerprint) result.scores.append((path, score_key, pages)) @@ -213,7 +226,7 @@ def engrave_tree(root: pathlib.Path, fonts: pathlib.Path, *, cache_dir: pathlib. pages = generator.engraving.cache.restore_pages(entry, destination, validated_pages) if entry else None if pages is not None: try: - generator.performance.validate_pages(document, pages) + validate_cached_views(document, pages) except (ValueError, TypeError, KeyError): pages = None if pages is None: diff --git a/generator/engraving/spans.py b/generator/engraving/spans.py index c868341..92f0afc 100644 --- a/generator/engraving/spans.py +++ b/generator/engraving/spans.py @@ -123,7 +123,7 @@ def draw_spans(index: generator.engraving.notation.ScoreIndex, anchors: list[gen y = anchor.y - anchor.direction * 8 if anchor.x - 2 > left: result.append(generator.engraving.types.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', 'scale', 'tempo')), default=0)) + top = min(-style.space * 5, min((p.box.top for p in items if p.role not in ('harmony', 'lyric', 'section', 'scale', 'tempo', 'measure_number')), default=0)) tuplet_lanes = [] for span in index.staff.get('tuplets', []): a, b = index.by_id[span['start']], index.by_id[span['end']] @@ -203,11 +203,11 @@ def draw_spans(index: generator.engraving.notation.ScoreIndex, anchors: list[gen return items + result def place_text_lanes(items: list[generator.engraving.types.Primitive], fonts: generator.engraving.fonts.Fonts, style: generator.engraving.types.Style) -> list[generator.engraving.types.Primitive]: - music = [p for p in items if p.role not in ('harmony', 'lyric', 'section', 'scale')] + music = [p for p in items if p.role not in ('harmony', 'lyric', 'section', 'scale', 'measure_number')] box = generator.engraving.types.bounds(music) result = list(music) top = box.top - 12 - for role in ('harmony', 'scale', 'section'): + for role in ('measure_number', 'harmony', 'scale', 'section'): lane = [p for p in items if p.role == role] if lane: extent = generator.engraving.types.bounds(lane) diff --git a/generator/performance.py b/generator/performance.py index 02d50c0..1d668ad 100644 --- a/generator/performance.py +++ b/generator/performance.py @@ -4,6 +4,7 @@ from __future__ import annotations import fractions import hashlib import json +import math import pathlib import re import shutil @@ -23,7 +24,63 @@ def page_timing(document, page): times = boundaries(document) start, end = page.systems[0].start, page.systems[-1].end first, last = times.index(start), times.index(end) - return dict(first_measure=first + 1, measure_count=last - first, start_beat=generator.model.rational(start), end_beat=generator.model.rational(end)) + measures = document['staves'][0]['measures'] + systems = [] + for system in page.systems: + a, b = times.index(system.start), times.index(system.end) + labels = {p.sources[0]: p for p in system.primitives if p.role == 'measure_number'} + boxes = [] + for i in range(a, b): + box = labels[measures[i]['id']].box + boxes.append(dict(measure=i + 1, bounds=[box.left, box.top, box.right, box.bottom])) + systems.append(dict(first_measure=a + 1, measure_count=b - a, start_beat=generator.model.rational(system.start), end_beat=generator.model.rational(system.end), labels=boxes)) + return dict(first_measure=first + 1, measure_count=last - first, start_beat=generator.model.rational(start), end_beat=generator.model.rational(end), systems=systems) + +def validate_views(document, pages, playback_pages): + validate_pages(document, pages) + times = boundaries(document) + canonical = [] + + def system_range(system): + a, count = system['first_measure'], system['measure_count'] + if type(a) is not int or type(count) is not int or a < 1 or count < 1 or a + count > len(times): + raise ValueError('invalid system measure coverage') + if generator.model.fraction(system['start_beat']) != times[a - 1] or generator.model.fraction(system['end_beat']) != times[a + count - 1]: + raise ValueError('invalid system timing') + if [label['measure'] for label in system['labels']] != list(range(a, a + count)): + raise ValueError('invalid measure label coverage') + for label in system['labels']: + box = label['bounds'] + if not isinstance(box, list) or len(box) != 4 or any(type(v) not in (int, float) or not math.isfinite(v) for v in box) or not (4 <= box[0] < box[2] <= 972 and 4 <= box[1] < box[3] <= 480): + raise ValueError('invalid measure label bounds') + return a, count + + for page in pages: + systems = page.get('systems', []) + if len(systems) != 2 and (page is not pages[-1] or len(systems) != 1): + raise ValueError('invalid page systems') + cursor = page['first_measure'] + for system in systems: + a, count = system_range(system) + if a != cursor: + raise ValueError('system gap or overlap') + cursor += count + canonical.append(system) + if cursor != page['first_measure'] + page['measure_count']: + raise ValueError('systems disagree with page coverage') + if not isinstance(playback_pages, list) or len(playback_pages) != len(canonical): + raise ValueError('missing playback pages; regenerate score assets') + for i, page in enumerate(playback_pages): + expected = canonical[i:i + 2] + systems = page.get('systems', []) + if len(systems) != len(expected): + raise ValueError('invalid playback systems') + for actual, source in zip(systems, expected): + system_range(actual) + if any(actual[k] != source[k] for k in ('first_measure', 'measure_count', 'start_beat', 'end_beat')): + raise ValueError('playback changes system boundaries') + if any(page[k] != expected[0][k] for k in ('first_measure', 'start_beat')) or page['end_beat'] != expected[-1]['end_beat'] or page['measure_count'] != sum(s['measure_count'] for s in expected): + raise ValueError('invalid playback page timing') def validate_pages(document, pages): times = boundaries(document) diff --git a/generator/score.py b/generator/score.py index 866db39..dfc9377 100644 --- a/generator/score.py +++ b/generator/score.py @@ -24,10 +24,10 @@ def validate_json(document: dict, path: pathlib.Path, validated_pages: set[str] raise ValueError('invalid score bundle; regenerate score assets') if (presentation.get('engine'), presentation.get('width'), presentation.get('height')) != (generator.engraving.validation.ENGINE_NAME, generator.engraving.validation.PAGE_WIDTH, generator.engraving.validation.PAGE_HEIGHT): raise ValueError('unsupported score presentation; regenerate score assets') - generator.performance.validate_pages(document['music'], presentation['pages']) + generator.performance.validate_views(document['music'], presentation['pages'], presentation.get('playback_pages')) if document.get('performance') != generator.performance.timing(document['music']): raise ValueError('invalid performance timing') - for page in presentation['pages']: + for page in presentation['pages'] + presentation['playback_pages']: if not isinstance(page, dict) or not isinstance(page.get('path'), str) or not isinstance(page.get('sha256'), str): raise ValueError('invalid score page manifest') name = page['path'] diff --git a/include/vamp_zero/control.hpp b/include/vamp_zero/control.hpp index fbb32d1..6bbd02f 100644 --- a/include/vamp_zero/control.hpp +++ b/include/vamp_zero/control.hpp @@ -25,7 +25,7 @@ public: auto refresh_connection() -> std::optional; auto set_observer(std::function observer) -> void; auto finish_playback(std::uint64_t session, std::string error = {}, std::shared_ptr catalog = {}) -> void; - auto update_performance(std::uint64_t session, std::size_t page, std::string phase, std::shared_ptr catalog) -> void; + auto update_performance(std::uint64_t session, std::size_t page, std::string phase, std::shared_ptr catalog, std::optional measure = {}) -> void; private: auto pico_connected_locked() const -> std::bool_t; auto snapshot_locked() const -> vamp_zero::app_state; diff --git a/include/vamp_zero/performance.hpp b/include/vamp_zero/performance.hpp index 370e592..cd0035a 100644 --- a/include/vamp_zero/performance.hpp +++ b/include/vamp_zero/performance.hpp @@ -19,6 +19,7 @@ auto prepare_performance(vamp_zero::score_document const &score, vamp_zero::app_ struct performance_position { std::size_t page{}; std::string phase{}; + std::optional measure{}; }; auto performance_at(vamp_zero::score_document const &score, std::uint64_t frames, std::uint32_t bpm) -> vamp_zero::performance_position; diff --git a/include/vamp_zero/score.hpp b/include/vamp_zero/score.hpp index cdcb878..d0d2ebb 100644 --- a/include/vamp_zero/score.hpp +++ b/include/vamp_zero/score.hpp @@ -28,8 +28,10 @@ private: std::vector entries_{}; }; -auto score_page_count(vamp_zero::score_document const &score) -> std::size_t; -auto validated_page_path(vamp_zero::score_document const &score, std::size_t index) -> std::expected; -auto validate_score_page(vamp_zero::score_document const &score, std::size_t index) -> std::expected; +auto score_page_count(vamp_zero::score_document const &score, bool playback = false) -> std::size_t; +auto validated_page_path(vamp_zero::score_document const &score, std::size_t index, bool playback = false) -> std::expected; +auto validate_score_page(vamp_zero::score_document const &score, std::size_t index, bool playback = false) -> std::expected; +auto page_rectangle(luma::rect bounds) -> luma::rect; +auto measure_highlight(vamp_zero::score_page const &page, std::optional measure, luma::rect image) -> std::optional; } diff --git a/include/vamp_zero/types.hpp b/include/vamp_zero/types.hpp index ca524d8..cc1ec8c 100644 --- a/include/vamp_zero/types.hpp +++ b/include/vamp_zero/types.hpp @@ -3,6 +3,8 @@ #include #include #include +#include +#include #include #include @@ -23,6 +25,18 @@ struct score_page { std::size_t measure_count{}; vamp_zero::beat_position start_beat{}; vamp_zero::beat_position end_beat{}; + struct measure_label { + std::size_t measure{}; + std::array bounds{}; + }; + struct system { + std::size_t first_measure{}; + std::size_t measure_count{}; + vamp_zero::beat_position start_beat{}; + vamp_zero::beat_position end_beat{}; + std::vector labels{}; + }; + std::vector systems{}; }; struct score_document { @@ -41,6 +55,8 @@ struct score_document { vamp_zero::beat_position duration{}; vamp_zero::beat_position sustain_start{}; std::uint32_t count_in_beats{4}; + std::vector playback_pages{}; + std::vector measure_boundaries{}; }; struct library_part { @@ -54,6 +70,7 @@ struct library_part { std::size_t total_pages{}; std::string title_image{}; std::string song_id{}; + std::size_t playback_pages{}; }; struct song_group { @@ -116,6 +133,7 @@ struct app_state { std::uint64_t score_session{}; std::uint64_t input_revision{}; std::bool_t pico_connected{false}; + std::optional active_measure{}; }; auto to_string(vamp_zero::app_mode value) -> std::string; diff --git a/src/vamp_zero/app.cpp b/src/vamp_zero/app.cpp index 7947d04..afac652 100644 --- a/src/vamp_zero/app.cpp +++ b/src/vamp_zero/app.cpp @@ -180,10 +180,12 @@ auto validate_score_pages(boost::asio::any_io_executor executor, vamp_zero::conf if (!score) { co_return std::unexpected(score.error()); } - for (auto page = std::size_t{}; page < vamp_zero::score_page_count(*score); ++page) { - auto valid = vamp_zero::validate_score_page(*score, page); - if (!valid) { - co_return std::unexpected(valid.error()); + for (auto playback : {false, true}) { + for (auto page = std::size_t{}; page < vamp_zero::score_page_count(*score, playback); ++page) { + auto valid = vamp_zero::validate_score_page(*score, page, playback); + if (!valid) { + co_return std::unexpected(valid.error()); + } } } co_return std::expected{}; @@ -301,7 +303,7 @@ private: } if (loaded.document) { if (auto position = audio_->position(*loaded.document, app.audio.tempo_bpm)) { - state_.update_performance(app.score_session, position->page, position->phase, app.catalog); + state_.update_performance(app.score_session, position->page, position->phase, app.catalog, position->measure); } } } else if (vamp_zero::automatic(app.audio) && vamp_zero::selected_score_reference(app) && app.audio.playback_error.empty()) { diff --git a/src/vamp_zero/control.cpp b/src/vamp_zero/control.cpp index 111491a..2b05a55 100644 --- a/src/vamp_zero/control.cpp +++ b/src/vamp_zero/control.cpp @@ -227,6 +227,7 @@ auto vamp_zero::control_state::finish_playback(std::uint64_t session, std::strin } else { state_.audio.playback_error = std::move(error); state_.audio.phase = "Error"; + state_.active_measure.reset(); } updated = snapshot_locked(); observer = observer_; @@ -280,7 +281,7 @@ auto vamp_zero::make_router(vamp_zero::control_state &state) -> ligo::service_ro return router; } -auto vamp_zero::control_state::update_performance(std::uint64_t session, std::size_t page, std::string phase, std::shared_ptr catalog) -> void { +auto vamp_zero::control_state::update_performance(std::uint64_t session, std::size_t page, std::string phase, std::shared_ptr catalog, std::optional measure) -> void { std::function observer; vamp_zero::app_state updated; { @@ -288,11 +289,12 @@ auto vamp_zero::control_state::update_performance(std::uint64_t session, std::si if (!vamp_zero::automatic(state_.audio) || state_.mode != vamp_zero::app_mode::PERFORMANCE_SCORE || state_.score_session != session || state_.catalog != catalog || !state_.audio.playback_error.empty()) { return; } - if (state_.page_index == page && state_.audio.phase == phase) { + if (state_.page_index == page && state_.audio.phase == phase && state_.active_measure == measure) { return; } state_.page_index = page; state_.audio.phase = std::move(phase); + state_.active_measure = measure; ++state_.input_revision; updated = snapshot_locked(); observer = observer_; diff --git a/src/vamp_zero/database.cpp b/src/vamp_zero/database.cpp index 209222f..990e36e 100644 --- a/src/vamp_zero/database.cpp +++ b/src/vamp_zero/database.cpp @@ -159,7 +159,7 @@ auto vamp_zero::async_load_catalog(boost::asio::any_io_executor executor, vamp_z co_return std::unexpected(connected.error()); } auto selected = - co_await connection.async_prepare("SELECT id, title, composer, part, source_path, measure_count, key_signature, total_pages, title_image, json_extract(source_json, '$.music.metadata.song_id') FROM " + co_await connection.async_prepare("SELECT id, title, composer, part, source_path, measure_count, key_signature, total_pages, title_image, json_extract(source_json, '$.music.metadata.song_id'), json_array_length(source_json, '$.presentation.playback_pages') FROM " "songs ORDER BY title, composer, part, id"); if (!selected) { auto close = co_await connection.async_close(); @@ -180,8 +180,8 @@ auto vamp_zero::async_load_catalog(boost::asio::any_io_executor executor, vamp_z break; } auto const &row = **next; - if (row.size() != 10U || count_value(row[5]) == 0U || count_value(row[7]) == 0U || !valid_title_image(row[8])) { - status = std::unexpected(vamp_zero::make_error(vamp_zero::error_code::PERSISTENCE, "invalid performance metadata")); + if (row.size() != 11U || count_value(row[5]) == 0U || count_value(row[7]) == 0U || count_value(row[10]) == 0U || !valid_title_image(row[8])) { + status = std::unexpected(vamp_zero::make_error(vamp_zero::error_code::PERSISTENCE, "invalid performance metadata; regenerate score assets")); break; } auto source = resolve_source_path(assets_path, text_value(row[4])); @@ -200,6 +200,7 @@ auto vamp_zero::async_load_catalog(boost::asio::any_io_executor executor, vamp_z .total_pages = count_value(row[7]), .title_image = text_value(row[8]), .song_id = text_value(row[9]), + .playback_pages = count_value(row[10]), }); } auto audio_assets = std::expected, modulus::error>{}; diff --git a/src/vamp_zero/menu_view.cpp b/src/vamp_zero/menu_view.cpp index bb236d8..eb0b2b5 100644 --- a/src/vamp_zero/menu_view.cpp +++ b/src/vamp_zero/menu_view.cpp @@ -92,7 +92,7 @@ auto vamp_zero::draw_header(luma::draw_context &context, luma::rect bounds, vamp context.stroke_line({bounds.x + 36.0F, bounds.y + 79.0F}, {bounds.x + bounds.width - 36.0F, bounds.y + 79.0F}, 1.0F, vamp_zero::to_luma(vamp_style::rule)); draw_label(context, {bounds.x + 36.0F, bounds.y + 8.0F, 260.0F, 60.0F}, "Product Vamp", 30.0F, vamp_style::ink); if (auto part = active_part(state); state.mode == vamp_zero::app_mode::PERFORMANCE_SCORE && part != nullptr) { - auto summary = state.audio.phase + " " + std::to_string(state.audio.tempo_bpm) + " BPM " + std::to_string(state.page_index + 1U) + "/" + std::to_string(part->total_pages); + auto summary = state.audio.phase + " " + std::to_string(state.audio.tempo_bpm) + " BPM " + (vamp_zero::automatic(state.audio) ? "Line " : "Page ") + std::to_string(state.page_index + 1U) + "/" + std::to_string(vamp_zero::active_pages(state)); draw_label(context, {bounds.x + 310.0F, bounds.y + 46.0F, bounds.width - 550.0F, 26.0F}, "Hold to exit", 15.0F, vamp_style::muted); draw_label(context, {bounds.x + 310.0F, bounds.y + 7.0F, bounds.width - 550.0F, 38.0F}, state.audio.playback_error.empty() ? summary : state.audio.playback_error, 20.0F, state.audio.playback_error.empty() ? vamp_style::muted : vamp_style::danger); } diff --git a/src/vamp_zero/navigation.cpp b/src/vamp_zero/navigation.cpp index 53f08b3..2d79a52 100644 --- a/src/vamp_zero/navigation.cpp +++ b/src/vamp_zero/navigation.cpp @@ -1,6 +1,7 @@ #include #include +#include auto vamp_zero::selected_group(vamp_zero::app_state const &state) -> vamp_zero::song_group const * { @@ -40,7 +41,7 @@ auto vamp_zero::active_part(vamp_zero::app_state const &state) -> vamp_zero::lib auto vamp_zero::active_pages(vamp_zero::app_state const &state) -> std::size_t { if (state.mode == vamp_zero::app_mode::PERFORMANCE_SCORE) { auto const *part = vamp_zero::active_part(state); - return part == nullptr ? 0U : part->total_pages; + return part == nullptr ? 0U : (automatic(state.audio) ? part->playback_pages : part->total_pages); } return 0U; } diff --git a/src/vamp_zero/notation.cpp b/src/vamp_zero/notation.cpp index c37ee20..42f99ba 100644 --- a/src/vamp_zero/notation.cpp +++ b/src/vamp_zero/notation.cpp @@ -1,5 +1,6 @@ #include #include +#include #include #include #include @@ -141,42 +142,120 @@ auto vamp_zero::parse_notation_document(std::string_view json, std::string sourc } catch (...) { return invalid("missing performance timing; regenerate score assets"); } - auto cursor = std::size_t{}; - for (auto const &item : *pages) { - if (!item.is_object()) { - return invalid("page must be an object"); + try { + for (auto const &time : times) { + document.measure_boundaries.push_back({numerator(time).convert_to(), denominator(time).convert_to()}); } - auto path = string_field(item.as_object(), "path"); - auto hash = string_field(item.as_object(), "sha256"); - if (!path || !hash) { - return invalid("page requires path and sha256 strings"); + auto const *playback = array_field(*presentation, "playback_pages"); + if (!playback || playback->empty() || playback->size() > 10000) { + return invalid("missing playback pages; regenerate score assets"); } - auto relative = std::filesystem::path{*path}; - if (path->empty() || path->find('\0') != std::string::npos || path->find('\\') != std::string::npos || - relative.is_absolute() || relative.extension() != ".png" || - std::any_of(relative.begin(), relative.end(), [](auto const &component) { return component == ".." || component == "."; })) { - return invalid("page paths must be safe relative PNG paths"); - } - if (hash->size() != 64 || !std::all_of(hash->begin(), hash->end(), [](std::char_t ch) { - return (ch >= '0' && ch <= '9') || (ch >= 'a' && ch <= 'f'); - })) { - return invalid("page sha256 must be 64 lowercase hexadecimal digits"); - } - try { - auto first = item.at("first_measure").to_number(); - auto count = item.at("measure_count").to_number(); - auto start = vamp_zero::parse_beat(item.at("start_beat")), end = vamp_zero::parse_beat(item.at("end_beat")); - if (first != cursor + 1 || count == 0 || count > measures->size() - cursor || !start || !end || rational(*start) != times[cursor] || rational(*end) != times[cursor + count]) { + auto parse_page = [&](boost::json::value const &item) -> score_page { + if (!item.is_object()) { + throw std::invalid_argument("page must be an object"); + } + auto path = string_field(item.as_object(), "path"); + auto hash = string_field(item.as_object(), "sha256"); + if (!path || !hash) { + throw std::invalid_argument("page requires path and sha256 strings"); + } + auto relative = std::filesystem::path{*path}; + if (path->empty() || path->find('\0') != std::string::npos || path->find('\\') != std::string::npos || + relative.is_absolute() || relative.extension() != ".png" || + std::any_of(relative.begin(), relative.end(), [](auto const &component) { return component == ".." || component == "."; })) { + throw std::invalid_argument("page paths must be safe relative PNG paths"); + } + if (hash->size() != 64 || !std::all_of(hash->begin(), hash->end(), [](std::char_t ch) { + return (ch >= '0' && ch <= '9') || (ch >= 'a' && ch <= 'f'); + })) { + throw std::invalid_argument("page sha256 must be 64 lowercase hexadecimal digits"); + } + auto parse_range = [&](boost::json::value const &value, auto &range) { + range.first_measure = value.at("first_measure").to_number(); + range.measure_count = value.at("measure_count").to_number(); + auto a = range.first_measure, count = range.measure_count; + auto start = parse_beat(value.at("start_beat")), end = parse_beat(value.at("end_beat")); + if (!a || a > measures->size() || !count || count > measures->size() - (a - 1) || !start || !end || rational(*start) != times[a - 1] || rational(*end) != times[a + count - 1]) { + throw std::invalid_argument("invalid page/system timing or coverage"); + } + range.start_beat = *start; + range.end_beat = *end; + }; + auto result = score_page{}; + result.path = std::move(*path); + result.sha256 = std::move(*hash); + parse_range(item, result); + auto const &systems = item.at("systems").as_array(); + if (systems.empty() || systems.size() > 2) { + throw std::invalid_argument("invalid page systems"); + } + auto cursor = result.first_measure; + for (auto const &value : systems) { + auto system = score_page::system{}; + parse_range(value, system); + if (system.first_measure != cursor) { + throw std::invalid_argument("system gap or overlap"); + } + auto const &labels = value.at("labels").as_array(); + if (labels.size() != system.measure_count) { + throw std::invalid_argument("invalid measure label coverage"); + } + for (auto const &label : labels) { + auto parsed = score_page::measure_label{}; + parsed.measure = label.at("measure").to_number(); + auto const &bounds = label.at("bounds").as_array(); + if (parsed.measure != cursor++ || bounds.size() != 4) { + throw std::invalid_argument("invalid measure label"); + } + for (std::size_t k = 0; k < 4; ++k) { + parsed.bounds[k] = bounds[k].to_number(); + if (!std::isfinite(parsed.bounds[k])) { + throw std::invalid_argument("non-finite label bounds"); + } + } + auto const &r = parsed.bounds; + if (!(4 <= r[0] && r[0] < r[2] && r[2] <= 972 && 4 <= r[1] && r[1] < r[3] && r[3] <= 480)) { + throw std::invalid_argument("invalid label bounds"); + } + system.labels.push_back(parsed); + } + result.systems.push_back(std::move(system)); + } + if (cursor != result.first_measure + result.measure_count) { + throw std::invalid_argument("systems disagree with page coverage"); + } + return result; + }; + auto cursor = std::size_t{1}; + auto canonical = std::vector{}; + for (auto const &item : *pages) { + auto page = parse_page(item); + if (page.first_measure != cursor || (page.systems.size() != 2 && &item != &pages->back())) { return invalid("invalid page measure coverage"); } - document.pages.push_back({std::move(*path), std::move(*hash), first, count, *start, *end}); - cursor += count; - } catch (...) { - return invalid("missing page timing; regenerate score assets"); + cursor += page.measure_count; + canonical.insert(canonical.end(), page.systems.begin(), page.systems.end()); + document.pages.push_back(std::move(page)); } - } - if (cursor != measures->size()) { - return invalid("incomplete page measure coverage"); + if (cursor != measures->size() + 1 || playback->size() != canonical.size()) { + return invalid("incomplete normal or playback coverage"); + } + for (std::size_t i = 0; i < playback->size(); ++i) { + auto page = parse_page((*playback)[i]); + if (page.systems.size() != std::min(std::size_t{2}, canonical.size() - i)) { + return invalid("invalid playback system pairing"); + } + for (std::size_t j = 0; j < page.systems.size(); ++j) { + auto const &a = canonical[i + j]; + auto const &b = page.systems[j]; + if (a.first_measure != b.first_measure || a.measure_count != b.measure_count) { + return invalid("playback changes system boundaries"); + } + } + document.playback_pages.push_back(std::move(page)); + } + } catch (std::exception const &error) { + return invalid(std::string{"invalid playback presentation: "} + error.what() + "; regenerate score assets"); } document.id = std::filesystem::path{source_path}.stem().string(); document.source_path = std::move(source_path); diff --git a/src/vamp_zero/page_control.cpp b/src/vamp_zero/page_control.cpp index 7cffafc..4621530 100644 --- a/src/vamp_zero/page_control.cpp +++ b/src/vamp_zero/page_control.cpp @@ -90,6 +90,7 @@ auto clamp_state(vamp_zero::app_state state) -> vamp_zero::app_state { : vamp_zero::app_mode::PERFORMANCE_PART_MENU; state.active_part_id.clear(); state.page_index = 0; + state.active_measure.reset(); } if (state.mode != vamp_zero::app_mode::SETTINGS_MENU) { state.audio.tempo_editing = false; @@ -98,6 +99,10 @@ auto clamp_state(vamp_zero::app_state state) -> vamp_zero::app_state { state.page_index = std::min(state.page_index, pages - 1U); } else if (state.mode != vamp_zero::app_mode::PERFORMANCE_SCORE) { state.page_index = 0; + state.active_measure.reset(); + } + if (!automatic(state.audio)) { + state.active_measure.reset(); } return state; } @@ -179,9 +184,11 @@ auto vamp_zero::apply_app_command(vamp_zero::app_state state, vamp_protocol::pag state.mode = vamp_zero::app_mode::PERFORMANCE_SONG_MENU; state.active_part_id.clear(); state.page_index = 0; + state.active_measure.reset(); } else if (auto const *part = selected_part(state); part != nullptr) { state.active_part_id = part->id; state.page_index = 0; + state.active_measure.reset(); state.mode = vamp_zero::app_mode::PERFORMANCE_SCORE; ++state.score_session; state.audio.playback_error.clear(); @@ -202,6 +209,7 @@ auto vamp_zero::apply_app_command(vamp_zero::app_state state, vamp_protocol::pag state.mode = vamp_zero::app_mode::PERFORMANCE_PART_MENU; state.active_part_id.clear(); state.page_index = 0; + state.active_measure.reset(); } } return clamp_state(std::move(state)); @@ -223,7 +231,7 @@ auto vamp_zero::remote_display_text(vamp_zero::app_state const &state) -> std::s title_image = selected->title_image; part = selected->part; page = state.page_index + 1U; - pages = selected->total_pages; + pages = active_pages(state); } } auto focus = menu_row(state, menu_selection(state)).label; @@ -286,7 +294,7 @@ auto vamp_zero::validate_app_state(vamp_zero::app_state const &state) -> std::ex if (part == nullptr) { return std::unexpected(vamp_zero::make_error(vamp_zero::error_code::INVALID_ARGUMENT, "performance score mode requires an active part")); } - if (part->total_pages == 0U || state.page_index >= part->total_pages) { + if (active_pages(state) == 0U || state.page_index >= active_pages(state)) { return std::unexpected(vamp_zero::make_error(vamp_zero::error_code::INVALID_ARGUMENT, "performance score page index is out of range")); } } diff --git a/src/vamp_zero/performance.cpp b/src/vamp_zero/performance.cpp index a328efb..d066f63 100644 --- a/src/vamp_zero/performance.cpp +++ b/src/vamp_zero/performance.cpp @@ -201,10 +201,14 @@ auto vamp_zero::performance_at(vamp_zero::score_document const &score, std::uint } auto beat_frames = frames - count_in; auto page = std::size_t{}; - while (page + 1 < score.pages.size() && frame_at(score.pages[page + 1].start_beat, bpm) <= beat_frames) { + while (page + 1 < score.playback_pages.size() && frame_at(score.playback_pages[page + 1].start_beat, bpm) <= beat_frames) { ++page; } - return {page, beat_frames < frame_at(score.sustain_start, bpm) ? "Playing" : "Sustain"}; + auto measure = std::size_t{1}; + while (measure < score.measure_count && frame_at(score.measure_boundaries[measure], bpm) <= beat_frames) { + ++measure; + } + return {page, beat_frames < frame_at(score.sustain_start, bpm) ? "Playing" : "Sustain", measure}; } auto vamp_zero::validate_audio_assets(vamp_zero::catalog const &catalog, std::filesystem::path const &assets) -> std::expected { diff --git a/src/vamp_zero/score.cpp b/src/vamp_zero/score.cpp index c2473d7..fcc606a 100644 --- a/src/vamp_zero/score.cpp +++ b/src/vamp_zero/score.cpp @@ -43,8 +43,35 @@ auto vamp_zero::score_page_cache::size() const -> std::size_t { return entries_.size(); } -auto vamp_zero::score_page_count(vamp_zero::score_document const &score) -> std::size_t { - return score.pages.size(); +auto vamp_zero::score_page_count(vamp_zero::score_document const &score, bool playback) -> std::size_t { + return (playback ? score.playback_pages : score.pages).size(); +} + +auto vamp_zero::page_rectangle(luma::rect bounds) -> luma::rect { + auto scale = std::min(bounds.width / 976.0F, bounds.height / 484.0F); + return {.x = bounds.x + (bounds.width - 976.0F * scale) / 2.0F, + .y = bounds.y + (bounds.height - 484.0F * scale) / 2.0F, + .width = 976.0F * scale, + .height = 484.0F * scale}; +} + +auto vamp_zero::measure_highlight(vamp_zero::score_page const &page, std::optional measure, luma::rect image) -> std::optional { + if (!measure) { + return {}; + } + for (auto const &system : page.systems) { + for (auto const &label : system.labels) { + if (label.measure == *measure) { + auto scale = image.width / 976.0F; + auto const &b = label.bounds; + return luma::rect{.x = image.x + static_cast(b[0] - 3) * scale, + .y = image.y + static_cast(b[1] - 3) * scale, + .width = static_cast(b[2] - b[0] + 6) * scale, + .height = static_cast(b[3] - b[1] + 6) * scale}; + } + } + } + return {}; } namespace { @@ -54,11 +81,12 @@ struct page_file { std::vector bytes; }; -auto read_page(vamp_zero::score_document const &score, std::size_t index) -> std::expected { +auto read_page(vamp_zero::score_document const &score, std::size_t index, bool playback) -> std::expected { auto fail = [&](std::string message) -> std::expected { return std::unexpected(vamp_zero::make_error(vamp_zero::error_code::INVALID_ARGUMENT, score.source_path + ": " + std::move(message) + "; regenerate score page assets")); }; - if (index >= score.pages.size()) { + auto const &pages = playback ? score.playback_pages : score.pages; + if (index >= pages.size()) { return fail("page index outside score"); } auto error = std::error_code{}; @@ -66,7 +94,7 @@ auto read_page(vamp_zero::score_document const &score, std::size_t index) -> std if (error) { return fail("score asset directory is missing"); } - auto path = std::filesystem::canonical(root / score.pages[index].path, error); + auto path = std::filesystem::canonical(root / pages[index].path, error); if (error) { return fail("score page is missing"); } @@ -95,7 +123,7 @@ auto read_page(vamp_zero::score_document const &score, std::size_t index) -> std hash.push_back(digits[byte >> 4U]); hash.push_back(digits[byte & 15U]); } - if (hash != score.pages[index].sha256) { + if (hash != pages[index].sha256) { return fail("score page checksum mismatch"); } return page_file{path.string(), std::move(bytes)}; @@ -103,16 +131,16 @@ auto read_page(vamp_zero::score_document const &score, std::size_t index) -> std } -auto vamp_zero::validated_page_path(vamp_zero::score_document const &score, std::size_t index) -> std::expected { - auto page = read_page(score, index); +auto vamp_zero::validated_page_path(vamp_zero::score_document const &score, std::size_t index, bool playback) -> std::expected { + auto page = read_page(score, index, playback); if (!page) { return std::unexpected(page.error()); } return std::move(page->path); } -auto vamp_zero::validate_score_page(vamp_zero::score_document const &score, std::size_t index) -> std::expected { - auto page = read_page(score, index); +auto vamp_zero::validate_score_page(vamp_zero::score_document const &score, std::size_t index, bool playback) -> std::expected { + auto page = read_page(score, index, playback); if (!page) { return std::unexpected(page.error()); } diff --git a/src/vamp_zero/ui.cpp b/src/vamp_zero/ui.cpp index 679fce3..851dcc3 100644 --- a/src/vamp_zero/ui.cpp +++ b/src/vamp_zero/ui.cpp @@ -23,6 +23,7 @@ #include #include #include +#include #include #include @@ -46,8 +47,9 @@ struct score_draw_cache { if (!score) { return std::unexpected(vamp_zero::make_error(vamp_zero::error_code::UNAVAILABLE, "score no longer selected")); } - auto found = std::find_if(score->pages.begin(), score->pages.end(), [&](auto const &page) { return page.path == name; }); - auto path = vamp_zero::validated_page_path(*score, static_cast(std::distance(score->pages.begin(), found))); + auto const &pages = playback ? score->playback_pages : score->pages; + auto found = std::find_if(pages.begin(), pages.end(), [&](auto const &page) { return page.path == name; }); + auto path = vamp_zero::validated_page_path(*score, static_cast(std::distance(pages.begin(), found)), playback); if (!path) { return std::unexpected(path.error()); } @@ -60,30 +62,34 @@ struct score_draw_cache { textures.clear(); document = score; } - auto draw(luma::draw_context &context, luma::rect bounds, std::size_t index) -> std::expected { + auto draw(luma::draw_context &context, luma::rect bounds, std::size_t index, bool automatic, std::optional measure) -> std::expected { auto score = document.lock(); - if (!score || index >= score->pages.size()) { + playback = automatic; + if (!score || index >= vamp_zero::score_page_count(*score, playback)) { return std::unexpected(vamp_zero::make_error(vamp_zero::error_code::INVALID_ARGUMENT, "page index outside score")); } - auto texture = textures.get(score->pages[index].path); + auto const &pages = playback ? score->playback_pages : score->pages; + auto texture = textures.get(pages[index].path); if (!texture) { return std::unexpected(texture.error()); } - if (index + 1 < score->pages.size()) { - auto next = textures.get(score->pages[index + 1].path); + if (index + 1 < pages.size()) { + auto next = textures.get(pages[index + 1].path); if (!next) { return std::unexpected(next.error()); } } - auto scale = std::min(bounds.width / 976.0F, bounds.height / 484.0F); - auto page = luma::rect{.x = bounds.x + (bounds.width - 976.0F * scale) / 2.0F, - .y = bounds.y + (bounds.height - 484.0F * scale) / 2.0F, - .width = 976.0F * scale, - .height = 484.0F * scale}; + auto page = vamp_zero::page_rectangle(bounds); context.fill_rect(page, vamp_zero::to_luma(vamp_style::background)); context.draw_texture(**texture, {.x = 0, .y = 0, .width = 976, .height = 484}, page, {.r = 255, .g = 255, .b = 255, .a = 255}); + if (playback) { + if (auto highlight = vamp_zero::measure_highlight(pages[index], measure, page)) { + context.stroke_rect(*highlight, std::max(1.0F, 1.5F * page.width / 976.0F), vamp_zero::to_luma(vamp_style::accent)); + } + } return {}; } + bool playback{}; vamp_zero::score_page_cache textures; std::weak_ptr document{}; }; @@ -108,7 +114,7 @@ auto draw_score(luma::draw_context &context, luma::rect bounds, vamp_zero::app_s .width = bounds.width - 48.0F, .height = bounds.height - 36.0F, }; - auto status = score_cache.draw(context, paper_bounds, state.page_index); + auto status = score_cache.draw(context, paper_bounds, state.page_index, vamp_zero::automatic(state.audio), state.active_measure); loader.pages_prepared(loaded.document, status); if (!status) { vamp_zero::draw_label(context, {bounds.x + 36.0F, bounds.y + 38.0F, bounds.width - 72.0F, 48.0F}, "SCORE PAGE ERROR", 26.0F, vamp_style::danger); diff --git a/tests/catalog_fixture.hpp b/tests/catalog_fixture.hpp index 7d7f55f..dc6c70d 100644 --- a/tests/catalog_fixture.hpp +++ b/tests/catalog_fixture.hpp @@ -20,7 +20,7 @@ inline auto add_timing(boost::json::value &value) -> void { music.at("metadata").as_object()["song_id"] = "fixture"; auto &measures = music.at("staves").as_array().front().at("measures").as_array(); auto &pages = value.at("presentation").at("pages").as_array(); - while (measures.size() < pages.size()) { + while (measures.size() < 2 * pages.size() - 1) { measures.push_back(boost::json::object{}); } auto beat = [](std::size_t n) { return boost::json::object{{"numerator", n}, {"denominator", 1}}; }; @@ -32,15 +32,43 @@ inline auto add_timing(boost::json::value &value) -> void { } } std::size_t cursor{}; + auto systems = boost::json::array{}; for (std::size_t i = 0; i < pages.size(); ++i) { - auto count = i + 1 == pages.size() ? measures.size() - cursor : 1U; + auto count = i + 1 == pages.size() ? measures.size() - cursor : 2U; auto &page = pages[i].as_object(); page["first_measure"] = cursor + 1; page["measure_count"] = count; page["start_beat"] = beat(cursor * 4); page["end_beat"] = beat((cursor + count) * 4); - cursor += count; + auto members = boost::json::array{}; + for (std::size_t j = 0; j < (i + 1 == pages.size() ? 1U : 2U); ++j) { + auto n = i + 1 == pages.size() ? count : 1U; + auto labels = boost::json::array{}; + for (std::size_t k = 0; k < n; ++k) { + labels.push_back(boost::json::object{{"measure", cursor + k + 1}, {"bounds", boost::json::array{30 + k * 30, 70 + j * 220, 42 + k * 30, 82 + j * 220}}}); + } + auto system = boost::json::object{{"first_measure", cursor + 1}, {"measure_count", n}, {"start_beat", beat(cursor * 4)}, {"end_beat", beat((cursor + n) * 4)}, {"labels", labels}}; + members.push_back(system); + systems.push_back(system); + cursor += n; + } + page["systems"] = members; } + auto playback = boost::json::array{}; + for (std::size_t i = 0; i < systems.size(); ++i) { + auto page = pages[std::min(i / 2, pages.size() - 1)].as_object(); + auto members = boost::json::array{systems[i]}; + if (i + 1 < systems.size()) { + members.push_back(systems[i + 1]); + } + page["systems"] = members; + page["first_measure"] = members.front().at("first_measure"); + page["start_beat"] = members.front().at("start_beat"); + page["end_beat"] = members.back().at("end_beat"); + page["measure_count"] = members.back().at("first_measure").to_number() + members.back().at("measure_count").to_number() - members.front().at("first_measure").to_number(); + playback.push_back(page); + } + value.at("presentation").as_object()["playback_pages"] = playback; value.as_object()["performance"] = boost::json::object{{"song_id", "fixture"}, {"duration", beat(measures.size() * 4)}, {"count_in_beats", 4}, {"clicks", clicks}}; } diff --git a/tests/fixtures/engraving_python.png b/tests/fixtures/engraving_python.png index d3459a0e14d55ae235f3faf7d10adf6e6f404cdb..5f9bfa56cdbb7404d638456f1248708762b1bc7e 100644 GIT binary patch literal 30643 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 G+5ZAWV|bMS literal 30697 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 diff --git a/tests/test.cpp b/tests/test.cpp index a4ba568..3e51b5a 100644 --- a/tests/test.cpp +++ b/tests/test.cpp @@ -245,7 +245,7 @@ BOOST_AUTO_TEST_CASE(empty_catalog_navigation_and_main_menu_wrap) { BOOST_AUTO_TEST_CASE(song_part_navigation_preserves_selection_and_remote_display) { auto parts = std::vector{}; for (auto name : {"Acoustic", "Electric", "Vocal"}) { - parts.push_back({.id = name, .title = "Song", .composer = "Composer", .part = name, .total_pages = 3}); + parts.push_back({.id = name, .title = "Song", .composer = "Composer", .part = name, .total_pages = 3, .playback_pages = 5}); } auto state = vamp_zero::app_state{ .catalog = std::make_shared(vamp_zero::group_ordered_parts(std::move(parts))), @@ -264,7 +264,7 @@ BOOST_AUTO_TEST_CASE(song_part_navigation_preserves_selection_and_remote_display BOOST_REQUIRE(vamp_pico::parse_remote_display_body(vamp_zero::remote_display_text(state), remote)); BOOST_TEST(remote.active); BOOST_TEST(std::string{remote.part} == name); - BOOST_TEST(remote.pages == 3U); + BOOST_TEST(remote.pages == 5U); for (auto index = std::uint32_t{}; index < 4U; ++index) { state = vamp_zero::apply_app_command(std::move(state), vamp_protocol::page_command::NEXT); } diff --git a/tests/test_catalog_runtime.cpp b/tests/test_catalog_runtime.cpp index bf83110..19534d4 100644 --- a/tests/test_catalog_runtime.cpp +++ b/tests/test_catalog_runtime.cpp @@ -285,7 +285,7 @@ BOOST_AUTO_TEST_CASE(catalog_reload_uses_cached_metadata_without_parsing_score_j // Complete cached metadata must not require parsing or retaining the score body. db.query("INSERT INTO songs(id, title, composer, source_json, part, source_path, " "key_signature, measure_count, total_pages, title_image) " - "VALUES('tune', 'Metadata Song', 'Composer', '{}', 'Lead', 'songs/tune.json', 'F', 3, 2, '0000000000000000000000000000000000000000000000000000000000000000')"); + "VALUES('tune', 'Metadata Song', 'Composer', '{\"presentation\":{\"playback_pages\":[{},{},{}]}}', 'Lead', 'songs/tune.json', 'F', 3, 2, '0000000000000000000000000000000000000000000000000000000000000000')"); auto songs = db.rows("songs"); for (auto attempt = std::uint32_t{}; attempt < 2U; ++attempt) { auto performance = db.performance(); @@ -295,6 +295,7 @@ BOOST_AUTO_TEST_CASE(catalog_reload_uses_cached_metadata_without_parsing_score_j BOOST_TEST(performance->parts[0].key_signature == "F"); BOOST_TEST(performance->parts[0].measure_count == 3U); BOOST_TEST(performance->parts[0].total_pages == 2U); + BOOST_TEST(performance->parts[0].playback_pages == 3U); } BOOST_TEST(db.rows("songs") == songs, boost::test_tools::per_element()); auto song = db.score("tune"); diff --git a/tests/test_engraving.py b/tests/test_engraving.py index 91771e5..d596cda 100644 --- a/tests/test_engraving.py +++ b/tests/test_engraving.py @@ -21,6 +21,7 @@ import generator.engraving.types import generator.guitar import generator.model import generator.musicxml +import generator.performance import tests.score_events import tests.arrangement_fixtures import tests.test_accompaniment @@ -139,6 +140,56 @@ class EngravingTests(unittest.TestCase): actual = generator.engraving.raster.rasterize_page(layout.pages[0], self.fonts) with PIL.Image.open('tests/fixtures/notation_python.png') as expected: self.assertIsNone(PIL.ImageChops.difference(actual, expected.convert('RGB')).getbbox()) + def test_playback_windows_reuse_complete_systems_and_finish_on_top(self): + for count in (1, 2, 3, 4): + with self.subTest(systems=count): + source = tests.test_musicxml.parse(tests.test_accompaniment.xml_bars([tests.test_musicxml.xml_note()] * count)) + style = generator.engraving.types.Style() + index = generator.engraving.notation.ScoreIndex(source) + systems = [generator.engraving.layout.make_system(index, i * 4, (i + 1) * 4, self.fonts, style) for i in range(count)] + pages, playback = generator.engraving.layout.page_views(systems, source, self.fonts, style, index=index) + generator.engraving.audit.audit_layout(source, generator.engraving.types.LayoutDocument(pages, style, ''), self.fonts) + generator.engraving.audit.audit_playback(pages, playback, style, self.fonts) + self.assertEqual(len(pages), (count + 1) // 2) + self.assertEqual(len(playback), count) + self.assertEqual([[s.start for s in p.systems] for p in playback], [[i * 4, (i + 1) * 4] if i + 1 < count else [i * 4] for i in range(count)]) + self.assertLess(playback[-1].systems[0].box.top, style.height / 2) + for sequence in (pages, playback): + for page in sequence: + self.assertEqual(len({s.scale for s in page.systems}), 1) + normal = [generator.performance.page_timing(source, p) for p in pages] + sliding = [generator.performance.page_timing(source, p) for p in playback] + generator.performance.validate_views(source, normal, sliding) + def test_transition_pair_of_tall_systems_fits_at_shared_scale(self): + short = tests.test_musicxml.xml_note() + tall = tests.test_musicxml.xml_note('C', 2, 'half', octave=2) + tests.test_musicxml.xml_note('C', 2, 'half', octave=7) + source = tests.test_musicxml.parse(tests.test_accompaniment.xml_bars([short, tall, tall, short])) + style = generator.engraving.types.Style() + index = generator.engraving.notation.ScoreIndex(source) + systems = [generator.engraving.layout.make_system(index, i * 4, (i + 1) * 4, self.fonts, style) for i in range(4)] + pages, playback = generator.engraving.layout.page_views(systems, source, self.fonts, style) + generator.engraving.audit.audit_playback(pages, playback, style, self.fonts) + self.assertEqual(playback[1].systems[0].scale, pages[0].systems[0].scale) + self.assertLess(playback[1].systems[1].box.bottom, style.height - style.margin_y) + def test_measure_numbers_clear_high_notes_and_follow_barlines(self): + source = tests.test_musicxml.parse(tests.test_accompaniment.xml_bars([tests.test_musicxml.xml_note('C', octave=7)] * 3)) + for i, measure in enumerate(source['staves'][0]['measures']): + measure['number'] = str(169 + i) + layout = self.layout(source) + for page in layout.pages: + for system in page.systems: + labels = [p for p in system.primitives if p.role == 'measure_number'] + self.assertEqual(len({round(p.points[0][1], 6) for p in labels}), 1) + bars = [p for p in system.primitives if p.role == 'barline'] + for i, label in enumerate(labels): + center = (label.box.left + label.box.right) / 2 + if i == 0: + self.assertAlmostEqual(center, layout.style.margin_x + 1, places=2) + else: + self.assertTrue(any(abs(center - p.points[0][0]) < system.scale for p in bars)) + for other in system.primitives: + if other is not label: + self.assertFalse(label.box.overlaps(other.box, 3 * system.scale)) def test_aligned_bands_match_full_pages_with_spans_tab_and_sampling_phases(self): tied = tests.test_musicxml.xml_note('E', 2, 'half', extra='') + tests.test_musicxml.xml_note('E', 2, 'half', extra='') content = ''.join(tests.test_musicxml.xml_note('G', 1, 'eighth') for _ in range(8)) diff --git a/tests/test_performance.cpp b/tests/test_performance.cpp index 03c692b..606d2ac 100644 --- a/tests/test_performance.cpp +++ b/tests/test_performance.cpp @@ -9,6 +9,7 @@ #include #include #include +#include namespace { @@ -29,7 +30,7 @@ auto state(bool metronome = false, bool backing = false) -> vamp_zero::app_state auto audio = vamp_zero::parse_audio_assets(read("manifest.audio")); BOOST_REQUIRE(audio); catalog->audio_assets = *audio; - catalog->parts.push_back({.id = "score", .title = "Fixture", .part = "Vocal", .total_pages = 2, .song_id = "fixture"}); + catalog->parts.push_back({.id = "score", .title = "Fixture", .part = "Vocal", .total_pages = 2, .song_id = "fixture", .playback_pages = 3}); catalog->groups.push_back({.title = "Fixture", .parts = {0}}); auto result = vamp_zero::app_state{.catalog = catalog, .mode = vamp_zero::app_mode::PERFORMANCE_SCORE}; result.selected_song_index = 1; @@ -139,6 +140,94 @@ BOOST_AUTO_TEST_CASE(stale_performance_updates_do_not_navigate_or_restart) { BOOST_CHECK(control.snapshot().mode == vamp_zero::app_mode::PERFORMANCE_PART_MENU); } +BOOST_AUTO_TEST_CASE(playback_advances_one_system_and_highlights_each_measure) { + auto document = score(); + BOOST_TEST(document.pages.size() == 2U); + BOOST_TEST(document.playback_pages.size() == 3U); + for (auto bpm : {60U, 90U, 120U}) { + auto count_in = vamp_zero::frame_at({4, 1}, bpm); + BOOST_CHECK(!vamp_zero::performance_at(document, count_in - 1, bpm).measure); + for (std::size_t m = 0; m < document.measure_count; ++m) { + auto frame = count_in + vamp_zero::frame_at(document.measure_boundaries[m], bpm); + auto now = vamp_zero::performance_at(document, frame, bpm); + BOOST_REQUIRE(now.measure); + BOOST_TEST(*now.measure == m + 1); + BOOST_TEST(now.page == std::min(m, std::size_t{2})); + if (m) { + BOOST_TEST(*vamp_zero::performance_at(document, frame - 1, bpm).measure == m); + } + } + } + BOOST_TEST(document.playback_pages.back().systems.size() == 1U); + auto app = state(true); + auto control = vamp_zero::control_state{{}, app}; + control.update_performance(1, 2, "Sustain", app.catalog, 3); + auto revision = control.snapshot().input_revision; + control.update_performance(1, 2, "Sustain", app.catalog, 4); + BOOST_TEST(*control.snapshot().active_measure == 4U); + BOOST_TEST(control.snapshot().input_revision == revision + 1); + auto remote = vamp_zero::remote_display_text(control.snapshot()); + BOOST_TEST(remote.find("page=3\npages=3") != std::string::npos); + control.finish_playback(1, "failed", app.catalog); + BOOST_CHECK(!control.snapshot().active_measure); +} + +BOOST_AUTO_TEST_CASE(fractional_pickups_and_unequal_measures_use_exact_boundaries) { + auto document = score(); + document.measure_boundaries = {{0, 1}, {1, 2}, {7, 2}, {41, 6}, {65, 6}, {89, 6}}; + document.playback_pages[1].start_beat = {1, 2}; + document.playback_pages[2].start_beat = {7, 2}; + document.duration = {89, 6}; + for (auto bpm : {60U, 110U, 120U}) { + for (std::size_t i = 1; i < document.measure_count; ++i) { + auto frame = vamp_zero::frame_at({4, 1}, bpm) + vamp_zero::frame_at(document.measure_boundaries[i], bpm); + BOOST_TEST(*vamp_zero::performance_at(document, frame - 1, bpm).measure == i); + BOOST_TEST(*vamp_zero::performance_at(document, frame, bpm).measure == i + 1); + } + } +} + +BOOST_AUTO_TEST_CASE(highlight_geometry_follows_letterboxed_page_and_active_view) { + auto document = score(); + for (auto bounds : {luma::rect{0, 0, 976, 484}, luma::rect{10, 20, 488, 484}, luma::rect{10, 20, 1952, 968}}) { + auto image = vamp_zero::page_rectangle(bounds); + auto a = vamp_zero::measure_highlight(document.playback_pages[0], 2, image); + auto b = vamp_zero::measure_highlight(document.playback_pages[1], 2, image); + BOOST_REQUIRE(a); + BOOST_REQUIRE(b); + auto scale = image.width / 976.F; + BOOST_TEST(b->x == image.x + 27.F * scale); + BOOST_TEST(b->y == image.y + 67.F * scale); + BOOST_TEST(a->y - b->y == 220.F * scale); + BOOST_TEST(b->width == 18.F * scale); + BOOST_CHECK(!vamp_zero::measure_highlight(document.playback_pages[0], {}, image)); + BOOST_CHECK(!vamp_zero::measure_highlight(document.playback_pages[0], 5, image)); + } +} + +BOOST_AUTO_TEST_CASE(playback_parser_requires_complete_views_and_safe_label_geometry) { + auto original = boost::json::parse(read("score.json")); + for (auto fault : {"missing", "pair", "label", "bounds", "time", "path"}) { + auto value = original; + auto &presentation = value.at("presentation").as_object(); + auto &views = presentation.at("playback_pages").as_array(); + if (std::string_view{fault} == "missing") { + presentation.erase("playback_pages"); + } else if (std::string_view{fault} == "pair") { + views[1] = views[0]; + } else if (std::string_view{fault} == "label") { + views[0].at("systems").as_array()[0].at("labels").as_array()[0].at("measure") = 99; + } else if (std::string_view{fault} == "bounds") { + views[0].at("systems").as_array()[0].at("labels").as_array()[0].at("bounds").as_array()[2] = 1000; + } else if (std::string_view{fault} == "time") { + views[1].at("start_beat").at("numerator") = 3; + } else { + views[1].at("path") = "../outside.png"; + } + BOOST_CHECK_MESSAGE(!vamp_zero::parse_notation_document(boost::json::serialize(value), "score.json"), fault); + } +} + BOOST_AUTO_TEST_CASE(recording_transport_cancellation_does_not_advance_clock) { auto prepared = vamp_zero::prepare_performance(score(), state(true), VAMP_TEST_PERFORMANCE_ASSETS_DIR, 1.F); BOOST_REQUIRE(prepared); diff --git a/tests/test_performance.py b/tests/test_performance.py index 258791f..e2d97f3 100644 --- a/tests/test_performance.py +++ b/tests/test_performance.py @@ -19,9 +19,19 @@ def fixture(root): music['staves'][0]['measures'].append(copy.deepcopy(first)) music['staves'][0]['measures'].extend({**copy.deepcopy(first), 'ending_sustain': True} for _ in range(3)) music['metadata']['song_id'] = 'fixture' - pages = [dict(path=f'{i + 1}.png', sha256='0' * 64, first_measure=i + 1, measure_count=1 if i == 0 else 4, - start_beat=generator.model.rational(i * 4), end_beat=generator.model.rational(4 if i == 0 else 20)) for i in range(2)] - bundle = dict(music=music, presentation=dict(width=976, height=484, pages=pages), performance=generator.performance.timing(music)) + + def system(first, count, y): + return dict(first_measure=first, measure_count=count, start_beat=generator.model.rational((first - 1) * 4), + end_beat=generator.model.rational((first + count - 1) * 4), + labels=[dict(measure=m, bounds=[30 + 40 * (m - first), y, 42 + 40 * (m - first), y + 12]) for m in range(first, first + count)]) + + def page(index, systems): + return dict(path=f'{index}.png', sha256='0' * 64, first_measure=systems[0]['first_measure'], + measure_count=sum(s['measure_count'] for s in systems), start_beat=systems[0]['start_beat'], end_beat=systems[-1]['end_beat'], systems=systems) + + pages = [page(1, [system(1, 1, 70), system(2, 1, 290)]), page(2, [system(3, 3, 70)])] + playback = [pages[0], page(3, [system(2, 1, 70), system(3, 3, 290)]), pages[1]] + bundle = dict(music=music, presentation=dict(width=976, height=484, pages=pages, playback_pages=playback), performance=generator.performance.timing(music)) (root / 'score.json').write_text(json.dumps(bundle)) entries = [] # Constant PCM makes accents, recorded count-in and the silent click tail observable. @@ -79,6 +89,28 @@ class PerformanceTests(unittest.TestCase): bundle['presentation']['pages'][1]['start_beat'] = generator.model.rational(3) with self.assertRaisesRegex(ValueError, 'timing'): generator.performance.validate_pages(bundle['music'], bundle['presentation']['pages']) + def test_playback_metadata_rejects_missing_views_wrong_pairs_and_bad_labels(self): + with tempfile.TemporaryDirectory() as temporary: + root = pathlib.Path(temporary) + fixture(root) + bundle = json.loads((root / 'score.json').read_text()) + pages = bundle['presentation']['pages'] + playback = bundle['presentation']['playback_pages'] + generator.performance.validate_views(bundle['music'], pages, playback) + for fault in ('missing', 'pair', 'bounds', 'label', 'timing'): + altered = copy.deepcopy(playback) + if fault == 'missing': + altered.pop() + elif fault == 'pair': + altered[1] = copy.deepcopy(altered[0]) + elif fault == 'bounds': + altered[0]['systems'][0]['labels'][0]['bounds'][0] = -1 + elif fault == 'label': + altered[0]['systems'][0]['labels'][0]['measure'] = 2 + else: + altered[1]['start_beat'] = generator.model.rational(3) + with self.subTest(fault=fault), self.assertRaises(ValueError): + generator.performance.validate_views(bundle['music'], pages, altered) if __name__ == '__main__': parser = argparse.ArgumentParser() diff --git a/tests/test_score_bundle.py b/tests/test_score_bundle.py index ad93006..476af05 100644 --- a/tests/test_score_bundle.py +++ b/tests/test_score_bundle.py @@ -213,8 +213,10 @@ class ScoreBundleTests(unittest.TestCase): page.write_bytes(data) document = generator.musicxml.load_musicxml(pathlib.Path('tests/fixtures/engraving.xml')) bundle = {'music': document, 'presentation': {'engine': generator.engraving.validation.ENGINE_NAME, 'width': 976, 'height': 484, 'pages': [{'path': 'page.png', 'sha256': hashlib.sha256(data).hexdigest()}]}} - times = generator.performance.boundaries(document) - bundle['presentation']['pages'][0].update(first_measure=1, measure_count=len(times) - 1, start_beat=generator.model.rational(0), end_beat=generator.model.rational(times[-1])) + fonts = generator.engraving.fonts.Fonts(pathlib.Path('package/assets/fonts/petaluma')) + layout = generator.engraving.layout.layout_score(document, generator.engraving.types.Style(), fonts) + bundle['presentation']['pages'][0].update(generator.performance.page_timing(document, layout.pages[0])) + bundle['presentation']['playback_pages'] = copy.deepcopy(bundle['presentation']['pages']) bundle['performance'] = generator.performance.timing(document) path = assets / 'score.json' path.write_text(json.dumps(bundle)) diff --git a/tests/test_ui.cpp b/tests/test_ui.cpp index 885882f..93199e9 100644 --- a/tests/test_ui.cpp +++ b/tests/test_ui.cpp @@ -14,6 +14,10 @@ #include #include #include +#include +#include +#include +#include namespace { @@ -133,12 +137,21 @@ auto preview(vamp_zero::app_state const &state, std::string const &name, vamp_pi auto context = image_context{}; vamp_zero::draw_header(context, {0.0F, 0.0F, 1024.0F, 600.0F}, state); if (state.mode == vamp_zero::app_mode::PERFORMANCE_SCORE) { - auto source = boost::json::parse(read_bytes(std::filesystem::path{VAMP_TEST_ASSETS_DIR} / "songs/autumn_leaves_electric.json")); - auto path = std::filesystem::path{VAMP_TEST_ASSETS_DIR} / "songs" / std::string{source.at("presentation").at("pages").as_array().front().at("path").as_string()}; + auto source = vamp_zero::parse_notation_document(read_bytes(std::filesystem::path{VAMP_TEST_ASSETS_DIR} / "songs/autumn_leaves_electric.json"), "score.json"); + BOOST_REQUIRE(source); + auto playback = vamp_zero::automatic(state.audio); + auto const &pages = playback ? source->playback_pages : source->pages; + auto const &page = pages.at(state.page_index); + auto path = std::filesystem::path{VAMP_TEST_ASSETS_DIR} / "songs" / page.path; auto sheet = LoadImage(path.c_str()); BOOST_REQUIRE(sheet.data); ImageDraw(&context.image, sheet, {0, 0, 976, 484}, {24, 98, 976, 484}, WHITE); UnloadImage(sheet); + if (playback) { + if (auto highlight = vamp_zero::measure_highlight(page, state.active_measure, {24, 98, 976, 484})) { + context.stroke_rect(*highlight, 1.5F, vamp_zero::to_luma(vamp_style::accent)); + } + } } else { vamp_zero::draw_menu(context, {0.0F, 80.0F, 1024.0F, 520.0F}, state); } @@ -184,7 +197,7 @@ BOOST_AUTO_TEST_CASE(device_menu_rendering_uses_petaluma_and_fits_both_displays) auto catalog = std::make_shared(); auto score = boost::json::parse(read_bytes(std::filesystem::path{VAMP_TEST_ASSETS_DIR} / "songs/autumn_leaves_electric.json")); auto title = std::string{score.at("presentation").at("title_image").as_string()}; - catalog->parts.push_back({.id = "electric", .title = "Autumn Leaves", .composer = "Joseph Kosma", .part = "Electric", .total_pages = score.at("presentation").at("pages").as_array().size(), .title_image = title, .song_id = "autumn_leaves"}); + catalog->parts.push_back({.id = "electric", .title = "Autumn Leaves", .composer = "Joseph Kosma", .part = "Electric", .total_pages = score.at("presentation").at("pages").as_array().size(), .title_image = title, .song_id = "autumn_leaves", .playback_pages = score.at("presentation").at("playback_pages").as_array().size()}); catalog->groups.push_back({"Autumn Leaves", "Joseph Kosma", {0U}}); catalog->audio_assets.push_back({.path = "backing/autumn_leaves_120.wav", .song_id = "autumn_leaves", .bpm = 120}); state.catalog = catalog; @@ -206,9 +219,21 @@ BOOST_AUTO_TEST_CASE(device_menu_rendering_uses_petaluma_and_fits_both_displays) state.active_part_id = "electric"; for (auto phase : {"Manual", "Preparing", "Count-in", "Playing", "Sustain"}) { state.audio.phase = phase; + state.audio.backing_enabled = std::string_view{phase} != "Manual"; + state.audio.metronome_enabled = state.audio.backing_enabled; + state.active_measure = std::string_view{phase} == "Playing" ? std::optional{1} : std::nullopt; preview(state, phase); } + state.audio.phase = "Playing"; + state.page_index = 1; + state.active_measure = score.at("presentation").at("playback_pages").as_array()[1].at("first_measure").to_number(); + preview(state, "transition"); + state.page_index = catalog->parts[0].playback_pages - 1; + state.active_measure = score.at("music").at("staves").as_array()[0].at("measures").as_array().size(); + state.audio.phase = "Sustain"; + preview(state, "final_line"); state.audio.phase = "Error"; + state.active_measure.reset(); state.audio.playback_error = "Recording unavailable"; preview(state, "audio_error"); state.mode = vamp_zero::app_mode::PERFORMANCE_PART_MENU;