Two-sided inter-staff renegotiation, and the cascade defect it uncovered
ENGRAVER_VERSION 11 -> 12. The inter-staff solve now closes a slack pair as well
as opening a crowded one, realizing the InterStaffGap band's declared height
exactly. SYSTEM_STAFF_PITCH is demoted from a floor to an initial arrangement the
solve fully renegotiates. This is what vertical_density_penalty was reporting: an
un-pressured multi-staff system sat at 0.739, honest sprawl against the declared
gap, because the axis is symmetric and the solve only ever expanded.
The band's height had no agreed meaning, so pin it: it is an INK CLEARANCE -- the
separation between the two staves' outermost content, exactly the unit
req:qmc:vertical measures. preferred 2.0 -> 5.0, min 1.0 -> 2.0. The old 2.0 was
a placeholder reconciled with nothing: neither the 8.0 staff-box gap the fixed
pitch of 12 produces, nor the ~6.4 ink clearance it leaves for plain content.
Realizing it would have crushed a relaxed system to a pitch of ~7.6. At 5.0 plain
ledgered content settles near a pitch of 10.6.
Making the solve two-sided immediately exposed a CASCADE DEFECT latent since v11.
The recurrence subtracted the upper staff's shift from the measured gap and then
added it back through the accumulator, so every pair below the first was
over-separated by exactly the shift above it. Both staves move; the relation is
shift_lower = shift_upper + target - (upper_lo - lower_hi), the UNSHIFTED gap.
three_staff_close_content's lower pair realized 21.06 against a declared 4.0. It
was invisible on two-staff fixtures (shift_upper = 0) and invisible to
inter_staff_shifts_cascade_down_three_staves, which asserted only s2 > s1 -- true
under both the correct and the double-counting recurrence.
What caught it was the metric measuring realized clearance back from the BAKED
output instead of the solve's own extents. Reading back solver intent would have
reported 0 and shipped the over-separation again. That design choice was made one
commit earlier for exactly this reason; the catalog rationale now recommends it to
any conforming implementation.
Once the solve realizes each declared clearance exactly, every inter-staff unit is
0 on a healthy solve -- the axis becomes a solver self-check, and its MEAN can no
longer distinguish "measured every realization" from "measured one". So
vertical_raw is split into vertical_units and the regressions assert the unit SET.
Four mutations verified: the double-counting recurrence, expand-only, the
glyph-members band filter, and first-system-only measurement each fail a named test.
No normative change, no version move: QMC formula, units, anchors, thresholds all
untouched; only its non-normative rationale is refreshed. Churn is the two
multi-staff engrave goldens: two_staff grew by exactly 3.0 (the target change, no
cascade); three_staff SHRANK by 9.06 -- the same +3 per pair, less the 17.06 of
over-separation the defect was adding. Single-staff and every stub golden are
byte-stable.
The 5.0 was the user's call. 4.0 ("one staff height") was chosen first and
withdrawn once its true consequence -- pitch 9.57, not the 11.04 an arithmetic slip
of mine had projected -- was measured rather than inferred. The slip: deriving
plain-content ink clearance from an aggregate metric by assuming two contributing
units when it had three.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
parent
029039bf35
commit
86635e43e1
|
|
@ -817,10 +817,12 @@ is untouched. Locked by `inter_staff_solve_separates_colliding_staves` (the
|
||||||
two-staff pressure fixture's staff-line gap opens past the fixed pitch while a
|
two-staff pressure fixture's staff-line gap opens past the fixed pitch while a
|
||||||
single-staff score keeps one staff per system) and the `two_staff_close_content`
|
single-staff score keeps one staff per system) and the `two_staff_close_content`
|
||||||
render golden (the visible before/after: slice 1 tight, slice 2 separated).
|
render golden (the visible before/after: slice 1 tight, slice 2 separated).
|
||||||
**Deferred:** compressing an OVER-wide fixed gap toward preferred (the solve
|
~~**Deferred:** compressing an OVER-wide fixed gap toward preferred (the solve
|
||||||
only expands, never pulls staves together — the fixed pitch is generous by
|
only expands, never pulls staves together — the fixed pitch is generous by
|
||||||
default, so this is rarely wanted); per-staff spring *stretch* to fill spare
|
default, so this is rarely wanted).~~ **DONE** — see "Two-sided renegotiation"
|
||||||
system height (the inter-system justification carries the fill for now).
|
below; "rarely wanted" was wrong, and the metric said so.
|
||||||
|
**Still deferred:** per-staff spring *stretch* to fill spare system height (the
|
||||||
|
inter-system justification carries the fill for now).
|
||||||
|
|
||||||
**The cascade, and why it grows faster than the raw corrections.** A pair's gap
|
**The cascade, and why it grows faster than the raw corrections.** A pair's gap
|
||||||
is measured against the upper staff's **already shifted** bottom, so staff *i*'s
|
is measured against the upper staff's **already shifted** bottom, so staff *i*'s
|
||||||
|
|
@ -943,3 +945,73 @@ wanted") is therefore promoted from *rarely wanted* to **measurably wrong**: any
|
||||||
un-pressured multi-staff system now reports honest sprawl until the solve can pull
|
un-pressured multi-staff system now reports honest sprawl until the solve can pull
|
||||||
staves together. Named here rather than fixed in the same breath — compression is
|
staves together. Named here rather than fixed in the same breath — compression is
|
||||||
a layout change (golden churn, `ENGRAVER_VERSION` move), not a measurement one.
|
a layout change (golden churn, `ENGRAVER_VERSION` move), not a measurement one.
|
||||||
|
|
||||||
|
## Two-sided renegotiation, and the cascade defect it uncovered (2026-07-09)
|
||||||
|
|
||||||
|
`ENGRAVER_VERSION` 11 → 12. The inter-staff solve now **closes a slack pair as
|
||||||
|
well as opening a crowded one**, realizing the `InterStaffGap` band's declared
|
||||||
|
height exactly. The constrained stage's fixed `SYSTEM_STAFF_PITCH` is demoted
|
||||||
|
from a floor to an initial arrangement the solve fully renegotiates.
|
||||||
|
|
||||||
|
**Why:** the expand-only solve made `vertical_density_penalty` report honest
|
||||||
|
sprawl on every relaxed multi-staff system (0.739 on `two_staff_wrapping_pressure`).
|
||||||
|
The axis is symmetric — a gap wider than preferred is sprawl exactly as a
|
||||||
|
narrower one is crowding — so either the layout or the number was wrong. It was
|
||||||
|
both, in different ways.
|
||||||
|
|
||||||
|
**What the band's height MEANS.** It is an **ink clearance**: the separation
|
||||||
|
between the two staves' outermost content (ledgers, stems, slurs), which is the
|
||||||
|
unit `req:qmc:vertical` measures. The old `preferred = 2.0` was a placeholder
|
||||||
|
reconciled with nothing — neither the 8.0 staff-box gap the fixed pitch of 12
|
||||||
|
produces, nor the ~6.4 ink clearance that stacking leaves for plain content.
|
||||||
|
Realizing 2.0 would have crushed a relaxed system to a staff pitch of ~7.6.
|
||||||
|
`preferred` is now **5.0** (a staff height plus a space) and `min` **2.0** — plain
|
||||||
|
ledgered content settles near a pitch of 10.6, close to convention, while
|
||||||
|
ledgered or slurred content pushes the staves apart on its own. The user chose
|
||||||
|
this value; `4.0` ("one staff height") was rejected once its true consequence —
|
||||||
|
pitch 9.57, not the 11.04 an arithmetic slip of mine had projected — was measured
|
||||||
|
rather than inferred.
|
||||||
|
|
||||||
|
**The cascade was wrong, and had been since v11.** Making the solve two-sided
|
||||||
|
made `three_staff_close_content` report `vertical_density_penalty` **1.0**: its
|
||||||
|
lower pair realized 21.06 against a declared 4.0. The recurrence subtracted the
|
||||||
|
upper staff's shift from the measured gap and then added it back through the
|
||||||
|
accumulator:
|
||||||
|
|
||||||
|
```text
|
||||||
|
gap = (upper_lo - shift_upper) - lower_hi // WRONG
|
||||||
|
shift += target - gap // ⇒ realized = target + shift_upper
|
||||||
|
```
|
||||||
|
|
||||||
|
Both staves move, so the correct relation is
|
||||||
|
`shift_lower = shift_upper + target - (upper_lo - lower_hi)` — the **unshifted**
|
||||||
|
gap. Every pair below the first was over-separated by exactly the shift above it.
|
||||||
|
It was invisible on two-staff fixtures (`shift_upper = 0`) and invisible to
|
||||||
|
`inter_staff_shifts_cascade_down_three_staves`, which asserted only `s2 > s1` —
|
||||||
|
true under both the correct and the double-counting recurrence.
|
||||||
|
|
||||||
|
**What caught it was the metric.** Measuring the realized clearance back from the
|
||||||
|
BAKED output, rather than reading the solver's own `staff_ext`, is what made an
|
||||||
|
independent check possible; had the axis read back solver intent it would have
|
||||||
|
reported 0 and the defect would have shipped again. That design choice was made
|
||||||
|
one commit earlier for exactly this reason, and it paid immediately.
|
||||||
|
|
||||||
|
**Locking it.** Once the solve realizes each declared clearance exactly, every
|
||||||
|
inter-staff unit is `0` on a healthy solve — the axis becomes a *solver
|
||||||
|
self-check*, and its mean can no longer distinguish "measured every realization"
|
||||||
|
from "measured one". So `vertical_raw` is split into `vertical_units`, and the
|
||||||
|
regressions assert the **unit set**: `a_glyphless_staff_band_still_contributes_an_
|
||||||
|
inter_staff_unit` (2 units, one per system) and `each_system_realizing_a_gap_band_
|
||||||
|
contributes_its_own_unit` (2 units for the wrapping fixture, 2 for the three-staff
|
||||||
|
cascade), each unit ≈ 0. Four mutations verified: the double-counting recurrence,
|
||||||
|
expand-only, the glyph-`members` band filter, and first-system-only measurement
|
||||||
|
each fail a named test.
|
||||||
|
|
||||||
|
**Churn:** the two multi-staff engrave goldens only. `two_staff_close_content`
|
||||||
|
grew by exactly 3.0 (the target change, no cascade); `three_staff_close_content`
|
||||||
|
*shrank* by 9.06 — the same +3 per pair, less the 17.06 of over-separation the
|
||||||
|
cascade defect was adding. Single-staff and every stub golden are byte-stable.
|
||||||
|
|
||||||
|
**Still open:** genuinely staff-less content placed *between* two staves. No
|
||||||
|
primitive can name an `InterStaffGap` band today, so it remains unreachable
|
||||||
|
rather than latent.
|
||||||
|
|
|
||||||
|
|
@ -771,17 +771,25 @@ pub(crate) fn cast_off(
|
||||||
|
|
||||||
// Solve each system's inter-staff gaps: order the staves top-to-bottom by
|
// Solve each system's inter-staff gaps: order the staves top-to-bottom by
|
||||||
// their reference y (staff line, else content mid), keep that order fixed,
|
// their reference y (staff line, else content mid), keep that order fixed,
|
||||||
// and shift each staff down until its gap to the one above meets the gap
|
// and shift each staff so its INK CLEARANCE to the one above realizes the
|
||||||
// band's own preferred height. `staff_shift[(system, staff)]` is the
|
// gap band's declared height. `staff_shift[(system, staff)]` is the downward
|
||||||
// downward shift (subtracted from y); the top staff's is 0.
|
// shift (subtracted from y); the top staff's is 0.
|
||||||
//
|
//
|
||||||
// The gap the solve targets is the one the REGION DECLARED, read from the
|
// The renegotiation is TWO-SIDED. A pair whose content collides is pushed
|
||||||
// `InterStaffGap` band `to_constrained` emitted for that pair, not from the
|
// apart; a pair the constrained stage left slack is pulled together. The
|
||||||
// band constructor's default. That is what makes the band a height model
|
// fixed `SYSTEM_STAFF_PITCH` that stage stacks by is therefore an initial
|
||||||
// rather than a constant: a region that declares a wider gap gets one, and
|
// arrangement, not a floor: the band model is the height model, and the solve
|
||||||
// `vertical_density_penalty` — which scores the realized gap against this
|
// realizes it. (Expanding only was the earlier behaviour, and it was
|
||||||
// same declared band — agrees with the solve by construction rather than by
|
// measurably wrong — `vertical_density_penalty` scored honest sprawl on every
|
||||||
// both happening to call the same constructor.
|
// relaxed multi-staff system, because a gap wider than preferred is sprawl
|
||||||
|
// exactly as a narrower one is crowding.)
|
||||||
|
//
|
||||||
|
// The target is the gap band's `preferred_height`, held at or above its
|
||||||
|
// `min_height` — the hardest squeeze permitted. Validation already brackets
|
||||||
|
// preferred by min and max, so the clamp is belt-and-braces rather than a
|
||||||
|
// second policy. The band is the one the REGION DECLARED, not the
|
||||||
|
// constructor's default, so the solve and `vertical_density_penalty` — which
|
||||||
|
// scores the realized clearance against that same band — read one number.
|
||||||
//
|
//
|
||||||
// Gap `g` separates the region's staves `g-1` and `g` (see `to_constrained`).
|
// Gap `g` separates the region's staves `g-1` and `g` (see `to_constrained`).
|
||||||
// Every staff of a region carries content in every system of that region —
|
// Every staff of a region carries content in every system of that region —
|
||||||
|
|
@ -789,20 +797,18 @@ pub(crate) fn cast_off(
|
||||||
// staves present here are the region's full staff order and the window index
|
// staves present here are the region's full staff order and the window index
|
||||||
// is the gap index. A band that somehow does not exist falls back to the
|
// is the gap index. A band that somehow does not exist falls back to the
|
||||||
// constructor's default rather than silently skipping the pair.
|
// constructor's default rather than silently skipping the pair.
|
||||||
let default_gap = VerticalBand::inter_staff_gap(VerticalBandId(0))
|
let fallback = VerticalBand::inter_staff_gap(VerticalBandId(0));
|
||||||
.preferred_height
|
|
||||||
.0;
|
|
||||||
let mut staff_shift: BTreeMap<(usize, StaffId), f32> = BTreeMap::new();
|
let mut staff_shift: BTreeMap<(usize, StaffId), f32> = BTreeMap::new();
|
||||||
for (s, plan) in systems.iter().enumerate() {
|
for (s, plan) in systems.iter().enumerate() {
|
||||||
let region_layout_id = input.regions[plan.region].provenance.stable_id;
|
let region_layout_id = input.regions[plan.region].provenance.stable_id;
|
||||||
let preferred_gap = |gap_index: usize| -> f32 {
|
let target_gap = |gap_index: usize| -> f32 {
|
||||||
let id = inter_staff_gap_id(region_layout_id, gap_index);
|
let id = inter_staff_gap_id(region_layout_id, gap_index);
|
||||||
input
|
let band = input
|
||||||
.vertical_bands
|
.vertical_bands
|
||||||
.iter()
|
.iter()
|
||||||
.find(|band| band.id == id)
|
.find(|band| band.id == id)
|
||||||
.map(|band| band.preferred_height.0)
|
.unwrap_or(&fallback);
|
||||||
.unwrap_or(default_gap)
|
band.preferred_height.0.max(band.min_height.0)
|
||||||
};
|
};
|
||||||
let mut staves: Vec<(StaffId, (f32, f32))> = staff_ext
|
let mut staves: Vec<(StaffId, (f32, f32))> = staff_ext
|
||||||
.iter()
|
.iter()
|
||||||
|
|
@ -824,9 +830,21 @@ pub(crate) fn cast_off(
|
||||||
let (upper, (upper_lo, _)) = w[0];
|
let (upper, (upper_lo, _)) = w[0];
|
||||||
let (lower, (_, lower_hi)) = w[1];
|
let (lower, (_, lower_hi)) = w[1];
|
||||||
staff_shift.insert((s, upper), shift);
|
staff_shift.insert((s, upper), shift);
|
||||||
// Realized gap after the upper's shift: (upper_lo - shift) − lower_hi.
|
// Both staves move, so solve the recurrence rather than guessing it.
|
||||||
let gap = (upper_lo - shift) - lower_hi;
|
// With `shift` the upper staff's cumulative shift, the realized
|
||||||
shift += (preferred_gap(g + 1) - gap).max(0.0);
|
// clearance is `(upper_lo - shift_upper) - (lower_hi - shift_lower)`,
|
||||||
|
// and setting that equal to the target gives
|
||||||
|
//
|
||||||
|
// shift_lower = shift_upper + target - (upper_lo - lower_hi)
|
||||||
|
//
|
||||||
|
// — the UNSHIFTED gap. Subtracting `shift_upper` from the gap here
|
||||||
|
// and adding it back through `shift +=` would count it twice, which
|
||||||
|
// over-separated every pair below the first by exactly the shift
|
||||||
|
// above it (invisible on two staves, where that shift is 0). The
|
||||||
|
// correction is signed: positive opens a crowded pair, negative
|
||||||
|
// closes a slack one, and it accumulates down the stack.
|
||||||
|
let gap = upper_lo - lower_hi;
|
||||||
|
shift += target_gap(g + 1) - gap;
|
||||||
staff_shift.insert((s, lower), shift);
|
staff_shift.insert((s, lower), shift);
|
||||||
}
|
}
|
||||||
if staves.len() == 1 {
|
if staves.len() == 1 {
|
||||||
|
|
|
||||||
|
|
@ -204,8 +204,16 @@ pub struct Engraver {
|
||||||
/// gaps between a system's staves are renegotiated so tightly ledgered or
|
/// gaps between a system's staves are renegotiated so tightly ledgered or
|
||||||
/// slurred adjacent staves separate to the band model's preferred gap; a
|
/// slurred adjacent staves separate to the band model's preferred gap; a
|
||||||
/// multi-staff score whose staves press together shifts them apart, while a
|
/// multi-staff score whose staves press together shifts them apart, while a
|
||||||
/// single-staff score — with no inter-staff pair — is unchanged).
|
/// single-staff score — with no inter-staff pair — is unchanged), and to `12`
|
||||||
pub const ENGRAVER_VERSION: SolverVersion = SolverVersion(11);
|
/// when that solve became **two-sided** (it now closes a slack pair as well as
|
||||||
|
/// opening a crowded one, realizing the `InterStaffGap` band's declared ink
|
||||||
|
/// clearance exactly; the constrained stage's fixed `SYSTEM_STAFF_PITCH` is an
|
||||||
|
/// initial arrangement, not a floor. Every multi-staff score's staff distances
|
||||||
|
/// move — plain content settles near a pitch of 10.6 staff spaces — while a
|
||||||
|
/// single-staff score is again unchanged. The same version repairs a cascade
|
||||||
|
/// defect: a pair below the first was over-separated by exactly the shift above
|
||||||
|
/// it, so 3+-staff scores tighten further).
|
||||||
|
pub const ENGRAVER_VERSION: SolverVersion = SolverVersion(12);
|
||||||
|
|
||||||
impl Engraver {
|
impl Engraver {
|
||||||
/// An engraver casting off against the given page geometry.
|
/// An engraver casting off against the given page geometry.
|
||||||
|
|
@ -2333,39 +2341,67 @@ mod tests {
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// A staff band that owns no GLYPHS is still a staff of its region. The
|
/// A staff band that owns no GLYPHS is still a staff of its region: the
|
||||||
/// percussion placeholder's clef has no bundled glyph (it engraves to a
|
/// percussion placeholder's clef has no bundled glyph (a traced anchor
|
||||||
/// traced anchor stroke) and it carries no notes, so its band's `members`
|
/// stroke) and it carries no notes, so its band's glyph `members` list is
|
||||||
/// list — which holds glyphs only — is empty, while the band does own its
|
/// empty while the band owns its five staff-line strokes. The solve must
|
||||||
/// five staff-line strokes. Identifying a region's staff bands by their
|
/// still separate it. (That the *metric* also counts its gap is locked by
|
||||||
/// glyph members would drop it from the axis entirely, reintroducing the
|
/// `quality::tests::a_glyphless_staff_band_still_contributes_an_inter_staff_unit`.)
|
||||||
/// very glyph-members assumption the content-extent measurement sheds.
|
|
||||||
#[test]
|
#[test]
|
||||||
fn a_staff_band_owning_no_glyphs_still_contributes_its_gap() {
|
fn a_staff_band_owning_no_glyphs_is_still_laid_out_as_a_staff() {
|
||||||
use epiphany_layout_ir::{to_constrained, to_logical};
|
use epiphany_layout_ir::{to_constrained, to_logical};
|
||||||
let input = to_constrained(&to_logical(
|
let report = Engraver::default().solve(
|
||||||
&epiphany_testkit::fixtures::percussion_placeholder_staff(1),
|
&to_constrained(&to_logical(
|
||||||
));
|
&epiphany_testkit::fixtures::percussion_placeholder_staff(1),
|
||||||
let report = Engraver::default().solve(&input, &SolverConfig::default());
|
)),
|
||||||
|
&SolverConfig::default(),
|
||||||
|
);
|
||||||
assert_eq!(report.status, SolveStatus::Solved);
|
assert_eq!(report.status, SolveStatus::Solved);
|
||||||
for page in &report.layout.pages {
|
for page in &report.layout.pages {
|
||||||
for sys in &page.systems {
|
for sys in &page.systems {
|
||||||
assert_eq!(
|
assert_eq!(sys.staves.len(), 2, "the placeholder is a staff");
|
||||||
sys.staves.len(),
|
|
||||||
2,
|
|
||||||
"the glyph-less placeholder is still laid out as a staff"
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// Its gap to the melody staff is slack (the solve expands, never
|
assert_eq!(report.metric_vector.collision_penalty.0, 0.0);
|
||||||
// compresses), so the band contributes a large deviation. Dropping the
|
}
|
||||||
// band would leave the region with one staff, no inter-staff unit, and
|
|
||||||
// an axis of exactly 0.
|
/// The solve sizes each system's gaps from that system's own content, so one
|
||||||
let density = report.metric_vector.vertical_density_penalty.0;
|
/// region's systems end up at genuinely different staff distances: the system
|
||||||
assert!(
|
/// carrying the colliding first measure opens wide, the slack one after it is
|
||||||
density > 0.5,
|
/// pulled CLOSER than the constrained stage's fixed pitch. Two-sided
|
||||||
"the glyph-less band's gap reaches the axis: {density}"
|
/// renegotiation is what makes the second half of that sentence true.
|
||||||
|
#[test]
|
||||||
|
fn each_system_solves_its_own_staff_distance() {
|
||||||
|
use epiphany_layout_ir::{to_constrained, to_logical};
|
||||||
|
let report = Engraver::default().solve(
|
||||||
|
&to_constrained(&to_logical(
|
||||||
|
&epiphany_testkit::fixtures::two_staff_wrapping_pressure(1),
|
||||||
|
)),
|
||||||
|
&SolverConfig::default(),
|
||||||
);
|
);
|
||||||
|
let systems: Vec<_> = report
|
||||||
|
.layout
|
||||||
|
.pages
|
||||||
|
.iter()
|
||||||
|
.flat_map(|page| &page.systems)
|
||||||
|
.collect();
|
||||||
|
assert_eq!(systems.len(), 2, "the region wraps into two systems");
|
||||||
|
let pitch = |sys: &epiphany_layout_ir::ResolvedSystem| {
|
||||||
|
assert_eq!(sys.staves.len(), 2, "both staves ride every system");
|
||||||
|
sys.staves[0].bounding_box.origin.y.0 - sys.staves[1].bounding_box.origin.y.0
|
||||||
|
};
|
||||||
|
let (first, second) = (pitch(systems[0]), pitch(systems[1]));
|
||||||
|
assert!(
|
||||||
|
first > second + 8.0,
|
||||||
|
"the pressured system opens far wider: {first} vs {second}"
|
||||||
|
);
|
||||||
|
// The constrained stage stacks at SYSTEM_STAFF_PITCH = 12; the slack
|
||||||
|
// system is COMPRESSED below it, which an expand-only solve cannot do.
|
||||||
|
assert!(
|
||||||
|
second < 12.0,
|
||||||
|
"the slack system is pulled tighter than the fixed pitch: {second}"
|
||||||
|
);
|
||||||
|
assert_eq!(report.metric_vector.collision_penalty.0, 0.0);
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
|
|
@ -2436,17 +2472,25 @@ mod tests {
|
||||||
|
|
||||||
/// Three staves in one system, with deliberately ASYMMETRIC pressure: the
|
/// Three staves in one system, with deliberately ASYMMETRIC pressure: the
|
||||||
/// upper pair collides hard (C1 against C7), the lower pair only gently. A
|
/// upper pair collides hard (C1 against C7), the lower pair only gently. A
|
||||||
/// staff's shift must accumulate the corrections of every pair above it,
|
/// staff's shift accumulates the corrections of every pair above it — the
|
||||||
/// because each pair's gap is measured against the upper staff's *already
|
/// bottom staff must clear the middle staff where the middle staff now sits,
|
||||||
/// shifted* position. So the bottom staff's shift is large — it must clear
|
/// not where it started — so `shift_lower = shift_upper + target - gap_raw`,
|
||||||
/// the middle staff where the middle staff now sits, not where it started.
|
/// with `gap_raw` the pair's UNSHIFTED clearance.
|
||||||
///
|
///
|
||||||
/// That is exactly what a solve sizing each pair independently gets wrong:
|
/// A solve sizing each pair independently gets this wrong the obvious way:
|
||||||
/// it would measure the lower pair against the middle staff's ORIGINAL
|
/// it hands the bottom staff only its own small correction and leaves it
|
||||||
/// position, hand the bottom staff only its own small correction, and leave
|
/// above the middle staff's new position. Verified by mutation: with the
|
||||||
/// it above the middle staff's new position — closing their staff-line gap
|
/// cascade removed this test fails on `s2 > s1`.
|
||||||
/// to well under the fixed pitch. Verified by mutation: with the cascade
|
///
|
||||||
/// removed this test fails on both `s2 > s1` and the staff-line gap.
|
/// It is wrong the *subtle* way too, by subtracting `shift_upper` from the
|
||||||
|
/// measured gap and then adding it back through the accumulator — which
|
||||||
|
/// over-separates every pair below the first by exactly the shift above it.
|
||||||
|
/// That defect shipped in `ENGRAVER_VERSION` 11 and this test could not see
|
||||||
|
/// it (`s2 > s1` holds either way; two-staff fixtures have `shift_upper = 0`).
|
||||||
|
/// It is caught by `quality::tests::each_system_realizing_a_gap_band_
|
||||||
|
/// contributes_its_own_unit`, which asserts every pair realizes its declared
|
||||||
|
/// clearance — the over-separated lower pair reported 21.06 against a
|
||||||
|
/// declared 4.0.
|
||||||
#[test]
|
#[test]
|
||||||
fn inter_staff_shifts_cascade_down_three_staves() {
|
fn inter_staff_shifts_cascade_down_three_staves() {
|
||||||
use epiphany_layout_ir::{to_constrained, to_logical};
|
use epiphany_layout_ir::{to_constrained, to_logical};
|
||||||
|
|
@ -2519,54 +2563,6 @@ mod tests {
|
||||||
assert!(gaps[2] < 2.0, "and sits close against it: {}", gaps[2]);
|
assert!(gaps[2] < 2.0, "and sits close against it: {}", gaps[2]);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// A gap band realized in several systems contributes a unit PER SYSTEM.
|
|
||||||
/// The inter-staff solve sizes each system's gaps from that system's own
|
|
||||||
/// content, so one band's realized height genuinely differs across a
|
|
||||||
/// region's systems — here 15.93 staff spaces in the system carrying the
|
|
||||||
/// colliding first measure, 7.87 in the slack one after it. Measuring only
|
|
||||||
/// the first system realizing the band (as this metric once did, on the
|
|
||||||
/// since-falsified premise that rigid system translation makes every
|
|
||||||
/// realization agree) would report the pressured system's near-perfect gap
|
|
||||||
/// and discard the slack one entirely.
|
|
||||||
#[test]
|
|
||||||
fn inter_staff_gaps_are_measured_in_every_system_that_realizes_them() {
|
|
||||||
use epiphany_layout_ir::{to_constrained, to_logical};
|
|
||||||
let report = Engraver::default().solve(
|
|
||||||
&to_constrained(&to_logical(
|
|
||||||
&epiphany_testkit::fixtures::two_staff_wrapping_pressure(1),
|
|
||||||
)),
|
|
||||||
&SolverConfig::default(),
|
|
||||||
);
|
|
||||||
let systems: Vec<_> = report
|
|
||||||
.layout
|
|
||||||
.pages
|
|
||||||
.iter()
|
|
||||||
.flat_map(|page| &page.systems)
|
|
||||||
.collect();
|
|
||||||
assert_eq!(systems.len(), 2, "the region wraps into two systems");
|
|
||||||
let gap = |sys: &epiphany_layout_ir::ResolvedSystem| {
|
|
||||||
assert_eq!(sys.staves.len(), 2, "both staves ride every system");
|
|
||||||
let (top, bottom) = (&sys.staves[0].bounding_box, &sys.staves[1].bounding_box);
|
|
||||||
top.origin.y.0 - (bottom.origin.y.0 + bottom.size.height.0)
|
|
||||||
};
|
|
||||||
let (first, second) = (gap(systems[0]), gap(systems[1]));
|
|
||||||
assert!(
|
|
||||||
first > second + 4.0,
|
|
||||||
"the pressured system opens much further than the slack one: {first} vs {second}"
|
|
||||||
);
|
|
||||||
|
|
||||||
// The slack system's gap sits well past the band's preferred height (the
|
|
||||||
// solve expands but never compresses), so it contributes a large
|
|
||||||
// deviation. The pressured system was solved to preferred and contributes
|
|
||||||
// ~0. A first-system-only measurement would therefore report ~0 overall;
|
|
||||||
// counting both realizations reports the sprawl honestly.
|
|
||||||
let density = report.metric_vector.vertical_density_penalty.0;
|
|
||||||
assert!(
|
|
||||||
density > 0.5,
|
|
||||||
"the slack system's sprawl reaches the axis: {density}"
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn vertical_justification_fills_non_final_pages() {
|
fn vertical_justification_fills_non_final_pages() {
|
||||||
use epiphany_layout_ir::{Margins, Size2D, StaffSpace};
|
use epiphany_layout_ir::{Margins, Size2D, StaffSpace};
|
||||||
|
|
|
||||||
|
|
@ -329,6 +329,29 @@ fn spacing_raw(census: &SystemCensus) -> f64 {
|
||||||
/// relative deviation `|r − p| / p` over the realized inter-staff and
|
/// relative deviation `|r − p| / p` over the realized inter-staff and
|
||||||
/// inter-system gaps (see the module docs for the unit reconstruction).
|
/// inter-system gaps (see the module docs for the unit reconstruction).
|
||||||
fn vertical_raw(input: &ConstrainedLayoutIR, cast: &CastLayout, census: &SystemCensus) -> f64 {
|
fn vertical_raw(input: &ConstrainedLayoutIR, cast: &CastLayout, census: &SystemCensus) -> f64 {
|
||||||
|
let units = vertical_units(input, cast, census);
|
||||||
|
mean_or_zero(&[units.inter_staff, units.inter_system].concat())
|
||||||
|
}
|
||||||
|
|
||||||
|
/// The axis's contributing units, split by kind (catalog §`vertical_density_penalty`:
|
||||||
|
/// "each *realization* … contributes one unit per system").
|
||||||
|
///
|
||||||
|
/// Split out so tests can assert the unit **set**, not merely its mean. Once the
|
||||||
|
/// inter-staff solve realizes each gap band's declared clearance exactly, every
|
||||||
|
/// inter-staff unit is `0` on a healthy solve — the axis is a self-check that
|
||||||
|
/// fires only on a solver or bake defect. Its mean therefore cannot distinguish
|
||||||
|
/// "measured every realization" from "measured one", which is precisely the
|
||||||
|
/// defect this split lets a regression catch.
|
||||||
|
struct VerticalUnits {
|
||||||
|
inter_staff: Vec<f64>,
|
||||||
|
inter_system: Vec<f64>,
|
||||||
|
}
|
||||||
|
|
||||||
|
fn vertical_units(
|
||||||
|
input: &ConstrainedLayoutIR,
|
||||||
|
cast: &CastLayout,
|
||||||
|
census: &SystemCensus,
|
||||||
|
) -> VerticalUnits {
|
||||||
let mut per_unit: Vec<f64> = Vec::new();
|
let mut per_unit: Vec<f64> = Vec::new();
|
||||||
|
|
||||||
// --- InterStaffGap bands declared by the constrained input -------------
|
// --- InterStaffGap bands declared by the constrained input -------------
|
||||||
|
|
@ -455,6 +478,8 @@ fn vertical_raw(input: &ConstrainedLayoutIR, cast: &CastLayout, census: &SystemC
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
let inter_staff = std::mem::take(&mut per_unit);
|
||||||
|
|
||||||
// --- Realized inter-system gaps (consecutive systems on a page) --------
|
// --- Realized inter-system gaps (consecutive systems on a page) --------
|
||||||
let preferred = f64::from(
|
let preferred = f64::from(
|
||||||
VerticalBand::inter_system_gap(VerticalBandId(0))
|
VerticalBand::inter_system_gap(VerticalBandId(0))
|
||||||
|
|
@ -473,7 +498,10 @@ fn vertical_raw(input: &ConstrainedLayoutIR, cast: &CastLayout, census: &SystemC
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
mean_or_zero(&per_unit)
|
VerticalUnits {
|
||||||
|
inter_staff,
|
||||||
|
inter_system: per_unit,
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// `system_break_penalty` (catalog §`system_break_penalty`): mean
|
/// `system_break_penalty` (catalog §`system_break_penalty`): mean
|
||||||
|
|
@ -644,6 +672,7 @@ pub(crate) fn floor_warnings(
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod tests {
|
mod tests {
|
||||||
|
use super::{census, vertical_units, VerticalUnits};
|
||||||
use crate::Engraver;
|
use crate::Engraver;
|
||||||
use epiphany_layout_ir::{
|
use epiphany_layout_ir::{
|
||||||
to_constrained, to_logical, ConstrainedLayoutIR, ConstraintSolver, QualityMetricKind,
|
to_constrained, to_logical, ConstrainedLayoutIR, ConstraintSolver, QualityMetricKind,
|
||||||
|
|
@ -982,4 +1011,61 @@ mod tests {
|
||||||
report.metric_vector.vertical_density_penalty.0
|
report.metric_vector.vertical_density_penalty.0
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Runs the real pipeline far enough to hand `vertical_units` a `CastLayout`
|
||||||
|
/// — the same spacing + casting-off `Engraver::resolve` performs.
|
||||||
|
fn units(score: &epiphany_core::Score) -> VerticalUnits {
|
||||||
|
let input = to_constrained(&to_logical(score));
|
||||||
|
let engraver = Engraver::default();
|
||||||
|
let remap = crate::HorizontalRemap::build(&input);
|
||||||
|
let (glyphs, strokes, curves) = (
|
||||||
|
remap.glyphs(&input),
|
||||||
|
remap.strokes(&input),
|
||||||
|
remap.curves(&input),
|
||||||
|
);
|
||||||
|
let geometry = engraver.geometry();
|
||||||
|
let cast = crate::casting::cast_off(&input, &glyphs, &strokes, &curves, &geometry);
|
||||||
|
let census = census(&input, &cast);
|
||||||
|
vertical_units(&input, &cast, &census)
|
||||||
|
}
|
||||||
|
|
||||||
|
/// A staff band owning no glyphs is still a staff of its region, so its gap
|
||||||
|
/// contributes. The percussion placeholder's clef has no bundled glyph and it
|
||||||
|
/// carries no notes, leaving its band's `members` (a glyph list) empty while
|
||||||
|
/// the band owns its staff-line strokes. Identifying a region's staff bands by
|
||||||
|
/// `members` drops it, and the axis loses the unit entirely.
|
||||||
|
#[test]
|
||||||
|
fn a_glyphless_staff_band_still_contributes_an_inter_staff_unit() {
|
||||||
|
let u = units(&epiphany_testkit::fixtures::percussion_placeholder_staff(1));
|
||||||
|
assert_eq!(
|
||||||
|
u.inter_staff.len(),
|
||||||
|
2,
|
||||||
|
"one unit per system realizing the pair, not zero"
|
||||||
|
);
|
||||||
|
for value in &u.inter_staff {
|
||||||
|
assert!(
|
||||||
|
*value < 1e-4,
|
||||||
|
"and the solve realizes the declared gap: {value}"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// A gap band realized in several systems contributes one unit PER SYSTEM.
|
||||||
|
/// The inter-staff solve sizes each system's gaps from that system's own
|
||||||
|
/// content, so the realizations are independent measurements; the wrapping
|
||||||
|
/// fixture's two systems sit at very different staff distances.
|
||||||
|
#[test]
|
||||||
|
fn each_system_realizing_a_gap_band_contributes_its_own_unit() {
|
||||||
|
let u = units(&epiphany_testkit::fixtures::two_staff_wrapping_pressure(1));
|
||||||
|
assert_eq!(u.inter_staff.len(), 2, "two systems, two realizations");
|
||||||
|
for value in &u.inter_staff {
|
||||||
|
assert!(*value < 1e-4, "each solved to its declared gap: {value}");
|
||||||
|
}
|
||||||
|
// Three staves in one system: two gap bands, one realization each.
|
||||||
|
let u = units(&epiphany_testkit::fixtures::three_staff_close_content(1));
|
||||||
|
assert_eq!(u.inter_staff.len(), 2, "two gap bands, one system");
|
||||||
|
for value in &u.inter_staff {
|
||||||
|
assert!(*value < 1e-4, "the cascade realizes both gaps: {value}");
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -112,12 +112,32 @@ impl VerticalBand {
|
||||||
/// An inter-staff gap band: the empty (member-less) spacing region between
|
/// An inter-staff gap band: the empty (member-less) spacing region between
|
||||||
/// two staves of a system (Chapter 7 §"Vertical Bands": `InterStaffGap`). Its
|
/// two staves of a system (Chapter 7 §"Vertical Bands": `InterStaffGap`). Its
|
||||||
/// height is a spring the solver resolves; it carries no glyphs.
|
/// height is a spring the solver resolves; it carries no glyphs.
|
||||||
|
///
|
||||||
|
/// **Its height is an INK CLEARANCE**, not a distance between staff lines:
|
||||||
|
/// the vertical separation between the two staves' outermost *content* —
|
||||||
|
/// ledger lines, stems, slurs, everything. That is the unit the Quality
|
||||||
|
/// Metric Catalog's `vertical_density_penalty` measures against
|
||||||
|
/// (`req:qmc:vertical`, "the adjacent content extents the band separates"),
|
||||||
|
/// so the solve and the metric read one number.
|
||||||
|
///
|
||||||
|
/// `preferred` is a staff height plus a space: two staves whose ink is that
|
||||||
|
/// far apart read as separate systems of lines without wasting the page.
|
||||||
|
/// Plain ledgered content then lands at a staff *pitch* of about 10.6 staff
|
||||||
|
/// spaces — near conventional two-staff spacing — while ledgered or slurred
|
||||||
|
/// content pushes the staves further apart on its own. `min` is the hardest
|
||||||
|
/// squeeze a compressing solve may apply.
|
||||||
|
///
|
||||||
|
/// (The earlier `preferred = 2.0` was a placeholder reconciled with nothing:
|
||||||
|
/// it is neither the 8.0 staff-box gap the constrained stage's fixed
|
||||||
|
/// `SYSTEM_STAFF_PITCH` produces, nor the ~6.4 ink clearance that stacking
|
||||||
|
/// leaves for plain content. Realizing it would have crushed a relaxed
|
||||||
|
/// system to a pitch of ~7.6.)
|
||||||
pub fn inter_staff_gap(id: VerticalBandId) -> Self {
|
pub fn inter_staff_gap(id: VerticalBandId) -> Self {
|
||||||
VerticalBand {
|
VerticalBand {
|
||||||
id,
|
id,
|
||||||
kind: VerticalBandKind::InterStaffGap,
|
kind: VerticalBandKind::InterStaffGap,
|
||||||
min_height: StaffSpace(1.0),
|
min_height: StaffSpace(2.0),
|
||||||
preferred_height: StaffSpace(2.0),
|
preferred_height: StaffSpace(5.0),
|
||||||
max_height: None,
|
max_height: None,
|
||||||
stretch_factor: 1.0,
|
stretch_factor: 1.0,
|
||||||
compress_factor: 1.0,
|
compress_factor: 1.0,
|
||||||
|
|
|
||||||
|
|
@ -8,7 +8,7 @@ provenance_count=96
|
||||||
layer_count=1
|
layer_count=1
|
||||||
hard_constraint_count=27
|
hard_constraint_count=27
|
||||||
xml_well_formed=true
|
xml_well_formed=true
|
||||||
view_box=[5.5 -75.204575 17.379084 69.703995]
|
view_box=[5.5 -66.14458 17.379084 60.643997]
|
||||||
class_counts:
|
class_counts:
|
||||||
barline=3
|
barline=3
|
||||||
clef=3
|
clef=3
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<svg xmlns="http://www.w3.org/2000/svg" width="173.7908" height="697.0399" viewBox="0 0 17.3791 69.704">
|
<svg xmlns="http://www.w3.org/2000/svg" width="173.7908" height="606.4399" viewBox="0 0 17.3791 60.644">
|
||||||
<!-- epiphany-render-svg: glyphs are genuine Bravura SMuFL outlines inlined as paths; geometry is the resolved layout verbatim, no engraving performed here; every glyph, stroke, and curve carries a data-prov trace to its score-graph source -->
|
<!-- epiphany-render-svg: glyphs are genuine Bravura SMuFL outlines inlined as paths; geometry is the resolved layout verbatim, no engraving performed here; every glyph, stroke, and curve carries a data-prov trace to its score-graph source -->
|
||||||
<g transform="translate(-5.5 -5.5006) scale(1 -1)">
|
<g transform="translate(-5.5 -5.5006) scale(1 -1)">
|
||||||
<g data-layer="0">
|
<g data-layer="0">
|
||||||
|
|
@ -9,16 +9,16 @@
|
||||||
<line x1="7.565" y1="-10.8926" x2="20.2543" y2="-10.8926" stroke="#000000" stroke-width="0.13" data-prov="2298edab2b482b968611b1dfd4c4184a" data-source-kind="3" data-kind="stroke"/>
|
<line x1="7.565" y1="-10.8926" x2="20.2543" y2="-10.8926" stroke="#000000" stroke-width="0.13" data-prov="2298edab2b482b968611b1dfd4c4184a" data-source-kind="3" data-kind="stroke"/>
|
||||||
<line x1="7.565" y1="-9.8926" x2="20.2543" y2="-9.8926" stroke="#000000" stroke-width="0.13" data-prov="4688e9bd99908438eb2cfa44aa9b69f7" data-source-kind="3" data-kind="stroke"/>
|
<line x1="7.565" y1="-9.8926" x2="20.2543" y2="-9.8926" stroke="#000000" stroke-width="0.13" data-prov="4688e9bd99908438eb2cfa44aa9b69f7" data-source-kind="3" data-kind="stroke"/>
|
||||||
<line x1="7.565" y1="-8.8926" x2="20.2543" y2="-8.8926" stroke="#000000" stroke-width="0.13" data-prov="9129d5d4f57c3cc9a6f2761bc4da188d" data-source-kind="3" data-kind="stroke"/>
|
<line x1="7.565" y1="-8.8926" x2="20.2543" y2="-8.8926" stroke="#000000" stroke-width="0.13" data-prov="9129d5d4f57c3cc9a6f2761bc4da188d" data-source-kind="3" data-kind="stroke"/>
|
||||||
<line x1="7.565" y1="-39.9526" x2="20.2543" y2="-39.9526" stroke="#000000" stroke-width="0.13" data-prov="f6aa19fc306fddc0ee6ffe5815adea15" data-source-kind="3" data-kind="stroke"/>
|
<line x1="7.565" y1="-42.9526" x2="20.2543" y2="-42.9526" stroke="#000000" stroke-width="0.13" data-prov="f6aa19fc306fddc0ee6ffe5815adea15" data-source-kind="3" data-kind="stroke"/>
|
||||||
<line x1="7.565" y1="-38.9526" x2="20.2543" y2="-38.9526" stroke="#000000" stroke-width="0.13" data-prov="cf7f37a324c02c59d88ed58b2d6eff09" data-source-kind="3" data-kind="stroke"/>
|
<line x1="7.565" y1="-41.9526" x2="20.2543" y2="-41.9526" stroke="#000000" stroke-width="0.13" data-prov="cf7f37a324c02c59d88ed58b2d6eff09" data-source-kind="3" data-kind="stroke"/>
|
||||||
<line x1="7.565" y1="-37.9526" x2="20.2543" y2="-37.9526" stroke="#000000" stroke-width="0.13" data-prov="eed90e04088a49096ff2df61528076f3" data-source-kind="3" data-kind="stroke"/>
|
<line x1="7.565" y1="-40.9526" x2="20.2543" y2="-40.9526" stroke="#000000" stroke-width="0.13" data-prov="eed90e04088a49096ff2df61528076f3" data-source-kind="3" data-kind="stroke"/>
|
||||||
<line x1="7.565" y1="-36.9526" x2="20.2543" y2="-36.9526" stroke="#000000" stroke-width="0.13" data-prov="eeba57d92a18b4e508a773d735498540" data-source-kind="3" data-kind="stroke"/>
|
<line x1="7.565" y1="-39.9526" x2="20.2543" y2="-39.9526" stroke="#000000" stroke-width="0.13" data-prov="eeba57d92a18b4e508a773d735498540" data-source-kind="3" data-kind="stroke"/>
|
||||||
<line x1="7.565" y1="-35.9526" x2="20.2543" y2="-35.9526" stroke="#000000" stroke-width="0.13" data-prov="7961fdc38d6911be6ccafdd0d4b0e650" data-source-kind="3" data-kind="stroke"/>
|
<line x1="7.565" y1="-38.9526" x2="20.2543" y2="-38.9526" stroke="#000000" stroke-width="0.13" data-prov="7961fdc38d6911be6ccafdd0d4b0e650" data-source-kind="3" data-kind="stroke"/>
|
||||||
<line x1="7.565" y1="-71.5726" x2="20.2543" y2="-71.5726" stroke="#000000" stroke-width="0.13" data-prov="48e35b5f0c754fb61417abb3162cd139" data-source-kind="3" data-kind="stroke"/>
|
<line x1="7.565" y1="-62.5126" x2="20.2543" y2="-62.5126" stroke="#000000" stroke-width="0.13" data-prov="48e35b5f0c754fb61417abb3162cd139" data-source-kind="3" data-kind="stroke"/>
|
||||||
<line x1="7.565" y1="-70.5726" x2="20.2543" y2="-70.5726" stroke="#000000" stroke-width="0.13" data-prov="d1649442bdf17a90fad13e068be1d468" data-source-kind="3" data-kind="stroke"/>
|
<line x1="7.565" y1="-61.5126" x2="20.2543" y2="-61.5126" stroke="#000000" stroke-width="0.13" data-prov="d1649442bdf17a90fad13e068be1d468" data-source-kind="3" data-kind="stroke"/>
|
||||||
<line x1="7.565" y1="-69.5726" x2="20.2543" y2="-69.5726" stroke="#000000" stroke-width="0.13" data-prov="a63a879181f96b3d9282817ce4854fa8" data-source-kind="3" data-kind="stroke"/>
|
<line x1="7.565" y1="-60.5126" x2="20.2543" y2="-60.5126" stroke="#000000" stroke-width="0.13" data-prov="a63a879181f96b3d9282817ce4854fa8" data-source-kind="3" data-kind="stroke"/>
|
||||||
<line x1="7.565" y1="-68.5726" x2="20.2543" y2="-68.5726" stroke="#000000" stroke-width="0.13" data-prov="407ae799175a7a5107f9b17fae444ea1" data-source-kind="3" data-kind="stroke"/>
|
<line x1="7.565" y1="-59.5126" x2="20.2543" y2="-59.5126" stroke="#000000" stroke-width="0.13" data-prov="407ae799175a7a5107f9b17fae444ea1" data-source-kind="3" data-kind="stroke"/>
|
||||||
<line x1="7.565" y1="-67.5726" x2="20.2543" y2="-67.5726" stroke="#000000" stroke-width="0.13" data-prov="213d70c1d0c044450c85f49532775c9e" data-source-kind="3" data-kind="stroke"/>
|
<line x1="7.565" y1="-58.5126" x2="20.2543" y2="-58.5126" stroke="#000000" stroke-width="0.13" data-prov="213d70c1d0c044450c85f49532775c9e" data-source-kind="3" data-kind="stroke"/>
|
||||||
<line x1="8.6599" y1="-12.8926" x2="8.6599" y2="-12.8926" stroke="#000000" stroke-width="0" data-prov="ce07aadf437a74ccac9fc50e9d4d21a6" data-source-kind="2" data-kind="stroke"/>
|
<line x1="8.6599" y1="-12.8926" x2="8.6599" y2="-12.8926" stroke="#000000" stroke-width="0" data-prov="ce07aadf437a74ccac9fc50e9d4d21a6" data-source-kind="2" data-kind="stroke"/>
|
||||||
<line x1="13.0944" y1="-13.8926" x2="13.0944" y2="-10.3926" stroke="#000000" stroke-width="0.12" data-prov="1c2dad5590859e5faf984977c99a71b5" data-source-kind="0" data-kind="stroke"/>
|
<line x1="13.0944" y1="-13.8926" x2="13.0944" y2="-10.3926" stroke="#000000" stroke-width="0.12" data-prov="1c2dad5590859e5faf984977c99a71b5" data-source-kind="0" data-kind="stroke"/>
|
||||||
<line x1="11.6444" y1="-13.8926" x2="13.4251" y2="-13.8926" stroke="#000000" stroke-width="0.13" data-prov="411616f3ac077092b76181619405cb3c" data-source-kind="1" data-kind="stroke"/>
|
<line x1="11.6444" y1="-13.8926" x2="13.4251" y2="-13.8926" stroke="#000000" stroke-width="0.13" data-prov="411616f3ac077092b76181619405cb3c" data-source-kind="1" data-kind="stroke"/>
|
||||||
|
|
@ -48,57 +48,57 @@
|
||||||
<line x1="17.8864" y1="-21.8926" x2="19.6671" y2="-21.8926" stroke="#000000" stroke-width="0.13" data-prov="77ec8ac817b9921221350030998f20cf" data-source-kind="1" data-kind="stroke"/>
|
<line x1="17.8864" y1="-21.8926" x2="19.6671" y2="-21.8926" stroke="#000000" stroke-width="0.13" data-prov="77ec8ac817b9921221350030998f20cf" data-source-kind="1" data-kind="stroke"/>
|
||||||
<line x1="17.8864" y1="-22.8926" x2="19.6671" y2="-22.8926" stroke="#000000" stroke-width="0.13" data-prov="5315bb47b55a85a9f4bf997263674f8b" data-source-kind="1" data-kind="stroke"/>
|
<line x1="17.8864" y1="-22.8926" x2="19.6671" y2="-22.8926" stroke="#000000" stroke-width="0.13" data-prov="5315bb47b55a85a9f4bf997263674f8b" data-source-kind="1" data-kind="stroke"/>
|
||||||
<line x1="17.8864" y1="-23.8926" x2="19.6671" y2="-23.8926" stroke="#000000" stroke-width="0.13" data-prov="89ad40af92c1fba61fa859789484f042" data-source-kind="1" data-kind="stroke"/>
|
<line x1="17.8864" y1="-23.8926" x2="19.6671" y2="-23.8926" stroke="#000000" stroke-width="0.13" data-prov="89ad40af92c1fba61fa859789484f042" data-source-kind="1" data-kind="stroke"/>
|
||||||
<line x1="8.6599" y1="-39.9526" x2="8.6599" y2="-39.9526" stroke="#000000" stroke-width="0" data-prov="54fe6da1801e4fce8316c678f29cacdf" data-source-kind="2" data-kind="stroke"/>
|
<line x1="8.6599" y1="-42.9526" x2="8.6599" y2="-42.9526" stroke="#000000" stroke-width="0" data-prov="54fe6da1801e4fce8316c678f29cacdf" data-source-kind="2" data-kind="stroke"/>
|
||||||
<line x1="13.0944" y1="-30.4526" x2="13.0944" y2="-26.9526" stroke="#000000" stroke-width="0.12" data-prov="952f3712f8f29866ac797bbea256d2d0" data-source-kind="0" data-kind="stroke"/>
|
<line x1="13.0944" y1="-33.4526" x2="13.0944" y2="-29.9526" stroke="#000000" stroke-width="0.12" data-prov="952f3712f8f29866ac797bbea256d2d0" data-source-kind="0" data-kind="stroke"/>
|
||||||
<line x1="11.6444" y1="-34.9526" x2="13.4251" y2="-34.9526" stroke="#000000" stroke-width="0.13" data-prov="837d109efb37f74957a713aba3123810" data-source-kind="1" data-kind="stroke"/>
|
<line x1="11.6444" y1="-37.9526" x2="13.4251" y2="-37.9526" stroke="#000000" stroke-width="0.13" data-prov="837d109efb37f74957a713aba3123810" data-source-kind="1" data-kind="stroke"/>
|
||||||
<line x1="11.6444" y1="-33.9526" x2="13.4251" y2="-33.9526" stroke="#000000" stroke-width="0.13" data-prov="4b888b04616f17f2f3b39f919a4d1f73" data-source-kind="1" data-kind="stroke"/>
|
<line x1="11.6444" y1="-36.9526" x2="13.4251" y2="-36.9526" stroke="#000000" stroke-width="0.13" data-prov="4b888b04616f17f2f3b39f919a4d1f73" data-source-kind="1" data-kind="stroke"/>
|
||||||
<line x1="11.6444" y1="-32.9526" x2="13.4251" y2="-32.9526" stroke="#000000" stroke-width="0.13" data-prov="bb3c4f1c88311a08545a507484b65ec5" data-source-kind="1" data-kind="stroke"/>
|
<line x1="11.6444" y1="-35.9526" x2="13.4251" y2="-35.9526" stroke="#000000" stroke-width="0.13" data-prov="bb3c4f1c88311a08545a507484b65ec5" data-source-kind="1" data-kind="stroke"/>
|
||||||
<line x1="11.6444" y1="-31.9526" x2="13.4251" y2="-31.9526" stroke="#000000" stroke-width="0.13" data-prov="7bb81a275725608c136691c9bdc2bcdc" data-source-kind="1" data-kind="stroke"/>
|
<line x1="11.6444" y1="-34.9526" x2="13.4251" y2="-34.9526" stroke="#000000" stroke-width="0.13" data-prov="7bb81a275725608c136691c9bdc2bcdc" data-source-kind="1" data-kind="stroke"/>
|
||||||
<line x1="11.6444" y1="-30.9526" x2="13.4251" y2="-30.9526" stroke="#000000" stroke-width="0.13" data-prov="048e69987982c24dcfc601c985d4de2d" data-source-kind="1" data-kind="stroke"/>
|
<line x1="11.6444" y1="-33.9526" x2="13.4251" y2="-33.9526" stroke="#000000" stroke-width="0.13" data-prov="048e69987982c24dcfc601c985d4de2d" data-source-kind="1" data-kind="stroke"/>
|
||||||
<line x1="15.1751" y1="-44.4526" x2="15.1751" y2="-40.9526" stroke="#000000" stroke-width="0.12" data-prov="c7b2ab7fbc11b592cb08478feb22b263" data-source-kind="0" data-kind="stroke"/>
|
<line x1="15.1751" y1="-47.4526" x2="15.1751" y2="-43.9526" stroke="#000000" stroke-width="0.12" data-prov="c7b2ab7fbc11b592cb08478feb22b263" data-source-kind="0" data-kind="stroke"/>
|
||||||
<line x1="13.7251" y1="-40.9526" x2="15.5058" y2="-40.9526" stroke="#000000" stroke-width="0.13" data-prov="041a0efe1178a5a9ece7f6bae256cb49" data-source-kind="1" data-kind="stroke"/>
|
<line x1="13.7251" y1="-43.9526" x2="15.5058" y2="-43.9526" stroke="#000000" stroke-width="0.13" data-prov="041a0efe1178a5a9ece7f6bae256cb49" data-source-kind="1" data-kind="stroke"/>
|
||||||
<line x1="13.7251" y1="-41.9526" x2="15.5058" y2="-41.9526" stroke="#000000" stroke-width="0.13" data-prov="d9bb40761053cbb2e56baa1d226c7354" data-source-kind="1" data-kind="stroke"/>
|
<line x1="13.7251" y1="-44.9526" x2="15.5058" y2="-44.9526" stroke="#000000" stroke-width="0.13" data-prov="d9bb40761053cbb2e56baa1d226c7354" data-source-kind="1" data-kind="stroke"/>
|
||||||
<line x1="13.7251" y1="-42.9526" x2="15.5058" y2="-42.9526" stroke="#000000" stroke-width="0.13" data-prov="1402804aba9f279387d6f183f80d79b4" data-source-kind="1" data-kind="stroke"/>
|
<line x1="13.7251" y1="-45.9526" x2="15.5058" y2="-45.9526" stroke="#000000" stroke-width="0.13" data-prov="1402804aba9f279387d6f183f80d79b4" data-source-kind="1" data-kind="stroke"/>
|
||||||
<line x1="13.7251" y1="-43.9526" x2="15.5058" y2="-43.9526" stroke="#000000" stroke-width="0.13" data-prov="6d52f1fb3cdd40d6274abeb906770ef1" data-source-kind="1" data-kind="stroke"/>
|
<line x1="13.7251" y1="-46.9526" x2="15.5058" y2="-46.9526" stroke="#000000" stroke-width="0.13" data-prov="6d52f1fb3cdd40d6274abeb906770ef1" data-source-kind="1" data-kind="stroke"/>
|
||||||
<line x1="17.2558" y1="-30.4526" x2="17.2558" y2="-26.9526" stroke="#000000" stroke-width="0.12" data-prov="5f9c5d54f7ab283f189cea904cb9bb42" data-source-kind="0" data-kind="stroke"/>
|
<line x1="17.2558" y1="-33.4526" x2="17.2558" y2="-29.9526" stroke="#000000" stroke-width="0.12" data-prov="5f9c5d54f7ab283f189cea904cb9bb42" data-source-kind="0" data-kind="stroke"/>
|
||||||
<line x1="15.8058" y1="-34.9526" x2="17.5864" y2="-34.9526" stroke="#000000" stroke-width="0.13" data-prov="755af675fea2b73be02f98d5ce681561" data-source-kind="1" data-kind="stroke"/>
|
<line x1="15.8058" y1="-37.9526" x2="17.5864" y2="-37.9526" stroke="#000000" stroke-width="0.13" data-prov="755af675fea2b73be02f98d5ce681561" data-source-kind="1" data-kind="stroke"/>
|
||||||
<line x1="15.8058" y1="-33.9526" x2="17.5864" y2="-33.9526" stroke="#000000" stroke-width="0.13" data-prov="729c3d20e1cf7fe25b2e9a4e5d72d5eb" data-source-kind="1" data-kind="stroke"/>
|
<line x1="15.8058" y1="-36.9526" x2="17.5864" y2="-36.9526" stroke="#000000" stroke-width="0.13" data-prov="729c3d20e1cf7fe25b2e9a4e5d72d5eb" data-source-kind="1" data-kind="stroke"/>
|
||||||
<line x1="15.8058" y1="-32.9526" x2="17.5864" y2="-32.9526" stroke="#000000" stroke-width="0.13" data-prov="0f3c5819991c4d887c5e26bd166cf6fb" data-source-kind="1" data-kind="stroke"/>
|
<line x1="15.8058" y1="-35.9526" x2="17.5864" y2="-35.9526" stroke="#000000" stroke-width="0.13" data-prov="0f3c5819991c4d887c5e26bd166cf6fb" data-source-kind="1" data-kind="stroke"/>
|
||||||
<line x1="15.8058" y1="-31.9526" x2="17.5864" y2="-31.9526" stroke="#000000" stroke-width="0.13" data-prov="c52e73fbf914910d9dedebd4ce938f16" data-source-kind="1" data-kind="stroke"/>
|
<line x1="15.8058" y1="-34.9526" x2="17.5864" y2="-34.9526" stroke="#000000" stroke-width="0.13" data-prov="c52e73fbf914910d9dedebd4ce938f16" data-source-kind="1" data-kind="stroke"/>
|
||||||
<line x1="15.8058" y1="-30.9526" x2="17.5864" y2="-30.9526" stroke="#000000" stroke-width="0.13" data-prov="78e39176f8952b71f69bef9a4436e4a1" data-source-kind="1" data-kind="stroke"/>
|
<line x1="15.8058" y1="-33.9526" x2="17.5864" y2="-33.9526" stroke="#000000" stroke-width="0.13" data-prov="78e39176f8952b71f69bef9a4436e4a1" data-source-kind="1" data-kind="stroke"/>
|
||||||
<line x1="19.3364" y1="-44.4526" x2="19.3364" y2="-40.9526" stroke="#000000" stroke-width="0.12" data-prov="c47796a73dccf69155b4078d112fde27" data-source-kind="0" data-kind="stroke"/>
|
<line x1="19.3364" y1="-47.4526" x2="19.3364" y2="-43.9526" stroke="#000000" stroke-width="0.12" data-prov="c47796a73dccf69155b4078d112fde27" data-source-kind="0" data-kind="stroke"/>
|
||||||
<line x1="17.8864" y1="-40.9526" x2="19.6671" y2="-40.9526" stroke="#000000" stroke-width="0.13" data-prov="2a36935e840d6ef047c51d1d7a82ed93" data-source-kind="1" data-kind="stroke"/>
|
<line x1="17.8864" y1="-43.9526" x2="19.6671" y2="-43.9526" stroke="#000000" stroke-width="0.13" data-prov="2a36935e840d6ef047c51d1d7a82ed93" data-source-kind="1" data-kind="stroke"/>
|
||||||
<line x1="17.8864" y1="-41.9526" x2="19.6671" y2="-41.9526" stroke="#000000" stroke-width="0.13" data-prov="79b311a1708aaab4af813b7b959c6d45" data-source-kind="1" data-kind="stroke"/>
|
<line x1="17.8864" y1="-44.9526" x2="19.6671" y2="-44.9526" stroke="#000000" stroke-width="0.13" data-prov="79b311a1708aaab4af813b7b959c6d45" data-source-kind="1" data-kind="stroke"/>
|
||||||
<line x1="17.8864" y1="-42.9526" x2="19.6671" y2="-42.9526" stroke="#000000" stroke-width="0.13" data-prov="290ec68875364ec6a4a96dba4456fa60" data-source-kind="1" data-kind="stroke"/>
|
<line x1="17.8864" y1="-45.9526" x2="19.6671" y2="-45.9526" stroke="#000000" stroke-width="0.13" data-prov="290ec68875364ec6a4a96dba4456fa60" data-source-kind="1" data-kind="stroke"/>
|
||||||
<line x1="17.8864" y1="-43.9526" x2="19.6671" y2="-43.9526" stroke="#000000" stroke-width="0.13" data-prov="b4222559838ef95fbb9829f715732d00" data-source-kind="1" data-kind="stroke"/>
|
<line x1="17.8864" y1="-46.9526" x2="19.6671" y2="-46.9526" stroke="#000000" stroke-width="0.13" data-prov="b4222559838ef95fbb9829f715732d00" data-source-kind="1" data-kind="stroke"/>
|
||||||
<line x1="8.6599" y1="-71.5726" x2="8.6599" y2="-71.5726" stroke="#000000" stroke-width="0" data-prov="80230a27e89abbdc2803f4ccae35620d" data-source-kind="2" data-kind="stroke"/>
|
<line x1="8.6599" y1="-62.5126" x2="8.6599" y2="-62.5126" stroke="#000000" stroke-width="0" data-prov="80230a27e89abbdc2803f4ccae35620d" data-source-kind="2" data-kind="stroke"/>
|
||||||
<line x1="13.0944" y1="-65.5726" x2="13.0944" y2="-62.0726" stroke="#000000" stroke-width="0.12" data-prov="12b12b407f09c2ce7151e271b80b4575" data-source-kind="0" data-kind="stroke"/>
|
<line x1="13.0944" y1="-56.5126" x2="13.0944" y2="-53.0126" stroke="#000000" stroke-width="0.12" data-prov="12b12b407f09c2ce7151e271b80b4575" data-source-kind="0" data-kind="stroke"/>
|
||||||
<line x1="11.6444" y1="-66.5726" x2="13.4251" y2="-66.5726" stroke="#000000" stroke-width="0.13" data-prov="02c8f971668afe306c2b63145b0eda5e" data-source-kind="1" data-kind="stroke"/>
|
<line x1="11.6444" y1="-57.5126" x2="13.4251" y2="-57.5126" stroke="#000000" stroke-width="0.13" data-prov="02c8f971668afe306c2b63145b0eda5e" data-source-kind="1" data-kind="stroke"/>
|
||||||
<line x1="11.6444" y1="-65.5726" x2="13.4251" y2="-65.5726" stroke="#000000" stroke-width="0.13" data-prov="ad9922ca450855f46c76ced4da8d3eba" data-source-kind="1" data-kind="stroke"/>
|
<line x1="11.6444" y1="-56.5126" x2="13.4251" y2="-56.5126" stroke="#000000" stroke-width="0.13" data-prov="ad9922ca450855f46c76ced4da8d3eba" data-source-kind="1" data-kind="stroke"/>
|
||||||
<line x1="15.1751" y1="-69.0726" x2="15.1751" y2="-65.5726" stroke="#000000" stroke-width="0.12" data-prov="a6be2c1fdd05ec3c34b4655d0c7f7b7d" data-source-kind="0" data-kind="stroke"/>
|
<line x1="15.1751" y1="-60.0126" x2="15.1751" y2="-56.5126" stroke="#000000" stroke-width="0.12" data-prov="a6be2c1fdd05ec3c34b4655d0c7f7b7d" data-source-kind="0" data-kind="stroke"/>
|
||||||
<line x1="17.2558" y1="-65.5726" x2="17.2558" y2="-62.0726" stroke="#000000" stroke-width="0.12" data-prov="e596a52ab94676af6dd2afb8839bf6f7" data-source-kind="0" data-kind="stroke"/>
|
<line x1="17.2558" y1="-56.5126" x2="17.2558" y2="-53.0126" stroke="#000000" stroke-width="0.12" data-prov="e596a52ab94676af6dd2afb8839bf6f7" data-source-kind="0" data-kind="stroke"/>
|
||||||
<line x1="15.8058" y1="-66.5726" x2="17.5864" y2="-66.5726" stroke="#000000" stroke-width="0.13" data-prov="373157f721d0b1004b19cc474cd1653c" data-source-kind="1" data-kind="stroke"/>
|
<line x1="15.8058" y1="-57.5126" x2="17.5864" y2="-57.5126" stroke="#000000" stroke-width="0.13" data-prov="373157f721d0b1004b19cc474cd1653c" data-source-kind="1" data-kind="stroke"/>
|
||||||
<line x1="15.8058" y1="-65.5726" x2="17.5864" y2="-65.5726" stroke="#000000" stroke-width="0.13" data-prov="01ac7b54f5668ab8da8500c7bf12dd08" data-source-kind="1" data-kind="stroke"/>
|
<line x1="15.8058" y1="-56.5126" x2="17.5864" y2="-56.5126" stroke="#000000" stroke-width="0.13" data-prov="01ac7b54f5668ab8da8500c7bf12dd08" data-source-kind="1" data-kind="stroke"/>
|
||||||
<line x1="19.3364" y1="-69.0726" x2="19.3364" y2="-65.5726" stroke="#000000" stroke-width="0.12" data-prov="b76cf9581fb59757345a09d2eba68529" data-source-kind="0" data-kind="stroke"/>
|
<line x1="19.3364" y1="-60.0126" x2="19.3364" y2="-56.5126" stroke="#000000" stroke-width="0.12" data-prov="b76cf9581fb59757345a09d2eba68529" data-source-kind="0" data-kind="stroke"/>
|
||||||
<path d="M 12.7247 -66.8726 C 13.5916 -65.8059 14.4586 -65.8059 15.3255 -66.8726" fill="none" stroke="#000000" stroke-width="0.12" data-prov="1c938c5c0f8fd1c1397fca33e64be814" data-source-kind="11" data-kind="curve"/>
|
<path d="M 12.7247 -57.8126 C 13.5916 -56.7459 14.4586 -56.7459 15.3255 -57.8126" fill="none" stroke="#000000" stroke-width="0.12" data-prov="1c938c5c0f8fd1c1397fca33e64be814" data-source-kind="11" data-kind="curve"/>
|
||||||
<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.6599 -11.8926)" fill="#000000" data-prov="e39c94e4224c7060995ea50ab3f1a891" data-source-kind="4" data-glyph="gClef" data-class="clef"/>
|
<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.6599 -11.8926)" fill="#000000" data-prov="e39c94e4224c7060995ea50ab3f1a891" 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.9444 -13.8926)" fill="#000000" data-prov="2489cab25ad1c58249798a96c93a19df" 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.9444 -13.8926)" fill="#000000" data-prov="2489cab25ad1c58249798a96c93a19df" 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.0251 -17.3926)" fill="#000000" data-prov="d25c7d3368d839c8286dd224bf53b46b" 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.0251 -17.3926)" fill="#000000" data-prov="d25c7d3368d839c8286dd224bf53b46b" 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.1058 -20.8926)" fill="#000000" data-prov="02b4ad76298971279a4f0f908ab1a999" 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.1058 -20.8926)" fill="#000000" data-prov="02b4ad76298971279a4f0f908ab1a999" 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(18.1864 -24.3926)" fill="#000000" data-prov="02a400a2dc076ba0d606e0437828d1fb" 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(18.1864 -24.3926)" fill="#000000" data-prov="02a400a2dc076ba0d606e0437828d1fb" 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(8.6599 -38.9526)" fill="#000000" data-prov="57ece9af76f53869ab2df3c844cbb990" data-source-kind="4" data-glyph="gClef" data-class="clef"/>
|
<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.6599 -41.9526)" fill="#000000" data-prov="57ece9af76f53869ab2df3c844cbb990" 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.9444 -30.4526)" fill="#000000" data-prov="a29e010753de6d915fea6b92d42d2a6b" 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.9444 -33.4526)" fill="#000000" data-prov="a29e010753de6d915fea6b92d42d2a6b" 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.0251 -44.4526)" fill="#000000" data-prov="edd00864090a7fbfeb86d9fc66d5fdfc" 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.0251 -47.4526)" fill="#000000" data-prov="edd00864090a7fbfeb86d9fc66d5fdfc" 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.1058 -30.4526)" fill="#000000" data-prov="7a77efa323697b85c6e570b201b40373" 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.1058 -33.4526)" fill="#000000" data-prov="7a77efa323697b85c6e570b201b40373" 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(18.1864 -44.4526)" fill="#000000" data-prov="5df0b734253de82c2360eb30508e2ccd" 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(18.1864 -47.4526)" fill="#000000" data-prov="5df0b734253de82c2360eb30508e2ccd" 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(8.6599 -70.5726)" fill="#000000" data-prov="ac9b59e5511a1d14b4c4901bf7f6ae3b" data-source-kind="4" data-glyph="gClef" data-class="clef"/>
|
<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.6599 -61.5126)" fill="#000000" data-prov="ac9b59e5511a1d14b4c4901bf7f6ae3b" 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.9444 -65.5726)" fill="#000000" data-prov="7ec9b93ecb2a3b9b3c63ec3c09eeada8" 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.9444 -56.5126)" fill="#000000" data-prov="7ec9b93ecb2a3b9b3c63ec3c09eeada8" 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.0251 -69.0726)" fill="#000000" data-prov="18f3bbf40e6f0db46de148caf3b9598f" 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.0251 -60.0126)" fill="#000000" data-prov="18f3bbf40e6f0db46de148caf3b9598f" 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.1058 -65.5726)" fill="#000000" data-prov="648c96e7875d5eee9329c93ed05ff8f1" 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.1058 -56.5126)" fill="#000000" data-prov="648c96e7875d5eee9329c93ed05ff8f1" 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(18.1864 -69.0726)" fill="#000000" data-prov="fa45c91c3e12b58dd82f091a759f5c2d" 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(18.1864 -60.0126)" fill="#000000" data-prov="fa45c91c3e12b58dd82f091a759f5c2d" data-source-kind="1" data-glyph="noteheadBlack" data-class="notehead"/>
|
||||||
<path d="M0.144 0V4H0V0ZM0.912 4H0.412V0H0.912Z" transform="translate(19.9671 -12.8926)" fill="#000000" data-prov="99aebfebeec540a79f695c2034cb6fd4" data-source-kind="9" data-glyph="barlineFinal" data-class="barline"/>
|
<path d="M0.144 0V4H0V0ZM0.912 4H0.412V0H0.912Z" transform="translate(19.9671 -12.8926)" fill="#000000" data-prov="99aebfebeec540a79f695c2034cb6fd4" data-source-kind="9" data-glyph="barlineFinal" data-class="barline"/>
|
||||||
<path d="M0.144 0V4H0V0ZM0.912 4H0.412V0H0.912Z" transform="translate(19.9671 -39.9526)" fill="#000000" data-prov="7310a658cfa443d83676f3cbc4c5bf1b" data-source-kind="9" data-glyph="barlineFinal" data-class="barline"/>
|
<path d="M0.144 0V4H0V0ZM0.912 4H0.412V0H0.912Z" transform="translate(19.9671 -42.9526)" fill="#000000" data-prov="7310a658cfa443d83676f3cbc4c5bf1b" data-source-kind="9" data-glyph="barlineFinal" data-class="barline"/>
|
||||||
<path d="M0.144 0V4H0V0ZM0.912 4H0.412V0H0.912Z" transform="translate(19.9671 -71.5726)" fill="#000000" data-prov="1b9067fde6ae04fdb1d24e65c8734725" data-source-kind="9" data-glyph="barlineFinal" data-class="barline"/>
|
<path d="M0.144 0V4H0V0ZM0.912 4H0.412V0H0.912Z" transform="translate(19.9671 -62.5126)" fill="#000000" data-prov="1b9067fde6ae04fdb1d24e65c8734725" data-source-kind="9" data-glyph="barlineFinal" data-class="barline"/>
|
||||||
</g>
|
</g>
|
||||||
</g>
|
</g>
|
||||||
</svg>
|
</svg>
|
||||||
|
|
|
||||||
|
Before Width: | Height: | Size: 25 KiB After Width: | Height: | Size: 25 KiB |
|
|
@ -8,7 +8,7 @@ provenance_count=54
|
||||||
layer_count=1
|
layer_count=1
|
||||||
hard_constraint_count=18
|
hard_constraint_count=18
|
||||||
xml_well_formed=true
|
xml_well_formed=true
|
||||||
view_box=[5.5 -36.58458 17.379084 31.084002]
|
view_box=[5.5 -39.584576 17.379084 34.084]
|
||||||
class_counts:
|
class_counts:
|
||||||
barline=2
|
barline=2
|
||||||
clef=2
|
clef=2
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<svg xmlns="http://www.w3.org/2000/svg" width="173.7908" height="310.84" viewBox="0 0 17.3791 31.084">
|
<svg xmlns="http://www.w3.org/2000/svg" width="173.7908" height="340.84" viewBox="0 0 17.3791 34.084">
|
||||||
<!-- epiphany-render-svg: glyphs are genuine Bravura SMuFL outlines inlined as paths; geometry is the resolved layout verbatim, no engraving performed here; every glyph, stroke, and curve carries a data-prov trace to its score-graph source -->
|
<!-- epiphany-render-svg: glyphs are genuine Bravura SMuFL outlines inlined as paths; geometry is the resolved layout verbatim, no engraving performed here; every glyph, stroke, and curve carries a data-prov trace to its score-graph source -->
|
||||||
<g transform="translate(-5.5 -5.5006) scale(1 -1)">
|
<g transform="translate(-5.5 -5.5006) scale(1 -1)">
|
||||||
<g data-layer="0">
|
<g data-layer="0">
|
||||||
|
|
@ -9,11 +9,11 @@
|
||||||
<line x1="7.565" y1="-10.8926" x2="20.2543" y2="-10.8926" stroke="#000000" stroke-width="0.13" data-prov="5f47dfd6d0910fe3fa68504e3dc8b4cb" data-source-kind="3" data-kind="stroke"/>
|
<line x1="7.565" y1="-10.8926" x2="20.2543" y2="-10.8926" stroke="#000000" stroke-width="0.13" data-prov="5f47dfd6d0910fe3fa68504e3dc8b4cb" data-source-kind="3" data-kind="stroke"/>
|
||||||
<line x1="7.565" y1="-9.8926" x2="20.2543" y2="-9.8926" stroke="#000000" stroke-width="0.13" data-prov="2f1bc986dc62f2e24256b98e76338b40" data-source-kind="3" data-kind="stroke"/>
|
<line x1="7.565" y1="-9.8926" x2="20.2543" y2="-9.8926" stroke="#000000" stroke-width="0.13" data-prov="2f1bc986dc62f2e24256b98e76338b40" data-source-kind="3" data-kind="stroke"/>
|
||||||
<line x1="7.565" y1="-8.8926" x2="20.2543" y2="-8.8926" stroke="#000000" stroke-width="0.13" data-prov="967277083788b3e3f9928206e546eb2d" data-source-kind="3" data-kind="stroke"/>
|
<line x1="7.565" y1="-8.8926" x2="20.2543" y2="-8.8926" stroke="#000000" stroke-width="0.13" data-prov="967277083788b3e3f9928206e546eb2d" data-source-kind="3" data-kind="stroke"/>
|
||||||
<line x1="7.565" y1="-32.9526" x2="20.2543" y2="-32.9526" stroke="#000000" stroke-width="0.13" data-prov="c6afc2060e4ee437d03c460c5e51edb0" data-source-kind="3" data-kind="stroke"/>
|
<line x1="7.565" y1="-35.9526" x2="20.2543" y2="-35.9526" stroke="#000000" stroke-width="0.13" data-prov="c6afc2060e4ee437d03c460c5e51edb0" data-source-kind="3" data-kind="stroke"/>
|
||||||
<line x1="7.565" y1="-31.9526" x2="20.2543" y2="-31.9526" stroke="#000000" stroke-width="0.13" data-prov="fc03fb2cca3c3f5d6276b60b1ff83b72" data-source-kind="3" data-kind="stroke"/>
|
<line x1="7.565" y1="-34.9526" x2="20.2543" y2="-34.9526" stroke="#000000" stroke-width="0.13" data-prov="fc03fb2cca3c3f5d6276b60b1ff83b72" data-source-kind="3" data-kind="stroke"/>
|
||||||
<line x1="7.565" y1="-30.9526" x2="20.2543" y2="-30.9526" stroke="#000000" stroke-width="0.13" data-prov="4ac3502112246f2950bf9ba00346e839" data-source-kind="3" data-kind="stroke"/>
|
<line x1="7.565" y1="-33.9526" x2="20.2543" y2="-33.9526" stroke="#000000" stroke-width="0.13" data-prov="4ac3502112246f2950bf9ba00346e839" data-source-kind="3" data-kind="stroke"/>
|
||||||
<line x1="7.565" y1="-29.9526" x2="20.2543" y2="-29.9526" stroke="#000000" stroke-width="0.13" data-prov="dbcbf5fb791e00972d5a014eb0897966" data-source-kind="3" data-kind="stroke"/>
|
<line x1="7.565" y1="-32.9526" x2="20.2543" y2="-32.9526" stroke="#000000" stroke-width="0.13" data-prov="dbcbf5fb791e00972d5a014eb0897966" data-source-kind="3" data-kind="stroke"/>
|
||||||
<line x1="7.565" y1="-28.9526" x2="20.2543" y2="-28.9526" stroke="#000000" stroke-width="0.13" data-prov="0c940e546e084c0e0c76dc5b5d4cc29f" data-source-kind="3" data-kind="stroke"/>
|
<line x1="7.565" y1="-31.9526" x2="20.2543" y2="-31.9526" stroke="#000000" stroke-width="0.13" data-prov="0c940e546e084c0e0c76dc5b5d4cc29f" data-source-kind="3" data-kind="stroke"/>
|
||||||
<line x1="8.6599" y1="-12.8926" x2="8.6599" y2="-12.8926" stroke="#000000" stroke-width="0" data-prov="dec48b26ccf8d32aaef3b0d78c728ac1" data-source-kind="2" data-kind="stroke"/>
|
<line x1="8.6599" y1="-12.8926" x2="8.6599" y2="-12.8926" stroke="#000000" stroke-width="0" data-prov="dec48b26ccf8d32aaef3b0d78c728ac1" data-source-kind="2" data-kind="stroke"/>
|
||||||
<line x1="13.0944" y1="-13.8926" x2="13.0944" y2="-10.3926" stroke="#000000" stroke-width="0.12" data-prov="2605e711923a6304409ca2b5627aed7e" data-source-kind="0" data-kind="stroke"/>
|
<line x1="13.0944" y1="-13.8926" x2="13.0944" y2="-10.3926" stroke="#000000" stroke-width="0.12" data-prov="2605e711923a6304409ca2b5627aed7e" data-source-kind="0" data-kind="stroke"/>
|
||||||
<line x1="11.6444" y1="-13.8926" x2="13.4251" y2="-13.8926" stroke="#000000" stroke-width="0.13" data-prov="9f71ea414173b35b44c2a526ba3572b7" data-source-kind="1" data-kind="stroke"/>
|
<line x1="11.6444" y1="-13.8926" x2="13.4251" y2="-13.8926" stroke="#000000" stroke-width="0.13" data-prov="9f71ea414173b35b44c2a526ba3572b7" data-source-kind="1" data-kind="stroke"/>
|
||||||
|
|
@ -36,27 +36,27 @@
|
||||||
<line x1="17.8864" y1="-14.8926" x2="19.6671" y2="-14.8926" stroke="#000000" stroke-width="0.13" data-prov="faa92f6a10e55a97e9b2f7e359f09038" data-source-kind="1" data-kind="stroke"/>
|
<line x1="17.8864" y1="-14.8926" x2="19.6671" y2="-14.8926" stroke="#000000" stroke-width="0.13" data-prov="faa92f6a10e55a97e9b2f7e359f09038" data-source-kind="1" data-kind="stroke"/>
|
||||||
<line x1="17.8864" y1="-15.8926" x2="19.6671" y2="-15.8926" stroke="#000000" stroke-width="0.13" data-prov="c7f132db91c48ecc8015b7e748f00819" data-source-kind="1" data-kind="stroke"/>
|
<line x1="17.8864" y1="-15.8926" x2="19.6671" y2="-15.8926" stroke="#000000" stroke-width="0.13" data-prov="c7f132db91c48ecc8015b7e748f00819" data-source-kind="1" data-kind="stroke"/>
|
||||||
<line x1="17.8864" y1="-16.8926" x2="19.6671" y2="-16.8926" stroke="#000000" stroke-width="0.13" data-prov="867f712bbd9c4c178425fd0f53e01fa2" data-source-kind="1" data-kind="stroke"/>
|
<line x1="17.8864" y1="-16.8926" x2="19.6671" y2="-16.8926" stroke="#000000" stroke-width="0.13" data-prov="867f712bbd9c4c178425fd0f53e01fa2" data-source-kind="1" data-kind="stroke"/>
|
||||||
<line x1="8.6599" y1="-32.9526" x2="8.6599" y2="-32.9526" stroke="#000000" stroke-width="0" data-prov="781ef3842ebea010cbefab514c733440" data-source-kind="2" data-kind="stroke"/>
|
<line x1="8.6599" y1="-35.9526" x2="8.6599" y2="-35.9526" stroke="#000000" stroke-width="0" data-prov="781ef3842ebea010cbefab514c733440" data-source-kind="2" data-kind="stroke"/>
|
||||||
<line x1="13.0944" y1="-33.9526" x2="13.0944" y2="-30.4526" stroke="#000000" stroke-width="0.12" data-prov="8fedf07e00164403db044570899f2550" data-source-kind="0" data-kind="stroke"/>
|
<line x1="13.0944" y1="-36.9526" x2="13.0944" y2="-33.4526" stroke="#000000" stroke-width="0.12" data-prov="8fedf07e00164403db044570899f2550" data-source-kind="0" data-kind="stroke"/>
|
||||||
<line x1="11.6444" y1="-33.9526" x2="13.4251" y2="-33.9526" stroke="#000000" stroke-width="0.13" data-prov="32b5060f271a3aa21b504bfc3160af6d" data-source-kind="1" data-kind="stroke"/>
|
<line x1="11.6444" y1="-36.9526" x2="13.4251" y2="-36.9526" stroke="#000000" stroke-width="0.13" data-prov="32b5060f271a3aa21b504bfc3160af6d" data-source-kind="1" data-kind="stroke"/>
|
||||||
<line x1="15.1751" y1="-30.4526" x2="15.1751" y2="-26.9526" stroke="#000000" stroke-width="0.12" data-prov="19a0fc032dbfc94ac8b2801dfdeaa658" data-source-kind="0" data-kind="stroke"/>
|
<line x1="15.1751" y1="-33.4526" x2="15.1751" y2="-29.9526" stroke="#000000" stroke-width="0.12" data-prov="19a0fc032dbfc94ac8b2801dfdeaa658" data-source-kind="0" data-kind="stroke"/>
|
||||||
<line x1="17.2558" y1="-26.9526" x2="17.2558" y2="-23.4526" stroke="#000000" stroke-width="0.12" data-prov="e4e5f1717e87111231d31ba493aaac57" data-source-kind="0" data-kind="stroke"/>
|
<line x1="17.2558" y1="-29.9526" x2="17.2558" y2="-26.4526" stroke="#000000" stroke-width="0.12" data-prov="e4e5f1717e87111231d31ba493aaac57" data-source-kind="0" data-kind="stroke"/>
|
||||||
<line x1="15.8058" y1="-27.9526" x2="17.5864" y2="-27.9526" stroke="#000000" stroke-width="0.13" data-prov="1caed515110c4415278d31cc474bf065" data-source-kind="1" data-kind="stroke"/>
|
<line x1="15.8058" y1="-30.9526" x2="17.5864" y2="-30.9526" stroke="#000000" stroke-width="0.13" data-prov="1caed515110c4415278d31cc474bf065" data-source-kind="1" data-kind="stroke"/>
|
||||||
<line x1="15.8058" y1="-26.9526" x2="17.5864" y2="-26.9526" stroke="#000000" stroke-width="0.13" data-prov="1189a8cf5e7e1526a44f3cf89e0b160e" data-source-kind="1" data-kind="stroke"/>
|
<line x1="15.8058" y1="-29.9526" x2="17.5864" y2="-29.9526" stroke="#000000" stroke-width="0.13" data-prov="1189a8cf5e7e1526a44f3cf89e0b160e" data-source-kind="1" data-kind="stroke"/>
|
||||||
<line x1="19.3364" y1="-30.4526" x2="19.3364" y2="-26.9526" stroke="#000000" stroke-width="0.12" data-prov="f230acdf26cd79ad3ba5cd02002fa1f9" data-source-kind="0" data-kind="stroke"/>
|
<line x1="19.3364" y1="-33.4526" x2="19.3364" y2="-29.9526" stroke="#000000" stroke-width="0.12" data-prov="f230acdf26cd79ad3ba5cd02002fa1f9" data-source-kind="0" data-kind="stroke"/>
|
||||||
<path d="M 14.8053 -28.2526 C 15.6723 -27.1859 16.5392 -27.1859 17.4062 -28.2526" fill="none" stroke="#000000" stroke-width="0.12" data-prov="0165993515166bea8f7cada46e27c86f" data-source-kind="11" data-kind="curve"/>
|
<path d="M 14.8053 -31.2526 C 15.6723 -30.1859 16.5392 -30.1859 17.4062 -31.2526" fill="none" stroke="#000000" stroke-width="0.12" data-prov="0165993515166bea8f7cada46e27c86f" data-source-kind="11" data-kind="curve"/>
|
||||||
<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.6599 -11.8926)" fill="#000000" data-prov="e81b0f9cc6ccb1d0209d51b1d9797db5" data-source-kind="4" data-glyph="gClef" data-class="clef"/>
|
<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.6599 -11.8926)" fill="#000000" data-prov="e81b0f9cc6ccb1d0209d51b1d9797db5" 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.9444 -13.8926)" fill="#000000" data-prov="9b3ac956eb2deb3e538d9b1942c6ae97" 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.9444 -13.8926)" fill="#000000" data-prov="9b3ac956eb2deb3e538d9b1942c6ae97" 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.0251 -17.3926)" fill="#000000" data-prov="751a5a693a87d6c1a15a8dfc3eda8102" 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.0251 -17.3926)" fill="#000000" data-prov="751a5a693a87d6c1a15a8dfc3eda8102" 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.1058 -20.8926)" fill="#000000" data-prov="130e9eddac04d8c2fb7373aae2c3b458" 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.1058 -20.8926)" fill="#000000" data-prov="130e9eddac04d8c2fb7373aae2c3b458" 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(18.1864 -17.3926)" fill="#000000" data-prov="e6f9d102cb9512c808d4bff5a3560b34" 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(18.1864 -17.3926)" fill="#000000" data-prov="e6f9d102cb9512c808d4bff5a3560b34" 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(8.6599 -31.9526)" fill="#000000" data-prov="380c7e6f256e62d482135a6342d18380" data-source-kind="4" data-glyph="gClef" data-class="clef"/>
|
<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.6599 -34.9526)" fill="#000000" data-prov="380c7e6f256e62d482135a6342d18380" 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.9444 -33.9526)" fill="#000000" data-prov="38b6271edbb50b409f119eff31d0faa9" 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.9444 -36.9526)" fill="#000000" data-prov="38b6271edbb50b409f119eff31d0faa9" 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.0251 -30.4526)" fill="#000000" data-prov="b2c29b264d8593df8589608aee4d8465" 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.0251 -33.4526)" fill="#000000" data-prov="b2c29b264d8593df8589608aee4d8465" 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.1058 -26.9526)" fill="#000000" data-prov="a6892ec5562df412ce4bdf3bc118e5e9" 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.1058 -29.9526)" fill="#000000" data-prov="a6892ec5562df412ce4bdf3bc118e5e9" 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(18.1864 -30.4526)" fill="#000000" data-prov="d8123de74f57fff5bdc35478e8ec8e9e" 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(18.1864 -33.4526)" fill="#000000" data-prov="d8123de74f57fff5bdc35478e8ec8e9e" data-source-kind="1" data-glyph="noteheadBlack" data-class="notehead"/>
|
||||||
<path d="M0.144 0V4H0V0ZM0.912 4H0.412V0H0.912Z" transform="translate(19.9671 -12.8926)" fill="#000000" data-prov="ed49137c7e716c68d78a85b89b50500a" data-source-kind="9" data-glyph="barlineFinal" data-class="barline"/>
|
<path d="M0.144 0V4H0V0ZM0.912 4H0.412V0H0.912Z" transform="translate(19.9671 -12.8926)" fill="#000000" data-prov="ed49137c7e716c68d78a85b89b50500a" data-source-kind="9" data-glyph="barlineFinal" data-class="barline"/>
|
||||||
<path d="M0.144 0V4H0V0ZM0.912 4H0.412V0H0.912Z" transform="translate(19.9671 -32.9526)" fill="#000000" data-prov="7171ecca2c439b3c03c959bdad56cf08" data-source-kind="9" data-glyph="barlineFinal" data-class="barline"/>
|
<path d="M0.144 0V4H0V0ZM0.912 4H0.412V0H0.912Z" transform="translate(19.9671 -35.9526)" fill="#000000" data-prov="7171ecca2c439b3c03c959bdad56cf08" data-source-kind="9" data-glyph="barlineFinal" data-class="barline"/>
|
||||||
</g>
|
</g>
|
||||||
</g>
|
</g>
|
||||||
</svg>
|
</svg>
|
||||||
|
|
|
||||||
|
Before Width: | Height: | Size: 15 KiB After Width: | Height: | Size: 15 KiB |
|
|
@ -356,3 +356,45 @@ that declares its clef only via `Staff::default_clef` engraves as treble. Found
|
||||||
while building the percussion fixture (which therefore had to declare its clef as
|
while building the percussion fixture (which therefore had to declare its clef as
|
||||||
a `ClefChange`). Filed in `epiphany-layout-ir/DECISIONS.md`; parked with the
|
a `ClefChange`). Filed in `epiphany-layout-ir/DECISIONS.md`; parked with the
|
||||||
`ConstrainedLayoutIR` listing gap pending a ≥3-candidate Pass-13 batch.
|
`ConstrainedLayoutIR` listing gap pending a ≥3-candidate Pass-13 batch.
|
||||||
|
|
||||||
|
## Push-3 tranche (2026-07-09) — two-sided inter-staff renegotiation
|
||||||
|
|
||||||
|
Acting on the sprawl the per-realization axis exposed. `ENGRAVER_VERSION` 11 →
|
||||||
|
12. **No normative change and no version move:** the Quality Metric Catalog's
|
||||||
|
formula, contributing units, anchors and thresholds are untouched; only its
|
||||||
|
non-normative rationale is refreshed (the reference solver no longer merely
|
||||||
|
expands, and the axis's inter-staff half is now documented as a solver
|
||||||
|
self-check). Core spec unchanged. Operation Catalog 0.7.0, Binary Format 0.6.0,
|
||||||
|
Quality Metric Catalog 0.3.0 all unchanged.
|
||||||
|
|
||||||
|
| Item | Disposition | Spec locus | Consumer |
|
||||||
|
|---|---|---|---|
|
||||||
|
| Expand-only inter-staff solve | **fix (layout)** — the solve now closes a slack pair as well as opening a crowded one, realizing the `InterStaffGap` band's declared height exactly. `SYSTEM_STAFF_PITCH` is demoted from a floor to an initial arrangement. This is what `vertical_density_penalty` was reporting: an un-pressured multi-staff system sat at 0.739, honest sprawl against the declared gap | — (behavioural; `req:layoutir:vertical-bands`) | `epiphany-engrave` (`casting.rs`) |
|
||||||
|
| The gap band's height had no agreed meaning | **pin (code default, not spec)** — it is an **ink clearance**: the separation between the two staves' outermost content, which is exactly the unit `req:qmc:vertical` measures. `preferred` 2.0 → **5.0**, `min` 1.0 → **2.0**. The old 2.0 was a placeholder reconciled with nothing — neither the 8.0 staff-box gap the fixed pitch of 12 produces nor the ~6.4 ink clearance it leaves for plain content; realizing it would have crushed a relaxed system to a pitch of ~7.6. At 5.0 plain ledgered content settles near a pitch of 10.6 | `VerticalBand::inter_staff_gap` doc | `epiphany-layout-ir` |
|
||||||
|
| **Cascade defect, latent since v11** | **fix (correctness)** — the recurrence subtracted the upper staff's shift from the measured gap and added it back through the accumulator, so every pair below the first was over-separated by exactly the shift above it. Both staves move: `shift_lower = shift_upper + target − (upper_lo − lower_hi)`, the *unshifted* gap. Invisible on two-staff fixtures (`shift_upper = 0`) and invisible to the cascade regression, which asserted only `s2 > s1` — true under both recurrences. `three_staff_close_content`'s lower pair realized **21.06** against a declared 4.0 | — | `epiphany-engrave` (`casting.rs`) |
|
||||||
|
|
||||||
|
**How the defect was caught, and why that vindicates a design choice.** The
|
||||||
|
metric measures the realized clearance back from the **baked output**, not from
|
||||||
|
the solve's own extents. Reading back solver intent would have reported 0 and let
|
||||||
|
the over-separation ship a second time. That choice was made one commit earlier
|
||||||
|
for exactly this reason and paid immediately. The catalog rationale now
|
||||||
|
recommends it to any conforming implementation.
|
||||||
|
|
||||||
|
**Consequence for testing.** Once the solve realizes each declared clearance
|
||||||
|
exactly, every inter-staff unit is 0 on a healthy solve — the axis is a solver
|
||||||
|
self-check, and its *mean* can no longer distinguish "measured every realization"
|
||||||
|
from "measured one". The regressions therefore assert the **unit set**, not the
|
||||||
|
mean. Four mutations verified: the double-counting recurrence, expand-only, the
|
||||||
|
glyph-`members` band filter, and first-system-only measurement each fail a named
|
||||||
|
test.
|
||||||
|
|
||||||
|
**Churn.** The two multi-staff engrave goldens only. `two_staff_close_content`
|
||||||
|
grew by exactly 3.0 (the target change, no cascade); `three_staff_close_content`
|
||||||
|
*shrank* by 9.06 — the same +3 per pair, less the 17.06 of over-separation the
|
||||||
|
cascade defect was adding. Single-staff and every stub golden are byte-stable.
|
||||||
|
|
||||||
|
**Process note.** The value 5.0 was the user's call. `4.0` ("one staff height")
|
||||||
|
was chosen first and then withdrawn once its true consequence — a staff pitch of
|
||||||
|
9.57, not the 11.04 an arithmetic slip had projected — was **measured rather than
|
||||||
|
inferred**. The slip: deriving plain-content ink clearance from an aggregate
|
||||||
|
metric by assuming it had two contributing units when it had three.
|
||||||
|
|
|
||||||
Binary file not shown.
|
|
@ -934,7 +934,17 @@ symmetric: a gap wider than preferred is sprawl exactly as a narrower one is
|
||||||
crowding. A solver that only ever \emph{expands} a fixed stacking --- never
|
crowding. A solver that only ever \emph{expands} a fixed stacking --- never
|
||||||
compressing an over-wide gap back toward preferred --- will therefore report
|
compressing an over-wide gap back toward preferred --- will therefore report
|
||||||
honest sprawl on its slack systems. That is the axis working, not
|
honest sprawl on its slack systems. That is the axis working, not
|
||||||
mis-measuring.
|
mis-measuring, and it is how the reference implementation's expand-only solve
|
||||||
|
was found: it now renegotiates in both directions.
|
||||||
|
|
||||||
|
Where a solver realizes each band's declared height exactly, the inter-staff
|
||||||
|
half of this axis reads its honest zero and serves as a \emph{self-check} on the
|
||||||
|
solve rather than a judgement on the score. A conforming implementation should
|
||||||
|
therefore measure the realized separation back from the geometry it produced,
|
||||||
|
not from the target it aimed at: the two agree only if the solve and the bake
|
||||||
|
both did what they claimed. The reference implementation reads it back from the
|
||||||
|
baked output, and that is how a defect in its multi-staff cascade --- one that
|
||||||
|
over-separated every pair below the first --- was caught.
|
||||||
\end{rationale}
|
\end{rationale}
|
||||||
|
|
||||||
\section{\texttt{system\_break\_penalty}}
|
\section{\texttt{system\_break\_penalty}}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue