Agent I-3: criterion-6 round-trip and golden lock on the real Engraver

Criterion 6 (the Chapter 7 layout round-trip) and the render goldens previously
exercised only the verbatim StubSolver, so a regression in the real Engraver's
geometry could land unseen. I-3 drives both through the Engraver.

  - round_trip_with<S: ConstraintSolver> factors the solver-agnostic provenance
    contract out of round_trip (now a one-line stub wrapper): coverage, the
    complete Provenance surviving constrained -> resolved -> render, the source
    surjection, and no duplicate stable ids hold for *any* conformant solver. The
    Stub tier's verbatim-geometry clause is gated behind solver.tier() == Stub;
    every other tier re-spaces. The status gate accepts any renderable status
    (Solved / SolvedWithWarnings / PartialBudgetExhausted), not exactly Solved, so
    the helper matches its "arbitrary conformant solver" contract while still
    rejecting the diagnostic-only statuses that carry no authoritative layout.
  - criterion_six_round_trips_through_the_engravers_respacing (epiphany-engrave)
    runs the full graph -> logical -> constrained -> *engraved* -> render round
    trip over the criterion-6 hand-off fixtures -- ten_measure_single_staff (the
    measured fixture) and valid_score_rich (cross-cutting tuplet/tie/spanner),
    plus valid_score for breadth -- and asserts the whole provenance contract
    survives the Engraver's re-spacing. A non-vacuity check confirms the Engraver
    genuinely moved geometry, so provenance is preserved *through* a real geometry
    change -- the statement the verbatim stub can never make. This adds an
    epiphany-testkit dev-dep (no cycle: testkit does not depend on this crate).
  - The render-svg engraver acceptance test is upgraded from invariant-only to
    byte-locked: new .engrave.snapshot.txt / .engrave.svg goldens for both
    fixtures capture the Engraver's re-spaced output (e.g. ten_measure view_box
    width 82.26 vs the stub's 88.88, same glyph/stroke/class counts), so an
    Engraver geometry regression is caught at the byte level. A companion test
    asserts the engrave goldens genuinely differ from the stub goldens, catching
    the degeneracy where the Engraver echoes the stub (which would otherwise pass
    both golden checks independently).

Also corrects the epiphany-engrave package description, which still claimed it
reports SolverTier::Stub until it earns Minimal (it earned Minimal in I-2).

Full gate green: build, fmt, clippy, 580 tests, conformance scale 1.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Levi Neuwirth 2026-06-26 21:58:31 -04:00
parent 1c147534bf
commit af297881e2
10 changed files with 371 additions and 41 deletions

1
Cargo.lock generated
View File

@ -99,6 +99,7 @@ version = "0.0.0"
dependencies = [ dependencies = [
"epiphany-core", "epiphany-core",
"epiphany-layout-ir", "epiphany-layout-ir",
"epiphany-testkit",
] ]
[[package]] [[package]]

View File

@ -5,7 +5,7 @@ edition.workspace = true
rust-version.workspace = true rust-version.workspace = true
authors.workspace = true authors.workspace = true
repository.workspace = true repository.workspace = true
description = "Agent I's Epiphany engraving solver (spec Chapter 9): turns a ConstrainedLayoutIR into a ResolvedLayoutIR with real geometry. Phase-2 scaffold — a deterministic horizontal-spacing pass (the first axis of the planned two-pass spring layout) that honestly reports SolverTier::Stub until it evaluates the declared hard constraints and earns the Minimal tier." description = "Agent I's Epiphany engraving solver (spec Chapter 9): turns a ConstrainedLayoutIR into a ResolvedLayoutIR with real geometry. A deterministic horizontal-spacing pass (the first axis of the planned two-pass spring layout) that evaluates the declared hard constraints and reports SolverTier::Minimal. The vertical spring pass and casting-off are deferred to a later tier."
[dependencies] [dependencies]
# The solver consumes/produces the Chapter 7 IR stages and implements the # The solver consumes/produces the Chapter 7 IR stages and implements the
@ -17,3 +17,7 @@ epiphany-layout-ir.workspace = true
# Tests drive the solver from real score fixtures via epiphany-core's generators # Tests drive the solver from real score fixtures via epiphany-core's generators
# (and a couple of leaf id/time types). # (and a couple of leaf id/time types).
epiphany-core.workspace = true epiphany-core.workspace = true
# The criterion-6 round-trip test mirrors the hand-off gate's fixtures, including
# epiphany-testkit's `ten_measure_single_staff` (testkit does not depend on this
# crate, so this dev-dep introduces no cycle).
epiphany-testkit.workspace = true

View File

@ -919,4 +919,62 @@ mod tests {
); );
assert_eq!(full.layout, inc.layout); assert_eq!(full.layout, inc.layout);
} }
/// Acceptance criterion 6 (the Chapter 7 layout round-trip) against the **real**
/// Engraver, not the verbatim stub. `round_trip_with` drives graph -> logical ->
/// constrained -> *engraved* -> render and asserts the whole provenance contract
/// internally: every laid-out object is covered, the complete `Provenance`
/// (source, synthesis, dependencies, stable id) survives the engrave pass and the
/// render unchanged, the recovered source set is exactly the set laid out, and no
/// two objects share a stable id. The point the stub can never make: provenance is
/// preserved *through a real geometry change* — the Engraver re-spaces every glyph
/// and the strokes that track them, yet not one back-reference is lost.
#[test]
fn criterion_six_round_trips_through_the_engravers_respacing() {
use epiphany_core::generators::valid_score;
use epiphany_layout_ir::{round_trip_with, SolveStatus};
use epiphany_testkit::fixtures::ten_measure_single_staff;
for seed in 0..32u64 {
// Mirror the criterion-6 hand-off gate's own fixtures — the 10-measure
// single staff (measures + barlines) and the rich score (cross-cutting
// tuplet/tie/spanner/marker) — and keep `valid_score` for added breadth.
let scores = [
ten_measure_single_staff(seed),
valid_score(seed),
valid_score_rich(seed),
];
for score in scores {
// round_trip_with asserts the full provenance contract; a Solved
// status also confirms the Engraver satisfied the pipeline's hard
// constraints (the stub pipeline declares none, so vacuously).
let report = round_trip_with(&score, &Engraver);
assert_eq!(report.status, SolveStatus::Solved);
}
}
// Non-vacuity: the contract above held *through* a genuine re-spacing — the
// Engraver's geometry differs from the stub's verbatim columns, so provenance
// survived a real geometry change rather than a pass-through.
let constrained = to_constrained(&to_logical(&valid_score_rich(11)));
assert!(constrained.glyphs.len() >= 2);
let engraved = Engraver
.solve(&constrained, &SolverConfig::default())
.layout;
let stub = StubSolver
.solve(&constrained, &SolverConfig::default())
.layout;
assert_ne!(
engraved
.glyphs
.iter()
.map(|g| g.position.x.0)
.collect::<Vec<_>>(),
stub.glyphs
.iter()
.map(|g| g.position.x.0)
.collect::<Vec<_>>(),
"the Engraver must re-space, not echo the stub's verbatim columns"
);
}
} }

View File

@ -130,7 +130,7 @@ pub use render::{
pub use resolved::{ pub use resolved::{
ResolvedGlyph, ResolvedLayoutIR, ResolvedMeasure, ResolvedPage, ResolvedStaff, ResolvedSystem, ResolvedGlyph, ResolvedLayoutIR, ResolvedMeasure, ResolvedPage, ResolvedStaff, ResolvedSystem,
}; };
pub use roundtrip::{laid_out_object_ids, round_trip, RoundTripReport}; pub use roundtrip::{laid_out_object_ids, round_trip, round_trip_with, RoundTripReport};
pub use solver::{ pub use solver::{
ConstraintId, ConstraintSolver, ExtensionMetric, ExtensionMetricId, ExtensionWarningId, ConstraintId, ConstraintSolver, ExtensionMetric, ExtensionMetricId, ExtensionWarningId,
InvalidationScope, InvalidationSet, NormalizedMetric, QualityMetricKind, QualityMetricVector, InvalidationScope, InvalidationSet, NormalizedMetric, QualityMetricKind, QualityMetricVector,

View File

@ -22,7 +22,7 @@ use crate::constrained::to_constrained;
use crate::logical::{cross_cutting_objects, identified_pitch_ids, to_logical, LayoutObject}; use crate::logical::{cross_cutting_objects, identified_pitch_ids, to_logical, LayoutObject};
use crate::provenance::{LayoutObjectId, Provenance}; use crate::provenance::{LayoutObjectId, Provenance};
use crate::render::to_render; use crate::render::to_render;
use crate::solver::{ConstraintSolver, SolveStatus, SolverConfig, StubSolver}; use crate::solver::{ConstraintSolver, SolveStatus, SolverConfig, SolverTier, StubSolver};
/// The set of score-graph objects the pipeline lays out — the [`TypedObjectId`]s /// The set of score-graph objects the pipeline lays out — the [`TypedObjectId`]s
/// the round-trip expects to recover from the RenderIR. Kept in lockstep with /// the round-trip expects to recover from the RenderIR. Kept in lockstep with
@ -111,7 +111,22 @@ fn provenance_map<'a>(
/// laid out — a surjection onto graph identity (every laid-out source is /// laid out — a surjection onto graph identity (every laid-out source is
/// recovered and nothing spurious appears; one source may back several layout /// recovered and nothing spurious appears; one source may back several layout
/// objects, which the distinct stable ids account for). /// objects, which the distinct stable ids account for).
///
/// Runs against the [`StubSolver`]; [`round_trip_with`] runs the same contract
/// against any conformant solver (a real solver re-spaces, so the verbatim-geometry
/// clause is checked only for the [`SolverTier::Stub`] tier).
pub fn round_trip(score: &Score) -> RoundTripReport { pub fn round_trip(score: &Score) -> RoundTripReport {
round_trip_with(score, &StubSolver)
}
/// Criterion 6 for an arbitrary conformant `solver`: every provenance-preservation
/// guarantee of [`round_trip`] *except* the verbatim-geometry clause, which is the
/// [`SolverTier::Stub`] tier's specific promise. A real solver re-spaces the glyphs,
/// but the [`Provenance`] back-references — `source`, `synthesis`, `dependencies`,
/// and `stable_id` — must survive that re-spacing unchanged, and the recovered
/// source set must still be exactly the set laid out. This is the strictly stronger
/// statement: a solver may move geometry, never lose a provenance trace.
pub fn round_trip_with<S: ConstraintSolver>(score: &Score, solver: &S) -> RoundTripReport {
let logical = to_logical(score); let logical = to_logical(score);
let constrained = to_constrained(&logical); let constrained = to_constrained(&logical);
@ -148,42 +163,51 @@ pub fn round_trip(score: &Score) -> RoundTripReport {
); );
} }
let report = StubSolver.solve(&constrained, &SolverConfig::default()); let report = solver.solve(&constrained, &SolverConfig::default());
assert_eq!( // A conformant solver need not report exactly `Solved`: any renderable status
report.status, // (`Solved`, `SolvedWithWarnings`, `PartialBudgetExhausted`) carries a layout
SolveStatus::Solved, // whose hard constraints are satisfied (Chapter 9 §"The Solver Report"), which
"the stub solver must report Solved" // is all the round-trip needs — the provenance contract below is independent of
// quality. The non-renderable, diagnostic-only statuses (Unsatisfiable,
// InternalError) have no authoritative layout to round-trip.
assert!(
report.status.is_renderable(),
"the solver must return a renderable layout, got {:?}",
report.status
); );
assert!( assert!(
report.satisfied_hard_constraints, report.satisfied_hard_constraints,
"the stub solver must satisfy all hard constraints" "the solver must satisfy all hard constraints"
); );
// The stub solver's geometry contract: it returns the input geometry // The Stub tier's geometry contract: it returns the input geometry *verbatim*
// *verbatim* — each resolved glyph's position is exactly its constrained // — each resolved glyph's position is exactly its constrained baseline (Chapter
// baseline (Chapter 9 / QUICKSTART: "the input geometry verbatim"). The // 9 / QUICKSTART: "the input geometry verbatim"), strokes pass through in order.
// solver preserves order, so glyphs line up by index. // A higher tier re-spaces, so this clause is the stub's alone; provenance
assert_eq!( // preservation (asserted below) holds for *every* tier regardless.
report.layout.glyphs.len(), if solver.tier() == SolverTier::Stub {
constrained.glyphs.len(),
"the solver must not add or drop glyphs"
);
for (constrained_glyph, resolved_glyph) in constrained.glyphs.iter().zip(&report.layout.glyphs)
{
assert_eq!( assert_eq!(
resolved_glyph.position, constrained_glyph.baseline, report.layout.glyphs.len(),
"stub solver must return the input geometry verbatim" constrained.glyphs.len(),
"the stub solver must not add or drop glyphs"
);
for (constrained_glyph, resolved_glyph) in
constrained.glyphs.iter().zip(&report.layout.glyphs)
{
assert_eq!(
resolved_glyph.position, constrained_glyph.baseline,
"stub solver must return the input geometry verbatim"
);
assert_eq!(resolved_glyph.glyph, constrained_glyph.glyph);
assert_eq!(resolved_glyph.bounding_box, constrained_glyph.bounding_box);
assert_eq!(resolved_glyph.style, constrained_glyph.style);
assert_eq!(resolved_glyph.layer, constrained_glyph.layer);
}
assert_eq!(
report.layout.strokes, constrained.strokes,
"stub solver must return the input strokes verbatim"
); );
assert_eq!(resolved_glyph.glyph, constrained_glyph.glyph);
assert_eq!(resolved_glyph.bounding_box, constrained_glyph.bounding_box);
assert_eq!(resolved_glyph.style, constrained_glyph.style);
assert_eq!(resolved_glyph.layer, constrained_glyph.layer);
} }
// Strokes likewise pass through the stub verbatim, in order.
assert_eq!(
report.layout.strokes, constrained.strokes,
"stub solver must return the input strokes verbatim"
);
let resolved_map = provenance_map( let resolved_map = provenance_map(
"resolved", "resolved",

View File

@ -51,9 +51,14 @@ fn pipeline(score: &Score) -> (ConstrainedLayoutIR, RenderOutput) {
/// A deterministic, human-diffable serialization of the machine acceptance /// A deterministic, human-diffable serialization of the machine acceptance
/// snapshot. /// snapshot.
fn snapshot_text(fixture: &str, constrained: &ConstrainedLayoutIR, out: &RenderOutput) -> String { fn snapshot_text(
fixture: &str,
solver: &str,
constrained: &ConstrainedLayoutIR,
out: &RenderOutput,
) -> String {
let mut s = String::new(); let mut s = String::new();
s.push_str(&format!("fixture={fixture} solver=stub\n")); s.push_str(&format!("fixture={fixture} solver={solver}\n"));
s.push_str(&format!("glyph_count={}\n", out.stats.glyph_count)); s.push_str(&format!("glyph_count={}\n", out.stats.glyph_count));
s.push_str(&format!("path_count={}\n", out.stats.path_count)); s.push_str(&format!("path_count={}\n", out.stats.path_count));
s.push_str(&format!( s.push_str(&format!(
@ -162,7 +167,7 @@ fn fixtures_render_to_golden_locked_svg_and_snapshot() {
// Golden locks: the machine snapshot and the full SVG bytes. // Golden locks: the machine snapshot and the full SVG bytes.
assert_golden( assert_golden(
&format!("{fixture}.stub.snapshot.txt"), &format!("{fixture}.stub.snapshot.txt"),
&snapshot_text(fixture, &constrained, &out), &snapshot_text(fixture, "stub", &constrained, &out),
); );
assert_golden(&format!("{fixture}.stub.svg"), &out.svg); assert_golden(&format!("{fixture}.stub.svg"), &out.svg);
} }
@ -252,15 +257,29 @@ fn svg_validates_under_xmllint_when_available() {
let _ = std::fs::remove_file(&tmp); let _ = std::fs::remove_file(&tmp);
} }
/// Drives the full pipeline through Agent I's real `Engraver` — whose
/// horizontal-spacing pass re-spaces every glyph and the strokes that track them.
fn engrave_pipeline(score: &Score) -> (ConstrainedLayoutIR, RenderOutput) {
use epiphany_engrave::Engraver;
let constrained = to_constrained(&to_logical(score));
let layout = Engraver
.solve(&constrained, &SolverConfig::default())
.layout;
let out = render(&layout, &RenderOptions::default());
(constrained, out)
}
/// The renderer's contract is "consumes *any* solver's `ResolvedLayoutIR`", but /// The renderer's contract is "consumes *any* solver's `ResolvedLayoutIR`", but
/// the goldens above only exercise the stub. This drives Agent I's real /// the `.stub.*` goldens above only exercise the stub. This drives the real
/// `Engraver` — whose horizontal-spacing pass produces geometry that *differs* /// `Engraver` — whose horizontal-spacing pass produces geometry that *differs*
/// from the stub's verbatim columns — through the same renderer and asserts the /// from the stub's verbatim columns — through the same renderer and **golden-locks
/// output is still well-formed with every glyph drawn and traced, so an /// its SVG bytes and machine snapshot** under `.engrave.*`, so an `Engraver`
/// `Engraver` geometry regression cannot slip through unnoticed (the stub /// geometry regression is caught at the byte level (the stub goldens cannot see
/// goldens would not catch it). /// it), while the same structural invariants (every glyph drawn, every primitive
/// traced, well-formed XML, no fallbacks) hold as for the stub.
#[test] #[test]
fn engraver_output_renders_well_formed_with_every_glyph_drawn() { fn engraver_output_is_golden_locked_well_formed_with_every_glyph_drawn() {
use epiphany_engrave::Engraver; use epiphany_engrave::Engraver;
use epiphany_layout_ir::SolveStatus; use epiphany_layout_ir::SolveStatus;
@ -272,8 +291,11 @@ fn engraver_output_renders_well_formed_with_every_glyph_drawn() {
SolveStatus::Solved, SolveStatus::Solved,
"{fixture}: engrave should solve the constraint-free stub pipeline" "{fixture}: engrave should solve the constraint-free stub pipeline"
); );
let out = render(&report.layout, &RenderOptions::default());
let (_, out) = engrave_pipeline(&score);
// Structural invariants — identical to the stub's, because the Engraver
// re-spaces geometry without adding, dropping, or un-tracing a primitive.
check_well_formed(&out.svg) check_well_formed(&out.svg)
.unwrap_or_else(|e| panic!("{fixture}: engraver SVG is not well-formed: {e}")); .unwrap_or_else(|e| panic!("{fixture}: engraver SVG is not well-formed: {e}"));
assert!(out.stats.glyph_count > 0, "{fixture}: nothing was laid out"); assert!(out.stats.glyph_count > 0, "{fixture}: nothing was laid out");
@ -291,5 +313,36 @@ fn engraver_output_renders_well_formed_with_every_glyph_drawn() {
out.diagnostics.is_empty(), out.diagnostics.is_empty(),
"{fixture}: stub-pipeline glyphs are all bundled, so no fallback is expected" "{fixture}: stub-pipeline glyphs are all bundled, so no fallback is expected"
); );
// Provenance survival into the SVG, as for the stub goldens.
for g in &out_glyph_ids(&score) {
assert!(
out.svg.contains(&format!("data-prov=\"{g:032x}\"")),
"{fixture}: provenance {g:032x} did not survive the engrave into the SVG"
);
}
// Golden locks: the engraver's machine snapshot and full SVG bytes.
assert_golden(
&format!("{fixture}.engrave.snapshot.txt"),
&snapshot_text(fixture, "engrave", &constrained, &out),
);
assert_golden(&format!("{fixture}.engrave.svg"), &out.svg);
}
}
/// The two solvers' goldens must genuinely differ: the Engraver re-spaces, so its
/// SVG cannot be byte-identical to the stub's verbatim-column SVG. A regression
/// that made the Engraver echo the stub would pass both golden checks above (each
/// would just match its own committed file) — this catches that degeneracy.
#[test]
fn engraver_goldens_differ_from_the_stub_goldens() {
for (fixture, score) in fixtures() {
let (_, stub_out) = pipeline(&score);
let (_, engrave_out) = engrave_pipeline(&score);
assert_ne!(
stub_out.svg, engrave_out.svg,
"{fixture}: the Engraver must re-space, so its SVG must differ from the stub's"
);
} }
} }

View File

@ -0,0 +1,14 @@
fixture=ten_measure_single_staff solver=engrave
glyph_count=51
path_count=51
fallback_rect_count=0
stroke_count=51
provenance_count=102
layer_count=1
hard_constraint_count=0
xml_well_formed=true
view_box=[-3.0113542 -3.632 82.26242 11.632]
class_counts:
barline=10
clef=1
notehead=40

View File

@ -0,0 +1,110 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg xmlns="http://www.w3.org/2000/svg" width="822.6242" height="116.32" viewBox="0 0 82.2624 11.632">
<!-- epiphany-render-svg: glyphs are genuine Bravura SMuFL outlines; geometry is the resolved layout verbatim, no engraving performed here -->
<g transform="translate(3.0114 8) scale(1 -1)">
<g data-layer="0">
<line x1="0" y1="0" x2="0" y2="0" stroke="#000000" stroke-width="0" data-prov="2ef8d2dba955aee38147023b72bdabb7" data-source-kind="6" data-kind="stroke"/>
<line x1="-0.9464" y1="0" x2="76.581" y2="0" stroke="#000000" stroke-width="0.13" data-prov="a2b28d85f329dbc90f5b6c27789b129b" data-source-kind="3" data-kind="stroke"/>
<line x1="-0.9464" y1="1" x2="76.581" y2="1" stroke="#000000" stroke-width="0.13" data-prov="8cc8596297e2f64822b7d596f27b928a" data-source-kind="3" data-kind="stroke"/>
<line x1="-0.9464" y1="2" x2="76.581" y2="2" stroke="#000000" stroke-width="0.13" data-prov="c802edfce37280f9b7a5280850fefb1f" data-source-kind="3" data-kind="stroke"/>
<line x1="-0.9464" y1="3" x2="76.581" y2="3" stroke="#000000" stroke-width="0.13" data-prov="374ec294c78d169fdd371dafcc590a90" data-source-kind="3" data-kind="stroke"/>
<line x1="-0.9464" y1="4" x2="76.581" y2="4" stroke="#000000" stroke-width="0.13" data-prov="1ba95e41d7bee35526357d6d68d7d885" data-source-kind="3" data-kind="stroke"/>
<line x1="0" y1="0" x2="0" y2="0" stroke="#000000" stroke-width="0" data-prov="299bf2a93f24f45bbad8cd9368623750" data-source-kind="2" data-kind="stroke"/>
<line x1="5.4172" y1="-1" x2="5.4172" y2="2.5" stroke="#000000" stroke-width="0.12" data-prov="f180ab2f8fefa5fd114a522262781511" data-source-kind="0" data-kind="stroke"/>
<line x1="6.9172" y1="-1" x2="6.9172" y2="2.5" stroke="#000000" stroke-width="0.12" data-prov="00cff43b791d393f0132b2b1fefa97fb" data-source-kind="0" data-kind="stroke"/>
<line x1="8.4172" y1="-1" x2="8.4172" y2="2.5" stroke="#000000" stroke-width="0.12" data-prov="ce8b8ed3f423f2233ee0349407382e86" data-source-kind="0" data-kind="stroke"/>
<line x1="9.9172" y1="-1" x2="9.9172" y2="2.5" stroke="#000000" stroke-width="0.12" data-prov="3454bf92ac286b4fa89f0711eb8406ab" data-source-kind="0" data-kind="stroke"/>
<line x1="12.9172" y1="-1" x2="12.9172" y2="2.5" stroke="#000000" stroke-width="0.12" data-prov="78705817c33095fd68585149efa39693" data-source-kind="0" data-kind="stroke"/>
<line x1="14.4172" y1="-1" x2="14.4172" y2="2.5" stroke="#000000" stroke-width="0.12" data-prov="e7010481978598b50f2d16247c9e536f" data-source-kind="0" data-kind="stroke"/>
<line x1="15.9172" y1="-1" x2="15.9172" y2="2.5" stroke="#000000" stroke-width="0.12" data-prov="9d2e5b21bd83575f4a739897b23903f8" data-source-kind="0" data-kind="stroke"/>
<line x1="17.4172" y1="-1" x2="17.4172" y2="2.5" stroke="#000000" stroke-width="0.12" data-prov="4ae7a4d1adce3e02f9617f49301b790e" data-source-kind="0" data-kind="stroke"/>
<line x1="20.4172" y1="-1" x2="20.4172" y2="2.5" stroke="#000000" stroke-width="0.12" data-prov="8d1e19dc98ef35c36a61bf40c10e078a" data-source-kind="0" data-kind="stroke"/>
<line x1="21.9172" y1="-1" x2="21.9172" y2="2.5" stroke="#000000" stroke-width="0.12" data-prov="722042f4225d40465081128a28b9ba6d" data-source-kind="0" data-kind="stroke"/>
<line x1="23.4172" y1="-1" x2="23.4172" y2="2.5" stroke="#000000" stroke-width="0.12" data-prov="7979e5ca0cc41e36adf997ca73e3f11f" data-source-kind="0" data-kind="stroke"/>
<line x1="24.9172" y1="-1" x2="24.9172" y2="2.5" stroke="#000000" stroke-width="0.12" data-prov="6ea8506bc1beb9e26dd4f0a962b47e5c" data-source-kind="0" data-kind="stroke"/>
<line x1="27.9172" y1="-1" x2="27.9172" y2="2.5" stroke="#000000" stroke-width="0.12" data-prov="3381c124bd495652c03209c9137ad1d6" data-source-kind="0" data-kind="stroke"/>
<line x1="29.4172" y1="-1" x2="29.4172" y2="2.5" stroke="#000000" stroke-width="0.12" data-prov="c6bd0131d5d8b7f7084ce352fe03b9ee" data-source-kind="0" data-kind="stroke"/>
<line x1="30.9172" y1="-1" x2="30.9172" y2="2.5" stroke="#000000" stroke-width="0.12" data-prov="d1444672c538461a35616863866dd529" data-source-kind="0" data-kind="stroke"/>
<line x1="32.4172" y1="-1" x2="32.4172" y2="2.5" stroke="#000000" stroke-width="0.12" data-prov="36be7aa63cfa919f189daf8907b33414" data-source-kind="0" data-kind="stroke"/>
<line x1="35.4172" y1="-1" x2="35.4172" y2="2.5" stroke="#000000" stroke-width="0.12" data-prov="a9abf87e1178566e992ad27a605625db" data-source-kind="0" data-kind="stroke"/>
<line x1="36.9172" y1="-1" x2="36.9172" y2="2.5" stroke="#000000" stroke-width="0.12" data-prov="663911388f594e9faf492ca1bef4424c" data-source-kind="0" data-kind="stroke"/>
<line x1="38.4172" y1="-1" x2="38.4172" y2="2.5" stroke="#000000" stroke-width="0.12" data-prov="e13d5950ccece94e0e78721af7a9b7ff" data-source-kind="0" data-kind="stroke"/>
<line x1="39.9172" y1="-1" x2="39.9172" y2="2.5" stroke="#000000" stroke-width="0.12" data-prov="2d4b55ae05bb8a68647b9f53172d15f3" data-source-kind="0" data-kind="stroke"/>
<line x1="42.9172" y1="-1" x2="42.9172" y2="2.5" stroke="#000000" stroke-width="0.12" data-prov="fabd84e3712a5226d704896a4711856d" data-source-kind="0" data-kind="stroke"/>
<line x1="44.4172" y1="-1" x2="44.4172" y2="2.5" stroke="#000000" stroke-width="0.12" data-prov="254b610b6e96d8977e752e1e329c242c" data-source-kind="0" data-kind="stroke"/>
<line x1="45.9172" y1="-1" x2="45.9172" y2="2.5" stroke="#000000" stroke-width="0.12" data-prov="45aaeb27e4587d964fe054d9da91a55d" data-source-kind="0" data-kind="stroke"/>
<line x1="47.4172" y1="-1" x2="47.4172" y2="2.5" stroke="#000000" stroke-width="0.12" data-prov="9db9470ac3ce354bf774ef612c676c1f" data-source-kind="0" data-kind="stroke"/>
<line x1="50.4172" y1="-1" x2="50.4172" y2="2.5" stroke="#000000" stroke-width="0.12" data-prov="b934ef5e3771b425d5e646d1ec905ba7" data-source-kind="0" data-kind="stroke"/>
<line x1="51.9172" y1="-1" x2="51.9172" y2="2.5" stroke="#000000" stroke-width="0.12" data-prov="9ee165a1b754cf15a94af8ce1a2ed74a" data-source-kind="0" data-kind="stroke"/>
<line x1="53.4172" y1="-1" x2="53.4172" y2="2.5" stroke="#000000" stroke-width="0.12" data-prov="e7c3cefbeaf0c7b182f61938f50b84b7" data-source-kind="0" data-kind="stroke"/>
<line x1="54.9172" y1="-1" x2="54.9172" y2="2.5" stroke="#000000" stroke-width="0.12" data-prov="43269b2ba973f7d04f787e51fa30d2fe" data-source-kind="0" data-kind="stroke"/>
<line x1="57.9172" y1="-1" x2="57.9172" y2="2.5" stroke="#000000" stroke-width="0.12" data-prov="dbb189030d3fb922021f944ac8aa8c6d" data-source-kind="0" data-kind="stroke"/>
<line x1="59.4172" y1="-1" x2="59.4172" y2="2.5" stroke="#000000" stroke-width="0.12" data-prov="65ff34e6e9f8e9b1bbf795ffe3eaa2e6" data-source-kind="0" data-kind="stroke"/>
<line x1="60.9172" y1="-1" x2="60.9172" y2="2.5" stroke="#000000" stroke-width="0.12" data-prov="b00773cbb8db6a4218f1f956ebce9e25" data-source-kind="0" data-kind="stroke"/>
<line x1="62.4172" y1="-1" x2="62.4172" y2="2.5" stroke="#000000" stroke-width="0.12" data-prov="2d8c211fa0abbeb102ecafd986ec9f32" data-source-kind="0" data-kind="stroke"/>
<line x1="65.4172" y1="-1" x2="65.4172" y2="2.5" stroke="#000000" stroke-width="0.12" data-prov="b28b480792b411f3928a16c150a2a231" data-source-kind="0" data-kind="stroke"/>
<line x1="66.9172" y1="-1" x2="66.9172" y2="2.5" stroke="#000000" stroke-width="0.12" data-prov="67a80c74cc078028d23262082a6467af" data-source-kind="0" data-kind="stroke"/>
<line x1="68.4172" y1="-1" x2="68.4172" y2="2.5" stroke="#000000" stroke-width="0.12" data-prov="c4f5b4a9375f3dcc6dd566865df0c92f" data-source-kind="0" data-kind="stroke"/>
<line x1="69.9172" y1="-1" x2="69.9172" y2="2.5" stroke="#000000" stroke-width="0.12" data-prov="ba2739c661b9acb3d32494f0f1adae98" data-source-kind="0" data-kind="stroke"/>
<line x1="71.4172" y1="-1" x2="71.4172" y2="2.5" stroke="#000000" stroke-width="0.12" data-prov="baea3329fdb0f32274fe3b9985ffe572" data-source-kind="0" data-kind="stroke"/>
<line x1="72.9172" y1="-1" x2="72.9172" y2="2.5" stroke="#000000" stroke-width="0.12" data-prov="4dbd0d2bd320be9b9f333e3f8f4dad92" data-source-kind="0" data-kind="stroke"/>
<line x1="74.4172" y1="-1" x2="74.4172" y2="2.5" stroke="#000000" stroke-width="0.12" data-prov="21e0c4e7089e613815b7a5d6bf2c103f" data-source-kind="0" data-kind="stroke"/>
<line x1="75.3955" y1="-1" x2="75.3955" y2="2.5" stroke="#000000" stroke-width="0.12" data-prov="d9c5b62c4340d6bd9038a1a8ff081b3a" data-source-kind="0" data-kind="stroke"/>
<line x1="0" y1="0" x2="0" y2="0" stroke="#000000" stroke-width="0" data-prov="ad675e7f174a140139e2959e3ebdc8ad" data-source-kind="12" data-kind="stroke"/>
<line x1="0" y1="0" x2="0" y2="0" stroke="#000000" stroke-width="0" data-prov="14cf3b9c808d0467e40ee355ef4329a8" data-source-kind="14" data-kind="stroke"/>
<line x1="0" y1="0" x2="0" y2="0" stroke="#000000" stroke-width="0" data-prov="82ca9c2a2208e28338167ec9151748d2" data-source-kind="15" data-kind="stroke"/>
<line x1="0" y1="0" x2="0" y2="0" stroke="#000000" stroke-width="0" data-prov="33b51b69dbfc551be0448fbb257675b2" data-source-kind="25" data-kind="stroke"/>
<path d="M1.504 1.66C1.496 1.708 1.504 1.712 1.528 1.736C1.96 2.14 2.288 2.648 2.288 3.26C2.288 3.608 2.192 3.952 2.028 4.192C1.968 4.28 1.864 4.392 1.82 4.392C1.764 4.392 1.64 4.288 1.56 4.2C1.264 3.872 1.168 3.372 1.168 2.956C1.168 2.724 1.196 2.464 1.224 2.3C1.232 2.252 1.236 2.244 1.188 2.204C0.612 1.728 0 1.156 0 0.348C0 -0.348 0.476 -1.008 1.456 -1.008C1.548 -1.008 1.652 -1 1.732 -0.984C1.776 -0.976 1.784 -0.972 1.792 -1.02C1.84 -1.288 1.9 -1.636 1.9 -1.824C1.9 -2.416 1.5 -2.488 1.264 -2.488C1.048 -2.488 0.944 -2.424 0.944 -2.372C0.944 -2.344 0.98 -2.332 1.072 -2.304C1.196 -2.268 1.34 -2.16 1.34 -1.928C1.34 -1.708 1.2 -1.52 0.956 -1.52C0.688 -1.52 0.528 -1.732 0.528 -1.98C0.528 -2.24 0.684 -2.632 1.288 -2.632C1.556 -2.632 2.076 -2.512 2.076 -1.832C2.076 -1.604 2.004 -1.224 1.96 -0.976C1.952 -0.928 1.956 -0.932 2.012 -0.908C2.416 -0.748 2.684 -0.408 2.684 0.044C2.684 0.556 2.308 1.008 1.72 1.008C1.616 1.008 1.616 1.008 1.604 1.08ZM1.88 3.772C2.012 3.772 2.12 3.664 2.12 3.444C2.12 3 1.74 2.64 1.424 2.364C1.396 2.34 1.38 2.344 1.372 2.396C1.356 2.5 1.348 2.636 1.348 2.764C1.348 3.388 1.636 3.772 1.88 3.772ZM1.444 1.048C1.456 0.972 1.456 0.976 1.384 0.952C1.032 0.832 0.804 0.516 0.804 0.176C0.804 -0.184 0.992 -0.44 1.264 -0.532C1.296 -0.544 1.344 -0.556 1.372 -0.556C1.404 -0.556 1.42 -0.536 1.42 -0.512C1.42 -0.484 1.388 -0.472 1.36 -0.46C1.192 -0.388 1.072 -0.216 1.072 -0.032C1.072 0.196 1.228 0.368 1.472 0.436C1.536 0.452 1.544 0.448 1.552 0.404L1.752 -0.788C1.76 -0.832 1.756 -0.832 1.696 -0.844C1.632 -0.856 1.552 -0.864 1.472 -0.864C0.772 -0.864 0.32 -0.476 0.32 0.08C0.32 0.316 0.36 0.632 0.692 1.008C0.932 1.276 1.116 1.424 1.304 1.576C1.344 1.608 1.352 1.604 1.36 1.56ZM1.72 0.412C1.712 0.46 1.716 0.472 1.764 0.468C2.088 0.44 2.356 0.168 2.356 -0.184C2.356 -0.436 2.204 -0.64 1.98 -0.752C1.932 -0.776 1.924 -0.776 1.916 -0.728Z" transform="translate(0 1)" fill="#000000" data-prov="7979bb59896a39443f4602af4f2ee4fb" data-source-kind="4" data-glyph="gClef" data-class="clef"/>
<path d="M0.388 -0.5C0.744 -0.5 1.18 -0.172 1.18 0.168C1.18 0.372 1.02 0.5 0.792 0.5C0.352 0.5 0 0.176 0 -0.168C0 -0.376 0.172 -0.5 0.388 -0.5Z" transform="translate(4.3391 -1)" fill="#000000" data-prov="b94bca553a7a2dbe815bef6d8b770dc8" data-source-kind="1" data-glyph="noteheadBlack" data-class="notehead"/>
<path d="M0.388 -0.5C0.744 -0.5 1.18 -0.172 1.18 0.168C1.18 0.372 1.02 0.5 0.792 0.5C0.352 0.5 0 0.176 0 -0.168C0 -0.376 0.172 -0.5 0.388 -0.5Z" transform="translate(5.8391 -1)" fill="#000000" data-prov="a3820f9b52ab61a5c70d077f37b1dfbe" data-source-kind="1" data-glyph="noteheadBlack" data-class="notehead"/>
<path d="M0.388 -0.5C0.744 -0.5 1.18 -0.172 1.18 0.168C1.18 0.372 1.02 0.5 0.792 0.5C0.352 0.5 0 0.176 0 -0.168C0 -0.376 0.172 -0.5 0.388 -0.5Z" transform="translate(7.3391 -1)" fill="#000000" data-prov="893ce7ac8d0b518dd85d53aae07485a6" data-source-kind="1" data-glyph="noteheadBlack" data-class="notehead"/>
<path d="M0.388 -0.5C0.744 -0.5 1.18 -0.172 1.18 0.168C1.18 0.372 1.02 0.5 0.792 0.5C0.352 0.5 0 0.176 0 -0.168C0 -0.376 0.172 -0.5 0.388 -0.5Z" transform="translate(8.8391 -1)" fill="#000000" data-prov="e0a27906823095e45f5f8acb6e5784ab" data-source-kind="1" data-glyph="noteheadBlack" data-class="notehead"/>
<path d="M0.388 -0.5C0.744 -0.5 1.18 -0.172 1.18 0.168C1.18 0.372 1.02 0.5 0.792 0.5C0.352 0.5 0 0.176 0 -0.168C0 -0.376 0.172 -0.5 0.388 -0.5Z" transform="translate(11.8391 -1)" fill="#000000" data-prov="111d36d0544df9583dc71243a02cbace" data-source-kind="1" data-glyph="noteheadBlack" data-class="notehead"/>
<path d="M0.388 -0.5C0.744 -0.5 1.18 -0.172 1.18 0.168C1.18 0.372 1.02 0.5 0.792 0.5C0.352 0.5 0 0.176 0 -0.168C0 -0.376 0.172 -0.5 0.388 -0.5Z" transform="translate(13.3391 -1)" fill="#000000" data-prov="5abc05432af9047dd37a867f5508d366" data-source-kind="1" data-glyph="noteheadBlack" data-class="notehead"/>
<path d="M0.388 -0.5C0.744 -0.5 1.18 -0.172 1.18 0.168C1.18 0.372 1.02 0.5 0.792 0.5C0.352 0.5 0 0.176 0 -0.168C0 -0.376 0.172 -0.5 0.388 -0.5Z" transform="translate(14.8391 -1)" fill="#000000" data-prov="cb42d5aafb0af3c41ab468790c214695" data-source-kind="1" data-glyph="noteheadBlack" data-class="notehead"/>
<path d="M0.388 -0.5C0.744 -0.5 1.18 -0.172 1.18 0.168C1.18 0.372 1.02 0.5 0.792 0.5C0.352 0.5 0 0.176 0 -0.168C0 -0.376 0.172 -0.5 0.388 -0.5Z" transform="translate(16.3391 -1)" fill="#000000" data-prov="463525d1acbd9e2cfeb6bf72b8a3bb2a" data-source-kind="1" data-glyph="noteheadBlack" data-class="notehead"/>
<path d="M0.388 -0.5C0.744 -0.5 1.18 -0.172 1.18 0.168C1.18 0.372 1.02 0.5 0.792 0.5C0.352 0.5 0 0.176 0 -0.168C0 -0.376 0.172 -0.5 0.388 -0.5Z" transform="translate(19.3391 -1)" fill="#000000" data-prov="a673ee8395ee4b4d9652eebb4ded695b" data-source-kind="1" data-glyph="noteheadBlack" data-class="notehead"/>
<path d="M0.388 -0.5C0.744 -0.5 1.18 -0.172 1.18 0.168C1.18 0.372 1.02 0.5 0.792 0.5C0.352 0.5 0 0.176 0 -0.168C0 -0.376 0.172 -0.5 0.388 -0.5Z" transform="translate(20.8391 -1)" fill="#000000" data-prov="963cd4bce2dec2fc217d92c9691cfa10" data-source-kind="1" data-glyph="noteheadBlack" data-class="notehead"/>
<path d="M0.388 -0.5C0.744 -0.5 1.18 -0.172 1.18 0.168C1.18 0.372 1.02 0.5 0.792 0.5C0.352 0.5 0 0.176 0 -0.168C0 -0.376 0.172 -0.5 0.388 -0.5Z" transform="translate(22.3391 -1)" fill="#000000" data-prov="3bff036aa7f994b09edf4cdea0bbd625" data-source-kind="1" data-glyph="noteheadBlack" data-class="notehead"/>
<path d="M0.388 -0.5C0.744 -0.5 1.18 -0.172 1.18 0.168C1.18 0.372 1.02 0.5 0.792 0.5C0.352 0.5 0 0.176 0 -0.168C0 -0.376 0.172 -0.5 0.388 -0.5Z" transform="translate(23.8391 -1)" fill="#000000" data-prov="d63ffa0c7268bf23fcfeac0a1afde7f4" data-source-kind="1" data-glyph="noteheadBlack" data-class="notehead"/>
<path d="M0.388 -0.5C0.744 -0.5 1.18 -0.172 1.18 0.168C1.18 0.372 1.02 0.5 0.792 0.5C0.352 0.5 0 0.176 0 -0.168C0 -0.376 0.172 -0.5 0.388 -0.5Z" transform="translate(26.8391 -1)" fill="#000000" data-prov="184c7ae4b9e86ee27d0bd85ff4b3ec7f" data-source-kind="1" data-glyph="noteheadBlack" data-class="notehead"/>
<path d="M0.388 -0.5C0.744 -0.5 1.18 -0.172 1.18 0.168C1.18 0.372 1.02 0.5 0.792 0.5C0.352 0.5 0 0.176 0 -0.168C0 -0.376 0.172 -0.5 0.388 -0.5Z" transform="translate(28.3391 -1)" fill="#000000" data-prov="fb85357d0a96b2eb7a677d6edc58977e" data-source-kind="1" data-glyph="noteheadBlack" data-class="notehead"/>
<path d="M0.388 -0.5C0.744 -0.5 1.18 -0.172 1.18 0.168C1.18 0.372 1.02 0.5 0.792 0.5C0.352 0.5 0 0.176 0 -0.168C0 -0.376 0.172 -0.5 0.388 -0.5Z" transform="translate(29.8391 -1)" fill="#000000" data-prov="c5bb48e08cef8b001fa7953f02590464" data-source-kind="1" data-glyph="noteheadBlack" data-class="notehead"/>
<path d="M0.388 -0.5C0.744 -0.5 1.18 -0.172 1.18 0.168C1.18 0.372 1.02 0.5 0.792 0.5C0.352 0.5 0 0.176 0 -0.168C0 -0.376 0.172 -0.5 0.388 -0.5Z" transform="translate(31.3391 -1)" fill="#000000" data-prov="4f5cb48ae83cce69bc9907b49f2c55d8" data-source-kind="1" data-glyph="noteheadBlack" data-class="notehead"/>
<path d="M0.388 -0.5C0.744 -0.5 1.18 -0.172 1.18 0.168C1.18 0.372 1.02 0.5 0.792 0.5C0.352 0.5 0 0.176 0 -0.168C0 -0.376 0.172 -0.5 0.388 -0.5Z" transform="translate(34.3391 -1)" fill="#000000" data-prov="0cb38d85c0821f1a91f93d13cba6edc8" data-source-kind="1" data-glyph="noteheadBlack" data-class="notehead"/>
<path d="M0.388 -0.5C0.744 -0.5 1.18 -0.172 1.18 0.168C1.18 0.372 1.02 0.5 0.792 0.5C0.352 0.5 0 0.176 0 -0.168C0 -0.376 0.172 -0.5 0.388 -0.5Z" transform="translate(35.8391 -1)" fill="#000000" data-prov="4a111579a942ea99be4094d257b9229c" data-source-kind="1" data-glyph="noteheadBlack" data-class="notehead"/>
<path d="M0.388 -0.5C0.744 -0.5 1.18 -0.172 1.18 0.168C1.18 0.372 1.02 0.5 0.792 0.5C0.352 0.5 0 0.176 0 -0.168C0 -0.376 0.172 -0.5 0.388 -0.5Z" transform="translate(37.3391 -1)" fill="#000000" data-prov="edfdfb91c37ae76bfa51efd66c0f310a" data-source-kind="1" data-glyph="noteheadBlack" data-class="notehead"/>
<path d="M0.388 -0.5C0.744 -0.5 1.18 -0.172 1.18 0.168C1.18 0.372 1.02 0.5 0.792 0.5C0.352 0.5 0 0.176 0 -0.168C0 -0.376 0.172 -0.5 0.388 -0.5Z" transform="translate(38.8391 -1)" fill="#000000" data-prov="6361d185baa8ed77f350287e10ed2176" data-source-kind="1" data-glyph="noteheadBlack" data-class="notehead"/>
<path d="M0.388 -0.5C0.744 -0.5 1.18 -0.172 1.18 0.168C1.18 0.372 1.02 0.5 0.792 0.5C0.352 0.5 0 0.176 0 -0.168C0 -0.376 0.172 -0.5 0.388 -0.5Z" transform="translate(41.8391 -1)" fill="#000000" data-prov="c2caa10ac0cf05f631b91d334ef24493" data-source-kind="1" data-glyph="noteheadBlack" data-class="notehead"/>
<path d="M0.388 -0.5C0.744 -0.5 1.18 -0.172 1.18 0.168C1.18 0.372 1.02 0.5 0.792 0.5C0.352 0.5 0 0.176 0 -0.168C0 -0.376 0.172 -0.5 0.388 -0.5Z" transform="translate(43.3391 -1)" fill="#000000" data-prov="c16110f407e5c8ac507641d79d932fe6" data-source-kind="1" data-glyph="noteheadBlack" data-class="notehead"/>
<path d="M0.388 -0.5C0.744 -0.5 1.18 -0.172 1.18 0.168C1.18 0.372 1.02 0.5 0.792 0.5C0.352 0.5 0 0.176 0 -0.168C0 -0.376 0.172 -0.5 0.388 -0.5Z" transform="translate(44.8391 -1)" fill="#000000" data-prov="cf10c843c33809009e9333526dd0879f" data-source-kind="1" data-glyph="noteheadBlack" data-class="notehead"/>
<path d="M0.388 -0.5C0.744 -0.5 1.18 -0.172 1.18 0.168C1.18 0.372 1.02 0.5 0.792 0.5C0.352 0.5 0 0.176 0 -0.168C0 -0.376 0.172 -0.5 0.388 -0.5Z" transform="translate(46.3391 -1)" fill="#000000" data-prov="2aecf8993db2e9bf833e391d8824cac9" data-source-kind="1" data-glyph="noteheadBlack" data-class="notehead"/>
<path d="M0.388 -0.5C0.744 -0.5 1.18 -0.172 1.18 0.168C1.18 0.372 1.02 0.5 0.792 0.5C0.352 0.5 0 0.176 0 -0.168C0 -0.376 0.172 -0.5 0.388 -0.5Z" transform="translate(49.3391 -1)" fill="#000000" data-prov="b523a1a70a99069c4258e9a7f62744b8" data-source-kind="1" data-glyph="noteheadBlack" data-class="notehead"/>
<path d="M0.388 -0.5C0.744 -0.5 1.18 -0.172 1.18 0.168C1.18 0.372 1.02 0.5 0.792 0.5C0.352 0.5 0 0.176 0 -0.168C0 -0.376 0.172 -0.5 0.388 -0.5Z" transform="translate(50.8391 -1)" fill="#000000" data-prov="e970cb6a1cac78405c15ceaf6627f370" data-source-kind="1" data-glyph="noteheadBlack" data-class="notehead"/>
<path d="M0.388 -0.5C0.744 -0.5 1.18 -0.172 1.18 0.168C1.18 0.372 1.02 0.5 0.792 0.5C0.352 0.5 0 0.176 0 -0.168C0 -0.376 0.172 -0.5 0.388 -0.5Z" transform="translate(52.3391 -1)" fill="#000000" data-prov="e3eb76921ae215aa98331a9d1ad26804" data-source-kind="1" data-glyph="noteheadBlack" data-class="notehead"/>
<path d="M0.388 -0.5C0.744 -0.5 1.18 -0.172 1.18 0.168C1.18 0.372 1.02 0.5 0.792 0.5C0.352 0.5 0 0.176 0 -0.168C0 -0.376 0.172 -0.5 0.388 -0.5Z" transform="translate(53.8391 -1)" fill="#000000" data-prov="0fba3a760b42655a82fb25596d29fd02" data-source-kind="1" data-glyph="noteheadBlack" data-class="notehead"/>
<path d="M0.388 -0.5C0.744 -0.5 1.18 -0.172 1.18 0.168C1.18 0.372 1.02 0.5 0.792 0.5C0.352 0.5 0 0.176 0 -0.168C0 -0.376 0.172 -0.5 0.388 -0.5Z" transform="translate(56.8391 -1)" fill="#000000" data-prov="66fa0c6a9dfef2806751936f0360c782" data-source-kind="1" data-glyph="noteheadBlack" data-class="notehead"/>
<path d="M0.388 -0.5C0.744 -0.5 1.18 -0.172 1.18 0.168C1.18 0.372 1.02 0.5 0.792 0.5C0.352 0.5 0 0.176 0 -0.168C0 -0.376 0.172 -0.5 0.388 -0.5Z" transform="translate(58.3391 -1)" fill="#000000" data-prov="b546aac49da2b4624d759aed4527fe1d" data-source-kind="1" data-glyph="noteheadBlack" data-class="notehead"/>
<path d="M0.388 -0.5C0.744 -0.5 1.18 -0.172 1.18 0.168C1.18 0.372 1.02 0.5 0.792 0.5C0.352 0.5 0 0.176 0 -0.168C0 -0.376 0.172 -0.5 0.388 -0.5Z" transform="translate(59.8391 -1)" fill="#000000" data-prov="0275a564c27b5031f71cce54b0a8f830" data-source-kind="1" data-glyph="noteheadBlack" data-class="notehead"/>
<path d="M0.388 -0.5C0.744 -0.5 1.18 -0.172 1.18 0.168C1.18 0.372 1.02 0.5 0.792 0.5C0.352 0.5 0 0.176 0 -0.168C0 -0.376 0.172 -0.5 0.388 -0.5Z" transform="translate(61.3391 -1)" fill="#000000" data-prov="a5b5cfea1a313032df813df1dcb06bc8" data-source-kind="1" data-glyph="noteheadBlack" data-class="notehead"/>
<path d="M0.388 -0.5C0.744 -0.5 1.18 -0.172 1.18 0.168C1.18 0.372 1.02 0.5 0.792 0.5C0.352 0.5 0 0.176 0 -0.168C0 -0.376 0.172 -0.5 0.388 -0.5Z" transform="translate(64.3391 -1)" fill="#000000" data-prov="6c3f374430ab9118c68bf368ccf35357" data-source-kind="1" data-glyph="noteheadBlack" data-class="notehead"/>
<path d="M0.388 -0.5C0.744 -0.5 1.18 -0.172 1.18 0.168C1.18 0.372 1.02 0.5 0.792 0.5C0.352 0.5 0 0.176 0 -0.168C0 -0.376 0.172 -0.5 0.388 -0.5Z" transform="translate(65.8391 -1)" fill="#000000" data-prov="e95f370ea65c0f5c664b994bce3040ad" data-source-kind="1" data-glyph="noteheadBlack" data-class="notehead"/>
<path d="M0.388 -0.5C0.744 -0.5 1.18 -0.172 1.18 0.168C1.18 0.372 1.02 0.5 0.792 0.5C0.352 0.5 0 0.176 0 -0.168C0 -0.376 0.172 -0.5 0.388 -0.5Z" transform="translate(67.3391 -1)" fill="#000000" data-prov="c27abce6ad5e01170068a491b9424cbb" data-source-kind="1" data-glyph="noteheadBlack" data-class="notehead"/>
<path d="M0.388 -0.5C0.744 -0.5 1.18 -0.172 1.18 0.168C1.18 0.372 1.02 0.5 0.792 0.5C0.352 0.5 0 0.176 0 -0.168C0 -0.376 0.172 -0.5 0.388 -0.5Z" transform="translate(68.8391 -1)" fill="#000000" data-prov="682d690f334af9f63b1a71a7d6cb10d8" data-source-kind="1" data-glyph="noteheadBlack" data-class="notehead"/>
<path d="M0.388 -0.5C0.744 -0.5 1.18 -0.172 1.18 0.168C1.18 0.372 1.02 0.5 0.792 0.5C0.352 0.5 0 0.176 0 -0.168C0 -0.376 0.172 -0.5 0.388 -0.5Z" transform="translate(70.3391 -1)" fill="#000000" data-prov="b6f35f534dabfbb2ff75515cdd1713c5" data-source-kind="1" data-glyph="noteheadBlack" data-class="notehead"/>
<path d="M0.388 -0.5C0.744 -0.5 1.18 -0.172 1.18 0.168C1.18 0.372 1.02 0.5 0.792 0.5C0.352 0.5 0 0.176 0 -0.168C0 -0.376 0.172 -0.5 0.388 -0.5Z" transform="translate(71.8391 -1)" fill="#000000" data-prov="5bc064cf9ed41d380fddb186477aeb78" data-source-kind="1" data-glyph="noteheadBlack" data-class="notehead"/>
<path d="M0.388 -0.5C0.744 -0.5 1.18 -0.172 1.18 0.168C1.18 0.372 1.02 0.5 0.792 0.5C0.352 0.5 0 0.176 0 -0.168C0 -0.376 0.172 -0.5 0.388 -0.5Z" transform="translate(73.3391 -1)" fill="#000000" data-prov="8e06e0b817d3359c9e251afed6d58cee" data-source-kind="1" data-glyph="noteheadBlack" data-class="notehead"/>
<path d="M0.388 -0.5C0.744 -0.5 1.18 -0.172 1.18 0.168C1.18 0.372 1.02 0.5 0.792 0.5C0.352 0.5 0 0.176 0 -0.168C0 -0.376 0.172 -0.5 0.388 -0.5Z" transform="translate(74.8391 -1)" fill="#000000" data-prov="86405f19f3e47252c21d628ae33e94c2" data-source-kind="1" data-glyph="noteheadBlack" data-class="notehead"/>
<path d="M0.144 0V4H0V0Z" transform="translate(2.8391 2)" fill="#000000" data-prov="913e510f5e3d36b6ab5a21a0bd531816" data-source-kind="9" data-glyph="barlineSingle" data-class="barline"/>
<path d="M0.144 0V4H0V0Z" transform="translate(10.3391 2)" fill="#000000" data-prov="e8f4fdf6d757a83af167a7d7b0d268b9" data-source-kind="9" data-glyph="barlineSingle" data-class="barline"/>
<path d="M0.144 0V4H0V0Z" transform="translate(17.8391 2)" fill="#000000" data-prov="aa6e5be72b5517b089a04363f42a1d1c" data-source-kind="9" data-glyph="barlineSingle" data-class="barline"/>
<path d="M0.144 0V4H0V0Z" transform="translate(25.3391 2)" fill="#000000" data-prov="ee1eea474c5d0d997d284a2610206922" data-source-kind="9" data-glyph="barlineSingle" data-class="barline"/>
<path d="M0.144 0V4H0V0Z" transform="translate(32.8391 2)" fill="#000000" data-prov="a353d60fd103f7a61e55a2b8aa95114e" data-source-kind="9" data-glyph="barlineSingle" data-class="barline"/>
<path d="M0.144 0V4H0V0Z" transform="translate(40.3391 2)" fill="#000000" data-prov="55d172d9d863190758f311e8b5c69c9b" data-source-kind="9" data-glyph="barlineSingle" data-class="barline"/>
<path d="M0.144 0V4H0V0Z" transform="translate(47.8391 2)" fill="#000000" data-prov="7552f781fca3b72788a57822d143ee69" data-source-kind="9" data-glyph="barlineSingle" data-class="barline"/>
<path d="M0.144 0V4H0V0Z" transform="translate(55.3391 2)" fill="#000000" data-prov="4e04c5515de885c96a377123738e0397" data-source-kind="9" data-glyph="barlineSingle" data-class="barline"/>
<path d="M0.144 0V4H0V0Z" transform="translate(62.8391 2)" fill="#000000" data-prov="65d223b9dca9579949a3a134b8d06182" data-source-kind="9" data-glyph="barlineSingle" data-class="barline"/>
<path d="M0.144 0V4H0V0ZM0.912 4H0.412V0H0.912Z" transform="translate(76.3391 2)" fill="#000000" data-prov="8f49273e29ce144556b73f0e914cf377" data-source-kind="9" data-glyph="barlineFinal" data-class="barline"/>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 25 KiB

View File

@ -0,0 +1,14 @@
fixture=valid_score_rich solver=engrave
glyph_count=11
path_count=11
fallback_rect_count=0
stroke_count=33
provenance_count=44
layer_count=1
hard_constraint_count=0
xml_well_formed=true
view_box=[-3.0113542 -3.632 27.468542 11.632]
class_counts:
barline=1
clef=3
notehead=7

View File

@ -0,0 +1,52 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg xmlns="http://www.w3.org/2000/svg" width="274.6854" height="116.32" viewBox="0 0 27.4685 11.632">
<!-- epiphany-render-svg: glyphs are genuine Bravura SMuFL outlines; geometry is the resolved layout verbatim, no engraving performed here -->
<g transform="translate(3.0114 8) scale(1 -1)">
<g data-layer="0">
<line x1="0" y1="0" x2="0" y2="0" stroke="#000000" stroke-width="0" data-prov="bd56ad529a36a7bbf2b4c343886b55e5" data-source-kind="6" data-kind="stroke"/>
<line x1="-0.9464" y1="0" x2="7.5057" y2="0" stroke="#000000" stroke-width="0.13" data-prov="f6b4640bbb87f4c52d2e8bb00667c1c4" data-source-kind="3" data-kind="stroke"/>
<line x1="-0.9464" y1="1" x2="7.5057" y2="1" stroke="#000000" stroke-width="0.13" data-prov="576ce5892fe554d096e5842d3d1fc1a2" data-source-kind="3" data-kind="stroke"/>
<line x1="-0.9464" y1="2" x2="7.5057" y2="2" stroke="#000000" stroke-width="0.13" data-prov="dd8a37a522ad3b0a5d5349dd123b2e54" data-source-kind="3" data-kind="stroke"/>
<line x1="-0.9464" y1="3" x2="7.5057" y2="3" stroke="#000000" stroke-width="0.13" data-prov="37fd5692db0c0904ede5a67d2f85feeb" data-source-kind="3" data-kind="stroke"/>
<line x1="-0.9464" y1="4" x2="7.5057" y2="4" stroke="#000000" stroke-width="0.13" data-prov="d8d766432ab5a036bcb136abc9353807" data-source-kind="3" data-kind="stroke"/>
<line x1="0" y1="0" x2="0" y2="0" stroke="#000000" stroke-width="0" data-prov="c9e2f7b92061893043380eabfe8fbcd2" data-source-kind="2" data-kind="stroke"/>
<line x1="3.9172" y1="-1" x2="3.9172" y2="2.5" stroke="#000000" stroke-width="0.12" data-prov="fb2b9c85e73e553a05ccc47d55af4811" data-source-kind="0" data-kind="stroke"/>
<line x1="5.4172" y1="-1" x2="5.4172" y2="2.5" stroke="#000000" stroke-width="0.12" data-prov="109fe59f980a1b9bfa00a76e41b78dba" data-source-kind="0" data-kind="stroke"/>
<line x1="6.3955" y1="-1" x2="6.3955" y2="2.5" stroke="#000000" stroke-width="0.12" data-prov="d4ef3689df957acec175a1396cebd27c" data-source-kind="0" data-kind="stroke"/>
<line x1="0" y1="0" x2="0" y2="0" stroke="#000000" stroke-width="0" data-prov="a647c465b9e490a52c23029a2c906cda" data-source-kind="12" data-kind="stroke"/>
<line x1="0" y1="0" x2="0" y2="0" stroke="#000000" stroke-width="0" data-prov="8ed9d2ef46e84abf412a1b82e125d3a6" data-source-kind="22" data-kind="stroke"/>
<line x1="0" y1="0" x2="0" y2="0" stroke="#000000" stroke-width="0" data-prov="7b42d513243366bc1409bbb4cf418fac" data-source-kind="14" data-kind="stroke"/>
<line x1="0" y1="0" x2="0" y2="0" stroke="#000000" stroke-width="0" data-prov="c8ad1fa9386570a1f3e49ccbf43b17f8" data-source-kind="15" data-kind="stroke"/>
<line x1="0" y1="0" x2="0" y2="0" stroke="#000000" stroke-width="0" data-prov="9f8b66aae47123317fae42a521a8ea1a" data-source-kind="25" data-kind="stroke"/>
<line x1="8.8391" y1="0" x2="8.8391" y2="0" stroke="#000000" stroke-width="0" data-prov="311476ddcf5ddef3b76e9d807237a21a" data-source-kind="6" data-kind="stroke"/>
<line x1="8.5057" y1="0" x2="13.8887" y2="0" stroke="#000000" stroke-width="0.13" data-prov="ead033c623ec6fc4eab9fd3839b7caa9" data-source-kind="3" data-kind="stroke"/>
<line x1="8.5057" y1="1" x2="13.8887" y2="1" stroke="#000000" stroke-width="0.13" data-prov="878244625d3b30db37ee716c607b3131" data-source-kind="3" data-kind="stroke"/>
<line x1="8.5057" y1="2" x2="13.8887" y2="2" stroke="#000000" stroke-width="0.13" data-prov="33be23946d80fa61db93990bb8ce3090" data-source-kind="3" data-kind="stroke"/>
<line x1="8.5057" y1="3" x2="13.8887" y2="3" stroke="#000000" stroke-width="0.13" data-prov="497e490bbe54d5dffa7b6e498e561aba" data-source-kind="3" data-kind="stroke"/>
<line x1="8.5057" y1="4" x2="13.8887" y2="4" stroke="#000000" stroke-width="0.13" data-prov="0de0bf3d70a45dda0bcad9c291c8399a" data-source-kind="3" data-kind="stroke"/>
<line x1="8.8391" y1="0" x2="8.8391" y2="0" stroke="#000000" stroke-width="0" data-prov="c36e7a12ef652f2f8e8cf771489cdcdc" data-source-kind="2" data-kind="stroke"/>
<line x1="12.7562" y1="-1" x2="12.7562" y2="2.5" stroke="#000000" stroke-width="0.12" data-prov="e01815eeb89bc5fcd5157c32311ccf10" data-source-kind="0" data-kind="stroke"/>
<line x1="13.4051" y1="-0.5" x2="13.4051" y2="3" stroke="#000000" stroke-width="0.12" data-prov="119c53a4e3bf288ded2bd28178d6fcbe" data-source-kind="0" data-kind="stroke"/>
<line x1="14.6781" y1="0" x2="14.6781" y2="0" stroke="#000000" stroke-width="0" data-prov="973e800421dc74ca8f5d1b5be644a433" data-source-kind="6" data-kind="stroke"/>
<line x1="14.4808" y1="0" x2="22.3922" y2="0" stroke="#000000" stroke-width="0.13" data-prov="5909bb98de8ef36fa41f0493dd500023" data-source-kind="3" data-kind="stroke"/>
<line x1="14.4808" y1="1" x2="22.3922" y2="1" stroke="#000000" stroke-width="0.13" data-prov="e994e0b2b56dd52f254e7bbfa045973a" data-source-kind="3" data-kind="stroke"/>
<line x1="14.4808" y1="2" x2="22.3922" y2="2" stroke="#000000" stroke-width="0.13" data-prov="ef2e4986f9259c1be99015db776cc9cf" data-source-kind="3" data-kind="stroke"/>
<line x1="14.4808" y1="3" x2="22.3922" y2="3" stroke="#000000" stroke-width="0.13" data-prov="5de2776918f9997a484f5a80167007b1" data-source-kind="3" data-kind="stroke"/>
<line x1="14.4808" y1="4" x2="22.3922" y2="4" stroke="#000000" stroke-width="0.13" data-prov="2b697bcb6cc7418ce5ddbe47fdb84406" data-source-kind="3" data-kind="stroke"/>
<line x1="14.6781" y1="0" x2="14.6781" y2="0" stroke="#000000" stroke-width="0" data-prov="3550b79c14ba8069d76656ff5347dc71" data-source-kind="2" data-kind="stroke"/>
<line x1="18.5953" y1="-1" x2="18.5953" y2="2.5" stroke="#000000" stroke-width="0.12" data-prov="2a1a8f5701737dac37ac7249833d1b7c" data-source-kind="0" data-kind="stroke"/>
<line x1="20.0953" y1="-0.5" x2="20.0953" y2="3" stroke="#000000" stroke-width="0.12" data-prov="ec08ad9ddf4f78c806a81632fe2ae1e4" data-source-kind="0" data-kind="stroke"/>
<path d="M1.504 1.66C1.496 1.708 1.504 1.712 1.528 1.736C1.96 2.14 2.288 2.648 2.288 3.26C2.288 3.608 2.192 3.952 2.028 4.192C1.968 4.28 1.864 4.392 1.82 4.392C1.764 4.392 1.64 4.288 1.56 4.2C1.264 3.872 1.168 3.372 1.168 2.956C1.168 2.724 1.196 2.464 1.224 2.3C1.232 2.252 1.236 2.244 1.188 2.204C0.612 1.728 0 1.156 0 0.348C0 -0.348 0.476 -1.008 1.456 -1.008C1.548 -1.008 1.652 -1 1.732 -0.984C1.776 -0.976 1.784 -0.972 1.792 -1.02C1.84 -1.288 1.9 -1.636 1.9 -1.824C1.9 -2.416 1.5 -2.488 1.264 -2.488C1.048 -2.488 0.944 -2.424 0.944 -2.372C0.944 -2.344 0.98 -2.332 1.072 -2.304C1.196 -2.268 1.34 -2.16 1.34 -1.928C1.34 -1.708 1.2 -1.52 0.956 -1.52C0.688 -1.52 0.528 -1.732 0.528 -1.98C0.528 -2.24 0.684 -2.632 1.288 -2.632C1.556 -2.632 2.076 -2.512 2.076 -1.832C2.076 -1.604 2.004 -1.224 1.96 -0.976C1.952 -0.928 1.956 -0.932 2.012 -0.908C2.416 -0.748 2.684 -0.408 2.684 0.044C2.684 0.556 2.308 1.008 1.72 1.008C1.616 1.008 1.616 1.008 1.604 1.08ZM1.88 3.772C2.012 3.772 2.12 3.664 2.12 3.444C2.12 3 1.74 2.64 1.424 2.364C1.396 2.34 1.38 2.344 1.372 2.396C1.356 2.5 1.348 2.636 1.348 2.764C1.348 3.388 1.636 3.772 1.88 3.772ZM1.444 1.048C1.456 0.972 1.456 0.976 1.384 0.952C1.032 0.832 0.804 0.516 0.804 0.176C0.804 -0.184 0.992 -0.44 1.264 -0.532C1.296 -0.544 1.344 -0.556 1.372 -0.556C1.404 -0.556 1.42 -0.536 1.42 -0.512C1.42 -0.484 1.388 -0.472 1.36 -0.46C1.192 -0.388 1.072 -0.216 1.072 -0.032C1.072 0.196 1.228 0.368 1.472 0.436C1.536 0.452 1.544 0.448 1.552 0.404L1.752 -0.788C1.76 -0.832 1.756 -0.832 1.696 -0.844C1.632 -0.856 1.552 -0.864 1.472 -0.864C0.772 -0.864 0.32 -0.476 0.32 0.08C0.32 0.316 0.36 0.632 0.692 1.008C0.932 1.276 1.116 1.424 1.304 1.576C1.344 1.608 1.352 1.604 1.36 1.56ZM1.72 0.412C1.712 0.46 1.716 0.472 1.764 0.468C2.088 0.44 2.356 0.168 2.356 -0.184C2.356 -0.436 2.204 -0.64 1.98 -0.752C1.932 -0.776 1.924 -0.776 1.916 -0.728Z" transform="translate(0 1)" fill="#000000" data-prov="31186a3ef9c061378bfd5da443b88aa8" data-source-kind="4" data-glyph="gClef" data-class="clef"/>
<path d="M0.388 -0.5C0.744 -0.5 1.18 -0.172 1.18 0.168C1.18 0.372 1.02 0.5 0.792 0.5C0.352 0.5 0 0.176 0 -0.168C0 -0.376 0.172 -0.5 0.388 -0.5Z" transform="translate(2.8391 -1)" fill="#000000" data-prov="1c92743d8b3afa333dde4fc1bbe503ba" data-source-kind="1" data-glyph="noteheadBlack" data-class="notehead"/>
<path d="M0.388 -0.5C0.744 -0.5 1.18 -0.172 1.18 0.168C1.18 0.372 1.02 0.5 0.792 0.5C0.352 0.5 0 0.176 0 -0.168C0 -0.376 0.172 -0.5 0.388 -0.5Z" transform="translate(4.3391 -1)" fill="#000000" data-prov="56a954e9547cffd75e82fdad63afb684" data-source-kind="1" data-glyph="noteheadBlack" data-class="notehead"/>
<path d="M0.388 -0.5C0.744 -0.5 1.18 -0.172 1.18 0.168C1.18 0.372 1.02 0.5 0.792 0.5C0.352 0.5 0 0.176 0 -0.168C0 -0.376 0.172 -0.5 0.388 -0.5Z" transform="translate(5.8391 -1)" fill="#000000" data-prov="290c3f76bff74030da13f651df94fd4b" data-source-kind="1" data-glyph="noteheadBlack" data-class="notehead"/>
<path d="M0.144 0V4H0V0ZM0.912 4H0.412V0H0.912Z" transform="translate(7.3391 2)" fill="#000000" data-prov="3111f6a4a6bc3100a78fa6f04b2e2f86" data-source-kind="9" data-glyph="barlineFinal" data-class="barline"/>
<path d="M1.504 1.66C1.496 1.708 1.504 1.712 1.528 1.736C1.96 2.14 2.288 2.648 2.288 3.26C2.288 3.608 2.192 3.952 2.028 4.192C1.968 4.28 1.864 4.392 1.82 4.392C1.764 4.392 1.64 4.288 1.56 4.2C1.264 3.872 1.168 3.372 1.168 2.956C1.168 2.724 1.196 2.464 1.224 2.3C1.232 2.252 1.236 2.244 1.188 2.204C0.612 1.728 0 1.156 0 0.348C0 -0.348 0.476 -1.008 1.456 -1.008C1.548 -1.008 1.652 -1 1.732 -0.984C1.776 -0.976 1.784 -0.972 1.792 -1.02C1.84 -1.288 1.9 -1.636 1.9 -1.824C1.9 -2.416 1.5 -2.488 1.264 -2.488C1.048 -2.488 0.944 -2.424 0.944 -2.372C0.944 -2.344 0.98 -2.332 1.072 -2.304C1.196 -2.268 1.34 -2.16 1.34 -1.928C1.34 -1.708 1.2 -1.52 0.956 -1.52C0.688 -1.52 0.528 -1.732 0.528 -1.98C0.528 -2.24 0.684 -2.632 1.288 -2.632C1.556 -2.632 2.076 -2.512 2.076 -1.832C2.076 -1.604 2.004 -1.224 1.96 -0.976C1.952 -0.928 1.956 -0.932 2.012 -0.908C2.416 -0.748 2.684 -0.408 2.684 0.044C2.684 0.556 2.308 1.008 1.72 1.008C1.616 1.008 1.616 1.008 1.604 1.08ZM1.88 3.772C2.012 3.772 2.12 3.664 2.12 3.444C2.12 3 1.74 2.64 1.424 2.364C1.396 2.34 1.38 2.344 1.372 2.396C1.356 2.5 1.348 2.636 1.348 2.764C1.348 3.388 1.636 3.772 1.88 3.772ZM1.444 1.048C1.456 0.972 1.456 0.976 1.384 0.952C1.032 0.832 0.804 0.516 0.804 0.176C0.804 -0.184 0.992 -0.44 1.264 -0.532C1.296 -0.544 1.344 -0.556 1.372 -0.556C1.404 -0.556 1.42 -0.536 1.42 -0.512C1.42 -0.484 1.388 -0.472 1.36 -0.46C1.192 -0.388 1.072 -0.216 1.072 -0.032C1.072 0.196 1.228 0.368 1.472 0.436C1.536 0.452 1.544 0.448 1.552 0.404L1.752 -0.788C1.76 -0.832 1.756 -0.832 1.696 -0.844C1.632 -0.856 1.552 -0.864 1.472 -0.864C0.772 -0.864 0.32 -0.476 0.32 0.08C0.32 0.316 0.36 0.632 0.692 1.008C0.932 1.276 1.116 1.424 1.304 1.576C1.344 1.608 1.352 1.604 1.36 1.56ZM1.72 0.412C1.712 0.46 1.716 0.472 1.764 0.468C2.088 0.44 2.356 0.168 2.356 -0.184C2.356 -0.436 2.204 -0.64 1.98 -0.752C1.932 -0.776 1.924 -0.776 1.916 -0.728Z" transform="translate(8.8391 1)" fill="#000000" data-prov="5a3ada73e6c7dab552b6c44a6aa8f9b6" data-source-kind="4" data-glyph="gClef" data-class="clef"/>
<path d="M0.388 -0.5C0.744 -0.5 1.18 -0.172 1.18 0.168C1.18 0.372 1.02 0.5 0.792 0.5C0.352 0.5 0 0.176 0 -0.168C0 -0.376 0.172 -0.5 0.388 -0.5Z" transform="translate(11.6781 -1)" fill="#000000" data-prov="23cf4d4c63aa6a23024a756ec4aabc6d" data-source-kind="1" data-glyph="noteheadBlack" data-class="notehead"/>
<path d="M0.388 -0.5C0.744 -0.5 1.18 -0.172 1.18 0.168C1.18 0.372 1.02 0.5 0.792 0.5C0.352 0.5 0 0.176 0 -0.168C0 -0.376 0.172 -0.5 0.388 -0.5Z" transform="translate(13.1781 -0.5)" fill="#000000" data-prov="866d5e0219f737a3aa929bcff3d98833" data-source-kind="1" data-glyph="noteheadBlack" data-class="notehead"/>
<path d="M1.504 1.66C1.496 1.708 1.504 1.712 1.528 1.736C1.96 2.14 2.288 2.648 2.288 3.26C2.288 3.608 2.192 3.952 2.028 4.192C1.968 4.28 1.864 4.392 1.82 4.392C1.764 4.392 1.64 4.288 1.56 4.2C1.264 3.872 1.168 3.372 1.168 2.956C1.168 2.724 1.196 2.464 1.224 2.3C1.232 2.252 1.236 2.244 1.188 2.204C0.612 1.728 0 1.156 0 0.348C0 -0.348 0.476 -1.008 1.456 -1.008C1.548 -1.008 1.652 -1 1.732 -0.984C1.776 -0.976 1.784 -0.972 1.792 -1.02C1.84 -1.288 1.9 -1.636 1.9 -1.824C1.9 -2.416 1.5 -2.488 1.264 -2.488C1.048 -2.488 0.944 -2.424 0.944 -2.372C0.944 -2.344 0.98 -2.332 1.072 -2.304C1.196 -2.268 1.34 -2.16 1.34 -1.928C1.34 -1.708 1.2 -1.52 0.956 -1.52C0.688 -1.52 0.528 -1.732 0.528 -1.98C0.528 -2.24 0.684 -2.632 1.288 -2.632C1.556 -2.632 2.076 -2.512 2.076 -1.832C2.076 -1.604 2.004 -1.224 1.96 -0.976C1.952 -0.928 1.956 -0.932 2.012 -0.908C2.416 -0.748 2.684 -0.408 2.684 0.044C2.684 0.556 2.308 1.008 1.72 1.008C1.616 1.008 1.616 1.008 1.604 1.08ZM1.88 3.772C2.012 3.772 2.12 3.664 2.12 3.444C2.12 3 1.74 2.64 1.424 2.364C1.396 2.34 1.38 2.344 1.372 2.396C1.356 2.5 1.348 2.636 1.348 2.764C1.348 3.388 1.636 3.772 1.88 3.772ZM1.444 1.048C1.456 0.972 1.456 0.976 1.384 0.952C1.032 0.832 0.804 0.516 0.804 0.176C0.804 -0.184 0.992 -0.44 1.264 -0.532C1.296 -0.544 1.344 -0.556 1.372 -0.556C1.404 -0.556 1.42 -0.536 1.42 -0.512C1.42 -0.484 1.388 -0.472 1.36 -0.46C1.192 -0.388 1.072 -0.216 1.072 -0.032C1.072 0.196 1.228 0.368 1.472 0.436C1.536 0.452 1.544 0.448 1.552 0.404L1.752 -0.788C1.76 -0.832 1.756 -0.832 1.696 -0.844C1.632 -0.856 1.552 -0.864 1.472 -0.864C0.772 -0.864 0.32 -0.476 0.32 0.08C0.32 0.316 0.36 0.632 0.692 1.008C0.932 1.276 1.116 1.424 1.304 1.576C1.344 1.608 1.352 1.604 1.36 1.56ZM1.72 0.412C1.712 0.46 1.716 0.472 1.764 0.468C2.088 0.44 2.356 0.168 2.356 -0.184C2.356 -0.436 2.204 -0.64 1.98 -0.752C1.932 -0.776 1.924 -0.776 1.916 -0.728Z" transform="translate(14.6781 1)" fill="#000000" data-prov="c46ea45155710bbe02c7dc32cfe32bc2" data-source-kind="4" data-glyph="gClef" data-class="clef"/>
<path d="M0.388 -0.5C0.744 -0.5 1.18 -0.172 1.18 0.168C1.18 0.372 1.02 0.5 0.792 0.5C0.352 0.5 0 0.176 0 -0.168C0 -0.376 0.172 -0.5 0.388 -0.5Z" transform="translate(17.5172 -1)" fill="#000000" data-prov="7d6b27caefc21b2a04761b299840e44d" data-source-kind="1" data-glyph="noteheadBlack" data-class="notehead"/>
<path d="M0.388 -0.5C0.744 -0.5 1.18 -0.172 1.18 0.168C1.18 0.372 1.02 0.5 0.792 0.5C0.352 0.5 0 0.176 0 -0.168C0 -0.376 0.172 -0.5 0.388 -0.5Z" transform="translate(19.0172 -0.5)" fill="#000000" data-prov="8311e890285ee9cffb3e19c98277caa4" data-source-kind="1" data-glyph="noteheadBlack" data-class="notehead"/>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 14 KiB